Crazy-Blaster/Crazy BIOS/exp/FUNC_RAM_ROM_DRV.ASM
2024-07-31 03:29:05 +10:00

1118 lines
20 KiB
NASM
Raw 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
LD HL,SYS_PAGE.RAMD_FAT - #4000 - #4000
LD C,0
.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.RAMD_FAT ; €¤à¥á 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; - #4000 - #4000
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; - #4000 - #4000
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] Block #1 - ¬®¦­® ®á¢®¡®¤¨âì ¯® ID 1
DB 1,3,4,6,7,8,9,10,11,12,13,14,15 ; for Spectrum
;!FIXIT áâà ­¨æë 16..31 ­¥ § à¥§¥à¢¨à®¢ ­ë, ­® ¨á¯®«ì§ãîâáï ¢ Pentagon 512
;
; í¬ã«ïâ®à <20>‡“ ;!FIXIT ROM-Emulator ᤥ« âì ¤¨­ ¬¨ç¥áª¨¥ áâà ­¨æë
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 0,2,5 ; 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 CBL.BUFFER_PAGE ; Page for CBL audio
DB SYS_PAGE ; Page for system (BIOS) variables
DB #FF ; End of the block
;
.Blocks EQU 2
;----------------------------------------------------------------------;
;
;
;----------------------------------------------------------------------;
; <20>®«ãç¨âì ¡«®ª ¯ ¬ï⨠N bytes,
; ‚室: B - ç¨á«® ­¥®¡å®¤¨¬ëå ¡«®ª®¢
; ‚ë室: L,A - Š‹ž— RAM-Disk/ª®¤ ®è¨¡ª¨
; CF - ¯à¨§­ ª ®è¨¡ª¨
;EMM_FN2M:
EMM.GetMem:
;PUSH DE
PUSH BC
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD C,B ; á®åà ­¨âì ç¨á«® ­ã¦­ëå ¡«®ª®¢
LD HL,SYS_PAGE.RAMD_FAT; - #4000 - #4000
; –¨ª« ¯à®¢¥àª¨ ­ «¨ç¨ï ­ã¦­ëå ¡«®ª®¢.
.loop: DEC L
JR Z,.noRAM
LD A,(HL)
AND A
JR NZ,.loop
DJNZ .loop
; Œ¥áâ® ¥áâì !
LD B,C ; ‚®ááâ ­®¢¨âì ­ã¦­ë© ®¡ê¥¬ ¤¨áª 
LD C,#FF ; Œ…’Š€ ŠŽ<C5A0>€ RAM-Disk
LD HL,SYS_PAGE.RAMD_FAT; - #4000 - #4000
; ‡ ¯®«­¨âì RAMD_FAT
.loop2: DEC L
LD A,(HL)
AND A
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
;POP DE
RET
.noRAM: LD L,1 ; <20> <20>€ŒŸˆ
EX AF,AF'
OUT (SLOT3),A
LD A,L
SCF
POP BC
;POP DE
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,2 ; RAM-Disk § ­ïâ ;!TODO ¯¥à¥ç¨á«¨âì ¢á¥ ¢ à¨ ­âë ®è¨¡®ª ¨ ¨å ­®¬¥à  ª ª ¤«ï „‘‘
LD A,L
RET
.error1:
POP HL ; ç¨á⨬ á⥪
LD L,A
;SCF
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; - #4000 - #4000
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:
AND A
SCF
RET Z
;
LD L,A
CP ZX_RAM_ID
CALL Z,SET_ROM_FLAG_ZX
;
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD H,high (SYS_PAGE.RAMD_FAT)
LD A,L
EMM_F3M_L1:
LD L,A
LD A,(HL) ; á«¥¤ãî騩 ¡«®ª
AND A
JR Z,EMM_FN3M_ERR
LD (HL),0 ; Žá¢®¡®¤¨âì
CP #FF ; …᫨ ­¥ ª®­¥æ
JR NZ,EMM_F3M_L1 ; ¯à®¤®«¦ âì
EX AF,AF'
OUT (SLOT3),A
XOR A ; no error code
RET
EMM_FN3M_ERR:
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.RAMD_FAT - #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.RAMD_FAT - #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.RAMD_FAT - #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.RAMD_FAT - #4000 - #4000)
; LD L,(HL)
; INC B
; JR NZ,.loop
; .error: SCF
; .end: LD A,C
; OUT (SLOT1),A
; POP HL
; POP DE
; 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.RAMD_FAT - #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)
JR .RAMD_LOOP_D
.NOT_FOUR_BLK:
LD A,E
.loop: SUB #40
JR C,.NOT_ONE_BLK
LD L,(HL)
JR .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
JR .BLK_CONT1
.BLK_PAGE1:
LD C,SLOT1
IN C,(C)
OUT (SLOT1),A
RES 7,D
SET 6,D
.BLK_CONT1: ; DE - RamDisk, HL - data
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 à § ¨ ¢¥à­ã«áï
INC B ; B 㦥 㬥­ì訫áï ­  1,
DEC 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.RAMD_FAT - #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.RAMD_FAT
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:
; á®å࠭塞 á®áâ®ï­¨¥ ¯à¥à뢠­¨©
;LD A,R
EX AF,AF'
LD C,0 ; áç¥â稪
DEC A
JR Z,.loop
;JR Z,.start
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
; ; ¢®ááâ ­ ¢«¨¢ ¥¬ á®áâ®ï­¨¥ ¯à¥à뢠­¨©
; EX AF,AF'
; JP PO,.noInterrupts
; EI
; .noInterrupts:
; EX AF,AF'
; ;
RET C
AND A
RR D
RR E
XOR A
RET
; .start:
; DI
; CALL .loop
; ; ¢®ááâ ­ ¢«¨¢ ¥¬ á®áâ®ï­¨¥ ¯à¥à뢠­¨©
; EX AF,AF'
; JP PO,.noInterrupts2
; EI
; .noInterrupts2:
; EX AF,AF'
; ;
; 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 - ­®¬¥à ¡ ­ª¨
LD A,(ROM_DISK.Pages.Number)
INC H
CP H
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 (CNF_PORT.vBIOS),A
LD A,B
JP .readNext
.stackDepth EQU 8 ; à ááâ®ï­¨¥ ®â ª®­æ  ¯à®æ¥¤ãàë ¤® ¢¥à設ë á⥪ .
.readProcedure.size EQU $-.readProcedure
;----------------------------------------------------------------------;
;
;
;----------------------------------------------------------------------;
; ¢å®¤: 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
;----------------------------------------------------------------------;
;
;
;----------------------------------------------------------------------;
; à §¤¥«¨âì ¡«®ª ¯ ¬ï⨠­  ¤¢  ¡«®ª 
; 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.RAMD_FAT); - #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.RAMD_FAT); - #4000 - #4000)
LD L,E
LD C,B
LD B,0
.EMM_ADD_L:
LD A,(HL)
AND A
JR Z,.EMM_ADD_ERR
CP #FF
JR Z,.EMM_ADD_NEXT
LD L,A
DJNZ .EMM_ADD_L
.EMM_ADD_ERR:
EX AF,AF'
OUT (SLOT3),A
SCF
RET
.EMM_ADD_NEXT:
LD A,C
AND A
JR Z,.EMM_ADD_ERR
LD (HL),A
EX AF,AF'
OUT (SLOT3),A
AND A
LD A,E
RET
;----------------------------------------------------------------------;
;