DEVICE ZXSPECTRUM128 ; INCLUDE "!AllConst.asm" ; INCLUDE "!ram8.asm" ORG #0000 x5B00 equ #5B00 ; п/п переключения страниц rom0/1 (=x006B) x5B14 equ #5B14 ; п/п возврата из basic48 (=x007F) x5B1D equ #5B1D ; п/п on error x5B2F equ #5B2F ; п/п ввода rs232 x5B34 equ #5B34 ; п/п вывода rs232 x5B4A equ #5B4A ; п/п включения предыдущего rom bacic48/128 (=x00B5) ; rs232 вывод символов x5B58 equ #5B58 ;2 адрес вызываемой п/п из basic48 x5B5A equ #5B5A ;2 адрес возврата в basic128 x5B5C equ #5B5C ;1 содержимое порта #7FFD x5B5D equ #5B5D ;1 =#CF rst 8 x5B5E equ #5B5E ;1 код ошибки для rst 8 basic48 x5B5F equ #5B5F ;2 rs232 битный период x5B61 equ #5B61 ;2 флаг состояния второго принимаемого символа и данные x5B63 equ #5B63 ;1 текущая колонка x5B64 equ #5B64 ;1 ширина печатной страницы x5B65 equ #5B65 ;1 номер параметра ожидаемого rs232 x5B66 equ #5B66 ;1 флаги x5B67 equ #5B67 ;10 имя файла x5B71 equ #5B71 ;1 тип файла x5B72 equ #5B72 ;2 длина блока x5B74 equ #5B74 ;2 начальный адрес блока x5B76 equ #5B76 ;2 длина программы x5B78 equ #5B78 ;2 номер строки x5B7A equ #5B7A ;1 тип файла x5B7B equ #5B7B ;??? x5B7E equ #5B7E ;??? 2 длина блока x5B7F equ #5B7F ;2 длина программы x5B81 equ #5B81 ;2 старый SP при использовании TSTACK x5B83 equ #5B83 ;2 поинтер свободногоместа в directory x5B85 equ #5B85 ;3 количество свободный байт x5B88 equ #5B88 ;1 x5B89 equ #5B89 ;1 x5B8A equ #5B8A ;1 x5B8B equ #5B8B ;2 возврат адреса для on err 32768 x5B8D equ #5B8D ;5 последняя длина, выводимая при вычислениях x5B92 equ #5B92 ;2 номер строки для renumber x5B94 equ #5B94 ;2 новый номер строки начала при перенумерации x5B96 equ #5B96 ;2 приращение номера строки для перенумерации x5B98 equ #5B98 ;8 STRIP1 x5BA0 equ #5BA0 ;8 STRIP2 x5BA8 equ #5BA8 ;стэк x5BFF equ #5BFF ;вершина стэка ;Ram7. ;#EC0C - 1 номер текущей опции меню basic128 ;#EC0D - 1 флаги ; 1,=1 текущее меню: основное меню basic128 ;#EC0E - 1 ??? ;#EC0F - 2 постоянные атрибуты экрана для 128 TR-DOS ;#EC11 - 2 временные атрибуты экрана для 128 TR-DOS ;#EC13 - 1 параметры вывода на экран для 128 TR-DOS ;#F6EC - 2 адрес списка опций меню Rom1.x0010 equ #0010 ;печать символа из A Rom1.x0013 equ #0013 ;адрес с байтом #FF в rom 1 Rom1.x0018 equ #0018 ;чтение очередного символа строки программы Rom1.x0020 equ #0020 ;чтение следующего символа строки программы Rom1.x0028 equ #0028 ;вызов калькулятора Rom1.x0030 equ #0030 ;резервирование памяти Rom1.x0038 equ #0038 ;обработчик прерываний Rom1.x0095 equ #0095 ;токены бейсика Rom1.x03B5 equ #03B5 ;beep Rom1.x0761 equ #0761 ;LOAD/MERGE/VERIFY Rom1.x08CE equ #08CE ;MERGE Rom1.x0970 equ #0970 ;SAVE Rom1.x0B52 equ #0B52 ;печать токена Rom1.x0C0A equ #0C0A ;печать сообщения Rom1.x0D4D equ #0D4D ;копиравоние атрибутов Rom1.x0D6B equ #0D6B ;CLS Rom1.x0D6E equ #0D6E ;открыть канал Rom1.x0DAF equ #0DAF ;очистить экран Rom1.x0E88 equ #0E88 ;расчет адреса в атрибутах по координатам Rom1.x0E9B equ #0E9B ;расчет адреса на экране по координатам Rom1.x0F85 equ #0F85 ;добавить код в строку Rom1.x107F equ #107F Rom1.x1097 equ #1097 ;очистка памяти Rom1.x10DB equ #10DB ;обработка кода клавиши Rom1.x1303 equ #1303 ;основной цикл basic 48 Rom1.x1391 equ #1391 Rom1.x1536 equ #1536 Rom1.x15EF equ #15EF ;печать символа из a Rom1.x1601 equ #1601 ;открыть канал Rom1.x1615 equ #1615 ;установка флагов канала (возврат предыдущего канала) Rom1.x1655 equ #1655 ;резервирование места (длина в bc) Rom1.x1661 equ #1661 ;lddr, ret Rom1.x1664 equ #1664 ;обновление системных переменных Rom1.x1695 equ #1695 ;получить адрес первой строки программы Rom1.x16B0 equ #16B0 ;очистка различных областей памяти Rom1.x16BF equ #16BF ;очистка рабочего буфера Rom1.x16C5 equ #16C5 ;восстановление стэка Rom1.x1825 equ #1825 ;LIST-5 Rom1.x18B6 equ #18B6 ;пропуск натурального числа Rom1.x196E equ #196E ;получить начальный адрес строки программы Rom1.x198B equ #198B ;поиск команды в строке Rom1.x19B8 equ #19B8 ;поиск адрес начала следующей строки программы Rom1.x19E5 equ #19E5 ;удалить переменные Rom1.x19E8 equ #19E8 ;удалить массив DIM Rom1.x19FB equ #19FB ;получить номер редактиремой строки Rom1.x1A1B equ #1A1B ;печать номера строки Rom1.x1C1F equ #1C1F ;обработка класса #01 Rom1.x1C56 equ #1C56 ;полкчить значение параметра Rom1.x1C6C equ #1C6C ;FOR i Rom1.x1C7A equ #1C7A ;получение двух значений Rom1.x1C82 equ #1C82 ;получение числового значения Rom1.x1C8C equ #1C8C ;параметр - строка Rom1.x1CBE equ #1CBE ;установка необязательных атрибутов для печати Rom1.x1CDE equ #1CDE ;получение параметра-числа Rom1.x1CE6 equ #1CE6 ;ноль на стэк калькулятора Rom1.x1D16 equ #1D16 ; Rom1.x1D86 equ #1D86 ;поиск оператора Rom1.x1E39 equ #1E39 ;проверить инструкцию DATA или DEF FN Rom1.x1E45 equ #1E45 Rom1.x1E67 equ #1E67 ;команда GO TO Rom1.x1E99 equ #1E99 ;извлечь операнд Rom1.x1F05 equ #1F05 ;проверка наличия свободной памяти Rom1.x1FDF equ #1FDF ;PRINT_2 Rom1.x2048 equ #2048 ;PR-ST-END Rom1.x2070 equ #2070 ;нужно ли изменять поток? Rom1.x20A0 equ #20A0 ;ввод с клавиатуры Rom1.x20C1 equ #20C1 ;ввод данных по input Rom1.x21FC equ #21FC ;изменение временных атрибутов Rom1.x22AA equ #22AA ;рассчитать адрес на экране по координатам Rom1.x22E9 equ #22E9 ;печать точки Rom1.x232D equ #232D ;печать окружности Rom1.x2394 equ #2394 ;печать линии Rom1.x2477 equ #2477 ;печать линии Rom1.x24FB equ #24FB ;ищем следующее выражение Rom1.x2530 equ #2530 ;проверка флага проверка/исполнение программы Rom1.x28B2 equ #28B2 ;LOOK-VARS Rom1.x2996 equ #2996 ;проверкае синтаксиса выражения, заключенного в скобки Rom1.x2BF1 equ #2BF1 ;прочитать значение со стэка калькулятора Rom1.x2C15 equ #2C15 ;D-RUN Rom1.x2C8D equ #2C8D ;это буква? Rom1.x2D1B equ #2D1B ;это цифра? Rom1.x2D2B equ #2D2B ;bc на стэк калькулятора Rom1.x2DA2 equ #2DA2 ;извлечь значение со стэка калькулятора Rom1.x2DE3 equ #2DE3 ;печать числа с плавающей точкой Rom1.x30A9 equ #30A9 ;hl=hl*de Rom1.x33B4 equ #33B4 ;поместить число на смэк калькулятора Rom1.x34E9 equ #34E9 ;проверка значения на ноль Rom1.x3B01 equ #3B01 ; Rom1.x3C04 equ #3C04 ;проверка Break и вызов теста экрана Rom1.x03F8 equ #03F8 ; BEEP routine in ROM 1. ;Rom1.x0D6B equ #0D6B ; CLS routine in ROM 1 Rom1.x16E5 equ #16E5 ; CLOSE # routine in ROM 1 Rom1.x1736 equ #1736 ; OPEN # routine in ROM 1 Rom1.x1A0D equ #1A0D ; CLEAR routine in ROM 0 Rom1.x1CEE equ #1CEE ; STOP routine in ROM 1 Rom1.x1DAB equ #1DAB ; NEXT routine in ROM 1 Rom1.x1E42 equ #1E42 ; RESTORE routine in ROM 1 Rom1.x1E4F equ #1E4F ; RANDOMIZE routine in ROM 1 Rom1.x1E5F equ #1E5F ; CONTINUE routine in ROM 1 ;Rom1.x1E67 equ #1E67 ; GO TO routine in ROM 1 Rom1.x1E7A equ #1E7A ; OUT routine in ROM 1 Rom1.x1E80 equ #1E80 ; POKE routine in ROM 1 Rom1.x1F3A equ #1F3A ; PAUSE routine in ROM 1 Rom1.x2294 equ #2294 ; BORDER routine in ROM 1 Rom1.x22DC equ #22DC ; PLOT routine in ROM 1 ;#0000 включение компьютера/"холодный" старт ;#0004 вход в монитор NMI/rst 8 ;#0008 rst #08 вызов функции монитора ;#000D возврат из монитора ;#0010 rst #10 печать символа из A ;#0014 rst #08 вызов функции монитора ;#0018 чтение очередного символа строки программы ;#001C переход в rom2 при ресете ;#0020 получение следующего символа из бейсик программы ;#0024 переход в rom2 при rst #08 ;#0028 вызов процедуры из basic 48k ;#0038 обработчик прерываний ;#004A обработчик ошибок basic 128 ;#005C вызов процедуры (продолжение rst #28) ;#006B п/п переключения страниц rom0/1 копируется (адрес x5B00) ;#007F сюда возврат после отработки п/п по rst #28 (=#5B14) ;#0088 обработчик ошибок basic 128k ;#009A ввод из канала "P" ;#009F вывод в канал "P" ;#00B5 выход из процедуры ввода/вывода в канал "P" (включение предыдущего rom basic48/128) ;#00C3 обработчик ошибок basic 128k ;#00C7 вход из монитора после "холодного старта" ;#00ED вход из монитора после "теплого старта" ;#0100 !!!NOT USED!!! керналь процедур ;#0131 ошбка проверки памяти (битая память) ;#0137 инициализация переменных и печать меню 128k ;#019D команда NEW ;#026B выполненение введенной строки ;#02BA сюда возвращаемся после проверки синтаксиса бейсика ;#0321 обработчик ошибок ;#03EF обработчик ошибок ;#03F7 вставка строки программы ;#046C адреса сообщений об ошибках ;#048C сообщения об ошибках ;#057D печать строки из de ;#0589 информация о каналах ;#059E информация о потоках ;#05AC обработка ошибки ;#05D6 проверка нажатия break и печать сообщения ;#05E6 RS232 ввод и вывод ;#0641 команда FORMAT ;#06D8 процедура ввода из RS232 ;#06E5 чтение байта из RS232 ;#07CA процедура вывода в RS232 ;#0822 перевод строки на принтере ;#082B !!!NOT USED!!! взврат каретки на принтере ;#0830 продолжение x07CA процедура вывода в RS232 ;#08A3 передача байта на принтер ;#08B1 rst #08 вызов функции монитора ;#08D1 включение компьютера/"холодный" старт ;#08E1 !!!NOT USED!!! вход куда-то ;#08EE возврат из x08A3 ;#08F0 команда COPY ;#0915 печать половины строки ;#095F передача на принтер управляющего кода ;#096D проверить пиксель на экране ;#0979 управляющие коды принтера Epson ;#0985 команда PLAY ;!!!not used!!! #0E89 чтение регистра AY ;#0E93 гасим звуки во всех каналах ;#11EB команда SAVE ;#11F2 команда LOAD ;#11F2 команда VERIFY ;#1200 команда MERGE ;#1219 ошибка C Nonsense in BASIC ;#121D работа с RAM диском ;#137E загрузка данных с RAM диска ;#1385 получить выражения из строки бейсика ;#1393 проверка и копирование имени файла ;#13BE работа с лентой/RAM диском ;#152F печать бейсик программы от текущей строки ;#1630 очистка окна редактирования ;#1639 сдвиг всех строк в буфере редактирования верх и обновление экрана ;#1648 сдвиг всех строк в буфере редактирования верх и обновление экрана ;#166F сдвиг всех строк в буфер редактирования вниз с обновлением экрана ;#1675 сдвиг всех строк в буфер редактирования вниз с обновлением экрана ;#16AC вставка символа в строку буфера редактирования ;#16C1 вставка символа в строку буфера редактирования со сдвигом влево ;#16DC смещения до параметров команды ;#170E синтаксические параметры команд (аналогично basic 48 #1A7A) ;#17AF анализ и выполнение бейсик программы ;#18B5 таблица смещений до процедур обработки класса оператора ;#18C4 процедуры обработки классов ;#1967 процедуры обработки команд бейсика ;#1AF1 пункт меню Tape Loader ;#1B11 анализ и выполненение введенной строки ;#1B14 пункт меню редактора Print (печать на принтер) ;#1B2B команда SPECTRUM ;#1B47 пунт меню BASIC 48. включение basic48, блокировка #7FFD и переход на адрес #0000 ;#1B4A включение basic48, блокировка #7FFD и переход на адрес в hl ;#1B53 установка канала 'P' ;#1B6E данные для команды LOAD "" ;#1B71 команда LIST ;#1B75 команда LIST ;#1BAD команда RAM disk SAVE! ;#1BE5 команда RAM disk CAT! ;#1C0C команда RAM disk EARSE! ;#1C2E загрузка заголовка файла из RAM диска ;#1C4B загрузка из RAM диска ;#1C64 включение логической страницы в A ;#1C87 сравнение имени файла с заданным ;#1C97 создание новой записи в каталоге RAM-диска ;#1CF3 коррекция сводного места на RAM диске ;#1D12 поиск имени файла в каталоге ;#1D35 поиск файла на RAM диске ;#1D56 обновление записи каталога ;#1DAC сохранение данных на RAM диске ;#1E37 загрузка данных с RAM диска ;#1ECF !!!NOT USED!!! запись данных в RAM 7 ;#1F04 !!!NOT USED!!! чтение данных из RAM 7 ;#1F20 установка другого стэка и ram 0 ;#1F3A включение страницы ram ;#1F45 установка другого стэка и ram 7 ;#1F5F удаление файла из RAM диска ;#20D2 печать каталога RAM диска ;#2135 печать одной записи каталога RAM диска ;#2174 команда LPRINT ;#2178 команда PRINT ;#218C команда INPUT ;#21A7 команда COPY ;#21AA команда NEW ;#21AE команда CIRCLE ;#21BE команда DRAW ;#21D5 команда DIM ;#21EF очистка экрана ;#21F8 вычисличть числовое выражение ;#226F обработка нажатой клавиши ;#228E поиск начала бейсик команды ;#2297 проверка это команда LET? (калькулятор basic 128) ;#22AB проверка это оператор? ;#22BD список токенов операторов ;#22CB проверка это токен? ;#22E0 проверка это число или функция ;#230A проверка это цифра или нет ;#2317 команда PLAY ;#2336 !!!NOT USED!!! возврат в редактор ;#2342 !!!NOT USED!!! bc=hl-de ;#234A !!!NOT USED!!! зарезервировать память на 1 байт ;#2358 !!!NOT USED!!! проверка доступности места в памяти размером в bc ;#236F !!!NOT USED!!! hl=a*#20 ;#2371 !!!NOT USED!!! hl=a*#08 ;#2378 !!!NOT USED!!! расчет свободного места ;#2384 !!!NOT USED!!! печать на экране строки из буфера ;#23B8 !!!NOT USED!!! печать в буфере #FF ;#23CB !!!NOT USED!!! копирование буфера на экран ;#23E1 !!!NOT USED!!! печать символов из буфера на экране ;#2456 !!!NOT USED!!! переключение страниц rom 0/1 ;#2464 !!!NOT USED!!! переключение страниц rom 0/1 ;#246F !!!NOT USED!!! копирование п/п в ram 7 ;#2488 !!!NOT USED!!! установка атрибутов из буфера экрана ;#249B !!!NOT USED!!! установка атрибутов из буфера экрана ;#2513 !!!NOT USED!!! поменять местами ink и paper ;#2537 таблица адресов обработки нажатий в режиме редактирования ;#2577 таблица адресов обработки нажатий в основном меню basic 128k ;#2584 подготовка переменных ;#259F печать главного меню basic 128 и выбор опции ;#25CB возврат в редактор/калькулятор/меню после обработки ошибки ;#2653 основной цикл в basic128/калькулятор ;#2669 обработка нажатия клавиши ;#269B ext+ss+8/Graph+Z переключение между редактированием внизу и вверху ;#26BB выбор нижнего экрана ;#26CE выбор верхнего экрана ;#26E7 звуковой сигнал ;#26EC звуковой сигнал ;#26FA звуковой сигнал ;#2704 cs+1 вызов меню ;#2717 нажатие cs+1/enter в главном меню ;#272E курсор вверх в главном меню ;#2731 курсор вниз в главном меню ;#2744 адреса процедур обработки опций основного меню basic 128k ;#2754 текст основного меню basic 128k ;#278D !!!NOT USED!!! ;#2790 адреса процедур обработки опций меню в редакторе basic 128 ;#27A0 текст меню в редакторе basic 128 ;#27CB адреса процедур обработки опций меню в калькуляторе ;#27D2 текст меню в калькуляторе ;#27EB !!!NOT USED!!! ;#2811 смена области редактирования низ/верх ;#2816 выбор опции 128 TR-DOS ;#281С выход из редактора/калькулятора в главное меню ;#2831 выбор опции 48 TR-DOS (вход в Tr-Dos 48k) ;#283E !!!NOT USED!!! ;#2851 перенумерация строк программы ;#2862 печать программы на принтере ;#286C выбор опции 128 BASIC ;#2885 выбор опции калькулятор ;#28BE инициализация курсора для верхнего окна ;#28C7 возврат в главное меню ;#28DF инициализация настроек нижнего окна ;#28E8 инициализация настроек верхнего окна ;#28F1 обработка нажатия символьной клавиши ;#291B ext+ss+K удаление символа справа от курсора ;#292B delete удаление символа слева от курсора ;#2944 enter ввод строки ;#2983 ext+N/Graph+W переход к первой строке бейсик программы ;#29AB ext+T/Graph+V переход к последней строке бейсик программы ;#29D4 ext+I переход к началу текущего слова ;#29E1 ext+shift+J переход к началу следующего слова ;#29EC удаление курсора, восстановление атрибутов ;#29F2 напечатать курсор ;#29F8 напечатать курсор ;#2A07 получение позиции курсора ;#2A11 сохранить позицию курсора ;#2A1A получение текущего символа в буфере редактирования ;#2A25 ss+I перемещение курсора вниз на 10 строк в поле редактирования ;#2A4F ext+P перемещение курсора вверх на 10 строк в поле редактирования ;#2A7A ext+M/graph+X перемещение курсора в конец строки в поле редактирования ;#2A87 ext+ss+2/Graph+Y переход к началу строки редактирования ;#2A94 перемещение курсора вверх в поле редактирования ;#2AB5 перемещение курсора вниз в поле редактирования ;#2AD7 перемещение курсора влево в поле редактирования ;#2AE3 перемещение курсора вправо в поле редактирования ;#2AF9 найти в строке ближайшую редактируемую позицию ;#2B02 найти в строке ближайшую редактируемую позицию ;#2B0B вставить строку бейсик программы, если требуется сдвинуть строки в буфере вниз и обновить эекран ;#2B30 вставить строку бейсик программы, если требуется сдвинуть строки в буфере вверх и обновить эекран ;#2B5B поиск редактируемой позиции слева от курсора во всем буфере ;#2B78 поиск редактируемой позиции справа от курсора во всем буфере ;#2BD4 поиск редактируемого символа в строке справа от курсора ;#2BDF поиск в строке влево от курсора редактируемого символа ;#2BEA поиск начала слова слева от курсора ;#2C09 поиск начала слова справа от курсора ;#2C31 поиск начала строки редактирования в буфере ;#2C4C поиск конца строки в буфере редактирования ;#2C68 вставить строку бейсик программы, если были изменения ;#2C7C вставить строку в бейсик программу, если были изменения ;#2C8E вставить строку бейсик программы ;#2D54 получить очередной символ из строки бейсик программы ;#2D8F получить символ из текущей позиции курсора в буфере редактирования ;#2E0E получить символ из строки буфера редактирования ;#2E1F сброс верхнего окна редактирования ;#2E2D сброс нижнего окна редактирования ;#2E41 поиск в строке вправо от курсора редактируемого символа ;#2E63 поиск в строке влево от курсора редактируемого символа ;#2E7B чтение символа из буфера редактирования ;#2E81 вставка символа в буфер редактирования ;#2ECE вставка пустой строки в буфер редактирования ;#2ED3 вставка пустой строки в буфер редактирования ;#2F12 удаление символа в строке в буфере редактирования ;#2F80 сдвиг строк вверх в буфере при удалении строки ;#2FBC ext+E удаление символов от курсора до начала текущего слова ;#3017 ext+W удаление символов от курсора до начала следующего слова ;#303E ext+K удаление символов до наала строки ;#3072 ext+J удаление символов до конца строки ;#3084 удаление курсора и запрет на обновление экрана ;#3095 проверка наличия предыдущего символа в буфере ;#30B4 расчет адреса начала строки в буфере редактирования ;#30C6 !!!NOT USED!!! ;#30D0 параметры для установки буфера редактирования строки внизу экрана ;#30D6 установка буфера редактирования внизу экрана ;#30DF сдвиг строк в буфере редактирования вверх ;#311E сдвиг строк в буфере редактирования вниз ;#316E вставка символа в нижний буфер редактирования ;#31C3 расчет адреса начала строки в буфере редактирования ;#31C9 удаление символа в нижнем буфере редактирования ;#321E параметры для установки буфера редактирования строки вверху экрана ;#3222 установка буфера редактирования в верху экрана ;#322B перемещение курсора вверх в верхнем буфере редактирования ;#326A копирование строки бейсик программы в буфер редактирования вверзу экрана ;#32B7 расчет адреса начала строки в буфере редактирования ;#32BD таблица обработки управляющих кодов при редактировании строки ;#32D6 копирование строки программы в буфер редактирования ;#3331 перенос части строки на следующую строку ;#334A поиск адреса строки бейсик программы ;#3352 преобразование номера строки в ASCII и помещение в буфер ;#335A преобразование токена в текст ;#335F копирование процедур в ram ;#3374 копирование токена в буфер токенов (=#FCAE) ;#33C3 копирование токена (=#FCFD) ;#33F4 распознавание токена (=#FD2E) ;#3430 преобразование номера строки в ASCII и помещение в буфер ;#3495 выделение разряда числа и занесение его в буфер ;#34B6 поиск адрес строки программы с заданным номером или следущей строки, если строка с заданным номером не существует ;#34CF расчет адреса следущей строки бейсик программы ;#34D9 проверка на конец бейсик программы ;#34E0 сравнение номера строки с заданным ;#34EA обнуление указателей в бейсик строке ;#34F6 поиск адрес строки бейсик программы в памяти ;#3517 преобразование токена в текст ;#3594 токены basic128 ;#35BC установка параметров отступа ;#35C5 сохранить символ в указанном столбце текущей строки буфера редактирования ;#35CC процедура обработки нажатия 'enter' в строке ;#35DA процедура обработки зануления до конца строки ;#35E6 зануление до конца строки в буфере редактирования ;#35F4 создание отступа в строке в буфере редактирования ;#3604 печать строки редактируемого буфера, при необходимости ;#3618 сдвиг вверх строк в буфере редактирования при необходимости ;#362C сдвиг вниз строк в буфере редактирования при необходимости ;#3640 печать атрибутов курсора ;#364F восстановление атрибутов под курсором ;#365E установка переменных для ввода символа ;#367F ожидание нажатия клавиши ;#36A8 печать меню basic 128k ;#3719 печать одной линии вокруг меню ;#372B установка координат печати из bc ;#3733 печать строки из hl ;#373B сохранение окна экрана 14*12 в буфере ;#373E восстановление окна экрана 14*12 из буфера ;#377E сохранение/восстановление 14 знакомест экана в буфере ;#37A7 клавиша вверх в меню basic128 ;#37B6 клавиша вниз в меню basic128 ;#37CA инвертирование атрибутов опции меню ;#37EC управляющие коды для печати меню ;#37FA управляющие коды для печати меню ;#3802 данные потоков для печати эмблемы ;#3812 управляющие коды для печати косых полос в меню ;#3822 печать эмблемы ZX (косые цветные полосы) в меню ;#3848 печать информационной строки 128 BASIC ;#384D печать информационной строки Calculator ;#3852 печать информационной строки 48 TR-DOS ;#3857 печать информационной строки 128 TR-DOS ;#3881 очистка двух нижних строк экрана ;#3888 перенумерация строк программы ;#390E анализ строки и перенумерование ссылок на номера строк ;#3A05 подсчет количества строк в бейсик программе ;#3A35 пропуск пробелов в строке ;#3A3C номер строки в ASCII ;#3A60 получить один разря числа в ASCII ;#3A7F установка настроек курсора для верхнего окна ;#3A88 установка настроек курсора для нижнего окна ;#3A91 !!!NOT USED!!! ;#3A96 сохранить атрибуты курсора ;#3A9D печать атрибутов курсора ;#3AB2 восстановление атрибутов под курсором ;#3ABF сдвиг вверх строк в буфере редактирования ;#3AC6 сдвиг вниз строк в буфере редактирования ;#3B1E печать строки редактируемого буфера ;#3B5E очистка строк экрана ;#3B94 расчет количества строк и столцов до конца экрана ;#3B98 расчет количества строк от заданной до низа экрана ;#3BA0 расчет адреса атрибутов ;#3BB8 обмен атрибутов basic 128 с основными атрибутами ;#3BE9 запуск команды randomize 15619: rem: load "boot" ;#3C1C !!!NOT USED!!! копирование и выполненение бейсик строки ;#3C20 !!!NOT USED!!! бейсик строка ;#3C35 возврат из монтора ;#3C4A !!!NOT USED!!! вход в монитор (продолжение x08E1) ;#3C56 пауза 25 фреймов ;#3C63 токенизация строки бейсик программы с синтаксической ошибкой ;#3C67 токенизация строки бейсик программы ;#3D9D получить очередной символ из строки бейсик программы и определить его тип ;#3DC6 проверка символа на принадлежность к буквам нижнего регистра ;#3DCD копирование слова из буфера в строку бейсик программы ;#3DE9 вставить символ в буфер редактирования ;#3E16 вставка символа в сроку бейсик программы с обработкой < и > ;#3E64 вставка символа в сроку бейсик программы с обработко REM и кавычек ;#3E9C вставка символа в сроку бейсик программы с игнорированием пробелов ;#3EFB вставка символа в сроку бейсик программы ;#3F66 проверка наличия свободного места в памяти ;#3F7E распознавание токена ;#3FBA копирование строки из hl в de в (hl+0) кол-во байт ;#3FC3 !!!NOT USED!!! преобразование ASCII в цифру ;#3FCE обработка нажатой управляющей клавиши ;#3FEE вызов call (hl) ;#3FEF инициалы программистов ;#4000 ;АДРЕС: #0000 включение компьютера/"холодный" старт x0000 di jp x08D1 ;АДРЕС: #0004 вход в монитор x0004 out (c),a nop nop ;АДРЕС: #0008 rst #08 вызов функции монитора x0008 jp x0014 nop nop ;АДРЕС: #000D возврат из монитора x000D jp x3C35 ;АДРЕС: #0010 rst #10 печать символа из A x0010 rst #28 ;вызов п/п из basic 48k dw Rom1.x0010 ret ;АДРЕС: #0014 rst #08 вызов функции монитора x0014 jp x08B1 nop ;АДРЕС: #0018 чтение очередного символа строки программы x0018 rst #28 ;вызов процедуры из basic 48k dw Rom1.x0018 ret ;АДРЕС: #001C переход в rom2 при ресете x001C out (c),a nop nop ;АДРЕС: #0020 получение следующего символа из бейсик программы x0020 rst #28 ;вызов процедуры из basic 48k dw Rom1.x0020 ret ;АДРЕС: #0024 переход в rom2 при rst #08 x0024 out (c),a nop nop ;АДРЕС: #0028 вызов процедуры из basic 48k x0028 ex (sp),hl push af ld a,(hl) inc hl inc hl ld (x5B5A),hl dec hl ld h,(hl) ld l,a pop af jp x005C nop ;not use ;АДРЕС: #0038 обработчик прерываний x0038 push hl ld hl,x0048 push hl ld hl,x5B00 push hl ld hl,Rom1.x0038 push hl jp x5B00 x0048 pop hl ret ;АДРЕС: #004A обработчик ошибок basic 128 x004A ld bc,#7FFD xor a di out (c),a ;rom 0(128k), ram 0, scr 5, 128k ld (x5B5C),a ei dec a ld (iy+#00),a ;no error jp x0321 ;АДРЕС: #005C вызов процедуры (продолжение rst #28) x005C ld (x5B58),hl ld hl,x5B14 ex (sp),hl push hl ld hl,(x5B58) ex (sp),hl jp x5B00 ;АДРЕС: #006B п/п переключения страниц rom0/1 копируется в адрес x5B00 x006B push af push bc ld bc,#7FFD ld a,(x5B5C) xor #10 di ld (x5B5C),a out (c),a ei pop bc pop af ret ;АДРЕС: #007F сюда возврат после отработки п/п по rst #28 (=#5B14) x007F call x5B00 push hl ld hl,(x5B5A) ;адрес возврата в процедуру при вызове rst #28 ex (sp),hl ret ;АДРЕС: #0088 обработчик ошибок basic 128k x0088 di ld a,(x5B5C) and #EF ld (x5B5C),a ld bc,#7FFD out (c),a ei jp x00C3 ;АДРЕС: #009A ввод из канала "P" x009A ld hl,x06D8 jr x00A2 ;АДРЕС: #009F вывод в канал "P" x009F ld hl,x07CA x00A2 ex af,af' ld bc,#7FFD ld a,(x5B5C) push af and #EF di ld (x5B5C),a out (c),a jp x05E6 ;RS232 ввод и вывод ;АДРЕС: #00B5 выход из процедуры ввода/вывода в канал "P" ; (включение предыдущего rom basic48/128) x00B5 ex af,af' pop af ld bc,#7FFD di ld (x5B5C),a out (c),a ei ex af,af' ret ;АДРЕС: #00C3 обработчик ошибок basic 128k x00C3 ld hl,(#5B8B) jp (hl) ;АДРЕС: #00C7 вход из монитора после "холодного старта" x00C7 ld b,#08 x00C9 ld a,b ;проверка и зануление всех страниц[0..7] памяти exx dec a ld bc,#7FFD out (c),a ld hl,#C000 ld de,#C001 ld bc,#3FFF ld a,#FF ld (hl),a cp (hl) jr nz,x0131 ;битая память xor a ld (hl),a cp (hl) jr nz,x0131 ;битая память ldir exx djnz x00C9 ld (x5B88),a ;АДРЕС: #00ED вход из монитора после "теплого старта" x00ED ld c,#FD ld d,#FF ld e,#BF ld b,d ld a,#0E ;регистр AY #0E out (c),a ;bc=#FFFD ld b,e ;bc=#BFFD ld a,#FF out (c),a jr x0137 x00FF nop ;not used ;АДРЕС: #0100 !!!NOT USED!!! керналь процедур x0100 jp x17AF ;парсер бейсик программы jp x1838 ;выполнение команды из строки редактирования jp x1ECF ;запись данных в RAM 7 jp x1F04 ;чтение данных из RAM 7 jp x004A ;обработчик ошибок basic 128 jp x03A2 ;обработчик ошибок jp x182A ;RETURN jp x18A8 ;NEXT jp x012D ;опрос клавиатуры jp x0A05 ;команда PLAY jp x11A3 ;загрузка байта в порт MIDI jp x06D8 ;процедура ввода из RS232 jp x07CA ;процедура вывода в RS232 jp x08A3 ;передача байта на принтер jp x08F0 ;команда COPY x012D rst #28 ;вызов процедуры из basic 48k dw Rom1.x3B01 ;опрос клавиатуры ret ;АДРЕС: #0131 ошбка проверки памяти (битая память) x0131 exx ld a,b out (#FE),a jr $ ;АДРЕС: #0137 инициализация переменных и печать меню 128k ; de=#FFBF ; c=#FD x0137 ld b,d ;установка регистра #07 AY ld a,#07 out (c),a ld b,e ld a,#FF out (c),a ;выключим звук в AY ld de,#5B00 ld hl,x006B ;п/п переключения страниц памяти ld bc,#0058 ldir ld a,#CF ;обработчик ошибок basic 48 ld (x5B5D),a ld sp,#5BFF ld a,#04 call x1C64 ;включим ram 7 ld ix,#EBEC ;адрес начала каталога rom-disk ld (x5B83),ix ld (ix+#0A),#00 ld (ix+#0B),#C0 ld (ix+#0C),#00 ld hl,#2BEC ;свободное место на rom-disk ld a,#01 ld (x5B85),hl ld (x5B85+2),a ld a,#05 ;ram 0 call x1C64 ld hl,#FFFF ;адрес последнего байта физического ОЗУ ld (#5CB4),hl ld de,#3D00+#01AF ;адрес последнего байта символа "U" в basic 48 ld bc,#00A8 ;копирование символов шрифта [A..U] ex de,hl rst #28 ;вызов п/п из basic 48k dw Rom1.x1661 ;lddr, ret ex de,hl inc hl ld (#5C7B),hl ;адрес начала определяемых пользователем символов dec hl ld bc,#0040 ld (#5C38),bc ld (#5CB2),hl ;последний адрес в ОЗУ разрешенный для basic ;АДРЕС: #019D команда NEW x019D ld hl,#3D00-#100 ;адрес символьного набора ld (#5C36),hl ld hl,(#5CB2) ;Последний адрес в ОЗУ, разрешенный к использованию интерпретатором Бейсика inc hl ld sp,hl im 1 ld iy,#5C3A set 4,(iy+#01) ;режим 128k ei ld hl,#000B ld (x5B5F),hl ;скорость принтера 9600 бод xor a ld (x5B61),a ld (x5B63),a ld (x5B65),a ld hl,#EC00 ;!!!ОШИБКА!!! должно писаться в rqm 7 ld (#FF24),hl ld a,#50 ;ширна печати 80 символов ld (x5B64),a ld hl,#000A ld (x5B94),hl ld (x5B96),hl ld hl,#5CB6 ;копируем нформацию о каналах ld (#5C4F),hl ld de,x0589 ld bc,#0015 ex de,hl ldir ex de,hl dec hl ld (#5C57),hl ;Адрес начала следующей строки бейсик-программы inc hl ld (#5C53),hl ;Адрес начала бейсик-программы ld (#5C4B),hl ;Адрес начала области переменных бейсик-программы ld (hl),#80 ;признак конца переменных бейсика inc hl ld (#5C59),hl ;Адрес начала редактируемой строки ld (hl),#0D inc hl ld (hl),#80 inc hl ld (#5C61),hl ;Адрес начала рабочей области бейсик-программы ld (#5C63),hl ;Адрес начала стека калькулятора ld (#5C65),hl ;Адрес вершины стека калькулятора ld a,#38 ld (#5C8D),a ;Постоянные атрибуты экрана ld (#5C8F),a ;Временные атрибуты, используемые при выводе на экран ld (#5C48),a ;Атрибуты служебного экрана xor a ld (#EC13),a ;!!!ОШИБКА!!! должно писаться в rqm 7 ld a,#07 out (#FE),a ;бордюр ld hl,#0523 ;автоповтор и период задержки ld (#5C09),hl dec (iy-#3A) ;x5C00 dec (iy-#36) ;x5C04 ld hl,x059E ld de,#5C10 ;Область хранения информации о потоках ld bc,#000E ldir res 1,(iy+#01) ld (iy+#00),#FF ;no error ld (iy+#31),#02 ;Количество строк в служебном экране rst #28 ;вызов п/п x0D6B из basic 48k dw Rom1.x0D6B ;CLS rst #28 ;вызов п/п из basic 48k dw Rom1.x3C04 ;проверка Break и вызов теста экрана ld de,x0561 ;1992-94 Scorpion ZS 256 call x057D ;печать строки из de ld (iy+#31),#02 ;Количество строк в служебном экране set 5,(iy+#02) ld hl,x5BFF ld (x5B81),hl call x1F45 ;установка другого стэка и ram 7 ld a,#38 ld (#EC11),a ld (#EC0F),a call x2584 ;подготовка переменных 2-3,1=%11 call x1F20 ;установка другого стэка и ram 0 rst #08 ;вызов функции монитора db #8C ;нажатие Enter и переход на rom 0: #259F nop ;АДРЕС: #026B выполненение введенной строки x026B ld hl,x5B66 ;флаги set 0,(hl) ;режим ld (iy+#00),#FF ;код ошибки ld (iy+#31),#02 ;количество строк в служебном экране ld hl,x5B1D ;сюда вернемся при ошибке push hl ld (#5C3D),sp ld hl,x02BA ld (x5B8B),hl ;сюда вернемся при ошибке call x228E ;поиск начала бейсик команды call x22CB ;проверка токена jp z,x21F8 ;вычисличть числовое выражение cp "(" jp z,x21F8 ;вычисличть числовое выражение cp "-" jp z,x21F8 ;вычисличть числовое выражение cp "+" jp z,x21F8 ;вычисличть числовое выражение call x22E0 ;проверка это число или функция jp z,x21F8 ;вычисличть числовое выражение call x1F45 ;установка другого стэка и ram 7 ld a,(#EC0E) call x1F20 ;установка другого стэка и ram 0 cp #04 jp nz,x17AF ;анализ и выполнение программы call x2297 ;проверка это команда LET? (калькулятор basic 128) jp z,x17AF ;анализ и выполнение программы pop hl ret ;АДРЕС: #02BA сюда возвращаемся после проверки синтаксиса бейсика x02BA bit 7,(iy+#00) jr nz,x02C1 ret ;ошибок не было x02C1 ld hl,(#5C59) ld (#5C5D),hl rst #28 dw Rom1.x19FB ;получить номер редактиремой строки ld a,b or c jp nz,x03F7 rst #18 ;чтение очередного символа строки программы cp #0D ret z call x21EF ;очистка экрана bit 6,(iy+#02) jr nz,x02DF rst #28 dw Rom1.x0D6E ;открыть канал x02DF res 6,(iy+#02) call x1F45 ;установка другого стэка и ram 7 ld hl,#EC0D bit 6,(hl) jr nz,x02F4 inc hl ld a,(hl) cp #00 call z,x3881 ;очистка двух нижних строк экрана x02F4 call x1F20 ;установка другого стэка и ram 0 ld hl,#5C3C res 3,(hl) ld a,#19 sub (iy+#4F) ld (#5C8C),a set 7,(iy+#01) ld (iy+#0A),#01 ;!!!ОШИБКА!!! ld hl,#3E00 push hl ld hl,x5B1D push hl ld (#5C3D),sp ld hl,x0321 ld (x5B8B),hl jp x1838 ;выполнение команды из строки редактирования ;АДРЕС: #0321 обработчик ошибок x0321 ld sp,(#5CB2) inc sp ld hl,x5BFF ld (x5B81),hl halt res 5,(iy+#01) ld hl,x5B66 bit 2,(hl) jr z,x034A call x1F45 ;установка другого стэка и ram 7 ld ix,(x5B83) ld bc,#0014 add ix,bc call x1D56 ;обновление записи каталога call x1F20 ;установка другого стэка и ram 0 x034A ld a,(#5C3A) inc a x034E push af ld hl,#0000 ld (iy+#37),h ld (iy+#26),h ld (#5C0B),hl ld hl,#0001 ld (#5C16),hl rst #28 dw Rom1.x16B0 ;очистка различных областей памяти res 5,(iy+#37) rst #28 dw Rom1.x0D6E ;открыть канал set 5,(iy+#02) pop af ld b,a cp #0A jr c,x037F cp #1D jr c,x037D add a,#14 jr x037F x037D add a,#07 x037F rst #28 dw Rom1.x15EF ;печать символа из a ld a," " rst #10 ld a,b cp #1D jr c,x039C sub #1D ld b,#00 ld c,a ld hl,x046C add hl,bc add hl,bc ld e,(hl) inc hl ld d,(hl) call x057D ;печать строки из de jr x03A2 x039C ld de,Rom1.x1391 rst #28 dw Rom1.x0C0A ;печать сообщения x03A2 xor a ld de,Rom1.x1536 rst #28 dw Rom1.x0C0A ;печать сообщения ld bc,(#5C45) rst #28 dw Rom1.x1A1B ;печать номера строки ld a,":" rst #10 ld c,(iy+#0D) ld b,#00 rst #28 dw Rom1.x1A1B ;печать номера строки rst #28 dw Rom1.x1097 ;очистка памяти ld a,(#5C3A) inc a jr z,x03DF cp #09 jr z,x03CC cp #15 jr nz,x03CF x03CC inc (iy+#0D) x03CF ld bc,#0003 ld de,#5C70 ld hl,#5C44 bit 7,(hl) jr z,x03DD add hl,bc x03DD lddr x03DF ld (iy+#0A),#FF res 3,(iy+#01) ld hl,x5B66 res 0,(hl) jp x25CB ;АДРЕС: #03EF обработчик ошибок x03EF ld a,#10 ld bc,#0000 jp x034E ;АДРЕС: #03F7 вставка строки программы x03F7 ld (#5C49),bc call x1F45 ;установка другого стэка и ram 7 ld a,b or c jr z,x040A ld (#5C49),bc ld (#EC08),bc x040A call x1F20 ;установка другого стэка и ram 0 ld hl,(#5C5D) ex de,hl ld hl,x03EF push hl ld hl,(#5C61) scf sbc hl,de push hl ld h,b ld l,c rst #28 dw Rom1.x196E ;получить начальный адрес строки программы jr nz,x0429 rst #28 dw Rom1.x19B8 ;поиск адрес начала следующей строки программы rst #28 dw Rom1.x19E8 ;удалить массив DIM x0429 pop bc ld a,c dec a or b jr nz,x0442 call x1F45 ;установка другого стэка и ram 7 push hl ld hl,(#5C49) call x334A ;поиск адреса строки бейсик программы ld (#5C49),hl pop hl call x1F20 ;установка другого стэка и ram 0 jr x046A x0442 push bc inc bc inc bc inc bc inc bc x0447 dec hl ld de,(#5C53) push de rst #28 dw Rom1.x1655 ;резервирование места (длина в bc) pop hl ld (#5C53),hl pop bc push bc inc de ld hl,(#5C61) dec hl dec hl lddr ld hl,(#5C49) ex de,hl pop bc ld (hl),b dec hl ld (hl),c dec hl ld (hl),e dec hl ld (hl),d x046A pop af ret ;АДРЕС: #046C адреса сообщений об ошибках x046C dw x048C dw x0497 dw x04A6 dw x04B0 dw x04C1 dw x04D4 dw x04E0 dw x04E0 dw x04F3 dw x0501 dw x0512 dw x0523 dw x0531 dw x0542 dw x054E dw x0561 ;АДРЕС: #048C сообщения об ошибках x048C dc "MERGE error" x0497 dc "Wrong file type" x04A6 dc "CODE error" x04B0 dc "Too many brackets" x04C1 dc "File already exists" x04D4 dc "Invalid name" x04E0 dc "File does not exist" x04F3 dc "Invalid device" x0501 dc "Invalid baud rate" x0512 dc "Invalid note name" x0523 dc "Number too big" x0531 dc "Note out of range" x0542 dc "Out of range" x054E dc "Too many tied notes" x0561 dc " 1992-94 Scorpion ZS 256 " ;АДРЕС: #057D печать строки из de ;вх: de - адрес строки для печати x057D ld a,(de) and #7F push de rst #10 ;печать символа из A pop de ld a,(de) inc de add a,a jr nc,x057D ret ;АДРЕС: #0589 информация о каналах x0589 dw #09F4,#10A8: db "K" dw #09F4,#15C4: db "S" dw #0F81,#15C4: db "R" dw x5B34,x5B2F: db "P" db #80 ;АДРЕС: #059E информация о потоках x059E db #01,#00 ; db #06,#00 db #0B,#00 db #01,#00 db #01,#00 db #06,#00 db #10,#00 ;АДРЕС: #05AC обработка ошибки x05AC pop hl ld bc,#7FFD xor a di ld (x5B5C),a out (c),a ;rom 0, ram 0, scr 5 ei ld sp,(#5C3D) ld a,(hl) ;код ошибки ld (x5B5E),a ;код сообщения для rst 8 basic48 inc a cp #1E ;!!!ОШИБКА!!! должно быть cp #1D jr nc,x05C8 rst #28 ;вызов процедуры из basic 48k dw #5B5D x05C8 dec a ld (iy+#00),a ;код ошибки ld hl,(#5C5D) ;адрес следущего символа в бейсик-программе ld (#5C5F),hl ;адрес синтаксической ошибки rst #28 ;вызов процедуры из basic 48k dw Rom1.x16C5 ;восстановление стэка ret ;АДРЕС: #05D6 проверка нажатия break и печать сообщения x05D6 ld a,#7F x05D8 in a,(#FE) rra ret c ;пробел не нажат ld a,#FE in a,(#FE) rra ret c ;cs не нажата call x05AC ;без возврата db #14 ;L BREAK into program, n:m ;АДРЕС: #05E6 RS232 ввод и вывод x05E6 ei ex af,af' ld de,x5B4A ;п/п включения предыдущего rom bacic48/128 push de res 3,(iy+#02) ;проверка режима вывода не экран не требуется push hl ld hl,(#5C3D) ;адрес стэка при запуске обработки ошибок ld e,(hl) inc hl ld d,(hl) and a ld hl,Rom1.x107F sbc hl,de jr nz,x0637 ;обработчик ошибок в basic128 pop hl ld sp,(#5C3D) pop de pop de ld (#5C3D),de x060A push hl ld de,x0610 push de jp (hl) x0610 jr c,x061B jr z,x0618 x0614 call x05AC ;без возврата db #07 ;8 End of file, n:m x0618 pop hl jr x060A x061B cp #0D jr z,x062D ld hl,(x5B5A) ;адрес возврата в basic128 push hl rst #28 ;вызов процедуры из basic 48k dw Rom1.x0F85 ;добавить код в строку pop hl ld (x5B5A),hl pop hl jr x060A x062D pop hl ld a,(x5B5C) or #10 push af jp x5B4A ;включение basic48 x0637 pop hl ld de,x063D push de jp (hl) x063D ret c ret z jr x0614 ;АДРЕС: #0641 команда FORMAT ; FORMAT "P";9600 x0641 rst #28 dw Rom1.x0018 ;чтение очередного символа строки программы rst #28 dw Rom1.x1C8C ;параметр - строка bit 7,(iy+#01) jr z,x0661 ;проверка синтаксиса rst #28 dw Rom1.x2BF1 ;прочитать значение со стэка калькулятора ld a,c dec a or b jr z,x0659 ;длина строки 1 байт call x05AC ;ошибка db #24 ;i Invalid device x0659 ld a,(de) and #DF cp "P" jp nz,x1912 ;ошибка C Nonsense in BASIC x0661 ld hl,(#5C5D) ld a,(hl) cp ";" jp nz,x1912 ;ошибка C Nonsense in BASIC rst #28 dw Rom1.x0020 ;чтение следующего символа строки программы x066D rst #28 dw Rom1.x1C82 ;получение числового значения bit 7,(iy+#01) jr z,x067D ;проверка синтаксиса rst #28 dw Rom1.x1E99 ;извлечь операнд ld (x5B71),bc x067D rst #28 dw Rom1.x0018 ;чтение очередного символа строки программы cp #0D jr z,x0689 cp ":" jp nz,x1912 ;ошибка C Nonsense in BASIC x0689 call x18A1 ld bc,(x5B71) ld a,b or c jr nz,x0698 call x05AC ;ошибка db #25 ;j invalid baud rate x0698 ld hl,x06B8 x069B ld e,(hl) inc hl ld d,(hl) inc hl ex de,hl ld a,h cp #25 jr nc,x06AF and a sbc hl,bc jr nc,x06AF ex de,hl inc hl inc hl jr x069B x06AF ex de,hl ld e,(hl) inc hl ld d,(hl) ld (x5B5F),de ret x06B8 dw #0032,#0AA5 ;Baud=50. dw #006E,#04D4 ;Baud=110. dw #012C,#01C3 ;Baud=300. dw #0258,#00E0 ;Baud=600. dw #04B0,#006E ;Baud=1200. dw #0960,#0036 ;Baud=2400. dw #12C0,#0019 ;Baud=4800. dw #2580,#000B ;Baud=9600. ;АДРЕС: #06D8 процедура ввода из RS232 x06D8 ld hl,x5B61 ld a,(hl) and a jr z,x06E5 ld (hl),#00 inc hl ld a,(hl) scf ret ;АДРЕС: #06E5 чтение байта из RS232 x06E5 call x05D6 ;проверка нажатия break и печать сообщения di exx ld de,(x5B5F) ld hl,(x5B5F) srl h rr l or a ld b,#FA exx ld c,#FD ld d,#FF ld e,#BF ld b,d ld a,#0E out (c),a ;выбор 14 регистра AY in a,(c) or #F0 and #FB ld b,e out (c),a ld h,a x070E ld b,d in a,(c) and #80 jr z,x071E ;стартовый бит получен x0715 exx dec b exx jr nz,x070E xor a push af jr x0757 ;выход по тайиауту x071E in a,(c) and #80 jr nz,x0715 in a,(c) and #80 jr nz,x0715 exx ld bc,#FFFD ld a,#80 ex af,af' x0731 add hl,de nop nop nop nop x0736 dec hl ld a,h or l jr nz,x0736 in a,(c) and #80 jp z,x074B ex af,af' scf rra jr c,x0754 ex af,af' jp x0731 x074B ex af,af' or a rra jr c,x0754 ex af,af' jp x0731 x0754 scf push af exx x0757 ld a,h or #04 ld b,e out (c),a exx ld h,d ld l,e ld bc,#0007 or a sbc hl,bc x0766 dec hl ld a,h or l jr nz,x0766 ld bc,#FFFD add hl,de add hl,de add hl,de x0771 in a,(c) and #80 jr z,x077F dec hl ld a,h or l jr nz,x0771 pop af ei ret x077F in a,(c) and #80 jr nz,x0771 in a,(c) and #80 jr nz,x0771 ld h,d ld l,e ld bc,#0002 srl h rr l or a sbc hl,bc ld bc,#FFFD ld a,#80 ex af,af' x079D nop nop nop nop add hl,de x07A2 dec hl ld a,h or l jr nz,x07A2 in a,(c) and #80 jp z,x07B7 ex af,af' scf rra jr c,x07C0 ex af,af' jp x079D x07B7 ex af,af' or a rra jr c,x07C0 ex af,af' jp x079D x07C0 ld hl,x5B61 ld (hl),#01 inc hl ld (hl),a pop af ei ret ;АДРЕС: #07CA процедура вывода в RS232 x07CA push af ld a,(x5B65) or a jr z,x07E0 dec a ld (x5B65),a jr nz,x07DB pop af jp x0872 x07DB pop af ld (#5C0F),a ret x07E0 pop af cp #A3 ;SPECTRUM? jr c,x07F2 ;не токен ld hl,(x5B5A) push hl rst #28 dw Rom1.x0B52 ;печать токена pop hl ld (x5B5A),hl scf ret x07F2 ld hl,#5C3B res 0,(hl) cp #20 jr nz,x07FD set 0,(hl) x07FD cp #7F jr c,x0803 ld a,"?" x0803 cp " " jr c,x081E push af ld hl,x5B63 inc (hl) ld a,(x5B64) cp (hl) jr nc,x081A call x0822 ;перевод строки ld a,#01 ld (x5B63),a x081A pop af jp x08A3 ;передача байта на принтер x081E cp #0D jr nz,x0830 ;АДРЕС: #0822 перевод строки на принтере x0822 xor a ld (x5B63),a ld a,#0D jp x08A3 ;АДРЕС: #082B !!!NOT USED!!! взврат каретки на принтере x082B ld a,#0A jp x08A3 ;АДРЕС: #0830 продолжение x07CA процедура вывода в RS232 x0830 cp #06 jr nz,x0853 ld bc,(x5B63) ld e,#00 x083A inc e inc c ld a,c cp b jr z,x0848 x0840 sub #08 jr z,x0848 jr nc,x0840 jr x083A x0848 push de ld a," " call x07CA ;вывод в RS232 pop de dec e ret z jr x0848 x0853 cp #16 jr z,x0860 cp #17 jr z,x0860 cp #10 ret c jr x0869 x0860 ld (#5C0E),a ld a,#02 ld (x5B65),a ret x0869 ld (#5C0E),a ld a,#02 ld (x5B65),a ret x0872 ld d,a ld a,(#5C0E) cp #16 jr z,x0882 cp #17 ccf ret nz ld a,(#5C0F) ld d,a x0882 ld a,(x5B64) cp d jr z,x088A jr nc,x0890 x088A ld b,a ld a,d sub b ld d,a jr x0882 x0890 ld a,d or a jp z,x0822 x0895 ld a,(x5B63) cp d ret z push de ld a," " call x07CA ;вывод в RS232 pop de jr x0895 ;АДРЕС: #08A3 передача байта на принтер x08A3 push hl ld hl,x08EE ex (sp),hl push af ld a,r di push af ld a,#80 jr x08B8 ;АДРЕС: #08B1 rst #08 вызов функции монитора x08B1 push af ld a,r di push af ld a,#01 x08B8 push af inc sp push bc ld bc,#1FFD push hl ld hl,(#C001) ex (sp),hl ld a,#55 ld (#C001),a cpl ld (#C002),a ld a,#12 jp x0024 ;переход в rom 2 ;АДРЕС: #08D1 включение компьютера/"холодный" старт x08D1 ld bc,#692B x08D4 dec bc ;пауза ld a,c or b jr nz,x08D4 ld bc,#1FFD ld a,#12 jp x001C ;переход в rom2: monitor (инициализация) ;АДРЕС: #08E1 !!!NOT USED!!! вход куда-то x08E1 ld bc,#1FFD push hl ld hl,(#C001) ex (sp),hl ld a,#55 jp x3C4A ;АДРЕС: #08EE возврат из x08A3 x08EE ei ret ;АДРЕС: #08F0 команда COPY x08F0 ld hl,x5B72 ld (hl),#2B x08F5 ld hl,x0979 call x095F ;передача на принтер управляющего кода call x0915 ;печать половины строки ld hl,x0980 ;!!!not used call x0822 ;перевод строки ld hl,x5B72 xor a cp (hl) jr z,x090E dec (hl) jr x08F5 x090E ld hl,x0982 call x095F ;передача на принтер управляющего кода ret ;АДРЕС: #0915 печать половины строки x0915 ld hl,x5B71 ld (hl),#FF x091A call x0926 ;печать столбца пикселей (с двойной высотой) ld hl,x5B71 xor a cp (hl) ret z dec (hl) jr x091A ;печать столбца пикселей (с двойной высотой) x0926 ld de,#C000 ld bc,(x5B71) scf rl b scf rl b ld a,c cpl ld c,a xor a push af push de push bc x093A call x096D ;проверить пиксель на экране pop bc pop de ld e,#00 jr z,x0944 ld e,d x0944 pop af or e push af dec b srl d srl d push de push bc jr nc,x093A pop bc pop de pop af ld b,#03 x0955 push bc push af call x08A3 ;передача байта на принтер pop af pop bc djnz x0955 ret ;АДРЕС: #095F передача на принтер управляющего кода x095F ld b,(hl) inc hl x0961 ld a,(hl) push hl push bc call x08A3 ;передача байта на принтер pop bc pop hl inc hl djnz x0961 ret ;АДРЕС: #096D проверить пиксель на экране ;вых: a =#00 пикселя нет x096D rst #28 dw Rom1.x22AA ;рассчитать адрес на экране по координатам ld b,a inc b xor a scf x0974 rra djnz x0974 and (hl) ret ;АДРЕС: #0979 управляющие коды принтера Epson x0979 db #06 ;размер в байтах db #1B,#31 ;ESC '1' - 7/72 дюйма интервал между строками db #1B,#4C,#00,#03 ;ESC 'L' 0 3 - двойная плотность (768 байт на строку) x0980 db #01 ;размер в байтах db #0A ;код перевода строки LF x0982 db #02 ;размер в байтах db #1B,#32 ;ESC '2' - 1/6 дюйма интервал между строками ;АДРЕС: #0985 команда PLAY x0985 di push bc ld de,#0037 ld hl,#003C x098D add hl,de ;hl=#003C + (#0037 * b). djnz x098D ld c,l ld b,h rst #28 dw Rom1.x0030 ;резервирование памяти di push de pop iy push hl pop ix ld (iy+#10),#FF x09A0 ld bc,#FFC9 ;-#37 add ix,bc ld (ix+#03),#3C ld (ix+#01),#FF ld (ix+#04),#0F ld (ix+#05),#05 ld (ix+#21),#00 ld (ix+#0A),#00 ld (ix+#0B),#00 ld (ix+#16),#FF ld (ix+#17),#00 ld (ix+#18),#00 rst #28 ;!!!ошибка!!! dw Rom1.x2BF1 ;прочитать значение со стэка калькулятора di ld (ix+#06),e ld (ix+#07),d ld (ix+#0C),e ld (ix+#0D),d ex de,hl add hl,bc ld (ix+#08),l ld (ix+#09),h pop bc push bc dec b ld c,b ld b,#00 sla c push iy pop hl add hl,bc push ix pop bc x09F4 ld (hl),c inc hl ld (hl),b or a rl (iy+#10) pop bc dec b push bc ld (ix+#02),b jr nz,x09A0 pop bc x0A05 ld (iy+#27),#1A ld (iy+#28),#0B push iy pop hl ld bc,#002B add hl,bc ex de,hl ld hl,x0A31 ld bc,#000D ldir ld d,#07 ld e,#F8 call x0E7C ;вывод значения в регистр AY ld d,#0B ld e,#FF call x0E7C ;вывод значения в регистр AY inc d call x0E7C ;вывод значения в регистр AY jr x0A7D ;АДРЕС: #0A31 расчет задержки x0A31 rst #28 db #A4 ; stk-ten. = x, 10 db #01 ; exchange. = 10, x db #05 ; division. = 10/x db #34 ; stk-data. = 10/x, 7.33e-6 db #DF ; - exponent $6F (floating point number 7.33e-6). db #75 ; - mantissa byte 1 db #F4 ; - mantissa byte 2 db #38 ; - mantissa byte 3 db #75 ; - mantissa byte 4 db #05 ; division. = (10/x)/7.33e-6 db #38 ; end-calc. ret ;АДРЕС: #0A3E опрос клавиши Break x0A3E ld a,#7F in a,(#FE) rra ret c ld a,#FE in a,(#FE) rra ret ;АДРЕС: #0A4A установка указателя на данные для канала AY x0A4A ld bc,#0011 jr x0A52 ;АДРЕС: #0A4F установка указателя на данные для канала AY x0A4F ld bc,#0000 x0A52 push iy pop hl add hl,bc ld (iy+#23),l ld (iy+#24),h ld a,(iy+#10) ld (iy+#22),a ld (iy+#21),#01 ret ;АДРЕС: #0A67 установить адрес блока данных канала x0A67 ld e,(hl) inc hl ld d,(hl) push de pop ix ret ;АДРЕС: #0A6E следующий канал x0A6E ld l,(iy+#23) ld h,(iy+#24) inc hl inc hl ld (iy+#23),l ld (iy+#24),h ret x0A7D call x0A4F ;установка указателя на данные для канала AY x0A80 rr (iy+#22) jr c,x0A8C call x0A67 ;установить адрес блокаданных канала call x0B5C ;найти следующую ноту x0A8C sla (iy+#21) jr c,x0A97 call x0A6E ;следующий канал jr x0A80 x0A97 call x0F91 ;найти наименьшую длительность push de call x0F42 ;проиграть ноты во всех каналах pop de x0A9F ld a,(iy+#10) cp #FF jr nz,x0AAB call x0E93 ;гасим звуки во всех каналах ei ret x0AAB dec de call x0F76 ;ожидание call x0FC1 ;проиграть ноты во всех каналах call x0F91 ;найти наименьшую длительность jr x0A9F ;АДРЕС: #0AB7 список команд x0AB7 db "HZYXWUVMT)(NO!" ;АДРЕС: #0AC5 прочитать текущий символ из строки воспроизведения с инкрементом ;вых: cy=1 данных больше нет x0AC5 call x0EE3 ;прочитать текущий символ из строки воспроизведения ret c ;нет данных inc (ix+#06) ret nz inc (ix+#07) ret ;АДРЕС: #0AD1 получить ноту в полутонах x0AD1 push hl ld c,#00 x0AD4 call x0AC5 ;прочитать текущий символ из строки воспроизведения с инкрементом jr c,x0AE1 cp "&" jr nz,x0AEC ld a,#80 x0ADF pop hl ret x0AE1 ld a,(iy+#21) or (iy+#10) ld (iy+#10),a jr x0ADF x0AEC cp "#" jr nz,x0AF3 inc c jr x0AD4 x0AF3 cp "$" jr nz,x0AFA dec c jr x0AD4 x0AFA bit 5,a jr nz,x0B04 push af ld a,#0C add a,c ld c,a pop af x0B04 and #DF sub "A" jp c,x0F22 ;k Invalid note name cp #07 jp nc,x0F22 ;k Invalid note name push bc ld b,#00 ld c,a ld hl,x0DF9 add hl,bc ld a,(hl) pop bc add a,c pop hl ret ;АДРЕС: #0B1D получить числовое значение параметра x0B1D push hl push de ld l,(ix+#06) ld h,(ix+#07) ld de,#0000 x0B28 ld a,(hl) cp "0" jr c,x0B45 cp "9"+1 jr nc,x0B45 inc hl push hl call x0B50 ;умножение de=de*10 sub #30 ld h,#00 ld l,a add hl,de jr c,x0B42 ;переполнение ex de,hl pop hl jr x0B28 x0B42 jp x0F1A ;l number too big x0B45 ld (ix+#06),l ld (ix+#07),h push de pop bc pop de pop hl ret ;АДРЕС: #0B50 умножение de=de*10 x0B50 ld hl,#0000 ld b,#0A x0B55 add hl,de jr c,x0B42 ;переполнение djnz x0B55 ex de,hl ret ;АДРЕС: #0B5C найти следующую ноту x0B5C call x0A3E ;опрос клавиши Break jr c,x0B69 ;не нажата call x0E93 ;гасим звуки во всех каналах ei call x05AC db #14 ;L Break into program x0B69 call x0AC5 ;прочитать текущий символ из строки воспроизведения с инкрементом jp c,x0DA2 ;нет данных call x0DF0 ;идентификация команды ld b,#00 sla c ld hl,x0DCA add hl,bc ld e,(hl) inc hl ld d,(hl) ex de,hl call x0B84 ;call (hl) jr x0B5C x0B83 ret x0B84 jp (hl) ;АДРЕС: #0B85 команда ! (коментарий) x0B85 call x0AC5 ;прочитать текущий символ из строки воспроизведения с инкрементом jp c,x0DA1 ;конец строки cp "!" ret z jr x0B85 ;АДРЕС: #0B85 команда O (октава) x0B90 call x0B1D ;получить числовое значение параметра ld a,c cp #09 jp nc,x0F12 ;n Out of range sla a sla a ld b,a sla a add a,b ld (ix+#03),a ret ;АДРЕС: #0BA5 команда N (разделитель) x0BA5 ret ;АДРЕС: #0BA6 команда ( (начало цикла) x0BA6 ld a,(ix+#0B) inc a cp #05 jp z,x0F2A ;d Too many brackets ld (ix+#0B),a ld de,#000C call x0C27 ;получить адрес указателя ld a,(ix+#06) ld (hl),a inc hl ld a,(ix+#07) ld (hl),a ret ;АДРЕС: #0BC2 команда ) (конец цикла) x0BC2 ld a,(ix+#16) ld de,#0017 or a jp m,x0BF0 call x0C27 ;получить адрес указателя ld a,(ix+#06) cp (hl) jr nz,x0BF0 inc hl ld a,(ix+#07) cp (hl) jr nz,x0BF0 dec (ix+#16) ld a,(ix+#16) or a ret p bit 0,(ix+#0A) ret z ld (ix+#16),#00 xor a jr x0C0B x0BF0 ld a,(ix+#16) inc a cp #05 jp z,x0F2A ;d Too many brackets ld (ix+#16),a call x0C27 ;получить адрес указателя ld a,(ix+#06) ld (hl),a inc hl ld a,(ix+#07) ld (hl),a ld a,(ix+#0B) x0C0B ld de,#000C call x0C27 ;получить адрес указателя ld a,(hl) ld (ix+#06),a inc hl ld a,(hl) ld (ix+#07),a dec (ix+#0B) ret p ld (ix+#0B),#00 set 0,(ix+#0A) ret ;АДРЕС: #0C27 получить адрес указателя x0C27 push ix pop hl add hl,de ld b,#00 ld c,a sla c add hl,bc ret ;АДРЕС: #0C32 команда T (темп) x0C32 call x0B1D ;получить числовое значение параметра ld a,b or a jp nz,x0F12 ;n Out of range ld a,c cp #3C jp c,x0F12 ;n Out of range cp #F1 jp nc,x0F12 ;n Out of range ld a,(ix+#02) or a ret nz ld b,#00 push bc pop hl add hl,hl add hl,hl push hl pop bc push iy rst #28 dw Rom1.x2D2B ;bc на стэк калькулятора di pop iy push iy push iy pop hl ld bc,#002B add hl,bc ld iy,#5C3A push hl ld hl,x0C76 ld (x5B5A),hl ld hl,x5B14 ex (sp),hl push hl jp x5B00 x0C76 di rst #28 dw Rom1.x2DA2 ;извлечь значение со стэка калькулятора di pop iy ld (iy+#27),c ld (iy+#28),b ret ;АДРЕС: #0C84 команда M (микшер) x0C84 call x0B1D ;получить числовое значение параметра ld a,c cp #40 jp nc,x0F12 ;n Out of range cpl ld e,a ld d,#07 call x0E7C ;вывод значения в регистр AY ret ;АДРЕС: #0C95 команда V (громкость) x0C95 call x0B1D ;получить числовое значение параметра ld a,c cp #10 jp nc,x0F12 ;n Out of range ld (ix+#04),a ;!!!ОШИБКА!!! ld e,(ix+#02) ld a,#08 add a,e ld d,a ld e,c call x0E7C ;вывод значения в регистр AY ret ;АДРЕС: #0CAD команда U (эффекты) x0CAD ld e,(ix+#02) ld a,#08 add a,e ld d,a ld e,#1F ld (ix+#04),e ret ;АДРЕС: #0CBA команда W (эффекты) x0CBA call x0B1D ;получить числовое значение параметра ld a,c cp #08 jp nc,x0F12 ;n Out of range ld b,#00 ld hl,x0DE8 add hl,bc ld a,(hl) ld (iy+#29),a ret ;АДРЕС: #0CCE команда X (эффекты) x0CCE call x0B1D ;получить числовое значение параметра ld d,#0B ld e,c call x0E7C ;вывод значения в регистр AY inc d ld e,b call x0E7C ;вывод значения в регистр AY ret ;АДРЕС: #0CDD команда Y (MIDI канал) x0CDD call x0B1D ;получить числовое значение параметра ld a,c dec a jp m,x0F12 ;n Out of range cp #10 jp nc,x0F12 ;n Out of range ld (ix+#01),a ret ;АДРЕС: #0CEE команда Z (MIDI код) x0CEE call x0B1D ;получить числовое значение параметра ld a,c call x11A3 ;загрузка байта в порт MIDI ret ;АДРЕС: #0CF6 команда H (стоп) x0CF6 ld (iy+#10),#FF ret ;АДРЕС: #0CFB команды 'a'..'g', 'A'..'G', '1'.."12", '&', '_' x0CFB call x0E19 ;это цифра? jp c,x0D81 ;нет call x0DAC ;расчет указателя на длительность call x0DB4 ;установка длительности xor a ld (ix+#21),a call x0EC8 ;получение предыдущего параматра call x0B1D ;получить числовое значение параметра ld a,c or a jp z,x0F12 ;n Out of range cp #0D jp nc,x0F12 ;n Out of range cp #0A jr c,x0D32 call x0E00 ;получить длительность ноты call x0D74 ;увеличение счетчика нот ld (hl),e inc hl ld (hl),d x0D28 call x0D74 ;увеличение счетчика нот inc hl ld (hl),e inc hl ld (hl),d inc hl jr x0D38 x0D32 ld (ix+#05),c call x0E00 ;получить длительность ноты x0D38 call x0D74 ;увеличение счетчика нот x0D3B call x0EE3 ;прочитать текущий символ из строки воспроизведения cp "_" jr nz,x0D6E call x0AC5 ;прочитать текущий символ из строки воспроизведения с инкрементом call x0B1D ;получить числовое значение параметра ld a,c cp #0A jr c,x0D5F push hl push de call x0E00 ;получить длительность ноты pop hl add hl,de ld c,e ld b,d ex de,hl pop hl ld (hl),e inc hl ld (hl),d ld e,c ld d,b jr x0D28 x0D5F ld (ix+#05),c push hl push de call x0E00 ;получить длительность ноты pop hl add hl,de ex de,hl pop hl jp x0D3B x0D6E ld (hl),e inc hl ld (hl),d jp x0D9C ;АДРЕС: #0D74 увеличение счетчика нот x0D74 ld a,(ix+#21) inc a cp #0B jp z,x0F3A ;o Too many tied notes ld (ix+#21),a ret x0D81 call x0EC8 ;получение предыдущего параматра ld (ix+#21),#01 call x0DAC ;расчет указателя на длительность call x0DB4 ;установка длительности ld c,(ix+#05) push hl call x0E00 ;получить длительность ноты pop hl ld (hl),e inc hl ld (hl),d jp x0D9C ;!!!можно убрать x0D9C pop hl inc hl inc hl push hl ret ;АДРЕС: #0DA1 конец строки x0DA1 pop hl x0DA2 ld a,(iy+#21) or (iy+#10) ld (iy+#10),a ret ;АДРЕС: #0DAC расчет указателя на длительность x0DAC push ix pop hl ld bc,#0022 add hl,bc ret ;АДРЕС: #0DB4 установка длительности x0DB4 push hl push iy pop hl ld bc,#0011 add hl,bc ld b,#00 ld c,(ix+#02) sla c add hl,bc pop de ld (hl),e inc hl ld (hl),d ex de,hl ret ;АДРЕС: #0DCA таблица адресов обработки команд x0DCA dw x0CFB ;прочие команды dw x0B85 ; '!' dw x0B90 ; 'O' dw x0BA5 ; 'N' dw x0BA6 ; '(' dw x0BC2 ; ')' dw x0C32 ; 'T' dw x0C84 ; 'M' dw x0C95 ; 'V' dw x0CAD ; 'U' dw x0CBA ; 'W' dw x0CCE ; 'X' dw x0CDD ; 'Y' dw x0CEE ; 'Z' dw x0CF6 ; 'H' ;таблица огибающих x0DE8 db #00 ; W0 - Single decay then off. (Continue off, attack off, alternate off, hold off) db #04 ; W1 - Single attack then off. (Continue off, attack on, alternate off, hold off) db #0B ; W2 - Single decay then hold. (Continue on, attack off, alternate on, hold on) db #0D ; W3 - Single attack then hold. (Continue on, attack on, alternate off, hold on) db #08 ; W4 - Repeated decay. (Continue on, attack off, alternate off, hold off) db #0C ; W5 - Repeated attack. (Continue on, attack on, alternate off, hold off) db #0E ; W6 - Repeated attack-decay. (Continue on, attack on, alternate on, hold off) db #0A ; W7 - Repeated decay-attack. (Continue on, attack off, alternate on, hold off) ;АДРЕС: #0DF0 идентификация команды ;вых: z - команда найдена x0DF0 ld bc,#000F ld hl,x0AB7 cpir ret ;таблица полутонов x0DF9 db #09 ; 'A' db #0B ; 'B' db #00 ; 'C' db #02 ; 'D' db #04 ; 'E' db #05 ; 'F' db #07 ; 'G' ;АДРЕС: #0E00 получить длительность ноты x0E00 push hl ld b,#00 ld hl,x0E0C add hl,bc ld d,#00 ld e,(hl) pop hl ret ;длительность нот x0E0C db #80 ; Rest [Not used since table is always indexed into with a value of 1 or more] db #06 ; Semi-quaver (sixteenth note). db #09 ; Dotted semi-quaver (3/32th note). db #0C ; Quaver (eighth note). db #12 ; Dotted quaver (3/16th note). db #18 ; Crotchet (quarter note). db #24 ; Dotted crotchet (3/8th note). db #30 ; Minim (half note). db #48 ; Dotted minim (3/4th note). db #60 ; Semi-breve (whole note). db #04 ; Triplet semi-quaver (1/24th note). db #08 ; Triplet quaver (1/12th note). db #10 ; Triplet crochet (1/6th note). ;АДРЕС: #0E19 это цифра? ;вых: cy=0 это цифра x0E19 cp "0" ret c cp "9"+1 ccf ret ;АДРЕС: #0E20 проиграть ноту в канале x0E20 ld c,a ld a,(ix+#03) add a,c cp #80 jp nc,x0F32 ;m Note out of range ld c,a ld a,(ix+#02) or a jr nz,x0E3F ld a,c cpl and #7F srl a srl a ld d,#06 ld e,a call x0E7C ;вывод значения в регистр AY x0E3F ld (ix+#00),c ld a,(ix+#02) cp #03 ret nc ld hl,x1096 ld b,#00 ld a,c sub #15 jr nc,x0E57 ld de,#0FBF jr x0E5E x0E57 ld c,a sla c add hl,bc ld e,(hl) inc hl ld d,(hl) x0E5E ex de,hl ld d,(ix+#02) sla d ld e,l call x0E7C ;вывод значения в регистр AY inc d ld e,h call x0E7C ;вывод значения в регистр AY bit 4,(ix+#04) ret z ld d,#0D ld a,(iy+#29) ld e,a call x0E7C ;вывод значения в регистр AY ret ;АДРЕС: #0E7C вывод значения в регистр AY x0E7C push bc ld bc,#FFFD out (c),d ld bc,#BFFD out (c),e pop bc ret ;АДРЕС: #0E89 чтение регистра AY x0E89 push bc ld bc,#FFFD out (c),a in a,(c) pop bc ret ;АДРЕС: #0E93 гасим звуки во всех каналах x0E93 ld d,#07 ld e,#FF call x0E7C ;вывод значения в регистр AY ld d,#08 ld e,#00 call x0E7C ;вывод значения в регистр AY inc d call x0E7C ;вывод значения в регистр AY inc d call x0E7C ;вывод значения в регистр AY call x0A4F ;установка указателя на данные для канала AY x0EAC rr (iy+#22) jr c,x0EB8 call x0A67 ;установить адрес блока данных канала call x118D ;гасим звук в канале MIDI x0EB8 sla (iy+#21) jr c,x0EC3 call x0A6E ;следующий канал jr x0EAC x0EC3 ld iy,#5C3A ret ;АДРЕС: #0EC8 получение предыдущего параматра x0EC8 push hl push de ld l,(ix+#06) ld h,(ix+#07) x0ED0 dec hl ld a,(hl) cp " " jr z,x0ED0 cp #0D jr z,x0ED0 ld (ix+#06),l ld (ix+#07),h pop de pop hl ret ;АДРЕС: #0EE3 прочитать текущий символ из строки воспроизведения ;вых: cy=1 данных больше нет x0EE3 push hl push de push bc ld l,(ix+#06) ld h,(ix+#07) x0EEC ld a,h cp (ix+#09) jr nz,x0EFB ld a,l cp (ix+#08) jr nz,x0EFB scf jr x0F05 x0EFB ld a,(hl) cp " " jr z,x0F09 cp #0D jr z,x0F09 or a x0F05 pop bc pop de pop hl ret x0F09 inc hl ld (ix+#06),l ld (ix+#07),h jr x0EEC ;АДРЕС: #0F12 обработка ошибок x0F12 call x0E93 ;гасим звуки во всех каналах ei call x05AC db #29 ;n Out of range x0F1A call x0E93 ;гасим звуки во всех каналах ei call x05AC db #27 ;l Number too big x0F22 call x0E93 ;гасим звуки во всех каналах ei call x05AC db #26 ;k Invalid note name x0F2A call x0E93 ;гасим звуки во всех каналах ei call x05AC db #1F ;d Too many brackets x0F32 call x0E93 ;гасим звуки во всех каналах ei call x05AC db #28 ;m Note out of range x0F3A call x0E93 ;гасим звуки во всех каналах ei call x05AC db #2A ;o Too many tied notes ;АДРЕС: #0F42 проиграть ноты во всех каналах x0F42 call x0A4F ;установка указателя на данные для канала AY x0F45 rr (iy+#22) jr c,x0F6C call x0A67 ;установить адрес блока данных канала call x0AD1 ;получить ноту в полутонах cp #80 jr z,x0F6C call x0E20 ;проиграть ноту в канале ld a,(ix+#02) cp #03 jr nc,x0F69 ld d,#08 add a,d ld d,a ld e,(ix+#04) call x0E7C ;вывод значения в регистр AY x0F69 call x116E ;проиграть ноту в канале MIDI x0F6C sla (iy+#21) ret c call x0A6E ;следующий канал jr x0F45 ;АДРЕС: #0F76 ожидание x0F76 push hl ld l,(iy+#27) ld h,(iy+#28) ld bc,#0064 or a sbc hl,bc push hl pop bc pop hl x0F86 dec bc ld a,b or c jr nz,x0F86 dec de ld a,d or e jr nz,x0F76 ret ;АДРЕС: #0F91 найти наименьшую длительность x0F91 ld de,#FFFF call x0A4A ;установка указателя на данные для канала AY x0F97 rr (iy+#22) jr c,x0FAF push de ld e,(hl) inc hl ld d,(hl) ex de,hl ld e,(hl) inc hl ld d,(hl) push de pop hl pop bc or a sbc hl,bc jr c,x0FAF push bc pop de x0FAF sla (iy+#21) jr c,x0FBA call x0A6E ;следующий канал jr x0F97 x0FBA ld (iy+#25),e ld (iy+#26),d ret ;АДРЕС: #0FC1 проиграть ноты во всех каналах x0FC1 xor a ld (iy+#2A),a call x0A4F ;установка указателя на данные для канала AY x0FC8 rr (iy+#22) jp c,x105A call x0A67 ;установить адрес блока данных канала push iy pop hl ld bc,#0011 add hl,bc ld b,#00 ld c,(ix+#02) sla c add hl,bc ld e,(hl) inc hl ld d,(hl) ex de,hl push hl ld e,(hl) inc hl ld d,(hl) ex de,hl ld e,(iy+#25) ld d,(iy+#26) or a sbc hl,de ex de,hl pop hl jr z,x0FFC ld (hl),e inc hl ld (hl),d jr x105A x0FFC ld a,(ix+#02) cp #03 jr nc,x100C ld d,#08 add a,d ld d,a ld e,#00 call x0E7C ;вывод значения в регистр AY x100C call x118D ;гасим звук в канале MIDI push ix pop hl ld bc,#0021 add hl,bc dec (hl) jr nz,x1026 call x0B5C ;найти следующую ноту ld a,(iy+#21) and (iy+#10) jr nz,x105A jr x103D x1026 push iy pop hl ld bc,#0011 add hl,bc ld b,#00 ld c,(ix+#02) sla c add hl,bc ld e,(hl) inc hl ld d,(hl) inc de inc de ld (hl),d dec hl ld (hl),e x103D call x0AD1 ;получить ноту в полутонах ld c,a ld a,(iy+#21) and (iy+#10) jr nz,x105A ld a,c cp #80 jr z,x105A call x0E20 ;проиграть ноту в канале ld a,(iy+#21) or (iy+#2A) ld (iy+#2A),a x105A sla (iy+#21) jr c,x1066 call x0A6E ;следующий канал jp x0FC8 x1066 ld de,#0001 call x0F76 ;ожидание call x0A4F ;установка указателя на данные для канала AY x106F rr (iy+#2A) jr nc,x108C call x0A67 ;установить адрес блока данных канала ld a,(ix+#02) cp #03 jr nc,x1089 ld d,#08 add a,d ld d,a ld e,(ix+#04) call x0E7C ;вывод значения в регистр AY x1089 call x116E ;проиграть ноту в канале MIDI x108C sla (iy+#21) ret c call x0A6E ;следующий канал jr x106F ;таблица нот x1096 dw #0FBF; Octave 1, Note 21 - A (27.50 Hz, Ideal=27.50 Hz, Error=-0.01%) C0 dw #0EDC; Octave 1, Note 22 - A# (29.14 Hz, Ideal=29.16 Hz, Error=-0.08%) dw #0E07; Octave 1, Note 23 - B (30.87 Hz, Ideal=30.87 Hz, Error=-0.00%) dw #0D3D; Octave 2, Note 24 - C (32.71 Hz, Ideal=32.70 Hz, Error=+0.01%) C1 dw #0C7F; Octave 2, Note 25 - C# (34.65 Hz, Ideal=34.65 Hz, Error=-0.00%) dw #0BCC; Octave 2, Note 26 - D (36.70 Hz, Ideal=36.71 Hz, Error=-0.01%) dw #0B22; Octave 2, Note 27 - D# (38.89 Hz, Ideal=38.89 Hz, Error=+0.01%) dw #0A82; Octave 2, Note 28 - E (41.20 Hz, Ideal=41.20 Hz, Error=+0.00%) dw #09EB; Octave 2, Note 29 - F (43.66 Hz, Ideal=43.65 Hz, Error=+0.00%) dw #095D; Octave 2, Note 30 - F# (46.24 Hz, Ideal=46.25 Hz, Error=-0.02%) dw #08D6; Octave 2, Note 31 - G (49.00 Hz, Ideal=49.00 Hz, Error=+0.00%) dw #0857; Octave 2, Note 32 - G# (51.92 Hz, Ideal=51.91 Hz, Error=+0.01%) dw #07DF; Octave 2, Note 33 - A (55.01 Hz, Ideal=55.00 Hz, Error=+0.01%) dw #076E; Octave 2, Note 34 - A# (58.28 Hz, Ideal=58.33 Hz, Error=-0.08%) dw #0703; Octave 2, Note 35 - B (61.75 Hz, Ideal=61.74 Hz, Error=+0.02%) dw #069F; Octave 3, Note 36 - C ( 65.39 Hz, Ideal= 65.41 Hz, Error=-0.02%) C2 dw #0640; Octave 3, Note 37 - C# ( 69.28 Hz, Ideal= 69.30 Hz, Error=-0.04%) dw #05E6; Octave 3, Note 38 - D ( 73.40 Hz, Ideal= 73.42 Hz, Error=-0.01%) dw #0591; Octave 3, Note 39 - D# ( 77.78 Hz, Ideal= 77.78 Hz, Error=+0.01%) dw #0541; Octave 3, Note 40 - E ( 82.41 Hz, Ideal= 82.41 Hz, Error=+0.00%) dw #04F6; Octave 3, Note 41 - F ( 87.28 Hz, Ideal= 87.31 Hz, Error=-0.04%) dw #04AE; Octave 3, Note 42 - F# ( 92.52 Hz, Ideal= 92.50 Hz, Error=+0.02%) dw #046B; Octave 3, Note 43 - G ( 98.00 Hz, Ideal= 98.00 Hz, Error=+0.00%) dw #042C; Octave 3, Note 44 - G# (103.78 Hz, Ideal=103.83 Hz, Error=-0.04%) dw #03F0; Octave 3, Note 45 - A (109.96 Hz, Ideal=110.00 Hz, Error=-0.04%) dw #03B7; Octave 3, Note 46 - A# (116.55 Hz, Ideal=116.65 Hz, Error=-0.08%) dw #0382; Octave 3, Note 47 - B (123.43 Hz, Ideal=123.47 Hz, Error=-0.03%) dw #034F; Octave 4, Note 48 - C (130.86 Hz, Ideal=130.82 Hz, Error=+0.04%) C3 dw #0320; Octave 4, Note 49 - C# (138.55 Hz, Ideal=138.60 Hz, Error=-0.04%) dw #02F3; Octave 4, Note 50 - D (146.81 Hz, Ideal=146.83 Hz, Error=-0.01%) dw #02C8; Octave 4, Note 51 - D# (155.68 Hz, Ideal=155.55 Hz, Error=+0.08%) dw #02A1; Octave 4, Note 52 - E (164.70 Hz, Ideal=164.82 Hz, Error=-0.07%) dw #027B; Octave 4, Note 53 - F (174.55 Hz, Ideal=174.62 Hz, Error=-0.04%) dw #0257; Octave 4, Note 54 - F# (185.04 Hz, Ideal=185.00 Hz, Error=+0.02%) dw #0236; Octave 4, Note 55 - G (195.83 Hz, Ideal=196.00 Hz, Error=-0.09%) dw #0216; Octave 4, Note 56 - G# (207.57 Hz, Ideal=207.65 Hz, Error=-0.04%) dw #01F8; Octave 4, Note 57 - A (219.92 Hz, Ideal=220.00 Hz, Error=-0.04%) dw #01DC; Octave 4, Note 58 - A# (232.86 Hz, Ideal=233.30 Hz, Error=-0.19%) dw #01C1; Octave 4, Note 59 - B (246.86 Hz, Ideal=246.94 Hz, Error=-0.03%) dw #01A8; Octave 5, Note 60 - C (261.42 Hz, Ideal=261.63 Hz, Error=-0.08%) C4 Middle C dw #0190; Octave 5, Note 61 - C# (277.10 Hz, Ideal=277.20 Hz, Error=-0.04%) dw #0179; Octave 5, Note 62 - D (294.01 Hz, Ideal=293.66 Hz, Error=+0.12%) dw #0164; Octave 5, Note 63 - D# (311.35 Hz, Ideal=311.10 Hz, Error=+0.08%) dw #0150; Octave 5, Note 64 - E (329.88 Hz, Ideal=329.63 Hz, Error=+0.08%) dw #013D; Octave 5, Note 65 - F (349.65 Hz, Ideal=349.23 Hz, Error=+0.12%) dw #012C; Octave 5, Note 66 - F# (369.47 Hz, Ideal=370.00 Hz, Error=-0.14%) dw #011B; Octave 5, Note 67 - G (391.66 Hz, Ideal=392.00 Hz, Error=-0.09%) dw #010B; Octave 5, Note 68 - G# (415.13 Hz, Ideal=415.30 Hz, Error=-0.04%) dw #00FC; Octave 5, Note 69 - A (439.84 Hz, Ideal=440.00 Hz, Error=-0.04%) dw #00EE; Octave 5, Note 70 - A# (465.72 Hz, Ideal=466.60 Hz, Error=-0.19%) dw #00E0; Octave 5, Note 71 - B (494.82 Hz, Ideal=493.88 Hz, Error=+0.19%) dw #00D4; Octave 6, Note 72 - C (522.83 Hz, Ideal=523.26 Hz, Error=-0.08%) C5 dw #00C8; Octave 6, Note 73 - C# (554.20 Hz, Ideal=554.40 Hz, Error=-0.04%) dw #00BD; Octave 6, Note 74 - D (586.46 Hz, Ideal=587.32 Hz, Error=-0.15%) dw #00B2; Octave 6, Note 75 - D# (622.70 Hz, Ideal=622.20 Hz, Error=+0.08%) dw #00A8; Octave 6, Note 76 - E (659.77 Hz, Ideal=659.26 Hz, Error=+0.08%) dw #009F; Octave 6, Note 77 - F (697.11 Hz, Ideal=698.46 Hz, Error=-0.19%) dw #0096; Octave 6, Note 78 - F# (738.94 Hz, Ideal=740.00 Hz, Error=-0.14%) dw #008D; Octave 6, Note 79 - G (786.10 Hz, Ideal=784.00 Hz, Error=+0.27%) dw #0085; Octave 6, Note 80 - G# (833.39 Hz, Ideal=830.60 Hz, Error=+0.34%) dw #007E; Octave 6, Note 81 - A (879.69 Hz, Ideal=880.00 Hz, Error=-0.04%) dw #0077; Octave 6, Note 82 - A# (931.43 Hz, Ideal=933.20 Hz, Error=-0.19%) dw #0070; Octave 6, Note 83 - B (989.65 Hz, Ideal=987.76 Hz, Error=+0.19%) dw #006A; Octave 7, Note 84 - C (1045.67 Hz, Ideal=1046.52 Hz, Error=-0.08%) C6 dw #0064; Octave 7, Note 85 - C# (1108.41 Hz, Ideal=1108.80 Hz, Error=-0.04%) dw #005E; Octave 7, Note 86 - D (1179.16 Hz, Ideal=1174.64 Hz, Error=+0.38%) dw #0059; Octave 7, Note 87 - D# (1245.40 Hz, Ideal=1244.40 Hz, Error=+0.08%) dw #0054; Octave 7, Note 88 - E (1319.53 Hz, Ideal=1318.52 Hz, Error=+0.08%) dw #004F; Octave 7, Note 89 - F (1403.05 Hz, Ideal=1396.92 Hz, Error=+0.44%) dw #004B; Octave 7, Note 90 - F# (1477.88 Hz, Ideal=1480.00 Hz, Error=-0.14%) dw #0047; Octave 7, Note 91 - G (1561.14 Hz, Ideal=1568.00 Hz, Error=-0.44%) dw #0043; Octave 7, Note 92 - G# (1654.34 Hz, Ideal=1661.20 Hz, Error=-0.41%) dw #003F; Octave 7, Note 93 - A (1759.38 Hz, Ideal=1760.00 Hz, Error=-0.04%) dw #003B; Octave 7, Note 94 - A# (1878.65 Hz, Ideal=1866.40 Hz, Error=+0.66%) dw #0038; Octave 7, Note 95 - B (1979.30 Hz, Ideal=1975.52 Hz, Error=+0.19%) dw #0035; Octave 8, Note 96 - C (2091.33 Hz, Ideal=2093.04 Hz, Error=-0.08%) C7 dw #0032; Octave 8, Note 97 - C# (2216.81 Hz, Ideal=2217.60 Hz, Error=-0.04%) dw #002F; Octave 8, Note 98 - D (2358.31 Hz, Ideal=2349.28 Hz, Error=+0.38%) dw #002D; Octave 8, Note 99 - D# (2463.13 Hz, Ideal=2488.80 Hz, Error=-1.03%) dw #002A; Octave 8, Note 100 - E (2639.06 Hz, Ideal=2637.04 Hz, Error=+0.08%) dw #0028; Octave 8, Note 101 - F (2771.02 Hz, Ideal=2793.84 Hz, Error=-0.82%) dw #0025; Octave 8, Note 102 - F# (2995.69 Hz, Ideal=2960.00 Hz, Error=+1.21%) dw #0023; Octave 8, Note 103 - G (3166.88 Hz, Ideal=3136.00 Hz, Error=+0.98%) dw #0021; Octave 8, Note 104 - G# (3358.81 Hz, Ideal=3322.40 Hz, Error=+1.10%) dw #001F; Octave 8, Note 105 - A (3575.50 Hz, Ideal=3520.00 Hz, Error=+1.58%) dw #001E; Octave 8, Note 106 - A# (3694.69 Hz, Ideal=3732.80 Hz, Error=-1.02%) dw #001C; Octave 8, Note 107 - B (3958.59 Hz, Ideal=3951.04 Hz, Error=+0.19%) dw #001A; Octave 9, Note 108 - C (4263.10 Hz, Ideal=4186.08 Hz, Error=+1.84%) C8 dw #0019; Octave 9, Note 109 - C# (4433.63 Hz, Ideal=4435.20 Hz, Error=-0.04%) dw #0018; Octave 9, Note 110 - D (4618.36 Hz, Ideal=4698.56 Hz, Error=-1.71%) dw #0016; Octave 9, Note 111 - D# (5038.21 Hz, Ideal=4977.60 Hz, Error=+1.22%) dw #0015; Octave 9, Note 112 - E (5278.13 Hz, Ideal=5274.08 Hz, Error=+0.08%) dw #0014; Octave 9, Note 113 - F (5542.03 Hz, Ideal=5587.68 Hz, Error=-0.82%) dw #0013; Octave 9, Note 114 - F# (5833.72 Hz, Ideal=5920.00 Hz, Error=-1.46%) dw #0012; Octave 9, Note 115 - G (6157.81 Hz, Ideal=6272.00 Hz, Error=-1.82%) dw #0011; Octave 9, Note 116 - G# (6520.04 Hz, Ideal=6644.80 Hz, Error=-1.88%) dw #0010; Octave 9, Note 117 - A (6927.54 Hz, Ideal=7040.00 Hz, Error=-1.60%) dw #000F; Octave 9, Note 118 - A# (7389.38 Hz, Ideal=7465.60 Hz, Error=-1.02%) dw #000E; Octave 9, Note 119 - B (7917.19 Hz, Ideal=7902.08 Hz, Error=+0.19%) dw #000D; Octave 10, Note 120 - C ( 8526.20 Hz, Ideal= 8372.16 Hz, Error=+1.84%) C9 dw #000C; Octave 10, Note 121 - C# ( 9236.72 Hz, Ideal= 8870.40 Hz, Error=+4.13%) dw #000C; Octave 10, Note 122 - D ( 9236.72 Hz, Ideal= 9397.12 Hz, Error=-1.71%) dw #000B; Octave 10, Note 123 - D# (10076.42 Hz, Ideal= 9955.20 Hz, Error=+1.22%) dw #000B; Octave 10, Note 124 - E (10076.42 Hz, Ideal=10548.16 Hz, Error=-4.47%) dw #000A; Octave 10, Note 125 - F (11084.06 Hz, Ideal=11175.36 Hz, Error=-0.82%) dw #0009; Octave 10, Note 126 - F# (12315.63 Hz, Ideal=11840.00 Hz, Error=+4.02%) dw #0009; Octave 10, Note 127 - G (12315.63 Hz, Ideal=12544.00 Hz, Error=-1.82%) dw #0008; Octave 10, Note 128 - G# (13855.08 Hz, Ideal=13289.60 Hz, Error=+4.26%) ;АДРЕС: #116E проиграть ноту в канале MIDI x116E ld a,(ix+#01) or a ret m or #90 call x11A3 ;загрузка байта в порт MIDI ld a,(ix+#00) call x11A3 ;загрузка байта в порт MIDI ld a,(ix+#04) res 4,a sla a sla a sla a call x11A3 ;загрузка байта в порт MIDI ret ;АДРЕС: #118D гасим звук в канале MIDI x118D ld a,(ix+#01) or a ret m or #80 call x11A3 ;загрузка байта в порт MIDI ld a,(ix+#00) call x11A3 ;загрузка байта в порт MIDI ld a,#40 call x11A3 ;загрузка байта в порт MIDI ret ;!!!можно оптимизировать ;АДРЕС: #11A3 загрузка байта в порт MIDI x11A3 ld l,a ld bc,#FFFD ld a,#0E out (c),a ld bc,#BFFD ld a,#FA ;Set RS232 'RXD' transmit line to 0 out (c),a ld e,#03 ;задержка 113 тактов x11B4 dec e jr nz,x11B4 nop nop nop nop ld a,l ld d,#08 x11BE rra ld l,a jp nc,x11C9 ld a,#FE ;Set RS232 'RXD' transmit line to 1 out (c),a jr x11CF x11C9 ld a,#FA ;Set RS232 'RXD' transmit line to 0 out (c),a jr x11CF x11CF ld e,#02 x11D1 dec e jr nz,x11D1 nop add a,#00 ld a,l dec d jr nz,x11BE nop nop add a,#00 nop nop ld a,#FE ;Set RS232 'RXD' transmit line to 0 out (c),a ld e,#06 x11E7 dec e jr nz,x11E7 ret ;АДРЕС: #11EB команда SAVE x11EB ld hl,x5B66 set 5,(hl) jr x1205 ;АДРЕС: #11F2 команда LOAD x11F2 ld hl,x5B66 set 4,(hl) jr x1205 ;АДРЕС: #11F2 команда VERIFY x11F9 ld hl,x5B66 set 7,(hl) jr x1205 ;АДРЕС: #1200 команда MERGE x1200 ld hl,x5B66 set 6,(hl) x1205 ld hl,x5B66 ;!!!лишнее res 3,(hl) rst #18 ;чтение очередного символа строки программы cp "!" jp nz,x13BE ;работа с лентой ld hl,x5B66 set 3,(hl) rst #20 ;получение следующего символа из бейсик программы jp x13BE ;работа с RAM диском ;АДРЕС: #1219 ошибка C Nonsense in BASIC x1219 call x05AC db #0B ;C Nonsense in BASIC ;АДРЕС: #121D работа с RAM диском x121D ld (x5B74),hl ld a,(ix+#00) ld (x5B71),a ld l,(ix+#0B) ld h,(ix+#0C) ld (x5B72),hl ld l,(ix+#0D) ld h,(ix+#0E) ld (x5B78),hl ld l,(ix+#0F) ld h,(ix+#10) ld (x5B76),hl or a jr z,x124E ;BASIC cp #03 jr z,x124E ;CODE/SCREEN$ ld a,(ix+#0E) ;DATA ld (x5B76),a x124E push ix pop hl inc hl ld de,x5B67 ld bc,#000A ldir ld hl,x5B66 bit 5,(hl) jp nz,x1BAD ;SAVE ld hl,x5B71 ld de,x5B7A ld bc,#0007 ldir call x1C2E ;загрузка заголовка файла из RAM диска ld a,(x5B7A) ld b,a ld a,(x5B71) cp b jr nz,x1280 ;b Wrong file type cp #03 jr z,x1290 jr c,x1284 x1280 call x05AC db #1D ;b Wrong file type x1284 ld a,(x5B66) bit 6,a jr nz,x12C5 bit 7,a jp z,x12DB x1290 ld a,(x5B66) bit 6,a jr z,x129B call x05AC db #1C ;a MERGE error x129B ld hl,(x5B7B) ld de,(x5B72) ld a,h or l jr z,x12AE sbc hl,de jr nc,x12AE call x05AC db #1E ;c CODE error x12AE ld hl,(x5B7B+2) ld a,h or l jr nz,x12B8 ld hl,(x5B74) x12B8 ld a,(x5B71) and a jr nz,x12C1 ld hl,(#5C53) x12C1 call x137E ;загрузка данных с RAM диска ret x12C5 ld bc,(x5B72) push bc inc bc rst #28 dw Rom1.x0030 ;резервирование памяти x12CE ld (hl),#80 ex de,hl pop de push hl call x137E ;загрузка данных с RAM диска pop hl rst #28 dw Rom1.x08CE ;MERGE ret x12DB ld de,(x5B72) ld hl,(x5B7B+2) push hl ld a,h or l jr nz,x12ED inc de inc de inc de ex de,hl jr x12F6 x12ED ld hl,(x5B7B) ex de,hl scf sbc hl,de jr c,x12FF x12F6 ld de,#0005 add hl,de ld b,h ld c,l rst #28 dw Rom1.x1F05 ;проверка наличия свободной памяти x12FF pop hl ld a,(x5B71) and a jr z,x1335 ld a,h or l jr z,x1315 dec hl ld b,(hl) dec hl ld c,(hl) dec hl inc bc inc bc inc bc rst #28 dw Rom1.x19E8 ;удалить массив DIM x1315 ld hl,(#5C59) dec hl ld bc,(x5B72) push bc inc bc inc bc inc bc ld a,(x5B7F) push af rst #28 dw Rom1.x1655 ;резервирование места (длина в bc) inc hl pop af ld (hl),a pop de inc hl ld (hl),e inc hl ld (hl),d inc hl x1331 call x137E ;загрузка данных с RAM диска ret x1335 ld hl,x5B66 res 1,(hl) ld de,(#5C53) ld hl,(#5C59) dec hl rst #28 dw Rom1.x19E5 ;удалить переменные ld bc,(x5B72) ld hl,(#5C53) rst #28 dw Rom1.x1655 ;резервирование места (длина в bc) inc hl ld bc,(x5B76) add hl,bc ld (#5C4B),hl ld a,(x5B78+1) ld h,a and #C0 jr nz,x1370 ld a,(x5B78) ld l,a ld (#5C42),hl ld (iy+#0A),#00 ld hl,x5B66 set 1,(hl) x1370 ld hl,(#5C53) ld de,(x5B72) dec hl ld (#5C57),hl inc hl jr x1331 ;!!!можно удалить ;АДРЕС: #137E загрузка данных с RAM диска x137E ld a,d or e ret z call x1C4B ;загрузка из RAM диска ret ;АДРЕС: #1385 получить выражения из строки бейсика x1385 rst #28 dw Rom1.x1C8C ;параметр - строка bit 7,(iy+#01) ret z ;проверка синтаксиса push af rst #28 dw Rom1.x2BF1 ;прочитать значение со стэка калькулятора pop af ret ;АДРЕС: #1393 проверка и копирование имени файла x1393 rst #20 call x1385 ;получить выражения из строки бейсика ret z ;проверка синтаксиса push af ld a,c or b jr z,x13BA ;ошибка в имени файла ld hl,#000A sbc hl,bc jr c,x13BA ;ошибка в имени файла push de push bc ld hl,x5B67 ld b,#0A ld a," " x13AD ld (hl),a inc hl djnz x13AD pop bc pop hl ld de,x5B67 ldir pop af ret x13BA call x05AC db #21 ;f Invalid name ;АДРЕС: #13BE работа с лентой/RAM диском x13BE rst #28 dw Rom1.x1C8C ;параметр - строка bit 7,(iy+#01) jr z,x1407 ;проверка синтаксиса ld bc,#0011 ld a,(#5C74) and a jr z,x13D2 ;SAVE ld c,#22 ;" x13D2 rst #28 dw Rom1.x0030 ;резервирование памяти push de pop ix ld b,#0B ld a," " x13DC ld (de),a inc de djnz x13DC ld (ix+#01),#FF rst #28 dw Rom1.x2BF1 ;прочитать значение со стэка калькулятора ld hl,-10 dec bc add hl,bc inc bc jr nc,x1400 ld a,(#5C74) and a jr nz,x13F9 ;не SAVE call x05AC ;ошибка db #0E ;F Invalid file name x13F9 ld a,b or c jr z,x1407 ld bc,#000A x1400 push ix pop hl inc hl ex de,hl ldir x1407 rst #18 ;чтение очередного символа строки программы cp #E4 ;это DATA? jr nz,x145F ;нет ld a,(#5C74) ; 'xxx' "name" DATA cp #03 ;это MERGE? jp z,x1219 ;C Nonsense in BASIC rst #20 ;чтение следующего символа строки программы rst #28 dw Rom1.x28B2 ;LOOK-VARS jr nc,x142F ld hl,#0000 bit 6,(iy+#01) jr z,x1425 set 7,c x1425 ld a,(#5C74) dec a jr z,x1444 call x05AC ;ошибка запись или проверка пустого массива db #01 ;2 Variable not found x142F jp nz,x1219 ;C Nonsense in BASIC bit 7,(iy+#01) jr z,x1451 ;проверка синтаксиса ld c,(hl) inc hl ld a,(hl) ld (ix+#0B),a inc hl ld a,(hl) ld (ix+#0C),a inc hl x1444 ld (ix+#0E),c ld a,#01 ;числовой массив bit 6,c jr z,x144E inc a ;символьный массив x144E ld (ix+#00),a x1451 ex de,hl rst #20 ;чтение следующего символа строки программы cp ")" jr nz,x142F rst #20 ;чтение следующего символа строки программы call x18A1 ex de,hl jp x1519 x145F cp #AA ;SCREEN$ ? jr nz,x1482 ;нет ld a,(#5C74) ; 'xxx' "name" SCREEN$ cp #03 ;это MERGE? jp z,x1219 ;C Nonsense in BASIC rst #20 ;чтение следующего символа строки программы call x18A1 ld (ix+#0B),#00 ld (ix+#0C),#1B ld hl,#4000 ld (ix+#0D),l ld (ix+#0E),h jr x14CF x1482 cp #AF ;CODE ? jr nz,x14D5 ;нет ld a,(#5C74) ; 'xxx' "name" CODE cp #03 ;это MERGE? jp z,x1219 ;C Nonsense in BASIC rst #20 ;чтение следующего символа строки программы rst #28 dw Rom1.x2048 ;PR-ST-END jr nz,x14A0 ld a,(#5C74) and a jp z,x1219 ;C Nonsense in BASIC rst #28 dw Rom1.x1CE6 ;ноль на стэк калькулятора jr x14AF x14A0 rst #28 dw Rom1.x1C82 ;получение числового значения rst #18 ;чтение очередного символа строки программы cp "," jr z,x14B4 ld a,(#5C74) and a jp z,x1219 ;C Nonsense in BASIC x14AF rst #28 dw Rom1.x1CE6 ;ноль на стэк калькулятора jr x14B8 x14B4 rst #20 ;чтение следующего символа строки программы rst #28 dw Rom1.x1C82 ;получение числового значения x14B8 call x18A1 rst #28 dw Rom1.x1E99 ;извлечь операнд ld (ix+#0B),c ld (ix+#0C),b rst #28 dw Rom1.x1E99 ;извлечь операнд ld (ix+#0D),c ld (ix+#0E),b ld h,b ld l,c x14CF ld (ix+#00),#03 jr x1519 x14D5 cp #CA ;LINE ? jr z,x14E2 ;да call x18A1 ;'xxx "name"' / 'SAVE "name" LINE' ld (ix+#0E),#80 jr x14F9 x14E2 ld a,(#5C74) and a ;SAVE ? jp nz,x1219 ;C Nonsense in BASIC rst #20 ;чтение следующего символа строки программы rst #28 dw Rom1.x1C82 ;получение числового значения call x18A1 rst #28 dw Rom1.x1E99 ;извлечь операнд ld (ix+#0D),c ld (ix+#0E),b x14F9 ld (ix+#00),#00 ld hl,(#5C59) ld de,(#5C53) scf sbc hl,de ld (ix+#0B),l ld (ix+#0C),h ld hl,(#5C4B) sbc hl,de ld (ix+#0F),l ld (ix+#10),h ex de,hl x1519 ld a,(x5B66) bit 3,a jp nz,x121D ;операция с RAM диском ld a,(#5C74) and a ;это SAVE ? jr nz,x152B ;нет rst #28 dw Rom1.x0970 ;SAVE ret x152B rst #28 dw Rom1.x0761 ;LOAD/MERGE/VERIFY ret ;АДРЕС: #152F печать бейсик программы от текущей строки x152F ld hl,#EEF5 res 0,(hl) set 1,(hl) x1536 ld hl,(#5C49) ;номер строки ld a,h or l jr nz,x1540 ld (#EC06),hl x1540 ld a,(#F9DB) push af ld hl,(#FC9A) call x334A ;поиск адреса строки бейсик программы ld (#F9D7),hl call x3222 ;установка буфера редактирования в верху экрана call x30D6 ;установка буфера редактирования внизу экрана pop af x1554 or a jr z,x1563 push af call x30DF ;сдвиг строк в буфере редактирования вверх ex de,hl call x326A ;копирование строки бейсик программы в буфер редактирования вверзу экрана pop af dec a jr x1554 x1563 ld c,#00 call x30B4 ;расчет адреса начала строки в буфере редактирования ld b,c ld a,(#EC15) ld c,a push bc push de x156F call x30DF ;сдвиг строк в буфере редактирования вверх ld a,(#EEF5) bit 1,a jr z,x1596 push de push hl ld de,#0020 add hl,de bit 0,(hl) jr z,x1594 inc hl ld d,(hl) inc hl ld e,(hl) or a ld hl,(#5C49) sbc hl,de jr nz,x1594 ld hl,#EEF5 set 0,(hl) x1594 pop hl pop de x1596 push bc push hl ld bc,#0023 ldir pop hl pop bc push de push bc ex de,hl ld hl,#EEF5 bit 0,(hl) jr z,x15D3 ld b,#00 x15AB ld hl,(#EC06) ld a,h or l jr z,x15C0 push hl ;!!!ОШИБКА!!! call x2E41 ;поиск в строке вправо от курсора редактируемого символа pop hl jr nc,x15CB dec hl inc b ld (#EC06),hl jr x15AB x15C0 call x2E41 ;поиск в строке вправо от курсора редактируемого символа call nc,x2E63 ;поиск в строке влево от курсора редактируемого символа ld hl,#EEF5 ld (hl),#00 x15CB ld a,b pop bc push bc ld c,b ld b,a call x2A11 ;сохранить позицию курсора x15D3 pop bc pop de ld a,c inc b cp b jr nc,x156F ld a,(#EEF5) bit 1,a jr z,x1602 bit 0,a jr nz,x1602 ld hl,(#5C49) ld a,h or l jr z,x15F4 ld (#FC9A),hl call x3222 ;установка буфера редактирования в верху экрана jr x15FD x15F4 ld (#FC9A),hl call x3352 ;преобразование номера строки в ASCII и помещение в буфер ld (#5C49),hl x15FD pop de pop bc jp x1536 x1602 pop de pop bc cp a x1605 push af ld a,c ld c,b call x30B4 ;расчет адреса начала строки в буфере редактирования ex de,hl x160C push af call x3604 ;печать строки редактируемого буфера pop af ld de,#0023 add hl,de inc c cp c jr nc,x160C pop af ret z call x2A07 ;получение позиции курсора x161E call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере ld hl,(#EC06) dec hl ld a,h or l ld (#EC06),hl jr nz,x161E jp x2A11 ;сохранить позицию курсора ret ;!!!не используется!!! ;АДРЕС: #1630 очистка окна редактирования x1630 ld b,#00 ld a,(#EC15) ld d,a jp x3B5E ;очистка строк экрана ;АДРЕС: #1639 сдвиг всех строк в буфере редактирования верх и обновление экрана x1639 ld b,#00 push hl ld c,b call x30B4 ;расчет адреса начала строки в буфере редактирования call x326A ;копирование строки бейсик программы в буфер редактирования вверзу экрана pop hl ret nc call x30DF ;сдвиг строк в буфере редактирования вверх x1648 push bc push hl ld hl,#0023 add hl,de ld a,(#EC15) ld c,a cp b jr z,x1663 push bc x1656 push bc ld bc,#0023 ldir pop bc ld a,c inc b cp b jr nz,x1656 pop bc x1663 pop hl call x3618 ;сдвиг вверх строк в буфере редактирования при необходимости ld bc,#0023 ldir scf pop bc ret ;АДРЕС: #166F сдвиг всех строк в буфер редактирования вниз с обновлением экрана x166F ld b,#00 call x322B ;перемещение курсора вверх в верхнем буфере редактирования ret nc ;АДРЕС: #1675 сдвиг всех строк в буфер редактирования вниз с обновлением экрана ;вых: cy=0 буфер переполнен ; b - последняя строка x1675 push bc push hl ;сдвиг всех строк в буфере вниз ld a,(#EC15) ;номер строки в буфере редактирования ld c,a call x30B4 ;расчет адреса начала строки в буфере редактирования call x311E ;сдвиг строк в буфере редактирования вниз jr nc,x16A9 ;буфер переполнен dec de ld hl,#0023 add hl,de ex de,hl push bc ld a,b cp c jr z,x169A x168E push bc ld bc,#0023 lddr pop bc ld a,b dec c cp c jr c,x168E ;все строки сдвинуты вниз x169A ex de,hl inc de pop bc ;c - номер строки pop hl ;адрес следуюющей строки call x362C ;сдвиг вниз строк в буфере редактирования при необходимости ld bc,#0023 ldir scf pop bc ret ;буфер переполнен x16A9 pop hl pop bc ret ;АДРЕС: #16AC вставка символа в строку буфера редактирования ;вх: de - адрес начала строки в буфере ; a - код символа ; b - crd X ;вых: a - код последнего символа строки ; z - сждвигать больше нечего x16AC push de ld h,#00 ld l,b add hl,de ;адрес символа в буфере ld d,a ld a,b x16B3 ld e,(hl) ld (hl),d ld d,e inc hl inc a cp #20 jr c,x16B3 ld a,e cp #00 pop de ret ;АДРЕС: #16C1 вставка символа в строку буфера редактирования со сдвигом влево x16C1 push de ld hl,#0020 add hl,de push hl ld d,a ld a,#1F jr x16D3 x16CC ld e,(hl) ld (hl),d ld d,e cp b jr z,x16D6 dec a x16D3 dec hl jr x16CC x16D6 ld a,e cp #00 pop hl pop de ret ;АДРЕС: #16DC смещения до параметров команды x16DC db #B1 ; DEF FN -> #178D (ROM 0) db #C9 ; CAT -> #17A6 (ROM 0) db #BC ; FORMAT -> #179A (ROM 0) db #BE ; MOVE -> #179D (ROM 0) db #C3 ; ERASE -> #17A3 (ROM 0) db #AF ; OPEN # -> #1790 (ROM 0) db #B4 ; CLOSE # -> #1796 (ROM 0) db #93 ; MERGE -> #1776 (ROM 0) db #91 ; VERIFY -> #1775 (ROM 0) db #92 ; BEEP -> #1777 (ROM 0) db #95 ; CIRCLE -> #177B (ROM 0) db #98 ; INK -> #177F (ROM 0) db #98 ; PAPER -> #1780 (ROM 0) db #98 ; FLASH -> #1781 (ROM 0) db #98 ; BRIGHT -> #1782 (ROM 0) db #98 ; INVERSE -> #1783 (ROM 0) db #98 ; OVER -> #1784 (ROM 0) db #98 ; OUT -> #1785 (ROM 0) db #7F ; LPRINT -> #176D (ROM 0) db #81 ; LLIST -> #1770 (ROM 0) db #2E ; STOP -> #171E (ROM 0) db #6C ; READ -> #175D (ROM 0) db #6E ; DATA -> #1760 (ROM 0) db #70 ; RESTORE -> #1763 (ROM 0) db #48 ; NEW -> #173C (ROM 0) db #94 ; BORDER -> #1789 (ROM 0) db #56 ; CONTINUE -> #174C (ROM 0) db #3F ; DIM -> #1736 (ROM 0) db #41 ; REM -> #1739 (ROM 0) db #2B ; FOR -> #1724 (ROM 0) db #17 ; GO TO -> #1711 (ROM 0) db #1F ; GO SUB -> #171A (ROM 0) db #37 ; INPUT -> #1733 (ROM 0) db #77 ; LOAD -> #1774 (ROM 0) db #44 ; LIST -> #1742 (ROM 0) db #0F ; LET -> #170E (ROM 0) db #59 ; PAUSE -> #1759 (ROM 0) db #2B ; NEXT -> #172C (ROM 0) db #43 ; POKE -> #1745 (ROM 0) db #2D ; PRINT -> #1730 (ROM 0) db #51 ; PLOT -> #1755 (ROM 0) db #3A ; RUN -> #173F (ROM 0) db #6D ; SAVE -> #1773 (ROM 0) db #42 ; RANDOMIZE -> #1749 (ROM 0) db #0D ; IF -> #1715 (ROM 0) db #49 ; CLS -> #1752 (ROM 0) db #5C ; DRAW -> #1766 (ROM 0) db #44 ; CLEAR -> #174F (ROM 0) db #15 ; RETURN -> #1721 (ROM 0) db #5D ; COPY -> #176A (ROM 0) ;АДРЕС: #170E синтаксические параметры команд (аналогично basic 48 #1A7A) ; CLASS-00 - больше нет операндов ; CLASS-01 - используется в LET. требуется переменная ; CLASS-02 - используется в LET. за ним выражение числовое или строковое ; CLASS-03 - за этим следует числовое выражение (=0 при отсутствии) ; CLASS-04 - за этим следует односимвольная переменная ; CLASS-05 - ; CLASS-06 - за этим следует числовое выражение ; CLASS-07 - работа с атрибутами ; CLASS-08 - два числа через запятую ; CLASS-09 - два числа через запятую (могут быть упраляющие цветом коды) ; CLASS-0A - строка ; CLASS-0B - для работы с кассетой/RAM-диском ; CLASS-0C - то же что и CLASS-00, но вызывается из ROM 0 ; CLASS-0D - то же что и CLASS-06, но вызывается из ROM 0 ; CLASS-0E - обрабатывается в ROM 0 x170E db #01 ; CLASS-01 LET db "=" ; = db #02 ; CLASS-02 x1711 db #06 ; CLASS-06 GO TO db #00 ; CLASS-00 dw Rom1.x1E67 ; GO TO routine in ROM 1 x1715 db #06 ; CLASS-06 IF db #CB ; 'THEN' db #0E ; CLASS-0E dw x1967 ; IF routine in ROM 0 x171A db #06 ; CLASS-06 GO SUB db #0C ; CLASS-0C dw x1A53 ; GO SUB routine in ROM 0 x171E db #00 ; CLASS-00 STOP dw Rom1.x1CEE ; STOP routine in ROM 1 x1721 db #0C ; CLASS-0C RETURN dw x1A6F ; RETURN routine in ROM 0 x1724 db #04 ; CLASS-04 FOR db "=" ; '=' db #06 ; CLASS-06 db #CC ; 'TO' db #06 ; CLASS-06 db #0E ; CLASS-0E dw x1981 ; FOR routine in ROM 0 x172C db #04 ; CLASS-04 NEXT db #00 ; CLASS-00 dw Rom1.x1DAB ; NEXT routine in ROM 1 x1730 db #0E ; CLASS-0E PRINT dw x2178 ; PRINT routine in ROM 0 x1733: db #0E ; CLASS-0E INPUT dw x218C ; INPUT routine in ROM 0 x1736 db #0E ; CLASS-0E DIM dw x21D5 ; DIM routine in ROM 0 x1739 db #0E ; CLASS-0E REM dw x1862 ; REM routine in ROM 0 x173C db #0C ; CLASS-0C NEW dw x21AA ; NEW routine in ROM 0 x173F db #0D ; CLASS-0D RUN dw x1A02 ; RUN routine in ROM 0 x1742 db #0E ; CLASS-0E LIST dw x1B75 ; LIST routine in ROM 0 x1745 db #08 ; CLASS-08 POKE db #00 ; CLASS-00 dw Rom1.x1E80 ; POKE routine in ROM 1 x1749 db #03 ; CLASS-03 RANDOMIZE dw Rom1.x1E4F ; RANDOMIZE routine in ROM 1 x174C db #00 ; CLASS-00 CONTINUE dw Rom1.x1E5F ; CONTINUE routine in ROM 1 x174F db #0D ; CLASS-0D CLEAR dw Rom1.x1A0D ; CLEAR routine in ROM 0 x1752 db #00 ; CLASS-00 CLS dw Rom1.x0D6B ; CLS routine in ROM 1 x1755 db #09 ; CLASS-09 PLOT db #00 ; CLASS-00 dw Rom1.x22DC ; PLOT routine in ROM 1 x1759 db #06 ; CLASS-06 PAUSE db #00 ; CLASS-00 dw Rom1.x1F3A ; PAUSE routine in ROM 1 x175D db #0E ; CLASS-0E READ dw x19AB ; READ routine in ROM 0 x1760 db #0E ; CLASS-0E DATA dw x19EB ; DATA routine in ROM 0 x1763 db #03 ; CLASS-03 RESTORE dw Rom1.x1E42 ; RESTORE routine in ROM 1 x1766 db #09 ; CLASS-09 DRAW db #0E ; CLASS-0E dw x21BE ; DRAW routine in ROM 0 x176A db #0C ; CLASS-0C COPY dw x21A7 ; New COPY routine in ROM 0. x176D db #0E ; CLASS-0E LPRINT dw x2174 ; LPRINT routine in ROM 0 x1770 db #0E ; CLASS-0E LLIST dw x1B71 ; LLIST routine in ROM 0 x1773 db #0B ; CLASS-0B SAVE x1774 db #0B ; CLASS-0B LOAD x1775 db #0B ; CLASS-0B VERIFY x1776 db #0B ; CLASS-0B MERGE x1777 db #08 ; CLASS-08 BEEP db #00 ; CLASS-00 dw Rom1.x03F8 ; BEEP routine in ROM 1 x177B db #09 ; CLASS-09 CIRCLE db #0E ; CLASS-0E dw x21AE ; CIRCLE routine in ROM 0 x177F db #07 ; CLASS-07 INK x1780 db #07 ; CLASS-07 PAPER x1781 db #07 ; CLASS-07 FLASH x1782 db #07 ; CLASS-07 BRIGHT x1783 db #07 ; CLASS-07 INVERSE x1784 db #07 ; CLASS-07 OVER x1785 db #08 ; CLASS-08 OUT db #00 ; CLASS-00 dw Rom1.x1E7A ; OUT routine in ROM 1 x1789 db #06 ; CLASS-06 BORDER db #00 ; CLASS-00 dw Rom1.x2294 ; BORDER routine in ROM 1 x178D db #0E ; CLASS-0E DEF FN dw x1A8C ; DEF FN routine in ROM 0 x1790 db #06 ; CLASS-06 OPEN # db "," ; ',' db #0A ; CLASS-0A db #00 ; CLASS-00 dw Rom1.x1736 ; OPEN # routine in ROM 1 x1796 db #06 ; CLASS-06 CLOSE # db #00 ; CLASS-00 dw Rom1.x16E5 ; CLOSE # routine in ROM 1 x179A db #0E ; CLASS-0E FORMAT dw x0641 ; FORMAT routine in ROM 0 x179D db #0A ; CLASS-0A MOVE db "," ; ',' db #0A ; CLASS-0A db #0C ; CLASS-0C dw x1AF0 ; Just execute a RET x17A3 db #0E ; CLASS-0E ERASE dw x1C0C ; ERASE routine in ROM 0 x17A6 db #0E ; CLASS-0E CAT dw x1BE5 ; CAT routine in ROM 0 x17A9 db #0C ; CLASS-0C SPECTRUM dw x1B2B ; SPECTRUM routine in ROM 0 x17AC: db #0E ; CLASS-0E PLAY dw x2317 ; PLAY routine in ROM 0 ;АДРЕС: #17AF анализ и выполнение бейсик программы x17AF res 7,(iy+#01) rst #28 ;вызов процедуры из basic 48k dw Rom1.x19FB ;получить номер редактиремой строки xor a ld (#5C47),a dec a ld (#5C3A),a jr x17C1 x17C0 rst #20 ;получить следующий символ x17C1 rst #28 ;вызов процедуры из basic 48k dw Rom1.x16BF ;очистка рабочего буфера inc (iy+#0D) ;номер оператора в строке jp m,x1912 ;слишком много операторов. ошибка rst #18 ;получение кода символа ld b,#00 cp #0D jp z,x1863 ;это enter - конец строки cp ":" jr z,x17C0 ;следующая команда ld hl,x1821 ;сюда вернемся push hl ld c,a rst #20 ;получить следующий символ ld a,c sub #CE jr nc,x17F4 ;это DEF FN и дальше add a,#CE ld hl,x17A9 cp #A3 jr z,x1800 ;это SPECTRUM ld hl,x17AC cp #A4 jr z,x1800 ;это PLAY jp x1912 ;ошибка x17F4 ld c,a ld hl,x16DC add hl,bc ld c,(hl) add hl,bc jr x1800 x17FD ld hl,(#5C74) ;вызов п/п обработки команды x1800 ld a,(hl) inc hl ld (#5C74),hl ld bc,x17FD ;сюда вернемся push bc ld c,a cp #20 jr nc,x181A ;это разделитель ld hl,x18B5 ld b,#00 add hl,bc ld c,(hl) add hl,bc push hl ;п/п обработки класса rst #18 ;читаем код команды dec b ret x181A rst #18 ;читаем код команды cp c jp nz,x1912 rst #20 ;читаем код следующей команды ret x1821 call x05D6 ;проверка нажатия break и печать сообщения jr c,x182A call x05AC ;обработка ошибки без возврата db #14 ;L Break into program x182A bit 7,(iy+#0A) jp nz,x18A8 ld hl,(#5C42) ;номер строки бейсик программы bit 7,h jr z,x184C ;это строка программы x1838 ld hl,#FFFE ;выполнение команды из строки редактирования ld (#5C45),hl ld hl,(#5C61) dec hl ld de,(#5C59) dec de ld a,(#5C44) jr x1882 ;следующая строка программы ;новая строка программы x184C rst #28 ;вызов процедуры из basic 48k dw Rom1.x196E ;получить начальный адрес строки программы ld a,(#5C44) jr z,x1870 ;поиск следующей строки and a jr nz,x189D ;N Statement lost ld b,a ld a,(hl) and #C0 ld a,b jr z,x1870 ;еще не конец программы call x05AC ;обработка ошибки без возврата db #FF ;0 OK ;обработка команды: REM x1862 pop bc ;обработка конца строки программы x1863 bit 7,(iy+#01) ret z ;это проверка синтаксиса ld hl,(#5C55) ;адрес следующей строки программы ld a,#C0 and (hl) ret nz ;следующая строка программы в RAM xor a ;поиск следующей строки x1870 cp #01 adc a,#00 ld d,(hl) inc hl ld e,(hl) ;номер строки программы ld (#5C45),de inc hl ld e,(hl) inc hl ld d,(hl) ;длина строки программы ex de,hl add hl,de inc hl ;следующая строка программы x1882 ld (#5C55),hl ;адрес следующей строки ex de,hl ld (#5C5D),hl ld d,a ld e,#00 ld (iy+#0A),#FF ;номер следующего оператора в строке dec d ld (iy+#0D),d ;номер выполняемого оператора jp z,x17C0 ;первая команда в строке inc d rst #28 ;вызов процедуры из basic 48k dw Rom1.x198B ;поиск команды в строке jr z,x18A8 ;команда найдена x189D call x05AC db #16 ;N Statement lost ;следующая строка программы x18A1 bit 7,(iy+#01) ret nz ;выполнение программы pop bc pop bc ;следующая команда в строке программы x18A8 rst #18 ;читаем символ из строки cp #0D jr z,x1863 ;конец строки cp ":" jp z,x17C0 ;следующая команда jp x1912 ;ошибка: noncens in basic ;АДРЕС: #18B5 таблица смещений до процедур обработки класса оператора x18B5 db x18D9-$ ;CLASS-00 -> x18D9 = #24 db x18F9-$ ;CLASS-01 -> x18F9 = #43 db x18FD-$ ;CLASS-02 -> x18FD = #46 db x18D6-$ ;CLASS-03 -> x18D6 = #1E db x1905-$ ;CLASS-04 -> x1905 = #4C db x18DA-$ ;CLASS-05 -> x18DA = #20 db x190E-$ ;CLASS-06 -> x190E = #53 db x191A-$ ;CLASS-07 -> x191A = #5E db x190A-$ ;CLASS-08 -> x190A = #4D db x1944-$ ;CLASS-09 -> x1944 = #86 db x1916-$ ;CLASS-0A -> x1916 = #57 db x1948-$ ;CLASS-0B -> x1948 = #88 db x18C7-$ ;CLASS-0C -> x18C7 = #06 db x18C4-$ ;CLASS-0D -> x18C4 = #02 db x18C8-$ ;CLASS-0E -> x18C8 = #05 ;АДРЕС: #18C4 классы #0C,#0D,#0E x18C4 rst #28 ;вызов процедуры из basic 48k dw Rom1.x1CDE ;получение параметра-числа x18C7 cp a x18C8 pop bc call z,x18A1 ;если проверка синтаксиса, переход к следующей команде ex de,hl ld hl,(#5C74) ld c,(hl) inc hl ld b,(hl) ex de,hl push bc ret ;АДРЕС: #18D6 классы #00,#03,#05 x18D6 rst #28 ;вызов процедуры из basic 48k dw Rom1.x1CDE ;получение параметра-числа x18D9 cp a x18DA pop bc call z,x18A1 ;если проверка синтаксиса, переход к следующей команде ex de,hl ld hl,(#5C74) ld c,(hl) inc hl ld b,(hl) ex de,hl push hl ld hl,x18F8 ;сюда вернемся ld (x5B5A),hl ld hl,x5B14 ex (sp),hl push hl ld h,b ld l,c ex (sp),hl jp x5B00 x18F8 ret ;АДРЕС: #18F9 класс #01 x18F9 rst #28 ;вызов процедуры из basic 48k dw Rom1.x1C1F ;идентификация переменной ret ;АДРЕС: #18FD класс #02 x18FD pop bc rst #28 ;вызов процедуры из basic 48k dw Rom1.x1C56 ;получить значение параметра call x18A1 ;если проверка синтаксиса, переход к следующей команде ret ;АДРЕС: #1905 класс #04 FOR/NEXT x1905 rst #28 ;вызов процедуры из basic 48k dw Rom1.x1C6C ;FOR i ret ;АДРЕС: #1909 класс #08 x1909 rst #20 x190A rst #28 ;вызов процедуры из basic 48k dw Rom1.x1C7A ;получение двух значений ret ;АДРЕС: #190E класс #06 x190E rst #28 ;вызов процедуры из basic 48k dw Rom1.x1C82 ;получение числового значения ret ;АДРЕС: #1912 ошибка C Nonsense in BASIC x1912 call x05AC db #0B ;C Nonsense in BASIC ;АДРЕС: #1916 класс #0A x1916 rst #28 ;вызов процедуры из basic 48k dw Rom1.x1C8C ;параметр - строка ret ;АДРЕС: #191A класс #07 x191A bit 7,(iy+#01) res 0,(iy+#02) jr z,x1927 ;проверка синтаксиса rst #28 ;вызов процедуры из basic 48k dw Rom1.x0D4D ;копирование атрибутов x1927 pop af ld a,(#5C74) sub #28+(low x177F) ;#A7 rst #28 ;вызов процедуры из basic 48k dw Rom1.x21FC ;изменение временных атрибутов call x18A1 ;если проверка синтаксиса, переход к следующей команде ld hl,(#5C8F) ;ATTR_T ld (#5C8D),hl ;ATTR_P ld hl,#5C91 ;P_FLAG ld a,(hl) rlca xor (hl) and #AA xor (hl) ld (hl),a ret ;АДРЕС: #1944 класс #09 x1944 rst #28 ;вызов процедуры из basic 48k dw Rom1.x1CBE ;установка необязательных атрибутов для печати ret ;АДРЕС: #1948 класс #0B x1948 pop af ld a,(x5B66) and #0F ld (x5B66),a ld a,(#5C74) sub 1+(low x1773) ;#74 ld (#5C74),a jp z,x11EB ;SAVE dec a jp z,x11F2 ;LOAD dec a jp z,x11F9 ;VERIFY jp x1200 ;MERGE ;АДРЕС: #1967 команда IF x1967 pop bc bit 7,(iy+#01) jr z,x197E ;проверка синтаксиса ld hl,(#5C65) ld de,-5 add hl,de ld (#5C65),hl rst #28 ;вызов процедуры из basic 48k dw Rom1.x34E9 ;проверка значения на ноль jp c,x1863 ;если не ноль переход на следующую строку x197E jp x17C1 ;перехд на следующую команду (THEN) ;АДРЕС: #1981 команда FOR x1981 cp #CD jr nz,x198E ;ищем оператор STEP rst #20 call x190E ;получение числового значения call x18A1 ;если проверка синтаксиса, переход к следующей команде jr x19A6 x198E call x18A1 ;если проверка синтаксиса, переход к следующей команде ld hl,(#5C65) ld (hl),#00 ;поместим значение на стэк калькулятора inc hl ld (hl),#00 inc hl ld (hl),#01 inc hl ld (hl),#00 inc hl ld (hl),#00 inc hl ld (#5C65),hl x19A6 rst #28 ;вызов процедуры из basic 48k dw Rom1.x1D16 ret ;АДРЕС: #19AA команда READ x19AA rst #20 x19AB call x18F9 ;идентификация переменной bit 7,(iy+#01) jr z,x19E2 ;проверка синтаксиса rst #18 ld (#5C5F),hl ld hl,(#5C57) ld a,(hl) cp "," jr z,x19CB ld e,#E4 ;поиск оператора DATA rst #28 dw Rom1.x1D86 ;поиск оператора jr nc,x19CB ;оператор найден call x05AC db #0D ;E Out of Data x19CB inc hl ld (#5C5D),hl ld a,(hl) rst #28 dw Rom1.x1C56 ;извлечь значение rst #18 ld (#5C57),hl ld hl,(#5C5F) ld (iy+#26),#00 ld (#5C5D),hl ld a,(hl) x19E2 rst #18 cp "," jr z,x19AA call x18A1 ;если проверка синтаксиса, переход к следующей команде ret ;АДРЕС: #19EB команда DATA x19EB bit 7,(iy+#01) jr nz,x19FC ;исполнение программы x19F1 rst #28 dw Rom1.x24FB ;ищем следующее выражение cp "," call nz,x18A1 ;если проверка синтаксиса, переход к следующей команде rst #20 jr x19F1 x19FC ld a,#E4 x19FE rst #28 dw Rom1.x1E39 ;проверить инструкцию DATA или DEF FN ret ;АДРЕС: #1A02 команда RUN x1A02 rst #28 dw Rom1.x1E67 ;команда GO TO ld bc,#0000 rst #28 dw Rom1.x1E45 jr x1A10 ;АДРЕС: #1A0D команда CLEAR x1A0D rst #28 dw Rom1.x1E99 ;извлечь операнд x1A10 ld a,b or c jr nz,x1A18 ld bc,(#5CB2) x1A18 push bc ld de,(#5C4B) ld hl,(#5C59) dec hl rst #28 dw Rom1.x19E5 ;удалить переменные rst #28 dw Rom1.x0D6B ;CLS ld hl,(#5C65) ld de,#0032 add hl,de pop de sbc hl,de jr nc,x1A3B ld hl,(#5CB4) and a sbc hl,de jr nc,x1A3F x1A3B call x05AC db #15 ;M Ramtop no good x1A3F ld (#5CB2),de pop de pop hl pop bc ld sp,(#5CB2) inc sp push bc push hl ld (#5C3D),sp push de ret ;АДРЕС: #1A53 команда GO SUB x1A53 pop de ld h,(iy+#0D) inc h ex (sp),hl inc sp ld bc,(#5C45) push bc push hl ld (#5C3D),sp push de rst #28 dw Rom1.x1E67 ;команда GO TO ld bc,#0014 rst #28 dw Rom1.x1F05 ;проверка наличия свободной памяти ret ;АДРЕС: #1A6F команда RETURN x1A6F pop bc pop hl pop de ld a,d cp #3E jr z,x1A86 dec sp ex (sp),hl ex de,hl ld (#5C3D),sp push bc ld (#5C42),hl ld (iy+#0A),d ret x1A86 push de push hl call x05AC db #06 ;7 RETURN without GO SUB ;АДРЕС: #1A8C команда DEF FN x1A8C bit 7,(iy+#01) jr z,x1A97 ;проверка синтаксиса ld a,#CE jp x19FE x1A97 set 6,(iy+#01) rst #28 dw Rom1.x2C8D ;это буква? jr nc,x1AB6 ;нет rst #20 cp "$" jr nz,x1AAA res 6,(iy+#01) rst #20 x1AAA cp "(" jr nz,x1AEA rst #20 cp ")" jr z,x1AD3 x1AB3 rst #28 dw Rom1.x2C8D ;это буква? x1AB6 jp nc,x1912 ;ошибка ex de,hl rst #20 cp "$" jr nz,x1AC1 ex de,hl rst #20 x1AC1 ex de,hl ld bc,#0006 rst #28 dw Rom1.x1655 ;резервирование места (длина в bc) inc hl inc hl ld (hl),#0E cp "," jr nz,x1AD3 rst #20 jr x1AB3 x1AD3 cp ")" jr nz,x1AEA rst #20 cp "=" jr nz,x1AEA rst #20 ld a,(#5C3B) push af rst #28 dw Rom1.x24FB ;ищем следующее выражение pop af xor (iy+#01) and #40 x1AEA jp nz,x1912 ;ошибка call x18A1 ;АДРЕС: #1AF0 команда MOVE x1AF0 ret ;АДРЕС: #1AF1 пункт меню Tape Loader x1AF1 ld hl,#EC0E ld (hl),#FF call x1F20 ;установка другого стэка и ram 0 rst #28 dw Rom1.x16B0 ;очистка различных областей памяти ld hl,(#5C59) ld bc,#0003 rst #28 dw Rom1.x1655 ;резервирование места (длина в bc) ld hl,x1B6E ld de,(#5C59) ld bc,#0003 x1B0F ldir ;АДРЕС: #1B11 анализ и выполненение введенной строки x1B11 call x026B ;анализ и выполненение введенной строки ;АДРЕС: #1B14 пункт меню редактора Print (печать на принтер) x1B14 call x1F20 ;установка другого стэка и ram 0 rst #28 ;вызов процедуры из basic 48k dw Rom1.x16B0 ;очистка различных областей памяти ld hl,(#5C59) ;адрес начала редактируемой строки ld bc,#0001 rst #28 ;вызов процедуры из basic 48k dw Rom1.x1655 ;резервирование места (длина в bc) ld hl,(#5C59) ;адрес начала редактируемой строки ld (hl),#E1 ;команда LLIST call x026B ;исполнение команды (без возврата) ;АДРЕС: #1B2B команда SPECTRUM x1B2B call x1B53 ;установка канала 'P' ld sp,(#5C3D) pop hl ld hl,Rom1.x1303 ;основной цикл basic 48 push hl ld hl,Rom1.x0013 ;адрес с байтом #FF в rom 1 push hl ld hl,x0008 ;обработчик ошибок push hl ;!!!ОШИБКА!!! ld a,#20 ;basic48, блокировка #7FFD, ram 0 ld (x5B5C),a jp x5B00 ;АДРЕС: #1B47 пунт меню BASIC 48. включение basic48, блокировка #7FFD и переход на адрес #0000 x1B47 ld hl,#0000 ;АДРЕС: #1B4A включение basic48, блокировка #7FFD и переход на адрес в hl x1B4A push hl ld a,#20 ld (x5B5C),a jp x5B00 ;АДРЕС: #1B53 установка канала 'P' x1B53 ld hl,(#5C4F) ;адрес начала области информации о каналах ld de,#0005 add hl,de ;канал S ld de,#000A ex de,hl add hl,de ex de,hl ;канал P ld bc,#0004 ldir res 3,(iy+#30) ;курсор L res 4,(iy+#01) ;режим zx-48 ret ;АДРЕС: #1B6E данные для команды LOAD "" x1B6E db #EF,#22,#22 ;load "" ;АДРЕС: #1B71 команда LLIST x1B71 ld a,#03 jr x1B77 ;АДРЕС: #1B75 команда LIST x1B75 ld a,#02 x1B77 ld (iy+#02),#00 rst #28 dw Rom1.x2530 ;проверка флага проверка/исполнение программы jr z,x1B83 ;проверка rst #28 dw Rom1.x1601 ;открыть канал x1B83 rst #28 ;!!!можно rst #18 dw Rom1.x0018 ;чтение очередного символа строки программы x1B86 rst #28 dw Rom1.x2070 ;нужно ли изменять поток? jr c,x1BA3 ;не нужно rst #28 ;!!!можно rst #18 dw Rom1.x0018 ;чтение очередного символа строки программы x1B8E cp ";" jr z,x1B96 cp "," jr nz,x1B9E x1B96 rst #28 dw Rom1.x0020 ;чтение следующего символа строки программы x1B99 call x190E ;получение числового значения jr x1BA6 x1B9E rst #28 dw Rom1.x1CE6 ;ноль на стэк калькулятора jr x1BA6 x1BA3 rst #28 dw Rom1.x1CDE ;получение параметра-числа x1BA6 call x18A1 rst #28 dw Rom1.x1825 ;LIST-5+3 ret ;АДРЕС: #1BAD команда RAM disk SAVE! x1BAD ld (x5B81),sp ld sp,x5BFF call x1C97 ;создание новой записи в каталоге RAM-диска ld bc,(x5B72) ld hl,-9 or #FF sbc hl,bc call x1CF3 ;коррекция сводного места на RAM диске ld bc,#0009 ld hl,x5B71 call x1DAC ;сохранение данных на RAM диске ld hl,(x5B74) ld bc,(x5B72) call x1DAC ;сохранение данных на RAM диске call x1D56 ;обновление записи каталога ld a,#05 ;ram 0 call x1C64 ld sp,(x5B81) ret ;АДРЕС: #1BE5 команда RAM disk CAT! x1BE5 rst #28 dw Rom1.x0018 ;чтение очередного символа строки программы cp "!" jp nz,x1912 ;ошибка rst #28 dw Rom1.x0020 ;чтение следующего символа строки программы call x18A1 ld a,#02 ;канал #02 rst #28 dw Rom1.x1601 ;открыть канал ld (x5B81),sp ld sp,x5BFF call x20D2 ;печать каталога RAM диска ld a,#05 ;ram 0 call x1C64 ld sp,(x5B81) ret ;АДРЕС: #1C0C команда RAM disk EARSE! x1C0C rst #28 dw Rom1.x0018 ;чтение очередного символа строки программы cp "!" jp nz,x1912 ;ошибка call x1393 ;проверка и копирование имени файла call x18A1 ld (x5B81),sp ld sp,x5BFF call x1F5F ;удаление файла из RAM диска ld a,#05 ;ram 0 call x1C64 ld sp,(x5B81) ret ;АДРЕС: #1C2E загрузка заголовка файла из RAM диска x1C2E ld (x5B81),sp ld sp,x5BFF call x1D35 ;поиск файла на RAM диске ld hl,x5B71 ld bc,#0009 call x1E37 ;загрузка данных с RAM диска ld a,#05 ;ram 0 call x1C64 ld sp,(x5B81) ret ;АДРЕС: #1C4B загрузка из RAM диска x1C4B ld (x5B81),sp ld sp,x5BFF ld b,d ld c,e call x1E37 ;загрузка данных с RAM диска call x1D56 ;обновление записи каталога ld a,#05 ;ram 0 call x1C64 ld sp,(x5B81) ret ;АДРЕС: #1C64 включение логической страницы в A x1C64 push hl push bc ld hl,x1C81 ld b,#00 ld c,a add hl,bc ld c,(hl) di ld a,(x5B5C) and #F8 or c ld (x5B5C),a ld bc,#7FFD out (c),a ei pop bc pop hl ret x1C81 db #01,#03,#04,#06,#07,#00 ;АДРЕС: #1C87 сравнение имени файла с заданным ;вых: z - имена совпадают x1C87 ld de,x5B67 x1C8A push ix pop hl ld b,#0A x1C8F ld a,(de) inc de cp (hl) inc hl ret nz djnz x1C8F ret ;АДРЕС: #1C97 создание новой записи в каталоге RAM-диска x1C97 call x1D12 ;поиск имени файла в каталоге jr z,x1CA0 ;имя не найдено call x05AC db #20 ;e File already exists x1CA0 push ix ld bc,#3FEC ;максимальный размер каталога add ix,bc pop ix jr nc,x1D0E ;нехватает памяти ld hl,-20 ld a,#FF call x1CF3 ;коррекция сводного места на RAM диске ld hl,x5B66 set 2,(hl) push ix ;копируем имя файла pop de ld hl,x5B67 ld bc,#000A ldir set 0,(ix+#13) ;запись обновлена ld a,(ix+#0A) ;адрес начала файла = адрес конца файла ld (ix+#10),a ld a,(ix+#0B) ld (ix+#11),a ld a,(ix+#0C) ld (ix+#12),a xor a ld (ix+#0D),a ;длина файла =#000000 ld (ix+#0E),a ld (ix+#0F),a ld a,#05 call x1C64 ;ram 0 push ix pop hl ld bc,-20 add hl,bc ld (x5B83),hl ret ;АДРЕС: #1CF3 коррекция сводного места на RAM диске x1CF3 ld de,(x5B85) ex af,af' ld a,(x5B85+2) ld c,a ex af,af' bit 7,a jr nz,x1D0A add hl,de adc a,c x1D03 ld (x5B85),hl ld (x5B85+2),a ret x1D0A add hl,de adc a,c jr c,x1D03 x1D0E call x05AC db #03 ;4 Out of memory ;АДРЕС: #1D12 поиск имени файла в каталоге ;вых: z - файл не найден ; nz - файл наден -> ix - адрес дескриптора x1D12 ld a,#04 ;ram 7 call x1C64 ld ix,#EBEC ;адрес первой записи в каталоге x1D1B ld de,(x5B83) or a push ix pop hl sbc hl,de ret z call x1C87 ;сравнение имени файла с заданным jr nz,x1D2E ;имя не совпало or #FF ret x1D2E ld bc,-20 add ix,bc jr x1D1B ;АДРЕС: #1D35 поиск файла на RAM диске x1D35 call x1D12 ;поиск имени файла в каталоге jr nz,x1D3E ;найден call x05AC db #23 ;h File does not exist x1D3E ld a,(ix+#0A) ld (ix+#10),a ld a,(ix+#0B) ld (ix+#11),a ld a,(ix+#0C) ld (ix+#12),a ld a,#05 ;ram 0 call x1C64 ret ;АДРЕС: #1D56 обновление записи каталога x1D56 ld a,#04 ;ram 7 call x1C64 bit 0,(ix+#13) ret z ;обновлять не надо res 0,(ix+#13) ld hl,x5B66 res 2,(hl) ld l,(ix+#10) ld h,(ix+#11) ld a,(ix+#12) ld e,(ix+#0A) ld d,(ix+#0B) ld b,(ix+#0C) or a sbc hl,de sbc a,b rl h rl h sra a rr h sra a rr h ld (ix+#0D),l ld (ix+#0E),h ld (ix+#0F),a ld l,(ix+#10) ld h,(ix+#11) ld a,(ix+#12) ld bc,-20 add ix,bc ld (ix+#0A),l ld (ix+#0B),h ld (ix+#0C),a ret ;АДРЕС: #1DAC сохранение данных на RAM диске ;вх: hl - откуда ; bc - сколько x1DAC ld a,b or c ret z push hl ld de,#C000 ex de,hl sbc hl,de jr z,x1DD5 jr c,x1DD5 push hl sbc hl,bc jr nc,x1DCC ld h,b ld l,c pop bc or a sbc hl,bc ex (sp),hl ld de,#C000 push de jr x1DF4 x1DCC pop hl pop hl ld de,#0000 push de push de jr x1DF4 x1DD5 ld h,b ld l,c ld de,#0020 or a sbc hl,de jr c,x1DE4 ex (sp),hl ld b,d ld c,e jr x1DE9 x1DE4 pop hl ld de,#0000 push de x1DE9 push bc ld de,x5B98 ldir pop bc push hl ld hl,x5B98 x1DF4 ld a,#04 call x1C64 ;ram 7 ld e,(ix+#10) ld d,(ix+#11) ld a,(ix+#12) call x1C64 x1E05 ldi ld a,d or e jr z,x1E24 x1E0B ld a,b or c jp nz,x1E05 ld a,#04 ;ram 7 call x1C64 ld (ix+#10),e ld (ix+#11),d ld a,#05 ;ram 0 call x1C64 pop hl pop bc jr x1DAC x1E24 ld a,#04 ;ram 7 call x1C64 inc (ix+#12) ld a,(ix+#12) ld de,#C000 call x1C64 jr x1E0B ;АДРЕС: #1E37 загрузка данных с RAM диска ;вх: hl - куда ; bc - сколько x1E37 ld a,b or c ret z push hl ld de,#C000 ex de,hl sbc hl,de jr z,x1E67 jr c,x1E67 push hl sbc hl,bc jr nc,x1E5C ld h,b ld l,c pop bc or a sbc hl,bc ex (sp),hl ld de,#0000 push de ld de,#C000 push de ex de,hl jr x1E80 x1E5C pop hl pop hl ld de,#0000 push de push de push de ex de,hl jr x1E80 x1E67 ld h,b ld l,c ld de,#0020 or a sbc hl,de jr c,x1E76 ex (sp),hl ld b,d ld c,e jr x1E7B x1E76 pop hl ld de,#0000 push de x1E7B push bc push hl ld de,x5B98 x1E80 ld a,#04 ;ram 7 call x1C64 ld l,(ix+#10) ld h,(ix+#11) ld a,(ix+#12) call x1C64 x1E91 ldi ld a,h or l jr z,x1EBC x1E97 ld a,b or c jp nz,x1E91 ld a,#04 ;ram 0 call x1C64 ld (ix+#10),l ld (ix+#11),h ld a,#05 ;ram 7 call x1C64 pop de pop bc ld hl,x5B98 ld a,b or c jr z,x1EB7 ldir x1EB7 ex de,hl pop bc jp x1E37 x1EBC ld a,#04 ;ram 0 call x1C64 inc (ix+#12) ld a,(ix+#12) ld hl,#C000 call x1C64 jr x1E97 ;АДРЕС: #1ECF !!!NOT USED!!! запись данных в RAM 7 ;вх: hl - откуда ; de - куда ; bc - сколько x1ECF push af ld a,(x5B5C) push af push hl push de push bc ld ix,x5B67+3 ;x5B6A ld (ix+#10),e ld (ix+#11),d ld (ix+#12),#04 call x1DAC ;сохранение данных на RAM диске x1EE8 ld a,#05 ;ram 0 call x1C64 pop bc pop de pop hl add hl,bc ex de,hl add hl,bc ex de,hl pop af ld bc,#7FFD di out (c),a ld (x5B5C),a ei ld bc,#0000 pop af ret ;АДРЕС: #1F04 !!!NOT USED!!! чтение данных из RAM 7 x1F04 push af ld a,(x5B5C) push af push hl push de push bc ld ix,x5B67+3 ;x5B6A ld (ix+#10),l ld (ix+#11),h ld (ix+#12),#04 ex de,hl call x1E37 ;загрузка данных с RAM диска jr x1EE8 ;АДРЕС: #1F20 установка другого стэка и ram 0 x1F20 ex af,af' ld a,#00 di call x1F3A ;включение страницы ram 0 pop af ld (x5B58),hl ld hl,(x5B81) ld (x5B81),sp ld sp,hl ei ld hl,(x5B58) push af ex af,af' ret ;АДРЕС: #1F3A включение физической страницы ram ;вх: a - номер страницы x1F3A push bc ld bc,#7FFD out (c),a ld (x5B5C),a pop bc ret ;АДРЕС: #1F45 установка другого стэка и ram 7 ;вх: (x5B81) - адрес другого стэка x1F45 ex af,af' di pop af ld (x5B58),hl ld hl,(x5B81) ld (x5B81),sp ld sp,hl ld hl,(x5B58) push af ld a,#07 call x1F3A ;включение страницы ram ei ex af,af' ret ;АДРЕС: #1F5F удаление файла из RAM диска x1F5F call x1D12 ;поиск имени файла в каталоге jr nz,x1F68 ;файл найден call x05AC db #23 ;h File does not exist x1F68 ld l,(ix+#0D) ld h,(ix+#0E) ld a,(ix+#0F) call x1CF3 ;коррекция свободного места на RAM диске push iy ld iy,(x5B83) ld bc,-20 add ix,bc ld l,(iy+#0A) ld h,(iy+#0B) ld a,(iy+#0C) pop iy ld e,(ix+#0A) ld d,(ix+#0B) ld b,(ix+#0C) or a sbc hl,de sbc a,b rl h rl h sra a rr h sra a rr h ld bc,#0014 add ix,bc ld (ix+#10),l ld (ix+#11),h ld (ix+#12),a ld bc,-20 add ix,bc ld l,(ix+#0A) ld h,(ix+#0B) ld d,(ix+#0C) ld bc,#0014 add ix,bc ld a,d call x1C64 ld a,(x5B5C) ld e,a ld bc,#7FFD ld a,#07 ;rom 0, ram 7 di out (c),a exx ld l,(ix+#0A) ld h,(ix+#0B) ld d,(ix+#0C) ld a,d call x1C64 ld a,(x5B5C) ld e,a ld bc,#7FFD exx x1FEA ld a,#07 ;rom 0, ram 7 di out (c),a ld a,(ix+#10) sub #01 ld (ix+#10),a jr nc,x200D ld a,(ix+#11) sub #01 ld (ix+#11),a jr nc,x200D ld a,(ix+#12) sub #01 ld (ix+#12),a jr c,x203E x200D out (c),e ld a,(hl) inc l jr nz,x2024 inc h jr nz,x2024 ex af,af' inc d ld a,d call x1C64 ld a,(x5B5C) ld e,a ld hl,#C000 ex af,af' x2024 exx di out (c),e ld (hl),a inc l jr nz,x203B inc h jr nz,x203B inc d ld a,d call x1C64 ld a,(x5B5C) ld e,a ld hl,#C000 x203B exx jr x1FEA x203E ld a,#04 call x1C64 ld a,#00 ld hl,#0014 call x1CF3 ;коррекция свободного места на RAM диске ld e,(ix+#0D) ld d,(ix+#0E) ld c,(ix+#0F) ld a,d rlca rl c rlca rl c ld a,d and #3F ld d,a push ix x2061 push de ld de,-20 add ix,de pop de ld l,(ix+#0A) ld h,(ix+#0B) ld a,(ix+#0C) or a sbc hl,de sub c bit 6,h jr nz,x207C set 6,h dec a x207C ld (ix+#0A),l ld (ix+#0B),h ld (ix+#0C),a ld l,(ix+#10) ld h,(ix+#11) ld a,(ix+#12) or a sbc hl,de sub c bit 6,h jr nz,x2099 set 6,h dec a x2099 ld (ix+#10),l ld (ix+#11),h ld (ix+#12),a push ix pop hl push de ld de,(x5B83) or a sbc hl,de pop de jr nz,x2061 ld de,(x5B83) pop hl push hl or a sbc hl,de ld b,h ld c,l pop hl push hl ld de,#0014 add hl,de ex de,hl pop hl dec de dec hl lddr ld hl,(x5B83) ld de,#0014 add hl,de ld (x5B83),hl ret ;АДРЕС: #20D2 печать каталога RAM диска x20D2 ld a,#04 ;ram 7 call x1C64 ld hl,x2121 x20DA ld bc,x212B ld ix,#EBEC x20E1 call x05D6 ;проверка нажатия break и печать сообщения push ix ex (sp),hl ld de,(x5B83) or a sbc hl,de pop hl jr z,x2111 ld d,h ld e,l push hl push bc call x1C8A ;сравнение имени файла с заданным pop bc pop hl jr nc,x210A ld d,b ld e,c push hl push bc call x1C8A ;сравнение имени файла с заданным pop bc pop hl jr c,x210A push ix pop bc x210A ld de,-20 add ix,de jr x20E1 x2111 push hl ld hl,x212B or a sbc hl,bc pop hl ret z ld h,b ld l,c call x2135 ;печать одной записи каталога RAM диска jr x20DA x2121 ds #0A,#00 x212B ds #0A,#FF ;АДРЕС: #2135 печать одной записи каталога RAM диска x2135 push hl push bc pop hl ld de,x5B67 ld bc,#000A ldir ld a,#05 call x1C64 ;rom 0 ld hl,(x5B81) ld (x5B81),sp ld sp,hl ld hl,x5B67 ld b,#0A x2152 ld a,(hl) push hl push bc rst #28 dw Rom1.x0010 ;печать символа из A pop bc pop hl inc hl djnz x2152 ld a,#0D rst #28 dw Rom1.x0010 ;перевод строки rst #28 dw Rom1.x0D4D ;копиравоние атрибутов ld hl,(x5B81) ld (x5B81),sp ld sp,hl ld a,#04 ;ram 7 call x1C64 pop hl ret ;АДРЕС: #2174 команда LPRINT x2174 ld a,#03 jr x217A ;АДРЕС: #2178 команда PRINT x2178 ld a,#02 x217A rst #28 dw Rom1.x2530 ;проверка флага проверка/исполнение программы jr z,x2182 rst #28 dw Rom1.x1601 ;открыть канал x2182 rst #28 dw Rom1.x0D4D ;копиравоние атрибутов rst #28 dw Rom1.x1FDF ;PRINT_2 call x18A1 ret ;АДРЕС: #218C команда INPUT x218C rst #28 dw Rom1.x2530 ;проверка флага проверка/исполнение программы jr z,x2199 ld a,#01 rst #28 dw Rom1.x1601 ;открыть канал rst #28 ;!!!ОШИБКА!!! dw Rom1.x0D6E x2199 ld (iy+#02),#01 rst #28 dw Rom1.x20C1 ;ввод данных по input call x18A1 rst #28 dw Rom1.x20A0 ;ввод с клавиатуры ret ;АДРЕС: #21A7 команда COPY x21A7 jp x08F0 ;АДРЕС: #21AA команда NEW x21AA di jp x019D ;АДРЕС: #21AE команда CIRCLE x21AE rst #18 cp "," jr nz,x21EB ;ошибка rst #20 rst #28 dw Rom1.x1C82 ;получение числового значения call x18A1 rst #28 dw Rom1.x232D ;печать окружности ret ;АДРЕС: #21BE команда DRAW x21BE rst #18 cp "," jr z,x21CA call x18A1 rst #28 dw Rom1.x2477 ;печать линии ret x21CA rst #20 rst #28 dw Rom1.x1C82 ;получение числового значения call x18A1 rst #28 dw Rom1.x2394 ;печать линии ret ;АДРЕС: #21D5 команда DIM x21D5 rst #28 dw Rom1.x28B2 ;LOOK-VARS jr nz,x21EB rst #28 dw Rom1.x2530 ;проверка флага проверка/исполнение программы jr nz,x21E7 res 6,c rst #28 dw Rom1.x2996 ;проверкае синтаксиса выражения, заключенного в скобки call x18A1 x21E7 rst #28 dw Rom1.x2C15 ;D-RUN ret x21EB call x05AC db #0B ;C Nonsense in BASIC ;АДРЕС: #21EF очистка экрана x21EF bit 0,(iy+#30) ret z rst #28 dw Rom1.x0DAF ;очистить экран ret ;АДРЕС: #21F8 вычисличть числовое выражение x21F8 ld hl,#FFFE ld (#5C45),hl ;выполнение оператора в непосредственном режиме res 7,(iy+#01) ;проверка синтаксиса call x228E ;поиск начала бейсик команды rst #28 ;вызов процедуры из basic 48k dw Rom1.x24FB ;анализ строки bit 6,(iy+#01) jr z,x223A ;обработка символьного выражения rst #18 ;получить символ cp #0D jr nz,x223A set 7,(iy+#01) ;выполнение программы call x228E ;поиск начала бейсик команды ld hl,x0321 ;адрес возврата при ошибке ld (x5B8B),hl rst #28 dw Rom1.x24FB ;анализ строки bit 6,(iy+#01) jr z,x223A ;обработка символьного выражения ld de,x5B8D ;адрес последней длины, выводимой при вычислениях ld hl,(#5C65) ;адрес вершины стэка калькулятора ld bc,#0005 or a sbc hl,bc ldir jp x223E x223A call x05AC ;без возврата db #19 ;Q Parameter error, n:m x223E ld a,#0D call x226F ;обработка нажатой клавиши ld bc,#0001 rst #28 ;вызов процедуры из basic 48k dw Rom1.x0030 ;резервирование места x2249 ld (#5C5B),hl ;адрес символа редактируемой строки push hl ld hl,(#5C51) ;адрес описателя текущего канала push hl ld a,#FF ;канал -1 rst #28 ;вызов процедуры из basic 48k dw Rom1.x1601 ;открыть канал rst #28 ;вызов процедуры из basic 48k dw Rom1.x2DE3 ;печать числа с плавающей точкой pop hl rst #28 ;вызов процедуры из basic 48k dw Rom1.x1615 ;установка флагов канала (возврат предыдущего канала) pop de ld hl,(#5C5B) ;адрес символа редактируемой строки and a sbc hl,de x2264 ld a,(de) call x226F ;обработка нажатой клавиши inc de dec hl ld a,h or l jr nz,x2264 ret ;АДРЕС: #226F обработка нажатой клавиши ;вх: a - код клавиши x226F push hl push de call x1F45 ;установка другого стэка и ram 7 ld hl,#EC0D res 3,(hl) push af ld a,#02 rst #28 dw Rom1.x1601 ;открыть канал #02 pop af call x2669 ;обработка нажатия клавиши ld hl,#EC0D res 3,(hl) call x1F20 ;установка другого стэка и ram 0 pop de pop hl ret ;АДРЕС: #228E поиск начала бейсик команды x228E ld hl,(#5C59) dec hl ld (#5C5D),hl rst #20 ;получение следующего символа в бейсик программе ret ;АДРЕС: #2297 проверка это команда LET? (калькулятор basic 128) ;вых: z - это только команда LET x2297 call x228E ;поиск начала бейсик команды cp #F1 ;LET ? ret nz ld hl,(#5C5D) x22A0 ld a,(hl) inc hl cp #0D ret z cp ":" jr nz,x22A0 or a ret ;АДРЕС: #22AB проверка это оператор? x22AB ld b,a ld hl,x22BD x22AF ld a,(hl) inc hl or a jr z,x22B9 cp b jr nz,x22AF ld a,b ret x22B9 or #FF ld a,b ret ;АДРЕС: #22BD список токенов операторов x22BD db #2B,#2D,#2A ; '+', '-', '*' db #2F,#5E,#3D ; '/', '^', '=' db #3E,#3C,#C7 ; '>', '<', '<=' db #C8,#C9,#C5 ; '>=', '<>', 'OR' db #C6 ; 'AND' db #00 ;маркер конца таблицы ;АДРЕС: #22CB проверка это токен? ;вых: z - это токен x22CB cp #A5 jr c,x22DD cp #C4 jr nc,x22DD cp #AC jr z,x22DD cp #AD jr z,x22DD cp a ret x22DD cp #A5 ret ;АДРЕС: #22E0 проверка это число или функция? x22E0 ld b,a or #20 cp "a" jr c,x22ED ;это не буква cp "z"+1 jr nc,x22ED ;это не буква cp a ret x22ED ld a,b cp "." ret z call x230A ;проверка это цифра или нет jr nz,x2307 ;не цифра x22F6 rst #20 ;читаем следующий симввол call x230A ;проверка это цифра или нет jr z,x22F6 ;это цифра cp "." ret z cp "E" ret z cp "e" ret z jr x22AB ;проверка это оператор? x2307 or #FF ret ;АДРЕС: #230A проверка это цифра или нет ;вых: z - это цифра x230A cp "0" jr c,x2314 ;это не цифра cp "9"+1 jr nc,x2314 ;это не цифра cp a ret x2314 cp "0" ret ;АДРЕС: #2317 команда PLAY x2317 ld b,#00 rst #18 x231A push bc rst #28 dw Rom1.x1C8C ;параметр - строка pop bc inc b cp "," jr nz,x2327 rst #20 jr x231A x2327 ld a,b cp #09 jr c,x2330 call x05AC db #2B ;!!!ОШИБКА!!! x2330 call x18A1 jp x0985 ;АДРЕС: #2336 !!!NOT USED!!! возврат в редактор x2336 ld hl,x5BFF ld (x5B81),hl call x1F45 jp x25CB ;АДРЕС: #2342 !!!NOT USED!!! bc=hl-de x2342 and a sbc hl,de ld b,h ld c,l add hl,de ex de,hl ret ;АДРЕС: #234A !!!NOT USED!!! зарезервировать память на 1 байт x234A ld bc,#0001 push hl push de call x2358 pop de pop hl rst #28 dw Rom1.x1655 ;резервирование места (длина в bc) ret ;АДРЕС: #2358 !!!NOT USED!!! проверка доступности места в памяти размером в bc x2358 ld hl,(#5C65) add hl,bc jr c,x2368 ex de,hl ld hl,#0082 add hl,de jr c,x2368 sbc hl,sp ret c x2368 ld (iy+#00),#03 ;4 Out of Memory jp x0321 ;АДРЕС: #236F !!!NOT USED!!! hl=a*#20 x236F add a,a add a,a ;АДРЕС: #2371 !!!NOT USED!!! hl=a*#08 x2371 ld l,a ld h,#00 add hl,hl add hl,hl add hl,hl ret ;АДРЕС: #2378 !!!NOT USED!!! расчет свободного места x2378 ld hl,#0000 add hl,sp ld de,(#5C65) or a sbc hl,de ret ;АДРЕС: #2384 !!!NOT USED!!! печать на экране строки из буфера x2384 res 0,(iy-#39) call x236F push hl ld de,(#FF24) add hl,de ld d,h ld e,l ex (sp),hl push hl push de ld de,#5800 add hl,de ex de,hl pop hl ld bc,#0020 ld a,(#5C8F) call x249B pop hl ld a,h ld h,#00 add a,a add a,a add a,a add a,#40 ld d,a ld e,h add hl,de ex de,hl pop hl ld b,#20 jp x23E1 ;АДРЕС: #23B8 !!!NOT USED!!! печать в буфере #FF x23B8 ld d,#FF call x236F ld a,d ld de,(#FF24) add hl,de ld e,l ld d,h inc de ld (hl),a dec bc ldir ret ;АДРЕС: #23CB !!!NOT USED!!! копирование буфера на экран x23CB call x2488 ld de,#4000 ld hl,(#FF24) ld b,e call x23E1 ld d,#48 call x23E1 ld d,#50 ld b,#C0 ;АДРЕС: #23E1 !!!NOT USED!!! печать символов из буфера на экране x23E1 ld a,(hl) push hl push de cp #FE jr c,x23EC sub #FE jr x2422 x23EC cp #20 jr nc,x23F7 ld hl,x2527 and a ex af,af' jr x242B x23F7 cp #80 jr nc,x2409 call x2371 ld de,(#5C36) add hl,de pop de call #FF28 jr x2450 x2409 cp #90 jr nc,x2411 sub #7F jr x2422 x2411 sub #90 call x2371 pop de call x1F20 push de ld de,(#5C7B) scf jr x2429 x2422 ld de,x252F call x2371 and a x2429 ex af,af' add hl,de x242B pop de x242C ld c,d ld a,(hl) ld (de),a inc hl inc d ld a,(hl) ld (de),a inc hl inc d ld a,(hl) ld (de),a inc hl inc d ld a,(hl) ld (de),a inc hl inc d ld a,(hl) ld (de),a inc hl inc d ld a,(hl) ld (de),a inc hl inc d ld a,(hl) ld (de),a inc hl inc d ld a,(hl) ld (de),a ld d,c ex af,af' call c,x1F45 x2450 pop hl inc hl inc de djnz x23E1 ret ;АДРЕС: #2456 !!!NOT USED!!! переключение страниц rom 0/1 x2456 push bc di ld bc,#7FFD ld a,(x5B5C) xor #10 out (c),a ei ex af,af' ;АДРЕС: #2464 !!!NOT USED!!! переключение страниц rom 0/1 x2464 ex af,af' di ld c,#FD xor #10 out (c),a ei pop bc ret ;АДРЕС: #246F !!!NOT USED!!! копирование п/п в ram 7 x246F ld hl,x2456 ld de,#FF28 ld bc,#000E ldir push hl ld hl,x242C ld c,#20 ldir pop hl ld c,#0B ldir ret ;АДРЕС: #2488 !!!NOT USED!!! установка атрибутов из буфера экрана x2488 res 0,(iy-#39) ld de,#5800 ld bc,#02C0 ld hl,(#FF24) ld a,(#5C8D) ld (#5C8F),a ;АДРЕС: #249B !!!NOT USED!!! установка атрибутов из буфера экрана x249B ex af,af' x249C push bc ld a,(hl) cp #FF jr nz,x24AA ld a,(#5C8D) ld (de),a inc hl inc de jr x2507 x24AA ex af,af' ld (de),a inc de ex af,af' inc hl cp #15 jr nc,x2507 cp #10 jr c,x2507 dec hl jr nz,x24C2 inc hl ld a,(hl) ld c,a ex af,af' and #F8 jr x2505 x24C2 cp #11 jr nz,x24D1 inc hl ld a,(hl) add a,a add a,a add a,a ld c,a ex af,af' and #C7 jr x2505 x24D1 cp #12 jr nz,x24DE inc hl ld a,(hl) rrca ld c,a ex af,af' and #7F jr x2505 x24DE cp #13 jr nz,x24EC inc hl ld a,(hl) rrca rrca ld c,a ex af,af' and #BF jr x2505 x24EC cp #14 inc hl jr nz,x2507 ld c,(hl) ld a,(#5C01) xor c rra jr nc,x2507 ld a,#01 xor (iy-#39) ld (#5C01),a ex af,af' call x2513 x2505 or c ex af,af' x2507 pop bc dec bc ld a,b or c jp nz,x249C ex af,af' ld (#5C8F),a ret ;АДРЕС: #2513 !!!NOT USED!!! поменять местами ink и paper x2513 ld b,a and #C0 ld c,a ld a,b add a,a add a,a add a,a and #38 or c ld c,a ld a,b rra rra rra and #07 or c ret x2527 db %00000000 ; db %00111100 ; XXXX db %01100010 ; XX X db %01100000 ; XX db %01101110 ; XX XXX db %01100010 ; XX X db %00111110 ; XXXX db %00000000 ; x252F db %00000000 ; db %01101100 ; XX XX db %00010000 ; X db %01010100 ; X X X db %10111010 ; X XXX X db %00111000 ; XXX db %01010100 ; X X X db %10000010 ; X X ;АДРЕС: #2537 таблица адресов обработки нажатий в режиме редактирования x2537 db #15 ;размер таблицы db #0B: dw #2A94 ;перемещение курсора вверх в поле редактирования db #0A: dw #2AB5 ;перемещение курсора вниз в поле редактирования db #08: dw #2AD7 ;перемещение курсора влево в поле редактирования db #09: dw #2AE3 ;перемещение курсора вправо в поле редактирования db #AD: dw #2A4F ;ext+P перемещение курсора вверх на 10 строк в поле редактирования db #AC: dw #2A25 ;ss+I перемещение курсора вниз на 10 строк в поле редактирования db #AF: dw #29D4 ;ext+I переход к началу текущего слова db #AE: dw #29E1 ;ext+shift+J переход к началу следующего слова db #A6: dw #2983 ;ext+N/Graph+W переход к первой строке бейсик программы db #A5: dw #29AB ;ext+T/Graph+V переход к последней строке бейсик программы db #A8: dw #2A87 ;ext+ss+2/Graph+Y переход к началу строки редактирования db #A7: dw #2A7A ;ext+M/graph+X перемещение курсора в конец строки в поле редактирования db #AA: dw #291B ;ext+ss+K удаление символа справа от курсора db #0C: dw #292B ;delete удаление символа слева от курсора db #B3: dw #3017 ;ext+W удаление символов от курсора до начала следующего слова db #B4: dw #2FBC ;ext+E удаление символов от курсора до начала текущего слова db #B0: dw #3072 ;ext+J удаление символов до конца строки db #B1: dw #303E ;ext+K удаление символов до наала строки db #0D: dw #2944 ;enter ввод строки db #A9: dw #269B ;ext+ss+8/Graph+Z переключение между редактированием внизу и вверху db #07: dw #2704 ;cs+1 вызов меню ;АДРЕС: #2577 таблица адресов обработки нажатий в основном меню basic 128k x2577 db #04 ;размер таблицы db #0B: dw x272E ;вверх db #0A: dw x2731 ;вниз db #07: dw x2717 ;cs+1 db #0D: dw x2717 ;enter ;АДРЕС: #2584 подготовка переменных x2584 call x28BE ;инициализация курсора для верхнего окна ld hl,#0000 ld (#FC9A),hl ld a,#82 ld (#EC0D),a ld hl,#0000 ld (#5C49),hl ;Номер строки бейсик-программы, отмеченной курсором call x35BC ;установка параметров отступа call x365E ;установка переменных для ввода символа ret ;АДРЕС: #259F печать главного меню basic 128 и выбор опции x259F ld hl,x5BFF ld (x5B81),hl call x1F45 ;установка другого стэка и ram 7 ld a,#02 ;канал #02 (основной экран) rst #28 ;вызов процедуры из basic 48k dw Rom1.x1601 ;открыть канал x25AD ld hl,x2744 ;п/п обработки главного меню ld (#F6EA),hl ld hl,x2754 ;текст основного меню basic 128k ld (#F6EC),hl push hl ld hl,#EC0D set 1,(hl) ;на отображено меню res 4,(hl) ;возврат в главное меню dec hl ld (hl),#00 ;номер опции меню pop hl call x36A8 ;печать главного меню basic 128k jp x2653 ;основной цикл в basic128/калькулятор ;АДРЕС: #25CB возврат в редактор/калькулятор/меню после обработки ошибки x25CB ld ix,#FD6C ld hl,x5BFF ld (x5B81),hl call x1F45 ;установка другого стэка и ram 7 ld a,#02 rst #28 dw Rom1.x1601 ;открыть канал call x3668 ;установка переменных для ввода символа ld hl,#5C3B x25E3 bit 5,(hl) jr z,x25E3 ld hl,#EC0D res 3,(hl) bit 6,(hl) jr nz,x2604 ld a,(#EC0E) cp #04 jr z,x2601 ;это калькулятор cp #00 jp nz,x28C7 call x3848 ;печать информационной строки 128 BASIC jr x2604 x2601 call x384D ;печать информационной строки Calculator x2604 call x30D6 ;установка буфера редактирования внизу экрана call x3222 ;установка буфера редактирования в верху экрана ld a,(#EC0E) cp #04 jr z,x2653 ;калькулятор ld hl,(#5C49) ld a,h or l jr nz,x262D ld hl,(#5C53) ld bc,(#5C4B) and a sbc hl,bc jr nz,x262A ld hl,#0000 ld (#EC08),hl x262A ld hl,(#EC08) x262D call x1F20 ;установка другого стэка и ram 0 rst #28 dw Rom1.x196E ;получить начальный адрес строки программы rst #28 dw Rom1.x1695 ;получить адрес первой строки программы call x1F45 ;установка другого стэка и ram 7 ld (#5C49),de ld hl,#EC0D bit 5,(hl) jr nz,x2653 ld hl,#0000 ld (#EC06),hl call x152F ;печать бейсик программы от текущей строки call x29F2 ;напечатать курсор call x2944 ;enter ввод строки ;АДРЕС: #2653 основной цикл в basic128/калькулятор x2653 ld sp,#5BFF call x3668 ;установка переменных для ввода символа call x367F ;ожидание нажатия клавиши push af ;код клавиши ld a,(#5C39) ;звук нажатия на клавишу call x26EC ;звуковой сигнал pop af call x2669 ;обработка нажатия клавиши jr x2653 ;основной цикл в basic128/калькулятор ;АДРЕС: #2669 обработка нажатия клавиши ;вх: a - код клавиши ;вых: z - отображено меню x2669 ld hl,#EC0D bit 1,(hl) push af ld hl,x2577 ;основное меню basic 128k jr nz,x2677 ;отображено меню ld hl,x2537 ;клавиши для режима редактирования x2677 call x3FCE ;обработка нажатой управляющей клавиши в меню jr nz,x2681 ;не найден обработчик клавиши call nc,x26E7 ;звуковой сигнал pop af ret ;не найден обработчик клавиши x2681 pop af jr z,x2689 ;это режим редактирования xor a ;курсор K,L или C ld (#5C41),a ret x2689 ld hl,#EC0D bit 0,(hl) jr z,x2694 ;буфер редактирования не переполнен call x26E7 ;звуковой сигнал ret ;!!!тут можно сократить!!! x2694 cp #A3 jr nc,x2653 ;!!!ОШИБКА!!! должно быть ret nc jp x28F1 ;обрабока нажатия символьной клавиши ;АДРЕС: #269B ext+ss+8/Graph+Z переключение между редактированием внизу и вверху x269B ld a,(#EC0E) cp #04 ret z ;это калькулятор call x1630 ;очистка окна редактирования ld hl,#EC0D res 3,(hl) ld a,(hl) xor #40 ld (hl),a and #40 jr z,x26B6 call x26BB ;выбор нижнего экрана jr x26B9 x26B6 call x26CE ;выбор верхнего экрана x26B9 scf ret ;АДРЕС: #26BB выбор нижнего экрана x26BB call x3881 ;очистка двух нижних строк экрана ld hl,#EC0D set 6,(hl) call x2E2D ;сброс нижнего окна редактирования call x3A88 ;установка настроек курсора для нижнего окна call x28DF ;инициализация настроек нижнего окна jr x26D9 ;АДРЕС: #26CE выбор верхнего экрана x26CE ld hl,#EC0D res 6,(hl) call x28BE ;инициализация курсора для верхнего окна call x3848 ;печать информационной строки 128 BASIC x26D9 ld hl,(#FC9A) ld a,h or l call nz,x334A ;поиск адреса строки бейсик программы call x152F ;печать бейсик программы от текущей строки jp x29F2 ;напечатать курсор ;АДРЕС: #26E7 звуковой сигнал x26E7 ld a,(#5C38) ;заполнение буфера редактора srl a ;АДРЕС: #26EC звуковой сигнал x26EC push ix ld d,#00 ld e,a ld hl,#0C80 x26F4 rst #28 ;вызов процедуры из basic 48k dw Rom1.x03B5 ;beep pop ix ret ;АДРЕС: #26FA звуковой сигнал x26FA push ix ld de,#0030 ld hl,#0300 jr x26F4 ;АДРЕС: #2704 cs+1 вызов меню x2704 call x29EC ;удаление курсора, восстановление атрибутов ld hl,#EC0D set 1,(hl) dec hl ld (hl),#00 ld hl,(#F6EC) call x36A8 ;печать меню basic 128k scf ret ;АДРЕС: #2717 нажатие cs+1/enter в главном меню x2717 ld hl,#EC0D res 1,(hl) dec hl ld a,(hl) ld hl,(#F6EA) push hl push af call x373E ;восстановление окна экрана 14*12 из буфера pop af pop hl call x3FCE ;обработка нажатой управляющей клавиши в меню jp x29F2 ;АДРЕС: #272E курсор вверх в главном меню x272E scf jr x2732 ;АДРЕС: #2731 курсор вниз в главном меню x2731 and a x2732 ld hl,#EC0C ld a,(hl) push hl ld hl,(#F6EC) ;адрес списка опций меню call c,x37A7 ;вверх call nc,x37B6 ;вниз pop hl ld (hl),a x2742 scf ret ;АДРЕС: #2744 адреса процедур обработки опций основного меню basic 128k x2744 db #05 ;кол-во опций db #00: dw x2816 ;выбор опции 128 TR-DOS db #01: dw x286C ;выбор опции 128 BASIC db #02: dw x2885 ;выбор опции калькулятор db #03: dw x1B47 ;выбор опции 48 BASIC db #04: dw x2831 ;выбор опции 48 TR-DOS (вход в Tr-Dos 48k) ;АДРЕС: #2754 текст основного меню basic 128k x2754 db #06 ;кол-во строк db "128 ",#FF x275E dc "128 TR-DOS" x2768 dc "128 BASIC" x2771 dc "Calculator" dc "48 BASIC" x2783 dc "48 TR-DOS" dc " " ;признак окончания ;АДРЕС: #278D !!!NOT USED!!! x278D db #20,#80,#A0 ;АДРЕС: #2790 адреса процедур обработки опций меню в редакторе basic 128 x2790 db #05 ;кол-во опций db #00: dw x2742 ;возврат к редактированию db #01: dw x2851 ;перенумерация строк программы db #02: dw x2811 ;смена области редактирования низ/верх db #03: dw x2862 ;печать программы на принтере db #04: dw x281C ;выход из редактора ;АДРЕС: #27A0 текст меню в редакторе basic 128 x27A0 db #06 db "Options ",#FF dc "128 BASIC" dc "Renumber" dc "Screen" dc "Print" dc "Exit" dc " " ;признак окончания ;АДРЕС: #27CB адреса процедур обработки опций меню в калькуляторе x27CB db #02 db #00: dw x2742 ;возврат к редактированию db #01: dw x281C ;выход в главное меню ;АДРЕС: #27D2 текст меню в калькуляторе x27D2 db #03 db "Options ",#FF dc "Calculator" dc "Exit" dc " " ;признак окончания ;АДРЕС: #27EB !!!NOT USED!!! x27EB db #16,#01,#00 ;AT 1,0 db #10,#00 ;ink 0 db #11,#07 ;paper 7 db #13,#00 ;bright 0 dc "To cancel - press BREAK twice" ;АДРЕС: #2811 смена области редактирования низ/верх x2811 call x269B ;ext+ss+8/Graph+Z переключение между редактированием внизу и вверху jr x2874 ; ;АДРЕС: #2816 выбор опции 128 TR-DOS x2816 call x3857 ;печать информационной строки 128 TR-DOS call x3BE9 ;запуск команды randomize 15619: rem: load "boot" ;АДРЕС: #281С выход из редактора/калькулятора в главное меню x281C ld hl,#EC0D res 6,(hl) call x28BE ;инициализация курсора для верхнего окна ld b,#00 ld d,#17 call x3B5E ;очистка строк экрана call x1F20 ;установка другого стэка и ram 0 jp x259F ;печать главного меню basic 128 и выбор опции ;АДРЕС: #2831 выбор опции 48 TR-DOS (вход в Tr-Dos 48k) x2831 call x3852 ;печать информационной строки 48 TR-DOS ld hl,#0000 push hl ld hl,#3D30 jp x1B4A ;включение basic48, блокировка #7FFD и переход на адрес в hl ;АДРЕС: #283E !!!NOT USED!!! x283E dec b res 0,(hl) set 6,(hl) ld a,#07 ld (#EC0E),a ld bc,#0000 call x372B jp x1AF1 ;АДРЕС: #2851 перенумерация строк программы x2851 call x3888 ;перенумерация строк программы call nc,x26E7 ;звуковой сигнал ld hl,#0000 ld (#5C49),hl ld (#EC08),hl jr x2865 ;АДРЕС: #2862 печать программы на принтере x2862 call x1B14 ;пункт меню редактора Print (печать на принтер) x2865 ld hl,#EC0D bit 6,(hl) jr nz,x2874 ;АДРЕС: #286C выбор опции 128 BASIC x286C ld hl,#5C3C res 0,(hl) call x3848 ;печать информационной строки 128 BASIC x2874 ld hl,#EC0D res 5,(hl) res 4,(hl) ld a,#00 ld hl,x2790 ld de,x27A0 jr x28B1 ;АДРЕС: #2885 выбор опции калькулятор x2885 ld hl,#EC0D set 5,(hl) set 4,(hl) res 6,(hl) call x28BE ;инициализация курсора для верхнего окна call x384D ;печать информационной строки Calculator ld a,#04 ld (#EC0E),a ld hl,#0000 ld (#5C49),hl call x152F ;печать бейсик программы от текущей строки ld bc,#0000 ld a,b call x29F8 ;напечатать курсор ld a,#04 ld hl,x27CB ld de,x27D2 x28B1 ld (#EC0E),a ld (#F6EA),hl ld (#F6EC),de jp x2604 ;АДРЕС: #28BE инициализация курсора для верхнего окна x28BE call x2E1F ;сброс верхнего окна редактирования call x3A7F ;установка настроек курсора для верхнего окна jp x28E8 ;инициализация настроек верхнего окна ;АДРЕС: #28C7 возврат в главное меню x28C7 ld b,#00 ld d,#17 call x3B5E ;очистка строк экрана jp x25AD ;настройки верхнего окна x28D1 db #06 db #00,#00,#00,#04,#10,#14 ;настройки нижнего окна x28D8 db #06 db #00,#00,#00,#00,#01,#01 ;АДРЕС: #28DF инициализация настроек нижнего окна x28DF ld hl,x28D8 ld de,#F6EE jp x3FBA ;копирование строки из hl в de в (hl+0) кол-во байт ;АДРЕС: #28E8 инициализация настроек верхнего окна x28E8 ld hl,x28D1 ld de,#F6EE jp x3FBA ;АДРЕС: #28F1 обработка нажатия символьной клавиши x28F1 ld hl,#EC0D or a ;!!!ЛИШНЕЕ!!! or a ;!!!ЛИШНЕЕ!!! bit 0,(hl) jp nz,x29F2 res 7,(hl) set 3,(hl) push hl push af call x29EC ;удаление курсора, восстановление атрибутов pop af push af call x2E81 ;вставка символа в буфер редактирования pop af ld a,b call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере pop hl set 7,(hl) jp nc,x29F2 ld a,b jp c,x29F8 jp x29F2 ;АДРЕС: #291B ext+ss+K удаление символа справа от курсора x291B ld hl,#EC0D set 3,(hl) call x29EC ;удаление курсора, восстановление атрибутов call x2F12 ;удаление символа в строке в буфере редактирования scf ld a,b jp x29F8 ;напечатать курсор ;АДРЕС: #292B delete удаление символа слева от курсора x292B ld hl,#EC0D res 0,(hl) set 3,(hl) call x29EC ;удаление курсора, восстановление атрибутов call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере ccf jp c,x29F2 ;напечатать курсор call x2F12 ;удаление символа в строке в буфере редактирования scf ld a,b jp x29F8 ;напечатать курсор ;АДРЕС: #2944 enter ввод строки x2944 call x29EC ;удаление курсора, восстановление атрибутов push af call x30B4 ;расчет адреса начала строки в буфере редактирования push bc ld b,#00 call x2E41 ;поиск в строке вправо от курсора редактируемого символа pop bc jr c,x295E ld hl,#0020 add hl,de ld a,(hl) cpl and #09 jr z,x297A x295E ld a,(#EC0D) bit 3,a jr z,x296A call x2C8E ;вставить строку бейсик программы jr nc,x297F x296A call x2C4C ;поиск конца строки в буфере редактирования call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере call x2ECE ;вставка пустой строки в буфер редактирования ld b,#00 pop af scf jp x29F8 ;напечатать курсор x297A pop af scf jp x29F2 ;напечатать курсор x297F pop af jp x29F2 ;напечатать курсор ;АДРЕС: #2983 ext+N/Graph+W переход к первой строке бейсик программы x2983 ld a,(#EC0E) cp #04 ret z ;это калькулятор call x29EC ;удаление курсора, восстановление атрибутов ld hl,#0000 call x1F20 ;установка другого стэка и ram 0 rst #28 dw Rom1.x196E ;получить начальный адрес строки программы rst #28 dw Rom1.x1695 ;получить адрес первой строки программы call x1F45 ;установка другого стэка и ram 7 ld (#5C49),de ld a,#0F call x3A96 ;сохранить атрибуты курсора call x152F ;печать бейсик программы от текущей строки scf jp x29F2 ;напечатать курсор ;АДРЕС: #29AB ext+T/Graph+V переход к последней строке бейсик программы x29AB ld a,(#EC0E) cp #04 ret z ;это калькулятор call x29EC ;удаление курсора, восстановление атрибутов ld hl,#270F ;9999 call x1F20 ;установка другого стэка и ram 0 rst #28 dw Rom1.x196E ;получить начальный адрес строки программы ex de,hl rst #28 dw Rom1.x1695 ;получить адрес первой строки программы call x1F45 ;установка другого стэка и ram 7 ld (#5C49),de ld a,#0F call x3A96 ;сохранить атрибуты курсора call x152F ;печать бейсик программы от текущей строки scf jp x29F2 ;напечатать курсор ;АДРЕС: #29D4 ext+I переход к началу текущего слова x29D4 call x29EC ;удаление курсора, восстановление атрибутов call x2BEA ;поиск начала слова слева от курсора jp nc,x29F2 ;напечатать курсор ld a,b jp x29F8 ;напечатать курсор ;АДРЕС: #29E1 ext+shift+J переход к началу следующего слова x29E1 call x29EC ;удаление курсора, восстановление атрибутов call x2C09 ;поиск начала слова справа от курсора jr nc,x29F2 ;напечатать курсор ld a,b jr x29F8 ;напечатать курсор ;АДРЕС: #29EC удаление курсора, восстановление атрибутов x29EC call x2A07 ;получение позиции курсора jp x364F ;восстановление атрибутов под курсором ;АДРЕС: #29F2 напечатать курсор x29F2 call x2A07 ;получение позиции курсора jp x3640 ;печать атрибутов курсора ;АДРЕС: #29F8 напечатать курсор x29F8 call x2A11 ;сохранить позицию курсора push af push bc ld a,#0F ;paper 1, ink 7 call x3A96 ;сохранить атрибуты курсора pop bc pop af jp x3640 ;печать атрибутов курсора ;АДРЕС: #2A07 получение позиции курсора ;вых: c - номер строки ; b - номер столбца ; a - предпочтительный номер столбца x2A07 ld hl,#F6EE ld c,(hl) inc hl ld b,(hl) inc hl ld a,(hl) inc hl ret ;АДРЕС: #2A11 сохранить позицию курсора x2A11 ld hl,#F6EE ld (hl),c inc hl ld (hl),b inc hl ld (hl),a ret ;АДРЕС: #2A1A получение текущего символа в буфере редактирования x2A1A push hl call x30B4 ;расчет адреса начала строки в буфере редактирования ld h,#00 ld l,b add hl,de ld a,(hl) pop hl ret ;АДРЕС: #2A25 ss+I перемещение курсора вниз на 10 строк в поле редактирования x2A25 call x29EC ;удаление курсора, восстановление атрибутов ld e,a ld d,#0A x2A2B push de call x2B30 ;вставить строку бейсик программы pop de jr nc,x29F2 ;напечатать курсор ld a,e call x2A11 ;сохранить позицию курсора ld b,e call x2AF9 ;найти в строке ближайшую редактируемую позицию jr nc,x2A42 dec d jr nz,x2A2B ld a,e jr c,x29F8 ;напечатать курсор x2A42 push de call x2B0B ;вставить строку бейсик программы pop de ld b,e call x2AF9 ;найти в строке ближайшую редактируемую позицию ld a,e or a jr x29F8 ;напечатать курсор ;АДРЕС: #2A4F ext+P перемещение курсора вверх на 10 строк в поле редактирования x2A4F call x29EC ;удаление курсора, восстановление атрибутов ld e,a ld d,#0A x2A55 push de call x2B0B ;вставить строку бейсик программы pop de jr nc,x29F2 ;напечатать курсор ld a,e call x2A11 ;сохранить позицию курсора ld b,e call x2B02 ;найти в строке ближайшую редактируемую позицию jr nc,x2A6D dec d jr nz,x2A55 ld a,e jp c,x29F8 ;напечатать курсор x2A6D push af call x2B30 ;вставить строку бейсик программы ld b,#00 call x2BD4 ;поиск редактируемого символа в строке справа от курсора pop af jp x29F8 ;напечатать курсор ;АДРЕС: #2A7A ext+M/graph+X перемещение курсора в конец строки в поле редактирования x2A7A call x29EC ;удаление курсора, восстановление атрибутов call x2C4C ;поиск конца строки в буфере редактирования jp nc,x29F2 ;напечатать курсор ld a,b jp x29F8 ;напечатать курсор ;АДРЕС: #2A87 ext+ss+2/Graph+Y переход к началу строки редактирования x2A87 call x29EC ;удаление курсора, восстановление атрибутов call x2C31 ;поиск начала строки редактирования в буфере jp nc,x29F2 ;напечатать курсор ld a,b jp x29F8 ;напечатать курсор ;АДРЕС: #2A94 перемещение курсора вверх в поле редактирования x2A94 call x29EC ;удаление курсора, восстановление атрибутов ld e,a push de call x2B0B ;вставить строку бейсик программы pop de jp nc,x29F2 ;напечатать курсор ld b,e call x2B02 ;найти в строке ближайшую редактируемую позицию ld a,e jp c,x29F8 ;напечатать курсор push af call x2B30 ;вставить строку бейсик программы ld b,#00 call x2AF9 ;найти в строке ближайшую редактируемую позицию pop af jp x29F8 ;напечатать курсор ;АДРЕС: #2AB5 перемещение курсора вниз в поле редактирования x2AB5 call x29EC ;удаление курсора, восстановление атрибутов ld e,a push de call x2B30 ;вставить строку бейсик программы pop de jp nc,x29F2 ;напечатать курсор ld b,e call x2B02 ;найти в строке ближайшую редактируемую позицию ld a,e jp c,x29F8 ;напечатать курсор push de call x2B0B ;вставить строку бейсик программы pop de ld b,e call x2AF9 ;найти в строке ближайшую редактируемую позицию ld a,e or a jp x29F8 ;напечатать курсор ;АДРЕС: #2AD7 перемещение курсора влево в поле редактирования x2AD7 call x29EC ;удаление курсора, восстановление атрибутов call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере jp c,x29F8 ;напечатать курсор jp x29F2 ;напечатать курсор ;АДРЕС: #2AE3 перемещение курсора вправо в поле редактирования x2AE3 call x29EC ;удаление курсора, восстановление атрибутов call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере jp c,x29F8 ;напечатать курсор push af call x2B0B ;вставить строку бейсик программы ld b,#1F call x2BDF ;поиск в строке влево от курсора редактируемого символа pop af jp x29F8 ;напечатать курсор ;АДРЕС: #2AF9 найти в строке ближайшую редактируемую позицию x2AF9 push de call x2BD4 ;поиск редактируемого символа в строке справа от курсора call nc,x2BDF ;поиск в строке влево от курсора редактируемого символа pop de ret ;АДРЕС: #2B02 найти в строке ближайшую редактируемую позицию x2B02 push de call x2BDF ;поиск в строке влево от курсора редактируемого символа call nc,x2BD4 ;поиск редактируемого символа в строке справа от курсора pop de ret ;АДРЕС: #2B0B вставить строку бейсик программы, если требуется сдвинуть строки ; в буфере вниз и обновить экран x2B0B call x2C7C ;вставить строку в бейсик программу, если были изменения jr nc,x2B2F push bc call x30B4 ;расчет адреса начала строки в буфере редактирования ld b,#00 call x2E41 ;поиск в строке вправо от курсора редактируемого символа call nc,x2F80 ;сдивг строк вверх в буфере при удалении строки pop bc ld hl,#F6F1 ld a,(hl) cp c jr c,x2B2D push bc call x166F ;сдвиг всех строк в буфер редактирования вниз с обновлением экрана pop bc ret c ld a,c or a ret z x2B2D dec c scf x2B2F ret ;АДРЕС: #2B30 вставить строку бейсик программы, если требуется сдвинуть строки ; в буфере вверх и обновить экран x2B30 push bc call x30B4 ;расчет адреса начала строки в буфере редактирования ld b,#00 call x2E41 ;поиск в строке вправо от курсора редактируемого символа pop bc jr c,x2B3F ;!!!можно оптимизировать jp x2F80 x2B3F call x2C68 ;вставить строку бейсик программы, если были изменения jr nc,x2B5A ld hl,#F6F1 inc hl ld a,c cp (hl) jr c,x2B58 push bc push hl call x1639 ;сдвиг всех строк в буфере редактирования верх и обновление экрана pop hl pop bc ret c inc hl ld a,(hl) cp c ret z x2B58 inc c scf x2B5A ret ;АДРЕС: #2B5B поиск редактируемой позиции слева от курсора во всем буфере x2B5B ld d,a dec b jp m,x2B66 ld e,b call x2BDF ;поиск в строке влево от курсора редактируемого символа ld a,e ret c x2B66 push de call x2B0B ;вставить строку бейсик программы, если требуется сдвинуть строки в буфере вниз и обновить эекран pop de ld a,e ret nc ld b,#1F call x2BDF ;поиск в строке влево от курсора редактируемого символа ld a,b ret c ld a,d ld b,#00 ret ;АДРЕС: #2B78 поиск редактируемой позиции справа от курсора во всем буфере ;вх: b - номер столбца ; c - номер строки ;вых: cy=1 справа есть символ ; b - номер столбца с символом ; a - новый номер столбца ; hl - адрес ноовго редактируемого символа x2B78 ld d,a inc b ld a,#1F cp b jr c,x2B85 ld e,b call x2BD4 ;поиск редактируемого символа в строке справа от курсора ld a,e ret c ;переход к следующей строке x2B85 dec b push bc push hl ld hl,#EC0D bit 7,(hl) jr nz,x2BC0 ;клавиша не нажата ;нажата клавиша. вставим новую строку call x30B4 ;расчет адреса начала строки в буфере редактирования ld hl,#0020 add hl,de ld a,(hl) bit 1,a jr nz,x2BC0 set 1,(hl) res 3,(hl) ld hl,#0023 add hl,de ex de,hl pop hl pop bc push af call x2B30 ;вставить строку бейсик программы, если требуется сдвинуть строки в буфере вверх и обновить эекран pop af call x30B4 ;расчет адреса начала строки в буфере редактирования ld hl,#0023 add hl,de ex de,hl res 0,a set 3,a call x2ED3 ;вставка пустой строки в буфер редактирования call x35F4 ;создание отступа в строке в буфере редактирования ld a,b scf ret x2BC0 pop hl pop bc push de call x2B30 ;вставить строку бейсик программы, если требуется сдвинуть строки в буфере вверх и обновить эекран pop de ld a,b ret nc ld b,#00 call x2BD4 ;поиск редактируемого символа в строке справа от курсора ld a,b ret c ld a,e ld b,#00 ret ;АДРЕС: #2BD4 поиск редактируемого символа в строке справа от курсора ;вх: b - номер столбца ; c - номер строки ;вых: cy=1 справа есть символ ; b - номер столбца с символом x2BD4 push de push hl call x30B4 ;расчет адреса начала строки в буфере редактирования call x2E41 ;поиск в строке вправо от курсора редактируемого символа jp x2C65 ;АДРЕС: #2BDF поиск в строке влево от курсора редактируемого символа x2BDF push de push hl call x30B4 ;расчет адреса начала строки в буфере редактирования call x2E63 ;поиск в строке влево от курсора редактируемого символа jp x2C65 ;АДРЕС: #2BEA поиск начала слова слева от курсора x2BEA push de push hl x2BEC call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере jr nc,x2C07 call x2A1A ;получение текущего символа в буфере редактирования cp " " jr z,x2BEC x2BF8 call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере jr nc,x2C07 call x2A1A ;получение текущего символа в буфере редактирования cp " " jr nz,x2BF8 call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере x2C07 jr x2C65 ;АДРЕС: #2C09 поиск начала слова справа от курсора x2C09 push de push hl x2C0B call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере jr nc,x2C2B call x2A1A ;получение текущего символа в буфере редактирования cp " " jr nz,x2C0B x2C17 call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере jr nc,x2C2B call x2E41 ;поиск в строке вправо от курсора редактируемого символа jr nc,x2C2B call x2A1A ;получение текущего символа в буфере редактирования cp " " jr z,x2C17 scf jr x2C65 x2C2B call nc,x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере or a jr x2C65 ;АДРЕС: #2C31 поиск начала строки редактирования в буфере x2C31 push de push hl x2C33 call x30B4 ;расчет адреса начала строки в буфере редактирования ld hl,#0020 add hl,de bit 0,(hl) jr nz,x2C45 call x2B0B ;вставить строку бейсик программы jr c,x2C33 jr x2C65 x2C45 ld b,#00 call x2BD4 ;поиск редактируемого символа в строке справа от курсора jr x2C65 ;АДРЕС: #2C4C поиск конца строки в буфере редактирования x2C4C push de push hl x2C4E call x30B4 ;расчет адреса начала строки в буфере редактирования ld hl,#0020 add hl,de bit 3,(hl) jr nz,x2C60 call x2B30 ;вставить строку бейсик программы jr c,x2C4E jr x2C65 x2C60 ld b,#1F call x2BDF ;поиск в строке влево от курсора редактируемого символа x2C65 pop hl pop de ret ;АДРЕС: #2C68 вставить строку бейсик программы, если были изменения ;вх: c - номер строки ;вых: cy=0 строка вставлена x2C68 ld a,(#EC0D) bit 3,a scf ret z ;изменений не было call x30B4 ;расчет адреса начала строки в буфере редактирования ld hl,#0020 add hl,de bit 3,(hl) scf ret z jr x2C8E ;АДРЕС: #2C7C вставить строку в бейсик программу, если были изменения x2C7C ld a,(#EC0D) bit 3,a scf ret z call x30B4 ;расчет адреса начала строки в буфере редактирования ld hl,#0020 add hl,de bit 0,(hl) scf ret z ;АДРЕС: #2C8E вставить строку бейсик программы ;вх: c - номер строки ;вых: cy=0 синтаксическая ошибка ; cy=1 строка вставлена ; bc - координаты курсора ; a - номер столбца x2C8E ld a,#02 x2C90 call x30B4 ;расчет адреса начала строки в буфере редактирования ld hl,#0020 add hl,de bit 0,(hl) jr nz,x2CA3 ;это первая строка dec c jp p,x2C90 ld c,#00 ld a,#01 x2CA3 ld hl,#EC00 ld de,#EC03 or #80 ld (hl),a ld (de),a inc hl inc de ld a,#00 ;!!!можно записать xor a ld (hl),a ld (de),a inc hl inc de ld a,c ld (hl),a ld (de),a ld hl,#0000 ld (#EC06),hl call x335F ;копирование процедур в ram call x3C67 ;токенизация строки бейсик программы push ix call x1F20 ;установка другого стэка и ram 0 call x026B ;выполненение введенной строки call x1F45 ;установка другого стэка и ram 7 pop ix ld a,(#5C3A) inc a jr nz,x2CEF ;есть ошибка ld hl,#EC0D res 3,(hl) call x365E ;установка переменных для ввода символа ld a,(#EC0E) cp #04 call nz,x152F ;печать бейсик программы от текущей строки call x26FA ;звуковой сигнал call x2A07 ;получение позиции курсора scf ret x2CEF ld hl,#EC00 ld de,#EC03 ld a,(de) res 7,a ld (hl),a inc hl inc de ld a,(de) ld (hl),a inc hl inc de ld a,(de) ld (hl),a call x3C63 ;токенизация строки бейсик программы с синтаксической ошибкой jr c,x2D0A ld bc,(#EC06) x2D0A ld hl,(#EC06) or a sbc hl,bc push af push hl call x2A07 ;получение позиции курсора pop hl pop af jr c,x2D2A jr z,x2D45 x2D1B push hl ld a,b call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере pop hl jr nc,x2D45 dec hl ld a,h or l jr nz,x2D1B jr x2D45 x2D2A push hl ld hl,#EC0D res 7,(hl) pop hl ex de,hl ld hl,#0000 or a sbc hl,de x2D38 push hl ld a,b call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере pop hl jr nc,x2D45 dec hl ld a,h or l jr nz,x2D38 x2D45 ld hl,#EC0D set 7,(hl) call x2A11 ;сохранить позицию курсора ld a,#17 ;paper 2, ink 7 call x3A96 ;сохранить атрибуты курсора or a ret ;АДРЕС: #2D54 получить очередной символ из строки бейсик программы ;вых: a - код символа x2D54 ld hl,#EC00 bit 7,(hl) jr z,x2D62 ld hl,(#EC06) ;увеличим количество редактируемых символов в строке inc hl ld (#EC06),hl x2D62 ld hl,#EC00 ld a,(hl) ;флаги inc hl ld b,(hl) ;столбец inc hl ld c,(hl) ;строка push hl and #0F ld hl,x2D85 ;таблица адресов процедур call x3FCE ;обработка управляющего кода ld e,l pop hl jr z,x2D79 ld a,#0D x2D79 ld (hl),c dec hl ld (hl),b dec hl push af ld a,(hl) and #F0 or e ld (hl),a pop af ret ;таблица адресов процедур x2D85 db #03 ;размер таблицы db #02: dw x2DAC db #04: dw x2DE9 db #01: dw x2D8F ;АДРЕС: #2D8F получить символ из текущей позиции курсора в буфере редактирования ;вх: c - номер строки ;вых: l=#01 -> a - код символа из верхнего буфера ; =#02 -> a - код символа из буфера ; =#04 -> a - код символа из нижнего буфера ; =#08 -> a - =#0D конец буфера редактирования x2D8F call x32B7 ;расчет адреса начала строки в буфере редактирования x2D92 call x2E0E ;получить символ из строки буфера редактирования jr nc,x2D9E ;вне пределов строки cp #00 jr z,x2D92 ;нет символа ld l,#01 ret x2D9E inc c ;следующая строка ld b,#00 ld hl,(#F9DB) ;!!!ОШИБКА!!! должно быть ld hl,#F9DB ld a,c cp (hl) jr c,x2D8F ld b,#00 ld c,#00 ;на отображаемой строчке строки бейсик программы x2DAC push hl ld hl,#F6EE ld a,(hl) cp c jr nz,x2DBE inc hl ld a,(hl) cp b jr nz,x2DBE ld hl,#EC00 res 7,(hl) x2DBE pop hl x2DBF call x30B4 ;расчет адреса начала строки в буфере редактирования call x2E0E ;получить символ из строки буфера редактирования jr nc,x2DCE ;вне пределов строки cp #00 jr z,x2DAC ld l,#02 ret x2DCE ld hl,#0020 add hl,de bit 3,(hl) jr z,x2DDB ld l,#08 ld a,#0D ret x2DDB ld hl,#F6F3 inc c ld a,(hl) cp c ld b,#00 jr nc,x2DBF ld b,#00 ld c,#01 ;используется нижний экран x2DE9 call x31C3 ;расчет адреса начала строки в буфере редактирования x2DEC call x2E0E ;получить символ из строки буфера редактирования jr nc,x2DF8 ;вне пределов строки cp #00 jr z,x2DEC ld l,#04 ret x2DF8 ld hl,#0020 add hl,de bit 3,(hl) jr nz,x2E09 inc c ld b,#00 ld a,(#F6F5) cp c jr nc,x2DE9 x2E09 ld l,#08 ld a,#0D ret ;АДРЕС: #2E0E получить символ из строки буфера редактирования ;вх: b - номер столбца ; de - адрес начала строки ;вых: cy=1 символ получен -> a - код символа x2E0E ld a,#1F cp b ccf ret nc ld l,b ld h,#00 add hl,de ld a,(hl) inc b scf ret ;настройки верхнего окна редактирования x2E1B db #01 ;количество байт db #14 ;количество редактируемых строк ;настройки нижнего окна редактирования x2E1D db #01 ;количество байт db #01 ;количество редактируемых строк ;АДРЕС: #2E1F сброс верхнего окна редактирования x2E1F ld hl,#5C3C res 0,(hl) ;вывод на основной экран ld hl,x2E1B ld de,#EC15 jp x3FBA ;копирование строки из hl в de в (hl+0) кол-во байт ;АДРЕС: #2E2D сброс нижнего окна редактирования x2E2D ld hl,#5C3C set 0,(hl) ld bc,#0000 call x372B ;установка координат печати из bc ld hl,x2E1D ld de,#EC15 jp x3FBA ;копирование строки из hl в de в (hl+0) кол-во байт ;АДРЕС: #2E41 поиск в строке вправо от курсора редактируемого символа ;вх: b - номер столбца, с которого следует начать поиск ; de - начало строки в буфере редактирования ;вых: cy=1 символ найден ; hl - адрес редактируемой позиции ; b - номер столбца x2E41 ld h,#00 ;!!!можно сократить!!! call x2E7B ld l,b add hl,de ld a,(hl) cp #00 scf ret nz ld a,b or a jr z,x2E5B push hl dec hl ld a,(hl) cp #00 scf pop hl ret nz x2E56 ld a,(hl) cp #00 scf ret nz x2E5B inc hl inc b ld a,b cp #1F jr c,x2E56 ret ;АДРЕС: #2E63 поиск в строке влево от курсора редактируемого символа ;вх: b - номер столбца, с которого следует начать поиск ; de - начало строки в буфере редактирования ;вых: cy=1 символ найден ; hl - адрес редактируемой позиции ; b - номер столбца x2E63 ld h,#00 ;!!!можно сократить!!! call x2E7B ld l,b add hl,de ld a,(hl) cp #00 scf ret nz x2E6C ld a,(hl) cp #00 jr nz,x2E78 ld a,b or a ret z dec hl dec b jr x2E6C x2E78 inc b scf ret ;АДРЕС: #2E7B чтение символа из буфера редактирования ;вх: b - номер столбца ; de - начало строки в буфере редактирования ;вых: a - символ по заданному адресу x2E7B ld h,#00 ld l,b add hl,de ld a,(hl) ret ;АДРЕС: #2E81 вставка символа в буфер редактирования ;вх: a - код символа ; bc - координаты курсора x2E81 ld hl,#EC0D or a ;!!!ЛИШНЕЕ!!! bit 0,(hl) ret nz ;буфер строки переполнен push bc push af call x30B4 ;расчет адреса начала строки в буфере редактирования pop af x2E8E call x16AC ;вставка символа в строку буфера редактирования push af ex de,hl call x3604 ;печать строки редактируемого буфера ex de,hl pop af ccf jr z,x2ECC ;буфер бельше не надо раздвигать push af ld b,#00 inc c ld a,(#EC15) cp c jr c,x2EC8 ld a,(hl) ld e,a and #D7 cp (hl) ld (hl),a ld a,e set 1,(hl) push af call x30B4 ;расчет адреса начала строки в буфере редактирования pop af jr z,x2EC2 res 0,a call x2ED3 ;вставка пустой строки в буфер редактирования jr nc,x2ECC ;буфер переполнен call x35F4 ;создание отступа в строке в буфере редактирования pop af jr x2E8E x2EC2 call x2E41 ;поиск в строке вправо от курсора редактируемого символа pop af jr x2E8E x2EC8 pop af call x316E ;вставка символа в нижний буфер редактирования x2ECC pop bc ret ;АДРЕС: #2ECE вставка пустой строки в буфер редактирования x2ECE call x30B4 ld a,#09 ;АДРЕС: #2ED3 вставка пустой строки в буфер редактирования ;вх: de - адрес строки в бефере редактирования ; a - флаги ; c - номер строки для вставки x2ED3 push bc push de ld b,c ld hl,x2EEF ;пустая строка ld c,a push bc call x1675 ;сдвиг всех строк в буфер редактирования вниз с обновлением экрана pop bc ld a,c jr nc,x2EEC ;буфер переполнен ld c,b call x30B4 ;расчет адреса начала строки в буфере редактирования ld hl,#0020 add hl,de ld (hl),a scf x2EEC pop de pop bc ret x2EEF ds #20,#00 db #09: dw #0000 ;АДРЕС: #2F12 удаление символа в строке в буфере редактирования x2F12 push bc call x30B4 ;расчет адреса начала строки в буфере редактирования push bc x2F17 ld hl,#0020 add hl,de bit 1,(hl) ld a,#00 jr z,x2F31 inc c ld hl,#0023 add hl,de ex de,hl ld a,(#EC15) cp c jr nc,x2F17 dec c call x31C9 ;удаление символа в нижнем буфере редактирования x2F31 pop hl x2F32 push hl call x30B4 ;расчет адреса начала строки в буфере редактирования pop hl ld b,a ld a,c cp l ld a,b push af jr nz,x2F41 ld b,h jr x2F4A x2F41 push af push hl ld b,#00 call x2E41 ;поиск в строке вправо от курсора редактируемого символа pop hl pop af x2F4A push hl ld hl,#F6F4 set 0,(hl) jr z,x2F54 res 0,(hl) x2F54 call x16C1 ;вставка символа в строку буфера редактирования со сдвигом влево push af push bc push de ld hl,#F6F4 bit 0,(hl) jr nz,x2F6F ld b,#00 call x2BD4 ;поиск редактируемого символа в строке справа от курсора jr c,x2F6F call x2F80 ;сдивг строк вверх в буфере при удалении строки pop de pop bc jr x2F74 x2F6F pop hl pop bc call x3604 ;печать строки редактируемого буфера, при необходимости x2F74 pop af dec c ld b,a pop hl pop af ld a,b jp nz,x2F32 scf pop bc ret ;АДРЕС: #2F80 сдивг строк вверх в буфере при удалении строки x2F80 ld hl,#0020 add hl,de ld a,(hl) bit 0,(hl) jr nz,x2FB2 push af push bc ld a,c or a jr nz,x2FA4 push bc ld hl,(#FC9A) call x334A ;поиск адреса строки бейсик программы ld (#FC9A),hl ld a,(#F9DB) ld c,a dec c call x32B7 ;расчет адреса начала строки в буфере редактирования pop bc jr x2FA8 x2FA4 dec c call x30B4 ;расчет адреса начала строки в буфере редактирования x2FA8 pop bc pop af ld hl,#0020 add hl,de res 1,(hl) or (hl) ld (hl),a x2FB2 ld b,c call x30B4 ;расчет адреса начала строки в буфере редактирования call x30DF ;сдвиг строк в буфере редактирования вверх jp x1648 ;сдвиг всех строк в буфере редактирования верх и обновление экрана ;АДРЕС: #2FBC ext+E удаление символов от курсора до начала текущего слова x2FBC call x3084 ;удаление курсора и запрет на обновление экрана x2FBF push hl call x3095 ;проверка наличия предыдущего символа в буфере jr z,x2FF7 call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере pop hl jr nc,x2FF8 call x2A1A ;получение текущего символа в буфере редактирования push af push hl call x2F12 ;удаление символа в строке в буфере редактирования pop hl pop af cp " " jr z,x2FBF x2FD9 push hl call x3095 ;проверка наличия предыдущего символа в буфере jr z,x2FF7 call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере pop hl jr nc,x2FF8 call x2A1A ;получение текущего символа в буфере редактирования cp " " jr z,x2FF3 push hl call x2F12 ;удаление символа в строке в буфере редактирования pop hl jr x2FD9 x2FF3 push hl call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере x2FF7 pop hl x2FF8 ld a,b push af push hl ld hl,#EEF5 res 2,(hl) ld a,(#EC15) push bc ld b,#00 ld c,a cp a call x1605 ;печать буфера редактирования на экране pop bc ld hl,#EC0D set 3,(hl) pop hl call x29F8 ;напечатать курсор pop af ret ;АДРЕС: #3017 ext+W удаление символов от курсора до начала следующего слова x3017 call x3084 ;удаление курсора и запрет на обновление экрана x301A push hl call x2A1A ;получение текущего символа в буфере редактирования pop hl cp #00 scf jr z,x2FF8 push af push hl call x2F12 ;удаление символа в строке в буфере редактирования pop hl pop af cp " " jr nz,x301A x302F call x2A1A ;получение текущего символа в буфере редактирования cp " " scf jr nz,x2FF8 push hl call x2F12 ;удаление символа в строке в буфере редактирования pop hl jr x302F ;АДРЕС: #303E ext+K удаление символов до наала строки x303E call x3084 ;удаление курсора и запрет на обновление экрана x3041 push hl call x30B4 ;расчет адреса начала строки в буфере редактирования ld hl,#0020 add hl,de bit 0,(hl) jr nz,x3059 call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере jr nc,x306D call x2F12 ;удаление символа в строке в буфере редактирования pop hl jr x3041 push hl ;!!!не используется!!! x3059 ld a,b cp #00 jr z,x306D dec b call x2A1A ;получение текущего символа в буфере редактирования inc b cp #00 jr z,x306D dec b call x2F12 ;удаление символа в строке в буфере редактирования jr x3059 x306D pop hl x306E scf jp x2FF8 ;АДРЕС: #3072 ext+J удаление символов до конца строки x3072 call x3084 ;удаление курсора и запрет на обновление экрана x3075 call x2A1A ;получение текущего символа в буфере редактирования cp #00 scf jr z,x306E push hl call x2F12 ;удаление символа в строке в буфере редактирования pop hl jr x3075 ;АДРЕС: #3084 удаление курсора и запрет на обновление экрана x3084 ld hl,#EC0D res 0,(hl) call x29EC ;удаление курсора, восстановление атрибутов ld hl,#EEF5 set 2,(hl) ld hl,#F6F1 ret ;АДРЕС: #3095 проверка наличия предыдущего символа в буфере x3095 call x30B4 ;расчет адреса начала строки в буфере редактирования ld hl,#0020 add hl,de bit 0,(hl) jr z,x30AE ld a,b cp #00 jr z,x30B2 dec b call x2A1A ;получение текущего символа в буфере редактирования inc b cp #00 jr z,x30B2 x30AE ld a,#01 or a ret x30B2 xor a ret ;АДРЕС: #30B4 расчет адреса начала строки в буфере редактирования ;вх: c - номер строки ;вых: de - адрес начала строки x30B4 ld hl,#EC16 ;буфер редактируемой строки x30B7 push af ld a,c ld de,#0023 x30BC or a jr z,x30C3 add hl,de dec a jr x30BC x30C3 ex de,hl pop af ret ;АДРЕС: #30C6 !!!NOT USED!!! x30C6 push de call x30B4 ld h,#00 ld l,b add hl,de pop de ret ;АДРЕС: #30D0 параметры для установки буфера редактирования строки внизу экрана x30D0 db #05 db #00 dw #0000 dw #F6F8 ;АДРЕС: #30D6 установка буфера редактирования внизу экрана x30D6 ld hl,x30D0 ld de,#F6F5 jp x3FBA ;АДРЕС: #30DF сдвиг строк в буфере редактирования вверх x30DF push bc push de ld hl,#F6F5 ;колво строк в буфере редактирования push hl ld a,(hl) ;кол-во строк в буфере редактирования or a jr nz,x3101 push hl call x335F ;копирование процедур в ram ld hl,(#F9D7) ;номер строки в редактируемой строке программы call x3352 ;преобразование номера строки в ASCII и помещение в буфер jr nc,x30F8 ;строка не существует ld (#F9D7),hl ;сохраним номер строки x30F8 ld b,h ld c,l pop hl call x32D6 ;копирование строки программы в буфер редактирования dec a jr x3116 x3101 ld hl,#EC0D ;сдвиг всех строк вверх res 0,(hl) ld hl,#F6F8 ld d,h ld e,l ld bc,#0023 add hl,bc ld bc,#02BC ldir dec a scf x3116 pop de ld (de),a ld hl,#F6F8 pop de pop bc ret ;АДРЕС: #311E сдвиг строк в буфере редактирования вниз ;вх: de - адрес последней строки в буфере редактирования ;вых: cy=0 буфер переполнен ; a - количество строк в буфере редактирования ; hl - fдрес первой строки в буфере редактирования x311E push bc push de ld hl,#0020 add hl,de ld a,(hl) cpl and #11 jr nz,x313F ;это не первая строка push hl push de inc hl ld d,(hl) inc hl ld e,(hl) ;de номер строки бейсик программы push de call x335F ;копирование процедур в ram pop hl call x334A ;поиск адреса строки бейсик программы jr nc,x313D ;строка не существует ld (#F9D7),hl x313D pop de pop hl x313F bit 0,(hl) ld hl,#F6F5 push hl jr z,x314C ;это не первая строка в буфере ld a,#00 scf jr x3116 x314C ld a,(hl) cp #14 jr z,x3116 ;это конец буфера ld bc,#0023 ld hl,#F6F8 ex de,hl ldir ld hl,#F9D6 ld d,h ld e,l ld bc,#0023 or a sbc hl,bc ld bc,#02BC lddr inc a scf jr x3116 ;АДРЕС: #316E вставка символа в нижний буфер редактирования ;вх: hl - адрес флага текущей строки ; a - код символа для вставки в буфер x316E push bc push de push af ld b,#00 ld c,#01 push hl call x31C3 ;расчет адреса начала строки в буфере редактирования pop hl bit 3,(hl) res 3,(hl) jr nz,x31A0 x3180 call x2E41 ;поиск в строке вправо от курсора редактируемого символа pop af x3184 call x16AC ;вставка символа в строку буфера редактирования jr z,x31BA push af ld b,#00 inc c ld a,c cp #15 jr c,x31A0 dec hl ld a,(hl) inc hl cp #00 jr z,x31A0 push hl ld hl,#EC0D set 0,(hl) ;буфер заполнен pop hl x31A0 bit 1,(hl) set 1,(hl) res 3,(hl) call x31C3 ;расчет адреса начала строки в буфере редактирования jr nz,x3180 push bc push de call x35E6 ;зануление до конца строки в буфере редактирования ld (hl),#08 pop de pop bc call x35F4 ;создание отступа в строке в буфере редактирования pop af jr x3184 x31BA ld a,c ld (#F6F5),a set 3,(hl) pop de pop bc ret ;АДРЕС: #31C3 расчет адреса начала строки в буфере редактирования ;вх: c - номер строки ;вых: de - адрес начала строки x31C3 ld hl,#F6F8 jp x30B7 ;АДРЕС: #31C9 удаление символа в нижнем буфере редактирования x31C9 push bc push de ld hl,#EC0D res 0,(hl) ld a,(#F6F5) ld c,a or a ld a,#00 jr z,x321B x31D9 call x31C3 ;расчет адреса начала строки в буфере редактирования push af ld b,#00 call x2E41 ;поиск в строке вправо от курсора редактируемого символа jr nc,x31F2 pop af call x16C1 ;вставка символа в строку буфера редактирования со сдвигом влево push af push bc ld b,#00 call x2E41 ;поиск в строке вправо от курсора редактируемого символа pop bc jr c,x3216 x31F2 inc hl ld a,(hl) push af push bc ld a,c cp #01 jr nz,x3204 ld a,(#EC15) ld c,a call x30B4 ;расчет адреса начала строки в буфере редактирования jr x3208 x3204 dec c call x31C3 ;расчет адреса начала строки в буфере редактирования x3208 pop bc pop af ld hl,#0020 add hl,de res 1,(hl) or (hl) ld (hl),a ld hl,#F6F5 dec (hl) x3216 pop af dec c jr nz,x31D9 scf x321B pop de pop bc ret ;АДРЕС: #321E параметры для установки буфера редактирования строки вверху экрана x321E db #03 db #00: dw #F9DE ;АДРЕС: #3222 установка буфера редактирования в верху экрана x3222 ld hl,x321E ld de,#F9DB jp x3FBA ;АДРЕС: #322B перемещение курсора вверх в верхнем буфере редактирования x322B push bc push de ld hl,#F9DB push hl ld a,(hl) or a jr nz,x3253 push hl call x335F ;копирование процедур в ram ld hl,(#FC9A) call x334A ;поиск адреса строки бейсик программы jr nc,x3244 ld (#FC9A),hl x3244 ld b,h ld c,l pop hl inc hl inc hl inc hl jr nc,x325D ;!!!ОШИБКА!!! call x32D6 ;копирование строки программы в буфер редактирования dec a ex de,hl jr x325D x3253 ld hl,(#F9DC) ld bc,#0023 sbc hl,bc scf dec a x325D ex de,hl pop hl jr nc,x3262 ld (hl),a x3262 inc hl ld (hl),e inc hl ld (hl),d ex de,hl pop de pop bc ret ;АДРЕС: #326A копирование строки бейсик программы в буфер редактирования вверзу экрана x326A push bc push de ld hl,#0020 add hl,de ld a,(hl) cpl and #11 jr nz,x3282 push de push hl inc hl ld d,(hl) inc hl ld e,(hl) ld (#FC9A),de pop hl pop de x3282 bit 3,(hl) ld hl,#F9DB push hl jr z,x32A0 push hl call x335F ;копирование процедур в ram ld hl,(#FC9A) call x3352 ;преобразование номера строки в ASCII и помещение в буфер ld (#FC9A),hl pop hl inc hl inc hl inc hl ld a,#00 scf jr x325D x32A0 ld a,(hl) cp #14 jr z,x32B3 inc a ld hl,(#F9DC) ld bc,#0023 ex de,hl ldir ex de,hl scf jr x325D x32B3 pop hl pop de pop bc ret ;АДРЕС: #32B7 расчет адреса начала строки в буфере редактирования ;вх: c - номер строки ;вых: de - адрес начала строки x32B7 ld hl,#F9DE jp x30B7 ;АДРЕС: #32DB таблица обработки управляющих кодов при редактировании строки x32BD db #08 ;всего функций db #0D: dw x35CC ;enter db #01: dw x35DA ;null db #12: dw x335A ;flash db #13: dw x335A ;bright db #14: dw x335A ;inverse db #15: dw x335A ;over db #10: dw x335A ;ink db #11: dw x335A ;paper ;АДРЕС: #32D6 копирование строки программы в буфер редактирования ;вх: hl - адрес флагов предыдущей строки в буфере редактирования ; bc - номер редактируемой строки в буфере редактирования ;вых: a - количество строк в буфере редактирования ; hl - адрес первой строки ; de - адрес последней строки x32D6 ld d,h ld e,l inc de inc de inc de ;адрес редактируемой строки в буфере редактирования push de ld hl,#0020 add hl,de ;адрес флагов редактируемой строки ld (hl),#01 ;первая строка inc hl ld (hl),b inc hl ld (hl),c ;номер строки ld c,#01 ;строка 1 ld b,#00 ;колонка 0 x32EA push bc push de ld a,(#EC0E) cp #04 ;это режим калькулятора call nz,x3517 ;нет. преобразование токена в текст pop de pop bc jr c,x3307 ;токен преобразован ld a,c cp #01 ld a,#0D jr nz,x3307 ;это не 'enter' ld a,b or a ld a,#01 jr z,x3307 ld a,#0D x3307 ld hl,x32BD call x3FCE ;обработка управляющего кода jr c,x332C ;код обработан jr z,x32EA ;следующий символ push af ld a,#1F cp b jr nc,x3326 ld a,#12 call x3331 ;перенос части строки на следующую строку jr c,x3323 pop af ld a,#0D jr x3307 x3323 call x35F4 ;создание отступа в строке в буфере редактирования x3326 pop af call x35C5 ;сохранить символ в указанном столбце текущей строки буфера редактирования jr x32EA x332C pop hl ld a,c ret z scf ret ;АДРЕС: #3331 перенос части строки на следующую строку ;вх: de - адрес начала строки в буфере редактирования строки ; b - номер столбца ; c - номер строки ; a - новое значение байта флага ;вых: cy=0 - нижняя строка в буфере ; hl - адрес байта флага для новой строки x3331 push af call x35E6 ;зануление до конца строки в буфере редактирования pop af xor (hl) ld (hl),a ld a,c cp #14 ret nc inc c ld hl,#0023 add hl,de ex de,hl ld hl,#0020 add hl,de ld (hl),#00 scf ret ;АДРЕС: #334A поиск адреса строки бейсик программы ;вх: hl - номер строки ;вых: cy=1 строка существует ; de - адрес первой команды в строке x334A call x34B6 ;поиск адреса строки программы с заданным номером ret c ld hl,#0000 ret ;АДРЕС: #3352 преобразование номера строки в ASCII и помещение в буфер ;вх: hl - номер строки ;вых: cy=1 строка существует ; de - адрес начала команд в строке ; hl - номер строки (=#0000 строка не существует) x3352 call x3430 ;преобразование номера строки в ASCII и помещение в буфер ret c ld hl,#0000 ret ;АДРЕС: #335A преобразование токена в текст ;вых: cy=0 токен преобразован x335A call x3517 ;преобразование токена в текст ccf ret nc ;!!!ОШИБКА!!! должно быть ret??? ;АДРЕС: #335F копирование процедур в ram x335F ld hl,#0000 ld (#FC9F),hl ;адрес следующего символа в строке бейсик программы ld (#FCA1),hl ;адрес следующего символа в буфере ключевго слова ld hl,x3374 ld de,#FCAE ld bc,#00BC ldir ret ;АДРЕС: #3374 копирование токена в буфер токенов (=#FCAE) ;вх: a - номер токена -#A5 ; de - адрес в буфере x3374 di ld bc,#7FFD ld d,#17 ;rom 0, ram 7, scr 5 out (c),d cp #50 jr nc,x33B1 ;токен =>#F5 cp #40 jr nc,x33AA ;токен =>#E5 cp #30 jr nc,x33A3 ;токен =>#D5 cp #20 jr nc,x339C ;токен =>#C5 cp #10 jr nc,x3395 ;токен =>#B5 ld hl,Rom1.x0095+#01 jr x33B6 x3395 sub #10 ld hl,Rom1.x0095+#3A jr x33B6 x339C sub #20 ld hl,Rom1.x0095+#6B jr x33B6 x33A3 sub #30 ld hl,Rom1.x0095+#A9 jr x33B6 x33AA sub #40 ld hl,Rom1.x0095+#F6 jr x33B6 x33B1 sub #50 ld hl,Rom1.x0095+#13F x33B6 ld b,a or a x33B8 jr z,x33C3 x33BA ld a,(hl) inc hl and #80 jr z,x33BA dec b jr x33B8 ;АДРЕС: #33C3 копирование токена (=#FCFD) ;вх: - адрес токена в rom 1 x33C3 ld de,#FCA3 ld (#FCA1),de ld a,(#FC9E) or a ld a,#00 ld (#FC9E),a jr nz,x33D9 ld a," " ld (de),a inc de x33D9 ld a,(hl) ld b,a inc hl ld (de),a inc de and #80 jr z,x33D9 ld a,b and #7F dec de ld (de),a inc de ld a," "+#80 ld (de),a ld a,#07 ;rom 0, ram 7, scr 5 ld bc,#7FFD out (c),a ei ret ;АДРЕС: #33F4 распознавание токена (=#FD2E) ;вых: cy=1 токен найден -> a - код токена x33F4 di ld bc,#7FFD ld d,#17 ;rom 0, ram 7, scr 5 out (c),d ld hl,Rom1.x0095+#01 ld b,#A5 x3401 ld de,#FD74 ;адрес слова x3404 ld a,(de) and #7F cp #61 ld a,(de) jr c,x340E and #DF ;в верхний регистр x340E cp (hl) jr nz,x341A ;не совпадает inc hl inc de and #80 jr z,x3404 ;совпадает, следующий символ scf jr x3426 ;токен найден x341A inc b jr z,x3425 x341D ld a,(hl) ;ищем следующий токен and #80 inc hl jr z,x341D jr x3401 x3425 or a x3426 ld a,b ld d,#07 ;rom 0, ram 7, scr 5 ld bc,#7FFD out (c),d ei ret ;АДРЕС: #3430 преобразование номера строки в ASCII и помещение в буфер ;вх: hl - номер строки ;вых: cy=1 строка существует ; de - адрес начала команд в строке ; hl - номер строки x3430 call x34EA ;обнуление указателей в бейсик строке or a ;!!!ОШИБКА!!! должно быть xor a ld (#FC9E),a call x1F20 ;установка другого стэка и ram 0 call x34F6 ;поиск адрес строки бейсик программы в памяти jr nc,x3491 ;строка не найдена jr nz,x344D ;строка не найдена, но есть следующая ld a,b or c jr z,x344D ;это первая строки программы call x34CF ;расчет адреса следущей строки бейсик программы call x34D9 ;проверка на конец бейсик программы jr nc,x3491 ;это последняя строка программы x344D ld d,(hl) inc hl ld e,(hl) ;de - номер строки call x1F45 ;установка другого стэка и ram 7 push de push hl push ix ld ix,#FCA3 ;буфер токена ld (#FCA1),ix ex de,hl ld b,#00 ld de,-1000 call x3495 ;выделение разряда числа и занесение его в буфер ld de,-100 call x3495 ;выделение разряда числа и занесение его в буфер ld de,-10 call x3495 ;выделение разряда числа и занесение его в буфер ld de,-1 call x3495 ;выделение разряда числа и занесение его в буфер dec ix ;!!!можно оптимизировать set 7,(ix-1) ld a,(ix+#00) ;!!!можно оптимизировать or #80 ;!!!можно оптимизировать ld (ix+#00),a ;!!!можно оптимизировать pop ix pop hl pop de inc hl inc hl inc hl ld (#FC9F),hl ex de,hl scf ret x3491 call x1F45 ;установка другого стэка и ram 7 ret ;АДРЕС: #3495 выделение разряда числа и занесение его в буфер ;вх: de - делитель ; hl - номер строки ; ix - адрес в буфере для записи номера строки в ASCII ; b =#00 старший разряд числа еще не найден ;вых: ix - следующий адрес в буфере ; b =#01 старший разряд числа найден x3495 xor a x3496 add hl,de inc a jr c,x3496 sbc hl,de dec a add a,#30 ld (ix+#00),a cp "0" jr nz,x34B1 ld a,b or a jr nz,x34B3 ld a,#00 ld (ix+#00),a jr x34B3 x34B1 ld b,#01 x34B3 inc ix ret ;АДРЕС: #34B6 поиск адрес строки программы с заданным номером или следущей ; строки, если строка с заданным номером не существует ;вх: hl - номер строки ;вых: cy=1 строка найдена ; de - адрес начала команд в строке ; hl - номер строки x34B6 call x34EA ;обнуление указателей в бейсик строке or a ;!!!ОШИБКА!!! должно быть xor a ld (#FC9E),a call x1F20 ;установка другого стэка и ram 0 call x34F6 ;поиск адрес строки бейсик программы в памяти jr nc,x3491 ;строка не существует ex de,hl ld a,l or h scf jp nz,x344D ccf jr x3491 ;АДРЕС: #34CF расчет адреса следущей строки бейсик программы ;вх: hl - адрес текущей строки ;вых: de - адрес текущей строки ; hl - адрес следующей строки x34CF push hl inc hl inc hl ld e,(hl) inc hl ld d,(hl) inc hl add hl,de pop de ret ;АДРЕС: #34D9 проверка на конец бейсик программы ;вх: hl - адрес в строке ;вых: cy=0 - это конец строки x34D9 ld a,(hl) and #C0 scf ret z ccf ret ;АДРЕС: #34E0 сравнение номера строки с заданным ;вх: hl - адрес номера строки в бейсик программе ; bc - номер строки ;вых: z, cy=1 - строка найдена ; nz, cy=1 - bc<(hl) ; nz, cy=0 - bc>(hl) x34E0 ld a,b cp (hl) ret nz ld a,c inc hl cp (hl) dec hl ret nz scf ret ;АДРЕС: #34EA обнуление указателей в бейсик строке x34EA push hl ld hl,#0000 ld (#FCA1),hl ld (#FC9F),hl pop hl ret ;АДРЕС: #34F6 поиск адрес строки бейсик программы в памяти ;вх: hl - номер строки (=#0000 первая строка) ;вых: cy=1 - искомая или следующая строка существует ; nz - строка не найдена ; hl - адрес строки программы (=#0000 строка не существует) ; de - адрес предыдущей строки программы (=#0000 строка не существует) ; bc - номер строки (=#0000 первая строка) x34F6 push hl pop bc ld de,#0000 ld hl,(#5C53) call x34D9 ;проверка на конец бейсик программы ret nc ;конец программы call x34E0 ;сравнение номера строки с заданным ret c ld a,b or c scf ret z ;нужна первая строка x350A call x34CF ;расчет адреса следущей строки бейсик программы call x34D9 ;проверка на конец бейсик программы ret nc ;это конец программы call x34E0 ;сравнение номера строки с заданным jr nc,x350A ;не та строка, ищем дальше ret ;АДРЕС: #3517 преобразование токена в текст ;вых: cy=1 токен преобразован x3517 ld hl,(#FCA1) ;адрес следующего символа ld a,l or h jr z,x353C ;нет символа ld a,(hl) inc hl cp " "+#80 ld b,a ld a,#00 jr nz,x3529 ;не последний символ ld a,#FF x3529 ld (#FC9E),a ;флаг ld a,b bit 7,a jr z,x3534 ;не последний символ x3531 ld hl,#0000 x3534 ld (#FCA1),hl and #7F jp x358F x353C ld hl,(#FC9F) ld a,l or h jp z,x3591 ;больше нечего обрабатывать call x1F20 ;установка другого стэка и ram 0 x3547 ld a,(hl) cp #0E jr nz,x3554 ;это не число с плавающей точкой inc hl inc hl inc hl inc hl inc hl inc hl jr x3547 x3554 call x1F45 ;установка другого стэка и ram 7 inc hl ld (#FC9F),hl cp #A5 ;'RND' jr c,x3567 ;не токен basic48 sub #A5 ;!!!ОШИБКА call #FCAE ;x335F копирование токена в буфер jp x3517 x3567 cp #A3 ;токены basic128: SPECTRUM или PLAY jr c,x357B jr nz,x3572 ;PLAY ld hl,x3594 jr x3575 x3572 ld hl,x359C ;SPECTRUM x3575 call #FCFD ;x33C3 копирование токена jp x3517 x357B push af ld a,#00 ld (#FC9E),a pop af cp #0D jr nz,x358F ld hl,#0000 ;конец строки ld (#FCA1),hl ld (#FC9F),hl x358F scf ret x3591 scf ccf ret ;АДРЕС: #3594 токены basic128 x3594 dc "SPECTRUM" x359C dc "PLAY" x35A0 dc "GOTO" x35A4 dc "GOSUB" x35A9 dc "DEFFN" x35AE dc "OPEN#" x35B3 dc "CLOSE#" ;АДРЕС: #35BC установка параметров отступа x35B9 db #02 db #01,#05 x35BC ld hl,x35B9 ld de,#FD6A jp x3FBA ;АДРЕС: #35C5 сохранить символ в указанном столбце текущей строки буфера редактирования ;вх: b - номер столбца ; de - начальный адрес строки ; a - код символа ;вых: b - номер следующего столбца x35C5 ld l,b ld h,#00 add hl,de ld (hl),a inc b ret ;АДРЕС: #35CC процедура обработки нажатия 'enter' в строке ;вых: cy=1 x35CC call x35E6 ;зануление до конца строки в буфере редактирования ld a,(hl) or #18 ld (hl),a ld hl,#FD6A set 0,(hl) scf ret ;АДРЕС: #35DA процедура обработки зануления до конца строки ;вых: cy=1 x35DA call x35E6 ;зануление до конца строки в буфере редактирования set 3,(hl) ld hl,#FD6A ;!!!можно сократить jr x35CC+nn set 0,(hl) scf ret ;АДРЕС: #35E6 зануление до конца строки в буфере редактирования ;вх: b - номер первого столбца ; de - адрес начала строки редактирования ;вых: hl - адрес байта флага строки x35E6 ld l,b ld h,#00 add hl,de ld a," " x35EC cp b ret z ld (hl),#00 inc hl inc b jr x35EC ;АДРЕС: #35F4 создание отступа в строке в буфере редактирования ;вх: de - адрес строки в буфере редактирования ;вых: b - первый используемый номер столбца в строке x35F4 ld a,(#FD6B) ld b,#00 x35F9 ld h,#00 ld l,b add hl,de ld (hl),#00 inc b dec a jr nz,x35F9 ret ;АДРЕС: #3604 печать строки редактируемого буфера, при необходимости x3604 push bc push de push hl push hl ld hl,#EEF5 bit 2,(hl) pop hl jr nz,x3614 ;обновлять экран не надо ld b,c call x3B1E ;печать строки редактируемого буфера x3614 pop hl pop de pop bc ret ;АДРЕС: #3618 сдвиг вверх строк в буфере редактирования при необходимости ;вх: hl - адрес первой строки в буфере ; c - количество строк ; b - номер строки от которой будет сдвиг x3618 push bc push de push hl push hl ld hl,#EEF5 bit 2,(hl) pop hl jr nz,x3628 ld e,c call x3ABF ;сдвиг вверх строк в буфере редактирования x3628 pop hl pop de pop bc ret ;АДРЕС: #362C сдвиг вниз строк в буфере редактирования при необходимости ;вх: hl - адрес первой строки в буфере ; c - количество строк ; b - номер строки от которой будет сдвиг x362C push bc push de push hl push hl ld hl,#EEF5 bit 2,(hl) pop hl jr nz,x363C ld e,c call x3AC6 ;сдвиг вниз строк в буфере редактирования x363C pop hl pop de pop bc ret ;АДРЕС: #3640 печать атрибутов курсора ;вх: c - номер строки ; b - номер столбца x3640 push af push bc push de push hl ld a,b ld b,c ld c,a call x3A9D ;печать атрибутов курсора pop hl pop de pop bc pop af ret ;АДРЕС: #364F восстановление атрибутов под курсором ;вх: c - crd Y, b - crd X x364F push af push bc push de push hl ld a,b ld b,c ld c,a call x3AB2 ;восстановление атрибутов под курсором pop hl pop de pop bc pop af ret ;АДРЕС: #365E установка переменных для ввода символа x365E ld a,#00 ld (#5C41),a ;Число, определяющее режим ввода с клавиатуры ld a,#02 ld (#5C0A),a ;Период автоповтора x3668 ld hl,#5C3B ld a,(hl) or #0C ld (hl),a ;ввод символа ld hl,#EC0D bit 4,(hl) ld hl,x5B66 jr nz,x367C res 0,(hl) ret x367C set 0,(hl) ret ;АДРЕС: #367F ожидание нажатия клавиши ;вых: a - код клавиши x367F push hl x3680 ld hl,#5C3B x3683 bit 5,(hl) jr z,x3683 ;клавиша не нажата res 5,(hl) ld a,(#5C08) ;Код нажатой клавиши ld hl,#5C41 res 0,(hl) cp #20 jr nc,x36A2 ;символьная клавиша cp #10 jr nc,x3680 ;нет реакции cp #06 jr c,x3680 call x36A4 jr nc,x3680 x36A2 pop hl ret x36A4 rst #28 ;вызов п/п из basic 48 dw Rom1.x10DB ;обработка кода клавиши ret ;АДРЕС: #36A8 печать меню basic 128k ;вх: hl - адрес описания меню x36A8 push hl call x373B ;сохранение окна экрана 14*12 в буфере ld hl,#5C3C res 0,(hl) pop hl ld e,(hl) inc hl push hl ld hl,x37EC ;управляющие коды для печати меню call x3733 ;печать строки из hl pop hl call x3733 push hl call x3822 ;печать эмблемы ZX (косые цветные полосы) в меню ld hl,x37FA ;управляющие коды для печати меню call x3733 ;печать строки из hl pop hl ;печать строчек меню push de ld bc,#0807 call x372B ;установка координат печати из bc x36D1 push bc ld b,#0C ld a,#20 rst #10 ;пробел x36D7 ld a,(hl) ;печать строчки меню inc hl cp #80 jr nc,x36E0 rst #10 djnz x36D7 x36E0 and #7F rst #10 x36E3 ld a,#20 ;дополняем пробелами rst #10 djnz x36E3 pop bc inc b call x372B ;установка координат печати из bc dec e jr nz,x36D1 ld hl,#6F38 pop de ;печать рамки вокруг меню sla e sla e sla e ld d,e dec d ld e,#6F ld bc,#FF00 ld a,d call x3719 ;печать одной линии вокруг меню ld bc,#0001 ld a,e call x3719 ;печать одной линии вокруг меню ld bc,#0100 ld a,d inc a call x3719 ;печать одной линии вокруг меню xor a call x37CA ;атрибутов опции меню ret ;АДРЕС: #3719 печать одной линии вокруг меню ;вх: hl - координаты ; bc - приращение координат x3719 push af push hl push de push bc ld b,h ld c,l rst #28 ;вызов процедуры из basic 48k dw Rom1.x22E9 ;печать точки pop bc pop de pop hl pop af add hl,bc dec a jr nz,x3719 ret ;АДРЕС: #372B установка координат печати из bc ;вх: bc - координаты печати x372B ld a,#16 rst #10 ld a,b rst #10 ld a,c rst #10 ret ;АДРЕС: #3733 печать строки из hl ;вх: hl - адрес строки x3733 ld a,(hl) inc hl cp #FF ret z rst #10 ;печать символа из A jr x3733 ;АДРЕС: #373B сохранение окна экрана 14*12 в буфере x373B scf jr x373F ;АДРЕС: #373E восстановление окна экрана 14*12 из буфера x373E and a x373F ld de,#EEF6 ld hl,#5C3C jr c,x3748 ex de,hl x3748 ldi jr c,x374D ex de,hl x374D ld hl,#5C7D ;Координаты X и Y последней изображенной на экране точки jr c,x3753 ex de,hl x3753 ld bc,#0014 ldir jr c,x375B ex de,hl x375B ex af,af' ld bc,#0707 call x3B94 ld a,(ix+#01) add a,b ld b,a ld a,#0C x3769 push bc push af push de rst #28 ;вызов процедуры из basic 48k dw Rom1.x0E9B ;расчет адреса на экране по координатам ld bc,#0007 add hl,bc pop de call x377E ;сохранение/восстановление 14 знакомест экана в буфере pop af pop bc dec b dec a jr nz,x3769 ret ;АДРЕС: #377E сохранение/восстановление 14 знакомест экана в буфере ;вх: cy' =1 сохранение части экрана в буфере ; =0 восстановление части экрана из буфера ; hl - адрес на экране ; de - адрес в буфере x377E ld bc,#080E x3781 push bc ld b,#00 push hl ex af,af' jr c,x3789 ex de,hl x3789 ldir jr c,x378E ex de,hl x378E ex af,af' pop hl inc h pop bc djnz x3781 push bc push de rst #28 ;вызов процедуры из basic 48k dw Rom1.x0E88 ;расчет адреса в атрибутах по координатам ex de,hl pop de pop bc ex af,af' jr c,x37A0 ex de,hl x37A0 ldir jr c,x37A5 ex de,hl x37A5 ex af,af' ret ;АДРЕС: #37A7 клавиша вверх в меню basic128 ;вх: a - номер опции ; hl - адрес списка опций меню x37A7 call x37CA ;инвертирование атрибутов опции меню dec a jp p,x37B1 ld a,(hl) dec a dec a x37B1 call x37CA ;инвертирование атрибутов опции меню scf ret ;АДРЕС: #37B6 клавиша вниз в меню basic128 ;вх: a - номер опции ; hl - адрес списка опций меню x37B6 push de call x37CA ;инвертирование атрибутов опции меню inc a ld d,a ld a,(hl) dec a dec a cp d ld a,d jp p,x37C5 xor a x37C5 call x37CA ;инвертирование атрибутов опции меню pop de ret ;АДРЕС: #37CA инвертирование атрибутов опции меню ;вх: a - номер опции x37CA push af push hl push de ld hl,#5907 ld de,#0020 and a jr z,x37DA x37D6 add hl,de dec a jr nz,x37D6 x37DA ld a,%01111000 ;bright 1, paper 7, ink 0 cp (hl) jr nz,x37E1 ld a,%01101000 ;bright 1, paper 5, ink 0 ;печать атрибутов опции x37E1 ld d,#0E x37E3 ld (hl),a inc hl dec d jr nz,x37E3 pop de pop hl pop af ret ;АДРЕС: #37EC управляющие коды для печати меню x37EC db #16,#07,#07 ;координаты db #15,#00 ;over 0 db #14,#00 ;inverse 0 db #10,#07 ;ink 7 db #11,#00 ;paper 0 db #13,#01 ;bright 1 db #FF ;АДРЕС: #37FA управляющие коды для печати меню x37FA db #11,#00,#20 ;paper 0 db #11,#07 ;paper 7 db #10,#00 ;ink 0 db #FF ;АДРЕС: #3802 данные потоков для печати эмблемы x3802 db #01,#03,#07,#0F,#1F,#3F,#7F,#FF db #FE,#FC,#F8,#F0,#E0,#C0,#80,#00 ;АДРЕС: #3812 управляющие коды для печати косых полос в меню x3812 db #10,#02,#20 ;ink 2 db #11,#06,#21 ;paper 6 db #10,#04,#20 ;ink 4 db #11,#05,#21 ;paper 5 db #10,#00,#20 ;ink 0 db #FF ;АДРЕС: #3822 печать эмблемы ZX (косые цветные полосы) в меню x3822 push bc push de push hl ld hl,x3802 ld de,x5B98 ld bc,#0010 ldir ld hl,(#5C36) push hl ld hl,#5A98 ld (#5C36),hl ld hl,x3812 ;управляющие коды для печати косых полос в меню call x3733 ;печать строки из hl pop hl ld (#5C36),hl pop hl pop de pop bc ret ;АДРЕС: #3848 печать информационной строки 128 BASIC x3848 ld hl,x2768 jr x385A ;АДРЕС: #384D печать информационной строки Calculator x384D ld hl,x2771 jr x385A ;АДРЕС: #3852 печать информационной строки 48 TR-DOS x3852 ld hl,x2783 jr x385A ;АДРЕС: #3857 печать информационной строки 128 TR-DOS x3857 ld hl,x275E ;сообщение "128 TR-DOS" x385A push hl call x3881 ;очистка двух нижних строк экрана ld hl,#5AA0 ;установка атрибутов в строке ld b,#20 ld a,#40 ;bright 1, paper 0, ink 0 x3865 ld (hl),a inc hl djnz x3865 ld hl,x37EC ;управляющие коды для печати меню call x3733 ;печать строки из hl ld bc,#1500 call x372B ;установка координат печати из bc pop de call x057D ;печать строки из de ld c,#1A call x372B ;установка координат печати из bc jp x3822 ;печать эмблемы ZX (косые цветные полосы) в меню ;АДРЕС: #3881 очистка двух нижних строк экрана x3881 ld b,#15 ld d,#17 jp x3B5E ;АДРЕС: #3888 перенумерация строк программы x3888 call x1F20 ;установка другого стэка и ram 0 call x3A05 ;подсчет количества строк в бейсик программе ld a,d or e jp z,x39C0 ld hl,(x5B96) rst #28 ;!!!ОШИБКА!!! dw Rom1.x30A9 ;hl=hl*de ex de,hl ld hl,(x5B94) add hl,de ld de,10000 or a sbc hl,de jp nc,x39C0 ld hl,(#5C53) x38AA rst #28 dw Rom1.x19B8 ;поиск адрес начала следующей строки программы inc hl inc hl ld (x5B92),hl inc hl inc hl ld (x5B67+4),de x38B8 ld a,(hl) rst #28 dw Rom1.x18B6 ;пропуск натурального числа cp #0D jr z,x38C5 call x390E ;анализ строки и перенумерование ссылок на номера строк jr x38B8 x38C5 ld de,(x5B67+4) ld hl,(#5C4B) and a sbc hl,de ex de,hl jr nz,x38AA x38D2 call x3A05 ;подсчет количества строк в бейсик программе ld b,d ld c,e ld de,#0000 ld hl,(#5C53) x38DD push bc push de push hl ld hl,(x5B96) rst #28 dw Rom1.x30A9 ;hl=hl*de ld de,(x5B94) add hl,de ex de,hl pop hl ld (hl),d inc hl ld (hl),e inc hl ld c,(hl) inc hl ld b,(hl) inc hl add hl,bc pop de inc de pop bc dec bc ld a,b or c jr nz,x38DD call x1F45 ;установка другого стэка и ram 7 ld (x5B92),bc scf ret ;токены, использующие ссылки на строки x3907 db #CA ;LINE db #F0 ;LIST db #E1 ;LLIST db #EC ;GO TO db #ED ;GO SUB db #E5 ;RESTORE db #F7 ;RUN ;АДРЕС: #390E анализ строки и перенумерование ссылок на номера строк x390E inc hl ld (x5B78+1),hl ex de,hl ld bc,#0007 ld hl,x3907 x3919 cpir ex de,hl ret nz ld c,#00 x391F ld a,(hl) cp " " jr z,x393F rst #28 dw Rom1.x2D1B ;это цифра? jr nc,x393F cp "." jr z,x393F cp #0E jr z,x3943 or #20 cp "e" jr nz,x393B ld a,b or c jr nz,x393F x393B ld hl,(x5B78+1) ret x393F inc bc inc hl jr x391F x3943 ld (x5B71),bc push hl rst #28 dw Rom1.x18B6 ;пропуск натурального числа call x3A36 ;пропуск пробелов в строке ld a,(hl) pop hl cp ":" jr z,x3957 cp #0D ret nz x3957 inc hl rst #28 dw Rom1.x33B4 ;поместить число на смэк калькулятора rst #28 dw Rom1.x2DA2 ;извлечь значение со стэка калькулятора ld h,b ld l,c rst #28 dw Rom1.x196E ;получить начальный адрес строки программы jr z,x396F ld a,(hl) cp #80 jr nz,x396F ld hl,#270F ;9999 jr x3980 x396F ld (x5B76+1),hl call x3A0B ;подсчет количества строк ld hl,(x5B96) rst #28 dw Rom1.x30A9 ;hl=hl*de ld de,(x5B94) add hl,de x3980 ld de,x5B72+1 push hl call x3A3C ;номер строки в ASCII ld e,b inc e ld d,#00 push de push hl ld l,e ld h,#00 ld bc,(x5B71) or a sbc hl,bc ld (x5B71),hl jr z,x39CF jr c,x39C5 ld b,h ld c,l ld hl,(x5B78+1) push hl push de ld hl,(#5C65) add hl,bc jr c,x39BE ex de,hl ld hl,#0082 add hl,de jr c,x39BE sbc hl,sp ccf jr c,x39BE pop de pop hl rst #28 dw Rom1.x1655 ;резервирование места (длина в bc) jr x39CF x39BE pop de pop hl x39C0 call x1F45 ;установка другого стэка и ram 7 and a ret x39C5 dec bc dec e jr nz,x39C5 ld hl,(x5B78+1) rst #28 dw Rom1.x19E8 ;удалить массив DIM x39CF ld de,(x5B78+1) pop hl pop bc ldir ex de,hl ld (hl),#0E pop bc inc hl push hl rst #28 dw Rom1.x2D2B ;bc на стэк калькулятора pop de ld bc,#0005 ldir ex de,hl push hl ld hl,(x5B92) push hl ld e,(hl) inc hl ld d,(hl) ld hl,(x5B71) add hl,de ex de,hl pop hl ld (hl),e inc hl ld (hl),d ld hl,(x5B67+4) ld de,(x5B71) add hl,de ld (x5B67+4),hl pop hl ret ;АДРЕС: #3A05 подсчет количества строк в бейсик программе x3A05 ld hl,(#5C4B) ld (x5B76+1),hl x3A0B ld hl,(#5C53) ld de,(x5B76+1) or a sbc hl,de jr z,x3A31 ld hl,(#5C53) ld bc,#0000 x3A1D push bc rst #28 dw Rom1.x19B8 ;поиск адрес начала следующей строки программы ld hl,(x5B76+1) and a sbc hl,de jr z,x3A2E ex de,hl pop bc inc bc jr x3A1D x3A2E pop de inc de ret x3A31 ld de,#0000 ret ;АДРЕС: #3A35 пропуск пробелов в строке x3A35 inc hl x3A36 ld a,(hl) cp " " jr z,x3A35 ret ;АДРЕС: #3A3C номер строки в ASCII x3A3C push de ld bc,-1000 call x3A60 ;получить один разря числа в ASCII ld bc,-100 call x3A60 ;получить один разря числа в ASCII ld c,-10 call x3A60 ;получить один разря числа в ASCII ld a,l add a,"0" ld (de),a inc de ld b,#03 pop hl x3A56 ld a,(hl) cp "0" ret nz ld (hl)," " inc hl djnz x3A56 ret ;АДРЕС: #3A60 получить один разря числа в ASCII x3A60 xor a x3A61 add hl,bc inc a jr c,x3A61 sbc hl,bc dec a add a,"0" ld (de),a inc de ret ;настройки курсора x3A6D db #08 db #00,#00,#14,#00,#00,#00,#0F,#00 ;настройки курсора x3A76 db #08 db #00,#16,#01,#00,#00,#00,#0F,#00 ;АДРЕС: #3A7F установка настроек курсора для верхнего окна x3A7F ld ix,#FD6C ld hl,x3A6D jr x3A8B ;АДРЕС: #3A88 установка настроек курсора для нижнего окна x3A88 ld hl,x3A76 x3A8B ld de,#FD6C jp x3FBA ;АДРЕС: #3A91 !!!NOT USED!!! x3A91 rst #10 ld a,d rst #10 scf ret ;АДРЕС: #3A96 сохранить атрибуты курсора x3A96 and #3F ld (ix+#06),a scf ret ;АДРЕС: #3A9D печать атрибутов курсора ;вх: b - номер строки ; c - номер столбца ; ix - адрес дескриптора курсора x3A9D ld a,(ix+#01) add a,b ld b,a call x3BA0 ;расчет адреса атрибутов ld a,(hl) ld (ix+#07),a ;сохраним атрибуты cpl and #C0 or (ix+#06) ld (hl),a scf ret ;АДРЕС: #3AB2 восстановление атрибутов под курсором ;вх: b - crd Y ; c - crd X ; ix - адрес описания курсора x3AB2 ld a,(ix+#01) add a,b ld b,a call x3BA0 ;расчет адреса атрибутов ld a,(ix+#07) ld (hl),a ret ;АДРЕС: #3ABF сдвиг вверх строк в буфере редактирования ;вх: hl - адрес первой строки в буфере ; e - количество строк ; b - номер строки от которой будет сдвиг x3ABF push hl ld h,#00 ;сдвиг вверх ld a,e sub b ;a - количество строк для сдвига jr x3ACD ;АДРЕС: #3AC6 сдвиг вниз строк в буфере редактирования ;вх: hl - адрес первой строки в буфере ; e - количество строк ; b - номер строки от которой будет сдвиг x3AC6 push hl ld a,e ld e,b ld b,a sub e ;a - количество строк для сдвига ld h,#FF ;сдвиг вниз ;сдвиг строк x3ACD ld c,a ld a,b cp e jr z,x3B1D ;сдвигать не надо push de call x3B98 ;расчет количества строк от заданной до низа экрана x3AD6 push bc ld c,h rst #28 ;вызов процедуры из basic 48k dw Rom1.x0E9B ;расчет адреса на экране по координатам ex de,hl xor a or c jr z,x3AE3 ;вверх inc b ;вниз jr x3AE4 x3AE3 dec b x3AE4 push de rst #28 ;вызов процедуры из basic 48k dw Rom1.x0E9B ;расчет адреса на экране по координатам pop de ld a,c ld c,#20 ld b,#08 x3AEE push bc ;скролл знакоместной строки push hl push de ld b,#00 ldir pop de pop hl pop bc inc h inc d djnz x3AEE push af ;скролл атрибутной строки push de rst #28 ;вызов процедуры из basic 48k dw Rom1.x0E88 ;расчет адреса в атрибутах по координатам ex de,hl ex (sp),hl rst #28 ;вызов процедуры из basic 48k dw Rom1.x0E88 ;расчет адреса в атрибутах по координатам ex de,hl ex (sp),hl pop de ld bc,#0020 ldir pop af pop bc and a jr z,x3B16 ;вверх inc b jr x3B17 x3B16 dec b x3B17 dec c ld h,a jr nz,x3AD6 pop de ld b,e x3B1D pop hl ;АДРЕС: #3B1E печать строки редактируемого буфера ;вх: b - координата печати Y ; hl - адрес начала строки x3B1E call x3BB8 ;обмен атрибутов basic 128 с основными атрибутами ex de,hl ld a,(#5C3C) ;TVFLAG push af ld hl,#EC0D bit 6,(hl) ;в какой области идет редактирование буфера res 0,a jr z,x3B31 set 0,a x3B31 ld (#5C3C),a ld c,#00 call x372B ;установка координат печати из bc ex de,hl ld b,#20 x3B3C ld a,(hl) and a jr nz,x3B42 ld a,#20 x3B42 cp #90 jr nc,x3B55 rst #28 ;вызов процедуры из basic 48k dw Rom1.x0010 ;!!!можно заменить на rst #10!!! x3B49 inc hl djnz x3B3C pop af ld (#5C3C),a call x3BB8 ;обмен атрибутов basic 128 с основными атрибутами scf ;!!!ЛИШНЕЕ!!! ret ;!!!тоже тогда убрать!!! x3B55 call x1F20 ;установка другого стэка и ram 0 rst #10 call x1F45 ;установка другого стэка и ram 7 jr x3B49 ;АДРЕС: #3B5E очистка строк экрана ;вх: b - номер первой строки экрана ; d - номер последней строки экрана x3B5E call x3BB8 ;обмен атрибутов basic 128 с основными атрибутами ld a,d sub b inc a ld c,a ;количество строк call x3B98 ;b - номер начальной строки экрана x3B68 push bc ;c - кол-во строк rst #28 ;вызов процедуры из basic 48k dw Rom1.x0E9B ;расчет адреса на экране по координатам ld c,#08 ;занулим строку занкомест x3B6E push hl ld b,#20 ;занулим строку пикселей xor a x3B72 ld (hl),a inc hl djnz x3B72 pop hl inc h dec c jr nz,x3B6E ld b,#20 push bc rst #28 ;вызов процедуры из basic 48k dw Rom1.x0E88 ;расчет адреса в атрибутах по координатам ex de,hl pop bc ld a,(#5C8D) ;установим атрибуты строки x3B86 ld (hl),a inc hl djnz x3B86 pop bc dec b dec c jr nz,x3B68 call x3BB8 ;обмен атрибутов basic 128 с основными атрибутами scf ret ;АДРЕС: #3B94 расчет количества строк и столцов до конца экрана x3B94 ld a,#21 sub c ld c,a ;АДРЕС: #3B98 расчет количества строк от заданной до низа экрана ;вх: b - номер строки ; ix - адрес описателя курсора ;вых: b - количество строк до низа экрана x3B98 ld a,#18 sub b sub (ix+#01) ld b,a ret ;АДРЕС: #3BA0 расчет адреса атрибутов ;вх: b - crd Y ; c - crd X ;вых: hl - адрес атрибутов x3BA0 push bc xor a ld d,b ld e,a rr d rr e rr d rr e rr d rr e ld hl,#5800 ld b,a add hl,bc add hl,de pop bc ret ;АДРЕС: #3BB8 обмен атрибутов basic 128 с основными атрибутами x3BB8 push af push hl push de ld hl,(#5C8D) ;постоянные атрибуты экрана ld de,(#5C8F) ;временные атрибуты экрана exx ld hl,(#EC0F) ld de,(#EC11) ld (#5C8D),hl ld (#5C8F),de exx ld (#EC0F),hl ld (#EC11),de ld hl,#EC13 ld a,(#5C91) ;параметры вывода на экран ld d,(hl) ld (hl),a ld a,d ld (#5C91),a pop de pop hl pop af ret ;АДРЕС: #3BE9 запуск команды randomize 15619: rem: load "boot" x3BE9 call x3C56 ;пауза 25 фреймов set 6,(iy+#02) res 0,(iy+#02) ;вывод на основной экран rst #08 db #8D ld (#EC0E),a ;a=#07 ld bc,#0000 call x372B ;установка координат печати из bc ld hl,#EC0E ld (hl),#FF call x1F20 ;установка другого стэка и ram 0 rst #28 ;вызов процедуры из basic 48k dw Rom1.x16B0 ;очистка различных областей памяти ld hl,(#5C59) ;адрес начала строки basic ld a,#08 rst #08 db #8C ;bc - длина бейсик-строки для автостарта rst #28 ;вызов процедуры из basic 48k dw Rom1.x1655 ;резервирование места (длина в bc) ld de,(#5C59) ;адрес начала строки basic ld a,#04 rst #08 ;копирование строки автостарта по адресу в de db #8C ; и переход на rom 0: #1B11 ; анализ и выполненение введенной строки ;АДРЕС: #3C1C !!!NOT USED!!! копирование и выполненение бейсик строки x3C1C nop jp x1B0F ;АДРЕС: #3C20 !!!NOT USED!!! бейсик строка x3C20 db #F9 ;RANDOMIZE db #C0 ;USR db #B0 ;VAL db '"15619":' db #EA ;REM db ":" db #F7 ;RUN db "92,3MOA" ;АДРЕС: #3C35 возврат из монтора x3C35 out (c),d ld b,#7F out (c),e pop de pop bc inc sp pop af ld r,a jp po,x3C47 pop af ei ret x3C47 pop af di ret ;АДРЕС: #3C4A !!!NOT USED!!! вход куда-то (продолжение x08E1) x3C4A ld (#C001),a cpl ld (#C002),a ld a,#04 jp x0004 ;АДРЕС: #3C56 пауза 25 фреймов x3C56 ei ld b,#19 x3C59 halt djnz x3C59 ld hl,#5C3B res 5,(hl) ;клавиша не нажата scf ret ;АДРЕС: #3C63 токенизация строки бейсик программы с синтаксической ошибкой x3C63 ld a,#01 jr x3C69 ;АДРЕС: #3C67 токенизация строки бейсик программы x3C67 ld a,#00 ;!!! можно xor a x3C69 ld (#FD8A),a ld hl,#0000 ld (#FD85),hl ld (#FD87),hl add hl,sp ld (#FD8B),hl call x34EA ;обнуление указателей в бейсик строке ld a,#00 ;!!! можно xor a ld (#FD84),a ld hl,#FD74 ld (#FD7D),hl call x1F20 ;установка другого стэка и ram 0 rst #28 ;вызов процедуры из basic 48k dw Rom1.x16B0 ;очистка различных областей памяти call x1F45 ;установка другого стэка и ram 7 ld a,#00 ;!!! можно xor a ld (#FD81),a ld hl,(#5C59) ld (#FD82),hl ld hl,#0000 ;!!! можно ld h,a: ld l,a ld (#FD7F),hl x3CA1 ld hl,(#FD85) inc hl ld (#FD85),hl call x3D9D ;получить очередной символ из строки бейсик программы и определить его тип ld c,a ld a,(#FD81) cp #00 jr nz,x3CF4 x3CB3 ld a,c and #04 jr z,x3CED ;это не буква x3CB8 call x3DE9 ;!!!ОШИБКА jr nc,x3CC4 ;в буфере нет места ld a,#01 ld (#FD81),a jr x3CA1 x3CC4 ld hl,(#FD7F) ld a,l or h jp nz,x3D1E ;!!! млжно jr x3CCC push bc call x3DCD ;копирование слова из буфера в строку бейсик программы pop bc ld a,#00 ld (#FD81),a x3CD6 ld a,c and #01 jr nz,x3CB3 ld a,b call x3E16 ;вставка символа в сроку бейсик программы с обработкой < и > ret nc ld hl,(#FD85) inc hl ld (#FD85),hl call x3D9D ;получить очередной символ из строки бейсик программы и определить его тип ld c,a jr x3CD6 x3CED ld a,b call x3E16 ;вставка символа в сроку бейсик программы с обработкой < и > ret nc jr x3CA1 x3CF4 cp #01 jr nz,x3CED ld a,c and #01 jr z,x3CB8 push bc x3CFE call x3F7E ;распознавание токена pop bc jr c,x3D7D ;токен распознан ld hl,(#FD7F) ld a,h or l jr nz,x3D1E ld a,c and #02 jr z,x3CCC call x3DE9 ;вставить символ в буфер редактирования jr nc,x3CC4 ;нет места в памяти ld hl,(#FD7D) dec hl ld (#FD7F),hl jr x3CA1 x3D1E push bc ld hl,#FD74 ld de,(#FD7F) ld a,d ;!!!можно оптимизировать cp h jr nz,x3D2F ld a,e cp l jr nz,x3D2F inc de x3D2F dec de jr x3D33 x3D32 inc hl x3D33 ld a,(hl) and #7F push hl push de call x3E16 ;вставка символа в сроку бейсик программы с обработкой < и > pop de pop hl ld a,h cp d jr nz,x3D32 ld a,l cp e jr nz,x3D32 ld de,(#FD7F) ld hl,#FD74 ld (#FD7F),hl ld bc,(#FD7D) dec bc ld a,d cp h jr nz,x3D70 ld a,e cp l jr nz,x3D70 inc de push hl ld hl,#0000 ld (#FD7F),hl pop hl ld a,b cp h jr nz,x3D70 ld a,c cp l jr nz,x3D70 pop bc jr x3D8F x3D70 ld a,(de) ld (hl),a inc hl inc de and #80 jr z,x3D70 ld (#FD7D),hl jr x3CFE x3D7D push bc call x3E16 ;вставка символа в сроку бейсик программы с обработкой < и > pop bc ld hl,#0000 ld (#FD7F),hl ld a,(#FD81) cp #04 jr z,x3D94 x3D8F ld a,#00 ld (#FD81),a x3D94 ld hl,#FD74 ld (#FD7D),hl jp x3CB3 ;АДРЕС: #3D9D получить очередной символ из строки бейсик программы и определить его тип ;вых: b - код символа ; a=#01 - прочие символы ; a=#02 - это # или $ ; a=#03 - это пробел ; a=#06 - это буква x3D9D call x2D54 ;получить очередной символ из строки бейсик программы ld b,a cp #3F jr c,x3DAF or #20 call x3DC6 ;проверка символа на принадлежность к буквам нижнего регистра jr c,x3DC3 ;это буква x3DAC ld a,#01 ;прочее ret x3DAF cp #20 jr z,x3DC0 ;это пробел cp "#" jr z,x3DBD jr c,x3DAC cp "$" jr nz,x3DAC x3DBD ld a,#02 ;это # или $ ret x3DC0 ld a,#03 ;это пробел ret x3DC3 ld a,#06 ;это буква ret ;АДРЕС: #3DC6 проверка символа на принадлежность к буквам нижнего регистра ;вх: a - клод символа ;вых: cy=1 символ это буква в нижнем регистре x3DC6 cp #7B ret nc cp #61 ccf ret ;АДРЕС: #3DCD копирование слова из буфера в строку бейсик программы x3DCD ld hl,#FD74 ld (#FD7D),hl sub a ld (#FD7F),a ld (#FD80),a x3DDA ld a,(hl) and #7F push hl call x3E9C ;вставка символа в сроку бейсик программы с игнорированием пробелов pop hl ld a,(hl) and #80 ret nz inc hl jr x3DDA ;АДРЕС: #3DE9 вставить символ в буфер редактирования ;вх: b - код символа ; cy=0 нет места в буфере x3DE9 ld hl,(#FD7D) ld de,#FD7D ld a,d cp h jr nz,x3DF8 ld a,e cp l jp z,x3E13 ;!!!можно jr x3DF8 ld de,#FD74 ld a,d cp h jr nz,x3E03 ld a,e cp l jr z,x3E09 x3E03 dec hl ld a,(hl) and #7F ld (hl),a inc hl x3E09 ld a,b or #80 ld (hl),a inc hl ld (#FD7D),hl scf ret x3E13 scf ccf ret ;АДРЕС: #3E16 вставка символа в сроку бейсик программы с обработкой < и > ;вх: a - код символа x3E16 push af ;!!!ОШИБКА!!! ld a,(#FD89) or a jr nz,x3E2F pop af cp ">" jr z,x3E2A cp "<" jr z,x3E2A x3E26 call x3E64 ;вставка символа в сроку бейсик программы с обработко REM и кавычек ret ;!!!можно сократить x3E2A ld (#FD89),a scf ret x3E2F cp "<" ld a,#00 ld (#FD89),a jr nz,x3E52 pop af cp ">" jr nz,x3E41 ld a,#C9 ;токен <> jr x3E26 x3E41 cp "=" jr nz,x3E49 ld a,#C7 ;токен <= jr x3E26 x3E49 push af ld a,"<" call x3E64 ;вставка символа в сроку бейсик программы с обработко REM и кавычек pop af jr x3E26 x3E52 pop af cp "=" jr nz,x3E5B ld a,#C8 ;токен >= jr x3E26 x3E5B push af ld a,">" call x3E64 ;вставка символа в сроку бейсик программы с обработко REM и кавычек pop af jr x3E26 ;АДРЕС: #3E64 вставка символа в сроку бейсик программы с обработко REM и кавычек ;вх: a - код символа x3E64 cp #0D jr z,x3E88 ;это enter cp #EA ld b,a jr nz,x3E74 ;это не REM ld a,#04 ld (#FD81),a jr x3E82 x3E74 cp #22 ;" jr nz,x3E82 ;это не " ld a,(#FD81) and #FE xor #02 ld (#FD81),a x3E82 ld a,b call x3E9C ;вставка символа в сроку бейсик программы с игнорированием пробелов scf ret x3E88 ld a,(#FD8A) cp #00 jr z,x3E99 ld bc,(#FD85) ;!!!ОШИБКА!!! ld hl,(#FD8B) ld sp,hl scf ret x3E99 scf ccf ret ;АДРЕС: #3E9C вставка символа в сроку бейсик программы с игнорированием пробелов ;вх: a - код символа ;вых: a - новые флаги строки x3E9C ld e,a ld a,(#FD84) ld d,a ld a,e cp " " jr nz,x3EC6 ;это не пробел ld a,d and #01 jr nz,x3EBF ;предыдущий символ был токеном ld a,d and #02 jr nz,x3EB7 ;предыдущий символ был пробелом ld a,d or #02 ld (#FD84),a ret x3EB7 ld a,e call x3EFB ;вставка символа в сроку бейсик программы ld a,(#FD84) ret x3EBF ld a,d and #FE ld (#FD84),a ret x3EC6 cp #A3 jr nc,x3EEE ;это токен ld a,d and #02 jr nz,x3EDA ;последний символ был пробелом ld a,d and #FE ld (#FD84),a ld a,e call x3EFB ;вставка символа в сроку бейсик программы ret ;!!!можно сократить x3EDA push de ld a," " call x3EFB ;вставка символа в сроку бейсик программы pop de ld a,d and #FE ;!!!можно сократить and #FD ld (#FD84),a ld a,e ;!!!можно сократить jr x3ED2 call x3EFB ;вставка символа в сроку бейсик программы ret ;!!!можно сократить x3EEE ld a,d and #FD or #01 ld (#FD84),a ;!!!можно сократить jr x3ECF ld a,e call x3EFB ;вставка символа в сроку бейсик программы ret ;АДРЕС: #3EFB вставка символа в сроку бейсик программы ;вх: a - код символа ; de - адрес в строке для вставки x3EFB ld hl,(#FD87) inc hl ld (#FD87),hl ld hl,(#FD82) ;адрес в строке для следующей вставки ld b,a ld a,(#FD8A) cp #00 ;!!! можно or a ld a,b jr z,x3F33 ld de,(#5C5F) ;адрес символа после маркера ошибки ld a,h ;!!! можно оптимизировать cp d jr nz,x3F30 ld a,l cp e jr nz,x3F30 ld bc,(#FD85) ;!!!ОШИБКА!!! ld hl,(#FD87) and a sbc hl,bc jr nc,x3F2A ld bc,(#FD87) x3F2A ld hl,(#FD8B) ld sp,hl scf ret x3F30 scf jr x3F35 x3F33 scf ccf x3F35 call x1F20 ;установка другого стэка и ram 0 jr nc,x3F47 ld a,(hl) ;!!!ОШИБКА!!! inc hl:ld a,(hl):dec hl ex de,hl cp #0E jr nz,x3F5D ;не число inc de inc de inc de inc de inc de jr x3F5D x3F47 push af ld bc,#0001 push hl push de call x3F66 ;проверка наличия свободного места в памяти pop de pop hl rst #28 ;вызов процедуры из basic 48k dw Rom1.x1664 ;обновление системных переменных ld hl,(#5C65) ex de,hl lddr pop af ld (de),a x3F5D inc de call x1F45 ;установка другого стэка и ram 7 ld (#FD82),de ret ;АДРЕС: #3F66 проверка наличия свободного места в памяти ;вх: bc - количество байт ;вых: если места в памяти нет, переход на обработку ошибки: 4 Out of memory x3F66 ld hl,(#5C65) add hl,bc jr c,x3F76 ex de,hl ld hl,#0082 add hl,de jr c,x3F76 sbc hl,sp ret c x3F76 ld a,#03 ld (#5C3A),a jp x0321 ;АДРЕС: #3F7E распознавание токена ;вых: cy=1 токен распознан -> a - код токена x3F7E call #FD2E ;распознавание токена (x33F4) ret c ;токен не распознан ld b,#F9 ld de,#FD74 ld hl,x3594 ;токены basic 128 call #FD3B ;распознавание токена (x3401) ret nc ;токен не распознан cp #FF ;это CLOSE# ? jr nz,x3F96 ld a,#D4 ;CLOSE # jr x3FB8 x3F96 cp #FE ;это OPEN# ? jr nz,x3F9E ld a,#D3 ;OPEN # jr x3FB8 x3F9E cp #FD ;это DEFFN ? jr nz,x3FA6 ld a,#CE ;DEF FN jr x3FB8 x3FA6 cp #FC ;это GOSUB ? jr nz,x3FAE ld a,#ED ;GO SUB jr x3FB8 x3FAE cp #FB ;это GOTO ? jr nz,x3FB6 ld a,#EC ;GO TO jr x3FB8 x3FB6 sub #56 x3FB8 scf ret ;АДРЕС: #3FBA копирование строки из hl в de в (hl+0) кол-во байт x3FBA ld b,(hl) inc hl x3FBC ld a,(hl) ld (de),a inc de inc hl djnz x3FBC ret ;АДРЕС: #3FC3 !!!NOT USED!!! преобразование ASCII в цифру x3FC3 cp "0" ccf ret nc cp "9"+1 ret nc sub #30 scf ret ;АДРЕС: #3FCE обработка нажатой управляющей клавиши ;вых: cy=0, nz - не найден обработчик клавиши ; cy=0, z - клавиша обработана, нужен звуковой сигнал ; cy=1, z - клавиша обработана звуковой сигнал не нужен x3FCE push bc push de ld b,(hl) inc hl x3FD2 cp (hl) inc hl ld e,(hl) inc hl ld d,(hl) jr z,x3FE1 ;клавиша найдена. в de адрес inc hl djnz x3FD2 scf ccf pop de pop bc ret x3FE1 ex de,hl pop de pop bc call x3FEE ;call (hl) jr c,x3FEB cp a ret x3FEB cp a scf ret ;АДРЕС: #3FEE вызов call (hl) x3FEE jp (hl) ;АДРЕС: #3FEF инициалы программистов x3FEF db #00,"MB" ;Martin Brennan db #00,"SB" ;Steve Berry db #00,"AC" ;Andrew Cummins db #00,"RG" ;Rupert Goodwins db #00,"KM" ;Kevin Males db #00,#01 ;end of rom marker SAVEBIN "../Build/scorp/NewROM0.bin",#0000,#4000