From c0b48a007c9b3c7efd027f3d2482457c39a4beab Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sat, 14 Dec 2024 13:11:49 +0800 Subject: [PATCH 1/9] kbd optimizations --- Source/HBIOS/kbd.asm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Source/HBIOS/kbd.asm b/Source/HBIOS/kbd.asm index d7542921..627eb408 100644 --- a/Source/HBIOS/kbd.asm +++ b/Source/HBIOS/kbd.asm @@ -101,9 +101,9 @@ KBD_CON_IOF .EQU $20 ; XLAT DISABLED, MOUSE DISABLED, NO INTS ; KEYBOARD PRE-INITIALIZATION ;__________________________________________________________________________________________________ ; -; TO BE CALLED PRIOR TO INITERRUPTS BEING ENABLED +; TO BE CALLED PRIOR TO INTERRUPTS BEING ENABLED ; MUST BE CALLED FROM VIDEO DRIVER PREINIT WITH IY SET -; THIS PREVENTS INTRERRUPT ISSUES IF 8242 HAS INTERRUPTS ENABLED +; THIS PREVENTS INTERRUPT ISSUES IF 8242 HAS INTERRUPTS ENABLED ; ; AT STARTUP. NOT USING IT FOR NOW BECAUSE IT IS NOT A PROBLEM IF ; YOU DON'T USE THE KEYBOARD DURING BOOT. @@ -156,11 +156,11 @@ KBD_INIT: CP KBDMODE_VRC ; VRC? JR Z,KBD_INIT1 ; IF SO, MUST ASSUME PRESENT ; - HB_DI ; DISABLE INTERRUPTS WHILE WE PROBE +; HB_DI ; DISABLE INTERRUPTS WHILE WE PROBE LD A,KBD_CON_CST ; CONTROLLER SELF TEST CALL KBD_PUTCMD ; SEND IT CALL KBD_GETDATA_P ; CONTROLLER SHOULD RESPOND WITH $55 (ACK) - HB_EI ; RESTORE INTERRUPTS +; HB_EI ; RESTORE INTERRUPTS ; CP $55 ; IS IT THERE? JR Z,KBD_INIT1 ; IF SO, CONTINUE @@ -386,7 +386,7 @@ KBD_RESET: LD A,$FF ; RESET COMMAND CALL KBD_PUTDATA ; SEND IT CALL KBD_GETDATA ; GET THE ACK - LD B,0 ; SETUP LOOP COUNTER + LD KBD_WAITTO ; SETUP LOOP COUNTER KBD_RESET0: PUSH BC ; PRESERVE COUNTER CALL KBD_GETDATA ; TRY TO GET THE RESPONSE @@ -549,8 +549,8 @@ KBD_DEC1: ; PROCESS NEXT SCANCODE RET Z ; NO KEY READY, RETURN WITH A=0, Z SET LD (KBD_SCANCODE),A ; SAVE SCANCODE -KBD_DEC2: ; DETECT AND HANDLE SPECIAL KEYCODES - LD A,(KBD_SCANCODE) ; GET THE CURRENT SCANCODE +;KBD_DEC2: ; DETECT AND HANDLE SPECIAL KEYCODES +; LD A,(KBD_SCANCODE) ; GET THE CURRENT SCANCODE CP $AA ; KEYBOARD INSERTION? JR NZ,KBD_DEC3 ; NOPE, BYPASS CALL LDELAY ; WAIT A BIT From 82d28e143b6f9724ce5fa7b41f2b651467554d56 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sat, 14 Dec 2024 13:17:32 +0800 Subject: [PATCH 2/9] kbd preinit for vga --- Source/HBIOS/vga.asm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Source/HBIOS/vga.asm b/Source/HBIOS/vga.asm index 1b5e023b..171b32c2 100644 --- a/Source/HBIOS/vga.asm +++ b/Source/HBIOS/vga.asm @@ -104,6 +104,11 @@ KBDENABLE .SET TRUE ; INCLUDE KBD KEYBOARD SUPPORT ; VGA DRIVER - INITIALIZATION ;====================================================================== ; +VGA_PREINIT: + LD IY,VGA_IDAT ; POINTER TO INSTANCE DATA + JP KBD_PREINIT ; INITIALIZE KEYBOARD +; RET +; VGA_INIT: LD IY,VGA_IDAT ; POINTER TO INSTANCE DATA ; From 0d645cec3094916545d9f729f13f98539b166906 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sat, 14 Dec 2024 13:19:38 +0800 Subject: [PATCH 3/9] kbd correction. vga kbd preinit --- Source/HBIOS/kbd.asm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Source/HBIOS/kbd.asm b/Source/HBIOS/kbd.asm index 627eb408..de4b2479 100644 --- a/Source/HBIOS/kbd.asm +++ b/Source/HBIOS/kbd.asm @@ -386,7 +386,7 @@ KBD_RESET: LD A,$FF ; RESET COMMAND CALL KBD_PUTDATA ; SEND IT CALL KBD_GETDATA ; GET THE ACK - LD KBD_WAITTO ; SETUP LOOP COUNTER + LD B,KBD_WAITTO ; SETUP LOOP COUNTER KBD_RESET0: PUSH BC ; PRESERVE COUNTER CALL KBD_GETDATA ; TRY TO GET THE RESPONSE @@ -394,7 +394,6 @@ KBD_RESET0: JR NZ,KBD_RESET1 ; GOT A BYTE? IF SO, GET OUT OF LOOP DJNZ KBD_RESET0 ; LOOP TILL COUNTER EXHAUSTED KBD_RESET1: -; LD A,B XOR A ; SIGNAL SUCCESS (RESPONSE IS IGNORED...) RET ; DONE ; From 327a21ee10dea2ec16c1c02a5c7d08c81056b81f Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sat, 14 Dec 2024 13:20:19 +0800 Subject: [PATCH 4/9] Update hbios --- Source/HBIOS/hbios.asm | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 01ad296d..d52cd874 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -3885,6 +3885,9 @@ HB_PCINITTBL: #IF (UFENABLE) .DW UF_PREINIT #ENDIF +#IF (VGAENABLE) + .DW VGA_PREINIT +#ENDIF #IF (TMSENABLE) .DW TMS_PREINIT #ENDIF @@ -5315,12 +5318,6 @@ SYS_RESWARM: ; RESTART SYSTEM AS THOUGH POWER HAD JUST BEEN TURNED ON ; SYS_RESCOLD: -; -; TURN OFF SPURIOUS INTERRUPT SOURCES -; -;;;#IF ((INTMODE == 2) & KBDINTS)) -;;; CALL KBD_DEINIT -;;;#ENDIF #IFDEF APPBOOT JP HB_RESTART #ELSE From 83cd133c66fa75bcb1c49d1505d67c0af8877384 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sat, 14 Dec 2024 13:59:11 +0800 Subject: [PATCH 5/9] kbd preinit updates --- Source/HBIOS/gdc.asm | 5 +++++ Source/HBIOS/hbios.asm | 3 +++ Source/HBIOS/ps2iface.inc | 13 ++----------- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/Source/HBIOS/gdc.asm b/Source/HBIOS/gdc.asm index 6e0fc085..3ded2170 100644 --- a/Source/HBIOS/gdc.asm +++ b/Source/HBIOS/gdc.asm @@ -71,6 +71,11 @@ KBDENABLE .SET TRUE ; INCLUDE KBD KEYBOARD SUPPORT ; GDC DRIVER - INITIALIZATION ;====================================================================== ; +GDC_PREINIT: + LD IY,GDC_IDAT ; POINTER TO INSTANCE DATA + JP KBD_PREINIT ; INITIALIZE KEYBOARD +; RET + GDC_INIT: LD IY,GDC_IDAT ; POINTER TO INSTANCE DATA diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index d52cd874..4085220c 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -3888,6 +3888,9 @@ HB_PCINITTBL: #IF (VGAENABLE) .DW VGA_PREINIT #ENDIF +#IF (GDCENABLE) + .DW GDC_PREINIT +#ENDIF #IF (TMSENABLE) .DW TMS_PREINIT #ENDIF diff --git a/Source/HBIOS/ps2iface.inc b/Source/HBIOS/ps2iface.inc index 3ed1e7f7..decf0d60 100644 --- a/Source/HBIOS/ps2iface.inc +++ b/Source/HBIOS/ps2iface.inc @@ -21,7 +21,7 @@ KBDQPUTX .DB 0 ; QUEUE INDEX ; .DB $55 ; GUARD BYTE FOR DEBUGGING ; NOTE THAT SCAN CODES ARE BEING KBDQ .FILL KBDQSIZ,0 ; CIRCULAR KEYBOARD BUFFER ; BUFFERED. ONE KEY PRESS CAN ; .DB $AA ; GUARD BYTE FOR DEBUGGING ; GENERATE SEVERAL SCAN CODES - +; ;__________________________________________________________________________________________________ ; RESET THE QUEUE TO EMPTY ;__________________________________________________________________________________________________ @@ -58,17 +58,8 @@ KBD_INT: ; CALL KBDQDBG ; RET -;;;;__________________________________________________________________________________________________ -;;;; KEYBOARD DEINITIALIZATION -;;;;__________________________________________________________________________________________________ -;;;; -;;;KBD_DEINIT: -;;; LD IY,(KBD_IDAT) ; SETUP PORT POINTER -;;; LD A,KBD_CON_WCR ; LOAD WRITE COMMAND -;;; CALL KBD_CMDOUT ; WRITE IT -;;; LD A,KBD_CON_IOF ; LOAD DISABLE INTERRUPTS CFG -;;; JP KBD_DTAOUT ; WRITE IT #ENDIF +; ;__________________________________________________________________________________________________ ; KEYBOARD READ ;__________________________________________________________________________________________________ From b0bb87ba0a6bf33a5426a42b86113c5c791c0ee8 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sat, 14 Dec 2024 17:19:14 +0800 Subject: [PATCH 6/9] typo --- Source/HBIOS/prp.asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/HBIOS/prp.asm b/Source/HBIOS/prp.asm index f00557ed..db923c5a 100644 --- a/Source/HBIOS/prp.asm +++ b/Source/HBIOS/prp.asm @@ -280,7 +280,7 @@ PRPSD_TYPESDXC .EQU 4 ; SDXC CARD (V3) PRPSD_STOK .EQU 0 ; OK PRPSD_STINVUNIT .EQU -1 ; INVALID UNIT PRPSD_STRDYTO .EQU -2 ; TIMEOUT WAITING FOR CARD TO BE READY -PRPSD_STINITTO .EQU -3 ; INITIALIZATOIN TIMEOUT +PRPSD_STINITTO .EQU -3 ; INITIALIZATION TIMEOUT PRPSD_STCMDTO .EQU -4 ; TIMEOUT WAITING FOR COMMAND RESPONSE PRPSD_STCMDERR .EQU -5 ; COMMAND ERROR OCCURRED (REF PRPSD_RC) PRPSD_STDATAERR .EQU -6 ; DATA ERROR OCCURRED (REF PRPSD_TOK) From 083715e097348ae3a02e8483dc7714cf6fa80371 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sat, 14 Dec 2024 18:01:18 +0800 Subject: [PATCH 7/9] Add cga graphic set picture --- Source/Fonts/fontcgac.png | Bin 0 -> 9327 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Source/Fonts/fontcgac.png diff --git a/Source/Fonts/fontcgac.png b/Source/Fonts/fontcgac.png new file mode 100644 index 0000000000000000000000000000000000000000..df9638c53c4e21ef72b14c589a608c55991fc929 GIT binary patch literal 9327 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 literal 0 HcmV?d00001 From e428e7ff8ee76e7d09ad99f86148eb7391941920 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sat, 14 Dec 2024 18:24:32 +0800 Subject: [PATCH 8/9] rename --- Source/Fonts/{fontcgac.png => fontcgau.png} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename Source/Fonts/{fontcgac.png => fontcgau.png} (100%) diff --git a/Source/Fonts/fontcgac.png b/Source/Fonts/fontcgau.png similarity index 100% rename from Source/Fonts/fontcgac.png rename to Source/Fonts/fontcgau.png From 2e216d6bf5b17665c200b14f95ebd676c55ec18c Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sat, 14 Dec 2024 20:10:13 +0800 Subject: [PATCH 9/9] Add cga graphic set picture --- Source/Fonts/fontcgac.png | Bin 0 -> 3587 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Source/Fonts/fontcgac.png diff --git a/Source/Fonts/fontcgac.png b/Source/Fonts/fontcgac.png new file mode 100644 index 0000000000000000000000000000000000000000..aacd2cf1eb35df9c61a293332a9964a4e3d182cc GIT binary patch literal 3587 zcmaJ^4Omk58n<<4b1uED-K9?Fx~AS{njcs5BdFDyIyFi+5do{|M=CuDxGmiLCM2o#r>9$IiI8wo zn9s`gBXK=^!sc~%FO3hR2!u^-A|sAJSbJej!Q`YgD@I!*m~BbFnZ~rT`20;9&-!`_ zHtfM|7f)|2kNtGgbHl!K+HK2*J@V3JP4TR&Wo~VHRAsX+pz$r7oVa!j%a{dU2^2B` zC#^YTA}e$U%;$Q6S3+;lI0G^gseV8BXCD2b)gL2no$x8rrC2739{b&2?f$l?H^BXq zdZQ!1JxuTQyjxK_%o5IWsT|;e8*~-Y5rFX&FJ~iL1-Z1k#Dm&kVl-%bsIE4Q)TcQK z$+w6HYOIQ4RYR(hX8G2DjvD|1vaO^d<8xu;MmB%>SFp>5y&PG&f!*0Z>%-KBA%C-Z zU%=#6UahG+;C|2z7Iu=5j}+V;bc4?2(?#dylK6+zv^AHCf~#`fH3WR&a!BHEq$(Um zPHcuDv?Wxb+0eM~&Ki{6>WiS1Fq@esouw&gjZ+FT*a=HdsTd!$=-X9)L)5&^3b;?} zVqvoiGgB9haPrZ{b(SbylKDA@zqCr(QM!wLa*03H|h%CXqGg$G=e)fiDG^UKD4&JnE2 zO5)t`0RN3hEyEhQ)!jn0Qo zWBv5)Q_pAZR^@upYv=Py(px68ZHb3UL~#d(wrOLmoW1+vB3P2 zVnmX$6uA*@{&p3(l=(_dsFBrI5WkUz&X>Q?sXEFVVgm2yu_j8M0bxRyxItc{*JdX} z&V9K`>D!aQ8((6Y&`|1^J@U6=2@Q<$40o_sMZ?^(+?K&cX+vq17*d%&PI;=iTJog5 z7sSTeu6{*D+_jTv5K>UZg<3SG9^(+REmwK2tX~?1#7fJ+E=LreHFKRbI;a4A^ftG8 z^)%_u*hIZ6=L;P*&AS9CYo*$EF-g->W^s%^>O=Mw*o!We>&kM~OnC)zpe*l{z(9*KcQicRR^kqxy4Po=<|^e9mDDIyV^|=nKT4v4kbYq$7xe~7UH`}Z z|B+U~?y#UhL~caS1N;lT62~n5%=sxa&f_o$$ZP!ArpZ0>{Q?yfn^m`8?}@@c{q3%j;@Ld6mR&2yaOu#;W>k zLtp>DnZH8(`ynrLX{%~)RfSc>Us;<5%d6enVlgswd&dGAF- z8+V(6x9l3V(JuVKXGu4U#!ujtf%o3| zR2-EebJO+$d&`&74^K+##;S$*U6y?)7s|XH&f4JVc52oH6ICamR@WVtm1vqSs z5sx6bkP!pb|DMDZnjnVEq@mKuem$40v*-vl2w~EXbmx8`ejo27V;bZKz0f`tdmBosf_I2{u}`C> z-x||Mmg55E$LutpCOM0!yCf+RI-dbk%56qg?bg#Ijb~#}_^GWs3zHbteLWK*hz#q- z=0OjOH}k@99pUUG-pX8C0q6=2!FGC^Z!lZX-w z^FWqvQ#ogJq*H7l^aX6bw;v8}E{XX*LguX2UzXyc1IoV#0_ZHwe$JKfA~sKXu`CsO z$fXI8tWrFl7wZBo_G-Vu&%xnE<&*7|hl3Hp