ROM:0000 ; ROM:0000 ; +-------------------------------------------------------------------------+ ROM:0000 ; | This file is generated by The Interactive Disassembler (IDA) | ROM:0000 ; | Copyright (c) 2007 by DataRescue sa/nv, <ida@datarescue.com> | ROM:0000 ; | Licensed to: Mach EDV Dienstleistungen, Jan Mach, 1 user, adv, 11/2007 | ROM:0000 ; +-------------------------------------------------------------------------+ ROM:0000 ; ROM:0000 ; Input MD5 : 1C7D451AFF559ADD17CFFC63D8BE8A64 ROM:0000 ROM:0000 ; File Name : C:\SURA\sura.rom ROM:0000 ; Format : Binary file ROM:0000 ; Base Address: 0000h Range: 0000h - 4000h Loaded length: 4000h ROM:0000 ROM:0000 ; Processor : 8085 [] ROM:0000 ; Target assembler: Table Driven Assembler (TASM) by Speech Technology Inc. ROM:0000 ROM:0000 ; =========================================================================== ROM:0000 ROM:0000 ; Segment type: Pure code ROM:0000 ROM:0000 ; =============== S U B R O U T I N E ======================================= ROM:0000 ROM:0000 ; RST0 = старт. ОЗУ при этом инициализируется, но не очищается. ROM:0000 ; Т. е. если сделать POKE 50000, 255 а потом X=USR(0), то в памяти по адресу 50000 так и останется лежать байт 255. ROM:0000 ; При этом, конечно, рабочие области подлежат инициализации, как и упоминалось. ROM:0000 ROM:0000 START: ; CODE XREF: ROM:0005j ROM:0000 ; ROM:165Dp ... ROM:0000 ROM:0000 ; FUNCTION CHUNK AT ROM:1742 SIZE 00000017 BYTES ROM:0000 ; FUNCTION CHUNK AT ROM:2920 SIZE 00000084 BYTES ROM:0000 ROM:0000 di ROM:0001 jmp INIT ROM:0001 ; End of function START ROM:0001 ROM:0004 ; --------------------------------------------------------------------------- ROM:0004 nop ROM:0005 jmp START ; RST0 = старт. ОЗУ при этом инициализируется, но не очищается. ROM:0005 ; Т. е. если сделать POKE 50000, 255 а потом X=USR(0), то в памяти по адресу 50000 так и останется лежать байт 255. ROM:0005 ; При этом, конечно, рабочие области подлежат инициализации, как и упоминалось. ROM:0008 ROM:0008 ; =============== S U B R O U T I N E ======================================= ROM:0008 ROM:0008 ; RST1 = проверка синтаксиса. ROM:0008 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:0008 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:0008 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:0008 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:0008 ROM:0008 SYNTAXCHECK: ; CODE XREF: ROM:0559p LET+3p ... ROM:0008 mov a, m ROM:0009 xthl ROM:000A cmp m ROM:000B inx h ROM:000C xthl ROM:000D jnz SYNTAXERROR ; Самая распространённая ошибка №2 ROM:000D ; End of function SYNTAXCHECK ROM:000D ROM:0010 ROM:0010 ; =============== S U B R O U T I N E ======================================= ROM:0010 ROM:0010 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:0010 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:0010 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:0010 ROM:0010 NEXTCHAR: ; CODE XREF: CHECKENOUGHMEM+55p ROM:0010 ; CHECKENOUGHMEM+6Bp ... ROM:0010 inx h ROM:0011 mov a, m ROM:0012 cpi 3Ah ; ':' ROM:0014 rnc ROM:0015 jmp NEXTCHAR2 ; возвращает в A следующий символ ввода из буфера в HL, ROM:0015 ; End of function NEXTCHAR ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:0015 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:0018 ROM:0018 ; =============== S U B R O U T I N E ======================================= ROM:0018 ROM:0018 ; RST3 = печатает символ из A на экран. ROM:0018 ROM:0018 OUTCHAR: ; CODE XREF: INPUTSTR-4Ap ROM:0018 ; INPUTSTR-26p ... ROM:0018 ROM:0018 ; FUNCTION CHUNK AT ROM:04B7 SIZE 00000010 BYTES ROM:0018 ; FUNCTION CHUNK AT ROM:1AAF SIZE 00000027 BYTES ROM:0018 ROM:0018 push psw ROM:0019 lda TERMINAL_X ; Переменная, контролирующая текущую X позицию вывода терминала. ROM:001C ora a ROM:001D jmp OUTCHAR2 ROM:001D ; End of function OUTCHAR ROM:001D ROM:0020 ROM:0020 ; =============== S U B R O U T I N E ======================================= ROM:0020 ROM:0020 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:0020 ROM:0020 COMPAREHLDE: ; CODE XREF: KBDBUFAK2+9p ROM:0020 ; GETFLOWPTR+17p ... ROM:0020 mov a, h ROM:0021 sub d ROM:0022 rnz ROM:0023 mov a, l ROM:0024 sub e ROM:0025 ret ROM:0025 ; End of function COMPAREHLDE ROM:0025 ROM:0025 ; --------------------------------------------------------------------------- ROM:0026 TERMINAL_Y_0: .db 1 ; Переменная, контролирующая текущую X позицию вывода терминала. ROM:0027 TERMINAL_X_0: .db 0 ; Переменная, контролирующая текущую Y позицию вывода терминала. ROM:0028 ROM:0028 ; =============== S U B R O U T I N E ======================================= ROM:0028 ROM:0028 ; RST5 = Проверяет состояние FACCUM. ROM:0028 ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно ROM:0028 ; (0xFF если отрицательно, 0x01 если положительно). ROM:0028 ROM:0028 FTESTSIGN: ; CODE XREF: ROM:057Bp ROM:0028 ; FUNCTIONAKp ... ROM:0028 ROM:0028 ; FUNCTION CHUNK AT ROM:12CA SIZE 0000000A BYTES ROM:0028 ROM:0028 lda FACCUM+3 ; Аккумулятор для вычислений с плавающей точкой: ROM:0028 ; 00000000 1 11111111111111111111111 ROM:0028 ; -------- - ----------------------- ROM:0028 ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:002B ora a ROM:002C jnz FTESTSIGN2 ROM:002F ret ROM:002F ; End of function FTESTSIGN ROM:002F ROM:0030 ROM:0030 ; =============== S U B R O U T I N E ======================================= ROM:0030 ROM:0030 ; Псевдокоманда PUSH (HL). ROM:0030 ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP. ROM:0030 ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD. ROM:0030 ROM:0030 PUSHNEXTWORD: ; CODE XREF: FINDPROGRAMLINE2+8p ROM:0030 ; FINDPROGRAMLINE2+9p ... ROM:0030 ROM:0030 ; FUNCTION CHUNK AT ROM:0166 SIZE 00000008 BYTES ROM:0030 ROM:0030 xthl ROM:0031 shld NEXTWORD ; Адрес перехода для RST6 ROM:0034 pop h ROM:0035 jmp PUSHNEXTWORD2 ROM:0035 ; End of function PUSHNEXTWORD ROM:0035 ROM:0038 ROM:0038 ; =============== S U B R O U T I N E ======================================= ROM:0038 ROM:0038 ; RST7 = обработка прерываний. ROM:0038 ; Attributes: thunk ROM:0038 ROM:0038 INTRPT: ; CODE XREF: INTERRPTp ROM:0038 ; INTERRPT+1p ... ROM:0038 jmp INTRPT2 ; Обработка прерываний. ROM:0038 ; End of function INTRPT ROM:0038 ROM:003B ROM:003B ; =============== S U B R O U T I N E ======================================= ROM:003B ROM:003B ; A=символ (вывод символа на экран в текущую позицию курсора). ROM:003B ; Attributes: thunk ROM:003B ROM:003B SYMSCR: ; CODE XREF: OUTCHAR+4A7p ROM:003B ; STRPRN+Ap ROM:003B jmp SYMSCR2 ; вывод символа из A на экран в текущую позицию курсора ROM:003B ; End of function SYMSCR ROM:003B ROM:003E ; --------------------------------------------------------------------------- ROM:003E ROM:003E FNKEYFL: ; Сбрасывает настройки функциональных клавиш по умолчанию ROM:003E jmp FNKEYFL2 ROM:0041 ; --------------------------------------------------------------------------- ROM:0041 ROM:0041 SYMPRN: ; A=символ (вывод символа на печать). ROM:0041 jmp SYMPRN2 ROM:0044 ROM:0044 ; =============== S U B R O U T I N E ======================================= ROM:0044 ROM:0044 ; CPP=(FA24) цвет точки CZP=(FA25) цвет фона CRG=(FA26) цвет рамки (установка цвета). ROM:0044 ; Attributes: thunk ROM:0044 ROM:0044 SETCOLOR: ; CODE XREF: ROM:1A16p ROM:0044 jmp SETCOLOR2 ; Установка цвета ROM:0044 ; End of function SETCOLOR ROM:0044 ROM:0047 ; --------------------------------------------------------------------------- ROM:0047 ROM:0047 KBDRAW: ; A=номер ряда (A=состояние ряда: опрос ряда клавиатурной матрицы). ROM:0047 jmp KBDRAW2 ROM:004A ROM:004A ; =============== S U B R O U T I N E ======================================= ROM:004A ROM:004A ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM). ROM:004A ROM:004A VRAMBTRD: ; CODE XREF: PSET_ASM+2Ap ROM:004A ; PSET_ASM+41p ... ROM:004A jmp VRAMRD ROM:004A ; End of function VRAMBTRD ROM:004A ROM:004D ; --------------------------------------------------------------------------- ROM:004D ROM:004D VRAMBTWR: ; HL=адрес VRAM, A=байт (запись байта в VRAM). ROM:004D mov m, a ROM:004E ret ROM:004E ; --------------------------------------------------------------------------- ROM:004F .db 0 ROM:0050 ROM:0050 ; =============== S U B R O U T I N E ======================================= ROM:0050 ROM:0050 ; A=флажки, HL=адрес, D=строка курсора, E=позиция курсора ROM:0050 ; (A=0 редактирование ROM:0050 ; A=1 установка курсора ROM:0050 ; A=2 вывод текста на экран с текущего положения курсора ROM:0050 ; A=3 установка курсора и вывод текста ROM:0050 ; A=4 вывод строк) ROM:0050 ; Attributes: thunk ROM:0050 ROM:0050 EDIT: ; CODE XREF: INPUTLN-100p ROM:0050 ; START+1750p ... ROM:0050 jmp EDIT2 ; Обработка строк редактором ROM:0050 ; End of function EDIT ROM:0050 ROM:0053 ROM:0053 ; =============== S U B R O U T I N E ======================================= ROM:0053 ROM:0053 ; BC=счетчик, DE=адрес приема, HL=адрес источника ROM:0053 ; (пересылка VRAM -> RAM) ROM:0053 ROM:0053 VRAM2RAM: ; CODE XREF: SALOTR+Ep ROM:0053 jmp VRAM2RAM_ ROM:0053 ; End of function VRAM2RAM ROM:0053 ROM:0056 ROM:0056 ; =============== S U B R O U T I N E ======================================= ROM:0056 ROM:0056 ; A=константа, BC=счетчик, HL=адрес (заполнение области константой) ROM:0056 ; Attributes: thunk ROM:0056 ROM:0056 FILLAREA: ; CODE XREF: EDIT1+27p ROM:0056 ; ROM:1C6Ap ... ROM:0056 jmp FILLAREA2 ; Заполнение области константой ROM:0056 ; End of function FILLAREA ROM:0056 ROM:0059 ROM:0059 ; =============== S U B R O U T I N E ======================================= ROM:0059 ROM:0059 ; BC=счетчик, DE=адрес приема, HL=адрес источника ROM:0059 ; (пересылка VRAM->RAM, VRAM->VRAM) ROM:0059 ROM:0059 VRAMSEND: ; CODE XREF: EDIT3+40p ROM:0059 ; KEYSON3+1Bp ... ROM:0059 jmp VRAM2RAM_ ROM:0059 ; End of function VRAMSEND ROM:0059 ROM:005C ROM:005C ; =============== S U B R O U T I N E ======================================= ROM:005C ROM:005C ; BC=счетчик, DE=адрес приема, HL=адрес источника ROM:005C ; (пересылка RAM->RAM, RAM->VRAM) ROM:005C ROM:005C RAMSEND: ; CODE XREF: RAMSEND+7j ROM:005C ; INTRPT2+63p ... ROM:005C mov a, m ROM:005D stax d ROM:005E inx d ROM:005F inx h ROM:0060 dcx b ROM:0061 mov a, b ROM:0062 ora c ROM:0063 jnz RAMSEND ; BC=счетчик, DE=адрес приема, HL=адрес источника ROM:0063 ; (пересылка RAM->RAM, RAM->VRAM) ROM:0066 ret ROM:0066 ; End of function RAMSEND ROM:0066 ROM:0067 ROM:0067 ; =============== S U B R O U T I N E ======================================= ROM:0067 ROM:0067 ; A=байт, BC=адрес ROM:0067 ; (перекодировка A (шестнадцатеричного) в символы) ROM:0067 ; Attributes: thunk ROM:0067 ROM:0067 BTDECODE: ; CODE XREF: ROM:1FCBp ROM:0067 ; ROM:1FCFp ROM:0067 jmp BTDECODE2 ; Перекодировка A в символы ROM:0067 ; End of function BTDECODE ROM:0067 ROM:006A ROM:006A ; =============== S U B R O U T I N E ======================================= ROM:006A ROM:006A ; A=режим (установка режима 0, 1, 2) ROM:006A ; Attributes: thunk ROM:006A ROM:006A SETMODE: ; CODE XREF: ROM:1A22p ROM:006A ; EDIT1+3Cp ROM:006A jmp SETMODE2 ; Установка режима экрана ROM:006A ; End of function SETMODE ROM:006A ROM:006D ROM:006D ; =============== S U B R O U T I N E ======================================= ROM:006D ROM:006D ; A=код (0,1,2): ROM:006D ; 0 - клавиатура, ROM:006D ; 1 - джойстик №1, ROM:006D ; 2 - джойстик №2. ROM:006D ; (A=код направления: чтение направления, ROM:006D ; 8 1 2 ROM:006D ; 7<-0->3 ROM:006D ; 6 5 4 ROM:006D ; Attributes: thunk ROM:006D ROM:006D JOYDIR: ; CODE XREF: ROM:1A66p ROM:006D jmp JOYDIR2 ; Чтение направления джойстика ROM:006D ; End of function JOYDIR ROM:006D ROM:0070 ROM:0070 ; =============== S U B R O U T I N E ======================================= ROM:0070 ROM:0070 ; Опрос состояния кнопки. ROM:0070 ; A=код (0,1,2): ROM:0070 ; 0 - клавиатура, ROM:0070 ; 1 - джойстик №1, ROM:0070 ; 2 - джойстик №2. ROM:0070 ; (A=состояние кнопки (пробел - клавиатуры), ROM:0070 ; 0 - не нажата, ROM:0070 ; 1 - нажата) ROM:0070 ; Attributes: thunk ROM:0070 ROM:0070 ASKBTN: ; CODE XREF: ROM:1A59p ROM:0070 jmp ASKBTN2 ; Опрос состояния кнопки джойстика ROM:0070 ; End of function ASKBTN ROM:0070 ROM:0073 ROM:0073 ; =============== S U B R O U T I N E ======================================= ROM:0073 ROM:0073 ; Обработка звука нажатия клавиш и CHR(7) (в зависимости от BEEPF) ROM:0073 ; Attributes: thunk ROM:0073 ROM:0073 BELL: ; CODE XREF: ROM:1D4Ep ROM:0073 jmp BELL2 ; Обработка звука нажатия клавиш и CHR$(&h07) (в зависимости от BEEPF) ROM:0073 ; End of function BELL ROM:0073 ROM:0076 ROM:0076 ; =============== S U B R O U T I N E ======================================= ROM:0076 ROM:0076 ; Рисование точки белым цветом (FD90 координата X, FD91 координата Y) ROM:0076 ; Attributes: thunk ROM:0076 ROM:0076 PRESETWT: ; CODE XREF: SYMSCR2+C7p ROM:0076 jmp PRESETWT2 ; Рисование точки белым цветом (FD90 координата X, FD91 координата Y) ROM:0076 ; End of function PRESETWT ROM:0076 ROM:0079 ROM:0079 ; =============== S U B R O U T I N E ======================================= ROM:0079 ROM:0079 ; Опрос буфера клавиатуры. ROM:0079 ; Z=1 буфер пуст, ROM:0079 ; Z=0 символ в буфере ROM:0079 ; Attributes: thunk ROM:0079 ROM:0079 KBDBUFAK: ; CODE XREF: ROM:INKEYp ROM:0079 jmp KBDBUFAK2 ; Опрос буфера клавиатуры ROM:0079 ; End of function KBDBUFAK ROM:0079 ROM:007C ROM:007C ; =============== S U B R O U T I N E ======================================= ROM:007C ROM:007C ; Ввод символа из буфера клавиатуры в A. ROM:007C ; Если буфер пуст - ожидание нажатия. ROM:007C ; Attributes: thunk ROM:007C ROM:007C BUFFERTOA: ; CODE XREF: INPUTSTR2p ROM:007C ; ROM:1981p ROM:007C jmp BUFFERTOA2 ; Ввод символа из буфера клавиатуры ROM:007C ; End of function BUFFERTOA ROM:007C ROM:007F ROM:007F ; =============== S U B R O U T I N E ======================================= ROM:007F ROM:007F ; Тестирование нажатия УПР+Стоп ROM:007F ; Attributes: thunk ROM:007F ROM:007F TESTBREAKKEY: ; CODE XREF: BUFFERTOA2:loc_240Ap ROM:007F jmp TESTBREAKKEY2 ; Смотрим, надо ли остановиться? ROM:007F ; End of function TESTBREAKKEY ROM:007F ROM:007F ; --------------------------------------------------------------------------- ROM:0082 INITTAB2: .db 'P', 'w', 0Ah, 'F', 'v', 0Ah, 'C', 'L', 'L', 'F', 'O' ROM:0082 .db 'T', 'N', 'E', 'X', 'L', 'D', 'A', 'T', '+', 'I', 'N' ROM:0082 .db 'P', 'U', 'L', 'D', 'I', '=' ROM:009E ROM:009E ; =============== S U B R O U T I N E ======================================= ROM:009E ROM:009E ; Выключает изображение курсора. ROM:009E ; Attributes: thunk ROM:009E ROM:009E CURSOFF: ; CODE XREF: INPUTSTR:loc_4D9p ROM:009E ; CHECKENOUGHMEM+189Cp ROM:009E jmp CURSOFF2 ; Выключает изображение курсора ROM:009E ; End of function CURSOFF ROM:009E ROM:00A1 ROM:00A1 ; =============== S U B R O U T I N E ======================================= ROM:00A1 ROM:00A1 ; Включает изображение курсора. ROM:00A1 ; Attributes: thunk ROM:00A1 ROM:00A1 CURSON: ; CODE XREF: INPUTSTR+3p ROM:00A1 ; EDIT1:loc_1B90p ROM:00A1 jmp CURSON2 ; Включает изображение курсора ROM:00A1 ; End of function CURSON ROM:00A1 ROM:00A4 ROM:00A4 ; =============== S U B R O U T I N E ======================================= ROM:00A4 ROM:00A4 ; Выключает нижнюю строку ключей. ROM:00A4 ; Attributes: thunk ROM:00A4 ROM:00A4 KEYSOFF: ; CODE XREF: ROM:loc_1B36p ROM:00A4 jmp KEYSOFF2 ; Выключает нижнюю строку ключей. ROM:00A4 ; End of function KEYSOFF ROM:00A4 ROM:00A7 ROM:00A7 ; =============== S U B R O U T I N E ======================================= ROM:00A7 ROM:00A7 ; Включает нижнюю строку ключей. ROM:00A7 ; Attributes: thunk ROM:00A7 ROM:00A7 KEYSON: ; CODE XREF: ROM:loc_1B3Cp ROM:00A7 jmp KEYSON2 ; Включает нижнюю строку ключей. ROM:00A7 ; End of function KEYSON ROM:00A7 ROM:00AA ROM:00AA ; =============== S U B R O U T I N E ======================================= ROM:00AA ROM:00AA ; Возвращает в аккумулятор длину строки экрана в символах ROM:00AA ; Attributes: thunk ROM:00AA ROM:00AA SCRLEN: ; CODE XREF: ROM:1A2Ap ROM:00AA jmp SCRLEN2 ; Возвращает в аккумулятор длину строки экрана в символах ROM:00AA ; End of function SCRLEN ROM:00AA ROM:00AD ROM:00AD ; =============== S U B R O U T I N E ======================================= ROM:00AD ROM:00AD ; Кто объяснит мне этот кусок - буду благодарен. Вызывается из функции POINT перед тем, как нарисовать точку. Три раза делает RST 7. ROM:00AD ROM:00AD INTERRPT: ; CODE XREF: ROM:1F28p ROM:00AD rst 7 ; RST7 = обработка прерываний. ROM:00AE rst 7 ; RST7 = обработка прерываний. ROM:00AF rst 7 ; RST7 = обработка прерываний. ROM:00AF ; End of function INTERRPT ROM:00AF ROM:00B0 ROM:00B0 ; =============== S U B R O U T I N E ======================================= ROM:00B0 ROM:00B0 ; Очистить буфер клавиатуры. ROM:00B0 ; Attributes: thunk ROM:00B0 ROM:00B0 KBDBUFCL: ; CODE XREF: CHECKENOUGHMEM+189Fp ROM:00B0 ; EDIT1:loc_1BA2p ROM:00B0 jmp KBDBUFCL2 ; Очищает буфер клавиатуры ROM:00B0 ; End of function KBDBUFCL ROM:00B0 ROM:00B0 ; --------------------------------------------------------------------------- ROM:00B3 INITVRAM2RAM_: .db 0F3h, 0CDh, 24h, 0F8h, 78h, 0B1h, 7Eh, 0CAh, 11h, 0F8h ROM:00B3 ; DATA XREF: START+2964o ROM:00B3 .db 12h, 13h, 23h, 0Bh, 0C3h, 4, 0F8h, 0CDh, 16h, 0F8h ; Инициализация процедур VRAM2RAM. ROM:00B3 .db 0FBh, 0C9h, 0F5h, 0CDh, 8Bh, 0F8h, 0D3h, 80h, 0F1h ; Этот блок переносится в ОЗУ по адресу &hF800 ROM:00B3 .db 0C9h, 0F5h, 3Eh, 0FCh, 0C3h, 27h, 0F8h, 0F5h, 3Eh ROM:00B3 .db 0FFh, 0F5h, 0DBh, 80h, 32h, 7Dh, 0FDh, 0F1h, 0C3h ROM:00B3 .db 1Ah, 0F8h, 0F3h, 0CDh, 24h, 0F8h, 7Eh, 0C3h, 11h, 0F8h ROM:00B3 .db 7Dh, 0D6h, 0, 6Fh, 7Ch, 0DEh, 0, 67h, 78h, 0DEh, 0 ROM:00B3 .db 47h, 3Eh, 0, 0DEh, 0, 0C9h, 0D3h, 0, 0C9h, 32h, 51h ROM:00B3 .db 0F8h, 0DBh, 0, 0C9h, 0D3h, 0, 0C9h, 0C3h, 0F9h, 4 ROM:00B3 .db 0CDh, 24h, 0F8h, 47h, 32h, 62h, 0F8h, 7Eh, 0D3h, 0 ROM:00B3 .db 23h, 78h, 3Ch, 0FEh, 0C0h, 0C2h, 5Ch, 0F8h, 0C3h, 16h ROM:00B3 .db 0F8h, 0C9h, 0C9h, 0C9h, 0D5h, 11h, 0, 0, 19h, 0D1h ROM:00B3 .db 0CEh, 0, 0C9h, 52h, 0C7h, 4Fh, 80h, 0CDh, 0AAh, 2 ROM:00B3 .db 0E9h, 0C9h, 52h, 4Eh, 0C4h, 4Ch, 4Fh, 0C7h, 45h, 58h ROM:00B3 .db 3Eh, 1, 32h, 0EBh, 0FDh, 3Ah, 7Dh, 0FDh, 0C9h ROM:0147 ROM:0147 ; =============== S U B R O U T I N E ======================================= ROM:0147 ROM:0147 ; Опрос ряда клавиатурной матрицы ROM:0147 ROM:0147 KBDRAW2: ; CODE XREF: ROM:KBDRAWj ROM:0147 ; JOYDIR2+19p ... ROM:0147 di ROM:0148 push b ROM:0149 ani 0Fh ROM:014B mov b, a ROM:014C in 82h ROM:014E ani 0F0h ROM:0150 ora b ROM:0151 out 82h ROM:0153 in 81h ROM:0155 pop b ROM:0156 ret ROM:0156 ; End of function KBDRAW2 ROM:0156 ROM:0156 ; --------------------------------------------------------------------------- ROM:0157 .db 41h ROM:0158 .db 0CCh ; ¦ ROM:0159 .db 41h ; A ROM:015A ROM:015A ; =============== S U B R O U T I N E ======================================= ROM:015A ROM:015A ; Очищает буфер клавиатуры ROM:015A ROM:015A KBDBUFCL2: ; CODE XREF: KBDBUFCLj ROM:015A ; INTRPT2+12Ep ... ROM:015A push h ROM:015B lxi h, KBDBUF ; Буфер клавиатуры ROM:015E shld INBUF ; Адрес чтения из буфера клавиатуры ROM:0161 shld OUTBUF ; Адрес записи в буфер клавиатуры ROM:0164 pop h ROM:0165 ret ROM:0165 ; End of function KBDBUFCL2 ROM:0165 ROM:0166 ; --------------------------------------------------------------------------- ROM:0166 ; START OF FUNCTION CHUNK FOR PUSHNEXTWORD ROM:0166 ROM:0166 PUSHNEXTWORD2: ; CODE XREF: PUSHNEXTWORD+5j ROM:0166 mov c, m ROM:0167 inx h ROM:0168 mov b, m ROM:0169 inx h ROM:016A push b ROM:016B jmp JMPNXTWD ROM:016B ; END OF FUNCTION CHUNK FOR PUSHNEXTWORD ROM:016E ROM:016E ; =============== S U B R O U T I N E ======================================= ROM:016E ROM:016E ; Гашение изображения ROM:016E ROM:016E ISOOFF: ; CODE XREF: SETMODE3+39p ROM:016E in 86h ROM:0170 ani 0EFh ROM:0172 out 86h ROM:0174 ret ROM:0174 ; End of function ISOOFF ROM:0174 ROM:0175 ; --------------------------------------------------------------------------- ROM:0175 ; START OF FUNCTION CHUNK FOR SETMODE3 ROM:0175 ROM:0175 ISOON: ; CODE XREF: SETMODE3+41j ROM:0175 in 86h ROM:0177 ori 10h ROM:0179 out 86h ROM:017B ret ROM:017B ; END OF FUNCTION CHUNK FOR SETMODE3 ROM:017C ROM:017C ; =============== S U B R O U T I N E ======================================= ROM:017C ROM:017C ; Вывод символа из A на печать ROM:017C ROM:017C SYMPRN2: ; CODE XREF: ROM:SYMPRNj ROM:017C ; SYMSCR2+8p ROM:017C ROM:017C ; FUNCTION CHUNK AT ROM:227A SIZE 00000054 BYTES ROM:017C ROM:017C push psw ROM:017D ROM:017D loc_17D: ; CODE XREF: ROM:0189j ROM:017D call KBD2 ; LOC_17E: RNC ROM:017D ; .DB 1 ROM:017D ; JZ LOC_227A ROM:0180 jz loc_227A ROM:0183 pop psw ROM:0184 stc ROM:0185 ret ROM:0185 ; End of function SYMPRN2 ROM:0185 ROM:0186 ; --------------------------------------------------------------------------- ROM:0186 add m ROM:0187 ani 1 ROM:0189 jz loc_17D+1 ; LOC_17E: RNC ROM:0189 ; .DB 1 ROM:0189 ; JZ LOC_227A ROM:018C ret ROM:018D ROM:018D ; =============== S U B R O U T I N E ======================================= ROM:018D ROM:018D ROM:018D MACRO1: ; CODE XREF: INTRPT2+12Bp ROM:018D push h ROM:018E lxi h, loc_7CF ROM:0191 ROM:0191 loc_191: ; CODE XREF: MACRO1+7j ROM:0191 dcx h ROM:0192 mov a, l ROM:0193 ora h ROM:0194 jnz loc_191 ROM:0197 pop h ROM:0198 ret ROM:0198 ; End of function MACRO1 ROM:0198 ROM:0199 ROM:0199 ; =============== S U B R O U T I N E ======================================= ROM:0199 ROM:0199 ; Опрос буфера клавиатуры ROM:0199 ROM:0199 KBDBUFAK2: ; CODE XREF: KBDBUFAKj ROM:0199 ; BUFFERTOA2+Dp ROM:0199 push h ROM:019A push d ROM:019B lhld INBUF ; Адрес чтения из буфера клавиатуры ROM:019E xchg ROM:019F lhld OUTBUF ; Адрес записи в буфер клавиатуры ROM:01A2 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:01A3 pop d ROM:01A4 pop h ROM:01A5 ret ROM:01A5 ; End of function KBDBUFAK2 ROM:01A5 ROM:01A6 ROM:01A6 ; =============== S U B R O U T I N E ======================================= ROM:01A6 ROM:01A6 ; Чтение направления джойстика ROM:01A6 ROM:01A6 JOYDIR2: ; CODE XREF: JOYDIRj ROM:01A6 dcr a ROM:01A7 jm loc_1BD ROM:01AA in 8Ch ROM:01AC jz loc_1B1 ROM:01AF in 8Dh ROM:01B1 ROM:01B1 loc_1B1: ; CODE XREF: JOYDIR2+6j ROM:01B1 lxi h, TAB4+10h ; Дешифратор направлений джойстика ROM:01B4 cma ROM:01B5 ROM:01B5 loc_1B5: ; CODE XREF: JOYDIR2+24j ROM:01B5 ani 0Fh ROM:01B7 mov e, a ROM:01B8 mvi d, 0 ROM:01BA dad d ROM:01BB mov a, m ROM:01BC ret ROM:01BD ; --------------------------------------------------------------------------- ROM:01BD ROM:01BD loc_1BD: ; CODE XREF: JOYDIR2+1j ROM:01BD mvi a, 8 ROM:01BF call KBDRAW2 ; Опрос ряда клавиатурной матрицы ROM:01C2 ei ROM:01C3 rrc ROM:01C4 rrc ROM:01C5 rrc ROM:01C6 rrc ROM:01C7 lxi h, TAB4 ; Дешифратор направлений джойстика ROM:01CA jmp loc_1B5 ROM:01CA ; End of function JOYDIR2 ROM:01CA ROM:01CA ; --------------------------------------------------------------------------- ROM:01CD .db 0B8h ROM:01CE .db 2Ch ROM:01CF .db 9Ch ROM:01D0 ROM:01D0 ; =============== S U B R O U T I N E ======================================= ROM:01D0 ROM:01D0 ; Вызывается из SYMPRN2. Проверяет 2 бит EVNTTAB и порта &h86. ROM:01D0 ; Заметим, что в описании портов у порта &h86 биты 1, 2 и 3 не используются! ROM:01D0 ROM:01D0 KBD2: ; CODE XREF: SYMPRN2:loc_17Dp ROM:01D0 ; KBD2+Aj ROM:01D0 lda EVNTTAB ; Таблица событий. ROM:01D0 ; (УПР/СТОП + 10 функциональных клавиш) ROM:01D0 ; Бит 0 - маска события ROM:01D0 ; Бит 2 - событие ROM:01D3 ani 4 ROM:01D5 rnz ROM:01D6 in 86h ROM:01D8 ani 4 ROM:01DA jnz KBD2 ; Вызывается из SYMPRN2. Проверяет 2 бит EVNTTAB и порта &h86. ROM:01DA ; Заметим, что в описании портов у порта &h86 биты 1, 2 и 3 не используются! ROM:01DD ret ROM:01DD ; End of function KBD2 ROM:01DD ROM:01DD ; --------------------------------------------------------------------------- ROM:01DE INITTAB: .db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ROM:01DE .db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0CFh ROM:01DE .db 0, 0, 0, 0, 0 ROM:0205 INITKEYS: .db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0Ah, 0, 0Ah, 0, 0, 41h ROM:0205 ; DATA XREF: START+2970o ROM:0205 ; PRINTINT2+4Co ROM:0205 .db 1, 0, 0, 0, 1, 0, 0FEh, 0F7h, 0Ah, 0F9h, 6, 0, 6Bh ; Инициализация переменных. ROM:0205 .db 2, 1, 0, 89h, 17h, 0, 0, 0, 0, 6, 0, 6Bh, 2, 0FEh ; Этот блок переностися в ОЗУ по адресу &hF8F0 ROM:0205 .db 0F7h, 0D5h, 1, 0, 0, 0, 0, 22h, 17h, 0D5h, 1, 0FFh ROM:0205 .db 0FFh, 6Eh, 0Ah, 0, 0, 36h, 0F7h, 1, 40h, 3, 40h, 3 ROM:0205 .db 40h, 3, 40h, 0, 40h, 1Fh, 2, 84h, 87h, 0C2h, 20h, 32h ROM:0205 .db 35h, 36h, 0, 30h, 30h, 30h, 3Fh, 20h, 20h, 20h, 20h ROM:0205 .db 20h, 45h, 72h, 72h, 6Fh, 72h, 0 ROM:0266 INITKEYS2: .text " in " ; DATA XREF: INITKEYS2TR+1o ROM:0266 .db 0 ROM:026B aOk: .db 0Ah ; DATA XREF: ROM:1054o ROM:026B ; CHECKENOUGHMEM+46o ROM:026B .db 0Ah ROM:026B .text "Ok" ROM:026B .db 0Dh ROM:026B .db 0Ah ROM:026B .db 0 ROM:0272 aBreak: .db 0Dh ; DATA XREF: TESTBREAKKEY2+24o ROM:0272 .db 0Ah ROM:0272 .text "Break" ROM:0272 .db 0 ROM:027A ROM:027A ; =============== S U B R O U T I N E ======================================= ROM:027A ROM:027A ; Сервисная функция. ROM:027A ; Устанавливает HL в точку соответствующей структуры потока на стеке (Sets HL to point to the appropriate flow struct on the stack.). ROM:027A ; Если функция вызвана ключевым словом NEXT, то DE указывает на переменную, следующую за ключевым словом NEXT. ROM:027A ; Таким образом, устанавливает DE как главный указатель программы (i.e. Get program ptr into DE). ROM:027A ; ROM:027A ROM:027A GETFLOWPTR: ; CODE XREF: ROM:053Ep ROM:027A ; ROM:06E6p ... ROM:027A lxi h, 4 ROM:027D dad sp ROM:027E ROM:027E loc_27E: ; CODE XREF: GETFLOWPTR+1Ej ROM:027E mov a, m ROM:027F inx h ROM:0280 cpi 81h ; 'Б' ROM:0282 rnz ROM:0283 mov c, m ROM:0284 inx h ROM:0285 mov b, m ROM:0286 inx h ROM:0287 push h ROM:0288 mov l, c ROM:0289 mov h, b ROM:028A mov a, d ROM:028B ora e ROM:028C xchg ROM:028D jz loc_292 ROM:0290 xchg ROM:0291 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:0292 ROM:0292 loc_292: ; CODE XREF: GETFLOWPTR+13j ROM:0292 lxi b, 0Dh ROM:0295 pop h ROM:0296 rz ROM:0297 dad b ROM:0298 jmp loc_27E ROM:0298 ; End of function GETFLOWPTR ROM:0298 ROM:029B ROM:029B ; =============== S U B R O U T I N E ======================================= ROM:029B ROM:029B ; Копирует байты памяти из BC в HL. Копирование идёт задом-наперёд до тех, пор, пока BC не станет равным DE. ROM:029B ; Идёт оно задом-наперёд потому, что функция может использоваться для блоков отстоящих друг от друга на пару байт. ROM:029B ; В таком случае, если бы копирование шло напрямую, то блок памяти затёр бы сам себя. ROM:029B ROM:029B COPYMEMORYUP: ; CODE XREF: CHECKENOUGHMEM+92p ROM:029B ; GETVAR2+64p ROM:029B call CHECKENOUGHMEM ; Проверяет, действительно ли HL больше, чем на 32 байта отстоит от указателя стека. ROM:029B ; End of function COPYMEMORYUP ; Если HL расположен ближе чем на 32 байта к стеку, то функция падает в OutOfMemory. ROM:029B ROM:029E ROM:029E ; =============== S U B R O U T I N E ======================================= ROM:029E ROM:029E ROM:029E COPYMEMORYUP2: ; CODE XREF: MAINTR5+C0p ROM:029E push b ROM:029F xthl ROM:02A0 pop b ROM:02A1 ROM:02A1 loc_2A1: ; CODE XREF: COPYMEMORYUP2+9j ROM:02A1 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:02A2 mov a, m ROM:02A3 stax b ROM:02A4 rz ROM:02A5 dcx b ROM:02A6 dcx h ROM:02A7 jmp loc_2A1 ROM:02A7 ; End of function COPYMEMORYUP2 ROM:02A7 ROM:02AA ROM:02AA ; =============== S U B R O U T I N E ======================================= ROM:02AA ROM:02AA ; Внимание! После вызова CHECKENOUGHVARSPACE идет байт параметра, а не следующая инструкция! ROM:02AA ; Проверяет, достаточно ли будет памяти при выделении места для C*4 байт начиная с VAR_TOP перед тем как это выделение начнёт затирать стек. ROM:02AA ; (Или область переменных). ROM:02AA ROM:02AA CHECKENOUGHVARSPACE: ; CODE XREF: ROM:0548p ROM:02AA ; ROM:GOSUBp ... ROM:02AA xthl ROM:02AB mov c, m ROM:02AC inx h ROM:02AD xthl ROM:02AE push h ROM:02AF lhld VAR_TOP ; Адрес начала свободной памяти. ROM:02AF ; Указывает на верхушку области хранящей массивы и переменные. ROM:02B2 mvi b, 0 ROM:02B4 dad b ROM:02B5 dad b ROM:02B6 call CHECKENOUGHMEM ; Проверяет, действительно ли HL больше, чем на 32 байта отстоит от указателя стека. ROM:02B6 ; Если HL расположен ближе чем на 32 байта к стеку, то функция падает в OutOfMemory. ROM:02B9 pop h ROM:02BA ret ROM:02BA ; End of function CHECKENOUGHVARSPACE ROM:02BA ROM:02BB ROM:02BB ; =============== S U B R O U T I N E ======================================= ROM:02BB ROM:02BB ; Проверяет, действительно ли HL больше, чем на 32 байта отстоит от указателя стека. ROM:02BB ; Если HL расположен ближе чем на 32 байта к стеку, то функция падает в OutOfMemory. ROM:02BB ROM:02BB CHECKENOUGHMEM: ; CODE XREF: COPYMEMORYUPp ROM:02BB ; CHECKENOUGHVARSPACE+Cp ... ROM:02BB ROM:02BB ; FUNCTION CHUNK AT ROM:05AD SIZE 0000001E BYTES ROM:02BB ; FUNCTION CHUNK AT ROM:1021 SIZE 0000000F BYTES ROM:02BB ; FUNCTION CHUNK AT ROM:1B52 SIZE 0000000E BYTES ROM:02BB ROM:02BB push d ROM:02BC xchg ROM:02BD lxi h, 0FFDAh ROM:02C0 dad sp ROM:02C1 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:02C2 xchg ROM:02C3 pop d ROM:02C4 rnc ROM:02C5 ROM:02C5 OUTOFMEMORY: ; CODE XREF: ROM:06A0j ROM:02C5 mvi e, 0Ch ; Ошибка Out of memory ROM:02C7 jmp MAINLOOP1 ; Первая точка входа в главный цикл ROM:02CA ; --------------------------------------------------------------------------- ROM:02CA ROM:02CA loc_2CA: ; CODE XREF: ROM:0844j ROM:02CA lhld MEMTMP2 ; Используется при вычислении количества памяти в OUTOFMEMORY ROM:02CD shld BASOPNUM ; Номер оператора Бейсик программы. ROM:02CD ; Или &hFFFF в командном режиме ROM:02D0 ROM:02D0 SYNTAXERROR: ; CODE XREF: SYNTAXCHECK+5j ROM:02D0 ; NEXT2-386j ... ROM:02D0 mvi e, 2 ; Самая распространённая ошибка №2 ROM:02D0 ; --------------------------------------------------------------------------- ROM:02D2 .db 1 ; LXI B,.... ROM:02D3 ; --------------------------------------------------------------------------- ROM:02D3 ROM:02D3 DIVIDEBYZERO: ; CODE XREF: FDIVBYTEN+Fj ROM:02D3 mvi e, 14h ; Ошибка деления на ноль ROM:02D3 ; --------------------------------------------------------------------------- ROM:02D5 .db 1 ; LXI B,.... ROM:02D6 ; --------------------------------------------------------------------------- ROM:02D6 ROM:02D6 ERROR_: ; CODE XREF: NEXT2+9j ROM:02D6 mvi e, 0 ; Ошибка ROM:02D8 ROM:02D8 MAINLOOP1: ; CODE XREF: CHECKENOUGHMEM+Cj ROM:02D8 ; ROM:061Fj ... ROM:02D8 call ERRTR ; Первая точка входа в главный цикл ROM:02DB xra a ROM:02DC call STOPTR ; Обработка останова ROM:02DF ROM:02DF loc_2DF: ; DATA XREF: FNKEYTR+19o ROM:02DF call PKCHK ; Проверка позиции курсора, печать новой строки и перевода каретки ROM:02E2 call INPUTPRN ; Печатает пригласительный знак вопроса в команде INPUT и сообщении об ошибке ROM:02E5 mov e, a ROM:02E6 mvi d, 0 ROM:02E8 call PRINTINT2 ; Переводит целое число HL в число с плавающей точкой FACCUM. ROM:02E8 ; Дополнительная точка входа. ROM:02EB lxi h, INITKEYS+5Ah ; Инициализация переменных. ROM:02EB ; Этот блок переностися в ОЗУ по адресу &hF8F0 ROM:02EE ROM:02EE loc_2EE: ; CODE XREF: TESTBREAKKEY2+27j ROM:02EE call MAINTR ; Подпрограмма главного цикла ROM:02F1 lhld BASOPNUM ; Номер оператора Бейсик программы. ROM:02F1 ; Или &hFFFF в командном режиме ROM:02F4 mov a, l ROM:02F5 ana h ROM:02F6 inr a ROM:02F7 cnz INITKEYS2TR ; Инициализация INITKEYS2 ROM:02FA ROM:02FA MAIN2: ; CODE XREF: PRNTR1-12E5j ROM:02FA call CRLF ; Переход с оператора LIST ROM:02FD ROM:02FD MAINLOOP3: ; CODE XREF: TESTBREAKKEY2+2Aj ROM:02FD ; START+1756j ... ROM:02FD xra a ; Третья точка входа в главный цикл. Переход из INIT2, STOP, CSAVE, OUTCHAR2, INPUTLN ROM:02FE call EDIT1 ; Опрашивает флаг печати, формирует таблицу событий, Очищает переменную TERMINAL_X, ROM:02FE ; устанавливает текстовый режим (MODE), очищает буфер клавиатуры и временные переменные ROM:0301 lxi h, aOk+2 ROM:0304 call MAINTR ; Подпрограмма главного цикла ROM:0307 ROM:0307 MAIN: ; CODE XREF: ROM:1DF6j ROM:0307 lxi h, 0FFFFh ; Вторая точка входа в главный цикл. Переход из AUTO ROM:0307 ; Эта процедура ждёт ввода строки и если строка без номера, то пытается сразу выполнить её (EXEC immediately). ROM:030A shld BASOPNUM ; Номер оператора Бейсик программы. ROM:030A ; Или &hFFFF в командном режиме ROM:030D ROM:030D loc_30D: ; CODE XREF: CHECKENOUGHMEM+58j ROM:030D ; CHECKENOUGHMEM+B6j ... ROM:030D call INPUTLN ; НУ ВОТ, СОБСТВЕННО! ЭТО И ЕСТЬ САМЫЙ ГЛАВНЫЙ ЦИКЛ БЕЙСИК-ИНТЕРПРЕТАТОРА! ROM:0310 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:0310 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:0310 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:0311 inr a ROM:0312 dcr a ROM:0313 jz loc_30D ; НУ ВОТ, СОБСТВЕННО! ЭТО И ЕСТЬ САМЫЙ ГЛАВНЫЙ ЦИКЛ БЕЙСИК-ИНТЕРПРЕТАТОРА! ROM:0316 push psw ROM:0317 call LINENUMBERFROMSTR ; Если строка ввода начинается с номера строки, эта процедура прочитает это число в DE. ROM:031A push d ROM:031B call TOKENIZE ; Токенизируем остаток строки. ROM:031E mov b, a ROM:031F pop d ROM:0320 pop psw ROM:0321 jnc EXEC ROM:0324 ROM:0324 STOREPROGRAMLINE: ; Сохранение строки программы. ROM:0324 push d ROM:0325 push b ROM:0326 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:0326 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:0326 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:0327 push psw ROM:0328 call FINDPROGRAMLINE ; Получает ближайший адрес строки программы в BC ROM:032B push b ROM:032C jnc INSERTPROGRAMLINE ; Вставка строки программы. ROM:032F ROM:032F REMOVEPROGRAMLINE: ; Удаление строки программы. ROM:032F xchg ROM:0330 lhld ENBASPRG ; Адрес конца Бейсик программы. ROM:0330 ; Указывает на первую ячейку участка памяти, доступного программам. ROM:0330 ; Всегда следует за последним байтом программы. ROM:0333 ROM:0333 loc_333: ; CODE XREF: CHECKENOUGHMEM+7Dj ROM:0333 ldax d ROM:0334 stax b ROM:0335 inx b ROM:0336 inx d ROM:0337 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:0338 jnc loc_333 ROM:033B mov h, b ROM:033C mov l, c ROM:033D inx h ROM:033E shld ENBASPRG ; Адрес конца Бейсик программы. ROM:033E ; Указывает на первую ячейку участка памяти, доступного программам. ROM:033E ; Всегда следует за последним байтом программы. ROM:0341 ROM:0341 INSERTPROGRAMLINE: ; CODE XREF: CHECKENOUGHMEM+71j ROM:0341 pop d ; Вставка строки программы. ROM:0342 pop psw ROM:0343 jz loc_368 ROM:0346 lhld ENBASPRG ; Адрес конца Бейсик программы. ROM:0346 ; Указывает на первую ячейку участка памяти, доступного программам. ROM:0346 ; Всегда следует за последним байтом программы. ROM:0349 xthl ROM:034A pop b ROM:034B dad b ROM:034C push h ROM:034D call COPYMEMORYUP ; Копирует байты памяти из BC в HL. Копирование идёт задом-наперёд до тех, пор, пока BC не станет равным DE. ROM:034D ; Идёт оно задом-наперёд потому, что функция может использоваться для блоков отстоящих друг от друга на пару байт. ROM:034D ; В таком случае, если бы копирование шло напрямую, то блок памяти затёр бы сам себя. ROM:0350 pop h ROM:0351 shld ENBASPRG ; Адрес конца Бейсик программы. ROM:0351 ; Указывает на первую ячейку участка памяти, доступного программам. ROM:0351 ; Всегда следует за последним байтом программы. ROM:0354 xchg ROM:0355 mov m, h ROM:0356 inx h ROM:0357 inx h ROM:0358 pop d ROM:0359 mov m, e ROM:035A inx h ROM:035B mov m, d ROM:035C inx h ROM:035D lxi d, IOBUF ; Буфер ввода-вывода (диск, кассеты) ROM:0360 ROM:0360 loc_360: ; CODE XREF: CHECKENOUGHMEM+AAj ROM:0360 ldax d ROM:0361 mov m, a ROM:0362 inx h ROM:0363 inx d ROM:0364 ora a ROM:0365 jnz loc_360 ROM:0368 ROM:0368 loc_368: ; CODE XREF: CHECKENOUGHMEM+88j ROM:0368 ; ROM:105Aj ROM:0368 call RESETALL ; Обработка бейсик-команды RUN без параметров. ROM:0368 ; По сути, устанавливает всё готовым для запуска программы, а потом возвращается в EXECNEXT. ROM:036B inx h ROM:036C ROM:036C loc_36C: ; CODE XREF: CHECKENOUGHMEM+C7j ROM:036C mov d, h ROM:036D mov e, l ROM:036E mov a, m ROM:036F inx h ROM:0370 ora m ROM:0371 jz loc_30D ; НУ ВОТ, СОБСТВЕННО! ЭТО И ЕСТЬ САМЫЙ ГЛАВНЫЙ ЦИКЛ БЕЙСИК-ИНТЕРПРЕТАТОРА! ROM:0374 inx h ROM:0375 inx h ROM:0376 inx h ROM:0377 xra a ROM:0378 ROM:0378 loc_378: ; CODE XREF: CHECKENOUGHMEM+BFj ROM:0378 cmp m ROM:0379 inx h ROM:037A jnz loc_378 ROM:037D xchg ROM:037E mov m, e ROM:037F inx h ROM:0380 mov m, d ROM:0381 xchg ROM:0382 jmp loc_36C ROM:0382 ; End of function CHECKENOUGHMEM ROM:0382 ROM:0385 ROM:0385 ; =============== S U B R O U T I N E ======================================= ROM:0385 ROM:0385 ; Получает ближайший адрес строки программы в BC ROM:0385 ROM:0385 FINDPROGRAMLINE: ; CODE XREF: CHECKENOUGHMEM+6Dp ROM:0385 ; ROM:04F3p ... ROM:0385 lhld BGBASPRG ; Адрес начала Бейсик программы ROM:0385 ; End of function FINDPROGRAMLINE ROM:0385 ROM:0388 ROM:0388 ; =============== S U B R O U T I N E ======================================= ROM:0388 ROM:0388 ; Получает ближайший адрес строки программы в BC. ROM:0388 ; Дополнительная точка входа. ROM:0388 ROM:0388 FINDPROGRAMLINE2: ; CODE XREF: FINDPROGRAMLINE2+12j ROM:0388 ; GOTOPRE+7p ROM:0388 mov b, h ROM:0389 mov c, l ROM:038A mov a, m ROM:038B inx h ROM:038C ora m ROM:038D dcx h ROM:038E rz ROM:038F push b ROM:0390 rst 6 ; Псевдокоманда PUSH (HL). ROM:0390 ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP. ROM:0390 ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD. ROM:0391 rst 6 ; Псевдокоманда PUSH (HL). ROM:0391 ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP. ROM:0391 ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD. ROM:0392 pop h ROM:0393 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:0394 pop h ROM:0395 pop b ROM:0396 cmc ROM:0397 rz ROM:0398 cmc ROM:0399 rnc ROM:039A jmp FINDPROGRAMLINE2 ; Получает ближайший адрес строки программы в BC. ROM:039A ; End of function FINDPROGRAMLINE2 ; Дополнительная точка входа. ROM:039A ROM:039D ; --------------------------------------------------------------------------- ROM:039D ROM:039D NEW: ; Обработка оператора NEW. ROM:039D rnz ; Записывает нулевой номер строки в место хранения программы (по сути пустую программу). ROM:039D ; Обновляет указатель ENBASPRG и переходит в RUN, который делает всю оставшуюся работу. ROM:039E ROM:039E ; =============== S U B R O U T I N E ======================================= ROM:039E ROM:039E ; Сброс бейсик-программы к исходному состоянию ROM:039E ; Дополнительная точка входа. ROM:039E ROM:039E NEW2: ; CODE XREF: START+1753p ROM:039E ; ROM:loc_19C8p ROM:039E lhld BGBASPRG ; Адрес начала Бейсик программы ROM:03A1 xra a ROM:03A2 mov m, a ROM:03A3 inx h ROM:03A4 mov m, a ROM:03A5 inx h ROM:03A6 shld ENBASPRG ; Адрес конца Бейсик программы. ROM:03A6 ; End of function NEW2 ; Указывает на первую ячейку участка памяти, доступного программам. ROM:03A6 ; Всегда следует за последним байтом программы. ROM:03A9 ROM:03A9 ; =============== S U B R O U T I N E ======================================= ROM:03A9 ROM:03A9 ; Обработка бейсик-команды RUN без параметров. ROM:03A9 ; По сути, устанавливает всё готовым для запуска программы, а потом возвращается в EXECNEXT. ROM:03A9 ROM:03A9 RESETALL: ; CODE XREF: CHECKENOUGHMEM:loc_368p ROM:03A9 ; ROM:RUNj ROM:03A9 lhld BGBASPRG ; Адрес начала Бейсик программы ROM:03AC dcx h ROM:03AD ROM:03AD RUNWITH: ; CODE XREF: ROM:CLEARj ROM:03AD ; ROM:06A8j ... ROM:03AD shld CURBASLN ; RESETALL дополнительная точка входа. ROM:03B0 lhld ENDSTRAR ; Конец строковой области ROM:03B3 shld RUNWITHTMP ; Временная переменная оператора RUN с параметром ROM:03B6 call READPT ; Сбрасывает указатель оператора READ. При инициализации и при вызове RESTORE ROM:03B6 ; Resets the data pointer to just before the start of the program ROM:03B9 lhld ENBASPRG ; Адрес конца Бейсик программы. ROM:03B9 ; Указывает на первую ячейку участка памяти, доступного программам. ROM:03B9 ; Всегда следует за последним байтом программы. ROM:03BC shld BGARRAY ; Адрес начала массивов. ROM:03BC ; Указывает на начало участка памяти, хранящего массивы. ROM:03BC ; Следует сразу за участком памяти, выделенным для обычных переменных. ROM:03BF shld VAR_TOP ; Адрес начала свободной памяти. ROM:03BF ; End of function RESETALL ; Указывает на верхушку области хранящей массивы и переменные. ROM:03BF ROM:03C2 ROM:03C2 ; =============== S U B R O U T I N E ======================================= ROM:03C2 ROM:03C2 ; Инициализирует адрес рабочей области арифметических преобразований, ROM:03C2 ; обнуляет временные переменные FORTMP, AUTOTR ROM:03C2 ROM:03C2 RESETSTACK: ; CODE XREF: ERRTR+11j ROM:03C2 ; ROM:1DF0p ... ROM:03C2 pop b ROM:03C3 lhld STKADDR ; Адрес стека ROM:03C6 sphl ROM:03C7 lxi h, ARIFMOB ; Рабочая область арифметических преобразований ROM:03CA shld ARIFMAR ; Адрес рабочей области арифметических преобразований ROM:03CD lxi h, 0 ROM:03D0 push h ROM:03D1 shld BRKCONT ; Временная переменная процедур RESETSTACK, TESTBREAKKEY, CONT ROM:03D4 lhld CURBASLN ; Текущий адрес строки Бейсик программы ROM:03D7 xra a ROM:03D8 sta FORTMP ; Временный параметр оператора FOR ROM:03DB push b ROM:03DC ret ROM:03DC ; End of function RESETSTACK ROM:03DC ROM:03DD ; --------------------------------------------------------------------------- ROM:03DD ; START OF FUNCTION CHUNK FOR INPUTLN ROM:03DD ROM:03DD loc_3DD: ; CODE XREF: INPUTLN+191Ej ROM:03DD ; INPUTLN+193Cj ROM:03DD mvi a, 4 ROM:03DF call EDIT ; A=флажки, HL=адрес, D=строка курсора, E=позиция курсора ROM:03DF ; (A=0 редактирование ROM:03DF ; A=1 установка курсора ROM:03DF ; A=2 вывод текста на экран с текущего положения курсора ROM:03DF ; A=3 установка курсора и вывод текста ROM:03DF ; A=4 вывод строк) ROM:03E2 jmp loc_1E4B ROM:03E2 ; END OF FUNCTION CHUNK FOR INPUTLN ROM:03E2 ; --------------------------------------------------------------------------- ROM:03E5 .db 4 ROM:03E6 ; --------------------------------------------------------------------------- ROM:03E6 ; START OF FUNCTION CHUNK FOR TOKENIZE ROM:03E6 ROM:03E6 loc_3E6: ; CODE XREF: TOKENIZE+4j ROM:03E6 ; TOKENIZE+Aj ... ROM:03E6 xra a ROM:03E7 sta MEMTMP ; Временная переменная TOKENIZE ROM:03EA mvi c, 5 ROM:03EC lxi d, IOBUF ; Буфер ввода-вывода (диск, кассеты) ROM:03EF ROM:03EF loc_3EF: ; CODE XREF: TOKENIZE-19D2j ROM:03EF mov a, m ROM:03F0 cpi 20h ; ' ' ROM:03F2 jz loc_439 ROM:03F5 mov b, a ROM:03F6 cpi 22h ; '"' ROM:03F8 jz loc_459 ROM:03FB ora a ROM:03FC jz loc_46D ROM:03FF lda MEMTMP ; Временная переменная TOKENIZE ROM:0402 ora a ROM:0403 mov b, a ROM:0404 mov a, m ROM:0405 jnz loc_439 ROM:0408 cpi 3Fh ; '?' ROM:040A mvi a, 95h ; 'Х' ROM:040C jz loc_439 ROM:040F mov a, m ROM:0410 cpi 30h ; '0' ROM:0412 jc loc_41A ROM:0415 cpi 3Ch ; '<' ROM:0417 jc loc_439 ROM:041A ROM:041A loc_41A: ; CODE XREF: TOKENIZE-1A0Cj ROM:041A push d ROM:041B lxi d, TAB9+16h ; Сюда ссылается TOKENIZE ROM:041E push h ROM:041F ROM:041F loc_41F: ; CODE XREF: TOKENIZE-19F0j ROM:041F mvi a, 0D7h ; '+' ROM:0421 inx d ROM:0422 ROM:0422 loc_422: ; CODE XREF: TOKENIZE-19B4j ROM:0422 ldax d ROM:0423 ani 7Fh ROM:0425 jz loc_436 ROM:0428 cmp m ROM:0429 jmp loc_17CC ROM:042C ; --------------------------------------------------------------------------- ROM:042C ROM:042C loc_42C: ; CODE XREF: TOKENIZE:loc_17CCj ROM:042C ; TOKENIZE-64Cj ROM:042C ldax d ROM:042D ora a ROM:042E jp loc_41F+1 ROM:0431 pop psw ROM:0432 mov a, b ROM:0433 ori 80h ROM:0433 ; END OF FUNCTION CHUNK FOR TOKENIZE ROM:0433 ; --------------------------------------------------------------------------- ROM:0435 .db 0F2h ; Є ROM:0436 ; --------------------------------------------------------------------------- ROM:0436 ; START OF FUNCTION CHUNK FOR TOKENIZE ROM:0436 ROM:0436 loc_436: ; CODE XREF: TOKENIZE-19F9j ROM:0436 pop h ROM:0437 mov a, m ROM:0438 pop d ROM:0439 ROM:0439 loc_439: ; CODE XREF: TOKENIZE-1A2Cj ROM:0439 ; TOKENIZE-1A19j ... ROM:0439 inx h ROM:043A stax d ROM:043B inx d ROM:043C inr c ROM:043D sui 3Ah ; ':' ROM:043F jz loc_447 ROM:0442 cpi 49h ; 'I' ROM:0444 jnz loc_44A ROM:0447 ROM:0447 loc_447: ; CODE XREF: TOKENIZE-19DFj ROM:0447 sta MEMTMP ; Временная переменная TOKENIZE ROM:044A ROM:044A loc_44A: ; CODE XREF: TOKENIZE-19DAj ROM:044A sui 54h ; 'T' ROM:044C jnz loc_3EF ROM:044F mov b, a ROM:0450 ROM:0450 loc_450: ; CODE XREF: TOKENIZE-19C1j ROM:0450 mov a, m ROM:0451 ora a ROM:0452 jz loc_46D ROM:0455 cmp b ROM:0456 jz loc_439 ROM:0459 ROM:0459 loc_459: ; CODE XREF: TOKENIZE-1A26j ROM:0459 inx h ROM:045A stax d ROM:045B inr c ROM:045C inx d ROM:045D jmp loc_450 ROM:0460 ; --------------------------------------------------------------------------- ROM:0460 ROM:0460 loc_460: ; CODE XREF: TOKENIZE-648j ROM:0460 pop h ROM:0461 push h ROM:0462 inr b ROM:0463 xchg ROM:0464 ROM:0464 loc_464: ; CODE XREF: TOKENIZE-19B8j ROM:0464 ora m ROM:0465 inx h ROM:0466 jp loc_464 ROM:0469 xchg ROM:046A jmp loc_422 ROM:046D ; --------------------------------------------------------------------------- ROM:046D ROM:046D loc_46D: ; CODE XREF: TOKENIZE-1A22j ROM:046D ; TOKENIZE-19CCj ROM:046D lxi h, PRNOP ; Временная переменная. Используется TOKENIZE, INPUTLN, START. ROM:0470 stax d ROM:0471 inx d ROM:0472 stax d ROM:0473 inx d ROM:0474 stax d ROM:0475 ret ROM:0475 ; END OF FUNCTION CHUNK FOR TOKENIZE ROM:0476 ; --------------------------------------------------------------------------- ROM:0476 ; START OF FUNCTION CHUNK FOR INPUTSTR ROM:0476 ROM:0476 loc_476: ; CODE XREF: INPUTSTR-35j ROM:0476 cpi 1Ch ROM:0478 jnz loc_481 ROM:047B lda KSS ; Код символа в позиции курсора ROM:047E jmp loc_49E ROM:0481 ; --------------------------------------------------------------------------- ROM:0481 ROM:0481 loc_481: ; CODE XREF: INPUTSTR-58j ROM:0481 cpi 1Dh ROM:0483 ROM:0483 loc_483: ; CODE XREF: ROM:04B4j ROM:0483 jnz loc_491 ROM:0486 rst 3 ; RST3 = печатает символ из A на экран. ROM:0487 dcr b ROM:0488 dcx h ROM:0489 jnz loc_491 ROM:048C ROM:048C loc_48C: ; CODE XREF: INPUTSTR+6j ROM:048C lxi h, IOBUF ; Буфер ввода-вывода (диск, кассеты) ROM:048F mvi b, 1 ROM:0491 ROM:0491 loc_491: ; CODE XREF: INPUTSTR:loc_483j ROM:0491 ; INPUTSTR-47j ... ROM:0491 call INPUTSTR2 ; Ждёт символ из буфера клавиатуры. При коде &h03 переходит к обработке оператора STOP. ROM:0494 cpi 0Dh ROM:0496 jz loc_4D9 ROM:0499 cpi 20h ; ' ' ROM:049B jc loc_476 ROM:049E ROM:049E loc_49E: ; CODE XREF: INPUTSTR-52j ROM:049E mov c, a ROM:049F mov a, b ROM:04A0 ana a ROM:04A1 jz loc_491 ROM:04A4 mov m, c ROM:04A5 inr a ROM:04A6 sta FPTMP ; Временная переменная для работы с числами с плавающей точкой. ROM:04A9 mov a, c ROM:04AA rst 3 ; RST3 = печатает символ из A на экран. ROM:04AB inx h ROM:04AC inr b ROM:04AD jmp loc_491 ROM:04AD ; END OF FUNCTION CHUNK FOR INPUTSTR ROM:04B0 ; --------------------------------------------------------------------------- ROM:04B0 mov m, c ROM:04B1 inx h ROM:04B2 inr b ROM:04B3 rst 3 ; RST3 = печатает символ из A на экран. ROM:04B4 jmp loc_483+2 ROM:04B7 ; --------------------------------------------------------------------------- ROM:04B7 ; START OF FUNCTION CHUNK FOR OUTCHAR ROM:04B7 ROM:04B7 OUTCHAR2: ; CODE XREF: OUTCHAR+5j ROM:04B7 jnz loc_1AAF ROM:04BA pop psw ROM:04BB push psw ROM:04BC push b ROM:04BD push d ROM:04BE push h ROM:04BF call SYMSCR ; A=символ (вывод символа на экран в текущую позицию курсора). ROM:04C2 ROM:04C2 loc_4C2: ; CODE XREF: OUTCHAR+1AA8j ROM:04C2 ; OUTCHAR+1AB4j ROM:04C2 pop h ROM:04C3 pop d ROM:04C4 pop b ROM:04C5 pop psw ROM:04C6 ret ROM:04C6 ; END OF FUNCTION CHUNK FOR OUTCHAR ROM:04C7 ROM:04C7 ; =============== S U B R O U T I N E ======================================= ROM:04C7 ROM:04C7 ; Ждёт символ из буфера клавиатуры. При коде &h03 переходит к обработке оператора STOP. ROM:04C7 ROM:04C7 INPUTSTR2: ; CODE XREF: INPUTSTR:loc_491p ROM:04C7 call BUFFERTOA ; Ввод символа из буфера клавиатуры в A. ROM:04C7 ; Если буфер пуст - ожидание нажатия. ROM:04CA cpi 3 ROM:04CC rnz ROM:04CD jmp STOP ; Обработка бейсик оператора STOP ROM:04CD ; End of function INPUTSTR2 ROM:04CD ROM:04D0 ROM:04D0 ; =============== S U B R O U T I N E ======================================= ROM:04D0 ROM:04D0 ; Выводит вопросительный знак и ждёт ввода строки ROM:04D0 ROM:04D0 INPUTSTR: ; CODE XREF: ROM:086Ap ROM:04D0 ; ROM:089Bp ROM:04D0 ROM:04D0 ; FUNCTION CHUNK AT ROM:0476 SIZE 0000003A BYTES ROM:04D0 ; FUNCTION CHUNK AT ROM:04D9 SIZE 00000006 BYTES ROM:04D0 ROM:04D0 call INPUTPRN ; Печатает пригласительный знак вопроса в команде INPUT и сообщении об ошибке ROM:04D3 call CURSON ; Включает изображение курсора. ROM:04D6 jmp loc_48C ROM:04D6 ; End of function INPUTSTR ROM:04D6 ROM:04D9 ; --------------------------------------------------------------------------- ROM:04D9 ; START OF FUNCTION CHUNK FOR INPUTSTR ROM:04D9 ROM:04D9 loc_4D9: ; CODE XREF: INPUTSTR-3Aj ROM:04D9 call CURSOFF ; Выключает изображение курсора. ROM:04DC jmp TERMINATEINPUT ROM:04DC ; END OF FUNCTION CHUNK FOR INPUTSTR ROM:04DF ROM:04DF ; =============== S U B R O U T I N E ======================================= ROM:04DF ROM:04DF ; Вводит строку без отображения курсора ROM:04DF ROM:04DF INPUTLN: ; CODE XREF: CHECKENOUGHMEM:loc_30Dp ROM:04DF ROM:04DF ; FUNCTION CHUNK AT ROM:03DD SIZE 00000008 BYTES ROM:04DF ; FUNCTION CHUNK AT ROM:07D7 SIZE 00000005 BYTES ROM:04DF ; FUNCTION CHUNK AT ROM:1DF9 SIZE 00000025 BYTES ROM:04DF ; FUNCTION CHUNK AT ROM:1E33 SIZE 00000049 BYTES ROM:04DF ROM:04DF call INPUTLN2 ; Вводит строку без отображения курсора. Основная часть функции. ROM:04E2 jz loc_1DF9 ROM:04E5 jmp loc_1E4B ROM:04E5 ; End of function INPUTLN ROM:04E5 ROM:04E8 ROM:04E8 ; =============== S U B R O U T I N E ======================================= ROM:04E8 ROM:04E8 ; Вводит строку без отображения курсора. Основная часть функции. ROM:04E8 ROM:04E8 INPUTLN2: ; CODE XREF: INPUTLNp ROM:04E8 ; INPUTLN+1955p ROM:04E8 lhld EITMP ; Временная переменная. Используется в INPUTLN, ERRTR2 ROM:04EB mov a, h ROM:04EC ora l ROM:04ED ret ROM:04ED ; End of function INPUTLN2 ROM:04ED ROM:04EE ; --------------------------------------------------------------------------- ROM:04EE ROM:04EE LIST: ; CODE XREF: ROM:18A2j ROM:04EE ; ROM:1B4Fj ROM:04EE call LINENUMBERFROMSTR ; Обработка бейсик-команды LIST ROM:04F1 rnz ROM:04F2 pop b ROM:04F3 call FINDPROGRAMLINE ; Получает ближайший адрес строки программы в BC ROM:04F6 push b ROM:04F7 ; START OF FUNCTION CHUNK FOR PRNTR1 ROM:04F7 ROM:04F7 loc_4F7: ; CODE XREF: PRNTR1+7j ROM:04F7 ; PRNTR1+A5Cj ROM:04F7 pop h ROM:04F8 rst 6 ; Псевдокоманда PUSH (HL). ROM:04F8 ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP. ROM:04F8 ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD. ROM:04F9 ROM:04F9 loc_4F9: ; DATA XREF: RAM:NEXTWORDo ROM:04F9 pop b ROM:04FA mov a, b ROM:04FB ora c ROM:04FC jz MAIN2 ; Переход с оператора LIST ROM:04FF call TESTBREAKKEY2 ; Смотрим, надо ли остановиться? ROM:0502 push b ROM:0503 call CRLF ; Печатает перевод строки и возврат каретки ROM:0506 rst 6 ; Псевдокоманда PUSH (HL). ROM:0506 ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP. ROM:0506 ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD. ROM:0507 xthl ROM:0508 call PRINTINT ; Переводит целое число HL в число с плавающей точкой FACCUM. ROM:0508 ; В частности, печатает номер строки Бейсик-программы, выполняющейся в данный момент времени. ROM:050B mvi a, 20h ; ' ' ROM:050D ROM:050D loc_50D: ; CODE XREF: PRNTR1+A51j ROM:050D pop h ROM:050E jmp loc_17EB ROM:0511 ; --------------------------------------------------------------------------- ROM:0511 ROM:0511 loc_511: ; CODE XREF: PRNTR1+Cj ROM:0511 ; PRNTR1+17j ROM:0511 call PRNTR1 ; Подпрограмма обработчика печати ROM:0514 jp loc_17EB ROM:0517 call MACRO7 ROM:051A mov c, a ROM:051B push h ROM:051C lxi d, __CLS ; Загрузка в DE таблицы токенов __CLS ROM:051F ROM:051F loc_51F: ; CODE XREF: PRNTR1-12B9j ROM:051F push d ROM:0520 ROM:0520 loc_520: ; CODE XREF: PRNTR1-12BEj ROM:0520 ldax d ROM:0521 inx d ROM:0522 ora a ROM:0523 jp loc_520 ROM:0526 dcr c ROM:0527 pop h ROM:0528 jnz loc_51F ROM:052B ROM:052B loc_52B: ; CODE XREF: PRNTR1-12AFj ROM:052B mov a, m ROM:052C ora a ROM:052D jmp loc_17D9 ROM:0530 ; --------------------------------------------------------------------------- ROM:0530 ROM:0530 loc_530: ; CODE XREF: PRNTR1:loc_17D9j ROM:0530 rst 3 ; RST3 = печатает символ из A на экран. ROM:0531 inx h ROM:0532 jmp loc_52B ROM:0532 ; END OF FUNCTION CHUNK FOR PRNTR1 ROM:0535 ; --------------------------------------------------------------------------- ROM:0535 ROM:0535 FOR: ; Бейсик оператор FOR ROM:0535 mvi a, 64h ; 'd' ; Хотя FOR указывает на начало цикла программы, этот обработчик вызывается один раз. ROM:0535 ; Последующие итерации цикла возвращаются к последующим выражениям или строкам программы, а не к самому FOR. ROM:0537 sta FORTMP ; Временный параметр оператора FOR ROM:053A call LET ; Обработка бейсик-оператора LET ROM:053D xthl ROM:053E call GETFLOWPTR ; Сервисная функция. ROM:053E ; Устанавливает HL в точку соответствующей структуры потока на стеке (Sets HL to point to the appropriate flow struct on the stack.). ROM:053E ; Если функция вызвана ключевым словом NEXT, то DE указывает на переменную, следующую за ключевым словом NEXT. ROM:053E ; Таким образом, устанавливает DE как главный указатель программы (i.e. Get program ptr into DE). ROM:053E ; ROM:0541 pop d ROM:0542 jnz loc_547 ROM:0545 dad b ROM:0546 sphl ROM:0547 ROM:0547 loc_547: ; CODE XREF: ROM:0542j ROM:0547 xchg ROM:0548 call CHECKENOUGHVARSPACE ; Внимание! После вызова CHECKENOUGHVARSPACE идет байт параметра, а не следующая инструкция! ROM:0548 ; Проверяет, достаточно ли будет памяти при выделении места для C*4 байт начиная с VAR_TOP перед тем как это выделение начнёт затирать стек. ROM:0548 ; (Или область переменных). ROM:0548 ; --------------------------------------------------------------------------- ROM:054B .db 8 ; Параметр CHECKENOUGHVARSPACE ROM:054C ; --------------------------------------------------------------------------- ROM:054C push h ROM:054D call DATA ; Обработка бейсик-команд DATA и REM. Обратите внимание на комментарий ниже. ROM:054D ; 06FB: REM: MVI C, 0 ROM:054D ; MVI B, 0 ROM:054D ; LOC_6FF: MOV A, C ROM:054D ; ..... ROM:054D ; ROM:054D ; FINDNEXTSTATEMENT: ROM:0550 ; --------------------------------------------------------------------------- ROM:0550 xthl ROM:0551 push h ROM:0552 lhld BASOPNUM ; Номер оператора Бейсик программы. ROM:0552 ; Или &hFFFF в командном режиме ROM:0555 xthl ROM:0556 call COMPUTE3 ; Вычисление выражений. Вызов из EVALTERM. ROM:0559 rst 1 ; RST1 = проверка синтаксиса. ROM:0559 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:0559 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:0559 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:0559 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:0559 ; --------------------------------------------------------------------------- ROM:055A .db 9Eh ; TO (токен 158 (&h9E)) ROM:055B ; --------------------------------------------------------------------------- ROM:055B call EVALEXPRESSION ; Вычисляет выражение, возвращая результат в FACCUM. Выражение должно быть комбинацией термов и операторов. ROM:055E push h ROM:055F call FCOPYTOBCDE ; Перемещение числа с плавающей точкой из FACCUM в BCDE ROM:0562 pop h ROM:0563 push b ROM:0564 push d ROM:0565 lxi b, 8100h ROM:0568 mov d, c ROM:0569 mov e, d ROM:056A mov a, m ROM:056B cpi 0A3h ; 'г' ; Ждём токен STEP ROM:056D mvi a, 1 ROM:056F jnz PUSHSTEPVALUE ; Толкает значение STEP на стек. ROM:0572 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:0572 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:0572 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:0573 call EVALEXPRESSION ; Вычисляет выражение, возвращая результат в FACCUM. Выражение должно быть комбинацией термов и операторов. ROM:0576 push h ROM:0577 call FCOPYTOBCDE ; Перемещение числа с плавающей точкой из FACCUM в BCDE ROM:057A pop h ROM:057B rst 5 ; RST5 = Проверяет состояние FACCUM. ROM:057B ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно ROM:057B ; (0xFF если отрицательно, 0x01 если положительно). ROM:057C ROM:057C PUSHSTEPVALUE: ; CODE XREF: ROM:056Fj ROM:057C push b ; Толкает значение STEP на стек. ROM:057D push d ROM:057E push psw ROM:057F inx sp ROM:0580 push h ROM:0581 lhld CURBASLN ; Текущий адрес строки Бейсик программы ROM:0584 xthl ROM:0585 ; START OF FUNCTION CHUNK FOR NEXT2 ROM:0585 ROM:0585 NEXTRET: ; CODE XREF: NEXT2+35j ROM:0585 mvi b, 81h ; 'Б' ROM:0587 push b ROM:0588 inx sp ROM:0589 ROM:0589 EXECNEXT: ; CODE XREF: NEXT2+3Fj ROM:0589 ; DATA XREF: CHECKENOUGHMEM+2F3o ... ROM:0589 call PRNFLCL ; Сюда вернётся бейсик интерпретатор после отработки команды RUN, RETURN, после обработки ошибок. ROM:0589 ; Вычисляет одно выражение, передвигается на следующее выражение или на новую стоку, если в текущей строке нет больше выражений. ROM:0589 ; ROM:058C nop ROM:058D call TESTBREAKKEY2 ; Смотрим, надо ли остановиться? ROM:0590 shld CURBASLN ; Текущий адрес строки Бейсик программы ROM:0593 mov a, m ROM:0594 cpi 3Ah ; ':' ROM:0596 jz EXEC_ ROM:0599 ora a ROM:059A jnz SYNTAXERROR ; Самая распространённая ошибка №2 ROM:059D inx h ROM:059E mov a, m ROM:059F inx h ROM:05A0 ora m ROM:05A1 inx h ROM:05A2 jz MAIN_ ; Ссылка из EXECNEXT ROM:05A5 mov e, m ROM:05A6 inx h ROM:05A7 mov d, m ROM:05A8 xchg ROM:05A9 call TRACEPRN ; Обработка трассировки. Печатает квадратные скобки и номер выполняющейся в данный момент строки Бейсик-программы. ROM:05AC xchg ROM:05AC ; END OF FUNCTION CHUNK FOR NEXT2 ROM:05AD ; START OF FUNCTION CHUNK FOR CHECKENOUGHMEM ROM:05AD ROM:05AD EXEC_: ; CODE XREF: NEXT2-38Aj ROM:05AD ; CHECKENOUGHMEM+18A2j ROM:05AD rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:05AD ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:05AD ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:05AE lxi d, EXECNEXT ; Сюда вернётся бейсик интерпретатор после отработки команды RUN, RETURN, после обработки ошибок. ROM:05AE ; Вычисляет одно выражение, передвигается на следующее выражение или на новую стоку, если в текущей строке нет больше выражений. ROM:05AE ; ROM:05B1 push d ROM:05B2 ROM:05B2 loc_5B2: ; CODE XREF: ROM:078Cj ROM:05B2 rz ROM:05B3 ROM:05B3 loc_5B3: ; CODE XREF: ROM:076Cj ROM:05B3 sui 80h ; 'А' ROM:05B5 jc LET ; Обработка бейсик-оператора LET ROM:05B8 cpi 1Dh ROM:05BA jnc SYNTAXERROR2 ROM:05BD ROM:05BD loc_5BD: ; CODE XREF: CHECKENOUGHMEM+D72j ROM:05BD rlc ROM:05BE mov c, a ROM:05BF mvi b, 0 ROM:05C1 xchg ROM:05C2 lxi h, _CLS ; Адрес таблицы операторов и функций _CLS ROM:05C5 dad b ROM:05C6 mov c, m ROM:05C7 inx h ROM:05C8 mov b, m ROM:05C9 push b ROM:05CA xchg ROM:05CA ; END OF FUNCTION CHUNK FOR CHECKENOUGHMEM ROM:05CB ROM:05CB ; =============== S U B R O U T I N E ======================================= ROM:05CB ROM:05CB ; Сравнивает следующий символ (HL) с двоеточием ROM:05CB ROM:05CB DDCMP: ; CODE XREF: DDCMP+7j ROM:05CB ; MAINTR2+18p ROM:05CB inx h ROM:05CC mov a, m ROM:05CD cpi 3Ah ; ':' ROM:05CF rnc ROM:05D0 ROM:05D0 NEXTCHAR2: ; CODE XREF: NEXTCHAR+5j ROM:05D0 cpi 20h ; ' ' ; возвращает в A следующий символ ввода из буфера в HL, ROM:05D0 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:05D0 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:05D2 jz DDCMP ; Сравнивает следующий символ (HL) с двоеточием ROM:05D5 cpi 30h ; '0' ROM:05D7 cmc ROM:05D8 inr a ROM:05D9 dcr a ROM:05DA ret ROM:05DA ; End of function DDCMP ROM:05DA ROM:05DB ROM:05DB ; =============== S U B R O U T I N E ======================================= ROM:05DB ROM:05DB ; Сбрасывает указатель оператора READ. При инициализации и при вызове RESTORE ROM:05DB ; Resets the data pointer to just before the start of the program ROM:05DB ROM:05DB READPT: ; CODE XREF: RESETALL+Dp ROM:05DB ; ROM:RESTOREj ROM:05DB xchg ROM:05DC lhld BGBASPRG ; Адрес начала Бейсик программы ROM:05DF dcx h ROM:05E0 ROM:05E0 loc_5E0: ; CODE XREF: ROM:08DDj ROM:05E0 ; ROM:1A50j ROM:05E0 shld READPTR ; Указатель для READ ROM:05E3 xchg ROM:05E4 ret ROM:05E4 ; End of function READPT ROM:05E4 ROM:05E4 ; --------------------------------------------------------------------------- ROM:05E5 .db 0, 0, 0, 0, 0 ROM:05EA ROM:05EA ; =============== S U B R O U T I N E ======================================= ROM:05EA ROM:05EA ; Смотрим, надо ли остановиться? ROM:05EA ROM:05EA TESTBREAKKEY2: ; CODE XREF: TESTBREAKKEYj ROM:05EA ; PRNTR1-12E2p ... ROM:05EA call TESTBREAKKEYTR ; Обработка нажатия Break ROM:05ED ani 4 ROM:05EF rz ROM:05F0 ROM:05F0 STOP: ; CODE XREF: INPUTSTR2+6j ROM:05F0 ori 0C3h ; Обработка бейсик оператора STOP ROM:05F2 ROM:05F2 loc_5F2: ; CODE XREF: ROM:1A78j ROM:05F2 shld CURBASLN ; Текущий адрес строки Бейсик программы ROM:05F5 ROM:05F5 loc_5F5: ; CODE XREF: ROM:0872j ROM:05F5 pop b ROM:05F6 ROM:05F6 MAIN_: ; CODE XREF: NEXT2-37Ej ROM:05F6 push psw ; Ссылка из EXECNEXT ROM:05F7 lhld BASOPNUM ; Номер оператора Бейсик программы. ROM:05F7 ; Или &hFFFF в командном режиме ROM:05FA mov a, l ROM:05FB ana h ROM:05FC inr a ROM:05FD jz loc_609 ROM:0600 shld CONTTMP ; Временная переменная оператора CONT ROM:0603 lhld CURBASLN ; Текущий адрес строки Бейсик программы ROM:0606 shld BRKCONT ; Временная переменная процедур RESETSTACK, TESTBREAKKEY, CONT ROM:0609 ROM:0609 loc_609: ; CODE XREF: TESTBREAKKEY2+13j ROM:0609 xra a ROM:060A call STOPTR ; Обработка останова ROM:060D pop psw ROM:060E lxi h, aBreak ; "\r\nBreak" ROM:0611 jnz loc_2EE ROM:0614 jmp MAINLOOP3 ; Третья точка входа в главный цикл. Переход из INIT2, STOP, CSAVE, OUTCHAR2, INPUTLN ROM:0614 ; End of function TESTBREAKKEY2 ROM:0614 ROM:0617 ; --------------------------------------------------------------------------- ROM:0617 ROM:0617 CONT: ; Обработка бейсик-команды CONT ROM:0617 rnz ROM:0618 mvi e, 20h ; ' ' ROM:061A lhld BRKCONT ; Временная переменная процедур RESETSTACK, TESTBREAKKEY, CONT ROM:061D mov a, h ROM:061E ora l ROM:061F jz MAINLOOP1 ; Первая точка входа в главный цикл ROM:0622 xchg ROM:0623 lhld CONTTMP ; Временная переменная оператора CONT ROM:0626 shld BASOPNUM ; Номер оператора Бейсик программы. ROM:0626 ; Или &hFFFF в командном режиме ROM:0629 xchg ROM:062A ret ROM:062B ; --------------------------------------------------------------------------- ROM:062B call GETINTPARAM ; Получаем в A целочисленный параметр для команды Бейсика ROM:062E rnz ROM:062F inr a ROM:0630 cpi 48h ; 'H' ROM:0632 jnc FUNCTIONCALLERROR ; Ошибка вызова функции ROM:0635 sta PRMTMP ; Архаичная временная переменная. Нигде не используется. ROM:0638 ret ROM:0639 ROM:0639 ; =============== S U B R O U T I N E ======================================= ROM:0639 ROM:0639 ; Если символ, на который указывает HL алфавитный, то флаг переноса сбрасывается. А если нет - то установится. ROM:0639 ; Т. е. является ли (M) буквой? ROM:0639 ROM:0639 CHARISALPHA: ; CODE XREF: EVALTERM+8p ROM:0639 ; GETVAR2p ... ROM:0639 mov a, m ROM:063A cpi 41h ; 'A' ROM:063C rc ROM:063D cpi 5Bh ; '[' ROM:063F cmc ROM:0640 ret ROM:0640 ; End of function CHARISALPHA ROM:0640 ROM:0641 ROM:0641 ; =============== S U B R O U T I N E ======================================= ROM:0641 ROM:0641 ; Получает индекс массива встречающегося в выражении или операторе DIM. ROM:0641 ; Индекс возвращается в виде целого положительного числа в CDE. ROM:0641 ROM:0641 GETSUBSCRIPT: ; CODE XREF: GETVAR2+88p ROM:0641 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:0641 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:0641 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:0642 ROM:0642 loc_642: ; CODE XREF: ROM:0685p ROM:0642 ; ROM:1064p ROM:0642 call EVALEXPRESSION ; Вычисляет выражение, возвращая результат в FACCUM. Выражение должно быть комбинацией термов и операторов. ROM:0642 ; End of function GETSUBSCRIPT ROM:0642 ROM:0645 ROM:0645 ; =============== S U B R O U T I N E ======================================= ROM:0645 ROM:0645 ; Проверка результата функции. ROM:0645 ROM:0645 FUNCTIONAK: ; CODE XREF: GETINTPARAM:loc_FBCp ROM:0645 ; ROM:105Dp ROM:0645 rst 5 ; RST5 = Проверяет состояние FACCUM. ROM:0645 ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно ROM:0645 ; (0xFF если отрицательно, 0x01 если положительно). ROM:0646 jm FUNCTIONCALLERROR ; Ошибка вызова функции ROM:0646 ; End of function FUNCTIONAK ROM:0646 ROM:0649 ROM:0649 ; =============== S U B R O U T I N E ======================================= ROM:0649 ROM:0649 ; Получение целого числа из числа с плавающей точкой ROM:0649 ROM:0649 INTFROMFLOAT: ; CODE XREF: ROM:0A7Cp ROM:0649 ; ROM:0A88p ... ROM:0649 lda FACCUM+3 ; Аккумулятор для вычислений с плавающей точкой: ROM:0649 ; 00000000 1 11111111111111111111111 ROM:0649 ; -------- - ----------------------- ROM:0649 ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:064C cpi 90h ; 'Р' ROM:064E call FASINTEGERTR ; Обработчик перевода числа с плавающей точкой в целое ROM:0651 lxi b, 9080h ROM:0654 lxi d, 0 ROM:0657 call FCOMPARE ; Сравнение чисел с плавающей точкой. ROM:0657 ; Сравнивает FACCUM и BCDE. Результат возвращается в A. ROM:0657 ; FACCUM > BCDE, A = 0x01. ROM:0657 ; FACCUM < BCDE, A = 0xFF. ROM:0657 ; FACCUM = BCDE, A = 0. ROM:065A mov d, c ROM:065B rz ROM:065C ROM:065C FUNCTIONCALLERROR: ; CODE XREF: ROM:0632j ROM:065C ; FUNCTIONAK+1j ... ROM:065C mvi e, 8 ; Ошибка вызова функции ROM:065E jmp MAINLOOP1 ; Первая точка входа в главный цикл ROM:065E ; End of function INTFROMFLOAT ROM:065E ROM:0661 ROM:0661 ; =============== S U B R O U T I N E ======================================= ROM:0661 ROM:0661 ; Возвращает в DE номер бейсик-строки из параметра GOTO, LIST, GOSUB, RESTORE, ON... ROM:0661 ; А также номер строки в самой бейсик-программе. ROM:0661 ; Чуть подробнее: Получает номер строки из указателя на строку. ROM:0661 ; Указатель строки передается в HL, и целый результат возвращается в DE. ROM:0661 ; Лидирующие пробелы пропускаются, и возврат происходит при найденном первом символе не являющемся цифрой. ROM:0661 ; Максимально допустимое число строк 65529. Синтаксическая ошибка появится, если значение первых четырех цифр более 6552. ROM:0661 ; Одной из интересных особенностей этой функции является то, что он устанавливает Z, если найден правильный номер (или строка была пустой), ROM:0661 ; или NZ, если строка не начинается с номера. ROM:0661 ; ROM:0661 ROM:0661 LINENUMBERFROMSTR: ; CODE XREF: CHECKENOUGHMEM+5Cp ROM:0661 ; ROM:LISTp ... ROM:0661 dcx h ROM:0662 ROM:0662 loc_662: ; CODE XREF: ROM:076Fp ROM:0662 lxi d, 0 ROM:0665 ROM:0665 NEXTLINENUMCHAR: ; CODE XREF: LINENUMBERFROMSTR+1Ej ROM:0665 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:0665 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:0665 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:0666 rnc ROM:0667 push h ROM:0668 push psw ROM:0669 lxi h, 1998h ROM:066C rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:066D jc SYNTAXERROR ; Самая распространённая ошибка №2 ROM:0670 mov h, d ROM:0671 mov l, e ROM:0672 dad d ROM:0673 dad h ROM:0674 dad d ROM:0675 dad h ROM:0676 pop psw ROM:0677 sui 30h ; '0' ROM:0679 mov e, a ROM:067A mvi d, 0 ROM:067C dad d ROM:067D xchg ROM:067E pop h ROM:067F jmp NEXTLINENUMCHAR ROM:067F ; End of function LINENUMBERFROMSTR ROM:067F ROM:0682 ; --------------------------------------------------------------------------- ROM:0682 ROM:0682 CLEAR: ; Обработка бейсик-оператора CLEAR ROM:0682 jz RUNWITH ROM:0685 call loc_642 ROM:0688 dcx h ROM:0689 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:0689 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:0689 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:068A rnz ROM:068B push h ROM:068C lhld ENDSTRAR ; Конец строковой области ROM:068F mov a, l ROM:0690 sub e ROM:0691 mov e, a ROM:0692 mov a, h ROM:0693 sbb d ROM:0694 mov d, a ROM:0695 jc SYNTAXERROR ; Самая распространённая ошибка №2 ROM:0698 lhld ENBASPRG ; Адрес конца Бейсик программы. ROM:0698 ; Указывает на первую ячейку участка памяти, доступного программам. ROM:0698 ; Всегда следует за последним байтом программы. ROM:069B lxi b, 28h ; '(' ROM:069E dad b ROM:069F rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:06A0 jnc OUTOFMEMORY ; Ошибка Out of memory ROM:06A3 xchg ROM:06A4 shld STKADDR ; Адрес стека ROM:06A7 pop h ROM:06A8 jmp RUNWITH ; RESETALL дополнительная точка входа. ROM:06AB ; --------------------------------------------------------------------------- ROM:06AB ROM:06AB RUN: ; Обработка бейсик команды RUN. Запуск бейсик программы ROM:06AB jz RESETALL ROM:06AE call RUNWITH ; Если есть параметр (номер строки, с которой запускается программа) ROM:06B1 lxi b, EXECNEXT ; Сюда вернётся бейсик интерпретатор после отработки команды RUN, RETURN, после обработки ошибок. ROM:06B1 ; Вычисляет одно выражение, передвигается на следующее выражение или на новую стоку, если в текущей строке нет больше выражений. ROM:06B1 ; ROM:06B4 jmp loc_6C6 ROM:06B7 ; --------------------------------------------------------------------------- ROM:06B7 ROM:06B7 GOSUB: ; Gosub сохраняет структуру потока в стеке, а затем переходит к Goto. ROM:06B7 call CHECKENOUGHVARSPACE ; Структура потока это __GOSUB с предшествующем номером строки с GoSub оператором, ROM:06B7 ; в свою очередь, ему предшествует указатель на строку следующую после строки с GoSub оператором. ROM:06B7 ; --------------------------------------------------------------------------- ROM:06BA .db 3 ROM:06BB ; --------------------------------------------------------------------------- ROM:06BB pop b ROM:06BC push h ROM:06BD push h ROM:06BE lhld BASOPNUM ; Номер оператора Бейсик программы. ROM:06BE ; Или &hFFFF в командном режиме ROM:06C1 xthl ROM:06C2 mvi d, 8Ch ; 'М' ; Токен GOSUB ROM:06C4 push d ROM:06C5 inx sp ROM:06C6 ROM:06C6 loc_6C6: ; CODE XREF: ROM:06B4j ROM:06C6 push b ROM:06C7 ROM:06C7 GOTO: ; CODE XREF: ROM:0789j ROM:06C7 call LINENUMBERFROMSTR ; Обработка бейсик-команды GOTO ROM:06CA call DATA+2 ; Обработка бейсик-команд DATA и REM. Обратите внимание на комментарий ниже. ROM:06CA ; 06FB: REM: MVI C, 0 ROM:06CA ; MVI B, 0 ROM:06CA ; LOC_6FF: MOV A, C ROM:06CA ; ..... ROM:06CA ; ROM:06CA ; FINDNEXTSTATEMENT: ROM:06CD ROM:06CD ; =============== S U B R O U T I N E ======================================= ROM:06CD ROM:06CD ; Подготавливает переход на строку бейсик-программы ROM:06CD ROM:06CD GOTOPRE: ; CODE XREF: ROM:1A4Cp ROM:06CD ; ERRTR+25j ROM:06CD push h ROM:06CE lhld BASOPNUM ; Номер оператора Бейсик программы. ROM:06CE ; Или &hFFFF в командном режиме ROM:06D1 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:06D2 pop h ROM:06D3 inx h ROM:06D4 cc FINDPROGRAMLINE2 ; Получает ближайший адрес строки программы в BC. ROM:06D4 ; Дополнительная точка входа. ROM:06D7 cnc FINDPROGRAMLINE ; Получает ближайший адрес строки программы в BC ROM:06DA mov h, b ROM:06DB mov l, c ROM:06DC dcx h ROM:06DD rc ROM:06DE mvi e, 0Eh ROM:06E0 jmp MAINLOOP1 ; Первая точка входа в главный цикл ROM:06E0 ; End of function GOTOPRE ROM:06E0 ROM:06E3 ; --------------------------------------------------------------------------- ROM:06E3 ROM:06E3 RETURN: ; Обработка бейсик-команды RETURN ROM:06E3 rnz ROM:06E4 mvi d, 0FFh ROM:06E6 call GETFLOWPTR ; Сервисная функция. ROM:06E6 ; Устанавливает HL в точку соответствующей структуры потока на стеке (Sets HL to point to the appropriate flow struct on the stack.). ROM:06E6 ; Если функция вызвана ключевым словом NEXT, то DE указывает на переменную, следующую за ключевым словом NEXT. ROM:06E6 ; Таким образом, устанавливает DE как главный указатель программы (i.e. Get program ptr into DE). ROM:06E6 ; ROM:06E9 sphl ROM:06EA cpi 8Ch ; 'М' ; Токен GOSUB ROM:06EC mvi e, 4 ROM:06EE jnz MAINLOOP1 ; Первая точка входа в главный цикл ROM:06F1 pop h ROM:06F2 shld BASOPNUM ; Номер оператора Бейсик программы. ROM:06F2 ; Или &hFFFF в командном режиме ROM:06F5 lxi h, EXECNEXT ; Сюда вернётся бейсик интерпретатор после отработки команды RUN, RETURN, после обработки ошибок. ROM:06F5 ; Вычисляет одно выражение, передвигается на следующее выражение или на новую стоку, если в текущей строке нет больше выражений. ROM:06F5 ; ROM:06F8 xthl ROM:06F9 ROM:06F9 ; =============== S U B R O U T I N E ======================================= ROM:06F9 ROM:06F9 ; Обработка бейсик-команд DATA и REM. Обратите внимание на комментарий ниже. ROM:06F9 ; 06FB: REM: MVI C, 0 ROM:06F9 ; MVI B, 0 ROM:06F9 ; LOC_6FF: MOV A, C ROM:06F9 ; ..... ROM:06F9 ; ROM:06F9 ; FINDNEXTSTATEMENT: ROM:06F9 ; Attributes: noreturn ROM:06F9 ROM:06F9 DATA: ; CODE XREF: ROM:054Dp ROM:06F9 ; ROM:loc_8FBp ... ROM:06F9 lxi b, loc_E3A ROM:06FC nop ROM:06FD mvi b, 0 ROM:06FF ROM:06FF loc_6FF: ; CODE XREF: DATA+11j ROM:06FF mov a, c ROM:0700 mov c, b ROM:0701 mov b, a ROM:0702 ROM:0702 loc_702: ; CODE XREF: DATA+14j ROM:0702 mov a, m ROM:0703 ora a ROM:0704 rz ROM:0705 cmp b ROM:0706 rz ROM:0707 inx h ROM:0708 cpi 22h ; '"' ROM:070A jz loc_6FF ROM:070D jmp loc_702 ROM:070D ; End of function DATA ROM:070D ROM:0710 ROM:0710 ; =============== S U B R O U T I N E ======================================= ROM:0710 ROM:0710 ; Обработка бейсик-оператора LET ROM:0710 ROM:0710 LET: ; CODE XREF: ROM:053Ap ROM:0710 ; CHECKENOUGHMEM+2FAj ROM:0710 call GETVAR ; Поиск и инициализация переменной. ROM:0710 ; HL указывает на имя переменной, которая встретилась во время интерпретации. ROM:0710 ; Функция возвращает в DE указатель на значение переменной. ROM:0710 ; Если переменная не существует, то функция выделяет ей память и инициализирует её. ROM:0713 rst 1 ; RST1 = проверка синтаксиса. ROM:0713 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:0713 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:0713 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:0713 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:0713 ; --------------------------------------------------------------------------- ROM:0714 .db 0ACh ; = (токен 172 (&hAC)) ROM:0715 ; --------------------------------------------------------------------------- ROM:0715 ROM:0715 ASSIGNVAR: ; Присваивает результат Бейсик-выражения на которое указывает HL переменной, на которую указывает DE. ROM:0715 lda LETTMP ROM:0718 push psw ROM:0719 push d ROM:071A call COMPUTE ; Вычисление выражений. Вызов из EVALEXPRESSION, IF, PRINT, EVALTERM. ROM:071D xthl ROM:071E shld CURBASLN ; Текущий адрес строки Бейсик программы ROM:0721 pop d ROM:0722 pop psw ROM:0723 push d ROM:0724 rar ROM:0725 call COMPUTE4 ; Вычисление выражений. Вызов из ASSIGNVAR. ROM:0728 jz loc_755 ROM:072B ROM:072B loc_72B: ; CODE XREF: ROM:08BBj ROM:072B push h ROM:072C lhld FACCUM ; Аккумулятор для вычислений с плавающей точкой: ROM:072C ; 00000000 1 11111111111111111111111 ROM:072C ; -------- - ----------------------- ROM:072C ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:072F push h ROM:0730 inx h ROM:0731 inx h ROM:0732 rst 6 ; Псевдокоманда PUSH (HL). ROM:0732 ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP. ROM:0732 ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD. ROM:0733 pop d ROM:0734 lhld STKADDR ; Адрес стека ROM:0737 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:0738 pop d ROM:0739 jnc loc_745 ROM:073C lhld ENBASPRG ; Адрес конца Бейсик программы. ROM:073C ; Указывает на первую ячейку участка памяти, доступного программам. ROM:073C ; Всегда следует за последним байтом программы. ROM:073F rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:0740 mov l, e ROM:0741 mov h, d ROM:0742 cnc MAINTR4 ; Обработка главного цикла. Вызов из ASSIGNVAR. ROM:0745 ROM:0745 loc_745: ; CODE XREF: LET+29j ROM:0745 ldax d ROM:0746 push psw ROM:0747 xra a ROM:0748 stax d ROM:0749 call FAPREP3 ; Подготовка FACCUM, ARIFMAR. ROM:0749 ; Дополнительная точка входа. ROM:074C pop psw ROM:074D mov m, a ROM:074E xchg ROM:074F pop h ROM:0750 call FCOPYTOMEM2 ; Копирование числа с плавающей точкой в память. Дополнительная точка входа. ROM:0753 pop h ROM:0754 ret ROM:0755 ; --------------------------------------------------------------------------- ROM:0755 ROM:0755 loc_755: ; CODE XREF: LET+18j ROM:0755 push h ROM:0756 call FCOPYTOMEM ; Копирование числа с плавающей точкой в память, на которую указывает HL ROM:0759 pop d ROM:075A pop h ROM:075B ret ROM:075B ; End of function LET ROM:075B ROM:075C ; --------------------------------------------------------------------------- ROM:075C ROM:075C loc_75C: ; CODE XREF: ROM:1D56j ROM:075C call GETINTPARAM ; Получаем в A целочисленный параметр для команды Бейсика ROM:075F mov a, m ROM:0760 mov b, a ROM:0761 cpi 8Ch ; 'М' ROM:0763 jz loc_769 ROM:0766 rst 1 ; RST1 = проверка синтаксиса. ROM:0766 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:0766 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:0766 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:0766 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:0766 ; --------------------------------------------------------------------------- ROM:0767 .db 88h ; Бейсик оператор GOTO (токен 136 (&h88)) ROM:0768 ; --------------------------------------------------------------------------- ROM:0768 dcx h ROM:0769 ROM:0769 loc_769: ; CODE XREF: ROM:0763j ROM:0769 mov c, e ROM:076A ROM:076A loc_76A: ; CODE XREF: ROM:0775j ROM:076A dcr c ROM:076B mov a, b ROM:076C jz loc_5B3 ROM:076F call loc_662 ROM:0772 cpi 2Ch ; ',' ROM:0774 rnz ROM:0775 jmp loc_76A ROM:0778 ; --------------------------------------------------------------------------- ROM:0778 ROM:0778 IF: ; Бейсик-оператор IF ROM:0778 call COMPUTE ROM:077B mov a, m ROM:077C cpi 88h ; 'И' ; Токен GOTO ROM:077E jz loc_784 ROM:0781 rst 1 ; RST1 = проверка синтаксиса. ROM:0781 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:0781 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:0781 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:0781 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:0781 ; --------------------------------------------------------------------------- ROM:0782 .db 0A1h ; THEN (токен 161 (&hA1)) ROM:0783 ; --------------------------------------------------------------------------- ROM:0783 dcx h ROM:0784 ROM:0784 loc_784: ; CODE XREF: ROM:077Ej ROM:0784 rst 5 ; RST5 = Проверяет состояние FACCUM. ROM:0784 ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно ROM:0784 ; (0xFF если отрицательно, 0x01 если положительно). ROM:0785 jz DATA+2 ; Обработка бейсик-команд DATA и REM. Обратите внимание на комментарий ниже. ROM:0785 ; 06FB: REM: MVI C, 0 ROM:0785 ; MVI B, 0 ROM:0785 ; LOC_6FF: MOV A, C ROM:0785 ; ..... ROM:0785 ; ROM:0785 ; FINDNEXTSTATEMENT: ROM:0788 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:0788 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:0788 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:0789 jc GOTO ; Обработка бейсик-команды GOTO ROM:078C jmp loc_5B2 ROM:078F ; --------------------------------------------------------------------------- ROM:078F dcx h ROM:0790 ROM:0790 loc_790: ; CODE XREF: ROM:07D4j ROM:0790 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:0790 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:0790 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:0791 ROM:0791 PRINT: ; CODE XREF: ROM:1B47j ROM:0791 jz CRLF ; Бейсик-оператор PRINT ROM:0794 ROM:0794 loc_794: ; CODE XREF: ROM:082Aj ROM:0794 rz ROM:0795 cpi 9Dh ; 'Э' ; Токен TAB ROM:0797 jz loc_808 ROM:079A cpi 9Fh ; 'Я' ; Токен SPC ROM:079C jz loc_808 ROM:079F push h ROM:07A0 cpi 2Ch ; ',' ROM:07A2 jz loc_7F4 ROM:07A5 cpi 3Bh ; ';' ROM:07A7 jz loc_828 ROM:07AA pop b ROM:07AB call COMPUTE ; Вычисление выражений. Вызов из EVALEXPRESSION, IF, PRINT, EVALTERM. ROM:07AE dcx h ROM:07AF push h ROM:07B0 lda LETTMP ; Временная переменная оператора LET, EVALTERM, COMPUTE, GETVAR ROM:07B3 ora a ROM:07B4 jnz loc_7D0 ROM:07B7 call FOUT ; Печатает число с плавающей точкой на терминал. ROM:07BA call MAINTR2 ; Обработка главного цикла. Вызов из PRINT и STR. ROM:07BD lhld FACCUM ; Аккумулятор для вычислений с плавающей точкой: ROM:07BD ; 00000000 1 11111111111111111111111 ROM:07BD ; -------- - ----------------------- ROM:07BD ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:07C0 lda FPTMP ; Временная переменная для работы с числами с плавающей точкой. ROM:07C3 add m ROM:07C4 cpi 40h ; '@' ROM:07C6 cnc CRLF ; Печатает перевод строки и возврат каретки ROM:07C9 call loc_D96 ROM:07CC mvi a, 20h ; ' ' ROM:07CE rst 3 ; RST3 = печатает символ из A на экран. ROM:07CF ROM:07CF loc_7CF: ; DATA XREF: MACRO1+1o ROM:07CF xra a ROM:07D0 ROM:07D0 loc_7D0: ; CODE XREF: ROM:07B4j ROM:07D0 cnz loc_D96 ROM:07D3 pop h ROM:07D4 jmp loc_790 ROM:07D7 ; --------------------------------------------------------------------------- ROM:07D7 ; START OF FUNCTION CHUNK FOR INPUTLN ROM:07D7 ROM:07D7 TERMINATEINPUT: ; CODE XREF: INPUTSTR+Cj ROM:07D7 ; INPUTLN+1959j ROM:07D7 mvi m, 0 ROM:07D9 lxi h, PRNOP ; Временная переменная. Используется TOKENIZE, INPUTLN, START. ROM:07D9 ; END OF FUNCTION CHUNK FOR INPUTLN ROM:07DC ROM:07DC ; =============== S U B R O U T I N E ======================================= ROM:07DC ROM:07DC ; Проверка позиции курсора, печать новой строки и перевода каретки ROM:07DC ROM:07DC PKCHK: ; CODE XREF: CHECKENOUGHMEM:loc_2DFp ROM:07DC ; ROM:07F9p ROM:07DC lda PK ; Позиция курсора ROM:07DF ora a ROM:07E0 jnz CRLF ; Печатает перевод строки и возврат каретки ROM:07E3 nop ROM:07E4 ROM:07E4 loc_7E4: ; CODE XREF: CRLF+6j ROM:07E4 xra a ROM:07E4 ; End of function PKCHK ROM:07E4 ROM:07E5 ROM:07E5 ; =============== S U B R O U T I N E ======================================= ROM:07E5 ROM:07E5 ; Сохранение A в FPTMP ROM:07E5 ROM:07E5 PKCHK2: ; CODE XREF: MAINTR+10p ROM:07E5 sta FPTMP ; Временная переменная для работы с числами с плавающей точкой. ROM:07E8 ret ROM:07E8 ; End of function PKCHK2 ROM:07E8 ROM:07E9 ROM:07E9 ; =============== S U B R O U T I N E ======================================= ROM:07E9 ROM:07E9 ; Печатает перевод строки и возврат каретки ROM:07E9 ROM:07E9 CRLF: ; CODE XREF: CHECKENOUGHMEM:MAIN2p ROM:07E9 ; PRNTR1-12DEp ... ROM:07E9 mvi a, 0Dh ROM:07EB rst 3 ; RST3 = печатает символ из A на экран. ROM:07EC mvi a, 0Ah ROM:07EE rst 3 ; RST3 = печатает символ из A на экран. ROM:07EF jmp loc_7E4 ROM:07EF ; End of function CRLF ROM:07EF ROM:07F2 ; --------------------------------------------------------------------------- ROM:07F2 rpe ROM:07F3 rlc ROM:07F4 ROM:07F4 loc_7F4: ; CODE XREF: ROM:07A2j ROM:07F4 lda FPTMP ; Временная переменная для работы с числами с плавающей точкой. ROM:07F7 cpi 30h ; '0' ROM:07F9 cnc PKCHK ; Проверка позиции курсора, печать новой строки и перевода каретки ROM:07FC jnc loc_828 ROM:07FF ROM:07FF loc_7FF: ; CODE XREF: ROM:0801j ROM:07FF sui 0Eh ROM:0801 jnc loc_7FF ROM:0804 cma ROM:0805 jmp loc_81F ROM:0808 ; --------------------------------------------------------------------------- ROM:0808 ROM:0808 loc_808: ; CODE XREF: ROM:0797j ROM:0808 ; ROM:079Cj ROM:0808 push psw ROM:0809 call loc_FB8 ROM:080C rst 1 ; RST1 = проверка синтаксиса. ROM:080C ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:080C ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:080C ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:080C ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:080C ; --------------------------------------------------------------------------- ROM:080D .db ')' ROM:080E ; --------------------------------------------------------------------------- ROM:080E dcx h ROM:080F pop psw ROM:0810 cpi 9Fh ; 'Я' ROM:0812 push h ROM:0813 mov a, e ROM:0814 jz loc_820 ROM:0817 lda PK ; Позиция курсора ROM:081A cma ROM:081B add e ROM:081C jnc loc_828 ROM:081F ROM:081F loc_81F: ; CODE XREF: ROM:0805j ROM:081F inr a ROM:0820 ROM:0820 loc_820: ; CODE XREF: ROM:0814j ROM:0820 mov b, a ROM:0821 mvi a, 20h ; ' ' ROM:0823 ROM:0823 loc_823: ; CODE XREF: ROM:0825j ROM:0823 rst 3 ; RST3 = печатает символ из A на экран. ROM:0824 dcr b ROM:0825 jnz loc_823 ROM:0828 ROM:0828 loc_828: ; CODE XREF: ROM:07A7j ROM:0828 ; ROM:07FCj ... ROM:0828 pop h ROM:0829 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:0829 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:0829 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:082A jmp loc_794 ROM:082A ; --------------------------------------------------------------------------- ROM:082D byte_82D: .db 3Fh, 0F0h, 0EFh, 0F7h, 0F4h, 0EFh, 0F2h, 0E9h, 0F4h ROM:082D ; DATA XREF: ROM:0848o ROM:082D .db 0E5h, 20h, 0F7h, 0F7h, 0EFh, 0E4h, 0Dh, 0Ah, 0, 0C5h ROM:0840 ; --------------------------------------------------------------------------- ROM:0840 ROM:0840 loc_840: ; CODE XREF: ROM:08CEj ROM:0840 lda IFINPUT ; =0 если INPUT ROM:0843 ora a ROM:0844 jnz loc_2CA ROM:0847 pop b ROM:0848 lxi h, byte_82D ROM:084B call MAINTR ; Подпрограмма главного цикла ROM:084E lhld CURBASLN ; Текущий адрес строки Бейсик программы ROM:0851 ret ROM:0852 ; --------------------------------------------------------------------------- ROM:0852 ROM:0852 INPUT: ; Бейсик-оператор INPUT ROM:0852 cpi 22h ; '"' ROM:0854 nop ROM:0855 nop ROM:0856 nop ROM:0857 nop ROM:0858 nop ROM:0859 jnz loc_866 ROM:085C call loc_D50 ROM:085F rst 1 ; RST1 = проверка синтаксиса. ROM:085F ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:085F ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:085F ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:085F ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:085F ; --------------------------------------------------------------------------- ROM:0860 .db ';' ROM:0861 ; --------------------------------------------------------------------------- ROM:0861 push h ROM:0862 call loc_D96 ROM:0865 pop h ROM:0866 ROM:0866 loc_866: ; CODE XREF: ROM:0859j ROM:0866 push h ROM:0867 call MAINLOOP2 ; Вход в главный цикл из INPUT и DEF ROM:086A call INPUTSTR ; Выводит вопросительный знак и ждёт ввода строки ROM:086D inx h ROM:086E mov a, m ROM:086F ora a ROM:0870 dcx h ROM:0871 pop b ROM:0872 jz loc_5F5 ROM:0875 push b ROM:0876 jmp loc_87E ROM:0879 ; --------------------------------------------------------------------------- ROM:0879 ROM:0879 READ: ; Обработка команды READ ROM:0879 push h ROM:087A lhld READPTR ; Указатель для READ ROM:087A ; --------------------------------------------------------------------------- ROM:087D .db 0F6h ; Ў ; ORI AF ROM:087E ; --------------------------------------------------------------------------- ROM:087E ROM:087E loc_87E: ; CODE XREF: ROM:0876j ROM:087E xra a ROM:087F sta IFINPUT ; =0 если INPUT ROM:0882 xthl ROM:0883 ROM:0883 loc_883: ; CODE XREF: ROM:08D4j ROM:0883 lxi b, loc_2CCE+1 ; LOC_0884: RST 1 ROM:0883 ; DB 2CH; ',' ROM:0883 ; CALL GETVAR ROM:0886 call GETVAR ; Поиск и инициализация переменной. ROM:0886 ; HL указывает на имя переменной, которая встретилась во время интерпретации. ROM:0886 ; Функция возвращает в DE указатель на значение переменной. ROM:0886 ; Если переменная не существует, то функция выделяет ей память и инициализирует её. ROM:0889 xthl ROM:088A push d ROM:088B mov a, m ROM:088C cpi 2Ch ; ',' ROM:088E jz GOTDATAITEM ; Получаем кусочек информации из DATA ROM:0891 lda IFINPUT ; =0 если INPUT ROM:0894 ora a ROM:0895 jnz loc_8FB ROM:0898 mvi a, 3Fh ; '?' ROM:089A rst 3 ; RST3 = печатает символ из A на экран. ROM:089B call INPUTSTR ; Выводит вопросительный знак и ждёт ввода строки ROM:089E ROM:089E GOTDATAITEM: ; CODE XREF: ROM:088Ej ROM:089E ; ROM:091Aj ROM:089E lda LETTMP ; Получаем кусочек информации из DATA ROM:08A1 ora a ROM:08A2 jz loc_8BE ROM:08A5 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:08A5 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:08A5 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:08A6 mov d, a ROM:08A7 mov b, a ROM:08A8 cpi 22h ; '"' ROM:08AA jz loc_8B2 ROM:08AD mvi d, 3Ah ; ':' ROM:08AF mvi b, 2Ch ; ',' ROM:08B1 dcx h ROM:08B2 ROM:08B2 loc_8B2: ; CODE XREF: ROM:08AAj ROM:08B2 call loc_D53 ROM:08B5 xchg ROM:08B6 lxi h, loc_8C7 ROM:08B9 xthl ROM:08BA push d ROM:08BB jmp loc_72B ROM:08BE ; --------------------------------------------------------------------------- ROM:08BE ROM:08BE loc_8BE: ; CODE XREF: ROM:08A2j ROM:08BE rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:08BE ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:08BE ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:08BF call FIN ; Функция читающая число с плавающей точкой из ASCII-текста. ROM:08BF ; Читает строку и конвертирует её в число с плавающей точкой в FACCUM. ROM:08C2 xthl ROM:08C3 call FCOPYTOMEM ; Копирование числа с плавающей точкой в память, на которую указывает HL ROM:08C6 pop h ROM:08C7 ROM:08C7 loc_8C7: ; DATA XREF: ROM:08B6o ROM:08C7 dcx h ROM:08C8 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:08C8 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:08C8 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:08C9 jz loc_8D1 ROM:08CC cpi 2Ch ; ',' ROM:08CE jnz loc_840 ROM:08D1 ROM:08D1 loc_8D1: ; CODE XREF: ROM:08C9j ROM:08D1 xthl ROM:08D2 dcx h ROM:08D3 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:08D3 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:08D3 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:08D4 jnz loc_883+1 ; LOC_0884: RST 1 ROM:08D4 ; DB 2CH; ',' ROM:08D4 ; CALL GETVAR ROM:08D7 pop d ROM:08D8 lda IFINPUT ; =0 если INPUT ROM:08DB ora a ROM:08DC xchg ROM:08DD jnz loc_5E0 ROM:08E0 ora m ROM:08E1 lxi h, loc_8EA ROM:08E4 push d ROM:08E5 cnz MAINTR ; Подпрограмма главного цикла ROM:08E8 pop h ROM:08E9 ret ROM:08EA ; --------------------------------------------------------------------------- ROM:08EA ROM:08EA loc_8EA: ; DATA XREF: ROM:08E1o ROM:08EA cmc ROM:08EB cpe KBDBUF+64h ROM:08EE xri 0E9h ROM:08F0 push h ROM:08F1 rim ROM:08F2 cpo 0EEE1h ROM:08F5 sphl ROM:08F6 push h ROM:08F7 dcr c ROM:08F8 ldax b ROM:08F9 nop ROM:08FA nop ROM:08FB ROM:08FB loc_8FB: ; CODE XREF: ROM:0895j ROM:08FB ; ROM:0917j ROM:08FB call DATA ; Обработка бейсик-команд DATA и REM. Обратите внимание на комментарий ниже. ROM:08FB ; 06FB: REM: MVI C, 0 ROM:08FB ; MVI B, 0 ROM:08FB ; LOC_6FF: MOV A, C ROM:08FB ; ..... ROM:08FB ; ROM:08FB ; FINDNEXTSTATEMENT: ROM:08FE ; --------------------------------------------------------------------------- ROM:08FE ora a ROM:08FF jnz loc_914 ROM:0902 inx h ROM:0903 rst 6 ; Псевдокоманда PUSH (HL). ROM:0903 ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP. ROM:0903 ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD. ROM:0904 mov a, c ROM:0905 ora b ROM:0906 mvi e, 6 ROM:0908 jz MAINLOOP1 ; Первая точка входа в главный цикл ROM:090B pop b ROM:090C mov e, m ROM:090D inx h ROM:090E mov d, m ROM:090F xchg ROM:0910 shld MEMTMP2 ; Используется при вычислении количества памяти в OUTOFMEMORY ROM:0913 xchg ROM:0914 ROM:0914 loc_914: ; CODE XREF: ROM:08FFj ROM:0914 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:0914 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:0914 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:0915 cpi 83h ; 'Г' ROM:0917 jnz loc_8FB ROM:091A jmp GOTDATAITEM ; Получаем кусочек информации из DATA ROM:091D ; --------------------------------------------------------------------------- ROM:091D ROM:091D NEXT: ; Обработка команды NEXT ROM:091D lxi d, 0 ROM:0920 ROM:0920 ; =============== S U B R O U T I N E ======================================= ROM:0920 ROM:0920 ; Обработка команды NEXT. Дополнительная точка входа. ROM:0920 ROM:0920 NEXT2: ; CODE XREF: NEXT2+43p ROM:0920 ROM:0920 ; FUNCTION CHUNK AT ROM:0585 SIZE 00000028 BYTES ROM:0920 ROM:0920 cnz GETVAR ; Поиск и инициализация переменной. ROM:0920 ; HL указывает на имя переменной, которая встретилась во время интерпретации. ROM:0920 ; Функция возвращает в DE указатель на значение переменной. ROM:0920 ; Если переменная не существует, то функция выделяет ей память и инициализирует её. ROM:0923 shld CURBASLN ; Текущий адрес строки Бейсик программы ROM:0926 call GETFLOWPTR ; Сервисная функция. ROM:0926 ; Устанавливает HL в точку соответствующей структуры потока на стеке (Sets HL to point to the appropriate flow struct on the stack.). ROM:0926 ; Если функция вызвана ключевым словом NEXT, то DE указывает на переменную, следующую за ключевым словом NEXT. ROM:0926 ; Таким образом, устанавливает DE как главный указатель программы (i.e. Get program ptr into DE). ROM:0926 ; ROM:0929 jnz ERROR_ ; Ошибка ROM:092C sphl ROM:092D push d ROM:092E mov a, m ROM:092F inx h ROM:0930 push psw ROM:0931 push d ROM:0932 call FLOADFROMMEM ; Загружает FACCUM числом с плавающей точкой из ячеек памяти, на которые указывает HL. ROM:0932 ; ROM:0935 xthl ROM:0936 push h ROM:0937 call loc_1073 ROM:093A pop h ROM:093B call FCOPYTOMEM ; Копирование числа с плавающей точкой в память, на которую указывает HL ROM:093E pop h ROM:093F call FLOADBCDEFROMMEM ; Загружает число с плавающей точкой в BCDE из ячеек памяти, на которые указывает HL. ROM:093F ; Т. е. загрузка из M в BCDE ROM:0942 push h ROM:0943 call FCOMPARE ; Сравнение чисел с плавающей точкой. ROM:0943 ; Сравнивает FACCUM и BCDE. Результат возвращается в A. ROM:0943 ; FACCUM > BCDE, A = 0x01. ROM:0943 ; FACCUM < BCDE, A = 0xFF. ROM:0943 ; FACCUM = BCDE, A = 0. ROM:0946 pop h ROM:0947 pop b ROM:0948 sub b ROM:0949 call FLOADBCDEFROMMEM ; Загружает число с плавающей точкой в BCDE из ячеек памяти, на которые указывает HL. ROM:0949 ; Т. е. загрузка из M в BCDE ROM:094C jz loc_958 ROM:094F xchg ROM:0950 shld BASOPNUM ; Номер оператора Бейсик программы. ROM:0950 ; Или &hFFFF в командном режиме ROM:0953 mov l, c ROM:0954 mov h, b ROM:0955 jmp NEXTRET ROM:0958 ; --------------------------------------------------------------------------- ROM:0958 ROM:0958 loc_958: ; CODE XREF: NEXT2+2Cj ROM:0958 sphl ROM:0959 lhld CURBASLN ; Текущий адрес строки Бейсик программы ROM:095C mov a, m ROM:095D cpi 2Ch ; ',' ROM:095F jnz EXECNEXT ; Сюда вернётся бейсик интерпретатор после отработки команды RUN, RETURN, после обработки ошибок. ROM:095F ; Вычисляет одно выражение, передвигается на следующее выражение или на новую стоку, если в текущей строке нет больше выражений. ROM:095F ; ROM:0962 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:0962 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:0962 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:0963 call NEXT2 ; Обработка команды NEXT. Дополнительная точка входа. ROM:0963 ; End of function NEXT2 ROM:0963 ROM:0966 ROM:0966 ; =============== S U B R O U T I N E ======================================= ROM:0966 ROM:0966 ; Вычисляет выражение, возвращая результат в FACCUM. Выражение должно быть комбинацией термов и операторов. ROM:0966 ROM:0966 EVALEXPRESSION: ; CODE XREF: ROM:055Bp ROM:0966 ; ROM:0573p ... ROM:0966 call COMPUTE ; Вычисление выражений. Вызов из EVALEXPRESSION, IF, PRINT, EVALTERM. ROM:0966 ; End of function EVALEXPRESSION ROM:0966 ROM:0969 ROM:0969 ; =============== S U B R O U T I N E ======================================= ROM:0969 ROM:0969 ; Вычисление выражений. Вызов из EVALTERM. ROM:0969 ROM:0969 COMPUTE3: ; CODE XREF: ROM:0556p ROM:0969 ; COMPUTE2+12p ... ROM:0969 ori 37h ROM:0969 ; End of function COMPUTE3 ROM:0969 ROM:096B ROM:096B ; =============== S U B R O U T I N E ======================================= ROM:096B ROM:096B ; Вычисление выражений. Вызов из ASSIGNVAR. ROM:096B ROM:096B COMPUTE4: ; CODE XREF: LET+15p ROM:096B ; ROM:0AB8p ROM:096B lda LETTMP ; Временная переменная оператора LET, EVALTERM, COMPUTE, GETVAR ROM:096E adc a ROM:096F rpe ROM:0970 mvi e, 18h ROM:0972 jmp MAINLOOP1 ; Первая точка входа в главный цикл ROM:0972 ; End of function COMPUTE4 ROM:0972 ROM:0975 ROM:0975 ; =============== S U B R O U T I N E ======================================= ROM:0975 ROM:0975 ; Вычисление выражений. Вызов из EVALEXPRESSION, IF, PRINT, EVALTERM. ROM:0975 ROM:0975 COMPUTE: ; CODE XREF: LET+Ap ROM:IFp ... ROM:0975 dcx h ROM:0976 mvi d, 0 ROM:0976 ; End of function COMPUTE ROM:0976 ROM:0978 ROM:0978 ; =============== S U B R O U T I N E ======================================= ROM:0978 ROM:0978 ; Вычисление выражений. Дополнительная точка входа. ROM:0978 ROM:0978 COMPUTE2: ; CODE XREF: COMPUTE2+6Aj ROM:0978 ; EVALTERM+3Bp ... ROM:0978 ROM:0978 ; FUNCTION CHUNK AT ROM:0A9E SIZE 00000012 BYTES ROM:0978 ; FUNCTION CHUNK AT ROM:0E77 SIZE 00000037 BYTES ROM:0978 ROM:0978 push d ROM:0979 call CHECKENOUGHVARSPACE ; Внимание! После вызова CHECKENOUGHVARSPACE идет байт параметра, а не следующая инструкция! ROM:0979 ; Проверяет, достаточно ли будет памяти при выделении места для C*4 байт начиная с VAR_TOP перед тем как это выделение начнёт затирать стек. ROM:0979 ; (Или область переменных). ROM:0979 ; --------------------------------------------------------------------------- ROM:097C .db 1 ROM:097D ; --------------------------------------------------------------------------- ROM:097D call EVALTERM ; Обработка следующего символа из буфера. ROM:097D ; Вычисляет терм в выражении. ROM:097D ; Это может быть числовая константа, переменная, вызов функции, также имеющий выражения в своих аргументах или выражения в скобках. ROM:0980 shld CURBASPTR ; Область сохранения текущего адреса Бейсик программы. ROM:0983 ROM:0983 ARITHPARSE: ; CODE XREF: EVALTERM+128j ROM:0983 ; DATA XREF: COMPUTE2+5Bo ROM:0983 lhld CURBASPTR ; Вычисление арифметических выражений. ROM:0986 ROM:0986 loc_986: ; DATA XREF: COMPUTE2+52Eo ROM:0986 pop b ROM:0987 mov a, b ROM:0988 cpi 78h ; 'x' ROM:098A cnc COMPUTE3 ; Вычисление выражений. Вызов из EVALTERM. ROM:098D mov a, m ROM:098E mvi d, 0 ROM:0990 ROM:0990 loc_990: ; CODE XREF: COMPUTE2+2Fj ROM:0990 sui 0ABh ; 'л' ROM:0992 jc loc_9AA ROM:0995 cpi 3 ROM:0997 jnc loc_9AA ROM:099A cpi 1 ROM:099C ral ROM:099D xra d ROM:099E cmp d ROM:099F mov d, a ROM:09A0 jc SYNTAXERROR ; Самая распространённая ошибка №2 ROM:09A3 shld COMPTMP ; Временная переменная, использующаяся при вычислениях. ROM:09A6 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:09A6 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:09A6 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:09A7 jmp loc_990 ROM:09AA ; --------------------------------------------------------------------------- ROM:09AA ROM:09AA loc_9AA: ; CODE XREF: COMPUTE2+1Aj ROM:09AA ; COMPUTE2+1Fj ROM:09AA mov a, d ROM:09AB ora a ROM:09AC jnz loc_A9E ROM:09AF mov a, m ROM:09B0 shld COMPTMP ; Временная переменная, использующаяся при вычислениях. ROM:09B3 sui 0A4h ; 'д' ROM:09B5 rc ROM:09B6 cpi 7 ROM:09B8 rnc ROM:09B9 mov e, a ROM:09BA lda LETTMP ; Временная переменная оператора LET, EVALTERM, COMPUTE, GETVAR ROM:09BD dcr a ROM:09BE ora e ROM:09BF mov a, e ROM:09C0 jz loc_E77 ROM:09C3 rlc ROM:09C4 add e ROM:09C5 mov e, a ROM:09C6 lxi h, KW_ARITH_OP_FNS ; FADD = 144C ROM:09C9 dad d ROM:09CA mov a, b ROM:09CB mov d, m ROM:09CC cmp d ROM:09CD rnc ROM:09CE inx h ROM:09CF call COMPUTE3 ; Вычисление выражений. Вызов из EVALTERM. ROM:09D2 ROM:09D2 loc_9D2: ; CODE XREF: COMPUTE2+135j ROM:09D2 push b ROM:09D3 lxi b, ARITHPARSE ; Вычисление арифметических выражений. ROM:09D6 push b ROM:09D7 mov b, e ROM:09D8 mov c, d ROM:09D9 call FPUSH ; Записывает число с плавающей точкой на стек. ROM:09DC mov e, b ROM:09DD mov d, c ROM:09DE rst 6 ; Псевдокоманда PUSH (HL). ROM:09DE ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP. ROM:09DE ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD. ROM:09DF lhld COMPTMP ; Временная переменная, использующаяся при вычислениях. ROM:09E2 jmp COMPUTE2 ; Вычисление выражений. Дополнительная точка входа. ROM:09E2 ; End of function COMPUTE2 ROM:09E2 ROM:09E5 ROM:09E5 ; =============== S U B R O U T I N E ======================================= ROM:09E5 ROM:09E5 ; Обработка следующего символа из буфера. ROM:09E5 ; Вычисляет терм в выражении. ROM:09E5 ; Это может быть числовая константа, переменная, вызов функции, также имеющий выражения в своих аргументах или выражения в скобках. ROM:09E5 ROM:09E5 EVALTERM: ; CODE XREF: COMPUTE2+5p ROM:09E5 ; EVALTERM+10j ... ROM:09E5 ROM:09E5 ; FUNCTION CHUNK AT ROM:0A1E SIZE 00000058 BYTES ROM:09E5 ; FUNCTION CHUNK AT ROM:0AF9 SIZE 00000017 BYTES ROM:09E5 ; FUNCTION CHUNK AT ROM:0CCD SIZE 00000035 BYTES ROM:09E5 ; FUNCTION CHUNK AT ROM:178D SIZE 00000010 BYTES ROM:09E5 ROM:09E5 xra a ROM:09E6 sta LETTMP ; Временная переменная оператора LET, EVALTERM, COMPUTE, GETVAR ROM:09E9 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:09E9 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:09E9 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:09EA jc FIN ; Функция читающая число с плавающей точкой из ASCII-текста. ROM:09EA ; Читает строку и конвертирует её в число с плавающей точкой в FACCUM. ROM:09ED call CHARISALPHA ; Если символ, на который указывает HL алфавитный, то флаг переноса сбрасывается. А если нет - то установится. ROM:09ED ; Т. е. является ли (M) буквой? ROM:09F0 jnc EVALVARTERM ; Вычисление переменной. Вызов GETVAR возвращает адрес значения переменной в DE, который затем перемещается в HL. ROM:09F0 ; Далее вызов FLOADFROMMEM записывает в FACCUM значение этой переменной. ROM:09F3 cpi 0A4h ; 'д' ; __PLUS ROM:09F5 jz EVALTERM ; Обработка следующего символа из буфера. ROM:09F5 ; Вычисляет терм в выражении. ROM:09F5 ; Это может быть числовая константа, переменная, вызов функции, также имеющий выражения в своих аргументах или выражения в скобках. ROM:09F8 cpi 2Eh ; '.' ROM:09FA jz FIN ; Функция читающая число с плавающей точкой из ASCII-текста. ROM:09FA ; Читает строку и конвертирует её в число с плавающей точкой в FACCUM. ROM:09FD cpi 0A5h ; 'е' ; __MINUS ROM:09FF jz EVALMINUSTERM ROM:0A02 cpi 22h ; '"' ROM:0A04 jz loc_D50 ROM:0A07 cpi 0A2h ; 'в' ; __NOT ROM:0A09 jz loc_AF9 ROM:0A0C ROM:0A0C loc_A0C: ; __FN ROM:0A0C cpi 0A0h ; 'а' ROM:0A0E jz loc_CCD ROM:0A11 sui 0AEh ; 'о' ; inline fn ROM:0A13 jnc EVALINLINEFN ; Вычисляет функцию. Получаем смещение в KW_INLINE_FNS таблице в BC и сохраняем это на стек. ROM:0A13 ; End of function EVALTERM ; ROM:0A13 ROM:0A16 ROM:0A16 ; =============== S U B R O U T I N E ======================================= ROM:0A16 ROM:0A16 ; Вычисление значения в скобках ROM:0A16 ROM:0A16 BRACKETS: ; CODE XREF: EVALTERM:loc_A65p ROM:0A16 ; EVALTERM+2ECp ROM:0A16 rst 1 ; RST1 = проверка синтаксиса. ROM:0A16 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:0A16 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:0A16 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:0A16 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:0A16 ; --------------------------------------------------------------------------- ROM:0A17 .db '(' ROM:0A18 ; --------------------------------------------------------------------------- ROM:0A18 ROM:0A18 loc_A18: ; CODE XREF: ROM:1C7Dp ROM:0A18 call COMPUTE ; Вычисление выражений. Вызов из EVALEXPRESSION, IF, PRINT, EVALTERM. ROM:0A1B rst 1 ; RST1 = проверка синтаксиса. ROM:0A1B ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:0A1B ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:0A1B ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:0A1B ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:0A1B ; --------------------------------------------------------------------------- ROM:0A1C .db ')' ROM:0A1D ; --------------------------------------------------------------------------- ROM:0A1D ret ROM:0A1D ; End of function BRACKETS ROM:0A1D ROM:0A1E ; --------------------------------------------------------------------------- ROM:0A1E ; START OF FUNCTION CHUNK FOR EVALTERM ROM:0A1E ROM:0A1E EVALMINUSTERM: ; CODE XREF: EVALTERM+1Aj ROM:0A1E mvi d, 7Dh ; '}' ROM:0A20 call COMPUTE2 ; Вычисление выражений. Дополнительная точка входа. ROM:0A23 lhld CURBASPTR ; Область сохранения текущего адреса Бейсик программы. ROM:0A26 push h ROM:0A27 call FNEGATE ; Меняет знак FACCUM. FACCUM=-FACCUM ROM:0A2A ROM:0A2A FNRETURN: ; DATA XREF: EVALTERM+84o ROM:0A2A call COMPUTE3 ; Сюда вернёмся после выполнения функций (токены более 174 (&hAE)) ROM:0A2D pop h ROM:0A2E ret ROM:0A2F ; --------------------------------------------------------------------------- ROM:0A2F ROM:0A2F EVALVARTERM: ; CODE XREF: EVALTERM+Bj ROM:0A2F call GETVAR ; Вычисление переменной. Вызов GETVAR возвращает адрес значения переменной в DE, который затем перемещается в HL. ROM:0A2F ; Далее вызов FLOADFROMMEM записывает в FACCUM значение этой переменной. ROM:0A32 push h ROM:0A33 xchg ROM:0A34 shld FACCUM ; Аккумулятор для вычислений с плавающей точкой: ROM:0A34 ; 00000000 1 11111111111111111111111 ROM:0A34 ; -------- - ----------------------- ROM:0A34 ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:0A37 lda LETTMP ; Временная переменная оператора LET, EVALTERM, COMPUTE, GETVAR ROM:0A3A ora a ROM:0A3B cz FLOADFROMMEM ; Загружает FACCUM числом с плавающей точкой из ячеек памяти, на которые указывает HL. ROM:0A3B ; ROM:0A3E pop h ROM:0A3F ret ROM:0A40 ; --------------------------------------------------------------------------- ROM:0A40 ROM:0A40 EVALINLINEFN: ; CODE XREF: EVALTERM+2Ej ROM:0A40 mvi b, 0 ; Вычисляет функцию. Получаем смещение в KW_INLINE_FNS таблице в BC и сохраняем это на стек. ROM:0A40 ; ROM:0A42 rlc ROM:0A43 mov c, a ROM:0A44 push b ROM:0A45 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:0A45 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:0A45 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:0A46 mov a, c ROM:0A47 cpi 39h ; '9' ROM:0A49 jmp loc_178D ROM:0A4C ; --------------------------------------------------------------------------- ROM:0A4C ROM:0A4C loc_A4C: ; CODE XREF: EVALTERM+DADj ROM:0A4C rst 1 ; RST1 = проверка синтаксиса. ROM:0A4C ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:0A4C ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:0A4C ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:0A4C ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:0A4C ; --------------------------------------------------------------------------- ROM:0A4D .db '(' ROM:0A4E ; --------------------------------------------------------------------------- ROM:0A4E call COMPUTE ; Вычисление выражений. Вызов из EVALEXPRESSION, IF, PRINT, EVALTERM. ROM:0A51 rst 1 ; RST1 = проверка синтаксиса. ROM:0A51 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:0A51 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:0A51 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:0A51 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:0A51 ; --------------------------------------------------------------------------- ROM:0A52 .db ',' ROM:0A53 ; --------------------------------------------------------------------------- ROM:0A53 call COMPUTE3+1 ; Вычисление выражений. Вызов из EVALTERM. ROM:0A56 xchg ROM:0A57 lhld FACCUM ; Аккумулятор для вычислений с плавающей точкой: ROM:0A57 ; 00000000 1 11111111111111111111111 ROM:0A57 ; -------- - ----------------------- ROM:0A57 ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:0A5A xthl ROM:0A5B push h ROM:0A5C xchg ROM:0A5D call GETINTPARAM ; Получаем в A целочисленный параметр для команды Бейсика ROM:0A60 xchg ROM:0A61 xthl ROM:0A62 jmp loc_A6D ; Адрес таблицы функций _SGN ROM:0A65 ; --------------------------------------------------------------------------- ROM:0A65 ROM:0A65 loc_A65: ; CODE XREF: EVALTERM:loc_178Dj ROM:0A65 call BRACKETS ; Вычисление значения в скобках ROM:0A68 ROM:0A68 loc_A68: ; CODE XREF: EVALTERM+DB2j ROM:0A68 xthl ROM:0A69 lxi d, FNRETURN ; Сюда вернёмся после выполнения функций (токены более 174 (&hAE)) ROM:0A6C push d ROM:0A6D ROM:0A6D loc_A6D: ; CODE XREF: EVALTERM+7Dj ROM:0A6D lxi b, _SGN ; Адрес таблицы функций _SGN ROM:0A70 dad b ROM:0A71 mov c, m ROM:0A72 inx h ROM:0A73 mov h, m ROM:0A74 mov l, c ROM:0A75 pchl ROM:0A75 ; END OF FUNCTION CHUNK FOR EVALTERM ROM:0A76 ; --------------------------------------------------------------------------- ROM:0A76 ori 0AFh ROM:0A78 push psw ROM:0A79 call COMPUTE3 ; Вычисление выражений. Вызов из EVALTERM. ROM:0A7C call INTFROMFLOAT ; Получение целого числа из числа с плавающей точкой ROM:0A7F pop psw ROM:0A80 xchg ROM:0A81 pop b ROM:0A82 xthl ROM:0A83 xchg ROM:0A84 call FLOADFROMBCDE ; Загружает число в FACCUM из BCDE. ROM:0A87 push psw ROM:0A88 call INTFROMFLOAT ; Получение целого числа из числа с плавающей точкой ROM:0A8B pop psw ROM:0A8C pop b ROM:0A8D mov a, c ROM:0A8E lxi h, LONGINT ; Получение длинного целого ROM:0A91 jnz loc_A99 ROM:0A94 ana e ROM:0A95 mov c, a ROM:0A96 mov a, b ROM:0A97 ana d ROM:0A98 pchl ROM:0A99 ; --------------------------------------------------------------------------- ROM:0A99 ROM:0A99 loc_A99: ; CODE XREF: ROM:0A91j ROM:0A99 ora e ROM:0A9A mov c, a ROM:0A9B mov a, b ROM:0A9C ora d ROM:0A9D pchl ROM:0A9E ; --------------------------------------------------------------------------- ROM:0A9E ; START OF FUNCTION CHUNK FOR COMPUTE2 ROM:0A9E ROM:0A9E loc_A9E: ; CODE XREF: COMPUTE2+34j ROM:0A9E lxi h, loc_AB0 ROM:0AA1 lda LETTMP ; Временная переменная оператора LET, EVALTERM, COMPUTE, GETVAR ROM:0AA4 rar ROM:0AA5 mov a, d ROM:0AA6 ral ROM:0AA7 mov e, a ROM:0AA8 mvi d, 64h ; 'd' ROM:0AAA mov a, b ROM:0AAB cmp d ROM:0AAC rnc ROM:0AAD jmp loc_9D2 ROM:0AAD ; END OF FUNCTION CHUNK FOR COMPUTE2 ROM:0AB0 ; --------------------------------------------------------------------------- ROM:0AB0 ROM:0AB0 loc_AB0: ; DATA XREF: COMPUTE2:loc_A9Eo ROM:0AB0 ora d ROM:0AB1 ldax b ROM:0AB2 mov a, c ROM:0AB3 ora a ROM:0AB4 rar ROM:0AB5 pop b ROM:0AB6 pop d ROM:0AB7 push psw ROM:0AB8 call COMPUTE4 ; Вычисление выражений. Вызов из ASSIGNVAR. ROM:0ABB lxi h, loc_AEF ROM:0ABE push h ROM:0ABF jz FCOMPARE ; Сравнение чисел с плавающей точкой. ROM:0ABF ; Сравнивает FACCUM и BCDE. Результат возвращается в A. ROM:0ABF ; FACCUM > BCDE, A = 0x01. ROM:0ABF ; FACCUM < BCDE, A = 0xFF. ROM:0ABF ; FACCUM = BCDE, A = 0. ROM:0AC2 xra a ROM:0AC3 sta LETTMP ; Временная переменная оператора LET, EVALTERM, COMPUTE, GETVAR ROM:0AC6 push d ROM:0AC7 call FAPREP ; Подготовка FACCUM, ARIFMAR ROM:0ACA pop d ROM:0ACB rst 6 ; Псевдокоманда PUSH (HL). ROM:0ACB ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP. ROM:0ACB ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD. ROM:0ACC rst 6 ; Псевдокоманда PUSH (HL). ROM:0ACC ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP. ROM:0ACC ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD. ROM:0ACD call FAPREP3 ; Подготовка FACCUM, ARIFMAR. ROM:0ACD ; Дополнительная точка входа. ROM:0AD0 call FLOADBCDEFROMMEM ; Загружает число с плавающей точкой в BCDE из ячеек памяти, на которые указывает HL. ROM:0AD0 ; Т. е. загрузка из M в BCDE ROM:0AD3 pop h ROM:0AD4 xthl ROM:0AD5 mov d, l ROM:0AD6 pop h ROM:0AD7 ROM:0AD7 loc_AD7: ; CODE XREF: ROM:0AE8j ROM:0AD7 mov a, e ROM:0AD8 ora d ROM:0AD9 rz ROM:0ADA mov a, d ROM:0ADB ora a ROM:0ADC cma ROM:0ADD rz ROM:0ADE xra a ROM:0ADF cmp e ROM:0AE0 inr a ROM:0AE1 rnc ROM:0AE2 dcr d ROM:0AE3 dcr e ROM:0AE4 ldax b ROM:0AE5 cmp m ROM:0AE6 inx h ROM:0AE7 inx b ROM:0AE8 jz loc_AD7 ROM:0AEB cmc ROM:0AEC jmp loc_12D0 ROM:0AEF ; --------------------------------------------------------------------------- ROM:0AEF ROM:0AEF loc_AEF: ; DATA XREF: ROM:0ABBo ROM:0AEF inr a ROM:0AF0 adc a ROM:0AF1 pop b ROM:0AF2 ana b ROM:0AF3 adi 0FFh ROM:0AF5 sbb a ROM:0AF6 jmp FCHARTOFLOAT ; Конвертирует знаковое число (байт) в A в число с плавающей точкой в FACCUM. ROM:0AF9 ; --------------------------------------------------------------------------- ROM:0AF9 ; START OF FUNCTION CHUNK FOR EVALTERM ROM:0AF9 ROM:0AF9 loc_AF9: ; CODE XREF: EVALTERM+24j ROM:0AF9 mvi d, 5Ah ; 'Z' ROM:0AFB call COMPUTE2 ; Вычисление выражений. Дополнительная точка входа. ROM:0AFE call COMPUTE3 ; Вычисление выражений. Вызов из EVALTERM. ROM:0B01 call INTFROMFLOAT ; Получение целого числа из числа с плавающей точкой ROM:0B04 mov a, e ROM:0B05 cma ROM:0B06 mov c, a ROM:0B07 mov a, d ROM:0B08 cma ROM:0B09 call LONGINT ; Получение длинного целого ROM:0B0C pop b ROM:0B0D jmp ARITHPARSE ; Вычисление арифметических выражений. ROM:0B0D ; END OF FUNCTION CHUNK FOR EVALTERM ROM:0B10 ; --------------------------------------------------------------------------- ROM:0B10 ROM:0B10 loc_B10: ; DATA XREF: ROM:DIMo ROM:0B10 dcx h ROM:0B11 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:0B11 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:0B11 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:0B12 rz ROM:0B13 rst 1 ; RST1 = проверка синтаксиса. ROM:0B13 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:0B13 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:0B13 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:0B13 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:0B13 ; --------------------------------------------------------------------------- ROM:0B14 .db ',' ROM:0B15 ; --------------------------------------------------------------------------- ROM:0B15 ROM:0B15 DIM: ; Обработка бейсик-оператора DIM ROM:0B15 lxi b, loc_B10 ROM:0B18 push b ROM:0B18 ; --------------------------------------------------------------------------- ROM:0B19 .db 0F6h ; Ў ; Засада! ROM:0B19 ; ORI AF ROM:0B19 ; STA DIM_OR_EVAL ROM:0B1A ; --------------------------------------------------------------------------- ROM:0B1A ROM:0B1A GETVAR: ; CODE XREF: LETp ROM:0886p ... ROM:0B1A xra a ; Поиск и инициализация переменной. ROM:0B1A ; HL указывает на имя переменной, которая встретилась во время интерпретации. ROM:0B1A ; Функция возвращает в DE указатель на значение переменной. ROM:0B1A ; Если переменная не существует, то функция выделяет ей память и инициализирует её. ROM:0B1B sta DIM_OR_EVAL ; Флаг используемый GETARRAYVAR для определения: определяем ли мы массив с помощью DIM, или осуществляем доступ к элементу существующего массива, ROM:0B1B ; что могло бы быть сделано при помощи EVALTERM. ROM:0B1E mov b, m ROM:0B1F ROM:0B1F ; =============== S U B R O U T I N E ======================================= ROM:0B1F ROM:0B1F ; Поиск и инициализация переменной. ROM:0B1F ; Дополнительная точка входа. ROM:0B1F ROM:0B1F GETVAR2: ; CODE XREF: DEFFNA+9p ROM:0B1F ROM:0B1F ; FUNCTION CHUNK AT ROM:0BF3 SIZE 00000087 BYTES ROM:0B1F ROM:0B1F call CHARISALPHA ; Если символ, на который указывает HL алфавитный, то флаг переноса сбрасывается. А если нет - то установится. ROM:0B1F ; Т. е. является ли (M) буквой? ROM:0B22 jc SYNTAXERROR ; Самая распространённая ошибка №2 ROM:0B25 xra a ROM:0B26 mov c, a ROM:0B27 sta LETTMP ; Временная переменная оператора LET, EVALTERM, COMPUTE, GETVAR ROM:0B2A rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:0B2A ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:0B2A ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:0B2B jc loc_B34 ROM:0B2E call CHARISALPHA ; Если символ, на который указывает HL алфавитный, то флаг переноса сбрасывается. А если нет - то установится. ROM:0B2E ; Т. е. является ли (M) буквой? ROM:0B31 jc loc_B3F ROM:0B34 ROM:0B34 loc_B34: ; CODE XREF: GETVAR2+Cj ROM:0B34 mov c, a ROM:0B35 ROM:0B35 loc_B35: ; CODE XREF: GETVAR2+17j ROM:0B35 ; GETVAR2+1Dj ROM:0B35 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:0B35 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:0B35 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:0B36 jc loc_B35 ROM:0B39 call CHARISALPHA ; Если символ, на который указывает HL алфавитный, то флаг переноса сбрасывается. А если нет - то установится. ROM:0B39 ; Т. е. является ли (M) буквой? ROM:0B3C jnc loc_B35 ROM:0B3F ROM:0B3F loc_B3F: ; CODE XREF: GETVAR2+12j ROM:0B3F sui 24h ; '$' ROM:0B41 jnz loc_B4C ROM:0B44 inr a ROM:0B45 sta LETTMP ; Временная переменная оператора LET, EVALTERM, COMPUTE, GETVAR ROM:0B48 rrc ROM:0B49 add c ROM:0B4A mov c, a ROM:0B4B rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:0B4B ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:0B4B ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:0B4C ROM:0B4C loc_B4C: ; CODE XREF: GETVAR2+22j ROM:0B4C lda FORTMP ; Временный параметр оператора FOR ROM:0B4F add m ROM:0B50 cpi 28h ; '(' ROM:0B52 jz GETARRAYVAR ; Даёт доступ или размещает в памяти переменную-массив. DIM_OR_EVAL показывает, имеем ли мы дело с описанием массива (оператор DIM), или осуществляется доступ к элементу массива. ROM:0B52 ; В первом случае DIM_OR_EVAL равен &hEF иначе он равен нулю. ROM:0B55 xra a ROM:0B56 sta FORTMP ; Временный параметр оператора FOR ROM:0B59 push h ROM:0B5A lhld BGARRAY ; Адрес начала массивов. ROM:0B5A ; Указывает на начало участка памяти, хранящего массивы. ROM:0B5A ; Следует сразу за участком памяти, выделенным для обычных переменных. ROM:0B5D xchg ROM:0B5E lhld ENBASPRG ; Адрес конца Бейсик программы. ROM:0B5E ; Указывает на первую ячейку участка памяти, доступного программам. ROM:0B5E ; Всегда следует за последним байтом программы. ROM:0B61 ROM:0B61 loc_B61: ; CODE XREF: GETVAR2+56j ROM:0B61 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:0B62 jz ALLOCNEWVAR ; Готовимся разместить новую переменную. Проверяем адрес возврата, для того чтобы узнать, что нас вызывает. ROM:0B62 ; Если это вычислитель выражений, то мы выходим без выделения памяти для переменной. ROM:0B62 ; Notice that (assuming we haven't been called by the evaluator) the prog ptr on the stack is kept in place. ROM:0B62 ; ROM:0B65 mov a, c ROM:0B66 sub m ROM:0B67 inx h ROM:0B68 jnz loc_B6D ROM:0B6B mov a, b ROM:0B6C sub m ROM:0B6D ROM:0B6D loc_B6D: ; CODE XREF: GETVAR2+49j ROM:0B6D inx h ROM:0B6E jz loc_B9B ROM:0B71 inx h ROM:0B72 inx h ROM:0B73 inx h ROM:0B74 inx h ROM:0B75 jmp loc_B61 ROM:0B78 ; --------------------------------------------------------------------------- ROM:0B78 ROM:0B78 ALLOCNEWVAR: ; CODE XREF: GETVAR2+43j ROM:0B78 push b ; Готовимся разместить новую переменную. Проверяем адрес возврата, для того чтобы узнать, что нас вызывает. ROM:0B78 ; Если это вычислитель выражений, то мы выходим без выделения памяти для переменной. ROM:0B78 ; Notice that (assuming we haven't been called by the evaluator) the prog ptr on the stack is kept in place. ROM:0B78 ; ROM:0B79 lxi b, 6 ROM:0B7C lhld VAR_TOP ; Адрес начала свободной памяти. ROM:0B7C ; Указывает на верхушку области хранящей массивы и переменные. ROM:0B7F push h ROM:0B80 dad b ROM:0B81 pop b ROM:0B82 push h ROM:0B83 call COPYMEMORYUP ; Копирует байты памяти из BC в HL. Копирование идёт задом-наперёд до тех, пор, пока BC не станет равным DE. ROM:0B83 ; Идёт оно задом-наперёд потому, что функция может использоваться для блоков отстоящих друг от друга на пару байт. ROM:0B83 ; В таком случае, если бы копирование шло напрямую, то блок памяти затёр бы сам себя. ROM:0B86 pop h ROM:0B87 shld VAR_TOP ; Адрес начала свободной памяти. ROM:0B87 ; Указывает на верхушку области хранящей массивы и переменные. ROM:0B8A mov h, b ROM:0B8B mov l, c ROM:0B8C shld BGARRAY ; Адрес начала массивов. ROM:0B8C ; Указывает на начало участка памяти, хранящего массивы. ROM:0B8C ; Следует сразу за участком памяти, выделенным для обычных переменных. ROM:0B8F ROM:0B8F INITVARLOOP: ; CODE XREF: GETVAR2+74j ROM:0B8F dcx h ; Инициализирует новую переменную до нуля. ROM:0B90 mvi m, 0 ROM:0B92 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:0B93 jnz INITVARLOOP ; Инициализирует новую переменную до нуля. ROM:0B96 pop d ROM:0B97 mov m, e ROM:0B98 inx h ROM:0B99 mov m, d ROM:0B9A inx h ROM:0B9B ROM:0B9B loc_B9B: ; CODE XREF: GETVAR2+4Fj ROM:0B9B xchg ROM:0B9C pop h ROM:0B9D ret ROM:0B9E ; --------------------------------------------------------------------------- ROM:0B9E ROM:0B9E GETARRAYVAR: ; CODE XREF: GETVAR2+33j ROM:0B9E push h ; Даёт доступ или размещает в памяти переменную-массив. DIM_OR_EVAL показывает, имеем ли мы дело с описанием массива (оператор DIM), или осуществляется доступ к элементу массива. ROM:0B9E ; В первом случае DIM_OR_EVAL равен &hEF иначе он равен нулю. ROM:0B9F lhld DIM_OR_EVAL ; Флаг используемый GETARRAYVAR для определения: определяем ли мы массив с помощью DIM, или осуществляем доступ к элементу существующего массива, ROM:0B9F ; что могло бы быть сделано при помощи EVALTERM. ROM:0BA2 xthl ROM:0BA3 mvi d, 0 ROM:0BA5 ROM:0BA5 loc_BA5: ; CODE XREF: GETVAR2+96j ROM:0BA5 push d ROM:0BA6 push b ROM:0BA7 call GETSUBSCRIPT ; Получает индекс массива встречающегося в выражении или операторе DIM. ROM:0BA7 ; Индекс возвращается в виде целого положительного числа в CDE. ROM:0BAA pop b ROM:0BAB pop psw ROM:0BAC xchg ROM:0BAD xthl ROM:0BAE push h ROM:0BAF xchg ROM:0BB0 inr a ROM:0BB1 mov d, a ROM:0BB2 mov a, m ROM:0BB3 cpi 2Ch ; ',' ROM:0BB5 jz loc_BA5 ROM:0BB8 rst 1 ; RST1 = проверка синтаксиса. ROM:0BB8 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:0BB8 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:0BB8 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:0BB8 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:0BB8 ; --------------------------------------------------------------------------- ROM:0BB9 .db ')' ROM:0BBA ; --------------------------------------------------------------------------- ROM:0BBA shld CURBASPTR ; Область сохранения текущего адреса Бейсик программы. ROM:0BBD pop h ROM:0BBE shld DIM_OR_EVAL ; Флаг используемый GETARRAYVAR для определения: определяем ли мы массив с помощью DIM, или осуществляем доступ к элементу существующего массива, ROM:0BBE ; что могло бы быть сделано при помощи EVALTERM. ROM:0BC1 push d ROM:0BC2 lhld BGARRAY ; Адрес начала массивов. ROM:0BC2 ; Указывает на начало участка памяти, хранящего массивы. ROM:0BC2 ; Следует сразу за участком памяти, выделенным для обычных переменных. ROM:0BC5 ROM:0BC5 loc_BC5: ; CODE XREF: GETVAR2+BEj ROM:0BC5 mvi a, 19h ; LOC_BC5+1: DAD D ROM:0BC5 ; XCHG ROM:0BC7 xchg ROM:0BC8 lhld VAR_TOP ; Адрес начала свободной памяти. ROM:0BC8 ; Указывает на верхушку области хранящей массивы и переменные. ROM:0BCB xchg ROM:0BCC rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:0BCD jz loc_BF3 ROM:0BD0 mov a, m ROM:0BD1 cmp c ROM:0BD2 inx h ROM:0BD3 jnz loc_BD8 ROM:0BD6 mov a, m ROM:0BD7 cmp b ROM:0BD8 ROM:0BD8 loc_BD8: ; CODE XREF: GETVAR2+B4j ROM:0BD8 inx h ROM:0BD9 mov e, m ROM:0BDA inx h ROM:0BDB mov d, m ROM:0BDC inx h ROM:0BDD jnz loc_BC5+1 ; LOC_BC5+1: DAD D ROM:0BDD ; XCHG ROM:0BE0 lda DIM_OR_EVAL ; Флаг используемый GETARRAYVAR для определения: определяем ли мы массив с помощью DIM, или осуществляем доступ к элементу существующего массива, ROM:0BE0 ; что могло бы быть сделано при помощи EVALTERM. ROM:0BE3 ora a ROM:0BE4 mvi e, 12h ROM:0BE6 jnz MAINLOOP1 ; Первая точка входа в главный цикл ROM:0BE9 pop psw ROM:0BEA cmp m ROM:0BEB jz loc_C52 ROM:0BEB ; End of function GETVAR2 ROM:0BEB ROM:0BEE ; START OF FUNCTION CHUNK FOR MACRO5 ROM:0BEE ROM:0BEE loc_BEE: ; CODE XREF: GETVAR2+10Cj ROM:0BEE ; GETVAR2+140j ... ROM:0BEE mvi e, 10h ROM:0BF0 jmp MAINLOOP1 ; Первая точка входа в главный цикл ROM:0BF0 ; END OF FUNCTION CHUNK FOR MACRO5 ROM:0BF3 ; --------------------------------------------------------------------------- ROM:0BF3 ; START OF FUNCTION CHUNK FOR GETVAR2 ROM:0BF3 ROM:0BF3 loc_BF3: ; CODE XREF: GETVAR2+AEj ROM:0BF3 lxi d, 4 ROM:0BF6 mov m, c ROM:0BF7 inx h ROM:0BF8 mov m, b ROM:0BF9 inx h ROM:0BFA pop psw ROM:0BFB sta VARSRCH_ ; pchl ROM:0BFE call loc_F87E ROM:0C01 nop ROM:0C02 shld COMPTMP ; Временная переменная, использующаяся при вычислениях. ROM:0C05 inx h ROM:0C06 inx h ROM:0C07 mov b, c ROM:0C08 mov m, b ROM:0C09 inx h ROM:0C0A ROM:0C0A loc_C0A: ; CODE XREF: GETVAR2+105j ROM:0C0A lda DIM_OR_EVAL ; Флаг используемый GETARRAYVAR для определения: определяем ли мы массив с помощью DIM, или осуществляем доступ к элементу существующего массива, ROM:0C0A ; что могло бы быть сделано при помощи EVALTERM. ROM:0C0D ora a ROM:0C0E mov a, b ROM:0C0F lxi b, 0Bh ROM:0C12 jz loc_C17 ROM:0C15 pop b ROM:0C16 inx b ROM:0C17 ROM:0C17 loc_C17: ; CODE XREF: GETVAR2+F3j ROM:0C17 mov m, c ROM:0C18 inx h ROM:0C19 mov m, b ROM:0C1A inx h ROM:0C1B push psw ROM:0C1C push h ROM:0C1D call MACRO5 ; Вызывается из GETVAR ROM:0C20 xchg ROM:0C21 pop h ROM:0C22 pop b ROM:0C23 dcr b ROM:0C24 jnz loc_C0A ROM:0C27 mov b, d ROM:0C28 mov c, e ROM:0C29 xchg ROM:0C2A dad d ROM:0C2B jc loc_BEE ROM:0C2E call CHECKENOUGHMEM ; Проверяет, действительно ли HL больше, чем на 32 байта отстоит от указателя стека. ROM:0C2E ; Если HL расположен ближе чем на 32 байта к стеку, то функция падает в OutOfMemory. ROM:0C31 shld VAR_TOP ; Адрес начала свободной памяти. ROM:0C31 ; Указывает на верхушку области хранящей массивы и переменные. ROM:0C34 ROM:0C34 loc_C34: ; CODE XREF: GETVAR2+119j ROM:0C34 dcx h ROM:0C35 mvi m, 0 ROM:0C37 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:0C38 jnz loc_C34 ROM:0C3B inx b ROM:0C3C mov h, a ROM:0C3D lda DIM_OR_EVAL ; Флаг используемый GETARRAYVAR для определения: определяем ли мы массив с помощью DIM, или осуществляем доступ к элементу существующего массива, ROM:0C3D ; что могло бы быть сделано при помощи EVALTERM. ROM:0C40 ora a ROM:0C41 lda VARSRCH_ ; pchl ROM:0C44 mov l, a ROM:0C45 dad h ROM:0C46 dad b ROM:0C47 xchg ROM:0C48 lhld COMPTMP ; Временная переменная, использующаяся при вычислениях. ROM:0C4B mov m, e ROM:0C4C inx h ROM:0C4D mov m, d ROM:0C4E inx h ROM:0C4F jnz loc_C74 ROM:0C52 ROM:0C52 loc_C52: ; CODE XREF: GETVAR2+CCj ROM:0C52 inx h ROM:0C53 lxi b, 0 ROM:0C56 ROM:0C56 loc_C56: ; CODE XREF: GETVAR2+14Dj ROM:0C56 mvi d, 0E1h ; 'с' ROM:0C58 mov e, m ROM:0C59 inx h ROM:0C5A mov d, m ROM:0C5B inx h ROM:0C5C xthl ROM:0C5D push psw ROM:0C5E rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:0C5F jnc loc_BEE ROM:0C62 push h ROM:0C63 call MACRO5 ; Вызывается из GETVAR ROM:0C66 pop d ROM:0C67 dad d ROM:0C68 pop psw ROM:0C69 dcr a ROM:0C6A mov b, h ROM:0C6B mov c, l ROM:0C6C jnz loc_C56+1 ROM:0C6F dad h ROM:0C70 dad h ROM:0C71 pop b ROM:0C72 dad b ROM:0C73 xchg ROM:0C74 ROM:0C74 loc_C74: ; CODE XREF: GETVAR2+130j ROM:0C74 lhld CURBASPTR ; Область сохранения текущего адреса Бейсик программы. ROM:0C77 dcx h ROM:0C78 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:0C78 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:0C78 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:0C79 ret ROM:0C79 ; END OF FUNCTION CHUNK FOR GETVAR2 ROM:0C7A ; --------------------------------------------------------------------------- ROM:0C7A ROM:0C7A FRE: ; Обработка бейсик-функции FRE ROM:0C7A lhld VAR_TOP ROM:0C7D xchg ROM:0C7E lxi h, 0 ROM:0C81 dad sp ROM:0C82 lda LETTMP ; Временная переменная оператора LET, EVALTERM, COMPUTE, GETVAR ROM:0C85 ora a ROM:0C86 jz loc_C96 ROM:0C89 call FAPREP ; Подготовка FACCUM, ARIFMAR ROM:0C8C call loc_DD2 ROM:0C8F lhld STKADDR ; Адрес стека ROM:0C92 xchg ROM:0C93 lhld RUNWITHTMP ; Временная переменная оператора RUN с параметром ROM:0C96 ROM:0C96 loc_C96: ; CODE XREF: ROM:0C86j ROM:0C96 mov a, l ROM:0C97 sub e ROM:0C98 mov c, a ROM:0C99 mov a, h ROM:0C9A sbb d ROM:0C9B ROM:0C9B ; =============== S U B R O U T I N E ======================================= ROM:0C9B ROM:0C9B ; Получение длинного целого ROM:0C9B ROM:0C9B LONGINT: ; CODE XREF: EVALTERM+124p ROM:0C9B ; DATA XREF: ROM:0A8Eo ROM:0C9B mov b, c ROM:0C9C ROM:0C9C INLONGINT: ; CODE XREF: ROM:0CADj ROM:0C9C ; ROM:1D1Ej ... ROM:0C9C mov d, b ; Ввод длинного целого. ROM:0C9D mvi e, 0 ROM:0C9F lxi h, LETTMP ; Временная переменная оператора LET, EVALTERM, COMPUTE, GETVAR ROM:0CA2 mov m, e ROM:0CA3 mvi b, 90h ; 'Р' ROM:0CA5 jmp LONGINT2 ; Получение длинного целого. Дополнительная точка входа. ROM:0CA5 ; End of function LONGINT ROM:0CA5 ROM:0CA8 ; --------------------------------------------------------------------------- ROM:0CA8 ROM:0CA8 POS: ; Обработка бейсик функции POS ROM:0CA8 lda PK ROM:0CAB ROM:0CAB SHORTINT: ; CODE XREF: ROM:0F01j ROM:0CAB ; ROM:0F7Dj ... ROM:0CAB mov b, a ; Получение короткого целого из A ROM:0CAC xra a ROM:0CAD jmp INLONGINT ; Ввод длинного целого. ROM:0CB0 ; --------------------------------------------------------------------------- ROM:0CB0 ROM:0CB0 DEF: ; Определение функции ROM:0CB0 call DEFFNA ROM:0CB3 lxi b, DATA ; Обработка бейсик-команд DATA и REM. Обратите внимание на комментарий ниже. ROM:0CB3 ; 06FB: REM: MVI C, 0 ROM:0CB3 ; MVI B, 0 ROM:0CB3 ; LOC_6FF: MOV A, C ROM:0CB3 ; ..... ROM:0CB3 ; ROM:0CB3 ; FINDNEXTSTATEMENT: ROM:0CB6 push b ROM:0CB7 push d ROM:0CB8 call MAINLOOP2 ; Вход в главный цикл из INPUT и DEF ROM:0CBB rst 1 ; RST1 = проверка синтаксиса. ROM:0CBB ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:0CBB ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:0CBB ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:0CBB ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:0CBB ; --------------------------------------------------------------------------- ROM:0CBC .db '(' ROM:0CBD ; --------------------------------------------------------------------------- ROM:0CBD call GETVAR ; Поиск и инициализация переменной. ROM:0CBD ; HL указывает на имя переменной, которая встретилась во время интерпретации. ROM:0CBD ; Функция возвращает в DE указатель на значение переменной. ROM:0CBD ; Если переменная не существует, то функция выделяет ей память и инициализирует её. ROM:0CC0 call COMPUTE3 ; Вычисление выражений. Вызов из EVALTERM. ROM:0CC3 rst 1 ; RST1 = проверка синтаксиса. ROM:0CC3 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:0CC3 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:0CC3 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:0CC3 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:0CC3 ; --------------------------------------------------------------------------- ROM:0CC4 .db ')' ROM:0CC5 ; --------------------------------------------------------------------------- ROM:0CC5 rst 1 ; RST1 = проверка синтаксиса. ROM:0CC5 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:0CC5 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:0CC5 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:0CC5 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:0CC5 ; --------------------------------------------------------------------------- ROM:0CC6 .db 0ACh ; = (токен 172 (&hAC)) ROM:0CC7 ; --------------------------------------------------------------------------- ROM:0CC7 mov b, h ROM:0CC8 mov c, l ROM:0CC9 xthl ROM:0CCA jmp loc_CF9 ROM:0CCD ; --------------------------------------------------------------------------- ROM:0CCD ; START OF FUNCTION CHUNK FOR EVALTERM ROM:0CCD ROM:0CCD loc_CCD: ; CODE XREF: EVALTERM+29j ROM:0CCD call DEFFNA ; Обработка DEF FN ROM:0CD0 push d ROM:0CD1 call BRACKETS ; Вычисление значения в скобках ROM:0CD4 call COMPUTE3 ; Вычисление выражений. Вызов из EVALTERM. ROM:0CD7 xthl ROM:0CD8 rst 6 ; Псевдокоманда PUSH (HL). ROM:0CD8 ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP. ROM:0CD8 ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD. ROM:0CD9 pop d ROM:0CDA rst 6 ; Псевдокоманда PUSH (HL). ROM:0CDA ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP. ROM:0CDA ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD. ROM:0CDB pop h ROM:0CDC rst 6 ; Псевдокоманда PUSH (HL). ROM:0CDC ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP. ROM:0CDC ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD. ROM:0CDD rst 6 ; Псевдокоманда PUSH (HL). ROM:0CDD ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP. ROM:0CDD ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD. ROM:0CDE dcx h ROM:0CDF dcx h ROM:0CE0 dcx h ROM:0CE1 dcx h ROM:0CE2 push h ROM:0CE3 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:0CE4 push d ROM:0CE5 mvi e, 22h ; '"' ROM:0CE7 jz MAINLOOP1 ; Первая точка входа в главный цикл ROM:0CEA call FCOPYTOMEM ; Копирование числа с плавающей точкой в память, на которую указывает HL ROM:0CED pop h ROM:0CEE call EVALEXPRESSION ; Вычисляет выражение, возвращая результат в FACCUM. Выражение должно быть комбинацией термов и операторов. ROM:0CF1 dcx h ROM:0CF2 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:0CF2 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:0CF2 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:0CF3 jnz SYNTAXERROR ; Самая распространённая ошибка №2 ROM:0CF6 pop h ROM:0CF7 pop d ROM:0CF8 pop b ROM:0CF9 ROM:0CF9 loc_CF9: ; CODE XREF: ROM:0CCAj ROM:0CF9 mov m, c ROM:0CFA inx h ROM:0CFB mov m, b ROM:0CFC ROM:0CFC loc_CFC: ; CODE XREF: MAINTR3+6j ROM:0CFC inx h ROM:0CFD mov m, e ROM:0CFE inx h ROM:0CFF mov m, d ROM:0D00 pop h ROM:0D01 ret ROM:0D01 ; END OF FUNCTION CHUNK FOR EVALTERM ROM:0D02 ROM:0D02 ; =============== S U B R O U T I N E ======================================= ROM:0D02 ROM:0D02 ; Вход в главный цикл из INPUT и DEF ROM:0D02 ROM:0D02 MAINLOOP2: ; CODE XREF: ROM:0867p ROM:0D02 ; ROM:0CB8p ROM:0D02 push h ROM:0D03 lhld BASOPNUM ; Номер оператора Бейсик программы. ROM:0D03 ; Или &hFFFF в командном режиме ROM:0D06 inx h ROM:0D07 mov a, h ROM:0D08 ora l ROM:0D09 pop h ROM:0D0A rnz ROM:0D0B mvi e, 16h ROM:0D0D jmp MAINLOOP1 ; Первая точка входа в главный цикл ROM:0D0D ; End of function MAINLOOP2 ROM:0D0D ROM:0D10 ROM:0D10 ; =============== S U B R O U T I N E ======================================= ROM:0D10 ROM:0D10 ; Обработка DEF FN ROM:0D10 ROM:0D10 DEFFNA: ; CODE XREF: ROM:DEFp ROM:0D10 ; EVALTERM:loc_CCDp ROM:0D10 rst 1 ; RST1 = проверка синтаксиса. ROM:0D10 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:0D10 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:0D10 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:0D10 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:0D10 ; --------------------------------------------------------------------------- ROM:0D11 .db 0A0h ; FN (токен 160 (&hA0)) ROM:0D12 ; --------------------------------------------------------------------------- ROM:0D12 mvi a, 80h ; 'А' ROM:0D14 sta FORTMP ; Временный параметр оператора FOR ROM:0D17 ora m ROM:0D18 mov b, a ROM:0D19 call GETVAR2 ; Поиск и инициализация переменной. ROM:0D19 ; Дополнительная точка входа. ROM:0D1C jmp COMPUTE3 ; Вычисление выражений. Вызов из EVALTERM. ROM:0D1C ; End of function DEFFNA ROM:0D1C ROM:0D1F ; --------------------------------------------------------------------------- ROM:0D1F ROM:0D1F STR: ; Бейсик-функция STR ROM:0D1F call COMPUTE3 ROM:0D22 call FOUT ; Печатает число с плавающей точкой на терминал. ROM:0D25 call MAINTR2 ; Обработка главного цикла. Вызов из PRINT и STR. ROM:0D28 call FAPREP ; Подготовка FACCUM, ARIFMAR ROM:0D2B lxi b, loc_F10 ROM:0D2E push b ROM:0D2F ROM:0D2F ; =============== S U B R O U T I N E ======================================= ROM:0D2F ROM:0D2F ; Обработка главного цикла. Вызов из ASSIGNVAR. ROM:0D2F ROM:0D2F MAINTR4: ; CODE XREF: LET+32p ROM:0D2F ; MAINTR2+23p ROM:0D2F mov a, m ROM:0D30 inx h ROM:0D31 inx h ROM:0D32 push h ROM:0D33 call MAINTR5 ; Подпрограмма главного цикла. ROM:0D36 pop h ROM:0D37 rst 6 ; Псевдокоманда PUSH (HL). ROM:0D37 ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP. ROM:0D37 ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD. ROM:0D38 pop b ROM:0D39 call MAINTR3 ; Сохранение A в MAINTR2TMP ROM:0D3C push h ROM:0D3D mov l, a ROM:0D3E call MAINTR6 ; Проверка L, загрузка в A из (BC), выгрузка в (DE) в цикле ROM:0D41 pop d ROM:0D42 ret ROM:0D42 ; End of function MAINTR4 ROM:0D42 ROM:0D43 ROM:0D43 ; =============== S U B R O U T I N E ======================================= ROM:0D43 ROM:0D43 ; Вызов MAINTR5 и переход в MAINTR3 ROM:0D43 ROM:0D43 MAINTR7: ; CODE XREF: COMPUTE2+518p ROM:0D43 ; ROM:0F06p ... ROM:0D43 call MAINTR5 ; Подпрограмма главного цикла. ROM:0D43 ; End of function MAINTR7 ROM:0D43 ROM:0D46 ROM:0D46 ; =============== S U B R O U T I N E ======================================= ROM:0D46 ROM:0D46 ; Сохранение A в MAINTR2TMP ROM:0D46 ROM:0D46 MAINTR3: ; CODE XREF: MAINTR4+Ap ROM:0D46 ; MAINTR2+1Fp ... ROM:0D46 lxi h, MAINTR2TMP ; Временный массив MAINTR ROM:0D49 push h ROM:0D4A mov m, a ROM:0D4B inx h ROM:0D4C jmp loc_CFC ROM:0D4C ; End of function MAINTR3 ROM:0D4C ROM:0D4F ROM:0D4F ; =============== S U B R O U T I N E ======================================= ROM:0D4F ROM:0D4F ; Обработка главного цикла. Вызов из PRINT и STR. ROM:0D4F ROM:0D4F MAINTR2: ; CODE XREF: ROM:07BAp ROM:0D4F ; ROM:0D25p ... ROM:0D4F dcx h ROM:0D50 ROM:0D50 loc_D50: ; CODE XREF: ROM:085Cp ROM:0D50 ; EVALTERM+1Fj ROM:0D50 mvi b, 22h ; '"' ROM:0D52 mov d, b ROM:0D53 ROM:0D53 loc_D53: ; CODE XREF: ROM:loc_8B2p ROM:0D53 push h ROM:0D54 mvi c, 0FFh ROM:0D56 ROM:0D56 loc_D56: ; CODE XREF: MAINTR2+13j ROM:0D56 inx h ROM:0D57 mov a, m ROM:0D58 inr c ROM:0D59 ora a ROM:0D5A jz loc_D65 ROM:0D5D cmp d ROM:0D5E jz loc_D65 ROM:0D61 cmp b ROM:0D62 jnz loc_D56 ROM:0D65 ROM:0D65 loc_D65: ; CODE XREF: MAINTR2+Bj ROM:0D65 ; MAINTR2+Fj ROM:0D65 cpi 22h ; '"' ROM:0D67 cz DDCMP ; Сравнивает следующий символ (HL) с двоеточием ROM:0D6A xthl ROM:0D6B inx h ROM:0D6C xchg ROM:0D6D mov a, c ROM:0D6E call MAINTR3 ; Сохранение A в MAINTR2TMP ROM:0D71 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:0D72 cc MAINTR4 ; Обработка главного цикла. Вызов из ASSIGNVAR. ROM:0D75 ROM:0D75 loc_D75: ; CODE XREF: COMPUTE2+533j ROM:0D75 ; ROM:0F11j ... ROM:0D75 lxi d, MAINTR2TMP ; Временный массив MAINTR ROM:0D78 lhld ARIFMAR ; Адрес рабочей области арифметических преобразований ROM:0D7B shld FACCUM ; Аккумулятор для вычислений с плавающей точкой: ROM:0D7B ; 00000000 1 11111111111111111111111 ROM:0D7B ; -------- - ----------------------- ROM:0D7B ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:0D7E mvi a, 1 ROM:0D80 sta LETTMP ; Временная переменная оператора LET, EVALTERM, COMPUTE, GETVAR ROM:0D83 call FCOPYTOMEM2 ; Копирование числа с плавающей точкой в память. Дополнительная точка входа. ROM:0D86 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:0D87 mvi e, 1Eh ROM:0D89 jz MAINLOOP1 ; Первая точка входа в главный цикл ROM:0D8C shld ARIFMAR ; Адрес рабочей области арифметических преобразований ROM:0D8F pop h ROM:0D90 mov a, m ROM:0D91 ret ROM:0D91 ; End of function MAINTR2 ROM:0D91 ROM:0D92 ; --------------------------------------------------------------------------- ROM:0D92 ROM:0D92 loc_D92: ; DATA XREF: PRINTINT2+6o ROM:0D92 inx h ROM:0D93 ROM:0D93 ; =============== S U B R O U T I N E ======================================= ROM:0D93 ROM:0D93 ; Подпрограмма главного цикла ROM:0D93 ROM:0D93 MAINTR: ; CODE XREF: CHECKENOUGHMEM:loc_2EEp ROM:0D93 ; CHECKENOUGHMEM+49p ... ROM:0D93 call MAINTR2 ; Обработка главного цикла. Вызов из PRINT и STR. ROM:0D96 ROM:0D96 loc_D96: ; CODE XREF: ROM:07C9p ROM:0D96 ; ROM:loc_7D0p ... ROM:0D96 call FAPREP ; Подготовка FACCUM, ARIFMAR ROM:0D99 call FLOADBCDEFROMMEM ; Загружает число с плавающей точкой в BCDE из ячеек памяти, на которые указывает HL. ROM:0D99 ; Т. е. загрузка из M в BCDE ROM:0D9C inr e ROM:0D9D ROM:0D9D loc_D9D: ; CODE XREF: MAINTR+14j ROM:0D9D dcr e ROM:0D9E rz ROM:0D9F ldax b ROM:0DA0 rst 3 ; RST3 = печатает символ из A на экран. ROM:0DA1 cpi 0Dh ROM:0DA3 cz PKCHK2 ; Сохранение A в FPTMP ROM:0DA6 inx b ROM:0DA7 jmp loc_D9D ROM:0DA7 ; End of function MAINTR ROM:0DA7 ROM:0DAA ROM:0DAA ; =============== S U B R O U T I N E ======================================= ROM:0DAA ROM:0DAA ; Подпрограмма главного цикла. ROM:0DAA ROM:0DAA MAINTR5: ; CODE XREF: MAINTR4+4p ROM:0DAA ; MAINTR7p ... ROM:0DAA ROM:0DAA ; FUNCTION CHUNK AT ROM:0E52 SIZE 00000025 BYTES ROM:0DAA ROM:0DAA ora a ROM:0DAB ROM:0DAB loc_DAB: ; DATA XREF: MAINTR5+24o ROM:0DAB mvi c, 0F1h ; 'ё' ROM:0DAD push psw ROM:0DAE lhld STKADDR ; Адрес стека ROM:0DB1 xchg ROM:0DB2 lhld RUNWITHTMP ; Временная переменная оператора RUN с параметром ROM:0DB5 cma ROM:0DB6 mov c, a ROM:0DB7 mvi b, 0FFh ROM:0DB9 dad b ROM:0DBA inx h ROM:0DBB rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:0DBC jc loc_DC6 ROM:0DBF shld RUNWITHTMP ; Временная переменная оператора RUN с параметром ROM:0DC2 inx h ROM:0DC3 xchg ROM:0DC4 pop psw ROM:0DC5 ret ROM:0DC6 ; --------------------------------------------------------------------------- ROM:0DC6 ROM:0DC6 loc_DC6: ; CODE XREF: MAINTR5+12j ROM:0DC6 pop psw ROM:0DC7 mvi e, 1Ah ROM:0DC9 jz MAINLOOP1 ; Первая точка входа в главный цикл ROM:0DCC cmp a ROM:0DCD push psw ROM:0DCE lxi b, loc_DAB+1 ROM:0DD1 push b ROM:0DD2 ROM:0DD2 loc_DD2: ; CODE XREF: ROM:0C8Cp ROM:0DD2 lhld ENDSTRAR ; Конец строковой области ROM:0DD5 ROM:0DD5 loc_DD5: ; CODE XREF: MAINTR5+CAj ROM:0DD5 shld RUNWITHTMP ; Временная переменная оператора RUN с параметром ROM:0DD8 lxi h, 0 ROM:0DDB push h ROM:0DDC lhld STKADDR ; Адрес стека ROM:0DDF push h ROM:0DE0 lxi h, ARIFMOB ; Рабочая область арифметических преобразований ROM:0DE3 ROM:0DE3 loc_DE3: ; DATA XREF: MAINTR5+3Fo ROM:0DE3 xchg ROM:0DE4 lhld ARIFMAR ; Адрес рабочей области арифметических преобразований ROM:0DE7 xchg ROM:0DE8 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:0DE9 lxi b, loc_DE3 ROM:0DEC jnz loc_E2F ROM:0DEF lhld ENBASPRG ; Адрес конца Бейсик программы. ROM:0DEF ; Указывает на первую ячейку участка памяти, доступного программам. ROM:0DEF ; Всегда следует за последним байтом программы. ROM:0DF2 ROM:0DF2 loc_DF2: ; CODE XREF: MAINTR5+58j ROM:0DF2 xchg ROM:0DF3 lhld BGARRAY ; Адрес начала массивов. ROM:0DF3 ; Указывает на начало участка памяти, хранящего массивы. ROM:0DF3 ; Следует сразу за участком памяти, выделенным для обычных переменных. ROM:0DF6 xchg ROM:0DF7 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:0DF8 jz loc_E06 ROM:0DFB mov a, m ROM:0DFC inx h ROM:0DFD inx h ROM:0DFE ora a ROM:0DFF call MACRO2 ROM:0E02 jmp loc_DF2 ROM:0E05 ; --------------------------------------------------------------------------- ROM:0E05 ROM:0E05 loc_E05: ; CODE XREF: MAINTR5+6Cj ROM:0E05 pop b ROM:0E06 ROM:0E06 loc_E06: ; CODE XREF: MAINTR5+4Ej ROM:0E06 ; MAINTR5+7Fj ROM:0E06 xchg ROM:0E07 lhld VAR_TOP ; Адрес начала свободной памяти. ROM:0E07 ; Указывает на верхушку области хранящей массивы и переменные. ROM:0E0A xchg ROM:0E0B rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:0E0C jz loc_E52 ROM:0E0F call FLOADBCDEFROMMEM ; Загружает число с плавающей точкой в BCDE из ячеек памяти, на которые указывает HL. ROM:0E0F ; Т. е. загрузка из M в BCDE ROM:0E12 mov a, e ROM:0E13 push h ROM:0E14 dad b ROM:0E15 ora a ROM:0E16 jp loc_E05 ROM:0E19 shld COMPTMP ; Временная переменная, использующаяся при вычислениях. ROM:0E1C pop h ROM:0E1D mov c, m ROM:0E1E mvi b, 0 ROM:0E20 dad b ROM:0E21 dad b ROM:0E22 inx h ROM:0E23 ROM:0E23 loc_E23: ; DATA XREF: MAINTR5+82o ROM:0E23 xchg ROM:0E24 lhld COMPTMP ; Временная переменная, использующаяся при вычислениях. ROM:0E27 xchg ROM:0E28 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:0E29 jz loc_E06 ROM:0E2C lxi b, loc_E23 ROM:0E2F ROM:0E2F loc_E2F: ; CODE XREF: MAINTR5+42j ROM:0E2F push b ROM:0E30 ori 80h ROM:0E30 ; End of function MAINTR5 ROM:0E30 ROM:0E32 ROM:0E32 ; =============== S U B R O U T I N E ======================================= ROM:0E32 ROM:0E32 ROM:0E32 MACRO2: ; CODE XREF: MAINTR5+55p ROM:0E32 rst 6 ; Псевдокоманда PUSH (HL). ROM:0E32 ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP. ROM:0E32 ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD. ROM:0E33 rst 6 ; Псевдокоманда PUSH (HL). ROM:0E33 ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP. ROM:0E33 ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD. ROM:0E34 pop d ROM:0E35 pop b ROM:0E36 rp ROM:0E37 mov a, c ROM:0E38 ora a ROM:0E39 rz ROM:0E3A ROM:0E3A loc_E3A: ; DATA XREF: DATAo ROM:0E3A mov b, h ROM:0E3B mov c, l ROM:0E3C lhld RUNWITHTMP ; Временная переменная оператора RUN с параметром ROM:0E3F rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:0E40 mov h, b ROM:0E41 mov l, c ROM:0E42 rc ROM:0E43 pop h ROM:0E44 xthl ROM:0E45 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:0E46 xthl ROM:0E47 push h ROM:0E48 mov h, b ROM:0E49 mov l, c ROM:0E4A rnc ROM:0E4B pop b ROM:0E4C pop psw ROM:0E4D pop psw ROM:0E4E push h ROM:0E4F push d ROM:0E50 push b ROM:0E51 ret ROM:0E51 ; End of function MACRO2 ROM:0E51 ROM:0E52 ; --------------------------------------------------------------------------- ROM:0E52 ; START OF FUNCTION CHUNK FOR MAINTR5 ROM:0E52 ROM:0E52 loc_E52: ; CODE XREF: MAINTR5+62j ROM:0E52 pop d ROM:0E53 pop h ROM:0E54 mov a, l ROM:0E55 ora h ROM:0E56 rz ROM:0E57 dcx h ROM:0E58 mov b, m ROM:0E59 dcx h ROM:0E5A mov c, m ROM:0E5B push h ROM:0E5C dcx h ROM:0E5D dcx h ROM:0E5E mov l, m ROM:0E5F mvi h, 0 ROM:0E61 dad b ROM:0E62 mov d, b ROM:0E63 mov e, c ROM:0E64 dcx h ROM:0E65 mov b, h ROM:0E66 mov c, l ROM:0E67 lhld RUNWITHTMP ; Временная переменная оператора RUN с параметром ROM:0E6A call COPYMEMORYUP2 ROM:0E6D pop h ROM:0E6E mov m, c ROM:0E6F inx h ROM:0E70 mov m, b ROM:0E71 mov l, c ROM:0E72 mov h, b ROM:0E73 dcx h ROM:0E74 jmp loc_DD5 ROM:0E74 ; END OF FUNCTION CHUNK FOR MAINTR5 ROM:0E77 ; --------------------------------------------------------------------------- ROM:0E77 ; START OF FUNCTION CHUNK FOR COMPUTE2 ROM:0E77 ROM:0E77 loc_E77: ; CODE XREF: COMPUTE2+48j ROM:0E77 push b ROM:0E78 push h ROM:0E79 lhld FACCUM ; Аккумулятор для вычислений с плавающей точкой: ROM:0E79 ; 00000000 1 11111111111111111111111 ROM:0E79 ; -------- - ----------------------- ROM:0E79 ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:0E7C xthl ROM:0E7D call EVALTERM ; Обработка следующего символа из буфера. ROM:0E7D ; Вычисляет терм в выражении. ROM:0E7D ; Это может быть числовая константа, переменная, вызов функции, также имеющий выражения в своих аргументах или выражения в скобках. ROM:0E80 xthl ROM:0E81 call COMPUTE3+1 ; Вычисление выражений. Вызов из EVALTERM. ROM:0E84 mov a, m ROM:0E85 push h ROM:0E86 lhld FACCUM ; Аккумулятор для вычислений с плавающей точкой: ROM:0E86 ; 00000000 1 11111111111111111111111 ROM:0E86 ; -------- - ----------------------- ROM:0E86 ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:0E89 push h ROM:0E8A add m ROM:0E8B mvi e, 1Ch ROM:0E8D jc MAINLOOP1 ; Первая точка входа в главный цикл ROM:0E90 call MAINTR7 ; Вызов MAINTR5 и переход в MAINTR3 ROM:0E93 pop d ROM:0E94 call FAPREP3 ; Подготовка FACCUM, ARIFMAR. ROM:0E94 ; Дополнительная точка входа. ROM:0E97 xthl ROM:0E98 call FAPREP2 ; Подготовка FACCUM, ARIFMAR. ROM:0E98 ; Дополнительная точка входа. ROM:0E9B push h ROM:0E9C lhld CHARTBL ; Таблица символов функции CHR ROM:0E9F xchg ROM:0EA0 call MACRO3 ROM:0EA3 call MACRO3 ROM:0EA6 lxi h, loc_986 ROM:0EA9 xthl ROM:0EAA push h ROM:0EAB jmp loc_D75 ROM:0EAB ; END OF FUNCTION CHUNK FOR COMPUTE2 ROM:0EAE ROM:0EAE ; =============== S U B R O U T I N E ======================================= ROM:0EAE ROM:0EAE ROM:0EAE MACRO3: ; CODE XREF: COMPUTE2+528p ROM:0EAE ; COMPUTE2+52Bp ROM:0EAE pop h ROM:0EAF xthl ROM:0EB0 rst 6 ; Псевдокоманда PUSH (HL). ROM:0EB0 ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP. ROM:0EB0 ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD. ROM:0EB1 rst 6 ; Псевдокоманда PUSH (HL). ROM:0EB1 ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP. ROM:0EB1 ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD. ROM:0EB2 pop b ROM:0EB3 pop h ROM:0EB3 ; End of function MACRO3 ROM:0EB3 ROM:0EB4 ROM:0EB4 ; =============== S U B R O U T I N E ======================================= ROM:0EB4 ROM:0EB4 ; Проверка L, загрузка в A из (BC), выгрузка в (DE) в цикле ROM:0EB4 ROM:0EB4 MAINTR6: ; CODE XREF: MAINTR4+Fp ROM:0EB4 ; ROM:0F3Ap ... ROM:0EB4 inr l ROM:0EB5 ROM:0EB5 loc_EB5: ; CODE XREF: MAINTR6+7j ROM:0EB5 dcr l ROM:0EB6 rz ROM:0EB7 ldax b ROM:0EB8 stax d ROM:0EB9 inx b ROM:0EBA inx d ROM:0EBB jmp loc_EB5 ROM:0EBB ; End of function MAINTR6 ROM:0EBB ROM:0EBE ROM:0EBE ; =============== S U B R O U T I N E ======================================= ROM:0EBE ROM:0EBE ; Подпрограмма вычисления выражений. ROM:0EBE ROM:0EBE COMPUTETR2: ; CODE XREF: COMPUTETR3p ROM:0EBE ; COMPUTETR1+4p ROM:0EBE call COMPUTE3+1 ; Вычисление выражений. Вызов из EVALTERM. ROM:0EBE ; End of function COMPUTETR2 ROM:0EBE ROM:0EC1 ROM:0EC1 ; =============== S U B R O U T I N E ======================================= ROM:0EC1 ROM:0EC1 ; Подготовка FACCUM, ARIFMAR ROM:0EC1 ROM:0EC1 FAPREP: ; CODE XREF: ROM:0AC7p ROM:0EC1 ; ROM:0C89p ... ROM:0EC1 lhld FACCUM ; Аккумулятор для вычислений с плавающей точкой: ROM:0EC1 ; End of function FAPREP ; 00000000 1 11111111111111111111111 ROM:0EC1 ; -------- - ----------------------- ROM:0EC1 ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:0EC4 ROM:0EC4 ; =============== S U B R O U T I N E ======================================= ROM:0EC4 ROM:0EC4 ; Подготовка FACCUM, ARIFMAR. ROM:0EC4 ; Дополнительная точка входа. ROM:0EC4 ROM:0EC4 FAPREP2: ; CODE XREF: COMPUTE2+520p ROM:0EC4 xchg ROM:0EC4 ; End of function FAPREP2 ROM:0EC4 ROM:0EC5 ROM:0EC5 ; =============== S U B R O U T I N E ======================================= ROM:0EC5 ROM:0EC5 ; Подготовка FACCUM, ARIFMAR. ROM:0EC5 ; Дополнительная точка входа. ROM:0EC5 ROM:0EC5 FAPREP3: ; CODE XREF: LET+39p ROM:0EC5 ; ROM:0ACDp ... ROM:0EC5 lhld ARIFMAR ; Адрес рабочей области арифметических преобразований ROM:0EC8 dcx h ROM:0EC9 mov b, m ROM:0ECA dcx h ROM:0ECB mov c, m ROM:0ECC dcx h ROM:0ECD dcx h ROM:0ECE rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:0ECF xchg ROM:0ED0 rnz ROM:0ED1 shld ARIFMAR ; Адрес рабочей области арифметических преобразований ROM:0ED4 push d ROM:0ED5 mov d, b ROM:0ED6 mov e, c ROM:0ED7 dcx d ROM:0ED8 mov c, m ROM:0ED9 lhld RUNWITHTMP ; Временная переменная оператора RUN с параметром ROM:0EDC rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:0EDD jnz loc_EE5 ROM:0EE0 mov b, a ROM:0EE1 dad b ROM:0EE2 shld RUNWITHTMP ; Временная переменная оператора RUN с параметром ROM:0EE5 ROM:0EE5 loc_EE5: ; CODE XREF: FAPREP3+18j ROM:0EE5 pop h ROM:0EE6 ret ROM:0EE6 ; End of function FAPREP3 ROM:0EE6 ROM:0EE7 ; --------------------------------------------------------------------------- ROM:0EE7 ROM:0EE7 LEN: ; Бейсик-функция LEN ROM:0EE7 lxi b, SHORTINT ROM:0EEA push b ROM:0EEB ROM:0EEB ; =============== S U B R O U T I N E ======================================= ROM:0EEB ROM:0EEB ; Подпрограмма вычисления выражений. ROM:0EEB ROM:0EEB COMPUTETR3: ; CODE XREF: ROM:ASCp ROM:0EEB ; ROM:VALp ROM:0EEB call COMPUTETR2 ; Подпрограмма вычисления выражений. ROM:0EEE xra a ROM:0EEF mov d, a ROM:0EF0 sta LETTMP ; Временная переменная оператора LET, EVALTERM, COMPUTE, GETVAR ROM:0EF3 mov a, m ROM:0EF4 ora a ROM:0EF5 ret ROM:0EF5 ; End of function COMPUTETR3 ROM:0EF5 ROM:0EF6 ; --------------------------------------------------------------------------- ROM:0EF6 ROM:0EF6 ASC: ; Бейсик-функция ASC ROM:0EF6 call COMPUTETR3 ROM:0EF9 jz FUNCTIONCALLERROR ; Ошибка вызова функции ROM:0EFC inx h ROM:0EFD inx h ROM:0EFE rst 6 ; Псевдокоманда PUSH (HL). ROM:0EFE ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP. ROM:0EFE ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD. ROM:0EFF pop h ROM:0F00 mov a, m ROM:0F01 jmp SHORTINT ; Получение короткого целого из A ROM:0F04 ; --------------------------------------------------------------------------- ROM:0F04 ROM:0F04 CHR: ; Бейсик-функция CHR ROM:0F04 mvi a, 1 ROM:0F06 call MAINTR7 ; Вызов MAINTR5 и переход в MAINTR3 ROM:0F09 call loc_FBC ROM:0F0C lhld CHARTBL ; Таблица символов функции CHR ROM:0F0F mov m, e ROM:0F10 ROM:0F10 loc_F10: ; CODE XREF: ROM:1999j ROM:0F10 ; DATA XREF: ROM:0D2Bo ROM:0F10 pop b ROM:0F11 jmp loc_D75 ROM:0F14 ; --------------------------------------------------------------------------- ROM:0F14 ROM:0F14 LEFT: ; Бейсик-функция LEFT ROM:0F14 call FUNKQUOTE ROM:0F17 xra a ROM:0F18 ROM:0F18 loc_F18: ; CODE XREF: ROM:0F4Bj ROM:0F18 xthl ROM:0F19 mov c, a ROM:0F1A ROM:0F1A loc_F1A: ; DATA XREF: ROM:0F64o ROM:0F1A push h ROM:0F1B mov a, m ROM:0F1C cmp b ROM:0F1D jc loc_F21+1 ; loc_F21+1:MVI C,0 ROM:0F20 mov a, b ROM:0F21 ROM:0F21 loc_F21: ; CODE XREF: ROM:0F1Dj ROM:0F21 lxi d, 0Eh ROM:0F24 push b ROM:0F25 call MAINTR5 ; Подпрограмма главного цикла. ROM:0F28 pop b ROM:0F29 pop h ROM:0F2A push h ROM:0F2B inx h ROM:0F2C inx h ROM:0F2D mov b, m ROM:0F2E inx h ROM:0F2F mov h, m ROM:0F30 mov l, b ROM:0F31 mvi b, 0 ROM:0F33 dad b ROM:0F34 mov b, h ROM:0F35 mov c, l ROM:0F36 call MAINTR3 ; Сохранение A в MAINTR2TMP ROM:0F39 mov l, a ROM:0F3A call MAINTR6 ; Проверка L, загрузка в A из (BC), выгрузка в (DE) в цикле ROM:0F3D pop d ROM:0F3E call FAPREP3 ; Подготовка FACCUM, ARIFMAR. ROM:0F3E ; Дополнительная точка входа. ROM:0F41 jmp loc_D75 ROM:0F44 ; --------------------------------------------------------------------------- ROM:0F44 ROM:0F44 RIGHT: ; Бейсик-функция RIGHT ROM:0F44 call FUNKQUOTE ROM:0F47 pop d ROM:0F48 push d ROM:0F49 ldax d ROM:0F4A sub b ROM:0F4B jmp loc_F18 ROM:0F4E ; --------------------------------------------------------------------------- ROM:0F4E ROM:0F4E MID: ; Бейсик-функция MID ROM:0F4E xchg ROM:0F4F mov a, m ROM:0F50 call loc_FA2 ROM:0F53 push b ROM:0F54 mvi e, 0FFh ROM:0F56 cpi 29h ; ')' ROM:0F58 jz loc_F60 ROM:0F5B rst 1 ; RST1 = проверка синтаксиса. ROM:0F5B ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:0F5B ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:0F5B ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:0F5B ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:0F5B ; --------------------------------------------------------------------------- ROM:0F5C .db ',' ROM:0F5D ; --------------------------------------------------------------------------- ROM:0F5D call GETINTPARAM ; Получаем в A целочисленный параметр для команды Бейсика ROM:0F60 ROM:0F60 loc_F60: ; CODE XREF: ROM:0F58j ROM:0F60 rst 1 ; RST1 = проверка синтаксиса. ROM:0F60 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:0F60 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:0F60 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:0F60 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:0F60 ; --------------------------------------------------------------------------- ROM:0F61 .db ')' ROM:0F62 ; --------------------------------------------------------------------------- ROM:0F62 pop psw ROM:0F63 xthl ROM:0F64 lxi b, loc_F1A ROM:0F67 push b ROM:0F68 dcr a ROM:0F69 cmp m ROM:0F6A mvi b, 0 ROM:0F6C rnc ROM:0F6D mov c, a ROM:0F6E mov a, m ROM:0F6F sub c ROM:0F70 cmp e ROM:0F71 mov b, a ROM:0F72 rc ROM:0F73 mov b, e ROM:0F74 ret ROM:0F75 ; --------------------------------------------------------------------------- ROM:0F75 ROM:0F75 INP: ; Бейсик-функция INP ROM:0F75 call loc_FBC ROM:0F78 call loc_F84D ROM:0F7B nop ROM:0F7C nop ROM:0F7D jmp SHORTINT ; Получение короткого целого из A ROM:0F80 ; --------------------------------------------------------------------------- ROM:0F80 ROM:0F80 OUT: ; Бейсик-оператор OUT ROM:0F80 call loc_FAC ROM:0F83 jmp loc_F853 ROM:0F86 ; --------------------------------------------------------------------------- ROM:0F86 call loc_FAC ROM:0F89 push psw ROM:0F8A mvi e, 0 ROM:0F8C dcx h ROM:0F8D rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:0F8D ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:0F8D ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:0F8E jz loc_F96 ROM:0F91 rst 1 ; RST1 = проверка синтаксиса. ROM:0F91 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:0F91 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:0F91 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:0F91 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:0F91 ; --------------------------------------------------------------------------- ROM:0F92 .db ',' ROM:0F93 ; --------------------------------------------------------------------------- ROM:0F93 call GETINTPARAM ; Получаем в A целочисленный параметр для команды Бейсика ROM:0F96 ROM:0F96 loc_F96: ; CODE XREF: ROM:0F8Ej ROM:0F96 pop b ROM:0F97 ROM:0F97 loc_F97: ; CODE XREF: ROM:0F9Bj ROM:0F97 in 0 ROM:0F99 xra e ROM:0F9A ana b ROM:0F9B jz loc_F97 ROM:0F9E ret ROM:0F9F ROM:0F9F ; =============== S U B R O U T I N E ======================================= ROM:0F9F ROM:0F9F ; Проверка окончания определения функции. ROM:0F9F ROM:0F9F FUNKQUOTE: ; CODE XREF: ROM:LEFTp ROM:0F9F ; ROM:RIGHTp ROM:0F9F xchg ROM:0FA0 rst 1 ; RST1 = проверка синтаксиса. ROM:0FA0 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:0FA0 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:0FA0 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:0FA0 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:0FA0 ; --------------------------------------------------------------------------- ROM:0FA1 .db ')' ROM:0FA2 ; --------------------------------------------------------------------------- ROM:0FA2 ROM:0FA2 loc_FA2: ; CODE XREF: ROM:0F50p ROM:0FA2 pop b ROM:0FA3 pop d ROM:0FA4 push b ROM:0FA5 mov b, e ROM:0FA6 inr b ROM:0FA7 dcr b ROM:0FA8 jz FUNCTIONCALLERROR ; Ошибка вызова функции ROM:0FAB ret ROM:0FAB ; End of function FUNKQUOTE ROM:0FAB ROM:0FAC ; --------------------------------------------------------------------------- ROM:0FAC ROM:0FAC loc_FAC: ; CODE XREF: ROM:OUTp ROM:0FAC ; ROM:0F86p ROM:0FAC call GETINTPARAM ; Получаем в A целочисленный параметр для команды Бейсика ROM:0FAF sta loc_F850+1 ROM:0FB2 sta loc_F853+1 ROM:0FB5 rst 1 ; RST1 = проверка синтаксиса. ROM:0FB5 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:0FB5 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:0FB5 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:0FB5 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:0FB5 ; --------------------------------------------------------------------------- ROM:0FB6 .db ',' ROM:0FB7 .db 6 ROM:0FB8 ; --------------------------------------------------------------------------- ROM:0FB8 ROM:0FB8 loc_FB8: ; CODE XREF: ROM:0809p ROM:0FB8 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:0FB8 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:0FB8 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:0FB9 ROM:0FB9 ; =============== S U B R O U T I N E ======================================= ROM:0FB9 ROM:0FB9 ; Получаем в A целочисленный параметр для команды Бейсика ROM:0FB9 ROM:0FB9 GETINTPARAM: ; CODE XREF: ROM:062Bp ROM:0FB9 ; ROM:loc_75Cp ... ROM:0FB9 call EVALEXPRESSION ; Вычисляет выражение, возвращая результат в FACCUM. Выражение должно быть комбинацией термов и операторов. ROM:0FBC ROM:0FBC loc_FBC: ; CODE XREF: ROM:0F09p ROM:0FBC ; ROM:INPp ... ROM:0FBC call FUNCTIONAK ; Проверка результата функции. ROM:0FBF mov a, d ROM:0FC0 ora a ROM:0FC1 jnz FUNCTIONCALLERROR ; Ошибка вызова функции ROM:0FC4 dcx h ROM:0FC5 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:0FC5 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:0FC5 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:0FC6 mov a, e ROM:0FC7 ret ROM:0FC7 ; End of function GETINTPARAM ROM:0FC7 ROM:0FC8 ; --------------------------------------------------------------------------- ROM:0FC8 ROM:0FC8 VAL: ; Бейсик-функция VAL ROM:0FC8 call COMPUTETR3 ROM:0FCB jz FZERO ; Устанавливает FACCUM в ноль. ROM:0FCE mov e, a ROM:0FCF inx h ROM:0FD0 inx h ROM:0FD1 rst 6 ; Псевдокоманда PUSH (HL). ROM:0FD1 ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP. ROM:0FD1 ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD. ROM:0FD2 mov h, b ROM:0FD3 mov l, c ROM:0FD4 dad d ROM:0FD5 mov b, m ROM:0FD6 mov m, d ROM:0FD7 xthl ROM:0FD8 push b ROM:0FD9 mov a, m ROM:0FDA call BINHEX ; Обработчик двоичных и шестнадцатеричных чисел в VAL ROM:0FDD pop b ROM:0FDE pop h ROM:0FDF mov m, b ROM:0FE0 ret ROM:0FE1 ROM:0FE1 ; =============== S U B R O U T I N E ======================================= ROM:0FE1 ROM:0FE1 ; Подпрограмма работы с лентой. Подготовка к загрузке. ROM:0FE1 ROM:0FE1 TAPE: ; CODE XREF: ROM:1034p ROM:0FE1 ; ROM:loc_1040p ... ROM:0FE1 mov a, m ROM:0FE2 xri 95h ROM:0FE4 sta CASCMP ; Флаг сравнения ROM:0FE7 jnz TAPE2 ; Локальная метка TAPE. Подготовка к выгрузке. ROM:0FEA inx h ROM:0FEB ROM:0FEB TAPE2: ; CODE XREF: TAPE+6j ROM:0FEB ; ROM:SAVEp ... ROM:0FEB xchg ; Локальная метка TAPE. Подготовка к выгрузке. ROM:0FEC lxi h, 2020h ROM:0FEF shld STRNL ; Адрес строки выводимой на печать подпрограммой STRPRN ROM:0FF2 shld TAPETMP ; Временная переменная процедуры TAPE ROM:0FF5 shld TAPETMP2 ; Временная переменная процедуры TAPE ROM:0FF8 xchg ROM:0FF9 call COMPUTETR1 ; Подпрограмма вычисления выражений. ROM:0FFC mvi a, 6 ROM:0FFE push h ROM:0FFF mov l, e ROM:1000 lxi d, STRNL ; Адрес строки выводимой на печать подпрограммой STRPRN ROM:1003 call MACRO13 ROM:1006 pop h ROM:1007 ret ROM:1007 ; End of function TAPE ROM:1007 ROM:1008 ROM:1008 ; =============== S U B R O U T I N E ======================================= ROM:1008 ROM:1008 ROM:1008 MACRO13: ; CODE XREF: TAPE+22p ROM:1008 ; ROM:1B22p ROM:1008 cmp l ROM:1009 jc loc_100D ROM:100C mov a, l ROM:100D ROM:100D loc_100D: ; CODE XREF: MACRO13+1j ROM:100D push h ROM:100E mov l, a ROM:100F push psw ROM:1010 call MAINTR6 ; Проверка L, загрузка в A из (BC), выгрузка в (DE) в цикле ROM:1013 pop psw ROM:1014 pop h ROM:1015 ret ROM:1015 ; End of function MACRO13 ROM:1015 ROM:1016 ROM:1016 ; =============== S U B R O U T I N E ======================================= ROM:1016 ROM:1016 ROM:1016 MACRO4: ; CODE XREF: ROM:18B0p ROM:1016 ; ROM:19F1p ... ROM:1016 mov a, h ROM:1017 cma ROM:1018 mov h, a ROM:1019 mov a, l ROM:101A cma ROM:101B mov l, a ROM:101C inx h ROM:101D dad d ROM:101E mov b, h ROM:101F mov c, l ROM:1020 ret ROM:1020 ; End of function MACRO4 ROM:1020 ROM:1021 ; --------------------------------------------------------------------------- ROM:1021 ; START OF FUNCTION CHUNK FOR CHECKENOUGHMEM ROM:1021 ROM:1021 SYNTAXERROR2: ; CODE XREF: CHECKENOUGHMEM+2FFj ROM:1021 cpi 56h ; 'V' ROM:1023 ROM:1023 loc_1023: ; CODE XREF: ROM:1038j ROM:1023 jc SYNTAXERROR ; Самая распространённая ошибка №2 ROM:1026 cpi 75h ; 'u' ROM:1028 jnc SYNTAXERROR ; Самая распространённая ошибка №2 ROM:102B sui 11h ROM:102D jmp loc_5BD ROM:102D ; END OF FUNCTION CHUNK FOR CHECKENOUGHMEM ROM:102D ; --------------------------------------------------------------------------- ROM:1030 L_1030: .db 10h ROM:1031 ; --------------------------------------------------------------------------- ROM:1031 ROM:1031 L_1031: ; Инициализация переменных. ROM:1031 lxi h, INITKEYS+48h ; Этот блок переностися в ОЗУ по адресу &hF8F0 ROM:1034 call TAPE ; Подпрограмма работы с лентой. Подготовка к загрузке. ROM:1037 cmp m ROM:1038 jnz loc_1023 ROM:103B lhld BGBASPRG ; Адрес начала Бейсик программы ROM:103E ROM:103E loc_103E: ; CODE XREF: ROM:104Aj ROM:103E mvi b, 4 ROM:1040 ROM:1040 loc_1040: ; CODE XREF: ROM:104Ej ROM:1040 call TAPE ; Подпрограмма работы с лентой. Подготовка к загрузке. ROM:1043 mov m, a ROM:1044 call CHECKENOUGHMEM ; Проверяет, действительно ли HL больше, чем на 32 байта отстоит от указателя стека. ROM:1044 ; Если HL расположен ближе чем на 32 байта к стеку, то функция падает в OutOfMemory. ROM:1047 mov a, m ROM:1048 ora a ROM:1049 inx h ROM:104A jnz loc_103E ROM:104D dcr b ROM:104E jnz loc_1040 ROM:1051 shld ENBASPRG ; Адрес конца Бейсик программы. ROM:1051 ; Указывает на первую ячейку участка памяти, доступного программам. ROM:1051 ; Всегда следует за последним байтом программы. ROM:1054 lxi h, aOk ; "\n\nOk\r\n" ROM:1057 call MAINTR ; Подпрограмма главного цикла ROM:105A jmp loc_368 ROM:105D ; --------------------------------------------------------------------------- ROM:105D call FUNCTIONAK ; Проверка результата функции. ROM:1060 ldax d ROM:1061 jmp SHORTINT ; Получение короткого целого из A ROM:1064 ; --------------------------------------------------------------------------- ROM:1064 call loc_642 ROM:1067 ROM:1067 loc_1067: ; CODE XREF: ROM:1733j ROM:1067 ; ROM:1A92j ROM:1067 push d ROM:1068 rst 1 ; RST1 = проверка синтаксиса. ROM:1068 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:1068 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:1068 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:1068 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:1068 ; --------------------------------------------------------------------------- ROM:1069 .db ',' ; Ожидаем появление запятой ROM:106A ; --------------------------------------------------------------------------- ROM:106A call GETINTPARAM ; Получаем в A целочисленный параметр для команды Бейсика ROM:106D pop d ROM:106E stax d ; А тут собственно и происходит POKE. ROM:106E ; В DE - адрес, в A - байт ROM:106F ret ROM:1070 ROM:1070 ; =============== S U B R O U T I N E ======================================= ROM:1070 ROM:1070 ; Прибавляет 0.5 к FACCUM. ROM:1070 ; Используется DECIMAL_POWERS ROM:1070 ROM:1070 FADDONEHALF: ; CODE XREF: PRINTINT2:PREPARETOPRINTp ROM:1070 ; SIN+27p ROM:1070 lxi h, DECIMAL_POWERS ROM:1073 ROM:1073 loc_1073: ; CODE XREF: NEXT2+17p ROM:1073 ; ROM:15BBp ... ROM:1073 call FLOADBCDEFROMMEM ; Загружает число с плавающей точкой в BCDE из ячеек памяти, на которые указывает HL. ROM:1073 ; Т. е. загрузка из M в BCDE ROM:1076 jmp FADD2 ; FACCUM = FACCUM + BCDEONSTK ROM:1076 ; End of function FADDONEHALF ROM:1076 ROM:1079 ROM:1079 ; =============== S U B R O U T I N E ======================================= ROM:1079 ROM:1079 ; FACCUM = FACCUM - BCDEONSTK ROM:1079 ROM:1079 FSUB2: ; CODE XREF: ROM:119Dp ROM:1079 ; SIN+1Fp ROM:1079 ; DATA XREF: ... ROM:1079 call FLOADBCDEFROMMEM ; Загружает число с плавающей точкой в BCDE из ячеек памяти, на которые указывает HL. ROM:1079 ; Т. е. загрузка из M в BCDE ROM:107C ROM:107C loc_107C: ; DATA XREF: ROM:17A1o ROM:107C lxi h, 0D1C1h ; FACCUM = FACCUM - BCDEONSTK ROM:107C ; ROM:107C ; 107D:FSUB:POP B ROM:107C ; POP D ROM:107F ROM:107F loc_107F: ; CODE XREF: ROM:15C5p ROM:107F ; SIN+19p ROM:107F call FNEGATE ; Меняет знак FACCUM. FACCUM=-FACCUM ROM:107F ; End of function FSUB2 ROM:107F ROM:1082 ROM:1082 ; =============== S U B R O U T I N E ======================================= ROM:1082 ROM:1082 ; FACCUM = FACCUM + BCDEONSTK ROM:1082 ROM:1082 FADD2: ; CODE XREF: FADDONEHALF+6j ROM:1082 ; ROM:1191p ... ROM:1082 ROM:1082 ; FUNCTION CHUNK AT ROM:10ED SIZE 0000002D BYTES ROM:1082 ROM:1082 mov a, b ROM:1083 ora a ROM:1084 rz ROM:1085 lda FACCUM+3 ; Аккумулятор для вычислений с плавающей точкой: ROM:1085 ; 00000000 1 11111111111111111111111 ROM:1085 ; -------- - ----------------------- ROM:1085 ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:1088 ora a ROM:1089 jz FLOADFROMBCDE ; Загружает число в FACCUM из BCDE. ROM:108C sub b ROM:108D jnc loc_109C ROM:1090 cma ROM:1091 inr a ROM:1092 xchg ROM:1093 call FPUSH ; Записывает число с плавающей точкой на стек. ROM:1096 xchg ROM:1097 call FLOADFROMBCDE ; Загружает число в FACCUM из BCDE. ROM:109A pop b ROM:109B pop d ROM:109C ROM:109C loc_109C: ; CODE XREF: FADD2+Bj ROM:109C cpi 19h ROM:109E rnc ROM:109F push psw ROM:10A0 call FUNPACKMANTISSAS ; Распаковывает мантиссы FACCUM и BCDE. Восстанавливает пропавший старший бит, но при этом теряет бит знака у обоих упакованных чисел. ROM:10A0 ; Для компенсации потери знакового бита функция возвращает комбинацию обоих знаковых битов. Функция меняет знак FACCUM и потом ксорит его со знаком BCDE и возвращает результат в 7-м бите A. ROM:10A0 ; В результате в A появляется +ve если знаковые биты разные и -ve если знаковые биты совпадают: ROM:10A0 ; ROM:10A0 ; FACCUM | negated FACCUM | BCDE | result after XOR ROM:10A0 ; + - + - ROM:10A0 ; + - - + ROM:10A0 ; - + + + ROM:10A0 ; - + - - ROM:10A3 mov h, a ROM:10A4 pop psw ROM:10A5 call FMANTISSARTMULT ; Сдвигает мантиссу в CDE вправо на A позиций. ROM:10A5 ; Заметьте, что потеряные биты накапливаются в B, так что их можно использовать далее при округлении. ROM:10A8 ora h ROM:10A9 lxi h, FACCUM ; Аккумулятор для вычислений с плавающей точкой: ROM:10A9 ; 00000000 1 11111111111111111111111 ROM:10A9 ; -------- - ----------------------- ROM:10A9 ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:10AC jp FSUBMANTISSAS ; Вычитает из мантиссы FACCUM мантиссу BCDEONSTK ROM:10AF call FADDMANTISSAS ; Складывает мантиссы, на первую указывает HL вторая содержится в CDE. ROM:10B2 jnc loc_1108 ROM:10B5 inx h ROM:10B6 inr m ROM:10B7 jz OVERFLOW ; Ошибка переполнения. ROM:10BA mvi l, 1 ROM:10BC call FMANTISSARTONCE ; Сдвигает мантиссу в CDE вправо на один бит. ROM:10BF jmp loc_1108 ROM:10C2 ; --------------------------------------------------------------------------- ROM:10C2 ROM:10C2 FSUBMANTISSAS: ; CODE XREF: FADD2+2Aj ROM:10C2 xra a ; Вычитает из мантиссы FACCUM мантиссу BCDEONSTK ROM:10C3 sub b ROM:10C4 mov b, a ROM:10C5 mov a, m ROM:10C6 sbb e ROM:10C7 mov e, a ROM:10C8 inx h ROM:10C9 mov a, m ROM:10CA sbb d ROM:10CB mov d, a ROM:10CC inx h ROM:10CD mov a, m ROM:10CE sbb c ROM:10CF mov c, a ROM:10D0 ROM:10D0 loc_10D0: ; CODE XREF: LONGINT2+Bj ROM:10D0 ; INT+14p ROM:10D0 cc FNEGATEINT ; Меняет знак у 32-битного целого, содержащегося в CDEB путем вычитания его из нуля. ROM:10D0 ; Также переворачивает знак у FTEMP. ROM:10D0 ; Используется FASINTEGER и FADD2. ROM:10D3 ROM:10D3 loc_10D3: ; CODE XREF: ROM:1653p ROM:10D3 ; DATA XREF: FMUL3+14o ROM:10D3 mov l, b ROM:10D4 mov h, e ROM:10D5 xra a ROM:10D6 ROM:10D6 loc_10D6: ; CODE XREF: FADD2+63j ROM:10D6 mov b, a ROM:10D7 mov a, c ROM:10D8 ora a ROM:10D9 jnz loc_10F5 ROM:10DC mov c, d ROM:10DD mov d, h ROM:10DE mov h, l ROM:10DF mov l, a ROM:10E0 mov a, b ROM:10E1 sui 8 ROM:10E3 cpi 0E0h ; 'р' ROM:10E5 jnz loc_10D6 ROM:10E5 ; End of function FADD2 ROM:10E5 ROM:10E8 ROM:10E8 ; =============== S U B R O U T I N E ======================================= ROM:10E8 ROM:10E8 ; Устанавливает FACCUM в ноль. ROM:10E8 ROM:10E8 FZERO: ; CODE XREF: ROM:0FCBj ROM:10E8 ; FADD2+82j ... ROM:10E8 xra a ROM:10E9 ROM:10E9 loc_10E9: ; CODE XREF: ROM:1565j ROM:10E9 sta FACCUM+3 ; Аккумулятор для вычислений с плавающей точкой: ROM:10E9 ; 00000000 1 11111111111111111111111 ROM:10E9 ; -------- - ----------------------- ROM:10E9 ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:10EC ret ROM:10EC ; End of function FZERO ROM:10EC ROM:10ED ; --------------------------------------------------------------------------- ROM:10ED ; START OF FUNCTION CHUNK FOR FADD2 ROM:10ED ROM:10ED loc_10ED: ; CODE XREF: FADD2:loc_10F5j ROM:10ED dcr b ROM:10EE dad h ROM:10EF mov a, d ROM:10F0 ral ROM:10F1 mov d, a ROM:10F2 mov a, c ROM:10F3 adc a ROM:10F4 mov c, a ROM:10F5 ROM:10F5 loc_10F5: ; CODE XREF: FADD2+57j ROM:10F5 jp loc_10ED ROM:10F8 mov a, b ROM:10F9 mov e, h ROM:10FA mov b, l ROM:10FB ora a ROM:10FC jz loc_1108 ROM:10FF lxi h, FACCUM+3 ; Аккумулятор для вычислений с плавающей точкой: ROM:10FF ; 00000000 1 11111111111111111111111 ROM:10FF ; -------- - ----------------------- ROM:10FF ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:1102 add m ROM:1103 mov m, a ROM:1104 jnc FZERO ; Устанавливает FACCUM в ноль. ROM:1107 rz ROM:1108 ROM:1108 loc_1108: ; CODE XREF: FADD2+30j ROM:1108 ; FADD2+3Dj ... ROM:1108 mov a, b ROM:1109 ROM:1109 loc_1109: ; CODE XREF: ROM:1260j ROM:1109 lxi h, FACCUM+3 ; Аккумулятор для вычислений с плавающей точкой: ROM:1109 ; 00000000 1 11111111111111111111111 ROM:1109 ; -------- - ----------------------- ROM:1109 ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:110C ora a ROM:110D cm FMANTISSAINC ; Увелививает мантиссу в CDE и смотрит, нет ли переполнения. ROM:1110 mov b, m ROM:1111 inx h ROM:1112 mov a, m ROM:1113 ani 80h ROM:1115 xra c ROM:1116 mov c, a ROM:1117 jmp FLOADFROMBCDE ; Загружает число в FACCUM из BCDE. ROM:1117 ; END OF FUNCTION CHUNK FOR FADD2 ROM:111A ROM:111A ; =============== S U B R O U T I N E ======================================= ROM:111A ROM:111A ; Увелививает мантиссу в CDE и смотрит, нет ли переполнения. ROM:111A ROM:111A FMANTISSAINC: ; CODE XREF: FADD2+8Bp ROM:111A ; FASINTEGER+1Ap ROM:111A inr e ROM:111B rnz ROM:111C inr d ROM:111D rnz ROM:111E inr c ROM:111F rnz ROM:1120 mvi c, 80h ; 'А' ROM:1122 inr m ROM:1123 rnz ROM:1124 ROM:1124 OVERFLOW: ; CODE XREF: FADD2+35j ROM:1124 ; ROM:1287j ... ROM:1124 mvi e, 0Ah ; Ошибка переполнения. ROM:1126 jmp MAINLOOP1 ; Первая точка входа в главный цикл ROM:1126 ; End of function FMANTISSAINC ROM:1126 ROM:1129 ROM:1129 ; =============== S U B R O U T I N E ======================================= ROM:1129 ROM:1129 ; Складывает мантиссы, на первую указывает HL вторая содержится в CDE. ROM:1129 ROM:1129 FADDMANTISSAS: ; CODE XREF: FADD2+2Dp ROM:1129 ; PRINTINT2+83p ROM:1129 mov a, m ROM:112A add e ROM:112B mov e, a ROM:112C inx h ROM:112D mov a, m ROM:112E adc d ROM:112F mov d, a ROM:1130 inx h ROM:1131 mov a, m ROM:1132 adc c ROM:1133 mov c, a ROM:1134 ret ROM:1134 ; End of function FADDMANTISSAS ROM:1134 ROM:1135 ROM:1135 ; =============== S U B R O U T I N E ======================================= ROM:1135 ROM:1135 ; Меняет знак у 32-битного целого, содержащегося в CDEB путем вычитания его из нуля. ROM:1135 ; Также переворачивает знак у FTEMP. ROM:1135 ; Используется FASINTEGER и FADD2. ROM:1135 ROM:1135 FNEGATEINT: ; CODE XREF: FADD2:loc_10D0p ROM:1135 ; FASINTEGER+1Fp ROM:1135 lxi h, FTEMP ; Временная переменная, используемая для хранения знака и экспоненты числа с плавающей точкой во время вычислений. ROM:1138 mov a, m ; FTEMP ROM:1139 cma ROM:113A mov m, a ROM:113B xra a ROM:113C mov l, a ROM:113D sub b ROM:113E mov b, a ROM:113F mov a, l ROM:1140 sbb e ROM:1141 mov e, a ROM:1142 mov a, l ROM:1143 sbb d ROM:1144 mov d, a ROM:1145 mov a, l ROM:1146 sbb c ROM:1147 mov c, a ROM:1148 ret ROM:1148 ; End of function FNEGATEINT ROM:1148 ROM:1149 ROM:1149 ; =============== S U B R O U T I N E ======================================= ROM:1149 ROM:1149 ; Сдвигает мантиссу в CDE вправо на A позиций. ROM:1149 ; Заметьте, что потеряные биты накапливаются в B, так что их можно использовать далее при округлении. ROM:1149 ROM:1149 FMANTISSARTMULT: ; CODE XREF: FADD2+23p ROM:1149 ; FASINTEGER+15p ROM:1149 mvi b, 0 ROM:114B ROM:114B loc_114B: ; CODE XREF: FMANTISSARTMULT+Cj ROM:114B sui 8 ROM:114D jc loc_1158 ROM:1150 mov b, e ROM:1151 mov e, d ROM:1152 mov d, c ROM:1153 mvi c, 0 ROM:1155 jmp loc_114B ROM:1158 ; --------------------------------------------------------------------------- ROM:1158 ROM:1158 loc_1158: ; CODE XREF: FMANTISSARTMULT+4j ROM:1158 adi 9 ROM:115A mov l, a ROM:115B ROM:115B loc_115B: ; CODE XREF: FMANTISSARTONCE+Bj ROM:115B xra a ROM:115C dcr l ROM:115D rz ROM:115E mov a, c ROM:115E ; End of function FMANTISSARTMULT ROM:115E ROM:115F ROM:115F ; =============== S U B R O U T I N E ======================================= ROM:115F ROM:115F ; Сдвигает мантиссу в CDE вправо на один бит. ROM:115F ROM:115F FMANTISSARTONCE: ; CODE XREF: FADD2+3Ap ROM:115F rar ROM:1160 mov c, a ROM:1161 mov a, d ROM:1162 rar ROM:1163 mov d, a ROM:1164 mov a, e ROM:1165 rar ROM:1166 mov e, a ROM:1167 mov a, b ROM:1168 rar ROM:1169 mov b, a ROM:116A jmp loc_115B ROM:116A ; End of function FMANTISSARTONCE ROM:116A ROM:116D ; --------------------------------------------------------------------------- ROM:116D ROM:116D loc_116D: ; DATA XREF: ROM:119Ao ROM:116D ; ROM:15B8o ROM:116D nop ROM:116E nop ROM:116F nop ROM:1170 add c ROM:1171 ROM:1171 loc_1171: ; DATA XREF: ROM:11A0o ROM:1171 inx b ROM:1172 xra d ROM:1173 mov d, m ROM:1174 dad d ROM:1175 add b ROM:1176 pop psw ROM:1177 shld 8076h ROM:117A mov b, l ROM:117B xra d ROM:117C ldsi 82h ; 'В' ROM:117E ROM:117E LOG: ; CODE XREF: ROM:1591p ROM:117E rst 5 ; Обработка Бейсик-функции LOG. ROM:117F jpe FUNCTIONCALLERROR ; Ошибка вызова функции ROM:1182 lxi h, FACCUM+3 ; Аккумулятор для вычислений с плавающей точкой: ROM:1182 ; 00000000 1 11111111111111111111111 ROM:1182 ; -------- - ----------------------- ROM:1182 ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:1185 mov a, m ROM:1186 lxi b, 8035h ROM:1189 lxi d, 4F3h ROM:118C sub b ROM:118D push psw ROM:118E mov m, b ROM:118F push d ROM:1190 push b ROM:1191 call FADD2 ; FACCUM = FACCUM + BCDEONSTK ROM:1194 pop b ROM:1195 pop d ROM:1196 inr b ROM:1197 call loc_121A ROM:119A lxi h, loc_116D ROM:119D call FSUB2 ; FACCUM = FACCUM - BCDEONSTK ROM:11A0 lxi h, loc_1171 ROM:11A3 call loc_15FA ROM:11A6 lxi b, 8080h ROM:11A9 lxi d, 0 ROM:11AC call FADD2 ; FACCUM = FACCUM + BCDEONSTK ROM:11AF pop psw ROM:11B0 call FADDPROC ; Прибавляет значение цифры находящейся в A к FACCUM. ROM:11B3 ROM:11B3 ; =============== S U B R O U T I N E ======================================= ROM:11B3 ROM:11B3 ; FACCUM = FACCUM * BCDEONSTK ROM:11B3 ROM:11B3 FMUL2: ; CODE XREF: ROM:15BEp ROM:11B3 lxi b, 8031h ROM:11B6 lxi d, 7218h ROM:11B6 ; End of function FMUL2 ROM:11B6 ROM:11B9 ROM:11B9 loc_11B9: ; DATA XREF: ROM:17A4o ROM:11B9 lxi h, 0D1C1h ; FACCUM = FACCUM * BCDEONSTK ROM:11B9 ; ROM:11B9 ; 11BA:FMUL:POP B ROM:11B9 ; POP D ROM:11BC ROM:11BC ; =============== S U B R O U T I N E ======================================= ROM:11BC ROM:11BC ; Обработка FACCUM = FACCUM * BCDEONSTK ROM:11BC ROM:11BC FMUL3: ; CODE XREF: ROM:1596p ROM:11BC ; ROM:15A2p ... ROM:11BC ROM:11BC ; FUNCTION CHUNK AT ROM:1207 SIZE 00000005 BYTES ROM:11BC ROM:11BC rst 5 ; RST5 = Проверяет состояние FACCUM. ROM:11BC ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно ROM:11BC ; (0xFF если отрицательно, 0x01 если положительно). ROM:11BD rz ROM:11BE mvi l, 0 ROM:11C0 call FEXPONENTADD ; Используется в FDIV и в FMUL.Работает с экспоненциальной частью аргументов. ROM:11C0 ; Складывает их для FMUL и вычитает их для FDIV. ROM:11C0 ; На входе L=0 при сложении и L=FF при вычитании. ROM:11C3 mov a, c ROM:11C4 sta loc_F877+1 ROM:11C7 xchg ROM:11C8 shld loc_F872+1 ROM:11CB lxi b, 0 ROM:11CE mov d, b ROM:11CF mov e, b ROM:11D0 lxi h, loc_10D3 ROM:11D3 push h ROM:11D4 lxi h, loc_11DC ROM:11D7 push h ROM:11D8 push h ROM:11D9 lxi h, FACCUM ; Аккумулятор для вычислений с плавающей точкой: ROM:11D9 ; 00000000 1 11111111111111111111111 ROM:11D9 ; -------- - ----------------------- ROM:11D9 ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:11DC ROM:11DC loc_11DC: ; DATA XREF: FMUL3+18o ROM:11DC mov a, m ROM:11DD inx h ROM:11DE ora a ROM:11DF jz loc_1207 ROM:11E2 push h ROM:11E3 xchg ROM:11E4 mvi e, 8 ROM:11E6 ROM:11E6 loc_11E6: ; CODE XREF: FMUL3+45j ROM:11E6 rar ROM:11E7 mov d, a ROM:11E8 mov a, c ROM:11E9 jnc loc_11F4 ROM:11EC call BASSUB2 ROM:11EF nop ROM:11F0 nop ROM:11F1 nop ROM:11F2 nop ROM:11F3 nop ROM:11F4 ROM:11F4 loc_11F4: ; CODE XREF: FMUL3+2Dj ROM:11F4 rar ROM:11F5 mov c, a ROM:11F6 mov a, h ROM:11F7 rar ROM:11F8 mov h, a ROM:11F9 mov a, l ROM:11FA rar ROM:11FB mov l, a ROM:11FC mov a, b ROM:11FD rar ROM:11FE mov b, a ROM:11FF dcr e ROM:1200 mov a, d ROM:1201 jnz loc_11E6 ROM:1204 xchg ROM:1204 ; End of function FMUL3 ROM:1204 ROM:1205 ; START OF FUNCTION CHUNK FOR FEXPONENTADD ROM:1205 ROM:1205 loc_1205: ; CODE XREF: FEXPONENTADD+15j ROM:1205 pop h ROM:1206 ret ROM:1206 ; END OF FUNCTION CHUNK FOR FEXPONENTADD ROM:1207 ; --------------------------------------------------------------------------- ROM:1207 ; START OF FUNCTION CHUNK FOR FMUL3 ROM:1207 ROM:1207 loc_1207: ; CODE XREF: FMUL3+23j ROM:1207 mov b, e ROM:1208 mov e, d ROM:1209 mov d, c ROM:120A mov c, a ROM:120B ret ROM:120B ; END OF FUNCTION CHUNK FOR FMUL3 ROM:120C ROM:120C ; =============== S U B R O U T I N E ======================================= ROM:120C ROM:120C ; Делит FACCUM на 10. Используется в FOUT для представления чисел в нормальном виде при печати. ROM:120C ROM:120C FDIVBYTEN: ; CODE XREF: FIN+52p ROM:120C ; PRINTINT2:loc_149Fp ROM:120C call FPUSH ; Записывает число с плавающей точкой на стек. ROM:120F lxi b, 8420h ROM:1212 lxi d, 0 ROM:1215 call FLOADFROMBCDE ; Загружает число в FACCUM из BCDE. ROM:1218 ROM:1218 FDIV: ; CODE XREF: ROM:16D5j ROM:1218 ; DATA XREF: ROM:17A7o ROM:1218 pop b ; FACCUM = FACCUM / BCDEONSTK ROM:1219 pop d ROM:121A ROM:121A loc_121A: ; CODE XREF: ROM:1197p SIN+Ep ... ROM:121A rst 5 ; RST5 = Проверяет состояние FACCUM. ROM:121A ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно ROM:121A ; (0xFF если отрицательно, 0x01 если положительно). ROM:121B jz DIVIDEBYZERO ; Ошибка деления на ноль ROM:121E mvi l, 0FFh ROM:1220 call FEXPONENTADD ; Используется в FDIV и в FMUL.Работает с экспоненциальной частью аргументов. ROM:1220 ; Складывает их для FMUL и вычитает их для FDIV. ROM:1220 ; На входе L=0 при сложении и L=FF при вычитании. ROM:1223 inr m ROM:1224 inr m ROM:1225 dcx h ROM:1226 mov a, m ROM:1227 sta loc_F842+1 ROM:122A dcx h ROM:122B mov a, m ROM:122C sta loc_F83E+1 ROM:122F dcx h ROM:1230 mov a, m ROM:1231 sta loc_F83A+1 ROM:1234 mov b, c ROM:1235 xchg ROM:1236 xra a ROM:1237 mov c, a ROM:1238 mov d, a ROM:1239 mov e, a ROM:123A sta loc_F845+1 ROM:123D ROM:123D FDIVLOOP: ; CODE XREF: ROM:127Bj ROM:123D ; ROM:1284j ROM:123D push h ; Главный цикл FDIV ROM:123E push b ROM:123F call BASSUB1 ROM:1242 jmp loc_124F ROM:1245 ; --------------------------------------------------------------------------- ROM:1245 nop ROM:1246 mov h, a ROM:1247 mov a, b ROM:1248 sbi 0ADh ; 'н' ROM:124A mov b, a ROM:124B mvi a, 0 ROM:124D sbi 0 ROM:124F ROM:124F loc_124F: ; CODE XREF: FDIVBYTEN+36j ROM:124F cmc ROM:1250 jnc loc_125A ROM:1253 sta loc_F845+1 ROM:1256 pop psw ROM:1257 pop psw ROM:1258 stc ROM:1258 ; End of function FDIVBYTEN ROM:1258 ROM:1258 ; --------------------------------------------------------------------------- ROM:1259 .db 0D2h ROM:125A ; --------------------------------------------------------------------------- ROM:125A ROM:125A loc_125A: ; CODE XREF: FDIVBYTEN+44j ROM:125A pop b ROM:125B pop h ROM:125C mov a, c ROM:125D inr a ROM:125E dcr a ROM:125F rar ROM:1260 jm loc_1109 ROM:1263 ral ROM:1264 mov a, e ROM:1265 ral ROM:1266 mov e, a ROM:1267 mov a, d ROM:1268 ral ROM:1269 mov d, a ROM:126A mov a, c ROM:126B ral ROM:126C mov c, a ROM:126D dad h ROM:126E mov a, b ROM:126F ral ROM:1270 mov b, a ROM:1271 lda loc_F845+1 ROM:1274 ral ROM:1275 sta loc_F845+1 ROM:1278 mov a, c ROM:1279 ora d ROM:127A ora e ROM:127B jnz FDIVLOOP ; Главный цикл FDIV ROM:127E push h ROM:127F lxi h, FACCUM+3 ; Аккумулятор для вычислений с плавающей точкой: ROM:127F ; 00000000 1 11111111111111111111111 ROM:127F ; -------- - ----------------------- ROM:127F ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:1282 dcr m ROM:1283 pop h ROM:1284 jnz FDIVLOOP ; Главный цикл FDIV ROM:1287 jmp OVERFLOW ; Ошибка переполнения. ROM:128A ROM:128A ; =============== S U B R O U T I N E ======================================= ROM:128A ROM:128A ; Используется в FDIV и в FMUL.Работает с экспоненциальной частью аргументов. ROM:128A ; Складывает их для FMUL и вычитает их для FDIV. ROM:128A ; На входе L=0 при сложении и L=FF при вычитании. ROM:128A ROM:128A FEXPONENTADD: ; CODE XREF: FMUL3+4p ROM:128A ; FDIVBYTEN+14p ROM:128A ROM:128A ; FUNCTION CHUNK AT ROM:1205 SIZE 00000002 BYTES ROM:128A ROM:128A mov a, b ROM:128B ora a ROM:128C jz loc_12AC ROM:128F mov a, l ROM:1290 lxi h, FACCUM+3 ; Аккумулятор для вычислений с плавающей точкой: ROM:1290 ; 00000000 1 11111111111111111111111 ROM:1290 ; -------- - ----------------------- ROM:1290 ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:1293 xra m ROM:1294 add b ROM:1295 mov b, a ROM:1296 rar ROM:1297 xra b ROM:1298 mov a, b ROM:1299 jp loc_12AB ROM:129C adi 80h ; 'А' ROM:129E mov m, a ROM:129F jz loc_1205 ROM:12A2 call FUNPACKMANTISSAS ; Распаковывает мантиссы FACCUM и BCDE. Восстанавливает пропавший старший бит, но при этом теряет бит знака у обоих упакованных чисел. ROM:12A2 ; Для компенсации потери знакового бита функция возвращает комбинацию обоих знаковых битов. Функция меняет знак FACCUM и потом ксорит его со знаком BCDE и возвращает результат в 7-м бите A. ROM:12A2 ; В результате в A появляется +ve если знаковые биты разные и -ve если знаковые биты совпадают: ROM:12A2 ; ROM:12A2 ; FACCUM | negated FACCUM | BCDE | result after XOR ROM:12A2 ; + - + - ROM:12A2 ; + - - + ROM:12A2 ; - + + + ROM:12A2 ; - + - - ROM:12A5 mov m, a ROM:12A6 dcx h ROM:12A7 ret ROM:12A8 ; --------------------------------------------------------------------------- ROM:12A8 ROM:12A8 loc_12A8: ; CODE XREF: ROM:15AAj ROM:12A8 ; ROM:15B4j ROM:12A8 rst 5 ; RST5 = Проверяет состояние FACCUM. ROM:12A8 ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно ROM:12A8 ; (0xFF если отрицательно, 0x01 если положительно). ROM:12A9 cma ROM:12AA pop h ROM:12AB ROM:12AB loc_12AB: ; CODE XREF: FEXPONENTADD+Fj ROM:12AB ora a ROM:12AC ROM:12AC loc_12AC: ; CODE XREF: FEXPONENTADD+2j ROM:12AC pop h ROM:12AD jp FZERO ; Устанавливает FACCUM в ноль. ROM:12B0 jmp OVERFLOW ; Ошибка переполнения. ROM:12B0 ; End of function FEXPONENTADD ROM:12B0 ROM:12B3 ROM:12B3 ; =============== S U B R O U T I N E ======================================= ROM:12B3 ROM:12B3 ; Умножает FACCUM на 10. ROM:12B3 ROM:12B3 FMULBYTEN: ; CODE XREF: DECIMALSHIFTUP2+1p ROM:12B3 ; FIN+71p ROM:12B3 call FCOPYTOBCDE ; Перемещение числа с плавающей точкой из FACCUM в BCDE ROM:12B6 mov a, b ROM:12B7 ora a ROM:12B8 rz ROM:12B9 adi 2 ROM:12BB jc OVERFLOW ; Ошибка переполнения. ROM:12BE mov b, a ROM:12BF call FADD2 ; FACCUM = FACCUM + BCDEONSTK ROM:12C2 lxi h, FACCUM+3 ; Аккумулятор для вычислений с плавающей точкой: ROM:12C2 ; 00000000 1 11111111111111111111111 ROM:12C2 ; -------- - ----------------------- ROM:12C2 ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:12C5 inr m ROM:12C6 rnz ROM:12C7 jmp OVERFLOW ; Ошибка переполнения. ROM:12C7 ; End of function FMULBYTEN ROM:12C7 ROM:12CA ; --------------------------------------------------------------------------- ROM:12CA ; START OF FUNCTION CHUNK FOR FTESTSIGN ROM:12CA ROM:12CA FTESTSIGN2: ; CODE XREF: FTESTSIGN+4j ROM:12CA lda FACCUM+2 ; Аккумулятор для вычислений с плавающей точкой: ROM:12CA ; 00000000 1 11111111111111111111111 ROM:12CA ; -------- - ----------------------- ROM:12CA ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:12CD ROM:12CD loc_12CD: ; DATA XREF: FCOMPARE+5o ROM:12CD cpi 2Fh ; '/' ROM:12CF ral ROM:12D0 ROM:12D0 loc_12D0: ; CODE XREF: ROM:0AECj ROM:12D0 sbb a ROM:12D1 rnz ROM:12D2 inr a ROM:12D3 ret ROM:12D3 ; END OF FUNCTION CHUNK FOR FTESTSIGN ROM:12D4 ; --------------------------------------------------------------------------- ROM:12D4 ROM:12D4 SGN: ; Бейсик-функция SGN ROM:12D4 rst 5 ROM:12D5 ROM:12D5 ; =============== S U B R O U T I N E ======================================= ROM:12D5 ROM:12D5 ; Конвертирует знаковое число (байт) в A в число с плавающей точкой в FACCUM. ROM:12D5 ROM:12D5 FCHARTOFLOAT: ; CODE XREF: ROM:0AF6j ROM:12D5 ; FADDPROC+3p ROM:12D5 mvi b, 88h ; 'И' ROM:12D7 lxi d, 0 ROM:12D7 ; End of function FCHARTOFLOAT ROM:12D7 ROM:12DA ROM:12DA ; =============== S U B R O U T I N E ======================================= ROM:12DA ROM:12DA ; Получение длинного целого. Дополнительная точка входа. ROM:12DA ROM:12DA LONGINT2: ; CODE XREF: LONGINT+Aj ROM:12DA ; PRINTINT2+3p ROM:12DA lxi h, FACCUM+3 ; Аккумулятор для вычислений с плавающей точкой: ROM:12DA ; 00000000 1 11111111111111111111111 ROM:12DA ; -------- - ----------------------- ROM:12DA ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:12DD mov c, a ROM:12DE mov m, b ROM:12DF mvi b, 0 ROM:12E1 inx h ROM:12E2 mvi m, 80h ; 'А' ROM:12E4 ral ROM:12E5 jmp loc_10D0 ROM:12E5 ; End of function LONGINT2 ROM:12E5 ROM:12E8 ; --------------------------------------------------------------------------- ROM:12E8 ROM:12E8 ABS: ; Бейсик-функция ABS ROM:12E8 rst 5 ROM:12E9 rp ROM:12EA ROM:12EA ; =============== S U B R O U T I N E ======================================= ROM:12EA ROM:12EA ; Меняет знак FACCUM. FACCUM=-FACCUM ROM:12EA ROM:12EA FNEGATE: ; CODE XREF: EVALTERM+42p ROM:12EA ; FSUB2:loc_107Fp ... ROM:12EA lxi h, FACCUM+2 ; Аккумулятор для вычислений с плавающей точкой: ROM:12EA ; 00000000 1 11111111111111111111111 ROM:12EA ; -------- - ----------------------- ROM:12EA ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:12ED mov a, m ROM:12EE xri 80h ROM:12F0 mov m, a ROM:12F1 ret ROM:12F1 ; End of function FNEGATE ROM:12F1 ROM:12F2 ROM:12F2 ; =============== S U B R O U T I N E ======================================= ROM:12F2 ROM:12F2 ; Записывает число с плавающей точкой на стек. ROM:12F2 ROM:12F2 FPUSH: ; CODE XREF: COMPUTE2+61p ROM:12F2 ; FADD2+11p ... ROM:12F2 xchg ROM:12F3 lhld FACCUM ; Аккумулятор для вычислений с плавающей точкой: ROM:12F3 ; 00000000 1 11111111111111111111111 ROM:12F3 ; -------- - ----------------------- ROM:12F3 ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:12F6 xthl ROM:12F7 push h ROM:12F8 lhld FACCUM+2 ; Аккумулятор для вычислений с плавающей точкой: ROM:12F8 ; 00000000 1 11111111111111111111111 ROM:12F8 ; -------- - ----------------------- ROM:12F8 ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:12FB xthl ROM:12FC push h ROM:12FD xchg ROM:12FE ret ROM:12FE ; End of function FPUSH ROM:12FE ROM:12FF ROM:12FF ; =============== S U B R O U T I N E ======================================= ROM:12FF ROM:12FF ; Загружает FACCUM числом с плавающей точкой из ячеек памяти, на которые указывает HL. ROM:12FF ; ROM:12FF ROM:12FF FLOADFROMMEM: ; CODE XREF: NEXT2+12p ROM:12FF ; EVALTERM+56p ... ROM:12FF call FLOADBCDEFROMMEM ; Загружает число с плавающей точкой в BCDE из ячеек памяти, на которые указывает HL. ROM:12FF ; End of function FLOADFROMMEM ; Т. е. загрузка из M в BCDE ROM:12FF ROM:1302 ROM:1302 ; =============== S U B R O U T I N E ======================================= ROM:1302 ROM:1302 ; Загружает число в FACCUM из BCDE. ROM:1302 ROM:1302 FLOADFROMBCDE: ; CODE XREF: ROM:0A84p ROM:1302 ; FADD2+7j ... ROM:1302 xchg ROM:1303 shld FACCUM ; Аккумулятор для вычислений с плавающей точкой: ROM:1303 ; 00000000 1 11111111111111111111111 ROM:1303 ; -------- - ----------------------- ROM:1303 ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:1306 mov h, b ROM:1307 mov l, c ROM:1308 shld FACCUM+2 ; Аккумулятор для вычислений с плавающей точкой: ROM:1308 ; 00000000 1 11111111111111111111111 ROM:1308 ; -------- - ----------------------- ROM:1308 ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:130B xchg ROM:130C ret ROM:130C ; End of function FLOADFROMBCDE ROM:130C ROM:130D ROM:130D ; =============== S U B R O U T I N E ======================================= ROM:130D ROM:130D ; Перемещение числа с плавающей точкой из FACCUM в BCDE ROM:130D ROM:130D FCOPYTOBCDE: ; CODE XREF: ROM:055Fp ROM:130D ; ROM:0577p ... ROM:130D lxi h, FACCUM ; Аккумулятор для вычислений с плавающей точкой: ROM:130D ; End of function FCOPYTOBCDE ; 00000000 1 11111111111111111111111 ROM:130D ; -------- - ----------------------- ROM:130D ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:1310 ROM:1310 ; =============== S U B R O U T I N E ======================================= ROM:1310 ROM:1310 ; Загружает число с плавающей точкой в BCDE из ячеек памяти, на которые указывает HL. ROM:1310 ; Т. е. загрузка из M в BCDE ROM:1310 ROM:1310 FLOADBCDEFROMMEM: ; CODE XREF: NEXT2+1Fp ROM:1310 ; NEXT2+29p ... ROM:1310 mov e, m ROM:1311 inx h ROM:1312 mov d, m ROM:1313 inx h ROM:1314 mov c, m ROM:1315 inx h ROM:1316 mov b, m ROM:1316 ; End of function FLOADBCDEFROMMEM ROM:1316 ROM:1317 ROM:1317 ; =============== S U B R O U T I N E ======================================= ROM:1317 ROM:1317 ; Подпрограмма PRINTINT ROM:1317 ROM:1317 INCHLRETURN: ; CODE XREF: PRINTINT2+66p ROM:1317 ; PRINTINT2+A0p ROM:1317 inx h ROM:1318 ret ROM:1318 ; End of function INCHLRETURN ROM:1318 ROM:1319 ROM:1319 ; =============== S U B R O U T I N E ======================================= ROM:1319 ROM:1319 ; Копирование числа с плавающей точкой в память, на которую указывает HL ROM:1319 ROM:1319 FCOPYTOMEM: ; CODE XREF: LET+46p ROM:1319 ; ROM:08C3p ... ROM:1319 lxi d, FACCUM ; Аккумулятор для вычислений с плавающей точкой: ROM:1319 ; End of function FCOPYTOMEM ; 00000000 1 11111111111111111111111 ROM:1319 ; -------- - ----------------------- ROM:1319 ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:131C ROM:131C ; =============== S U B R O U T I N E ======================================= ROM:131C ROM:131C ; Копирование числа с плавающей точкой в память. Дополнительная точка входа. ROM:131C ROM:131C FCOPYTOMEM2: ; CODE XREF: LET+40p ROM:131C ; MAINTR2+34p ROM:131C mvi b, 4 ROM:131E ROM:131E FCOPYLOOP: ; CODE XREF: FCOPYTOMEM2+7j ROM:131E ldax d ROM:131F mov m, a ROM:1320 inx d ROM:1321 inx h ROM:1322 dcr b ROM:1323 jnz FCOPYLOOP ROM:1326 ret ROM:1326 ; End of function FCOPYTOMEM2 ROM:1326 ROM:1327 ROM:1327 ; =============== S U B R O U T I N E ======================================= ROM:1327 ROM:1327 ; Распаковывает мантиссы FACCUM и BCDE. Восстанавливает пропавший старший бит, но при этом теряет бит знака у обоих упакованных чисел. ROM:1327 ; Для компенсации потери знакового бита функция возвращает комбинацию обоих знаковых битов. Функция меняет знак FACCUM и потом ксорит его со знаком BCDE и возвращает результат в 7-м бите A. ROM:1327 ; В результате в A появляется +ve если знаковые биты разные и -ve если знаковые биты совпадают: ROM:1327 ; ROM:1327 ; FACCUM | negated FACCUM | BCDE | result after XOR ROM:1327 ; + - + - ROM:1327 ; + - - + ROM:1327 ; - + + + ROM:1327 ; - + - - ROM:1327 ROM:1327 FUNPACKMANTISSAS: ; CODE XREF: FADD2+1Ep ROM:1327 ; FEXPONENTADD+18p ... ROM:1327 lxi h, FACCUM+2 ; Аккумулятор для вычислений с плавающей точкой: ROM:1327 ; 00000000 1 11111111111111111111111 ROM:1327 ; -------- - ----------------------- ROM:1327 ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:132A mov a, m ROM:132B rlc ROM:132C stc ROM:132D rar ROM:132E mov m, a ROM:132F cmc ROM:1330 rar ROM:1331 inx h ROM:1332 inx h ROM:1333 mov m, a ROM:1334 mov a, c ROM:1335 rlc ROM:1336 stc ROM:1337 rar ROM:1338 mov c, a ROM:1339 rar ROM:133A xra m ROM:133B ret ROM:133B ; End of function FUNPACKMANTISSAS ROM:133B ROM:133C ROM:133C ; =============== S U B R O U T I N E ======================================= ROM:133C ROM:133C ; Сравнение чисел с плавающей точкой. ROM:133C ; Сравнивает FACCUM и BCDE. Результат возвращается в A. ROM:133C ; FACCUM > BCDE, A = 0x01. ROM:133C ; FACCUM < BCDE, A = 0xFF. ROM:133C ; FACCUM = BCDE, A = 0. ROM:133C ROM:133C FCOMPARE: ; CODE XREF: INTFROMFLOAT+Ep ROM:133C ; NEXT2+23p ... ROM:133C mov a, b ROM:133D ora a ROM:133E jz FTESTSIGN ; RST5 = Проверяет состояние FACCUM. ROM:133E ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно ROM:133E ; (0xFF если отрицательно, 0x01 если положительно). ROM:1341 lxi h, loc_12CD+1 ROM:1344 push h ROM:1345 rst 5 ; RST5 = Проверяет состояние FACCUM. ROM:1345 ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно ROM:1345 ; (0xFF если отрицательно, 0x01 если положительно). ROM:1346 mov a, c ROM:1347 rz ROM:1348 lxi h, FACCUM+2 ; Аккумулятор для вычислений с плавающей точкой: ROM:1348 ; 00000000 1 11111111111111111111111 ROM:1348 ; -------- - ----------------------- ROM:1348 ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:134B xra m ROM:134C mov a, c ROM:134D rm ROM:134E call FISEQUAL ; Тест на равенство FACCUM и BCDE ROM:1351 rar ROM:1352 xra c ROM:1353 ret ROM:1353 ; End of function FCOMPARE ROM:1353 ROM:1354 ROM:1354 ; =============== S U B R O U T I N E ======================================= ROM:1354 ROM:1354 ; Тест на равенство FACCUM и BCDE ROM:1354 ROM:1354 FISEQUAL: ; CODE XREF: FCOMPARE+12p ROM:1354 inx h ROM:1355 mov a, b ROM:1356 cmp m ROM:1357 rnz ROM:1358 dcx h ROM:1359 mov a, c ROM:135A cmp m ROM:135B rnz ROM:135C dcx h ROM:135D mov a, d ROM:135E cmp m ROM:135F rnz ROM:1360 dcx h ROM:1361 mov a, e ROM:1362 sub m ROM:1363 rnz ROM:1364 pop h ROM:1365 pop h ROM:1366 ret ROM:1366 ; End of function FISEQUAL ROM:1366 ROM:1367 ROM:1367 ; =============== S U B R O U T I N E ======================================= ROM:1367 ROM:1367 ; Перевод числа с плавающей точкой в целое. ROM:1367 ; Возвращает целую часть FACCUM в CDE. ROM:1367 ROM:1367 FASINTEGER: ; CODE XREF: INT+Bp ROM:1367 ; PRINTINT2+46p ... ROM:1367 mov b, a ROM:1368 mov c, a ROM:1369 mov d, a ROM:136A mov e, a ROM:136B ora a ROM:136C rz ROM:136D ROM:136D FASINTEGER_ASM: ; Ассемблерная точка входа в процедуру перевода числа с плавающей точкой в целое ROM:136D push h ROM:136E call FCOPYTOBCDE ; Перемещение числа с плавающей точкой из FACCUM в BCDE ROM:1371 call FUNPACKMANTISSAS ; Распаковывает мантиссы FACCUM и BCDE. Восстанавливает пропавший старший бит, но при этом теряет бит знака у обоих упакованных чисел. ROM:1371 ; Для компенсации потери знакового бита функция возвращает комбинацию обоих знаковых битов. Функция меняет знак FACCUM и потом ксорит его со знаком BCDE и возвращает результат в 7-м бите A. ROM:1371 ; В результате в A появляется +ve если знаковые биты разные и -ve если знаковые биты совпадают: ROM:1371 ; ROM:1371 ; FACCUM | negated FACCUM | BCDE | result after XOR ROM:1371 ; + - + - ROM:1371 ; + - - + ROM:1371 ; - + + + ROM:1371 ; - + - - ROM:1374 xra m ROM:1375 mov h, a ROM:1376 cm FMANTISSADEC ; Декремент мантиссы находящейся в CDE. ROM:1379 mvi a, 98h ; 'Ш' ROM:137B sub b ROM:137C call FMANTISSARTMULT ; Сдвигает мантиссу в CDE вправо на A позиций. ROM:137C ; Заметьте, что потеряные биты накапливаются в B, так что их можно использовать далее при округлении. ROM:137F mov a, h ROM:1380 ral ROM:1381 cc FMANTISSAINC ; Увелививает мантиссу в CDE и смотрит, нет ли переполнения. ROM:1384 mvi b, 0 ROM:1386 cc FNEGATEINT ; Меняет знак у 32-битного целого, содержащегося в CDEB путем вычитания его из нуля. ROM:1386 ; Также переворачивает знак у FTEMP. ROM:1386 ; Используется FASINTEGER и FADD2. ROM:1389 pop h ROM:138A ret ROM:138A ; End of function FASINTEGER ROM:138A ROM:138B ROM:138B ; =============== S U B R O U T I N E ======================================= ROM:138B ROM:138B ; Декремент мантиссы находящейся в CDE. ROM:138B ROM:138B FMANTISSADEC: ; CODE XREF: FASINTEGER+Fp ROM:138B dcx d ROM:138C mov a, d ROM:138D ana e ROM:138E inr a ROM:138F rnz ROM:1390 dcr c ROM:1391 ret ROM:1391 ; End of function FMANTISSADEC ROM:1391 ROM:1392 ROM:1392 ; =============== S U B R O U T I N E ======================================= ROM:1392 ROM:1392 ; Бейсик-функция INT. ROM:1392 ROM:1392 INT: ; CODE XREF: ROM:1575p ROM:1392 ; ROM:15ADp ... ROM:1392 lxi h, FACCUM+3 ; Аккумулятор для вычислений с плавающей точкой: ROM:1392 ; 00000000 1 11111111111111111111111 ROM:1392 ; -------- - ----------------------- ROM:1392 ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:1395 mov a, m ROM:1396 cpi 98h ; 'Ш' ROM:1398 lda FACCUM ; Аккумулятор для вычислений с плавающей точкой: ROM:1398 ; 00000000 1 11111111111111111111111 ROM:1398 ; -------- - ----------------------- ROM:1398 ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:139B rnc ROM:139C mov a, m ROM:139D call FASINTEGER ; Перевод числа с плавающей точкой в целое. ROM:139D ; Возвращает целую часть FACCUM в CDE. ROM:13A0 mvi m, 98h ; 'Ш' ROM:13A2 mov a, e ROM:13A3 push psw ROM:13A4 mov a, c ROM:13A5 ral ROM:13A6 call loc_10D0 ROM:13A9 pop psw ROM:13AA ret ROM:13AA ; End of function INT ROM:13AA ROM:13AB ROM:13AB ; =============== S U B R O U T I N E ======================================= ROM:13AB ROM:13AB ; Вызывается из GETVAR ROM:13AB ROM:13AB MACRO5: ; CODE XREF: GETVAR2+FEp ROM:13AB ; GETVAR2+144p ROM:13AB ROM:13AB ; FUNCTION CHUNK AT ROM:0BEE SIZE 00000005 BYTES ROM:13AB ROM:13AB lxi h, 0 ROM:13AE mov a, b ROM:13AF ora c ROM:13B0 rz ROM:13B1 mvi a, 10h ROM:13B3 ROM:13B3 loc_13B3: ; CODE XREF: MACRO5+17j ROM:13B3 dad h ROM:13B4 jc loc_BEE ROM:13B7 xchg ROM:13B8 dad h ROM:13B9 xchg ROM:13BA jnc loc_13C1 ROM:13BD dad b ROM:13BE jc loc_BEE ROM:13C1 ROM:13C1 loc_13C1: ; CODE XREF: MACRO5+Fj ROM:13C1 dcr a ROM:13C2 jnz loc_13B3 ROM:13C5 ret ROM:13C5 ; End of function MACRO5 ROM:13C5 ROM:13C6 ROM:13C6 ; =============== S U B R O U T I N E ======================================= ROM:13C6 ROM:13C6 ; Функция читающая число с плавающей точкой из ASCII-текста. ROM:13C6 ; Читает строку и конвертирует её в число с плавающей точкой в FACCUM. ROM:13C6 ROM:13C6 FIN: ; CODE XREF: ROM:08BFp ROM:13C6 ; EVALTERM+5j ... ROM:13C6 ROM:13C6 ; FUNCTION CHUNK AT ROM:142F SIZE 00000017 BYTES ROM:13C6 ; FUNCTION CHUNK AT ROM:1451 SIZE 0000000C BYTES ROM:13C6 ROM:13C6 cpi 2Dh ; '-' ROM:13C8 push psw ROM:13C9 jz loc_13D2 ROM:13CC cpi 2Bh ; '+' ROM:13CE jz loc_13D2 ROM:13D1 dcx h ROM:13D2 ROM:13D2 loc_13D2: ; CODE XREF: FIN+3j FIN+8j ROM:13D2 call FZERO ; Устанавливает FACCUM в ноль. ROM:13D5 mov b, a ROM:13D6 mov d, a ROM:13D7 mov e, a ROM:13D8 cma ROM:13D9 mov c, a ROM:13DA ROM:13DA FINLOOP: ; CODE XREF: FIN+45j FIN+7Dj ROM:13DA rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:13DA ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:13DA ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:13DB jc PROCESSDIGIT ROM:13DE cpi 2Eh ; '.' ROM:13E0 jz loc_140A ROM:13E3 cpi 45h ; 'E' ROM:13E5 jnz SCALERESULT ROM:13E8 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:13E8 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:13E8 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:13E9 push h ROM:13EA lxi h, loc_13FE ROM:13ED xthl ROM:13EE dcr d ROM:13EF cpi 0A5h ; 'е' ; Токен __MINUS ROM:13F1 rz ROM:13F2 cpi 2Dh ; '-' ROM:13F4 rz ROM:13F5 inr d ROM:13F6 cpi 2Bh ; '+' ROM:13F8 rz ROM:13F9 cpi 0A4h ; 'д' ; Токен __PLUS ROM:13FB rz ROM:13FC pop psw ROM:13FD dcx h ROM:13FE ROM:13FE loc_13FE: ; CODE XREF: FIN+94j ROM:13FE ; DATA XREF: FIN+24o ROM:13FE rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:13FE ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:13FE ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:13FF jc DOEXPONENTDIGIT ROM:1402 inr d ROM:1403 jnz SCALERESULT ROM:1406 xra a ROM:1407 sub e ROM:1408 mov e, a ROM:1409 inr c ROM:140A ROM:140A loc_140A: ; CODE XREF: FIN+1Aj ROM:140A inr c ROM:140B jz FINLOOP ROM:140E ROM:140E SCALERESULT: ; CODE XREF: FIN+1Fj FIN+3Dj ROM:140E push h ROM:140F mov a, e ROM:1410 sub b ROM:1411 ROM:1411 DECIMALLOOP: ; CODE XREF: FIN:DECIMALLOOPENDj ROM:1411 cp DECIMALSHIFTUP ; Вспомогательная функция FIN. ROM:1414 jp DECIMALLOOPEND ROM:1417 push psw ROM:1418 call FDIVBYTEN ; Делит FACCUM на 10. Используется в FOUT для представления чисел в нормальном виде при печати. ROM:141B pop psw ROM:141C inr a ROM:141D ROM:141D DECIMALLOOPEND: ; CODE XREF: FIN+4Ej ROM:141D jnz DECIMALLOOP ROM:1420 pop d ROM:1421 pop psw ROM:1422 cz FNEGATE ; Меняет знак FACCUM. FACCUM=-FACCUM ROM:1425 xchg ROM:1426 ret ROM:1426 ; End of function FIN ROM:1426 ROM:1427 ROM:1427 ; =============== S U B R O U T I N E ======================================= ROM:1427 ROM:1427 ; Вспомогательная функция FIN. ROM:1427 ROM:1427 DECIMALSHIFTUP: ; CODE XREF: FIN:DECIMALLOOPp ROM:1427 rz ROM:1427 ; End of function DECIMALSHIFTUP ROM:1427 ROM:1428 ROM:1428 ; =============== S U B R O U T I N E ======================================= ROM:1428 ROM:1428 ; Вспомогательная функция FIN. Дополнительная точка входа. ROM:1428 ROM:1428 DECIMALSHIFTUP2: ; CODE XREF: PRINTINT2+32p ROM:1428 push psw ROM:1429 call FMULBYTEN ; Умножает FACCUM на 10. ROM:142C pop psw ROM:142D dcr a ROM:142E ret ROM:142E ; End of function DECIMALSHIFTUP2 ROM:142E ROM:142F ; --------------------------------------------------------------------------- ROM:142F ; START OF FUNCTION CHUNK FOR FIN ROM:142F ROM:142F PROCESSDIGIT: ; CODE XREF: FIN+15j ROM:142F push d ROM:1430 mov d, a ROM:1431 mov a, b ROM:1432 adc c ROM:1433 mov b, a ROM:1434 push b ROM:1435 push h ROM:1436 push d ROM:1437 call FMULBYTEN ; Умножает FACCUM на 10. ROM:143A pop psw ROM:143B sui 30h ; '0' ROM:143D call FADDPROC ; Прибавляет значение цифры находящейся в A к FACCUM. ROM:1440 pop h ROM:1441 pop b ROM:1442 pop d ROM:1443 jmp FINLOOP ROM:1443 ; END OF FUNCTION CHUNK FOR FIN ROM:1446 ROM:1446 ; =============== S U B R O U T I N E ======================================= ROM:1446 ROM:1446 ; Прибавляет значение цифры находящейся в A к FACCUM. ROM:1446 ROM:1446 FADDPROC: ; CODE XREF: ROM:11B0p ROM:1446 ; FIN+77p ROM:1446 call FPUSH ; Записывает число с плавающей точкой на стек. ROM:1449 call FCHARTOFLOAT ; Конвертирует знаковое число (байт) в A в число с плавающей точкой в FACCUM. ROM:144C ROM:144C FADD: ; DATA XREF: ROM:179Eo ROM:144C pop b ; FACCUM = FACCUM + BCDEONSTK. Ещё одна точка входа. ROM:144D pop d ROM:144E jmp FADD2 ; FACCUM = FACCUM + BCDEONSTK ROM:144E ; End of function FADDPROC ROM:144E ROM:1451 ; --------------------------------------------------------------------------- ROM:1451 ; START OF FUNCTION CHUNK FOR FIN ROM:1451 ROM:1451 DOEXPONENTDIGIT: ; CODE XREF: FIN+39j ROM:1451 mov a, e ROM:1452 rlc ROM:1453 rlc ROM:1454 add e ROM:1455 rlc ROM:1456 add m ROM:1457 sui 30h ; '0' ROM:1459 mov e, a ROM:145A jmp loc_13FE ROM:145A ; END OF FUNCTION CHUNK FOR FIN ROM:145D ROM:145D ; =============== S U B R O U T I N E ======================================= ROM:145D ROM:145D ; Инициализация INITKEYS2 ROM:145D ROM:145D INITKEYS2TR: ; CODE XREF: CHECKENOUGHMEM+3Cp ROM:145D push h ROM:145E lxi h, INITKEYS2 ; " in " ROM:1461 call MAINTR ; Подпрограмма главного цикла ROM:1464 pop h ROM:1464 ; End of function INITKEYS2TR ROM:1464 ROM:1465 ROM:1465 ; =============== S U B R O U T I N E ======================================= ROM:1465 ROM:1465 ; Переводит целое число HL в число с плавающей точкой FACCUM. ROM:1465 ; В частности, печатает номер строки Бейсик-программы, выполняющейся в данный момент времени. ROM:1465 ROM:1465 PRINTINT: ; CODE XREF: PRNTR1-12D9p ROM:1465 ; INPUTLN+1925p ... ROM:1465 xchg ROM:1465 ; End of function PRINTINT ROM:1465 ROM:1466 ROM:1466 ; =============== S U B R O U T I N E ======================================= ROM:1466 ROM:1466 ; Переводит целое число HL в число с плавающей точкой FACCUM. ROM:1466 ; Дополнительная точка входа. ROM:1466 ROM:1466 PRINTINT2: ; CODE XREF: CHECKENOUGHMEM+2Dp ROM:1466 xra a ROM:1467 mvi b, 98h ; 'Ш' ROM:1469 call LONGINT2 ; Получение длинного целого. Дополнительная точка входа. ROM:146C lxi h, loc_D92 ROM:146F push h ROM:1470 ROM:1470 FOUT: ; CODE XREF: ROM:07B7p ROM:1470 ; ROM:0D22p ROM:1470 lxi h, FBUFFER ; Печатает число с плавающей точкой на терминал. ROM:1473 push h ROM:1474 rst 5 ; RST5 = Проверяет состояние FACCUM. ROM:1474 ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно ROM:1474 ; (0xFF если отрицательно, 0x01 если положительно). ROM:1475 mvi m, 20h ; ' ' ROM:1477 jp DOZERO ROM:147A mvi m, 2Dh ; '-' ROM:147C ROM:147C DOZERO: ; CODE XREF: PRINTINT2+11j ROM:147C inx h ROM:147D mvi m, 30h ; '0' ROM:147F jz NULLTERMPREV ROM:1482 push h ROM:1483 cm FNEGATE ; Меняет знак FACCUM. FACCUM=-FACCUM ROM:1486 xra a ROM:1487 push psw ROM:1488 call TOUNDER1000000 ; Делит FACCUM на 10 до тех пор, пока он не станет менее 1000000. ROM:148B ROM:148B TOOVER100000: ; CODE XREF: PRINTINT2+36j ROM:148B lxi b, 9143h ROM:148E lxi d, 4FF8h ROM:1491 call FCOMPARE ; Сравнение чисел с плавающей точкой. ROM:1491 ; Сравнивает FACCUM и BCDE. Результат возвращается в A. ROM:1491 ; FACCUM > BCDE, A = 0x01. ROM:1491 ; FACCUM < BCDE, A = 0xFF. ROM:1491 ; FACCUM = BCDE, A = 0. ROM:1494 jpo PREPARETOPRINT ROM:1497 pop psw ROM:1498 call DECIMALSHIFTUP2 ; Вспомогательная функция FIN. Дополнительная точка входа. ROM:149B push psw ROM:149C jmp TOOVER100000 ROM:149F ; --------------------------------------------------------------------------- ROM:149F ROM:149F loc_149F: ; CODE XREF: TOUNDER1000000+Aj ROM:149F call FDIVBYTEN ; Делит FACCUM на 10. Используется в FOUT для представления чисел в нормальном виде при печати. ROM:14A2 pop psw ROM:14A3 inr a ROM:14A4 push psw ROM:14A5 call TOUNDER1000000 ; Делит FACCUM на 10 до тех пор, пока он не станет менее 1000000. ROM:14A8 ROM:14A8 PREPARETOPRINT: ; CODE XREF: PRINTINT2+2Ej ROM:14A8 call FADDONEHALF ; Прибавляет 0.5 к FACCUM. ROM:14A8 ; Используется DECIMAL_POWERS ROM:14AB inr a ROM:14AC call FASINTEGER ; Перевод числа с плавающей точкой в целое. ROM:14AC ; Возвращает целую часть FACCUM в CDE. ROM:14AF call FLOADFROMBCDE ; Загружает число в FACCUM из BCDE. ROM:14B2 lxi b, INITKEYS+1 ; Инициализация переменных. ROM:14B2 ; Этот блок переностися в ОЗУ по адресу &hF8F0 ROM:14B5 pop psw ROM:14B6 add c ROM:14B7 jm loc_14C3 ROM:14BA cpi 7 ROM:14BC jnc loc_14C3 ROM:14BF inr a ROM:14C0 mov b, a ROM:14C1 mvi a, 1 ROM:14C3 ROM:14C3 loc_14C3: ; CODE XREF: PRINTINT2+51j ROM:14C3 ; PRINTINT2+56j ROM:14C3 dcr a ROM:14C4 pop h ROM:14C5 push psw ROM:14C6 lxi d, DECPOW100000 ROM:14C9 ROM:14C9 NEXTDIGIT: ; CODE XREF: PRINTINT2+90j ROM:14C9 dcr b ROM:14CA mvi m, 2Eh ; '.' ROM:14CC cz INCHLRETURN ; Подпрограмма PRINTINT ROM:14CF push b ROM:14D0 push h ROM:14D1 push d ROM:14D2 call FCOPYTOBCDE ; Перемещение числа с плавающей точкой из FACCUM в BCDE ROM:14D5 pop h ROM:14D6 mvi b, 2Fh ; '/' ROM:14D8 ROM:14D8 DIGITLOOP: ; CODE XREF: PRINTINT2+80j ROM:14D8 inr b ROM:14D9 mov a, e ROM:14DA sub m ROM:14DB mov e, a ROM:14DC inx h ROM:14DD mov a, d ROM:14DE sbb m ROM:14DF mov d, a ROM:14E0 inx h ROM:14E1 mov a, c ROM:14E2 sbb m ROM:14E3 mov c, a ROM:14E4 dcx h ROM:14E5 dcx h ROM:14E6 jnc DIGITLOOP ROM:14E9 call FADDMANTISSAS ; Складывает мантиссы, на первую указывает HL вторая содержится в CDE. ROM:14EC inx h ROM:14ED ROM:14ED loc_14ED: ; Загружает число в FACCUM из BCDE. ROM:14ED call FLOADFROMBCDE ROM:14F0 xchg ROM:14F1 pop h ROM:14F2 mov m, b ROM:14F3 inx h ROM:14F4 pop b ROM:14F5 dcr c ROM:14F6 jnz NEXTDIGIT ROM:14F9 dcr b ROM:14FA jz loc_1509 ROM:14FD ROM:14FD loc_14FD: ; CODE XREF: PRINTINT2+9Bj ROM:14FD dcx h ROM:14FE mov a, m ROM:14FF cpi 30h ; '0' ROM:1501 jz loc_14FD ROM:1504 cpi 2Eh ; '.' ROM:1506 cnz INCHLRETURN ; Подпрограмма PRINTINT ROM:1509 ROM:1509 loc_1509: ; CODE XREF: PRINTINT2+94j ROM:1509 pop psw ROM:150A jz NULLTERM ROM:150D mvi m, 45h ; 'E' ROM:150F inx h ROM:1510 mvi m, 2Bh ; '+' ROM:1512 jp loc_1519 ROM:1515 mvi m, 2Dh ; '-' ROM:1517 cma ROM:1518 inr a ROM:1519 ROM:1519 loc_1519: ; CODE XREF: PRINTINT2+ACj ROM:1519 mvi b, 2Fh ; '/' ROM:151B ROM:151B EXPDIGITLOOP: ; CODE XREF: PRINTINT2+B8j ROM:151B inr b ROM:151C sui 0Ah ROM:151E jnc EXPDIGITLOOP ROM:1521 adi 3Ah ; ':' ROM:1523 inx h ROM:1524 mov m, b ROM:1525 ROM:1525 NULLTERMPREV: ; CODE XREF: PRINTINT2+19j ROM:1525 inx h ROM:1526 mov m, a ROM:1527 inx h ROM:1528 ROM:1528 NULLTERM: ; CODE XREF: PRINTINT2+A4j ROM:1528 mov m, c ROM:1529 pop h ROM:152A ret ROM:152A ; End of function PRINTINT2 ROM:152A ROM:152B ROM:152B ; =============== S U B R O U T I N E ======================================= ROM:152B ROM:152B ; Делит FACCUM на 10 до тех пор, пока он не станет менее 1000000. ROM:152B ROM:152B TOUNDER1000000: ; CODE XREF: PRINTINT2+22p ROM:152B ; PRINTINT2+3Fp ROM:152B lxi b, 9474h ROM:152E lxi d, 23F7h ROM:1531 call FCOMPARE ; Сравнение чисел с плавающей точкой. ROM:1531 ; Сравнивает FACCUM и BCDE. Результат возвращается в A. ROM:1531 ; FACCUM > BCDE, A = 0x01. ROM:1531 ; FACCUM < BCDE, A = 0xFF. ROM:1531 ; FACCUM = BCDE, A = 0. ROM:1534 pop h ROM:1535 jpo loc_149F ROM:1538 pchl ROM:1538 ; End of function TOUNDER1000000 ROM:1538 ROM:1538 ; --------------------------------------------------------------------------- ROM:1539 DECIMAL_POWERS: .db 0 ; DATA XREF: FADDONEHALFo ROM:1539 ; ROM:1557o ROM:153A ONEHALF: .db 0, 0, 80h ROM:153D DECPOW100000: .db 0A0h, 86h, 1 ; DATA XREF: PRINTINT2+60o ROM:1540 DECPOW10000: .db 10h, 27h, 0 ROM:1543 DECPOW1000: .db 0E8h, 3, 0 ROM:1546 DECPOW100: .db 64h, 0, 0 ROM:1549 DECPOW10: .db 0Ah, 0, 0 ROM:154C DECPOW1: .db 1, 0, 0 ROM:154F ROM:154F ; =============== S U B R O U T I N E ======================================= ROM:154F ROM:154F ; Вызов FNEGATE ROM:154F ROM:154F FNEGATE2: ; CODE XREF: ROM:1589p ROM:154F ; ROM:16D9p ROM:154F lxi h, FNEGATE ; Меняет знак FACCUM. FACCUM=-FACCUM ROM:1552 xthl ROM:1553 pchl ROM:1553 ; End of function FNEGATE2 ROM:1553 ROM:1554 ; --------------------------------------------------------------------------- ROM:1554 ROM:1554 SQR: ; Бейсик-функция SQR ROM:1554 call FPUSH ROM:1557 lxi h, DECIMAL_POWERS ROM:155A call FLOADFROMMEM ; Загружает FACCUM числом с плавающей точкой из ячеек памяти, на которые указывает HL. ROM:155A ; ROM:155D pop b ROM:155E pop d ROM:155F rst 5 ; RST5 = Проверяет состояние FACCUM. ROM:155F ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно ROM:155F ; (0xFF если отрицательно, 0x01 если положительно). ROM:1560 jz EXP ; Бейсик-функция EXP ROM:1563 mov a, b ROM:1564 ora a ROM:1565 jz loc_10E9 ROM:1568 push d ROM:1569 push b ROM:156A mov a, c ROM:156B ori 7Fh ROM:156D call FCOPYTOBCDE ; Перемещение числа с плавающей точкой из FACCUM в BCDE ROM:1570 jp loc_1581 ROM:1573 push d ROM:1574 push b ROM:1575 call INT ; Бейсик-функция INT. ROM:1578 pop b ROM:1579 pop d ROM:157A push psw ROM:157B call FCOMPARE ; Сравнение чисел с плавающей точкой. ROM:157B ; Сравнивает FACCUM и BCDE. Результат возвращается в A. ROM:157B ; FACCUM > BCDE, A = 0x01. ROM:157B ; FACCUM < BCDE, A = 0xFF. ROM:157B ; FACCUM = BCDE, A = 0. ROM:157E pop h ROM:157F mov a, h ROM:1580 rar ROM:1581 ROM:1581 loc_1581: ; CODE XREF: ROM:1570j ROM:1581 pop h ROM:1582 shld FACCUM+2 ; Аккумулятор для вычислений с плавающей точкой: ROM:1582 ; 00000000 1 11111111111111111111111 ROM:1582 ; -------- - ----------------------- ROM:1582 ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:1585 pop h ROM:1586 shld FACCUM ; Аккумулятор для вычислений с плавающей точкой: ROM:1586 ; 00000000 1 11111111111111111111111 ROM:1586 ; -------- - ----------------------- ROM:1586 ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:1589 cc FNEGATE2 ; Вызов FNEGATE ROM:158C cz FNEGATE ; Меняет знак FACCUM. FACCUM=-FACCUM ROM:158F push d ROM:1590 push b ROM:1591 call LOG ; Обработка Бейсик-функции LOG. ROM:1594 pop b ROM:1595 pop d ROM:1596 call FMUL3 ; Обработка FACCUM = FACCUM * BCDEONSTK ROM:1599 ROM:1599 EXP: ; CODE XREF: ROM:1560j ROM:1599 call FPUSH ; Бейсик-функция EXP ROM:159C lxi b, 8138h ROM:159F lxi d, 0AA3Bh ROM:15A2 call FMUL3 ; Обработка FACCUM = FACCUM * BCDEONSTK ROM:15A5 lda FACCUM+3 ; Аккумулятор для вычислений с плавающей точкой: ROM:15A5 ; 00000000 1 11111111111111111111111 ROM:15A5 ; -------- - ----------------------- ROM:15A5 ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:15A8 cpi 88h ; 'И' ROM:15AA jnc loc_12A8 ROM:15AD call INT ; Бейсик-функция INT. ROM:15B0 adi 80h ; 'А' ROM:15B2 adi 2 ROM:15B4 jc loc_12A8 ROM:15B7 push psw ROM:15B8 lxi h, loc_116D ROM:15BB call loc_1073 ROM:15BE call FMUL2 ; FACCUM = FACCUM * BCDEONSTK ROM:15C1 pop psw ROM:15C2 pop b ROM:15C3 pop d ROM:15C4 push psw ROM:15C5 call loc_107F ROM:15C8 call FNEGATE ; Меняет знак FACCUM. FACCUM=-FACCUM ROM:15CB lxi h, TAB1 ; Системная таблица. Используется функцией EXP. ROM:15CE call loc_1609 ROM:15D1 lxi d, 0 ROM:15D4 pop b ROM:15D5 mov c, d ROM:15D6 jmp FMUL3 ; Обработка FACCUM = FACCUM * BCDEONSTK ROM:15D6 ; --------------------------------------------------------------------------- ROM:15D9 TAB1: .db 8, 40h, 2Eh, 94h, 74h, 70h, 4Fh, 2Eh, 77h, 6Eh, 2 ROM:15D9 ; DATA XREF: ROM:15CBo ROM:15D9 .db 88h, 7Ah, 0E6h, 0A0h, 2Ah, 7Ch, 50h, 0AAh, 0AAh, 7Eh ; Системная таблица. Используется функцией EXP. ROM:15D9 .db 0FFh, 0FFh, 7Fh, 7Fh, 0, 0, 80h, 81h, 0, 0, 0, 81h ROM:15FA ; --------------------------------------------------------------------------- ROM:15FA ROM:15FA loc_15FA: ; CODE XREF: ROM:11A3p ROM:15FA ; SIN+3Dj ... ROM:15FA call FPUSH ; Записывает число с плавающей точкой на стек. ROM:15FD lxi d, 11BAh ROM:1600 push d ROM:1601 push h ROM:1602 call FCOPYTOBCDE ; Перемещение числа с плавающей точкой из FACCUM в BCDE ROM:1605 call FMUL3 ; Обработка FACCUM = FACCUM * BCDEONSTK ROM:1608 pop h ROM:1609 ROM:1609 loc_1609: ; CODE XREF: ROM:15CEp ROM:1609 call FPUSH ; Записывает число с плавающей точкой на стек. ROM:160C mov a, m ROM:160D inx h ROM:160E call FLOADFROMMEM ; Загружает FACCUM числом с плавающей точкой из ячеек памяти, на которые указывает HL. ROM:160E ; ROM:1611 ROM:1611 loc_1611: ; CODE XREF: ROM:1627j ROM:1611 mvi b, 0F1h ; 'ё' ROM:1613 pop b ROM:1614 pop d ROM:1615 dcr a ROM:1616 rz ROM:1617 push d ROM:1618 push b ROM:1619 push psw ROM:161A push h ROM:161B call FMUL3 ; Обработка FACCUM = FACCUM * BCDEONSTK ROM:161E pop h ROM:161F call FLOADBCDEFROMMEM ; Загружает число с плавающей точкой в BCDE из ячеек памяти, на которые указывает HL. ROM:161F ; Т. е. загрузка из M в BCDE ROM:1622 push h ROM:1623 call FADD2 ; FACCUM = FACCUM + BCDEONSTK ROM:1626 pop h ROM:1627 jmp loc_1611+1 ; loc_1611+1:POP PSW ROM:162A ; --------------------------------------------------------------------------- ROM:162A ROM:162A RND: ; Бейсик-функция RND ROM:162A rst 5 ROM:162B jm loc_1647 ROM:162E lxi h, loc_F87A ROM:1631 call FLOADFROMMEM ; Загружает FACCUM числом с плавающей точкой из ячеек памяти, на которые указывает HL. ROM:1631 ; ROM:1634 rz ROM:1635 lxi b, 9835h ROM:1638 lxi d, 447Ah ROM:163B call FMUL3 ; Обработка FACCUM = FACCUM * BCDEONSTK ROM:163E lxi b, 6828h ROM:1641 lxi d, 0B146h ROM:1644 call FADD2 ; FACCUM = FACCUM + BCDEONSTK ROM:1647 ROM:1647 loc_1647: ; CODE XREF: ROM:162Bj ROM:1647 call FCOPYTOBCDE ; Перемещение числа с плавающей точкой из FACCUM в BCDE ROM:164A mov a, e ROM:164B mov e, c ROM:164C mov c, a ROM:164D mvi m, 80h ; 'А' ROM:164F dcx h ROM:1650 mov b, m ROM:1651 mvi m, 80h ; 'А' ROM:1653 call loc_10D3 ROM:1656 lxi h, loc_F87A ROM:1659 jmp FCOPYTOMEM ; Копирование числа с плавающей точкой в память, на которую указывает HL ROM:165C ; --------------------------------------------------------------------------- ROM:165C mov d, d ROM:165D rst 0 ; RST0 = старт. ОЗУ при этом инициализируется, но не очищается. ROM:165D ; Т. е. если сделать POKE 50000, 255 а потом X=USR(0), то в памяти по адресу 50000 так и останется лежать байт 255. ROM:165D ; При этом, конечно, рабочие области подлежат инициализации, как и упоминалось. ROM:165E mov c, a ROM:165F add b ROM:1660 ROM:1660 ; =============== S U B R O U T I N E ======================================= ROM:1660 ROM:1660 ; Бейсик-функция COS ROM:1660 ROM:1660 COS: ; CODE XREF: ROM:16D2p ROM:1660 lxi h, COST ; Константа, использующаяся при расчёте косинуса. ROM:1663 call loc_1073 ROM:1663 ; End of function COS ROM:1663 ROM:1666 ROM:1666 ; =============== S U B R O U T I N E ======================================= ROM:1666 ROM:1666 ; Бейсик-функция SIN ROM:1666 ROM:1666 SIN: ; CODE XREF: ROM:16C6p ROM:1666 call FPUSH ; Записывает число с плавающей точкой на стек. ROM:1669 lxi b, 8349h ROM:166C lxi d, 0FDBh ROM:166F call FLOADFROMBCDE ; Загружает число в FACCUM из BCDE. ROM:1672 pop b ROM:1673 pop d ROM:1674 call loc_121A ROM:1677 call FPUSH ; Записывает число с плавающей точкой на стек. ROM:167A call INT ; Бейсик-функция INT. ROM:167D pop b ROM:167E pop d ROM:167F call loc_107F ROM:1682 lxi h, SINT ; Константа, использующаяся при расчёте синуса. ROM:1685 call FSUB2 ; FACCUM = FACCUM - BCDEONSTK ROM:1688 rst 5 ; RST5 = Проверяет состояние FACCUM. ROM:1688 ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно ROM:1688 ; (0xFF если отрицательно, 0x01 если положительно). ROM:1689 stc ROM:168A jp loc_1692 ROM:168D call FADDONEHALF ; Прибавляет 0.5 к FACCUM. ROM:168D ; Используется DECIMAL_POWERS ROM:1690 rst 5 ; RST5 = Проверяет состояние FACCUM. ROM:1690 ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно ROM:1690 ; (0xFF если отрицательно, 0x01 если положительно). ROM:1691 ora a ROM:1692 ROM:1692 loc_1692: ; CODE XREF: SIN+24j ROM:1692 push psw ROM:1693 cp FNEGATE ; Меняет знак FACCUM. FACCUM=-FACCUM ROM:1696 lxi h, SINT ; Константа, использующаяся при расчёте синуса. ROM:1699 call loc_1073 ROM:169C pop psw ROM:169D cnc FNEGATE ; Меняет знак FACCUM. FACCUM=-FACCUM ROM:16A0 lxi h, SINT2 ; Константа, использующаяся при расчёте синуса. ROM:16A3 jmp loc_15FA ROM:16A3 ; End of function SIN ROM:16A3 ROM:16A3 ; --------------------------------------------------------------------------- ROM:16A6 COST: .db 0DBh ; - ; DATA XREF: COSo ROM:16F9o ROM:16A6 ; Константа, использующаяся при расчёте косинуса. ROM:16A7 .db 0Fh ROM:16A8 .db 49h ; I ROM:16A9 .db 81h ; Б ROM:16AA SINT: .db 0 ; DATA XREF: SIN+1Co SIN+30o ROM:16AA ; Константа, использующаяся при расчёте синуса. ROM:16AB .db 0 ROM:16AC .db 0 ROM:16AD .db 7Fh ;  ROM:16AE SINT2: .db 5 ; DATA XREF: SIN+3Ao ROM:16AE ; Константа, использующаяся при расчёте синуса. ROM:16AF TAYLOR_SERIES: .db 0BAh, 0D7h, 1Eh, 86h, 64h, 26h, 99h, 87h, 58h, 34h ; Серия Тейлора ROM:16AF .db 23h, 87h, 0E0h, 5Dh, 0A5h, 86h, 0DAh, 0Fh, 49h, 83h ROM:16C3 ; --------------------------------------------------------------------------- ROM:16C3 ROM:16C3 TAN: ; Бейсик-функция TAN ROM:16C3 call FPUSH ROM:16C6 call SIN ; Бейсик-функция SIN ROM:16C9 pop b ROM:16CA pop h ROM:16CB call FPUSH ; Записывает число с плавающей точкой на стек. ROM:16CE xchg ROM:16CF call FLOADFROMBCDE ; Загружает число в FACCUM из BCDE. ROM:16D2 call COS ; Бейсик-функция COS ROM:16D5 jmp FDIV ; FACCUM = FACCUM / BCDEONSTK ROM:16D8 ; --------------------------------------------------------------------------- ROM:16D8 ROM:16D8 ATN: ; Бейсик-функция ATN ROM:16D8 rst 5 ROM:16D9 cm FNEGATE2 ; Вызов FNEGATE ROM:16DC cm FNEGATE ; Меняет знак FACCUM. FACCUM=-FACCUM ROM:16DF lda FACCUM+3 ; Аккумулятор для вычислений с плавающей точкой: ROM:16DF ; 00000000 1 11111111111111111111111 ROM:16DF ; -------- - ----------------------- ROM:16DF ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:16E2 cpi 81h ; 'Б' ROM:16E4 jc loc_16F3 ROM:16E7 lxi b, 8100h ROM:16EA mov d, c ROM:16EB mov e, c ROM:16EC call loc_121A ROM:16EF lxi h, FSUB2 ; FACCUM = FACCUM - BCDEONSTK ROM:16F2 push h ROM:16F3 ROM:16F3 loc_16F3: ; CODE XREF: ROM:16E4j ROM:16F3 lxi h, ATNT ROM:16F6 call loc_15FA ROM:16F9 lxi h, COST ; Константа, использующаяся при расчёте косинуса. ROM:16FC ret ROM:16FC ; --------------------------------------------------------------------------- ROM:16FD ATNT: .db 9 ; DATA XREF: ROM:loc_16F3o ROM:16FE .db 4Ah ROM:16FF .db 0D7h ROM:1700 KEYSTAB: .db 3Bh, 78h, 2, 6Eh, 84h, 7Bh, 0FEh, 0C1h, 2Fh, 7Ch, 74h ROM:1700 ; DATA XREF: KEYSOFF2+5o ROM:1700 .db 31h, 9Ah, 7Dh, 84h, 3Dh, 5Ah, 7Dh, 0C8h, 7Fh, 91h ; Системная таблица обработчика функциональных клавиш. ROM:1700 .db 7Eh, 0E4h, 0BBh, 4Ch, 7Eh, 6Ch, 0AAh, 0AAh, 7Fh, 0 ROM:1700 .db 0, 0, 81h, 0, 0 ROM:1724 ; --------------------------------------------------------------------------- ROM:1724 ROM:1724 PEEK: ; Обработка Бейсик оператора PEEK ROM:1724 rst 5 ROM:1725 call INTFROMFLOAT ; После этого вызова в DE у нас адрес ROM:1728 ldax d ; Тут собственно и есть фунцкия PEEK. В A попадает нужный байт. ROM:1729 jmp SHORTINT ; Получение короткого целого из A ROM:172C ; --------------------------------------------------------------------------- ROM:172C ROM:172C POKE: ; Обработка Бейсик оператора POKE ROM:172C call EVALEXPRESSION ROM:172F rst 5 ; RST5 = Проверяет состояние FACCUM. ROM:172F ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно ROM:172F ; (0xFF если отрицательно, 0x01 если положительно). ROM:1730 call INTFROMFLOAT ; После этого вызова в DE у нас адрес ROM:1733 jmp loc_1067 ROM:1736 ; --------------------------------------------------------------------------- ROM:1736 ROM:1736 USR: ; Бейсик-оператор USR ROM:1736 rst 5 ROM:1737 call INTFROMFLOAT ; Получение целого числа из числа с плавающей точкой ROM:173A xchg ROM:173B call USRTR ; Подпрограмма USR ROM:173E jmp SHORTINT ; Получение короткого целого из A ROM:1741 ROM:1741 ; =============== S U B R O U T I N E ======================================= ROM:1741 ROM:1741 ; Подпрограмма USR ROM:1741 ROM:1741 USRTR: ; CODE XREF: ROM:173Bp ROM:1741 pchl ROM:1741 ; End of function USRTR ROM:1741 ROM:1742 ; --------------------------------------------------------------------------- ROM:1742 ; START OF FUNCTION CHUNK FOR START ROM:1742 ROM:1742 INIT2: ; CODE XREF: START+29A1j ROM:1742 mvi a, 2Ch ; ',' ROM:1744 sta PRNOP ; Временная переменная. Используется TOKENIZE, INPUTLN, START. ROM:1747 xra a ROM:1748 sta 4000h ROM:174B lxi h, PROMPT ; Начальная заставка. ROM:174E mvi a, 2 ROM:1750 call EDIT ; A=флажки, HL=адрес, D=строка курсора, E=позиция курсора ROM:1750 ; (A=0 редактирование ROM:1750 ; A=1 установка курсора ROM:1750 ; A=2 вывод текста на экран с текущего положения курсора ROM:1750 ; A=3 установка курсора и вывод текста ROM:1750 ; A=4 вывод строк) ROM:1753 call NEW2 ; Сброс бейсик-программы к исходному состоянию ROM:1753 ; Дополнительная точка входа. ROM:1756 jmp MAINLOOP3 ; Третья точка входа в главный цикл. Переход из INIT2, STOP, CSAVE, OUTCHAR2, INPUTLN ROM:1756 ; END OF FUNCTION CHUNK FOR START ROM:1756 ; --------------------------------------------------------------------------- ROM:1759 PROMPT: .db 0Ch, 'Ё', 'ы', '8', '0', '0', '0', ' ', 'B', 'A', 'S' ROM:1759 ; DATA XREF: START+174Bo ROM:1759 .db 'I', 'C', ' ', ' ', '1', '9', '8', '7', ' ', ' ', '+' ; Начальная заставка. ROM:1759 .db '+', 'T', 'L', 'г', 'T', ' ', '1', '.', '2', 0Dh, 0Ah ROM:1759 .db '4', '6', '8', '7', '3', ' ', 'B', 'y', 't', 'e', 's' ROM:1759 .db ' ', 'f', 'r', 'e', 'e', 0Dh, 0Ah, 0 ROM:178D ; --------------------------------------------------------------------------- ROM:178D ; START OF FUNCTION CHUNK FOR EVALTERM ROM:178D ROM:178D loc_178D: ; CODE XREF: EVALTERM+64j ROM:178D jc loc_A65 ROM:1790 cpi 3Fh ; '?' ROM:1792 jc loc_A4C ROM:1795 cpi 4Fh ; 'O' ROM:1797 jc loc_A68 ROM:179A jmp SYNTAXERROR ; Самая распространённая ошибка №2 ROM:179A ; END OF FUNCTION CHUNK FOR EVALTERM ROM:179A ; --------------------------------------------------------------------------- ROM:179D KW_ARITH_OP_FNS:.db 79h ; y ; DATA XREF: COMPUTE2+4Eo ROM:179D ; FADD = 144C ROM:179E .dw FADD ; FACCUM = FACCUM + BCDEONSTK. Ещё одна точка входа. ROM:17A0 .db 79h ; y ; FSUB = 107D ROM:17A1 .dw loc_107C+1 ; FACCUM = FACCUM - BCDEONSTK ROM:17A1 ; ROM:17A1 ; 107D:FSUB:POP B ROM:17A1 ; POP D ROM:17A3 .db 7Bh ; { ; FMUL = 11BA ROM:17A4 .dw loc_11B9+1 ; FACCUM = FACCUM * BCDEONSTK ROM:17A4 ; ROM:17A4 ; 11BA:FMUL:POP B ROM:17A4 ; POP D ROM:17A6 .db 7Bh ; { ; FDIV = 1218 ROM:17A7 .dw FDIV ; FACCUM = FACCUM / BCDEONSTK ROM:17A9 ; --------------------------------------------------------------------------- ROM:17A9 mov a, a ROM:17AA mov e, l ROM:17AB dcr d ROM:17AC mov d, b ROM:17AD mov m, a ROM:17AE ldax b ROM:17AF mov b, m ROM:17B0 hlt ROM:17B1 ldax b ROM:17B2 ROM:17B2 LOCATE: ; Бейсик оператор LOCATE ROM:17B2 call GETINTPARAM ROM:17B5 mov e, a ROM:17B6 push d ROM:17B7 rst 1 ; RST1 = проверка синтаксиса. ROM:17B7 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:17B7 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:17B7 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:17B7 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:17B8 inr l ROM:17B9 call GETINTPARAM ; Получаем в A целочисленный параметр для команды Бейсика ROM:17BC pop d ROM:17BD mov d, a ROM:17BE mvi a, 1 ROM:17C0 push h ROM:17C1 call EDIT ; A=флажки, HL=адрес, D=строка курсора, E=позиция курсора ROM:17C1 ; (A=0 редактирование ROM:17C1 ; A=1 установка курсора ROM:17C1 ; A=2 вывод текста на экран с текущего положения курсора ROM:17C1 ; A=3 установка курсора и вывод текста ROM:17C1 ; A=4 вывод строк) ROM:17C4 pop h ROM:17C5 ret ROM:17C6 ; --------------------------------------------------------------------------- ROM:17C6 ROM:17C6 CLS: ; Бейсик-оператор CLS ROM:17C6 push h ROM:17C7 mvi a, 0Ch ROM:17C9 rst 3 ; RST3 = печатает символ из A на экран. ROM:17CA pop h ROM:17CB ret ROM:17CC ; --------------------------------------------------------------------------- ROM:17CC ; START OF FUNCTION CHUNK FOR TOKENIZE ROM:17CC ROM:17CC loc_17CC: ; CODE XREF: TOKENIZE-19F5j ROM:17CC jz loc_42C ROM:17CF ori 20h ROM:17D1 cmp m ROM:17D2 jz loc_42C ROM:17D5 ldax d ROM:17D6 jmp loc_460 ROM:17D6 ; END OF FUNCTION CHUNK FOR TOKENIZE ROM:17D9 ; --------------------------------------------------------------------------- ROM:17D9 ; START OF FUNCTION CHUNK FOR PRNTR1 ROM:17D9 ROM:17D9 loc_17D9: ; CODE XREF: PRNTR1-12B4j ROM:17D9 jp loc_530 ROM:17DC ani 7Fh ROM:17DE jmp loc_2230 ROM:17DE ; END OF FUNCTION CHUNK FOR PRNTR1 ROM:17E1 ROM:17E1 ; =============== S U B R O U T I N E ======================================= ROM:17E1 ROM:17E1 ; Подпрограмма обработчика печати ROM:17E1 ROM:17E1 PRNTR1: ; CODE XREF: PRNTR1:loc_511p ROM:17E1 ; PRNTR1:loc_17F0p ROM:17E1 ROM:17E1 ; FUNCTION CHUNK AT ROM:04F7 SIZE 0000003E BYTES ROM:17E1 ; FUNCTION CHUNK AT ROM:17D9 SIZE 00000008 BYTES ROM:17E1 ; FUNCTION CHUNK AT ROM:17EB SIZE 00000010 BYTES ROM:17E1 ; FUNCTION CHUNK AT ROM:2230 SIZE 00000010 BYTES ROM:17E1 ROM:17E1 rst 3 ; RST3 = печатает символ из A на экран. ROM:17E2 mov a, m ROM:17E3 ora a ROM:17E4 inx h ROM:17E5 rnz ROM:17E6 inx sp ROM:17E7 inx sp ROM:17E8 jmp loc_4F7 ROM:17E8 ; End of function PRNTR1 ROM:17E8 ROM:17EB ; --------------------------------------------------------------------------- ROM:17EB ; START OF FUNCTION CHUNK FOR PRNTR1 ROM:17EB ROM:17EB loc_17EB: ; CODE XREF: PRNTR1-12D3j ROM:17EB ; PRNTR1-12CDj ROM:17EB cpi 22h ; '"' ROM:17ED jnz loc_511 ROM:17F0 ROM:17F0 loc_17F0: ; CODE XREF: PRNTR1+14j ROM:17F0 call PRNTR1 ; Подпрограмма обработчика печати ROM:17F3 cpi 22h ; '"' ROM:17F5 jnz loc_17F0 ROM:17F8 jmp loc_511 ROM:17F8 ; END OF FUNCTION CHUNK FOR PRNTR1 ROM:17FB ROM:17FB ; =============== S U B R O U T I N E ======================================= ROM:17FB ROM:17FB ; Рисование точки белым цветом (FD90 координата X, FD91 координата Y) ROM:17FB ROM:17FB PRESETWT2: ; CODE XREF: PRESETWTj ROM:17FB ; ROM:1BD0p ... ROM:17FB ROM:17FB ; FUNCTION CHUNK AT ROM:1829 SIZE 00000003 BYTES ROM:17FB ROM:17FB mvi b, 10h ROM:17FD jmp loc_180C ROM:1800 ; --------------------------------------------------------------------------- ROM:1800 ROM:1800 PRESET: ; Обработка Бейсик оператора PRESET ROM:1800 inx h ROM:1801 lxi b, X1 ; Первый графический курсор, координата X ROM:1804 call PSETTR ; Обработка PSET/PRESET/LINE. Получение всех параметров. ROM:1804 ; Есть ли токен STEP. Заполняем PSETX, PSETY. Указал ли цвет и если да, то читаем его. ROM:1807 jz loc_1829 ROM:180A mvi b, 11h ROM:180C ROM:180C loc_180C: ; CODE XREF: PRESETWT2+2j ROM:180C lda PSETC ; Цвет точки у команды PSET ROM:180F sta PRESETC ; Временное значение цвета для команды PRESET ROM:1812 mov a, b ROM:1813 sta PSETC ; Цвет точки у команды PSET ROM:1816 call PSET_ASM ; Тут ассемблерная обработка команды PSET. Все параметры получены. ROM:1819 push psw ROM:181A lda PRESETC ; Временное значение цвета для команды PRESET ROM:181D sta PSETC ; Цвет точки у команды PSET ROM:1820 pop psw ROM:1821 ret ROM:1821 ; End of function PRESETWT2 ROM:1821 ROM:1822 ; --------------------------------------------------------------------------- ROM:1822 ROM:1822 PSET: ; Обработка Бейсик оператора PSET ROM:1822 inx h ROM:1823 lxi b, X1 ; Первый графический курсор, координата X ROM:1826 call PSETTR ; Обработка PSET/PRESET/LINE. Получение всех параметров. ROM:1826 ; Есть ли токен STEP. Заполняем PSETX, PSETY. Указал ли цвет и если да, то читаем его. ROM:1829 ; START OF FUNCTION CHUNK FOR PRESETWT2 ROM:1829 ROM:1829 loc_1829: ; CODE XREF: PRESETWT2+Cj ROM:1829 cz PSETCLR ; Обрабатываем параметр цвет у команды PSET ROM:1829 ; END OF FUNCTION CHUNK FOR PRESETWT2 ROM:182C ROM:182C ; =============== S U B R O U T I N E ======================================= ROM:182C ROM:182C ; Тут ассемблерная обработка команды PSET. Все параметры получены. ROM:182C ROM:182C PSET_ASM: ; CODE XREF: PRESETWT2+1Bp ROM:182C ; LINE_ASM+6Bp ROM:182C push h ROM:182D lhld X1 ; Первый графический курсор, координата X ROM:1830 mov a, h ROM:1831 cpi 0C0h ; 'L' ; Сравниваем координату с 192 (&hC0) ROM:1833 jnc loc_1876 ROM:1836 ani 0F8h ROM:1838 rrc ROM:1839 rrc ROM:183A rrc ROM:183B mov d, a ROM:183C mov a, h ROM:183D ani 7 ROM:183F mov e, a ROM:1840 mov a, l ROM:1841 ani 0F8h ROM:1843 ora e ROM:1844 mov e, a ROM:1845 mov a, l ROM:1846 call PSETBIT ; Обработка отдельного бита в команде PSET ROM:1849 lda PSETC ; Цвет точки у команды PSET ROM:184C mov c, a ROM:184D lhld GTBL1 ; Адрес таблицы точек изображения в режиме 2 ROM:1850 dad d ROM:1851 mov d, h ROM:1852 mov e, l ROM:1853 cpi 10h ; Цветов всего 15 ROM:1855 push d ROM:1856 call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM). ROM:1859 mov d, a ROM:185A mov a, b ROM:185B jc loc_1867 ROM:185E jz loc_1878 ROM:1861 cma ROM:1862 ana d ROM:1863 mov m, a ROM:1864 jmp loc_1874 ROM:1867 ; --------------------------------------------------------------------------- ROM:1867 ROM:1867 loc_1867: ; CODE XREF: PSET_ASM+2Fj ROM:1867 ora d ROM:1868 mov m, a ROM:1869 mov a, h ROM:186A xri 20h ROM:186C mov h, a ROM:186D call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM). ROM:1870 ani 0F0h ROM:1872 ora c ROM:1873 mov m, a ROM:1874 ROM:1874 loc_1874: ; CODE XREF: PSET_ASM+38j ROM:1874 ; PSET_ASM+54j ROM:1874 mov a, d ROM:1875 pop d ROM:1876 ROM:1876 loc_1876: ; CODE XREF: PSET_ASM+7j ROM:1876 ; LINE_ASM+32j ... ROM:1876 pop h ROM:1877 ret ROM:1878 ; --------------------------------------------------------------------------- ROM:1878 ROM:1878 loc_1878: ; CODE XREF: PSET_ASM+32j ROM:1878 mov a, h ROM:1879 xri 20h ROM:187B mov h, a ROM:187C call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM). ROM:187F mov c, a ROM:1880 jmp loc_1874 ROM:1880 ; End of function PSET_ASM ROM:1880 ROM:1880 ; --------------------------------------------------------------------------- ROM:1883 BITS80: .db 10000000b ; DATA XREF: PSETBIT+5o ROM:1884 BITS40: .db 1000000b ROM:1885 BITS20: .db 100000b ROM:1886 BITS10: .db 10000b ROM:1887 BITS08: .db 1000b ROM:1888 BITS04: .db 100b ROM:1889 BITS02: .db 10b ROM:188A BITS01: .db 1 ROM:188B ; --------------------------------------------------------------------------- ROM:188B ROM:188B SAVE: ; Обработка оператора SAVE ROM:188B call TAPE2 ROM:188E push h ROM:188F mvi a, 81h ; 'Б' ROM:1891 call SALOTR ; Подпрограмма обработки ленточных команд SAVE, LOAD и CSAVE, CLOAD и BSAVE, BLOAD ROM:1894 mvi a, 1 ROM:1896 sta TERMINAL_X ; Переменная, контролирующая текущую X позицию вывода терминала. ROM:1899 lxi h, IOBUF ; Буфер ввода-вывода (диск, кассеты) ROM:189C shld OUTTMP ; Временная переменная редактора ROM:189F xra a ROM:18A0 mov m, a ROM:18A1 pop h ROM:18A2 jmp LIST ; Обработка бейсик-команды LIST ROM:18A5 ; --------------------------------------------------------------------------- ROM:18A5 ROM:18A5 CSAVE: ; Обработка оператора CSAVE ROM:18A5 call TAPE2 ROM:18A8 push h ROM:18A9 lhld ENBASPRG ; Адрес конца Бейсик программы. ROM:18A9 ; Указывает на первую ячейку участка памяти, доступного программам. ROM:18A9 ; Всегда следует за последним байтом программы. ROM:18AC xchg ROM:18AD lhld BGBASPRG ; Адрес начала Бейсик программы ROM:18B0 call MACRO4 ROM:18B3 lhld BGBASPRG ; Адрес начала Бейсик программы ROM:18B6 mvi a, 83h ; 'Г' ROM:18B8 ROM:18B8 loc_18B8: ; CODE XREF: ROM:18D1j ROM:18B8 ; ROM:19A6j ... ROM:18B8 call SALOTR ; Подпрограмма обработки ленточных команд SAVE, LOAD и CSAVE, CLOAD и BSAVE, BLOAD ROM:18BB ei ROM:18BC shld INTAR+4 ; Рабочая область обработки прерываний ROM:18BF pop h ROM:18C0 jc MAINLOOP3 ; Третья точка входа в главный цикл. Переход из INIT2, STOP, CSAVE, OUTCHAR2, INPUTLN ROM:18C3 ret ROM:18C4 ; --------------------------------------------------------------------------- ROM:18C4 ROM:18C4 CLOAD: ; Обработка оператора CLOAD ROM:18C4 call TAPE ROM:18C7 lxi d, loc_18D4 ROM:18CA push d ROM:18CB push h ROM:18CC lhld BGBASPRG ; Адрес начала Бейсик программы ROM:18CF mvi a, 3 ROM:18D1 jmp loc_18B8 ROM:18D4 ; --------------------------------------------------------------------------- ROM:18D4 ROM:18D4 loc_18D4: ; DATA XREF: ROM:18C7o ROM:18D4 lda CASCMP ; Флаг сравнения ROM:18D7 ana a ROM:18D8 rz ROM:18D9 xchg ROM:18DA lhld INTAR+4 ; Рабочая область обработки прерываний ROM:18DD lxi b, TMPBUF+11Dh ; Временный буфер CLOAD ROM:18E0 dad b ROM:18E1 shld ENBASPRG ; Адрес конца Бейсик программы. ROM:18E1 ; Указывает на первую ячейку участка памяти, доступного программам. ROM:18E1 ; Всегда следует за последним байтом программы. ROM:18E4 xchg ROM:18E5 ret ROM:18E6 ROM:18E6 ; =============== S U B R O U T I N E ======================================= ROM:18E6 ROM:18E6 ; Подготавливаем параметры для LINE ROM:18E6 ROM:18E6 LINETR: ; CODE XREF: ROM:1902p ROM:18E6 ; ROM:GETp ROM:18E6 inx h ROM:18E7 lxi b, X1 ; Первый графический курсор, координата X ROM:18EA cpi 0A5h ; 'е' ROM:18EC jz loc_18F4 ROM:18EF call PSETTR ; Обработка PSET/PRESET/LINE. Получение всех параметров. ROM:18EF ; Есть ли токен STEP. Заполняем PSETX, PSETY. Указал ли цвет и если да, то читаем его. ROM:18F2 rst 1 ; RST1 = проверка синтаксиса. ROM:18F2 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:18F2 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:18F2 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:18F2 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:18F2 ; --------------------------------------------------------------------------- ROM:18F3 .db 0A5h ; - (токен 165 (&hA5)) ROM:18F4 ; --------------------------------------------------------------------------- ROM:18F4 ROM:18F4 loc_18F4: ; CODE XREF: LINETR+6j ROM:18F4 mov a, m ROM:18F5 inx h ROM:18F6 lxi b, X2 ; Второй графический курсор, координата X ROM:18F9 call PSETTR ; Обработка PSET/PRESET/LINE. Получение всех параметров. ROM:18F9 ; Есть ли токен STEP. Заполняем PSETX, PSETY. Указал ли цвет и если да, то читаем его. ROM:18FC ret ROM:18FC ; End of function LINETR ROM:18FC ROM:18FD ; --------------------------------------------------------------------------- ROM:18FD ROM:18FD LINE: ; Обработка Бейсик оператора LINE ROM:18FD cpi 84h ; 'Д' ROM:18FF jz SYNTAXERROR ; Самая распространённая ошибка №2 ROM:1902 call LINETR ; Подготавливаем параметры для LINE ROM:1905 jz LINEBBF ; Обработка оператора LINE с параметрами B и BF ROM:1908 ROM:1908 ; =============== S U B R O U T I N E ======================================= ROM:1908 ROM:1908 ; Тут ассемблерная обработка команды LINE. Все параметры получены. ROM:1908 ROM:1908 LINE_ASM: ; CODE XREF: LINEBTR+4p ROM:1908 ; ROM:1BBDj ROM:1908 push h ROM:1909 lxi h, 100h ROM:190C shld LINE100 ; Параметр команды LINE ROM:190F ROM:190F loc_190F: ROM:190F lxi h, 1 ROM:1912 shld LINE1 ; Параметр команды LINE ROM:1915 call LINECLC ; Расчет точек для LINE ROM:1918 mov a, e ROM:1919 cmp d ROM:191A jnc loc_1933 ROM:191D mov b, e ROM:191E mov e, d ROM:191F mov d, b ROM:1920 lda LINE1 ; Параметр команды LINE ROM:1923 sta LINE100 ; Параметр команды LINE ROM:1926 lda LINE100_ ; Параметр команды LINE ROM:1929 sta LINE1_ ; Параметр команды LINE ROM:192C xra a ROM:192D sta LINE1 ; Параметр команды LINE ROM:1930 sta LINE100_ ; Параметр команды LINE ROM:1933 ROM:1933 loc_1933: ; CODE XREF: LINE_ASM+12j ROM:1933 mov a, e ROM:1934 rar ROM:1935 mov c, a ROM:1936 mvi b, 1 ROM:1938 ROM:1938 loc_1938: ; CODE XREF: LINE_ASM+70j ROM:1938 mov a, e ROM:1939 cmp b ROM:193A jc loc_1876 ROM:193D lhld X1 ; Первый графический курсор, координата X ROM:1940 lda LINE1 ; Параметр команды LINE ROM:1943 add l ROM:1944 sta X1 ; Первый графический курсор, координата X ROM:1947 lda LINE1_ ; Параметр команды LINE ROM:194A add h ROM:194B sta Y1 ; Первый графический курсор, координата Y ROM:194E mov a, d ROM:194F add c ROM:1950 mov c, a ROM:1951 inr b ROM:1952 jz loc_1876 ROM:1955 jc loc_195E ROM:1958 mov a, e ROM:1959 cmp c ROM:195A jnc loc_1971 ROM:195D mov a, c ROM:195E ROM:195E loc_195E: ; CODE XREF: LINE_ASM+4Dj ROM:195E sub e ROM:195F mov c, a ROM:1960 lhld X1 ; Первый графический курсор, координата X ROM:1963 lda LINE100 ; Параметр команды LINE ROM:1966 add l ROM:1967 sta X1 ; Первый графический курсор, координата X ROM:196A lda LINE100_ ; Параметр команды LINE ROM:196D add h ROM:196E sta Y1 ; Первый графический курсор, координата Y ROM:1971 ROM:1971 loc_1971: ; CODE XREF: LINE_ASM+52j ROM:1971 push b ROM:1972 push d ROM:1973 call PSET_ASM ; Тут ассемблерная обработка команды PSET. Все параметры получены. ROM:1976 pop d ROM:1977 pop b ROM:1978 jmp loc_1938 ROM:1978 ; End of function LINE_ASM ROM:1978 ROM:197B ; --------------------------------------------------------------------------- ROM:197B ROM:197B INKEY: ; Обработка бейсик-функции INKEY ROM:197B call KBDBUFAK ROM:197E jz loc_1989 ROM:1981 call BUFFERTOA ; Ввод символа из буфера клавиатуры в A. ROM:1981 ; Если буфер пуст - ожидание нажатия. ROM:1984 sta INTAR+20h ; Рабочая область обработки прерываний ROM:1987 mvi a, 1 ROM:1989 ROM:1989 loc_1989: ; CODE XREF: ROM:197Ej ROM:1989 ; ROM:1FD3j ROM:1989 push psw ROM:198A call MAINTR7 ; Вызов MAINTR5 и переход в MAINTR3 ROM:198D pop psw ROM:198E lhld CHARTBL ; Таблица символов функции CHR ROM:1991 xchg ROM:1992 lxi b, INTAR+20h ; Рабочая область обработки прерываний ROM:1995 mov l, a ROM:1996 ROM:1996 loc_1996: ; Проверка L, загрузка в A из (BC), выгрузка в (DE) в цикле ROM:1996 call MAINTR6 ROM:1999 jmp loc_F10 ROM:199C ; --------------------------------------------------------------------------- ROM:199C ROM:199C BLOAD: ; Обработка оператора BLOAD ROM:199C call TAPE ROM:199F mvi a, 2 ROM:19A1 lxi d, loc_19A9 ROM:19A4 push d ROM:19A5 push h ROM:19A6 jmp loc_18B8 ROM:19A9 ; --------------------------------------------------------------------------- ROM:19A9 ROM:19A9 loc_19A9: ; DATA XREF: ROM:19A1o ROM:19A9 mov a, m ROM:19AA cpi 2Ch ; ',' ROM:19AC rnz ROM:19AD inx h ROM:19AE mov a, m ROM:19AF cpi 52h ; 'R' ROM:19B1 jnz SYNTAXERROR ; Самая распространённая ошибка №2 ROM:19B4 lhld INTAR+4 ; Рабочая область обработки прерываний ROM:19B7 pchl ROM:19B8 ; --------------------------------------------------------------------------- ROM:19B8 ROM:19B8 LOAD: ; Обработка оператора LOAD ROM:19B8 call TAPE ROM:19BB mvi a, 1 ROM:19BD lxi d, loc_19C8 ROM:19C0 push d ROM:19C1 push h ROM:19C2 lhld LOADADDR ; Адрес загрузки для LOAD ROM:19C5 jmp loc_18B8 ROM:19C8 ; --------------------------------------------------------------------------- ROM:19C8 ROM:19C8 loc_19C8: ; DATA XREF: ROM:19BDo ROM:19C8 call NEW2 ; Сброс бейсик-программы к исходному состоянию ROM:19C8 ; Дополнительная точка входа. ROM:19CB lhld LOADADDR ; Адрес загрузки для LOAD ROM:19CE shld EITMP ; Временная переменная. Используется в INPUTLN, ERRTR2 ROM:19D1 lxi h, 0FFFFh ROM:19D4 shld BASOPNUM ; Номер оператора Бейсик программы. ROM:19D4 ; Или &hFFFF в командном режиме ROM:19D7 jmp loc_30D ; НУ ВОТ, СОБСТВЕННО! ЭТО И ЕСТЬ САМЫЙ ГЛАВНЫЙ ЦИКЛ БЕЙСИК-ИНТЕРПРЕТАТОРА! ROM:19DA ; --------------------------------------------------------------------------- ROM:19DA ROM:19DA BSAVE: ; Обработка оператора BSAVE ROM:19DA call TAPE2 ROM:19DD call GETPRM2 ; Ждем появление запятой и считываем параметр, следующий за ней ROM:19E0 push d ROM:19E1 call GETPRM2 ; Ждем появление запятой и считываем параметр, следующий за ней ROM:19E4 push d ROM:19E5 call GETPRM2 ; Ждем появление запятой и считываем параметр, следующий за ней ROM:19E8 shld INTAR+4 ; Рабочая область обработки прерываний ROM:19EB pop b ROM:19EC pop h ROM:19ED push d ROM:19EE push h ROM:19EF mov d, b ROM:19F0 mov e, c ROM:19F1 call MACRO4 ROM:19F4 pop h ROM:19F5 pop d ROM:19F6 push h ROM:19F7 lhld INTAR+4 ; Рабочая область обработки прерываний ROM:19FA xthl ROM:19FB mvi a, 82h ; 'В' ROM:19FD jmp loc_18B8 ROM:1A00 ; --------------------------------------------------------------------------- ROM:1A00 ROM:1A00 COLOR: ; Обработка Бейсик оператора COLOR ROM:1A00 call GETINTPARAM ROM:1A03 sta CPP ; цвет изображения ROM:1A06 rst 1 ; RST1 = проверка синтаксиса. ROM:1A06 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:1A06 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:1A06 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:1A06 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:1A06 ; --------------------------------------------------------------------------- ROM:1A07 .db ',' ROM:1A08 ; --------------------------------------------------------------------------- ROM:1A08 call GETINTPARAM ; Получаем в A целочисленный параметр для команды Бейсика ROM:1A0B sta CZP ; цвет фона ROM:1A0E rst 1 ; RST1 = проверка синтаксиса. ROM:1A0E ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:1A0E ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:1A0E ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:1A0E ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:1A0E ; --------------------------------------------------------------------------- ROM:1A0F .db ',' ROM:1A10 ; --------------------------------------------------------------------------- ROM:1A10 call GETINTPARAM ; Получаем в A целочисленный параметр для команды Бейсика ROM:1A13 sta CRG ; цвет рамки ROM:1A16 call SETCOLOR ; CPP=(FA24) цвет точки CZP=(FA25) цвет фона CRG=(FA26) цвет рамки (установка цвета). ROM:1A19 ret ROM:1A1A ; --------------------------------------------------------------------------- ROM:1A1A ROM:1A1A SCREEN: ; Обработка Бейсик оператора SCREEN ROM:1A1A call GETINTPARAM ROM:1A1D cpi 3 ; Режим может быть только 0, 1 и 2 ROM:1A1F jnc SYNTAXERROR ; Самая распространённая ошибка №2 ROM:1A22 call SETMODE ; A=режим (установка режима 0, 1, 2) ROM:1A25 ret ROM:1A26 ; --------------------------------------------------------------------------- ROM:1A26 ROM:1A26 WIDTH: ; Обработка оператора WIDTH ROM:1A26 call GETINTPARAM ROM:1A29 push h ROM:1A2A call SCRLEN ; Возвращает в аккумулятор длину строки экрана в символах ROM:1A2D pop h ROM:1A2E jc SYNTAXERROR ; Самая распространённая ошибка №2 ROM:1A31 ret ROM:1A32 ; --------------------------------------------------------------------------- ROM:1A32 ROM:1A32 MOTOR: ; Обработка бейсик-оператора MOTOR ROM:1A32 rz ROM:1A33 cpi 91h ; 'С' ROM:1A35 in 82h ROM:1A37 inx h ROM:1A38 jnz loc_1A40 ROM:1A3B ori 10h ROM:1A3D out 82h ROM:1A3F ret ROM:1A40 ; --------------------------------------------------------------------------- ROM:1A40 ROM:1A40 loc_1A40: ; CODE XREF: ROM:1A38j ROM:1A40 ani 0EFh ROM:1A42 out 82h ROM:1A44 ret ROM:1A45 ; --------------------------------------------------------------------------- ROM:1A45 ROM:1A45 RESTORE: ; Обработка бейсик оператора RESTORE ROM:1A45 jz READPT ROM:1A48 call LINENUMBERFROMSTR ; Возвращает в DE номер бейсик-строки из параметра GOTO, LIST, GOSUB, RESTORE, ON... ROM:1A48 ; А также номер строки в самой бейсик-программе. ROM:1A48 ; Чуть подробнее: Получает номер строки из указателя на строку. ROM:1A48 ; Указатель строки передается в HL, и целый результат возвращается в DE. ROM:1A48 ; Лидирующие пробелы пропускаются, и возврат происходит при найденном первом символе не являющемся цифрой. ROM:1A48 ; Максимально допустимое число строк 65529. Синтаксическая ошибка появится, если значение первых четырех цифр более 6552. ROM:1A48 ; Одной из интересных особенностей этой функции является то, что он устанавливает Z, если найден правильный номер (или строка была пустой), ROM:1A48 ; или NZ, если строка не начинается с номера. ROM:1A48 ; ROM:1A4B push h ROM:1A4C call GOTOPRE ; Подготавливает переход на строку бейсик-программы ROM:1A4F pop d ROM:1A50 jmp loc_5E0 ROM:1A53 ; --------------------------------------------------------------------------- ROM:1A53 ROM:1A53 STRIG: ; Обработка бейсик функции STRIG ROM:1A53 mvi b, 5 ROM:1A55 call KEYRQ ; Опрос игровых манипуляторов ROM:1A58 push h ROM:1A59 call ASKBTN ; Опрос состояния кнопки. ROM:1A59 ; A=код (0,1,2): ROM:1A59 ; 0 - клавиатура, ROM:1A59 ; 1 - джойстик №1, ROM:1A59 ; 2 - джойстик №2. ROM:1A59 ; (A=состояние кнопки (пробел - клавиатуры), ROM:1A59 ; 0 - не нажата, ROM:1A59 ; 1 - нажата) ROM:1A5C pop h ROM:1A5D jmp SHORTINT ; Получение короткого целого из A ROM:1A60 ; --------------------------------------------------------------------------- ROM:1A60 ROM:1A60 STICK: ; JОбработка бейсик функции STICK ROM:1A60 mvi b, 3 ROM:1A62 call KEYRQ ; Опрос игровых манипуляторов ROM:1A65 push h ROM:1A66 call JOYDIR ; A=код (0,1,2): ROM:1A66 ; 0 - клавиатура, ROM:1A66 ; 1 - джойстик №1, ROM:1A66 ; 2 - джойстик №2. ROM:1A66 ; (A=код направления: чтение направления, ROM:1A66 ; 8 1 2 ROM:1A66 ; 7<-0->3 ROM:1A66 ; 6 5 4 ROM:1A69 pop h ROM:1A6A jmp SHORTINT ; Получение короткого целого из A ROM:1A6D ROM:1A6D ; =============== S U B R O U T I N E ======================================= ROM:1A6D ROM:1A6D ; Опрос игровых манипуляторов ROM:1A6D ROM:1A6D KEYRQ: ; CODE XREF: ROM:1A55p ROM:1A6D ; ROM:1A62p ... ROM:1A6D push b ROM:1A6E call loc_FBC ROM:1A71 pop b ROM:1A72 cmp b ROM:1A73 jnc FUNCTIONCALLERROR ; Ошибка вызова функции ROM:1A76 ret ROM:1A76 ; End of function KEYRQ ROM:1A76 ROM:1A77 ; --------------------------------------------------------------------------- ROM:1A77 ROM:1A77 END: ; Обработка бейсик оператора END ROM:1A77 ana a ROM:1A78 jmp loc_5F2 ROM:1A7B ; --------------------------------------------------------------------------- ROM:1A7B ROM:1A7B CSRLIN: ; Обработка бейсик функции CSRLIN ROM:1A7B lda SK ROM:1A7E jmp SHORTINT ; Получение короткого целого из A ROM:1A81 ; --------------------------------------------------------------------------- ROM:1A81 ROM:1A81 VPEEK: ; Обработка бейсик функции VPEEK ROM:1A81 call VPEEKTR ROM:1A84 xchg ROM:1A85 call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM). ROM:1A88 xchg ROM:1A89 jmp SHORTINT ; Получение короткого целого из A ROM:1A8C ; --------------------------------------------------------------------------- ROM:1A8C ROM:1A8C VPOKE: ; Обработка бейсик функции VPOKE ROM:1A8C call EVALEXPRESSION ROM:1A8F call VPEEKTR ; Подпрограмма обработки функции VPEEK ROM:1A92 jmp loc_1067 ROM:1A95 ROM:1A95 ; =============== S U B R O U T I N E ======================================= ROM:1A95 ROM:1A95 ; Подпрограмма обработки функции VPEEK ROM:1A95 ROM:1A95 VPEEKTR: ; CODE XREF: ROM:VPEEKp ROM:1A95 ; ROM:1A8Fp ROM:1A95 rst 5 ; RST5 = Проверяет состояние FACCUM. ROM:1A95 ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно ROM:1A95 ; (0xFF если отрицательно, 0x01 если положительно). ROM:1A96 call INTFROMFLOAT ; Получение целого числа из числа с плавающей точкой ROM:1A99 ROM:1A99 loc_1A99: ; CODE XREF: ROM:1D30p ROM:1A99 mov a, d ROM:1A9A ani 0C0h ROM:1A9C jnz FUNCTIONCALLERROR ; Ошибка вызова функции ROM:1A9F in 84h ROM:1AA1 ani 0C0h ROM:1AA3 ora d ROM:1AA4 mov d, a ROM:1AA5 ret ROM:1AA5 ; End of function VPEEKTR ROM:1AA5 ROM:1AA6 ROM:1AA6 ; =============== S U B R O U T I N E ======================================= ROM:1AA6 ROM:1AA6 ; Подпрограмма обработки Бейсик оператора LINE с параметром B ROM:1AA6 ROM:1AA6 LINEBTR: ; CODE XREF: ROM:1AE1p ROM:1AA6 ; ROM:1AE7p ... ROM:1AA6 push d ROM:1AA7 shld X2 ; Второй графический курсор, координата X ROM:1AAA call LINE_ASM ; Тут ассемблерная обработка команды LINE. Все параметры получены. ROM:1AAD pop d ROM:1AAE ret ROM:1AAE ; End of function LINEBTR ROM:1AAE ROM:1AAF ; --------------------------------------------------------------------------- ROM:1AAF ; START OF FUNCTION CHUNK FOR OUTCHAR ROM:1AAF ROM:1AAF loc_1AAF: ; CODE XREF: OUTCHAR:OUTCHAR2j ROM:1AAF pop psw ROM:1AB0 push psw ROM:1AB1 push b ROM:1AB2 push d ROM:1AB3 push h ROM:1AB4 lhld OUTTMP ; Временная переменная редактора ROM:1AB7 mov m, a ROM:1AB8 inx h ROM:1AB9 shld OUTTMP ; Временная переменная редактора ROM:1ABC lxi d, IOBUF+100h ; Буфер ввода-вывода (диск, кассеты) ROM:1ABF rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:1AC0 jnz loc_4C2 ROM:1AC3 lxi h, IOBUF ; Буфер ввода-вывода (диск, кассеты) ROM:1AC6 shld OUTTMP ; Временная переменная редактора ROM:1AC9 call EDITTR1 ; Подпрограмма редактора. Вызывается из EDIT1 и OUTCHAR. ROM:1ACC jnc loc_4C2 ROM:1ACF xra a ROM:1AD0 sta TERMINAL_X ; Переменная, контролирующая текущую X позицию вывода терминала. ROM:1AD3 jmp MAINLOOP3 ; Третья точка входа в главный цикл. Переход из INIT2, STOP, CSAVE, OUTCHAR2, INPUTLN ROM:1AD3 ; END OF FUNCTION CHUNK FOR OUTCHAR ROM:1AD6 ; --------------------------------------------------------------------------- ROM:1AD6 ROM:1AD6 LINEB: ; CODE XREF: ROM:1BC4j ROM:1AD6 push h ; Обработка Бейсик оператора LINE с параметром B ROM:1AD7 lhld X1 ; Первый графический курсор, координата X ROM:1ADA xchg ROM:1ADB lhld X2 ; Второй графический курсор, координата X ROM:1ADE mov a, h ROM:1ADF mov h, d ROM:1AE0 mov d, a ROM:1AE1 call LINEBTR ; Подпрограмма обработки Бейсик оператора LINE с параметром B ROM:1AE4 mov a, h ROM:1AE5 mov h, d ROM:1AE6 mov d, a ROM:1AE7 call LINEBTR ; Подпрограмма обработки Бейсик оператора LINE с параметром B ROM:1AEA mov l, e ROM:1AEB call LINEBTR ; Подпрограмма обработки Бейсик оператора LINE с параметром B ROM:1AEE mov h, d ROM:1AEF call LINEBTR ; Подпрограмма обработки Бейсик оператора LINE с параметром B ROM:1AF2 pop h ROM:1AF3 ret ROM:1AF4 ; --------------------------------------------------------------------------- ROM:1AF4 ROM:1AF4 KEY: ; Обработка оператора KEY ROM:1AF4 push h ROM:1AF5 cpi 0DFh ; '-' ; KEY OFF ROM:1AF7 jz loc_1B36 ROM:1AFA cpi 91h ; 'С' ; KEY ON ROM:1AFC jz loc_1B3C ROM:1AFF pop h ROM:1B00 call GETINTPARAM ; Получаем в A целочисленный параметр для команды Бейсика ROM:1B03 cpi 0Bh ROM:1B05 jnc SYNTAXERROR ; Самая распространённая ошибка №2 ROM:1B08 ana a ROM:1B09 jz SYNTAXERROR ; Самая распространённая ошибка №2 ROM:1B0C dcr a ROM:1B0D xchg ROM:1B0E mov l, a ROM:1B0F dad h ROM:1B10 dad h ROM:1B11 dad h ROM:1B12 dad h ROM:1B13 lxi b, FNKTXT ; Текст функциональных клавиш ROM:1B16 dad b ROM:1B17 xchg ROM:1B18 rst 1 ; RST1 = проверка синтаксиса. ROM:1B18 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:1B18 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:1B18 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:1B18 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:1B18 ; --------------------------------------------------------------------------- ROM:1B19 .db ',' ROM:1B1A ; --------------------------------------------------------------------------- ROM:1B1A push d ROM:1B1B call COMPUTETR1 ; Подпрограмма вычисления выражений. ROM:1B1E xthl ROM:1B1F xchg ROM:1B20 mvi a, 10h ROM:1B22 call MACRO13 ROM:1B25 pop h ROM:1B26 sui 10h ROM:1B28 rc ROM:1B29 cma ROM:1B2A inr a ROM:1B2B mov c, a ROM:1B2C ROM:1B2C loc_1B2C: ; CODE XREF: ROM:1B33j ROM:1B2C mov a, c ROM:1B2D ana a ROM:1B2E rnz ROM:1B2F xra a ROM:1B30 stax d ROM:1B31 inx d ROM:1B32 dcr c ROM:1B33 jmp loc_1B2C ROM:1B36 ; --------------------------------------------------------------------------- ROM:1B36 ROM:1B36 loc_1B36: ; CODE XREF: ROM:1AF7j ROM:1B36 call KEYSOFF ; Выключает нижнюю строку ключей. ROM:1B39 pop h ROM:1B3A rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:1B3A ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:1B3A ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:1B3B ret ROM:1B3C ; --------------------------------------------------------------------------- ROM:1B3C ROM:1B3C loc_1B3C: ; CODE XREF: ROM:1AFCj ROM:1B3C call KEYSON ; Включает нижнюю строку ключей. ROM:1B3F pop h ROM:1B40 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:1B40 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:1B40 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:1B41 ret ROM:1B42 ; --------------------------------------------------------------------------- ROM:1B42 ROM:1B42 LPRINT: ; Обработка команды LPRINT ROM:1B42 mvi a, 1 ROM:1B44 sta PRNFL ; Флаг печати (Для LLIST, LPRINT равен 1) ROM:1B47 jmp PRINT ; Бейсик-оператор PRINT ROM:1B4A ; --------------------------------------------------------------------------- ROM:1B4A ROM:1B4A LLIST: ; Обработка команды LLIST ROM:1B4A mvi a, 1 ROM:1B4C sta PRNFL ; Флаг печати (Для LLIST, LPRINT равен 1) ROM:1B4F jmp LIST ; Обработка бейсик-команды LIST ROM:1B52 ; --------------------------------------------------------------------------- ROM:1B52 ; START OF FUNCTION CHUNK FOR CHECKENOUGHMEM ROM:1B52 ROM:1B52 EXEC: ; CODE XREF: CHECKENOUGHMEM+66j ROM:1B52 mvi a, 3 ROM:1B54 sta EVNTTAB ; Таблица событий. ROM:1B54 ; (УПР/СТОП + 10 функциональных клавиш) ROM:1B54 ; Бит 0 - маска события ROM:1B54 ; Бит 2 - событие ROM:1B57 call CURSOFF ; Выключает изображение курсора. ROM:1B5A call KBDBUFCL ; Очистить буфер клавиатуры. ROM:1B5D jmp EXEC_ ROM:1B5D ; END OF FUNCTION CHUNK FOR CHECKENOUGHMEM ROM:1B60 ROM:1B60 ; =============== S U B R O U T I N E ======================================= ROM:1B60 ROM:1B60 ; Обработка останова ROM:1B60 ROM:1B60 STOPTR: ; CODE XREF: CHECKENOUGHMEM+21p ROM:1B60 ; TESTBREAKKEY2+20p ROM:1B60 sta ASITT ; Временная переменная. Используется в AUTO, STOP, INPUTLN, TOKENIZE, TRETLINE ROM:1B60 ; End of function STOPTR ROM:1B60 ROM:1B63 ROM:1B63 ; =============== S U B R O U T I N E ======================================= ROM:1B63 ROM:1B63 ; Опрашивает флаг печати, формирует таблицу событий, Очищает переменную TERMINAL_X, ROM:1B63 ; устанавливает текстовый режим (MODE), очищает буфер клавиатуры и временные переменные ROM:1B63 ROM:1B63 EDIT1: ; CODE XREF: CHECKENOUGHMEM+43p ROM:1B63 ; ROM:1DF3p ROM:1B63 push d ROM:1B64 lda PRNFL ; Флаг печати (Для LLIST, LPRINT равен 1) ROM:1B67 ana a ROM:1B68 cnz CRLF ; Печатает перевод строки и возврат каретки ROM:1B6B sta EVNTTAB ; Таблица событий. ROM:1B6B ; (УПР/СТОП + 10 функциональных клавиш) ROM:1B6B ; Бит 0 - маска события ROM:1B6B ; Бит 2 - событие ROM:1B6E sta PRNFL ; Флаг печати (Для LLIST, LPRINT равен 1) ROM:1B71 lda TERMINAL_X ; Переменная, контролирующая текущую X позицию вывода терминала. ROM:1B74 ana a ROM:1B75 jz loc_1B90 ROM:1B78 xra a ROM:1B79 sta TERMINAL_X ; Переменная, контролирующая текущую X позицию вывода терминала. ROM:1B7C lxi h, IOBUF+100h ; Буфер ввода-вывода (диск, кассеты) ROM:1B7F xchg ROM:1B80 lhld OUTTMP ; Временная переменная редактора ROM:1B83 push h ROM:1B84 call MACRO4 ROM:1B87 pop h ROM:1B88 mvi a, 1Ah ROM:1B8A call FILLAREA ; A=константа, BC=счетчик, HL=адрес (заполнение области константой) ROM:1B8D call EDITTR1 ; Подпрограмма редактора. Вызывается из EDIT1 и OUTCHAR. ROM:1B90 ROM:1B90 loc_1B90: ; CODE XREF: EDIT1+12j ROM:1B90 call CURSON ; Включает изображение курсора. ROM:1B93 pop d ROM:1B94 lda MODE ; Режим экрана ROM:1B97 cpi 2 ROM:1B99 jc loc_1BA2 ROM:1B9C lda OLDRES ; Старый режим ROM:1B9F call SETMODE ; A=режим (установка режима 0, 1, 2) ROM:1BA2 ROM:1BA2 loc_1BA2: ; CODE XREF: EDIT1+36j ROM:1BA2 call KBDBUFCL ; Очистить буфер клавиатуры. ROM:1BA2 ; End of function EDIT1 ROM:1BA2 ROM:1BA5 ROM:1BA5 ; =============== S U B R O U T I N E ======================================= ROM:1BA5 ROM:1BA5 ; Подпрограмма обработчика ошибок. ROM:1BA5 ROM:1BA5 ERRTR2: ; CODE XREF: ERRTR+18p ROM:1BA5 lxi h, 0 ROM:1BA8 shld ERRES ; Временная переменная обработчика ошибок. ROM:1BAB shld EITMP ; Временная переменная. Используется в INPUTLN, ERRTR2 ROM:1BAE shld ERRTRTMP ; Временная переменная обработчика ошибок ERRTR, ERRTR2 и RESUME. ROM:1BB1 ret ROM:1BB1 ; End of function ERRTR2 ROM:1BB1 ROM:1BB2 ROM:1BB2 ; =============== S U B R O U T I N E ======================================= ROM:1BB2 ROM:1BB2 ; Очищает флаг печати (PRNFL=0, т. е. вывод на экран) ROM:1BB2 ROM:1BB2 PRNFLCL: ; CODE XREF: NEXT2:EXECNEXTp ROM:1BB2 xra a ROM:1BB3 sta PRNFL ; Флаг печати (Для LLIST, LPRINT равен 1) ROM:1BB6 ret ROM:1BB6 ; End of function PRNFLCL ROM:1BB6 ROM:1BB7 ; --------------------------------------------------------------------------- ROM:1BB7 ROM:1BB7 LINEBBF: ; CODE XREF: ROM:1905j ROM:1BB7 call loc_1CDB ; Обработка оператора LINE с параметрами B и BF ROM:1BBA cnz PSETCLR ; Обрабатываем параметр цвет у команды PSET ROM:1BBD jnz LINE_ASM ; Тут ассемблерная обработка команды LINE. Все параметры получены. ROM:1BC0 rst 1 ; RST1 = проверка синтаксиса. ROM:1BC0 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:1BC0 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:1BC0 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:1BC0 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:1BC0 ; --------------------------------------------------------------------------- ROM:1BC1 .db 'B' ; Ожидается парметр B (будет нарисован прямоугольник) ROM:1BC2 ; --------------------------------------------------------------------------- ROM:1BC2 cpi 46h ; 'F' ; Ожидается параметр F (будет нарисован заштрихований прямоугольник) ROM:1BC4 jnz LINEB ; Обработка Бейсик оператора LINE с параметром B ROM:1BC7 ROM:1BC7 LINEBF: ; Обработка Бейсик оператора LINE с параметром BF ROM:1BC7 inx h ROM:1BC8 push h ROM:1BC9 call LINECLC ; Расчет точек для LINE ROM:1BCC shld X1 ; Первый графический курсор, координата X ROM:1BCF push d ROM:1BD0 call PRESETWT2 ; Рисование точки белым цветом (FD90 координата X, FD91 координата Y) ROM:1BD3 pop h ROM:1BD4 mov a, b ROM:1BD5 dcr a ROM:1BD6 ora b ROM:1BD7 mov b, a ROM:1BD8 lda PSETC ; Цвет точки у команды PSET ROM:1BDB mov c, a ROM:1BDC rlc ROM:1BDD rlc ROM:1BDE rlc ROM:1BDF rlc ROM:1BE0 mov c, a ROM:1BE1 push d ROM:1BE2 lda X1 ; Первый графический курсор, координата X ROM:1BE5 ani 7 ROM:1BE7 mov e, a ROM:1BE8 mvi a, 8 ROM:1BEA sub e ROM:1BEB mov e, a ROM:1BEC mov a, l ROM:1BED sub e ROM:1BEE pop d ROM:1BEF jc loc_1C03 ROM:1BF2 inr b ROM:1BF3 jz loc_1BF7 ROM:1BF6 dcr b ROM:1BF7 ROM:1BF7 loc_1BF7: ; CODE XREF: ROM:1BF3j ROM:1BF7 ; ROM:1C00j ROM:1BF7 mov l, a ROM:1BF8 call LINEBFTR ; Подпрограмма обработки Бейсик оператора LINE с параметром BF ROM:1BFB mvi b, 0 ROM:1BFD mov a, l ROM:1BFE sui 8 ROM:1C00 jnc loc_1BF7 ROM:1C03 ROM:1C03 loc_1C03: ; CODE XREF: ROM:1BEFj ROM:1C03 mov a, l ROM:1C04 push h ROM:1C05 push b ROM:1C06 call PSETBIT ; Обработка отдельного бита в команде PSET ROM:1C09 mov a, b ROM:1C0A rrc ROM:1C0B mov b, a ROM:1C0C dcr a ROM:1C0D ora b ROM:1C0E cma ROM:1C0F pop b ROM:1C10 mov b, a ROM:1C11 pop h ROM:1C12 call LINEBFTR ; Подпрограмма обработки Бейсик оператора LINE с параметром BF ROM:1C15 pop h ROM:1C16 ret ROM:1C17 ROM:1C17 ; =============== S U B R O U T I N E ======================================= ROM:1C17 ROM:1C17 ; Подпрограмма обработки Бейсик оператора LINE с параметром BF ROM:1C17 ROM:1C17 LINEBFTR: ; CODE XREF: ROM:1BF8p ROM:1C17 ; ROM:1C12p ROM:1C17 push h ROM:1C18 push d ROM:1C19 xchg ROM:1C1A ROM:1C1A loc_1C1A: ; CODE XREF: LINEBFTR+38j ROM:1C1A mov a, b ROM:1C1B ora a ROM:1C1C jz loc_1C26 ROM:1C1F cma ROM:1C20 mov e, a ROM:1C21 call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM). ROM:1C24 ana e ROM:1C25 ora b ROM:1C26 ROM:1C26 loc_1C26: ; CODE XREF: LINEBFTR+5j ROM:1C26 mov m, a ROM:1C27 mov a, h ROM:1C28 xri 20h ROM:1C2A mov h, a ROM:1C2B mov a, b ROM:1C2C ora a ROM:1C2D mov a, c ROM:1C2E jz loc_1C3C ROM:1C31 rlc ROM:1C32 rlc ROM:1C33 rlc ROM:1C34 rlc ROM:1C35 mov e, a ROM:1C36 call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM). ROM:1C39 ani 0F0h ROM:1C3B ora e ROM:1C3C ROM:1C3C loc_1C3C: ; CODE XREF: LINEBFTR+17j ROM:1C3C mov m, a ROM:1C3D mov a, h ROM:1C3E xri 20h ROM:1C40 mov h, a ROM:1C41 inx h ROM:1C42 mov a, l ROM:1C43 ani 7 ROM:1C45 jnz loc_1C4E ROM:1C48 dcx h ROM:1C49 inr h ROM:1C4A mov a, l ROM:1C4B ani 0F8h ROM:1C4D mov l, a ROM:1C4E ROM:1C4E loc_1C4E: ; CODE XREF: LINEBFTR+2Ej ROM:1C4E dcr d ROM:1C4F jnz loc_1C1A ROM:1C52 pop d ROM:1C53 lxi h, 8 ROM:1C56 dad d ROM:1C57 xchg ROM:1C58 pop h ROM:1C59 ret ROM:1C59 ; End of function LINEBFTR ROM:1C59 ROM:1C5A ; --------------------------------------------------------------------------- ROM:1C5A ROM:1C5A SPACE: ; Обработка оператора SPACE ROM:1C5A call loc_FBC ROM:1C5D mvi d, 20h ; ' ' ROM:1C5F ROM:1C5F loc_1C5F: ; CODE XREF: ROM:1C8Fj ROM:1C5F push d ROM:1C60 call MAINTR7 ; Вызов MAINTR5 и переход в MAINTR3 ROM:1C63 pop b ROM:1C64 lhld CHARTBL ; Таблица символов функции CHR ROM:1C67 mov a, b ROM:1C68 mvi b, 0 ROM:1C6A call FILLAREA ; A=константа, BC=счетчик, HL=адрес (заполнение области константой) ROM:1C6D pop b ROM:1C6E jmp loc_D75 ROM:1C71 ; --------------------------------------------------------------------------- ROM:1C71 ROM:1C71 STRING: ; Обработка оператора STRING ROM:1C71 pop h ROM:1C72 xthl ROM:1C73 call GETINTPARAM ; Получаем в A целочисленный параметр для команды Бейсика ROM:1C76 ora a ROM:1C77 jz FUNCTIONCALLERROR ; Ошибка вызова функции ROM:1C7A push d ROM:1C7B rst 1 ; RST1 = проверка синтаксиса. ROM:1C7B ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:1C7B ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:1C7B ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:1C7B ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:1C7B ; --------------------------------------------------------------------------- ROM:1C7C .db ',' ROM:1C7D ; --------------------------------------------------------------------------- ROM:1C7D call loc_A18 ROM:1C80 lda LETTMP ; Временная переменная оператора LET, EVALTERM, COMPUTE, GETVAR ROM:1C83 ora a ROM:1C84 jnz loc_1C92 ROM:1C87 call loc_FBC ROM:1C8A ROM:1C8A loc_1C8A: ; CODE XREF: ROM:1C9Bj ROM:1C8A pop d ROM:1C8B mov d, a ROM:1C8C mov a, e ROM:1C8D xthl ROM:1C8E push h ROM:1C8F jmp loc_1C5F ROM:1C92 ; --------------------------------------------------------------------------- ROM:1C92 ROM:1C92 loc_1C92: ; CODE XREF: ROM:1C84j ROM:1C92 call loc_1CA1 ROM:1C95 mov a, e ROM:1C96 ora a ROM:1C97 jz FUNCTIONCALLERROR ; Ошибка вызова функции ROM:1C9A ldax b ROM:1C9B jmp loc_1C8A ROM:1C9E ROM:1C9E ; =============== S U B R O U T I N E ======================================= ROM:1C9E ROM:1C9E ; Подпрограмма вычисления выражений. ROM:1C9E ROM:1C9E COMPUTETR1: ; CODE XREF: TAPE+18p ROM:1C9E ; ROM:1B1Bp ROM:1C9E call COMPUTE ; Вычисление выражений. Вызов из EVALEXPRESSION, IF, PRINT, EVALTERM. ROM:1CA1 ROM:1CA1 loc_1CA1: ; CODE XREF: ROM:loc_1C92p ROM:1CA1 push h ROM:1CA2 call COMPUTETR2 ; Подпрограмма вычисления выражений. ROM:1CA5 call FLOADBCDEFROMMEM ; Загружает число с плавающей точкой в BCDE из ячеек памяти, на которые указывает HL. ROM:1CA5 ; Т. е. загрузка из M в BCDE ROM:1CA8 pop h ROM:1CA9 ret ROM:1CA9 ; End of function COMPUTETR1 ROM:1CA9 ROM:1CAA ROM:1CAA ; =============== S U B R O U T I N E ======================================= ROM:1CAA ROM:1CAA ; Обработка отдельного бита в команде PSET ROM:1CAA ROM:1CAA PSETBIT: ; CODE XREF: PSET_ASM+1Ap ROM:1CAA ; ROM:1C06p ROM:1CAA ani 7 ROM:1CAC mov c, a ROM:1CAD mvi b, 0 ROM:1CAF lxi h, BITS80 ROM:1CB2 dad b ROM:1CB3 mov b, m ROM:1CB4 ret ROM:1CB4 ; End of function PSETBIT ROM:1CB4 ROM:1CB5 ROM:1CB5 ; =============== S U B R O U T I N E ======================================= ROM:1CB5 ROM:1CB5 ; Обработка PSET/PRESET/LINE. Получение всех параметров. ROM:1CB5 ; Есть ли токен STEP. Заполняем PSETX, PSETY. Указал ли цвет и если да, то читаем его. ROM:1CB5 ROM:1CB5 PSETTR: ; CODE XREF: PRESETWT2+9p ROM:1CB5 ; ROM:1826p ... ROM:1CB5 cpi 0A3h ; 'г' ROM:1CB7 jz loc_1CC0 ; Если в A токен STEP (&hA3) ROM:1CBA xra a ROM:1CBB stax b ROM:1CBC inx b ROM:1CBD stax b ROM:1CBE dcx b ROM:1CBF dcx h ROM:1CC0 ROM:1CC0 loc_1CC0: ; CODE XREF: PSETTR+2j ROM:1CC0 rst 1 ; RST1 = проверка синтаксиса. ROM:1CC0 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:1CC0 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:1CC0 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:1CC0 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:1CC0 ; --------------------------------------------------------------------------- ROM:1CC1 .db 28h ; ( ; Ждем открывающуюся скобку ROM:1CC2 ; --------------------------------------------------------------------------- ROM:1CC2 call GETPRM ; Получаем первый параметр (координату X) ROM:1CC5 call PSETTRPRM ; Подготавливаем параметр (координата X или Y), переданный в команду PSET ROM:1CC8 stax b ROM:1CC9 mov a, d ROM:1CCA sta PSETX ; Координата X команды PSET в виде байта ROM:1CCD inx b ROM:1CCE call GETPRM2 ; Получаем второй параметр (координату Y) ROM:1CD1 call PSETTRPRM ; Подготавливаем параметр (координата X или Y), переданный в команду PSET ROM:1CD4 stax b ROM:1CD5 mov a, d ROM:1CD6 sta PSETY ; Координата Y команды PSET в виде байта ROM:1CD9 rst 1 ; RST1 = проверка синтаксиса. ROM:1CD9 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:1CD9 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:1CD9 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:1CD9 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:1CD9 ; --------------------------------------------------------------------------- ROM:1CDA .db ')' ; Ждем закрывающуюся скобку ROM:1CDB ; --------------------------------------------------------------------------- ROM:1CDB ROM:1CDB loc_1CDB: ; CODE XREF: ROM:LINEBBFp ROM:1CDB ; PSETCLR+Bj ... ROM:1CDB mov a, m ROM:1CDC cpi 2Ch ; ',' ; Ждём запятую. Если она есть, то после неё идёт цвет точки (или другой второй параметр). ROM:1CDE rnz ROM:1CDF inx h ROM:1CE0 ret ROM:1CE0 ; End of function PSETTR ROM:1CE0 ROM:1CE1 ROM:1CE1 ; =============== S U B R O U T I N E ======================================= ROM:1CE1 ROM:1CE1 ; Обрабатываем параметр цвет у команды PSET ROM:1CE1 ROM:1CE1 PSETCLR: ; CODE XREF: PRESETWT2:loc_1829p ROM:1CE1 ; ROM:1BBAp ROM:1CE1 call GETINTPARAM ; Получаем в A целочисленный параметр для команды Бейсика ROM:1CE4 cpi 10h ; Цвет не может быть больше 15 ROM:1CE6 jnc SYNTAXERROR ; Самая распространённая ошибка №2 ROM:1CE9 sta PSETC ; Цвет точки у команды PSET ROM:1CEC jmp loc_1CDB ROM:1CEC ; End of function PSETCLR ROM:1CEC ROM:1CEF ROM:1CEF ; =============== S U B R O U T I N E ======================================= ROM:1CEF ROM:1CEF ; Подготавливаем параметр (координата X или Y), переданный в команду PSET ROM:1CEF ROM:1CEF PSETTRPRM: ; CODE XREF: PSETTR+10p ROM:1CEF ; PSETTR+1Cp ROM:1CEF push h ROM:1CF0 ldax b ROM:1CF1 mvi h, 0 ROM:1CF3 mov l, a ROM:1CF4 dad d ROM:1CF5 xchg ROM:1CF6 pop h ROM:1CF7 mov a, d ROM:1CF8 ana a ROM:1CF9 mov a, e ROM:1CFA rz ROM:1CFB mvi a, 0FFh ROM:1CFD rp ROM:1CFE mov a, d ROM:1CFF cma ROM:1D00 mov d, a ROM:1D01 mov a, e ROM:1D02 cma ROM:1D03 mov e, a ROM:1D04 inx d ROM:1D05 mov a, d ROM:1D06 ora a ROM:1D07 mvi d, 0FFh ROM:1D09 mvi a, 0 ROM:1D0B rnz ROM:1D0C mov d, e ROM:1D0D ret ROM:1D0D ; End of function PSETTRPRM ROM:1D0D ROM:1D0E ; --------------------------------------------------------------------------- ROM:1D0E ROM:1D0E BASE_: ; Обработка оператора BASE ROM:1D0E mvi b, 7 ROM:1D10 call KEYRQ ; Опрос игровых манипуляторов ROM:1D13 push h ROM:1D14 lxi h, ABS1 ; Адрес буфера экрана режима 0 и 1 ROM:1D17 rlc ROM:1D18 mov e, a ROM:1D19 dad d ROM:1D1A mov b, m ROM:1D1B inx h ROM:1D1C mov a, m ROM:1D1D pop h ROM:1D1E jmp INLONGINT ; Ввод длинного целого. ROM:1D21 ; --------------------------------------------------------------------------- ROM:1D21 ROM:1D21 BASE: ; Обработка оператора BASE ROM:1D21 call EVALEXPRESSION ROM:1D24 mvi b, 7 ROM:1D26 call KEYRQ ; Опрос игровых манипуляторов ROM:1D29 rlc ROM:1D2A mov e, a ROM:1D2B push d ROM:1D2C call GETPRM2 ; Ждем появление запятой и считываем параметр, следующий за ней ROM:1D2F xthl ROM:1D30 call loc_1A99 ROM:1D33 lxi b, ABS1 ; Адрес буфера экрана режима 0 и 1 ROM:1D36 dad b ROM:1D37 mov m, e ROM:1D38 inx h ROM:1D39 mov m, d ROM:1D3A pop h ROM:1D3B ret ROM:1D3C ; --------------------------------------------------------------------------- ROM:1D3C ROM:1D3C BEEP: ; Обработка оператора BEEP ROM:1D3C jz loc_1D47 ROM:1D3F call TRTR ; Обработчик TR ROM:1D42 sta BEEPF ; BEEP флаг ROM:1D45 inx h ROM:1D46 ret ROM:1D47 ; --------------------------------------------------------------------------- ROM:1D47 ROM:1D47 loc_1D47: ; CODE XREF: ROM:BEEPj ROM:1D47 push h ROM:1D48 lxi h, BEEPF ; BEEP флаг ROM:1D4B mov a, m ROM:1D4C mvi m, 1 ROM:1D4E call BELL ; Обработка звука нажатия клавиш и CHR(7) (в зависимости от BEEPF) ROM:1D51 mov m, a ROM:1D52 pop h ROM:1D53 ret ROM:1D54 ; --------------------------------------------------------------------------- ROM:1D54 ROM:1D54 ON: ; Обработка конструкции ON ERROR ROM:1D54 cpi 97h ; 'Ч' ROM:1D56 jnz loc_75C ROM:1D59 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:1D59 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:1D59 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:1D5A rst 1 ; RST1 = проверка синтаксиса. ROM:1D5A ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:1D5A ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:1D5A ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:1D5A ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:1D5A ; --------------------------------------------------------------------------- ROM:1D5B .db 88h ; Бейсик оператор GOTO (токен 136 (&h88)) ROM:1D5C ; --------------------------------------------------------------------------- ROM:1D5C call LINENUMBERFROMSTR ; Возвращает в DE номер бейсик-строки из параметра GOTO, LIST, GOSUB, RESTORE, ON... ROM:1D5C ; А также номер строки в самой бейсик-программе. ROM:1D5C ; Чуть подробнее: Получает номер строки из указателя на строку. ROM:1D5C ; Указатель строки передается в HL, и целый результат возвращается в DE. ROM:1D5C ; Лидирующие пробелы пропускаются, и возврат происходит при найденном первом символе не являющемся цифрой. ROM:1D5C ; Максимально допустимое число строк 65529. Синтаксическая ошибка появится, если значение первых четырех цифр более 6552. ROM:1D5C ; Одной из интересных особенностей этой функции является то, что он устанавливает Z, если найден правильный номер (или строка была пустой), ROM:1D5C ; или NZ, если строка не начинается с номера. ROM:1D5C ; ROM:1D5F xchg ROM:1D60 shld ERRES ; Временная переменная обработчика ошибок. ROM:1D63 xchg ROM:1D64 ret ROM:1D65 ; --------------------------------------------------------------------------- ROM:1D65 ROM:1D65 ERROR: ; Обработка оператора ERROR ROM:1D65 call GETINTPARAM ROM:1D68 dcr a ROM:1D69 rlc ROM:1D6A jmp loc_3150 ROM:1D6D ; --------------------------------------------------------------------------- ROM:1D6D ROM:1D6D ERL: ; Обработка оператора ERL ROM:1D6D xchg ROM:1D6E lhld ERLTMP ; Временная переменная функции ERL ROM:1D71 xchg ROM:1D72 mov a, d ROM:1D73 mov b, e ROM:1D74 jmp INLONGINT ; Ввод длинного целого. ROM:1D77 ; --------------------------------------------------------------------------- ROM:1D77 ROM:1D77 ERR: ; Обработка оператора ERR ROM:1D77 lda ERRTMP ROM:1D7A jmp SHORTINT ; Получение короткого целого из A ROM:1D7D ROM:1D7D ; =============== S U B R O U T I N E ======================================= ROM:1D7D ROM:1D7D ; Обработка ошибок. ROM:1D7D ROM:1D7D ERRTR: ; CODE XREF: CHECKENOUGHMEM:MAINLOOP1p ROM:1D7D call RRCAE ; Загружает в A из E, вращает вправо и инкременитирует ROM:1D80 sta ERRTMP ; Код ошибки функции ERR ROM:1D83 lhld BASOPNUM ; Номер оператора Бейсик программы. ROM:1D83 ; Или &hFFFF в командном режиме ROM:1D86 shld ERLTMP ; Временная переменная функции ERL ROM:1D89 lhld ERRES ; Временная переменная обработчика ошибок. ROM:1D8C mov a, h ROM:1D8D ora l ROM:1D8E jz RESETSTACK ; Инициализирует адрес рабочей области арифметических преобразований, ROM:1D8E ; обнуляет временные переменные FORTMP, AUTOTR ROM:1D91 shld ERRTRTMP2 ; Временная переменная обработчика ошибок ERRTR ROM:1D94 xchg ROM:1D95 call ERRTR2 ; Подпрограмма обработчика ошибок. ROM:1D98 lxi b, EXECNEXT ; Сюда вернётся бейсик интерпретатор после отработки команды RUN, RETURN, после обработки ошибок. ROM:1D98 ; Вычисляет одно выражение, передвигается на следующее выражение или на новую стоку, если в текущей строке нет больше выражений. ROM:1D98 ; ROM:1D9B push b ROM:1D9C lhld CURBASLN ; Текущий адрес строки Бейсик программы ROM:1D9F shld ERRTRTMP ; Временная переменная обработчика ошибок ERRTR, ERRTR2 и RESUME. ROM:1DA2 jmp GOTOPRE ; Подготавливает переход на строку бейсик-программы ROM:1DA2 ; End of function ERRTR ROM:1DA2 ROM:1DA5 ; --------------------------------------------------------------------------- ROM:1DA5 ROM:1DA5 RESUME: ; Обработка бейсик-оператора RESUME ROM:1DA5 lhld ERRTRTMP ROM:1DA8 mov a, h ROM:1DA9 ora l ROM:1DAA mvi e, 28h ; '(' ROM:1DAC jz MAINLOOP1 ; Первая точка входа в главный цикл ROM:1DAF xchg ROM:1DB0 lhld ERRTRTMP2 ; Временная переменная обработчика ошибок ERRTR ROM:1DB3 shld ERRES ; Временная переменная обработчика ошибок. ROM:1DB6 xchg ROM:1DB7 inx h ROM:1DB8 jmp DATA+2 ; Обработка бейсик-команд DATA и REM. Обратите внимание на комментарий ниже. ROM:1DB8 ; 06FB: REM: MVI C, 0 ROM:1DB8 ; MVI B, 0 ROM:1DB8 ; LOC_6FF: MOV A, C ROM:1DB8 ; ..... ROM:1DB8 ; ROM:1DB8 ; FINDNEXTSTATEMENT: ROM:1DBB ROM:1DBB ; =============== S U B R O U T I N E ======================================= ROM:1DBB ROM:1DBB ; Печатает пригласительный знак вопроса в команде INPUT и сообщении об ошибке ROM:1DBB ROM:1DBB INPUTPRN: ; CODE XREF: CHECKENOUGHMEM+27p ROM:1DBB ; INPUTSTRp ROM:1DBB mvi a, 3Fh ; '?' ROM:1DBD rst 3 ; RST3 = печатает символ из A на экран. ROM:1DBE mvi a, 20h ; ' ' ROM:1DC0 rst 3 ; RST3 = печатает символ из A на экран. ROM:1DC0 ; End of function INPUTPRN ROM:1DC0 ROM:1DC1 ROM:1DC1 ; =============== S U B R O U T I N E ======================================= ROM:1DC1 ROM:1DC1 ; Загружает в A из E, вращает вправо и инкременитирует ROM:1DC1 ROM:1DC1 RRCAE: ; CODE XREF: ERRTRp ROM:1DC1 mov a, e ROM:1DC2 rrc ROM:1DC3 inr a ROM:1DC4 ret ROM:1DC4 ; End of function RRCAE ROM:1DC4 ROM:1DC5 ; --------------------------------------------------------------------------- ROM:1DC5 ROM:1DC5 AUTO: ; Обработка бейсик команды AUTO ROM:1DC5 jz loc_1DE3 ROM:1DC8 cpi 2Ch ; ',' ; команда может быть и вида AUTO ,10 ROM:1DCA jz loc_1DD5 ROM:1DCD call GETPRM ; Считываем параметр для Бейсик команды ROM:1DD0 xchg ROM:1DD1 shld AUTONUM ; Номер AUTO ROM:1DD4 xchg ROM:1DD5 ROM:1DD5 loc_1DD5: ; CODE XREF: ROM:1DCAj ROM:1DD5 call loc_1CDB ROM:1DD8 jnz loc_1DE3 ; команда может быть также вида AUTO 10, ROM:1DDB call GETPRM ; Считываем параметр для Бейсик команды ROM:1DDE xchg ROM:1DDF shld AUTOINC ; Инкремент AUTO ROM:1DE2 xchg ROM:1DE3 ROM:1DE3 loc_1DE3: ; CODE XREF: ROM:AUTOj ROM:1DE3 ; ROM:1DD8j ROM:1DE3 xchg ROM:1DE4 lhld AUTONUM ; Номер AUTO ROM:1DE7 shld AITMP ; Временная переменная. Используется в командах AUTO и INPUTLN ROM:1DEA mvi a, 1 ROM:1DEC sta ASITT ; Временная переменная. Используется в AUTO, STOP, INPUTLN, TOKENIZE, TRETLINE ROM:1DEF xchg ROM:1DF0 call RESETSTACK ; Инициализирует адрес рабочей области арифметических преобразований, ROM:1DF0 ; обнуляет временные переменные FORTMP, AUTOTR ROM:1DF3 call EDIT1 ; Опрашивает флаг печати, формирует таблицу событий, Очищает переменную TERMINAL_X, ROM:1DF3 ; устанавливает текстовый режим (MODE), очищает буфер клавиатуры и временные переменные ROM:1DF6 jmp MAIN ; Вторая точка входа в главный цикл. Переход из AUTO ROM:1DF6 ; Эта процедура ждёт ввода строки и если строка без номера, то пытается сразу выполнить её (EXEC immediately). ROM:1DF9 ; --------------------------------------------------------------------------- ROM:1DF9 ; START OF FUNCTION CHUNK FOR INPUTLN ROM:1DF9 ROM:1DF9 loc_1DF9: ; CODE XREF: INPUTLN+3j ROM:1DF9 lda ASITT ; Временная переменная. Используется в AUTO, STOP, INPUTLN, TOKENIZE, TRETLINE ROM:1DFC ora a ROM:1DFD jz loc_3DD ROM:1E00 lhld AITMP ; Временная переменная. Используется в командах AUTO и INPUTLN ROM:1E03 push h ROM:1E04 call PRINTINT ; Переводит целое число HL в число с плавающей точкой FACCUM. ROM:1E04 ; В частности, печатает номер строки Бейсик-программы, выполняющейся в данный момент времени. ROM:1E07 pop h ROM:1E08 xchg ROM:1E09 lhld AUTOINC ; Инкремент AUTO ROM:1E0C dad d ROM:1E0D shld AITMP ; Временная переменная. Используется в командах AUTO и INPUTLN ROM:1E10 call FINDPROGRAMLINE ; Получает ближайший адрес строки программы в BC ROM:1E13 mvi a, 20h ; ' ' ROM:1E15 jnc loc_1E1A ROM:1E18 mvi a, 2Ah ; '*' ROM:1E1A ROM:1E1A loc_1E1A: ; CODE XREF: INPUTLN+1936j ROM:1E1A rst 3 ; RST3 = печатает символ из A на экран. ROM:1E1B jmp loc_3DD ROM:1E1B ; END OF FUNCTION CHUNK FOR INPUTLN ROM:1E1E ROM:1E1E ; =============== S U B R O U T I N E ======================================= ROM:1E1E ROM:1E1E ; Токенизирует строковый буфер, замещая ключевые слова их ID. ROM:1E1E ; Возвращает длинну токенизируемой строки в C, при A=0. ROM:1E1E ; Далее загружает в B ноль, поэтому длина строки в BC получается 16 битная. ROM:1E1E ROM:1E1E TOKENIZE: ; CODE XREF: CHECKENOUGHMEM+60p ROM:1E1E ROM:1E1E ; FUNCTION CHUNK AT ROM:03E6 SIZE 0000004F BYTES ROM:1E1E ; FUNCTION CHUNK AT ROM:0436 SIZE 00000040 BYTES ROM:1E1E ; FUNCTION CHUNK AT ROM:17CC SIZE 0000000D BYTES ROM:1E1E ROM:1E1E lda ASITT ; Временная переменная. Используется в AUTO, STOP, INPUTLN, TOKENIZE, TRETLINE ROM:1E21 ora a ROM:1E22 jz loc_3E6 ROM:1E25 mov a, m ROM:1E26 cpi 2Ah ; '*' ROM:1E28 jnz loc_3E6 ROM:1E2B rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:1E2B ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:1E2B ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:1E2C jnz loc_3E6 ROM:1E2F pop h ROM:1E30 jmp loc_30D ; НУ ВОТ, СОБСТВЕННО! ЭТО И ЕСТЬ САМЫЙ ГЛАВНЫЙ ЦИКЛ БЕЙСИК-ИНТЕРПРЕТАТОРА! ROM:1E30 ; End of function TOKENIZE ROM:1E30 ROM:1E33 ; --------------------------------------------------------------------------- ROM:1E33 ; START OF FUNCTION CHUNK FOR INPUTLN ROM:1E33 ROM:1E33 loc_1E33: ; CODE XREF: INPUTLN+1976j ROM:1E33 xchg ROM:1E34 call INPUTLN2 ; Вводит строку без отображения курсора. Основная часть функции. ROM:1E37 xchg ROM:1E38 jz TERMINATEINPUT ROM:1E3B mvi m, 0 ROM:1E3D inx h ROM:1E3E inx h ROM:1E3F shld EITMP ; Временная переменная. Используется в INPUTLN, ERRTR2 ROM:1E42 xchg ROM:1E43 dcx h ROM:1E44 ret ROM:1E45 ; --------------------------------------------------------------------------- ROM:1E45 ROM:1E45 loc_1E45: ; CODE XREF: INPUTLN+197Aj ROM:1E45 call RESETSTACK ; Инициализирует адрес рабочей области арифметических преобразований, ROM:1E45 ; обнуляет временные переменные FORTMP, AUTOTR ROM:1E48 jmp MAINLOOP3 ; Третья точка входа в главный цикл. Переход из INIT2, STOP, CSAVE, OUTCHAR2, INPUTLN ROM:1E4B ; --------------------------------------------------------------------------- ROM:1E4B ROM:1E4B loc_1E4B: ; CODE XREF: INPUTLN-FDj ROM:1E4B ; INPUTLN+6j ROM:1E4B lxi b, 0D1Ah ROM:1E4E lxi d, 61h ; 'a' ROM:1E51 dcx h ROM:1E52 ROM:1E52 loc_1E52: ; CODE XREF: INPUTLN+1986j ROM:1E52 ; INPUTLN+1990j ... ROM:1E52 inx h ROM:1E53 mov a, m ROM:1E54 cmp b ROM:1E55 jz loc_1E33 ROM:1E58 cmp c ROM:1E59 jz loc_1E45 ROM:1E5C cpi 22h ; '"' ROM:1E5E mov a, d ROM:1E5F jnz loc_1E64 ROM:1E62 cma ROM:1E63 mov d, a ROM:1E64 ROM:1E64 loc_1E64: ; CODE XREF: INPUTLN+1980j ROM:1E64 ana a ROM:1E65 jnz loc_1E52 ROM:1E68 mov a, m ROM:1E69 nop ROM:1E6A nop ROM:1E6B nop ROM:1E6C nop ROM:1E6D cpi 7Bh ; '{' ROM:1E6F jnc loc_1E52 ROM:1E72 cmp e ROM:1E73 jc loc_1E52 ROM:1E76 ani 0DFh ROM:1E78 mov m, a ROM:1E79 jmp loc_1E52 ROM:1E79 ; END OF FUNCTION CHUNK FOR INPUTLN ROM:1E7C ; --------------------------------------------------------------------------- ROM:1E7C mvi m, 20h ; ' ' ROM:1E7E jmp loc_1E52 ROM:1E81 ROM:1E81 ; =============== S U B R O U T I N E ======================================= ROM:1E81 ROM:1E81 ; Ждем появление запятой и считываем параметр, следующий за ней ROM:1E81 ROM:1E81 GETPRM2: ; CODE XREF: ROM:19DDp ROM:1E81 ; ROM:19E1p ... ROM:1E81 rst 1 ; RST1 = проверка синтаксиса. ROM:1E81 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:1E81 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:1E81 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:1E81 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:1E81 ; --------------------------------------------------------------------------- ROM:1E82 .db ',' ROM:1E83 ; --------------------------------------------------------------------------- ROM:1E83 ROM:1E83 GETPRM: ; CODE XREF: PSETTR+Dp ROM:1E83 ; ROM:1DCDp ... ROM:1E83 push b ; Считываем параметр для Бейсик команды ROM:1E84 call EVALEXPRESSION ; Вычисляет выражение, возвращая результат в FACCUM. Выражение должно быть комбинацией термов и операторов. ROM:1E87 rst 5 ; RST5 = Проверяет состояние FACCUM. ROM:1E87 ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно ROM:1E87 ; (0xFF если отрицательно, 0x01 если положительно). ROM:1E88 call INTFROMFLOAT ; Получение целого числа из числа с плавающей точкой ROM:1E8B pop b ROM:1E8C ret ROM:1E8C ; End of function GETPRM2 ROM:1E8C ROM:1E8D ; --------------------------------------------------------------------------- ROM:1E8D rst 5 ; RST5 = Проверяет состояние FACCUM. ROM:1E8D ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно ROM:1E8D ; (0xFF если отрицательно, 0x01 если положительно). ROM:1E8E call INTFROMFLOAT ; Получение целого числа из числа с плавающей точкой ROM:1E91 ret ROM:1E92 ROM:1E92 ; =============== S U B R O U T I N E ======================================= ROM:1E92 ROM:1E92 ; Расчет точек для LINE ROM:1E92 ROM:1E92 LINECLC: ; CODE XREF: LINE_ASM+Dp ROM:1E92 ; ROM:1BC9p ROM:1E92 lhld X1 ; Первый графический курсор, координата X ROM:1E95 lda X2 ; Второй графический курсор, координата X ROM:1E98 sub l ROM:1E99 mov e, a ROM:1E9A jnc loc_1EA8 ROM:1E9D cma ROM:1E9E inr a ROM:1E9F mov e, a ROM:1EA0 mov a, l ROM:1EA1 sub e ROM:1EA2 mov l, a ROM:1EA3 mvi a, 0FFh ROM:1EA5 sta LINE1 ; Параметр команды LINE ROM:1EA8 ROM:1EA8 loc_1EA8: ; CODE XREF: LINECLC+8j ROM:1EA8 lda Y2 ; Второй графический курсор, координата Y ROM:1EAB sub h ROM:1EAC mov d, a ROM:1EAD rnc ROM:1EAE cma ROM:1EAF inr a ROM:1EB0 mov d, a ROM:1EB1 mov a, h ROM:1EB2 sub d ROM:1EB3 mov h, a ROM:1EB4 mvi a, 0FFh ROM:1EB6 sta LINE100_ ; Параметр команды LINE ROM:1EB9 ret ROM:1EB9 ; End of function LINECLC ROM:1EB9 ROM:1EBA ; --------------------------------------------------------------------------- ROM:1EBA ROM:1EBA TR: ; Обработка Бейсик команд TRON/TROFF ROM:1EBA call TRTR ROM:1EBD sta TRFLAG ; Флаг трассировки ROM:1EC0 inx h ROM:1EC1 ret ROM:1EC2 ROM:1EC2 ; =============== S U B R O U T I N E ======================================= ROM:1EC2 ROM:1EC2 ; Обработчик TR ROM:1EC2 ROM:1EC2 TRTR: ; CODE XREF: ROM:1D3Fp ROM:1EC2 ; ROM:TRp ROM:1EC2 cpi 91h ; 'С' ROM:1EC4 rz ; Ожидаем токен ON ROM:1EC5 cpi 0DFh ; '-' ; Ожидаем токен OFF ROM:1EC7 jnz SYNTAXERROR ; Самая распространённая ошибка №2 ROM:1ECA xra a ROM:1ECB ret ROM:1ECB ; End of function TRTR ROM:1ECB ROM:1ECC ; --------------------------------------------------------------------------- ROM:1ECC pop h ROM:1ECD xthl ROM:1ECE call GETVAR ; Поиск и инициализация переменной. ROM:1ECE ; HL указывает на имя переменной, которая встретилась во время интерпретации. ROM:1ECE ; Функция возвращает в DE указатель на значение переменной. ROM:1ECE ; Если переменная не существует, то функция выделяет ей память и инициализирует её. ROM:1ED1 rst 1 ; RST1 = проверка синтаксиса. ROM:1ED1 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция, ROM:1ED1 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке. ROM:1ED1 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка, ROM:1ED1 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR. ROM:1ED1 ; --------------------------------------------------------------------------- ROM:1ED2 .db 0AAh ; OR (токен 170 (&hAA)) ROM:1ED3 ; --------------------------------------------------------------------------- ROM:1ED3 jmp loc_1F65 ROM:1ED6 ROM:1ED6 ; =============== S U B R O U T I N E ======================================= ROM:1ED6 ROM:1ED6 ; Обработка трассировки. Печатает квадратные скобки и номер выполняющейся в данный момент строки Бейсик-программы. ROM:1ED6 ROM:1ED6 TRACEPRN: ; CODE XREF: NEXT2-377p ROM:1ED6 shld BASOPNUM ; Номер оператора Бейсик программы. ROM:1ED6 ; Или &hFFFF в командном режиме ROM:1ED9 lda TRFLAG ; Флаг трассировки ROM:1EDC ana a ROM:1EDD rz ROM:1EDE push d ROM:1EDF mvi a, 5Bh ; '[' ROM:1EE1 rst 3 ; RST3 = печатает символ из A на экран. ROM:1EE2 call PRINTINT ; Переводит целое число HL в число с плавающей точкой FACCUM. ROM:1EE2 ; В частности, печатает номер строки Бейсик-программы, выполняющейся в данный момент времени. ROM:1EE5 mvi a, 5Dh ; ']' ROM:1EE7 rst 3 ; RST3 = печатает символ из A на экран. ROM:1EE8 pop d ROM:1EE9 ret ROM:1EE9 ; End of function TRACEPRN ROM:1EE9 ROM:1EEA ; --------------------------------------------------------------------------- ROM:1EEA ROM:1EEA POINT: ; Обработка оператора POINT ROM:1EEA pop h ROM:1EEB xthl ROM:1EEC inx h ROM:1EED lxi b, X1 ; Первый графический курсор, координата X ROM:1EF0 call PSETTR ; Обработка PSET/PRESET/LINE. Получение всех параметров. ROM:1EF0 ; Есть ли токен STEP. Заполняем PSETX, PSETY. Указал ли цвет и если да, то читаем его. ROM:1EF3 lda PSETX ; Координата X команды PSET в виде байта ROM:1EF6 ora d ROM:1EF7 jnz loc_1F34 ROM:1EFA lda MODE ; Режим экрана ROM:1EFD cpi 2 ROM:1EFF jnz loc_1F16 ROM:1F02 call PRESETWT2 ; Рисование точки белым цветом (FD90 координата X, FD91 координата Y) ROM:1F05 ana b ROM:1F06 mov a, c ROM:1F07 jnz loc_1F0E ROM:1F0A rrc ROM:1F0B rrc ROM:1F0C rrc ROM:1F0D rrc ROM:1F0E ROM:1F0E loc_1F0E: ; CODE XREF: ROM:1F07j ROM:1F0E ani 0Fh ROM:1F10 mov e, a ROM:1F11 ROM:1F11 loc_1F11: ; CODE XREF: ROM:1F30j ROM:1F11 mvi d, 0 ROM:1F13 jmp loc_1F65 ROM:1F16 ; --------------------------------------------------------------------------- ROM:1F16 ROM:1F16 loc_1F16: ; CODE XREF: ROM:1EFFj ROM:1F16 push h ROM:1F17 lhld X1 ; Первый графический курсор, координата X ROM:1F1A xchg ROM:1F1B lhld DLSF ; Длина строки экрана ROM:1F1E mov a, d ROM:1F1F cmp h ROM:1F20 jnc loc_1F33 ROM:1F23 mov a, e ROM:1F24 cmp l ROM:1F25 jnc loc_1F33 ROM:1F28 call INTERRPT ; Кто объяснит мне этот кусок - буду благодарен. Вызывается из функции POINT перед тем, как нарисовать точку. Три раза делает RST 7. ROM:1F2B call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM). ROM:1F2E pop h ROM:1F2F mov e, a ROM:1F30 jmp loc_1F11 ROM:1F33 ; --------------------------------------------------------------------------- ROM:1F33 ROM:1F33 loc_1F33: ; CODE XREF: ROM:1F20j ROM:1F33 ; ROM:1F25j ROM:1F33 pop h ROM:1F34 ROM:1F34 loc_1F34: ; CODE XREF: ROM:1EF7j ROM:1F34 lxi d, 0FFFFh ROM:1F37 jmp loc_1F65 ROM:1F3A ; --------------------------------------------------------------------------- ROM:1F3A ; START OF FUNCTION CHUNK FOR BINHEX ROM:1F3A ROM:1F3A H_: ; CODE XREF: BINHEX+10j ROM:1F3A pop h ROM:1F3B xthl ROM:1F3C mvi b, 4 ROM:1F3E lxi d, loc_1F65 ROM:1F41 push d ROM:1F42 lxi d, 0 ROM:1F45 dcx h ROM:1F46 ROM:1F46 loc_1F46: ; CODE XREF: BINHEX-3Dj ROM:1F46 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:1F46 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:1F46 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:1F47 rz ROM:1F48 jc loc_1F55 ROM:1F4B ani 0DFh ROM:1F4D cpi 41h ; 'A' ROM:1F4F rc ROM:1F50 cpi 47h ; 'G' ROM:1F52 rnc ROM:1F53 sui 7 ROM:1F55 ROM:1F55 loc_1F55: ; CODE XREF: BINHEX-55j ROM:1F55 ani 0Fh ROM:1F57 xchg ROM:1F58 dad h ROM:1F59 dad h ROM:1F5A dad h ROM:1F5B dad h ROM:1F5C xchg ROM:1F5D ora e ROM:1F5E mov e, a ROM:1F5F dcr b ROM:1F60 jnz loc_1F46 ROM:1F63 pop b ROM:1F64 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:1F64 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:1F64 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:1F65 ROM:1F65 loc_1F65: ; CODE XREF: ROM:1ED3j ROM:1F65 ; ROM:1F13j ... ROM:1F65 mov a, d ROM:1F66 mov b, e ROM:1F67 xthl ROM:1F68 push h ROM:1F69 jmp INLONGINT ; Ввод длинного целого. ROM:1F6C ; --------------------------------------------------------------------------- ROM:1F6C ROM:1F6C B_: ; CODE XREF: BINHEX+15j ROM:1F6C pop h ; Обработка двоичных чисел. ROM:1F6D xthl ROM:1F6E mvi b, 10h ROM:1F70 lxi d, loc_1F65 ROM:1F73 push d ROM:1F74 lxi d, 0 ROM:1F77 dcx h ROM:1F78 ROM:1F78 loc_1F78: ; CODE XREF: BINHEX-17j ROM:1F78 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:1F78 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:1F78 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:1F79 rz ROM:1F7A rnc ROM:1F7B cpi 32h ; '2' ROM:1F7D rnc ROM:1F7E ani 1 ROM:1F80 xchg ROM:1F81 dad h ROM:1F82 xchg ROM:1F83 ora e ROM:1F84 mov e, a ROM:1F85 dcr b ROM:1F86 jnz loc_1F78 ROM:1F89 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:1F89 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:1F89 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:1F8A ret ROM:1F8A ; END OF FUNCTION CHUNK FOR BINHEX ROM:1F8B ROM:1F8B ; =============== S U B R O U T I N E ======================================= ROM:1F8B ROM:1F8B ; Обработчик перевода числа с плавающей точкой в целое ROM:1F8B ROM:1F8B FASINTEGERTR: ; CODE XREF: INTFROMFLOAT+5p ROM:1F8B pop b ROM:1F8C jc FASINTEGER ; Перевод числа с плавающей точкой в целое. ROM:1F8C ; Возвращает целую часть FACCUM в CDE. ROM:1F8F push b ROM:1F90 rnz ROM:1F91 mov b, a ROM:1F92 lda FACCUM+2 ; Аккумулятор для вычислений с плавающей точкой: ROM:1F92 ; 00000000 1 11111111111111111111111 ROM:1F92 ; -------- - ----------------------- ROM:1F92 ; 8 бит экспонента 1 бит знак 23 бита мантисс ROM:1F95 ani 80h ROM:1F97 rnz ROM:1F98 mov a, b ROM:1F99 pop b ROM:1F9A jmp FASINTEGER ; Перевод числа с плавающей точкой в целое. ROM:1F9A ; End of function FASINTEGERTR ; Возвращает целую часть FACCUM в CDE. ROM:1F9A ROM:1F9D ROM:1F9D ; =============== S U B R O U T I N E ======================================= ROM:1F9D ROM:1F9D ; Обработчик двоичных и шестнадцатеричных чисел в VAL ROM:1F9D ROM:1F9D BINHEX: ; CODE XREF: ROM:0FDAp ROM:1F9D ROM:1F9D ; FUNCTION CHUNK AT ROM:1F3A SIZE 00000051 BYTES ROM:1F9D ROM:1F9D cpi 26h ; '&' ROM:1F9F jnz FIN ; Функция читающая число с плавающей точкой из ASCII-текста. ROM:1F9F ; Читает строку и конвертирует её в число с плавающей точкой в FACCUM. ROM:1FA2 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL, ROM:1FA2 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой, ROM:1FA2 ; также нулевой флаг устанавливается, если был достигнут нулевой символ. ROM:1FA3 inx h ROM:1FA4 ani 0DFh ROM:1FA6 push h ROM:1FA7 lxi h, loc_1876 ROM:1FAA push h ROM:1FAB cpi 48h ; 'H' ROM:1FAD jz H_ ROM:1FB0 cpi 42h ; 'B' ROM:1FB2 jz B_ ; Обработка двоичных чисел. ROM:1FB5 pop h ROM:1FB6 xthl ROM:1FB7 pop h ROM:1FB8 jmp FZERO ; Устанавливает FACCUM в ноль. ROM:1FB8 ; End of function BINHEX ROM:1FB8 ROM:1FBB ; --------------------------------------------------------------------------- ROM:1FBB ROM:1FBB HEX: ; Обработчик бейсик-функции HEX ROM:1FBB rst 5 ROM:1FBC call INTFROMFLOAT ; Получение целого числа из числа с плавающей точкой ROM:1FBF lxi b, INTAR+20h ; Рабочая область обработки прерываний ROM:1FC2 mov a, d ROM:1FC3 ana a ROM:1FC4 mvi d, 2 ROM:1FC6 jz loc_1FCE ROM:1FC9 mvi d, 4 ROM:1FCB call BTDECODE ; A=байт, BC=адрес ROM:1FCB ; (перекодировка A (шестнадцатеричного) в символы) ROM:1FCE ROM:1FCE loc_1FCE: ; CODE XREF: ROM:1FC6j ROM:1FCE mov a, e ROM:1FCF call BTDECODE ; A=байт, BC=адрес ROM:1FCF ; (перекодировка A (шестнадцатеричного) в символы) ROM:1FD2 mov a, d ROM:1FD3 jmp loc_1989 ROM:1FD6 ; --------------------------------------------------------------------------- ROM:1FD6 ROM:1FD6 PUT: ; Бейсик-оператор PUT ROM:1FD6 inx h ROM:1FD7 lxi b, X1 ; Первый графический курсор, координата X ROM:1FDA call PSETTR ; Обработка PSET/PRESET/LINE. Получение всех параметров. ROM:1FDA ; Есть ли токен STEP. Заполняем PSETX, PSETY. Указал ли цвет и если да, то читаем его. ROM:1FDD call VARRTR ; Подпрограмма работы с видеомассивом. Используется в PUT и GET ROM:1FE0 xchg ROM:1FE1 push d ROM:1FE2 call PUTTR ; Подпрограмма-обработчик PUT ROM:1FE5 pop h ROM:1FE6 ret ROM:1FE7 ROM:1FE7 ; =============== S U B R O U T I N E ======================================= ROM:1FE7 ROM:1FE7 ; Подпрограмма работы с видеомассивом. Используется в PUT и GET ROM:1FE7 ROM:1FE7 VARRTR: ; CODE XREF: ROM:1FDDp ROM:1FE7 ; ROM:2154p ROM:1FE7 jnz SYNTAXERROR ; Самая распространённая ошибка №2 ROM:1FEA call GETVAR ; Поиск и инициализация переменной. ROM:1FEA ; HL указывает на имя переменной, которая встретилась во время интерпретации. ROM:1FEA ; Функция возвращает в DE указатель на значение переменной. ROM:1FEA ; Если переменная не существует, то функция выделяет ей память и инициализирует её. ROM:1FED xchg ROM:1FEE lxi b, TMPBUF+11Dh ; Временный буфер CLOAD ROM:1FF1 dad b ROM:1FF2 xchg ROM:1FF3 ret ROM:1FF3 ; End of function VARRTR ROM:1FF3 ROM:1FF4 ROM:1FF4 ; =============== S U B R O U T I N E ======================================= ROM:1FF4 ROM:1FF4 ; Подпрограмма-обработчик PUT ROM:1FF4 ROM:1FF4 PUTTR: ; CODE XREF: ROM:1FE2p ROM:1FF4 lda Y1 ; Первый графический курсор, координата Y ROM:1FF7 cpi 0C0h ; 'L' ROM:1FF9 rnc ROM:1FFA push h ROM:1FFB call PRESETWT2 ; Рисование точки белым цветом (FD90 координата X, FD91 координата Y) ROM:1FFE pop h ROM:1FFF push b ROM:2000 lxi b, 9 ROM:2003 dad b ROM:2004 pop b ROM:2005 lda PSETX ; Координата X команды PSET в виде байта ROM:2008 rrc ROM:2009 rrc ROM:200A rrc ROM:200B ani 1Fh ROM:200D mov c, a ROM:200E mov a, m ROM:200F sub c ROM:2010 rc ROM:2011 rz ROM:2012 sta VIDEO1 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:2015 inx h ROM:2016 mov a, c ROM:2017 ora a ROM:2018 jnz loc_2023 ROM:201B lda PSETY ; Координата Y команды PSET в виде байта ROM:201E mov c, a ROM:201F mov a, m ROM:2020 jmp loc_2039 ROM:2023 ; --------------------------------------------------------------------------- ROM:2023 ROM:2023 loc_2023: ; CODE XREF: PUTTR+24j ROM:2023 push d ROM:2024 mov e, m ROM:2025 mvi d, 0 ROM:2027 push h ROM:2028 lxi h, 0 ROM:202B ROM:202B loc_202B: ; CODE XREF: PUTTR+39j ROM:202B dad d ROM:202C dcr c ROM:202D jnz loc_202B ROM:2030 pop d ROM:2031 dad h ROM:2032 lda PSETY ; Координата Y команды PSET в виде байта ROM:2035 mov c, a ROM:2036 ldax d ROM:2037 dad d ROM:2038 pop d ROM:2039 ROM:2039 loc_2039: ; CODE XREF: PUTTR+2Cj ROM:2039 inx h ROM:203A sub c ROM:203B rz ROM:203C rc ROM:203D sta VIDEO2 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:2040 lda PSETX ; Координата X команды PSET в виде байта ROM:2043 ani 7 ROM:2045 jz loc_2051 ROM:2048 mov c, a ROM:2049 mvi a, 80h ; 'А' ROM:204B ROM:204B loc_204B: ; CODE XREF: PUTTR+59j ROM:204B rlc ROM:204C dcr c ROM:204D jnz loc_204B ROM:2050 mov b, a ROM:2051 ROM:2051 loc_2051: ; CODE XREF: PUTTR+51j ROM:2051 mvi a, 80h ; 'А' ROM:2053 mvi c, 0 ROM:2055 push d ROM:2056 mvi d, 8 ROM:2058 ROM:2058 loc_2058: ; CODE XREF: PUTTR+6Bj ROM:2058 cmp b ROM:2059 jz loc_2064 ROM:205C rrc ROM:205D inr c ROM:205E dcr d ROM:205F jnz loc_2058 ROM:2062 pop d ROM:2063 ret ROM:2064 ; --------------------------------------------------------------------------- ROM:2064 ROM:2064 loc_2064: ; CODE XREF: PUTTR+65j ROM:2064 pop d ROM:2065 ROM:2065 loc_2065: ; CODE XREF: PUTTR+73j ROM:2065 ora b ROM:2066 ral ROM:2067 jnc loc_2065 ROM:206A sta VIDEO3 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:206D cma ROM:206E sta PUTTRTMP ; Временная переменная PUTTR ROM:2071 mov a, c ROM:2072 sta PUTTRTMP2 ; Временная переменная PUTTR ROM:2075 ora a ROM:2076 jz loc_2080 ROM:2079 lda VIDEO1 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:207C inr a ROM:207D sta VIDEO1 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:2080 ROM:2080 loc_2080: ; CODE XREF: PUTTR+82j ROM:2080 push d ROM:2081 push d ROM:2082 lda PSETY ; Координата Y команды PSET в виде байта ROM:2085 rlc ROM:2086 mov e, a ROM:2087 mvi d, 0 ROM:2089 xchg ROM:208A shld VIDEOBUF ; Видеобуфер. Используется командами PUT и GET (PUTTR, VIDEOTR) ROM:208D xchg ROM:208E lxi d, VIDEOBUF+2 ; Видеобуфер. Используется командами PUT и GET (PUTTR, VIDEOTR) ROM:2091 lda PSETX ; Координата X команды PSET в виде байта ROM:2094 ora a ROM:2095 jz loc_20C4 ROM:2098 lda VIDEO3 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:209B ora a ROM:209C jz loc_20C4 ROM:209F push d ROM:20A0 xchg ROM:20A1 lhld VIDEOBUF ; Видеобуфер. Используется командами PUT и GET (PUTTR, VIDEOTR) ROM:20A4 dad d ROM:20A5 pop d ROM:20A6 lda VIDEO2 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:20A9 sta VIDEO4 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:20AC ROM:20AC loc_20AC: ; CODE XREF: PUTTR+CAj ROM:20AC call PUTTR2 ; Обработчик PUT. Подпрограмма. ROM:20AF lda VIDEO3 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:20B2 ana c ROM:20B3 stax d ROM:20B4 inx d ROM:20B5 inx h ROM:20B6 inx h ROM:20B7 lda VIDEO4 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:20BA dcr a ROM:20BB sta VIDEO4 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:20BE jnz loc_20AC ROM:20C1 jmp loc_20CF ROM:20C4 ; --------------------------------------------------------------------------- ROM:20C4 ROM:20C4 loc_20C4: ; CODE XREF: PUTTR+A1j ROM:20C4 ; PUTTR+A8j ROM:20C4 lda VIDEO2 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:20C7 mov c, a ROM:20C8 xra a ROM:20C9 ROM:20C9 loc_20C9: ; CODE XREF: PUTTR+D8j ROM:20C9 stax d ROM:20CA inx d ROM:20CB dcr c ROM:20CC jnz loc_20C9 ROM:20CC ; End of function PUTTR ROM:20CC ROM:20CF ; START OF FUNCTION CHUNK FOR VIDEOTR ROM:20CF ROM:20CF loc_20CF: ; CODE XREF: PUTTR+CDj ROM:20CF ; VIDEOTR+4Dj ROM:20CF lxi b, VIDEOBUF+2 ; Видеобуфер. Используется командами PUT и GET (PUTTR, VIDEOTR) ROM:20D2 xchg ROM:20D3 lhld VIDEOBUF ; Видеобуфер. Используется командами PUT и GET (PUTTR, VIDEOTR) ROM:20D6 dad d ROM:20D7 lda VIDEO2 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:20DA sta VIDEO4 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:20DD pop d ROM:20DE ROM:20DE loc_20DE: ; CODE XREF: VIDEOTR+3Bj ROM:20DE ldax b ROM:20DF push b ROM:20E0 mov b, a ROM:20E1 call PUTTR2 ; Обработчик PUT. Подпрограмма. ROM:20E1 ; END OF FUNCTION CHUNK FOR VIDEOTR ROM:20E1 ; --------------------------------------------------------------------------- ROM:20E4 .db 3Ah ; : ROM:20E5 ROM:20E5 ; =============== S U B R O U T I N E ======================================= ROM:20E5 ROM:20E5 ; Подпрограмма обработки видео. Нигде не используется. ROM:20E5 ROM:20E5 VIDEOTR: ROM:20E5 ROM:20E5 ; FUNCTION CHUNK AT ROM:20CF SIZE 00000015 BYTES ROM:20E5 ROM:20E5 mvi b, 0FEh ; '¦' ROM:20E7 ana c ROM:20E8 ora b ROM:20E9 stax d ROM:20EA lda VIDEO3 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:20ED ana c ROM:20EE pop b ROM:20EF stax b ROM:20F0 inx b ROM:20F1 inx h ROM:20F2 push d ROM:20F3 mov a, d ROM:20F4 xri 20h ROM:20F6 mov d, a ROM:20F7 xchg ROM:20F8 call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM). ROM:20FB xchg ROM:20FC ani 0F0h ROM:20FE ora m ROM:20FF stax d ROM:2100 inx h ROM:2101 pop d ROM:2102 call MACRO6 ROM:2105 mov a, d ROM:2106 ani 1Fh ROM:2108 cpi 18h ROM:210A jc loc_2119 ROM:210D lda VIDEO4 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:2110 dcr a ROM:2111 rlc ROM:2112 mov c, a ROM:2113 mvi b, 0 ROM:2115 dad b ROM:2116 jmp loc_2123 ROM:2119 ; --------------------------------------------------------------------------- ROM:2119 ROM:2119 loc_2119: ; CODE XREF: VIDEOTR+25j ROM:2119 lda VIDEO4 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:211C dcr a ROM:211D sta VIDEO4 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:2120 jnz loc_20DE ROM:2123 ROM:2123 loc_2123: ; CODE XREF: VIDEOTR+31j ROM:2123 pop d ROM:2124 mov a, e ROM:2125 adi 8 ROM:2127 mov e, a ROM:2128 rc ROM:2129 push d ROM:212A push d ROM:212B lda VIDEO1 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:212E dcr a ROM:212F sta VIDEO1 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:2132 jnz loc_20CF ROM:2135 pop d ROM:2136 pop d ROM:2137 ret ROM:2137 ; End of function VIDEOTR ROM:2137 ROM:2138 ROM:2138 ; =============== S U B R O U T I N E ======================================= ROM:2138 ROM:2138 ; Обработчик PUT. Подпрограмма. ROM:2138 ROM:2138 PUTTR2: ; CODE XREF: PUTTR:loc_20ACp ROM:2138 ; VIDEOTR-4p ROM:2138 lda PUTTRTMP2 ; Временная переменная PUTTR ROM:213B inr a ROM:213C mov c, a ROM:213D mov a, m ROM:213E ROM:213E loc_213E: ; CODE XREF: PUTTR2+8j ROM:213E rrc ROM:213F dcr c ROM:2140 jnz loc_213E ROM:2143 rlc ROM:2144 mov c, a ROM:2145 ret ROM:2145 ; End of function PUTTR2 ROM:2145 ROM:2146 ROM:2146 ; =============== S U B R O U T I N E ======================================= ROM:2146 ROM:2146 ROM:2146 MACRO6: ; CODE XREF: VIDEOTR+1Dp ROM:2146 ; VIDEOTR2+6Dp ROM:2146 inr e ROM:2147 mov a, e ROM:2148 ani 7 ROM:214A rnz ROM:214B mov a, e ROM:214C sui 8 ROM:214E mov e, a ROM:214F inr d ROM:2150 ret ROM:2150 ; End of function MACRO6 ROM:2150 ROM:2151 ; --------------------------------------------------------------------------- ROM:2151 ROM:2151 GET: ; Бейсик-оператор GET ROM:2151 call LINETR ROM:2154 call VARRTR ; Подпрограмма работы с видеомассивом. Используется в PUT и GET ROM:2157 push h ROM:2158 xchg ROM:2159 call VIDEOTR2 ; Подпрограмма обработки видео. Используется в GET. ROM:215C pop h ROM:215D ret ROM:215E ROM:215E ; =============== S U B R O U T I N E ======================================= ROM:215E ROM:215E ; Подпрограмма обработки видео. Используется в GET. ROM:215E ROM:215E VIDEOTR2: ; CODE XREF: ROM:2159p ROM:215E lda X1 ; Первый графический курсор, координата X ROM:2161 mov c, a ROM:2162 lda X2 ; Второй графический курсор, координата X ROM:2165 sub c ROM:2166 inr a ROM:2167 mov c, a ROM:2168 ani 0F8h ROM:216A rrc ROM:216B rrc ROM:216C rrc ROM:216D mov b, a ROM:216E mov a, c ROM:216F ani 7 ROM:2171 jz loc_2175 ROM:2174 inr b ROM:2175 ROM:2175 loc_2175: ; CODE XREF: VIDEOTR2+13j ROM:2175 lda Y1 ; Первый графический курсор, координата Y ROM:2178 mov c, a ROM:2179 lda Y2 ; Второй графический курсор, координата Y ROM:217C sub c ROM:217D inr a ROM:217E sta VIDEO2 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:2181 mov c, a ROM:2182 inx h ROM:2183 inx h ROM:2184 mov e, m ROM:2185 inx h ROM:2186 mov d, m ROM:2187 inx h ROM:2188 mvi a, 7 ROM:218A ROM:218A loc_218A: ; CODE XREF: VIDEOTR2+31j ROM:218A dcx d ROM:218B jc loc_2211 ROM:218E dcr a ROM:218F jnz loc_218A ROM:2192 mvi a, 5 ROM:2194 ROM:2194 loc_2194: ; CODE XREF: VIDEOTR2+38j ROM:2194 inx h ROM:2195 dcr a ROM:2196 jnz loc_2194 ROM:2199 mov a, b ROM:219A sta VIDEO1 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:219D mov m, b ROM:219E inx h ROM:219F mov m, c ROM:21A0 inx h ROM:21A1 mov b, d ROM:21A2 mov c, e ROM:21A3 push h ROM:21A4 push b ROM:21A5 call PRESETWT2 ; Рисование точки белым цветом (FD90 координата X, FD91 координата Y) ROM:21A8 pop b ROM:21A9 pop h ROM:21AA xchg ROM:21AB ROM:21AB loc_21AB: ; CODE XREF: VIDEOTR2+87j ROM:21AB lda VIDEO2 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:21AE sta VIDEO4 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:21B1 push h ROM:21B2 ROM:21B2 loc_21B2: ; CODE XREF: VIDEOTR2+78j ROM:21B2 call VIDEOTR3 ; Подпрограмма обработки видео. Используется в GET. ROM:21B5 call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM). ROM:21B8 stax d ROM:21B9 inx d ROM:21BA push h ROM:21BB mov a, h ROM:21BC xri 20h ROM:21BE mov h, a ROM:21BF call VIDEOTR3 ; Подпрограмма обработки видео. Используется в GET. ROM:21C2 call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM). ROM:21C5 ani 0Fh ROM:21C7 pop h ROM:21C8 stax d ROM:21C9 inx d ROM:21CA xchg ROM:21CB call MACRO6 ROM:21CE xchg ROM:21CF lda VIDEO4 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:21D2 dcr a ROM:21D3 sta VIDEO4 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:21D6 jnz loc_21B2 ROM:21D9 pop h ROM:21DA mov a, l ROM:21DB adi 8 ROM:21DD mov l, a ROM:21DE lda VIDEO1 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:21E1 dcr a ROM:21E2 sta VIDEO1 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:21E5 jnz loc_21AB ROM:21E8 lhld VIDEO2 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:21EB dad h ROM:21EC mov a, h ROM:21ED cma ROM:21EE mov h, a ROM:21EF mov a, l ROM:21F0 cma ROM:21F1 mov l, a ROM:21F2 inx h ROM:21F3 dad d ROM:21F4 ROM:21F4 loc_21F4: ; CODE XREF: VIDEOTR2+ABj ROM:21F4 call VIDEOTR3 ; Подпрограмма обработки видео. Используется в GET. ROM:21F7 xra a ROM:21F8 stax d ROM:21F9 inx d ROM:21FA inx h ROM:21FB call VIDEOTR3 ; Подпрограмма обработки видео. Используется в GET. ROM:21FE mov a, m ROM:21FF stax d ROM:2200 inx d ROM:2201 inx h ROM:2202 lda VIDEO2 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:2205 dcr a ROM:2206 sta VIDEO2 ; Видео-переменная. Используется в PUTTR и VIDEOTR ROM:2209 jnz loc_21F4 ROM:220C ret ROM:220C ; End of function VIDEOTR2 ROM:220C ROM:220D ROM:220D ; =============== S U B R O U T I N E ======================================= ROM:220D ROM:220D ; Подпрограмма обработки видео. Используется в GET. ROM:220D ROM:220D VIDEOTR3: ; CODE XREF: VIDEOTR2:loc_21B2p ROM:220D ; VIDEOTR2+61p ... ROM:220D dcx b ROM:220E mov a, c ROM:220F ora b ROM:2210 rnz ROM:2211 ROM:2211 loc_2211: ; CODE XREF: VIDEOTR2+2Dj ROM:2211 mvi e, 10h ROM:2213 jmp MAINLOOP1 ; Первая точка входа в главный цикл ROM:2213 ; End of function VIDEOTR3 ROM:2213 ROM:2216 ROM:2216 ; =============== S U B R O U T I N E ======================================= ROM:2216 ROM:2216 ROM:2216 MACRO7: ; CODE XREF: PRNTR1-12CAp ROM:2216 mvi b, 0 ROM:2218 sui 7Fh ; '' ROM:221A cpi 0Fh ROM:221C jz loc_2227 ROM:221F cpi 4 ROM:2221 jz loc_2227 ROM:2224 cpi 73h ; 's' ROM:2226 rnz ROM:2227 ROM:2227 loc_2227: ; CODE XREF: MACRO7+6j ROM:2227 ; MACRO7+Bj ROM:2227 mvi b, 1 ROM:2229 ret ROM:2229 ; End of function MACRO7 ROM:2229 ROM:2229 ; --------------------------------------------------------------------------- ROM:222A TAB7: .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:2230 ; --------------------------------------------------------------------------- ROM:2230 ; START OF FUNCTION CHUNK FOR PRNTR1 ROM:2230 ROM:2230 loc_2230: ; CODE XREF: PRNTR1-3j ROM:2230 inr b ROM:2231 dcr b ROM:2232 jz loc_50D ROM:2235 pop h ROM:2236 ROM:2236 loc_2236: ; CODE XREF: PRNTR1+A59j ROM:2236 rst 3 ; RST3 = печатает символ из A на экран. ROM:2237 mov a, m ROM:2238 ora a ROM:2239 inx h ROM:223A jnz loc_2236 ROM:223D jmp loc_4F7 ROM:223D ; END OF FUNCTION CHUNK FOR PRNTR1 ROM:2240 ROM:2240 ; =============== S U B R O U T I N E ======================================= ROM:2240 ROM:2240 ; Обработка нажатия Break ROM:2240 ROM:2240 TESTBREAKKEYTR: ; CODE XREF: TESTBREAKKEY2p ROM:2240 lda EVNTTAB ; Таблица событий. ROM:2240 ; (УПР/СТОП + 10 функциональных клавиш) ROM:2240 ; Бит 0 - маска события ROM:2240 ; Бит 2 - событие ROM:2243 ani 4 ROM:2245 rnz ROM:2246 lda STOPFLG ; STOP-флаг ROM:2249 ana a ROM:224A rz ROM:224B call CURSON2 ; Включает изображение курсора ROM:224E ROM:224E loc_224E: ; CODE XREF: TESTBREAKKEYTR+12j ROM:224E lda STOPFLG ; STOP-флаг ROM:2251 ana a ROM:2252 jnz loc_224E ROM:2255 call CURSOFF2 ; Выключает изображение курсора ROM:2258 xra a ROM:2259 ret ROM:2259 ; End of function TESTBREAKKEYTR ROM:2259 ROM:2259 ; --------------------------------------------------------------------------- ROM:225A TAB2: .db 0F0h, 0D1h, 0D2h, 0E8h, 0D5h, 0D6h, 0E6h, 0D4h, 0E7h ROM:225A ; DATA XREF: SYMPRN2+2112o ROM:225A .db 0DAh, 0DBh, 0DCh, 0DDh, 0DEh, 0DFh, 0E0h, 0E1h, 0F1h ROM:225A .db 0E2h, 0E3h, 0E4h, 0E5h, 0D8h, 0D3h, 0EEh, 0EDh, 0D9h ROM:225A .db 0EAh, 0EFh, 0EBh, 0E9h, 0ECh ROM:227A ; --------------------------------------------------------------------------- ROM:227A ; START OF FUNCTION CHUNK FOR SYMPRN2 ROM:227A ROM:227A loc_227A: ; CODE XREF: SYMPRN2+4j ROM:227A pop psw ROM:227B cpi 0C0h ; 'L' ROM:227D jc loc_22C1 ROM:2280 push d ROM:2281 mov d, a ROM:2282 lda TITL ; Переменная SYMPRN2 ROM:2285 cpi 2 ROM:2287 mov a, d ROM:2288 jz loc_22C0 ROM:228B ani 1Fh ROM:228D push h ROM:228E lxi h, TAB2 ROM:2291 add l ROM:2292 mov l, a ROM:2293 mov e, m ROM:2294 mov a, d ROM:2295 cpi 0E0h ; 'р' ROM:2297 mov a, e ROM:2298 jc loc_229D ROM:229B sui 30h ; '0' ROM:229D ROM:229D loc_229D: ; CODE XREF: SYMPRN2+211Cj ROM:229D pop h ROM:229E mov e, a ROM:229F mvi d, 0 ROM:22A1 lda TITL ; Переменная SYMPRN2 ROM:22A4 cpi 0 ROM:22A6 mov a, e ROM:22A7 jnz loc_22BF ROM:22AA mvi d, 0Fh ROM:22AC cpi 0A8h ; 'и' ROM:22AE jc loc_22BF ROM:22B1 dcr d ROM:22B2 cpi 0D1h ; 'T' ROM:22B4 jc loc_22BF ROM:22B7 mvi d, 0FFh ROM:22B9 cpi 0D8h ; '+' ROM:22BB jc loc_22BF ROM:22BE dcr d ROM:22BF ROM:22BF loc_22BF: ; CODE XREF: SYMPRN2+212Bj ROM:22BF ; SYMPRN2+2132j ... ROM:22BF add d ROM:22C0 ROM:22C0 loc_22C0: ; CODE XREF: SYMPRN2+210Cj ROM:22C0 pop d ROM:22C1 ROM:22C1 loc_22C1: ; CODE XREF: SYMPRN2+2101j ROM:22C1 out 85h ROM:22C3 in 86h ROM:22C5 ani 7Fh ROM:22C7 out 86h ROM:22C9 ori 80h ROM:22CB out 86h ROM:22CD ret ROM:22CD ; END OF FUNCTION CHUNK FOR SYMPRN2 ROM:22CD ; --------------------------------------------------------------------------- ROM:22CE TAB3: .db 0FDh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 2 ROM:2400 ROM:2400 ; =============== S U B R O U T I N E ======================================= ROM:2400 ROM:2400 ; Ввод символа из буфера клавиатуры ROM:2400 ROM:2400 BUFFERTOA2: ; CODE XREF: BUFFERTOAj ROM:2400 ; EDIT2:loc_2AD2p ROM:2400 push b ROM:2401 push h ROM:2402 push d ROM:2403 lxi h, EVNTTAB ; Таблица событий. ROM:2403 ; (УПР/СТОП + 10 функциональных клавиш) ROM:2403 ; Бит 0 - маска события ROM:2403 ; Бит 2 - событие ROM:2406 mov a, m ROM:2407 push psw ROM:2408 mvi m, 1 ROM:240A ROM:240A loc_240A: ; CODE XREF: BUFFERTOA2+10j ROM:240A call TESTBREAKKEY ; Тестирование нажатия УПР+Стоп ROM:240D call KBDBUFAK2 ; Опрос буфера клавиатуры ROM:2410 jz loc_240A ROM:2413 lhld INBUF ; Адрес чтения из буфера клавиатуры ROM:2416 mov b, m ROM:2417 inx h ROM:2418 lxi d, KBDTMP ; Переменная процедуры ввода из буфера. ROM:241B rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:241C jnz loc_2422 ROM:241F lxi h, KBDBUF ; Буфер клавиатуры ROM:2422 ROM:2422 loc_2422: ; CODE XREF: BUFFERTOA2+1Cj ROM:2422 shld INBUF ; Адрес чтения из буфера клавиатуры ROM:2425 pop psw ROM:2426 sta EVNTTAB ; Таблица событий. ROM:2426 ; (УПР/СТОП + 10 функциональных клавиш) ROM:2426 ; Бит 0 - маска события ROM:2426 ; Бит 2 - событие ROM:2429 mov a, b ROM:242A pop d ROM:242B pop h ROM:242C pop b ROM:242D ret ROM:242D ; End of function BUFFERTOA2 ROM:242D ROM:242E ROM:242E ; =============== S U B R O U T I N E ======================================= ROM:242E ROM:242E ; Опрос состояния кнопки джойстика ROM:242E ROM:242E ASKBTN2: ; CODE XREF: ASKBTNj ROM:242E dcr a ROM:242F jm loc_244B ROM:2432 push psw ROM:2433 cpi 2 ROM:2435 in 8Dh ROM:2437 jnc loc_243C ROM:243A in 8Ch ROM:243C ROM:243C loc_243C: ; CODE XREF: ASKBTN2+9j ROM:243C mov b, a ROM:243D pop psw ROM:243E ani 1 ROM:2440 mvi a, 10h ROM:2442 jz loc_2446 ROM:2445 rlc ROM:2446 ROM:2446 loc_2446: ; CODE XREF: ASKBTN2+14j ROM:2446 ana b ROM:2447 rz ROM:2448 mvi a, 1 ROM:244A ret ROM:244B ; --------------------------------------------------------------------------- ROM:244B ROM:244B loc_244B: ; CODE XREF: ASKBTN2+1j ROM:244B mvi a, 8 ROM:244D call KBDRAW2 ; Опрос ряда клавиатурной матрицы ROM:2450 cma ROM:2451 ei ROM:2452 ani 1 ROM:2454 ret ROM:2454 ; End of function ASKBTN2 ROM:2454 ROM:2454 ; --------------------------------------------------------------------------- ROM:2455 TAB4: .db 0, 3, 5, 4, 1, 2, 0, 3, 7, 0, 6, 5, 8, 1, 7, 0, 0 ROM:2455 ; DATA XREF: JOYDIR2+21o ROM:2455 .db 5, 1, 0, 3, 4, 2, 3, 7, 6, 8, 7, 0, 5, 1, 0 ; Дешифратор направлений джойстика ROM:2475 ROM:2475 ; =============== S U B R O U T I N E ======================================= ROM:2475 ROM:2475 ; Подпрограмма установки видео-режимов. ROM:2475 ROM:2475 SETMODE3: ; CODE XREF: INTRPT2:loc_24EFp ROM:2475 ; SETMODE2:loc_28B3p ROM:2475 ROM:2475 ; FUNCTION CHUNK AT ROM:0175 SIZE 00000007 BYTES ROM:2475 ROM:2475 lda ABS2 ; Старший байт адреса буфера экрана в режимах 0 и 1 ROM:2478 rrc ROM:2479 rrc ROM:247A nop ROM:247B out 90h ROM:247D lda AGS2 ; Старший байт адреса знакогенератора в режимах 0 и 1 ROM:247D ; Старший байт адреса буфера экрана режима 2 ROM:2480 rrc ROM:2481 rrc ROM:2482 nop ROM:2483 out 91h ROM:2485 lda GTBL2 ; Старший байт адреса таблицы точек изображения в режиме 2 ROM:2488 rrc ROM:2489 rrc ROM:248A cma ROM:248B out 92h ROM:248D lda CTBL2 ; Старший байт адреса таблицы цвета в режиме 2 ROM:2490 rrc ROM:2491 rrc ROM:2492 cma ROM:2493 out 93h ROM:2495 lda MODE ; Режим экрана ROM:2498 cpi 1 ROM:249A rnz ; Если текущий режим работы не 1, то возвращаемся ROM:249B lda MODE1FLG ; Флаги режима 1 ROM:249E ana a ROM:249F jz loc_24A7 ROM:24A2 xra a ROM:24A3 sta MODE1FLG ; Флаги режима 1 ROM:24A6 ret ROM:24A7 ; --------------------------------------------------------------------------- ROM:24A7 ROM:24A7 loc_24A7: ; CODE XREF: SETMODE3+2Aj ROM:24A7 xra a ROM:24A8 sta SCRTMP1 ; Экранные временные переменные. ROM:24AB lhld CLRT ; Адрес таблицы цвета режима 1 ROM:24AE call ISOOFF ; Гашение изображения ROM:24B1 mvi a, 0A0h ; 'а' ROM:24B3 call loc_F859 ROM:24B6 jmp ISOON ROM:24B6 ; End of function SETMODE3 ROM:24B6 ROM:24B9 ROM:24B9 ; =============== S U B R O U T I N E ======================================= ROM:24B9 ROM:24B9 ; Заполнение области константой ROM:24B9 ROM:24B9 FILLAREA2: ; CODE XREF: FILLAREAj ROM:24B9 push d ROM:24BA mov d, a ROM:24BB ROM:24BB loc_24BB: ; CODE XREF: FILLAREA2+8j ROM:24BB mov m, a ROM:24BC inx h ROM:24BD dcx b ROM:24BE mov a, b ROM:24BF ora c ROM:24C0 mov a, d ROM:24C1 jnz loc_24BB ROM:24C4 pop d ROM:24C5 ret ROM:24C5 ; End of function FILLAREA2 ROM:24C5 ROM:24C6 ROM:24C6 ; =============== S U B R O U T I N E ======================================= ROM:24C6 ROM:24C6 ; Тут вообще муть несусветная! Но интересно жутко! ROM:24C6 ROM:24C6 PCHL4002: ; CODE XREF: START+298Dp ROM:24C6 ; START+2994p ... ROM:24C6 lxi d, 4000h ROM:24C9 ldax d ROM:24CA cpi 41h ; 'A' ROM:24CC rnz ROM:24CD inx d ROM:24CE ldax d ROM:24CF cpi 42h ; 'B' ROM:24D1 rnz ROM:24D2 inx d ROM:24D3 ldax d ROM:24D4 mov l, a ROM:24D5 inx d ROM:24D6 ldax d ROM:24D7 mov h, a ROM:24D8 pchl ROM:24D8 ; End of function PCHL4002 ROM:24D8 ROM:24D9 ROM:24D9 ; =============== S U B R O U T I N E ======================================= ROM:24D9 ROM:24D9 ; Обработка прерываний. ROM:24D9 ROM:24D9 INTRPT2: ; CODE XREF: INTRPTj ROM:24D9 call INTCATH ROM:24DC push b ROM:24DD push d ROM:24DE push h ROM:24DF push psw ROM:24E0 lda SCRTMP1 ; Экранные временные переменные. ROM:24E3 ana a ROM:24E4 jnz loc_24EF ROM:24E7 lda INTTMP ; Переменная обработчика прерываний ROM:24EA ani 7 ROM:24EC jnz loc_24F2 ROM:24EF ROM:24EF loc_24EF: ; CODE XREF: INTRPT2+Bj ROM:24EF call SETMODE3 ; Подпрограмма установки видео-режимов. ROM:24F2 ROM:24F2 loc_24F2: ; CODE XREF: INTRPT2+13j ROM:24F2 ; INTRPT2+131j ROM:24F2 lxi h, OLDKBDMT+0Ah ; Старое состояние матрицы клавиатуры ROM:24F5 push h ROM:24F6 lxi h, INTAR+8 ; Рабочая область обработки прерываний ROM:24F9 lxi d, OLDKBDMT ; Старое состояние матрицы клавиатуры ROM:24FC in 82h ROM:24FE ani 0F0h ROM:2500 mov b, a ROM:2501 mvi c, 1 ROM:2503 ROM:2503 loc_2503: ; CODE XREF: INTRPT2+46j ROM:2503 xthl ROM:2504 inx h ROM:2505 out 82h ROM:2507 in 81h ROM:2509 cma ROM:250A cmp m ROM:250B jz loc_2511 ROM:250E mov m, a ROM:250F mvi c, 0 ROM:2511 ROM:2511 loc_2511: ; CODE XREF: INTRPT2+32j ROM:2511 ldax d ROM:2512 cma ROM:2513 ana m ROM:2514 xthl ROM:2515 mov m, a ROM:2516 inx h ROM:2517 inx d ROM:2518 mov a, b ROM:2519 ani 0Fh ROM:251B inr b ROM:251C cpi 9 ROM:251E mov a, b ROM:251F jnz loc_2503 ROM:2522 pop h ROM:2523 mov a, c ROM:2524 ana a ROM:2525 jz loc_25EC ROM:2528 lda TIMCT ; Таймер (+1 каждые 20ms) ROM:252B ana a ROM:252C jnz loc_2545 ROM:252F inr a ROM:2530 sta TIMCT ; Таймер (+1 каждые 20ms) ROM:2533 lxi b, 0Ah ROM:2536 lxi d, OLDKBDMT ; Старое состояние матрицы клавиатуры ROM:2539 lxi h, NEWKBDMT ; Новое состояние матрицы клавиатуры ROM:253C call RAMSEND ; BC=счетчик, DE=адрес приема, HL=адрес источника ROM:253C ; (пересылка RAM->RAM, RAM->VRAM) ROM:253F lxi h, INTAR+8 ; Рабочая область обработки прерываний ROM:2542 jmp loc_2565 ROM:2545 ; --------------------------------------------------------------------------- ROM:2545 ROM:2545 loc_2545: ; CODE XREF: INTRPT2+53j ROM:2545 cpi 32h ; '2' ROM:2547 jc loc_25E8 ROM:254A lxi h, OLDKBDMT ; Старое состояние матрицы клавиатуры ROM:254D mvi c, 0Ah ROM:254F xra a ROM:2550 ROM:2550 loc_2550: ; CODE XREF: INTRPT2+7Aj ROM:2550 ora m ROM:2551 inx h ROM:2552 dcr c ROM:2553 jnz loc_2550 ROM:2556 ana a ROM:2557 jz loc_25EB ROM:255A lda INTTMP ; Переменная обработчика прерываний ROM:255D ani 3 ROM:255F jnz loc_25EF ROM:2562 lxi h, OLDKBDMT ; Старое состояние матрицы клавиатуры ROM:2565 ROM:2565 loc_2565: ; CODE XREF: INTRPT2+69j ROM:2565 push h ROM:2566 lhld NEWKBDMT+6 ; Новое состояние матрицы клавиатуры ROM:2569 mov a, l ROM:256A ani 1Fh ROM:256C mov l, a ROM:256D mov a, h ROM:256E ani 40h ROM:2570 ora l ROM:2571 mov b, a ROM:2572 lxi h, INTTMP2 ; Переменная обработчика прерываний ROM:2575 lda INTAR+0Eh ; Рабочая область обработки прерываний ROM:2578 ani 10h ROM:257A jz loc_2582 ROM:257D mov a, b ROM:257E ani 4Dh ROM:2580 xra m ROM:2581 mov m, a ROM:2582 ROM:2582 loc_2582: ; CODE XREF: INTRPT2+A1j ROM:2582 mov a, b ROM:2583 xra m ROM:2584 lxi h, INSF2 ; Флаги режимов клавиатуры ROM:2587 mov b, m ROM:2588 mov m, a ROM:2589 mov h, a ROM:258A push psw ROM:258B xra b ROM:258C ani 1 ROM:258E cnz FNKEYTR ; Подпрограмма-обработчик функциональных клавиш ROM:2591 pop psw ROM:2592 call PORT8682 ; Работа с портами &h86 и &h82 ROM:2595 mov h, a ROM:2596 lxi b, 3Fh ; '?' ROM:2599 ani 1 ROM:259B jz loc_25A0 ROM:259E mvi b, 20h ; ' ' ROM:25A0 ROM:25A0 loc_25A0: ; CODE XREF: INTRPT2+C2j ROM:25A0 mov a, h ROM:25A1 mvi d, 20h ; ' ' ROM:25A3 ani 8 ROM:25A5 jz loc_25AA ROM:25A8 mvi d, 80h ; 'А' ROM:25AA ROM:25AA loc_25AA: ; CODE XREF: INTRPT2+CCj ROM:25AA mvi e, 0FFh ROM:25AC mov a, b ROM:25AD xra d ROM:25AE mov d, a ROM:25AF mov a, b ROM:25B0 rrc ROM:25B1 mov b, a ROM:25B2 mov a, h ROM:25B3 ani 4 ROM:25B5 jz loc_25C1 ROM:25B8 mvi c, 1Fh ROM:25BA lxi d, 80BFh ROM:25BD mov a, b ROM:25BE rlc ROM:25BF ora d ROM:25C0 mov d, a ROM:25C1 ROM:25C1 loc_25C1: ; CODE XREF: INTRPT2+DCj ROM:25C1 mov a, h ROM:25C2 ani 2 ROM:25C4 jz loc_25CC ROM:25C7 lxi d, 1Fh ROM:25CA mvi c, 0 ROM:25CC ROM:25CC loc_25CC: ; CODE XREF: INTRPT2+EBj ROM:25CC xchg ROM:25CD shld INTAR+2 ; Рабочая область обработки прерываний ROM:25D0 push b ROM:25D1 pop h ROM:25D2 shld INTAR ; Рабочая область обработки прерываний ROM:25D5 pop h ROM:25D6 mvi c, 0 ROM:25D8 ROM:25D8 loc_25D8: ; CODE XREF: INTRPT2+109j ROM:25D8 mov a, m ROM:25D9 ana a ROM:25DA cnz KBD ; Подпрограмма-обработчик клавиатуры ROM:25DD inx h ROM:25DE inr c ROM:25DF mov a, c ROM:25E0 cpi 0Ah ROM:25E2 jnz loc_25D8 ROM:25E5 jmp loc_25EF ROM:25E8 ; --------------------------------------------------------------------------- ROM:25E8 ROM:25E8 loc_25E8: ; CODE XREF: INTRPT2+6Ej ROM:25E8 lda TIMCT ; Таймер (+1 каждые 20ms) ROM:25EB ROM:25EB loc_25EB: ; CODE XREF: INTRPT2+7Ej ROM:25EB inr a ROM:25EC ROM:25EC loc_25EC: ; CODE XREF: INTRPT2+4Cj ROM:25EC sta TIMCT ; Таймер (+1 каждые 20ms) ROM:25EF ROM:25EF loc_25EF: ; CODE XREF: INTRPT2+86j ROM:25EF ; INTRPT2+10Cj ROM:25EF lda INTTMP ; Переменная обработчика прерываний ROM:25F2 inr a ROM:25F3 sta INTTMP ; Переменная обработчика прерываний ROM:25F6 lda INTTMP3 ; Переменная обработчика прерываний ROM:25F9 ana a ROM:25FA cnz BELL2 ; Обработка звука нажатия клавиш и CHR$(&h07) (в зависимости от BEEPF) ROM:25FD jmp loc_260D ROM:2600 ; --------------------------------------------------------------------------- ROM:2600 ana a ROM:2601 jz loc_260D ROM:2604 call MACRO1 ROM:2607 call KBDBUFCL2 ; Очищает буфер клавиатуры ROM:260A jmp loc_24F2 ROM:260D ; --------------------------------------------------------------------------- ROM:260D ROM:260D loc_260D: ; CODE XREF: INTRPT2+124j ROM:260D ; INTRPT2+128j ROM:260D pop psw ROM:260E pop h ROM:260F pop d ROM:2610 pop b ROM:2611 ei ROM:2612 ret ROM:2612 ; End of function INTRPT2 ROM:2612 ROM:2613 ROM:2613 ; =============== S U B R O U T I N E ======================================= ROM:2613 ROM:2613 ; Подпрограмма-обработчик клавиатуры ROM:2613 ROM:2613 KBD: ; CODE XREF: INTRPT2+101p ROM:2613 ROM:2613 ; FUNCTION CHUNK AT ROM:26E6 SIZE 00000050 BYTES ROM:2613 ROM:2613 push h ROM:2614 lxi h, TAB5 ROM:2617 mov b, a ROM:2618 mov a, c ROM:2619 rlc ROM:261A rlc ROM:261B rlc ROM:261C mov e, a ROM:261D mvi d, 0 ROM:261F dad d ROM:2620 mvi e, 10h ROM:2622 mov a, c ROM:2623 cpi 6 ROM:2625 jc loc_2636 ROM:2628 cpi 8 ROM:262A jc loc_2636 ROM:262D lda INSF2 ; Флаги режимов клавиатуры ROM:2630 ani 40h ROM:2632 jz loc_2636 ROM:2635 dad d ROM:2636 ROM:2636 loc_2636: ; CODE XREF: KBD+12j KBD+17j ... ROM:2636 mvi a, 1 ROM:2638 ROM:2638 loc_2638: ; CODE XREF: KBD+8Ej ROM:2638 mov e, a ROM:2639 ana b ROM:263A jz loc_269E ROM:263D mov a, m ROM:263E ana a ROM:263F jz loc_269E ROM:2642 cpi 0FFh ROM:2644 jnz loc_2686 ROM:2647 lda INSF2 ; Флаги режимов клавиатуры ROM:264A ani 2 ROM:264C lda EVNTTAB ; Таблица событий. ROM:264C ; (УПР/СТОП + 10 функциональных клавиш) ROM:264C ; Бит 0 - маска события ROM:264C ; Бит 2 - событие ROM:264F jz loc_266C ROM:2652 rrc ROM:2653 jnc loc_269E ROM:2656 rlc ROM:2657 ori 4 ROM:2659 sta EVNTTAB ; Таблица событий. ROM:2659 ; (УПР/СТОП + 10 функциональных клавиш) ROM:2659 ; Бит 0 - маска события ROM:2659 ; Бит 2 - событие ROM:265C lda KSS ; Код символа в позиции курсора ROM:265F push h ROM:2660 lhld SMK ; Адрес курсора ROM:2663 mov m, a ROM:2664 pop h ROM:2665 xra a ROM:2666 sta STOPFLG ; STOP-флаг ROM:2669 jmp loc_269E ROM:266C ; --------------------------------------------------------------------------- ROM:266C ROM:266C loc_266C: ; CODE XREF: KBD+3Cj ROM:266C ani 2 ROM:266E jz loc_269E ROM:2671 lda STOPFLG ; STOP-флаг ROM:2674 cma ROM:2675 ROM:2675 loc_2675: ; CODE XREF: ROM:314Cj ROM:2675 sta STOPFLG ; STOP-флаг ROM:2678 jmp loc_269E ROM:267B ; --------------------------------------------------------------------------- ROM:267B cz CURSOFF2 ; Выключает изображение курсора ROM:267E pop psw ROM:267F cnz CURSON2 ; Включает изображение курсора ROM:2682 ROM:2682 loc_2682: ; CODE XREF: ROM:3146j ROM:2682 pop h ROM:2683 jmp loc_269E ROM:2686 ; --------------------------------------------------------------------------- ROM:2686 ROM:2686 loc_2686: ; CODE XREF: KBD+31j ROM:2686 cpi 0F1h ; 'ё' ROM:2688 jnc loc_26E6 ROM:268B mov d, a ROM:268C mov a, c ROM:268D cpi 2 ROM:268F jc loc_26A6 ROM:2692 cpi 6 ROM:2694 jc loc_26BF ROM:2697 mov a, d ROM:2698 ROM:2698 loc_2698: ; CODE XREF: KBD+9Dj KBD+A9j ... ROM:2698 sta INTTMP3 ; Переменная обработчика прерываний ROM:269B call KBD1 ; Подпрограмма-обработчик клавиатуры ROM:269E ROM:269E loc_269E: ; CODE XREF: KBD+27j KBD+2Cj ... ROM:269E inx h ROM:269F mov a, e ROM:26A0 rlc ROM:26A1 jnc loc_2638 ROM:26A4 pop h ROM:26A5 ret ROM:26A6 ; --------------------------------------------------------------------------- ROM:26A6 ROM:26A6 loc_26A6: ; CODE XREF: KBD+7Cj ROM:26A6 push h ROM:26A7 lhld INTAR ; Рабочая область обработки прерываний ROM:26AA mov a, l ROM:26AB ana d ROM:26AC xra h ROM:26AD pop h ROM:26AE cpi 20h ; ' ' ROM:26B0 jnc loc_2698 ROM:26B3 push psw ROM:26B4 mvi a, 1 ROM:26B6 call KBD1 ; Подпрограмма-обработчик клавиатуры ROM:26B9 pop psw ROM:26BA adi 40h ; '@' ROM:26BC jmp loc_2698 ROM:26BF ; --------------------------------------------------------------------------- ROM:26BF ROM:26BF loc_26BF: ; CODE XREF: KBD+81j ROM:26BF push h ROM:26C0 lhld INTAR+2 ; Рабочая область обработки прерываний ROM:26C3 mov a, l ROM:26C4 ana d ROM:26C5 xra h ROM:26C6 mov h, a ROM:26C7 mov a, d ROM:26C8 ani 20h ROM:26CA xra h ROM:26CB pop h ROM:26CC jmp loc_2698 ROM:26CC ; End of function KBD ROM:26CC ROM:26CF ROM:26CF ; =============== S U B R O U T I N E ======================================= ROM:26CF ROM:26CF ; Подпрограмма-обработчик клавиатуры ROM:26CF ROM:26CF KBD1: ; CODE XREF: KBD+88p KBD+A3p ... ROM:26CF push d ROM:26D0 push h ROM:26D1 lhld OUTBUF ; Адрес записи в буфер клавиатуры ROM:26D4 lxi d, KBDTMP ; Переменная процедуры ввода из буфера. ROM:26D7 mov m, a ROM:26D8 inx h ROM:26D9 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:26DA jnz loc_26E0 ROM:26DD lxi h, KBDBUF ; Буфер клавиатуры ROM:26E0 ROM:26E0 loc_26E0: ; CODE XREF: KBD1+Bj ROM:26E0 shld OUTBUF ; Адрес записи в буфер клавиатуры ROM:26E3 pop h ROM:26E4 pop d ROM:26E5 ret ROM:26E5 ; End of function KBD1 ROM:26E5 ROM:26E6 ; --------------------------------------------------------------------------- ROM:26E6 ; START OF FUNCTION CHUNK FOR KBD ROM:26E6 ROM:26E6 loc_26E6: ; CODE XREF: KBD+75j ROM:26E6 push b ROM:26E7 push h ROM:26E8 ani 7 ROM:26EA mov c, a ROM:26EB lda INSF2 ; Флаги режимов клавиатуры ROM:26EE ani 1 ROM:26F0 mov a, c ROM:26F1 jz loc_26F6 ROM:26F4 adi 5 ROM:26F6 ROM:26F6 loc_26F6: ; CODE XREF: KBD+DEj ROM:26F6 dcr a ROM:26F7 mov b, a ROM:26F8 rlc ROM:26F9 mov c, a ROM:26FA lhld BASOPNUM ; Номер оператора Бейсик программы. ROM:26FA ; Или &hFFFF в командном режиме ROM:26FD inx h ROM:26FE mov a, h ROM:26FF ora l ROM:2700 mov a, c ROM:2701 jnz loc_271F ROM:2704 rlc ROM:2705 rlc ROM:2706 rlc ROM:2707 mov c, a ROM:2708 mvi b, 0 ROM:270A lxi h, FNKTXT ; Текст функциональных клавиш ROM:270D dad b ROM:270E ROM:270E loc_270E: ; CODE XREF: KBD+104j ROM:270E mov a, m ROM:270F ana a ROM:2710 jz loc_271A ROM:2713 call KBD1 ; Подпрограмма-обработчик клавиатуры ROM:2716 inx h ROM:2717 jmp loc_270E ROM:271A ; --------------------------------------------------------------------------- ROM:271A ROM:271A loc_271A: ; CODE XREF: KBD+FDj KBD+120j ROM:271A pop h ROM:271B pop b ROM:271C jmp loc_2698 ROM:271F ; --------------------------------------------------------------------------- ROM:271F ROM:271F loc_271F: ; CODE XREF: KBD+EEj ROM:271F add b ROM:2720 mvi b, 0 ROM:2722 mov c, a ROM:2723 lxi h, KBDTMPBUF ; Временный буфер клавиатуры ROM:2726 dad b ROM:2727 mov a, m ROM:2728 rrc ROM:2729 jnc loc_272E ROM:272C ori 2 ROM:272E ROM:272E loc_272E: ; CODE XREF: KBD+116j ROM:272E rlc ROM:272F mov m, a ROM:2730 sta SCRTMP3 ; Экранные временные переменные. ROM:2733 jmp loc_271A ROM:2733 ; END OF FUNCTION CHUNK FOR KBD ROM:2736 ROM:2736 ; =============== S U B R O U T I N E ======================================= ROM:2736 ROM:2736 ; Подпрограмма-обработчик функциональных клавиш ROM:2736 ROM:2736 FNKEYTR: ; CODE XREF: INTRPT2+B5p ROM:2736 ; KEYSON2+22j ... ROM:2736 ROM:2736 ; FUNCTION CHUNK AT ROM:2778 SIZE 0000005E BYTES ROM:2736 ROM:2736 lda MSK ; Количество строк экрана ROM:2739 cpi 18h ROM:273B rz ROM:273C lxi d, FNKTXT ; Текст функциональных клавиш ROM:273F mov a, h ROM:2740 lxi h, 0 ROM:2743 rar ROM:2744 jnc loc_274A ROM:2747 lxi h, 50h ; 'P' ROM:274A ROM:274A loc_274A: ; CODE XREF: FNKEYTR+Ej ROM:274A dad d ROM:274B push h ROM:274C lhld ABS1 ; Адрес буфера экрана режима 0 и 1 ROM:274F lxi d, loc_2DF+1 ROM:2752 xchg ROM:2753 lda DLSM ; Максимальная длина строк 32 или 64 ROM:2756 ani 0BFh ROM:2758 jnz loc_275C ROM:275B dad h ROM:275C ROM:275C loc_275C: ; CODE XREF: FNKEYTR+22j ROM:275C dad d ROM:275D pop d ROM:275E lda SPN ; Пропусков в начале строки ROM:2761 mov c, a ROM:2762 mvi b, 0 ROM:2764 dad b ROM:2765 xchg ROM:2766 lda DLSF ; Длина строки экрана ROM:2769 cpi 9 ROM:276B jz loc_27CA ROM:276E jnc loc_2778 ROM:276E ; End of function FNKEYTR ROM:276E ROM:2771 ROM:2771 ; =============== S U B R O U T I N E ======================================= ROM:2771 ROM:2771 ROM:2771 MACRO8: ; CODE XREF: FNKEYTR+5Bp ROM:2771 ; FNKEYTR+9Cp ROM:2771 xchg ROM:2772 mvi b, 20h ; ' ' ROM:2774 call MACRO9 ROM:2777 ret ROM:2777 ; End of function MACRO8 ROM:2777 ROM:2778 ; --------------------------------------------------------------------------- ROM:2778 ; START OF FUNCTION CHUNK FOR FNKEYTR ROM:2778 ROM:2778 loc_2778: ; CODE XREF: FNKEYTR+38j ROM:2778 mvi c, 6 ROM:277A mvi b, 28h ; '(' ROM:277C ROM:277C loc_277C: ; CODE XREF: FNKEYTR+51j ROM:277C cmp b ROM:277D jnc loc_278A ROM:2780 push psw ROM:2781 mov a, b ROM:2782 sui 5 ROM:2784 mov b, a ROM:2785 pop psw ROM:2786 dcr c ROM:2787 jnz loc_277C ROM:278A ROM:278A loc_278A: ; CODE XREF: FNKEYTR+47j ROM:278A sub b ROM:278B rar ROM:278C inr a ROM:278D dcr a ROM:278E push psw ROM:278F aci 0 ROM:2791 call MACRO8 ROM:2794 xchg ROM:2795 pop psw ROM:2796 ROM:2796 loc_2796: ; CODE XREF: FNKEYTR+97j ROM:2796 push psw ROM:2797 mvi b, 5 ROM:2799 inr c ROM:279A ROM:279A loc_279A: ; CODE XREF: FNKEYTR+91j ROM:279A pop psw ROM:279B jz loc_27A5 ROM:279E dcr a ROM:279F push psw ROM:27A0 push b ROM:27A1 inr c ROM:27A2 jmp loc_27A7 ROM:27A5 ; --------------------------------------------------------------------------- ROM:27A5 ROM:27A5 loc_27A5: ; CODE XREF: FNKEYTR+65j ROM:27A5 push psw ROM:27A6 push b ROM:27A7 ROM:27A7 loc_27A7: ; CODE XREF: FNKEYTR+6Cj ROM:27A7 push h ROM:27A8 ROM:27A8 loc_27A8: ; CODE XREF: FNKEYTR+7Ej ROM:27A8 mov a, m ROM:27A9 cpi 20h ; ' ' ROM:27AB jnc loc_27B0 ROM:27AE mvi a, 20h ; ' ' ROM:27B0 ROM:27B0 loc_27B0: ; CODE XREF: FNKEYTR+75j ROM:27B0 stax d ROM:27B1 inx h ROM:27B2 inx d ROM:27B3 dcr c ROM:27B4 jnz loc_27A8 ROM:27B7 pop h ROM:27B8 pop b ROM:27B9 dcr b ROM:27BA jz loc_27D0 ROM:27BD mvi a, 20h ; ' ' ROM:27BF stax d ROM:27C0 inx d ROM:27C1 push b ROM:27C2 lxi b, 10h ROM:27C5 dad b ROM:27C6 pop b ROM:27C7 jmp loc_279A ROM:27CA ; --------------------------------------------------------------------------- ROM:27CA ROM:27CA loc_27CA: ; CODE XREF: FNKEYTR+35j ROM:27CA mvi c, 0 ROM:27CC xra a ROM:27CD jmp loc_2796 ROM:27D0 ; --------------------------------------------------------------------------- ROM:27D0 ROM:27D0 loc_27D0: ; CODE XREF: FNKEYTR+84j ROM:27D0 pop psw ROM:27D1 rz ROM:27D2 call MACRO8 ROM:27D5 ret ROM:27D5 ; END OF FUNCTION CHUNK FOR FNKEYTR ROM:27D5 ; --------------------------------------------------------------------------- ROM:27D6 TAB5: .db ' ', '!', 22h, '#', '$', '%', '&', 27h, '(', ')', ',' ROM:27D6 ; DATA XREF: KBD+1o ROM:27D6 .db '-', '.', ':', ';', '?', '{', '|', '}', '~', '', '`' ROM:27D6 .db 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K' ROM:27D6 .db 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V' ROM:27D6 .db 'W', 'X', 'Y', 'Z', 0, 0, 0, 0, 0, 'ё', 'Є', 'є', 'Ї' ROM:27D6 .db 'ї', 1Bh, 9, 0FFh, 8, 0, 0Dh, ' ', 0Ch, 12h, '', 1Dh ROM:27D6 .db 1Eh, 1Fh, 1Ch, 0Bh, 19h, 18h, 2, 6, 0Eh, 0Fh, 0, ' ' ROM:27D6 .db 0Ch, 12h, '', '4', '8', '2', '6', '7', '9', '5', '1' ROM:27D6 .db '3', '.', '0', 0 ROM:2836 ROM:2836 ; =============== S U B R O U T I N E ======================================= ROM:2836 ROM:2836 ; Установка цвета ROM:2836 ROM:2836 SETCOLOR2: ; CODE XREF: SETCOLORj ROM:2836 ; SETMODE2+61p ... ROM:2836 push h ROM:2837 lhld CPP ; цвет изображения ROM:283A mov a, h ROM:283B rlc ROM:283C rlc ROM:283D rlc ROM:283E rlc ROM:283F ora l ROM:2840 mov h, a ROM:2841 lda MODE ; Режим экрана ROM:2844 cpi 1 ROM:2846 mov a, h ROM:2847 jz loc_2851 ROM:284A jnc loc_2861 ROM:284D out 88h ROM:284F pop h ROM:2850 ret ROM:2851 ; --------------------------------------------------------------------------- ROM:2851 ROM:2851 loc_2851: ; CODE XREF: SETCOLOR2+11j ROM:2851 lhld CLRT ; Адрес таблицы цвета режима 1 ROM:2854 push b ROM:2855 lxi b, 20h ; ' ' ROM:2858 call FILLAREA ; A=константа, BC=счетчик, HL=адрес (заполнение области константой) ROM:285B mvi a, 1 ROM:285D sta SCRTMP1 ; Экранные временные переменные. ROM:2860 pop b ROM:2861 ROM:2861 loc_2861: ; CODE XREF: SETCOLOR2+14j ROM:2861 lda CRG ; цвет рамки ROM:2864 rrc ROM:2865 rrc ROM:2866 rrc ROM:2867 rrc ROM:2868 out 88h ROM:286A mov a, h ROM:286B pop h ROM:286C ret ROM:286C ; End of function SETCOLOR2 ROM:286C ROM:286D ROM:286D ; =============== S U B R O U T I N E ======================================= ROM:286D ROM:286D ; Установка режима экрана ROM:286D ROM:286D SETMODE2: ; CODE XREF: SETMODEj ROM:286D ; START+2986p ROM:286D push b ROM:286E push d ROM:286F push h ROM:2870 lxi h, MODE ; Режим экрана ROM:2873 mov b, m ROM:2874 mov m, a ROM:2875 inx h ROM:2876 mov c, a ROM:2877 mov a, b ROM:2878 cpi 2 ROM:287A jz loc_287E ROM:287D mov m, a ROM:287E ROM:287E loc_287E: ; CODE XREF: SETMODE2+Dj ROM:287E mov a, c ROM:287F cpi 1 ROM:2881 push psw ROM:2882 lxi d, DLSM ; Максимальная длина строк 32 или 64 ROM:2885 lxi b, 13h ROM:2888 lxi h, TAB6 ROM:288B pop psw ROM:288C mvi a, 20h ; ' ' ROM:288E jc loc_289A ROM:2891 dad b ROM:2892 mvi a, 0 ROM:2894 jz loc_289A ROM:2897 dad b ROM:2898 mvi a, 10h ROM:289A ROM:289A loc_289A: ; CODE XREF: SETMODE2+21j ROM:289A ; SETMODE2+27j ROM:289A push psw ROM:289B call RAMSEND ; BC=счетчик, DE=адрес приема, HL=адрес источника ROM:289B ; (пересылка RAM->RAM, RAM->VRAM) ROM:289E lda MODE ; Режим экрана ROM:28A1 cpi 2 ROM:28A3 lhld AGS1 ; Адрес знакогенератора режима 0 и 1 ROM:28A3 ; Адрес буфера экрана режима 2 ROM:28A6 jz loc_28D6 ROM:28A9 xchg ROM:28AA lxi b, 800h ROM:28AD lxi h, ZNAKGEN ; Начало знакогенератора. ROM:28B0 call DIRAMSEND ; Запрещает прерывания и вызывает RAMSEND ROM:28B3 ROM:28B3 loc_28B3: ; CODE XREF: SETMODE2+77j ROM:28B3 call SETMODE3 ; Подпрограмма установки видео-режимов. ROM:28B6 pop psw ROM:28B7 mov b, a ROM:28B8 in 84h ROM:28BA ani 0CFh ROM:28BC ora b ROM:28BD push psw ROM:28BE di ROM:28BF mvi a, 20h ; ' ' ROM:28C1 out 84h ROM:28C3 xra a ROM:28C4 out 88h ROM:28C6 mvi a, 0Ch ROM:28C8 call SYMSCR2 ; вывод символа из A на экран в текущую позицию курсора ROM:28CB pop psw ROM:28CC out 84h ROM:28CE call SETCOLOR2 ; Установка цвета ROM:28D1 ei ROM:28D2 pop h ROM:28D3 pop d ROM:28D4 pop b ROM:28D5 ret ROM:28D6 ; --------------------------------------------------------------------------- ROM:28D6 ROM:28D6 loc_28D6: ; CODE XREF: SETMODE2+39j ROM:28D6 mvi b, 0 ROM:28D8 mvi c, 3 ROM:28DA ROM:28DA loc_28DA: ; CODE XREF: SETMODE2+70j ROM:28DA ; SETMODE2+74j ROM:28DA mov m, b ROM:28DB inx h ROM:28DC inr b ROM:28DD jnz loc_28DA ROM:28E0 dcr c ROM:28E1 jnz loc_28DA ROM:28E4 jmp loc_28B3 ROM:28E4 ; End of function SETMODE2 ROM:28E4 ROM:28E4 ; --------------------------------------------------------------------------- ROM:28E7 TAB6: .db 40h, 1, 26h, 17h, 19h, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0 ROM:28E7 ; DATA XREF: SETMODE2+1Bo ROM:28E7 .db 0, 0, 0, 0, 20h, 2, 1Ch, 17h, 2, 0, 0, 0, 4, 0, 8 ROM:28E7 .db 0, 0, 0, 0, 0, 94h, 0, 34h, 20h, 1, 1Eh, 18h, 1, 0 ROM:28E7 .db 0, 0, 0, 0, 18h, 0, 0, 0, 0, 0, 0, 0, 20h ROM:2920 ; --------------------------------------------------------------------------- ROM:2920 ; START OF FUNCTION CHUNK FOR START ROM:2920 ROM:2920 INIT: ; CODE XREF: START+1j ROM:2920 mvi a, 81h ; 'Б' ROM:2922 out 87h ROM:2924 mvi a, 0 ROM:2926 out 84h ROM:2928 mvi a, 82h ; 'В' ROM:292A out 83h ROM:292C mvi a, 0FCh ; '№' ROM:292E out 80h ROM:2930 mvi a, 0DFh ; '-' ROM:2932 out 86h ROM:2934 mvi a, 5 ROM:2936 out 87h ROM:2938 mvi a, 77h ; 'w' ROM:293A out 88h ROM:293C ROM:293C loc_293C: ; CODE XREF: START+2951j ROM:293C lxi b, 0 ROM:293F lxi h, 0F000h ROM:2942 ROM:2942 loc_2942: ; CODE XREF: START+294Cj ROM:2942 xra a ROM:2943 mov m, a ROM:2944 cmp m ROM:2945 jz loc_2949 ROM:2948 inx b ROM:2949 ROM:2949 loc_2949: ; CODE XREF: START+2945j ROM:2949 inx h ROM:294A mov a, h ROM:294B ora l ROM:294C jnz loc_2942 ROM:294F mov a, b ROM:2950 ora c ROM:2951 jnz loc_293C ROM:2954 lxi sp, BGSTRAR ; По этому адресу (&hF7FF) инициализируется SP при INIT ROM:2957 lxi b, 0 ROM:295A push b ROM:295B cma ROM:295C out 88h ROM:295E lxi b, 94h ; 'Ф' ROM:2961 lxi d, VRAM2RAM_ ; Подпрограмма пересылки из VRAM в RAM ROM:2964 lxi h, INITVRAM2RAM_ ; Инициализация процедур VRAM2RAM. ROM:2964 ; Этот блок переносится в ОЗУ по адресу &hF800 ROM:2967 call RAMSEND ; BC=счетчик, DE=адрес приема, HL=адрес источника ROM:2967 ; (пересылка RAM->RAM, RAM->VRAM) ROM:296A lxi b, 61h ; 'a' ROM:296D lxi d, STARTFL ; Заполняется с этого адреса из &h0205 при старте системы. ROM:2970 lxi h, INITKEYS ; Инициализация переменных. ROM:2970 ; Этот блок переностися в ОЗУ по адресу &hF8F0 ROM:2973 call RAMSEND ; BC=счетчик, DE=адрес приема, HL=адрес источника ROM:2973 ; (пересылка RAM->RAM, RAM->VRAM) ROM:2976 xra a ROM:2977 mov h, a ROM:2978 mov l, a ROM:2979 lxi b, 4000h ROM:297C call FILLAREA ; A=константа, BC=счетчик, HL=адрес (заполнение области константой) ROM:297F mvi a, 0Fh ROM:2981 sta CPP ; цвет изображения ROM:2984 mvi a, 0 ROM:2986 call SETMODE2 ; Установка режима экрана ROM:2989 mvi a, 0F4h ; 'Ї' ROM:298B out 80h ROM:298D call PCHL4002 ; Тут вообще муть несусветная! Но интересно жутко! ROM:2990 mvi a, 0F8h ; '°' ROM:2992 out 80h ROM:2994 call PCHL4002 ; Тут вообще муть несусветная! Но интересно жутко! ROM:2997 mvi a, 0FCh ; '№' ROM:2999 out 80h ROM:299B call PCHL4002 ; Тут вообще муть несусветная! Но интересно жутко! ROM:299E call FNKEYFL2 ; Сбрасывает настройки функциональных клавиш по умолчанию ROM:29A1 jmp INIT2 ROM:29A1 ; END OF FUNCTION CHUNK FOR START ROM:29A4 ROM:29A4 ; =============== S U B R O U T I N E ======================================= ROM:29A4 ROM:29A4 ; Сбрасывает настройки функциональных клавиш по умолчанию ROM:29A4 ROM:29A4 FNKEYFL2: ; CODE XREF: ROM:FNKEYFLj ROM:29A4 ; START+299Ep ... ROM:29A4 lxi d, FNKTXT ; Текст функциональных клавиш ROM:29A7 lxi h, aColor ; "color " ROM:29AA mvi c, 0Ah ROM:29AC ROM:29AC loc_29AC: ; CODE XREF: FNKEYFL2+1Ej ROM:29AC push d ROM:29AD ROM:29AD loc_29AD: ; CODE XREF: FNKEYFL2+11j ROM:29AD xra a ROM:29AE ora m ROM:29AF jz loc_29B8 ROM:29B2 stax d ROM:29B3 inx d ROM:29B4 inx h ROM:29B5 jmp loc_29AD ROM:29B8 ; --------------------------------------------------------------------------- ROM:29B8 ROM:29B8 loc_29B8: ; CODE XREF: FNKEYFL2+Bj ROM:29B8 inx h ROM:29B9 pop d ROM:29BA push h ROM:29BB lxi h, 10h ROM:29BE dad d ROM:29BF xchg ROM:29C0 pop h ROM:29C1 dcr c ROM:29C2 jnz loc_29AC ROM:29C5 ret ROM:29C5 ; End of function FNKEYFL2 ROM:29C5 ROM:29C6 ROM:29C6 ; =============== S U B R O U T I N E ======================================= ROM:29C6 ROM:29C6 ; Выключает нижнюю строку ключей. ROM:29C6 ROM:29C6 KEYSOFF2: ; CODE XREF: KEYSOFFj ROM:29C6 mvi a, 18h ROM:29C8 sta MSK ; Количество строк экрана ROM:29CB lxi d, KEYSTAB ; Системная таблица обработчика функциональных клавиш. ROM:29CE call KEYSOFF3 ; Подпрограмма выключения функциональных клавиш ROM:29D1 call SPACES2 ; Заполнение областей на экране пробелами. Дополнительная точка входа. ROM:29D4 ret ROM:29D4 ; End of function KEYSOFF2 ROM:29D4 ROM:29D5 ROM:29D5 ; =============== S U B R O U T I N E ======================================= ROM:29D5 ROM:29D5 ; Включает нижнюю строку ключей. ROM:29D5 ROM:29D5 KEYSON2: ; CODE XREF: KEYSONj ROM:29D5 call CURSOR2 ; Подпрограмма отображения курсора. ROM:29D8 mov a, d ROM:29D9 sui 16h ROM:29DB jc loc_29EB ROM:29DE inr a ROM:29DF ROM:29DF loc_29DF: ; CODE XREF: KEYSON2+13j ROM:29DF push psw ROM:29E0 call KEYSON3 ; Подпрограмма включения функциональных клавиш ROM:29E3 call UP ; Перевод курсора вверх ROM:29E6 pop psw ROM:29E7 dcr a ROM:29E8 jnz loc_29DF ROM:29EB ROM:29EB loc_29EB: ; CODE XREF: KEYSON2+6j ROM:29EB call FNKEYFL2 ; Сбрасывает настройки функциональных клавиш по умолчанию ROM:29EE mvi a, 17h ROM:29F0 sta MSK ; Количество строк экрана ROM:29F3 lda INSF2 ; Флаги режимов клавиатуры ROM:29F6 mov h, a ROM:29F7 jmp FNKEYTR ; Подпрограмма-обработчик функциональных клавиш ROM:29F7 ; End of function KEYSON2 ROM:29F7 ROM:29F7 ; --------------------------------------------------------------------------- ROM:29FA aColor: .text "color " ; DATA XREF: FNKEYFL2+3o ROM:29FA .db 0 ROM:2A01 aAuto: .text "auto " ROM:2A01 .db 0 ROM:2A07 aGoto: .text "goto " ROM:2A07 .db 0 ROM:2A0D aList_0: .text "list " ROM:2A0D .db 0 ROM:2A13 aRun_0: .text "run" ROM:2A13 .db 0Dh ROM:2A13 .db 0 ROM:2A18 aColor1544: .text "color 15,4,4" ROM:2A18 .db 0Dh ROM:2A18 .db 0 ROM:2A26 aCload: .text "cload" ROM:2A26 .db 22h ROM:2A26 .db 0 ROM:2A2D aCont: .text "cont" ROM:2A2D .db 0 ROM:2A32 aList: .text "list" ROM:2A32 .db 0 ROM:2A37 aRun: .text "run" ROM:2A37 .db 0Dh ROM:2A37 .db 0 ROM:2A3C ROM:2A3C ; =============== S U B R O U T I N E ======================================= ROM:2A3C ROM:2A3C ; Записывает по адресу в BC три байта - &h0D, &h0A, &h00 ROM:2A3C ROM:2A3C ODOAOO: ; CODE XREF: EDIT5+7Dp ROM:2A3C mvi a, 0Dh ROM:2A3E stax b ROM:2A3F inx b ROM:2A40 mvi a, 0Ah ROM:2A42 stax b ROM:2A43 inx b ROM:2A44 xra a ROM:2A45 stax b ROM:2A46 ret ROM:2A46 ; End of function ODOAOO ROM:2A46 ROM:2A47 ROM:2A47 ; =============== S U B R O U T I N E ======================================= ROM:2A47 ROM:2A47 ; Перекодировка A в символы ROM:2A47 ROM:2A47 BTDECODE2: ; CODE XREF: BTDECODEj ROM:2A47 push d ROM:2A48 mov d, a ROM:2A49 rlc ROM:2A4A rlc ROM:2A4B rlc ROM:2A4C rlc ROM:2A4D call MACRO10 ROM:2A50 mov a, d ROM:2A51 call MACRO10 ROM:2A54 pop d ROM:2A55 ret ROM:2A55 ; End of function BTDECODE2 ROM:2A55 ROM:2A56 ROM:2A56 ; =============== S U B R O U T I N E ======================================= ROM:2A56 ROM:2A56 ROM:2A56 MACRO10: ; CODE XREF: BTDECODE2+6p ROM:2A56 ; BTDECODE2+Ap ROM:2A56 ani 0Fh ROM:2A58 cpi 0Ah ROM:2A5A jc loc_2A5F ROM:2A5D adi 7 ROM:2A5F ROM:2A5F loc_2A5F: ; CODE XREF: MACRO10+4j ROM:2A5F adi 30h ; '0' ROM:2A61 stax b ROM:2A62 inx b ROM:2A63 ret ROM:2A63 ; End of function MACRO10 ROM:2A63 ROM:2A64 ROM:2A64 ; =============== S U B R O U T I N E ======================================= ROM:2A64 ROM:2A64 ; Возвращает в аккумулятор длину строки экрана в символах ROM:2A64 ROM:2A64 SCRLEN2: ; CODE XREF: SCRLENj ROM:2A64 cpi 1 ROM:2A66 rc ROM:2A67 mov e, a ROM:2A68 lxi h, SPK ; Пропусков в конце строки ROM:2A6B mvi m, 0 ROM:2A6D lda DLSM ; Максимальная длина строк 32 или 64 ROM:2A70 cpi 40h ; '@' ROM:2A72 jnz loc_2A79 ROM:2A75 mvi m, 18h ROM:2A77 mvi a, 28h ; '(' ROM:2A79 ROM:2A79 loc_2A79: ; CODE XREF: SCRLEN2+Ej ROM:2A79 cmp e ROM:2A7A rc ROM:2A7B sub e ROM:2A7C rrc ROM:2A7D mov d, a ROM:2A7E ani 1Fh ROM:2A80 add m ROM:2A81 mov m, a ROM:2A82 mov a, d ROM:2A83 rlc ROM:2A84 ani 1 ROM:2A86 add d ROM:2A87 ani 1Fh ROM:2A89 sta SPN ; Пропусков в начале строки ROM:2A8C mov a, e ROM:2A8D sta DLSF ; Длина строки экрана ROM:2A90 call CLRSCR ; Очистка экрана (Печать CHR$(&h0C)) ROM:2A93 ora a ROM:2A94 ret ROM:2A94 ; End of function SCRLEN2 ROM:2A94 ROM:2A95 ROM:2A95 ; =============== S U B R O U T I N E ======================================= ROM:2A95 ROM:2A95 ; Обработка строк редактором ROM:2A95 ROM:2A95 EDIT2: ; CODE XREF: EDITj ROM:2A95 push b ROM:2A96 sta EDITTMP ; Временная переменная редактора ROM:2A99 ani 1 ROM:2A9B jz loc_2AB4 ROM:2A9E lda DLSF ; Длина строки экрана ROM:2AA1 mov c, a ROM:2AA2 lda MSK ; Количество строк экрана ROM:2AA5 mov b, a ROM:2AA6 cmp d ROM:2AA7 jnc loc_2AAB ROM:2AAA mov d, b ROM:2AAB ROM:2AAB loc_2AAB: ; CODE XREF: EDIT2+12j ROM:2AAB mov a, c ROM:2AAC cmp e ROM:2AAD jnc loc_2AB1 ROM:2AB0 mov e, c ROM:2AB1 ROM:2AB1 loc_2AB1: ; CODE XREF: EDIT2+18j ROM:2AB1 call EDIT3 ; Подпрограмма редактора ROM:2AB4 ROM:2AB4 loc_2AB4: ; CODE XREF: EDIT2+6j ROM:2AB4 lda EDITTMP ; Временная переменная редактора ROM:2AB7 ani 2 ROM:2AB9 jz loc_2ACA ROM:2ABC ROM:2ABC loc_2ABC: ; CODE XREF: EDIT2+32j ROM:2ABC mov a, m ROM:2ABD ana a ROM:2ABE jz loc_2ACA ROM:2AC1 push h ROM:2AC2 cnz SYMSCR2 ; вывод символа из A на экран в текущую позицию курсора ROM:2AC5 pop h ROM:2AC6 inx h ROM:2AC7 jmp loc_2ABC ROM:2ACA ; --------------------------------------------------------------------------- ROM:2ACA ROM:2ACA loc_2ACA: ; CODE XREF: EDIT2+24j ROM:2ACA ; EDIT2+29j ROM:2ACA lda EDITTMP ; Временная переменная редактора ROM:2ACD ani 4 ROM:2ACF jz loc_2AF6 ROM:2AD2 ROM:2AD2 loc_2AD2: ; CODE XREF: EDIT2+4Dj ROM:2AD2 call BUFFERTOA2 ; Ввод символа из буфера клавиатуры ROM:2AD5 cpi 3 ROM:2AD7 jz loc_2AF8 ROM:2ADA cpi 0Dh ROM:2ADC jz loc_2AE5 ROM:2ADF call SYMSCR2 ; вывод символа из A на экран в текущую позицию курсора ROM:2AE2 jmp loc_2AD2 ROM:2AE5 ; --------------------------------------------------------------------------- ROM:2AE5 ROM:2AE5 loc_2AE5: ; CODE XREF: EDIT2+47j ROM:2AE5 call CARRET ; Печать возврата каретки (печать CHR$(&h0D)) ROM:2AE8 push d ROM:2AE9 call UP ; Перевод курсора вверх ROM:2AEC call EDIT5 ; Подпрограмма редактора ROM:2AEF pop d ROM:2AF0 call EDIT3 ; Подпрограмма редактора ROM:2AF3 ROM:2AF3 loc_2AF3: ; CODE XREF: EDIT2+6Fj ROM:2AF3 lxi h, IOBUF ; Буфер ввода-вывода (диск, кассеты) ROM:2AF6 ROM:2AF6 loc_2AF6: ; CODE XREF: EDIT2+3Aj ROM:2AF6 pop b ROM:2AF7 ret ROM:2AF8 ; --------------------------------------------------------------------------- ROM:2AF8 ROM:2AF8 loc_2AF8: ; CODE XREF: EDIT2+42j ROM:2AF8 call CARRET ; Печать возврата каретки (печать CHR$(&h0D)) ROM:2AFB mvi a, 0Dh ROM:2AFD sta IOBUF ; Буфер ввода-вывода (диск, кассеты) ROM:2B00 xra a ROM:2B01 sta ASITT ; Временная переменная. Используется в AUTO, STOP, INPUTLN, TOKENIZE, TRETLINE ROM:2B04 jmp loc_2AF3 ROM:2B04 ; End of function EDIT2 ROM:2B04 ROM:2B07 ROM:2B07 ; =============== S U B R O U T I N E ======================================= ROM:2B07 ROM:2B07 ; вывод символа из A на экран в текущую позицию курсора ROM:2B07 ROM:2B07 SYMSCR2: ; CODE XREF: SYMSCRj ROM:2B07 ; SETMODE2+5Bp ... ROM:2B07 ROM:2B07 ; FUNCTION CHUNK AT ROM:2B9E SIZE 000000AB BYTES ROM:2B07 ; FUNCTION CHUNK AT ROM:2CC7 SIZE 00000022 BYTES ROM:2B07 ; FUNCTION CHUNK AT ROM:2D08 SIZE 0000001B BYTES ROM:2B07 ; FUNCTION CHUNK AT ROM:2D2F SIZE 00000018 BYTES ROM:2B07 ; FUNCTION CHUNK AT ROM:2D4F SIZE 0000001A BYTES ROM:2B07 ; FUNCTION CHUNK AT ROM:2D8B SIZE 00000045 BYTES ROM:2B07 ROM:2B07 mov b, a ROM:2B08 lda PRNFL ; Флаг печати (Для LLIST, LPRINT равен 1) ROM:2B0B cpi 1 ROM:2B0D mov a, b ROM:2B0E push psw ROM:2B0F cnc SYMPRN2 ; Вывод символа из A на печать ROM:2B12 pop psw ROM:2B13 rz ROM:2B14 mov b, a ROM:2B15 lxi h, SGF ; Флаг графического символа ROM:2B18 cpi 20h ; ' ' ROM:2B1A jc loc_2B2D ROM:2B1D mov a, m ROM:2B1E ana a ROM:2B1F mov a, b ROM:2B20 jz loc_2B89 ROM:2B23 sui 40h ; '@' ROM:2B25 mov b, a ROM:2B26 mvi m, 0 ROM:2B28 jmp loc_2B89 ROM:2B2B ; --------------------------------------------------------------------------- ROM:2B2B ROM:2B2B GRAPH: ; CODE XREF: SYMSCR2+28j ROM:2B2B mov m, a ; Обработка признака графического символа ROM:2B2C ret ROM:2B2D ; --------------------------------------------------------------------------- ROM:2B2D ROM:2B2D loc_2B2D: ; CODE XREF: SYMSCR2+13j ROM:2B2D cpi 1 ROM:2B2F jz GRAPH ; Обработка признака графического символа ROM:2B32 call CHKMODE ; Проверяет режим экрана на 2. Если да, то A=B ROM:2B35 jz loc_2B9E ROM:2B38 cpi 2 ROM:2B3A jz FHOME ; Перемещает курсор в начало физической строки ROM:2B3D cpi 6 ROM:2B3F jz FEND ; Перемещает курсор в конец физической строки ROM:2B42 cpi 7 ROM:2B44 jz BELL2 ; Обработка звука нажатия клавиш и CHR$(&h07) (в зависимости от BEEPF) ROM:2B47 cpi 8 ROM:2B49 jz BKSPC ROM:2B4C cpi 9 ROM:2B4E jz TABTR ; Переход к следующей табулированной позиции ROM:2B51 cpi 0Bh ROM:2B53 jz RHOME ROM:2B56 cpi 0Ch ROM:2B58 jz CLRSCR ; Очистка экрана (Печать CHR$(&h0C)) ROM:2B5B cpi 0Dh ROM:2B5D jz CARRET ; Печать возврата каретки (печать CHR$(&h0D)) ROM:2B60 cpi 0Eh ROM:2B62 jz LEND ; Перемещает курсор в конец логической строки. ROM:2B65 cpi 0Fh ROM:2B67 jz LHOME ROM:2B6A cpi 12h ROM:2B6C jz INSERT ROM:2B6F cpi 19h ROM:2B71 jz REND ; Перемещает курсор в правый нижний угол экрана ROM:2B74 cpi 1Ch ROM:2B76 jz RIGHT ; Перевод курсора вправо ROM:2B79 cpi 1Dh ROM:2B7B jz LEFT ; Перевод курсора влево ROM:2B7E cpi 1Eh ROM:2B80 jz UP ; Перевод курсора вверх ROM:2B83 cpi 1Fh ROM:2B85 jz DOWN ROM:2B88 ret ROM:2B89 ; --------------------------------------------------------------------------- ROM:2B89 ROM:2B89 loc_2B89: ; CODE XREF: SYMSCR2+19j ROM:2B89 ; SYMSCR2+21j ROM:2B89 call CHKMODE ; Проверяет режим экрана на 2. Если да, то A=B ROM:2B8C jz loc_2BCD ROM:2B8F cpi 7Fh ; '' ROM:2B91 jz loc_2D97 ROM:2B94 jmp SYMSCR3 ; Вывод символа из A на экран в текущую позицию курсора. Подпрограмма. ROM:2B94 ; End of function SYMSCR2 ROM:2B94 ROM:2B97 ROM:2B97 ; =============== S U B R O U T I N E ======================================= ROM:2B97 ROM:2B97 ; Проверяет режим экрана на 2. Если да, то A=B ROM:2B97 ROM:2B97 CHKMODE: ; CODE XREF: SYMSCR2+2Bp ROM:2B97 ; SYMSCR2:loc_2B89p ... ROM:2B97 lda MODE ; Режим экрана ROM:2B9A cpi 2 ROM:2B9C mov a, b ROM:2B9D ret ROM:2B9D ; End of function CHKMODE ROM:2B9D ROM:2B9E ; --------------------------------------------------------------------------- ROM:2B9E ; START OF FUNCTION CHUNK FOR SYMSCR2 ROM:2B9E ROM:2B9E loc_2B9E: ; CODE XREF: SYMSCR2+2Ej ROM:2B9E cpi 0Dh ROM:2BA0 jz loc_2BC6 ROM:2BA3 cpi 0Ch ROM:2BA5 rnz ROM:2BA6 xra a ROM:2BA7 lhld GTBL1 ; Адрес таблицы точек изображения в режиме 2 ROM:2BAA lxi b, 1800h ROM:2BAD call FILLAREA ; A=константа, BC=счетчик, HL=адрес (заполнение области константой) ROM:2BB0 call SETCOLOR2 ; Установка цвета ROM:2BB3 lhld CTBL1 ; Адрес таблицы цвета в режиме 2 ROM:2BB6 lxi b, 1800h ROM:2BB9 call FILLAREA ; A=константа, BC=счетчик, HL=адрес (заполнение области константой) ROM:2BBC lxi h, 0 ROM:2BBF shld X1 ; Первый графический курсор, координата X ROM:2BC2 shld X2 ; Второй графический курсор, координата X ROM:2BC5 ret ROM:2BC6 ; --------------------------------------------------------------------------- ROM:2BC6 ROM:2BC6 loc_2BC6: ; CODE XREF: SYMSCR2+99j ROM:2BC6 xra a ROM:2BC7 sta X1 ; Первый графический курсор, координата X ROM:2BCA jmp loc_2C3A ROM:2BCD ; --------------------------------------------------------------------------- ROM:2BCD ROM:2BCD loc_2BCD: ; CODE XREF: SYMSCR2+85j ROM:2BCD push psw ROM:2BCE call PRESETWT ; Рисование точки белым цветом (FD90 координата X, FD91 координата Y) ROM:2BD1 lda Y1 ; Первый графический курсор, координата Y ROM:2BD4 sta SYMTMP ; Временная переменная. Используется SYMSCR. ROM:2BD7 pop psw ROM:2BD8 xchg ROM:2BD9 shld INTAR+20h ; Рабочая область обработки прерываний ROM:2BDC mvi h, 0 ROM:2BDE lxi d, ZNAKGEN ; Начало знакогенератора. ROM:2BE1 mov l, a ROM:2BE2 dad h ROM:2BE3 dad h ROM:2BE4 dad h ROM:2BE5 dad d ROM:2BE6 push h ROM:2BE7 mvi c, 0 ROM:2BE9 mov a, b ROM:2BEA mov d, c ROM:2BEB mov e, m ROM:2BEC xchg ROM:2BED ROM:2BED loc_2BED: ; CODE XREF: SYMSCR2+E9j ROM:2BED dad h ROM:2BEE inr c ROM:2BEF rrc ROM:2BF0 jnc loc_2BED ROM:2BF3 mov b, c ROM:2BF4 lda PSETC ; Цвет точки у команды PSET ROM:2BF7 mov c, a ROM:2BF8 xchg ROM:2BF9 lhld INTAR+20h ; Рабочая область обработки прерываний ROM:2BFC call VRAMTR2 ; Подпрограмма работы с видеопамятью. Используется в SYMSCR2. ROM:2BFF pop h ROM:2C00 inx h ROM:2C01 mvi a, 7 ROM:2C03 sta INTAR+22h ; Рабочая область обработки прерываний ROM:2C06 ROM:2C06 loc_2C06: ; CODE XREF: SYMSCR2+127j ROM:2C06 mvi d, 0 ROM:2C08 mov e, m ROM:2C09 inx h ROM:2C0A push h ROM:2C0B push b ROM:2C0C xchg ROM:2C0D ROM:2C0D loc_2C0D: ; CODE XREF: SYMSCR2+108j ROM:2C0D dad h ROM:2C0E dcr b ROM:2C0F jnz loc_2C0D ROM:2C12 xchg ROM:2C13 lhld INTAR+20h ; Рабочая область обработки прерываний ROM:2C16 inr l ROM:2C17 mov a, l ROM:2C18 ani 7 ROM:2C1A jnz loc_2C22 ROM:2C1D mov a, l ROM:2C1E sui 8 ROM:2C20 mov l, a ROM:2C21 inr h ROM:2C22 ROM:2C22 loc_2C22: ; CODE XREF: SYMSCR2+113j ROM:2C22 shld INTAR+20h ; Рабочая область обработки прерываний ROM:2C25 pop b ROM:2C26 call VRAMTR2 ; Подпрограмма работы с видеопамятью. Используется в SYMSCR2. ROM:2C29 lxi h, INTAR+22h ; Рабочая область обработки прерываний ROM:2C2C dcr m ROM:2C2D pop h ROM:2C2E jnz loc_2C06 ROM:2C31 lda X1 ; Первый графический курсор, координата X ROM:2C34 adi 8 ROM:2C36 sta X1 ; Первый графический курсор, координата X ROM:2C39 rnc ROM:2C3A ROM:2C3A loc_2C3A: ; CODE XREF: SYMSCR2+C3j ROM:2C3A lda Y1 ; Первый графический курсор, координата Y ROM:2C3D adi 8 ROM:2C3F cpi 0BFh ; '¬' ROM:2C41 jc loc_2C45 ROM:2C44 xra a ROM:2C45 ROM:2C45 loc_2C45: ; CODE XREF: SYMSCR2+13Aj ROM:2C45 sta Y1 ; Первый графический курсор, координата Y ROM:2C48 ret ROM:2C48 ; END OF FUNCTION CHUNK FOR SYMSCR2 ROM:2C49 ROM:2C49 ; =============== S U B R O U T I N E ======================================= ROM:2C49 ROM:2C49 ; Подпрограмма работы с видеопамятью. Используется в SYMSCR2. ROM:2C49 ROM:2C49 VRAMTR1: ; CODE XREF: VRAMTR2+Ap ROM:2C49 ; VRAMTR2+12p ROM:2C49 push h ROM:2C4A call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM). ROM:2C4D ora d ROM:2C4E mov m, a ROM:2C4F mov a, h ROM:2C50 xri 20h ROM:2C52 mov h, a ROM:2C53 call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM). ROM:2C56 ani 0F0h ROM:2C58 ora c ROM:2C59 mov m, a ROM:2C5A pop h ROM:2C5B mov a, l ROM:2C5C adi 8 ROM:2C5E mov l, a ROM:2C5F ret ROM:2C5F ; End of function VRAMTR1 ROM:2C5F ROM:2C60 ROM:2C60 ; =============== S U B R O U T I N E ======================================= ROM:2C60 ROM:2C60 ; Подпрограмма работы с видеопамятью. Используется в SYMSCR2. ROM:2C60 ROM:2C60 VRAMTR2: ; CODE XREF: SYMSCR2+F5p ROM:2C60 ; SYMSCR2+11Fp ROM:2C60 lda SYMTMP ; Временная переменная. Используется SYMSCR. ROM:2C63 inr a ROM:2C64 cpi 0C0h ; 'L' ROM:2C66 rnc ROM:2C67 sta SYMTMP ; Временная переменная. Используется SYMSCR. ROM:2C6A call VRAMTR1 ; Подпрограмма работы с видеопамятью. Используется в SYMSCR2. ROM:2C6D rc ROM:2C6E mov a, e ROM:2C6F ora a ROM:2C70 rz ROM:2C71 mov d, a ROM:2C72 call VRAMTR1 ; Подпрограмма работы с видеопамятью. Используется в SYMSCR2. ROM:2C75 ret ROM:2C75 ; End of function VRAMTR2 ROM:2C75 ROM:2C76 ROM:2C76 ; =============== S U B R O U T I N E ======================================= ROM:2C76 ROM:2C76 ; Очистка экрана (Печать CHR$(&h0C)) ROM:2C76 ROM:2C76 CLRSCR: ; CODE XREF: SCRLEN2+2Cp ROM:2C76 ; SYMSCR2+51j ROM:2C76 call KBDBUFCL2 ; Очищает буфер клавиатуры ROM:2C79 call CURSOR ; Отображение курсора. ROM:2C7C lhld ABS1 ; Адрес буфера экрана режима 0 и 1 ROM:2C7F lda SPN ; Пропусков в начале строки ROM:2C82 mov l, a ROM:2C83 shld SMK ; Адрес курсора ROM:2C86 lxi h, KSS ; Код символа в позиции курсора ROM:2C89 mvi m, 20h ; ' ' ROM:2C8B lhld ABS1 ; Адрес буфера экрана режима 0 и 1 ROM:2C8E mvi c, 18h ROM:2C90 ROM:2C90 loc_2C90: ; CODE XREF: CLRSCR+1Ej ROM:2C90 call SPACES ; Заполнение областей на экране пробелами ROM:2C93 dcr c ROM:2C94 jnz loc_2C90 ROM:2C97 lxi h, SCLNTAB ; Таблица состояния строк экранного редактора ROM:2C9A mvi a, 19h ROM:2C9C mvi b, 80h ; 'А' ROM:2C9E call MACRO9 ROM:2CA1 lda INSF2 ; Флаги режимов клавиатуры ROM:2CA4 mov h, a ROM:2CA5 call FNKEYTR ; Подпрограмма-обработчик функциональных клавиш ROM:2CA8 lxi d, 0 ROM:2CAB jmp loc_2D00 ROM:2CAB ; End of function CLRSCR ROM:2CAB ROM:2CAE ROM:2CAE ; =============== S U B R O U T I N E ======================================= ROM:2CAE ROM:2CAE ; Заполнение областей на экране пробелами ROM:2CAE ROM:2CAE SPACES: ; CODE XREF: CLRSCR:loc_2C90p ROM:2CAE ; KEYSON3+1Fp ROM:2CAE lda SPN ; Пропусков в начале строки ROM:2CB1 mvi b, 0 ROM:2CB3 call MACRO9 ROM:2CB3 ; End of function SPACES ROM:2CB3 ROM:2CB6 ROM:2CB6 ; =============== S U B R O U T I N E ======================================= ROM:2CB6 ROM:2CB6 ; Заполнение областей на экране пробелами. Дополнительная точка входа. ROM:2CB6 ROM:2CB6 SPACES2: ; CODE XREF: KEYSOFF2+Bp ROM:2CB6 ; INSERTTR+83p ROM:2CB6 lda DLSF ; Длина строки экрана ROM:2CB9 mvi b, 20h ; ' ' ROM:2CBB call MACRO9 ROM:2CBE call SPACES3 ; Заполнение областей на экране пробелами. Дополнительная точка входа. ROM:2CC1 mvi b, 0 ROM:2CC3 call MACRO9 ROM:2CC6 ret ROM:2CC6 ; End of function SPACES2 ROM:2CC6 ROM:2CC7 ; --------------------------------------------------------------------------- ROM:2CC7 ; START OF FUNCTION CHUNK FOR SYMSCR2 ROM:2CC7 ROM:2CC7 INSERT: ; CODE XREF: SYMSCR2+65j ROM:2CC7 lda INSF ; Флаг вставки ROM:2CCA ana a ROM:2CCB jnz loc_2CE0 ROM:2CCE ROM:2CCE loc_2CCE: ; DATA XREF: ROM:loc_883o ROM:2CCE lxi h, CURISO ; Изображение курсора ROM:2CD1 mov b, a ROM:2CD2 mvi a, 4 ROM:2CD4 sta INSF ; Флаг вставки ROM:2CD7 call MACRO9 ROM:2CDA call CURSOR2 ; Подпрограмма отображения курсора. ROM:2CDD jmp loc_2D00 ROM:2CE0 ; --------------------------------------------------------------------------- ROM:2CE0 ROM:2CE0 loc_2CE0: ; CODE XREF: SYMSCR2+1C4j ROM:2CE0 call CURSOR ; Отображение курсора. ROM:2CE3 jmp loc_2D00 ROM:2CE6 ; --------------------------------------------------------------------------- ROM:2CE6 ROM:2CE6 RIGHT: ; CODE XREF: SYMSCR2+6Fj ROM:2CE6 call CURSOR ; Перевод курсора вправо ROM:2CE6 ; END OF FUNCTION CHUNK FOR SYMSCR2 ROM:2CE9 ROM:2CE9 ; =============== S U B R O U T I N E ======================================= ROM:2CE9 ROM:2CE9 ; Обработка перемещения курсора вправо ROM:2CE9 ROM:2CE9 RIGHT2: ; CODE XREF: SYMSCR3+13p ROM:2CE9 cmp e ROM:2CEA jnz loc_2D04 ROM:2CED mvi e, 0 ROM:2CEF ROM:2CEF loc_2CEF: ; CODE XREF: SYMSCR2+204j ROM:2CEF mov a, b ROM:2CF0 cmp d ROM:2CF1 jz loc_2CF8 ROM:2CF4 inr d ROM:2CF5 jmp loc_2D00 ROM:2CF8 ; --------------------------------------------------------------------------- ROM:2CF8 ROM:2CF8 loc_2CF8: ; CODE XREF: RIGHT2+8j ROM:2CF8 call KEYSON3 ; Подпрограмма включения функциональных клавиш ROM:2CFB mvi a, 20h ; ' ' ROM:2CFD sta KSS ; Код символа в позиции курсора ROM:2D00 ROM:2D00 loc_2D00: ; CODE XREF: CLRSCR+35j ROM:2D00 ; SYMSCR2+1D6j ... ROM:2D00 call EDIT3 ; Подпрограмма редактора ROM:2D03 ret ROM:2D04 ; --------------------------------------------------------------------------- ROM:2D04 ROM:2D04 loc_2D04: ; CODE XREF: RIGHT2+1j ROM:2D04 inr e ROM:2D05 jmp loc_2D00 ROM:2D05 ; End of function RIGHT2 ROM:2D05 ROM:2D08 ; --------------------------------------------------------------------------- ROM:2D08 ; START OF FUNCTION CHUNK FOR SYMSCR2 ROM:2D08 ROM:2D08 DOWN: ; CODE XREF: SYMSCR2+7Ej ROM:2D08 ; CARRET+6j ROM:2D08 call CURSOR ; Отображение курсора. ROM:2D0B jmp loc_2CEF ROM:2D0E ; --------------------------------------------------------------------------- ROM:2D0E ROM:2D0E LEFT: ; CODE XREF: SYMSCR2+74j ROM:2D0E call CURSOR ; Перевод курсора влево ROM:2D11 xra a ROM:2D12 cmp e ROM:2D13 jnz loc_2D1F ROM:2D16 cmp d ROM:2D17 jz loc_2D00 ROM:2D1A mov e, c ROM:2D1B dcr d ROM:2D1C jmp loc_2D00 ROM:2D1F ; --------------------------------------------------------------------------- ROM:2D1F ROM:2D1F loc_2D1F: ; CODE XREF: SYMSCR2+20Cj ROM:2D1F dcr e ROM:2D20 jmp loc_2D00 ROM:2D20 ; END OF FUNCTION CHUNK FOR SYMSCR2 ROM:2D23 ROM:2D23 ; =============== S U B R O U T I N E ======================================= ROM:2D23 ROM:2D23 ; Перевод курсора вверх ROM:2D23 ROM:2D23 UP: ; CODE XREF: KEYSON2+Ep ROM:2D23 ; EDIT2+54p ... ROM:2D23 call CURSOR ; Отображение курсора. ROM:2D26 xra a ROM:2D27 cmp d ROM:2D28 jz loc_2D00 ROM:2D2B dcr d ROM:2D2C jmp loc_2D00 ROM:2D2C ; End of function UP ROM:2D2C ROM:2D2F ; --------------------------------------------------------------------------- ROM:2D2F ; START OF FUNCTION CHUNK FOR SYMSCR2 ROM:2D2F ROM:2D2F RHOME: ; CODE XREF: SYMSCR2+4Cj ROM:2D2F call CURSOR ; Отображение курсора. ROM:2D32 lxi d, 0 ROM:2D35 jmp loc_2D00 ROM:2D38 ; --------------------------------------------------------------------------- ROM:2D38 ROM:2D38 REND: ; CODE XREF: SYMSCR2+6Aj ROM:2D38 call CURSOR ; Перемещает курсор в правый нижний угол экрана ROM:2D3B mov d, b ROM:2D3C mov e, c ROM:2D3D jmp loc_2D00 ROM:2D40 ; --------------------------------------------------------------------------- ROM:2D40 ROM:2D40 FEND: ; CODE XREF: SYMSCR2+38j ROM:2D40 call CURSOR ; Перемещает курсор в конец физической строки ROM:2D43 mov e, c ROM:2D44 jmp loc_2D00 ROM:2D44 ; END OF FUNCTION CHUNK FOR SYMSCR2 ROM:2D47 ROM:2D47 ; =============== S U B R O U T I N E ======================================= ROM:2D47 ROM:2D47 ; Перемещает курсор в начало физической строки ROM:2D47 ROM:2D47 FHOME: ; CODE XREF: SYMSCR2+33j ROM:2D47 ; CARRET+3p ROM:2D47 call CURSOR ; Отображение курсора. ROM:2D4A mvi e, 0 ROM:2D4C jmp loc_2D00 ROM:2D4C ; End of function FHOME ROM:2D4C ROM:2D4F ; --------------------------------------------------------------------------- ROM:2D4F ; START OF FUNCTION CHUNK FOR SYMSCR2 ROM:2D4F ROM:2D4F LHOME: ; CODE XREF: SYMSCR2+60j ROM:2D4F call CURSOR ; Отображение курсора. ROM:2D52 call CUREND2 ; Перемещает курсор в конец логической строки. Дополнительная подпрограмма. ROM:2D55 ROM:2D55 loc_2D55: ; CODE XREF: SYMSCR2+25Bj ROM:2D55 mvi a, 80h ; 'А' ROM:2D57 ana m ROM:2D58 jnz loc_2D65 ROM:2D5B mov a, d ROM:2D5C ana a ROM:2D5D jz loc_2D65 ROM:2D60 dcx h ROM:2D61 dcr d ROM:2D62 jmp loc_2D55 ROM:2D65 ; --------------------------------------------------------------------------- ROM:2D65 ROM:2D65 loc_2D65: ; CODE XREF: SYMSCR2+251j ROM:2D65 ; SYMSCR2+256j ROM:2D65 mov e, b ROM:2D66 jmp loc_2D00 ROM:2D66 ; END OF FUNCTION CHUNK FOR SYMSCR2 ROM:2D69 ROM:2D69 ; =============== S U B R O U T I N E ======================================= ROM:2D69 ROM:2D69 ; Перемещает курсор в конец логической строки. ROM:2D69 ROM:2D69 LEND: ; CODE XREF: SYMSCR2+5Bj ROM:2D69 ; CARRETp ROM:2D69 call CURSOR ; Отображение курсора. ROM:2D6C call CUREND2 ; Перемещает курсор в конец логической строки. Дополнительная подпрограмма. ROM:2D6C ; End of function LEND ROM:2D6C ROM:2D6F ROM:2D6F ; =============== S U B R O U T I N E ======================================= ROM:2D6F ROM:2D6F ; Перемещает курсор в конец логической строки. Дополнительная подпрограмма. ROM:2D6F ROM:2D6F CUREND3: ; CODE XREF: CUREND3+Dj ROM:2D6F ; INSERTTR+Fp ROM:2D6F mvi a, 80h ; 'А' ROM:2D71 inx h ROM:2D72 ana m ROM:2D73 jnz loc_2D7F ROM:2D76 inr d ROM:2D77 mov a, d ROM:2D78 cmp b ROM:2D79 jz loc_2D80 ROM:2D7C jmp CUREND3 ; Перемещает курсор в конец логической строки. Дополнительная подпрограмма. ROM:2D7F ; --------------------------------------------------------------------------- ROM:2D7F ROM:2D7F loc_2D7F: ; CODE XREF: CUREND3+4j ROM:2D7F dcx h ROM:2D80 ROM:2D80 loc_2D80: ; CODE XREF: CUREND3+Aj ROM:2D80 mvi a, 7Fh ; '' ROM:2D82 ana m ROM:2D83 mov e, a ROM:2D84 jz loc_2D00 ROM:2D87 dcr e ROM:2D88 jmp loc_2D00 ROM:2D88 ; End of function CUREND3 ROM:2D88 ROM:2D8B ; --------------------------------------------------------------------------- ROM:2D8B ; START OF FUNCTION CHUNK FOR SYMSCR2 ROM:2D8B ROM:2D8B BKSPC: ; CODE XREF: SYMSCR2+42j ROM:2D8B call CURSOR ; Отображение курсора. ROM:2D8E mov a, e ROM:2D8F ana a ROM:2D90 jz loc_2D97 ROM:2D93 dcr e ROM:2D94 call EDIT3 ; Подпрограмма редактора ROM:2D97 ROM:2D97 loc_2D97: ; CODE XREF: SYMSCR2+8Aj ROM:2D97 ; SYMSCR2+289j ROM:2D97 call CURSOR2 ; Подпрограмма отображения курсора. ROM:2D9A call BKSPC2 ; Подпрограмма обработки BACKSPACE ROM:2D9D lhld SMK ; Адрес курсора ROM:2DA0 call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM). ROM:2DA3 sta KSS ; Код символа в позиции курсора ROM:2DA6 call CURSOR2 ; Подпрограмма отображения курсора. ROM:2DA9 jmp loc_2D00 ROM:2DAC ; --------------------------------------------------------------------------- ROM:2DAC ROM:2DAC TABTR: ; CODE XREF: SYMSCR2+47j ROM:2DAC call CURSOR ; Переход к следующей табулированной позиции ROM:2DAF xra a ROM:2DB0 ROM:2DB0 loc_2DB0: ; CODE XREF: SYMSCR2+2B0j ROM:2DB0 ; SYMSCR2+2B3j ROM:2DB0 adi 8 ROM:2DB2 cmp c ROM:2DB3 jnc loc_2DCB ROM:2DB6 cmp e ROM:2DB7 jc loc_2DB0 ROM:2DBA jz loc_2DB0 ROM:2DBD ROM:2DBD loc_2DBD: ; CODE XREF: SYMSCR2+2C6j ROM:2DBD sub e ROM:2DBE mov c, a ROM:2DBF ROM:2DBF loc_2DBF: ; CODE XREF: SYMSCR2+2C0j ROM:2DBF mvi a, 20h ; ' ' ROM:2DC1 push b ROM:2DC2 call SYMSCR3 ; Вывод символа из A на экран в текущую позицию курсора. Подпрограмма. ROM:2DC5 pop b ROM:2DC6 dcr c ROM:2DC7 jnz loc_2DBF ROM:2DCA ret ROM:2DCB ; --------------------------------------------------------------------------- ROM:2DCB ROM:2DCB loc_2DCB: ; CODE XREF: SYMSCR2+2ACj ROM:2DCB mov a, c ROM:2DCC inr a ROM:2DCD jmp loc_2DBD ROM:2DCD ; END OF FUNCTION CHUNK FOR SYMSCR2 ROM:2DD0 ROM:2DD0 ; =============== S U B R O U T I N E ======================================= ROM:2DD0 ROM:2DD0 ; Вывод символа из A на экран в текущую позицию курсора. Подпрограмма. ROM:2DD0 ROM:2DD0 SYMSCR3: ; CODE XREF: SYMSCR2+8Dj ROM:2DD0 ; SYMSCR2+2BBp ROM:2DD0 push psw ROM:2DD1 lda INSF ; Флаг вставки ROM:2DD4 ana a ROM:2DD5 cnz INSERTTR ; Подпрограмма обработки вставки символа ROM:2DD8 pop psw ROM:2DD9 sta KSS ; Код символа в позиции курсора ROM:2DDC lhld SMK ; Адрес курсора ROM:2DDF mov m, a ROM:2DE0 call CURSOR2 ; Подпрограмма отображения курсора. ROM:2DE3 call RIGHT2 ; Обработка перемещения курсора вправо ROM:2DE6 call CURSOR2 ; Подпрограмма отображения курсора. ROM:2DE9 call CUREND2 ; Перемещает курсор в конец логической строки. Дополнительная подпрограмма. ROM:2DEC ora e ROM:2DED jz loc_2DFB ROM:2DF0 mov a, m ROM:2DF1 ani 7Fh ROM:2DF3 cmp e ROM:2DF4 rnc ROM:2DF5 mov a, m ROM:2DF6 ani 80h ROM:2DF8 ora e ROM:2DF9 mov m, a ROM:2DFA ret ROM:2DFB ; --------------------------------------------------------------------------- ROM:2DFB ROM:2DFB loc_2DFB: ; CODE XREF: SYMSCR3+1Dj ROM:2DFB mov a, m ROM:2DFC ani 7Fh ROM:2DFE mov m, a ROM:2DFF dcx h ROM:2E00 mov a, m ROM:2E01 ani 80h ROM:2E03 mov b, a ROM:2E04 lda DLSF ; Длина строки экрана ROM:2E07 ora b ROM:2E08 mov m, a ROM:2E09 ret ROM:2E09 ; End of function SYMSCR3 ROM:2E09 ROM:2E0A ROM:2E0A ; =============== S U B R O U T I N E ======================================= ROM:2E0A ROM:2E0A ; Подпрограмма обработки вставки символа ROM:2E0A ROM:2E0A INSERTTR: ; CODE XREF: SYMSCR3+5p ROM:2E0A call CURSOR2 ; Подпрограмма отображения курсора. ROM:2E0D push b ROM:2E0E call CUREND2 ; Перемещает курсор в конец логической строки. Дополнительная подпрограмма. ROM:2E11 pop b ROM:2E12 mov a, m ROM:2E13 ani 7Fh ROM:2E15 cmp e ROM:2E16 rc ROM:2E17 rz ROM:2E18 push d ROM:2E19 call CUREND3 ; Перемещает курсор в конец логической строки. Дополнительная подпрограмма. ROM:2E1C mov a, e ROM:2E1D cmp c ROM:2E1E jc loc_2E38 ROM:2E21 mov a, d ROM:2E22 cmp b ROM:2E23 jc loc_2E62 ROM:2E26 push b ROM:2E27 push h ROM:2E28 call KEYSON3 ; Подпрограмма включения функциональных клавиш ROM:2E2B mvi a, 20h ; ' ' ROM:2E2D sta KSS ; Код символа в позиции курсора ROM:2E30 pop h ROM:2E31 pop b ROM:2E32 xthl ROM:2E33 dcr h ROM:2E34 xthl ROM:2E35 ROM:2E35 loc_2E35: ; CODE XREF: INSERTTR+5Dj ROM:2E35 ; INSERTTR+89j ROM:2E35 mvi e, 0 ROM:2E37 mov m, e ROM:2E38 ROM:2E38 loc_2E38: ; CODE XREF: INSERTTR+14j ROM:2E38 inr m ROM:2E39 inr e ROM:2E3A pop h ROM:2E3B xchg ROM:2E3C push h ROM:2E3D call EDIT3 ; Подпрограмма редактора ROM:2E40 call CUR2MEM ; Загружает код символа из KSS в A, и сохраняет его по адресу SMK (адрес курсора) ROM:2E43 ROM:2E43 loc_2E43: ; CODE XREF: INSERTTR+53j ROM:2E43 mov b, a ROM:2E44 xthl ROM:2E45 call COMPAREHLDE ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения. ROM:2E48 xthl ROM:2E49 jz loc_2E60 ROM:2E4C mov a, e ROM:2E4D inr e ROM:2E4E cmp c ROM:2E4F jnz loc_2E58 ROM:2E52 call LINECHK ; Проверяет пропуски в начале и в конце строк ROM:2E55 inr d ROM:2E56 mvi e, 0 ROM:2E58 ROM:2E58 loc_2E58: ; CODE XREF: INSERTTR+45j ROM:2E58 inx h ROM:2E59 call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM). ROM:2E5C mov m, b ROM:2E5D jmp loc_2E43 ROM:2E60 ; --------------------------------------------------------------------------- ROM:2E60 ROM:2E60 loc_2E60: ; CODE XREF: INSERTTR+3Fj ROM:2E60 pop h ROM:2E61 ret ROM:2E62 ; --------------------------------------------------------------------------- ROM:2E62 ROM:2E62 loc_2E62: ; CODE XREF: INSERTTR+19j ROM:2E62 inr d ROM:2E63 inx h ROM:2E64 mov a, m ROM:2E65 cpi 80h ; 'А' ROM:2E67 jz loc_2E35 ROM:2E6A push b ROM:2E6B push d ROM:2E6C push h ROM:2E6D push b ROM:2E6E mvi e, 0 ROM:2E70 call KEYSOFF3 ; Подпрограмма выключения функциональных клавиш ROM:2E73 pop b ROM:2E74 push h ROM:2E75 lda DLSM ; Максимальная длина строк 32 или 64 ROM:2E78 mov e, a ROM:2E79 mov a, b ROM:2E7A inr c ROM:2E7B sub d ROM:2E7C mov b, a ROM:2E7D cnz INSERTTR2 ; Подпрограмма обработки вставки символа. Дополнительная точка входа. ROM:2E80 pop h ROM:2E81 xthl ROM:2E82 push h ROM:2E83 mvi e, 1 ROM:2E85 mov c, e ROM:2E86 mov a, b ROM:2E87 ora a ROM:2E88 cnz INSERTTR2 ; Подпрограмма обработки вставки символа. Дополнительная точка входа. ROM:2E8B pop h ROM:2E8C xthl ROM:2E8D call SPACES2 ; Заполнение областей на экране пробелами. Дополнительная точка входа. ROM:2E90 pop h ROM:2E91 pop d ROM:2E92 pop b ROM:2E93 jmp loc_2E35 ROM:2E93 ; End of function INSERTTR ROM:2E93 ROM:2E96 ROM:2E96 ; =============== S U B R O U T I N E ======================================= ROM:2E96 ROM:2E96 ; Подпрограмма обработки вставки символа. Дополнительная точка входа. ROM:2E96 ROM:2E96 INSERTTR2: ; CODE XREF: INSERTTR+73p ROM:2E96 ; INSERTTR+7Ep ... ROM:2E96 push b ROM:2E97 push h ROM:2E98 call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM). ROM:2E9B ROM:2E9B loc_2E9B: ; CODE XREF: INSERTTR2+Ej ROM:2E9B mvi d, 0 ROM:2E9D dad d ROM:2E9E mov d, a ROM:2E9F call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM). ROM:2EA2 mov m, d ROM:2EA3 dcr b ROM:2EA4 jnz loc_2E9B ROM:2EA7 pop h ROM:2EA8 inx h ROM:2EA9 pop b ROM:2EAA dcr c ROM:2EAB jnz INSERTTR2 ; Подпрограмма обработки вставки символа. Дополнительная точка входа. ROM:2EAE ret ROM:2EAE ; End of function INSERTTR2 ROM:2EAE ROM:2EAF ROM:2EAF ; =============== S U B R O U T I N E ======================================= ROM:2EAF ROM:2EAF ; Печать возврата каретки (печать CHR$(&h0D)) ROM:2EAF ROM:2EAF CARRET: ; CODE XREF: EDIT2:loc_2AE5p ROM:2EAF ; EDIT2:loc_2AF8p ... ROM:2EAF call LEND ; Перемещает курсор в конец логической строки. ROM:2EB2 call FHOME ; Перемещает курсор в начало физической строки ROM:2EB5 jmp DOWN ROM:2EB5 ; End of function CARRET ROM:2EB5 ROM:2EB8 ROM:2EB8 ; =============== S U B R O U T I N E ======================================= ROM:2EB8 ROM:2EB8 ; Подпрограмма редактора ROM:2EB8 ROM:2EB8 EDIT5: ; CODE XREF: EDIT2+57p ROM:2EB8 call CURSOR ; Отображение курсора. ROM:2EBB lxi h, SCLNTAB ; Таблица состояния строк экранного редактора ROM:2EBE mov a, m ROM:2EBF ori 80h ROM:2EC1 mov m, a ROM:2EC2 mvi c, 0 ROM:2EC4 ROM:2EC4 loc_2EC4: ; CODE XREF: EDIT5+1Aj ROM:2EC4 mov a, m ROM:2EC5 ani 80h ROM:2EC7 jz loc_2ECB ROM:2ECA mov e, c ROM:2ECB ROM:2ECB loc_2ECB: ; CODE XREF: EDIT5+Fj ROM:2ECB mov a, c ROM:2ECC cmp d ROM:2ECD jz loc_2ED5 ROM:2ED0 inr c ROM:2ED1 inx h ROM:2ED2 jmp loc_2EC4 ROM:2ED5 ; --------------------------------------------------------------------------- ROM:2ED5 ROM:2ED5 loc_2ED5: ; CODE XREF: EDIT5+15j ROM:2ED5 mov d, e ROM:2ED6 mvi e, 0 ROM:2ED8 call CUREND2 ; Перемещает курсор в конец логической строки. Дополнительная подпрограмма. ROM:2EDB mov b, h ROM:2EDC mov c, l ROM:2EDD lxi h, IOBUF ; Буфер ввода-вывода (диск, кассеты) ROM:2EE0 ROM:2EE0 loc_2EE0: ; CODE XREF: EDIT5+76j ROM:2EE0 push d ROM:2EE1 call EDIT3 ; Подпрограмма редактора ROM:2EE4 xchg ROM:2EE5 lhld SMK ; Адрес курсора ROM:2EE8 ldax b ROM:2EE9 ani 7Fh ROM:2EEB jz loc_2F33 ROM:2EEE push b ROM:2EEF mov c, a ROM:2EF0 lda KSS ; Код символа в позиции курсора ROM:2EF3 jmp loc_2EF9 ROM:2EF6 ; --------------------------------------------------------------------------- ROM:2EF6 ROM:2EF6 loc_2EF6: ; CODE XREF: EDIT5+53j ROM:2EF6 call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM). ROM:2EF9 ROM:2EF9 loc_2EF9: ; CODE XREF: EDIT5+3Bj ROM:2EF9 mov b, a ROM:2EFA cpi 20h ; ' ' ROM:2EFC jnc loc_2F06 ROM:2EFF adi 40h ; '@' ROM:2F01 mov b, a ROM:2F02 mvi a, 1 ROM:2F04 stax d ROM:2F05 inx d ROM:2F06 ROM:2F06 loc_2F06: ; CODE XREF: EDIT5+44j ROM:2F06 mov a, b ROM:2F07 stax d ROM:2F08 inx d ROM:2F09 inx h ROM:2F0A dcr c ROM:2F0B jnz loc_2EF6 ROM:2F0E lxi b, IOBUF+116h ; Буфер ввода-вывода (диск, кассеты) ROM:2F11 mov a, d ROM:2F12 cmp b ROM:2F13 jc loc_2F1F ROM:2F16 mov a, e ROM:2F17 cmp c ROM:2F18 jc loc_2F1F ROM:2F1B pop b ROM:2F1C jmp loc_2F33 ROM:2F1F ; --------------------------------------------------------------------------- ROM:2F1F ROM:2F1F loc_2F1F: ; CODE XREF: EDIT5+5Bj ROM:2F1F ; EDIT5+60j ROM:2F1F pop b ROM:2F20 inx b ROM:2F21 ldax b ROM:2F22 ani 80h ROM:2F24 jnz loc_2F33 ROM:2F27 xchg ROM:2F28 pop d ROM:2F29 inr d ROM:2F2A lda MSK ; Количество строк экрана ROM:2F2D cmp d ROM:2F2E jnz loc_2EE0 ROM:2F31 xchg ROM:2F32 push d ROM:2F33 ROM:2F33 loc_2F33: ; CODE XREF: EDIT5+33j ROM:2F33 ; EDIT5+64j ... ROM:2F33 mov b, d ROM:2F34 mov c, e ROM:2F35 call ODOAOO ; Записывает по адресу в BC три байта - &h0D, &h0A, &h00 ROM:2F38 pop d ROM:2F39 lxi h, SCLNTAB ; Таблица состояния строк экранного редактора ROM:2F3C lda MSK ; Количество строк экрана ROM:2F3F mov b, a ROM:2F40 ROM:2F40 loc_2F40: ; CODE XREF: EDIT5+91j ROM:2F40 mov a, m ROM:2F41 ana a ROM:2F42 jnz loc_2F47 ROM:2F45 mvi m, 80h ; 'А' ROM:2F47 ROM:2F47 loc_2F47: ; CODE XREF: EDIT5+8Aj ROM:2F47 inx h ROM:2F48 dcr b ROM:2F49 jnz loc_2F40 ROM:2F4C ret ROM:2F4C ; End of function EDIT5 ROM:2F4C ROM:2F4D ROM:2F4D ; =============== S U B R O U T I N E ======================================= ROM:2F4D ROM:2F4D ROM:2F4D MACRO9: ; CODE XREF: MACRO8+3p ROM:2F4D ; CLRSCR+28p ... ROM:2F4D ana a ROM:2F4E rz ROM:2F4F mov m, b ROM:2F50 inx h ROM:2F51 dcr a ROM:2F52 jnz MACRO9 ROM:2F55 ret ROM:2F55 ; End of function MACRO9 ROM:2F55 ROM:2F56 ROM:2F56 ; =============== S U B R O U T I N E ======================================= ROM:2F56 ROM:2F56 ; Отображение курсора. ROM:2F56 ROM:2F56 CURSOR: ; CODE XREF: CLRSCR+3p ROM:2F56 ; SYMSCR2:loc_2CE0p ... ROM:2F56 xra a ROM:2F57 sta INSF ; Флаг вставки ROM:2F5A mvi b, 0FFh ROM:2F5C mvi a, 8 ROM:2F5E lxi h, CURISO ; Изображение курсора ROM:2F61 call MACRO9 ROM:2F64 mvi m, 1 ROM:2F64 ; End of function CURSOR ROM:2F64 ROM:2F66 ROM:2F66 ; =============== S U B R O U T I N E ======================================= ROM:2F66 ROM:2F66 ; Подпрограмма отображения курсора. ROM:2F66 ROM:2F66 CURSOR2: ; CODE XREF: KEYSON2p ROM:2F66 ; SYMSCR2+1D3p ... ROM:2F66 lhld PK ; Позиция курсора ROM:2F69 xchg ROM:2F6A lda MSK ; Количество строк экрана ROM:2F6D dcr a ROM:2F6E mov b, a ROM:2F6F lda DLSF ; Длина строки экрана ROM:2F72 dcr a ROM:2F73 mov c, a ROM:2F74 ret ROM:2F74 ; End of function CURSOR2 ROM:2F74 ROM:2F75 ROM:2F75 ; =============== S U B R O U T I N E ======================================= ROM:2F75 ROM:2F75 ; Загружает код символа из KSS в A, и сохраняет его по адресу SMK (адрес курсора) ROM:2F75 ROM:2F75 CUR2MEM: ; CODE XREF: INSERTTR+36p ROM:2F75 ; EDIT3+3p ... ROM:2F75 lda KSS ; Код символа в позиции курсора ROM:2F78 lhld SMK ; Адрес курсора ROM:2F7B mov m, a ROM:2F7C ret ROM:2F7C ; End of function CUR2MEM ROM:2F7C ROM:2F7D ROM:2F7D ; =============== S U B R O U T I N E ======================================= ROM:2F7D ROM:2F7D ; Подпрограмма выключения функциональных клавиш ROM:2F7D ROM:2F7D KEYSOFF3: ; CODE XREF: KEYSOFF2+8p ROM:2F7D ; INSERTTR+66p ... ROM:2F7D lhld ABS1 ; Адрес буфера экрана режима 0 и 1 ROM:2F80 lda DLSM ; Максимальная длина строк 32 или 64 ROM:2F83 mvi b, 0 ROM:2F85 mov c, a ROM:2F86 mov a, d ROM:2F87 ROM:2F87 loc_2F87: ; CODE XREF: KEYSOFF3+10j ROM:2F87 ana a ROM:2F88 jz loc_2F90 ROM:2F8B dad b ROM:2F8C dcr a ROM:2F8D jmp loc_2F87 ROM:2F90 ; --------------------------------------------------------------------------- ROM:2F90 ROM:2F90 loc_2F90: ; CODE XREF: KEYSOFF3+Bj ROM:2F90 mov a, e ROM:2F91 mov c, a ROM:2F92 lda SPN ; Пропусков в начале строки ROM:2F95 add c ROM:2F96 mov c, a ROM:2F97 mvi b, 0 ROM:2F99 dad b ROM:2F9A ret ROM:2F9A ; End of function KEYSOFF3 ROM:2F9A ROM:2F9B ROM:2F9B ; =============== S U B R O U T I N E ======================================= ROM:2F9B ROM:2F9B ; Подпрограмма редактора ROM:2F9B ROM:2F9B EDIT3: ; CODE XREF: EDIT2:loc_2AB1p ROM:2F9B ; EDIT2+5Bp ... ROM:2F9B push b ROM:2F9C push d ROM:2F9D push h ROM:2F9E call CUR2MEM ; Загружает код символа из KSS в A, и сохраняет его по адресу SMK (адрес курсора) ROM:2FA1 xchg ROM:2FA2 shld PK ; Позиция курсора ROM:2FA5 xchg ROM:2FA6 call KEYSOFF3 ; Подпрограмма выключения функциональных клавиш ROM:2FA9 shld SMK ; Адрес курсора ROM:2FAC call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM). ROM:2FAF sta KSS ; Код символа в позиции курсора ROM:2FB2 mov d, a ROM:2FB3 lda SCRTMP2 ; Экранные временные переменные. ROM:2FB6 ana a ROM:2FB7 mov a, d ROM:2FB8 jnz loc_2FEF ROM:2FBB mvi m, 0BFh ; '¬' ROM:2FBD lhld AGS1 ; Адрес знакогенератора режима 0 и 1 ROM:2FBD ; Адрес буфера экрана режима 2 ROM:2FC0 mov d, h ROM:2FC1 mov e, l ROM:2FC2 lxi b, 5F8h ROM:2FC5 dad b ROM:2FC6 xchg ROM:2FC7 rlc ROM:2FC8 rlc ROM:2FC9 rlc ROM:2FCA mov b, a ROM:2FCB ani 0F8h ROM:2FCD mov c, a ROM:2FCE mov a, b ROM:2FCF ani 7 ROM:2FD1 mov b, a ROM:2FD2 dad b ROM:2FD3 push d ROM:2FD4 lxi d, INTAR+18h ; Рабочая область обработки прерываний ROM:2FD7 push d ROM:2FD8 lxi b, 8 ROM:2FDB call VRAMSEND ; BC=счетчик, DE=адрес приема, HL=адрес источника ROM:2FDB ; (пересылка VRAM->RAM, VRAM->VRAM) ROM:2FDE pop h ROM:2FDF pop d ROM:2FE0 lxi b, CURISO ; Изображение курсора ROM:2FE3 ldax b ROM:2FE4 ROM:2FE4 loc_2FE4: ; CODE XREF: EDIT3+51j ROM:2FE4 xra m ROM:2FE5 stax d ROM:2FE6 inx b ROM:2FE7 inx d ROM:2FE8 inx h ROM:2FE9 ldax b ROM:2FEA cpi 1 ROM:2FEC jnz loc_2FE4 ROM:2FEF ROM:2FEF loc_2FEF: ; CODE XREF: EDIT3+1Dj ROM:2FEF pop h ROM:2FF0 pop d ROM:2FF1 pop b ROM:2FF2 ret ROM:2FF2 ; End of function EDIT3 ROM:2FF2 ROM:2FF3 ROM:2FF3 ; =============== S U B R O U T I N E ======================================= ROM:2FF3 ROM:2FF3 ; Выключает изображение курсора ROM:2FF3 ROM:2FF3 CURSOFF2: ; CODE XREF: CURSOFFj ROM:2FF3 ; TESTBREAKKEYTR+15p ... ROM:2FF3 push h ROM:2FF4 call CUR2MEM ; Загружает код символа из KSS в A, и сохраняет его по адресу SMK (адрес курсора) ROM:2FF7 mvi a, 0FFh ROM:2FF9 sta SCRTMP2 ; Экранные временные переменные. ROM:2FFC pop h ROM:2FFD ret ROM:2FFD ; End of function CURSOFF2 ROM:2FFD ROM:2FFE ROM:2FFE ; =============== S U B R O U T I N E ======================================= ROM:2FFE ROM:2FFE ; Включает изображение курсора ROM:2FFE ROM:2FFE CURSON2: ; CODE XREF: CURSONj ROM:2FFE ; TESTBREAKKEYTR+Bp ... ROM:2FFE push h ROM:2FFF lhld PK ; Позиция курсора ROM:3002 xchg ROM:3003 xra a ROM:3004 sta SCRTMP2 ; Экранные временные переменные. ROM:3007 call CHKMODE ; Проверяет режим экрана на 2. Если да, то A=B ROM:300A cnz EDIT3 ; Подпрограмма редактора ROM:300D xchg ROM:300E pop h ROM:300F ret ROM:300F ; End of function CURSON2 ROM:300F ROM:3010 ROM:3010 ; =============== S U B R O U T I N E ======================================= ROM:3010 ROM:3010 ; Перемещает курсор в конец логической строки. Дополнительная подпрограмма. ROM:3010 ROM:3010 CUREND2: ; CODE XREF: SYMSCR2+24Bp ROM:3010 ; LEND+3p ... ROM:3010 mov c, d ROM:3011 xra a ROM:3012 mov b, a ROM:3013 lxi h, SCLNTAB ; Таблица состояния строк экранного редактора ROM:3016 dad b ROM:3017 ret ROM:3017 ; End of function CUREND2 ROM:3017 ROM:3018 ROM:3018 ; =============== S U B R O U T I N E ======================================= ROM:3018 ROM:3018 ROM:3018 MACRO11: ; CODE XREF: KEYSON3+15p ROM:3018 push d ROM:3019 xchg ROM:301A lxi h, 0 ROM:301D ana a ROM:301E jz loc_3026 ROM:3021 ROM:3021 loc_3021: ; CODE XREF: MACRO11+Bj ROM:3021 dad d ROM:3022 dcr a ROM:3023 jnz loc_3021 ROM:3026 ROM:3026 loc_3026: ; CODE XREF: MACRO11+6j ROM:3026 pop d ROM:3027 ret ROM:3027 ; End of function MACRO11 ROM:3027 ROM:3028 ROM:3028 ; =============== S U B R O U T I N E ======================================= ROM:3028 ROM:3028 ; Подпрограмма включения функциональных клавиш ROM:3028 ROM:3028 KEYSON3: ; CODE XREF: KEYSON2+Bp ROM:3028 ; RIGHT2:loc_2CF8p ... ROM:3028 push d ROM:3029 call CUR2MEM ; Загружает код символа из KSS в A, и сохраняет его по адресу SMK (адрес курсора) ROM:302C mov c, d ROM:302D lhld ABS1 ; Адрес буфера экрана режима 0 и 1 ROM:3030 mov d, h ROM:3031 mov e, l ROM:3032 lda DLSM ; Максимальная длина строк 32 или 64 ROM:3035 mov b, a ROM:3036 add l ROM:3037 mov l, a ROM:3038 push h ROM:3039 mov l, b ROM:303A mvi h, 0 ROM:303C mov a, c ROM:303D call MACRO11 ROM:3040 mov b, h ROM:3041 mov c, l ROM:3042 pop h ROM:3043 call VRAMSEND ; BC=счетчик, DE=адрес приема, HL=адрес источника ROM:3043 ; (пересылка VRAM->RAM, VRAM->VRAM) ROM:3046 xchg ROM:3047 call SPACES ; Заполнение областей на экране пробелами ROM:304A pop d ROM:304B push d ROM:304C mov c, d ROM:304D lxi d, SCLNTAB ; Таблица состояния строк экранного редактора ROM:3050 mov h, d ROM:3051 mov l, e ROM:3052 inx h ROM:3053 call VRAMSEND ; BC=счетчик, DE=адрес приема, HL=адрес источника ROM:3053 ; (пересылка VRAM->RAM, VRAM->VRAM) ROM:3056 mvi a, 80h ; 'А' ROM:3058 stax d ROM:3059 pop d ROM:305A ret ROM:305A ; End of function KEYSON3 ROM:305A ROM:305B ROM:305B ; =============== S U B R O U T I N E ======================================= ROM:305B ROM:305B ; Подпрограмма обработки BACKSPACE ROM:305B ROM:305B BKSPC2: ; CODE XREF: SYMSCR2+293p ROM:305B ROM:305B ; FUNCTION CHUNK AT ROM:30A4 SIZE 0000002B BYTES ROM:305B ROM:305B call CUREND2 ; Перемещает курсор в конец логической строки. Дополнительная подпрограмма. ROM:305E push h ROM:305F call CURSOR2 ; Подпрограмма отображения курсора. ROM:3062 mov d, c ROM:3063 lhld SMK ; Адрес курсора ROM:3066 mvi m, 20h ; ' ' ROM:3068 ROM:3068 loc_3068: ; CODE XREF: BKSPC2+26j ROM:3068 mov b, h ROM:3069 mov c, l ROM:306A mov a, d ROM:306B cmp e ROM:306C jz loc_3084 ROM:306F inr e ROM:3070 inx h ROM:3071 xthl ROM:3072 mov a, m ROM:3073 xthl ROM:3074 ani 7Fh ROM:3076 cmp e ROM:3077 jz loc_30B9 ROM:307A jc loc_30CD ROM:307D ROM:307D loc_307D: ; CODE XREF: BKSPC2+37j ROM:307D call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM). ROM:3080 stax b ROM:3081 jmp loc_3068 ROM:3084 ; --------------------------------------------------------------------------- ROM:3084 ROM:3084 loc_3084: ; CODE XREF: BKSPC2+11j ROM:3084 xthl ROM:3085 inx h ROM:3086 mov a, m ROM:3087 ani 80h ROM:3089 jnz loc_30A4 ROM:308C mov e, a ROM:308D xthl ROM:308E call LINECHK ; Проверяет пропуски в начале и в конце строк ROM:3091 inx h ROM:3092 jmp loc_307D ROM:3092 ; End of function BKSPC2 ROM:3092 ROM:3095 ROM:3095 ; =============== S U B R O U T I N E ======================================= ROM:3095 ROM:3095 ; Проверяет пропуски в начале и в конце строк ROM:3095 ROM:3095 LINECHK: ; CODE XREF: INSERTTR+48p ROM:3095 ; BKSPC2+33p ROM:3095 lda SPN ; Пропусков в начале строки ROM:3098 push b ROM:3099 mov c, a ROM:309A mvi b, 0 ROM:309C lda SPK ; Пропусков в конце строки ROM:309F add c ROM:30A0 mov c, a ROM:30A1 dad b ROM:30A2 pop b ROM:30A3 ret ROM:30A3 ; End of function LINECHK ROM:30A3 ROM:30A4 ; --------------------------------------------------------------------------- ROM:30A4 ; START OF FUNCTION CHUNK FOR BKSPC2 ROM:30A4 ROM:30A4 loc_30A4: ; CODE XREF: BKSPC2+2Ej ROM:30A4 dcx h ROM:30A5 mov a, m ROM:30A6 ani 7Fh ROM:30A8 xthl ROM:30A9 mov h, a ROM:30AA mov a, e ROM:30AB cmp h ROM:30AC mov a, h ROM:30AD jc loc_30B9 ROM:30B0 mvi b, 80h ; 'А' ROM:30B2 ana a ROM:30B3 jz loc_30C7 ROM:30B6 jmp loc_30CD ROM:30B9 ; --------------------------------------------------------------------------- ROM:30B9 ROM:30B9 loc_30B9: ; CODE XREF: BKSPC2+1Cj ROM:30B9 ; BKSPC2+52j ROM:30B9 mov h, a ROM:30BA mvi a, 20h ; ' ' ROM:30BC stax b ROM:30BD mov a, h ROM:30BE mvi b, 80h ; 'А' ROM:30C0 cpi 2 ROM:30C2 jc loc_30C7 ROM:30C5 dcr a ROM:30C6 mov b, a ROM:30C7 ROM:30C7 loc_30C7: ; CODE XREF: BKSPC2+58j ROM:30C7 ; BKSPC2+67j ROM:30C7 xthl ROM:30C8 mov a, m ROM:30C9 ani 80h ROM:30CB ora b ROM:30CC mov m, a ROM:30CD ROM:30CD loc_30CD: ; CODE XREF: BKSPC2+1Fj ROM:30CD ; BKSPC2+5Bj ROM:30CD pop h ROM:30CE ret ROM:30CE ; END OF FUNCTION CHUNK FOR BKSPC2 ROM:30CF ROM:30CF ; =============== S U B R O U T I N E ======================================= ROM:30CF ROM:30CF ; Работа с портами &h86 и &h82 ROM:30CF ROM:30CF PORT8682: ; CODE XREF: INTRPT2+B9p ROM:30CF push psw ROM:30D0 mov b, a ROM:30D1 in 86h ROM:30D3 call MACRO12 ROM:30D6 out 86h ROM:30D8 mov a, b ROM:30D9 rlc ROM:30DA mov b, a ROM:30DB in 82h ROM:30DD call MACRO12 ROM:30E0 out 82h ROM:30E2 pop psw ROM:30E3 ret ROM:30E3 ; End of function PORT8682 ROM:30E3 ROM:30E4 ROM:30E4 ; =============== S U B R O U T I N E ======================================= ROM:30E4 ROM:30E4 ROM:30E4 MACRO12: ; CODE XREF: PORT8682+4p ROM:30E4 ; PORT8682+Ep ROM:30E4 ani 0DFh ROM:30E6 mov c, a ROM:30E7 mov a, b ROM:30E8 rlc ROM:30E9 rlc ROM:30EA mov b, a ROM:30EB ani 20h ROM:30ED ora c ROM:30EE ret ROM:30EE ; End of function MACRO12 ROM:30EE ROM:30EF ROM:30EF ; =============== S U B R O U T I N E ======================================= ROM:30EF ROM:30EF ; Обработка звука нажатия клавиш и CHR$(&h07) (в зависимости от BEEPF) ROM:30EF ROM:30EF BELL2: ; CODE XREF: BELLj ROM:30EF ; INTRPT2+121p ... ROM:30EF push psw ROM:30F0 push b ROM:30F1 cpi 7 ROM:30F3 jz loc_30FD ROM:30F6 lda BEEPF ; BEEP флаг ROM:30F9 ana a ROM:30FA jz loc_310F ROM:30FD ROM:30FD loc_30FD: ; CODE XREF: BELL2+4j ROM:30FD in 82h ROM:30FF mvi b, 3Fh ; '?' ROM:3101 ROM:3101 loc_3101: ; CODE XREF: BELL2+1Dj ROM:3101 mvi c, 16h ROM:3103 ROM:3103 loc_3103: ; CODE XREF: BELL2+15j ROM:3103 dcr c ROM:3104 jnz loc_3103 ROM:3107 xri 80h ROM:3109 out 82h ROM:310B dcr b ROM:310C jnz loc_3101 ROM:310F ROM:310F loc_310F: ; CODE XREF: BELL2+Bj ROM:310F pop b ROM:3110 xra a ROM:3111 sta INTTMP3 ; Переменная обработчика прерываний ROM:3114 pop psw ROM:3115 ret ROM:3115 ; End of function BELL2 ROM:3115 ROM:3115 ; --------------------------------------------------------------------------- ROM:3116 TAB8: .db 68h, 38h, 2Ch, 20h, 6Ch, 6Fh, 67h, 69h, 6Eh, 67h ROM:3120 ; --------------------------------------------------------------------------- ROM:3120 ROM:3120 SPACES3: ; CODE XREF: SPACES2+8p ROM:3120 lda MODE ; Заполнение областей на экране пробелами. Дополнительная точка входа. ROM:3123 cpi 0 ROM:3125 lda SPK ; Пропусков в конце строки ROM:3128 rnz ROM:3129 sui 5 ROM:312B call MACRO9 ROM:312E mvi a, 5 ROM:3130 mov m, a ROM:3131 inr a ROM:3132 inx h ROM:3133 mov m, a ROM:3134 mvi a, 0Dh ROM:3136 inx h ROM:3137 mov m, a ROM:3138 inr a ROM:3139 inx h ROM:313A mov m, a ROM:313B inx h ROM:313C mvi a, 1 ROM:313E ret ROM:313F ; --------------------------------------------------------------------------- ROM:313F nop ROM:3140 lhld BASOPNUM ; Номер оператора Бейсик программы. ROM:3140 ; Или &hFFFF в командном режиме ROM:3143 inx h ROM:3144 mov a, l ROM:3145 ora h ROM:3146 jz loc_2682 ROM:3149 lda STOPFLG ; STOP-флаг ROM:314C jmp loc_2675 ROM:314C ; --------------------------------------------------------------------------- ROM:314F .db 0FFh ROM:3150 ; --------------------------------------------------------------------------- ROM:3150 ROM:3150 loc_3150: ; CODE XREF: ROM:1D6Aj ROM:3150 mov e, a ROM:3151 jmp MAINLOOP1 ; Первая точка входа в главный цикл ROM:3154 ROM:3154 ; =============== S U B R O U T I N E ======================================= ROM:3154 ROM:3154 ; Запрещает прерывания и вызывает RAMSEND ROM:3154 ROM:3154 DIRAMSEND: ; CODE XREF: SETMODE2+43p ROM:3154 di ROM:3155 call RAMSEND ; BC=счетчик, DE=адрес приема, HL=адрес источника ROM:3155 ; (пересылка RAM->RAM, RAM->VRAM) ROM:3158 ret ROM:3158 ; End of function DIRAMSEND ROM:3158 ROM:3158 ; --------------------------------------------------------------------------- ROM:3159 TAB9: .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ; Сюда ссылается TOKENIZE ROM:3159 .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:3159 .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:3170 __CLS: .text "CLL" ; DATA XREF: PRNTR1-12C5o ROM:3173 __FOR: .text "FOT" ROM:3176 __NEXT: .text "NEXL" ROM:317A __DATA: .text "DAT+" ROM:317E __INPUT: .text "INPUL" ROM:3183 __DIM: .text "DI=" ROM:3186 __READ: .text "REA-" ROM:318A __LOCATE: .text "LOCAT+" ROM:3190 __GOTO: .text "GOT¦" ROM:3194 __RUN: .text "RU+" ROM:3197 __IF: .text "I¦" ROM:3199 __RESTORE: .text "RESTOR+" ROM:31A0 __GOSUB: .text "GOSUT" ROM:31A5 __RETURN: .text "RETUR+" ROM:31AB __REM: .text "RE=" ROM:31AE __STOP: .text "STO¦" ROM:31B2 __OUT: .text "OUL" ROM:31B5 __ON: .text "O+" ROM:31B7 __PSET: .text "PSEL" ROM:31BB __LINE: .text "LIN+" ROM:31BF __POKE: .text "POK+" ROM:31C3 __PRINT: .text "PRINL" ROM:31C8 __DEF: .text "DE¦" ROM:31CB __ERROR: .text "ERROT" ROM:31D0 __LIST: .text "LISL" ROM:31D4 __CLEAR: .text "CLEAT" ROM:31D9 __CLOAD: .text "CLOA-" ROM:31DE __CSAVE: .text "CSAV+" ROM:31E3 __NEW: .text "NE+" ROM:31E6 __TAB_: .text "TABи" ; (токен 157 (&h9D)) ROM:31EA __TO: .text "T¦" ; (токен 158 (&h9E)) ROM:31EC __SPC_: .text "SPCи" ; (токен 159 (&h9F)) ROM:31F0 __FN: .text "F+" ; (токен 160 (&hA0)) ROM:31F2 __THEN: .text "THE+" ; (токен 161 (&hA1)) ROM:31F6 __NOT: .text "NOL" ; (токен 162 (&hA2)) ROM:31F9 __STEP: .text "STE¦" ; (токен 163 (&hA3)) ROM:31FD __PLUS: .text "л" ; (токен 164 (&hA4)) ROM:31FE __MINUS: .text "н" ; (токен 165 (&hA5)) ROM:31FF __MUL: .text "к" ; (токен 166 (&hA6)) ROM:3200 __DIV: .text "п" ; (токен 167 (&hA7)) ROM:3201 __POW: .text "¦" ; (токен 168 (&hA8)) ROM:3202 __AND: .text "AN-" ; (токен 169 (&hA9)) ROM:3205 __OR: .text "OT" ; (токен 170 (&hAA)) ROM:3207 __GT: .text "-" ; (токен 171 (&hAB)) ROM:3208 __EQ: .text "-" ; (токен 172 (&hAC)) ROM:3209 __LS: .text "-" ; (токен 173 (&hAD)) ROM:320A __SGN: .text "SG+" ROM:320D __INT: .text "INL" ROM:3210 __ABS: .text "ABL" ROM:3213 __USR: .text "UST" ROM:3216 __FRE: .text "FR+" ROM:3219 __INP: .text "IN¦" ROM:321C __POS: .text "POL" ROM:321F __SQR: .text "SQT" ROM:3222 __RND: .text "RN-" ROM:3225 __LOG: .text "LO¦" ROM:3228 __EXP: .text "EX¦" ROM:322B __COS: .text "COL" ROM:322E __SIN: .text "SI+" ROM:3231 __TAN: .text "TA+" ROM:3234 __ATN: .text "AT+" ROM:3237 __PEEK: .text "PEET" ROM:323B __LEN: .text "LE+" ROM:323E __STR$: .text "STRд" ROM:3242 __VAL: .text "VA¦" ROM:3245 __ASC: .text "AS+" ROM:3248 __CHR$: .text "CHRд" ROM:324C __HEX$: .text "HEXд" ROM:3250 __SPACE$: .text "SPACEд" ROM:3256 __VPEEK: .text "VPEET" ROM:325B __BIN$: .text "BINд" ROM:325F __STICK: .text "STICT" ROM:3264 __INPUT$: .text "INPUTд" ROM:326A __STRIG: .text "STRI¦" ROM:326F __BASE$: .text "BASEи" ROM:3274 __LEFT$: .text "LEFTд" ROM:3279 __RIGHT$: .text "RIGHTд" ROM:327F __MID$: .text "MIDд" ROM:3283 __ERR: .text "ERT" ROM:3286 __ERL: .text "ER¦" ROM:3289 __CSRLIN: .text "CSRLI+" ROM:328F __H: .text "&L" ROM:3291 __B: .text "&T" ROM:3293 __INKEY$: .text "INKEYд" ROM:3299 __POINT: .text "POINL" ROM:329E __STRING$: .text "STRING$и" ROM:32A6 __SCREEN: .text "SCREE+" ROM:32AC __WIDTH: .text "WIDTL" ROM:32B1 __GET: .text "GEL" ROM:32B4 __PUT: .text "PUL" ROM:32B7 __DRAW: .text "DRA+" ROM:32BB __LPRINT: .text "LPRINL" ROM:32C1 __LLIST: .text "LLISL" ROM:32C6 __KEY: .text "KE-" ROM:32C9 __PLAY: .text "PLA-" ROM:32CD __OFF: .text "OF¦" ROM:32D0 __PAINT: .text "PAINL" ROM:32D5 __BLOAD: .text "BLOA-" ROM:32DA __BSAVE: .text "BSAV+" ROM:32DF __LOAD: .text "LOA-" ROM:32E3 __SAVE: .text "SAV+" ROM:32E7 __SOUND: .text "SOUN-" ROM:32EC __AUTO: .text "AUT¦" ROM:32F0 __TR: .text "TT" ROM:32F2 __BEEP: .text "BEE¦" ROM:32F6 __MOTOR: .text "MOTOT" ROM:32FB __PRESET: .text "PRESEL" ROM:3301 __RESUME: .text "RESUM+" ROM:3307 __END: .text "EN-" ROM:330A __VPOKE: .text "VPOK+" ROM:330F __LET: .text "LEL" ROM:3312 __BASE: .text "BAS+" ROM:3316 __COLOR: .text "COLOT" ROM:331B __CONT: .text "CONL" ROM:331F .db 0A7h ROM:3320 TAB10: .db 0, 0C9h, 3Ah, 0EFh, 14h, 0FEh, 35h, 0CAh, 51h, 19h ROM:3320 .db 0CDh, 68h, 38h, 3, 62h, 61h, 64h, 20h, 73h, 65h, 63h ROM:3335 _CLS: .dw 17C6h ; DATA XREF: CHECKENOUGHMEM+307o ROM:3335 ; Бейсик оператор CLS (токен 128 (&h80)) ROM:3337 _FOR: .dw 535h ; Бейсик оператор FOR (токен 129 (&h81)) ROM:3339 _NEXT: .dw 91Dh ; Бейсик оператор NEXT (токен 130 (&h82)) ROM:333B _DATA: .dw 6F9h ; Бейсик оператор DATA (токен 131 (&h83)) ROM:333D _INPUT: .dw 852h ; Бейсик оператор INPUT (токен 132 (&h84)) ROM:333F _DIM: .dw 0B15h ; Бейсик оператор DIM (токен 133 (&h85)) ROM:3341 _READ: .dw 879h ; Бейсик оператор READ (токен 134 (&h86)) ROM:3343 _LOCATE: .dw 17B2h ; Бейсик оператор LOCATE (токен 135 (&h87)) ROM:3345 _GOTO: .dw 6C7h ; Бейсик оператор GOTO (токен 136 (&h88)) ROM:3347 _RUN: .dw 6ABh ; Бейсик оператор RUN (токен 137 (&h89)) ROM:3349 _IF: .dw 778h ; Бейсик оператор IF (токен 138 (&h8A)) ROM:334B _RESTORE: .dw 1A45h ; Бейсик оператор RESTORE (токен 139 (&h8B)) ROM:334D _GOSUB: .dw 6B7h ; Бейсик оператор GOSUB (токен 140 (&h8C)) ROM:334F _RETURN: .dw 6E3h ; Бейсик оператор RETURN (токен 141 (&h8D)) ROM:3351 _REM: .dw 6FBh ; Бейсик оператор REM ROM:3351 ; Внимание! Точка входа не может быть отмечена в дизассемблерном листинге, ROM:3351 ; т. к. указывает в середину инструкции опреатора DATA! ROM:3351 ; (токен 142 (&h8E)) ROM:3353 _STOP: .dw 5F0h ; Бейсик оператор STOP (токен 143 (&h8F)) ROM:3355 _OUT: .dw 0F80h ; Бейсик оператор OUT (токен 144 (&h90)) ROM:3357 _ON: .dw 1D54h ; Бейсик оператор ON (токен 145 (&h91)) ROM:3359 _PSET: .dw 1822h ; Бейсик оператор PSET (токен 146 (&h92)) ROM:335B _LINE: .dw 18FDh ; Бейсик оператор LINE (токен 147 (&h93)) ROM:335D _POKE: .dw 172Ch ; Бейсик оператор POKE (токен 148 (&h94)) ROM:335F _PRINT: .dw 791h ; Бейсик оператор PRINT (токен 149 (&h95)) ROM:3361 _DEF: .dw 0CB0h ; Бейсик оператор DEF (токен 150 (&h96)) ROM:3363 _ERROR: .dw 1D65h ; Бейсик оператор ERROR (токен 151 (&h97)) ROM:3365 _LIST: .dw 4EEh ; Бейсик оператор LIST (токен 152 (&h98)) ROM:3367 _CLEAR: .dw 682h ; Бейсик оператор CLEAR (токен 153 (&h99)) ROM:3369 _CLOAD: .dw 18C4h ; Бейсик оператор CLOAD (токен 154 (&h9A)) ROM:336B _CSAVE: .dw 18A5h ; Бейсик оператор CSAVE (токен 155 (&h9B)) ROM:336D _NEW: .dw 39Dh ; Бейсик оператор NEW (токен 156 (&h9C)) ROM:336F _SGN: .dw 12D4h ; DATA XREF: EVALTERM:loc_A6Do ROM:336F ; Бейсик функция SGN (токен 174 (&hAE)) ROM:3371 _INT: .dw 1392h ; Бейсик функция INT (токен 175 (&hAF)) ROM:3373 _ABS: .dw 12E8h ; Бейсик функция ABS (токен 176 (&hB0)) ROM:3375 _USR: .dw 1736h ; Бейсик функция USR (токен 177 (&hB1)) ROM:3377 _FRE: .dw 0C7Ah ; Бейсик функция FRE (токен 178 (&hB2)) ROM:3379 _INP: .dw 0F75h ; Бейсик функция INP (токен 179 (&hB3)) ROM:337B _POS: .dw 0CA8h ; Бейсик функция POS (токен 180 (&hB4)) ROM:337D _SQR: .dw 1554h ; Бейсик функция SQR (токен 181 (&hB5)) ROM:337F _RND: .dw 162Ah ; Бейсик функция RND (токен 182 (&hB6)) ROM:3381 _LOG: .dw 117Eh ; Бейсик функция LOG (токен 183 (&hB7)) ROM:3383 _EXP: .dw 1599h ; Бейсик функция EXP (токен 184 (&hB8)) ROM:3385 _COS: .dw 1660h ; Бейсик функция COS (токен 185 (&hB9)) ROM:3387 _SIN: .dw 1666h ; Бейсик функция SIN (токен 186 (&hBA)) ROM:3389 _TAN: .dw 16C3h ; Бейсик функция TAN (токен 187 (&hBB)) ROM:338B _ATN: .dw 16D8h ; Бейсик функция ATN (токен 188 (&hBC)) ROM:338D _PEEK: .dw 1724h ; Бейсик функция PEEK (токен 189 (&hBD)) ROM:338F _LEN: .dw 0EE7h ; Бейсик функция LEN (токен 190 (&hBE)) ROM:3391 _STR: .dw 0D1Fh ; Бейсик функция STR (токен 191 (&hBF)) ROM:3393 _VAL: .dw 0FC8h ; Бейсик функция VAL (токен 192 (&hC0)) ROM:3395 _ASC: .dw 0EF6h ; Бейсик функция ASC (токен 193 (&hC1)) ROM:3397 _CHR: .dw 0F04h ; Бейсик функция CHR (токен 194 (&hC2)) ROM:3399 _HEX: .dw 1FBBh ; Бейсик функция HEX (токен 195 (&hC3)) ROM:339B _SPACE: .dw 1C5Ah ; Бейсик функция SPACE (токен 196 (&hC4)) ROM:339D _VPEEK: .dw 1A81h ; Бейсик функция VPEEK (токен 197 (&hC5)) ROM:339F _2D0_1: .dw 2D0h ; (токен 198 (&hC6)) ROM:33A1 _STICK: .dw 1A60h ; Бейсик функция STICK (токен 199 (&hC7)) ROM:33A3 _2D0_2: .dw 2D0h ; (токен 200 (&hC8)) ROM:33A5 _STRIG: .dw 1A53h ; Бейсик функция STRIG (токен 201 (&hC9)) ROM:33A7 _BASE_: .dw 1D0Eh ; ??? (токен 202 (&hCA)) ROM:33A9 _LEFT: .dw 0F14h ; Бейсик функция LEFT (токен 203 (&hCB)) ROM:33AB _RIGHT: .dw 0F44h ; Бейсик функция RIGHT (токен 204 (&hCC)) ROM:33AD _MID: .dw 0F4Eh ; Бейсик функция MID (токен 205 (&hCD)) ROM:33AF _ERR: .dw 1D77h ; Бейсик функция ERR (токен 206 (&hCE)) ROM:33B1 _ERL: .dw 1D6Dh ; Бейсик функция ERL (токен 207 (&hCF)) ROM:33B3 _CSRLIN: .dw 1A7Bh ; Бейсик функция CSRLIN (токен 208 (&hD0)) ROM:33B5 _H: .dw 1F3Ah ; Бейсик функция &h (токен 209 (&hD1)) ROM:33B7 _B: .dw 1F6Ch ; Бейсик функция &b (токен 210 (&hD2)) ROM:33B9 _INKEY: .dw 197Bh ; Бейсик функция INKEY (токен 211 (&hD3)) ROM:33BB _POINT: .dw 1EEAh ; Бейсик функция POINT (токен 212 (&hD4)) ROM:33BD _STRING: .dw 1C71h ; Бейсик функция STRING (токен 213 (&hD5)) ROM:33BF _SCREEN: .dw 1A1Ah ; Бейсик функция SCREEN (токен 214 (&hD6)) ROM:33C1 _WIDTH: .dw 1A26h ; Бейсик функция WIDTH (токен 215 (&hD7)) ROM:33C3 _GET: .dw 2151h ; Бейсик оператор GET (токен 216 (&hD8)) ROM:33C5 _PUT: .dw 1FD6h ; Бейсик оператор PUT (токен 217 (&hD9)) ROM:33C7 _2D0_3: .dw 2D0h ; (токен 218 (&hDA)) ROM:33C9 _LPRINT: .dw 1B42h ; Бейсик оператор LPRINT (токен 219 (&hDB)) ROM:33CB _LLIST: .dw 1B4Ah ; Бейсик оператор LLIST (токен 220 (&hDC)) ROM:33CD _KEY: .dw 1AF4h ; Бейсик оператор KEY (токен 221 (&hDD)) ROM:33CF _2D0_4: .dw 2D0h ; (токен 222 (&hDE)) ROM:33D1 _2D0_5: .dw 2D0h ; (токен 223 (&hDF)) ROM:33D3 _2D0_6: .dw 2D0h ; (токен 224 (&hE0)) ROM:33D5 _BLOAD: .dw 199Ch ; Бейсик оператор BLOAD (токен 225 (&hE1)) ROM:33D7 _BSAVE: .dw 19DAh ; Бейсик оператор BSAVE (токен 226 (&hE2)) ROM:33D9 _LOAD: .dw 19B8h ; Бейсик оператор LOAD (токен 227 (&hE3)) ROM:33DB _SAVE: .dw 188Bh ; Бейсик оператор SAVE (токен 228 (&hE4)) ROM:33DD _2D0_7: .dw 2D0h ; (токен 229 (&hE5)) ROM:33DF _AUTO: .dw 1DC5h ; Бейсик оператор AUTO (токен 230 (&hE6)) ROM:33E1 _TR: .dw 1EBAh ; Бейсик оператор TR (токен 231 (&hE7)) ROM:33E3 _BEEP: .dw 1D3Ch ; Бейсик оператор BEEP (токен 232 (&hE8)) ROM:33E5 _MOTOR: .dw 1A32h ; Бейсик оператор MOTOR (токен 233 (&hE9)) ROM:33E7 _PRESET: .dw 1800h ; Бейсик оператор PRESET (токен 234 (&hEA)) ROM:33E9 _RESUME: .dw 1DA5h ; Бейсик оператор RESUME (токен 235 (&hEB)) ROM:33EB _END: .dw 1A77h ; Бейсик оператор END (токен 236 (&hEC)) ROM:33ED _VPOKE: .dw 1A8Ch ; Бейсик оператор VPOKE (токен 237 (&hED)) ROM:33EF _LET: .dw 710h ; Бейсик оператор LET (токен 238 (&hEE)) ROM:33F1 _BASE: .dw 1D21h ; Бейсик оператор BASE (токен 239 (&hEF)) ROM:33F3 _COLOR: .dw 1A00h ; Бейсик оператор COLOR (токен 240 (&hF0)) ROM:33F5 _CONT: .dw 617h ; Бейсик оператор CONT (токен 241 (&hF1)) ROM:33F7 _REM_2: .dw 6FBh ; Бейсик оператор REM ROM:33F7 ; Внимание! Точка входа не может быть отмечена в дизассемблерном листинге, т. к. указывает в середину инструкции опреатора DATA! ROM:33F9 .db 0B3h ROM:33FA .db 16h ROM:33FB .db 0AFh ROM:33FC .db 77h ; w ROM:33FD .db 23h ROM:33FE .db 77h ; w ROM:33FF .db 3Dh ; = ROM:3400 ROM:3400 ; =============== S U B R O U T I N E ======================================= ROM:3400 ROM:3400 ; Подпрограмма обработки ленточных команд SAVE, LOAD и CSAVE, CLOAD и BSAVE, BLOAD ROM:3400 ROM:3400 SALOTR: ; CODE XREF: ROM:1891p ROM:3400 ; ROM:loc_18B8p ROM:3400 ROM:3400 ; FUNCTION CHUNK AT ROM:34AD SIZE 00000009 BYTES ROM:3400 ; FUNCTION CHUNK AT ROM:34CA SIZE 00000071 BYTES ROM:3400 ; FUNCTION CHUNK AT ROM:35A5 SIZE 0000001F BYTES ROM:3400 ROM:3400 inr a ROM:3401 push h ROM:3402 push psw ROM:3403 push b ROM:3404 push d ROM:3405 lxi b, 6 ROM:3408 lxi d, PSETX ; Координата X команды PSET в виде байта ROM:340B lxi h, STRNL ; Адрес строки выводимой на печать подпрограммой STRPRN ROM:340E call VRAM2RAM ; BC=счетчик, DE=адрес приема, HL=адрес источника ROM:340E ; (пересылка VRAM -> RAM) ROM:3411 lxi h, SALOTMP ; Временная переменная подпрограммы работы с лентой SALOTR ROM:3414 xra a ROM:3415 sta SALOTMP2 ; Временная переменная SALOTR ROM:3418 cmp m ROM:3419 jnz loc_3428 ROM:341C lxi h, 1911h ROM:341F shld SALOTMP ; Временная переменная подпрограммы работы с лентой SALOTR ROM:3422 lxi h, 2F31h ROM:3425 shld SALOTMP3 ; Временная переменная подпрограммы работы с лентой SALOTR ROM:3428 ROM:3428 loc_3428: ; CODE XREF: SALOTR+19j ROM:3428 pop d ROM:3429 pop b ROM:342A pop psw ROM:342B pop h ROM:342C ora a ROM:342D jp loc_34CA ROM:3430 ani 3 ROM:3432 jz loc_3469 ROM:3435 cpi 2 ROM:3437 jz loc_34AD ROM:343A mvi a, 0D0h ; '¦' ROM:343C push h ROM:343D push d ROM:343E call SALOTR2 ; Подпрограмма обработки ленточных команд. Дополнительная точка входа. ROM:3441 dad b ROM:3442 inx h ROM:3443 shld SL1 ; Переменная SALOTR ROM:3446 pop h ROM:3447 shld SL2 ; Переменная SALOTR ROM:344A pop h ROM:344B shld FMA ; Адрес, использующийся при заполнении памяти в подпрограмме FILLMEMA ROM:344E jc loc_34C6 ROM:3451 push b ROM:3452 push h ROM:3453 lxi h, FMA ; Адрес, использующийся при заполнении памяти в подпрограмме FILLMEMA ROM:3456 lxi b, 6 ROM:3459 xra a ROM:345A call SLTR ; Подпрограмма работы с лентой ROM:345D pop h ROM:345E pop b ROM:345F jc loc_34C6 ROM:3462 inx b ROM:3463 call SLTR2 ; Подпрограмма работы с лентой ROM:3466 jmp loc_34C3 ROM:3469 ; --------------------------------------------------------------------------- ROM:3469 ROM:3469 loc_3469: ; CODE XREF: SALOTR+32j ROM:3469 mvi a, 0D3h ; 'L' ROM:346B call SALOTR2 ; Подпрограмма обработки ленточных команд. Дополнительная точка входа. ROM:346E jc loc_34C6 ROM:3471 xra a ROM:3472 call FILLMEMA ; Заполняет константой взятой из A облать памяти длиной 0Ah, начиная с адреса FMA ROM:3475 call SLTR ; Подпрограмма работы с лентой ROM:3478 jc loc_34C6 ROM:347B lxi h, FMA ; Адрес, использующийся при заполнении памяти в подпрограмме FILLMEMA ROM:347E lxi b, 0Ah ROM:3481 call SLTR2 ; Подпрограмма работы с лентой ROM:3484 jc loc_34C6 ROM:3487 xra a ROM:3488 call SLTR3 ; Подпрограмма работы с лентой ROM:348B jmp loc_34C3 ROM:348B ; End of function SALOTR ROM:348B ROM:348E ROM:348E ; =============== S U B R O U T I N E ======================================= ROM:348E ROM:348E ; Заполняет константой взятой из A облать памяти длиной 0Ah, начиная с адреса FMA ROM:348E ROM:348E FILLMEMA: ; CODE XREF: SALOTR+72p ROM:348E ; SALOTR2+2p ROM:348E push h ROM:348F push b ROM:3490 lxi h, FMA ; Адрес, использующийся при заполнении памяти в подпрограмме FILLMEMA ROM:3493 lxi b, 0Ah ROM:3496 call FILLAREA ; A=константа, BC=счетчик, HL=адрес (заполнение области константой) ROM:3499 pop b ROM:349A pop h ROM:349B ret ROM:349B ; End of function FILLMEMA ROM:349B ROM:349C ROM:349C ; =============== S U B R O U T I N E ======================================= ROM:349C ROM:349C ; Подпрограмма обработки ленточных команд. Дополнительная точка входа. ROM:349C ROM:349C SALOTR2: ; CODE XREF: SALOTR+3Ep ROM:349C ; SALOTR+6Bp ... ROM:349C push h ROM:349D push b ROM:349E call FILLMEMA ; Заполняет константой взятой из A облать памяти длиной 0Ah, начиная с адреса FMA ROM:34A1 lxi h, FMA ; Адрес, использующийся при заполнении памяти в подпрограмме FILLMEMA ROM:34A4 lxi b, 10h ROM:34A7 call SLTR ; Подпрограмма работы с лентой ROM:34AA pop b ROM:34AB pop h ROM:34AC ret ROM:34AC ; End of function SALOTR2 ROM:34AC ROM:34AD ; --------------------------------------------------------------------------- ROM:34AD ; START OF FUNCTION CHUNK FOR SALOTR ROM:34AD ROM:34AD loc_34AD: ; CODE XREF: SALOTR+37j ROM:34AD mvi a, 0EAh ; 'ъ' ROM:34AF call SALOTR2 ; Подпрограмма обработки ленточных команд. Дополнительная точка входа. ROM:34B2 jc loc_34C6 ROM:34B5 ret ROM:34B5 ; END OF FUNCTION CHUNK FOR SALOTR ROM:34B6 ROM:34B6 ; =============== S U B R O U T I N E ======================================= ROM:34B6 ROM:34B6 ; Подпрограмма редактора. Вызывается из EDIT1 и OUTCHAR. ROM:34B6 ROM:34B6 EDITTR1: ; CODE XREF: OUTCHAR+1AB1p ROM:34B6 ; EDIT1+2Ap ROM:34B6 lxi b, 100h ROM:34B9 lxi h, IOBUF ; Буфер ввода-вывода (диск, кассеты) ROM:34BC xra a ROM:34BD call SLTR ; Подпрограмма работы с лентой ROM:34C0 jc loc_34C6 ROM:34C3 ROM:34C3 loc_34C3: ; CODE XREF: SALOTR+66j ROM:34C3 ; SALOTR+8Bj ROM:34C3 call EDITTR3 ; Подпрограмма редактора. ROM:34C6 ROM:34C6 loc_34C6: ; CODE XREF: SALOTR+4Ej ROM:34C6 ; SALOTR+5Fj ... ROM:34C6 call MOTORON ; Включает мотор магнитофона (бит 5 порта 82h) ROM:34C9 ret ROM:34C9 ; End of function EDITTR1 ROM:34C9 ROM:34CA ; --------------------------------------------------------------------------- ROM:34CA ; START OF FUNCTION CHUNK FOR SALOTR ROM:34CA ROM:34CA loc_34CA: ; CODE XREF: SALOTR+2Dj ROM:34CA ani 3 ROM:34CC jz loc_3505 ROM:34CF cpi 2 ROM:34D1 jz loc_35A5 ROM:34D4 mvi a, 0D0h ; '¦' ROM:34D6 call TAPETR ; Подпрограмма работы с лентой ROM:34D9 jc loc_34C6 ROM:34DC lxi h, FMA ; Адрес, использующийся при заполнении памяти в подпрограмме FILLMEMA ROM:34DF lxi b, 6 ROM:34E2 call TAPETR2 ; Подпрограмма работы с лентой ROM:34E5 jc loc_34C6 ROM:34E8 lhld SL1 ; Переменная SALOTR ROM:34EB xchg ROM:34EC lhld FMA ; Адрес, использующийся при заполнении памяти в подпрограмме FILLMEMA ROM:34EF mov a, h ROM:34F0 cma ROM:34F1 mov h, a ROM:34F2 mov a, l ROM:34F3 cma ROM:34F4 mov l, a ROM:34F5 inx h ROM:34F6 dad d ROM:34F7 mov b, h ROM:34F8 mov c, l ROM:34F9 lhld FMA ; Адрес, использующийся при заполнении памяти в подпрограмме FILLMEMA ROM:34FC call TAPEIN ; Ввод с ленты ROM:34FF lhld SL2 ; Переменная SALOTR ROM:3502 jmp loc_34C6 ROM:3505 ; --------------------------------------------------------------------------- ROM:3505 ROM:3505 loc_3505: ; CODE XREF: SALOTR+CCj ROM:3505 mvi a, 0D3h ; 'L' ROM:3507 push h ROM:3508 call TAPETR ; Подпрограмма работы с лентой ROM:350B pop h ROM:350C jc loc_34C6 ROM:350F push h ROM:3510 call INMAG ; Ввод с магнитофона (бит 7 порта 82) ROM:3513 pop h ROM:3514 jc loc_34C6 ROM:3517 ROM:3517 loc_3517: ; CODE XREF: SALOTR+12Fj ROM:3517 mvi b, 0Bh ROM:3519 ROM:3519 loc_3519: ; CODE XREF: SALOTR+135j ROM:3519 push h ROM:351A push b ROM:351B call INMAGTR ; Обработка ввода с магнитофона (BIPROC) ROM:351E pop b ROM:351F pop h ROM:3520 jc loc_34C6 ROM:3523 cpi 0 ROM:3525 jz loc_3532 ROM:3528 call VERIFYERR ; Проверяет записанное на кассету, сообщает об ошибке, если надо ROM:352B jc loc_34C6 ROM:352E inx h ROM:352F jmp loc_3517 ROM:3532 ; --------------------------------------------------------------------------- ROM:3532 ROM:3532 loc_3532: ; CODE XREF: SALOTR+125j ROM:3532 mov m, a ROM:3533 inx h ROM:3534 dcr b ROM:3535 jnz loc_3519 ROM:3538 jmp loc_34C6 ROM:3538 ; END OF FUNCTION CHUNK FOR SALOTR ROM:353B ROM:353B ; =============== S U B R O U T I N E ======================================= ROM:353B ROM:353B ; Подпрограмма работы с лентой ROM:353B ROM:353B TAPETR: ; CODE XREF: SALOTR+D6p ROM:353B ; SALOTR+108p ... ROM:353B ROM:353B ; FUNCTION CHUNK AT ROM:355C SIZE 0000003B BYTES ROM:353B ROM:353B push psw ROM:353C ROM:353C loc_353C: ; CODE XREF: TAPETR+59j ROM:353C lxi b, 10h ROM:353F lxi h, FMA ; Адрес, использующийся при заполнении памяти в подпрограмме FILLMEMA ROM:3542 call TAPETR2 ; Подпрограмма работы с лентой ROM:3545 jnc loc_355C ROM:3548 pop b ROM:3549 ret ROM:3549 ; End of function TAPETR ROM:3549 ROM:354A ROM:354A ; =============== S U B R O U T I N E ======================================= ROM:354A ROM:354A ; Подпрограмма работы с лентой ROM:354A ROM:354A TAPETR2: ; CODE XREF: SALOTR+E2p ROM:354A ; TAPETR+7p ROM:354A lda CASCMP ; Флаг сравнения ROM:354D push psw ROM:354E mvi a, 0FFh ROM:3550 sta CASCMP ; Флаг сравнения ROM:3553 call TAPETR3 ; Подпрограмма работы с лентой ROM:3556 pop b ROM:3557 mov a, b ROM:3558 sta CASCMP ; Флаг сравнения ROM:355B ret ROM:355B ; End of function TAPETR2 ROM:355B ROM:355C ; --------------------------------------------------------------------------- ROM:355C ; START OF FUNCTION CHUNK FOR TAPETR ROM:355C ROM:355C loc_355C: ; CODE XREF: TAPETR+Aj ROM:355C mvi c, 0Ah ROM:355E lxi h, FMA ; Адрес, использующийся при заполнении памяти в подпрограмме FILLMEMA ROM:3561 pop psw ROM:3562 ROM:3562 loc_3562: ; CODE XREF: TAPETR+2Dj ROM:3562 cmp m ROM:3563 jnz TAPETR ; Подпрограмма работы с лентой ROM:3566 inx h ROM:3567 dcr c ROM:3568 jnz loc_3562 ROM:356B push psw ROM:356C mvi b, 6 ROM:356E lxi d, PSETX ; Координата X команды PSET в виде байта ROM:3571 ROM:3571 loc_3571: ; CODE XREF: TAPETR+3Ej ROM:3571 ldax d ROM:3572 cmp m ROM:3573 jnz loc_3589 ROM:3576 inx h ROM:3577 inx d ROM:3578 dcr b ROM:3579 jnz loc_3571 ROM:357C pop d ROM:357D lxi h, aFound ; "Found:" ROM:3580 mvi a, 2 ROM:3582 call EDIT ; A=флажки, HL=адрес, D=строка курсора, E=позиция курсора ROM:3582 ; (A=0 редактирование ROM:3582 ; A=1 установка курсора ROM:3582 ; A=2 вывод текста на экран с текущего положения курсора ROM:3582 ; A=3 установка курсора и вывод текста ROM:3582 ; A=4 вывод строк) ROM:3585 call STRPRN ; Печать строки с переводом каретки, адрес строки расположен по STRNL ROM:3588 ret ROM:3589 ; --------------------------------------------------------------------------- ROM:3589 ROM:3589 loc_3589: ; CODE XREF: TAPETR+38j ROM:3589 lxi h, aSkip ; "Skip :" ROM:358C mvi a, 2 ROM:358E call EDIT ; A=флажки, HL=адрес, D=строка курсора, E=позиция курсора ROM:358E ; (A=0 редактирование ROM:358E ; A=1 установка курсора ROM:358E ; A=2 вывод текста на экран с текущего положения курсора ROM:358E ; A=3 установка курсора и вывод текста ROM:358E ; A=4 вывод строк) ROM:3591 call STRPRN ; Печать строки с переводом каретки, адрес строки расположен по STRNL ROM:3594 jmp loc_353C ROM:3594 ; END OF FUNCTION CHUNK FOR TAPETR ROM:3597 ROM:3597 ; =============== S U B R O U T I N E ======================================= ROM:3597 ROM:3597 ; Печать строки с переводом каретки, адрес строки расположен по STRNL ROM:3597 ROM:3597 STRPRN: ; CODE XREF: TAPETR+4Ap ROM:3597 ; TAPETR+56p ROM:3597 mvi a, 2 ROM:3599 lxi h, STRNL ; Адрес строки выводимой на печать подпрограммой STRPRN ROM:359C call EDIT ; A=флажки, HL=адрес, D=строка курсора, E=позиция курсора ROM:359C ; (A=0 редактирование ROM:359C ; A=1 установка курсора ROM:359C ; A=2 вывод текста на экран с текущего положения курсора ROM:359C ; A=3 установка курсора и вывод текста ROM:359C ; A=4 вывод строк) ROM:359F mvi a, 0Dh ROM:35A1 call SYMSCR ; A=символ (вывод символа на экран в текущую позицию курсора). ROM:35A4 ret ROM:35A4 ; End of function STRPRN ROM:35A4 ROM:35A5 ; --------------------------------------------------------------------------- ROM:35A5 ; START OF FUNCTION CHUNK FOR SALOTR ROM:35A5 ROM:35A5 loc_35A5: ; CODE XREF: SALOTR+D1j ROM:35A5 push h ROM:35A6 mvi a, 0EAh ; 'ъ' ROM:35A8 call TAPETR ; Подпрограмма работы с лентой ROM:35AB pop h ROM:35AC jc loc_34C6 ROM:35AF ROM:35AF loc_35AF: ; CODE XREF: SALOTR+1BEj ROM:35AF lxi b, 100h ROM:35B2 call TAPETR3 ; Подпрограмма работы с лентой ROM:35B5 call MOTORON ; Включает мотор магнитофона (бит 5 порта 82h) ROM:35B8 rc ROM:35B9 dcx h ROM:35BA mvi a, 1Ah ROM:35BC cmp m ROM:35BD inx h ROM:35BE jnz loc_35AF ROM:35C1 jmp loc_34C6 ROM:35C1 ; END OF FUNCTION CHUNK FOR SALOTR ROM:35C4 ROM:35C4 ; =============== S U B R O U T I N E ======================================= ROM:35C4 ROM:35C4 ; Подпрограмма работы с лентой ROM:35C4 ROM:35C4 TAPETR3: ; CODE XREF: TAPETR2+9p ROM:35C4 ; SALOTR+1B2p ROM:35C4 push h ROM:35C5 push b ROM:35C6 call INMAG ; Ввод с магнитофона (бит 7 порта 82) ROM:35C9 pop b ROM:35CA pop h ROM:35CB rc ROM:35CB ; End of function TAPETR3 ROM:35CB ROM:35CC ROM:35CC ; =============== S U B R O U T I N E ======================================= ROM:35CC ROM:35CC ; Ввод с ленты ROM:35CC ROM:35CC TAPEIN: ; CODE XREF: SALOTR+FCp ROM:35CC ; TAPEIN+Fj ROM:35CC push h ROM:35CD push b ROM:35CE call INMAGTR ; Обработка ввода с магнитофона (BIPROC) ROM:35D1 pop b ROM:35D2 pop h ROM:35D3 call VERIFYERR ; Проверяет записанное на кассету, сообщает об ошибке, если надо ROM:35D6 rc ROM:35D7 dcx b ROM:35D8 inx h ROM:35D9 mov a, b ROM:35DA ora c ROM:35DB jnz TAPEIN ; Ввод с ленты ROM:35DE ret ROM:35DE ; End of function TAPEIN ROM:35DE ROM:35DF ROM:35DF ; =============== S U B R O U T I N E ======================================= ROM:35DF ROM:35DF ; Проверяет записанное на кассету, сообщает об ошибке, если надо ROM:35DF ROM:35DF VERIFYERR: ; CODE XREF: SALOTR+128p ROM:35DF ; TAPEIN+7p ROM:35DF push psw ROM:35E0 lda CASCMP ; Флаг сравнения ROM:35E3 ora a ROM:35E4 jnz loc_35F8 ROM:35E7 pop psw ROM:35E8 cmp m ROM:35E9 jz locret_35FA ROM:35EC push psw ROM:35ED lxi h, aVerifyError ; "Verify error\r" ROM:35F0 mvi a, 2 ROM:35F2 call EDIT ; A=флажки, HL=адрес, D=строка курсора, E=позиция курсора ROM:35F2 ; (A=0 редактирование ROM:35F2 ; A=1 установка курсора ROM:35F2 ; A=2 вывод текста на экран с текущего положения курсора ROM:35F2 ; A=3 установка курсора и вывод текста ROM:35F2 ; A=4 вывод строк) ROM:35F5 pop psw ROM:35F6 stc ROM:35F7 ret ROM:35F8 ; --------------------------------------------------------------------------- ROM:35F8 ROM:35F8 loc_35F8: ; CODE XREF: VERIFYERR+5j ROM:35F8 pop psw ROM:35F9 mov m, a ROM:35FA ROM:35FA locret_35FA: ; CODE XREF: VERIFYERR+Aj ROM:35FA ret ROM:35FA ; End of function VERIFYERR ROM:35FA ROM:35FB ROM:35FB ; =============== S U B R O U T I N E ======================================= ROM:35FB ROM:35FB ; Подпрограмма работы с лентой ROM:35FB ROM:35FB SLTR: ; CODE XREF: SALOTR+5Ap ROM:35FB ; SALOTR+75p ... ROM:35FB push h ROM:35FC push b ROM:35FD call MOTOROFF ; Выключает мотор магнитофона (бит 5 порта 82h) ROM:3600 pop b ROM:3601 pop h ROM:3602 ROM:3602 SLTR2: ; CODE XREF: SALOTR+63p ROM:3602 ; SALOTR+81p ... ROM:3602 push b ; Подпрограмма работы с лентой ROM:3603 push h ROM:3604 mov a, m ROM:3605 call SLTR3 ; Подпрограмма работы с лентой ROM:3608 pop h ROM:3609 pop b ROM:360A rc ROM:360B inx h ROM:360C dcx b ROM:360D mov a, b ROM:360E ora c ROM:360F jnz SLTR2 ; Подпрограмма работы с лентой ROM:3612 ret ROM:3612 ; End of function SLTR ROM:3612 ROM:3613 ROM:3613 ; =============== S U B R O U T I N E ======================================= ROM:3613 ROM:3613 ; Подпрограмма редактора. ROM:3613 ROM:3613 EDITTR3: ; CODE XREF: EDITTR1:loc_34C3p ROM:3613 push b ROM:3614 push psw ROM:3615 lxi b, 0 ROM:3618 ROM:3618 loc_3618: ; CODE XREF: EDITTR3+8j ROM:3618 dcx b ROM:3619 mov a, b ROM:361A ora c ROM:361B jnz loc_3618 ROM:361E pop psw ROM:361F pop b ROM:3620 ret ROM:3620 ; End of function EDITTR3 ROM:3620 ROM:3621 ROM:3621 ; =============== S U B R O U T I N E ======================================= ROM:3621 ROM:3621 ; Включает мотор магнитофона (бит 5 порта 82h) ROM:3621 ROM:3621 MOTORON: ; CODE XREF: EDITTR1:loc_34C6p ROM:3621 ; SALOTR+1B5p ROM:3621 push psw ROM:3622 in 82h ROM:3624 xri 10h ROM:3626 out 82h ROM:3628 pop psw ROM:3629 ei ROM:362A ret ROM:362A ; End of function MOTORON ROM:362A ROM:362B ROM:362B ; =============== S U B R O U T I N E ======================================= ROM:362B ROM:362B ; Выключает мотор магнитофона (бит 5 порта 82h) ROM:362B ROM:362B MOTOROFF: ; CODE XREF: SLTR+2p ROM:362B ROM:362B ; FUNCTION CHUNK AT ROM:3772 SIZE 0000000A BYTES ROM:362B ROM:362B ora a ROM:362C push psw ROM:362D in 82h ROM:362F ori 10h ROM:3631 out 82h ROM:3633 lxi h, 0 ROM:3636 ROM:3636 TPROC: ; CODE XREF: MOTOROFF+Ej ROM:3636 dcx h ROM:3637 mov a, h ROM:3638 ora l ROM:3639 jnz TPROC ROM:363C pop psw ROM:363D mvi a, 10h ROM:363F jz loc_3644 ROM:3642 add a ROM:3643 add a ROM:3644 ROM:3644 loc_3644: ; CODE XREF: MOTOROFF+14j ROM:3644 mov b, a ROM:3645 mvi c, 0 ROM:3647 di ROM:3648 ROM:3648 TOPROC: ; CODE XREF: MOTOROFF+26j ROM:3648 call SLTR6 ; Подпрограмма работы с лентой ROM:364B call NULLSUB ; Пустая процедура ROM:364E dcx b ROM:364F mov a, b ROM:3650 ora c ROM:3651 jnz TOPROC ROM:3654 call INMAG2 ; Ввод с магнитофона ROM:3657 jc loc_3772 ROM:365A ret ROM:365A ; End of function MOTOROFF ROM:365A ROM:365B ROM:365B ; =============== S U B R O U T I N E ======================================= ROM:365B ROM:365B ; Подпрограмма работы с лентой ROM:365B ROM:365B SLTR3: ; CODE XREF: SALOTR+88p ROM:365B ; SLTR+Ap ROM:365B lhld SALOTMP3 ; Временная переменная подпрограммы работы с лентой SALOTR ROM:365E ROM:365E BOPROC: ROM:365E push psw ROM:365F mov a, l ROM:3660 sui 0Fh ROM:3662 mov l, a ROM:3663 call OUTMAG ; Вывод на магнитофон (бит 7 порта 82) ROM:3666 pop psw ROM:3667 mvi b, 8 ROM:3669 ROM:3669 loc_3669: ; CODE XREF: SLTR3+16j ROM:3669 rrc ROM:366A cc SLTR5 ; Подпрограмма работы с лентой ROM:366D cnc SLTR4 ; Подпрограмма работы с лентой ROM:3670 dcr b ROM:3671 jnz loc_3669 ROM:3674 call SLTR5 ; Подпрограмма работы с лентой ROM:3677 call SLTR5 ; Подпрограмма работы с лентой ROM:367A call INMAG2 ; Ввод с магнитофона ROM:367D jc loc_3772 ROM:3680 ret ROM:3680 ; End of function SLTR3 ROM:3680 ROM:3681 ROM:3681 ; =============== S U B R O U T I N E ======================================= ROM:3681 ROM:3681 ; Подпрограмма работы с лентой ROM:3681 ROM:3681 SLTR4: ; CODE XREF: SLTR3+12p ROM:3681 lhld SALOTMP3 ; Временная переменная подпрограммы работы с лентой SALOTR ROM:3684 call OUTMAG ; Вывод на магнитофон (бит 7 порта 82) ROM:3684 ; End of function SLTR4 ROM:3684 ROM:3687 ROM:3687 ; =============== S U B R O U T I N E ======================================= ROM:3687 ROM:3687 ; Пустая процедура ROM:3687 ROM:3687 NULLSUB: ; CODE XREF: MOTOROFF+20p ROM:3687 ret ROM:3687 ; End of function NULLSUB ROM:3687 ROM:3688 ROM:3688 ; =============== S U B R O U T I N E ======================================= ROM:3688 ROM:3688 ; Подпрограмма работы с лентой ROM:3688 ROM:3688 SLTR5: ; CODE XREF: SLTR3+Fp ROM:3688 ; SLTR3+19p ... ROM:3688 call SLTR6 ; Подпрограмма работы с лентой ROM:368B xthl ROM:368C xthl ROM:368D nop ROM:368E nop ROM:368F call SLTR6 ; Подпрограмма работы с лентой ROM:3692 ret ROM:3692 ; End of function SLTR5 ROM:3692 ROM:3693 ROM:3693 ; =============== S U B R O U T I N E ======================================= ROM:3693 ROM:3693 ; Подпрограмма работы с лентой ROM:3693 ROM:3693 SLTR6: ; CODE XREF: MOTOROFF:TOPROCp ROM:3693 ; SLTR5p ... ROM:3693 lhld SALOTMP ; Временная переменная подпрограммы работы с лентой SALOTR ROM:3693 ; End of function SLTR6 ROM:3693 ROM:3696 ROM:3696 ; =============== S U B R O U T I N E ======================================= ROM:3696 ROM:3696 ; Вывод на магнитофон (бит 7 порта 82) ROM:3696 ROM:3696 OUTMAG: ; CODE XREF: SLTR3+8p ROM:3696 ; SLTR4+3p ROM:3696 push psw ROM:3697 ROM:3697 loc_3697: ; CODE XREF: OUTMAG+2j ROM:3697 dcr l ROM:3698 jnz loc_3697 ROM:369B in 82h ROM:369D xri 40h ROM:369F out 82h ROM:36A1 ROM:36A1 loc_36A1: ; CODE XREF: OUTMAG+Cj ROM:36A1 dcr h ROM:36A2 jnz loc_36A1 ROM:36A5 in 82h ROM:36A7 xri 40h ROM:36A9 out 82h ROM:36AB pop psw ROM:36AC ret ROM:36AC ; End of function OUTMAG ROM:36AC ROM:36AD ROM:36AD ; =============== S U B R O U T I N E ======================================= ROM:36AD ROM:36AD ; Ввод с магнитофона ROM:36AD ROM:36AD INMAG3: ; CODE XREF: INMAG+1Dp ROM:36AD ; INMAGTR+9p ... ROM:36AD mvi e, 0 ROM:36AF ROM:36AF loc_36AF: ; CODE XREF: INMAG3+Ej ROM:36AF mov a, d ROM:36B0 cma ROM:36B1 mov d, a ROM:36B2 ROM:36B2 loc_36B2: ; CODE XREF: INMAG3+Aj ROM:36B2 in 8Dh ROM:36B4 inr e ROM:36B5 rz ROM:36B6 xra d ROM:36B7 jp loc_36B2 ROM:36BA dcr c ROM:36BB jnz loc_36AF ROM:36BE ora a ROM:36BF mov a, e ROM:36C0 ret ROM:36C0 ; End of function INMAG3 ROM:36C0 ROM:36C1 ROM:36C1 ; =============== S U B R O U T I N E ======================================= ROM:36C1 ROM:36C1 ; Ввод с магнитофона (бит 7 порта 82) ROM:36C1 ROM:36C1 INMAG: ; CODE XREF: SALOTR+110p ROM:36C1 ; TAPETR3+2p ROM:36C1 di ROM:36C2 in 82h ROM:36C4 ori 10h ROM:36C6 ani 0BFh ROM:36C8 out 82h ROM:36CA ROM:36CA TIPROC: ROM:36CA push h ROM:36CB ROM:36CB loc_36CB: ; CODE XREF: INMAG+20j ROM:36CB ; INMAG+29j ROM:36CB pop h ROM:36CC call INMAG2 ; Ввод с магнитофона ROM:36CF jc loc_3756 ROM:36D2 lxi h, 400h ROM:36D5 push h ROM:36D6 lxi h, 0 ROM:36D9 shld INMAGTMP ; Временная переменна INMAG ROM:36DC ROM:36DC loc_36DC: ; CODE XREF: INMAG+36j ROM:36DC mvi c, 4 ROM:36DE call INMAG3 ; Ввод с магнитофона ROM:36E1 jz loc_36CB ROM:36E4 adi 2 ROM:36E6 ani 0F0h ROM:36E8 cmp b ROM:36E9 mov b, a ROM:36EA jnz loc_36CB ROM:36ED mov a, d ROM:36EE mvi d, 0 ROM:36F0 dad d ROM:36F1 xthl ROM:36F2 mov d, a ROM:36F3 dcx h ROM:36F4 mov a, h ROM:36F5 ora l ROM:36F6 xthl ROM:36F7 jnz loc_36DC ROM:36FA pop b ROM:36FB mov a, h ROM:36FC inr a ROM:36FD rrc ROM:36FE rrc ROM:36FF rrc ROM:3700 ani 1Fh ROM:3702 mov h, a ROM:3703 rar ROM:3704 mov l, a ROM:3705 shld INMAGTMP2 ; Временная переменна INMAG ROM:3708 add h ROM:3709 inr a ROM:370A sta INMAGTMP3 ; Временная переменна INMAG ROM:370D ret ROM:370D ; End of function INMAG ROM:370D ROM:370E ROM:370E ; =============== S U B R O U T I N E ======================================= ROM:370E ROM:370E ; Обработка ввода с магнитофона (BIPROC) ROM:370E ROM:370E INMAGTR: ; CODE XREF: SALOTR+11Bp ROM:370E ; TAPEIN+2p ROM:370E lda INMAGTMP3 ; Временная переменна INMAG ROM:3711 mov b, a ROM:3712 lhld INMAGTMP2 ; Временная переменна INMAG ROM:3715 ROM:3715 loc_3715: ; CODE XREF: INMAGTR+10j ROM:3715 ; INMAGTR+18j ROM:3715 mvi c, 1 ROM:3717 call INMAG3 ; Ввод с магнитофона ROM:371A jz loc_3756 ROM:371D cmp h ROM:371E jc loc_3715 ROM:3721 inr c ROM:3722 call INMAG3 ; Ввод с магнитофона ROM:3725 cmp l ROM:3726 jc loc_3715 ROM:3729 lxi h, 8 ROM:372C ROM:372C loc_372C: ; CODE XREF: INMAGTR+3Aj ROM:372C mvi c, 2 ROM:372E call INMAG3 ; Ввод с магнитофона ROM:3731 jz loc_3772 ROM:3734 cmp b ROM:3735 jnc loc_3744 ROM:3738 mvi c, 2 ROM:373A call INMAG3 ; Ввод с магнитофона ROM:373D jz loc_3772 ROM:3740 cmp b ROM:3741 jnc loc_3772 ROM:3744 ROM:3744 loc_3744: ; CODE XREF: INMAGTR+27j ROM:3744 mov a, h ROM:3745 rar ROM:3746 mov h, a ROM:3747 dcr l ROM:3748 jnz loc_372C ROM:374B lxi d, INMAGTMP ; Временная переменна INMAG ROM:374E ldax d ROM:374F add h ROM:3750 stax d ROM:3751 call INMAG2 ; Ввод с магнитофона ROM:3754 mov a, h ROM:3755 rnc ROM:3756 ROM:3756 loc_3756: ; CODE XREF: INMAG+Ej ROM:3756 ; INMAGTR+Cj ROM:3756 jmp loc_3772 ROM:3756 ; End of function INMAGTR ROM:3756 ROM:3759 ROM:3759 ; =============== S U B R O U T I N E ======================================= ROM:3759 ROM:3759 ; Ввод с магнитофона ROM:3759 ROM:3759 INMAG2: ; CODE XREF: MOTOROFF+29p ROM:3759 ; SLTR3+1Fp ... ROM:3759 in 82h ROM:375B ani 0F0h ROM:375D ori 6 ROM:375F out 82h ROM:3761 in 81h ROM:3763 ani 2 ROM:3765 rnz ROM:3766 in 82h ROM:3768 inr a ROM:3769 out 82h ROM:376B in 81h ROM:376D ani 10h ROM:376F rnz ROM:3770 stc ROM:3771 ret ROM:3771 ; End of function INMAG2 ROM:3771 ROM:3772 ; --------------------------------------------------------------------------- ROM:3772 ; START OF FUNCTION CHUNK FOR MOTOROFF ROM:3772 ROM:3772 loc_3772: ; CODE XREF: MOTOROFF+2Cj ROM:3772 ; SLTR3+22j ... ROM:3772 mvi a, 2 ROM:3774 lxi h, aDeviceIOError ; "Device I/O error\r" ROM:3777 call EDIT ; A=флажки, HL=адрес, D=строка курсора, E=позиция курсора ROM:3777 ; (A=0 редактирование ROM:3777 ; A=1 установка курсора ROM:3777 ; A=2 вывод текста на экран с текущего положения курсора ROM:3777 ; A=3 установка курсора и вывод текста ROM:3777 ; A=4 вывод строк) ROM:377A stc ROM:377B ret ROM:377B ; END OF FUNCTION CHUNK FOR MOTOROFF ROM:377B ; --------------------------------------------------------------------------- ROM:377C aDeviceIOError: .text "Device I/O error" ; DATA XREF: MOTOROFF+149o ROM:377C .db 0Dh ROM:377C .db 0 ROM:378E aSkip: .text "Skip :" ; DATA XREF: TAPETR:loc_3589o ROM:378E .db 0 ROM:3795 aFound: .text "Found:" ; DATA XREF: TAPETR+42o ROM:3795 .db 0 ROM:379C aVerifyError: .text "Verify error" ; DATA XREF: VERIFYERR+Eo ROM:379C .db 0Dh ROM:379C .db 0 ROM:37AA .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:37AA .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:37AA .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:37AA .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:37AA .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:37AA .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:37AA .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:37AA .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:37AA .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ROM:37AA .db 0FFh, 0FFh, 0FFh, 0FFh, 0FCh ROM:3800 ZNAKGEN: .block 1 ; DATA XREF: SETMODE2+40o ROM:3800 ; SYMSCR2+D7o ROM:3800 ; end of 'ROM' ; Начало знакогенератора. ROM:3800 RAM:F000 ; =========================================================================== RAM:F000 RAM:F000 ; Segment type: Regular RAM:F000 .org 0F000h RAM:F000 .block 2EFh RAM:F2EF unk_F2EF: .block 1 RAM:F2F0 .block 345h RAM:F635 ENBASSTK: .block 100h ; Конец стека Бейсик интерпретатора RAM:F735 BGBASSTK: .block 1 ; Начало стека Бейсик интерпретатора RAM:F736 ENSTRAR: .block 0C9h ; Строковая область 200 байт. RAM:F736 ; (размер устанавливается оператором CLEAR) RAM:F7FF BGSTRAR: .block 1 ; DATA XREF: START+2954o RAM:F7FF ; По этому адресу (&hF7FF) инициализируется SP при INIT RAM:F800 ; --------------------------------------------------------------------------- RAM:F800 RAM:F800 VRAM2RAM_: ; DATA XREF: START+2961o RAM:F800 di ; Подпрограмма пересылки из VRAM в RAM RAM:F801 call RAMON ; Подпрограмма включения RAM RAM:F804 RAM:F804 loc_F804: ; CODE XREF: RAM:F80Ej RAM:F804 mov a, b RAM:F805 ora c RAM:F806 mov a, m RAM:F807 jz loc_F811 RAM:F80A stax d RAM:F80B inx d RAM:F80C inx h RAM:F80D dcx b RAM:F80E jmp loc_F804 RAM:F811 ; --------------------------------------------------------------------------- RAM:F811 RAM:F811 loc_F811: ; CODE XREF: RAM:F807j RAM:F811 ; RAM:F836j RAM:F811 call MODETR ; Установка режима для VRAM2RAM_ RAM:F814 ei RAM:F815 ret RAM:F816 RAM:F816 ; =============== S U B R O U T I N E ======================================= RAM:F816 RAM:F816 ; Установка режима для VRAM2RAM_ RAM:F816 RAM:F816 MODETR: ; CODE XREF: RAM:loc_F811p RAM:F816 ; RAM:F86Bj RAM:F816 push psw RAM:F817 call loc_F88B RAM:F81A RAM:F81A loc_F81A: ; CODE XREF: RAMON+Aj RAM:F81A out 80h RAM:F81C pop psw RAM:F81D ret RAM:F81D ; End of function MODETR RAM:F81D RAM:F81E ; --------------------------------------------------------------------------- RAM:F81E RAM:F81E ROMON: ; Подпрограмма включения ROM RAM:F81E push psw RAM:F81F mvi a, 0FCh ; '№' RAM:F821 jmp loc_F827 RAM:F824 RAM:F824 ; =============== S U B R O U T I N E ======================================= RAM:F824 RAM:F824 ; Подпрограмма включения RAM RAM:F824 RAM:F824 RAMON: ; CODE XREF: RAM:F801p RAM:F824 ; RAM:F832p ... RAM:F824 push psw RAM:F825 mvi a, 0FFh RAM:F827 RAM:F827 loc_F827: ; CODE XREF: RAM:F821j RAM:F827 push psw RAM:F828 in 80h RAM:F82A sta INTAR+26h ; Рабочая область обработки прерываний RAM:F82D pop psw RAM:F82E jmp loc_F81A RAM:F82E ; End of function RAMON RAM:F82E RAM:F831 ; --------------------------------------------------------------------------- RAM:F831 RAM:F831 VRAMRD: ; Подпрограмма чтения байта из VRAM RAM:F831 di RAM:F832 call RAMON ; Подпрограмма включения RAM RAM:F835 mov a, m RAM:F836 jmp loc_F811 RAM:F839 ; --------------------------------------------------------------------------- RAM:F839 RAM:F839 BASSUB1: ; Подпрограмма Бейсика. RAM:F839 mov a, l ; Используется при FMUL RAM:F83A RAM:F83A loc_F83A: RAM:F83A sui 0 RAM:F83C mov l, a RAM:F83D mov a, h RAM:F83E RAM:F83E loc_F83E: RAM:F83E sbi 0 RAM:F840 mov h, a RAM:F841 mov a, b RAM:F842 RAM:F842 loc_F842: RAM:F842 sbi 0 RAM:F844 mov b, a RAM:F845 RAM:F845 loc_F845: ; DATA XREF: FDIVBYTEN+2Ew RAM:F845 ; FDIVBYTEN+47w ... RAM:F845 mvi a, 0 RAM:F847 sbi 0 RAM:F849 ret RAM:F84A ; --------------------------------------------------------------------------- RAM:F84A out 0 RAM:F84C ret RAM:F84D ; --------------------------------------------------------------------------- RAM:F84D RAM:F84D loc_F84D: RAM:F84D sta loc_F850+1 RAM:F850 RAM:F850 loc_F850: ; DATA XREF: ROM:0FAFw RAM:F850 ; RAM:loc_F84Dw RAM:F850 in 0 RAM:F852 ret RAM:F853 ; --------------------------------------------------------------------------- RAM:F853 RAM:F853 loc_F853: RAM:F853 out 0 RAM:F855 ret RAM:F855 ; --------------------------------------------------------------------------- RAM:F856 JMPNXTWD: .db 0C3h ; + ; Инструкция перехода для rst6 RAM:F857 NEXTWORD: .dw loc_4F9 ; Адрес перехода для RST6 RAM:F859 ; --------------------------------------------------------------------------- RAM:F859 RAM:F859 loc_F859: ; Подпрограмма включения RAM RAM:F859 call RAMON RAM:F85C RAM:F85C loc_F85C: ; CODE XREF: RAM:F868j RAM:F85C mov b, a RAM:F85D sta loc_F861+1 RAM:F860 mov a, m RAM:F861 RAM:F861 loc_F861: ; DATA XREF: RAM:F85Dw RAM:F861 out 0 RAM:F863 inx h RAM:F864 mov a, b RAM:F865 inr a RAM:F866 cpi 0C0h ; 'L' RAM:F868 jnz loc_F85C RAM:F86B jmp MODETR ; Установка режима для VRAM2RAM_ RAM:F86B ; --------------------------------------------------------------------------- RAM:F86E INTCATH: .db 0C9h ; г ; C9 C9 C9 перехват прерывания (надо сюда записать C3 и два байта адреса) RAM:F86F .db 0C9h ; г RAM:F870 .db 0C9h ; г RAM:F871 ; --------------------------------------------------------------------------- RAM:F871 RAM:F871 BASSUB2: ; Подпрограмма Бейсика. RAM:F871 push d ; Используется при FMUL RAM:F872 RAM:F872 loc_F872: RAM:F872 lxi d, 0 RAM:F875 dad d RAM:F876 pop d RAM:F877 RAM:F877 loc_F877: RAM:F877 aci 0 RAM:F879 ret RAM:F87A ; --------------------------------------------------------------------------- RAM:F87A RAM:F87A loc_F87A: ; DATA XREF: ROM:162Eo RAM:F87A ; ROM:1656o RAM:F87A mov d, d RAM:F87B rst 0 ; RST0 = старт. ОЗУ при этом инициализируется, но не очищается. RAM:F87B ; Т. е. если сделать POKE 50000, 255 а потом X=USR(0), то в памяти по адресу 50000 так и останется лежать байт 255. RAM:F87B ; При этом, конечно, рабочие области подлежат инициализации, как и упоминалось. RAM:F87C mov c, a RAM:F87D add b RAM:F87E RAM:F87E loc_F87E: ; Внимание! После вызова CHECKENOUGHVARSPACE идет байт параметра, а не следующая инструкция! RAM:F87E call CHECKENOUGHVARSPACE ; Проверяет, достаточно ли будет памяти при выделении места для C*4 байт начиная с VAR_TOP перед тем как это выделение начнёт затирать стек. RAM:F87E ; (Или область переменных). RAM:F87E ; --------------------------------------------------------------------------- RAM:F881 VARSRCH_: .db 0E9h ; pchl RAM:F882 ; --------------------------------------------------------------------------- RAM:F882 ret RAM:F882 ; --------------------------------------------------------------------------- RAM:F883 .db 52h RAM:F884 .db 4Eh RAM:F885 .db 0C4h RAM:F886 .db 4Ch ; L RAM:F887 .db 4Fh ; O RAM:F888 .db 0C7h RAM:F889 .db 45h RAM:F88A .db 58h RAM:F88B ; --------------------------------------------------------------------------- RAM:F88B RAM:F88B loc_F88B: ; CODE XREF: MODETR+1p RAM:F88B mvi a, 1 RAM:F88D sta MODE1FLG ; Флаги режима 1 RAM:F890 lda INTAR+26h ; Рабочая область обработки прерываний RAM:F893 ret RAM:F893 ; --------------------------------------------------------------------------- RAM:F894 DISKRSRV: .block 5Ch ; Резерв для перехвата обработки дисковых операций RAM:F8F0 STARTFL: .db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; DATA XREF: START+296Do RAM:F8F0 ; Заполняется с этого адреса из &h0205 при старте системы. RAM:F8FA AUTONUM: .dw 0Ah ; Номер AUTO RAM:F8FC AUTOINC: .dw 0Ah ; Инкремент AUTO RAM:F8FE LOADADDR: .dw 4100h ; Адрес загрузки для LOAD RAM:F900 PRMTMP: .db 1 ; Архаичная временная переменная. Нигде не используется. RAM:F901 FPTMP: .db 0 ; Временная переменная для работы с числами с плавающей точкой. RAM:F902 TERMINAL_X: .db 0 ; DATA XREF: OUTCHAR+1r RAM:F902 ; ROM:1896w ... RAM:F902 ; Переменная, контролирующая текущую X позицию вывода терминала. RAM:F903 DIM_OR_EVAL: .db 0 ; DATA XREF: ROM:0B1Bw RAM:F903 ; GETVAR2+80r ... RAM:F903 ; Флаг используемый GETARRAYVAR для определения: определяем ли мы массив с помощью DIM, или осуществляем доступ к элементу существующего массива, RAM:F903 ; что могло бы быть сделано при помощи EVALTERM. RAM:F904 LETTMP: .db 1 ; DATA XREF: LET:ASSIGNVARr RAM:F904 ; ROM:07B0r ... RAM:F904 ; Временная переменная оператора LET, EVALTERM, COMPUTE, GETVAR RAM:F905 MEMTMP: .db 0 ; Временная переменная TOKENIZE RAM:F906 ENDSTRAR: .dw ENSTRAR+0C8h ; Конец строковой области RAM:F908 ARIFMAR: .dw ARIFMOB ; Адрес рабочей области арифметических преобразований RAM:F90A ARIFMOB: .db 6, 0, 6Bh, 2, 1, 0, 89h, 17h, 0, 0, 0, 0 RAM:F90A ; DATA XREF: RESETSTACK+5o RAM:F90A ; MAINTR5+36o ... RAM:F90A ; Рабочая область арифметических преобразований RAM:F916 MAINTR2TMP: .dw 6 ; DATA XREF: MAINTR3o RAM:F916 ; MAINTR2:loc_D75o RAM:F916 ; Временный массив MAINTR RAM:F918 CHARTBL: .dw 26Bh ; Таблица символов функции CHR RAM:F91A RUNWITHTMP: .dw 0F7FEh ; Временная переменная оператора RUN с параметром RAM:F91C COMPTMP: .dw 1D5h ; Временная переменная, использующаяся при вычислениях. RAM:F91E MEMTMP2: .dw 0 ; DATA XREF: CHECKENOUGHMEM:loc_2CAr RAM:F91E ; ROM:0910w RAM:F91E ; Используется при вычислении количества памяти в OUTOFMEMORY RAM:F920 FORTMP: .db 0 ; Временный параметр оператора FOR RAM:F921 IFINPUT: .db 0 ; DATA XREF: ROM:loc_840r RAM:F921 ; ROM:087Fw ... RAM:F921 ; =0 если INPUT RAM:F922 CURBASLN: .dw 1722h ; Текущий адрес строки Бейсик программы RAM:F924 CURBASPTR: .dw 1D5h ; Область сохранения текущего адреса Бейсик программы. RAM:F926 BASOPNUM: .dw 0FFFFh ; DATA XREF: CHECKENOUGHMEM+12w RAM:F926 ; CHECKENOUGHMEM+36r ... RAM:F926 ; Номер оператора Бейсик программы. RAM:F926 ; Или &hFFFF в командном режиме RAM:F928 CONTTMP: .dw 0A6Eh ; Временная переменная оператора CONT RAM:F92A BRKCONT: .dw 0 ; Временная переменная процедур RESETSTACK, TESTBREAKKEY, CONT RAM:F92C STKADDR: .dw 0F736h ; Адрес стека RAM:F92E BGBASPRG: .dw 4001h ; DATA XREF: FINDPROGRAMLINEr RAM:F92E ; NEW2r ... RAM:F92E ; Адрес начала Бейсик программы RAM:F930 ENBASPRG: .dw 4003h ; Адрес конца Бейсик программы. RAM:F930 ; Указывает на первую ячейку участка памяти, доступного программам. RAM:F930 ; Всегда следует за последним байтом программы. RAM:F932 BGARRAY: .dw 4003h ; Адрес начала массивов. RAM:F932 ; Указывает на начало участка памяти, хранящего массивы. RAM:F932 ; Следует сразу за участком памяти, выделенным для обычных переменных. RAM:F934 VAR_TOP: .dw 4003h ; Адрес начала свободной памяти. RAM:F934 ; Указывает на верхушку области хранящей массивы и переменные. RAM:F936 READPTR: .dw 4000h ; Указатель для READ RAM:F938 FACCUM: .db 00011111b, 00000010b, 10000100b, 10000111b ; DATA XREF: LET+1Cr RAM:F938 ; ROM:07BDr ... RAM:F938 ; Аккумулятор для вычислений с плавающей точкой: RAM:F938 ; 00000000 1 11111111111111111111111 RAM:F938 ; -------- - ----------------------- RAM:F938 ; 8 бит экспонента 1 бит знак 23 бита мантисс RAM:F93C FTEMP: .db 0C2h ; T ; DATA XREF: FNEGATEINTo RAM:F93C ; Временная переменная, используемая для хранения знака и экспоненты числа с плавающей точкой во время вычислений. RAM:F93D FBUFFER: .text " 256" ; DATA XREF: PRINTINT2:FOUTo RAM:F93D .db 0 ; Текстовый буфер для чисел с плавающей точкой. RAM:F93D ; Также используется при печати номера строки в команде TRON/TROFF RAM:F942 .db 30h ; 0 RAM:F943 .db 30h ; 0 RAM:F944 .db 30h ; 0 RAM:F945 .db 3Fh ; ? RAM:F946 .db 20h RAM:F947 .db 20h RAM:F948 RESERVD: .db 20h RAM:F949 .db 20h RAM:F94A .db 20h RAM:F94B .db 45h ; E RAM:F94C .db 72h ; r RAM:F94D .db 72h ; r RAM:F94E .db 6Fh ; o RAM:F94F .db 72h ; r RAM:F950 .db 0 RAM:F951 .block 0AFh RAM:FA00 DLSM: .block 1 ; DATA XREF: FNKEYTR+1Dr RAM:FA00 ; SETMODE2+15o ... RAM:FA00 ; Максимальная длина строк 32 или 64 RAM:FA01 SPN: .block 1 ; DATA XREF: FNKEYTR+28r RAM:FA01 ; SCRLEN2+25w ... RAM:FA01 ; Пропусков в начале строки RAM:FA02 DLSF: .block 1 ; Длина строки экрана RAM:FA03 MSK: .block 1 ; Количество строк экрана RAM:FA04 SPK: .block 1 ; DATA XREF: SCRLEN2+4o RAM:FA04 ; LINECHK+7r ... RAM:FA04 ; Пропусков в конце строки RAM:FA05 ABS1: .block 1 ; DATA XREF: ROM:1D14o RAM:FA05 ; ROM:1D33o ... RAM:FA05 ; Адрес буфера экрана режима 0 и 1 RAM:FA06 ABS2: .block 1 ; Старший байт адреса буфера экрана в режимах 0 и 1 RAM:FA07 CLRT: .block 2 ; Адрес таблицы цвета режима 1 RAM:FA09 AGS1: .block 1 ; Адрес знакогенератора режима 0 и 1 RAM:FA09 ; Адрес буфера экрана режима 2 RAM:FA0A AGS2: .block 1 ; Старший байт адреса знакогенератора в режимах 0 и 1 RAM:FA0A ; Старший байт адреса буфера экрана режима 2 RAM:FA0B RS1: .block 2 ; Резерв RAM:FA0D RS2: .block 2 ; Резерв RAM:FA0F GTBL1: .block 1 ; Адрес таблицы точек изображения в режиме 2 RAM:FA10 GTBL2: .block 1 ; Старший байт адреса таблицы точек изображения в режиме 2 RAM:FA11 CTBL1: .block 1 ; Адрес таблицы цвета в режиме 2 RAM:FA12 CTBL2: .block 1 ; Старший байт адреса таблицы цвета в режиме 2 RAM:FA13 CURISO: .block 9 ; DATA XREF: SYMSCR2:loc_2CCEo RAM:FA13 ; CURSOR+8o ... RAM:FA13 ; Изображение курсора RAM:FA1C KSS: .block 1 ; DATA XREF: INPUTSTR-55r RAM:FA1C ; KBD+49r ... RAM:FA1C ; Код символа в позиции курсора RAM:FA1D INSF: .block 1 ; Флаг вставки RAM:FA1E SMK: .block 2 ; Адрес курсора RAM:FA20 BEEPF: .block 1 ; DATA XREF: ROM:1D42w RAM:FA20 ; ROM:1D48o ... RAM:FA20 ; BEEP флаг RAM:FA21 PK: .block 1 ; Позиция курсора RAM:FA22 SK: .block 1 ; Строка курсора RAM:FA23 SFK: .block 1 ; Флаг функциональных клавиш RAM:FA24 CPP: .block 1 ; цвет изображения RAM:FA25 CZP: .block 1 ; цвет фона RAM:FA26 CRG: .block 1 ; цвет рамки RAM:FA27 .block 1 RAM:FA28 TIMCT: .block 1 ; Таймер (+1 каждые 20ms) RAM:FA29 INTTMP: .block 1 ; Переменная обработчика прерываний RAM:FA2A OUTBUF: .block 2 ; Адрес записи в буфер клавиатуры RAM:FA2C INBUF: .block 2 ; Адрес чтения из буфера клавиатуры RAM:FA2E CASIO: .block 1 ; Рабочая область др-ра магнитофона RAM:FA2F .block 1 RAM:FA30 FMA: .block 2 ; DATA XREF: SALOTR+4Bw RAM:FA30 ; SALOTR+53o ... RAM:FA30 ; Адрес, использующийся при заполнении памяти в подпрограмме FILLMEMA RAM:FA32 SL1: .block 2 ; Переменная SALOTR RAM:FA34 SL2: .block 2 ; Переменная SALOTR RAM:FA36 .block 1 RAM:FA37 .block 1 RAM:FA38 .block 1 RAM:FA39 .block 1 RAM:FA3A STRNL: .block 2 ; DATA XREF: TAPE+Ew TAPE+1Fo ... RAM:FA3A ; Адрес строки выводимой на печать подпрограммой STRPRN RAM:FA3C TAPETMP: .block 2 ; Временная переменная процедуры TAPE RAM:FA3E TAPETMP2: .block 2 ; Временная переменная процедуры TAPE RAM:FA40 SALOTMP2: .block 1 ; Временная переменная SALOTR RAM:FA41 CASCMP: .block 1 ; Флаг сравнения RAM:FA42 ERRFL: .block 1 ; ERR флаг RAM:FA43 TITL: .block 1 ; Переменная SYMPRN2 RAM:FA44 PRNFL: .block 1 ; Флаг печати (Для LLIST, LPRINT равен 1) RAM:FA45 PRNOP: .block 1 ; DATA XREF: TOKENIZE:loc_46Do RAM:FA45 ; INPUTLN+2FAo ... RAM:FA45 ; Временная переменная. Используется TOKENIZE, INPUTLN, START. RAM:FA46 IOBUF: .block 13Eh ; DATA XREF: CHECKENOUGHMEM+A2o RAM:FA46 ; TOKENIZE-1A32o ... RAM:FA46 ; Буфер ввода-вывода (диск, кассеты) RAM:FB84 .block 1 RAM:FB85 KBDBUF: .block 102h ; DATA XREF: KBDBUFCL2+1o RAM:FB85 ; BUFFERTOA2+1Fo ... RAM:FB85 ; Буфер клавиатуры RAM:FC87 KBDTMP: .block 1 ; DATA XREF: BUFFERTOA2+18o RAM:FC87 ; KBD1+5o RAM:FC87 ; Переменная процедуры ввода из буфера. RAM:FC88 FNKTXT: .block 0A0h ; DATA XREF: ROM:1B13o RAM:FC88 ; KBD+F7o ... RAM:FC88 ; Текст функциональных клавиш RAM:FD28 SCLNTAB: .block 18h ; DATA XREF: CLRSCR+21o RAM:FD28 ; EDIT5+3o ... RAM:FD28 ; Таблица состояния строк экранного редактора RAM:FD40 .block 1 RAM:FD41 OLDKBDMT: .block 0Bh ; DATA XREF: INTRPT2+20o RAM:FD41 ; INTRPT2+5Do ... RAM:FD41 ; Старое состояние матрицы клавиатуры RAM:FD4C NEWKBDMT: .block 0Bh ; DATA XREF: INTRPT2+60o RAM:FD4C ; Новое состояние матрицы клавиатуры RAM:FD57 INTAR: .block 28h ; DATA XREF: INTRPT2+1Do RAM:FD57 ; INTRPT2+66o RAM:FD57 ; Рабочая область обработки прерываний RAM:FD7F RES3: .block 4 ; Зарезервировано RAM:FD83 SGF: .block 1 ; DATA XREF: SYMSCR2+Eo RAM:FD83 ; Флаг графического символа RAM:FD84 STOPFLG: .block 1 ; STOP-флаг RAM:FD85 INSF2: .block 1 ; DATA XREF: INTRPT2+ABo RAM:FD85 ; KBD+1Ar ... RAM:FD85 ; Флаги режимов клавиатуры RAM:FD86 ONOFF: .block 1 ; Зарезервировано RAM:FD87 SMB: .block 1 ; Зарезервировано RAM:FD88 INTTMP2: .block 2 ; DATA XREF: INTRPT2+99o RAM:FD88 ; Переменная обработчика прерываний RAM:FD8A EDITTMP: .block 1 ; Временная переменная редактора RAM:FD8B .block 1 RAM:FD8C MODE: .block 1 ; DATA XREF: EDIT1+31r RAM:FD8C ; ROM:1EFAr ... RAM:FD8C ; Режим экрана RAM:FD8D OLDRES: .block 1 ; Старый режим RAM:FD8E .block 1 RAM:FD8F PSETC: .block 1 ; Цвет точки у команды PSET RAM:FD90 X1: .block 1 ; DATA XREF: PRESETWT2+6o RAM:FD90 ; ROM:1823o ... RAM:FD90 ; Первый графический курсор, координата X RAM:FD91 Y1: .block 1 ; Первый графический курсор, координата Y RAM:FD92 X2: .block 1 ; DATA XREF: LINETR+10o RAM:FD92 ; LINEBTR+1w ... RAM:FD92 ; Второй графический курсор, координата X RAM:FD93 Y2: .block 1 ; Второй графический курсор, координата Y RAM:FD94 LINE100: .block 1 ; Параметр команды LINE RAM:FD95 LINE100_: .block 1 ; Параметр команды LINE RAM:FD96 LINE1: .block 1 ; Параметр команды LINE RAM:FD97 LINE1_: .block 1 ; Параметр команды LINE RAM:FD98 .block 1 RAM:FD99 .block 1 RAM:FD9A .block 1 RAM:FD9B .block 1 RAM:FD9C .block 1 RAM:FD9D .block 1 RAM:FD9E .block 1 RAM:FD9F .block 1 RAM:FDA0 INMAGTMP3: .block 2 ; Временная переменна INMAG RAM:FDA2 INMAGTMP2: .block 2 ; Временная переменна INMAG RAM:FDA4 INMAGTMP: .block 2 ; DATA XREF: INMAG+18w RAM:FDA4 ; INMAGTR+3Do RAM:FDA4 ; Временная переменна INMAG RAM:FDA6 .block 1 RAM:FDA7 .block 1 RAM:FDA8 .block 1 RAM:FDA9 .block 1 RAM:FDAA .block 1 RAM:FDAB .block 1 RAM:FDAC .block 1 RAM:FDAD .block 1 RAM:FDAE .block 1 RAM:FDAF .block 1 RAM:FDB0 .block 1 RAM:FDB1 .block 1 RAM:FDB2 .block 1 RAM:FDB3 PRESETC: .block 1 ; Временное значение цвета для команды PRESET RAM:FDB4 TRFLAG: .block 1 ; Флаг трассировки RAM:FDB5 ERRTMP: .block 1 ; Код ошибки функции ERR RAM:FDB6 OUTTMP: .block 2 ; DATA XREF: ROM:189Cw RAM:FDB6 ; OUTCHAR+1A9Cr ... RAM:FDB6 ; Временная переменная редактора RAM:FDB8 EITMP: .block 2 ; Временная переменная. Используется в INPUTLN, ERRTR2 RAM:FDBA .block 1 RAM:FDBB .block 1 RAM:FDBC .block 1 RAM:FDBD SCRTMP1: .block 1 ; Экранные временные переменные. RAM:FDBE SCRTMP2: .block 1 ; Экранные временные переменные. RAM:FDBF SCRTMP3: .block 1 ; Экранные временные переменные. RAM:FDC0 EVNTTAB: .block 1 ; DATA XREF: KBD2r RAM:FDC0 ; CHECKENOUGHMEM+1899w ... RAM:FDC0 ; Таблица событий. RAM:FDC0 ; (УПР/СТОП + 10 функциональных клавиш) RAM:FDC0 ; Бит 0 - маска события RAM:FDC0 ; Бит 2 - событие RAM:FDC1 .block 1 RAM:FDC2 .block 1 RAM:FDC3 KBDTMPBUF: .block 21h ; DATA XREF: KBD+110o RAM:FDC3 ; Временный буфер клавиатуры RAM:FDE4 ERLTMP: .block 2 ; Временная переменная функции ERL RAM:FDE6 ERRES: .block 2 ; Временная переменная обработчика ошибок. RAM:FDE8 .block 1 RAM:FDE9 .block 1 RAM:FDEA SYMTMP: .block 1 ; Временная переменная. Используется SYMSCR. RAM:FDEB MODE1FLG: .block 1 ; DATA XREF: SETMODE3+26r RAM:FDEB ; SETMODE3+2Ew ... RAM:FDEB ; Флаги режима 1 RAM:FDEC .block 1 RAM:FDED .block 1 RAM:FDEE .block 1 RAM:FDEF .block 1 RAM:FDF0 SALOTMP: .block 2 ; DATA XREF: SALOTR+11o RAM:FDF0 ; SALOTR+1Fw ... RAM:FDF0 ; Временная переменная подпрограммы работы с лентой SALOTR RAM:FDF2 SALOTMP3: .block 2 ; Временная переменная подпрограммы работы с лентой SALOTR RAM:FDF4 .block 1 RAM:FDF5 .block 1 RAM:FDF6 .block 1 RAM:FDF7 .block 1 RAM:FDF8 .block 1 RAM:FDF9 .block 1 RAM:FDFA .block 1 RAM:FDFB .block 1 RAM:FDFC .block 1 RAM:FDFD .block 1 RAM:FDFE .block 1 RAM:FDFF .block 1 RAM:FE00 .block 1 RAM:FE01 .block 1 RAM:FE02 INTTMP3: .block 1 ; Переменная обработчика прерываний RAM:FE03 PSETX: .block 1 ; DATA XREF: PSETTR+15w RAM:FE03 ; ROM:1EF3r ... RAM:FE03 ; Координата X команды PSET в виде байта RAM:FE04 PSETY: .block 1 ; DATA XREF: PSETTR+21w RAM:FE04 ; PUTTR+27r ... RAM:FE04 ; Координата Y команды PSET в виде байта RAM:FE05 VIDEO3: .block 1 ; Видео-переменная. Используется в PUTTR и VIDEOTR RAM:FE06 PUTTRTMP: .block 1 ; Временная переменная PUTTR RAM:FE07 VIDEO1: .block 1 ; Видео-переменная. Используется в PUTTR и VIDEOTR RAM:FE08 VIDEO2: .block 1 ; Видео-переменная. Используется в PUTTR и VIDEOTR RAM:FE09 VIDEO4: .block 1 ; Видео-переменная. Используется в PUTTR и VIDEOTR RAM:FE0A PUTTRTMP2: .block 1 ; Временная переменная PUTTR RAM:FE0B VIDEOBUF: .block 0CAh ; DATA XREF: PUTTR+9Ao RAM:FE0B ; VIDEOTR:loc_20CFo RAM:FE0B ; Видеобуфер. Используется командами PUT и GET (PUTTR, VIDEOTR) RAM:FED5 ERRTRTMP2: .block 2 ; Временная переменная обработчика ошибок ERRTR RAM:FED7 ERRTRTMP: .block 2 ; Временная переменная обработчика ошибок ERRTR, ERRTR2 и RESUME. RAM:FED9 ASITT: .block 1 ; Временная переменная. Используется в AUTO, STOP, INPUTLN, TOKENIZE, TRETLINE RAM:FEDA AITMP: .block 2 ; Временная переменная. Используется в командах AUTO и INPUTLN RAM:FEDC TMPBUF: .block 123h ; Временный буфер CLOAD RAM:FEDC ; end of 'RAM' RAM:FEDC RAM:FEDC RAM:FEDC .end