Sprinter-BIOS/src/bios/exp/FUNC_RAM_ROM_DRV.ASM
2023-08-11 01:15:56 +10:00

1008 lines
21 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
EMM.GetMemSize:
IN A,(SLOT2)
LD B,A
LD A,SYS_PAGE
OUT (SLOT2),A
LD HL,SYS_PAGE.RAMD_FAT-#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
LD A,B
LD B,0
OUT (SLOT2),A
RET
;----------------------------------------------------------------------;
;
;
;----------------------------------------------------------------------;
; ˆ­¨æ¨ «¨§ æ¨ï à á¯à¥¤¥«¥­¨ï ¯ ¬ïâ¨.
EMM.InitMem:
PUSH BC
PUSH HL
PUSH DE
IN A,(SLOT2)
LD C,A
LD A,SYS_PAGE
OUT (SLOT2),A
LD HL,SYS_PAGE.RAMD_FAT-#4000 ; €¤à¥á FAT އ“.
; ®¡­ã«ï¥¬ â ¡«¨æã
.loopFree:
LD (HL),0
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
LD HL,SYS_PAGE.RAMD_KEYS-#4000
LD B,SYS_PAGE.RAMD_KEYS.NUM
.loop2: LD (HL),0
INC L
DJNZ .loop2
LD A,C
OUT (SLOT2),A
POP DE
POP HL
POP BC
RET
;---------------------------------------------------------------------[]
RESERVED_PAGES:
;; Block #1 - ¬®¦­® ®á¢®¡®¤¨âì ¯® ID 1
DB 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 ; for Spectrum
; í¬ã«ïâ®à <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 ; for Spectrum
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,(SLOT2)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT2),A
LD C,B ; á®åà ­¨âì ç¨á«® ­ã¦­ëå ¡«®ª®¢
LD HL,SYS_PAGE.RAMD_FAT-#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
; ‡ ¯®«­¨âì 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 (SLOT2),A
LD A,L
AND A
POP BC
;POP DE
RET
.noRAM: LD L,1 ; <20> <20>€ŒŸˆ
EX AF,AF'
OUT (SLOT2),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 ¯¥à¥ç¨á«¨âì ¢á¥ ¢ à¨ ­âë ®è¨¡®ª ¨ ¨å ­®¬¥à  ª ª ¤«ï „‘‘
RET
.error1:
POP AF ; ­¥â ¯ ¬ïâ¨
LD L,1
SCF
RET
;----------------------------------------------------------------------;
;
;----------------------------------------------------------------------;
; Žá¢®¡®¤¨âì ¡«®ª ¯ ¬ï⨠ª«îç  K
; ‚室: A - Š‹ž— RAM-Disk
EMM.FreeMemRMD:
CALL GET_RAMD_ST
RET C
SCF
RET Z
LD C,A
IN A,(SLOT2)
LD B,A
LD A,SYS_PAGE
OUT (SLOT2),A
LD (HL),0
LD A,B
OUT (SLOT2),A
LD A,C
;JR EMM.FreeMem
;------[
; Žá¢®¡®¤¨âì ¡«®ª ¯ ¬ïâ¨
; ‚室: A - <20>€—€Ž <E28093>Ž—Šˆ
;EMM_FN3M:
EMM.FreeMem:
AND A
SCF
RET Z
LD L,A
IN A,(SLOT2)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT2),A
LD H,high (SYS_PAGE.RAMD_FAT - #4000)
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 (SLOT2),A
LD A,0 ;!FIXIT ­¥¤®ªã¬¥­â¨à®¢ ­®
AND A
RET
EMM_FN3M_ERR:
EX AF,AF'
OUT (SLOT2),A
LD A,2 ;!FIXIT ­¥¤®ªã¬¥­â¨à®¢ ­®
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,(SLOT2)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT2),A
INC B
LD H,high (SYS_PAGE.RAMD_FAT - #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 (SLOT2),A
LD A,L
SCF
RET
EMM_F4M_END:
EX AF,AF'
OUT (SLOT2),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,(SLOT2)
LD H,A
LD A,SYS_PAGE
OUT (SLOT2),A
LD A,H
LD H,high (SYS_PAGE.RAMD_FAT - #4000)
LD L,(HL)
OUT (SLOT2),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,(SLOT2)
LD C,A
LD A,SYS_PAGE
OUT (SLOT2),A
LD H,high (SYS_PAGE.RAMD_FAT - #4000)
LD L,(HL)
LD A,C
OUT (SLOT2),A
INC B
JR NZ,.loop
.error: SCF
POP HL
POP DE
RET
.end: POP HL
POP DE
AND A
RET
;----------------------------------------------------------------------;
;
;
;----------------------------------------------------------------------;
;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
;
; á®å࠭塞 á®áâ®ï­¨¥ ¯à¥à뢠­¨©
LD C,A
LD A,R
PUSH AF
LD A,C
DI
CALL .start
; ¢®ááâ ­ ¢«¨¢ ¥¬ á®áâ®ï­¨¥ ¯à¥à뢠­¨©
EX AF,AF'
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,SLOT2
IN B,(C)
ld h,a
LD A,SYS_PAGE
OUT (SLOT2),A
ld a,h
LD H,high (SYS_PAGE.RAMD_FAT - #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 ; !!!!! JR NZ,BLK_PAGE1 ?
BLK_PAGE3: ; !TODO ¯¥à¥¤¥« âì ­  SLOT ?????
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,#42
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,#C2
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 63 ; 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 (SYS_PORT.ROM),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,(SLOT2)
EX AF,AF'
LD BC,SYS_PAGE * 256 + SLOT2
OUT (C),B
LD HL,SYS_PAGE.RAMD_KEYS-#4000
LD BC,SYS_PAGE.RAMD_KEYS.NUM
CPIR
EX AF,AF'
OUT (SLOT2),A
EX AF,AF'
SCF
RET PE
DEC L
LD A,L
SUB low SYS_PAGE.RAMD_KEYS
RET
;----------------------------------------------------------------------;
;
;
;----------------------------------------------------------------------;
; ­  ¢ë室¥ ¯à¨ € = 0 ¤®«¦¥­ ¡ëâì ãáâ ­®¢«¥­ ä« £ Z
; DSS ­ ¤¥¥âáï, çâ® íâ  äã­ªæ¨ï ­¥ £à®å ¥â DE
GET_RAMD_ST:
CP SYS_PAGE.RAMD_KEYS.NUM
CCF
RET C
PUSH BC
LD HL,SYS_PAGE.RAMD_KEYS-#4000
ADD A,L
LD L,A
IN A,(SLOT2)
LD B,A
LD A,SYS_PAGE
OUT (SLOT2),A
LD C,(HL)
LD A,B
OUT (SLOT2),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,(SLOT2)
LD C,A
LD A,SYS_PAGE
OUT (SLOT2),A
LD A,L
LD HL,SYS_PAGE.RAMD_KEYS-#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 (SLOT2),A
LD A,B
AND A
POP HL
RET
BLK_BUSY:
LD A,C
OUT (SLOT2),A
SCF
POP HL
RET
;----------------------------------------------------------------------;
;
;
;----------------------------------------------------------------------;
; RAM-Disk A
RAMD_CLEAR:
CP SYS_PAGE.RAMD_KEYS.NUM
CCF
RET C
PUSH HL
LD L,A
IN A,(SLOT2)
LD C,A
LD A,SYS_PAGE
OUT (SLOT2),A
LD A,L
LD HL,SYS_PAGE.RAMD_KEYS-#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 (SLOT2),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,(SLOT2)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT2),A
LD H,high (SYS_PAGE.RAMD_FAT - #4000)
LD L,D
LD A,(HL)
LD (HL),0FFH
LD B,A
EX AF,AF'
OUT (SLOT2),A
LD A,E
AND A
RET
;----------------------------------------------------------------------;
;
;
;----------------------------------------------------------------------;
; ᫨âì ¤¢  ¡«®ª  ¯ ¬ï⨠¢ ®¤¨­
; € - ¡«®ª 1, B - ¡«®ª 2
; ¢ë室: € - ¡«®ª
EMM.MergeMemBlocks:
LD E,A
IN A,(SLOT2)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT2),A
LD H,high (SYS_PAGE.RAMD_FAT - #4000)
LD L,E
LD C,B
LD B,0
EMM_ADD_L:
LD A,(HL)
AND A
JR Z,EMM_ADD_ERR
CP 0FFH
JR Z,EMM_ADD_NEXT
LD L,A
DJNZ EMM_ADD_L
EMM_ADD_ERR:
EX AF,AF'
OUT (SLOT2),A
SCF
RET
EMM_ADD_NEXT:
LD A,C
AND A
JR Z,EMM_ADD_ERR
LD (HL),A
EX AF,AF'
OUT (SLOT2),A
AND A
LD A,E
RET
;----------------------------------------------------------------------;
;