mirror of
https://github.com/Tolik-Trek/Sprinter-BIOS.git
synced 2026-06-15 09:21:46 +03:00
1132 lines
20 KiB
NASM
1132 lines
20 KiB
NASM
;===================[ ”ãªæ¨¨ à á¯à¥¤¥«¥¨ï ¯ ¬ï⨠]===================;
|
||
; ‚ë室: 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
|
||
;----------------------------------------------------------------------;
|
||
; |