From 9430a99f2bebc734ac4243e519ee261bcfe737bd Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Fri, 28 Mar 2025 03:25:47 +1000 Subject: [PATCH] =?UTF-8?q?LP=5FPR=5FLINE=5FDIR=20=D0=B3=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Shared_Includes | 2 +- src/bios/exp/EXP.asm | 134 ++++--- src/bios/exp/FUNC_LOW_PRINT.ASM | 595 ++++++++++++++++++------------ src/bios/exp/FUNC_RAM_ROM_DRV.ASM | 88 ++--- src/bios/exp/FUNC_SYS.ASM | 4 +- src/bios/rom/ROM.asm | 15 +- src/bios/rom/SETUP/KEY.asm | 42 +-- src/bios/rom/SETUP/MAIN.asm | 88 +++-- src/bios/shared/VERSION.inc | 2 +- 9 files changed, 554 insertions(+), 416 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 9143dcb..a9f5915 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 9143dcb7f8fd9cd3ae0bc179b94fced5efd8667f +Subproject commit a9f5915a3275f5ffbafa0994bb97c5846aab826c diff --git a/src/bios/exp/EXP.asm b/src/bios/exp/EXP.asm index 6a28adb..06a6531 100644 --- a/src/bios/exp/EXP.asm +++ b/src/bios/exp/EXP.asm @@ -7,6 +7,8 @@ ; ;************************************************************* + DISPLAY "\r\n/=====================[EXP part]=====================\\" + ;*************************************** ;*********** BEGIN EXPANSION *********** ;*************************************** @@ -243,9 +245,22 @@ ID_SPRINTER: DB 'Firmware v' BoardID: .start: WORD BoardID_start ; BoardID_start .end: WORD BoardID_end ; BoardID_end +;#######################################################################; + + +;#######################################################################; +;-----------------------------------------------------------------------; +; ROM-Disk pages ; [x] активирован ROM-DISK +ROM_DISK.Pages.Number: + BYTE ROM_DISK.Pages.Size ; число страниц +; у страниц выставлен bit4 для корректной подстановки +;(подробнее в sp2000.inc - Порт управления страницами ПЗУ) +ROM_DISK.Pages: ; страницы ROM-Disk + ABYTE #10 #05,#06,#07,#09,#0A,#0B ; 98304 bytes +.Size EQU $-ROM_DISK.Pages +;-----------------------------------------------------------------------; +;#######################################################################; -; ;======================================= -; BLOCK #100-$,0 ;======================================= @@ -1304,48 +1319,39 @@ RESTARTS_PROG: ; !TODO LDConf ;-----------------------------------------------------------------------; ;----------------------------[Setup Starter]----------------------------; - MODULE Setup_Starter -; программа, размещаемая по адресу 0C000h -; для запуска Setup -Start: - DISP COMPILE_ADDR.SETUP_STARTER -Exec: LD A,CNF_PORT.CNF_0 + ROM.EXTENSION - OUT (SYS_PORT.ROM),A - - LD HL,ROM_MAP.SETUP - LD DE,MEM_MAP.SETUP - LD BC,BLOCK_Setup.Length - LDIR - - LD A,CNF_PORT.CNF_0 + ROM.BIOS - OUT (SYS_PORT.ROM),A - + MODULE Setup_Starter +; программа, размещаемая по адресу #C000 для запуска Setup +Start: DISP COMPILE_ADDR.SETUP_STARTER +Exec: LD A,CNF_PORT.CNF_0 + ROM.EXTENSION + OUT (SYS_PORT.ROM),A + ; + LD HL,ROM_MAP.SETUP + LD DE,MEM_MAP.SETUP + LD BC,BLOCK_Setup.Length + LDIR + ; + LD A,CNF_PORT.CNF_0 + ROM.BIOS + OUT (SYS_PORT.ROM),A ;-----------[Check SPACE] - LD A,Port_All_Mode.DEFAULT - Port_All_Mode.SPECTRUM_MODE_OFF ; !HARDCODE - LD BC,Port_All_Mode ; keyboard int & acc off - OUT (C),A - LD A,high ZXKeys.Line_7 - IN A,(ZXKeys) - CPL - AND 1 -; в регистре A передаётся нажата ли клавиша SPACE. -; потом проверяется в main.asm [space_check] -; и если нажата, то происходит игнор параметра -; "Быстрый старт ПЗУ" во время перезагрузки - EX AF,AF' - LD A,#FF ; !HARDCODE - OUT (C),A ; keyboard int & acc on, zx_screen & original waits off (for conf >= 3.05) - EX AF,AF' + ; в CF передаётся нажата ли клавиша SPACE. CF=0: клавиша нажата + ; потом проверяется в main.asm [space_check] и если нажата, + ; то происходит игнор параметра "Быстрый старт ПЗУ" + ; во время перезагрузки в [Check Quick Start ROM] + LD BC,Port_All_Mode + IN H,(C) ; или LD H,#FF + LD A,Port_All_Mode.DEFAULT - Port_All_Mode.SPECTRUM_MODE_OFF + OUT (C),A ; keyboard int & acc off + LD A,high ZXKeys.Line_7 + IN A,(ZXKeys) + RRA ; CF=0 клавиша нажата ;----------------------[] - DI - POP HL ; адрес возврата в EXP из SETUP - ; LD SP,#8000 ;!HARDCODE - ; PUSH HL - ; PUSH AF - JP SETUP_MAIN - ENT + OUT (C),H + DI + POP HL ; адрес возврата в EXP из SETUP + JP SETUP_MAIN + ENT Size EQU $-Setup_Starter.Start - ENDMODULE + ENDMODULE ;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------; ;>$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$<; @@ -1490,29 +1496,37 @@ kbd_loop2: AND A RET ;----------------------------------------------------------------------; -; +;----------------------------------------------------------------------; +; DE - частота +; HL - продолжительность +BEEP: LD A,#10 + CALL .beep_loop + ; + ;XOR A + CALL .beep_loop + ; + DEC HL + LD A,H + OR L + JR NZ,BEEP + RET + ; +.beep_loop: OUT (ZX_Beeper),A + LD B,D + LD C,E + ; +.loop: DEC BC + LD A,B + OR C + JR NZ,.loop + RET +;----------------------------------------------------------------------; + + ;#######################################################################; -;#######################################################################; -;-----------------------------------------------------------------------; -; ROM-Disk pages ; [x] активирован ROM-DISK - _mInfoALIGN 256,#FF -; BLOCK #3F00-$,#FF -ROM_DISK.Pages.Number: - BYTE ROM_DISK.Pages.Size ; число страниц -; у страниц выставлен bit4 для корректной подстановки -;(подробнее в sp2000.inc - Порт управления страницами ПЗУ) -ROM_DISK.Pages: ; страницы ROM-Disk - ABYTE #10 #05,#06,#07,#09,#0A,#0B ; 98304 bytes -.Size EQU $-ROM_DISK.Pages -;-----------------------------------------------------------------------; -;#######################################################################; -; - - - diff --git a/src/bios/exp/FUNC_LOW_PRINT.ASM b/src/bios/exp/FUNC_LOW_PRINT.ASM index 2269496..fbfba05 100644 --- a/src/bios/exp/FUNC_LOW_PRINT.ASM +++ b/src/bios/exp/FUNC_LOW_PRINT.ASM @@ -63,14 +63,15 @@ ; H - высота, L - ширина ;============================================================= - MACRO CORRECT_SCR_40 ;[x] включил 31/10/23, чисто на Хэллоууууииин + MACRO CORRECT_SCR_40_FORWARD ;[x] включил 31/10/23, чисто на Хэллоууууииин EX AF,AF' JR C,.LLL INC D ; режим 40 .LLL: EX AF,AF' ENDM ; - MACRO CORRECT_SCR_40_BACK + + MACRO CORRECT_SCR_40_BACKWARD EX AF,AF' JR C,.LLL DEC D ; режим 40 @@ -158,7 +159,7 @@ LP_PRINT_ALL: CALL LP_BEG_P INC L LD (HL),A DEC L - CORRECT_SCR_40 + CORRECT_SCR_40_FORWARD DJNZ_NEXT_HL EXX DJNZ .loop @@ -181,7 +182,7 @@ LP_PRINT_SYM: CALL LP_BEG_P OUT (PORT_Y),A .cont: LD (HL),C INC D - CORRECT_SCR_40 + CORRECT_SCR_40_FORWARD DJNZ_NEXT_HL EXX DJNZ .loop @@ -206,7 +207,7 @@ LP_PRINT_ATR: CALL LP_BEG_P INC L LD (HL),C DEC L - CORRECT_SCR_40 + CORRECT_SCR_40_FORWARD DJNZ_NEXT_HL EXX DJNZ .loop @@ -237,7 +238,7 @@ LP_PRINT_LINE: CALL LP_BEG_P INC L LD (HL),A DEC L - CORRECT_SCR_40 + CORRECT_SCR_40_FORWARD DJNZ_NEXT_HL EXX DJNZ .loop @@ -260,7 +261,7 @@ LP_PRINT_LINE2: CALL LP_BEG_P OUT (C),D INC D LD (HL),A - CORRECT_SCR_40 + CORRECT_SCR_40_FORWARD DJNZ_NEXT_HL EXX DJNZ .loop @@ -299,7 +300,7 @@ LP_PRINT_LINE3: CALL LP_BEG_P INC L LD (HL),A DEC L - CORRECT_SCR_40 + CORRECT_SCR_40_FORWARD DJNZ_NEXT_HL EXX DJNZ .loop @@ -330,7 +331,7 @@ LP_PRINT_LINE4: CALL LP_BEG_P .NoEndSymbol: EXX LD (HL),A INC D - CORRECT_SCR_40 + CORRECT_SCR_40_FORWARD DJNZ_NEXT_HL EXX DJNZ .loop @@ -364,7 +365,7 @@ LP_PRINT_LINE5: CALL LP_BEG_P LD (HL),A DEC L INC D - CORRECT_SCR_40 + CORRECT_SCR_40_FORWARD DJNZ_NEXT_HL EXX DJNZ .loop @@ -378,8 +379,8 @@ LP_END_P: LD A,SYS_PAGE EXX RLA LD E,A - LD (WIN_ID_0.reg_HL),HL ; место печати - LD (WIN_ID_0.reg_DE),DE + LD (WIN_ID_0.LineAddr),HL ; место печати + LD (WIN_ID_0.ColumnRGADR_TXTMode),DE LD (WIN_ID_0.reg_BC),BC CALL LP_CLOSE_PG EXX @@ -413,7 +414,7 @@ LP_PRINT_LINE6: CALL LP_BEG_P EXX LD (HL),A INC D - CORRECT_SCR_40 + CORRECT_SCR_40_FORWARD DJNZ_NEXT_HL EXX DJNZ .loop @@ -466,15 +467,25 @@ LP_GET_PLACE: CALL LP_BEG_P ;-------------------------------------------------------------[#89, #8D] ;--------------------------------------------------------[#8D] LP_CLS_WIN2: LD C,A - JR CLS_WIN + JR LP_CLS_WIN.START ;--------------------------------------------------------[#8D] ;--------------------------------------------------------[#89] LP_CLS_WIN: LD C,' ' ;---------------- -----------------------------[#89] -CLS_WIN: CALL LP_BEG_P - LD (SYS_PAGE.SYS_WORK1),BC ; сохранить цвет ; !TODO использовать переменные окна - PUSH DE +.START: CALL LP_BEG_P + CALL .CLS + JP LP_END_P.SYS_PAGE ; +.CLS: LD (SYS_PAGE.SYS_WORK1),BC ; сохранить цвет ; !TODO использовать переменные окна + PUSH DE + ; [ ] 02/04/2025 проверка на превышение размера окна + EXX + LD A,B + EXX + CP L + JR NC,.loop1 + LD L,A + ; .loop1: CALL LP_SET_CUR PUSH DE EXX @@ -492,6 +503,7 @@ CLS_WIN: CALL LP_BEG_P LD (HL),B DEC L INC D + CORRECT_SCR_40_FORWARD EXX DJNZ .loop2 ; @@ -503,8 +515,7 @@ CLS_WIN: CALL LP_BEG_P JR NZ,.loop1 ; POP DE - CALL LP_SET_CUR - JP LP_END_P.SYS_PAGE + JP LP_SET_CUR ;-------------------------------------------------------------[#89, #8D] ; @@ -610,9 +621,6 @@ LP_SIZE: CALL LP_OPEN_PG CALL LP_CLOSE_PG RET NZ ; txt 40 - ; LD A,E - ; ADD A,A - ; LD E,A SLA E RET ; @@ -672,78 +680,6 @@ LP_SET_CUR: ; LP_AT_D: RET ;************************************************************* -LP_NEXT_HL_DIR: LD A,SYS_PAGE - OUT (SLOT3),A - LD A,4 ;!HARDCODE длина одного описателя квадратика - ADD L - LD L,A - LD A,(WIN_ID_0.V_END) - CP L - CALL C,.end_line - ; -.no_end_line: LD A,(WIN_ID_0.H_BEG) - LD D,A - LD A,(WIN_ID_0.SIZE_REL) - LD B,A - RET - ; -.end_line: LD A,L - SUB 4 ;!HARDCODE длина одного описателя квадратика - LD L,A - PUSH HL - DEC HL - PUSH BC - PUSH DE - EXX - PUSH BC - PUSH HL - LD A,(WIN_ID_0.V_BEG) - LD D,A - LD A,(WIN_ID_0.USER.SIZE_V) - LD B,A - LD E,0 ; всю строку окна скроллим - CALL LP_SCROLL_UP.RUN - EXX - LD C," " - ; - LD A,SYS_PAGE - OUT (SLOT3),A - LD HL,(WIN_ID_0.V_END) - DEC L - DEC L - DEC L - LD H,#C3 ;!HARDCODE смещение в странице 3 к началу описателей экрана - ; - LD A,(WIN_ID_0.H_BEG) - LD D,A - ; - LD A,#50 - OUT (SLOT3),A - ; - EXX - LD A,(WIN_ID_0.SIZE_REL) - LD B,A -.loop_cl_line: EXX - LD A,D - OUT (PORT_Y),A - LD (HL),C - INC D - CORRECT_SCR_40 - EXX - DJNZ .loop_cl_line - ; - POP HL - POP BC - EXX - POP DE - POP BC - POP HL - ; - LD A,SYS_PAGE - OUT (SLOT3),A - RET - - ; вычисление нового места LP_NEXT_HL: LD A,SYS_PAGE OUT (SLOT3),A @@ -771,13 +707,13 @@ LP_NEXT_HL: LD A,SYS_PAGE LP_BEG_P: EX AF,AF' EXX CALL LP_OPEN_PG - LD HL,(WIN_ID_0.reg_HL) - LD DE,(WIN_ID_0.reg_DE) + LD HL,(WIN_ID_0.LineAddr) + LD DE,(WIN_ID_0.ColumnRGADR_TXTMode) LD BC,(WIN_ID_0.reg_BC) LD A,E AND A RRA - OUT (PORT_Y),A + ;OUT (PORT_Y),A EXX EX AF,AF' RET @@ -795,7 +731,8 @@ LP_INI_P: EX AF,AF' LD A,(WIN_ID_0.USER.MODE) BIT 4,A JR Z,.NO_ZG ; открытие графического экрана - LD DE,(SYS_PAGE.WIN_ZG) ; знакогенератор + ;LD DE,(SYS_PAGE.WIN_ZG) ; знакогенератор + LD DE,ZG_ADDRESS ; знакогенератор EXX EX AF,AF' CALL WIN_SET_ZG.SET ;LP_SET_ZG1 ;!TODO стоит ли каждый раз закидывать шрифт? @@ -903,10 +840,12 @@ WIN_OPEN: CALL .Prepare JP WIN_OPEN_W1 ; .Prepare: CALL LP_OPEN_PG - LD (SYS_PAGE.WIN_MAP_SC),IX ; карта окна PUSH HL PUSH DE - LD HL,(SYS_PAGE.WIN_MAP_SC) + ;LD (SYS_PAGE.WIN_MAP_SC),IX ; карта окна + ;LD HL,(SYS_PAGE.WIN_MAP_SC) + PUSH IX + POP HL LD DE,WIN_ID_0 LD BC,Window_UserVars LDIR @@ -956,14 +895,14 @@ WIN_OPEN_W1: LD A,L ADD A,A ADD A,D LD (IX+Window_Variables.H_END),A - LD (SYS_PAGE.WIN_MODE_SC),DE ; место по горизонтали и страница моды + ;LD (SYS_PAGE.WIN_MODE_SC),DE ; место по горизонтали и страница моды LD A,H AND #3F ADD A,A ADD A,A LD L,A - LD H,#C3 - LD (SYS_PAGE.WIN_MODE_SH),HL ; место по вертикали с адресом + LD H,A + ;LD (SYS_PAGE.WIN_MODE_SH),HL ; место по вертикали с адресом LD (IX+Window_Variables.V_BEG),A LD A,(IX+Window_Variables.USER.SIZE_V) ADD A,A @@ -971,7 +910,8 @@ WIN_OPEN_W1: LD A,L ADD A,L LD (IX+Window_Variables.V_END),A ; - LD L,(IX+Window_Variables.V_BEG) + ;LD L,(IX+Window_Variables.V_BEG) + LD L,H LD H,#C3 LD B,(IX+Window_Variables.USER.SIZE_V) ; размер по вертикали LD (IX+Window_Variables.WORK_1),0 @@ -1015,7 +955,7 @@ WIN_OPEN_W1: LD A,L ; LD A,(IX+Window_Variables.MODE_E) AND 1 - OUT (RGMOD),A + OUT (SCREEN_SWITCH),A ;LD A,(IX+Window_Variables.MODE) ;BIT 4,A CALL LP_CLOSE_PG @@ -1023,8 +963,11 @@ WIN_OPEN_W1: LD A,L CALL LP_INI_P ;LD A,(SYS_PAGE.WIN_MODE_SC) ;OUT (RGMOD),A - CALL LP_SIZE - XOR A + ; нигде не было описано + CALL LP_SIZE + ; DE - размеры окна + ; + XOR A ;!TODO номер окна RET ; @@ -1278,12 +1221,14 @@ LP_SCROLL_UP: DEC E CALL LP_OPEN_PG ; LD B,E - LD E,0 ; всю строку окна скроллим + LD E,0 ; всю строку окна скроллим CALL .RUN -.EXIT: JP LP_CLOSE_PG + JP LP_CLOSE_PG ; ; -.RUN: CALL LP_SET_CUR ; вычислить переменные для строки +.RUN: CALL LP_SET_CUR ; вычислить переменные для строки + PUSH IX + LD IX,(WIN_ID_0.USER.SIZE_H) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;!TODO ; отличие от LP_SCROLL_DN LD A,(WIN_ID_0.V_END) @@ -1305,20 +1250,26 @@ LP_SCROLL_UP: DEC E ADD L LD L,A ; - LD A,C + LD A,C ; LD A,(WIN_ID_0.V_END) CP L - RET C ; если конец, то выход + JR C,.exit ; если конец, то выход ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PUSH BC LD A,L EXX LD L,A EXX - LD A,(WIN_ID_0.USER.SIZE_H) + ;XH + LD A,XL ; WIN_ID_0.USER.SIZE_H + ; LD A,SYS_PAGE + ; OUT (SLOT3),A + ; LD A,(WIN_ID_0.USER.SIZE_H) ADD A,A ; число байт в строке для переноса ADD A,A LD C,A LD B,0 + ; LD A,#50 + ; OUT (SLOT3),A ; открыть страницу для переноса ; EXX LD A,D ; получить порт начала строки @@ -1327,6 +1278,7 @@ LP_SCROLL_UP: DEC E INC A ; следующее значение порта LDI LDD + ; OUT (PORT_Y),A INC A ; следующее значение порта LDI @@ -1335,6 +1287,7 @@ LP_SCROLL_UP: DEC E ; POP BC DJNZ .loop2 +.exit: POP IX RET @@ -1356,6 +1309,8 @@ LP_SCROLL_DN: DEC E ;!FIXIT ; ; .RUN: CALL LP_SET_CUR + PUSH IX + LD IX,(WIN_ID_0.USER.SIZE_H) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;!TODO ; отличие от LP_SCROLL_UD LD A,(WIN_ID_0.V_BEG) @@ -1380,18 +1335,24 @@ LP_SCROLL_DN: DEC E ;!FIXIT LD A,C CP L ; .CONT: L >= A JR Z,.CONT - RET NC ; если конец, то выход + JR NC,.exit ; если конец, то выход ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .CONT: PUSH BC LD A,L EXX LD L,A EXX - LD A,(WIN_ID_0.USER.SIZE_H) + ; + LD A,XL ; WIN_ID_0.USER.SIZE_H + ; LD A,SYS_PAGE + ; OUT (SLOT3),A + ; LD A,(WIN_ID_0.USER.SIZE_H) ADD A,A ; число байт в строке для переноса ADD A,A LD C,A LD B,0 + ; LD A,#50 + ; OUT (SLOT3),A ; открыть страницу для переноса ; EXX LD A,D ; получить порт начала строки @@ -1400,6 +1361,7 @@ LP_SCROLL_DN: DEC E ;!FIXIT INC A ; следующее значение порта LDI LDD + ; OUT (PORT_Y),A INC A ; следующее значение порта LDI @@ -1408,6 +1370,7 @@ LP_SCROLL_DN: DEC E ;!FIXIT ; POP BC DJNZ .loop2 +.exit: POP IX RET @@ -1458,29 +1421,60 @@ WIN_PUT_SYM: AND A OUT (SLOT3),A ; EXX - ;CORRECT_SCR_40 LD A,D OUT (PORT_Y),A EXX - LD A,L - EXX - LD (HL),A - INC L - EXX - LD A,H - EXX - LD (HL),A - DEC L - DEC L - EXX + ; [ ] 31/03/2025 если B=0, то кладём только символ + ; если B=1, то кладём символ с атрибутом + ; символ + ; LD A,L + ; EXX + ; LD (HL),A + ; INC L + ; EXX + ; ; атрибут + ; LD A,H + ; EXX + ; LD (HL),A + ; DEC L + ; DEC L + ; EXX + ; ; шрифт + ; LD A,B + ; EXX + ; LD (HL),A + ; INC L + ; EXX + ; JP LP_END_P + ; + ; шрифт LD A,B + OR A + JR Z,.onlySymbol + DEC B + JR Z,.noChangeZG + ; EXX + DEC L LD (HL),A INC L EXX + ; атрибут +.noChangeZG: LD A,H + EXX + INC L + LD (HL),A + DEC L + EXX + ; символ +.onlySymbol: LD A,L + EXX + LD (HL),A + EXX JP LP_END_P + ; HL - размер окна ; DE - положение окна ; A - номер окна @@ -1506,72 +1500,62 @@ WIN_MOVE: AND A ; DE - место сохраняемого окна ; IX - адрес сохраняемого окна, в странице 4000h ; А - номер окна, B - страница -WIN_COPY: - AND A +WIN_COPY: AND A SCF RET NZ -WIN_COPY_WIN1: - CALL LP_BEG_P - +WIN_COPY_WIN1: CALL LP_BEG_P IN A,(SLOT1) PUSH AF - + ; CALL LP_SET_CUR LD (SYS_PAGE.SYS_WORK1),SP - LD A,B OUT (SLOT3),A LD A,#50 OUT (SLOT1),A - + ; EXX RES 7,H LD C,D EXX - -.COPY_loop2: - LD A,L + ; +.COPY_loop2: LD A,L EXX - LD B,A - ; - ADD A,A - ADD A,XL - LD XL,A - JR NC,.NO_INC_XH - INC XH -.NO_INC_XH: - LD SP,IX - ; - LD A,C - ADD A,B -.COPY_loop: - DEC A - OUT (PORT_Y),A - LD E,(HL) - INC L - LD D,(HL) - DEC L - PUSH DE - DJNZ .COPY_loop - ; - INC HL - INC HL - INC HL - INC HL + LD B,A + ADD A,A + ADD A,XL + LD XL,A + JR NC,.NO_INC_XH + ; + INC XH +.NO_INC_XH: LD SP,IX + LD A,C + ADD A,B +.COPY_loop: DEC A + OUT (PORT_Y),A + LD E,(HL) + INC L + LD D,(HL) + DEC L + PUSH DE + DJNZ .COPY_loop + ; + INC HL + INC HL + INC HL + INC HL EXX DEC H JR NZ,.COPY_loop2 - ; + ; LD A,SYS_PAGE OUT (SLOT3),A LD SP,(SYS_PAGE.SYS_WORK1) - ; + ; POP AF OUT (SLOT1),A JP LP_END_P.short - ;AND A - ;RET - +; ; HL - размер сохраняемого окна ; DE - место сохраняемого окна @@ -1633,42 +1617,70 @@ WIN_RESTORE: AND A -;!FIXIT нет описания, недоделана. Печать с управляющими символами +; Печать с управляющими символами в консоль ;------------------------------------------------------------------[#E0] LP_PR_LINE_DIR: - ;!TODO недоделана -.BELL: ; ... - ; ... + ;>------------------------------------------------[BELL] +.BELL: EXX + PUSH HL + PUSH BC + ; + LD DE,1200 + LD HL,4 + CALL BEEP + ; + POP BC + POP HL + EXX JR .loop - ;!TODO недоделана -.BACK: LD A,SYS_PAGE - OUT (SLOT3),A - ; - LD A,(WIN_ID_0.H_BEG) + ;-------------------------------------------------[BELL] + + ;>------------------------------------------------[Backspace] +.BACK: LD A,(WIN_ID_0.H_BEG) CP D JR Z,.loop INC B DEC D - CORRECT_SCR_40_BACK + CORRECT_SCR_40_BACKWARD JP .loop - ; + ;>------------------------------------------------[Backspace] + ; +.EXIT_SpecSymbol: + DEC HL + CALL LP_END_P + POP IX + SCF + RET +; .EXIT: POP IX JP LP_END_P ;;;;;;;;;;;;;;;;; -; DE - место символа в окне, если A != 0 -; HL - адрес с выводимой строкой -; B - разделитель -; A - mode +; A - атрибуты выводимого символа если CF' +; CF - XY-mode +; DE - место символа в окне, если CF=1 +; HL - адрес с выводимой строкой +; B - разделитель +; IY - два спец.символа для выхода с CF=1. Должны быть равны B, если не нужны +; A' - цвет консоли (используется при скролле и очистке окна) +; CF' - выводить символ с атрибутами ;;;;;;;;;;;;;;;;; .START: PUSH IX - AND A ; check mode for DE + LD XL,A ; атрибуты выводимого символа + ; + EX AF,AF' + PUSH AF ; цвет консоли, attr-mode + EX AF,AF' ; IN A,(SLOT3) LD C,A CALL LP_BEG_P - CALL NZ,LP_SET_CUR ; mode for DE - ; + CALL C,LP_SET_CUR ; mode for DE + POP AF ; цвет консоли, attr-mode + LD (SYS_PAGE.SYS_WORK2),A ; цвет консоли EXX + LD C,0 + JR NC,.loop + INC C ; C' - attr flag. выводить атрибут .loop: LD A,D OUT (PORT_Y),A EXX @@ -1679,7 +1691,12 @@ LP_PR_LINE_DIR: LD XH,A INC HL CP B - JP Z,.EXIT + JR Z,.EXIT + CP YH + JR Z,.EXIT_SpecSymbol + CP YL + JR Z,.EXIT_SpecSymbol + ; EXX ; печатаемые символы CP 14 @@ -1687,6 +1704,10 @@ LP_PR_LINE_DIR: CP 7 JR C,.print ; управляющие символы + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,XH + ; SUB 7 JR Z,.BELL ; A = 07 "BELL" DEC A @@ -1699,80 +1720,192 @@ LP_PR_LINE_DIR: JR Z,.VertTab ; А = 11 "Vertical Tabulation" DEC A JR Z,.CLS ; А = 12 "Form feed" - разрыв страницы, начало нового листа, может работать как VT - DEC A - JR Z,.CR ; А = 13 "Carriage Return" - ; выводить! - ; + ;DEC A + ;JR Z,.CR ; А = 13 "Carriage Return" + ;>------------------------------------------------[CR] +.CR: LD A,(WIN_ID_0.H_BEG) + LD D,A + LD A,(WIN_ID_0.SIZE_REL) + LD B,A + JP .loop + ;-------------------------------------------------[CR] + + ;>------------------------------------------------[PRINT] .print: LD A,#50 OUT (SLOT3),A LD A,XH LD (HL),A + ; выводить атрибут + RR C ; C' - attr flag + JR NC,.NoPutAttr + ; + INC L + LD A,XL + LD (HL),A + DEC L +.NoPutAttr: RL C ; C' - attr flag INC D -.next_full: CORRECT_SCR_40 +.next_full: CORRECT_SCR_40_FORWARD .next: DJNZ .loop CALL LP_NEXT_HL_DIR JP .loop - ;-------[TAB] ;!FIXIT заполняет пробелами -.TAB: LD A,SYS_PAGE - OUT (SLOT3),A - LD A,(WIN_ID_0.H_BEG) + ;-------------------------------------------------[PRINT] + + ;>------------------------------------------------[TAB] +.TAB: LD A,(WIN_ID_0.H_BEG) SUB D NEG AND %0000'0111 NEG ADD A,8 + CP B + JR C,.keep_A + ; + LD A,B + DEC A +.keep_A: ;NEG + PUSH BC ; save C' - attr flag LD C,A - LD A,#50 - OUT (SLOT3),A + EX AF,AF' + JR C,.LLL + ; + EX AF,AF' + ADD A,A ; режим 40 + EX AF,AF' +.LLL: EX AF,AF' ; -.loop_tab: LD (HL),' ' - INC D - DEC B - JR Z,.end_Line - DEC C - JR NZ,.loop_tab - JR .next_full - ; -.end_Line: LD A,SYS_PAGE - OUT (SLOT3),A - LD A,(WIN_ID_0.H_BEG) +.tabNxt: ADD A,D LD D,A - LD A,(WIN_ID_0.SIZE_REL) + LD A,B + SUB C ; set XL + POP BC ; restore C' - attr flag LD B,A - JP .LineFeed_go - ;-------[TAB end] - ; - ;-------[Line Feed] -.VertTab: ; -.LineFeed: LD A,SYS_PAGE - OUT (SLOT3),A + JP .loop ; -.LineFeed_go: LD A,4 ;!HARDCODE длина одного описателя квадратика + ;-------------------------------------------------[TAB] + + ;>------------------------------------------------[Line Feed] +.VertTab: ; +.LineFeed: LD A,4 ;!HARDCODE длина одного описателя квадратика ADD L LD L,A ; LD A,(WIN_ID_0.V_END) CP L CALL C,LP_NEXT_HL_DIR.end_line - JP .loop - ;-------[Line Feed end] - ; -.CLS: ; ... - ;!TODO CLS JP .loop - ; -.CR: LD A,SYS_PAGE + ;-------------------------------------------------[Line Feed] + + ;>------------------------------------------------[Form feed] +.CLS: PUSH BC ; C' - attr flag + EXX + PUSH BC + PUSH HL + PUSH DE + ; + LD A,(SYS_PAGE.SYS_WORK2) ; цвет консоли + LD B,A + LD DE,0 + LD HL,(WIN_ID_0.USER.SIZE_H) ; get WIN XY + LD A,(WIN_ID_0.SIZE_REL) + LD L,A + LD C," " + CALL LP_CLS_WIN.CLS + ; + POP DE + POP HL + POP BC + EXX + LD A,B + POP BC ; C' - attr flag + LD B,A + JP .loop + ;-------------------------------------------------[Form feed] +;------------------------------------------------------------------[#E0] +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +LP_NEXT_HL_DIR: LD A,SYS_PAGE OUT (SLOT3),A + LD A,4 ;!HARDCODE длина одного описателя квадратика + ADD L + LD L,A + LD A,(WIN_ID_0.V_END) + CP L + CALL C,.end_line ; - LD A,(WIN_ID_0.H_BEG) +.no_end_line: LD A,(WIN_ID_0.H_BEG) LD D,A LD A,(WIN_ID_0.SIZE_REL) LD B,A + RET ; - ;LD A,#50 - ;OUT (SLOT3),A - JP .loop -;------------------------------------------------------------------[#E0] +.end_line: LD A,L + SUB 4 ;!HARDCODE длина одного описателя квадратика + LD L,A + PUSH HL + DEC L + PUSH BC + PUSH DE + EXX + PUSH BC + PUSH HL + PUSH DE + LD A,(WIN_ID_0.V_BEG) + LD D,A + LD A,(WIN_ID_0.USER.SIZE_V) + LD B,A + LD E,0 ; всю строку окна скроллим + CALL LP_SCROLL_UP.RUN + ; + LD A,SYS_PAGE + OUT (SLOT3),A + LD C," " + LD A,(SYS_PAGE.SYS_WORK2) ; цвет консоли + LD B,A + LD A,(WIN_ID_0.USER.SIZE_V) + DEC A + LD D,A + LD E,0 + LD HL,(WIN_ID_0.SIZE_REL) + LD H,1 + LD C," " + CALL LP_CLS_WIN.CLS + ; + POP DE + POP HL + POP BC + EXX + POP DE + POP BC + POP HL + RET +; +; LD HL,(WIN_ID_0.V_END) +; DEC L +; DEC L +; DEC L +; LD H,#C3 +; ; +; LD A,(WIN_ID_0.H_BEG) +; LD D,A +; ; +; LD A,#50 +; OUT (SLOT3),A +; ; +; EXX +; LD A,(WIN_ID_0.SIZE_REL) +; LD B,A +; .loop_cl_line: EXX +; LD A,D +; OUT (PORT_Y),A +; LD (HL),C +; INC D +; CORRECT_SCR_40_FORWARD +; EXX +; DJNZ .loop_cl_line +; LD A,SYS_PAGE +; OUT (SLOT3),A +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + LP_OPEN_PG: IN A,(SLOT3) diff --git a/src/bios/exp/FUNC_RAM_ROM_DRV.ASM b/src/bios/exp/FUNC_RAM_ROM_DRV.ASM index e3d519f..e719d51 100644 --- a/src/bios/exp/FUNC_RAM_ROM_DRV.ASM +++ b/src/bios/exp/FUNC_RAM_ROM_DRV.ASM @@ -1025,83 +1025,69 @@ BLK_RD_WR: ; DE - номер сектора (считать по 256b сектор) ; B - число секторов ; A' - размер сектора (1 - 256b, 2 - 512 b) -ROM_DISK: - ; сохраняем состояние прерываний - ;LD A,R - EX AF,AF' +ROM_DISK: EX AF,AF' LD C,0 ; счетчик DEC A JR Z,.loop - ;JR Z,.start + ; DEC A SCF RET NZ - + ; EX DE,HL ADD HL,HL EX DE,HL LD A,B ADD A,A LD B,A - ;!!!!! RET C - + ; DI CALL .loop -; ; восстанавливаем состояние прерываний -; EX AF,AF' -; JP PO,.noInterrupts -; EI -; .noInterrupts: -; EX AF,AF' -; ; RET C + ; AND A RR D RR E XOR A RET - -; .start: -; DI -; CALL .loop -; ; восстанавливаем состояние прерываний -; EX AF,AF' -; JP PO,.noInterrupts2 -; EI -; .noInterrupts2: -; EX AF,AF' -; ; -; RET - - + ; .loop: PUSH DE ; номер сектора PUSH BC - + ; LD A,E AND #3F ; ADRESS in ROM-Page PUSH AF ; сохранить адрес - + ; 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! + ; [ ] без привязки ром-диска к align 256 + ;LD A,(ROM_DISK.Pages.Number) + ;INC H + ;CP H + ; + LD C,H + LD B,0 + LD HL,ROM_DISK.Pages + ADD HL,BC + ; + LD A,(ROM_DISK.Pages.Number) ; rdlow-ok + INC C + CP C + ; + ;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 -; DE - буфер -; HL - адрес в ROM -; B - число секторов -; A - ROM-Page -.loopRead: - PUSH HL ; откуда + ; DE - буфер + ; HL - адрес в ROM + ; B - число секторов + ; A - ROM-Page +.loopRead: PUSH HL ; откуда PUSH DE ; куда LD HL,-.stackDepth-.readProcedure.size ; memory stack use! @@ -1115,10 +1101,9 @@ ROM_DISK: LDIR ; программа на стеке LD BC,#100 ; длина сектора RET ; исполнить программу .readProcedure, на стеке адреса буфера и ROM -; DE - next address -; HL - ROM address -.readNext: - POP BC ; число секторов + ; DE - next address + ; HL - ROM address +.readNext: POP BC ; число секторов INC C ; счетчик считанных секторов DEC B ; сектора кончились? @@ -1141,20 +1126,19 @@ ROM_DISK: JP .loop ; начать все снова! ; чтение закончено -.normExit: - POP HL ; сектор, откуда велось чтение +.normExit: POP HL ; сектор, откуда велось чтение ADD HL,BC ; по возврату: HL - след.адрес EX DE,HL ; DE - след.сектор AND A RET ; ошибка -.errorExit: ; !TODO сделать, чтоб на выходе показывалось количество прочитанных секторов +.errorExit: ; !TODO сделать, чтоб на выходе показывалось количество прочитанных секторов POP BC POP DE SCF RET ; процедура, переносимая на стек для чтения из ROM-Disk -; осторожнее с PUSH, если надо много, то увеличивай .stackDepth +; осторожнее с PUSH, если надо много, то увеличить .stackDepth .readProcedure: POP DE ; куда POP HL ; откуда diff --git a/src/bios/exp/FUNC_SYS.ASM b/src/bios/exp/FUNC_SYS.ASM index 916e09c..04643f5 100644 --- a/src/bios/exp/FUNC_SYS.ASM +++ b/src/bios/exp/FUNC_SYS.ASM @@ -254,8 +254,8 @@ INIT_SYS_ALL: ; ;;; init task's ; - LD DE,ZG_ADDRESS ; адрес знакогенератора - LD (SYS_PAGE.WIN_ZG - #4000),DE + ;LD DE,ZG_ADDRESS ; адрес знакогенератора + ;LD (SYS_PAGE.WIN_ZG - #4000),DE ; ;-----------[new code start]------------; !!!!! посмотреть-причесать INIT_VSyncAndWaits: diff --git a/src/bios/rom/ROM.asm b/src/bios/rom/ROM.asm index 688c692..55a3fdb 100644 --- a/src/bios/rom/ROM.asm +++ b/src/bios/rom/ROM.asm @@ -1,5 +1,6 @@ ; ; MODULE ROM_PART + DISPLAY "\r\n/=====================[ROM part]=====================\\" ;------------[Begin of ROM]------------- ROM_START: DI @@ -7,17 +8,17 @@ ROM_START: ;--------------------------------------- ;--------------[checksum]--------------- - BLOCK 4-$,#FF + _mInfoBLOCK 4-$,#FF Check_Sum: DB #FF,#FF,#FF,#FF ; место для контрольной суммы ;--------------------------------------- - BLOCK #10-$,#FF + _mInfoBLOCK #10-$,#FF RET ;--------------------------------------- ;!TODO прикрутить к ROM.BIOS ;----------------[int]------------------ - BLOCK #38-$,#FF + _mInfoBLOCK #38-$,#FF ; INT: PUSH BC ; PUSH AF @@ -434,5 +435,13 @@ RET_TO_TRDOS: _mInfoBLOCK #4000-$,#FF ;======================================= + IFNDEF PREBUILD + DISPLAY ' -------------------[Main.asm]-------------------' + DISPLAY 'End code address: ',/A,MAIN_END_CODE_ADDRESS + DISPLAY 'Code size: ',/A,MAIN_END_CODE_ADDRESS + 1 - COMPILE_ADDR.MAIN + DISPLAY 'End buffers address: ',/A,memBUFFER.End - 1 + DISPLAY 'Free memory: ',/A,#C000 - (memBUFFER.End-1) - STACK.Size + DISPLAY 'Unused bytes before INT_POINTER: ',/A,INT_POINTER-before_intPointer + ENDIF ; ENDMODULE ;ROM_PART ; \ No newline at end of file diff --git a/src/bios/rom/SETUP/KEY.asm b/src/bios/rom/SETUP/KEY.asm index 8c5f6cf..d4eaef0 100644 --- a/src/bios/rom/SETUP/KEY.asm +++ b/src/bios/rom/SETUP/KEY.asm @@ -724,27 +724,27 @@ Ent EQU #0D ; ;================================ -BEEP: LD A,#10 - OUT (ZX_Beeper),A - LD B,D - LD C,E -.loop1: DEC BC - LD A,B - OR C - JR NZ,.loop1 - XOR A ;LD A,#00 - OUT (ZX_Beeper),A - LD B,D - LD C,E -.loop2: DEC BC - LD A,B - OR C - JR NZ,.loop2 - DEC HL - LD A,H - OR L - JR NZ,BEEP - RET +; BEEP: LD A,#10 +; OUT (ZX_Beeper),A +; LD B,D +; LD C,E +; .loop1: DEC BC +; LD A,B +; OR C +; JR NZ,.loop1 +; XOR A ;LD A,#00 +; OUT (ZX_Beeper),A +; LD B,D +; LD C,E +; .loop2: DEC BC +; LD A,B +; OR C +; JR NZ,.loop2 +; DEC HL +; LD A,H +; OR L +; JR NZ,BEEP +; RET ;COM_A EQU #19 Z84.SIO.Ch_A.Ctrl ;DAT_A EQU #18 Z84.SIO.Ch_A.Data diff --git a/src/bios/rom/SETUP/MAIN.asm b/src/bios/rom/SETUP/MAIN.asm index bbbec36..f4e1785 100644 --- a/src/bios/rom/SETUP/MAIN.asm +++ b/src/bios/rom/SETUP/MAIN.asm @@ -631,13 +631,12 @@ START: CALL ZXMODE_SETUP CALL XY_SCREEN -;R06 +;R06 ;[Check Quick Start ROM] LD BC,CMOS_CELL.BootUpParams.Mask.QuickStartROM ;#010E CALL GET_CMOS_VALUE POP BC - INC B - DEC B - JR NZ,IGNORE_QuickStartROM ; результат проверки Space из exp.asm [space_check] + RR C + JR NC,IGNORE_QuickStartROM ; результат проверки Space из exp.asm [Check SPACE] PUSH AF LD C,SLOT3 IN B,(C) @@ -1646,47 +1645,45 @@ SETLAND: LDIR RET +; +; print boot drive number +PRINT_CHANEL: AND #0F + LD C,A + ; + LD A,msgStrings.parPriIdeMA + JR Z,.print_chanel + ; + LD A,msgStrings.parPriIdeSl + DEC C + JR Z,.print_chanel + ; + LD A,msgStrings.parSecIdeMA + DEC C + JR Z,.print_chanel + ; + LD A,msgStrings.parSecIdeSl +.print_chanel: CALL FindStringAddr + ;CALL LP_GET_PLACE + ;LD A,ScreenPOS.SUBNAME.POS + ;SUB E + ;LD B,A + LD B,0 + LD D,#FF + JP LP_PRINT_LINE6 +; + +POSTMSC: CALL FindStringAddr + LD A,E + JP CPRINTZ +; ////////////////////////////////////////////////////////////////////// INCLUDE 'IM2_INT.asm' ////////////////////////////////////////////////////////////////////// -POSTMSG: - CALL FindStringAddr - JP PRINTZ +POSTMSG: CALL FindStringAddr + JP PRINTZ -POSTMSC: - CALL FindStringAddr - LD A,E - JP CPRINTZ -; -; print boot drive number -PRINT_CHANEL: - AND #0F - LD C,A - ; - LD A,msgStrings.parPriIdeMA - JR Z,.print_chanel - ; - LD A,msgStrings.parPriIdeSl - DEC C - JR Z,.print_chanel - ; - LD A,msgStrings.parSecIdeMA - DEC C - JR Z,.print_chanel - ; - LD A,msgStrings.parSecIdeSl -.print_chanel: - CALL FindStringAddr - ;CALL LP_GET_PLACE - ;LD A,ScreenPOS.SUBNAME.POS - ;SUB E - ;LD B,A - LD B,0 - LD D,#FF - JP LP_PRINT_LINE6 -; ;----------------------------------------------------------------------[] ;!TODO сделать выбор в Setup, что грузить в vПЗУ при старте. Варианты: @@ -1870,12 +1867,13 @@ STACK EQU #C000 INCLUDE 'src/bios/logo/Set_Pictures.asm' DISPLAY '-----[Set_Pictures Prebuild done ]-----' ELSE - DISPLAY '------------------[Main.asm]------------------' - DISPLAY 'End code address: ',/A,$-1 - DISPLAY 'Code size: ',/A,$-COMPILE_ADDR.MAIN - DISPLAY 'End buffers address: ',/A,memBUFFER.End-1 - DISPLAY 'Free memory: ',/A,#C000-(memBUFFER.End-1)-STACK.Size - DISPLAY 'Unused bytes before INT_POINTER: ',/A,INT_POINTER-before_intPointer +MAIN_END_CODE_ADDRESS EQU $-1 + ; DISPLAY ' -------------------[Main.asm]-------------------' + ; DISPLAY 'End code address: ',/A,$-1 + ; DISPLAY 'Code size: ',/A,$-COMPILE_ADDR.MAIN + ; DISPLAY 'End buffers address: ',/A,memBUFFER.End-1 + ; DISPLAY 'Free memory: ',/A,#C000-(memBUFFER.End-1)-STACK.Size + ; DISPLAY 'Unused bytes before INT_POINTER: ',/A,INT_POINTER-before_intPointer ENDIF ; diff --git a/src/bios/shared/VERSION.inc b/src/bios/shared/VERSION.inc index 2b7d567..cb93b18 100644 --- a/src/bios/shared/VERSION.inc +++ b/src/bios/shared/VERSION.inc @@ -25,7 +25,7 @@ BIOS_ver_hex EQU EXP_ID.VER*256+EXP_ID.MOD ;-[Version of disk subsystem "VER.MOD"]- ROM_ID: .VER EQU 2 ; Номер версии менять тут! -.MOD EQU 55 ; Номер версии менять тут! +.MOD EQU 56 ; Номер версии менять тут! Disk_subsystem_ver_hex EQU ROM_ID.VER*256+ROM_ID.MOD DEFINE Disk_subsystem_ver_txt '0'+ROM_ID.VER, '.', '0'+ROM_ID.MOD/10, '0'+ROM_ID.MOD-(ROM_ID.MOD/10)*10