Программная поддержка RAM-диска ЭД:
Код:
; *** Процедуры работы с RAM-диском ЭД ***
; (C) Denn /St.-Petersburg/, 05.08.2016
; Порт ROM/RAM-диска:
PT_CFG:EQU 0F503H
PT_ADR:EQU 0F501H
PT_DAT:EQU 0F500H
PT_KBD:EQU 0F402H; порт банка ROM/RAM и CE RAM-диска
LDRAMD:
; Чтение блока из RAM-диска
; Вх: [A]-номер банка в RAM-диске (0..15), [HL]-а/н блока в RAM-диске,
; [DE]-а/н буфера загрузки блока, [BC]-длина блока
ANI 0FH; защита блока выбора режима ЭД
; включить режим "RD RAM"
ORI 80H; режим "01" + выбор банка
STA PT_ADR+1
LDA PT_KBD
ORI 04H
STA PT_KBD
XRI 06H; = XRI 04h & ORI 02h
STA PT_KBD
LDRAM0:
SHLD PT_ADR
INX H
DCX B
LDA PT_DAT
STAX D
INX D
MOV A,C
ORA B
JNZ LDRAM0
ROM_ON:
; Вкл. режима "RD ROM"
LDA PT_KBD
ORI 06H
XRI 06H
STA PT_KBD
; сброс банка на нулевой (для доступности ROM-диска после HW-RESET)
XRA A
SVBANK:
STA PT_ADR+1
LDA PT_KBD
ORI 04H
STA PT_KBD
XRI 04H
STA PT_KBD
RET
SVRAMD:
; Запись блока в RAM-диск
; Вх: [A]-номер банка в RAM-диске (0..15), [HL]-а/н блока в RAM-диске,
; [DE]-а/н буфера записываемого блока, [BC]-длина блока
ANI 0FH; защита блока выбора режима ЭД
; включить режим "WR RAM"
ORI 40H; режим "10" + выбор банка
CALL SVBANK
; перепрограммируем порт на запись данных
MVI A,80H
STA PT_CFG
SVRAM0:
; выставляем адрес и байт данных
SHLD PT_ADR
LDAX D
STA PT_DAT
; импульс записи байта в RAM-диск
; бит C1: CS_RAM "0" -> "1" -> "0"
LDA PT_KBD
ORI 02H
STA PT_KBD
XRI 02H
INX D
INX H
DCX B
STA PT_KBD
MOV A,C
ORA B
JNZ SVRAM0
; перепрограммируем порт на чтение данных
MVI A,90H
STA PT_CFG
; Вкл. режима "RD ROM", банк 0
JMP ROM_ON
END
Некоторые пояснения. Работа с RAM-диском предполагается не в т.н. линейном, а в кластерном варианте, т.е. ПО заранее рассчитывает целевой кластер (номер банка и адрес блока внутри банка). Т.о. считается, что при чтении/записи блока мы не выйдем за границу банка, в противном случае, в данном варианте процедур произойдёт "заворачивание" адреса на начало текущего банка. Этот момент должен контролировать программист самостоятельно.
В конце каждой процедуры делается перевод ЭД в режим "RD ROM" и выборка нулевого банка. Это делается потому, что режим ЭД переключается программно и аппаратный сброс его не меняет (не сбрасывает на ROM-диск), а загрузчик ПЗУ "Монитора" не "знает" ничего про банки и ЭД, и соответственно не сможет загрузиться с ROM-диска, если его режим будет в каком-то произвольном состоянии.
При использовании блоков данных (кластеров) размером 256 байт процедуры обмена можно ощутимо "ускорить", что и сделано в реализации под DSDOS.
П.С. Немного цифр. Копирование 35 файлов суммарным объёмом около 64 Кб с RAM-диска на квазидиск, с процессором ВМ80 (CLK=2,5МГц) у меня занимает 13 секунд. Для сравнения, на этой же системе копирование этих же файлов с ROM-диска в квазидиск происходит за 9,8 секунд. Оптимизацию кода вполне можно считать успешной