Следует стремиться увидеть в каждой вещи то, чего еше никто не видел, и над чем еще ни- кто не думал. Г.Лихтенберг То, что я понял,прекрасно, из этого я заклю- чаю, что остальное, чего я не понял, тоже прекрасно. Сократ 1.8.3. С о з д а н и е н о в ы х о п е р а т о р о в В языке MSX-BASIC допускается использование так называемых "встроен- ных" подпрограмм. Каждая из этих подпрограмм имеет свое имя.Для обращения к встроенным подпрограммам используется оператор ┌───────────────────────────────────────────────┐ │ CALL Имя подпрограммы [(Список параметров)] │ , └───────────────────────────────────────────────┘ где: CALL("call"-"звать") - служебное слово, которое можно заменять зна- ком "_"; список параметров - необязательный список,содержащий одно или несколь- ко выражений, отделенных друг от друга запятыми. Рассмотрим несколько встроенных подпрограмм, имеющих отношение к лока- льной вычислительной сети компьютеров MSX-1. 1) Каждый из компьютеров локальной сети имеет номер, который можно уз- нать, выполнив в непосредственном режиме команду ┌─────────────────┐ │ CALL WHO │ , └─────────────────┘ где WHO ("кто") - служебное слово. 2) Скорость передачи информации по сети по умолчанию равна 2400 бод, однако ее можно регулировать оператором ┌────────────────────┐ │ CALL COMINI │ . └────────────────────┘ Максимальная скорость передачи при этом равна 4800 бит/с. В общем случае оператор CALL COMINI производит инициализацию сети. Информацию об аргументах подпрограммы COMINI можно получить командой ┌────────────────────┐ │ CALL COMHELP │ . └────────────────────┘ 3) Имеется возможность обработки прерываний после поступления данных из локальной сети. Оператор перехода к подпрограмме обработки прерываний выглядит следующим образом: ┌─────────────────────────────────────────┐ │ CALL COM (["0:"],GOSUB номер строки) │ . └─────────────────────────────────────────┘ Чтобы сделать эту обработку возможной, примените следующие операторы: CALL COMON - разрешает обработку прерываний; CALL COMOFF - запрещает обработку прерываний; CALL COMSTOP - временно приостанавливает обработку. ┌────────────────────────────────────────────────────────────────────┐ │ Важно отметить, что пользователь может создать н о в ы й , │ │ собственный оператор CALL . │ └────────────────────────────────────────────────────────────────────┘ В рабочей области RAM, начиная с адреса FCC9h,находится участок памяти, отвечающий за каждую л о г и ч е с к у ю страницу памяти, находящуюся в некотором слоте, причем адрес байта памяти,непосредственно отвечающего за логическую страницу памяти, вычисляется по формуле: ┌─────────────────────────────────────────┐ │ FCC9h + 16·SLTNUM + 4·EXPSLT + PG │, └─────────────────────────────────────────┘ где: SLTNUM - номер базисного слота; EXPSLT - номер слота расширения (вторичного слота); PG - номер логической страницы памяти. По этому адресу содержится информация о том, работу каких устройств мо- гут поддерживать подпрограммы, заложенные в эту логическую страницу изго- товителем аппаратуры или ее пользователем. Эта информация кодируется следующим образом: ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ ∗ │ ∗ │ ∗ │ ∗ │ ∗ │ ∗ │ ∗ │ ∗ │◀─ Младший бит └───┴─▲─┴─▲─┴───┴───┴───┴───┴───┘ │ ├─ Если бит равен 1, то разрешена обработка операторов CALL │ └─ Если бит равен 0, то запрещена обработка операторов CALL ├───── Если бит равен 1, то разрешена работа с нестандартными │ файловыми устройствами (например, MEM: или COM:) └───── Если бит равен 0, то запрещена работа с нестандартными файловыми устройствами. Приведем теперь пример программы, позволяющей "изготовить" н о в ы е операторы CALL. После запуска этой программы с адреса 9000h становится возможным использование операторов CALL FATPRINT ("утолщение" символов), CALL SCRON (включение экрана дисплея), CALL SCROFF (выключение экрана дисплея). Заметим, что число возможных подпрограмм для обработки нестандартных операторов ограничивается только размерами логической страницы! Читающий, если не усвоишь - перечти, переждав. Е.Рерих. Живая вода Итак, смотрите: ;Выбор слота 3-2 для всех логических страниц памяти 9000: 3E AA LD A,AAh ;Выберем 2-й слот в качестве вто- 9002: 32 FF FF LD (FFFFh),A ; ричного для всех страниц ; 9005: F3 DI ;Запретим прерывания 9006: 3E FF LD A,FFh ;Выберем 3-й слот в качестве пер- 9008: D3 A8 OUT (A8h),A ; вичного для всех страниц ;Заполнение псевдо-ROM 900A: 21 20 90 LD HL,9020h ; Откуда берутся данные 900D: 11 00 40 LD DE,4000h ; Куда помещаются 9010: 01 00 01 LD BC,0100h ; Длина копируемого блока 9013: ED B0 LDIR ; Групповая пересылка ;Восстановление конфигурации BASIC 9015: 3E F0 LD A,F0h ; 9017: D3 A8 OUT (A8h),A ; 9019: FB EI ;Разрешим прерывания ;Заполнение буфера SLTATR ;(64 байта, начиная с адреса FCC9h) 901A: 3E 20 LD A,00100000b ; 5-й бит - разрешена обработка ; операторов расширения ; 6-й бит - запрещена обработка ; нестандартных устройств I/O 901C: 32 02 FD LD (FD02h),A ;Псевдо-ROM в слоте 3-2, страница 1 901F: C9 RET ;Возврат управления в BASIC ; Далее идет блок содержимого псевдо-ROM ;Заголовок псевдо-ROM ("карта ROM") 9020: 41 ; Код символа A 9021: 42 ; Код символа B 9022: 00 00 ; Адрес подпрограммы инициализации ROM 9024: 11 40 ; Адрес начала обработки операторов расширения 9026: 00 00 ; Адрес начала обработки нестандартных устройств I/O 9028: 00 00 ; Адрес текста на BASIC в ROM 902A-9030: 00 ; 7 байтов, зарезервированных стандартом ;Блок подпрограмм обработки операторов расширения 9031: 37 SCF ;Установим флаг C (необходим для ;генерации сообщения об ошибке) 9032: E5 PUSH HL ; 9033: 06 03 LD B,03 ;Будут обработаны только три первых ;оператора расширения в псевдо-ROM 9035: 21 51 40 LD HL,4051h ;Адрес блока идентификаторов ; операторов расширения 9038: E5 PUSH HL ; 9039: CD 38 40 CALL 4038h ;Переход на блок сравнения 2 имен 903C: E1 POP HL ; 903D: 30 09 JR NC,9048h ;Если имя не найдено, то переход на ; блок поиска адресов 903F: 11 10 00 LD DE,0010h ;Указатель на 9042: 19 ADD HL,DE ; следующее имя 9043: 10 F3 DJNZ 9038h ;Имена кончились? 9045: E1 POP HL ;Если имя не найдено, то возврат 9046: 37 SCF ; управления в BASIC с сообщением 9047: C9 RET ; "Syntax error" ;Блок поиска в таблице адресов 9048: 3E 03 LD A,03 ;Число подпрограмм в псевдо-ROM 904A: 90 SUB B ; 904B: 21 4B 40 LD HL,404Bh ;Начало таблицы адресов подпрограмм 944E: 87 ADD A,A ;Вычислим смещение 904F: 16 00 LD D,00 ;Вычислим положение 9051: 5F LD E,A ; адреса программы 9052: 19 ADD HL,DE ; в таблице 9053: 5E LD E,(HL) ;Помещаем адрес 9054: 23 INC HL ; перехода из 9055: 56 LD D,(HL) ; таблицы в регистр DE 9056: EB EX DE,HL ;Адрес -из регистра DE в регистр HL 9057: E9 JP (HL) ;Переход на выбранную подпрограмму ; расширения ;Сравнение вводимого имени оператора расширения ;с именем оператора в псевдо-ROM 9058: 11 89 FD LD DE,FD89h ;Начало области, в которой хранится ; имя набираемого оператора 905B: 1A LD A,(DE) ; 905C: A7 AND A ;Это 0? 905D: 28 07 JR Z,9066h ;Если да, то произошел конец набора ; оператора с клавиатуры 905F: BE CP (HL) ;Указатель на имя в псевдо-ROM 9060: 37 SCF ;Если имена различны, то выход в 9061: C0 RET NZ ; BASIC с сообщением ; "Syntax error" 9062: 23 INC HL ; 9063: 13 INC DE ; 9064: 18 F5 JR 905Bh ;Имя кончилось? 9066: BE CP (HL) ;Имя в псевдо-ROM тoжe кончилось? 9067: 37 SCF ;Если оно длиннее, чем набранное 9068: C0 RET NZ ; имя, то выход в BASIC с сообщени- ; ем "Syntax error" 9069: 3F CCF ;Имена совпали, возврат без сообще- 906A: C9 RET ; ния об ошибке ;Таблица адресов операторов расширения 906B: 81 40 ;Адрес подпрограммы CALL FATPRINT 906D: 9C 40 ;Адрес подпрограммы CALL SCRON 906F: A1 40 ;Адрес подпрограммы CALL SCROFF ;Блок имен операторов (по 16 символов на имя) 9071: 46 ;F 9072: 41 ;A 9073: 54 ;T 9074: 50 ;P 9075: 52 ;R 9076: 49 ;I 9077: 4E ;N 9078: 54 ;T 9079-9080: 00 9081: 53 ;S 9082: 43 ;C 9083: 52 ;R 9084: 4F ;O 9085: 4E ;N 9086-9090: 00 9091: 53 ;S 9092: 43 ;C 9093: 52 ;R 9094: 4F ;O 9095: 46 ;F 9096: 46 ;F 9097-90A0: 00 ;Вот они! Наши операторы CALL ! 90A1: CD 6F 00 CALL 006Fh ;Установка режима SCREEN 1 90A4: 21 00 01 LD HL,0100h ; 90A7: 01 57 07 LD BC,0757h ; 90AA: 07 RLCA ; 90AB: CD 4A 00 CALL 004Ah ;Чтение из видеопамяти 90AE: 57 LD D,A ; 90AF: 1F RRA ;Утолщение символа 90B0: B2 OR D ; 90B1: CD 4D 00 CALL 004Dh ;Запись в видеопамять 90B4: 0B DEC BC ; 90B5: 23 INC HL ; 90B6: 78 LD A,B ; 90B7: B1 OR C ; 90B8: 20 F1 JR NZ,90ABh ; 90BA: E1 POP HL ; 90BB: C9 RET ;Возврат в BASIC 90BC: CD 44 00 CALL 0044h ;Включение экрана дисплея 90BF: E1 POP HL ; 90C0: C9 RET ; 90C1: CD 41 00 CALL 0041h ;Выключение экрана дисплея 90C4: E1 POP HL ; 90C5: C9 RET ;