Browse Source

Refactor DSKY

pull/430/head v3.5.0-dev.85
Wayne Warthen 1 year ago
parent
commit
08a53f54d0
  1. BIN
      Doc/RomWBW Applications.pdf
  2. BIN
      Doc/RomWBW Disk Catalog.pdf
  3. BIN
      Doc/RomWBW Errata.pdf
  4. BIN
      Doc/RomWBW System Guide.pdf
  5. BIN
      Doc/RomWBW User Guide.pdf
  6. 2
      ReadMe.md
  7. 2
      ReadMe.txt
  8. 96
      Source/Doc/SystemGuide.md
  9. 3
      Source/HBIOS/cfg_DUO.asm
  10. 1
      Source/HBIOS/cfg_DYNO.asm
  11. 1
      Source/HBIOS/cfg_EPITX.asm
  12. 1
      Source/HBIOS/cfg_FZ80.asm
  13. 2
      Source/HBIOS/cfg_GMZ180.asm
  14. 1
      Source/HBIOS/cfg_HEATH.asm
  15. 2
      Source/HBIOS/cfg_MASTER.asm
  16. 1
      Source/HBIOS/cfg_MBC.asm
  17. 1
      Source/HBIOS/cfg_MK4.asm
  18. 1
      Source/HBIOS/cfg_MON.asm
  19. 1
      Source/HBIOS/cfg_N8.asm
  20. 1
      Source/HBIOS/cfg_NABU.asm
  21. 1
      Source/HBIOS/cfg_RCEZ80.asm
  22. 1
      Source/HBIOS/cfg_RCZ180.asm
  23. 1
      Source/HBIOS/cfg_RCZ280.asm
  24. 1
      Source/HBIOS/cfg_RCZ80.asm
  25. 1
      Source/HBIOS/cfg_RPH.asm
  26. 1
      Source/HBIOS/cfg_S100.asm
  27. 1
      Source/HBIOS/cfg_SBC.asm
  28. 1
      Source/HBIOS/cfg_SCZ180.asm
  29. 1
      Source/HBIOS/cfg_Z80RETRO.asm
  30. 1
      Source/HBIOS/cfg_ZETA.asm
  31. 1
      Source/HBIOS/cfg_ZETA2.asm
  32. 125
      Source/HBIOS/dbgmon.asm
  33. 5
      Source/HBIOS/ez80rtc.asm
  34. 8
      Source/HBIOS/fd.asm
  35. 238
      Source/HBIOS/gm7303.asm
  36. 207
      Source/HBIOS/hbios.asm
  37. 3
      Source/HBIOS/hbios.inc
  38. 324
      Source/HBIOS/icm.asm
  39. 180
      Source/HBIOS/lcd.asm
  40. 274
      Source/HBIOS/pkd.asm
  41. 16
      Source/HBIOS/ppide.asm
  42. 88
      Source/HBIOS/romldr.asm
  43. 14
      Source/HBIOS/std.asm
  44. 2
      Source/ver.inc
  45. 2
      Source/ver.lib

BIN
Doc/RomWBW Applications.pdf

Binary file not shown.

BIN
Doc/RomWBW Disk Catalog.pdf

Binary file not shown.

BIN
Doc/RomWBW Errata.pdf

Binary file not shown.

BIN
Doc/RomWBW System Guide.pdf

Binary file not shown.

BIN
Doc/RomWBW User Guide.pdf

Binary file not shown.

2
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

2
ReadMe.txt

@ -1,6 +1,6 @@
RomWBW ReadMe
Wayne Warthen (wwarthen@gmail.com)
23 Sep 2024
26 Sep 2024

96
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)

3
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

1
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

1
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

1
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

2
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

1
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

2
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

1
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

1
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

1
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

1
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

1
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

1
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

1
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

1
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

1
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

1
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

1
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

1
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

1
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

1
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

1
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

1
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

125
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

5
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()

8
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

238
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

207
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 $

3
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
;

324
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! "

180
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

274
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! "

16
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

88
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 <u>[.<s>] - 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

14
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

2
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

2
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

Loading…
Cancel
Save