diff --git a/Shared_Includes b/Shared_Includes index 38c3f62..520455d 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 38c3f62f6d7fa9f4c977eb23e3ff9ea7bf3638f0 +Subproject commit 520455dbdc4c10f1850fd697aa5be4703d6cfd27 diff --git a/src/bios/exp/EXP.asm b/src/bios/exp/EXP.asm index 5c6665e..7f108c5 100644 --- a/src/bios/exp/EXP.asm +++ b/src/bios/exp/EXP.asm @@ -71,6 +71,35 @@ RST_30: BLOCK #38-$,0 ; INTERUPT Point RST38: + IF TEST_INT + ;INT: + PUSH BC + PUSH AF + + LD C,SLOT3 + IN B,(C) + LD A,SYS_PAGE + OUT (C),A + + LD A,(SYS_PAGE.INT_ID) + CP #AA + JR Z,YESINT + OUT (C),B + JR NOINT +YESINT: PUSH HL + LD HL,(SYS_PAGE.INT_ADRESS) + LD A,H + OR L + LD A,(SYS_PAGE.INT_PAGE) + OUT (C),B + PUSH DE + CALL NZ,EXTINT + POP DE + POP HL +NOINT: POP AF + POP BC + ENDIF + EI RETI @@ -81,10 +110,11 @@ RST38: ;======================================= + IFN TEST_INT _mInfoALIGN #10,0 -;TABLE_X EQU #A0 ; any adress < #C0 with mask %xxxx0000 -; BLOCK TABLE_X-$ -TABLE_X: ; таблица для Sprinter POST-Tester-a +; any adress < #C0 with mask %xxxx0000 +; таблица для Sprinter POST-Tester-a +TABLE_X: .v0: DB 00101000b ; "0" .v1: DB 10111101b ; "1" .v2: DB 00110010b ; "2" @@ -101,7 +131,13 @@ TABLE_X: ; таб .vD: DB 10110000b ; "D" .vE: DB 01100010b ; "E" .vF: DB 01100011b ; "F" + ENDIF ;======================================= +; + +; +;======================================= + IFN TEST_INT RESTARTS EQU #FFE0 ; !FIXIT вынести в SP2000.inc GLOBAL_RESET: DI @@ -117,16 +153,15 @@ GLOBAL_RESET: INC DE DJNZ .compare JP RESTARTS + ENDIF ;======================================= _mInfoBLOCK #66-$,0 - NMI_Point: ; резерв 3 байта для команды JP ;NOP ;NOP ;NOP RETN - ;======================================= ;SET_BIOS_TO_RAM: ; программа работает на адресе 0C000h @@ -196,24 +231,56 @@ BoardID: ; BLOCK #100-$,0 -; RESTARTS EQU #FFE0 ; !FIXIT вынести в SP2000.inc -; GLOBAL_RESET: -; DI -; IM 1 -; LD HL,RESTARTS -; LD DE,RESTARTS_PROG -; LD B,RESTARTS_PROG.Size -; .compare: -; LD A,(DE) -; CP (HL) -; JR NZ,NO_RESTART -; INC HL -; INC DE -; DJNZ .compare -; JP RESTARTS - -;-----[перехват RESET не состоялся]----- +;======================================= + IF TEST_INT + _mInfoALIGN #10,0 +; any adress < #C0 with mask %xxxx0000 +; таблица для Sprinter POST-Tester-a +TABLE_X: ; таблица для Sprinter POST-Tester-a +.v0: DB 00101000b ; "0" +.v1: DB 10111101b ; "1" +.v2: DB 00110010b ; "2" +.v3: DB 00110100b ; "3" +.v4: DB 10100101b ; "4" +.v5: DB 01100100b ; "5" +.v6: DB 01100000b ; "6" +.v7: DB 00111101b ; "7" +.v8: DB 00100000b ; "8" +.v9: DB 00100100b ; "9" +.vA: DB 00100001b ; "A" +.vB: DB 11100000b ; "B" +.vC: DB 01101010b ; "C" +.vD: DB 10110000b ; "D" +.vE: DB 01100010b ; "E" +.vF: DB 01100011b ; "F" + ENDIF +;======================================= ; + +; +;======================================= + IF TEST_INT +RESTARTS EQU #FFE0 ; !FIXIT вынести в SP2000.inc +GLOBAL_RESET: + DI + IM 1 + LD HL,RESTARTS + LD DE,RESTARTS_PROG + LD B,RESTARTS_PROG.Size +.compare: + LD A,(DE) + CP (HL) + JR NZ,NO_RESTART + INC HL + INC DE + DJNZ .compare + JP RESTARTS + ENDIF +;======================================= +; + +; +;-----[перехват RESET не состоялся]----- NO_RESTART: ; стек ещё не используем!!! LD SP,IX ; сохранить значение переданное загрузчиком конфы (если старт после ресета) @@ -249,6 +316,87 @@ NO_RESTART: ; no boundary set! ; +;--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--== + IF TEST_INT +;!FIXIT перенести в ROM.BIOS и сделать +; так, чтоб могла правильно прыгать в +; любые слоты и работать с DSS +;----------------[int]------------------ +EXTINT: OR A + RET Z + + ;LD C,SLOT1 + BIT 7,H + JR Z,.L2 + LD C,SLOT2 + BIT 6,H + JR Z,.L1 + LD C,SLOT3 + +.L1: IN B,(C) + PUSH BC + OUT (C),A + CALL .JPHL + POP BC + OUT (C),B + RET + ; проверка на нулевой слот +.L2: BIT 6,H + LD C,SLOT1 + JR NZ,.L1 ; продолжаем если ненулевой слот + + PUSH HL + + LD HL,-.stackDepth - .switchProcedure.size + .patch-2 + ADD HL,SP + PUSH HL + + LD HL,-.stackDepth - .switchProcedure.size ; memory stack use! + ADD HL,SP ; stack + PUSH HL ; адрес программы .readProcedure + + LD DE,.switchProcedure ; перенести программу на стек + EX DE,HL + LD BC,.switchProcedure.size + LDIR + RET + +; процедура, переносимая на стек для вызова прерывания пользователя из SLOT0 +; осторожнее с PUSH, если надо много, то увеличивай .stackDepth +.switchProcedure: + DEC DE + POP HL + LD (HL),E + INC HL + LD (HL),D + + LD C,SLOT0 + IN B,(C) + POP HL + PUSH BC + OUT (C),A + + XOR A + OUT (SYS_PORT.RAM),A + +.patch EQU $+1-.switchProcedure + CALL .JPHL + + DI + + XOR A + OUT (SYS_PORT.ROM),A + + POP BC + OUT (C),B + + RET +.JPHL: JP (HL) +.stackDepth EQU 32 ; расстояние от конца процедуры до вершины стека. +.switchProcedure.size EQU $-.switchProcedure + ENDIF +;--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--== + ; ==== POST PROCs ================= MODULE POST_TEST @@ -938,7 +1086,7 @@ DCP_DATA: INCLUDE 'DCP.ASM' ; #::::::::::::::::::::::::::::::::::#\ ; ####################################\ ; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ -ZG_ADRESS: INCLUDE 'FONT.ASM' +ZG_ADDRESS: INCLUDE 'FONT.ASM' ;-----------------------------------------------------------------------; diff --git a/src/bios/exp/FUNC_CMOS.ASM b/src/bios/exp/FUNC_CMOS.ASM index a783501..af1100e 100644 --- a/src/bios/exp/FUNC_CMOS.ASM +++ b/src/bios/exp/FUNC_CMOS.ASM @@ -36,7 +36,7 @@ CMOS_EMU_RD: LD E,SYS_PAGE OUT (C),E LD E,D - LD D,#FF + LD D, high SYS_PAGE.CMOS_EMULATOR LD A,(DE) OUT (C),B diff --git a/src/bios/exp/FUNC_LOW_PRINT.ASM b/src/bios/exp/FUNC_LOW_PRINT.ASM index d44b697..cfc0cb9 100644 --- a/src/bios/exp/FUNC_LOW_PRINT.ASM +++ b/src/bios/exp/FUNC_LOW_PRINT.ASM @@ -860,7 +860,7 @@ LP_BEG_P: ; program init registers ; for low printer & save WIN_GET_ZG: ; DE - адрес куда переслать фонт - LD HL,ZG_ADRESS + LD HL,ZG_ADDRESS LD BC,#0800 LDIR AND A diff --git a/src/bios/exp/FUNC_SYS.ASM b/src/bios/exp/FUNC_SYS.ASM index 6953d9e..a04cdb2 100644 --- a/src/bios/exp/FUNC_SYS.ASM +++ b/src/bios/exp/FUNC_SYS.ASM @@ -159,7 +159,7 @@ INIT_SYS_ALL: LD (HL),0 LDIR - LD DE,ZG_ADRESS ; адрес знакогенератора + LD DE,ZG_ADDRESS ; адрес знакогенератора LD (SYS_PAGE.WIN_ZG-#4000),DE ; ;-----------[new code start]------------ ; !!!!! посмотреть-причесать diff --git a/src/bios/rom/ROM.asm b/src/bios/rom/ROM.asm index 906bbdf..e3684b2 100644 --- a/src/bios/rom/ROM.asm +++ b/src/bios/rom/ROM.asm @@ -16,29 +16,29 @@ Check_Sum: ;!TODO прикрутить к ROM.BIOS ;----------------[int]------------------ BLOCK #38-$,#FF -INT: PUSH BC - PUSH AF +; INT: PUSH BC +; PUSH AF - LD C,SLOT3 - IN B,(C) - LD A,SYS_PAGE - OUT (C),A +; LD C,SLOT3 +; IN B,(C) +; LD A,SYS_PAGE +; OUT (C),A - LD A,(SYS_PAGE.INT_ID) - CP #AA - JR Z,YESINT - OUT (C),B - JR NOINT -YESINT: PUSH HL - LD HL,(SYS_PAGE.INT_ADRESS) - LD A,H - OR L - LD A,(SYS_PAGE.INT_PAGE) - OUT (C),B - CALL NZ,EXTINT - POP HL -NOINT: POP AF - POP BC +; LD A,(SYS_PAGE.INT_ID) +; CP #AA +; JR Z,YESINT +; OUT (C),B +; JR NOINT +; YESINT: PUSH HL +; LD HL,(SYS_PAGE.INT_ADRESS) +; LD A,H +; OR L +; LD A,(SYS_PAGE.INT_PAGE) +; OUT (C),B +; CALL NZ,EXTINT +; POP HL +; NOINT: POP AF +; POP BC EI RETI ;--------------------------------------- @@ -48,41 +48,97 @@ NOINT: POP AF NMI: RETN ;--------------------------------------- -;!FIXIT перенести в ROM.BIOS и сделать -; так, чтоб могла правильно прыгать в -; любые слоты и работать с DSS -;----------------[int]------------------ -EXTINT: OR A - RET Z +; ;!FIXIT перенести в ROM.BIOS и сделать +; ; так, чтоб могла правильно прыгать в +; ; любые слоты и работать с DSS +; ;----------------[int]------------------ +; EXTINT: OR A +; RET Z - ;LD C,SLOT1 - BIT 7,H - JR Z,.L2 - LD C,SLOT2 - BIT 6,H - JR Z,.L1 - LD C,SLOT3 +; ;LD C,SLOT1 +; BIT 7,H +; JR Z,.L2 +; LD C,SLOT2 +; BIT 6,H +; JR Z,.L1 +; LD C,SLOT3 -.L1: IN B,(C) - PUSH BC - OUT (C),A - CALL JPHL - POP BC - OUT (C),B - RET - ; проверка на нулевой слот -.L2: BIT 6,H - LD C,SLOT1 - JR NZ,.L1 ; продолжаем если ненулевой слот -; ВОТ ТУТ МОЖНО ВЛУПИТЬ ПРОЦЕДУРУ ДЛЯ ПОДСТАНОВКИ СТРАНИЦЫ В SLOT0 И -; ПЕРЕХОД ПО ПРЕРЫВАНИЮ В ОБРАБОТЧИК ПОЛЬЗОВАТЕЛЯ ЧЕРЕЗ процедуру на стэк, например - SCF - RET -JPHL: JP (HL) +; .L1: IN B,(C) +; PUSH BC +; OUT (C),A +; CALL .JPHL +; POP BC +; OUT (C),B +; RET +; ; проверка на нулевой слот +; .L2: BIT 6,H +; LD C,SLOT1 +; JR NZ,.L1 ; продолжаем если ненулевой слот +; ; ВОТ ТУТ МОЖНО ВЛУПИТЬ ПРОЦЕДУРУ ДЛЯ ПОДСТАНОВКИ СТРАНИЦЫ В SLOT0 И +; ; ПЕРЕХОД ПО ПРЕРЫВАНИЮ В ОБРАБОТЧИК ПОЛЬЗОВАТЕЛЯ ЧЕРЕЗ процедуру на стэк, например + + +; IF TEST_INT +; LD HL,-.stackDepth - .switchProcedure.size + .patch+2 +; ADD HL,SP +; PUSH HL + +; LD HL,-.stackDepth - .switchProcedure.size ; memory stack use! +; ADD HL,SP ; stack +; PUSH HL ; адрес программы .readProcedure + +; LD DE,.switchProcedure ; перенести программу на стек +; EX DE,HL +; LD BC,.switchProcedure.size +; LDIR +; RET + +; ; процедура, переносимая на стек для вызова прерывания пользователя из SLOT0 +; ; осторожнее с PUSH, если надо много, то увеличивай .stackDepth +; .switchProcedure: +; DEC DE +; POP HL +; LD (HL),E +; INC HL +; LD (HL),D + + +; LD C,SLOT0 +; IN B,(C) +; PUSH BC +; OUT (C),A + +; XOR A +; OUT (SYS_PORT.RAM),A +; .patch EQU $+1-.switchProcedure +; CALL .JPHL + +; DI + +; XOR A +; OUT (SYS_PORT.ROM),A + +; POP BC +; OUT (C),B + +; RET +; .JPHL: JP (HL) +; .stackDepth EQU 32 ; расстояние от конца процедуры до вершины стека. +; .switchProcedure.size EQU $-.switchProcedure +; ELSE + +; SCF +; RET +; .JPHL: JP (HL) +; ENDIF ;--------------------------------------- +/* + +*/ + ; ; _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ [___FOR ZX-MODE___] _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ ; diff --git a/src/bios/shared/DEFINES.INC b/src/bios/shared/DEFINES.INC index fe0aa65..7c0d7bb 100644 --- a/src/bios/shared/DEFINES.INC +++ b/src/bios/shared/DEFINES.INC @@ -2,7 +2,7 @@ ;---------[All shared defines]----------\/ \/ DEFINE DEBUG 1;| ; добавляет строку и сообщение о тестовой сборке на стартовом экране DEFINE NEW_FEATURE 0;| /\ ; !TODO пункты в сетап - DEFINE SET_NEWdcp 1;| \/ \/ ; !FIXIT тест нового dcp_init, пока не готова таблица портов + DEFINE TEST_INT 1;| \/ \/ ; Тестовый обработчик пользовательского INT DEFINE PACKED_MAIN 0;| | ; паковать MAIN или влезает без этого? DEFINE SP2000_ConfID #FEFF;| ; DEFINE IDE_Optimization 1;| ; слегка оптимизирует некоторые процедуры работы с HDD