; LAST UPDATE: 01.11.2023 savelij
; 26.04.2019 поправлено описание структуры
; 07.07.2021 перед вызовом LD_FILE в реги BCDE загружается номер кластера откуда читать
LSNAST STRUCT ;заголовок снапшотов
RI DB ?
AHL DW ?
ADE DW ?
ABC DW ?
AAF DW ?
RHL DW ?
RDE DW ?
RBC DW ?
RIY DW ?
RIX DW ?
IFF2 DB ?
RR DB ?
RAF DW ?
RSP DW ?
SIM DB ?
BORD DB ?
RPC DW ?
P7FFD DB ?
PDOS DB ?
LSNAST ENDSTRUCT
RUNSNA_LP_M MACRO PF,PS
ld de,((PF!0x7f)<<8)+(PS!0x7f)
call RUNSNA_LP
ENDM
RUNSNA_LP128_M MACRO PL
ld a,PL
call RUNSNA_LP128
ENDM
RUNSNA_LP5_M MACRO
ld hl,0x8000-27
ld iyl,0x4000/512+1
ld de,((5!0x7f)<<8)+(2!0x7f)
call RUNSNA_LP5
ENDM
RUNSNA ;4ab4
di
ld iyh,0
ld a,0x30 ;по умолчанию б48
ld (lsna_P7FFD),a
ld a,HIGH(RD_EFF7) ;разлочим 7FFD
in a,(LOW(RD_EFF7))
ld bc,PENT_CONF
and %11111011
out (c),a
or %00000100
ld (PEFF7+1),a
ld a,1
out (PEVO_CONF),a
;освободим 1 окно
ld bc,WIN_A2
ld a,8!0x7f
out (c),a
ld de,0x8000
ld hl,0x4000
ld b,h
ld c,l
ldir
ld bc,WIN_A1
ld a,8!0x7f
out (c),a
RUNSNA_LP5_M ;загрузим заголовок и 5 страницу и ещё чуть
ld hl,0x8000-27
ld de,lsna_RI
ld bc,27
ldir ;копируем заголовок
RUNSNA_LP_M 2,0 ;загрузим 2 страницу и ещё чуть
RUNSNA_LP_M 0,9 ;загрузим 0 страницу и ещё чуть
ld a,(FILE_SRC+30)
or a
jr z,RUNSNA_ENDLOAD ;если файл больше 64к, то снап 128к !!!!нада проверить
ld hl,0xc000 ;сохраняем заголовок
ld de,lsna_RPC
ld bc,4
ldir
ld de,0xc000 ;сдвинем конец сектора
ld bc,512-4-27
ldir
ld a,(lsna_P7FFD) ;смотрим 7ффд
and %111 ;отсекаем лишнее
ld (RUNSNA_LP128+1),a
jr z,RUNSNA_NOL0 ;если нулевая то всё правильно
ld bc,WIN_A3 ;нет, значит перекинуть куда надо
xor 0x7f
out (c),a
ld hl,0x8000
ld de,0xc000
ld bc,0x4000
ldir
ld bc,WIN_A3
ld a,9!0x7f
out (c),a
RUNSNA_LP128_M 0 ;загрузим нулевую снова
RUNSNA_NOL0
RUNSNA_LP128_M 1 ;и остальные
RUNSNA_LP128_M 3
RUNSNA_LP128_M 4
RUNSNA_LP128_M 6
RUNSNA_LP128_M 7
RUNSNA_ENDLOAD
ld bc,WIN_P2 ;вернём паги на место
ld a,00
out (c),a
ld b,HIGH (WIN_A3) ;включим FF пагу
ld a,0!0xff
out (c),a
ld a,(lsna_BORD)
out (0xfe),a ;восстановим бордер
ld a,(lsna_RI) ;рег I
ld i,a
ld hl,toFFpage ;переместим стартер в FF пагу
ld de,0xA000
ld bc,endFFpage-toFFpage
ldir
ld hl,(0x8066) ;сохраним код из 0x0066
ld de,(0x8068)
ld bc,0xc300
ld (0x8066),bc ;закинем свой JP на стартер
ld bc,0x2000
ld (0x8068),bc
ld bc,WIN_A2 ;вернём пагу на место
ld a,2!0x7f
out (c),a
ld a,8 ;сгенерим NMI
out (PEVO_CONF),a
ld a,1
out (PEVO_CONF),a
halt ;ждём прерывание
RUNSNA_LP128
cp 0 ;проверим может страница уже загружена
ret z
xor 0x7f
ld bc,WIN_A2
out (c),a
ld hl,0xc000 ;перекинем остаток
ld de,0x8000
ld bc,512-27-4
ldir
ex de,hl
ld iyl,0x4000/512
jr RUNSNA_L1P
RUNSNA_LP
ld hl,0x8000+512-27
ld iyl,0x4000/512
RUNSNA_LP5
ld bc,WIN_A2
out (c),d
ld b,HIGH (WIN_A3)
out (c),e
RUNSNA_L1P
xor a
out (PEVO_CONF),a
LD DE,(AFILCLS)
LD BC,(AFILCLS + 2)
call LOAD_FILE
LD (AFILCLS),DE
LD (AFILCLS + 2),BC
ld a,1
out (PEVO_CONF),a
ret
toFFpage
ld (0x0066),hl ;восстановим код
ld (0x0068),de
ld a,(fsna+LSNAST_SIM) ;режим прерываний
im 0
or a
jr z,RUNSNA_ENDIM
im 1
dec a
jr z,RUNSNA_ENDIM
im 2
RUNSNA_ENDIM
ld bc,WIN_A1 ;восстановим страницу
ld a,5!0x7f
out (c),a
xor a
out (PEVO_CONF),a
ld bc,CONF_128 ;восстановим порт конфигурации
ld a,(fsna+LSNAST_P7FFD)
out (c),a
cp 0x30 ;если 48к то возврат уже на стеке
jr z,FFYESRET
ld sp,(fsna+LSNAST_RSP)
ld hl,(fsna+LSNAST_RPC)
push hl
ld (fsna+LSNAST_RSP),sp
FFYESRET
ld bc,PENT_CONF ;отключим 1024к
PEFF7
ld a,0
out (c),a
ei
ld a,(fsna+LSNAST_IFF2)
and 4
jr nz,FFENDEI
di
FFENDEI
ld a,(fsna+LSNAST_RR)
rlca
sub 0x15*2
rrca
ld r,a
ld sp,fsna+LSNAST_AHL ;забираем регистры
pop hl
pop de
pop bc
pop af
exx
ex af,af'
pop hl
pop de
pop bc
pop iy
pop ix
ld sp,fsna+LSNAST_RAF
pop af
ld sp,(fsna+LSNAST_RSP)
out (0xbe),a ;выходим из NMI
retn
ENDFFCODE
fsna EQU $-toFFpage+0x2000
lsna LSNAST
endFFpage