From 8b94cc4e6394a1438ac0090cfe8b23e8ee39bb4c Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Thu, 22 Aug 2024 01:19:10 +1000 Subject: [PATCH] fixed bug in EMM.FreeMem from previous commit --- src/bios/exp/EXP.asm | 13 +++-- src/bios/exp/FUNC_4x.ASM | 4 +- src/bios/exp/FUNC_RAM_ROM_DRV.ASM | 85 +++++++++++++++++++++++-------- src/bios/exp/FUNC_SCREEN.ASM | 2 +- src/bios/exp/FUNC_SERVICE.asm | 4 +- src/bios/exp/FUNC_ZX.ASM | 54 ++++++++++++++++++++ src/bios/rom/SETUP/MAIN.asm | 4 +- src/bios/rom/SETUP/messages.z80 | 4 +- 8 files changed, 133 insertions(+), 37 deletions(-) diff --git a/src/bios/exp/EXP.asm b/src/bios/exp/EXP.asm index 1b1e728..b1f573d 100644 --- a/src/bios/exp/EXP.asm +++ b/src/bios/exp/EXP.asm @@ -707,14 +707,13 @@ POST_5_OK: OUT (RGMOD),A OUT (SLOT0),A ;!HARDCODE zx page number ; !TEST 20/08/2024 - ;LD A,5 ;!HARDCODE zx page number - ;OUT (SLOT1),A - ;LD A,2 ;!HARDCODE zx page number - ;OUT (SLOT2),A - LD A,#FF ;!HARDCODE zx page number + ; LD A,5 ;!HARDCODE zx page number + ; OUT (SLOT1),A + ; LD A,2 ;!HARDCODE zx page number + ; OUT (SLOT2),A + OUT (SLOT2),A ;!HARDCODE zx page number + DEC A ; LD A,#FF ;!HARDCODE zx page number OUT (SLOT1),A - LD A,0 ;!HARDCODE zx page number - OUT (SLOT2),A ; LD A,SYS_PAGE OUT (SLOT3),A diff --git a/src/bios/exp/FUNC_4x.ASM b/src/bios/exp/FUNC_4x.ASM index a9b460c..e726ccc 100644 --- a/src/bios/exp/FUNC_4x.ASM +++ b/src/bios/exp/FUNC_4x.ASM @@ -303,7 +303,7 @@ FN_HDD_READ: LD A,SYS_PAGE OUT (SLOT3),A EX AF,AF' - LD H,high SYS_PAGE.RAMD_FAT + LD H,high SYS_PAGE.RAM_TABLE LD L,A LD A,(HL) OUT (SLOT3),A @@ -374,7 +374,7 @@ HD_WR_LOOP: LD A,SYS_PAGE OUT (SLOT3),A EX AF,AF' - LD H,high SYS_PAGE.RAMD_FAT + LD H,high SYS_PAGE.RAM_TABLE LD L,A LD A,(HL) OUT (SLOT3),A diff --git a/src/bios/exp/FUNC_RAM_ROM_DRV.ASM b/src/bios/exp/FUNC_RAM_ROM_DRV.ASM index 0db604f..708a088 100644 --- a/src/bios/exp/FUNC_RAM_ROM_DRV.ASM +++ b/src/bios/exp/FUNC_RAM_ROM_DRV.ASM @@ -11,7 +11,7 @@ EMM.GetMemSize: IN A,(SLOT1) OUT (SLOT1),A XOR A LD C,A - LD HL,SYS_PAGE.RAMD_FAT-#4000-#4000 + LD HL,SYS_PAGE.RAM_TABLE-#4000-#4000 ; .loop: DEC L JR Z,.exit @@ -58,7 +58,7 @@ EMM.InitMem: LD C,A LD A,SYS_PAGE OUT (SLOT3),A - LD HL,SYS_PAGE.RAMD_FAT ; Адрес RAM FAT в ОЗУ. + LD HL,SYS_PAGE.RAM_TABLE ; Адрес RAM FAT в ОЗУ. ; обнуляем таблицу XOR A .loopFree: @@ -85,13 +85,13 @@ EMM.InitMem: LD (HL),A ; Инициализация ключей RAM-Disks XOR A - LD HL,SYS_PAGE.RAMD_KEYS; - #4000 - #4000 + 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; - #4000 - #4000 + LD HL,SYS_PAGE.Sp_RAMD_KEYS LD B,SYS_PAGE.Sp_RAMD_KEYS.NUM .loop3: LD (HL),A INC L @@ -140,13 +140,51 @@ RESERVED_PAGES: ; Выход: 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.RAMD_FAT; - #4000 - #4000 + LD HL,SYS_PAGE.RAM_TABLE ; Цикл проверки наличия нужных блоков. XOR A .loop: DEC L @@ -159,8 +197,8 @@ EMM.GetMem: PUSH BC ; Место есть ! LD B,C ; Восстановить нужный объем диска LD C,#FF ; МЕТКА КОНЦА RAM-Disk - LD L,A ;low SYS_PAGE.RAMD_FAT; - #4000 - #4000 - ; Заполнить RAMD_FAT + LD L,A ;low SYS_PAGE.RAM_TABLE + ; Заполнить RAM_TABLE ; A = 0 .loop2: DEC L ; LD A,(HL) @@ -185,6 +223,7 @@ EMM.GetMem: PUSH BC SCF POP BC RET +*/ ;----------------------------------------------------------------------; ; @@ -244,12 +283,18 @@ EMM.FreeMemRMD: ; НЕ ПОРТИТЬ DE!!! ;EMM_FN3M: EMM.FreeMem: - AND A - SCF + ; [ ] free zx pages! теперь нельзя освободить страницу #FF + SCF + INC A + RET Z + DEC A + ;AND A + ;SCF + ; RET Z ; LD L,A - CP ZX_RAM_ID + CP ZX_RAM_ID ;!FIXIT ; [ ] free zx pages! CALL Z,SET_ROM_FLAG_ZX ; IN A,(SLOT3) @@ -257,7 +302,7 @@ EMM.FreeMem: LD A,SYS_PAGE OUT (SLOT3),A - LD H,high (SYS_PAGE.RAMD_FAT) + LD H,high (SYS_PAGE.RAM_TABLE) LD A,L EMM_F3M_L1: LD L,A @@ -308,7 +353,7 @@ EMM.GetMemPage: OUT (SLOT1),A INC B - LD H,high (SYS_PAGE.RAMD_FAT - #4000 - #4000) + LD H,high (SYS_PAGE.RAM_TABLE - #4000 - #4000) EMM_F4M_L1: LD A,(HL) AND A @@ -355,7 +400,7 @@ EMM.GetMemPageNext: OUT (SLOT1),A LD A,H - LD H,high (SYS_PAGE.RAMD_FAT - #4000 - #4000) + LD H,high (SYS_PAGE.RAM_TABLE - #4000 - #4000) LD L,(HL) OUT (SLOT1),A LD A,L @@ -395,7 +440,7 @@ EMM.GetMemBlkPages: LD C,A LD A,SYS_PAGE OUT (SLOT1),A - LD H,high (SYS_PAGE.RAMD_FAT - #4000 - #4000) + LD H,high (SYS_PAGE.RAM_TABLE - #4000 - #4000) LD L,(HL) LD A,C OUT (SLOT1),A @@ -429,7 +474,7 @@ EMM.GetMemBlkPages: ; CP #FF ; JR Z,.end ; ; -; LD H,high (SYS_PAGE.RAMD_FAT - #4000 - #4000) +; LD H,high (SYS_PAGE.RAM_TABLE - #4000 - #4000) ; LD L,(HL) ; INC B ; JR NZ,.loop @@ -528,7 +573,7 @@ BLK_RD_WR: OUT (SLOT1),A LD A,H - LD H,high (SYS_PAGE.RAMD_FAT - #4000 - #4000) + LD H,high (SYS_PAGE.RAM_TABLE - #4000 - #4000) LD L,A INC D @@ -612,7 +657,7 @@ BLK_RD_WR: IN A,(SLOT1) LD E,A - LD D,high (SYS_PAGE.RAMD_FAT - #4000 - #4000) + LD D,high (SYS_PAGE.RAM_TABLE - #4000 - #4000) LD A,SYS_PAGE OUT (SLOT1),A LD A,(DE) @@ -623,7 +668,7 @@ BLK_RD_WR: .BLK_PAGE3_X: IN A,(SLOT3) LD E,A - LD D,high SYS_PAGE.RAMD_FAT + LD D,high SYS_PAGE.RAM_TABLE LD A,SYS_PAGE OUT (SLOT3),A LD A,(DE) @@ -1074,7 +1119,7 @@ EMM.DivMemBlocks: LD A,SYS_PAGE OUT (SLOT3),A - LD H,high (SYS_PAGE.RAMD_FAT); - #4000 - #4000) + LD H,high (SYS_PAGE.RAM_TABLE); - #4000 - #4000) LD L,D LD A,(HL) LD (HL),#FF @@ -1102,7 +1147,7 @@ EMM.MergeMemBlocks: EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A - LD H,high (SYS_PAGE.RAMD_FAT); - #4000 - #4000) + LD H,high (SYS_PAGE.RAM_TABLE); - #4000 - #4000) LD L,E LD C,B LD B,0 diff --git a/src/bios/exp/FUNC_SCREEN.ASM b/src/bios/exp/FUNC_SCREEN.ASM index a397405..2a54b55 100644 --- a/src/bios/exp/FUNC_SCREEN.ASM +++ b/src/bios/exp/FUNC_SCREEN.ASM @@ -154,7 +154,7 @@ PIC_FN3_NO_2ND: EX AF,AF' OUT (SLOT2),A EX AF,AF' - LD HL,SYS_PAGE.RAMD_FAT + LD HL,SYS_PAGE.RAM_TABLE LD L,A LD A,SYS_PAGE OUT (SLOT3),A diff --git a/src/bios/exp/FUNC_SERVICE.asm b/src/bios/exp/FUNC_SERVICE.asm index a213789..07b8bc9 100644 --- a/src/bios/exp/FUNC_SERVICE.asm +++ b/src/bios/exp/FUNC_SERVICE.asm @@ -335,7 +335,7 @@ REINIT: DEC B RET NZ .ReinitZXpages: ;4 LD DE,RESERVED_PAGES ; таблица занятых системных страниц - LD HL,SYS_PAGE.RAMD_FAT ; Адрес FAT ОЗУ. + LD HL,SYS_PAGE.RAM_TABLE ; Адрес FAT ОЗУ. LD C,SLOT3 IN B,(C) @@ -364,7 +364,7 @@ REINIT: DEC B JR NC,.errorzxloop_noChanges DEC DE - LD H,high SYS_PAGE.RAMD_FAT + LD H,high SYS_PAGE.RAM_TABLE LD A,(DE) LD L,A LD A,#FF diff --git a/src/bios/exp/FUNC_ZX.ASM b/src/bios/exp/FUNC_ZX.ASM index 0cdc55b..80e1614 100644 --- a/src/bios/exp/FUNC_ZX.ASM +++ b/src/bios/exp/FUNC_ZX.ASM @@ -25,6 +25,59 @@ MANAGE_ZX_PAGES: + +.GET_SCORP: IN A,(SLOT3) + LD E,A + LD A,SYS_PAGE + OUT (SLOT3),A + ; выделить страницы скорпа + XOR A + LD BC,#08*256 + #FF ; B - количество страниц, C - Метка конца рамблока + LD HL,SYS_PAGE.RAM_TABLE +.allocate_loop: DEC L + JR Z,.error_no_mem + CP (HL) + JR NZ,.allocate_loop + ; + CALL .check_barred_pages + LD A,0 + JR Z,.allocate_loop + ; + LD (HL),C + LD C,L + DJNZ .allocate_loop + ; L = указатель цепочки. + AND A +.exit: LD A,E + OUT (SLOT3),A + LD A,L + RET + ; фильтр для страниц скорпа + ;выход: ZF=1 - страница не подходит +.check_barred_pages: + ; check reset page + LD A,L + CP RESET_PAGE + RET C + RET Z + ; check isa page + AND #F0 + XOR #D0 ; страницы ISA #D0..#DF + RET NZ + LD L,#D0 + RET + ; +.error_no_mem: PUSH DE + LD A,C + CALL EMM.FreeMem + POP DE + LD L,BIOS.Error.EMM.NoMemory + SCF + JR .exit + + +/* +; .GET_SCORP: IN A,(SLOT3) LD E,A LD A,SYS_PAGE @@ -80,6 +133,7 @@ MANAGE_ZX_PAGES: .error_no_mem: LD L,BIOS.Error.EMM.NoMemory SCF JR .exit +*/ ;-----------------------------------------------------------------------; ENDIF diff --git a/src/bios/rom/SETUP/MAIN.asm b/src/bios/rom/SETUP/MAIN.asm index effe103..0273ccd 100644 --- a/src/bios/rom/SETUP/MAIN.asm +++ b/src/bios/rom/SETUP/MAIN.asm @@ -265,7 +265,7 @@ CLEARM: IN A,(SLOT3) LDIR ; восстанавливаем RAM диски LD IX,SYS_PAGE.RAMD_KEYS ;RAM DISKS - LD H,high SYS_PAGE.RAMD_FAT + LD H,high SYS_PAGE.RAM_TABLE LD D,high MEMMAP2 LD BC,SYS_PAGE.RAMD_KEYS.NUM*256+#FF CALL .MEMLOOP @@ -1357,7 +1357,7 @@ RCHAIN: CCHAIN: LD HL,MEMMAP2 - LD DE,SYS_PAGE.RAMD_FAT + LD DE,SYS_PAGE.RAM_TABLE XOR A CCHAINC: CP (HL) diff --git a/src/bios/rom/SETUP/messages.z80 b/src/bios/rom/SETUP/messages.z80 index 596260e..abe76e7 100644 --- a/src/bios/rom/SETUP/messages.z80 +++ b/src/bios/rom/SETUP/messages.z80 @@ -5,9 +5,7 @@ ; .setXYpos EQU 3 ; .setInt EQU 4 ; .setVsinc EQU 5 -; DEFINE SPTeam_year '2022' -; DEFINE Disk_subsystem_ver_txt '3.05' -; DEFINE SetupVer '2.55' + LUA ALLPASS function get_key_for_value(t, value) for column=1,2 do