; LAST UPDATE: 16.02.2025 savelij
TAPE_EMUL LD H,CMOS.BYTE_00
CALL READCMOS
AND CMOS_ED.M_EMUL_TAPE
JR NZ,EMULOADTAP
LD A,(RREG_A)
LD (RREG_C),A
CP A
PUSH AF
POP HL
LD (RREG_F),HL
RET
EMULOADTAP LD A,(CPU2+2) ; номер страницы где начинается следующий блок
LD IYL,A
ADD A,RAM_TAPE
LD BC,WIN_P1
OUT (C),A ; реальная страница откуда брать
LD HL,(CPU2) ; смещение в странице
LD DE,(RREG_IXL) ; адрес куда ложить
LD A,D
EXX
LD BC,WIN_P2
CP 0x80
LD A,0xFA ; для диапазона адресов загрузки 4000-7FFF
JR C,ELT01
LD A,0xFD ; для диапазона адресов загрузки 8000 и выше
ELT01 OUT (C),A
LD IYH,A ; номер страницы в которую переносим
EXX
LD A,0x40 ; для диапазона адресов 4000-7FFF грузим на 4000 выше
JR C,ELT02
LD A,0 ; для диапазона адресов 8000 и выше адрес загрузки не меняем
ELT02 ADD A,D
LD D,A ; реальный адрес укладки
SET 6,H
LD C,(HL)
INC HL
LD B,(HL) ; взяли размер блока для загрузки
INC HL
INC HL ; пропускаем флаговый байт
DEC BC
DEC BC ; грузить на 2 байта меньше (минус флаговый байт и CRC)
ELT07 LDI
JP PO,ELT05
LD A,D
CP 0xC0
JR C,ELT06
LD A,IYH
CP 0xFA
JR NZ,ELT06
LD A,0xFD
LD IYH,A
EXX
LD B,HIGH (WIN_P2)
OUT (C),A
EXX
LD D,0x80
ELT06 LD A,H
CP 0x80
JR C,ELT07
INC IYL
LD A,IYL
ADD A,RAM_TAPE
EXX
LD B,HIGH (WIN_P1)
OUT (C),A
EXX
LD H,0x40
JR ELT07
ELT05 INC HL ; пропуск контрольной суммы блока
RES 6,H
EVOPORT WIN_P1,0xFA ; вернули страницу в 1 окне проецирования
LD B,HIGH (WIN_P2)
XOR A
OUT (C),A ; включили последнюю страницу
LD (CPU2),HL ; вернули смещение в странице для загрузки
LD A,IYL
LD (CPU2+2),A ; вернули в переменную номер текущей страницы загрузки
LD HL,(RREG_IXL)
LD DE,(RREG_E)
ADD HL,DE
LD (RREG_IXL),HL
LD HL,0
LD (RREG_E),HL
LD HL,RREG_F
RES 6,(HL)
SET 0,(HL)
RET
TAPE_INIT XOR A
LD HL,CPU2
LD (HL),A
INC L
LD (HL),A
INC L
LD (HL),A
RET