diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index 822498c8..db47ff0e 100644 Binary files a/Doc/RomWBW Applications.pdf and b/Doc/RomWBW Applications.pdf differ diff --git a/Doc/RomWBW Disk Catalog.pdf b/Doc/RomWBW Disk Catalog.pdf index e1b87258..27c89ac4 100644 Binary files a/Doc/RomWBW Disk Catalog.pdf and b/Doc/RomWBW Disk Catalog.pdf differ diff --git a/Doc/RomWBW Errata.pdf b/Doc/RomWBW Errata.pdf index 8c4c7b6e..2d69fe31 100644 Binary files a/Doc/RomWBW Errata.pdf and b/Doc/RomWBW Errata.pdf differ diff --git a/Doc/RomWBW System Guide.pdf b/Doc/RomWBW System Guide.pdf index f6c807ef..87f740ea 100644 Binary files a/Doc/RomWBW System Guide.pdf and b/Doc/RomWBW System Guide.pdf differ diff --git a/Doc/RomWBW User Guide.pdf b/Doc/RomWBW User Guide.pdf index b570dfd3..f284082b 100644 Binary files a/Doc/RomWBW User Guide.pdf and b/Doc/RomWBW User Guide.pdf differ diff --git a/ReadMe.md b/ReadMe.md index c995625e..64690ad7 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)) \ -23 Sep 2024 +26 Sep 2024 # Overview diff --git a/ReadMe.txt b/ReadMe.txt index 03a8d404..953649b8 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -1,6 +1,6 @@ RomWBW ReadMe Wayne Warthen (wwarthen@gmail.com) -23 Sep 2024 +26 Sep 2024 diff --git a/Source/Doc/SystemGuide.md b/Source/Doc/SystemGuide.md index cd8fbc98..9d89b544 100644 --- a/Source/Doc/SystemGuide.md +++ b/Source/Doc/SystemGuide.md @@ -1280,35 +1280,22 @@ used. ## Display Keypad (DSKY) -The Display Keypad functions provide read/write access to a segment -style display and associated hex keypad. - -HBIOS only supports a single DSKY device since there is no reason to have -more than one at a time. The DSKY unit is assigned a Device Type ID -which indicates the specific hardware device driver that handles the -unit. The table below enumerates these values. - -| **Device Type** | **ID** | **Description** | **Driver** | -|-----------------|-------:|------------------------------------------|------------| -| DSKYDEV_ICM | 0x01 | Original ICM7218 based DSKY | icm.asm | -| DSKYDEV_PKD | 0x02 | Next Gen Intel P8279 based DSKY | pkd.asm | - -When segment display function encodes the display data in a byte per -character format. Currently, all segment displays are exactly -8 charadcters and this is assumed in API calls. The encoding of each -byte is as shown below: - -``` - +---01---+ - | | - 20 02 - | | - +---40---+ - | | - 10 04 - | | - +---08---+ 80 -``` +The Display Keypad functions provide access to a segment or LCD +style display and associated optional keypad + +HBIOS only supports a single DSKY device since there is no reason to +have more than one at a time. If the system contains multiple DSKY +devices, only the first device discovered will be used. The DSKY unit +is assigned a Device Type ID which indicates the specific hardware +device driver that handles the unit. The table below enumerates these +values. + +| **Device Type** | **ID** | **Description** | **Driver** | +|--------------------|-------:|---------------------------------------|------------| +| DSKYDEV_ICM | 0x01 | Original ICM7218 based DSKY | icm.asm | +| DSKYDEV_PKD | 0x02 | Next Gen Intel P8279 based DSKY | pkd.asm | +| DSKYDEV_GM7303 | 0x03 | GM7303 LCD Display + Keypad | gm7303.asm | +| DSKYDEV_LCD | 0x04 | HD44780-based LCD Display | lcd.asm | The keypad keys are identified by the following key ids. Not all keypads will contain all keys. @@ -1394,10 +1381,21 @@ The Status (A) is a standard HBIOS result code. | HL: Buffer Address | | Display the segment-encoded values on the segment display. The encoding -is defined at the start of this section. The entire displa is updated -and it is assumed that an 8 character buffer will be pointed to by HL. -The buffer must reside in high memory. -The Status (A) is a standard HBIOS result code. +uses a small alphabet as defined below. The actual representation of a +character is determined by the driver. The entire display is updated +and it is assumed that an 8 character buffer will be pointed to by HL. +The buffer must reside in high memory. The Status (A) is a standard +HBIOS result code. + +| | | | | +|---------------|---------------|---------------|---------------| +| 0x00: '0' | 0x01: '1' | 0x02: '2' | 0x03: '3' | +| 0x04: '4' | 0x05: '5' | 0x06: '6' | 0x07: '7' | +| 0x08: '8' | 0x09: '9' | 0x0A: 'A' | 0x0B: 'B' | +| 0x0C: 'C' | 0x0D: 'D' | 0x0E: 'E' | 0x0F: 'F' | +| 0x10: ' ' | 0x11: '-' | 0x12: '.' | 0x13: 'p' | +| 0x14: 'o' | 0x15: 'r' | 0x16: 't' | 0x17: 'A' | +| 0x18: 'd' | 0x19: 'r' | 0x1A: 'G' | | ### Function 0x35 -- DSKY Keypad LEDs (DSKYKEYLEDS) @@ -1410,9 +1408,8 @@ Light the LEDs for the keypad keys according to the bitmap contained in the buffer pointed to by HL. The buffer must be located in high memory and is assumed to be 8 bytes. -At this time, the bitmap is specific to the PKD hardware. -This function is ignored by the ICM hardware. -The Status (A) is a standard HBIOS result code. +At this time, the bitmap is specific to the PKD hardware and will be +ignored by all other hardware. ### Function 0x36 -- DSKY Status LED (DSKYSTATLED) @@ -1426,8 +1423,8 @@ Set or clear the status LED specified in D. The state of the LED is contained in E. If E=0, the LED will be turned off. If E=1, the LED will be turned on. -This function is specific to the PKD hardware. It will be ignored -by the ICM hardware. +This function is specific to the PKD hardware and will be ignored +by all other hardware. The Status (A) is a standard HBIOS result code. ### Function 0x37 -- DSKY Beep (DSKYBEEP) @@ -1468,6 +1465,29 @@ servicing the specified unit. Both of these values are considered driver specific. Refer to the associated hardware driver for the values used. +### Function 0x39 -- DSKY Device (DSKYMESSAGE) + +| **Entry Parameters** | **Returned Values** | +|----------------------------------------|----------------------------------------| +| B: 0x39 | A: Status | +| C: Message ID | | + +Instructs the display to show a textual representation of the associated +message on the display. The IDs are defined in std.asm. + +### Function 0x3A -- DSKY Device (DSKYEVENT) + +| **Entry Parameters** | **Returned Values** | +|----------------------------------------|----------------------------------------| +| B: 0x3A | A: Status | +| C: Event ID | | + +Instructs the display to update itself in response to an internal +HBIOS state change. At this time the the events are: + +0: CPU Speed Change \ +1: Disk Activity + `\clearpage`{=latex} ## Video Display Adapter (VDA) diff --git a/Source/HBIOS/cfg_DUO.asm b/Source/HBIOS/cfg_DUO.asm index ed591eda..3a1827d8 100644 --- a/Source/HBIOS/cfg_DUO.asm +++ b/Source/HBIOS/cfg_DUO.asm @@ -117,13 +117,12 @@ DSKYENABLE .SET FALSE ; ENABLES DSKY FUNCTIONALITY DSKYDSKACT .SET TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY ICMENABLE .SET FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218) ICMPPIBASE .SET $88 ; BASE I/O ADDRESS OF ICM PPI -PKDENABLE .SET TRUE ; ENABLES DSKY NG PKD DRIVER (8259) +PKDENABLE .SET FALSE ; ENABLES DSKY NG PKD DRIVER (8259) PKDPPIBASE .SET $88 ; BASE I/O ADDRESS OF PKD PPI PKDOSC .SET 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .SET FALSE ; ENABLES HEATH H8 FRONT PANEL LCDENABLE .SET FALSE ; ENABLE LCD DISPLAY LCDBASE .SET $DA ; BASE I/O ADDRESS OF LCD CONTROLLER -LCDDSKACT .SET TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY GM7303ENABLE .SET FALSE ; ENABLES THE GM7303 BOARD WITH 16X2 LCD ; BOOTCON .SET 0 ; BOOT CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_DYNO.asm b/Source/HBIOS/cfg_DYNO.asm index ac7570e7..b3f7c09f 100644 --- a/Source/HBIOS/cfg_DYNO.asm +++ b/Source/HBIOS/cfg_DYNO.asm @@ -125,7 +125,6 @@ PKDOSC .SET 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .SET FALSE ; ENABLES HEATH H8 FRONT PANEL LCDENABLE .SET FALSE ; ENABLE LCD DISPLAY LCDBASE .SET $DA ; BASE I/O ADDRESS OF LCD CONTROLLER -LCDDSKACT .SET TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY GM7303ENABLE .SET FALSE ; ENABLES THE GM7303 BOARD WITH 16X2 LCD ; BOOTCON .SET 0 ; BOOT CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_EPITX.asm b/Source/HBIOS/cfg_EPITX.asm index 568a23d1..6c1fdae5 100644 --- a/Source/HBIOS/cfg_EPITX.asm +++ b/Source/HBIOS/cfg_EPITX.asm @@ -120,7 +120,6 @@ PKDOSC .SET 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .SET FALSE ; ENABLES HEATH H8 FRONT PANEL LCDENABLE .SET FALSE ; ENABLE LCD DISPLAY LCDBASE .SET $DA ; BASE I/O ADDRESS OF LCD CONTROLLER -LCDDSKACT .SET TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY GM7303ENABLE .SET FALSE ; ENABLES THE GM7303 BOARD WITH 16X2 LCD ; BOOTCON .SET 0 ; BOOT CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_FZ80.asm b/Source/HBIOS/cfg_FZ80.asm index 660fdebd..ed907a20 100644 --- a/Source/HBIOS/cfg_FZ80.asm +++ b/Source/HBIOS/cfg_FZ80.asm @@ -125,7 +125,6 @@ PKDOSC .SET 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .SET FALSE ; ENABLES HEATH H8 FRONT PANEL LCDENABLE .SET FALSE ; ENABLE LCD DISPLAY LCDBASE .SET $DA ; BASE I/O ADDRESS OF LCD CONTROLLER -LCDDSKACT .SET TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY GM7303ENABLE .SET FALSE ; ENABLES THE GM7303 BOARD WITH 16X2 LCD ; BOOTCON .SET 0 ; BOOT CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_GMZ180.asm b/Source/HBIOS/cfg_GMZ180.asm index 2dd0658c..a3e7fcdc 100644 --- a/Source/HBIOS/cfg_GMZ180.asm +++ b/Source/HBIOS/cfg_GMZ180.asm @@ -125,10 +125,8 @@ PKDOSC .SET 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .SET FALSE ; ENABLES HEATH H8 FRONT PANEL LCDENABLE .SET FALSE ; ENABLE LCD DISPLAY LCDBASE .SET $DA ; BASE I/O ADDRESS OF LCD CONTROLLER -LCDDSKACT .SET TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY GM7303ENABLE .SET TRUE ; ENABLES THE GM7303 BOARD WITH 16X2 LCD GM7303BASE .SET $30 ; BASE ADDRESS FOR GM3703 BOARD -GM7303DSKACT .SET TRUE ; ENABLE DISK ACTIVITY OF GM7303 LCD DISPLAY ; BOOTCON .SET 0 ; BOOT CONSOLE DEVICE SECCON .SET $FF ; SECONDARY CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_HEATH.asm b/Source/HBIOS/cfg_HEATH.asm index efdc4a6b..aeec7d78 100644 --- a/Source/HBIOS/cfg_HEATH.asm +++ b/Source/HBIOS/cfg_HEATH.asm @@ -125,7 +125,6 @@ PKDOSC .SET 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .SET TRUE ; ENABLES HEATH H8 FRONT PANEL LCDENABLE .SET FALSE ; ENABLE LCD DISPLAY LCDBASE .SET $DA ; BASE I/O ADDRESS OF LCD CONTROLLER -LCDDSKACT .SET TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY GM7303ENABLE .SET FALSE ; ENABLES THE GM7303 BOARD WITH 16X2 LCD ; BOOTCON .SET 0 ; BOOT CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_MASTER.asm b/Source/HBIOS/cfg_MASTER.asm index 42a35741..a4986b94 100644 --- a/Source/HBIOS/cfg_MASTER.asm +++ b/Source/HBIOS/cfg_MASTER.asm @@ -157,10 +157,8 @@ 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 FALSE ; ENABLES DISK ACTIVITY ON LCD DISPLAY GM7303ENABLE .EQU FALSE ; ENABLES THE GM7303 BOARD WITH 16X2 LCD GM7303BASE .EQU $30 ; BASE ADDRESS FOR GM3703 BOARD -GM7303DSKACT .EQU FALSE ; ENABLE DISK ACTIVITY OF GM7303 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 947e6327..b523be30 100644 --- a/Source/HBIOS/cfg_MBC.asm +++ b/Source/HBIOS/cfg_MBC.asm @@ -120,7 +120,6 @@ PKDOSC .SET 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .SET FALSE ; ENABLES HEATH H8 FRONT PANEL LCDENABLE .SET FALSE ; ENABLE LCD DISPLAY LCDBASE .SET $DA ; BASE I/O ADDRESS OF LCD CONTROLLER -LCDDSKACT .SET TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY GM7303ENABLE .SET FALSE ; ENABLES THE GM7303 BOARD WITH 16X2 LCD ; BOOTCON .SET 0 ; BOOT CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_MK4.asm b/Source/HBIOS/cfg_MK4.asm index b118c683..f2990440 100644 --- a/Source/HBIOS/cfg_MK4.asm +++ b/Source/HBIOS/cfg_MK4.asm @@ -125,7 +125,6 @@ PKDOSC .SET 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .SET FALSE ; ENABLES HEATH H8 FRONT PANEL LCDENABLE .SET FALSE ; ENABLE LCD DISPLAY LCDBASE .SET $DA ; BASE I/O ADDRESS OF LCD CONTROLLER -LCDDSKACT .SET TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY GM7303ENABLE .SET FALSE ; ENABLES THE GM7303 BOARD WITH 16X2 LCD ; BOOTCON .SET 0 ; BOOT CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_MON.asm b/Source/HBIOS/cfg_MON.asm index 4321e747..fea9559d 100644 --- a/Source/HBIOS/cfg_MON.asm +++ b/Source/HBIOS/cfg_MON.asm @@ -120,7 +120,6 @@ PKDOSC .SET 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .SET FALSE ; ENABLES HEATH H8 FRONT PANEL LCDENABLE .SET FALSE ; ENABLE LCD DISPLAY LCDBASE .SET $DA ; BASE I/O ADDRESS OF LCD CONTROLLER -LCDDSKACT .SET TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY GM7303ENABLE .SET FALSE ; ENABLES THE GM7303 BOARD WITH 16X2 LCD ; BOOTCON .SET 0 ; BOOT CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_N8.asm b/Source/HBIOS/cfg_N8.asm index a7b3f329..92653bb0 100644 --- a/Source/HBIOS/cfg_N8.asm +++ b/Source/HBIOS/cfg_N8.asm @@ -127,7 +127,6 @@ PKDOSC .SET 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .SET FALSE ; ENABLES HEATH H8 FRONT PANEL LCDENABLE .SET FALSE ; ENABLE LCD DISPLAY LCDBASE .SET $DA ; BASE I/O ADDRESS OF LCD CONTROLLER -LCDDSKACT .SET TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY GM7303ENABLE .SET FALSE ; ENABLES THE GM7303 BOARD WITH 16X2 LCD ; BOOTCON .SET 0 ; BOOT CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_NABU.asm b/Source/HBIOS/cfg_NABU.asm index a683fe74..eb6a7742 100644 --- a/Source/HBIOS/cfg_NABU.asm +++ b/Source/HBIOS/cfg_NABU.asm @@ -125,7 +125,6 @@ PKDOSC .SET 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .SET FALSE ; ENABLES HEATH H8 FRONT PANEL LCDENABLE .SET FALSE ; ENABLE LCD DISPLAY LCDBASE .SET $DA ; BASE I/O ADDRESS OF LCD CONTROLLER -LCDDSKACT .SET TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY GM7303ENABLE .SET FALSE ; ENABLES THE GM7303 BOARD WITH 16X2 LCD ; BOOTCON .SET 0 ; BOOT CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_RCEZ80.asm b/Source/HBIOS/cfg_RCEZ80.asm index e91baa50..edb7f22c 100644 --- a/Source/HBIOS/cfg_RCEZ80.asm +++ b/Source/HBIOS/cfg_RCEZ80.asm @@ -125,7 +125,6 @@ PKDOSC .SET 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .SET FALSE ; ENABLES HEATH H8 FRONT PANEL LCDENABLE .SET TRUE ; ENABLE LCD DISPLAY LCDBASE .SET $DA ; BASE I/O ADDRESS OF LCD CONTROLLER -LCDDSKACT .SET TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY GM7303ENABLE .SET FALSE ; ENABLES THE GM7303 BOARD WITH 16X2 LCD ; BOOTCON .SET 0 ; BOOT CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_RCZ180.asm b/Source/HBIOS/cfg_RCZ180.asm index 8144b524..e9bbc699 100644 --- a/Source/HBIOS/cfg_RCZ180.asm +++ b/Source/HBIOS/cfg_RCZ180.asm @@ -125,7 +125,6 @@ PKDOSC .SET 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .SET FALSE ; ENABLES HEATH H8 FRONT PANEL LCDENABLE .SET TRUE ; ENABLE LCD DISPLAY LCDBASE .SET $AA ; BASE I/O ADDRESS OF LCD CONTROLLER -LCDDSKACT .SET TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY GM7303ENABLE .SET FALSE ; ENABLES THE GM7303 BOARD WITH 16X2 LCD ; BOOTCON .SET 0 ; BOOT CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_RCZ280.asm b/Source/HBIOS/cfg_RCZ280.asm index 7b4434b6..bf6ce0c1 100644 --- a/Source/HBIOS/cfg_RCZ280.asm +++ b/Source/HBIOS/cfg_RCZ280.asm @@ -125,7 +125,6 @@ PKDOSC .SET 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .SET FALSE ; ENABLES HEATH H8 FRONT PANEL LCDENABLE .SET TRUE ; ENABLE LCD DISPLAY LCDBASE .SET $DA ; BASE I/O ADDRESS OF LCD CONTROLLER -LCDDSKACT .SET TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY GM7303ENABLE .SET FALSE ; ENABLES THE GM7303 BOARD WITH 16X2 LCD ; BOOTCON .SET 0 ; BOOT CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_RCZ80.asm b/Source/HBIOS/cfg_RCZ80.asm index 4262a57c..ca147a44 100644 --- a/Source/HBIOS/cfg_RCZ80.asm +++ b/Source/HBIOS/cfg_RCZ80.asm @@ -125,7 +125,6 @@ PKDOSC .SET 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .SET FALSE ; ENABLES HEATH H8 FRONT PANEL LCDENABLE .SET TRUE ; ENABLE LCD DISPLAY LCDBASE .SET $DA ; BASE I/O ADDRESS OF LCD CONTROLLER -LCDDSKACT .SET TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY GM7303ENABLE .SET FALSE ; ENABLES THE GM7303 BOARD WITH 16X2 LCD ; BOOTCON .SET 0 ; BOOT CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_RPH.asm b/Source/HBIOS/cfg_RPH.asm index b0a32621..1365f5e7 100644 --- a/Source/HBIOS/cfg_RPH.asm +++ b/Source/HBIOS/cfg_RPH.asm @@ -125,7 +125,6 @@ PKDOSC .SET 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .SET FALSE ; ENABLES HEATH H8 FRONT PANEL LCDENABLE .SET FALSE ; ENABLE LCD DISPLAY LCDBASE .SET $DA ; BASE I/O ADDRESS OF LCD CONTROLLER -LCDDSKACT .SET TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY GM7303ENABLE .SET FALSE ; ENABLES THE GM7303 BOARD WITH 16X2 LCD ; BOOTCON .SET 0 ; BOOT CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_S100.asm b/Source/HBIOS/cfg_S100.asm index f45efdbb..4fbfc00c 100644 --- a/Source/HBIOS/cfg_S100.asm +++ b/Source/HBIOS/cfg_S100.asm @@ -125,7 +125,6 @@ PKDOSC .SET 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .SET FALSE ; ENABLES HEATH H8 FRONT PANEL LCDENABLE .SET FALSE ; ENABLE LCD DISPLAY LCDBASE .SET $DA ; BASE I/O ADDRESS OF LCD CONTROLLER -LCDDSKACT .SET TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY GM7303ENABLE .SET FALSE ; ENABLES THE GM7303 BOARD WITH 16X2 LCD ; BOOTCON .SET 0 ; BOOT CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_SBC.asm b/Source/HBIOS/cfg_SBC.asm index 86d028bb..ded55bd7 100644 --- a/Source/HBIOS/cfg_SBC.asm +++ b/Source/HBIOS/cfg_SBC.asm @@ -120,7 +120,6 @@ PKDOSC .SET 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .SET FALSE ; ENABLES HEATH H8 FRONT PANEL LCDENABLE .SET FALSE ; ENABLE LCD DISPLAY LCDBASE .SET $DA ; BASE I/O ADDRESS OF LCD CONTROLLER -LCDDSKACT .SET TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY GM7303ENABLE .SET FALSE ; ENABLES THE GM7303 BOARD WITH 16X2 LCD ; BOOTCON .SET 0 ; BOOT CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_SCZ180.asm b/Source/HBIOS/cfg_SCZ180.asm index 5243d7ce..280e9b21 100644 --- a/Source/HBIOS/cfg_SCZ180.asm +++ b/Source/HBIOS/cfg_SCZ180.asm @@ -125,7 +125,6 @@ PKDOSC .SET 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .SET FALSE ; ENABLES HEATH H8 FRONT PANEL LCDENABLE .SET TRUE ; ENABLE LCD DISPLAY LCDBASE .SET $AA ; BASE I/O ADDRESS OF LCD CONTROLLER -LCDDSKACT .SET TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY GM7303ENABLE .SET FALSE ; ENABLES THE GM7303 BOARD WITH 16X2 LCD ; BOOTCON .SET 0 ; BOOT CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_Z80RETRO.asm b/Source/HBIOS/cfg_Z80RETRO.asm index 39d3c983..a6c9d088 100644 --- a/Source/HBIOS/cfg_Z80RETRO.asm +++ b/Source/HBIOS/cfg_Z80RETRO.asm @@ -123,7 +123,6 @@ PKDOSC .SET 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .SET FALSE ; ENABLES HEATH H8 FRONT PANEL LCDENABLE .SET FALSE ; ENABLE LCD DISPLAY LCDBASE .SET $DA ; BASE I/O ADDRESS OF LCD CONTROLLER -LCDDSKACT .SET TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY GM7303ENABLE .SET FALSE ; ENABLES THE GM7303 BOARD WITH 16X2 LCD ; BOOTCON .SET 0 ; BOOT CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_ZETA.asm b/Source/HBIOS/cfg_ZETA.asm index 411069fa..7640bf05 100644 --- a/Source/HBIOS/cfg_ZETA.asm +++ b/Source/HBIOS/cfg_ZETA.asm @@ -112,7 +112,6 @@ PKDOSC .SET 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .SET FALSE ; ENABLES HEATH H8 FRONT PANEL LCDENABLE .SET FALSE ; ENABLE LCD DISPLAY LCDBASE .SET $DA ; BASE I/O ADDRESS OF LCD CONTROLLER -LCDDSKACT .SET TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY GM7303ENABLE .SET FALSE ; ENABLES THE GM7303 BOARD WITH 16X2 LCD ; BOOTCON .SET 0 ; BOOT CONSOLE DEVICE diff --git a/Source/HBIOS/cfg_ZETA2.asm b/Source/HBIOS/cfg_ZETA2.asm index 1fc69c2a..11662620 100644 --- a/Source/HBIOS/cfg_ZETA2.asm +++ b/Source/HBIOS/cfg_ZETA2.asm @@ -123,7 +123,6 @@ PKDOSC .SET 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .SET FALSE ; ENABLES HEATH H8 FRONT PANEL LCDENABLE .SET FALSE ; ENABLE LCD DISPLAY LCDBASE .SET $DA ; BASE I/O ADDRESS OF LCD CONTROLLER -LCDDSKACT .SET TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY GM7303ENABLE .SET FALSE ; ENABLES THE GM7303 BOARD WITH 16X2 LCD ; BOOTCON .SET 0 ; BOOT CONSOLE DEVICE diff --git a/Source/HBIOS/dbgmon.asm b/Source/HBIOS/dbgmon.asm index 44826208..2a041e73 100644 --- a/Source/HBIOS/dbgmon.asm +++ b/Source/HBIOS/dbgmon.asm @@ -1290,8 +1290,8 @@ DSKY_ENTRY: ;_____________________________________________________________________________ ; FRONTPANELLOOP: - LD HL,CPUUP ; SET POINTER TO CPU UP MSG - CALL DSKY_SHOW ; DISPLAY UNENCODED + LD C,DSKY_MSG_MON_RDY + CALL DSKY_MSG CALL DSKY_HIGHLIGHTCMDKEYS CALL DSKY_L1ON CALL KB_GET ; GET KEY FROM DSKY @@ -1321,8 +1321,8 @@ FRONTPANELLOOP1: ;_____________________________________________________________________________ ; DOBOOT: - LD HL,MSGBOOT ; SET POINTER TO BOOT MESSAGE - CALL DSKY_SHOW ; DISPLAY UNENCODED + LD C,DSKY_MSG_MON_BOOT + CALL DSKY_MSG JP BOOT ; DO BOOT ; ;__DOPORTREAD_________________________________________________________________ @@ -1343,7 +1343,7 @@ PORTREADLOOP: INC DE ; ADVANCE BUF PTR INC DE ; ... TO LAST TWO POSITIONS CALL PUTVALUE ; DISPLAY PORT VALUE - CALL ENCDISPLAY ; DISPLAY BUFFER CONTENTS + CALL DISPLAY ; DISPLAY BUFFER CONTENTS PORTREADGETKEY: CALL KB_GET ; GET KEY FROM KB JR PORTREADGETKEY ; NO VALID KEY, LOOP @@ -1367,7 +1367,7 @@ PORTWRITELOOP: OUT (C),A ; OUTPUT VALUE TO PORT STORED IN "C" LD DE,DISPLAYBUF+6 ; DISPLAY WRITTEN PORT VALUE CALL PUTVALUE ; ... WITHOUT DP'S - CALL ENCDISPLAY ; DISPLAY BUFFER CONTENTS + CALL DISPLAY ; DISPLAY BUFFER CONTENTS PORTWRITEGETKEY: CALL KB_GET ; GET KEY FROM KB JR PORTWRITEGETKEY ; NO VALID KEY, LOOP @@ -1379,18 +1379,18 @@ PORTWRITEGETKEY: ; DOGO: CALL DSKY_HIGHLIGHTNUMKEYS - CALL GETADDR ; GET ADDRESS INTO HL - PUSH HL - CALL DSKY_HIGHLIGHTKEYSOFF LD HL,GOTO ; POINT TO "GO" MSG CALL INITBUF + CALL GETVALW ; GET ADDRESS TO JUMP TO + PUSH HL + CALL DSKY_HIGHLIGHTKEYSOFF POP HL LD DE,DISPLAYBUF+4 LD A,H CALL PUTVALUE LD A,L CALL PUTVALUE - CALL ENCDISPLAY ; DISPLAY + CALL DISPLAY ; DISPLAY JP (HL) ; AND RUN ; ;__DOEXAMINE__________________________________________________________________ @@ -1416,7 +1416,7 @@ EXAMINELOOP: INC DE LD A,(HL) ; GET VALUE FROM ADDRESS IN HL CALL PUTVALUE - CALL ENCDISPLAY ; DISPLAY BUFFER ON DISPLAYS + CALL DISPLAY ; DISPLAY BUFFER ON DISPLAYS CALL DSKY_HIGHLIGHTFWDKEYS EXAMINEGETKEY: CALL KB_GET ; GET KEY FROM KB @@ -1451,7 +1451,7 @@ DEPOSITLOOP: LD (HL),A ; LD DE,DISPLAYBUF+6 ; DISPLAY WRITTEN MEM VALUE CALL PUTVALUE ; ... WITHOUT DP'S - CALL ENCDISPLAY ; DISPLAY BUFFER CONTENTS + CALL DISPLAY ; DISPLAY BUFFER CONTENTS CALL DSKY_HIGHLIGHTFWDKEYS DEPOSITGETKEY: CALL KB_GET ; GET KEY FROM KB @@ -1488,7 +1488,7 @@ GETVALW: LD (DISPLAYBUF+6),A ; LD (DISPLAYBUF+7),A ; GETVALW1: - CALL ENCDISPLAY ; + CALL DISPLAY ; GETVALWLOOP: CALL KB_GET ; CP $10 ; @@ -1557,7 +1557,7 @@ GETVALUE: LD (DISPLAYBUF+6),A ; LD (DISPLAYBUF+7),A ; GETVALUE1: - CALL ENCDISPLAY ; + CALL DISPLAY ; GETVALUELOOP: CALL KB_GET ; CP $10 ; @@ -1644,52 +1644,22 @@ INITBUF: LDIR RET ; -;__ENCDISPLAY_________________________________________________________________ +;__DISPLAY _________________________________________________________________ ; -; DISPLAY CONTENTS OF DISPLAYBUF ENCODED PER SEGDECODE TABLE +; DISPLAY CONTENTS OF DISPLAYBUF ;_____________________________________________________________________________ ; -ENCDISPLAY: +DISPLAY: + PUSH AF + PUSH BC + PUSH DE PUSH HL LD HL,DISPLAYBUF - JR ENCBUF0 -; -;__ENCBUF_____________________________________________________________________ -; -; DISPLAY CONTENTS OF BUFFER AT HL ENCODED PER SEGDECODE TABLE -;_____________________________________________________________________________ -; -ENCBUF: - PUSH HL ; SAVE HL -ENCBUF0: - PUSH AF ; SAVE AF - PUSH BC ; SAVE BC - PUSH DE ; SAVE DE - LD DE,DSKY_BUF ; DESTINATION FOR DECODED BYTES - LD B,8 ; NUMBER OF BYTES TO DECODE -ENCBUF1: - LD A,(HL) ; GET SOURCE BYTE - INC HL ; BUMP TO NEXT BYTE FOR NEXT PASS - PUSH AF ; SAVE IT - AND $80 ; ISOLATE HI BIT (DP) - LD C,A ; SAVE IN C - POP AF ; RECOVER ORIGINAL - AND $7F ; REMOVE HI BIT (DP) - PUSH HL ; SAVE POINTER - LD HL,SEGDECODE ; POINT TO DECODE TABLE - CALL ADDHLA ; OFFSET BY INCOMING VALUE - LD A,(HL) ; GET DECODED VALUE - OR C ; RECOMBINE WITH DP VALUE - LD (DE),A ; SAVE IN DEST BUF - INC DE ; INC DEST BUF PTR - POP HL ; RESTORE POINTER - DJNZ ENCBUF1 ; LOOP THRU ALL BUF POSITIONS - LD HL,DSKY_BUF ; POINT TO DECODED BUFFER - CALL DSKY_SHOW ; DISPLAY IT - POP DE ; RESTORE DE - POP BC ; RESTORE BC - POP AF ; RESTORE AF - POP HL ; RESTORE HL + CALL DSKY_SHOW + POP HL + POP DE + POP BC + POP AF RET ; ;_____________________________________________________________________________ @@ -1750,50 +1720,22 @@ DSKY_HIGHLIGHT: CALL DSKY_PUTLED POP HL RET +; +DSKY_MSG: + LD B,BF_DSKYMESSAGE + RST 08 + RET DSKY_HIGHLIGHTFWDKEYLEDS .DB $00,$00,$00,$30,$00,$00,$00,$00 DSKY_HIGHLIGHTCMDKEYLEDS .DB $20,$00,$20,$3F,$00,$00,$00,$00 DSKY_HIGHLIGHTNUMKEYLEDS .DB $1F,$3F,$1F,$30,$00,$00,$00,$00 DSKY_HIGHLIGHTKEYLEDSOFF .DB $00,$00,$00,$00,$00,$00,$00,$00 ; -#IF (GM7303ENABLE) -; The GM7303 has an ASCII LCD display -CPUUP .DB "-CPU UP-",0 -MSGBOOT .DB "Boot! ",0 -ADDR .DB "Adr 0000",0 -PORT .DB "Port 00",0 -GOTO .DB "Go 0000",0 -; -#ELSE -; -CPUUP .DB $40,$39,$73,$3E,$00,$3E,$73,$40 ; "-CPU UP-" (RAW SEG) -MSGBOOT .DB $7F,$5C,$5C,$78,$82,$00,$00,$00 ; "Boot! " (RAW SEG) -ADDR .DB $17,$18,$19,$10,$00,$00,$00,$00 ; "Adr 0000" (ENCODED) -PORT .DB $13,$14,$15,$16,$10,$10,$00,$00 ; "Port 00" (ENCODED) -GOTO .DB $1A,$14,$10,$10,$00,$00,$00,$00 ; "Go 0000" (ENCODED) -#ENDIF -; -;_HEX_7_SEG_DECODE_TABLE______________________________________________________ -; -; SET BIT 7 TO DISPLAY W/ DECIMAL POINT -;_____________________________________________________________________________ -; -SEGDECODE: -; - ; POS $00 $01 $02 $03 $04 $05 $06 $07 - ; GLYPH '0' '1' '2' '3' '4' '5' '6' '7' - .DB $3F, $06, $5B, $4F, $66, $6D, $7D, $07 -; - ; POS $08 $09 $0A $0B $0C $0D $0E $0F - ; GLYPH '8' '9' 'A' 'B' 'C' 'D' 'E' 'F' - .DB $7F, $67, $77, $7C, $39, $5E, $79, $71 -; - ; POS $10 $11 $12 $13 $14 $15 $16 $17 $18 $19 $1A - ; GLYPH ' ' '-' '.' 'P' 'o' 'r' 't' 'A' 'd' 'r' 'G' - .DB $00, $40, $00, $73, $5C, $50, $78, $77, $5E, $50, $3D +ADDR .DB $17,$18,$19,$10,$00,$00,$00,$00 ; "Adr 0000" (ENCODED FOR SHOWSEG) +PORT .DB $13,$14,$15,$16,$10,$10,$00,$00 ; "Port 00" (ENCODED FOR SHOWSEG) +GOTO .DB $1A,$14,$10,$10,$00,$00,$00,$00 ; "Go 0000" (ENCODED FOR SHOWSEG) ; DISPLAYBUF: .FILL 8,0 -DSKY_BUF .FILL 8,0 ; #ELSE ; @@ -1806,7 +1748,6 @@ DSKY_ENTRY: ; UTILITY FUNCTIONS ;================================================================================================== ; -; CHR_BEL .EQU 07H CHR_CR .EQU 0DH CHR_LF .EQU 0AH diff --git a/Source/HBIOS/ez80rtc.asm b/Source/HBIOS/ez80rtc.asm index c40ef919..483739e1 100644 --- a/Source/HBIOS/ez80rtc.asm +++ b/Source/HBIOS/ez80rtc.asm @@ -19,7 +19,7 @@ EZ80RTC_INIT: CALL NEWLINE ; FORMATTING CALL PRTSTRD - .TEXT "EZ80 RTC: POWERED $" + .TEXT "EZ80 RTC: $" EZ80_RTC_INIT() JR Z, RTC_POWERED @@ -31,6 +31,9 @@ EZ80RTC_INIT: RET RTC_POWERED: + CALL PRTSTRD + .TEXT "POWERED $" + ; DISPLAY CURRENT TIME LD HL, EZ80RTC_BCDBUF_EXT ; POINT TO BCD BUF EXTENDED EZ80_RTC_GET_TIME() diff --git a/Source/HBIOS/fd.asm b/Source/HBIOS/fd.asm index 467b79bd..3d9d53dc 100644 --- a/Source/HBIOS/fd.asm +++ b/Source/HBIOS/fd.asm @@ -1224,13 +1224,13 @@ FD_RETRY1: ; FD_START: ; -#IF (DSKYENABLE) - #IF (DSKYDSKACT) +;;;#IF (DSKYENABLE) +;;;#IF (DSKYDSKACT) LD A,4 CALL LDHLIYA CALL HB_DSKACTCHS ; SHOW ACTIVITY - #ENDIF -#ENDIF +;;;#ENDIF +;;;#ENDIF ; LD A,(FCD_FDCRDY) CP TRUE diff --git a/Source/HBIOS/gm7303.asm b/Source/HBIOS/gm7303.asm index 64901707..2231ae53 100644 --- a/Source/HBIOS/gm7303.asm +++ b/Source/HBIOS/gm7303.asm @@ -134,7 +134,8 @@ GM7303_DISPATCH: DEC A JP Z,GM7303_SHOWHEX ; DISPLAY A 32-BIT BINARY VALUE IN HEX DEC A - JP Z,GM7303_SHOWASCII ; DISPLAY ASCII TEXT + ;;;JP Z,GM7303_SHOWASCII ; DISPLAY ASCII TEXT + JP Z,GM7303_SHOWSEG ; DISPLAY SEGMENT MAPPED TEXT DEC A JP Z,GM7303_KEYLEDS ; SET KEYPAD LEDS DEC A @@ -143,6 +144,10 @@ GM7303_DISPATCH: JP Z,GM7303_BEEP ; BEEP DSKY SPEAKER DEC A JP Z,GM7303_DEVICE ; DEVICE INFO + DEC A + JP Z,GM7303_MESSAGE ; HANDLE MESSAGE + DEC A + JP Z,GM7303_EVENT ; HANDLE EVENT SYSCHKERR(ERR_NOFUNC) RET @@ -248,6 +253,28 @@ GM7303_NUM_TEST: ADD A,$B0 ; NO, CONVERT TO B0-B9 RET ; EXIT +GM7303_SHOWSEG: + ; CONVERT FROM SEG ALPHABET TO DISPLAY CODES + LD B,8 ; DO FOR ALL CHARS + LD DE,GM7303_BUF ; DESTINATION BUFFER +GM7303_SHOWSEG1: + LD A,(HL) ; GET SOURCE VALUE + INC HL ; BUMP FOR NEXT TIME + AND $7F ; REMOVE HI BIT (DP) + PUSH HL ; SAVE IT + LD HL,GM7303_SEGMAP ; POINT TO XLAT MAP + CALL ADDHLA ; OFFSET BY VALUE + LD A,(HL) ; GET NEW VALUE + LD (DE),A ; SAVE IT + INC DE ; BUMP PTR + POP HL ; RESTORE SOURCE PTR + DJNZ GM7303_SHOWSEG1 ; LOOP TILL DONE +; + ; DISPLAY CONVERTED BUFFER + LD HL,GM7303_BUF ; BUFFER + ; FALL THRU + + GM7303_SHOWASCII: ; DISPLAY AN ASCII STRING ON THE GM7303 DISPLAY ; ENTER WITH HL- DATA TO PRINT (NULL TERMINATED) PUSH HL ; SAVE THE POINTER TO THE STRING @@ -256,8 +283,8 @@ GM7303_SHOWASCII: ; DISPLAY AN ASCII STRING ON THE GM7303 DISPLAY CALL GM7303_OUTDS XOR A ; RETURN SUCCESS RET - - +; +; ; GM7303_KEYLEDS: GM7303_STATLED: @@ -275,6 +302,100 @@ GM7303_DEVICE: XOR A ; SIGNAL SUCCESS RET ; +; MESSAGE HANDLER +; +GM7303_MESSAGE: + LD A,C ; GET MESSAGE ID + ADD A,A ; WORD OFFSET + LD HL,GM7303_MSGTBL ; START OF MESSAGE TABLE + CALL ADDHLA ; ADD OFFSET + LD A,(HL) ; SAVE LSB + INC HL ; BUMP TO MSB + LD H,(HL) ; GET MSB + LD L,A ; GET LSB + JR GM7303_SHOWASCII ; SHOW MESSAGE AND RETURN +; +; EVENT HANDLER +; +GM7303_EVENT: + LD A,C ; EVENT ID + OR A ; 0=CPUSPD + JR Z,GM7303_EVT_CPUSPD ; HANDLE CPU SPD CHANGE + DEC A ; 1=DSKACT + JR Z,GM7303_EVT_DSKACT ; HANDLE DISK ACTIVITY + XOR A + RET +; +; CPU SPEED CHANGE +; +GM7303_EVT_CPUSPD: + XOR A + RET +; +; DISK ACTIVITY +; +; CALLED FROM HBIOS RIGHT BEFORE A DISK ACCESS +; +; FORMAT: "Dsk99 R:12345678" +; 0123456789012345 +; +GM7303_EVT_DSKACT: +; + LD A,(GM7303_PRESENT) ; GET PRESENCE FLAG + OR A ; SET FLAGS + JR Z,GM7303_DSKACT_Z ; HANDLE NOT PRESENT +; + PUSH HL + LD HL,$0100 ; ROW 1, COL 0 + CALL GM7303_GOTORC ; SET DISPLAY ADDRESS + POP HL +; + LD DE,GM7303_STR_IO ; PREFIX + CALL GM7303_OUTDS ; SEND TO DISPLAY (COLS 0-5) + + LD A,(HB_DSKUNIT) ; GET DISK UNIT NUM + CALL GM7303_DSKACT_BYTE ; SEND TO DISPLAY (COLS 6-7) HEX??? +; + LD A,' ' ; SEPARATOR + CALL GM7303_OUTD ; SEND TO DISPLAY (COL 8) +; + LD A,(HB_DSKFUNC) ; ACTIVE DISK FUNCTION + CP BF_DIOWRITE ; WRITE? + LD A,'W' ; ASSUME WRITE + JR Z,GM7303_DSKACT0 ; GO AHEAD + LD A,'R' ; OTHERWISE READ +GM7303_DSKACT0: + CALL GM7303_OUTD ; SEND CHAR (COL 10) + + LD A,':' ; SEPARATOR + CALL GM7303_OUTD ; SEND TO DISPLAY (COL 11) +; + LD HL,HB_DSKADR+3 ; INPUT POINTER + LD B,4 ; DO 4 BYTES +; +GM7303_DSKACT1: + LD A,(HL) ; GET BYTE + CALL GM7303_DSKACT_BYTE ; SEND TO DISPLAY (COLS 12-19) + DEC HL ; DEC PTR + DJNZ GM7303_DSKACT1 ; DO ALL 4 BYTES +; +GM7303_DSKACT_Z: + RET +;; +GM7303_DSKACT_BYTE: + PUSH AF ; SAVE BYTE + RRCA ; DO TOP NIBBLE FIRST + RRCA + RRCA + RRCA + CALL HEXCONV ; CONVERT NIBBLE TO ASCII + CALL GM7303_OUTD ; SEND TO DISPLAY + POP AF ; RECOVER CURRENT BYTE + CALL HEXCONV ; CONVERT NIBBLE TO ASCII + CALL GM7303_OUTD ; SEND TO DISPLAY + RET ; DONE + +; ;__GM7303_KEY___________________________________________________________________________________________ ; ; CHECK FOR KEY PRESS W/ DEBOUNCE @@ -345,81 +466,6 @@ GM7303_KEYMAP: -; -; CALLED FROM HBIOS RIGHT BEFORE A DISK ACCESS -; HL: ADDRESS OF 32-BIT SECTOR NUMBER (LITTLE-ENDIAN) -; -; FORMAT: "Dsk99 R:12345678" -; 0123456789012345 -; -GM7303_DSKACT: - ; SAVE EVERYTHING - PUSH AF - PUSH BC - PUSH DE - PUSH HL -; - LD A,(GM7303_PRESENT) ; GET PRESENCE FLAG - OR A ; SET FLAGS - JR Z,GM7303_DSKACT_Z ; HANDLE NOT PRESENT -; - PUSH HL - LD HL,$0100 ; ROW 1, COL 0 - CALL GM7303_GOTORC ; SET DISPLAY ADDRESS - POP HL -; - LD DE,GM7303_STR_IO ; PREFIX - CALL GM7303_OUTDS ; SEND TO DISPLAY (COLS 0-5) - - LD A,(HB_DSKUNIT) ; GET DISK UNIT NUM - CALL GM7303_DSKACT_BYTE ; SEND TO DISPLAY (COLS 6-7) HEX??? -; - LD A,' ' ; SEPARATOR - CALL GM7303_OUTD ; SEND TO DISPLAY (COL 8) -; - LD A,(HB_DSKFUNC) ; ACTIVE DISK FUNCTION - CP BF_DIOWRITE ; WRITE? - LD A,'W' ; ASSUME WRITE - JR Z,GM7303_DSKACT0 ; GO AHEAD - LD A,'R' ; OTHERWISE READ -GM7303_DSKACT0: - CALL GM7303_OUTD ; SEND CHAR (COL 10) - - LD A,':' ; SEPARATOR - CALL GM7303_OUTD ; SEND TO DISPLAY (COL 11) -; - LD A,3 ; POINT TO - CALL ADDHLA ; END OF DWORD (MSB) - LD B,4 ; DO 4 BYTES -; -GM7303_DSKACT1: - LD A,(HL) ; GET BYTE - CALL GM7303_DSKACT_BYTE ; SEND TO DISPLAY (COLS 12-19) - DEC HL ; DEC PTR - DJNZ GM7303_DSKACT1 ; DO ALL 4 BYTES -; -GM7303_DSKACT_Z: - ; CLEAN UP AND GO AWAY - POP HL - POP DE - POP BC - POP AF - RET -;; -GM7303_DSKACT_BYTE: - PUSH AF ; SAVE BYTE - RRCA ; DO TOP NIBBLE FIRST - RRCA - RRCA - RRCA - CALL HEXCONV ; CONVERT NIBBLE TO ASCII - CALL GM7303_OUTD ; SEND TO DISPLAY - POP AF ; RECOVER CURRENT BYTE - CALL HEXCONV ; CONVERT NIBBLE TO ASCII - CALL GM7303_OUTD ; SEND TO DISPLAY - RET ; DONE - - ; DETECT PRESENCE OF GM7303 CONTROLLER ; WE CAN'T USE CONTROLLER RAM AS THE GM7303 DOES NOT SUPPORT LCD READS ; SIMPLY TEST FOR THE EXISTANCE OF BUS PULLDOWN AT THE SWITCH PORT @@ -549,6 +595,9 @@ GM7303_RESETLCD: ; GM7303_PRESENT .DB 0 ; NON-ZERO WHEN HARDWARE DETECTED ; +GM7303_BUF .FILL 8 ; USED BY SHOWSEG + .DB 0 ; NULL TERMINATOR FOR ABOVE +; ; KBD WORKING STORAGE ; GM7303_KEYBUF .DB 0 @@ -565,7 +614,32 @@ GM7303_INIT_TBL: ; TABLE OF INITIALISATION COMMANDS FOR THE LCD GM7303_STR_BAN .DB "RomWBW ", BIOSVER, 0 GM7303_STR_CFG .DB "Build:", CONFIG, 0 GM7303_STR_IO .DB "Dsk", 0 - - - - +; +GM7303_SEGMAP: +; + ; POS $00 $01 $02 $03 $04 $05 $06 $07 + ; GLYPH '0' '1' '2' '3' '4' '5' '6' '7' + .DB "01234567" +; + ; POS $08 $09 $0A $0B $0C $0D $0E $0F + ; GLYPH '8' '9' 'A' 'B' 'C' 'D' 'E' 'F' + .DB "89ABCDEF" +; + ; POS $10 $11 $12 $13 $14 $15 $16 $17 $18 $19 $1A + ; GLYPH ' ' '-' '.' 'P' 'o' 'r' 't' 'A' 'd' 'r' 'G' + .DB " -.PortAdrG" +; +GM7303_MSGTBL: + .DW GM7303_MSG_LDR_SEL + .DW GM7303_MSG_LDR_BOOT + .DW GM7303_MSG_LDR_LOAD + .DW GM7303_MSG_LDR_GO + .DW GM7303_MSG_MON_RDY + .DW GM7303_MSG_MON_BOOT +; +GM7303_MSG_LDR_SEL .DB "Ready",0 +GM7303_MSG_LDR_BOOT .DB "Boot...",0 +GM7303_MSG_LDR_LOAD .DB "Load...",0 +GM7303_MSG_LDR_GO .DB "Go...",0 +GM7303_MSG_MON_RDY .DB "-CPU UP-",0 +GM7303_MSG_MON_BOOT .DB "Boot!",0 diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 3867282b..528164d2 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -2340,30 +2340,30 @@ HB_CPU1: ; DSKY INITIALIZATION AND ANNOUNCEMENT ;-------------------------------------------------------------------------------------------------- ; -#IF (DSKYENABLE) - #IF (ICMENABLE) +;;;#IF (DSKYENABLE) +#IF (ICMENABLE) CALL ICM_PREINIT - #ENDIF - #IF (PKDENABLE) +#ENDIF +#IF (PKDENABLE) CALL PKD_PREINIT - #ENDIF -; - ; ANNOUNCE OURSELVES ON DSKY - LD HL,MSG_HBVER + 5 - LD A,(DSKY_HEXMAP + RMJ) - OR $80 - LD (HL),A - INC HL - LD A,(DSKY_HEXMAP + RMN) - OR $80 - LD (HL),A - INC HL - LD A,(DSKY_HEXMAP + RUP) - LD (HL),A - LD HL,MSG_HBVER - LD B,BF_DSKYSHOWSEG - CALL DSKY_DISPATCH #ENDIF +; + ;;;; ANNOUNCE OURSELVES ON DSKY + ;;;LD HL,MSG_HBVER + 5 + ;;;LD A,(DSKY_HEXMAP + RMJ) + ;;;OR $80 + ;;;LD (HL),A + ;;;INC HL + ;;;LD A,(DSKY_HEXMAP + RMN) + ;;;OR $80 + ;;;LD (HL),A + ;;;INC HL + ;;;LD A,(DSKY_HEXMAP + RUP) + ;;;LD (HL),A + ;;;LD HL,MSG_HBVER + ;;;LD B,BF_DSKYSHOWSEG + ;;;CALL DSKY_DISPATCH +;;;#ENDIF #IF (LCDENABLE) CALL LCD_PREINIT #ENDIF @@ -2917,6 +2917,21 @@ NOT_REC_M2: ; FPLEDS(DIAG_08) ; +#IF FALSE + LD DE,$0123 + LD HL,$4567 + LD B,BF_DSKYSHOWHEX + CALL DSKY_DISPATCH + CALL LDELAY + CALL LDELAY + LD DE,$89AB + LD HL,$CDEF + LD B,BF_DSKYSHOWHEX + CALL DSKY_DISPATCH + CALL LDELAY + CALL LDELAY +#ENDIF +; ;-------------------------------------------------------------------------------------------------- ; IO PORT SCAN ;-------------------------------------------------------------------------------------------------- @@ -3813,14 +3828,14 @@ HB_INITTBL: #IF (PCFENABLE) .DW PCF_INIT #ENDIF -#IF (DSKYENABLE) - #IF (ICMENABLE) +;;;#IF (DSKYENABLE) +#IF (ICMENABLE) .DW ICM_INIT - #ENDIF - #IF (PKDENABLE) +#ENDIF +#IF (PKDENABLE) .DW PKD_INIT - #ENDIF #ENDIF +;;;#ENDIF #IF (LCDENABLE) .DW LCD_INIT #ENDIF @@ -4432,6 +4447,7 @@ HB_IOBNK .DB 0 ; CURRENT IO BUFFER BANK ID HB_DSKCMD: HB_DSKUNIT .DB 0 ; CURRENT DISK UNIT HB_DSKFUNC .DB 0 ; CURRENT DISK FUNCTION +HB_DSKADR .FILL 4,0 ; CURRENT DISK BLOCK ADDRESS ; ;-------------------------------------------------------------------------------------------------- ; DSKY DISK ACTIVITY MONITOR @@ -4451,19 +4467,8 @@ HB_DSKFUNC .DB 0 ; CURRENT DISK FUNCTION ; HL: ADDRESS OF 32-BIT SECTOR NUMBER (LITTLE-ENDIAN) ; ALL REGISTERS PERSERVED ; +#IF (DSKYDSKACT) HB_DSKACT: -#IF (LCDENABLE) - #IF (LCDDSKACT) - CALL LCD_DSKACT - #ENDIF -#ENDIF -#IF (GM7303ENABLE) - #IF (GM7303DSKACT) - CALL GM7303_DSKACT - #ENDIF -#ENDIF -#IF (DSKYENABLE) - #IF (DSKYDSKACT) ; ; SAVE EVERYTHING PUSH AF @@ -4471,38 +4476,16 @@ HB_DSKACT: PUSH DE PUSH HL ; - ; COPY VALUE TO LOCAL HEXBUF + ; COPY VALUE TO LOCAL HB_DSKADR CALL LD32 ; HB_DSKACT1: - LD BC,DSKY_HEXBUF + LD BC,HB_DSKADR CALL ST32 ; - ; USE DISK UNIT NUMBER FOR MSB - LD A,(HB_DSKUNIT) ; GET DISK UNIT NUM - LD (DSKY_HEXBUF+3),A ; REPLACE HIGH BYTE W/ DISK # -; - ; CONVERT TO SEGMENT DISPLAY - LD HL,DSKY_HEXBUF ; INPUT POINTER - LD DE,DSKY_BUF ; TEMP BUF FOR OUTPUT - CALL DSKY_BIN2SEG ; CONVERT TO SEG DISPLAY -; - ; DECIMAL POINT FOR DISK UNIT SEPARATION - LD HL,DSKY_BUF+1 ; SECOND CHAR OF DISP - SET 7,(HL) ; TURN ON DECIMAL PT -; - ; DECIMAL POINT TO INDICATE WRITE ACTION - LD A,(HB_DSKFUNC) ; GET CURRENT I/O FUNCTION - CP BF_DIOWRITE ; IS IT A WRITE? - JR NZ,HB_DSKACT2 ; IF NOT, SKIP - LD HL,DSKY_BUF+7 ; POINT TO CHAR 7 - SET 7,(HL) ; SET WRITE DOT -; -HB_DSKACT2: - ; UPDATE DISPLAY - LD HL,DSKY_BUF ; SEG DISPLAY BUF TO HL - LD B,BF_DSKYSHOWSEG ; SHOW SEG FUNCTION - CALL DSKY_DISPATCH ; DO IT + LD B,BF_DSKYEVENT + LD C,DSKY_EVT_DSKACT + CALL DSKY_DISPATCH ; ; CLEAN UP AND GO AWAY POP HL @@ -4530,13 +4513,18 @@ HB_DSKACTCHS: ; MAP HSCC -> CCHS EX DE,HL JR HB_DSKACT1 -; - #ENDIF -#ENDIF ; HB_DSKACT_Z: RET ; +#ELSE +; +HB_DSKACT: +HB_DSKACTCHS: + RET +; +#ENDIF +; ;-------------------------------------------------------------------------------------------------- ; REAL TIME CLOCK DEVICE DISPATCHER ;-------------------------------------------------------------------------------------------------- @@ -6356,44 +6344,6 @@ HB_ADDIM1: #ENDIF ; ;-------------------------------------------------------------------------------------------------- -; DSKY SUPPORT -;-------------------------------------------------------------------------------------------------- -; -#IF (DSKYENABLE) -; -; CONVERT 32 BIT BINARY TO 8 BYTE HEX SEGMENT DISPLAY -; -; HL: ADR OF 32 BIT BINARY -; DE: ADR OF DEST LED SEGMENT DISPLAY BUFFER (8 BYTES) -; -DSKY_BIN2SEG: - LD B,4 ; 4 BYTES OF INPUT - LD A,B ; PUT IN ACCUM - CALL ADDHLA ; PROCESS FROM END (LITTLE ENDIAN) -DSKY_BIN2SEG1: - DEC HL ; DEC PTR (LITTLE ENDIAN) - LD A,(HL) ; HIGH NIBBLE - RRCA \ RRCA \ RRCA \ RRCA ; ROTATE BITS - CALL DSKY_BIN2SEG_NIB ; CONVERT NIBBLE INTO OUTPUT BUF - LD A,(HL) ; LOW NIBBLE - CALL DSKY_BIN2SEG_NIB ; CONVERT NIBBLE INTO OUTPUT BUF - DJNZ DSKY_BIN2SEG1 ; LOOP FOR ALL INPUT BYTES - RET ; DONE -; -DSKY_BIN2SEG_NIB: - PUSH HL ; SAVE HL - LD HL,DSKY_HEXMAP ; POINT TO SEG MAP TABLE - AND $0F ; ISOLATE LOW NIBBLE - CALL ADDHLA ; OFFSET INTO TABLE - LD A,(HL) ; LOAD VALUE FROM TABLE - POP HL ; RESTORE HL - LD (DE),A ; SAVE VALUE TO OUTPUT BUF - INC DE ; BUMP TO NEXT OUTPUT BYTE - RET ; DONE -; -#ENDIF -; -;-------------------------------------------------------------------------------------------------- ; SYSTEM TIMER INTERRUPT HANDLER ;-------------------------------------------------------------------------------------------------- ; @@ -8205,25 +8155,25 @@ HB_PRTSUM_END .EQU $ ; HB_DRIVERS_BEG .EQU $ ; -#IF (DSKYENABLE) - #IF (ICMENABLE) +;;;#IF (DSKYENABLE) +#IF (ICMENABLE) ORG_ICM .EQU $ #INCLUDE "icm.asm" SIZ_ICM .EQU $ - ORG_ICM MEMECHO "ICM occupies " MEMECHO SIZ_ICM MEMECHO " bytes.\n" - #ENDIF +#ENDIF ; - #IF (PKDENABLE) +#IF (PKDENABLE) ORG_PKD .EQU $ #INCLUDE "pkd.asm" SIZ_PKD .EQU $ - ORG_PKD MEMECHO "PKD occupies " MEMECHO SIZ_PKD MEMECHO " bytes.\n" - #ENDIF #ENDIF +;;;#ENDIF ; #IF (LCDENABLE) ORG_LCD .EQU $ @@ -8901,10 +8851,6 @@ STR_PANIC .TEXT "\r\n>>> PANIC: $" STR_SYSCHK .TEXT "\r\n>>> SYSCHK: $" STR_CONTINUE .TEXT "\r\nContinue (Y/N)? $" ; -#IF (DSKYENABLE) ; 'H','B','I','O',' ',' ',' ',' ' -MSG_HBVER .DB $76,$7F,$30,$3F,$00,$00,$00,$00 ; "HBIO " -#ENDIF -; HB_CURSEC .DB 0 ; CURRENT SECOND (TEMP) ; HB_BCDTMP .FILL 5,0 ; BCD NUMBER STORAGE (TEMP) @@ -9080,37 +9026,6 @@ MG014_STATMAPHI: ; #ENDIF ; -; CODES FOR NUMERICS -; HIGH BIT ALWAYS CLEAR TO SUPPRESS DECIMAL POINT -; SET HIGH BIT TO SHOW DECIMAL POINT -; -#IF (DSKYENABLE) -; -DSKY_HEXMAP: - .DB $3F ; 0 - .DB $06 ; 1 - .DB $5B ; 2 - .DB $4F ; 3 - .DB $66 ; 4 - .DB $6D ; 5 - .DB $7D ; 6 - .DB $07 ; 7 - .DB $7F ; 8 - .DB $67 ; 9 - .DB $77 ; A - .DB $7C ; B - .DB $39 ; C - .DB $5E ; D - .DB $79 ; E - .DB $71 ; F -; -DSKY_BUF .FILL 8,0 -DSKY_BUFLEN .EQU $ - DSKY_BUF -DSKY_HEXBUF .FILL 4,0 -DSKY_HEXBUFLEN .EQU $ - DSKY_HEXBUF -; -#ENDIF -; HB_DATA_END .EQU $ ; HB_END .EQU $ diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index 5547397f..aa24dd4a 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -46,6 +46,8 @@ BF_DSKYKEYLEDS .EQU BF_DSKY + 5 ; SET/CLEAR KEYPAD LEDS BF_DSKYSTATLED .EQU BF_DSKY + 6 ; SET/CLEAR STATUS LEDS BF_DSKYBEEP .EQU BF_DSKY + 7 ; BEEP ONBOARD DSKY SPEAKER BF_DSKYDEVICE .EQU BF_DSKY + 8 ; DSKY DEVICE INFO REPORT +BF_DSKYMESSAGE .EQU BF_DSKY + 9 ; DSKY MESSAGE HANDLING +BF_DSKYEVENT .EQU BF_DSKY + 10 ; DSKY EVENT HANDLING ; BF_VDA .EQU $40 BF_VDAINI .EQU BF_VDA + 0 ; INITIALIZE VDU @@ -372,6 +374,7 @@ DSKYDEV_ICM .EQU $00 ; Intersil ICM7218 DSKYDEV_PKD .EQU $01 ; Intel P8279 DSKYDEV_H8P .EQU $02 ; Heath H8 Panel DSKYDEV_GM7303 .EQU $03 ; Genesis GM7303 LCD Panel +DSKYDEV_LCD .EQU $04 ; RCBus LCD Panel ; ; VIDEO DEVICE IDS ; diff --git a/Source/HBIOS/icm.asm b/Source/HBIOS/icm.asm index a0490cd4..41781e6a 100644 --- a/Source/HBIOS/icm.asm +++ b/Source/HBIOS/icm.asm @@ -27,19 +27,26 @@ ; PB0 | $01 [FW] $41 [0] $81 [BK] $C1 [CL] ; ; -ICM_PPIA .EQU ICMPPIBASE + 0 ; PORT A -ICM_PPIB .EQU ICMPPIBASE + 1 ; PORT B -ICM_PPIC .EQU ICMPPIBASE + 2 ; PORT C -ICM_PPIX .EQU ICMPPIBASE + 3 ; PPI CONTROL PORT +ICM_PPIA .EQU ICMPPIBASE + 0 ; PORT A +ICM_PPIB .EQU ICMPPIBASE + 1 ; PORT B +ICM_PPIC .EQU ICMPPIBASE + 2 ; PORT C +ICM_PPIX .EQU ICMPPIBASE + 3 ; PPI CONTROL PORT +; +ICM_ROWS .EQU 1 ; DISPLAY ROWS +ICM_COLS .EQU 8 ; DISPLAY COLUMNS ; DEVECHO "ICM: IO=" DEVECHO ICMPPIBASE + DEVECHO ", SIZE=" + DEVECHO ICM_COLS + DEVECHO "X" + DEVECHO ICM_ROWS DEVECHO "\n" ; -;__ICM_INIT__________________________________________________________________________________________ +;__ICM_INIT________________________________________________________________________________________ ; ; CONFIGURE PARALLEL PORT AND CLEAR KEYPAD BUFFER -;____________________________________________________________________________________________________ +;__________________________________________________________________________________________________ ; ICM_PREINIT: LD A,(DSKY_DISPACT) ; DSKY DISPATCHER ALREADY SET? @@ -83,6 +90,33 @@ ICM_PREINIT: LD BC,ICM_DISPATCH CALL DSKY_SETDISP ; + CALL ICM_SHOWVER +; + RET +; +ICM_SHOWVER: + LD HL,ICM_VERSTR + LD DE,ICM_BUF + LD BC,ICM_COLS + LDIR + LD HL,ICM_BUF + 5 + LD A,RMJ + LD A,(ICM_SEGMAP + RMJ) + OR $80 + LD (HL),A + INC HL + LD A,(ICM_SEGMAP + RMN) + OR $80 + LD (HL),A + INC HL + LD A,(ICM_SEGMAP + RUP) + LD (HL),A +; + ; DISPLAY VERSION ON ICM + LD C,0 + LD B,8 + LD HL,ICM_BUF + CALL ICM_PUTBUF RET ; ICM_INIT: @@ -95,9 +129,18 @@ ICM_INIT: ; LD A,(ICM_PRESENT) ; PRESENT? OR A ; SET FLAGS - RET NZ ; YES, ALL DONE + JR NZ,ICM_INIT1 ; YES, CONTINUE PRTS(" NOT PRESENT$") ; NOT PRESENT + RET ; +ICM_INIT1: + CALL PC_SPACE + LD A,ICM_COLS + CALL PRTDEC8 + LD A,'X' + CALL COUT + LD A,ICM_ROWS + CALL PRTDEC8 RET ; ; ICM DEVICE FUNCTION DISPATCH ENTRY @@ -124,6 +167,10 @@ ICM_DISPATCH: JP Z,ICM_BEEP ; BEEP DSKY SPEAKER DEC A JP Z,ICM_DEVICE ; DEVICE INFO + DEC A + JP Z,ICM_MESSAGE ; HANDLE MESSAGE + DEC A + JP Z,ICM_EVENT ; HANDLE EVENT SYSCHKERR(ERR_NOFUNC) RET ; @@ -187,47 +234,44 @@ ICM_GETKEY2: ; DISPLAY HEX VALUE FROM DE:HL ; ICM_SHOWHEX: - LD BC,DSKY_HEXBUF ; POINT TO HEX BUFFER + LD BC,ICM_TMP32 ; POINT TO HEX BUFFER CALL ST32 ; STORE 32-BIT BINARY THERE - LD HL,DSKY_HEXBUF ; FROM: BINARY VALUE (HL) - LD DE,DSKY_BUF ; TO: SEGMENT BUFFER (DE) - CALL DSKY_BIN2SEG ; CONVERT - LD HL,DSKY_BUF ; POINT TO SEGMENT BUFFER - ; AND FALL THRU TO DISPLAY IT + LD HL,ICM_TMP32 ; FROM: BINARY VALUE (HL) + LD DE,ICM_BUF ; TO: SEGMENT BUFFER (DE) + CALL ICM_BIN2SEG ; CONVERT + LD HL,ICM_BUF ; POINT TO SEGMENT BUFFER + CALL ICM_PUTBUF ; DO IT + XOR A ; SUCCESS + RET ; AND RETURN ; ; ICM SHOW BUFFER ; HL: ADDRESS OF BUFFER ; ICM_SHOWSEG: - LD A,82H ; SETUP PPI - OUT (ICM_PPIX),A - CALL ICM_COFF - LD A,$F0 ; 7218 -> (DATA COMING, NO DECODE) - OUT (ICM_PPIA),A - CALL ICM_STROBEC ; STROBE COMMAND - LD B,DSKY_BUFLEN ; NUMBER OF DIGITS - LD C,ICM_PPIA -ICM_HEXOUT2: - LD A,(HL) - CALL ICM_XLAT ; MAP SEGMENTS - XOR $80 ; FIX DOT POLARITY - OUT (C),A - INC HL - DEC B - JP Z,ICM_STROBE ; DO FINAL STROBE AND RETURN - CALL ICM_STROBE ; STROBE BYTE VALUE - JR ICM_HEXOUT2 -ICM_STROBEC: ; COMMAND STROBE - LD A,80H | 30H - JP ICM_STROBE0 -ICM_STROBE: ; DATA STROBE - LD A,00H | 30H ; SET WRITE STROBE -ICM_STROBE0: - OUT (ICM_PPIC),A ; OUT TO PORTC - CALL DLY2 ; DELAY -ICM_COFF: - LD A,40H | 30H ; QUIESCE - OUT (ICM_PPIC),A ; OUT TO PORTC + ; CONVERT FROM DBG ALPHABET TO SEG CODES + LD B,ICM_COLS ; DO FOR ALL CHARS + LD DE,ICM_BUF ; DESTINATION BUFFER +ICM_SHOWSEG1: + LD A,(HL) ; GET SOURCE VALUE + INC HL ; BUMP FOR NEXT TIME + PUSH AF ; SAVE IT + AND $80 ; ISOLATE HI BIT (DP) + LD C,A ; SAVE IN C + POP AF ; RECOVER ORIGINAL + AND $7F ; REMOVE HI BIT (DP) + PUSH HL ; SAVE IT + LD HL,ICM_SEGMAP ; POINT TO XLAT MAP + CALL ADDHLA ; OFFSET BY VALUE + LD A,(HL) ; GET NEW VALUE + OR C ; RECOMBINE WITH DP BIT + LD (DE),A ; SAVE IT + INC DE ; BUMP PTR + POP HL ; RESTORE SOURCE PTR + DJNZ ICM_SHOWSEG1 ; LOOP TILL DONE +; + ; DISPLAY CONVERTED BUFFER + LD HL,ICM_BUF ; BUFFER + CALL ICM_PUTBUF ; DO IT XOR A ; SIGNAL SUCCESS RET ; @@ -249,10 +293,76 @@ ICM_DEVICE: XOR A ; SIGNAL SUCCESS RET ; -;__ICM_KEY___________________________________________________________________________________________ +; MESSAGE HANDLER +; +ICM_MESSAGE: + LD A,C ; GET MESSAGE ID + ADD A,A ; WORD OFFSET + LD HL,ICM_MSGTBL ; START OF MESSAGE TABLE + CALL ADDHLA ; ADD OFFSET + LD A,(HL) ; SAVE LSB + INC HL ; BUMP TO MSB + LD H,(HL) ; GET MSB + LD L,A ; GET LSB +; + ; HL HAS POINTER TO MESSAGE + CALL ICM_PUTBUF ; DISPLAY IT + XOR A ; SIGNAL SUCCESS + RET +; +; EVENT HANDLER +; +ICM_EVENT: + LD A,C ; EVENT ID + OR A ; 0=CPUSPD + JR Z,ICM_EVT_CPUSPD ; HANDLE CPU SPD CHANGE + DEC A ; 1=DSKACT + JR Z,ICM_EVT_DSKACT ; HANDLE DISK ACTIVITY + XOR A + RET +; +; CPU SPEED CHANGE +; +ICM_EVT_CPUSPD: + XOR A + RET +; +; DISK ACTIVITY +; +ICM_EVT_DSKACT: +; + ; USE DISK UNIT NUMBER FOR MSB + LD A,(HB_DSKUNIT) ; GET DISK UNIT NUM + LD (HB_DSKADR+3),A ; REPLACE HIGH BYTE W/ DISK # +; + ; CONVERT TO SEGMENT DISPLAY + LD HL,HB_DSKADR ; INPUT POINTER + LD DE,ICM_BUF ; BUF FOR OUTPUT + CALL ICM_BIN2SEG ; CONVERT TO SEG DISPLAY +; + ; DECIMAL POINT FOR DISK UNIT SEPARATION + LD HL,ICM_BUF+1 ; SECOND CHAR OF DISP + SET 7,(HL) ; TURN ON DECIMAL PT +; + ; DECIMAL POINT TO INDICATE WRITE ACTION + LD A,(HB_DSKFUNC) ; GET CURRENT I/O FUNCTION + CP BF_DIOWRITE ; IS IT A WRITE? + JR NZ,ICM_EVT_DSKACT2 ; IF NOT, SKIP + LD HL,ICM_BUF+7 ; POINT TO CHAR 7 + SET 7,(HL) ; SET WRITE DOT +; +ICM_EVT_DSKACT2: + ; UPDATE DISPLAY + LD HL,ICM_BUF ; SEG DISPLAY BUF TO HL + CALL ICM_PUTBUF +; + XOR A + RET +; +;__ICM_KEY_________________________________________________________________________________________ ; ; CHECK FOR KEY PRESS W/ DEBOUNCE -;____________________________________________________________________________________________________ +;__________________________________________________________________________________________________ ; ICM_KEY: CALL ICM_SCAN ; INITIAL KEY PRESS SCAN @@ -273,10 +383,10 @@ ICM_KEY2: OR A ; SET FLAGS BASED ON VALUE RET ; AND DONE ; -;__ICM_SCAN__________________________________________________________________________________________ +;__ICM_SCAN________________________________________________________________________________________ ; ; SCAN KEYPAD AND RETURN RAW SCAN CODE (RETURNS ZERO IF NO KEY PRESSED) -;____________________________________________________________________________________________________ +;__________________________________________________________________________________________________ ; ICM_SCAN: LD B,4 ; 4 COLUMNS @@ -300,37 +410,44 @@ ICM_SCAN2: OR E ; COMBINE WITH ROW JP ICM_RESET ; RETURN VIA RESET ; +;__ICM_PUTBUF______________________________________________________________________________________ ; -; CONVERT FORM STANDARD SEGMENT ENCODING TO ICM ENCODING -; -; From: To: -; +--01--+ +--40--+ -; 20 02 02 20 -; +--40--+ +--04--+ -; 10 04 08 10 -; +--08--+ 80 +--01--+ 80 +; WRITE BUFFER AT HL TO SEGMENT DISPLAY +;__________________________________________________________________________________________________ ; -ICM_XLAT: - PUSH BC - PUSH HL - LD C,A ; ORIG VALUE TO C - XOR A ; INIT RESULT VALUE - LD B,8 - LD HL,ICM_XTBL -ICM_XLAT1: - RRC C ; SHIFT NEXT BIT TO CF - JR NC,ICM_XLAT2 ; SKIP IF BIT NOT SET - OR (HL) -ICM_XLAT2: +ICM_PUTBUF: + LD A,82H ; SETUP PPI + OUT (ICM_PPIX),A + CALL ICM_COFF + LD A,$F0 ; 7218 -> (DATA COMING, NO DECODE) + OUT (ICM_PPIA),A + CALL ICM_STROBEC ; STROBE COMMAND + LD B,ICM_COLS ; NUMBER OF DIGITS + LD C,ICM_PPIA +ICM_HEXOUT2: + LD A,(HL) + XOR $80 ; FIX DOT POLARITY + OUT (C),A INC HL - DJNZ ICM_XLAT1 - POP HL - POP BC + DEC B + JP Z,ICM_STROBE ; DO FINAL STROBE AND RETURN + CALL ICM_STROBE ; STROBE BYTE VALUE + JR ICM_HEXOUT2 +ICM_STROBEC: ; COMMAND STROBE + LD A,80H | 30H + JP ICM_STROBE0 +ICM_STROBE: ; DATA STROBE + LD A,00H | 30H ; SET WRITE STROBE +ICM_STROBE0: + OUT (ICM_PPIC),A ; OUT TO PORTC + CALL DLY2 ; DELAY +ICM_COFF: + LD A,40H | 30H ; QUIESCE + OUT (ICM_PPIC),A ; OUT TO PORTC + XOR A ; SIGNAL SUCCESS RET ; -ICM_XTBL .DB $40, $20, $10, $01, $08, $02, $04, $80 -; -;_ _TABLE_____________________________________________________________________________________________________________ +;_KEYMAP_TABLE_____________________________________________________________________________________ ; ICM_KEYMAP: ; POS $00 $01 $02 $03 $04 $05 $06 $07 @@ -353,6 +470,35 @@ ICM_KEYBUF .DB 0 ; UTILTITY FUNCTIONS ;================================================================================================== ; +; CONVERT 32 BIT BINARY TO 8 BYTE HEX SEGMENT DISPLAY +; +; HL: ADR OF 32 BIT BINARY +; DE: ADR OF DEST LED SEGMENT DISPLAY BUFFER (8 BYTES) +; +ICM_BIN2SEG: + LD B,4 ; 4 BYTES OF INPUT + LD A,B ; PUT IN ACCUM + CALL ADDHLA ; PROCESS FROM END (LITTLE ENDIAN) +ICM_BIN2SEG1: + DEC HL ; DEC PTR (LITTLE ENDIAN) + LD A,(HL) ; HIGH NIBBLE + RRCA \ RRCA \ RRCA \ RRCA ; ROTATE BITS + CALL ICM_BIN2SEG_NIB ; CONVERT NIBBLE INTO OUTPUT BUF + LD A,(HL) ; LOW NIBBLE + CALL ICM_BIN2SEG_NIB ; CONVERT NIBBLE INTO OUTPUT BUF + DJNZ ICM_BIN2SEG1 ; LOOP FOR ALL INPUT BYTES + RET ; DONE +; +ICM_BIN2SEG_NIB: + PUSH HL ; SAVE HL + LD HL,ICM_SEGMAP ; POINT TO SEG MAP TABLE + AND $0F ; ISOLATE LOW NIBBLE + CALL ADDHLA ; OFFSET INTO TABLE + LD A,(HL) ; LOAD VALUE FROM TABLE + POP HL ; RESTORE HL + LD (DE),A ; SAVE VALUE TO OUTPUT BUF + INC DE ; BUMP TO NEXT OUTPUT BYTE + RET ; DONE ; ;================================================================================================== ; STORAGE @@ -361,3 +507,37 @@ ICM_KEYBUF .DB 0 ; SEG DISPLAY WORKING STORAGE ; ICM_PRESENT .DB 0 +ICM_BUF .FILL ICM_COLS +ICM_TMP32 .FILL 4,0 ; TEMP DWORD +; +ICM_VERSTR .DB $3E,$7F,$0A,$7B,$57,$00,$00,$00 ; "HBIOS " +; +ICM_SEGMAP: +; + ; POS $00 $01 $02 $03 $04 $05 $06 $07 + ; GLYPH '0' '1' '2' '3' '4' '5' '6' '7' + + .DB $7B, $30, $6D, $75, $36, $57, $5F, $70 +; + ; POS $08 $09 $0A $0B $0C $0D $0E $0F + ; GLYPH '8' '9' 'A' 'B' 'C' 'D' 'E' 'F' + .DB $7F, $76, $7E, $1F, $4B, $3D, $4F, $4E +; + ; POS $10 $11 $12 $13 $14 $15 $16 $17 $18 $19 $1A + ; GLYPH ' ' '-' '.' 'P' 'o' 'r' 't' 'A' 'd' 'r' 'G' + .DB $00, $04, $00, $6E, $1D, $0C, $0F, $7E, $3D, $0C, $5F +; +ICM_MSGTBL: + .DW ICM_MSG_LDR_SEL + .DW ICM_MSG_LDR_BOOT + .DW ICM_MSG_LDR_LOAD + .DW ICM_MSG_LDR_GO + .DW ICM_MSG_MON_RDY + .DW ICM_MSG_MON_BOOT +; +ICM_MSG_LDR_SEL .DB $7F,$1D,$1D,$0F,$6C,$00,$00,$00 ; "Boot? " +ICM_MSG_LDR_BOOT .DB $7F,$1D,$1D,$0F,$80,$80,$80,$00 ; "Boot... " +ICM_MSG_LDR_LOAD .DB $0B,$1D,$7E,$3D,$80,$80,$80,$00 ; "Load... " +ICM_MSG_LDR_GO .DB $5F,$1D,$80,$80,$80,$00,$00,$00 ; "Go... " +ICM_MSG_MON_RDY .DB $04,$4B,$6E,$3B,$00,$3B,$6E,$04 ; "-CPU UP-" +ICM_MSG_MON_BOOT .DB $7F,$1D,$1D,$0F,$B0,$00,$00,$00 ; "Boot! " diff --git a/Source/HBIOS/lcd.asm b/Source/HBIOS/lcd.asm index 3373c304..87266bc0 100644 --- a/Source/HBIOS/lcd.asm +++ b/Source/HBIOS/lcd.asm @@ -15,6 +15,9 @@ LCD_FUNC .EQU LCDBASE + 0 ; WRITE LCD_STAT .EQU LCDBASE + 0 ; READ LCD_DATA .EQU LCDBASE + 1 ; READ/WRITE ; +LCD_ROWS .EQU 4 +LCD_COLS .EQU 20 +; 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 @@ -26,6 +29,10 @@ LCD_FUNC_DDADR .EQU $80 ; SET DDRAM ADDRESS ; DEVECHO "LCD: IO=" DEVECHO LCDBASE + DEVECHO ", SIZE=" + DEVECHO LCD_COLS + DEVECHO "X" + DEVECHO LCD_ROWS DEVECHO "\n" ; ; HARDWARE RESET PRIOR TO ROMWBW CONSOLE INITIALIZATION @@ -52,6 +59,10 @@ LCD_PREINIT: LD A,(LCD_PRESENT) ; GET PRESENCE FLAG OR A ; SET FLAGS RET Z ; BAIL OUT IF NOT PRESENT +; + ; REGISTER DRIVER WITH HBIOS + LD BC,LCD_DISPATCH + CALL DSKY_SETDISP ; ; WE CAN NOW DO NORMAL I/O W/ BUSY FLAG LD DE,LCD_INIT_SEQ ; INIT SEQUENCE @@ -105,13 +116,20 @@ LCD_PREINIT1: ; LCD_INIT: CALL NEWLINE ; FORMATTING - PRTS("LCD: IO=$") + PRTS("LCD: IO=0x$") LD A,LCDBASE CALL PRTHEXBYTE ; LD A,(LCD_PRESENT) ; GET PRESENCE FLAG OR A ; SET FLAGS JR Z,LCD_INIT1 ; HANDLE NOT PRESENT +; + CALL PC_SPACE + LD A,LCD_COLS + CALL PRTDEC8 + PRTS("X$") + LD A,LCD_ROWS + CALL PRTDEC8 XOR A ; SIGNAL SUCCESS RET ; DONE ; @@ -120,33 +138,113 @@ LCD_INIT1: OR $FF RET ; -; CALLED FROM HBIOS RIGHT BEFORE A DISK ACCESS -; HL: ADDRESS OF 32-BIT SECTOR NUMBER (LITTLE-ENDIAN) +; DSKY DEVICE FUNCTION DISPATCH ENTRY +; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR +; B: FUNCTION (IN) +; +LCD_DISPATCH: + LD A,B ; GET REQUESTED FUNCTION + AND $0F ; ISOLATE SUB-FUNCTION + JP Z,LCD_NULL ; RESET DSKY HARDWARE + DEC A + JP Z,LCD_NULL ; GET KEYPAD STATUS + DEC A + JP Z,LCD_NULL ; READ A KEY FROM THE KEYPAD + DEC A + JP Z,LCD_NULL ; DISPLAY A 32-BIT BINARY VALUE IN HEX + DEC A + JP Z,LCD_SHOWSEG ; DISPLAY SEGMENTS + DEC A + JP Z,LCD_NULL ; SET KEYPAD LEDS + DEC A + JP Z,LCD_NULL ; SET STATUS LED + DEC A + JP Z,LCD_NULL ; BEEP DSKY SPEAKER + DEC A + JP Z,LCD_DEVICE ; DEVICE INFO + DEC A + JP Z,LCD_MESSAGE ; HANDLE MESSAGE + DEC A + JP Z,LCD_EVENT ; HANDLE EVENT + SYSCHKERR(ERR_NOFUNC) + RET +; +; +; +LCD_NULL: + XOR A + RET +; +; DRAW DISPLAY USING DEBUG ALPHABET +; HL = SOURCE BUFFER +; +LCD_SHOWSEG: + XOR A + RET +; +; DEVICE INFORMATION +; +LCD_DEVICE: + LD D,DSKYDEV_LCD ; D := DEVICE TYPE + LD E,0 ; E := PHYSICAL DEVICE NUMBER + LD H,0 ; H := MODE + LD L,LCDBASE ; L := BASE I/O ADDRESS + XOR A ; SIGNAL SUCCESS + RET +; +; MESSAGE HANDLER +; +LCD_MESSAGE: + LD A,C ; GET MESSAGE ID + ADD A,A ; WORD OFFSET + LD HL,LCD_MSGTBL ; START OF MESSAGE TABLE + CALL ADDHLA ; ADD OFFSET + LD A,(HL) ; SAVE LSB + INC HL ; BUMP TO MSB + LD H,(HL) ; GET MSB + LD L,A ; GET LSB +; + EX DE,HL + LD HL,$0300 ; ROW 3, COL 0 + CALL LCD_GOTORC + CALL LCD_LINEOUT + XOR A ; SIGNAL SUCCESS + RET +; +; EVENT HANDLER +; +LCD_EVENT: + LD A,C ; EVENT ID + OR A ; 0=CPUSPD + JR Z,LCD_EVT_CPUSPD ; HANDLE CPU SPD CHANGE + DEC A ; 1=DSKACT + JR Z,LCD_EVT_DSKACT ; HANDLE DISK ACTIVITY + XOR A + RET +; +; CPU SPEED CHANGE +; +LCD_EVT_CPUSPD: + XOR A + RET ; ; FORMAT: "Disk #99 R:12345678" ; 01234567890123456789 ; -LCD_DSKACT: - ; SAVE EVERYTHING - PUSH AF - PUSH BC - PUSH DE - PUSH HL +LCD_EVT_DSKACT: ; LD A,(LCD_PRESENT) ; GET PRESENCE FLAG OR A ; SET FLAGS - JR Z,LCD_DSKACT_Z ; HANDLE NOT PRESENT + RET 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??? + CALL LCD_EVT_DSKACT_BYTE ; SEND TO DISPLAY (COLS 6-7) HEX??? ; LD A,' ' ; SEPARATOR CALL LCD_OUTD ; SEND TO DISPLAY (COL 8) @@ -155,33 +253,25 @@ LCD_DSKACT: LD A,(HB_DSKFUNC) ; ACTIVE DISK FUNCTION CP BF_DIOWRITE ; WRITE? LD A,'W' ; ASSUME WRITE - JR Z,LCD_DSKACT0 ; GO AHEAD + JR Z,LCD_EVT_DSKACT0 ; GO AHEAD LD A,'R' ; OTHERWISE READ -LCD_DSKACT0: +LCD_EVT_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 HL,HB_DSKADR+3 ; END OF DWORD (MSB) LD B,4 ; DO 4 BYTES ; -LCD_DSKACT1: +LCD_EVT_DSKACT1: LD A,(HL) ; GET BYTE - CALL LCD_DSKACT_BYTE ; SEND TO DISPLAY (COLS 12-19) + CALL LCD_EVT_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 + DJNZ LCD_EVT_DSKACT1 ; DO ALL 4 BYTES RET ; -LCD_DSKACT_BYTE: +LCD_EVT_DSKACT_BYTE: PUSH AF ; SAVE BYTE RRCA ; DO TOP NIBBLE FIRST RRCA @@ -284,6 +374,18 @@ LCD_OUTD1: OUT (LCD_DATA),A ; SEND IT RET ; DONE ; +; SEND STRING, BLANK PAD TO END OF LINE +; ASSUMES WRITING TO FIRST COLUMN +; +LCD_LINEOUT: + LD B,LCD_COLS + CALL LCD_OUTDS +LCD_LINEOUT1: + LD A,' ' + CALL LCD_OUTD + DJNZ LCD_LINEOUT1 + RET +; ; SEND DATA STRING ; DE=STRING ADDRESS, NULL TERMINATED ; @@ -292,6 +394,7 @@ LCD_OUTDS: OR A ; SET FLAGS RET Z ; DONE WHEN NULL REACHED INC DE ; BUMP POINTER + DEC B ; PADDING COUNTER FOR ABOVE CALL LCD_OUTD ; SEND IT JR LCD_OUTDS ; LOOP AS NEEDED ; @@ -310,7 +413,7 @@ LCD_IND: LCD_GOTORC: PUSH HL ; SAVE INCOMING LD A,H ; ROW # TO A - LD HL,LCD_ROWS ; POINT TO ROWS TABLE + LD HL,LCD_ROWSIDX ; POINT TO ROWS INDEX TABLE CALL ADDHLA ; INDEX TO ROW ENTRY LD A,(HL) ; GET RWO START POP HL ; RECOVER INCOMING @@ -360,7 +463,7 @@ LCD_PRTD3M3: ; LCD_PRESENT .DB 0 ; NON-ZERO WHEN HARDWARE DETECTED ; -LCD_ROWS .DB $00,$40,$14,$54 ; ROW START INDEX +LCD_ROWSIDX .DB $00,$40,$14,$54 ; ROW START INDEX ; LCD_INIT_SEQ: .DB LCD_FUNC_SET | %11000 ; FUNCTION SET, 2 LINES, 5X8 FONT @@ -374,7 +477,7 @@ 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_SPD .DB "12.345",0 LCD_STR_MHZ .DB " MHz",0 ; LCD_CPU .DW LCD_CPU_Z80 @@ -390,3 +493,18 @@ LCD_CPU_Z180K .DB "Z180-K",0 LCD_CPU_Z180N .DB "Z180-N",0 LCD_CPU_Z280 .DB "Z280",0 LCD_CPU_EZ80 .DB "EZ80",0 +; +LCD_MSGTBL: + .DW LCD_MSG_LDR_SEL + .DW LCD_MSG_LDR_BOOT + .DW LCD_MSG_LDR_LOAD + .DW LCD_MSG_LDR_GO + .DW LCD_MSG_MON_RDY + .DW LCD_MSG_MON_BOOT +; +LCD_MSG_LDR_SEL .DB "Ready",0 +LCD_MSG_LDR_BOOT .DB "Boot...",0 +LCD_MSG_LDR_LOAD .DB "Load...",0 +LCD_MSG_LDR_GO .DB "Go...",0 +LCD_MSG_MON_RDY .DB "-CPU UP-",0 +LCD_MSG_MON_BOOT .DB "Boot!",0 diff --git a/Source/HBIOS/pkd.asm b/Source/HBIOS/pkd.asm index 609199e4..ed35cd4b 100644 --- a/Source/HBIOS/pkd.asm +++ b/Source/HBIOS/pkd.asm @@ -14,13 +14,6 @@ ; 10 04 ; +--08--+ 80 ; -; [D] [E] [F] [BO] [F4] -; [A] [B] [C] [GO] [F3] -; [7] [8] [9] [EX] [F2] -; [4] [5] [6] [DE] [F1] -; [1] [2] [3] [EN] [SH] -; [FW] [0] [BK] [CL] [CTL] -; ; KEY CODE MAP (KEY CODES) CSCCCRRR ; |||||||| ; |||||+++-- ROW @@ -28,12 +21,13 @@ ; |+-------- SHIFT ; +--------- CONTROL ; -; 00 08 10 18 23 -; 01 09 11 19 22 -; 02 0A 12 1A 21 -; 03 0B 13 1B 20 -; 04 0C 14 1C SHIFT -; 05 0D 15 1D CTRL +; _____C0_________C1_________C2_________C3__________C4____ +; R0 | $00 [D] $08 [E] $10 [F] $18 [BO] $20 [F4] +; R1 | $01 [A] $09 [B] $11 [C] $19 [GO] $21 [F3] +; R2 | $02 [7] $0A [8] $12 [9] $1A [EX] $22 [F2] +; R3 | $03 [4] $0B [5] $13 [6] $1B [DE] $23 [F1] +; R5 | $04 [1] $0C [2] $14 [3] $1C [EN] +$40 [SH] +; R6 | $05 [FW] $0D [0] $15 [BK] $1D [CL] +$80 [CTL] ; ; LED BIT MAP (BIT VALUES) ; @@ -51,8 +45,11 @@ PKD_PPIB .EQU PKDPPIBASE + 1 ; PORT B PKD_PPIC .EQU PKDPPIBASE + 2 ; PORT C PKD_PPIX .EQU PKDPPIBASE + 3 ; PPI CONTROL PORT ; -PKD_PPIX_RD: .EQU %10010010 ; PPIX VALUE FOR READS -PKD_PPIX_WR: .EQU %10000010 ; PPIX VALUE FOR WRITES +PKD_PPIX_RD .EQU %10010010 ; PPIX VALUE FOR READS +PKD_PPIX_WR .EQU %10000010 ; PPIX VALUE FOR WRITES +; +PKD_ROWS .EQU 1 ; DISPLAY ROWS +PKD_COLS .EQU 8 ; DISPLAY COLUMNS ; ; PIO CHANNEL C: ; @@ -75,12 +72,16 @@ PKD_PRESCL .EQU PKDOSC/100000 ; PRESCALER ; DEVECHO "PKD: IO=" DEVECHO PKDPPIBASE + DEVECHO ", SIZE=" + DEVECHO PKD_COLS + DEVECHO "X" + DEVECHO PKD_ROWS DEVECHO "\n" ; -;__PKD_PREINIT_______________________________________________________________________________________ +;__PKD_PREINIT_____________________________________________________________________________________ ; ; CONFIGURE PARALLEL PORT AND INITIALIZE 8279 -;____________________________________________________________________________________________________ +;__________________________________________________________________________________________________ ; ; ; HARDWARE RESET 8279 BY PULSING RESET LINE @@ -124,6 +125,8 @@ PKD_PREINIT: ; REGISTER DRIVER WITH HBIOS LD BC,PKD_DISPATCH CALL DSKY_SETDISP +; + CALL PKD_SHOWVER ; RET ; @@ -134,10 +137,35 @@ PKD_REINIT: CALL PKD_CMD JP PKD_RESET ; -;__PKD_INIT__________________________________________________________________________________________ +PKD_SHOWVER: + LD HL,PKD_VERSTR + LD DE,PKD_BUF + LD BC,PKD_COLS + LDIR + LD HL,PKD_BUF + 5 + LD A,RMJ + LD A,(PKD_SEGMAP + RMJ) + OR $80 + LD (HL),A + INC HL + LD A,(PKD_SEGMAP + RMN) + OR $80 + LD (HL),A + INC HL + LD A,(PKD_SEGMAP + RUP) + LD (HL),A +; + ; DISPLAY VERSION ON PKD + LD C,0 + LD B,8 + LD HL,PKD_BUF + CALL PKD_PUTSTR + RET +; +;__PKD_INIT________________________________________________________________________________________ ; ; DISPLAY DSKY INFO -;____________________________________________________________________________________________________ +;__________________________________________________________________________________________________ ; PKD_INIT: CALL NEWLINE ; FORMATTING @@ -149,9 +177,19 @@ PKD_INIT: ; LD A,(PKD_PRESENT) ; PRESENT? OR A ; SET FLAGS - RET NZ ; YES, ALL DONE + JR NZ,PKD_INIT1 ; YES, CONTINUE PRTS(" NOT PRESENT$") ; NOT PRESENT - RET ; DONE + RET +; +PKD_INIT1: + CALL PC_SPACE + LD A,PKD_COLS + CALL PRTDEC8 + LD A,'X' + CALL COUT + LD A,PKD_ROWS + CALL PRTDEC8 + RET ; ; DSKY DEVICE FUNCTION DISPATCH ENTRY ; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR @@ -177,6 +215,10 @@ PKD_DISPATCH: JP Z,PKD_BEEP ; BEEP DSKY SPEAKER DEC A JP Z,PKD_DEVICE ; DEVICE INFO + DEC A + JP Z,PKD_MESSAGE ; HANDLE MESSAGE + DEC A + JP Z,PKD_EVENT ; HANDLE EVENT SYSCHKERR(ERR_NOFUNC) RET ; @@ -252,19 +294,47 @@ PKD_GETKEY2: ; DISPLAY HEX VALUE FROM DE:HL ; PKD_SHOWHEX: - LD BC,DSKY_HEXBUF ; POINT TO HEX BUFFER + LD BC,PKD_TMP32 ; POINT TO HEX BUFFER CALL ST32 ; STORE 32-BIT BINARY THERE - LD HL,DSKY_HEXBUF ; FROM: BINARY VALUE (HL) - LD DE,DSKY_BUF ; TO: SEGMENT BUFFER (DE) - CALL DSKY_BIN2SEG ; CONVERT - LD HL,DSKY_BUF ; POINT TO SEGMENT BUFFER - ; AND FALL THRU TO DISPLAY IT -; + LD HL,PKD_TMP32 ; FROM: BINARY VALUE (HL) + LD DE,PKD_BUF ; TO: SEGMENT BUFFER (DE) + CALL PKD_BIN2SEG ; CONVERT + LD HL,PKD_BUF ; POINT TO SEGMENT BUFFER + LD B,PKD_COLS ; LENGTH TO DISPLAY + LD C,0 ; STARTING POSITION + CALL PKD_PUTSTR ; DO IT + XOR A ; SUCCESS + RET ; AND RETURN ; +; DRAW DISPLAY USING DEBUG ALPHABET +; HL = SOURCE BUFFER ; PKD_SHOWSEG: + ; CONVERT FROM DBG ALPHABET TO SEG CODES + LD B,PKD_COLS ; DO FOR ALL CHARS + LD DE,PKD_BUF ; DESTINATION BUFFER +PKD_SHOWSEG1: + LD A,(HL) ; GET SOURCE VALUE + INC HL ; BUMP FOR NEXT TIME + PUSH AF ; SAVE IT + AND $80 ; ISOLATE HI BIT (DP) + LD C,A ; SAVE IN C + POP AF ; RECOVER ORIGINAL + AND $7F ; REMOVE HI BIT (DP) + PUSH HL ; SAVE IT + LD HL,PKD_SEGMAP ; POINT TO XLAT MAP + CALL ADDHLA ; OFFSET BY VALUE + LD A,(HL) ; GET NEW VALUE + OR C ; RECOMBINE WITH DP BIT + LD (DE),A ; SAVE IT + INC DE ; BUMP PTR + POP HL ; RESTORE SOURCE PTR + DJNZ PKD_SHOWSEG1 ; LOOP TILL DONE +; + ; DISPLAY CONVERTED BUFFER LD C,0 ; STARTING DISPLAY POSITION - LD B,DSKY_BUFLEN ; NUMBER OF CHARS + LD B,PKD_COLS ; NUMBER OF CHARS + LD HL,PKD_BUF ; BUFFER CALL PKD_PUTSTR ; DO IT XOR A ; SIGNAL SUCCESS RET @@ -316,7 +386,7 @@ PKD_BEEP: ; ; TIMER PUSH HL - LD hl,$8FFF + LD HL,$8FFF PKD_BEEP1: DEC HL LD A,H @@ -342,10 +412,80 @@ PKD_DEVICE: XOR A ; SIGNAL SUCCESS RET ; -;__PKD_PPIDETECT_____________________________________________________________________________________ +; MESSAGE HANDLER +; +PKD_MESSAGE: + LD A,C ; GET MESSAGE ID + ADD A,A ; WORD OFFSET + LD HL,PKD_MSGTBL ; START OF MESSAGE TABLE + CALL ADDHLA ; ADD OFFSET + LD A,(HL) ; SAVE LSB + INC HL ; BUMP TO MSB + LD H,(HL) ; GET MSB + LD L,A ; GET LSB +; + ; HL HAS POINTER TO MESSAGE + LD C,0 ; STARTING DISPLAY POSITION + LD B,PKD_COLS ; NUMBER OF CHARS + CALL PKD_PUTSTR ; DISPLAY IT + XOR A ; SIGNAL SUCCESS + RET +; +; EVENT HANDLER +; +PKD_EVENT: + LD A,C ; EVENT ID + OR A ; 0=CPUSPD + JR Z,PKD_EVT_CPUSPD ; HANDLE CPU SPD CHANGE + DEC A ; 1=DSKACT + JR Z,PKD_EVT_DSKACT ; HANDLE DISK ACTIVITY + XOR A + RET +; +; CPU SPEED CHANGE +; +PKD_EVT_CPUSPD: + XOR A + RET +; +; DISK ACTIVITY +; +PKD_EVT_DSKACT: +; + ; USE DISK UNIT NUMBER FOR MSB + LD A,(HB_DSKUNIT) ; GET DISK UNIT NUM + LD (HB_DSKADR+3),A ; REPLACE HIGH BYTE W/ DISK # +; + ; CONVERT TO SEGMENT DISPLAY + LD HL,HB_DSKADR ; INPUT POINTER + LD DE,PKD_BUF ; BUF FOR OUTPUT + CALL PKD_BIN2SEG ; CONVERT TO SEG DISPLAY +; + ; DECIMAL POINT FOR DISK UNIT SEPARATION + LD HL,PKD_BUF+1 ; SECOND CHAR OF DISP + SET 7,(HL) ; TURN ON DECIMAL PT +; + ; DECIMAL POINT TO INDICATE WRITE ACTION + LD A,(HB_DSKFUNC) ; GET CURRENT I/O FUNCTION + CP BF_DIOWRITE ; IS IT A WRITE? + JR NZ,PKD_EVT_DSKACT2 ; IF NOT, SKIP + LD HL,PKD_BUF+7 ; POINT TO CHAR 7 + SET 7,(HL) ; SET WRITE DOT +; +PKD_EVT_DSKACT2: + ; UPDATE DISPLAY + LD HL,PKD_BUF ; SEG DISPLAY BUF TO HL + LD B,PKD_COLS + LD C,0 + CALL PKD_PUTSTR +; + XOR A + RET +; +;__PKD_PPIDETECT___________________________________________________________________________________ ; ; PROBE FOR PPI HARDWARE -;____________________________________________________________________________________________________ +;__________________________________________________________________________________________________ ; PKD_PPIDETECT: ; @@ -364,7 +504,7 @@ PKD_PPIDETECT: OR A ; SET FLAGS RET ; AND RETURN ; -;_KEYMAP_TABLE_____________________________________________________________________________________________________________ +;__KEYMAP_TABLE____________________________________________________________________________________ ; PKD_KEYMAP: ; POS $00 $01 $02 $03 $04 $05 $06 $07 @@ -674,10 +814,74 @@ PKD_PPIIDLE: ; UTILTITY FUNCTIONS ;================================================================================================== ; +; CONVERT 32 BIT BINARY TO 8 BYTE HEX SEGMENT DISPLAY +; +; HL: ADR OF 32 BIT BINARY +; DE: ADR OF DEST LED SEGMENT DISPLAY BUFFER (8 BYTES) +; +PKD_BIN2SEG: + LD B,4 ; 4 BYTES OF INPUT + LD A,B ; PUT IN ACCUM + CALL ADDHLA ; PROCESS FROM END (LITTLE ENDIAN) +PKD_BIN2SEG1: + DEC HL ; DEC PTR (LITTLE ENDIAN) + LD A,(HL) ; HIGH NIBBLE + RRCA \ RRCA \ RRCA \ RRCA ; ROTATE BITS + CALL PKD_BIN2SEG_NIB ; CONVERT NIBBLE INTO OUTPUT BUF + LD A,(HL) ; LOW NIBBLE + CALL PKD_BIN2SEG_NIB ; CONVERT NIBBLE INTO OUTPUT BUF + DJNZ PKD_BIN2SEG1 ; LOOP FOR ALL INPUT BYTES + RET ; DONE +; +PKD_BIN2SEG_NIB: + PUSH HL ; SAVE HL + LD HL,PKD_SEGMAP ; POINT TO SEG MAP TABLE + AND $0F ; ISOLATE LOW NIBBLE + CALL ADDHLA ; OFFSET INTO TABLE + LD A,(HL) ; LOAD VALUE FROM TABLE + POP HL ; RESTORE HL + LD (DE),A ; SAVE VALUE TO OUTPUT BUF + INC DE ; BUMP TO NEXT OUTPUT BYTE + RET ; DONE ; ;================================================================================================== ; STORAGE ;================================================================================================== ; -PKD_PPIX_VAL .DB 0 ; PPIX SHADOW REG -PKD_PRESENT .DB 0 ; HARDWARE PRESENT FLAG +PKD_PPIX_VAL .DB 0 ; PPIX SHADOW REG +PKD_PRESENT .DB 0 ; HARDWARE PRESENT FLAG +PKD_BUF .FILL PKD_COLS +PKD_TMP32 .FILL 4,0 ; TEMP DWORD +; +PKD_VERSTR .DB $76,$7F,$30,$3F,$6D,$00,$00,$00 ; "HBIOS " +; +PKD_SEGMAP: +; + ; POS $00 $01 $02 $03 $04 $05 $06 $07 + ; GLYPH '0' '1' '2' '3' '4' '5' '6' '7' + + .DB $3F, $06, $5B, $4F, $66, $6D, $7D, $07 +; + ; POS $08 $09 $0A $0B $0C $0D $0E $0F + ; GLYPH '8' '9' 'A' 'B' 'C' 'D' 'E' 'F' + .DB $7F, $67, $77, $7C, $39, $5E, $79, $71 +; + ; POS $10 $11 $12 $13 $14 $15 $16 $17 $18 $19 $1A + ; GLYPH ' ' '-' '.' 'P' 'o' 'r' 't' 'A' 'd' 'r' 'G' + .DB $00, $40, $00, $73, $5C, $50, $78, $77, $5E, $50, $3D + +; +PKD_MSGTBL: + .DW PKD_MSG_LDR_SEL + .DW PKD_MSG_LDR_BOOT + .DW PKD_MSG_LDR_LOAD + .DW PKD_MSG_LDR_GO + .DW PKD_MSG_MON_RDY + .DW PKD_MSG_MON_BOOT +; +PKD_MSG_LDR_SEL .DB $7F,$5C,$5C,$78,$53,$00,$00,$00 ; "Boot? " +PKD_MSG_LDR_BOOT .DB $7F,$5C,$5C,$78,$80,$80,$80,$00 ; "Boot... " +PKD_MSG_LDR_LOAD .DB $38,$5C,$5F,$5E,$80,$80,$80,$00 ; "Load... " +PKD_MSG_LDR_GO .DB $3D,$5C,$80,$80,$80,$00,$00,$00 ; "Go... " +PKD_MSG_MON_RDY .DB $40,$39,$73,$3E,$00,$3E,$73,$40 ; "-CPU UP-" +PKD_MSG_MON_BOOT .DB $7F,$5C,$5C,$78,$82,$00,$00,$00 ; "Boot! " diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index 7ab1cdbc..a2769198 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -1360,15 +1360,15 @@ PPIDE_RESET: ; THIS DOES NOT TEST THAT A DSKYNG IS ACTUALLY PRESENT ; AND OPERATING -- COULD CAUSE PROBLEMS ; -#IF (DSKYENABLE) - #IF (PKDENABLE) +;;;#IF (DSKYENABLE) +#IF (PKDENABLE) ; SAVE CONTENTS OF DSKYNG DISPLAY ACROSS RESET LD B,8 LD C,0 - LD HL,DSKY_BUF + LD HL,PKD_BUF CALL PKD_GETSTR - #ENDIF #ENDIF +;;;#ENDIF ; ; PULSE IDE RESET LINE #IF (PPIDETRACE >= 3) @@ -1388,16 +1388,16 @@ PPIDE_RESET: LD DE,20 CALL VDELAY ; -#IF (DSKYENABLE) - #IF (PKDENABLE) +;;;#IF (DSKYENABLE) +#IF (PKDENABLE) ; REININT DSKYNG AND RESTORE CONTENTS CALL PKD_REINIT LD B,8 LD C,0 - LD HL,DSKY_BUF + LD HL,PKD_BUF CALL PKD_PUTSTR - #ENDIF #ENDIF +;;;#ENDIF ; ; SOME CF CARDS AND CF CARD EMULATORS NEED A LITTLE TIME TO ; "BOOT" THEIR INTERNAL ELECTRONICS, SO THEY CANNOT ASSERT BUSY diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 2e2072b0..3b40e644 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -275,9 +275,11 @@ prompt: call pstr ; do it call clrbuf ; zero fill the cmd buffer ; + ;ld hl,msg_sel ; boot select msg + ;call dsky_show ; show on DSKY + ld c,DSKY_MSG_LDR_SEL ; boot select msg + call dsky_msg ; show on DSKY #if (DSKYENABLE) - ld hl,msg_sel ; boot select msg - call dsky_show ; show on DSKY call dsky_highlightallkeys call dsky_beep call dsky_l2on @@ -972,10 +974,10 @@ reboot: ; #if (BIOS == BIOS_WBW) ; -#if (DSKYENABLE) - ld hl,msg_boot ; point to boot message - call dsky_show ; display message -#endif + ;ld hl,msg_boot ; point to boot message + ;call dsky_show ; display message + ld c,DSKY_MSG_LDR_BOOT ; point to boot message + call dsky_msg ; display message ; ; cold boot system ld b,BF_SYSRESET ; system restart @@ -1004,10 +1006,10 @@ romload: ld h,(ix+ra_name+1) call pstr ; -#if (DSKYENABLE) - ld hl,msg_load ; point to load message - call dsky_show ; display message -#endif + ;ld hl,msg_load ; point to load message + ;call dsky_show ; display message + ld c,DSKY_MSG_LDR_LOAD ; point to load message + call dsky_msg ; display message ; #if (BIOS == BIOS_WBW) ; @@ -1088,10 +1090,10 @@ romload1: ; #endif ; -#if (DSKYENABLE) - ld hl,msg_go ; point to go message - call dsky_show ; display message -#endif + ;ld hl,msg_go ; point to go message + ;call dsky_show ; display message + ld c,DSKY_MSG_LDR_GO ; point to go message + call dsky_msg ; display message ; ld l,(ix+ra_ent) ; HL := app entry address ld h,(ix+ra_ent+1) ; ... @@ -1113,10 +1115,10 @@ diskboot: ld a,(bootslice) call prtdecb ; -#if (DSKYENABLE) - ld hl,msg_load ; point to load message - call dsky_show ; display message -#endif + ;ld hl,msg_load ; point to load message + ;call dsky_show ; display message + ld c,DSKY_MSG_LDR_LOAD ; point to load message + call dsky_msg ; display message ; #if (BIOS == BIOS_WBW) ; @@ -1397,10 +1399,10 @@ diskboot10: ; call pdot ; show progress ; -#if (DSKYENABLE) - ld hl,msg_go ; point to go message - call dsky_show ; display message -#endif + ;ld hl,msg_go ; point to go message + ;call dsky_show ; display message + ld c,DSKY_MSG_LDR_GO ; point to go message + call dsky_msg ; display message ; ; Jump to entry vector ld hl,(bb_cpment) ; get entry vector @@ -2225,14 +2227,20 @@ dsky_highlightkeysoff: ld hl,dsky_highlightkeyledsoff jr dsky_putled ; +#endif +; +dsky_msg: +#if (BIOS == BIOS_WBW) + ld b,BF_DSKYMESSAGE + jr dsky_hbcall +; dsky_hbcall: ld a,(dskyact) or a ret z rst 08 - ret -; #endif + ret ; ;======================================================================= ; Error handlers @@ -2336,22 +2344,22 @@ str_help .db "\r\n" #endif .db "\r\n [.] - Boot Disk Unit/Slice" .db 0 -; -#if (DSKYENABLE) - #if (GM7303ENABLE) - ; The GM7303 has an ASCII LCD display -msg_sel .db "Boot?", $00 -msg_boot .db "Boot...", $00 -msg_load .db "Load...", $00 -msg_go .db "Go...", $00 - #else - ; Other DSKY devices use 7 segment LEDs -msg_sel .db $7f,$5c,$5c,$78,$53,$00,$00,$00 ; "boot? " -msg_boot .db $7f,$5c,$5c,$78,$80,$80,$80,$00 ; "boot... " -msg_load .db $38,$5c,$5f,$5e,$80,$80,$80,$00 ; "load... " -msg_go .db $3d,$5c,$80,$80,$80,$00,$00,$00 ; "go... " - #endif -#endif +;;;; +;;;#if (DSKYENABLE) +;;; #if (GM7303ENABLE) +;;; ; The GM7303 has an ASCII LCD display +;;;msg_sel .db "Boot?", $00 +;;;msg_boot .db "Boot...", $00 +;;;msg_load .db "Load...", $00 +;;;msg_go .db "Go...", $00 +;;; #else +;;; ; Other DSKY devices use 7 segment LEDs +;;;msg_sel .db $7f,$5c,$5c,$78,$53,$00,$00,$00 ; "boot? " +;;;msg_boot .db $7f,$5c,$5c,$78,$80,$80,$80,$00 ; "boot... " +;;;msg_load .db $38,$5c,$5f,$5e,$80,$80,$80,$00 ; "load... " +;;;msg_go .db $3d,$5c,$80,$80,$80,$00,$00,$00 ; "go... " +;;; #endif +;;;#endif ; ;======================================================================= ; DSKY keypad led matrix masks diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index 8944bbf7..0a676c3a 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -174,6 +174,20 @@ DSKYMODE_V1 .EQU 1 DSKYMODE_NG .EQU 2 DSKYMODE_GM7303 .EQU 3 ; +; DSKY MESSAGE IDS +; +DSKY_MSG_LDR_SEL .EQU 0 +DSKY_MSG_LDR_BOOT .EQU 1 +DSKY_MSG_LDR_LOAD .EQU 2 +DSKY_MSG_LDR_GO .EQU 3 +DSKY_MSG_MON_RDY .EQU 4 +DSKY_MSG_MON_BOOT .EQU 5 +; +; DSKY EVENT IDS +; +DSKY_EVT_CPUSPD .EQU 0 +DSKY_EVT_DSKACT .EQU 1 +; ; FD MODE SELECTIONS ; FDMODE_NONE .EQU 0 diff --git a/Source/ver.inc b/Source/ver.inc index 3e79120b..548a5cac 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.84" +#DEFINE BIOSVER "3.5.0-dev.85" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index fc99cc02..fc8bdc80 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.84" + db "3.5.0-dev.85" endm