diff --git a/Shared_Includes b/Shared_Includes index 8c5550f..809ea1f 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 8c5550f810d173790e4665d610328b9247b00f02 +Subproject commit 809ea1f0b204f2d56555497c1c808806833d6315 diff --git a/src/bios/exp/BIOS_FUNC.asm b/src/bios/exp/BIOS_FUNC.asm index c935205..6fdf73b 100644 --- a/src/bios/exp/BIOS_FUNC.asm +++ b/src/bios/exp/BIOS_FUNC.asm @@ -132,11 +132,11 @@ TAB_FNS: DB low EMM.GetMemPageNext ; #95 получить следующую страницу DB low EMM.GetBanksPorts ; #96 получить адреса портов DB low EMM.CheckColdInit ; #97 проверка на холодный старт и инициализации если он ;????? нужна ли как API? - DB low RAMD_CALC_PAGE ; #98 Fn 98h ;????? + DB low RAMD_CALC_PAGE ; #98 Вычисление страницы и адреса в RAM-Disk по абсолютному номеру сектора DB low SET_DISK_TYPE ; #99 ;????? DB low DISK_REDIR ; #9A ;????? DB low GET_RAMD_NUM ; #9B получить номер ram disk по его block id - DB low FN_RESERVED ; #9C + DB low SWAP_RAM_DRIVES ; #9C сменить набор рамдисков ZX <-> Sp2000 DB low EMM.DivMemBlocks ; #9D разделения блока на два. DB low EMM.MergeMemBlocks ; #9E слияние двух блоков DB low EMM.FullInit ; #9F инициализация всей памяти, системных переменных @@ -327,8 +327,8 @@ TAB_FNS: DB high RAMD_CALC_PAGE DB high SET_DISK_TYPE DB high DISK_REDIR - DB high FN_RESERVED - DB high FN_RESERVED + DB high GET_RAMD_NUM + DB high SWAP_RAM_DRIVES DB high EMM.DivMemBlocks DB high EMM.MergeMemBlocks DB high EMM.FullInit diff --git a/src/bios/exp/FUNC_LOW_PRINT.ASM b/src/bios/exp/FUNC_LOW_PRINT.ASM index 26a953c..c82859a 100644 --- a/src/bios/exp/FUNC_LOW_PRINT.ASM +++ b/src/bios/exp/FUNC_LOW_PRINT.ASM @@ -64,11 +64,8 @@ ;============================================================= MACRO TEST_40 ;[x] включил 31/10/23, чисто на Хэллоууууииин - EX AF,AF' - JR C,.LLL - INC D ; режим 40 -.LLL: - EX AF,AF' +; + ; ENDM diff --git a/src/bios/exp/FUNC_RAM_ROM_DRV.ASM b/src/bios/exp/FUNC_RAM_ROM_DRV.ASM index fee71f7..5e3d5ac 100644 --- a/src/bios/exp/FUNC_RAM_ROM_DRV.ASM +++ b/src/bios/exp/FUNC_RAM_ROM_DRV.ASM @@ -33,50 +33,58 @@ EMM.GetMemSize: ;----------------------------------------------------------------------; !FIXIT SAFE_RGADR ; Инициализация распределения памяти. EMM.InitMem: - PUSH BC - PUSH HL - PUSH DE + PUSH BC + PUSH HL + PUSH DE - IN A,(SLOT1) - LD C,A - LD A,SYS_PAGE - OUT (SLOT1),A - LD HL,SYS_PAGE.RAMD_FAT - #4000 - #4000 ; Адрес FAT ОЗУ. -; обнуляем таблицу + IN A,(SLOT1) + LD C,A + LD A,SYS_PAGE + OUT (SLOT1),A + LD HL,SYS_PAGE.RAMD_FAT - #4000 - #4000 ; Адрес FAT ОЗУ. + ; обнуляем таблицу + XOR A .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 + 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 + 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 - #4000 - LD B,SYS_PAGE.RAMD_KEYS.NUM -.loop2: LD (HL),0 - INC L - DJNZ .loop2 - LD A,C - OUT (SLOT1),A - - POP DE - POP HL - POP BC + 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] 4/11/23 + 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 (SLOT1),A + POP DE + POP HL + POP BC RET ;---------------------------------------------------------------------[] RESERVED_PAGES: @@ -345,38 +353,6 @@ EMM.GetMemPageNext: ; Вход: 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 - EMM.GetMemBlkPages: PUSH DE PUSH HL @@ -384,11 +360,6 @@ EMM.GetMemBlkPages: 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 @@ -397,17 +368,55 @@ EMM.GetMemBlkPages: 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: LD A,C - OUT (SLOT1),A - POP HL +.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 ;----------------------------------------------------------------------; ; @@ -843,6 +852,52 @@ GET_RAMD_NUM: ; +; +;----------------------------------------------------------------------; +; [x] 4/11/23 +; Вход: +; 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) + PUSH AF + LD A,SYS_PAGE + OUT (SLOT3),A + ; + LD A,(SYS_PAGE.CURRENT_RAM_DRV) + 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 + ; +.exit: POP AF + OUT (SLOT3),A + RET +;----------------------------------------------------------------------; +; + ; ;----------------------------------------------------------------------; diff --git a/src/bios/exp/FUNC_SYS.ASM b/src/bios/exp/FUNC_SYS.ASM index c944e05..2435101 100644 --- a/src/bios/exp/FUNC_SYS.ASM +++ b/src/bios/exp/FUNC_SYS.ASM @@ -166,11 +166,16 @@ INIT_SYS_ALL: LD HL,SYS_PAGE.RAMD_KEYS-#4000 LD DE,SYS_PAGE.RAMD_KEYS+1-#4000 - LD BC,SYS_PAGE.RAMD_KEYS.NUM-1 LD (HL),0 LDIR - + ; [x] 4/11/23 + LD HL,SYS_PAGE.Sp_RAMD_KEYS-#4000 + LD DE,SYS_PAGE.Sp_RAMD_KEYS+1-#4000 + LD BC,SYS_PAGE.Sp_RAMD_KEYS.NUM-1 + LD (HL),0 + LDIR + ; LD DE,ZG_ADDRESS ; адрес знакогенератора LD (SYS_PAGE.WIN_ZG-#4000),DE ; diff --git a/src/bios/rom/SETUP/MAIN.asm b/src/bios/rom/SETUP/MAIN.asm index 1b58272..2dc26c5 100644 --- a/src/bios/rom/SETUP/MAIN.asm +++ b/src/bios/rom/SETUP/MAIN.asm @@ -72,9 +72,9 @@ ;FDD EQU #03 -TEMP EQU #7E00 ; !HARDCODE +TEMP EQU #7E00 ; !HARDCODE MEMMAP2 EQU TEMP ; должно быть выровнено по ALIGN 256 -TPOINTD EQU TEMP-32 +TPOINTD EQU TEMP - SYS_PAGE.RAMD_KEYS.NUM - SYS_PAGE.Sp_RAMD_KEYS.NUM ; [x] 4/11/23 ;======================================= @@ -161,7 +161,7 @@ GETTIME: ; .correct_century: ; LD (HL),A ; LD D,#32 ;CENTURY -; LD C,#F7 ; !HARDCODE +; LD C,#F7 ; !HARDCODE ; RST_to_BIOS_18 POP HL @@ -237,35 +237,42 @@ CMSERR: ; LD D,13 ; LD A,#80 ; !FIXIT CMOS - ; LD C,#F7 ; !HARDCODE + ; LD C,#F7 ; !HARDCODE ; RST_to_BIOS RET -CLEARM: - IN A,(SLOT3) +CLEARM: IN A,(SLOT3) PUSH AF LD A,SYS_PAGE OUT (SLOT3),A + ; save RAM disks on reboot when memory is cleared LD HL,SYS_PAGE.RAMD_KEYS LD DE,TPOINTD LD BC,SYS_PAGE.RAMD_KEYS.NUM - LDIR + LDIR + ; [x] 4/11/23 + LD HL,SYS_PAGE.Sp_RAMD_KEYS + LD DE,TPOINTD + SYS_PAGE.RAMD_KEYS.NUM + LD BC,SYS_PAGE.Sp_RAMD_KEYS.NUM + LDIR + ; + ; очищаем RAM Table LD HL,MEMMAP2 LD DE,MEMMAP2+1 LD BC,255 LD (HL),0 LDIR - LD IX,SYS_PAGE.RAMD_KEYS ;RAM DISKS - LD H,#C2 + ; восстанавливаем RAM диски + LD IX,SYS_PAGE.RAMD_KEYS ;RAM DISKS + LD H,high SYS_PAGE.RAMD_FAT LD D,high MEMMAP2 - LD BC,#10FF -MEMLOOP: - LD A,(IX) - INC IX - OR A - LD L,A - CALL NZ,RCHAIN - DJNZ MEMLOOP + LD BC,SYS_PAGE.RAMD_KEYS.NUM*256 + #FF + CALL .MEMLOOP + ; [x] 4/11/23 + LD IX,SYS_PAGE.Sp_RAMD_KEYS + LD B,SYS_PAGE.Sp_RAMD_KEYS.NUM + CALL .MEMLOOP + ; CALL EMM.InitMem LD BC,#400E ;!HARDCODE CALL G_VALUE @@ -273,7 +280,19 @@ MEMLOOP: CALL NZ,CCHAIN POP AF OUT (SLOT3),A - RET + ;!TEST; [ ] 04/11/2023 Отдельные рамдиски для режима спектрума и DSS. BLK_TO_RAMD + LD B,high BIOS.SWAP_RAM_DRIVES.Sp2000 + JP SWAP_RAM_DRIVES + ; + ; +.MEMLOOP: + LD A,(IX) + INC IX + OR A + LD L,A + CALL NZ,RCHAIN + DJNZ .MEMLOOP + RET ; ; @@ -644,7 +663,7 @@ INFO_MESSAGE: ;!FIXIT CALL TSETUP - LD BC,#0710 ; !HARDCODE маска и ячейка для чтения значения кмос для основного загрузочного драйва + LD BC,#0710 ; !HARDCODE маска и ячейка для чтения значения кмос для основного загрузочного драйва CALL PrepareToBOOT LD A,msgStrings.bootFail LD E,COLORS.CGA.INC.LRED @@ -657,7 +676,7 @@ ABOOT: LD A,msgStrings.bootAltDrv ;CALL C,POSTMSG CALL C,POSTMSC - LD BC,#7010 ; !HARDCODE маска и ячейка для чтения значения кмос для альтернативного загрузочного драйва + LD BC,#7010 ; !HARDCODE маска и ячейка для чтения значения кмос для альтернативного загрузочного драйва CALL PrepareToBOOT LD A,msgStrings.bootFail LD E,COLORS.CGA.INC.LRED @@ -925,12 +944,12 @@ CDSTART: RDSTART: LD A,msgStrings.bootRamDrv CALL POSTMSG - LD B,#60 ; !HARDCODE: 6 - тип драйва RAM-DRV, 0 - номер драйва + LD B,#60 ; !HARDCODE: 6 - тип драйва RAM-DRV, 0 - номер драйва .loop: PUSH BC CALL OS_LOAD POP BC INC B - LD A,#6F ; !HARDCODE - максимальное число рамдисков + LD A,#6F ; !HARDCODE - максимальное число рамдисков SUB B JR NC,.loop RET @@ -1035,14 +1054,15 @@ FINSTAL: LD A,SYS_PAGE OUT (SLOT3),A LD HL,FDD_INI_TABLE.FDD_0 - LD BC,#20FF ;!HARDCODE table -FILLFDD: + LD BC,SYS_PAGE.FDD_TBL.Size*256 + #FF ; table_size*256 + fill_byte +.FILLFDD: LD (HL),C INC HL - DJNZ FILLFDD + DJNZ .FILLFDD + ; EX AF,AF' OUT (SLOT3),A - LD BC,#0311 + LD BC,#0311 ; !HARDCODE CALL G_VALUE LD HL,FD720A OR A @@ -1056,7 +1076,7 @@ SETFD0: LD A,SYS_PAGE OUT (SLOT3),A LD DE,FDD_INI_TABLE.FDD_0 - LD BC,#0008 ; !HARDCODE + LD BC,#0008 ; !HARDCODE LDIR EX AF,AF' OUT (SLOT3),A @@ -1075,7 +1095,7 @@ SETFD1: LD A,SYS_PAGE OUT (SLOT3),A LD DE,FDD_INI_TABLE.FDD_1 - LD BC,#0008 ; !HARDCODE + LD BC,#0008 ; !HARDCODE LDIR EX AF,AF' OUT (SLOT3),A @@ -1527,9 +1547,9 @@ POSTMSC: JP CPRINTZ SETLAND: - LD A,#0E ; !HARDCODE CMOS ячейка options + LD A,#0E ; !HARDCODE CMOS ячейка options CALL READCMS - AND #04 ; !HARDCODE CMOS значение языка + AND #04 ; !HARDCODE CMOS значение языка JR NZ,.RUS ; LD HL,MSG_ENG