НАУЧНО-ИЗСЛЕДОВАТЕЛСКА И ПРОИЗВОДСТВЕНА ЛАБОРАТОРИЯ "Програмно осигуряване"
----------------------------------------------------------------------------
О П Е Р А Ц И О Н Н А С И С Т Е М А
U N I D O S
за персонален компютър П Ъ Л Д И Н
Р Ъ К О В О Д С Т В О З А П О Т Р Е Б И Т Е Л Я
ОПИСАНИЕ НА BIOS И MONITOR
- версия 01 Jun 1989 -
1. ОБЩИ ПОЛОЖЕНИЯ
Микрокомпютърът Пълдин е разработен на базата на микропроцесорната фамилия
СМ 600, като съдържа:
- СМ 601 - 8 битов микропроцесор (аналог на MC6800);
- СМ 602 - паралелен интерфейсен адаптер (аналог на MC6820);
- СМ 607 - видеоконтролер (аналог на MC6845);
- СМ 609 - флопидиск контролер (аналог на I8272A);
- 64 килобайта динамична памет DRAM;
- 4 килобайта постоянна памет PROM;
- до 64 килобайта допълнителна постоянна памет PROM, със странична организация
по 8 Kb.
Операционната система UNIDOS поддържа всички хардуерни устройства и включва:
- BIOS - основна входно/изходна система, включва UniDOS_BIOS и Graphics_BIOS
- MONITOR
- UNIDOS - команден интерпретатор
Този документ съдържа информация, необходима при използването на
операционната система UNIDOS.
ПРЕДУПРЕЖДЕНИЕ: С оглед на осигуряване на съвместимост със следващи версии
на операционната система, се счита за уместно всички програми, използващи
функции на операционната система да осъществяват това по единен протокол, чрез
използване на инструкцията SWI. Всяко друго директно обръщение към кода на
операционната система се счита за нелегално и не се поема никаква отговорност
за неприложимостта на такива програми в бъдеще.
Формата на обръщението към операционната система е инструкцията SWI,
следвана от един байт, съдържащ номер на функцията (interrupt). Номерата са
разпределени по следния начин:
$ 00 - 7F - запазени за UNIDOS
$ 80 - FF - свободни (за използване от езици и потребителя)
Необходимите параметри се предават и получават чрез регистрите P, A, B и X,
или чрез указател към параметрите в регистърът X. Стойностите на всички други
неизползвани регистри не се променя.
При обработка на прекъсвания (IRQ или NMI) е възможно да се използват
функции на операционната система САМО ако флага INDOS (адрес $0000) е нула.
Това е съществено и се налага от факта, че процедурите не са реентрантни.
ПРЕДУПРЕЖДЕНИЕ: Несъобразяването с флага INDOS, както и промяната на стойността
му е твърде опасно и може да има тежки последици! Не е целесъобразно да се
използва прекъсване NMI при работа с флопи-дисково устройства или други
време-критични устройства, тъй като може да предизвика загуба на информация.
Програмите се зареждат от адрес $0100, и се заделя памет колкото е дължината
на програмата. Изпълнението започва от адрес $0100. Програмите имат право да
разполагат с оперативната памет от адрес $0100 до адреса определен от регистъра
SP (стековия указател) - върха на стека.
Използваната кодова таблица е MIK, еднаква с използваната в микрокомпютрите
Правец-16. Файловата организация на UNIDOS е еднаква с тази на MSDOS и
използваната в Правец-16.
Клавитурата може да генерира символи от латинската азбука и от кирилица.
Основен режим е латиница и се индикира с мигащ курсор. Режим кирилица се
индикира с постоянен (немигащ) курсор. Когато няма курсор се изпълнява операция
и клавитурата не е активна. В този случаи не могат да се въвеждат символи.
2. РАЗПРЕДЕЛЕНИЕ НА ПАМЕТТА
2.1. Разпределение на оперативната памет:
$0000 - флаг INDOS
$0001 - equipment: $80 - UniDOS kernel, $40 - Graphic BIOS, $20 - Basic,
$10 - Pascal, $01 - UniDOS shell
$0002 - configuration: $80 - 601A, $02 - drive B, $01 - drive A present
$0004 - SWIC
$0005 - SWIB
$0006 - SWIA
$0007-0008 - SWIX
$0018-001F - текущо време:
$0018 - стотни от секундата
$0019 - секунди
$001A - минути
$001B - часове
$001C - ден
$001D - месец
$001E - година
$001F - век
$0000-007F - работна област за UNIDOS
$0080-00FF - запазена за BASIC и PASCAL
$0100-BFFF - оперативна памет RAM
$C000-DFFF - странична памет ROM 8 KB и RAM
$E000-E5FF - работна област за UNIDOS
$E600-E6FF - I/O област
$E700-EFFF - работна област за UNIDOS
$F000-FFFF - ROM и системен текстов екран (само за писане)
Областта $C000-DFFF (съвпадаща със страничния ROM) е запазена за интерпретатора
на команди на UNIDOS.
ПРЕДУПРЕЖДЕНИЕ: Използването на работната област на операционната система
е опасно и може да доведе до крах на системата!
2.2. Разпределение и формат на страничният ROM:
В микрокомпютъра Пълдин може да се постави платка със страничен ROM,
съдържаща четири интегрални схеми EPROM 2764. Възможно е да се поставят също и
схеми 27128, като такъв начин броя н страниците може да бъде увеличен до 8 (или
с общ обем 64 килобайта). Използват се четири страници за следните нужди:
- една страница се използва за UniDOS_BIOS
- една страница се използват за Graphics_BIOS
- една страница се използва за BASIC,
- една страница се предвижда да се използва за интерпретатора на p-код (за
реализация на Pascal.
Всяка от страниците трябва да съдържа в началото следните полета:
дума +$0 - идентификатор $A55A (при използване на ИС 27128,
горната половина на схемата трябва да съдържа иденти-
фикатор $5AA5);
байт +$..+$9 - име (8 символа);
байт +$A..+$C - входна точка за инициализация;
байт +$D..+$F - главна входна точка;
байт +$10 - таблица от записи по 3 байта. Всеки запис съдържа 1
байт номер на функция и 2 байта адрес. Таблицата
завършва със запис, съдържащ номер на функция 0.
При сумране на всички байтове от ROM, без отчитане на преноса трябва да се
получи $00.
2.3. Номера на страниците
Номерата на страниците имат следния смисъл:
0 - използва се ако адреса на интеръпта е извън областта $C000-$DFFF
1..6 - тези номера са запазени (за бъдещи разширения)
7 - номер на RAM страницата
8 - номер на страницата за първата ИС (EPROM 2764)
9 - номер на страницата за втората ИС (EPROM 2764)
A - номер на страницата за третата ИС (EPROM 2764)
B - номер на страницата за четвъртата ИС (EPROM 2764)
C - номер на страницата за първата ИС (EPROM 27128 - втора половина)
D - номер на страницата за втората ИС (EPROM 27128 - втора половина)
E - номер на страницата за третата ИС (EPROM 27128 - втора половина)
F - номер на страницата за четвъртата ИС (EPROM 27128 - втора половина)
ПРЕДУПРЕЖДЕНИЕ: Променянето на старницата и адреса на даден интеръпт
трябва да става само чрез използването н предвидената за целта функция: INT 2F.
Всеки друг начин е опасен и може да доведе до крах на системата!
3. ОПИСАНИЕ НА ФУНКЦИИТЕ НА ОПЕРАЦИОННАТА СИСТЕМА UNIDOS
Както е указано раздел 1 обръщението към функциите на операционната система
се осъществява чрез инструкцията SWI, следвана от байт, съдържащ номера на
функцията. Директното обръщение към адреса на функцията, нарушава консепцията на
операционната система и се счита за нелегално. Ако адреса на някоя функция е
$0000 то тя не е инициализирана и в момента не се използва. Описанието на
функциите е валидно е при условие, че са поставен страничния ROM, съдържащ тези
интеръпти. В противен случай част от тях може да не функционират, така както е
описано (INT 00 - INT 2F) или въобще да не работят (предимно INT 30 - INT 7F).
3.1. Функции от BIOS
INT 00 - запазен
специален, използва се при страничния ROM за указване на края на
таблицата с функции и за разграничаване на "студено" и "топло" стартиране
на компютъра (RESMAGIC);
INT 01 - reset вектор, нормално се насочва към входната точка на монитора
или на командния интерпретатор;
INT 02 - NMI вектор;
INT 03 - IRQ вектор;
INT 04 - вектор за прекъсване (BREAK);
INT 05 - вектор за периодично прекъсване - 50 Hz (PERIODIC);
INT 06 - вектор за периодично прекъсване - 1 Hz;
INT 07 - critical error
OUTPUT: A - b7 = 1 - disk device
b7 = 0 - char device
b6-0 - error code
B - (if disk device)
b3-2 - area: 0 - DOS, 1 - FAT, 2 - Dir, 3 - Data
b1-0 - operation: 0 - init, 1 - read, 2 -write
b4 - ignore valid
b5 - retry valid
b6 - fail valid
X - pointer to INT_40 table (if disk device)
INPUT:
A - response: 0 -ignore, 1 - retry, 2 - abort, 3 -fail
INT 08 - запазен
указател към параметрите на флопидисковото устройтво - таблица с 9
байта, съдържаща типа на сектора и времеконстанти (FDDPARMS), трябва да
бъде разположена извън областта $C000-$DFFF ! Параметрите имат следния
смисъл:
0 = $af - step rate & head unload time
1 = $03 - head load time & non-dma mode
2 = $02 - sector type 512 bytes
3 = $09 - last sector on track
4 = $2a - gap1
5 = $ff - dtl
6 = $50 - gap2
7 = $f6 - fill byte
8 = $80 - константа определяща момента за изключване на мотора по 20
милисек. след завършване на операцията.
INT 09 - облужване на IRQ от клавитурата
INT 0A - указател към клавитурни макроси - таблица със следната структура:
клавиш - 1 байт, макрос - ASCIIZ стринг
$FF - край на таблицата (невалиден клавиш)
Таблицата трябва да бъде разположена извън областта $C000-$DFFF !
INT 0B - запазен (за ULAN)
указател към параметрите на конзолата - таблица 11 байта, определяща
скоростта на клавитурата и формата на курсора, трябва да бъде
разположена извън областта $C000-$DFFF ! Параметрите имат следния
смисъл:
0 = $28 - времеконстанта, определяща началното закъснение на повторението
на клавитурата (autorepeat);
1 = $0А - времеконстанта, определяща скоростта на повторението;
2 = $20 - константа, определяща силата на озвучаването на клавитурата.
3 = $13 - PAUSE (ctrl-S)
4 = $03 - BREAK (ctrl-C)
5,6 - начална и крайна скан линия на курсора в режим replace
7,8 - начална и крайна скан линия на курсора в режим insert
9,10 - начална и крайна скан линия на курсора в режим non-read
INT 0C - запазен (за ULAN)
указател към параметрите на серийния вход/изход - таблица с 3 байта,
определяща контрола по четност и бодовете (RSPARMS), трябва да бъде
разположена извън областта $C000-$DFFF ! Параметрите имат следния смисъл:
0 - бодове: $7е - 1200, $3а - 2400, $18 - 4800, $07 - 9600
1 - битове: 7 или 8
2 - четност $00 - even + 1 stop, $FF - odd + 1 stop, $80 - no + 2 stop
INT 0D - internal use
ПРЕДУПРЕЖДЕНИЕ: Модифицирането на този вектор, може да доведе до крах на
системата!
INT 0E - internal use
ПРЕДУПРЕЖДЕНИЕ: Модифицирането на този вектор, може да доведе до крах на
системата!
INT 0F - internal use
ПРЕДУПРЕЖДЕНИЕ: Модифицирането на този вектор, може да доведе до крах на
системата!
INT 10 - проверка на клавитурата (продължителност около 1 ms)
EXPORT: A - $FF ако няма натиснат клавиш
INT 11 - четене на клавитурата
EXPORT: A - скан код
INT 12 - инициализация на видео режима (SCRINIT), към номера на режима може
да се добави $80 за да не се изчиства екрана при инициализирането,
след това е необходимо да се позиционира курсора. Това предполага,
че преди това екрана е бил инициализиран в този режим и положението
на курсора и началния адрес са запазени (след получаването им чрез
INT14). Трябва да се има предвид, че базовия адрес и началния адрес
на екрана са нормално различни в текстов режим поради метода на
скролиране.
IMPORT: A = 0 - текст 25 реда * 40 символа
B = 0 - черно/бял (без атрибут)
B <> 0 - цветен атрибут [601A]
A = 1 - графика 80*200 в 16 цвята
A = 1 - графика 160*200 в 16 цвята [601A]
A = 2 - графика 160*200 в 4 цвята
A = 2 - графика 320*200 в 4 цвята [601A]
B - палитра (0..3)
A = 3 - графика 320*200 в 2 цвята
A = 3 - графика 640*200 в 2 цвята [601A]
A = 4 - текст 25 реда * 80 символа [601A]
B = 0
X - адрес на екрана, за режим 0 и 4 не е необходима, а при
режим $80 и $84 това е началния адрес на екрана (връща
се от INT14)
EXPORT: няма
INT 13 - видеорежим
IMPORT: няма
EXPORT: А - видеорежим (по смисъла на INT12)
B - палитра
X - базов адрес на екрана
INT 14 - положение на курсора (CURSOR)
IMPORT: няма
EXPORT: A - колона
B - ред
X - начален адрес на екрана
INT 15 - задаване на курсора
IMPORT: A - колона
B - ред
INT 16 - задаване на атрибут
IMPORT: B - атрибут (601 A)
INT 17 - работа с FDD (FLOPPY)
IMPORT: А = 0 - reset
A = 1 - четене на сектор
А = 2 - писане на сектор
A = 3 - позициониране (seek)
A = $FF - motor shut down (601 A)
X - указател към таблица с параметри
1b - drive
1b - track
1b - head
1b - sector
1w - адрес на буфера
EXPORT: А - код на грешката:
bit 0 - write protected
bit 1 - overrun
bit 2 - bad CRC
bit 3 - bad record
bit 4 - bad address field
bit 5 - seek error
bit 6 - timeout
bit 7 - bad FDC
INT 18 - четене на символ от серийния вход (RSIN)
IMPORT: няма
EXPORT: А - прочетения символ
C - error
INT 19 - писане на символ на серийния изход (RSOUT)
IMPORT: А - символ за извеждане
EXPORT: няма
INT 1A - вход от касетофон (CASSIN)
IMPORT: няма
EXPORT: X - буфер
BA - дължина
INT 1B - изход на касетофон (CASSOUT)
IMPORT: X - буфер
BA - дължина
EXPORT: няма
INT 1C - получаване на текущото време (GETTIME)
IMPORT: няма
EXPORT: B - часове
А - минути
Х - секунди и стотни
INT 1D - задаване на текущото време (SETTIME)
IMPORT: B - часове
А - минути
Х - секунди и стотни
EXPORT: А = $FF - невалидно време
INT 1E - получаване на текущата дата (GETDATE)
IMPORT: няма
EXPORT: В - ден
А - месец
Х - година
INT 1F - задаване на текущата дата (SETDATE)
IMPORT: В - ден
А - месец
Х - година
EXPORT: A = $FF - невалидна дата
INT 20 - четене на символ от STDIN (GETCHAR)
IMPORT: няма
EXPORT: А - прочетения символ
INT 21 - четене на ред от STDIN (GETLINE)
IMPORT: X - указател към буфера
B - дължина на буфера, буфера трябва да е с 1 байт по-голям
EXPORT: A - дължина на прочетения ред
INT 22 - печат на символ върху STDOUT (PUTCHAR)
IMPORT: А - символ за печат
EXPORT: няма
INT 23 - печат на стринг врху STDOUT (PUTLINE)
IMPORT: X - указател към стринга
EXPORT: няма
INT 24 - печат на дума в десетичен формат (PUTDECW)
IMPORT: X - думата за печат
B - брой цифри
EXPORT: няма
INT 25 - печат на байт в шестнадесетичен формат (PUTHEXB)
IMPORT: А - байта за печат
EXPORT: няма
INT 26 - печат на символ врху STDPRN (PRNCHAR)
IMPORT: А - символ за печат (само за функция 2)
B - функция:
0 - печат
1 - състояние
2 - инициализация
EXPORT: A - състояние
INT 27 - запазен за STDAUX
IMPORT: A - символ
B - функция
0 - read;
1 - write
2 - status;
3 - init;
EXPORT: A - error
INT 28 - умножение без знак на 8 битово * 8 битово число
IMPORT: A, B - множители
EXPORT: BA - резултат
INT 29 - деление без знак на 16 битово число на 16 битово число (DIVU)
IMPORT: X - делимо
BA - делител
EXPORT: X - частно
BA - остатък, ако BA = $FFFF, то грешка: division by zero
INT 2A - алокиране (запазване) на памет (ALLOC)
IMPORT: B - изравняване:
0 - на граница на байт,
1 - на граница на дума (2 байта),
2 - на граница на дълга дума (4 байта),
3 - на граница на четворна дума (8 байта),
4 - на граница на параграф (16 байта),
5 - на граница на 32 байта,
6 - на граница на 64 байта,
7 - на граница на 128 байта,
8 - на граница на страница (256 байта)
X - брой байтове
EXPORT: X = 0 - неуспешно алокиране
X <> 0 - указател към алокираната памет
INT 2B - деалокиране (освобождаване) на памет (DEALLOC)
IMPORT: X - указател за деалокиране (паметта до този адрес се
освобождава)
EXPORT: X - размер на деалокирана памет
INT 2C - маркиране на резидентна област (MARK_RESIDENT)
IMPORT: няма
EXPORT: няма
(Цялата памет над текущата стойност на указателя HIMEM, се маркира
като резидентна.)
INT 2D - местене на памет (MOVE)
IMPORT: Х - указател
Х1 - source адрес
Х2 - target адрес
ВА - дължина
EXPORT: Х - брой преместени байтове
INT 2E - получаване на адреса на интеръпт (GET_VECTOR)
IMPORT: А - номер на интеръпта
EXPORT: B - страница (валидни са младшите 4 бита)
X - адрес
INT 2F - задаване на адреса на интеръпт (PUT_VECTOR)
IMPORT: А - номер на интеръпта
B - страница (валидни са младшите 4 бита)
X - адрес
EXPORT: няма
INT 30 - call MONITOR
INT 31 - call BASIC interpreter
INT 32 - запазен
INT 33 - запазен (play)
INT 34 - запазен (draw)
INT 35 - PRESERVE MEMORY
IMPORT: BA - size (must be less than returned by INT36)
EXPORT: X - start address (base) of preserved memory
BA - actual size, check against 0 for error
INT 36 - GET FREE MEMORY
EXPORT: BA - size (limited by SP)
X - start address (base)
INT 37 - CHAIN INTERRUPT - интеръпта е предвиден да се използва в тялото на
някакъв интеръпт, предава параметрите с който е бил повикан този
интеръпт на chain адреса (от променливите SWIC, SWIX, SWIB и SWIA,
които не трябва да са модифицарани, също така стека трябва да е
валиден - като при завършване). Предвидено е да се използва само в
случаите, когато интеръпт е бил подменен и има необходимост да
се извика стария вектор, чийто адрес е бил запазен и сега се предава
в регистрите BX. Действието е еквивалентно на безусловен преход.
IMPORT: B - страница (валидни са младшите 4 бита)
X - адрес
SWIC, SWIX, SWIB, SWIA - съдържат оргиналните параметри
EXPORT: зависи от интеръпта
3.2. Файлови функции:
INT 38 - завършване на изпълнението на програма (TERMINATE)
IMPORT: няма
EXPORT: няма
INT 39 - SYSTEM CALL
IMPORT: X - command line ptr
EXPORT: A - error code
INT 3A - exit to UniDOS SHELL
INT 3B - ARGC (PARAMCOUNT)
EXPORT: A - argc
INT 3C - ARGV (PARAMSTR)
IMPORT: A - parameter no
X - buffer (max 81 bytes)
INT 3D - get error text
IMPORT: A - error no
X - buffer (max 81 bytes)
INT 3E - запазен
INT 3F - call Pascal Y-code interpreter (internal use)
IMPORT: A - handle
EXPORT: B - $FF if error in .PGM file
else error level
INT 40 - четене/писане на логически сектор
IMPORT: А - операция:
1 - четене
2 - писане
Х - указател към параметри 5 байта
1w - буфер
1b - устройство (0-А, 1-В, ...)
1w - логически сектор
EXPORT: A - код на грешката
INT 41 - версия на UniDOS BIOS (VERSION)
IMPORT: няма
EXPORT: ВА - версия
INT 42 - Get first entry
IMPORT: A - required attr mask
B - invalid attr mask (bit 7 - disable wildcard)
X - parameters
1w - FindFirst & FindNext table ptr
1w - dir entry buff.
1w - path
EXPORT: A - error code
INT 43 - Get next entry
IMPORT: X - parameters
1w - FindFirst & FindNext table ptr
1w - dir entry buff.
EXPORT: A - error code
INT 44 - Set current drive
IMPORT: A - new drivre
EXPORT: A - error code
INT 45 - Get current drive
IMPORT: nothing
EXPORT: A - current drive
INT 46 - Set current directory
IMPORT:
X - buffer pointer (64 bytes)
EXPORT: A - error code
INT 47 - Get current directory
IMPORT: A - drive
X - buffer pointer (64 bytes)
EXPORT: A - error code
INT 48 - create subdirectory
IMPORT: X - name pointer
EXPORT: A - error code
INT 49 - remove directory
IMPORT: X - directory name
EXPORT: A - error code
INT 4A - open file
IMPORT: A - open mode (1 - ro, 2 - wo, 3 - rw)
X - parameters
1w - path/name
1w - buffer pointer
EXPORT: A - error code
B - file handle
INT 4B - create file
IMPORT: A - file attribute
0 - normal
1 - read-only
2 - hidden
4 - system
X - parameters
1w - path/name
1w - buffer pointer
EXPORT: A - error code
B - file handle
INT 4C - read file
IMPORT: A - file handle
X - parameters
1w - buffer pointer
1w - number of bytes
EXPORT: A - error code
X - number of bytes read
INT 4D - write file
IMPORT: A - file handle
X - parameters
1w - buffer pointer
1w - number of bytes
EXPORT: A - error code
X - number of bytes written
INT 4E - close file
IMPORT: A - file handle
EXPORT: A - error code
INT 4F - delete file
IMPORT: X - file name
EXPORT: A - error code
INT 50 - LSEEK
IMPORT: A - file handle
B - method
0 - from the begining
1 - from current pos
2 - from the end of file
X - buff pointer (4 bytes)
EXPORT: A - error code
X - new position
INT 51 - File size
IMPORT:
A - file handle
X - buff_addr (4 bytes)
EXPORT: size in buff
INT 52 - Disk free space
IMPORT:
A - drive
X - buff_addr
EXPORT: space in buff
INT 53 - Return file position
IMPORT:
A - handle
X - buffer pointer (4 bytes)
EXPORT: A - error code
X^ - file position
INT 54 - Get/set file attributes
IMPORT:
X - file path name
B - file attributes
A=0 - get attributes
A=1 - set attributes
EXPORT: A - error
INT 55 - Get/set file date&time
IMPORT:
B - file handle
X - buff_addr
1w - packed date
1w - packed time
A=0 - get
A=1 - set
EXPORT: A - error
INT 56 - Rename file
IMPORT:
X - table
1w - first name
1w - second name
EXPORT: A - error
INT 57 - ReadLn from text file
IMPORT: A - file handle
B - buffer length
X - buffer address
EXPORT: A - error
INT 58 - Return EOF
IMPORT: A - file handle
B - mode: 0 - binary, 1 - text
EXPORT: A - error code
B <> 0 - EOF
INT 59 - запазен (internal use - move file handle)
INT 5A - запазен
INT 5B - expand file handles max 32 handles
IMPORT: A - _handles
INT 5C - media_check
IMPORT: A - drive
EXPORT: A - error code
INT 5D - Install block device driver
IMPORT:
B - page
X - header addr
EXPORT: A - error
INT 5E - Install char device driver
IMPORT:
B - page
X - header addr
EXPORT: A - error
INT 5F - запазен
3.3. Графични функции:
INT 60 - Allocate graphic screen
EXPORT: X - screen address
INT 61 - disable graphic screen
int 62 - internal use (reserved)
INT 63 - return graphic screen base & size
EXPORT: X - screen base
BA - size
INT 64 - set font page
IMPORT: A - bits coressponding to fontpages
B - memory_page (MSB of 32 bytes font addr) , if several
fontpages used, subsequent memory pages used
INT 65 - return current coordinates
IMPORT: X - pointer to 4 bytes buffer
INT 66 - graphic plot command
IMPORT: A - command: 1 - move, 2 - plot, 3 - point, 4 - circle,
$80 - rel
X - pointer to coordinate couple (x,y)
INT 67 - edit line
IMPORT: A - display flag, if non zero default is displayed
B - max length
X - buffer pointer, [X] must be 0 for empty default
EXPORT: A - length of line
INT 68 - reserved
INT 69 - reserved
INT 6A - reserved
INT 6B - reserved
INT 6C - reserved
INT 6D - current screen max rows & cols
EXPORT: A - cols
B - rows
INT 6E - player
IMPORT: X - pointer to music - 3-byte structures:
note, duration, pause in units of 7 msec
and 1-byte structures: FE-F8 tember, FF - end
INT 6F - play subroutine
IMPORT: A - note: 0 - pause, 1-72
B - tembre: 1-7
X - duration in units of 1.536 msec
INT 70 Ў INT 7F - reserved
3.4. Описание на командите на програмата MONITOR
Промптът (вж. Основни термини) на монитора е символа (ромб). При
наличието на този символ и курсор след него могат да се въвеждат от клавитурата
команди.
Синтаксиса на командите е подобен на синтаксиса на командите на монитора
на компютъра Правец-8. Всяка команда се от числен параметър и еднобуквена
команда. Командата се изпълнява с натискане на клавиша {RETURN}. Под {адрес}
се разбира четирицифрено шестнадесетично число. Указването на по-малко от 4
цифри означава, че числото се допълва с водещи нули, например A5 е еквивалентно
на 00A5. Указването на повече от 4 цифри, предизвиква игнориране на старшите
цифри. Под {стойност} се разбира двуцифрено шестнадесетично число. Въвеждането
на по-малко от две цифри означава допълване с водещи нули, а въвеждането на
повече цифри - игнориране на старшите. При въвеждане на няколко стойности,
означава се с [ {стойност}] за разделител между стойностите се използва
поне един интервал. Под {текст} се разбира произволна поредица от символи до
натискане на клавиш {RETURN}. Използват се следните команди:
0..9, A..F - шестнадесетични цифри;
{адрес}G - изпълнение на програмата от този адрес;
пример: F000G {RETURN}
{адрес}.{адрес}I - четене на файл от серийния вход. Първата
дума е начален адрес, втората дума е краен.
пример: I {RETURN}
U - дизасемблира следващата интрукция
{адрес}.{адрес}U - дизасемблира инструкциите между двата адреса;
примери: F000U {RETURN}
F000UUUU {RETURN}
F000.F030U {RETURN}
{адрес1}<{адрес2}.{адрес3}M - премества на адрес1 област от паметта от
адрес2 до адрес3;
пример: 1000<1300.15FFM {RETURN}
{адрес}.{адрес}О - изпраща област от паметта по серийния изход;
пример: F000.F200O {RETURN}
P - дъмп на следващите 8 байта
{адрес}.{адрес}P - дъмп на паметта между двата адреса;
примери: F000P {RETURN}
F000PPPP {RETURN}
F000.F030P {RETURN}
R - четене от касетофон на файл
серийния вход;
пример: R {RETURN}
{адрес1}<{адрес2}.{адрес3}V - сравняване на паметта от адрес1 с паметта
между адрес2 и адрес3, в резултат се
отпечатва адреса на който има разлика,
стойността му и стойността с която е
сравняван;
пример: F000<F010.F017V {RETURN}
{адрес}.{адрес}W - изпраща област от паметта на касетофон;
пример: F000.F200W {RETURN}
{адрес}="{текст} - начало на стринг (до края на реда)
{адрес}={стойн.}[ {стойн.}] - въвеждане на байтовете до края на реда;
примери: F300:8F BA AB A4 A8 AD 31 {RETURN}
F300:"Пълдин2 {RETURN}
F300:8F BA AB "дин3 {RETURN}
? - печат на съдържанието на регистрите
4. ОРГАНИЗАЦИЯ НА ВХОДНО-ИЗХОДНАТА ОБЛАСТ
Адресното пространство $E600-$E6FF е разделено на 8 области, всяка с размер
по $20 байта. Обръщението на микропроцесора към адрес от тези области образува
сигнал Device Select 0-7. В скоби след адреса е указана разрешената операция
(Read или Write).
4.1. Сигнал DS0
Сигнал DS0 се използва от видеоконтролера СМ607. Използват се адресите:
$E600 (W) - адресен регистър,
$E601 (RW) - данни регистър.
4.2. Сигнал DS1
Сигнал DS1 се използва от PIA СМ602. Използват се адресите:
$E628 (RW) - DRA,
$E629 (RW) - DRB,
$E62A (RW) - CRA,
$E62B (RW) - CRB.
Разпределението на битовете е следното:
БИТ ПОСОКА ЗНАЧЕНИЕ
--------------------------------------------------------------------------
PA in ASCII код на прочетения символ от клавитурата
CA1 in строб на клавитурата
CA2 out светодиод за CAPSLOCK
PB0 out режим LAT/-КИР на клавитурата
PB1 out видеорежим LORES/-MIDRES
PB2 out видеорежим COLOR/-B&W
PB3 out палитра за видеорежим MIDRES
PB4 out палитра за видеорежим MIDRES
PB5 out видеорежим GRAF/-TEXT
PB6 out касетофон и сериен изход
PB7 in касетофон и сериен вход
CB1 in 50 Hz
CB2 out говорител
4.3. Сигнал DS5
Сигнал DS5 е предвиден да се използва за контролера за принтер.
4.4. Сигнал DS6
Сигнал DS5 се използва от контролера на флопи-дисковото устройство.
Използват се адресите:
$E6C0 (W) - регистър (4 бита) за управление на режима:
бит 0 - -RESET
бит 1 - TC
бит 2 - drive select
бит 3 - motor on
$E6D0 (R) - статус регистър на СМ609;
$E6D1 (RW) - данни регистър на СМ609.
4.5. Сигнал DS7
Сигнал DS7 се използва за управление на страничния ROM. Използва се адреса:
$E6F0 (RW) - регистър (4 бита) за номер на страницата.
ПРЕДУПРЕЖДЕНИЕ: Тази информация се дава за пълнота. Директното (не чрез
операционната система) обръщение към входно-изходната област не се препоръчва
и може да има неприятни последици.
5. Кодове
5.1. Символен набор
3U1
------T---T---T---T---T---T---T---T---T---T---T---T---T---T---T---T---¦
L L L L L L L L L L L L L L L L L L
L + L$00L$10L$20L$30L$40L$50L$60L$70L$80L$90L$A0L$B0L$C0L$D0L$E0L$F0L
L L L L L L L L L L L L L L L L L L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L 0 LNULLDLEL SPL 0 L @ L P L ` L p L А L Р L а L р L L L ¦ L - L Ё L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L 1 LSOHLDC1L ! L 1 L A L Q L a L q L Б L С L б L с L + L T L - L ё L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L 2 LSTXLDC2L " L 2 L B L R L b L r L В L Т L в L т L T L T L - L Є L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L 3 LETXLDC3L # L 3 L C L S L c L s L Г L У L г L у L + L L L ¦ L є L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L 4 LEOTLDC4L $ L 4 L D L T L d L t L Д L Ф L д L ф L - L L L + L Ї L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L 5 LENQLNAKL % L 5 L E L U L e L u L Е L Х L е L х L + L - L ¦ L ї L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L 6 LACKLSYNL & L 6 L F L V L f L v L Ж L Ц L ж L ц L ¦ L г L ¦ L Ў L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L 7 LBELLETBL ' L 7 L G L W L g L w L З L Ч L з L ч L ¦ L + L ¬ L ў L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L 8 L BSLCANL ( L 8 L H L X L h L x L И L Ш L и L ш L L L + L ¬ L ° L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L 9 L HTL EML ) L 9 L I L Y L i L y L Й L Щ L й L щ L г L - L ¦ L L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L A L LFLSUBL * L : L J L Z L j L z L К L Ъ L к L ъ L ¦ L - L ¦ L · L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L B L VTLESCL + L ; L K L [ L k L { L Л L Ы L л L ы L T L - L ¬ L v L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L C L FFL FSL , L < L L L \ L l L | L М L Ь L м L ь L ¦ L - L - L № L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L D L CRL GSL - L = L M L ] L m L } L Н L Э L н L э L = L ¦ L - L ¤ L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L E L SOL RSL . L > L N L ^ L n L ~ L О L Ю L о L ю L + L ¦ L - L ¦ L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L F L SIL USL / L ? L O L _ L o LDELL П L Я L п L я L ¦ L - L ¬ L L
L-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+----
2U0
5.2. Клавитура
3¤U1
--------T-------T-------T-------T-------T-------T-------T-------T-------T-------T-------T-------T-------T-------T-------T-------¦
L L L L L L L L L L L L L L L L L
L Esc L F1 L F2 L F3 L F4 L F5 L F6 L F7 L F8 L F9 L F10 L F11 L F12 L Home L End L Ins L
L L L L L L L L L L L L L L L L L
L-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+--------
--------T-------T-------T-------T-------T-------T-------T-------T-------T-------T-------T-------T-------T-------T-------T-------¦
L ! L @ ? L # + L $ " L % L ^ = L & : L * / L ( _ L ) - L _ I L + V L | L L L L
L L L L L L L L L L L L L L Del L Кирил L Reset L
L 1 L 2 L 3 L 4 L 5 L 6 L 7 L 8 L 9 L 0 L - L = . L \ Ы L L L L
----+---T---+---T---+---T---+---T---+---T---+---T---+---T---+---T---+---T---+---T---+---T---+---T---+-------+-------+---T---+---T----
L L Q ; L W L E L R L T L Y L U L I L O L P L ~ L L L
L Tab L L L L L L L L L L L L Enter L L^ L
L L , L У L Е L И L Ш L Щ L К L С L Д L З L ` Ц L L L
L-T-----+-T-----+-T-----+-T-----+-T-----+-T-----+-T-----+-T-----+-T-----+-T-----+-T-----+-T-----+-T-------T-------T-----+-T-----+-¦
L L A L S L D L F L G L H L J L K L L L : L " L { ( L } ) L L L
L Ctrl L L L L L L L L L L L L L L <-- L --> L
L L Ь L Я L А L О L Ж L Г L Т L Н L В L ; М L ' Ч L [ L ] L L L
+-------+---T---+---T---+---T---+---T---+---T---+---T---+---T---+---T---+---T---+---T---+---T---+-------+---T---+---T---+---T----
L L Z L X L C L V L B L N L M L < L > L ? L L L L
L Shift L L L L L L L L L L L Shift L Caps L Lv L
L L Ю L Й L Ъ L Э L Ф L Х L П L , Р L . Л L / Б L L L L
L-----------+T------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------T-------+-------+--------
L L
L L
L L
L---------------------------------------------------------------------------------------
2U0
5.2.1. Буквено-цифрови клавиши
Всички буквено-цифрени клавиши генерират код в интервала $00/000 Ў $BF/191,
съвпадащ си с ASCII кода на символа (вж. таблицата Символен набор).
5.2.2. Други клавиши (управляващи, функционални)
Клавишите за управление (редактиране) и функционалните генерират код в
интервала $C0/192 Ў $FE/254, съгласно следната таблица.
3U1
--------------------T-------T-------T-------¦
L L L L L
L К Л А В И Ш L L shift LcontrolL
L L L L L
+-------------------+-------+-------+-------L
L Esc L$1B/027L$1B/027L$1B/027L
+-------------------+-------+-------+-------L
L F1 L$C9/201L$D5/213L$E1/225L
+-------------------+-------+-------+-------L
L F2 L$CA/202L$D6/214L$E2/226L
+-------------------+-------+-------+-------L
L F3 L$CB/203L$D7/215L$E3/227L
+-------------------+-------+-------+-------L
L F4 L$CC/204L$D8/216L$E4/228L
+-------------------+-------+-------+-------L
L F5 L$CD/205L$D9/217L$E5/229L
+-------------------+-------+-------+-------L
L F6 L$CE/206L$DA/218L$E6/230L
+-------------------+-------+-------+-------L
L F7 L$CF/207L$DB/219L$E7/231L
+-------------------+-------+-------+-------L
L F8 L$D0/208L$DC/220L$E8/232L
+-------------------+-------+-------+-------L
L F9 L$D1/209L$DD/221L$E9/233L
+-------------------+-------+-------+-------L
L F10 L$D2/210L$DE/222L$EA/234L
+-------------------+-------+-------+-------L
L F11 L$D3/211L$DF/223L$EB/235L
+-------------------+-------+-------+-------L
L F12 L$D4/212L$E0/224L$EC/236L
+-------------------+-------+-------+-------L
L Tab L$ED/237L$EE/238L$ED/237L
+-------------------+-------+-------+-------L
L Backspace L$7F/127L$7F/127L$EF/239L
+-------------------+-------+-------+-------L
L Enter L$C0/192L$C0/192L$F0/240L
+-------------------+-------+-------+-------L
L Left_arrow L$C1/193L$C5/197L$F1/241L
+-------------------+-------+-------+-------L
L Right_arrow L$C2/194L$C6/198L$F2/242L
+-------------------+-------+-------+-------L
L Down_arrow L$C3/195L$C7/199L$F3/243L
+-------------------+-------+-------+-------L
L Up_arrow L$C4/196L$C8/200L$F4/244L
+-------------------+-------+-------+-------L
L Home (s-Left) L$C5/197L$C5/197L$F5/245L
+-------------------+-------+-------+-------L
L End (s-Right) L$C6/198L$C6/198L$F6/246L
+-------------------+-------+-------+-------L
L PageDown (s-Down) L$C7/199L$C7/199L$F7/247L
+-------------------+-------+-------+-------L
L PageUp (s-Up) L$C8/200L$C8/200L$F8/248L
+-------------------+-------+-------+-------L
L Delete L$F9/249L$F9/249L$F9/249L
+-------------------+-------+-------+-------L
L Insert L$FA/250L$FA/250L$FA/250L
+-------------------+-------+-------+-------L
L Lat/Кир L$FB/251L$FB/251L$FB/251L
+-------------------+-------+-------+-------L
L CapsLock L$FC/252L$FC/252L$FC/252L
+-------------------+-------+-------+-------L
L Pause (s-Space) L$FD/253L$FD/253L$FD/253L
+-------------------+-------+-------+-------L
L Break (c-Space) L$FE/254L$FE/254L$FE/254L
L-------------------+-------+-------+--------
2U0
Някои клавиши не съществуват на някои модели клавитури. Част от тях са
еквивалентни на комбинацията посочена в скоби. Кода $FF/255 е невалиден.
6. ГРЕШКИ НА ОПЕРАЦИОННАТА СИСТЕМА
_NO_ERROR = 0
_BAD_CMD = 1
_INV_DRV = 2
_WRT_PROT = 3
_ADDR_ERR = 4
_DTA_ERR = 5
_GENERAL_ERR = 6
_INV_SECTOR = 7
_NO_DEVICE = 8
_BAD_DESCR = 9
_FAT_ERROR = 10
_INV_PATH = 11
_INV_DIR = 12
_NO_HANDLE = 13
_ACC_DENIED = 14
_FILE_OPEN = 15
_INV_HANDLE = 16
_DISK_FULL = 17
_FILE_LOST = 18
_INV_NAME = 19
_DIR_FULL = 20
_DIR_EXIST = 21
_CUR_DIR = 22 ;atempt to delete current dir
_DIR_NOT_EMPTY = 23
_BAD_POSITION = 24
_INV_FUNCTION = 25
_NOT_DISK_FILE = 26
_TOO_MANY_DRVRS = 27
_EOF = 200
_RESERVED_CLU = 201
_BAD_CLU = 202
_INV_NUM_PARMS = 150
_FILE_TOO_LONG = 151
7. УПРАВЛЯВАЩИ СИМВОЛИ НА КОНЗОЛАТА:
$07 - bell
$08 - backspace - връща курсора една позиция назад
$09 - tab - мести курсора на следващата кратна на 8 позиция
$0A - linefeed - мести курсора в началото на следващия ред
$0C - formfeed - мести курсора в началото на нова страница (изчиства екрана)
$0D - carriage return - мести курсора в началото на текущия ред
$18 - cancel - изтрива до края на реда
$1B - escape - следващия символ се печати като нормален независимо какъв е
$1Е - (gotoxy) - следващите два символа указват новата хоризонтална и
вертикална позиция, увеличена с $20, например отпечатването на
следните три символи: $1Е $28 $25 - праща курсора на 8 колона, 5 ред.
8. ОСНОВНИ ТЕРМИНИ:
адрес (address) - номер на клетка от паметта, микропроцесора СМ601 може да се
обръща към 65536 клетки, номерират се с $0000 до $FFFF;
байт (byte) - съвкупност от 8 бита, обем на 1 клетка от паметта, единица за
количество памет, в един байт могат да се запишат 256 различни стойности;
бит (bit) - елементарна единица за информация, определяща две състояния 0 и 1;
вектор (vector) - начален адрес в паметта, съдържаща инструкции на
микропроцесора ;
дума (word) - съвкупност от 16 бита или 2 байта, в една дума могат да се
запишат 65536 различни стойности;
интеръпт (interrupt) - прекъсване, биват хардуерни - IRQ, NMI и софтуерни -
SWI. В този документ понятието интеръпт означава софтуерно прекъсване -
изпълнение на инструкцията SWI, следвана от един байт, указващ номер на
прекъсването;
килобайт (kilobyte) - приблизително 1000 байта, единица за количество памет,
по-точно 2^10 байта, 64 килобайта са 65536 или 2^16 байта;
промпт (prompt) - известяващ символ или нялолко символа, указващ например коя
системна програма се изпълнява в момента;
регистър (register) - един от регистрите на микропроцесора: акумулатори - A и
B, индексен - X, на състоянието - P, указател на стека - SP и програмен
брояч - PC;
стринг (string) - поредица от символи, завършваща с байт със стойност $00;
указател (pointer) - начален адрес в паметта, съдържаща данни;
шестнадесетична цифра (hex digit) - цифра в бройна система с основа 16,
използват се цифрите 0 до 9 и буквите A до F;