diff --git a/Shared_Includes b/Shared_Includes index 3ac606f..e73e9f8 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 3ac606f87285e76a56c826ad33efdd26ada872f6 +Subproject commit e73e9f8d4f4e72de4f6b54abaec159684fdcebe1 diff --git a/src/bios/exp/BIOS_FUNC.asm b/src/bios/exp/BIOS_FUNC.asm index fa6f841..2a26a5a 100644 --- a/src/bios/exp/BIOS_FUNC.asm +++ b/src/bios/exp/BIOS_FUNC.asm @@ -321,7 +321,7 @@ TAB_FNS: DB high EMM.GetMemRMD DB high EMM.FreeMemRMD DB high EMM.GetMemPageRMD - DB high EMM.GetMemPageNext + DB high EMM.GetMemPageNext DB high EMM.GetBanksPorts DB high EMM.CheckColdInit DB high RAMD_CALC_PAGE diff --git a/src/bios/exp/FLEX.asm b/src/bios/exp/FLEX.asm index 4f53d96..850177d 100644 --- a/src/bios/exp/FLEX.asm +++ b/src/bios/exp/FLEX.asm @@ -36,6 +36,7 @@ DPAL2 EQU 5 ; !!! NO USE STACK !!! ; ;***************************************** +;!TODO ; инициализация страниц zx spectrum INIT_PAGES: AND A @@ -126,7 +127,7 @@ INIT_VIDEO_REG: ; EX AF,AF' - ; LD A,7 ; седьмая экранная страница + ; LD A,7 ; седьмая экранная страница ; LD BC,#7FFD ; OUT (C),A diff --git a/src/bios/exp/FUNC_RAM_ROM_DRV.ASM b/src/bios/exp/FUNC_RAM_ROM_DRV.ASM index 8668e4f..e21e467 100644 --- a/src/bios/exp/FUNC_RAM_ROM_DRV.ASM +++ b/src/bios/exp/FUNC_RAM_ROM_DRV.ASM @@ -194,13 +194,12 @@ EMM.GetMemRMD: CALL BLK_TO_RAMD RET NC .error2: - LD L,2 ; RAM-Disk занят ;!TODO перечислить все варианты ошибок и их номера как для ДСС + LD L,2 ; RAM-Disk занят ;!HARDCODE error number ;!TODO перечислить все варианты ошибок и их номера как для ДСС LD A,L RET .error1: POP HL ; чистим стек LD L,A - ;SCF RET ;----------------------------------------------------------------------; ; diff --git a/src/bios/exp/FUNC_SYS.ASM b/src/bios/exp/FUNC_SYS.ASM index 048d26c..d4a294d 100644 --- a/src/bios/exp/FUNC_SYS.ASM +++ b/src/bios/exp/FUNC_SYS.ASM @@ -279,9 +279,9 @@ INIT_CONFIG_ALL: LD DE,CNF_PORT.CNF_0 + ROM.BIOS LD (SYS_PAGE.CONFIG_DE-#4000),DE - LD HL,SYS_PAGE.TASK_DATA-#4000 ; убить все задачи - LD DE,SYS_PAGE.TASK_DATA+1-#4000 - LD BC,#FF + 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),0 LDIR diff --git a/src/bios/rom/ZX/ZX_FUNC.ASM b/src/bios/rom/ZX/ZX_FUNC.ASM index 36d4c70..cb049bd 100644 --- a/src/bios/rom/ZX/ZX_FUNC.ASM +++ b/src/bios/rom/ZX/ZX_FUNC.ASM @@ -95,7 +95,7 @@ COMAND_ISD2: CALL ISDOS JP SW_ROM_1 - +;!TODO переделать под переключение на разные спектрумы с запущенными задачами TASK_SWITCH: ; *** Сохранить задачу *** PUSH IY @@ -123,76 +123,93 @@ TASK_SWITCH: RLCA RLCA RLCA - AND #30 ; новая задача 0..3 + AND #30 ; новая задача 0..3 LD C,A IN A,(SLOT3) - LD B,A ; 3-я страница текущей задачи + LD B,A ; 3-я страница текущей задачи LD A,SYS_PAGE OUT (SLOT3),A - LD IX,SYS_PAGE.TASK_DATA ; данные задач - LD E,(IX) ; старая задача - LD D,0 - ADD IX,DE ; данные текущей задачи - LD E,16 - ADD IX,DE ; смещение данных в таблице задач - - LD (IX+1),B ; сохранить страницу 3 + LD IX,SYS_PAGE.CURRENT_TASK ; данные задач + ; !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 ; смещение данных в таблице задач + 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+2),L ; сохранить стек задачи - LD (IX+3),H - SET 0,(IX) ; установить флаг сохраненности текущей задачи - RES 1,(IX) ; установить флаг, что задача покинута + 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.TASK_DATA - LD E,C - LD D,0 - ADD IX,DE ; новая задача - LD E,16 - ADD IX,DE ; смещение данных в таблице задач + LD IX,SYS_PAGE.CURRENT_TASK + ; !TEST + ;LD E,C + ;LD D,0 + ;ADD IX,DE ; новая задача + ;LD E,16 + LD A,SYS_PAGE.CURRENT_TASK.Size ; смещение данных в таблице задач + ADD A,C ; смещение данных новой задачи + LD E,A + LD D,0 + ; + ADD IX,DE ; данные новой задачи - BIT 1,(IX) -; JR NZ,TASK_IN_WORK ; задача в работе ??? неверное завершение - ; сбрасывать или просто возвращаться + BIT 1,(IX + ZX_TASK_DATA.STATE) +; JR NZ,TASK_IN_WORK ; задача в работе ??? неверное завершение +; ; сбрасывать или просто возвращаться - BIT 0,(IX) ; была сохранена/нет - JR NZ,TASK_SET ; задача существует + BIT 0,(IX + ZX_TASK_DATA.STATE) ; была сохранена/нет + JR NZ,TASK_SET ; задача существует ; задачи не было! - LD IX,SYS_PAGE.TASK_DATA - LD A,C ; задача - LD (IX),A ; установить новую задачу текущей + LD IX,SYS_PAGE.CURRENT_TASK + LD A,C ; задача + LD (IX),A ; установить новую задачу текущей - JP SPECTRUM_TASK ; запустить новую задачу! -; и пока пофиг распределение памяти! + JP SPECTRUM_TASK ; запустить новую задачу! +; ; и пока пофиг распределение памяти! TASK_SET: LD IX,TASK_RESTORE LD A,C EXX - JP INIT_PAGES ; переключить все страницы! + JP INIT_PAGES ; переключить все страницы! TASK_RESTORE: EXX LD A,SYS_PAGE OUT (SLOT3),A LD A,C - LD IX,SYS_PAGE.TASK_DATA - LD (IX),A ; установить новую задачу текущей + LD IX,SYS_PAGE.CURRENT_TASK + LD (IX),A ; установить новую задачу текущей - LD E,A - LD D,0 - ADD IX,DE ; новая задача - LD E,16 - ADD IX,DE + ; !TEST + ;LD E,A + ;LD D,0 + ;ADD IX,DE ; новая задача + ;LD E,16 + ADD A,SYS_PAGE.CURRENT_TASK.Size ; смещение данных в таблице задач + LD E,A + LD D,0 + ; + ADD IX,DE - LD L,(IX+2) ; вспомнить стек - LD H,(IX+3) - LD SP,HL - LD A,(IX+1) ; вспомнить третью страницу - OUT (SLOT3),A + 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); вспомнить третью страницу + OUT (SLOT3),A POP AF ; восстановить