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
call LD_FILE
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