From d80b79a832b6e00bb011670ed5ecb5026b7f7f4c Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sat, 24 Aug 2024 00:33:34 +1000 Subject: [PATCH] ...temp... --- Shared_Includes | 2 +- src/ZX_ROMS/new/SP_TRDOS.bin | Bin 16384 -> 16384 bytes src/bios/exp/EXP.asm | 3 - src/bios/exp/FUNC_RAM_ROM_DRV.ASM | 1500 +++++++++++++++-------------- src/bios/exp/FUNC_SERVICE.asm | 2 +- src/bios/exp/FUNC_SYS.ASM | 40 +- src/bios/exp/FUNC_ZX.ASM | 122 ++- src/bios/rom/ZX/ZX_FUNC.ASM | 34 +- 8 files changed, 851 insertions(+), 852 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 75ceae5..e9d481a 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 75ceae51d36476f236476681aac5c7619ca22005 +Subproject commit e9d481a5565338505710b08e50d22a8579c400be diff --git a/src/ZX_ROMS/new/SP_TRDOS.bin b/src/ZX_ROMS/new/SP_TRDOS.bin index aa74f2208a9803d54460358e3409438f2cd8ab81..5a6e7c8eb9919610a7ca17be3ecba94d7837eeed 100644 GIT binary patch delta 332 zcmZo@U~Fh$++feiXgb+}^E6}oWFD?I#SYy6V_$E(0BIGOwGY%U8)4WYAZ zc@%h`UOn3(d-35}FYdEBlkK^i7*|d{#I4TwcJeFkAa73|#XjD{PngecH@#)cV{{|t zY&RE>adrZa)s2|1XX{Nrp6xbOWH@lPkK^z|?5fT_G6Cv1Wjnc@M}u+tcm(*Ua3#1{t)7D4{^oB#8hC@}8XY+?|{$~b58WYaZ_*_$2AWSAL6Hpf~nW&;3H C8hUmB delta 349 zcmZo@U~Fh$++feiXg1k_^E6|}WFD?I#&we?b9JaFFbhlk_{XcjEI5Vx>})OzNe!X1 z>v$A+pI$xNA$#%RS#R#Mxs&asp%!%vvcZa2MU$76IO z=4>|?ka2b*kJXKsuV?E`Kc4M2Rb)7DwvXfRL+q-~J~9F7IAu4vjYorV#^m)plDg-3 z9$q{tCHzl807a Rn;pz#m>ESk$679C0|1f)ecS*5 diff --git a/src/bios/exp/EXP.asm b/src/bios/exp/EXP.asm index b1f573d..43a2ba3 100644 --- a/src/bios/exp/EXP.asm +++ b/src/bios/exp/EXP.asm @@ -717,9 +717,6 @@ POST_5_OK: ; LD A,SYS_PAGE OUT (SLOT3),A -;-----------------------------------------------------------------------; - - ;-----------------------------------------------------------------------; MODULE SET_CONFIG_ID ;-------------[Save IX:IY]-------------- diff --git a/src/bios/exp/FUNC_RAM_ROM_DRV.ASM b/src/bios/exp/FUNC_RAM_ROM_DRV.ASM index 708a088..a14f567 100644 --- a/src/bios/exp/FUNC_RAM_ROM_DRV.ASM +++ b/src/bios/exp/FUNC_RAM_ROM_DRV.ASM @@ -26,7 +26,7 @@ EMM.GetMemSize: IN A,(SLOT1) OUT (SLOT1),A RET -/* + /* .loop: LD A,(HL) INC L JR Z,.exit @@ -39,7 +39,7 @@ EMM.GetMemSize: IN A,(SLOT1) LD B,0 OUT (SLOT1),A RET -*/ + */ ;----------------------------------------------------------------------; ; @@ -49,85 +49,84 @@ EMM.GetMemSize: IN A,(SLOT1) ; ;----------------------------------------------------------------------; ; Инициализация распределения памяти. -EMM.InitMem: - PUSH BC - PUSH HL - PUSH DE +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.RAM_TABLE ; Адрес RAM FAT в ОЗУ. + IN A,(SLOT3) + LD C,A + LD A,SYS_PAGE + OUT (SLOT3),A + LD HL,SYS_PAGE.RAM_TABLE ; Адрес RAM FAT в ОЗУ. ; обнуляем таблицу - XOR A + XOR A .loopFree: - LD (HL),A - INC L - JR NZ,.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 + 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 + INC DE + DJNZ .loop + LD L,A + LD (HL),A ; Инициализация ключей RAM-Disks - XOR A - LD HL,SYS_PAGE.RAMD_KEYS - LD B,SYS_PAGE.RAMD_KEYS.NUM -.loop2: LD (HL),A - INC L - DJNZ .loop2 + XOR A + 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 - LD B,SYS_PAGE.Sp_RAMD_KEYS.NUM -.loop3: LD (HL),A - INC L - DJNZ .loop3 + LD HL,SYS_PAGE.Sp_RAMD_KEYS + 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 + 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 + DB 1,3,4,6,7,8,9,10,11,12,13,14,15 ; for Spectrum ;!FIXIT страницы 16..31 не зарезервированы, но используются в Pentagon 512 ; ; эмулятор ПЗУ ;!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 + 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 + 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 #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 + 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 +.Blocks EQU 2 ;----------------------------------------------------------------------; ; @@ -177,7 +176,7 @@ EMM.GetMem: PUSH BC -/* + /* EMM.GetMem: PUSH BC IN A,(SLOT3) EX AF,AF' @@ -223,7 +222,7 @@ EMM.GetMem: PUSH BC SCF POP BC RET -*/ + */ ;----------------------------------------------------------------------; ; @@ -231,99 +230,103 @@ EMM.GetMem: PUSH BC ; ;----------------------------------------------------------------------; -; Получить блок памяти N bytes, для RAM-Disk A -; Вход: B - число необходимых блоков, A - RAM-Disk -; Выход: L,A - КЛЮЧ RAM-Disk/код ошибки -; CF - признак ошибки +; Получить блок памяти 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,BIOS.Error.BadNumber ; RAM-Disk занят - LD A,L - RET -.error1: - POP HL ; чистим стек - LD L,A - RET +EMM.GetMemRMD: PUSH AF + CALL EMM.GetMem + JR C,.error1 + ; + LD B,A + POP AF + CALL BLK_TO_RAMD + RET NC + ; +.error2: LD L,BIOS.Error.BadNumber ; RAM-Disk занят + LD A,L + RET + ; +.error1: POP HL ; чистим стек + LD L,A + 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 +; Освободить блок памяти ключа 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 + LD (HL),0 + LD A,B + OUT (SLOT3),A + LD A,C ;JR EMM.FreeMem ;------[ ; Освободить блок памяти ; Вход: A - НАЧАЛО ЦЕПОЧКИ ; НЕ ПОРТИТЬ DE!!! ;EMM_FN3M: -EMM.FreeMem: - ; [ ] free zx pages! теперь нельзя освободить страницу #FF - SCF - INC A - RET Z - DEC A - ;AND A - ;SCF - ; - RET Z - ; - LD L,A - CP ZX_RAM_ID ;!FIXIT ; [ ] free zx pages! - CALL Z,SET_ROM_FLAG_ZX - ; - IN A,(SLOT3) - EX AF,AF' - LD A,SYS_PAGE - OUT (SLOT3),A +EMM.FreeMem: ; [ ] free zx pages! теперь нельзя освободить страницу #FF + SCF + INC A + RET Z + DEC A + ;AND A + ;SCF + ; + RET Z + ; + LD C,A + CP ZX_RAM_ID ;!FIXIT ; [ ] free zx pages! + CALL Z,RES_FLAG_ZXvROM + ; + IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A - LD H,high (SYS_PAGE.RAM_TABLE) - 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 ; продолжать + LD H,high SYS_PAGE.RAM_TABLE + LD A,C +.loop: LD L,A + LD A,(HL) ; следующий блок + AND A + JR Z,.error + LD (HL),0 ; Освободить + CP #FF ; Если не конец + JR NZ,.loop ; продолжать - EX AF,AF' - OUT (SLOT3),A - XOR A ; no error code - RET + ; !TEST 23/08/2024 восстановление цепочки если освобождали не с начала + LD A,C + LD L,0 + LD BC,256 + CPIR + JR NZ,.exit + DEC HL + LD (HL),#FF + ; +.exit: 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 +.error: EX AF,AF' + OUT (SLOT3),A + LD A,BIOS.Error.BadNumber + SCF + RET ;----------------------------------------------------------------------; ; @@ -335,10 +338,10 @@ EMM_FN3M_ERR: ; Вход: A - КЛЮЧ RAM-Disk, B - номер страницы ; Выход: A - страница EMM.GetMemPageRMD: - CALL GET_RAMD_ST - RET C - SCF - RET Z + CALL GET_RAMD_ST + RET C + SCF + RET Z ;JR EMM.GetMemPage ;------[ ; Получить страницу N блока K @@ -346,37 +349,37 @@ EMM.GetMemPageRMD: ; Выход: 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 + LD L,A + IN A,(SLOT1) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT1),A - INC B - LD H,high (SYS_PAGE.RAM_TABLE - #4000 - #4000) + INC B + LD H,high (SYS_PAGE.RAM_TABLE-#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 + 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 + 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 + EX AF,AF' + OUT (SLOT1),A + LD A,L + AND A + RET ;----------------------------------------------------------------------; ; @@ -385,31 +388,31 @@ EMM_F4M_END: ; ;----------------------------------------------------------------------; ; Получить следующую страницу по FAT -; Вход: A - страница ОЗУ +; Вход: A - страница ОЗУ ; Выход: A - следующая страница ОЗУ ;EMM_FN5: EMM.GetMemPageNext: - LD L,A - AND A - SCF - RET Z + LD L,A + AND A + SCF + RET Z - IN A,(SLOT1) - LD H,A - LD A,SYS_PAGE - OUT (SLOT1),A + IN A,(SLOT1) + LD H,A + LD A,SYS_PAGE + OUT (SLOT1),A - LD A,H - LD H,high (SYS_PAGE.RAM_TABLE - #4000 - #4000) - LD L,(HL) - OUT (SLOT1),A - LD A,L - AND A - SCF - RET Z + LD A,H + LD H,high (SYS_PAGE.RAM_TABLE-#4000-#4000) + LD L,(HL) + OUT (SLOT1),A + LD A,L + AND A + SCF + RET Z - AND A - RET + AND A + RET ;----------------------------------------------------------------------; ; @@ -422,36 +425,36 @@ EMM.GetMemPageNext: ; Выход: HL - адрес блока, B - длина блока в страницах ОЗУ ;EMM_FN5M: EMM.GetMemBlkPages: - PUSH DE - PUSH HL - EX DE,HL - LD B,0 - LD L,A + 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 +.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.RAM_TABLE - #4000 - #4000) - LD L,(HL) - LD A,C - OUT (SLOT1),A + IN A,(SLOT1) + LD C,A + LD A,SYS_PAGE + OUT (SLOT1),A + LD H,high (SYS_PAGE.RAM_TABLE-#4000-#4000) + LD L,(HL) + LD A,C + OUT (SLOT1),A ; - INC B - JR NZ,.loop + INC B + JR NZ,.loop -.error: SCF -.end: POP HL - POP DE - RET +.error: SCF +.end: POP HL + POP DE + RET ; RAMDRV.EXE вызывает эту функцию с адресом в SLOT1, поэтому лучше так не оптимизировать ; EMM.GetMemBlkPages: @@ -474,7 +477,7 @@ EMM.GetMemBlkPages: ; CP #FF ; JR Z,.end ; ; -; LD H,high (SYS_PAGE.RAM_TABLE - #4000 - #4000) +; LD H,high +(SYS_PAGE.RAM_TABLE - #4000 - #4000) ; LD L,(HL) ; INC B ; JR NZ,.loop @@ -490,6 +493,312 @@ EMM.GetMemBlkPages: +; +;----------------------------------------------------------------------; +; разделить блок памяти на два блока +; 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.RAM_TABLE); - #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.RAM_TABLE + LD C,B + LD B,0 +.ADD_L: LD A,(HL) + AND A + JR Z,.ADD_ERR + CP #FF + JR Z,.ADD_NEXT + LD L,A + DJNZ .ADD_L + +.ADD_ERR: + EX AF,AF' + OUT (SLOT3),A + SCF + RET + +.ADD_NEXT: + LD A,C + AND A + JR Z,.ADD_ERR + LD (HL),A + EX AF,AF' + OUT (SLOT3),A + AND A + LD A,E + RET +;----------------------------------------------------------------------; +; + + + +; +;----------------------------------------------------------------------; +; вход: DE - ram_disk trk_sec, A - RAM-Disk +; выход: HL - адрес, A - page +RAMD_CALC_PAGE: + CP 16 + CCF + RET C ; НЕТ ТАКОГО 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 ; ПОЛУЧИТЬ СТРАНИЦУ + 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 +;----------------------------------------------------------------------; +; + + + ; ;----------------------------------------------------------------------; !FIXIT SAFE_RGADR ;RAMD_R_W: @@ -505,201 +814,201 @@ EMM.GetMemBlkPages: ; ╚════════════════════════════════════════════════╝\ ; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ BLK_RD_WR: - AND A - SCF - RET Z + AND A + SCF + RET Z ; - AND A - INC B - DEC B - RET Z + AND A + INC B + DEC B + RET Z ; ; сохраняем состояние прерываний - LD C,A - LD A,R - PUSH AF + LD C,A + LD A,R + PUSH AF ; сохраняем PORT_Y - IN A,(PORT_Y) - PUSH AF - LD A,#C0 - OUT (PORT_Y),A + IN A,(PORT_Y) + PUSH AF + LD A,#C0 + OUT (PORT_Y),A ; - LD A,C - DI - CALL .start - EX AF,AF' + LD A,C + DI + CALL .start + EX AF,AF' ; восстанавливаем PORT_Y - POP AF - OUT (PORT_Y),A + POP AF + OUT (PORT_Y),A ; восстанавливаем состояние прерываний - POP AF - JP PO,.noInterrupts - EI + POP AF + JP PO,.noInterrupts + EI .noInterrupts: - EX AF,AF' - RET + 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 +.start: EX AF,AF' + AND A ; 0 - read + JR Z,.reset_Z + CP #FF ; write + JR Z,.keep_Z - CP #46 - JP Z,ROM_DISK + CP 5 ; old read + JR Z,.reset_Z + CP 6 ; old write + JR Z,.keep_Z - EX AF,AF' - SCF - RET + CP #46 + JP Z,ROM_DISK + + EX AF,AF' + SCF + RET .reset_Z: - INC A ; set Z for WRITE + INC A ; set Z for WRITE .keep_Z: - EX AF,AF' + 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 + 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.RAM_TABLE - #4000 - #4000) - LD L,A + LD H,high +(SYS_PAGE.RAM_TABLE-#4000-#4000) + LD L,A - INC D + INC D .RAMD_LOOP_D: - DEC D - JR Z,.NOT_FOUR_BLK - LD L,(HL) - LD L,(HL) - LD L,(HL) - LD L,(HL) - JP .RAMD_LOOP_D + DEC D + JR Z,.NOT_FOUR_BLK + LD L,(HL) + LD L,(HL) + LD L,(HL) + LD L,(HL) + JP .RAMD_LOOP_D .NOT_FOUR_BLK: - LD A,E -.loop: SUB #40 - JR C,.NOT_ONE_BLK - LD L,(HL) - JP .loop + LD A,E +.loop: SUB #40 + JR C,.NOT_ONE_BLK + LD L,(HL) + JP .loop .NOT_ONE_BLK: - AND #3F - LD D,A ; DE - ADRESS in RAM-Disk - LD E,0 + AND #3F + LD D,A ; DE - ADRESS in RAM-Disk + LD E,0 - LD A,L ; L - текущий банк RAM-Disk + LD A,L ; L - текущий банк RAM-Disk - OUT (C),B ; восстановить страницу + OUT (C),B ; восстановить страницу - POP BC ; длина данных - POP HL ; адрес буфера + POP BC ; длина данных + POP HL ; адрес буфера - BIT 7,H - JR NZ,.BLK_PAGE1 + BIT 7,H + JR NZ,.BLK_PAGE1 - LD C,SLOT3 - IN C,(C) - OUT (SLOT3),A - SET 7,D - SET 6,D - JP .BLK_CONT1 + LD C,SLOT3 + IN C,(C) + OUT (SLOT3),A + SET 7,D + SET 6,D + JP .BLK_CONT1 .BLK_PAGE1: - LD C,SLOT1 - IN C,(C) - OUT (SLOT1),A - RES 7,D - SET 6,D + 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 + EX AF,AF' + JR Z,.NO_EX_RW1 ; WRITE + EX DE,HL ; for READ .NO_EX_RW1: - EX AF,AF' + EX AF,AF' - LD A,16 + LD A,16 .BLK_LL1: - DUP 16 - LDI + DUP 16 + LDI EDUP - - DEC A - JR NZ,.BLK_LL1 - EX AF,AF' - JR Z,.NO_EX_RW2 ; WRITE - EX DE,HL ; for READ + 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 раз и вернулся + EX AF,AF' ; DEC C прокрутился 256 раз и вернулся ; A = 0 ;INC B ; B уже уменьшился на 1, ;DEC B - CP B - JP Z,.BLK_EXIT_1 + CP B + JP Z,.BLK_EXIT_1 - BIT 6,D - JP NZ,.BLK_CONT1 + BIT 6,D + JP NZ,.BLK_CONT1 - BIT 7,D - JR Z,.BLK_PAGE3_X + BIT 7,D + JR Z,.BLK_PAGE3_X - IN A,(SLOT1) - LD E,A - LD D,high (SYS_PAGE.RAM_TABLE - #4000 - #4000) - LD A,SYS_PAGE - OUT (SLOT1),A - LD A,(DE) - OUT (SLOT1),A - LD DE,#4000 - JP .BLK_CONT1 + IN A,(SLOT1) + LD E,A + LD D,high +(SYS_PAGE.RAM_TABLE-#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.RAM_TABLE - LD A,SYS_PAGE - OUT (SLOT3),A - LD A,(DE) - OUT (SLOT3),A - LD DE,#C000 + IN A,(SLOT3) + LD E,A + LD D,high SYS_PAGE.RAM_TABLE + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,(DE) + OUT (SLOT3),A + LD DE,#C000 - BIT 7,H - JP Z,.BLK_CONT1 + 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 + 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 + 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 + OUT (SLOT3),A + AND A + RET ;----------------------------------------------------------------------; ; @@ -729,26 +1038,26 @@ BLK_RD_WR: ROM_DISK: ; сохраняем состояние прерываний ;LD A,R - EX AF,AF' - LD C,0 ; счетчик - DEC A - JR Z,.loop + EX AF,AF' + LD C,0 ; счетчик + DEC A + JR Z,.loop ;JR Z,.start - DEC A - SCF - RET NZ + DEC A + SCF + RET NZ - EX DE,HL - ADD HL,HL - EX DE,HL - LD A,B - ADD A,A - LD B,A + EX DE,HL + ADD HL,HL + EX DE,HL + LD A,B + ADD A,A + LD B,A ;!!!!! - RET C + RET C - DI - CALL .loop + DI + CALL .loop ; ; восстанавливаем состояние прерываний ; EX AF,AF' ; JP PO,.noInterrupts @@ -756,12 +1065,12 @@ ROM_DISK: ; .noInterrupts: ; EX AF,AF' ; ; - RET C - AND A - RR D - RR E - XOR A - RET + RET C + AND A + RR D + RR E + XOR A + RET ; .start: ; DI @@ -776,405 +1085,98 @@ ROM_DISK: ; RET -.loop: PUSH DE ; номер сектора - PUSH BC +.loop: PUSH DE ; номер сектора + PUSH BC - LD A,E - AND #3F ; ADRESS in ROM-Page - PUSH AF ; сохранить адрес + LD A,E + AND #3F ; ADRESS in ROM-Page + PUSH AF ; сохранить адрес - EX DE,HL ; DE - адрес буфера - ADD HL,HL - ADD HL,HL ; H - номер банки + 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 + 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 + 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 ; куда + PUSH HL ; откуда + PUSH DE ; куда - LD HL,-.stackDepth - .readProcedure.size ; memory stack use! - ADD HL,SP ; stack + LD HL,-.stackDepth-.readProcedure.size ; memory stack use! + ADD HL,SP ; stack - PUSH HL ; адрес программы .readProcedure + PUSH HL ; адрес программы .readProcedure - LD DE,.readProcedure ; перенести программу на стек - EX DE,HL - LD BC,.readProcedure.size - LDIR ; программа на стеке - LD BC,#100 ; длина сектора - RET ; исполнить программу .readProcedure, на стеке адреса буфера и ROM + 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 ; число секторов + POP BC ; число секторов - INC C ; счетчик считанных секторов - DEC B ; сектора кончились? + INC C ; счетчик считанных секторов + DEC B ; сектора кончились? - JR Z,.normExit - BIT 6,H ; чтение не закончено + JR Z,.normExit + BIT 6,H ; чтение не закончено - PUSH BC ; сохранить счетчики - JR Z,.loopRead ; читать дальше - POP BC + PUSH BC ; сохранить счетчики + JR Z,.loopRead ; читать дальше + POP BC - POP HL ; номер сектора + POP HL ; номер сектора - LD A,B - LD B,0 - ADD HL,BC - LD B,A ; вычислить след.сектор + LD A,B + LD B,0 + ADD HL,BC + LD B,A ; вычислить след.сектор - EX DE,HL ; теперь HL - адрес, DE сектор, B - сколько еще читать + EX DE,HL ; теперь HL - адрес, DE сектор, B - сколько еще читать - JP .loop ; начать все снова! + JP .loop ; начать все снова! ; чтение закончено .normExit: - POP HL ; сектор, откуда велось чтение - ADD HL,BC ; по возврату: HL - след.адрес - EX DE,HL ; DE - след.сектор - AND A - RET + POP HL ; сектор, откуда велось чтение + ADD HL,BC ; по возврату: HL - след.адрес + EX DE,HL ; DE - след.сектор + AND A + RET ; ошибка .errorExit: ; !TODO сделать, чтоб на выходе показывалось количество прочитанных секторов - POP BC - POP DE - SCF - RET + 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 ; расстояние от конца процедуры до вершины стека. + 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 ; НЕТ ТАКОГО 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 ; ПОЛУЧИТЬ СТРАНИЦУ - 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.RAM_TABLE); - #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.RAM_TABLE); - #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 -;----------------------------------------------------------------------; ; \ No newline at end of file diff --git a/src/bios/exp/FUNC_SERVICE.asm b/src/bios/exp/FUNC_SERVICE.asm index 07b8bc9..c2f83a2 100644 --- a/src/bios/exp/FUNC_SERVICE.asm +++ b/src/bios/exp/FUNC_SERVICE.asm @@ -428,7 +428,7 @@ REINIT: DEC B ; ;----------------------------------------------------------------------; ; не должно портить DE -SET_ROM_FLAG_ZX: +RES_FLAG_ZXvROM: EX AF,AF' IN A,(SLOT3) EX AF,AF' diff --git a/src/bios/exp/FUNC_SYS.ASM b/src/bios/exp/FUNC_SYS.ASM index ed0c850..f9a5cf9 100644 --- a/src/bios/exp/FUNC_SYS.ASM +++ b/src/bios/exp/FUNC_SYS.ASM @@ -47,7 +47,7 @@ FN_VERSION: EX AF,AF' LD A,SYS_PAGE OUT (SLOT2),A - LD BC,(SYS_PAGE.CONFIG_BYTE-#4000) ; Version PLD ; !TODO через структуру для переменных биоса + LD BC,(SYS_PAGE.CONFIG_BYTE - #4000) ; Version PLD ; !TODO через структуру для переменных биоса EX AF,AF' OUT (SLOT2),A LD A,ID_SPRINTER.Records_Num ; Число полей @@ -183,6 +183,12 @@ EMM.FullInit: OUT (SLOT2),A INIT_SYS_ALL: DI + ; LD HL,#8000 + ; LD DE,#8001 + ; LD (HL),0 + ; LD BC,#3FFF + ; LDIR + ; ; LD HL,ID_SPRINTER_FullSize ; LD DE,SYS_PAGE.ID_FLAG - #4000 ; LD C,(HL) @@ -199,7 +205,7 @@ INIT_SYS_ALL: ; ;!TODO что за переменные? - LD HL,SYS_PAGE.DISK_TYPE-#4000 + LD HL,SYS_PAGE.DISK_TYPE - #4000 LD (HL),DRIVE_CODES.TRDOS.FDD ; FDD A INC HL LD (HL),DRIVE_CODES.TRDOS.FDD + 1 ; FDD B @@ -217,28 +223,28 @@ INIT_SYS_ALL: LD (HL),0 ; SYS_PAGE.COPY_SLOT3 LD A,9 - LD (SYS_PAGE.MSD_SECS-#4000),A + LD (SYS_PAGE.MSD_SECS - #4000),A XOR A - LD (SYS_PAGE.DS_1440-#4000),A + LD (SYS_PAGE.DS_1440 - #4000),A - LD HL,SYS_PAGE.RAMD_KEYS-#4000 - LD DE,SYS_PAGE.RAMD_KEYS+1-#4000 + 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] 04/11/2023 - LD HL,SYS_PAGE.Sp_RAMD_KEYS-#4000 - LD DE,SYS_PAGE.Sp_RAMD_KEYS+1-#4000 + 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 ; ; [x] 17/08/2024 fixed bug with change current RAM drives type XOR A - LD (SYS_PAGE.CURRENT_RAM_DRV-#4000),A + LD (SYS_PAGE.CURRENT_RAM_DRV - #4000),A ; LD DE,ZG_ADDRESS ; адрес знакогенератора - LD (SYS_PAGE.WIN_ZG-#4000),DE + LD (SYS_PAGE.WIN_ZG - #4000),DE ; ;-----------[new code start]------------; !!!!! посмотреть-причесать INIT_VSyncAndWaits: @@ -248,7 +254,7 @@ INIT_VSyncAndWaits: jr nc,.cmos_OK ; если нет CMOS, то стандартные настройки ld a,3 - ld (SYS_PAGE.VSyncAndWaits-#4000),A + ld (SYS_PAGE.VSyncAndWaits - #4000),A jr z,INIT_CONFIG_ALL.setDefaultINT .cmos_OK: @@ -259,7 +265,7 @@ INIT_VSyncAndWaits: dec a ; 312 lines & no waits .setVSyncAndWaits: - ld (SYS_PAGE.VSyncAndWaits-#4000),A + ld (SYS_PAGE.VSyncAndWaits - #4000),A INIT_CONFIG_ALL: ld a,d @@ -277,15 +283,15 @@ INIT_CONFIG_ALL: .setDefaultINT: LD HL,SCREEN_TABLES.PENTAGON ; set pentagon int .setINT: - LD (SYS_PAGE.CONFIG_ALL-#4000),HL + LD (SYS_PAGE.CONFIG_ALL - #4000),HL ;------------[new code end]------------- ; LD DE,CNF_PORT.CNF_0 + ROM.BIOS - LD (SYS_PAGE.CONFIG_DE-#4000),DE + LD (SYS_PAGE.CONFIG_DE - #4000),DE - LD HL,SYS_PAGE.CURRENT_TASK - #4000 ; убить все задачи - LD DE,SYS_PAGE.CURRENT_TASK+1 - #4000 - LD BC,ZX_TASK_DATA * SYS_PAGE.CURRENT_TASK.Size - 1 ; #FF + LD HL,SYS_PAGE.ZX_TASK.CURRENT - #4000 ; убить все задачи + LD DE,SYS_PAGE.ZX_TASK.CURRENT+1 - #4000 + LD BC,_#ZX_TASK - 1 LD (HL),0 LDIR diff --git a/src/bios/exp/FUNC_ZX.ASM b/src/bios/exp/FUNC_ZX.ASM index 80e1614..813ab8a 100644 --- a/src/bios/exp/FUNC_ZX.ASM +++ b/src/bios/exp/FUNC_ZX.ASM @@ -9,10 +9,13 @@ ; ; _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ [___FOR ZX-MODE___] _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ ; - +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; ; [ ] free zx pages! ; ????? SYS_PAGE.SHARED_BUFFER_256b +; +; [ ] Страница ОЗУ для скорпа в SLOT0 должна совпадать с нулевой страницей порта #7FFD IF FREE_ZX_PAGES + MODULE MANAGE_ZX_PAGES ;----------------[Выделение/освобождение страниц спектрума]-------------; ;вход: рег B: 0 - инит памяти Spectrum 48k ; 1 - инит памяти Pentagon 128k @@ -22,17 +25,65 @@ ; ;выход: CF = 0: A - номер рамблока ; CF = 1: A - номер ошибки -MANAGE_ZX_PAGES: +FN_ENTRANCE: +;-----------------------------------------------------------------------; + + +;-----------------------------------------------------------------------; +;Выполняется всегда для инита трёх страниц ОЗУ +INIT_48k_MEM: + +;-----------------------------------------------------------------------; + +;-----------------------------------------------------------------------; +INIT_SCORP_RAM: + DI + LD A,5 + OUT (SLOT1),A + ; #1FFD + LD BC,#1FFD + XOR A + OUT (SLOT0),A + OUT (C),A + ; #7FFD + LD B,#7F + LD A,8 +LOOP_P1: DEC A + OUT (C),A + OUT (SLOT3),A + JR NZ,LOOP_P1 + ; #1FFD + LD B,#1F + LD A,#10 + OUT (C),A + ; #7FFD + LD B,#7F + LD A,8 +LOOP_P2: OUT (C),A + OUT (SLOT3),A + INC A + CP 16 + JR NZ,LOOP_P2 + ; + XOR A + OUT (C),A + ; #1FFD + LD B,#1F + OUT (C),A +;-----------------------------------------------------------------------; -.GET_SCORP: IN A,(SLOT3) +;-----------------------------------------------------------------------; +;Вход: --- +;Выход: A - RAM block ID +GET_SCORP_RAM: IN A,(SLOT3) LD E,A LD A,SYS_PAGE OUT (SLOT3),A ; выделить страницы скорпа XOR A - LD BC,#08*256 + #FF ; B - количество страниц, C - Метка конца рамблока + LD BC,8*256 + #FF ; B - количество страниц, C - Метка конца рамблока LD HL,SYS_PAGE.RAM_TABLE .allocate_loop: DEC L JR Z,.error_no_mem @@ -74,68 +125,11 @@ MANAGE_ZX_PAGES: LD L,BIOS.Error.EMM.NoMemory SCF JR .exit - - -/* -; -.GET_SCORP: IN A,(SLOT3) - LD E,A - LD A,SYS_PAGE - OUT (SLOT3),A - ; проверить наличие свободных страниц скорпа - ; B = количество страниц - LD B,8 - XOR A -.check_loop: DEC L - JR Z,.error_no_mem - CP (HL) - JR NZ,.check_loop - ; - CALL .check_barred_pages - LD A,0 - JR Z,.check_loop - DJNZ .check_loop - ; A = 0 - ; выделить страницы скорпа - LD B,8 -.allocate_loop: DEC L - 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: LD L,BIOS.Error.EMM.NoMemory - SCF - JR .exit -*/ ;-----------------------------------------------------------------------; + ENDMODULE ENDIF +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; + ;-----------------------------------------------------------------------; diff --git a/src/bios/rom/ZX/ZX_FUNC.ASM b/src/bios/rom/ZX/ZX_FUNC.ASM index 54d429d..5a2fcf9 100644 --- a/src/bios/rom/ZX/ZX_FUNC.ASM +++ b/src/bios/rom/ZX/ZX_FUNC.ASM @@ -131,49 +131,49 @@ TASK_SWITCH: LD A,SYS_PAGE OUT (SLOT3),A - LD IX,SYS_PAGE.CURRENT_TASK ; данные задач + 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,SYS_PAGE.CURRENT_TASK.Size ; смещение данных в таблице задач + 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 (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 + 1),H - SET 0,(IX + ZX_TASK_DATA.STATE) ; установить флаг сохраненности текущей задачи - RES 1,(IX + ZX_TASK_DATA.STATE) ; установить флаг, что задача покинута + 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) ; установить флаг, что задача покинута - LD IX,SYS_PAGE.CURRENT_TASK + LD IX,SYS_PAGE.ZX_TASK.CURRENT ; !TEST ;LD E,C ;LD D,0 ;ADD IX,DE ; новая задача ;LD E,16 - LD A,SYS_PAGE.CURRENT_TASK.Size ; смещение данных в таблице задач + LD A,_#ZX_TASK_DATA ; смещение данных в таблице задач ADD A,C ; смещение данных новой задачи LD E,A LD D,0 ; ADD IX,DE ; данные новой задачи - BIT 1,(IX + ZX_TASK_DATA.STATE) +; 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 ; задача существует ; задачи не было! - LD IX,SYS_PAGE.CURRENT_TASK + LD IX,SYS_PAGE.ZX_TASK.CURRENT LD A,C ; задача LD (IX),A ; установить новую задачу текущей @@ -191,7 +191,7 @@ TASK_RESTORE: LD A,SYS_PAGE OUT (SLOT3),A LD A,C - LD IX,SYS_PAGE.CURRENT_TASK + LD IX,SYS_PAGE.ZX_TASK.CURRENT LD (IX),A ; установить новую задачу текущей ; !TEST @@ -199,16 +199,16 @@ TASK_RESTORE: ;LD D,0 ;ADD IX,DE ; новая задача ;LD E,16 - ADD A,SYS_PAGE.CURRENT_TASK.Size ; смещение данных в таблице задач + ADD A,_#ZX_TASK_DATA ; смещение данных в таблице задач LD E,A LD D,0 ; ADD IX,DE - LD L,(IX + ZX_TASK_DATA.SP) ; вспомнить стек - LD H,(IX + ZX_TASK_DATA.SP + 1) + LD L,(IX + _#ZX_TASK_DATA.SP) ; вспомнить стек + LD H,(IX + _#ZX_TASK_DATA.SP + 1) LD SP,HL - LD A,(IX + ZX_TASK_DATA.SLOT3_PAGE); вспомнить третью страницу + LD A,(IX + _#ZX_TASK_DATA.SLOT3_PAGE); вспомнить третью страницу OUT (SLOT3),A