Sprinter-BIOS/bios/exp/FUNC_RAM_ROM_DRV.ASM
2026-05-19 19:46:03 +10:00

1132 lines
20 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;===================[ ”㭪樨 à á¯à¥¤¥«¥­¨ï ¯ ¬ï⨠]===================;
; ‚ë室: BC - FREE MEM ¢ ¡«®ª å ¯® 16k, HL - FULL MEM
;!TEST ¢á¥ SLOT2 ­  SLOT1
;
;----------------------------------------------------------------------;
; Ž¯à¥¤¥«¥­¨¥ ®¡ê¥¬  ¯ ¬ïâ¨.
; ‚ë室: BC - FREE MEM ¢ ¡«®ª å ¯® 16k, HL - FULL MEM
EMM.GetMemSize: IN A,(SLOT1)
LD B,A
LD A,SYS_PAGE
OUT (SLOT1),A
XOR A
LD C,A
LD HL,SYS_PAGE.RAM_TABLE-#4000-#4000
;
.loop: DEC L
JR Z,.exit
CP (HL)
JR NZ,.loop
INC C
JP .loop
;
.exit: LD HL,#100 ;!HARDCODE max mem pages
LD A,B
; L=0
LD B,L
OUT (SLOT1),A
RET
/*
.loop: LD A,(HL)
INC L
JR Z,.exit
AND A
JR NZ,.loop
INC C
JR .loop
.exit: LD HL,#100 ;!HARDCODE max mem pages
LD A,B
LD B,0
OUT (SLOT1),A
RET
*/
;----------------------------------------------------------------------;
;
;!!!!! …᫨ ¨á¯®«ì§ã¥âáï SLOT3 ᮠ᢮¨¬¨ áâà ­¨æ ¬¨, â® ­¥ ¯®«ì§®¢ âìáï
; á⥪®¬, â ¬ ¬®¦¥â ¡ëâì SP ¢ ०¨¬¥ ᯥªâà㬠
;
;----------------------------------------------------------------------;
; ˆ­¨æ¨ «¨§ æ¨ï à á¯à¥¤¥«¥­¨ï ¯ ¬ïâ¨.
EMM.InitMem: PUSH BC
PUSH HL
PUSH DE
IN A,(SLOT3)
LD C,A
LD A,SYS_PAGE
OUT (SLOT3),A
LD HL,SYS_PAGE.RAM_TABLE ; €¤à¥á RAM FAT ¢ އ“.
; ®¡­ã«ï¥¬ â ¡«¨æã
XOR A
.loopFree: LD (HL),A
INC L
JR NZ,.loopFree
; १¥à¢¨à㥬 ᯥæ.áâà ­¨æë ¨ áâà ­¨æë ZX
;LD B,RESERVED_PAGES.Blocks
LD DE,RESERVED_PAGES ; â ¡«¨æ  § ­ïâëå á¨á⥬­ëå áâà ­¨æ
.loop: LD A,(DE)
CP #FF
JR Z,.exitLoop
;
.loopBlk: INC DE
LD L,A
LD A,(DE)
LD (HL),A
CP #FF
JR NZ,.loopBlk
;
.exitLoop: ;INC DE
;DJNZ .loop
LD L,A
LD (HL),A
; ˆ­¨æ¨ «¨§ æ¨ï ª«î祩 RAM-Disks
XOR A
LD HL,SYS_PAGE.RAMD_KEYS
LD B,SYS_PAGE.RAMD_KEYS.NUM
.loop2: LD (HL),A
INC L
DJNZ .loop2
; [x] 04/11/2023
LD HL,SYS_PAGE.Sp_RAMD_KEYS
LD B,SYS_PAGE.Sp_RAMD_KEYS.NUM
.loop3: LD (HL),A
INC L
DJNZ .loop3
;
LD A,C
OUT (SLOT3),A
POP DE
POP HL
POP BC
RET
;---------------------------------------------------------------------[]
RESERVED_PAGES: ;[x] free zx pages!
; Block #1 - ¬®¦­® ®á¢®¡®¤¨âì ¯® ID 1
;DB 1,3,4,6,7,8,9,10,11,12,13,14,15 ; for Spectrum
; í¬ã«ïâ®à <20>‡“
;DB #42,#43,#44,#45,#46,#47;,#48,#49,#4A,#4B ; For (BASIC128, BASIC48, TRDOS, SCORP_ROM)*2, vBIOS, vEXTENSION
;DB #FF ; End of the block
;
; Block #2 - ­¥«ì§ï ®á¢®¡®¦¤ âì
DB ZX_PAGE.SLOT0,ZX_PAGE.SLOT2,ZX_PAGE.SLOT1 ; for Spectrum and BIOS starting
DB DCP_PAGE ; Ports map
DB Spec_Page ; Page for Spectrum mode
; Screen pages
DB #50,#51,#52,#53,#54,#55,#56,#57
DB #58,#59,#5A,#5B,#5C,#5D,#5E,#5F
;
;DB MODE_PAGE ; ?????
DB SP_SND.CBL.BUFFER_PAGE ; Page for CBL audio
DB SYS_PAGE ; Page for system (BIOS) variables
DB #FF ; End of the block
;
;----------------------------------------------------------------------;
;
;
;----------------------------------------------------------------------;
; <20>®«ãç¨âì ¡«®ª ¯ ¬ï⨠N bytes,
; ‚室: B - ç¨á«® ­¥®¡å®¤¨¬ëå ¡«®ª®¢
; ‚ë室: L,A - Š‹ž— RAM-Disk/ª®¤ ®è¨¡ª¨
; CF - ¯à¨§­ ª ®è¨¡ª¨
;EMM_FN2M:
EMM.GetMem: PUSH BC
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
;
LD HL,SYS_PAGE.RAM_TABLE
XOR A
LD C,#FF ; Œ¥âª  ª®­æ  à ¬¡«®ª 
; ‡ ¯®«­¨âì RAM_TABLE
.loop2: DEC L
JR Z,.error_no_mem
CP (HL)
JR NZ,.loop2
LD (HL),C
LD C,L
DJNZ .loop2
; L = 㪠§ â¥«ì 楯®çª¨.
EX AF,AF'
OUT (SLOT3),A
LD A,L
AND A
POP BC
RET
;
.error_no_mem: EX AF,AF'
OUT (SLOT3),A
LD A,C
CALL EMM.FreeMem
LD L,BIOS.Error.EMM.NoMemory
LD A,L
SCF
POP BC
RET
/*
EMM.GetMem: PUSH BC
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD C,B ; á®åà ­¨âì ç¨á«® ­ã¦­ëå ¡«®ª®¢
LD HL,SYS_PAGE.RAM_TABLE
; –¨ª« ¯à®¢¥àª¨ ­ «¨ç¨ï ­ã¦­ëå ¡«®ª®¢.
XOR A
.loop: DEC L
JR Z,.noRAM
; LD A,(HL)
; AND A
CP (HL)
JR NZ,.loop
DJNZ .loop
; Œ¥áâ® ¥áâì !
LD B,C ; ‚®ááâ ­®¢¨âì ­ã¦­ë© ®¡ê¥¬ ¤¨áª 
LD C,#FF ; Œ…’Š€ ŠŽ<C5A0>€ RAM-Disk
LD L,A ;low SYS_PAGE.RAM_TABLE
; ‡ ¯®«­¨âì RAM_TABLE
; A = 0
.loop2: DEC L
; LD A,(HL)
; AND A
CP (HL)
JR NZ,.loop2
LD (HL),C
LD C,L
DJNZ .loop2
; L = 㪠§ â¥«ì 楯®çª¨.
EX AF,AF'
OUT (SLOT3),A
LD A,L
AND A
POP BC
RET
;
.noRAM: LD L,BIOS.Error.EMM.NoMemory
EX AF,AF'
OUT (SLOT3),A
LD A,L
SCF
POP BC
RET
*/
;----------------------------------------------------------------------;
;
;
;----------------------------------------------------------------------;
; <20>®«ãç¨âì ¡«®ª ¯ ¬ï⨠N bytes, ¤«ï RAM-Disk A
; ‚室: B - ç¨á«® ­¥®¡å®¤¨¬ëå ¡«®ª®¢, A - RAM-Disk
; ‚ë室: L,A - Š‹ž— RAM-Disk/ª®¤ ®è¨¡ª¨
; CF - ¯à¨§­ ª ®è¨¡ª¨
;EMM.GetMem:
EMM.GetMemRMD: PUSH AF
CALL EMM.GetMem
JR C,.error1
;
LD B,A
POP AF
CALL BLK_TO_RAMD
RET NC
;
.error2: LD L,BIOS.Error.BadNumber ; RAM-Disk § ­ïâ
LD A,L
RET
;
.error1: POP HL ; ç¨á⨬ á⥪
LD L,A
RET
;----------------------------------------------------------------------;
;
;----------------------------------------------------------------------;
; Žá¢®¡®¤¨âì ¡«®ª ¯ ¬ï⨠ª«îç  K
; ‚室: A - Š‹ž— RAM-Disk
EMM.FreeMemRMD: CALL GET_RAMD_ST
RET C
SCF
RET Z
LD C,A
IN A,(SLOT3)
LD B,A
LD A,SYS_PAGE
OUT (SLOT3),A
LD H,high SYS_PAGE.RAMD_KEYS
LD (HL),0
LD A,B
OUT (SLOT3),A
LD A,C
;JR EMM.FreeMem
;------[
; Žá¢®¡®¤¨âì ¡«®ª ¯ ¬ïâ¨
; ‚室: A - <20>€—€Ž <E28093>Ž—Šˆ
; <20><20>Ž<EFBFBD>ˆœ DE!!!
;EMM_FN3M:
EMM.FreeMem: ; [x] ⥯¥àì ­¥«ì§ï ®á¢®¡®¤¨âì áâà ­¨æã #FF
SCF
INC A
RET Z
DEC A
;
RET Z
;
LD C,A
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD H,high SYS_PAGE.RAM_TABLE
LD A,C
.loop: LD L,A
LD A,(HL) ; á«¥¤ãî騩 ¡«®ª
AND A
JR Z,.error
LD (HL),0 ; Žá¢®¡®¤¨âì
CP #FF ; …᫨ ­¥ ª®­¥æ
JR NZ,.loop ; ¯à®¤®«¦ âì
; [x] 23/08/2024 ¢®ááâ ­®¢«¥­¨¥ 楯®çª¨ ¥á«¨ ®á¢®¡®¦¤ «¨ ­¥ á ­ ç « 
LD A,C
LD L,0
LD BC,256
CPIR
JR NZ,.exit
DEC HL
LD (HL),#FF
;
.exit: EX AF,AF'
OUT (SLOT3),A
XOR A ; no error code
RET
.error: EX AF,AF'
OUT (SLOT3),A
LD A,BIOS.Error.BadNumber
SCF
RET
;----------------------------------------------------------------------;
;
; WARNING!!! ­¥ âண âì DE
;----------------------------------------------------------------------;
; <20>®«ãç¨âì áâà ­¨æã N ª«îç  K
; ‚室: A - Š‹ž— RAM-Disk, B - ­®¬¥à áâà ­¨æë
; ‚ë室: A - áâà ­¨æ 
EMM.GetMemPageRMD:
CALL GET_RAMD_ST
RET C
SCF
RET Z
;JR EMM.GetMemPage
;------[
; <20>®«ãç¨âì áâà ­¨æã N ¡«®ª  K
; ‚室: A - ¡«®ª, B - ­®¬¥à áâà ­¨æë
; ‚ë室: A - áâà ­¨æ , IF CF - A=0 - ­¥â ¡«®ª , A=FF - END
;EMM_FN4M:
EMM.GetMemPage:
LD L,A
IN A,(SLOT1)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT1),A
INC B
LD H,high (SYS_PAGE.RAM_TABLE-#4000-#4000)
EMM_F4M_L1:
LD A,(HL)
AND A
JR Z,EMM_F4M_ERR
DEC B
JR Z,EMM_F4M_END
LD L,A
CP #FF
JR NZ,EMM_F4M_L1
EMM_F4M_ERR:
LD L,A
EX AF,AF'
OUT (SLOT1),A
LD A,L
SCF
RET
EMM_F4M_END:
EX AF,AF'
OUT (SLOT1),A
LD A,L
AND A
RET
;----------------------------------------------------------------------;
;
;
;----------------------------------------------------------------------;
; <20>®«ãç¨âì á«¥¤ãîéãî áâà ­¨æã ¯® FAT
; ‚室: A - áâà ­¨æ  އ“
; ‚ë室: A - á«¥¤ãîé ï áâà ­¨æ  އ“
;EMM_FN5:
EMM.GetMemPageNext:
LD L,A
AND A
SCF
RET Z
IN A,(SLOT1)
LD H,A
LD A,SYS_PAGE
OUT (SLOT1),A
LD A,H
LD H,high (SYS_PAGE.RAM_TABLE-#4000-#4000)
LD L,(HL)
OUT (SLOT1),A
LD A,L
AND A
SCF
RET Z
AND A
RET
;----------------------------------------------------------------------;
;
;
;----------------------------------------------------------------------;
; <20>®«ãç¨âì ᯨ᮪ áâà ­¨æ ¡«®ª  ¢ HL
; ‚室: A - ¡«®ª, HL -  ¤à¥á ¡ãä¥à  - 256 ¡ ©â.
; ‚ë室: HL -  ¤à¥á ¡«®ª , B - ¤«¨­  ¡«®ª  ¢ áâà ­¨æ å އ“
;EMM_FN5M:
EMM.GetMemBlkPages:
PUSH DE
PUSH HL
EX DE,HL
LD B,0
LD L,A
.loop: LD A,L
LD (DE),A
INC DE
AND A
JR Z,.error
CP #FF
JR Z,.end
;
IN A,(SLOT1)
LD C,A
LD A,SYS_PAGE
OUT (SLOT1),A
LD H,high (SYS_PAGE.RAM_TABLE-#4000-#4000)
LD L,(HL)
LD A,C
OUT (SLOT1),A
;
INC B
JR NZ,.loop
.error: SCF
.end: POP HL
POP DE
RET
; RAMDRV.EXE ¢ë§ë¢ ¥â íâã äã­ªæ¨î á  ¤à¥á®¬ ¢ SLOT1, ¯®í⮬㠫ãçè¥ â ª ­¥ ®¯â¨¬¨§¨à®¢ âì
; EMM.GetMemBlkPages:
; PUSH DE
; PUSH HL
; EX DE,HL
; LD B,0
; LD L,A
; IN A,(SLOT1)
; LD C,A
; LD A,SYS_PAGE
; OUT (SLOT1),A
; .loop: LD A,L
; LD (DE),A
; INC DE
; AND A
; JR Z,.error
; CP #FF
; JR Z,.end
; ;
; LD H,high +(SYS_PAGE.RAM_TABLE - #4000 - #4000)
; LD L,(HL)
; INC B
; JR NZ,.loop
; .error: SCF
; .end: LD A,C
; OUT (SLOT1),A
; POP HL
; POP DE
; RET
;----------------------------------------------------------------------;
;
;
;----------------------------------------------------------------------;
; à §¤¥«¨âì ¡«®ª ¯ ¬ï⨠­  ¤¢  ¡«®ª 
; A - ¡«®ª, B - ¤«¨­  ¯¥à¢®£® ¡«®ª  ¯®á«¥ à §¤¥«¥­¨ï
; ¢ë室: A - ¡«®ª 1, B - ¡«®ª 2
EMM.DivMemBlocks:
INC B
DEC B
SCF
RET Z
DEC B
LD E,A
CALL EMM.GetMemPage ; ¯®«ãç¨âì ­®¬¥à áâà ­¨æë ¡«®ª 
RET C
LD D,A
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD H,high +(SYS_PAGE.RAM_TABLE); - #4000 - #4000)
LD L,D
LD A,(HL)
LD (HL),#FF
LD B,A
EX AF,AF'
OUT (SLOT3),A
LD A,E
AND A
RET
;----------------------------------------------------------------------;
;
;
;----------------------------------------------------------------------;
; ᫨âì ¤¢  ¡«®ª  ¯ ¬ï⨠¢ ®¤¨­
; € - ¡«®ª 1, B - ¡«®ª 2
; ¢ë室: € - ¡«®ª
EMM.MergeMemBlocks:
LD E,A
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD H,high SYS_PAGE.RAM_TABLE
LD L,E
LD C,B
LD B,0
.ADD_L: LD A,(HL)
AND A
JR Z,.ADD_ERR
CP #FF
JR Z,.ADD_NEXT
LD L,A
DJNZ .ADD_L
.ADD_ERR:
EX AF,AF'
OUT (SLOT3),A
SCF
RET
.ADD_NEXT: LD A,C
AND A
JR Z,.ADD_ERR
LD (HL),A
EX AF,AF'
OUT (SLOT3),A
AND A
LD A,E
RET
;----------------------------------------------------------------------;
;
;
;----------------------------------------------------------------------;
; ¢å®¤: DE - ram_disk trk_sec, A - RAM-Disk
; ¢ë室: HL -  ¤à¥á, A - page
RAMD_CALC_PAGE:
CP 16
CCF
RET C ; <20> ’€ŠŽƒŽ RAM-Disk
PUSH AF
LD H,D
LD L,E
ADD HL,HL
ADD HL,HL
LD B,H
LD A,E
OR #C0
LD C,A ; C - ç áâì  ¤à¥á , B - áâà ­¨æ 
POP AF
CALL EMM.GetMemPageRMD ; <20>Ž“—ˆœ <E28098><EFBFBD>ˆ
LD L,0
LD H,C
RET
;----------------------------------------------------------------------;
;
;
;----------------------------------------------------------------------;
; ‚室:
; A - RAM Disk ID
; ‚ë室:
; A - Number (0..15)
GET_RAMD_NUM:
EX AF,AF'
IN A,(SLOT1)
EX AF,AF'
LD BC,SYS_PAGE*256+SLOT1
OUT (C),B
LD HL,SYS_PAGE.RAMD_KEYS-#4000-#4000
LD BC,SYS_PAGE.RAMD_KEYS.NUM
CPIR
EX AF,AF'
OUT (SLOT1),A
EX AF,AF'
SCF
RET PE
DEC L
LD A,L
SUB low SYS_PAGE.RAMD_KEYS
RET
;----------------------------------------------------------------------;
;
;
;----------------------------------------------------------------------;
; [x] 04/11/2023
; ‚室:
; B = 0: swap to Sp
; B = #FF: swap to ZX
; B = #FE: no swap, only get info
; ‚ë室:
; A - current RAM Drives set
SWAP_RAM_DRIVES:
IN A,(SLOT3)
EX AF,AF'
PUSH AF ;­  ¢á直© á«ãç ©
LD A,SYS_PAGE
OUT (SLOT3),A
;
LD A,(SYS_PAGE.CURRENT_RAM_DRV)
LD C,A
CP B
JR Z,.exit ; 㦥 ãáâ ­®¢«¥­ § ¯à è¨¢ ¥¬ë© ­ ¡®à
;
LD A,#FE
CP B
JR Z,.exit ; ­¨ç¥£® ­¥ ¬¥­ïâì, ¢ë¤ âì ⥪ã騩 ­ ¡®à
;
.swap: LD HL,SYS_PAGE.RAMD_KEYS
LD DE,SYS_PAGE.Sp_RAMD_KEYS
LD B,SYS_PAGE.RAMD_KEYS.NUM
.loop: LD A,(DE)
LD C,A
LD A,(HL)
LD (DE),A
LD A,C
LD (HL),A
INC HL
INC DE
DJNZ .loop
;
LD A,(SYS_PAGE.CURRENT_RAM_DRV)
XOR #FF
LD (SYS_PAGE.CURRENT_RAM_DRV),A
LD C,A
;
.exit: EX AF,AF'
OUT (SLOT3),A
POP AF
EX AF,AF'
LD A,C
RET
;----------------------------------------------------------------------;
;
;
;----------------------------------------------------------------------;
; ­  ¢ë室¥ ¯à¨ € = 0 ¤®«¦¥­ ¡ëâì ãáâ ­®¢«¥­ ä« £ Z
; ­¥ 㡨¢ ¥â DE ¨ BC
GET_RAMD_ST:
CP SYS_PAGE.RAMD_KEYS.NUM
CCF
RET C
PUSH BC
LD HL,SYS_PAGE.RAMD_KEYS-#4000-#4000
ADD A,L
LD L,A
IN A,(SLOT1)
LD B,A
LD A,SYS_PAGE
OUT (SLOT1),A
LD C,(HL)
LD A,B
OUT (SLOT1),A
LD A,C
POP BC
AND A
RET
;----------------------------------------------------------------------;
;
;
;----------------------------------------------------------------------;
; RAM-Disk A, BLK - B
BLK_TO_RAMD:
CP SYS_PAGE.RAMD_KEYS.NUM
CCF
RET C
PUSH HL
LD L,A
IN A,(SLOT3)
LD C,A
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,L
LD HL,SYS_PAGE.RAMD_KEYS; - #4000 - #4000
ADD A,L
LD L,A
LD A,(HL) ; ª«îç ¡«®ª 
AND A
JR NZ,BLK_BUSY ; RAM-Disk § ­ïâ - ®è¨¡ª 
LD (HL),B
LD A,C
OUT (SLOT3),A
LD A,B
AND A
POP HL
RET
;
BLK_BUSY:
LD A,C
OUT (SLOT3),A
SCF
POP HL
LD A,L
RET
;----------------------------------------------------------------------;
;
;
;----------------------------------------------------------------------;
; RAM-Disk A
RAMD_CLEAR:
CP SYS_PAGE.RAMD_KEYS.NUM
CCF
RET C
PUSH HL
LD L,A
IN A,(SLOT3)
LD C,A
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,L
LD HL,SYS_PAGE.RAMD_KEYS; - #4000 - #4000 ; RAM-Disk ᢮¡®¤¥­
ADD A,L
LD L,A
LD B,A ; § ¯®¬­¨âì 㤠«ï¥¬ë© à ¬¤¨áª
LD A,(HL)
AND A
JR Z,BLK_BUSY ; ¢®§¢à â á ®è¨¡ª®©
LD (HL),0
LD A,C
OUT (SLOT3),A
AND A
POP HL
RET
;----------------------------------------------------------------------;
;
;
;----------------------------------------------------------------------; !FIXIT SAFE_RGADR
;RAMD_R_W:
; ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
; º RD/WR SECTOR º\
; º HL - BUFER º\
; º DE - ABS sector ¢ 256b ¡«®ª å º\
; º B - ç¨á«® ¤ ­­ëå ¢ 256b ¡«®ª å º\
; º A - block RAM º\
; º A' - ª®¬ ­¤  ç⥭¨¥/§ ¯¨áì/ç⥭¨¥ ROM Disk º\
; º 0 - read, 255 - write, 70 - read ROM DISKº\
; º ** NOT USED TR-DOS VARS ** º\
; ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\
; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
BLK_RD_WR: AND A
SCF
RET Z
;
AND A
INC B
DEC B
RET Z
; á®å࠭塞 á®áâ®ï­¨¥ ¯à¥à뢠­¨©
LD C,A
LD A,R
PUSH AF
; á®å࠭塞 PORT_Y
IN A,(PORT_Y)
PUSH AF
LD A,#C0
OUT (PORT_Y),A
;
LD A,C
DI
CALL .start
EX AF,AF'
; ¢®ááâ ­ ¢«¨¢ ¥¬ PORT_Y
POP AF
OUT (PORT_Y),A
; ¢®ááâ ­ ¢«¨¢ ¥¬ á®áâ®ï­¨¥ ¯à¥à뢠­¨©
POP AF
JP PO,.noInterrupts
EI
.noInterrupts: EX AF,AF'
RET
; ;
.start: EX AF,AF'
AND A ; 0 - read
JR Z,.reset_Z
CP #FF ; write
JR Z,.keep_Z
;
CP 5 ; old read
JR Z,.reset_Z
CP 6 ; old write
JR Z,.keep_Z
;
CP #46
JP Z,ROM_DISK
;
EX AF,AF'
SCF
RET
;
.reset_Z: INC A ; set Z for WRITE
.keep_Z: EX AF,AF'
;
PUSH HL
PUSH BC
LD C,SLOT1
IN B,(C)
LD H,A
LD A,SYS_PAGE
OUT (SLOT1),A
LD A,H
;
LD H,high +(SYS_PAGE.RAM_TABLE-#4000-#4000)
LD L,A
INC D
.RAMD_LOOP_D: DEC D
JR Z,.NOT_FOUR_BLK
LD L,(HL)
LD L,(HL)
LD L,(HL)
LD L,(HL)
JP .RAMD_LOOP_D
;
.NOT_FOUR_BLK: LD A,E
.loop: SUB #40
JR C,.NOT_ONE_BLK
LD L,(HL)
JP .loop
;
.NOT_ONE_BLK: AND #3F
LD D,A ; DE - ADRESS in RAM-Disk
LD E,0
LD A,L ; L - ⥪ã騩 ¡ ­ª RAM-Disk
OUT (C),B ; ¢®ááâ ­®¢¨âì áâà ­¨æã
POP BC ; ¤«¨­  ¤ ­­ëå
POP HL ;  ¤à¥á ¡ãä¥à 
BIT 7,H
JR NZ,.BLK_PAGE1
;
LD C,SLOT3
IN C,(C)
OUT (SLOT3),A
SET 7,D
SET 6,D
JP .BLK_CONT1
;
.BLK_PAGE1: LD C,SLOT1
IN C,(C)
OUT (SLOT1),A
RES 7,D
SET 6,D
; DE - RamDisk, HL - data
.BLK_CONT1: EX AF,AF'
JR Z,.NO_EX_RW1 ; WRITE
EX DE,HL ; for READ
.NO_EX_RW1: EX AF,AF'
LD A,16
;
.BLK_LL1: DUP 16
LDI
EDUP
DEC A
JR NZ,.BLK_LL1
;
EX AF,AF'
JR Z,.NO_EX_RW2 ; WRITE
EX DE,HL ; for READ
.NO_EX_RW2: EX AF,AF' ; DEC C ¯à®ªàã⨫áï 256 à § ¨ ¢¥à­ã«áï
; A = 0
CP B
JP Z,.BLK_EXIT_1
;
BIT 6,D
JP NZ,.BLK_CONT1
;
BIT 7,D
JR Z,.BLK_PAGE3_X
;
IN A,(SLOT1)
LD E,A
LD D,high +(SYS_PAGE.RAM_TABLE-#4000-#4000)
LD A,SYS_PAGE
OUT (SLOT1),A
LD A,(DE)
OUT (SLOT1),A
LD DE,#4000
JP .BLK_CONT1
;
.BLK_PAGE3_X: IN A,(SLOT3)
LD E,A
LD D,high SYS_PAGE.RAM_TABLE
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(DE)
OUT (SLOT3),A
LD DE,#C000
;
BIT 7,H
JP Z,.BLK_CONT1
;
LD E,A
LD A,C
OUT (SLOT3),A
IN A,(SLOT1)
LD C,A
LD A,E
OUT (SLOT1),A
LD DE,#4000
JP .BLK_CONT1
;
.BLK_EXIT_1: LD A,D
DEC A
RLCA
LD A,C
JR C,.BLK_EXIT_2
OUT (SLOT1),A
RET
;
.BLK_EXIT_2: OUT (SLOT3),A
AND A
RET
;----------------------------------------------------------------------;
;
;
;----------------------------------------------------------------------;
;****************************************
;!!!!! READ_ROM_PAGE_X ç⥭¨¥ ¯®á«¥¤­¨å
; 256 ¡ ©â®¢ <20>‡“ ¢ á«ã¦¥¡­ãî áâà ­¨æã § ç¥¬-â®
; READ_ROM_PAGE_X:
; LD DE,0
; LD BC,#100 ; ®¤¨­ ᥪâ®à
; PUSH DE
; PUSH BC
; LD HL,#3F00
; LD DE,#FF00
; LD A,#1F ; last page ROM
; JR ROM_DISK.loopRead
;****************************************
; —⥭¨¥ á ROM-Disk
; HL -  ¤à¥á, ªã¤  ç¨â âì
; DE - ­®¬¥à ᥪâ®à  (áç¨â âì ¯® 256b ᥪâ®à)
; B - ç¨á«® ᥪâ®à®¢
; A' - à §¬¥à ᥪâ®à  (1 - 256b, 2 - 512 b)
ROM_DISK: EX AF,AF'
LD C,0 ; áç¥â稪
DEC A
JR Z,.loop
;
DEC A
SCF
RET NZ
;
EX DE,HL
ADD HL,HL
EX DE,HL
LD A,B
ADD A,A
LD B,A
RET C
;
DI
CALL .loop
RET C
;
AND A
RR D
RR E
XOR A
RET
;
.loop: PUSH DE ; ­®¬¥à ᥪâ®à 
PUSH BC
;
LD A,E
AND #3F ; ADRESS in ROM-Page
PUSH AF ; á®åà ­¨âì  ¤à¥á
;
EX DE,HL ; DE -  ¤à¥á ¡ãä¥à 
ADD HL,HL
ADD HL,HL ; H - ­®¬¥à ¡ ­ª¨
; [ ] ¡¥§ ¯à¨¢ï§ª¨ ஬-¤¨áª  ª align 256
;LD A,(ROM_DISK.Pages.Number)
;INC H
;CP H
;
LD C,H
LD B,0
LD HL,ROM_DISK.Pages
ADD HL,BC
;
LD A,(ROM_DISK.Pages.Number) ; rdlow-ok
INC C
CP C
;
;LD L,H
;LD H,high ROM_DISK.Pages.Number ; ROM-Disk pages!
;
LD A,(HL) ; PAGE-ROM
POP HL ; ¢®ááâ ­®¢¨âì  ¤à¥á ¢ ROM-Page
LD L,0 ; ¥á«¨ ¤ «¥ª® § å®â¥«¨ - ¢ë室 á ®è¨¡ª®©
JR C,.errorExit ; ROM-Disk-end
; DE - ¡ãä¥à
; HL -  ¤à¥á ¢ ROM
; B - ç¨á«® ᥪâ®à®¢
; A - ROM-Page
.loopRead: PUSH HL ; ®âªã¤ 
PUSH DE ; ªã¤ 
LD HL,-.stackDepth-.readProcedure.size ; memory stack use!
ADD HL,SP ; stack
PUSH HL ;  ¤à¥á ¯à®£à ¬¬ë .readProcedure
LD DE,.readProcedure ; ¯¥à¥­¥á⨠¯à®£à ¬¬ã ­  á⥪
EX DE,HL
LD BC,.readProcedure.size
LDIR ; ¯à®£à ¬¬  ­  á⥪¥
LD BC,#100 ; ¤«¨­  ᥪâ®à 
RET ; ¨á¯®«­¨âì ¯à®£à ¬¬ã .readProcedure, ­  á⥪¥  ¤à¥á  ¡ãä¥à  ¨ ROM
; DE - next address
; HL - ROM address
.readNext: POP BC ; ç¨á«® ᥪâ®à®¢
INC C ; áç¥â稪 áç¨â ­­ëå ᥪâ®à®¢
DEC B ; ᥪâ®à  ª®­ç¨«¨áì?
JR Z,.normExit
BIT 6,H ; ç⥭¨¥ ­¥ § ª®­ç¥­®
PUSH BC ; á®åà ­¨âì áç¥â稪¨
JR Z,.loopRead ; ç¨â âì ¤ «ìè¥
POP BC
POP HL ; ­®¬¥à ᥪâ®à 
LD A,B
LD B,0
ADD HL,BC
LD B,A ; ¢ëç¨á«¨âì á«¥¤.ᥪâ®à
EX DE,HL ; ⥯¥àì HL -  ¤à¥á, DE ᥪâ®à, B - ᪮«ìª® ¥é¥ ç¨â âì
JP .loop ; ­ ç âì ¢á¥ á­®¢ !
; ç⥭¨¥ § ª®­ç¥­®
.normExit: POP HL ; ᥪâ®à, ®âªã¤  ¢¥«®áì ç⥭¨¥
ADD HL,BC ; ¯® ¢®§¢à âã: HL - á«¥¤. ¤à¥á
EX DE,HL ; DE - á«¥¤.ᥪâ®à
AND A
RET
; ®è¨¡ª 
.errorExit: ; !TODO ᤥ« âì, ç⮡ ­  ¢ë室¥ ¯®ª §ë¢ «®áì ª®«¨ç¥á⢮ ¯à®ç¨â ­­ëå ᥪâ®à®¢
POP BC
POP DE
SCF
RET
; ¯à®æ¥¤ãà , ¯¥à¥­®á¨¬ ï ­  á⥪ ¤«ï ç⥭¨ï ¨§ ROM-Disk
; ®áâ®à®¦­¥¥ á PUSH, ¥á«¨ ­ ¤® ¬­®£®, ⮠㢥«¨ç¨âì .stackDepth
.readProcedure:
POP DE ; ªã¤ 
POP HL ; ®âªã¤ 
OUT (ROM.SLOT0),A ; ROM_PAGE
LDIR ; §¤¥áì ç¨â ¥âáï ¨§ ROM-Disk
LD B,A
XOR A
OUT (ROM.SLOT0),A
OUT (SYS_PORT.ROM),A
LD A,B
JP .readNext
.stackDepth EQU 8 ; à ááâ®ï­¨¥ ®â ª®­æ  ¯à®æ¥¤ãàë ¤® ¢¥à設ë á⥪ .
.readProcedure.size EQU $-.readProcedure
;----------------------------------------------------------------------;
;