Итак, переход из режима 128K в режим 48K может программно выполняться достаточно просто, чего не скажешь об обратном переходе. Во всех "фирменных" инструкциях по работе со 128-килобайтными машинами написано, что из режима 48K в режим 128K войти невозможно, кроме как выключив и снова включив компьютер. Тем не менее, если из машинного кода напрямую работать с пятым битом порта 7FFD, то такой переход выполнить все-таки можно, для чего и служит приведенная ниже программа, написанная на языке АССЕМБЛЕРа.
Включите компьютер и войдите в режим 128K. После этого можете командой SPECTRUM перейти в режим 48K, но если Вы сразу войдете в 48K, то программа работать не будет. Прежде чем загрузить программу опустите RAMTOP командой CLEAR 32767. После загрузки Вы имеете в своем распоряжении две команды.
RANDOMIZE USR 32781.
Эта команда равноценна команде SPECTRUM - она выполняет переход в 48K, но при этом не генерирует на экране сообщение 0:OK, т.е. исполнение программы не прерывается и она может продолжать исполняться со следующего оператора, хотя и в другом режиме.
Противоположная команда -
RANDOMIZE USR 32814.
Эта команда выполняет возврат в режим 128K и опять же продолжает исполнение программы со следующего оператора.
Хотя есть и некоторые ограничения на такую работу с компьютером. Естественно, поскольку 128-й компьютер хранит системные переменные в области буфера ZX-принтера, то ничего в эту область засылать нельзя, иначе работа станет невозможной. Нельзя соответственно использовать и команды ZX-принтера - COPY и LPRINT, если Вы находитесь в режиме 48K. Из режима 128K - можно.
Такая организация работы может быть полезной тем, кто имеет компьютер 128K со встроенным последовательным портом RS232, если программная поддержка этого порта выполняется только в режиме 128K, а работать надо с программами (например с текстовым редактором), которые в режиме 128K не работают.
Сохранение на стеке регистров A, B, C и F. В BC загружается порт 7FFD. В акк-р - текущая страница. Выключается бит 5, что "отпирает" переключение режимов. Переход на финальную часть процедуры переключения режимов (размещена в ПЗУ).
ORG 8000 PUSH AF PUSH BC LD BC,7FFD LD A,(BANK_M) AND 1F
JP 5B08,SWAP+8
F5 C5
01FD7F 3A5C5B E61F
C3085B
ED7B3D5C MODE_48 E1
210313 E5
21761B E5
2A455C 22425C
3A475C
ORG 800D LD SP,(ERR_SP)
POP HL
LD HL,1303,MAIN-4 PUSH HL
LD HL,1B76,STMT_RET PUSH HL
LD HL,(PPC) LD (NEWPPC),HL
LD A,(SUBPPC)
Машинный стек опустошается до адреса возврата по ошибке. Ввод адреса возврата по ошибке.
На стек идет адрес возврата при ошибке в режиме 48K.
На стек идет адрес возврата после исполнения оператора. В HL - номер текущей строки. Он считается номером следующей строки.
В аккумулятор - номер теку-
щего оператора. Переход к следующему оператору в строке. Выключение 4-го бита. DE указывает на информацию канала "P" в режиме 48K. Переход на переключение режима.
3C
32445C 0600 11BE15
1810
INC A
LD (NSPPC),A LD B,00 LD DE,15BE
JR MODE CHANGE
ORG 802E MODE_128 LD A,C3
LD (SWAP)^ LD HL,SWAP,2 LD (SWAP+1),HL LD B,10
LD DE,8054,P_128
MODE_CHANGE LD A,(FLAGS) AND EF OR B
LD (FLAGS),A LD HL,(CHANS)
LD BC,000F ADD HL,BC
EX DE,HL
LD C,04
LDIR
RET
ORG 6054 P_128 DEFW 5B34,POUT
DEFW 5B2F,PIN
3EC3 32005B 210080 22015B 0610 115480
3A3B5С
E6EF
B0
323B5C 2A4F5C
010F00 09
EB
0E04 EDB0 C9
345B 2F5B
В SWAP устанавливается инструкция JP. Адрес перехода в SWAP указывает на данную программу. Включение 4-го бита. DE указывает на информацию канала "P" в режиме 128K. Вызов переменной FLAGS, Выключение 4-го бита. Переключение 4-го бита в соответствии с действующим режимом. Запоминание измененной переменной FLAGS, HL указывает на начало области информации о каналах.
HL указывает на информацию о канале "P".
DE указывает на информацию о канале "P". В BC - количество байтов, подлежащих копированию. Копирование данных в область информации канала "P" Возврат
Адрес выходной информации канала "P" Адрес входной информации канала "P".
Тогда находясь в режиме 128K Вы открываете поток и устанавливаете параметр скорости обмена командой FORMAT "P",n , а затем переходите в режим 48K для работы, скажем со своим редактором. Теперь когда Вам надо что-то напечатать Вы переходите в режим 128K с немедленным возвратом в 48K:
RANDOMIZE USR 32814: LPRINT "что угодно" :RANDOMIZE USR 32781
Приведенная здесь программа является релоцируемой, то есть ее можно перемещать в другие удобные Вам адреса, надо только подправить адресацию в двух инструкциях, которые используют абсолютную адресацию к меткам SWAP-2 и P-128.
И в завершение этого выпуска для тех, у кого 128-ая модель управляет двумя джойстиковыми портами без внешнего интерфейса дадим схемы распределения управляющих битов этих портов, а в следующем выпуске начнем рассматривать работу электронного диска 128-ой модели.
Первый джойстик опрашивается по порту EFFE, схема приведена на рис. 1, а второй -по порту F7FE - схема на рис. 2.
EFFE
влево
вниз
огонь
вправо вверх
Рис.1
огонь
вниз
влево
вверх вправо
Рис.2
Пример загрузки данных с джойстикового порта в аккумулятор процессора для последующей обработки выглядит так:
LD BC,F7FE IN A,(C)
Продолжение в следующем выпуске.