continue freeing zx pages...

This commit is contained in:
Tolik 2024-09-14 02:57:40 +10:00
parent 30edc55a57
commit 22f4acafbe
3 changed files with 227 additions and 90 deletions

@ -1 +1 @@
Subproject commit a98a635f03359ec21cd8dd77917a384a8a37caef
Subproject commit 265b46fce2afbc3e8acef59e83d78b84b88d4ced

View File

@ -5,7 +5,11 @@
;[~] 2 - ƒà㧨â <20>‡“ ᯥªâà㬠 ¨§ ROM ¯à¨ ª ¦¤®¬ ¯¥à¥§ ¯ã᪥ (¬®¦¥â ¡ëâì ®¯ á­®)
;[ ] 3 - <20>¥ £à㧨âì <20>‡“ ᯥªâà㬠, ¨­¨â¨âì áâà ­¨æã #41 â ª, ç⮡ ª®¤ ¢ ­¥© ¯®¤£à㦠« <20>‡“ ᯥªâà㬠 ¯à¨ ®¡à é¥­¨¨
;-------------------------------------------------------------------------------------------------------------------;
; Spectrum RAM map
; SLOT0 = 0
; SLOT1 = 5
; SLOT2 = 2
; SLOT3 = 0 '48kb',1,2,3,4,5,6,7 '128kb',8,9,10,11,12,13,14,15 '256kb'
;
; _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ [___FOR ZX-MODE___] _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ ;
@ -19,62 +23,172 @@
;!FIXIT
;----------------[‚뤥«¥­¨¥/®á¢®¡®¦¤¥­¨¥ áâà ­¨æ ᯥªâà㬠]-------------;
;¢å®¤: ॣ B: 0 - ¨­¨â ¯ ¬ï⨠Spectrum 48k ¨ 2-å áâà ­¨æ vROM
; 1 - ¨­¨â ¯ ¬ï⨠Pentagon 128k ¨ 3-å áâà ­¨æ vROM
; 2 - ¨­¨â ¯ ¬ï⨠Pentagon 512k ¨ 3-å áâà ­¨æ vROM
; 3 - ¨­¨â ¯ ¬ï⨠Scorpion 256k ¨ 3-å áâà ­¨æ vROM
; 4..15 - § à¥§¥à¢¨à®¢ ­ë
;¢å®¤: ॣ B: 0 - § à¥§¥à¢¨à®¢ ­®
; 1 - ¢ë¤¥«¥­¨¥ ¯ ¬ï⨠Pentagon 48k. 3 áâà ­¨æë
; 2 - ¢ë¤¥«¥­¨¥ ¯ ¬ï⨠Pentagon 128k. 2+6 áâà ­¨æë
; 3 - ¢ë¤¥«¥­¨¥ ¯ ¬ï⨠Pentagon 512k. 2+30 áâà ­¨æë
; 4 - ¢ë¤¥«¥­¨¥ ¯ ¬ï⨠Scorpion 256k. 2+6+8 áâà ­¨æë
; 5..15 - § à¥§¥à¢¨à®¢ ­ë
;
; 16 - ¯®«ãç¨âì à ¬¡«®ª¨ ¨­¨æ¨ «¨§¨à®¢ ­­ëå vROM ¨ VRAM
; 17..63 - § à¥§¥à¢¨à®¢ ­ë
; 17..31 - § à¥§¥à¢¨à®¢ ­ë
;
; 32 - § à¥§¥à¢¨à®¢ ­®
; 33 - ¢ë¤¥«¥­¨¥ ¯ ¬ï⨠Spectrum 48k ¨ ¨­¨â 2-å áâà ­¨æ vROM
; 34 - ¢ë¤¥«¥­¨¥ ¯ ¬ï⨠Pentagon 128k ¨ ¨­¨â 3-å áâà ­¨æ vROM
; 35 - ¢ë¤¥«¥­¨¥ ¯ ¬ï⨠Pentagon 512k ¨ ¨­¨â 3-å áâà ­¨æ vROM
; 36 - ¢ë¤¥«¥­¨¥ ¯ ¬ï⨠Scorpion 256k ¨ ¨­¨â 3-å áâà ­¨æ vROM
; 33..63 - § à¥§¥à¢¨à®¢ ­ë
;
; 64 - ®á¢®¡®¤¨âì à ¬¡«®ª¨ vROM ¨ vRAM
; 65..127 - § à¥§¥à¢¨à®¢ ­ë
;
; 128 - ¨­¨æ¨ «¨§¨à®¢ âì ᢮© ­ ¡®à áâà ­¨æ vROM
;
; ॣ HL: ¯à¨ ॣ B[7]=1  ¤à¥á áâà ­¨æ (11 èâ):
; byte1 - RAM block ID, byte2..11 - áâà ­¨æë ¤«ï vROM
; ॣ A: ­®¬¥à ZX TASK ¯®ª  çâ® ¢á¥£¤  ­®«ì!!!
;¢ë室: CF = 0: HL - ­®¬¥à  à ¬¡«®ª®¢ ¤«ï ०¨¬®¢ 0..16. H=vRAM, L=vROM
; CF = 1: A - ­®¬¥à ®è¨¡ª¨
FN_ENTRANCE:
;
;¥á«¨ áâíª ­ å®¤¨âáï ¢ âà¥â쥬 á«®â¥, â® ¢ë§®¢ á ¢ëª«î祭­ë¬¨ ¯à¥à뢠­¨ï¬¨
FN_ENTRANCE: ;!TODO A - TASK NUMBER
EXX
GET_ZX_TASK_DATA_OFFSET
ADD A,_#ZX_TASK_DATA
LD C,A
LD B,0
LD IX,SYS_PAGE.ZX_TASK.CURRENT
ADD IX,BC ; ¤ ­­ë¥ ­®¢®© § ¤ ç¨
;
LD C,SLOT3
IN B,(C)
LD A,SYS_PAGE
OUT (C),A
EXX
;
LD (SYS_PAGE.SP_SAVE),SP
LD SP,SYS_PAGE.SYS_SP
LD DE,.EXIT
PUSH DE
;-----------------------------------;
; Sub FN #8x
BIT 7,B
JR NZ,INIT_vROM ; B = 128
; Sub FN #4x
BIT 6,B
JR NZ,FREE_vMEMORY ; B = 64
; Sub FN #1x
JR NZ,GET_RAMBLOCK_IDs ; B = 16
; Sub FN #0x
DEC B
JR Z, ; B = 1
DEC B
JR Z, ; B = 2
DEC B
JR Z, ; B = 3
DEC B
JR Z, ; B = 4
;-----------------------------------;
LD A,BIOS.Error.InvalidSubFunction
SCF
RET
;
.EXIT: LD SP,(SYS_PAGE.SP_SAVE)
EXX
OUT (C),B
EXX
RET
;-----------------------------------------------------------------------;
;!FIXIT
;-----------------------------------------------------------------------;
;‚室: ---
;‚室: A - TASK NUMBER
FREE_vMEMORY: LD D,(IX + _#ZX_TASK_DATA.vROM_ID)
LD A,(IX + _#ZX_TASK_DATA.vRAM_ID)
CALL EMM.FreeMem
LD A,D
CALL EMM.FreeMem
JP RES_FLAG_ZXvROM
;-----------------------------------------------------------------------;
;-----------------------------------------------------------------------;
;‚室: A - TASK NUMBER
;‚ë室: H - vRAM block ID
; L - vROM block ID
GET_RAMBLOCK_IDs:
LD H,(IX + _#ZX_TASK_DATA.vRAM_ID)
LD L,(IX + _#ZX_TASK_DATA.vROM_ID)
RET
;-----------------------------------------------------------------------;
;!FIXIT
;-----------------------------------------------------------------------;
;‚室: HL - ¡«®ª áâà ­¨æ ­  ª®â®àë¥ ¬ ¯¯¨¬ (¢á¥£¤  10 èâ.)
FREE_vROM:
;‚室: HL - ¡«®ª áâà ­¨æ ­  ª®â®àë¥ ¬ ¯¯¨¬ (¢á¥£¤  11 èâ.)
; A - TASK NUMBER
INIT_vROM: LD A,(IX + _#ZX_TASK_DATA.vROM_ID)
CP (HL)
EX DE,HL
CALL NZ,EMM.FreeMem
EX DE,HL
;
LD A,(HL)
LD (IX + _#ZX_TASK_DATA.vROM_ID),A
INC HL
; ãáâ ­®¢ª  ¯®à⮢ ROM
LD DE,.PORTS
LD B,.PORTS.Size
.loop: PUSH BC
LD A,(HL)
INC HL
AND A
JR Z,.not_Spec_Page
LD A,Spec_Page ;!FIXIT ¨«¨ ®áâ ¢¨âì?
.not_Spec_Page: LD B,A
LD A,(DE)
INC DE
PUSH DE
PUSH HL
CALL SET_PORTS
POP HL
POP DE
POP BC
DJNZ .loop
;
RET
;
.PORTS: DB ACEX.vROM.BASIC_128 ; ROM-ID - BASIC 128
DB ACEX.vROM.BASIC_48 ; ROM-ID - BASIC 48
DB ACEX.vROM.TR_DOS ; ROM-ID - TR-DOS
DB ACEX.vROM.BIOS ; ROM-ID - EXPANSION
DB ACEX.vROM.BIOS_3 ; ROM-ID - BIOS-1
DB ACEX.vROM.BIOS_4 ; ROM-ID - BIOS-2
DB ACEX.vROM.BASIC_128_2 ; BASIC 128 - 2
DB ACEX.vROM.BASIC_48_2 ; BASIC 48 - 2
DB ACEX.vROM.TR_DOS_2 ; TR-DOS - 2
DB ACEX.vROM.BIOS_2 ; BIOS (ZX_EXP) - 2
.PORTS.Size EQU $-.PORTS
;-----------------------------------------------------------------------;
;!FIXIT
;????? ­ ¤®?
/*
;-----------------------------------------------------------------------;
;‚室: HL - ¡«®ª áâà ­¨æ ­  ª®â®àë¥ ¬ ¯¯¨¬ (¢á¥£¤  10 èâ.)
FREE_vRAM:
;-----------------------------------------------------------------------;
;!FIXIT
;-----------------------------------------------------------------------;
;‚室: B - ª®«¨ç¥á⢮ áâà ­¨æ
GET_vROM:
;-----------------------------------------------------------------------;
;!FIXIT
;-----------------------------------------------------------------------;
;‚室: HL - ¡«®ª áâà ­¨æ ­  ª®â®àë¥ ¬ ¯¯¨¬ (¢á¥£¤  10 èâ.)
INIT_vROM:
;‚室: A - TASK NUMBER
FREE_vROM: LD A,(IX + _#ZX_TASK_DATA.vROM_ID)
CALL EMM.FreeMem
PUSH AF
CALL RES_FLAG_ZXvROM
POP AF
RET
;-----------------------------------------------------------------------;
*/
/*
;-----------------------------------------------------------------------;
;‚•Ž„: HL - ᯨ᮪ áâà ­¨æ
; E - 0 = 128kb, 1 = 512kb
@ -107,7 +221,7 @@ INIT_PENT_vRAM: DI
RET
;-----------------------------------------------------------------------;
;!FIXIT ª®áïª á® á⥪®¬ ¢ SLOT3
;-----------------------------------------------------------------------;
;‚•Ž„: HL - ᯨ᮪ áâà ­¨æ
; D - ­ ç «ì­®¥ §­ ç¥­¨¥ ¤«ï 7FFD
@ -123,7 +237,7 @@ SET_7FFD: LD A,(HL)
;-----------------------------------------------------------------------;
;!FIXIT
;!FIXIT ª®áïª á® á⥪®¬ ¢ SLOT3
;‚•Ž„: HL - ᯨ᮪ áâà ­¨æ.
INIT_SCORP_vRAM:; first 128 kb
LD E,0
@ -136,28 +250,59 @@ INIT_SCORP_vRAM:; first 128 kb
OUT (C),A
RET
;-----------------------------------------------------------------------;
*/
;-----------------------------------------------------------------------;
;‚믮«­ï¥âáï ¤«ï ¨­¨â  âàñå áâà ­¨æ އ“ 48k
GET_48k_MEM: LD B,3
JP EMM.GetMem
;‚믮«­ï¥âáï ¤«ï ¢ë¤¥«¥­¨ï âàñå áâà ­¨æ އ“ 48k
GET_48k_MEM: LD D,3
JR GET_XXX_MEM
;‚믮«­ï¥âáï ¤«ï ¨­¨â  3 áâà ­¨æ އ“ 48k ¨ 29 áâà ­¨æ އ“ Pent512k
GET_512k_MEM: LD D,3+29
JR GET_XXX_MEM
;‚믮«­ï¥âáï ¤«ï ¢ë¤¥«¥­¨ï 3 áâà ­¨æ އ“ 48k ¨ 5 áâà ­¨æ އ“ 128k â ç¥ª
GET_128k_MEM: LD D,3+5
;JR GET_XXX_MEM
GET_XXX_MEM: CALL FREE_vRAM
.init: LD B,D
CALL EMM.GetMem
RET C
LD (IX + _#ZX_TASK_DATA.vRAM_ID),A
RET
;-----------------------------------------------------------------------;
;-----------------------------------------------------------------------;
;‚믮«­ï¥âáï ¤«ï ¨­¨â  3 áâà ­¨æ އ“ 48k ¨ 5 áâà ­¨æ އ“ 128k â ç¥ª
GET_128k_MEM: LD B,3+5
JP EMM.GetMem
;-----------------------------------------------------------------------;
;-----------------------------------------------------------------------;
FREE_vRAM: XOR A
LD C,A
OR (IX + _#ZX_TASK_DATA.vRAM_ID)
RET Z
LD (IX + _#ZX_TASK_DATA.vRAM_ID),C
JP EMM.FreeMem
;-----------------------------------------------------------------------;
;!FIXIT SET_TASK_POINTER
;-----------------------------------------------------------------------;
;‚믮«­ï¥âáï ¤«ï ¢ë¤¥«¥­¨ï 3 áâà ­¨æ އ“ 48k ¨ 14 áâà ­¨æ އ“ Scorp256k
;‚室: ---
;‚ë室: A - RAM block ID
GET_SCORP_RAM: IN A,(SLOT3)
LD E,A
LD A,SYS_PAGE
OUT (SLOT3),A
; ¢ë¤¥«¨âì áâà ­¨æë ᪮௠
GET_SCORP_RAM: CALL FREE_vRAM
CALL .SCORP
RET C
LD D,L
; Get Pent128 mem
LD B,3+5
CALL EMM.GetMem
; A - Pent128 mem block id
LD B,D ; Scorp128 mem block id
CALL EMM.MergeMemBlocks
LD (IX + _#ZX_TASK_DATA.vRAM_ID),A
RET
;
.SCORP: ; ¢ë¤¥«¨âì áâà ­¨æë ᪮௠
XOR A
LD DE,#F0D0 ; ¤«ï 䨫ìâà . #F0 - ¬ áª , #D0 - áâà ­¨æë ISA #D0..#DF
LD BC,8*256 + #FF ; B - ª®«¨ç¥á⢮ áâà ­¨æ, C - Œ¥âª  ª®­æ  à ¬¡«®ª 
LD HL,SYS_PAGE.RAM_TABLE
.allocate_loop: DEC L
@ -174,10 +319,8 @@ GET_SCORP_RAM: IN A,(SLOT3)
DJNZ .allocate_loop
; L = 㪠§ â¥«ì 楯®çª¨.
AND A
.exit: LD A,E
OUT (SLOT3),A
LD A,L
RET
;
; 䨫ìâà ¤«ï áâà ­¨æ ᪮௠
;¢ë室: ZF=1 - áâà ­¨æ  ­¥ ¯®¤å®¤¨â
.check_barred_pages:
@ -187,19 +330,19 @@ GET_SCORP_RAM: IN A,(SLOT3)
RET C
RET Z
; check isa page
AND #F0
XOR #D0 ; áâà ­¨æë ISA #D0..#DF
AND D
XOR E ; áâà ­¨æë ISA #D0..#DF
RET NZ
LD L,#D0
LD L,E
RET
;
.error_no_mem: PUSH DE
.error_no_mem: ;PUSH DE
LD A,C
CALL EMM.FreeMem
POP DE
LD L,BIOS.Error.EMM.NoMemory
;POP DE
LD A,BIOS.Error.EMM.NoMemory
SCF
JR .exit
RET
;-----------------------------------------------------------------------;
ENDMODULE
ENDIF
@ -255,7 +398,7 @@ GOTO_SPEC: IN A,(SLOT3)
;start_basic:
.BASIC_128: LD SP,#C000
LD HL,RES128_PROG
LD DE,ZX_VARS.PRINTER_BUFFER ; § ¯ã᪠¯à®£à ¬¬ë ­  BASIC-¥.
LD DE,ZX_VARS.PRINTER_BUFFER ; § ¯ã᪠¯à®£à ¬¬ë ­  BASIC-¥.
LD BC,RES128_PROG.Size
LDIR
DI

View File

@ -41,6 +41,16 @@ RET_FROM_BIOS_TO_BASIC48:
; ******* SERVICE *******
;-----------------------------------------------------------------------;
; ª®íä䍿¨¥­â ᬥ饭¨ï ¯® ­®¬¥àã â áª¨
MACRO GET_ZX_TASK_DATA_OFFSET
RLCA
RLCA
RLCA
RLCA
AND #30 ; ­®¢ ï § ¤ ç  0..3
ENDM
;------[ „…˜ˆ<CB86>ˆŸ ŠŽŒ€<C592><EFBFBD>މ <E28098>ŽŠˆ,<2C><EFBFBD>…„€<E2809E><E282AC>މ „‹Ÿ "EXPANSION" ]-------;
COMAND_LINE:
LD HL,(#5C5D) ;!HARDCODE CH_ADR
@ -119,12 +129,8 @@ TASK_SWITCH:
PUSH AF
LD A,(HL)
RLCA
RLCA
RLCA
RLCA
AND #30 ; ­®¢ ï § ¤ ç  0..3
LD C,A
GET_ZX_TASK_DATA_OFFSET
LD C,A
IN A,(SLOT3)
LD B,A ; 3-ï áâà ­¨æ  ⥪ã饩 § ¤ ç¨
@ -132,44 +138,32 @@ TASK_SWITCH:
OUT (SLOT3),A
LD IX,SYS_PAGE.ZX_TASK.CURRENT ; ¤ ­­ë¥ § ¤ ç
; !TEST
;LD E,(IX)
;LD D,0
;ADD IX,DE
;LD E,SYS_PAGE.CURRENT_TASK.Size
;ADD IX,DE
LD A,_#ZX_TASK_DATA ; ᬥ饭¨¥ ¤ ­­ëå ¢ â ¡«¨æ¥ § ¤ ç
ADD A,(IX) ; ᬥ饭¨¥ ¤ ­­ëå ⥪ã饩 § ¤ ç¨
LD E,A
LD D,0
ADD IX,DE ; ¤ ­­ë¥ ⥪ã饩 § ¤ ç¨
;
LD A,_#ZX_TASK_DATA ; ᬥ饭¨¥ ¤ ­­ëå ¢ â ¡«¨æ¥ § ¤ ç
ADD A,(IX) ; ᬥ饭¨¥ ¤ ­­ëå ⥪ã饩 § ¤ ç¨
LD E,A
LD D,0
ADD IX,DE ; ¤ ­­ë¥ ⥪ã饩 § ¤ ç¨
LD (IX + _#ZX_TASK_DATA.SLOT3_PAGE),B ; á®åà ­¨âì áâà ­¨æã 3
LD HL,0
ADD HL,SP
LD (IX + _#ZX_TASK_DATA.SP),L ; á®åà ­¨âì á⥪ § ¤ ç¨
LD (IX + _#ZX_TASK_DATA.SP),L ; á®åà ­¨âì á⥪ § ¤ ç¨
LD (IX + _#ZX_TASK_DATA.SP + 1),H
SET 0,(IX + _#ZX_TASK_DATA.STATE) ; ãáâ ­®¢¨âì ä« £ á®åà ­¥­­®á⨠⥪ã饩 § ¤ ç¨
RES 1,(IX + _#ZX_TASK_DATA.STATE) ; ãáâ ­®¢¨âì ä« £, çâ® § ¤ ç  ¯®ª¨­ãâ 
SET 0,(IX + _#ZX_TASK_DATA.STATE) ; ãáâ ­®¢¨âì ä« £ á®åà ­¥­­®á⨠⥪ã饩 § ¤ ç¨
RES 1,(IX + _#ZX_TASK_DATA.STATE) ; ãáâ ­®¢¨âì ä« £, çâ® § ¤ ç  ¯®ª¨­ãâ 
LD IX,SYS_PAGE.ZX_TASK.CURRENT
; !TEST
;LD E,C
;LD D,0
;ADD IX,DE ; ­®¢ ï § ¤ ç 
;LD E,16
LD A,_#ZX_TASK_DATA ; ᬥ饭¨¥ ¤ ­­ëå ¢ â ¡«¨æ¥ § ¤ ç
ADD A,C ; ᬥ饭¨¥ ¤ ­­ëå ­®¢®© § ¤ ç¨
LD E,A
LD D,0
;
LD A,_#ZX_TASK_DATA ; ᬥ饭¨¥ ¤ ­­ëå ¢ â ¡«¨æ¥ § ¤ ç
ADD A,C ; ᬥ饭¨¥ ¤ ­­ëå ­®¢®© § ¤ ç¨
LD E,A
LD D,0
ADD IX,DE ; ¤ ­­ë¥ ­®¢®© § ¤ ç¨
; BIT 1,(IX + _#ZX_TASK_DATA.STATE)
; JR NZ,TASK_IN_WORK ; § ¤ ç  ¢ à ¡®â¥ ??? ­¥¢¥à­®¥ § ¢¥à襭¨¥
; ; á¡à á뢠âì ¨«¨ ¯à®áâ® ¢®§¢à é âìáï
BIT 0,(IX + _#ZX_TASK_DATA.STATE) ; ¡ë«  á®åà ­¥­ /­¥â
BIT 0,(IX + _#ZX_TASK_DATA.STATE) ; ¡ë«  á®åà ­¥­ /­¥â
JR NZ,TASK_SET ; § ¤ ç  áãé¥áâ¢ã¥â
; § ¤ ç¨ ­¥ ¡ë«®!
@ -199,7 +193,7 @@ TASK_RESTORE:
;LD D,0
;ADD IX,DE ; ­®¢ ï § ¤ ç 
;LD E,16
ADD A,_#ZX_TASK_DATA ; ᬥ饭¨¥ ¤ ­­ëå ¢ â ¡«¨æ¥ § ¤ ç
ADD A,_#ZX_TASK_DATA ; ᬥ饭¨¥ ¤ ­­ëå ¢ â ¡«¨æ¥ § ¤ ç
LD E,A
LD D,0
;