From 2b6fbe7c58b1ce9a23ac2b93a1026585324bdf9e Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Tue, 27 Aug 2024 15:34:44 -0700 Subject: [PATCH] HD44780 LCD Support --- Doc/ChangeLog.txt | 1 + Doc/RomWBW Applications.pdf | Bin 340956 -> 340956 bytes Doc/RomWBW Disk Catalog.pdf | Bin 123772 -> 123771 bytes Doc/RomWBW Errata.pdf | Bin 28764 -> 28575 bytes Doc/RomWBW System Guide.pdf | Bin 579617 -> 579618 bytes Doc/RomWBW User Guide.pdf | Bin 787741 -> 787759 bytes ReadMe.md | 2 +- ReadMe.txt | 2 +- Source/Doc/UserGuide.md | 1 + Source/HBIOS/cfg_duo.asm | 3 + Source/HBIOS/cfg_dyno.asm | 3 + Source/HBIOS/cfg_epitx.asm | 3 + Source/HBIOS/cfg_fz80.asm | 3 + Source/HBIOS/cfg_heath.asm | 3 + Source/HBIOS/cfg_master.asm | 3 + Source/HBIOS/cfg_mbc.asm | 3 + Source/HBIOS/cfg_mk4.asm | 3 + Source/HBIOS/cfg_mon.asm | 3 + Source/HBIOS/cfg_n8.asm | 3 + Source/HBIOS/cfg_nabu.asm | 3 + Source/HBIOS/cfg_rcz180.asm | 3 + Source/HBIOS/cfg_rcz280.asm | 3 + Source/HBIOS/cfg_rcz80.asm | 3 + Source/HBIOS/cfg_rph.asm | 3 + Source/HBIOS/cfg_s100.asm | 3 + Source/HBIOS/cfg_sbc.asm | 3 + Source/HBIOS/cfg_scz180.asm | 3 + Source/HBIOS/cfg_z80retro.asm | 3 + Source/HBIOS/cfg_zeta.asm | 3 + Source/HBIOS/cfg_zeta2.asm | 3 + Source/HBIOS/hbios.asm | 27 ++- Source/HBIOS/hdsk.asm | 8 +- Source/HBIOS/ide.asm | 24 +-- Source/HBIOS/imm.asm | 8 +- Source/HBIOS/lcd.asm | 392 ++++++++++++++++++++++++++++++++++ Source/HBIOS/md.asm | 8 +- Source/HBIOS/ppa.asm | 8 +- Source/HBIOS/ppide.asm | 24 +-- Source/HBIOS/ppp.asm | 8 +- Source/HBIOS/prp.asm | 8 +- Source/HBIOS/rf.asm | 8 +- Source/HBIOS/sd.asm | 8 +- Source/HBIOS/syq.asm | 8 +- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 45 files changed, 546 insertions(+), 66 deletions(-) create mode 100644 Source/HBIOS/lcd.asm diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index a5c03a48..48dd0df8 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -32,6 +32,7 @@ Version 3.5 - WBW: Substantial customization of NZ-COM disk image - WBW: Refactor build post-processing (ZRC, ZZRCC, etc.) - MAP: Improved section Real Time Clock in User Guide document +- WBW: Support for Hitachi HD44780-based LCD display Version 3.4 ----------- diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index 7f83123b9f921be8c46bfc4d73a6a015ea0d77bc..e03f4e0aeef728fbc22375ea180f8895586b9ed2 100644 GIT binary patch delta 557 zcmccfT;$GkkqPbf*-s33_B{`O!QZpGJ-$gG<5u3yy<4Abd$aPwytYgK{vSS-Z2ghv zv{8o0@lE^MWm@4{j_j&Kw<~|mI`Q*_;q|uFjrPDy)I+LKcUbADsTzl%zdH z<+&kar}^%0Gh4PE7doBO^;vnZ^tXT0YWLdxe|~q@slt-nl=b`VJ5Q>9T`=vFVL(=M zkE_Oin>)dJdgZ|%_St*R{O7#-;Ny9-UH2-P&I(E1Q1RsI=gVe)S*-$Z9iJ{}$0*!v z&(v}4tz}VZBKe0qQIysseTDn-68Cp0yJDNHf g8atVpI-469xj30S8yT25*(ul<6HqdJpE0W(07{Gm#{d8T delta 557 zcmccfT;$GkkqPbf`L_*t_Wch3!0+^ z-2C^~wZShdq@vc{{_;Urv%_l20l{tY)f+o3`~{D6E1%jB``~zwhG4zxd|kP>m99@B zK7A^#Uc1)9DuvTz+an#l)eQ<#e(#SYCT^6e;dc4rFLv^fnBw))4atqVmx_|sKV9;W zE%)kDFX_6pgc6-YnMb~#@H1r+pSxoBl+TAura!)>C)Oaip+WVwYPC0;KQqTf@073R zb()r@^CeCmk*muLEq{75RPYo{e1SZV2)Yg090ecs!tuX9glFWtXs&6Iz2W_j=RnSIOT zgeO#N&YtfXQLVG_%rXo6OS_ZbzrT6?^=H%f*FyUiXDe6#{_E+Zw~~G9l>Wvb=@cD} zU(X-TD=OSMyXpBqmDFGTYuWm%^TfV(UC9XQJ@{y1`1$j{7@--9*7=1OJm-V{`@Z*gc;4qd&vPz+H>Y(p zr`1i5TzGXu)U$fYxU!L#S@&~)K6|LouF9g7>W;BhSGN2->X%Uy()a8sXzA$8e6Z~J z=3d1k29^nb>Cl@!S~I)fpSHJl@{F!sKJQvnKV(-U{i z+ta>X4{^3&S;mH}elr*U_|nLn#HIX&Rh1>_Z)EO0m;bketBbNk6}w6smU6hH*ir@tQucCke*zd_+n~%Mg5~uUiA~%^+Vt9mi_SQ z-GjOv*|hQU%5C?YIksl;!Ph7MwRG^RhPQexySTEgaq`R=P4AxAK5t**UVZq*=8BA* zh1;iG$=}y}a`v^ga~5AbP`jyVK>FNI^OtO%@LNgMa~X#VKiF;hJac69;Yn-OjU9As z;wzQYzG_%rH*ItI_?+RLpKba0)R&|BKfb)AZ(Y@g(|#Sk`poL*+sa&qzXf5$q0m2T8HQ)KyVx`gd+J-TpJwcjFw?cDhRHW$IOJb48tmBg$wIr z2$W7{lqT=CRvAH9SmQ%`3_;SVwWOrA$8n&vXQBA(D7%`XJ8~n0OB}})sE?R&B?W#k zxWr*8AX)NyT-HqkbC5@eR^U{K4a6PSXB8I@M zr8W*bM`|b_^g3ysabZUa77T7ARSe-Av1N)mB|>zXK7>i@4Q8g8u@nMmgfTG$CaB;_ z{1659#dcTHdFUlE1i8^N+{u|zjHs_HjE&G9LtwEq6ONF!Qes6klU{`4?@~bsEwBf* zkeWgmro)ODf`n^B(g{tD6rC1E@X#7V5OfVCjXVGbCmjv6*FNww0D&_N-O}Rx7y-qP zU=8ni<$VT2irq?oU{FFR^2R7r1jw3_(9R zQtXZ~TzZ^a3D#O4Lts%IM5FvbxVSN;Zw_h4B$Qcu41sC{!eJ#qHiG_5%FMBN&KI9g z@el{Y7qMUt8X39Dc*DYq7=ng7kIv!^gp9&?9q^$whCoh)aM-%=LpUd+$Z;6wfqzeP z!Qc~F9vxR?+i>0}8)^We8e7J3I=P_Tle+ORTTp(OXO7s?!!C;D@toh72)E`ujB?FG zUTccvddM2VfE^0m&zW%`ab*la!$IWRlgptb#1N=DfHSc>glmP$0?v%` zA#s7~6R*Fxhk@)G+a1mfhixN4zxiPMguM-_WN@GyVnhf~gk( delta 4698 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 delta 9459 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 aZ_#&f`s`qAf(GOP@q*Ck=p+;*(f$LZ|4d&1 diff --git a/Doc/RomWBW System Guide.pdf b/Doc/RomWBW System Guide.pdf index 3dab9cafcf5ee8ab092c6034d5924ef7146eacbf..96d70a7c73bcb48b831441bcc899aa1bf00c7188 100644 GIT binary patch delta 25571 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 b@vc9;_?&Y$@&9MQ8>CHJx1PM?9h?3S6O6GX delta 25694 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 delta 14479 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 diff --git a/ReadMe.md b/ReadMe.md index 8d0988fc..615bd7b3 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -3,7 +3,7 @@ **RomWBW ReadMe** \ Version 3.5 \ Wayne Warthen ([wwarthen@gmail.com](mailto:wwarthen@gmail.com)) \ -26 Aug 2024 +27 Aug 2024 # Overview diff --git a/ReadMe.txt b/ReadMe.txt index eeef95b3..0388635d 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -1,6 +1,6 @@ RomWBW ReadMe Wayne Warthen (wwarthen@gmail.com) -26 Aug 2024 +27 Aug 2024 diff --git a/Source/Doc/UserGuide.md b/Source/Doc/UserGuide.md index 6f60a195..c7f403f9 100644 --- a/Source/Doc/UserGuide.md +++ b/Source/Doc/UserGuide.md @@ -6131,6 +6131,7 @@ may be discovered by RomWBW in your system. | INTRTC | RTC | Interrupt-based Real Time Clock | | KBD | Keyboard | 8242 PS/2 Keyboard Controller | | KIO | System | Zilog Serial/ Parallel Counter/Timer | +| LCD | System | Hitachi HD44780-based LCD Display | | LPT | Char | Parallel I/O Controller | | MD | Disk | ROM/RAM Disk | | MSXKYB | Keyboard | MSX Compliant Matrix Keyboard | diff --git a/Source/HBIOS/cfg_duo.asm b/Source/HBIOS/cfg_duo.asm index ac440660..935e9c3b 100644 --- a/Source/HBIOS/cfg_duo.asm +++ b/Source/HBIOS/cfg_duo.asm @@ -90,6 +90,9 @@ PKDENABLE .EQU TRUE ; ENABLES DSKY NG PKD DRIVER (8259) PKDPPIBASE .EQU $88 ; BASE I/O ADDRESS OF PKD PPI PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL +LCDENABLE .EQU FALSE ; ENABLE LCD DISPLAY +LCDBASE .EQU $DA ; BASE I/O ADDRESS OF LCD CONTROLLER +LCDDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_dyno.asm b/Source/HBIOS/cfg_dyno.asm index 0ddc8c08..6001a658 100644 --- a/Source/HBIOS/cfg_dyno.asm +++ b/Source/HBIOS/cfg_dyno.asm @@ -92,6 +92,9 @@ PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL +LCDENABLE .EQU FALSE ; ENABLE LCD DISPLAY +LCDBASE .EQU $DA ; BASE I/O ADDRESS OF LCD CONTROLLER +LCDDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_epitx.asm b/Source/HBIOS/cfg_epitx.asm index acc5efdc..12492497 100644 --- a/Source/HBIOS/cfg_epitx.asm +++ b/Source/HBIOS/cfg_epitx.asm @@ -93,6 +93,9 @@ PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL +LCDENABLE .EQU FALSE ; ENABLE LCD DISPLAY +LCDBASE .EQU $DA ; BASE I/O ADDRESS OF LCD CONTROLLER +LCDDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_fz80.asm b/Source/HBIOS/cfg_fz80.asm index e2da9217..365e9a7f 100644 --- a/Source/HBIOS/cfg_fz80.asm +++ b/Source/HBIOS/cfg_fz80.asm @@ -92,6 +92,9 @@ PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL +LCDENABLE .EQU FALSE ; ENABLE LCD DISPLAY +LCDBASE .EQU $DA ; BASE I/O ADDRESS OF LCD CONTROLLER +LCDDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_heath.asm b/Source/HBIOS/cfg_heath.asm index 757ab89c..68ab5e74 100644 --- a/Source/HBIOS/cfg_heath.asm +++ b/Source/HBIOS/cfg_heath.asm @@ -92,6 +92,9 @@ PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .EQU TRUE ; ENABLES HEATH H8 FRONT PANEL +LCDENABLE .EQU FALSE ; ENABLE LCD DISPLAY +LCDBASE .EQU $DA ; BASE I/O ADDRESS OF LCD CONTROLLER +LCDDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index 27cfffa2..558b8d82 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -121,6 +121,9 @@ PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL +LCDENABLE .EQU FALSE ; ENABLE LCD DISPLAY +LCDBASE .EQU $DA ; BASE I/O ADDRESS OF LCD CONTROLLER +LCDDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_mbc.asm b/Source/HBIOS/cfg_mbc.asm index 10551bd8..38d84b2d 100644 --- a/Source/HBIOS/cfg_mbc.asm +++ b/Source/HBIOS/cfg_mbc.asm @@ -87,6 +87,9 @@ PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL +LCDENABLE .EQU FALSE ; ENABLE LCD DISPLAY +LCDBASE .EQU $DA ; BASE I/O ADDRESS OF LCD CONTROLLER +LCDDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index 2b65a9c8..0cc30961 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -92,6 +92,9 @@ PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL +LCDENABLE .EQU FALSE ; ENABLE LCD DISPLAY +LCDBASE .EQU $DA ; BASE I/O ADDRESS OF LCD CONTROLLER +LCDDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_mon.asm b/Source/HBIOS/cfg_mon.asm index 65564ab9..aa9edb43 100644 --- a/Source/HBIOS/cfg_mon.asm +++ b/Source/HBIOS/cfg_mon.asm @@ -87,6 +87,9 @@ PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL +LCDENABLE .EQU FALSE ; ENABLE LCD DISPLAY +LCDBASE .EQU $DA ; BASE I/O ADDRESS OF LCD CONTROLLER +LCDDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index ef92f4af..ff1341e3 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -94,6 +94,9 @@ PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) PKDPPIBASE .EQU N8_PPI0 ; BASE I/O ADDRESS OF PKD PPI PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL +LCDENABLE .EQU FALSE ; ENABLE LCD DISPLAY +LCDBASE .EQU $DA ; BASE I/O ADDRESS OF LCD CONTROLLER +LCDDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_nabu.asm b/Source/HBIOS/cfg_nabu.asm index e19bf2ae..ac92fc56 100644 --- a/Source/HBIOS/cfg_nabu.asm +++ b/Source/HBIOS/cfg_nabu.asm @@ -92,6 +92,9 @@ PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL +LCDENABLE .EQU FALSE ; ENABLE LCD DISPLAY +LCDBASE .EQU $DA ; BASE I/O ADDRESS OF LCD CONTROLLER +LCDDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index 97aea416..85527376 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -98,6 +98,9 @@ PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL +LCDENABLE .EQU TRUE ; ENABLE LCD DISPLAY +LCDBASE .EQU $AA ; BASE I/O ADDRESS OF LCD CONTROLLER +LCDDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_rcz280.asm b/Source/HBIOS/cfg_rcz280.asm index 4841795e..b347ea71 100644 --- a/Source/HBIOS/cfg_rcz280.asm +++ b/Source/HBIOS/cfg_rcz280.asm @@ -92,6 +92,9 @@ PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL +LCDENABLE .EQU TRUE ; ENABLE LCD DISPLAY +LCDBASE .EQU $DA ; BASE I/O ADDRESS OF LCD CONTROLLER +LCDDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index bc22d90c..83dece82 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -92,6 +92,9 @@ PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL +LCDENABLE .EQU TRUE ; ENABLE LCD DISPLAY +LCDBASE .EQU $DA ; BASE I/O ADDRESS OF LCD CONTROLLER +LCDDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_rph.asm b/Source/HBIOS/cfg_rph.asm index 6324233b..a0dfcff0 100644 --- a/Source/HBIOS/cfg_rph.asm +++ b/Source/HBIOS/cfg_rph.asm @@ -92,6 +92,9 @@ PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) PKDPPIBASE .EQU RPH_PPI0 ; BASE I/O ADDRESS OF PKD PPI PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL +LCDENABLE .EQU FALSE ; ENABLE LCD DISPLAY +LCDBASE .EQU $DA ; BASE I/O ADDRESS OF LCD CONTROLLER +LCDDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_s100.asm b/Source/HBIOS/cfg_s100.asm index b96ca7ea..cbe138dc 100644 --- a/Source/HBIOS/cfg_s100.asm +++ b/Source/HBIOS/cfg_s100.asm @@ -92,6 +92,9 @@ PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL +LCDENABLE .EQU FALSE ; ENABLE LCD DISPLAY +LCDBASE .EQU $DA ; BASE I/O ADDRESS OF LCD CONTROLLER +LCDDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 4ea037e3..70ff423c 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -87,6 +87,9 @@ PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL +LCDENABLE .EQU FALSE ; ENABLE LCD DISPLAY +LCDBASE .EQU $DA ; BASE I/O ADDRESS OF LCD CONTROLLER +LCDDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index b68d0545..b5931287 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -92,6 +92,9 @@ PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL +LCDENABLE .EQU TRUE ; ENABLE LCD DISPLAY +LCDBASE .EQU $AA ; BASE I/O ADDRESS OF LCD CONTROLLER +LCDDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_z80retro.asm b/Source/HBIOS/cfg_z80retro.asm index 09a7f6ce..c72b1aba 100644 --- a/Source/HBIOS/cfg_z80retro.asm +++ b/Source/HBIOS/cfg_z80retro.asm @@ -90,6 +90,9 @@ PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL +LCDENABLE .EQU FALSE ; ENABLE LCD DISPLAY +LCDBASE .EQU $DA ; BASE I/O ADDRESS OF LCD CONTROLLER +LCDDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_zeta.asm b/Source/HBIOS/cfg_zeta.asm index 67afc68a..22fdc276 100644 --- a/Source/HBIOS/cfg_zeta.asm +++ b/Source/HBIOS/cfg_zeta.asm @@ -79,6 +79,9 @@ PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL +LCDENABLE .EQU FALSE ; ENABLE LCD DISPLAY +LCDBASE .EQU $DA ; BASE I/O ADDRESS OF LCD CONTROLLER +LCDDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_zeta2.asm b/Source/HBIOS/cfg_zeta2.asm index e98879b7..6e1e6985 100644 --- a/Source/HBIOS/cfg_zeta2.asm +++ b/Source/HBIOS/cfg_zeta2.asm @@ -90,6 +90,9 @@ PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL +LCDENABLE .EQU FALSE ; ENABLE LCD DISPLAY +LCDBASE .EQU $DA ; BASE I/O ADDRESS OF LCD CONTROLLER +LCDDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index f0647adc..4b3c976c 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -2299,6 +2299,9 @@ HB_CPU1: LD B,BF_DSKYSHOWSEG CALL DSKY_DISPATCH #ENDIF +#IF (LCDENABLE) + CALL LCD_PREINIT +#ENDIF #IF (H8PENABLE) CALL H8P_PREINIT #ENDIF @@ -3700,6 +3703,9 @@ HB_INITTBL: .DW PKD_INIT #ENDIF #ENDIF +#IF (LCDENABLE) + .DW LCD_INIT +#ENDIF #IF (H8PENABLE) .DW H8P_INIT #ENDIF @@ -4293,10 +4299,15 @@ HB_DSKFUNC .DB 0 ; CURRENT DISK FUNCTION ; HL: ADDRESS OF 32-BIT SECTOR NUMBER (LITTLE-ENDIAN) ; ALL REGISTERS PERSERVED ; +HB_DSKACT: +#IF (LCDENABLE) + #IF (LCDDSKACT) + CALL LCD_DSKACT + #ENDIF +#ENDIF #IF (DSKYENABLE) #IF (DSKYDSKACT) ; -HB_DSKACT: ; SAVE EVERYTHING PUSH AF PUSH BC @@ -4341,7 +4352,7 @@ HB_DSKACT2: POP DE POP BC POP AF - RET ; DONE + JR HB_DSKACT_Z ; DONE ; ; THIS IS THE CHS VARIANT OF THE ABOVE. THIS IS USED BY CHS ORIENTED ; DISK DRIVERS (BASICALLY JUST FLOPPY). @@ -4366,6 +4377,9 @@ HB_DSKACTCHS: #ENDIF #ENDIF ; +HB_DSKACT_Z: + RET +; ;-------------------------------------------------------------------------------------------------- ; REAL TIME CLOCK DEVICE DISPATCHER ;-------------------------------------------------------------------------------------------------- @@ -7957,6 +7971,15 @@ SIZ_PKD .EQU $ - ORG_PKD #ENDIF #ENDIF ; +#IF (LCDENABLE) +ORG_LCD .EQU $ + #INCLUDE "lcd.asm" +SIZ_LCD .EQU $ - ORG_LCD + MEMECHO "LCD occupies " + MEMECHO SIZ_LCD + MEMECHO " bytes.\n" +#ENDIF +; #IF (H8PENABLE) ORG_H8P .EQU $ #INCLUDE "h8p.asm" diff --git a/Source/HBIOS/hdsk.asm b/Source/HBIOS/hdsk.asm index 6dfc426f..af357564 100644 --- a/Source/HBIOS/hdsk.asm +++ b/Source/HBIOS/hdsk.asm @@ -239,13 +239,13 @@ HDSK_RW0: XOR A ; A = 0 LD (HDSK_RC),A ; CLEAR RETURN CODE ; -#IF (DSKYENABLE) - #IF (DSKYDSKACT) +;;;#IF (DSKYENABLE) +;;; #IF (DSKYDSKACT) LD A,HDSK_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY - #ENDIF -#ENDIF +;;; #ENDIF +;;;#ENDIF ; ; CONVERT LBA HHHH:LLLL (4 BYTES) ; TO HDSK TRACK/SECTOR TTTT:SS (3 BYTES) diff --git a/Source/HBIOS/ide.asm b/Source/HBIOS/ide.asm index 4bead8cc..7abb8316 100644 --- a/Source/HBIOS/ide.asm +++ b/Source/HBIOS/ide.asm @@ -920,13 +920,13 @@ IDE_PKT_RDSEC: #ENDIF ; SETUP LBA ; -#IF (DSKYENABLE) - #IF (DSKYDSKACT) +;;;#IF (DSKYENABLE) +;;; #IF (DSKYDSKACT) LD A,IDE_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY - #ENDIF -#ENDIF +;;; #ENDIF +;;;#ENDIF ; ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN LD HL,IDE_PKTCMD_RW10+3 ; START OF LBA FIELD IN CDB (MSB) @@ -989,13 +989,13 @@ IDE_PKT_WRSEC: #ENDIF ; SETUP LBA ; -#IF (DSKYENABLE) - #IF (DSKYDSKACT) +;;;#IF (DSKYENABLE) +;;; #IF (DSKYDSKACT) LD A,IDE_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY - #ENDIF -#ENDIF +;;; #ENDIF +;;;#ENDIF ; ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN LD HL,IDE_PKTCMD_RW10+3 ; START OF LBA FIELD IN CDB (MSB) @@ -1021,13 +1021,13 @@ IDE_PKT_WRSEC: ; IDE_SETADDR: ; -#IF (DSKYENABLE) - #IF (DSKYDSKACT) +;;;#IF (DSKYENABLE) +;;; #IF (DSKYDSKACT) LD A,IDE_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY - #ENDIF -#ENDIF +;;; #ENDIF +;;;#ENDIF ; SEND 3 LOWEST BYTES OF LBA IN REVERSE ORDER ; IDE_REG_LBA3 HAS ALREADY BEEN SET ; HSTLBA2-0 --> IDE_REG_LBA2-0 diff --git a/Source/HBIOS/imm.asm b/Source/HBIOS/imm.asm index 237c6ed4..9ab0940b 100644 --- a/Source/HBIOS/imm.asm +++ b/Source/HBIOS/imm.asm @@ -343,13 +343,13 @@ IMM_IO: ; LD (IMM_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS ; -#IF (DSKYENABLE) - #IF (DSKYDSKACT) +;;;#IF (DSKYENABLE) +;;; #IF (DSKYDSKACT) LD A,IMM_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY - #ENDIF -#ENDIF +;;; #ENDIF +;;;#ENDIF ; ; SETUP LBA ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN diff --git a/Source/HBIOS/lcd.asm b/Source/HBIOS/lcd.asm new file mode 100644 index 00000000..94833001 --- /dev/null +++ b/Source/HBIOS/lcd.asm @@ -0,0 +1,392 @@ +; +;================================================================================================== +; HARDWARE SUPPORT FOR HITACHI HD44780 OR EQUIVALENT +;================================================================================================== +; +; CURRENTLY ASSUMES A 20X4 DISPLAY +; +; TYPICAL PORTS USED ON RCBUS ECOSYSTEM: +; +; PRIMARY ALT +; FUNCTION $DA $AA +; DATA $DB $AB +; +LCD_FUNC .EQU LCDBASE + 0 ; WRITE +LCD_STAT .EQU LCDBASE + 0 ; READ +LCD_DATA .EQU LCDBASE + 1 ; READ/WRITE +; +LCD_FUNC_CLEAR .EQU $01 ; CLEAR DISPLAY +LCD_FUNC_HOME .EQU $02 ; HOME CURSOR & REMOVE ALL SHIFTING +LCD_FUNC_ENTRY .EQU $04 ; SET CUR DIR AND DISPLAY SHIFT +LCD_FUNC_DISP .EQU $08 ; DISP, CUR, BLINK ON/OFF +LCD_FUNC_SHIFT .EQU $10 ; MOVE CUR / SHIFT DISP +LCD_FUNC_SET .EQU $20 ; SET INTERFACE PARAMS +LCD_FUNC_CGADR .EQU $40 ; SET CGRAM ADRESS +LCD_FUNC_DDADR .EQU $80 ; SET DDRAM ADDRESS +; + DEVECHO "LCD: IO=" + DEVECHO LCDBASE + DEVECHO "\n" +; +; HARDWARE RESET PRIOR TO ROMWBW CONSOLE INITIALIZATION +; +LCD_PREINIT: +; + ; RESET LCD CONTROLLER, DELAYS ARE FIXED, BUSY FLAG + ; CANNOT BE USED YET, CONTROLLER MAY NOT EXIST! + LD A,LCD_FUNC_SET | %11000 + OUT (LCD_FUNC),A + LD DE,50000/16 ; WAIT >40MS, WE USE 50MS + CALL VDELAY ; DO IT + LD A,LCD_FUNC_SET | %11000 + OUT (LCD_FUNC),A + LD DE,5000/16 ; WAIT >4.1MS, WE USE 5MS + CALL VDELAY ; DO IT + LD A,LCD_FUNC_SET | %11000 + OUT (LCD_FUNC),A + LD DE,5000/16 ; WAIT >4.1MS, WE USE 5MS + CALL VDELAY ; DO IT +; + ; TEST FOR PRESENCE... + CALL LCD_DETECT ; PROBE FOR HARDWARE + LD A,(LCD_PRESENT) ; GET PRESENCE FLAG + OR A ; SET FLAGS + RET Z ; BAIL OUT IF NOT PRESENT +; + ; WE CAN NOW DO NORMAL I/O W/ BUSY FLAG + LD DE,LCD_INIT_SEQ ; INIT SEQUENCE + CALL LCD_OUTFS ; SEND IT +; + ; PUT SOMETHING ON THE DISPLAY + LD DE,LCD_STR_BAN + CALL LCD_OUTDS +; + ; SECOND LINE + ; CPU TYPE + LD HL,$0100 ; ROW 2, COL 0 + CALL LCD_GOTORC + LD HL,LCD_CPU + LD A,(HB_CPUTYPE) ; GET CPU TYPE + RRCA ; WORD OFFSET + CALL ADDHLA ; ADD OFFSET + LD E,(HL) ; GET LSB + INC HL ; BUMP + LD D,(HL) ; GET MSB + CALL LCD_OUTDS + LD DE,LCD_STR_XPU + CALL LCD_OUTDS +; + ; "12.345 MHz" RIGHT JUSTIFIED + LD HL,$010A ; ROW 2, COL 10 + CALL LCD_GOTORC + LD HL,(CB_CPUKHZ) + PUSH HL + LD BC,10000 ; 10 MHZ + SBC HL,BC ; SUBTRACT + JR NC,LCD_PREINIT1 + LD A,' ' ; EXTRA PAD + CALL LCD_OUTD +LCD_PREINIT1: + POP HL + CALL LCD_PRTD3M ; PRINT AS DECIMAL WITH 3 DIGIT MANTISSA + LD DE,LCD_STR_MHZ + CALL LCD_OUTDS +; + ; THIRD LINE + LD HL,$0200 ; ROW 2, COL 0 + CALL LCD_GOTORC + LD DE,LCD_STR_CFG + CALL LCD_OUTDS +; + XOR A ; SIGNAL SUCCESS + RET ; DONE +; +; POST CONSOLE INITIALIZATION +; +LCD_INIT: + CALL NEWLINE ; FORMATTING + PRTS("LCD: IO=$") + LD A,LCDBASE + CALL PRTHEXBYTE +; + LD A,(LCD_PRESENT) ; GET PRESENCE FLAG + OR A ; SET FLAGS + JR Z,LCD_INIT1 ; HANDLE NOT PRESENT + XOR A ; SIGNAL SUCCESS + RET ; DONE +; +LCD_INIT1: + PRTS(" NOT PRESENT$") + OR $FF + RET +; +; CALLED FROM HBIOS RIGHT BEFORE A DISK ACCESS +; HL: ADDRESS OF 32-BIT SECTOR NUMBER (LITTLE-ENDIAN) +; +; FORMAT: "Disk #99 R:12345678" +; 01234567890123456789 +; +LCD_DSKACT: + ; SAVE EVERYTHING + PUSH AF + PUSH BC + PUSH DE + PUSH HL +; + LD A,(LCD_PRESENT) ; GET PRESENCE FLAG + OR A ; SET FLAGS + JR Z,LCD_DSKACT_Z ; HANDLE NOT PRESENT +; + PUSH HL + LD HL,$0300 ; ROW 3, COL 0 + CALL LCD_GOTORC ; SET DISPLAY ADDRESS + POP HL +; + LD DE,LCD_STR_IO ; PREFIX + CALL LCD_OUTDS ; SEND TO DISPLAY (COLS 0-5) +; + LD A,(HB_DSKUNIT) ; GET DISK UNIT NUM + CALL LCD_DSKACT_BYTE ; SEND TO DISPLAY (COLS 6-7) HEX??? +; + LD A,' ' ; SEPARATOR + CALL LCD_OUTD ; SEND TO DISPLAY (COL 8) + CALL LCD_OUTD ; SEND TO DISPLAY (COL 9) +; + LD A,(HB_DSKFUNC) ; ACTIVE DISK FUNCTION + CP BF_DIOWRITE ; WRITE? + LD A,'W' ; ASSUME WRITE + JR Z,LCD_DSKACT0 ; GO AHEAD + LD A,'R' ; OTHERWISE READ +LCD_DSKACT0: + CALL LCD_OUTD ; SEND CHAR (COL 10) +; + LD A,':' ; SEPARATOR + CALL LCD_OUTD ; SEND TO DISPLAY (COL 11) +; + LD A,3 ; POINT TO + CALL ADDHLA ; END OF DWORD (MSB) + LD B,4 ; DO 4 BYTES +; +LCD_DSKACT1: + LD A,(HL) ; GET BYTE + CALL LCD_DSKACT_BYTE ; SEND TO DISPLAY (COLS 12-19) + DEC HL ; DEC PTR + DJNZ LCD_DSKACT1 ; DO ALL 4 BYTES +; +LCD_DSKACT_Z: + ; CLEAN UP AND GO AWAY + POP HL + POP DE + POP BC + POP AF + RET +; +LCD_DSKACT_BYTE: + PUSH AF ; SAVE BYTE + RRCA ; DO TOP NIBBLE FIRST + RRCA + RRCA + RRCA + CALL HEXCONV ; CONVERT NIBBLE TO ASCII + CALL LCD_OUTD ; SEND TO DISPLAY + POP AF ; RECOVER CURRENT BYTE + CALL HEXCONV ; CONVERT NIBBLE TO ASCII + CALL LCD_OUTD ; SEND TO DISPLAY + RET ; DONE +; +; DETECT PRESENCE OF LCD CONTROLLER BY WRITING AND READING BACK +; TEST VALUES IN THE CONTROLLER RAM. +; WE DO NOT USE THE NORMAL READ/WRITE ROUTINES BECAUSE WE DO +; NOT WANT TO STALL WAITING ON THE BUSY FLAG IF THE CONTROLLER +; IS NOT PRESENT +; +LCD_DETECT: + ; FIRST PASS W/ TEST VALUE $AA + LD C,$AA + CALL LCD_DETECT_PASS + JR NZ,LCD_DETECT1 +; + ; SECOND PASS W/ TEST VALUE $55 + LD C,$55 + CALL LCD_DETECT_PASS + JR NZ,LCD_DETECT1 +; + ; LCD PRESENT + OR $FF + JR LCD_DETECT_Z +; +LCD_DETECT1: + ; LCD NOT PRESENT + XOR A + JR LCD_DETECT_Z +; +LCD_DETECT_Z: + LD (LCD_PRESENT),A + RET +; +; WRITE AND READBACK VALUE IN C TO THE FIRST BYTE OF DDRAM +; RETURN WITH COMPARE RESULT +; +LCD_DETECT_PASS: + CALL LCD_DELAY ; WAIT + LD A,LCD_FUNC_DDADR + OUT (LCD_FUNC),A ; POINT TO FIRST BYTE + CALL LCD_DELAY ; WAIT + LD A,C ; TEST VALUE + OUT (LCD_DATA),A ; WRITE IT + CALL LCD_DELAY ; WAIT + LD A,LCD_FUNC_DDADR + OUT (LCD_FUNC),A ; POINT TO FIRST BYTE + CALL LCD_DELAY + IN A,(LCD_DATA) ; GET VALUE + CP C ; AS WRITTEN? + RET +; +; DELAY USED DURING DETECT, >37US +; +LCD_DELAY: + CALL DELAY ; 16US + CALL DELAY ; 16US + JP DELAY ; 16US, TOTAL 48US +; +; SEND FUNCTION CODE IN A +; +LCD_OUTF: + PUSH AF ; SAVE CODE +LCD_OUTF1: + IN A,(LCD_STAT) ; GET STATUS + AND $80 ; ISOLATE BUSY FLAG + JR NZ,LCD_OUTF1 ; LOOP TILL NOT BUSY + POP AF ; RECOVER CODE + OUT (LCD_FUNC),A ; SEND IT + RET ; DONE +; +; SEND FUNCTION STRING +; DE=STRING ADDRESS, NULL TERMINATED +; +LCD_OUTFS: + LD A,(DE) ; NEXT BYTE TO SEND + OR A ; SET FLAGS + RET Z ; DONE WHEN NULL REACHED + INC DE ; BUMP POINTER + CALL LCD_OUTF ; SEND IT + JR LCD_OUTFS ; LOOP AS NEEDED +; +; SEND DATA BYTE IN A +; +LCD_OUTD: + PUSH AF ; SAVE BYTE +LCD_OUTD1: + IN A,(LCD_STAT) ; GET STATUS + AND $80 ; ISOLATE BUSY FLAG + JR NZ,LCD_OUTD1 ; LOOP TILL NOT BUSY + POP AF ; RECOVER BYTE + OUT (LCD_DATA),A ; SEND IT + RET ; DONE +; +; SEND DATA STRING +; DE=STRING ADDRESS, NULL TERMINATED +; +LCD_OUTDS: + LD A,(DE) ; NEXT BYTE TO SEND + OR A ; SET FLAGS + RET Z ; DONE WHEN NULL REACHED + INC DE ; BUMP POINTER + CALL LCD_OUTD ; SEND IT + JR LCD_OUTDS ; LOOP AS NEEDED +; +; GET DATA BYTE INTO A +; +LCD_IND: + IN A,(LCD_STAT) ; GET STATUS + AND $80 ; ISOLATE BUSY FLAG + JR NZ,LCD_IND ; LOOP TILL NOT BUSY + POP AF ; RECOVER BYTE + IN A,(LCD_DATA) ; GET IT + RET ; DONE +; +; GOTO ROW(H),COL(L) +; +LCD_GOTORC: + PUSH HL ; SAVE INCOMING + LD A,H ; ROW # TO A + LD HL,LCD_ROWS ; POINT TO ROWS TABLE + CALL ADDHLA ; INDEX TO ROW ENTRY + LD A,(HL) ; GET RWO START + POP HL ; RECOVER INCOMING + ADD A,L ; ADD COLUMN + ADD A,LCD_FUNC_DDADR ; APPLY FUNCTION BIT + JR LCD_OUTF ; AND SEND IT +; +; PRINT VALUE OF HL AS THOUSANDTHS, IE. 0.000 +; +LCD_PRTD3M: + PUSH BC + PUSH DE + PUSH HL + LD E,'0' + LD BC,-10000 + CALL LCD_PRTD3M1 + LD E,0 + LD BC,-1000 + CALL LCD_PRTD3M1 + LD A,'.' + CALL LCD_OUTD + LD BC,-100 + CALL LCD_PRTD3M1 + LD C,-10 + CALL LCD_PRTD3M1 + LD C,-1 + CALL LCD_PRTD3M1 + POP HL + POP DE + POP BC + RET +LCD_PRTD3M1: + LD A,'0' - 1 +LCD_PRTD3M2: + INC A + ADD HL,BC + JR C,LCD_PRTD3M2 + SBC HL,BC + CP E + JR Z,LCD_PRTD3M3 + LD E,0 + CALL LCD_OUTD +LCD_PRTD3M3: + RET +; +; DATA STORAGE +; +LCD_PRESENT .DB 0 ; NON-ZERO WHEN HARDWARE DETECTED +; +LCD_ROWS .DB $00,$40,$14,$54 ; ROW START INDEX +; +LCD_INIT_SEQ: + .DB LCD_FUNC_SET | %11000 ; FUNCTION SET, 2 LINES, 5X8 FONT + .DB LCD_FUNC_DISP ; DISPLAY OFF + .DB LCD_FUNC_CLEAR ; CLEAR DISPLAY, HOME CURSOR + .DB LCD_FUNC_ENTRY | $02 ; INCREMENT, NO SHIFT + .DB LCD_FUNC_DISP | $04 ; DISPLAY ON, NO CURSOR, NO BLINK + .DB $00 ; TERMINATOR +; +LCD_STR_BAN .DB "RomWBW v", BIOSVER, 0 +LCD_STR_CFG .DB "Build: ", CONFIG, 0 +LCD_STR_IO .DB "Disk #", 0 +LCD_STR_XPU .DB " CPU",0 +LCD_STR_SPD .DB "12.345",0 +LCD_STR_MHZ .DB " MHz",0 +; +LCD_CPU .DW LCD_CPU_Z80 + .DW LCD_CPU_Z180 + .DW LCD_CPU_Z180K + .DW LCD_CPU_Z180N + .DW LCD_CPU_Z280 +; +LCD_CPU_Z80 .DB "Z80",0 +LCD_CPU_Z180 .DB "Z180-K",0 +LCD_CPU_Z180K .DB "Z180-N",0 +LCD_CPU_Z180N .DB "Z180",0 +LCD_CPU_Z280 .DB "Z280",0 + + diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index 0d8b3378..5eba934a 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -301,13 +301,13 @@ MD_RW: MD_RW1: PUSH BC ; SAVE COUNTERS ; -#IF (DSKYENABLE) - #IF (DSKYDSKACT) +;;;#IF (DSKYENABLE) +;;; #IF (DSKYDSKACT) LD A,MD_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY - #ENDIF -#ENDIF +;;; #ENDIF +;;;#ENDIF ; LD HL,(MD_RWFNADR) ; GET PENDING IO FUNCTION ADDRESS #IF (MDFFENABLE) diff --git a/Source/HBIOS/ppa.asm b/Source/HBIOS/ppa.asm index 0b6da099..a30aa08a 100644 --- a/Source/HBIOS/ppa.asm +++ b/Source/HBIOS/ppa.asm @@ -339,13 +339,13 @@ PPA_IO: ; LD (PPA_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS ; -#IF (DSKYENABLE) - #IF (DSKYDSKACT) +;;;#IF (DSKYENABLE) +;;; #IF (DSKYDSKACT) LD A,PPA_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY - #ENDIF -#ENDIF +;;; #ENDIF +;;;#ENDIF ; ; SETUP LBA ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index f7d7c6c7..28a3bb99 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -830,13 +830,13 @@ PPIDE_PKT_RDSEC: #ENDIF ; SETUP LBA ; -#IF (DSKYENABLE) - #IF (DSKYDSKACT) +;;;#IF (DSKYENABLE) +;;; #IF (DSKYDSKACT) LD A,PPIDE_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY - #ENDIF -#ENDIF +;;; #ENDIF +;;;#ENDIF ; ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN LD HL,PPIDE_PKTCMD_RW10+3 ; START OF LBA FIELD IN CDB (MSB) @@ -899,13 +899,13 @@ PPIDE_PKT_WRSEC: #ENDIF ; SETUP LBA ; -#IF (DSKYENABLE) - #IF (DSKYDSKACT) +;;;#IF (DSKYENABLE) +;;; #IF (DSKYDSKACT) LD A,PPIDE_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY - #ENDIF -#ENDIF +;;; #ENDIF +;;;#ENDIF ; ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN LD HL,PPIDE_PKTCMD_RW10+3 ; START OF LBA FIELD IN CDB (MSB) @@ -931,13 +931,13 @@ PPIDE_PKT_WRSEC: ; PPIDE_SETADDR: ; -#IF (DSKYENABLE) - #IF (DSKYDSKACT) +;;;#IF (DSKYENABLE) +;;; #IF (DSKYDSKACT) LD A,PPIDE_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY - #ENDIF -#ENDIF +;;; #ENDIF +;;;#ENDIF ; SEND 3 LOWEST BYTES OF LBA IN REVERSE ORDER ; IDE_REG_LBA3 HAS ALREADY BEEN SET ; HSTLBA2-0 --> IDE_REG_LBA2-0 diff --git a/Source/HBIOS/ppp.asm b/Source/HBIOS/ppp.asm index 9b1c1301..434b9e75 100644 --- a/Source/HBIOS/ppp.asm +++ b/Source/HBIOS/ppp.asm @@ -948,11 +948,11 @@ PPPSD_SENDBLK: LD A,PPPSD_LBA ; OFFSET OF LBA CALL LDHLIYA ; HL := IY + A, REG A TRASHED -#IF (DSKYENABLE) - #IF (DSKYDSKACT) +;;;#IF (DSKYENABLE) +;;; #IF (DSKYDSKACT) CALL HB_DSKACT ; SHOW ACTIVITY - #ENDIF -#ENDIF +;;; #ENDIF +;;;#ENDIF LD B,4 PPPSD_SENDBLK1: LD A,(HL) diff --git a/Source/HBIOS/prp.asm b/Source/HBIOS/prp.asm index 6cc98ff2..fb987eb9 100644 --- a/Source/HBIOS/prp.asm +++ b/Source/HBIOS/prp.asm @@ -882,11 +882,11 @@ PRPSD_SETBLK: LD B,4 ; 4 BYTES LD A,PRPSD_LBA ; OFFSET OF LBA CALL LDHLIYA ; HL := IY + A, REG A TRASHED -#IF (DSKYENABLE) - #IF (DSKYDSKACT) +;;;#IF (DSKYENABLE) +;;; #IF (DSKYDSKACT) CALL HB_DSKACT ; SHOW ACTIVITY - #ENDIF -#ENDIF +;;; #ENDIF +;;;#ENDIF OTIR RET ; diff --git a/Source/HBIOS/rf.asm b/Source/HBIOS/rf.asm index cd804074..6d80fc81 100644 --- a/Source/HBIOS/rf.asm +++ b/Source/HBIOS/rf.asm @@ -333,13 +333,13 @@ RF_SETIO: ; RF_SETADR: ; -#IF (DSKYENABLE) - #IF (DSKYDSKACT) +;;;#IF (DSKYENABLE) +;;; #IF (DSKYDSKACT) LD A,RF_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY - #ENDIF -#ENDIF +;;; #ENDIF +;;;#ENDIF ; LD A,(RF_IO) ; OUTPUT THE LOGICAL BLOCK OR RF_AL ; ADDRESS TO THE diff --git a/Source/HBIOS/sd.asm b/Source/HBIOS/sd.asm index 134cdcb5..b00d969d 100644 --- a/Source/HBIOS/sd.asm +++ b/Source/HBIOS/sd.asm @@ -1497,11 +1497,11 @@ SD_SETADDR: PUSH AF ; SAVE IT LD A,SD_LBA ; OFFSET OF LBA VALUE CALL LDHLIYA ; HL := IY + A, REG A TRASHED -#IF (DSKYENABLE) - #IF (DSKYDSKACT) +;;;#IF (DSKYENABLE) +;;; #IF (DSKYDSKACT) CALL HB_DSKACT ; SHOW ACTIVITY - #ENDIF -#ENDIF +;;; #ENDIF +;;;#ENDIF CALL LD32 ; LOAD IT TO DE:HL, AF IS TRASHED POP AF ; GET CARD TYPE BACK CP SD_TYPESDHC ; IS IT V2 OR BETTER? diff --git a/Source/HBIOS/syq.asm b/Source/HBIOS/syq.asm index a913ddf7..c107e4ea 100644 --- a/Source/HBIOS/syq.asm +++ b/Source/HBIOS/syq.asm @@ -417,11 +417,11 @@ SYQ_IO: LD (SYQ_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS LD A,SYQ_LBA ; LBA OFFSET IN CONFIG CALL LDHLIYA ; POINT TO LBA DWORD -#IF (DSKYENABLE) - #IF (DSKYDSKACT) +;;;#IF (DSKYENABLE) +;;; #IF (DSKYDSKACT) CALL HB_DSKACT ; SHOW ACTIVITY - #ENDIF -#ENDIF +;;; #ENDIF +;;;#ENDIF CALL LD32 ; SET DE:HL TO LBA ; CALL SYQ_CMDSETUP ; SETUP ATA COMMAND BUF diff --git a/Source/ver.inc b/Source/ver.inc index 67e21bfe..56ae7445 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 5 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.5.0-dev.73" +#DEFINE BIOSVER "3.5.0-dev.74" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index efeaa15a..f93ece95 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 5 rup equ 0 rtp equ 0 biosver macro - db "3.5.0-dev.73" + db "3.5.0-dev.74" endm