Программа последовательно читает ПЗУ, пропускает 128 байтный загрузчик расположенный по диагонали. Пропускается 1 байт из 2048. В ПЗУ 256 Кб теряется 128 байт, в ПЗУ 512 Кб теряется 256 байт.
Инициализация:
V_BANKL1 = банк * 2
V_BANKL2 = банк * 2 + 1
V_BANKH1 = (банк * 2) >> 8
DE = (смещение * 2) | 0xF000
Код:
; Чтение байта из ПЗУ
; Вызывающая программа хранит и не изменяет DE.
; DE - это смещение от F000 до FFFF c шагом 2.
READBYTE: LD A, D
LD (0EE02h), A
LD A, E
V_BANKL1: CP 0 ; тут находятся 7 бит банка (*2)
JP Z, IGNOREBYTE ; Пропускаем диагональные байты
NOIGNOREBYTE: LD (0EE01h), A
V_BANKH1: LD A, 0 ; тут находится старший бит банка
LD (0EE02h), A
V_BANKL2: LD A, 1 ; тут находится 7 бит банка (*2+1)
LD (0EE01h), A
LD A, (0EE00h)
INC E
INC E
RET NZ
;----------------------------------------------------------------------------
; Пересекли границу 128 байт
INCBANK: INC D
RET NZ
; Пересекли границу 2048 байт
; Выводим прогресс
PUSH DE
PUSH BC
ld c, '.'
call 0F809h
POP BC
POP DE
; Увеличиваем счетчики банков
PUSH AF
LD A, (V_BANKL2+1)
INC A
JP Z, INCBANK1
INCBANK2: LD (V_BANKL1+1), A
INC A
LD (V_BANKL2+1), A
POP AF
; Адрес чтения
LD DE, 0F000h
RET
;----------------------------------------------------------------------------
; Пересекли границу 256 Кб
INCBANK1: PUSH HL
LD HL, V_BANKH1+1
INC (HL)
POP HL
JP INCBANK2
;----------------------------------------------------------------------------
; Пропускаем диагональные байты
IGNOREBYTE: LD A, D ; Пропускаем только адреса 0-128
AND 0Fh
LD A, E
JP NZ, NOIGNOREBYTE
INC E
INC E
CALL Z, INCBANK
JP READBYTE