Browse Source

Create DSKY Driver Framework

Added a new driver category for DSKY (Display/Keypad) devices.  Existing DSKY devices were converted into drivers ICM and PKD.  These devices were previously DSKY and DSKYNG.

This removes substantial code duplication and recovers significant space in romldr and dbgmon.
pull/351/head v3.3.0-dev.27
Wayne Warthen 3 years ago
parent
commit
f8c800e527
  1. BIN
      Doc/RomWBW Applications.pdf
  2. BIN
      Doc/RomWBW Disk Catalog.pdf
  3. BIN
      Doc/RomWBW Errata.pdf
  4. BIN
      Doc/RomWBW ROM Applications.pdf
  5. BIN
      Doc/RomWBW System Guide.pdf
  6. BIN
      Doc/RomWBW User Guide.pdf
  7. 2
      ReadMe.md
  8. 2
      ReadMe.txt
  9. 192
      Source/Doc/SystemGuide.md
  10. 3
      Source/Doc/UserGuide.md
  11. 90
      Source/HBIOS/API.txt
  12. 5
      Source/HBIOS/Config/MBC_std.asm
  13. 2
      Source/HBIOS/Config/SBC_max.asm
  14. 11
      Source/HBIOS/cfg_master.asm
  15. 11
      Source/HBIOS/cfg_mbc.asm
  16. 11
      Source/HBIOS/cfg_mk4.asm
  17. 11
      Source/HBIOS/cfg_n8.asm
  18. 11
      Source/HBIOS/cfg_rph.asm
  19. 11
      Source/HBIOS/cfg_sbc.asm
  20. 11
      Source/HBIOS/cfg_z80retro.asm
  21. 11
      Source/HBIOS/cfg_zeta.asm
  22. 11
      Source/HBIOS/cfg_zeta2.asm
  23. 304
      Source/HBIOS/dbgmon.asm
  24. 386
      Source/HBIOS/dsky.asm
  25. 22
      Source/HBIOS/fd.asm
  26. 232
      Source/HBIOS/hbios.asm
  27. 48
      Source/HBIOS/hbios.inc
  28. 2
      Source/HBIOS/hdsk.asm
  29. 354
      Source/HBIOS/icm.asm
  30. 6
      Source/HBIOS/ide.asm
  31. 2
      Source/HBIOS/imm.asm
  32. 2
      Source/HBIOS/md.asm
  33. 726
      Source/HBIOS/pkd.asm
  34. 2
      Source/HBIOS/ppa.asm
  35. 25
      Source/HBIOS/ppide.asm
  36. 2
      Source/HBIOS/ppp.asm
  37. 2
      Source/HBIOS/prp.asm
  38. 2
      Source/HBIOS/rf.asm
  39. 143
      Source/HBIOS/romldr.asm
  40. 30
      Source/HBIOS/sd.asm
  41. 2
      Source/HBIOS/syq.asm
  42. 2
      Source/ver.inc
  43. 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 ROM Applications.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** \ **RomWBW ReadMe** \
Version 3.3 \ Version 3.3 \
Wayne Warthen ([wwarthen@gmail.com](mailto:wwarthen@gmail.com)) \ Wayne Warthen ([wwarthen@gmail.com](mailto:wwarthen@gmail.com)) \
20 Jun 2023
28 Jun 2023
# Overview # Overview

2
ReadMe.txt

@ -1,6 +1,6 @@
RomWBW ReadMe RomWBW ReadMe
Wayne Warthen (wwarthen@gmail.com) Wayne Warthen (wwarthen@gmail.com)
20 Jun 2023
28 Jun 2023

192
Source/Doc/SystemGuide.md

@ -1009,6 +1009,198 @@ used.
`\clearpage`{=latex} `\clearpage`{=latex}
## 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 | 0x00 | Original ICM7218 based DSKY | icm.asm |
| DSKYDEV_PKD | 0x10 | 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 keypad keys are identified by the following key ids. Not all
keypads will contain all keys.
| **Key Id** | **Key Definition** | **Key Id** | **Key Definition** |
|------------|--------------------|------------|--------------------|
| $00 | Hex Numeric 0 | $10 | Forward |
| $01 | Hex Numeric 1 | $11 | Backward |
| $02 | Hex Numeric 2 | $12 | Clear |
| $03 | Hex Numeric 3 | $13 | Enter |
| $04 | Hex Numeric 4 | $14 | Deposit |
| $05 | Hex Numeric 5 | $15 | Examine |
| $06 | Hex Numeric 6 | $16 | Go |
| $07 | Hex Numeric 7 | $17 | Boot |
| $08 | Hex Numeric 8 | $18 | F4 |
| $09 | Hex Numeric 9 | $19 | F3 |
| $0A | Hex Numeric A | $1A | F2 |
| $0B | Hex Numeric B | $1B | F1 |
| $0C | Hex Numeric C | | |
| $0D | Hex Numeric D | | |
| $0E | Hex Numeric E | | |
| $0F | Hex Numeric F | | |
### Function 0x30 -- DSKY Reset (DSKYRESET)
| **Entry Parameters** | **Returned Values** |
|----------------------------------------|----------------------------------------|
| B: 0x30 | A: Status |
This function performs a device dependent reset operation on the DSKY.
The display will be cleared, keyboard queue will be flushed, and
chip will be reinitialized. The returned Status (A) is a standard
HBIOS result code.
### Function 0x31 -- DSKY (DSKYSTATUS)
| **Entry Parameters** | **Returned Values** |
|----------------------------------------|----------------------------------------|
| B: 0x31 | A: Status / Characters Pending |
Return the count of Characters Pending (A) in the input buffer of the
DSKY. If the unit has no input buffer or the
buffer utilization is not available, the function may return simply 0 or
1 where 0 means there is no character available and 1 means there is at
least one character available.
The value returned in register A is used as both a Status (A) code and
the return value. Negative values (bit 7 set) indicate a standard HBIOS
result (error) code. Otherwise, the return value represents the number
of characters in the buffer.
### Function 0x32 -- DSKY Get Key (DSKYGETKEY)
| **Entry Parameters** | **Returned Values** |
|----------------------------------------|----------------------------------------|
| B: 0x32 | A: Status |
| | E: Character Value |
Read and return a Character (E) from the DSKY.
If no character(s) are available in the unit's input buffer, this
function will wait indefinitely. The returned Status (A) is a standard
HBIOS result code.
The Character Value (E) returned is not ASCII. It is a keypad key
id. The possible id values are listed at the start of this section.
### Function 0x33 -- DSKY Show HEX (RTCSHOWHEX)
| **Entry Parameters** | **Returned Values** |
|----------------------------------------|----------------------------------------|
| B: 0x33 | A: Status |
| DE:HL=Binary Value | |
Display the 32-bit binary value (DE:HL) in hex on the DSKY segment
display. All decimal points of the display will be off.
The Status (A) is a standard HBIOS result code.
### Function 0x34 -- DSKY Show Segments (DSKYSHOWSEG)
| **Entry Parameters** | **Returned Values** |
|----------------------------------------|----------------------------------------|
| B: 0x34 | A: Status |
| 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.
### Function 0x35 -- DSKY Keypad LEDs (DSKYKEYLEDS)
| **Entry Parameters** | **Returned Values** |
|----------------------------------------|----------------------------------------|
| B: 0x35 | A: Status |
| HL: Buffer Address | |
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.
### Function 0x36 -- DSKY Status LED (DSKYSTATLED)
| **Entry Parameters** | **Returned Values** |
|----------------------------------------|----------------------------------------|
| B: 0x36 | A: Status |
| D: LED Number | |
| E: LED State | |
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.
The Status (A) is a standard HBIOS result code.
### Function 0x37 -- DSKY Beep (DSKYBEEP)
| **Entry Parameters** | **Returned Values** |
|----------------------------------------|----------------------------------------|
| B: 0x37 | A: Status |
Beep the onboard speaker of the DSKY.
This function is specific to the PKD hardware. It will be ignored
by the ICM hardware.
The Status (A) is a standard HBIOS result code.
### Function 0x38 -- DSKY Device (DSKYDEVICE)
| **Entry Parameters** | **Returned Values** |
|----------------------------------------|----------------------------------------|
| B: 0x38 | A: Status |
| | C: Device Attributes |
| | D: Device Type |
| | E: Device Number |
| | H: Device Unit Mode |
| | L: Device I/O Base Address |
Returns device information for the DSKY unit. The Status (A) is a
standard HBIOS result code.
Device Attribute (C) values are not yet defined. Device Type (D)
indicates the specific hardware driver that handles the specified
character unit. Values are listed at the start of this section. Device
Number (E) indicates the physical device number assigned per driver
which is always 0 for DSKY.
Device Mode (H) is used to indicate the variant of the chip or circuit
that is used by the specified unit. The Device I/O Base Address (L)
indicates the starting port address of the hardware interface that is
servicing the specified unit. Both of these values are considered
driver specific. Refer to the associated hardware driver for the values
used.
`\clearpage`{=latex}
## Video Display Adapter (VDA) ## Video Display Adapter (VDA)
The VDA functions are provided as a common interface to Video Display The VDA functions are provided as a common interface to Video Display

3
Source/Doc/UserGuide.md

@ -3943,7 +3943,6 @@ may be discovered by RomWBW in your system.
| DMA | System | Zilog DMA Controller | | DMA | System | Zilog DMA Controller |
| DS1307 | RTC | Maxim DS1307 PCF I2C Real-Time Clock w/ NVRAM | | DS1307 | RTC | Maxim DS1307 PCF I2C Real-Time Clock w/ NVRAM |
| DS1501RTC | RTC | Maxim DS1501/DS1511 Watchdog Real-Time Clock | | DS1501RTC | RTC | Maxim DS1501/DS1511 Watchdog Real-Time Clock |
| DSKY | System | Keypad & Display |
| DSRTC | RTC | Maxim DS1302 Real-Time Clock w/ NVRAM | | DSRTC | RTC | Maxim DS1302 Real-Time Clock w/ NVRAM |
| DUART | Char | SCC2681 or compatible Dual UART | | DUART | Char | SCC2681 or compatible Dual UART |
| EMM | Disk | Disk drive on Parallel Port emm interface (Zip Drive) | | EMM | Disk | Disk drive on Parallel Port emm interface (Zip Drive) |
@ -3951,6 +3950,7 @@ may be discovered by RomWBW in your system.
| GDC | Video | uPD7220 Video Display Controller | | GDC | Video | uPD7220 Video Display Controller |
| HDSK | Disk | SIMH Simulator Hard Disk | | HDSK | Disk | SIMH Simulator Hard Disk |
| IDE | Disk | IDE/ATA Hard Disk Interface | | IDE | Disk | IDE/ATA Hard Disk Interface |
| ICM | DsKy | ICM7218-based Display/Keypad on PPI |
| IMM | Disk | IMM Zip Drive on PPI | | IMM | Disk | IMM Zip Drive on PPI |
| INTRTC | RTC | Interrupt-based Real Time Clock | | INTRTC | RTC | Interrupt-based Real Time Clock |
| KBD | Kbd | 8242 PS/2 Keyboard Controller | | KBD | Kbd | 8242 PS/2 Keyboard Controller |
@ -3960,6 +3960,7 @@ may be discovered by RomWBW in your system.
| MSXKYB | Kbd | MSX Compliant Matrix Keyboard | | MSXKYB | Kbd | MSX Compliant Matrix Keyboard |
| I2C | System | I2C Interface | | I2C | System | I2C Interface |
| PIO | Char | Zilog Parallel Interface Controller | | PIO | Char | Zilog Parallel Interface Controller |
| PKD | DsKy | P8279-based Display/Keypad on PPI |
| PPIDE | Disk | 8255 IDE/ATA Hard Disk Interface | | PPIDE | Disk | 8255 IDE/ATA Hard Disk Interface |
| PPA | Disk | PPA Zip Drive on PPI | | PPA | Disk | PPA Zip Drive on PPI |
| PPK | Kbd | Matrix Keyboard | | PPK | Kbd | Matrix Keyboard |

90
Source/HBIOS/API.txt

@ -484,3 +484,93 @@ TERM_ATTACH: (C=VIDEO UNIT, DE=<VDA>_DISPATCH)
- QUERY ATTACHED VDA FOR SCREEN SIZE (VIA <EMU>_VDADISP) - QUERY ATTACHED VDA FOR SCREEN SIZE (VIA <EMU>_VDADISP)
- INITIALIZE ALL WORKING VARIABLES AND EMULATOR STATE - INITIALIZE ALL WORKING VARIABLES AND EMULATOR STATE
- RETURN (A=STATUS) - RETURN (A=STATUS)
==============
DSKY Functions
==============
RESET ($30):
B=Function A=Result
STAT ($31):
B=Function A=Result / Bytes Pending
A=Number of characters waiting or error code if negative
GETKEY ($32):
B=Function A=Result
E=Key Code
A=DSKY key value or error code if negative
SHOWHEX ($33):
B=Function A=Result
DE:HL=Value (32-bit)
Display value of DE:HL in hex on display. It is not
possible to show decimal points.
SHOWSEG ($34):
B=Function A=Result
HL=Buffer (raw segment encoded)
Display raw segment values. Each byte represents one
character. Each segment of the character is represented
by a bit. The buffer must be located in high memory.
The segments are encoded as shown below:
+--01--+
20 02
+--40--+
10 04
+--08--+ 80
KEYLEDS ($35):
B=Function A=Result
HL=Buffer (LED bitmap)
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.
At this time, the bitmap is specific to the DSKYNG hardware.
This function is ignored by the original DSKY.
STATLED ($36):
B=Function A=Result
D=LED Number
E=LED State (0/1)
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.
BEEP ($37):
B=Function A=Result
Beep the onboard speaker of the DSKY. Only the DSKYNG hardware
has a speaker. This function will be ignored by the original
DSKY.
DEVICE ($38):
B=Function A=Result
D=Device Type
E=Device Number
C=Device Attributes
H=Device Mode
L=Base I/O Adr
Returns device information for the DSKY unit. The Status (A) is a
standard HBIOS result code. Device Attribute (C) values are not yet
defined. Device Type (D) indicates the specific hardware driver that
handles the specified character unit. Values are listed at the start
of this section. Device Number (E) indicates the physical device
number assigned per driver which is always 0 for DSKY.
Device Mode (H) is used to indicate the variant of the chip or circuit
that is used by the specified unit. The Device I/O Base Address (L)
indicates the starting port address of the hardware interface that is
servicing the specified unit. Both of these values are considered
driver specific. Refer to the associated hardware driver for the
values used.

5
Source/HBIOS/Config/MBC_std.asm

@ -42,8 +42,9 @@ RAMSIZE .SET 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!)
; ;
MDFFENABLE .SET FALSE ; MD: ENABLE FLASH FILE SYSTEM MDFFENABLE .SET FALSE ; MD: ENABLE FLASH FILE SYSTEM
; ;
DSKYENABLE .SET FALSE ; ENABLES DSKY
DSKYMODE .SET DSKYMODE_NG ; DSKY VERSION: DSKYMODE_[V1|NG]
DSKYENABLE .SET TRUE ; ENABLES DSKY FUNCTIONALITY
ICMENABLE .SET FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218)
PKDENABLE .SET TRUE ; ENABLES DSKY NG PKD DRIVER (8259)
; ;
UARTINTS .SET FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTINTS .SET FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3
;UARTCFG .SET UARTCFG | SER_RTS ;UARTCFG .SET UARTCFG | SER_RTS

2
Source/HBIOS/Config/SBC_max.asm

@ -39,6 +39,8 @@ FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS
FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES
; ;
DSKYENABLE .SET TRUE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE) DSKYENABLE .SET TRUE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE)
ICMENABLE .SET TRUE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218)
PKDENABLE .SET TRUE ; ENABLES DSKY NG PKD DRIVER (8259)
; ;
DSRTCENABLE .SET TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) DSRTCENABLE .SET TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM)
; ;

11
Source/HBIOS/cfg_master.asm

@ -108,10 +108,13 @@ LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC]
LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS
LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED
; ;
DSKYENABLE .EQU FALSE ; ENABLES DSKY
DSKYMODE .EQU DSKYMODE_V1 ; DSKY VERSION: DSKYMODE_[V1|NG]
DSKYPPIBASE .EQU $60 ; BASE I/O ADDRESS OF DSKY PPI
DSKYOSC .EQU 3000000 ; OSCILLATOR FREQ FOR DSKYNG (IN HZ)
DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY
DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY
ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218)
ICMPPIBASE .EQU $60 ; BASE I/O ADDRESS OF ICM PPI
PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259)
PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI
PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ)
; ;
BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE
CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP

11
Source/HBIOS/cfg_mbc.asm

@ -73,10 +73,13 @@ LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC]
LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS
LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED
; ;
DSKYENABLE .EQU FALSE ; ENABLES DSKY
DSKYMODE .EQU DSKYMODE_V1 ; DSKY VERSION: DSKYMODE_[V1|NG]
DSKYPPIBASE .EQU $60 ; BASE I/O ADDRESS OF DSKY PPI
DSKYOSC .EQU 3000000 ; OSCILLATOR FREQ FOR DSKYNG (IN HZ)
DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY
DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY
ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218)
ICMPPIBASE .EQU $60 ; BASE I/O ADDRESS OF ICM PPI
PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259)
PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI
PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ)
; ;
BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE
CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP

11
Source/HBIOS/cfg_mk4.asm

@ -79,10 +79,13 @@ LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC]
LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS
LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED
; ;
DSKYENABLE .EQU FALSE ; ENABLES DSKY
DSKYMODE .EQU DSKYMODE_V1 ; DSKY VERSION: DSKYMODE_[V1|NG]
DSKYPPIBASE .EQU $60 ; BASE I/O ADDRESS OF DSKY PPI
DSKYOSC .EQU 3000000 ; OSCILLATOR FREQ FOR DSKYNG (IN HZ)
DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY
DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY
ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218)
ICMPPIBASE .EQU $60 ; BASE I/O ADDRESS OF ICM PPI
PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259)
PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI
PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ)
; ;
BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE
CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP

11
Source/HBIOS/cfg_n8.asm

@ -81,10 +81,13 @@ LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC]
LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS
LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED
; ;
DSKYENABLE .EQU FALSE ; ENABLES DSKY
DSKYMODE .EQU DSKYMODE_V1 ; DSKY VERSION: DSKYMODE_[V1|NG]
DSKYPPIBASE .EQU N8_PPI0 ; BASE I/O ADDRESS OF DSKY PPI
DSKYOSC .EQU 3000000 ; OSCILLATOR FREQ FOR DSKYNG (IN HZ)
DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY
DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY
ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218)
ICMPPIBASE .EQU N8_PPI0 ; BASE I/O ADDRESS OF ICM PPI
PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259)
PKDPPIBASE .EQU N8_PPI0 ; BASE I/O ADDRESS OF PKD PPI
PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ)
; ;
BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE
CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP

11
Source/HBIOS/cfg_rph.asm

@ -79,10 +79,13 @@ LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC]
LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS
LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED
; ;
DSKYENABLE .EQU FALSE ; ENABLES DSKY
DSKYMODE .EQU DSKYMODE_V1 ; DSKY VERSION: DSKYMODE_[V1|NG]
DSKYPPIBASE .EQU RPH_PPI0 ; BASE I/O ADDRESS OF DSKY PPI
DSKYOSC .EQU 3000000 ; OSCILLATOR FREQ FOR DSKYNG (IN HZ)
DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY
DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY
ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218)
ICMPPIBASE .EQU RPH_PPI0 ; BASE I/O ADDRESS OF ICM PPI
PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259)
PKDPPIBASE .EQU RPH_PPI0 ; BASE I/O ADDRESS OF PKD PPI
PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ)
; ;
BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE
CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP

11
Source/HBIOS/cfg_sbc.asm

@ -73,10 +73,13 @@ LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC]
LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS
LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED
; ;
DSKYENABLE .EQU FALSE ; ENABLES DSKY
DSKYMODE .EQU DSKYMODE_V1 ; DSKY VERSION: DSKYMODE_[V1|NG]
DSKYPPIBASE .EQU $60 ; BASE I/O ADDRESS OF DSKY PPI
DSKYOSC .EQU 3000000 ; OSCILLATOR FREQ FOR DSKYNG (IN HZ)
DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY
DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY
ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218)
ICMPPIBASE .EQU $60 ; BASE I/O ADDRESS OF ICM PPI
PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259)
PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI
PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ)
; ;
BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE
CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP

11
Source/HBIOS/cfg_z80retro.asm

@ -76,10 +76,13 @@ LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC]
LEDPORT .EQU $00 ; STATUS LED PORT ADDRESS LEDPORT .EQU $00 ; STATUS LED PORT ADDRESS
LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED
; ;
DSKYENABLE .EQU FALSE ; ENABLES DSKY
DSKYMODE .EQU DSKYMODE_V1 ; DSKY VERSION: DSKYMODE_[V1|NG]
DSKYPPIBASE .EQU $60 ; BASE I/O ADDRESS OF DSKY PPI
DSKYOSC .EQU 3000000 ; OSCILLATOR FREQ FOR DSKYNG (IN HZ)
DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY
DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY
ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218)
ICMPPIBASE .EQU $60 ; BASE I/O ADDRESS OF ICM PPI
PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259)
PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI
PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ)
; ;
BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE
CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP

11
Source/HBIOS/cfg_zeta.asm

@ -65,10 +65,13 @@ LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC]
LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS
LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED
; ;
DSKYENABLE .EQU FALSE ; ENABLES DSKY
DSKYMODE .EQU DSKYMODE_V1 ; DSKY VERSION: DSKYMODE_[V1|NG]
DSKYPPIBASE .EQU $60 ; BASE I/O ADDRESS OF DSKY PPI
DSKYOSC .EQU 3000000 ; OSCILLATOR FREQ FOR DSKYNG (IN HZ)
DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY
DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY
ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218)
ICMPPIBASE .EQU $60 ; BASE I/O ADDRESS OF ICM PPI
PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259)
PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI
PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ)
; ;
BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE
CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP

11
Source/HBIOS/cfg_zeta2.asm

@ -76,10 +76,13 @@ LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC]
LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS
LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED
; ;
DSKYENABLE .EQU FALSE ; ENABLES DSKY
DSKYMODE .EQU DSKYMODE_V1 ; DSKY VERSION: DSKYMODE_[V1|NG]
DSKYPPIBASE .EQU $60 ; BASE I/O ADDRESS OF DSKY PPI
DSKYOSC .EQU 3000000 ; OSCILLATOR FREQ FOR DSKYNG (IN HZ)
DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY
DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY
ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218)
ICMPPIBASE .EQU $60 ; BASE I/O ADDRESS OF ICM PPI
PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259)
PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI
PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ)
; ;
BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE
CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP

304
Source/HBIOS/dbgmon.asm

@ -31,12 +31,7 @@ BUFLEN .EQU 40 ; INPUT LINE LENGTH
JP DSKY_ENTRY JP DSKY_ENTRY
JP UART_ENTRY JP UART_ENTRY
; ;
#IF DSKYENABLE
#DEFINE USEDELAY
ENA_XM .EQU FALSE ; NO ROOM FOR BOTH DSKY+XMODEM
#ELSE
ENA_XM .EQU TRUE ; INCLUDE XMODEM IF SPACE AVAILABLE
#ENDIF
ENA_XM .EQU TRUE ; INCLUDE XMODEM
; ;
ENA_MBC6502 .EQU FALSE ; ENABLE OR DISABLE MBC6502 OPTION ENA_MBC6502 .EQU FALSE ; ENABLE OR DISABLE MBC6502 OPTION
; ;
@ -149,10 +144,7 @@ SERIALCMDLOOP:
;_____________________________________________________________________________ ;_____________________________________________________________________________
; ;
INITIALIZE: INITIALIZE:
;LD A,$C3 ; JP OPCODE
;LD (0),A ; STORE AT $0000
;LD (1),HL ; STORE AT $0001
;
#IF (BIOS == BIOS_UNA) #IF (BIOS == BIOS_UNA)
; INSTALL UNA INVOCATION VECTOR FOR RST 08 ; INSTALL UNA INVOCATION VECTOR FOR RST 08
LD A,$C3 ; JP INSTRUCTION LD A,$C3 ; JP INSTRUCTION
@ -160,14 +152,6 @@ INITIALIZE:
LD HL,($FFFE) ; UNA ENTRY VECTOR LD HL,($FFFE) ; UNA ENTRY VECTOR
LD (9),HL ; STORE AT 0x0009 LD (9),HL ; STORE AT 0x0009
#ENDIF #ENDIF
#IF DSKYENABLE
LD B,BF_SYSGET ; HBIOS FUNC=GET SYS INFO
LD C,BF_SYSGET_CPUINFO ; HBIOS SUBFUNC=GET CPU INFO
CALL $FFF0 ; CALL HBIOS
LD A,L ; PUT SPEED IN MHZ IN ACCUM
CALL DELAY_INIT
#ENDIF
; ;
RET RET
; ;
@ -1278,14 +1262,6 @@ TXT_HELP .TEXT "\r\nMonitor Commands (all values in hex):"
; ;
#IF DSKYENABLE #IF DSKYENABLE
; ;
#DEFINE DSKY_KBD
#IF (DSKYMODE == DSKYMODE_V1)
#INCLUDE "dsky.asm"
#ENDIF
#IF (DSKYMODE == DSKYMODE_NG)
#INCLUDE "dskyng.asm"
#ENDIF
;
KY_PR .EQU KY_FW ; USE [FW] FOR [PR] (PORT READ) KY_PR .EQU KY_FW ; USE [FW] FOR [PR] (PORT READ)
KY_PW .EQU KY_BK ; USE [BW] FOR [PW] (PORT WRITE) KY_PW .EQU KY_BK ; USE [BW] FOR [PW] (PORT WRITE)
; ;
@ -1295,8 +1271,9 @@ KY_PW .EQU KY_BK ; USE [BW] FOR [PW] (PORT WRITE)
;_____________________________________________________________________________ ;_____________________________________________________________________________
; ;
DSKY_ENTRY: DSKY_ENTRY:
; SHOULD WE DO SOMETHING HERE TO CONFIRM THAT A DSKY
; IS ACTUALLY OPERATING???
LD SP,MON_STACK ; SET THE STACK POINTER LD SP,MON_STACK ; SET THE STACK POINTER
;EI ; INTS OK NOW
LD HL,DSKY_ENTRY ; RESTART ADDRESS LD HL,DSKY_ENTRY ; RESTART ADDRESS
CALL INITIALIZE CALL INITIALIZE
; ;
@ -1305,12 +1282,7 @@ DSKY_ENTRY:
; START UP THE SYSTEM WITH THE FRONT PANEL INTERFACE ; START UP THE SYSTEM WITH THE FRONT PANEL INTERFACE
;_____________________________________________________________________________ ;_____________________________________________________________________________
; ;
CALL DSKY_PREINIT ; INITIALIZE DSKY
#IF (DSKYMODE == DSKYMODE_NG)
CALL DSKY_BEEP CALL DSKY_BEEP
#ENDIF
; ;
;__COMMAND_PARSE______________________________________________________________ ;__COMMAND_PARSE______________________________________________________________
; ;
@ -1320,17 +1292,12 @@ DSKY_ENTRY:
FRONTPANELLOOP: FRONTPANELLOOP:
LD HL,CPUUP ; SET POINTER TO CPU UP MSG LD HL,CPUUP ; SET POINTER TO CPU UP MSG
CALL DSKY_SHOW ; DISPLAY UNENCODED CALL DSKY_SHOW ; DISPLAY UNENCODED
#IF (DSKYMODE == DSKYMODE_NG)
CALL DSKY_HIGHLIGHTCMDKEYS CALL DSKY_HIGHLIGHTCMDKEYS
CALL DSKY_L1ON CALL DSKY_L1ON
#ENDIF
CALL KB_GET ; GET KEY FROM KB
#IF (DSKYMODE == DSKYMODE_NG)
CALL KB_GET ; GET KEY FROM DSKY
PUSH AF
CALL DSKY_L1OFF CALL DSKY_L1OFF
#ENDIF
POP AF
FRONTPANELLOOP1: FRONTPANELLOOP1:
CP KY_PR ; IS PORT READ? CP KY_PR ; IS PORT READ?
@ -1366,11 +1333,7 @@ DOBOOT:
;_____________________________________________________________________________ ;_____________________________________________________________________________
; ;
DOPORTREAD: DOPORTREAD:
#IF (DSKYMODE == DSKYMODE_NG)
CALL DSKY_HIGHLIGHTNUMKEYS CALL DSKY_HIGHLIGHTNUMKEYS
#ENDIF
CALL GETPORT ; GET PORT INTO A CALL GETPORT ; GET PORT INTO A
PORTREADLOOP: PORTREADLOOP:
LD C,A ; STORE PORT IN "C" LD C,A ; STORE PORT IN "C"
@ -1393,11 +1356,7 @@ PORTREADGETKEY:
;_____________________________________________________________________________ ;_____________________________________________________________________________
; ;
DOPORTWRITE: DOPORTWRITE:
#IF (DSKYMODE == DSKYMODE_NG)
CALL DSKY_HIGHLIGHTNUMKEYS CALL DSKY_HIGHLIGHTNUMKEYS
#ENDIF
CALL GETPORT ; GET PORT INTO A CALL GETPORT ; GET PORT INTO A
PORTWRITELOOP: PORTWRITELOOP:
LD L,A ; SAVE PORT NUM LD L,A ; SAVE PORT NUM
@ -1419,18 +1378,10 @@ PORTWRITEGETKEY:
;_____________________________________________________________________________ ;_____________________________________________________________________________
; ;
DOGO: DOGO:
#IF (DSKYMODE == DSKYMODE_NG)
CALL DSKY_HIGHLIGHTNUMKEYS CALL DSKY_HIGHLIGHTNUMKEYS
#ENDIF
CALL GETADDR ; GET ADDRESS INTO HL CALL GETADDR ; GET ADDRESS INTO HL
#IF (DSKYMODE == DSKYMODE_NG)
PUSH HL
CALL DSKY_HIGHLIGHTKEYSOFF CALL DSKY_HIGHLIGHTKEYSOFF
#ENDIF
PUSH HL ; EXEC ADR TO TOS
LD HL,GOTO ; POINT TO "GO" MSG LD HL,GOTO ; POINT TO "GO" MSG
CALL INITBUF CALL INITBUF
POP HL POP HL
@ -1450,11 +1401,7 @@ DOGO:
;_____________________________________________________________________________ ;_____________________________________________________________________________
; ;
DOEXAMINE: DOEXAMINE:
#IF (DSKYMODE == DSKYMODE_NG)
CALL DSKY_HIGHLIGHTNUMKEYS CALL DSKY_HIGHLIGHTNUMKEYS
#ENDIF
CALL GETADDR ; GET ADDRESS INTO HL CALL GETADDR ; GET ADDRESS INTO HL
EXAMINELOOP: EXAMINELOOP:
LD DE,DISPLAYBUF+0 LD DE,DISPLAYBUF+0
@ -1470,11 +1417,7 @@ EXAMINELOOP:
LD A,(HL) ; GET VALUE FROM ADDRESS IN HL LD A,(HL) ; GET VALUE FROM ADDRESS IN HL
CALL PUTVALUE CALL PUTVALUE
CALL ENCDISPLAY ; DISPLAY BUFFER ON DISPLAYS CALL ENCDISPLAY ; DISPLAY BUFFER ON DISPLAYS
#IF (DSKYMODE == DSKYMODE_NG)
CALL DSKY_HIGHLIGHTFWDKEYS CALL DSKY_HIGHLIGHTFWDKEYS
#ENDIF
EXAMINEGETKEY: EXAMINEGETKEY:
CALL KB_GET ; GET KEY FROM KB CALL KB_GET ; GET KEY FROM KB
CP KY_EN ; [EN] PRESSED, INC ADDRESS AND LOOP CP KY_EN ; [EN] PRESSED, INC ADDRESS AND LOOP
@ -1492,11 +1435,7 @@ EXAMINEFW:
;_____________________________________________________________________________ ;_____________________________________________________________________________
; ;
DODEPOSIT: DODEPOSIT:
#IF (DSKYMODE == DSKYMODE_NG)
CALL DSKY_HIGHLIGHTNUMKEYS CALL DSKY_HIGHLIGHTNUMKEYS
#ENDIF
CALL GETADDR ; GET ADDRESS INTO HL CALL GETADDR ; GET ADDRESS INTO HL
DEPOSITLOOP: DEPOSITLOOP:
LD DE,DISPLAYBUF+0 LD DE,DISPLAYBUF+0
@ -1513,11 +1452,7 @@ DEPOSITLOOP:
LD DE,DISPLAYBUF+6 ; DISPLAY WRITTEN MEM VALUE LD DE,DISPLAYBUF+6 ; DISPLAY WRITTEN MEM VALUE
CALL PUTVALUE ; ... WITHOUT DP'S CALL PUTVALUE ; ... WITHOUT DP'S
CALL ENCDISPLAY ; DISPLAY BUFFER CONTENTS CALL ENCDISPLAY ; DISPLAY BUFFER CONTENTS
#IF (DSKYMODE == DSKYMODE_NG)
CALL DSKY_HIGHLIGHTFWDKEYS CALL DSKY_HIGHLIGHTFWDKEYS
#ENDIF
DEPOSITGETKEY: DEPOSITGETKEY:
CALL KB_GET ; GET KEY FROM KB CALL KB_GET ; GET KEY FROM KB
CP KY_EN ; [EN] PRESSED, INC ADDRESS AND LOOP CP KY_EN ; [EN] PRESSED, INC ADDRESS AND LOOP
@ -1684,6 +1619,7 @@ KB_GET:
PUSH DE PUSH DE
PUSH HL ; SAVE HL PUSH HL ; SAVE HL
CALL DSKY_GETKEY ; GET A KEY CALL DSKY_GETKEY ; GET A KEY
LD A,E ; PUT KEY CODE IN A
CP KY_EN ; ENTER? CP KY_EN ; ENTER?
JR Z,KB_GET1 ; IF YES, RET TO CALLER JR Z,KB_GET1 ; IF YES, RET TO CALLER
CP $10 ; HEX DIGIT? CP $10 ; HEX DIGIT?
@ -1710,7 +1646,7 @@ INITBUF:
; ;
;__ENCDISPLAY_________________________________________________________________ ;__ENCDISPLAY_________________________________________________________________
; ;
; DISPLAY CONTENTS OF DISPLAYBUF DECODED PER SEGDECODE TABLE
; DISPLAY CONTENTS OF DISPLAYBUF ENCODED PER SEGDECODE TABLE
;_____________________________________________________________________________ ;_____________________________________________________________________________
; ;
ENCDISPLAY: ENCDISPLAY:
@ -1720,7 +1656,7 @@ ENCDISPLAY:
; ;
;__ENCBUF_____________________________________________________________________ ;__ENCBUF_____________________________________________________________________
; ;
; DISPLAY CONTENTS OF BUFFER AT HL DECODED PER SEGDECODE TABLE
; DISPLAY CONTENTS OF BUFFER AT HL ENCODED PER SEGDECODE TABLE
;_____________________________________________________________________________ ;_____________________________________________________________________________
; ;
ENCBUF: ENCBUF:
@ -1736,7 +1672,6 @@ ENCBUF1:
INC HL ; BUMP TO NEXT BYTE FOR NEXT PASS INC HL ; BUMP TO NEXT BYTE FOR NEXT PASS
PUSH AF ; SAVE IT PUSH AF ; SAVE IT
AND $80 ; ISOLATE HI BIT (DP) AND $80 ; ISOLATE HI BIT (DP)
;XOR $80 ; FLIP IT
LD C,A ; SAVE IN C LD C,A ; SAVE IN C
POP AF ; RECOVER ORIGINAL POP AF ; RECOVER ORIGINAL
AND $7F ; REMOVE HI BIT (DP) AND $7F ; REMOVE HI BIT (DP)
@ -1757,36 +1692,62 @@ ENCBUF1:
POP HL ; RESTORE HL POP HL ; RESTORE HL
RET RET
; ;
#IF (DSKYMODE == DSKYMODE_V1)
;_____________________________________________________________________________
; ;
CPUUP .DB $04,$4B,$6E,$3B,$00,$3B,$6E,$04 ; "-CPU UP-" (RAW SEG)
MSGBOOT .DB $7F,$1D,$1D,$0F,$A0,$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)
; DSKY INTERFACE ROUTINES
;_____________________________________________________________________________
; ;
;_HEX_7_SEG_DECODE_TABLE______________________________________________________
DSKY_GETKEY:
LD B,BF_DSKYGETKEY
RST 08
RET
; ;
; SET BIT 7 TO DISPLAY W/ DECIMAL POINT
;_____________________________________________________________________________
DSKY_SHOW:
LD B,BF_DSKYSHOWSEG
RST 08
RET
; ;
SEGDECODE:
DSKY_BEEP:
LD B,BF_DSKYBEEP
RST 08
RET
; ;
; 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
DSKY_L1ON:
LD E,1
JR DSKY_STATLED
DSKY_L1OFF:
LD E,0
DSKY_STATLED:
LD B,BF_DSKYSTATLED
LD D,0
RST 08
RET
; ;
; POS $08 $09 $0A $0B $0C $0D $0E $0F
; GLYPH '8' '9' 'A' 'B' 'C' 'D' 'E' 'F'
.DB $7F, $77, $7E, $1F, $4B, $3D, $4F, $4E
DSKY_PUTLED:
LD B,BF_DSKYKEYLEDS
RST 08
RET
; ;
; 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, $5B
DSKY_HIGHLIGHTFWDKEYS:
LD HL,DSKY_HIGHLIGHTFWDKEYLEDS
JR DSKY_PUTLED
; ;
#ENDIF
DSKY_HIGHLIGHTCMDKEYS:
LD HL,DSKY_HIGHLIGHTCMDKEYLEDS
JR DSKY_PUTLED
; ;
#IF (DSKYMODE == DSKYMODE_NG)
DSKY_HIGHLIGHTNUMKEYS:
LD HL,DSKY_HIGHLIGHTNUMKEYLEDS
JR DSKY_PUTLED
;
DSKY_HIGHLIGHTKEYSOFF:
LD HL,DSKY_HIGHLIGHTKEYLEDSOFF
JR DSKY_PUTLED
;
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
; ;
CPUUP .DB $40,$39,$73,$3E,$00,$3E,$73,$40 ; "-CPU UP-" (RAW SEG) 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) MSGBOOT .DB $7F,$5C,$5C,$78,$82,$00,$00,$00 ; "Boot! " (RAW SEG)
@ -1813,31 +1774,8 @@ SEGDECODE:
; GLYPH ' ' '-' '.' 'P' 'o' 'r' 't' 'A' 'd' 'r' 'G' ; GLYPH ' ' '-' '.' 'P' 'o' 'r' 't' 'A' 'd' 'r' 'G'
.DB $00, $40, $00, $73, $5C, $50, $78, $77, $5E, $50, $3D .DB $00, $40, $00, $73, $5C, $50, $78, $77, $5E, $50, $3D
; ;
DSKY_HIGHLIGHTFWDKEYS:
CALL DSKY_PUTLED
.DB $00,$00,$00,$30,$00,$00,$00,$00
RET
DSKY_HIGHLIGHTCMDKEYS:
CALL DSKY_PUTLED
.DB $20,$00,$20,$3F,$00,$00,$00,$00
RET
DSKY_HIGHLIGHTNUMKEYS:
CALL DSKY_PUTLED
.DB $1F,$3F,$1F,$30,$00,$00,$00,$00
RET
DSKY_HIGHLIGHTKEYSOFF:
CALL DSKY_PUTLED
.DB $00,$00,$00,$00,$00,$00,$00,$00
RET
#ENDIF
;
DISPLAYBUF: .FILL 8,0 DISPLAYBUF: .FILL 8,0
DSKY_BUF .FILL 8,0
; ;
#ELSE #ELSE
; ;
@ -1949,130 +1887,6 @@ ADDHLA:
INC H INC H
RET RET
; ;
; DELAY 16US (CPU SPEED COMPENSATED) INCUDING CALL/RET INVOCATION
; REGISTER A AND FLAGS DESTROYED
; NO COMPENSATION FOR Z180 MEMORY WAIT STATES
; THERE IS AN OVERHEAD OF 3TS PER INVOCATION
; IMPACT OF OVERHEAD DIMINISHES AS CPU SPEED INCREASES
;
; CPU SCALER (CPUSCL) = (CPUHMZ - 2) FOR 16US + 3TS DELAY
; NOTE: CPUSCL MUST BE >= 1!
;
; EXAMPLE: 8MHZ CPU (DELAY GOAL IS 16US)
; LOOP = ((6 * 16) - 5) = 91TS
; TOTAL COST = (91 + 40) = 131TS
; ACTUAL DELAY = (131 / 8) = 16.375US
;
; --- TOTAL COST = (LOOP COST + 40) TS -----------------+
DELAY: ; 17TS (FROM INVOKING CALL) |
LD A,(CPUSCL) ; 13TS |
; |
DELAY1: ; |
; --- LOOP = ((CPUSCL * 16) - 5) TS ------------+ |
DEC A ; 4TS | |
#IF (BIOS == BIOS_WBW) ; | |
#IF (CPUFAM == CPU_Z180) ; | |
OR A ; +4TS FOR Z180 | |
#ENDIF ; | |
#ENDIF ; | |
JR NZ,DELAY1 ; 12TS (NZ) / 7TS (Z) | |
; ----------------------------------------------+ |
; |
RET ; 10TS (RETURN) |
;-------------------------------------------------------+
;
; DELAY 16US * DE (CPU SPEED COMPENSATED)
; REGISTER DE, A, AND FLAGS DESTROYED
; NO COMPENSATION FOR Z180 MEMORY WAIT STATES
; THERE IS A 27TS OVERHEAD FOR CALL/RET PER INVOCATION
; IMPACT OF OVERHEAD DIMINISHES AS DE AND/OR CPU SPEED INCREASES
;
; CPU SCALER (CPUSCL) = (CPUHMZ - 2) FOR 16US OUTER LOOP COST
; NOTE: CPUSCL MUST BE > 0!
;
; EXAMPLE: 8MHZ CPU, DE=6250 (DELAY GOAL IS .1 SEC OR 100,000US)
; INNER LOOP = ((16 * 6) - 5) = 91TS
; OUTER LOOP = ((91 + 37) * 6250) = 800,000TS
; ACTUAL DELAY = ((800,000 + 27) / 8) = 100,003US
;
; --- TOTAL COST = (OUTER LOOP + 27) TS ------------------------+
VDELAY: ; 17TS (FROM INVOKING CALL) |
; |
; --- OUTER LOOP = ((INNER LOOP + 37) * DE) TS ---------+ |
LD A,(CPUSCL) ; 13TS | |
; | |
VDELAY1: ; | |
; --- INNER LOOP = ((CPUSCL * 16) - 5) TS ------+ | |
#IF (BIOS == BIOS_WBW) ; | | |
#IF (CPUFAM == CPU_Z180) ; | | |
OR A ; +4TS FOR Z180 | | |
#ENDIF ; | | |
#ENDIF ; | | |
DEC A ; 4TS | | |
JR NZ,VDELAY1 ; 12TS (NZ) / 7TS (Z) | | |
; ----------------------------------------------+ | |
; | |
DEC DE ; 6TS | |
#IF (BIOS == BIOS_WBW) ; | | |
#IF (CPUFAM == CPU_Z180) ; | |
OR A ; +4TS FOR Z180 | |
#ENDIF ; | |
#ENDIF ; | |
LD A,D ; 4TS | |
OR E ; 4TS | |
JP NZ,VDELAY ; 10TS | |
;-------------------------------------------------------+ |
; |
RET ; 10TS (FINAL RETURN) |
;---------------------------------------------------------------+
;
; DELAY ABOUT 0.5 SECONDS
; 500000US / 16US = 31250
;
LDELAY:
PUSH AF
PUSH DE
LD DE,31250
CALL VDELAY
POP DE
POP AF
RET
;
; INITIALIZE DELAY SCALER BASED ON OPERATING CPU SPEED
; ENTER WITH A = CPU SPEED IN MHZ
;
DELAY_INIT:
CP 3 ; TEST FOR <= 2 (SPECIAL HANDLING)
JR C,DELAY_INIT1 ; IF <= 2, SPECIAL PROCESSING
SUB 2 ; ADJUST AS REQUIRED BY DELAY FUNCTIONS
JR DELAY_INIT2 ; AND CONTINUE
DELAY_INIT1:
LD A,1 ; USE THE MIN VALUE OF 1
DELAY_INIT2:
LD (CPUSCL),A ; UPDATE CPU SCALER VALUE
RET
#IF (CPUMHZ < 3)
CPUSCL .DB 1 ; CPU SCALER MUST BE > 0
#ELSE
CPUSCL .DB CPUMHZ - 2 ; OTHERWISE 2 LESS THAN PHI MHZ
#ENDIF
;
; SHORT DELAY FUNCTIONS. NO CLOCK SPEED COMPENSATION, SO THEY
; WILL RUN LONGER ON SLOWER SYSTEMS. THE NUMBER INDICATES THE
; NUMBER OF CALL/RET INVOCATIONS. A SINGLE CALL/RET IS
; 27 T-STATES ON A Z80, 25 T-STATES ON A Z180
;
; ; Z80 Z180
; ; ---- ----
DLY64: CALL DLY32 ; 1728 1600
DLY32: CALL DLY16 ; 864 800
DLY16: CALL DLY8 ; 432 400
DLY8: CALL DLY4 ; 216 200
DLY4: CALL DLY2 ; 108 100
DLY2: CALL DLY1 ; 54 50
DLY1: RET ; 27 25
;
; ;
; ;
.FILL 16,0 ; SET MINIMUM STACK DEPTH .FILL 16,0 ; SET MINIMUM STACK DEPTH

386
Source/HBIOS/dsky.asm

@ -1,386 +0,0 @@
;
;==================================================================================================
; DSKY (DISPLAY AND KEYBOARD) ROUTINES
;==================================================================================================
;
; THE DSKY MAY COINCIDE ON THE SAME PPI BUS AS A PPISD. IT MAY NOT
; SHARE A PPI BUS WITH A PPIDE. SEE PPI_BUS.TXT FOR MORE INFORMATION.
;
; LED SEGMENTS (BIT VALUES)
;
; +--40--+
; 02 20
; +--04--+
; 08 10
; +--01--+ 80
;
; DSKY SCAN CODES ARE ONE BYTE: CCRRRRRR
; BITS 7-6 IDENTFY THE COLUMN OF THE KEY PRESSED
; BITS 5-0 ARE A BITMAP, WITH A BIT ON TO INDICATE ROW OF KEY PRESSED
;
; ____PC0________PC1________PC2________PC3____
; PB5 | $20 [D] $60 [E] $A0 [F] $E0 [BO]
; PB4 | $10 [A] $50 [B] $90 [C] $D0 [GO]
; PB3 | $08 [7] $48 [8] $88 [9] $C8 [EX]
; PB2 | $04 [4] $44 [5] $84 [6] $C4 [DE]
; PB1 | $02 [1] $42 [2] $82 [3] $C2 [EN]
; PB0 | $01 [FW] $41 [0] $81 [BK] $C1 [CL]
;
;
PPIA .EQU DSKYPPIBASE + 0 ; PORT A
PPIB .EQU DSKYPPIBASE + 1 ; PORT B
PPIC .EQU DSKYPPIBASE + 2 ; PORT C
PPIX .EQU DSKYPPIBASE + 3 ; PPI CONTROL PORT
;
;__DSKY_INIT_________________________________________________________________________________________
;
; CONFIGURE PARALLEL PORT AND CLEAR KEYPAD BUFFER
;____________________________________________________________________________________________________
;
DSKY_PREINIT:
OR $FF ; SIGNAL TO WAIT FOR KEY RELEASE
LD (DSKY_KEYBUF),A ; SET IT
;
; PPI PORT B IS NORMALLY SET TO INPUT, BUT HERE WE
; TEMPORARILY SET IT TO OUTPUT. WHILE IN OUTPUT MODE, WE
; WRITE A VALUE OF $FF WHICH WILL BE PERSISTED BY THE PPI
; CHIP BUS HOLD CIRCUIT IF THERE IS NO DSKY PRESENT. SO,
; WE CAN SUBSEQUENTLY TEST FOR PPIB=$FF TO SEE IF THERE IS
; NO DSKY AND PREVENT PROBLEMS WITH PHANTOM DSKY KEY PRESSES.
; IF A DSKY IS PRESENT, IT WILL SIMPLY OVERPOWER THE PPI
; BUS HOLD CIRCUIT.
LD A,$80 ; PA OUT, PB OUT, PC OUT
OUT (PPIX),A
LD A,$FF ; SET PPIB=$FF, BUS HOLD
OUT (PPIB),A
;
LD A,$82 ; PA OUT, PB IN, PC OUT
OUT (PPIX),A
;
;IN A,(PPIB) ; *DEBUG*
;CALL PRTHEXBYTE ; *DEBUG*
;
IN A,(PPIB) ; READ PPIB
XOR $FF ; INVERT RESULT
LD (DSKY_PRESENT),A ; SAVE AS PRESENT FLAG
;
DSKY_RESET:
PUSH AF
;
LD A,$70 ; PPISD AND 7218 INACTIVE
OUT (PPIC),A
;
POP AF
RET
;
#IFDEF HBIOS
;
DSKY_INIT:
CALL NEWLINE ; FORMATTING
PRTS("DSKY:$") ; FORMATTING
;
PRTS(" IO=0x$") ; FORMATTING
LD A,DSKYPPIBASE ; GET BASE PORT
CALL PRTHEXBYTE ; PRINT BASE PORT
PRTS(" MODE=$") ; FORMATTING
PRTS("V1$") ; PRINT DSKY TYPE
;
LD A,(DSKY_PRESENT) ; PRESENT?
OR A ; SET FLAGS
RET NZ ; YES, ALL DONE
PRTS(" NOT PRESENT$") ; NOT PRESENT
;
RET
;
#ENDIF
;
#IFDEF DSKY_KBD
;
KY_0 .EQU $00
KY_1 .EQU $01
KY_2 .EQU $02
KY_3 .EQU $03
KY_4 .EQU $04
KY_5 .EQU $05
KY_6 .EQU $06
KY_7 .EQU $07
KY_8 .EQU $08
KY_9 .EQU $09
KY_A .EQU $0A
KY_B .EQU $0B
KY_C .EQU $0C
KY_D .EQU $0D
KY_E .EQU $0E
KY_F .EQU $0F
KY_FW .EQU $10 ; FORWARD
KY_BK .EQU $11 ; BACKWARD
KY_CL .EQU $12 ; CLEAR
KY_EN .EQU $13 ; ENTER
KY_DE .EQU $14 ; DEPOSIT
KY_EX .EQU $15 ; EXAMINE
KY_GO .EQU $16 ; GO
KY_BO .EQU $17 ; BOOT
;
;__DSKY_GETKEY_____________________________________________________________________________________
;
; WAIT FOR A DSKY KEYPRESS AND RETURN
;____________________________________________________________________________________________________
;
DSKY_GETKEY:
LD A,(DSKY_PRESENT) ; DOES IT EXIST?
OR A ; SET FLAGS
JR Z,DSKY_GETKEY1A ; ABORT IF NOT PRESENT
;
CALL DSKY_STAT ; CHECK STATUS
JR Z,DSKY_GETKEY ; LOOP IF NOTHING READY
LD A,(DSKY_KEYBUF)
LD B,24 ; SIZE OF DECODE TABLE
LD C,0 ; INDEX
LD HL,DSKY_KEYMAP ; POINT TO BEGINNING OF TABLE
DSKY_GETKEY1:
CP (HL) ; MATCH?
JR Z,DSKY_GETKEY2 ; FOUND, DONE
INC HL
INC C ; BUMP INDEX
DJNZ DSKY_GETKEY1 ; LOOP UNTIL EOT
DSKY_GETKEY1A:
LD A,$FF ; NOT FOUND ERR, RETURN $FF
RET
DSKY_GETKEY2:
LD A,$FF ; SET KEY BUF TO $FF
LD (DSKY_KEYBUF),A ; DO IT
; RETURN THE INDEX POSITION WHERE THE SCAN CODE WAS FOUND
LD A,C ; RETURN INDEX VALUE
RET
;
;__DSKY_STAT_________________________________________________________________________________________
;
; CHECK FOR KEY PRESS, SAVE RAW VALUE, RETURN STATUS
;____________________________________________________________________________________________________
;
DSKY_STAT:
LD A,(DSKY_PRESENT) ; DOES IT EXIST?
OR A ; SET FLAGS
RET Z ; ABORT WITH A=0 IF NOT THERE
;
LD A,(DSKY_KEYBUF) ; GET CURRENT BUF VAL
CP $FF ; $FF MEANS WE ARE WAITING FOR PREV KEY TO BE RELEASED
JR Z,DSKY_STAT1 ; CHECK FOR PREV KEY RELEASE
OR A ; DO WE HAVE A SCAN CODE BUFFERED ALREADY?
RET NZ ; IF SO, WE ARE DONE
JR DSKY_STAT2 ; OTHERWISE, DO KEY CHECK
DSKY_STAT1:
; WAITING FOR PREVIOUS KEY RELEASE
CALL DSKY_KEY ; SCAN
JR Z,DSKY_STAT2 ; IF ZERO, PREV KEY RELEASED, CONTINUE
XOR A ; SIGNAL NO KEY PRESSED
RET ; AND DONE
DSKY_STAT2:
CALL DSKY_KEY ; SCAN
LD (DSKY_KEYBUF),A ; SAVE RESULT
RET ; RETURN WITH ZF SET APPROPRIATELY
;
;__DSKY_KEY_______________________________________________________________________________________
;
; CHECK FOR KEY PRESS W/ DEBOUNCE
;____________________________________________________________________________________________________
;
DSKY_KEY:
; IF PPIB VALUE IS $FF, THERE IS NO DSKY, SEE DSKY_INIT
IN A,(PPIB)
INC A
RET Z
CALL DSKY_SCAN ; INITIAL KEY PRESS SCAN
LD E,A ; SAVE INITIAL SCAN VALUE
DSKY_KEY1:
; MAX BOUNCE TIME FOR OMRON B3F IS 3MS
PUSH DE ; SAVE DE
LD DE,300 ; ~3MS DELAY
CALL VDELAY ; DO IT
CALL DSKY_SCAN ; REPEAT SCAN
POP DE ; RESTORE DE
RET Z ; IF NOTHING PRESSED, DONE
CP E ; SAME?
JR DSKY_KEY2 ; YES, READY TO RETURN
LD E,A ; OTHERWISE, SAVE NEW SCAN VAL
JR DSKY_KEY1 ; AND LOOP UNTIL STABLE VALUE
DSKY_KEY2:
OR A ; SET FLAGS BASED ON VALUE
RET ; AND DONE
;
;__DSKY_SCAN______________________________________________________________________________________
;
; SCAN KEYPAD AND RETURN RAW SCAN CODE (RETURNS ZERO IF NO KEY PRESSED)
;____________________________________________________________________________________________________
;
DSKY_SCAN:
LD B,4 ; 4 COLUMNS
LD C,$01 ; FIRST COLUMN
LD E,0 ; INITIAL COL ID
DSKY_SCAN1:
LD A,C ; COL TO A
OR $70 ; KEEP PPISD AND 7218 INACTIVE
OUT (PPIC),A ; ACTIVATE COL
IN A,(PPIB) ; READ ROW BITS
AND $3F ; MASK, WE ONLY HAVE 6 ROWS, OTHERS UNDEFINED
JR NZ,DSKY_SCAN2 ; IF NOT ZERO, GOT SOMETHING
RLC C ; NEXT COL
INC E ; BUMP COL ID
DJNZ DSKY_SCAN1 ; LOOP THROUGH ALL COLS
XOR A ; NOTHING FOUND, RETURN ZERO
JP DSKY_RESET ; RETURN VIA RESET
DSKY_SCAN2:
RRC E ; MOVE COL ID
RRC E ; ... TO HIGH BITS 6 & 7
OR E ; COMBINE WITH ROW
JP DSKY_RESET ; RETURN VIA RESET
;
;_KEYMAP_TABLE_____________________________________________________________________________________________________________
;
DSKY_KEYMAP:
; POS $00 $01 $02 $03 $04 $05 $06 $07
; KEY [0] [1] [2] [3] [4] [5] [6] [7]
.DB $41, $02, $42, $82, $04, $44, $84, $08
;
; POS $08 $09 $0A $0B $0C $0D $0E $0F
; KEY [8] [9] [A] [B] [C] [D] [E] [F]
.DB $48, $88, $10, $50, $90, $20, $60, $A0
;
; POS $10 $11 $12 $13 $14 $15 $16 $17
; KEY [FW] [BK] [CL] [EN] [DE] [EX] [GO] [BO]
.DB $01, $81, $C1, $C2, $C4, $C8, $D0, $E0
;
; KBD WORKING STORAGE
;
DSKY_KEYBUF .DB 0
;
#ENDIF ; DSKY_KBD
;
;==================================================================================================
; 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:
PUSH HL
PUSH DE
LD B,4 ; 4 BYTES OF INPUT
EX DE,HL
DSKY_BIN2SEG1:
LD A,(DE) ; FIRST NIBBLE
SRL A
SRL A
SRL A
SRL A
PUSH HL
LD HL,DSKY_HEXMAP
CALL DSKY_ADDHLA
LD A,(HL)
POP HL
LD (HL),A
INC HL
LD A,(DE) ; SECOND NIBBLE
AND 0FH
PUSH HL
LD HL,DSKY_HEXMAP
CALL DSKY_ADDHLA
LD A,(HL)
POP HL
LD (HL),A
INC HL
INC DE ; NEXT BYTE
DJNZ DSKY_BIN2SEG1
POP DE
POP HL
RET
;
;==================================================================================================
; DSKY SHOW BUFFER
; HL: ADDRESS OF BUFFER
;==================================================================================================
;
DSKY_SHOW:
;;PUSH AF ; SAVE 7218 CONTROL BITS
LD A,82H ; SETUP PPI
OUT (PPIX),A
CALL DSKY_COFF
;;POP AF
LD A,$F0 ; 7218 -> (DATA COMING, NO DECODE)
OUT (PPIA),A
CALL DSKY_STROBEC ; STROBE COMMAND
LD B,DSKY_BUFLEN ; NUMBER OF DIGITS
LD C,PPIA
DSKY_HEXOUT2:
;OUTI
LD A,(HL)
XOR $80 ; FIX DOT POLARITY
OUT (C),A
INC HL
DEC B
JP Z,DSKY_STROBE ; DO FINAL STROBE AND RETURN
CALL DSKY_STROBE ; STROBE BYTE VALUE
JR DSKY_HEXOUT2
DSKY_STROBEC: ; COMMAND STROBE
LD A,80H | 30H
JP DSKY_STROBE0
DSKY_STROBE: ; DATA STROBE
LD A,00H | 30H ; SET WRITE STROBE
DSKY_STROBE0:
OUT (PPIC),A ; OUT TO PORTC
CALL DLY2 ; DELAY
DSKY_COFF:
LD A,40H | 30H ; QUIESCE
OUT (PPIC),A ; OUT TO PORTC
; CALL DSKY_DELAY ; WAIT
RET
;
;==================================================================================================
; UTILTITY FUNCTIONS
;==================================================================================================
;
DSKY_ADDHLA:
ADD A,L
LD L,A
RET NC
INC H
RET
;
;==================================================================================================
; STORAGE
;==================================================================================================
;
; CODES FOR NUMERICS
; HIGH BIT ALWAYS CLEAR TO SUPPRESS DECIMAL POINT
; SET HIGH BIT TO SHOW DECIMAL POINT
;
DSKY_HEXMAP:
.DB $7B ; 0
.DB $30 ; 1
.DB $6D ; 2
.DB $75 ; 3
.DB $36 ; 4
.DB $57 ; 5
.DB $5F ; 6
.DB $70 ; 7
.DB $7F ; 8
.DB $77 ; 9
.DB $7E ; A
.DB $1F ; B
.DB $4B ; C
.DB $3D ; D
.DB $4F ; E
.DB $4E ; F
;
; SEG DISPLAY WORKING STORAGE
;
DSKY_PRESENT .DB 0
;
DSKY_BUF .FILL 8,0
DSKY_BUFLEN .EQU $ - DSKY_BUF
DSKY_HEXBUF .FILL 4,0
DSKY_HEXBUFLEN .EQU $ - DSKY_HEXBUF

22
Source/HBIOS/fd.asm

@ -1130,9 +1130,11 @@ FD_RETRY1:
FD_START: FD_START:
; ;
#IF (DSKYENABLE) #IF (DSKYENABLE)
#IF (DSKYDSKACT)
LD A,4 LD A,4
CALL LDHLIYA CALL LDHLIYA
CALL HB_DSKACTCHS ; SHOW ACTIVITY CALL HB_DSKACTCHS ; SHOW ACTIVITY
#ENDIF
#ENDIF #ENDIF
; ;
LD A,(FCD_FDCRDY) LD A,(FCD_FDCRDY)
@ -1202,9 +1204,6 @@ FD_RUN1:
RET RET
FD_RUNCHK: FD_RUNCHK:
;;#IF (DSKYENABLE)
;; CALL FD_DSKY
;;#ENDIF
FD_RUNEXIT: FD_RUNEXIT:
LD A,(FST_RC) LD A,(FST_RC)
@ -1221,23 +1220,6 @@ FD_RUNERR:
JP FD_RETRC JP FD_RETRC
;;#IF (DSKYENABLE)
;;FD_DSKY:
;; LD HL,DSKY_HEXBUF
;; LD A,(FCD_C)
;; LD (HL),A
;; INC HL
;; LD A,(FCD_R)
;; LD (HL),A
;; INC HL
;; LD A,(FRB_ST0)
;; LD (HL),A
;; INC HL
;; LD A,(FRB_ST1)
;; LD (HL),A
;; CALL DSKY_HEXOUT
;; RET
;;#ENDIF
; ;
;=============================================================================== ;===============================================================================
; FLOPPY DISK CONTROL SERVICES (PHYSICAL DEVICE CONTROL FOR FDC HARDWARE) ; FLOPPY DISK CONTROL SERVICES (PHYSICAL DEVICE CONTROL FOR FDC HARDWARE)

232
Source/HBIOS/hbios.asm

@ -63,7 +63,6 @@
; - decode.asm ; - decode.asm
; - encode.asm ; - encode.asm
; - [xio|mio].asm ; - [xio|mio].asm
; - [dsky.asm|dskyng.asm]
; - unlzsa2s.asm ; - unlzsa2s.asm
; ;
; INCLUDE GENERIC STUFF ; INCLUDE GENERIC STUFF
@ -1878,6 +1877,35 @@ HB_CPU1:
CALL DSRTC_PREINIT CALL DSRTC_PREINIT
#ENDIF #ENDIF
; ;
#IF (DSKYENABLE)
#IF (ICMENABLE)
CALL ICM_PREINIT
#ENDIF
#ENDIF
;
#IF (DSKYENABLE)
#IF (PKDENABLE)
CALL PKD_PREINIT
#ENDIF
#ENDIF
;
#IF (DSKYENABLE)
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 (SKZENABLE) #IF (SKZENABLE)
; ;
; SET THE SK Z80-512K UART CLK2 DIVIDER AS ; SET THE SK Z80-512K UART CLK2 DIVIDER AS
@ -2211,22 +2239,6 @@ NOT_REC_M0:
#ENDIF #ENDIF
CALL CALLLIST ; PROCESS THE PRE-INIT CALL TABLE CALL CALLLIST ; PROCESS THE PRE-INIT CALL TABLE
; ;
#IF (DSKYENABLE)
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
CALL DSKY_SHOW
#ENDIF
;
#IF FALSE #IF FALSE
; ;
; TEST DEBUG *************************************************************************************** ; TEST DEBUG ***************************************************************************************
@ -3078,9 +3090,6 @@ HB_INITRLEN .EQU (($ - HB_INIT_REC) / 2)
;================================================================================================== ;==================================================================================================
; ;
HB_PCINITTBL: HB_PCINITTBL:
#IF (DSKYENABLE)
.DW DSKY_PREINIT
#ENDIF
#IF (ASCIENABLE) #IF (ASCIENABLE)
.DW ASCI_PREINIT .DW ASCI_PREINIT
#ENDIF #ENDIF
@ -3128,7 +3137,14 @@ HB_INITTBL:
.DW CTC_INIT .DW CTC_INIT
#ENDIF #ENDIF
#IF (DSKYENABLE) #IF (DSKYENABLE)
.DW DSKY_INIT
#IF (ICMENABLE)
.DW ICM_INIT
#ENDIF
#ENDIF
#IF (DSKYENABLE)
#IF (PKDENABLE)
.DW PKD_INIT
#ENDIF
#ENDIF #ENDIF
#IF (AY38910ENABLE) #IF (AY38910ENABLE)
.DW AY38910_INIT ; AUDIBLE INDICATOR OF BOOT START .DW AY38910_INIT ; AUDIBLE INDICATOR OF BOOT START
@ -3212,9 +3228,6 @@ HB_INITTBL:
#IF (VRCENABLE) #IF (VRCENABLE)
.DW VRC_INIT .DW VRC_INIT
#ENDIF #ENDIF
;#IF (DSKYENABLE)
; .DW DSKY_INIT
;#ENDIF
#IF (DMAENABLE) #IF (DMAENABLE)
.DW DMA_INIT .DW DMA_INIT
#ENDIF #ENDIF
@ -3322,8 +3335,8 @@ HB_DISPATCH1:
JP C,DIO_DISPATCH JP C,DIO_DISPATCH
CP BF_RTC + $10 ; $20-$2F: REAL TIME CLOCK (RTC) CP BF_RTC + $10 ; $20-$2F: REAL TIME CLOCK (RTC)
JP C,RTC_DISPATCH JP C,RTC_DISPATCH
CP BF_EMU + $10 ; $30-$3F: EMULATION
JR C,HB_DISPERR
CP BF_DSKY + $10 ; $30-$3F: DSKY
JP C,DSKY_DISPATCH
CP BF_VDA + $10 ; $40-$4F: VIDEO DISPLAY ADAPTER CP BF_VDA + $10 ; $40-$4F: VIDEO DISPLAY ADAPTER
JP C,VDA_DISPATCH JP C,VDA_DISPATCH
CP BF_SND + $08 ; $50-$58: SOUND DRIVERS CP BF_SND + $08 ; $50-$58: SOUND DRIVERS
@ -3691,6 +3704,7 @@ HB_DSKUNIT .DB 0 ; CURRENT DISK UNIT
HB_DSKFUNC .DB 0 ; CURRENT DISK FUNCTION HB_DSKFUNC .DB 0 ; CURRENT DISK FUNCTION
; ;
#IF (DSKYENABLE) #IF (DSKYENABLE)
#IF (DSKYDSKACT)
; ;
;================================================================================================== ;==================================================================================================
; DSKY DISK ACTIVITY MONITOR ; DSKY DISK ACTIVITY MONITOR
@ -3740,7 +3754,8 @@ HB_DSKACT2:
LD (DSKY_BUF+7),A ; SAVE IT LD (DSKY_BUF+7),A ; SAVE IT
HB_DSKACT3: HB_DSKACT3:
EX DE,HL ; SEG DISPLAY BUF TO HL EX DE,HL ; SEG DISPLAY BUF TO HL
CALL DSKY_SHOW ; DISPLAY ON DSKY
LD B,BF_DSKYSHOWSEG
CALL DSKY_DISPATCH
POP HL POP HL
POP DE POP DE
POP BC POP BC
@ -3780,6 +3795,7 @@ HB_DSKACTCHS:
LD (DE),A ; ADD TO BUF LD (DE),A ; ADD TO BUF
JR HB_DSKACT2 JR HB_DSKACT2
; ;
#ENDIF
#ENDIF #ENDIF
; ;
;================================================================================================== ;==================================================================================================
@ -3815,6 +3831,38 @@ RTC_DISPADR .DW RTC_DISPERR ; RTC DISPATCH ADDRESS
RTC_DISPACT .DB 0 ; SET WHEN DISPADR SET RTC_DISPACT .DB 0 ; SET WHEN DISPADR SET
; ;
;================================================================================================== ;==================================================================================================
; DSKY DEVICE DISPATCHER
;==================================================================================================
;
; ROUTE CALL TO DSKY DRIVER
; B: FUNCTION
;
DSKY_DISPATCH:
PUSH HL ; SAVE INCOMING HL
LD HL,(DSKY_DISPADR) ;
EX (SP),HL
RET
;
DSKY_DISPERR:
SYSCHKERR(ERR_NOHW)
RET
;
; SET DSKY DISPATCH ADDRESS, USED BY DSKY DRIVERS DURING INIT
; BC HAS ADDRESS OF DISPATCH ADDRESS
; WILL ONLY SAVE THE FIRST ADDRESS SET
;
DSKY_SETDISP:
LD (DSKY_DISPADR),BC ; SAVE THE ADDRESS
OR $FF ; FLAG ACTIVE VALUE
LD (DSKY_DISPACT),A ; SAVE IT
RET ; AND DONE
;
;
;
DSKY_DISPADR .DW DSKY_DISPERR ; DSKY DISPATCH ADDRESS
DSKY_DISPACT .DB 0 ; SET WHEN DISPADR SET
;
;==================================================================================================
; VIDEO DISPLAY ADAPTER DEVICE DISPATCHER ; VIDEO DISPLAY ADAPTER DEVICE DISPATCHER
;================================================================================================== ;==================================================================================================
; ;
@ -4216,6 +4264,8 @@ SYS_GET:
JP Z,SYS_GETDIOFN JP Z,SYS_GETDIOFN
CP BF_SYSGET_RTCCNT CP BF_SYSGET_RTCCNT
JP Z,SYS_GETRTCCNT JP Z,SYS_GETRTCCNT
CP BF_SYSGET_DSKYCNT
JP Z,SYS_GETDSKYCNT
CP BF_SYSGET_VDACNT CP BF_SYSGET_VDACNT
JP Z,SYS_GETVDACNT JP Z,SYS_GETVDACNT
CP BF_SYSGET_VDAFN CP BF_SYSGET_VDAFN
@ -4303,6 +4353,18 @@ SYS_GETRTCCNT1:
XOR A ; SIGNALS SUCCESS XOR A ; SIGNALS SUCCESS
RET RET
; ;
; GET DSKY UNIT COUNT
;
SYS_GETDSKYCNT:
LD E,0 ; ASSUME 0 RTC DEVICES
LD A,(DSKY_DISPACT) ; IS DSKY ACTIVE?
OR A ; SET FLAGS
JR Z,SYS_GETDSKYCNT1 ; IF NONE, DONE
INC E ; SET ONE DEVICE
SYS_GETDSKYCNT1:
XOR A ; SIGNALS SUCCESS
RET
;
; GET VIDEO UNIT COUNT ; GET VIDEO UNIT COUNT
; ;
SYS_GETVDACNT: SYS_GETVDACNT:
@ -5069,6 +5131,50 @@ HB_IM1PTR .DW HB_IVT ; POINTER FOR NEXT IM1 ENTRY
; ;
#ENDIF #ENDIF
; ;
#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:
PUSH HL
PUSH DE
LD B,4 ; 4 BYTES OF INPUT
EX DE,HL
DSKY_BIN2SEG1:
LD A,(DE) ; FIRST NIBBLE
SRL A
SRL A
SRL A
SRL A
PUSH HL
LD HL,DSKY_HEXMAP
CALL ADDHLA
LD A,(HL)
POP HL
LD (HL),A
INC HL
LD A,(DE) ; SECOND NIBBLE
AND 0FH
PUSH HL
LD HL,DSKY_HEXMAP
CALL ADDHLA
LD A,(HL)
POP HL
LD (HL),A
INC HL
INC DE ; NEXT BYTE
DJNZ DSKY_BIN2SEG1
POP DE
POP HL
RET
;
#ENDIF
;
; ;
; ;
#IF (MEMMGR == MM_Z280) #IF (MEMMGR == MM_Z280)
@ -5966,6 +6072,28 @@ Z280_SYSCALL_GO:
; DEVICE DRIVERS ; DEVICE DRIVERS
;================================================================================================== ;==================================================================================================
; ;
#IF (DSKYENABLE)
#IF (ICMENABLE)
ORG_ICM .EQU $
#INCLUDE "icm.asm"
SIZ_ICM .EQU $ - ORG_ICM
.ECHO "ICM occupies "
.ECHO SIZ_ICM
.ECHO " bytes.\n"
#ENDIF
#ENDIF
;
#IF (DSKYENABLE)
#IF (PKDENABLE)
ORG_PKD .EQU $
#INCLUDE "pkd.asm"
SIZ_PKD .EQU $ - ORG_PKD
.ECHO "PKD occupies "
.ECHO SIZ_PKD
.ECHO " bytes.\n"
#ENDIF
#ENDIF
;
#IF (DSRTCENABLE) #IF (DSRTCENABLE)
ORG_DSRTC .EQU $ ORG_DSRTC .EQU $
#INCLUDE "dsrtc.asm" #INCLUDE "dsrtc.asm"
@ -6461,16 +6589,6 @@ SIZ_YM2612 .EQU $ - ORG_YM2612
#INCLUDE "mio.asm" #INCLUDE "mio.asm"
#ENDIF #ENDIF
; ;
#IF (DSKYENABLE)
#DEFINE DSKY_KBD
#IF (DSKYMODE == DSKYMODE_V1)
#INCLUDE "dsky.asm"
#ENDIF
#IF (DSKYMODE == DSKYMODE_NG)
#INCLUDE "dskyng.asm"
#ENDIF
#ENDIF
;
; INCLUDE LZSA2 decompression engine if required. ; INCLUDE LZSA2 decompression engine if required.
; ;
#IF ((VGAENABLE | CVDUENABLE | TMSENABLE | GDCENABLE | VRCENABLE) & USELZSA2) #IF ((VGAENABLE | CVDUENABLE | TMSENABLE | GDCENABLE | VRCENABLE) & USELZSA2)
@ -7560,12 +7678,7 @@ STR_CONTINUE .TEXT "\r\nContinue (Y/N)? $"
STR_RESTART .TEXT "\r\n\r\n>>> Press hardware reset button to restart system\r\n\r\n$" STR_RESTART .TEXT "\r\n\r\n>>> Press hardware reset button to restart system\r\n\r\n$"
; ;
#IF (DSKYENABLE) ; 'H','B','I','O',' ',' ',' ',' ' #IF (DSKYENABLE) ; 'H','B','I','O',' ',' ',' ',' '
#IF (DSKYMODE == DSKYMODE_V1)
MSG_HBVER .DB $3E,$7F,$0A,$7B,$00,$00,$00,$00 ; "HBIO "
#ENDIF
#IF (DSKYMODE == DSKYMODE_NG)
MSG_HBVER .DB $76,$7F,$30,$3F,$00,$00,$00,$00 ; "HBIO " MSG_HBVER .DB $76,$7F,$30,$3F,$00,$00,$00,$00 ; "HBIO "
#ENDIF
#ENDIF #ENDIF
; ;
HB_APPBNK .DB 0 ; START BANK WHEN RUN IN APP MODE HB_APPBNK .DB 0 ; START BANK WHEN RUN IN APP MODE
@ -7628,6 +7741,41 @@ MG014_STATMAPHI:
; ;
#ENDIF #ENDIF
; ;
#IF (DSKYENABLE)
;
;==================================================================================================
; STORAGE
;==================================================================================================
;
; CODES FOR NUMERICS
; HIGH BIT ALWAYS CLEAR TO SUPPRESS DECIMAL POINT
; SET HIGH BIT TO SHOW DECIMAL POINT
;
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_END .EQU $ HB_END .EQU $
; ;
SLACK .EQU BNKTOP - $ SLACK .EQU BNKTOP - $

48
Source/HBIOS/hbios.inc

@ -36,7 +36,16 @@ BF_RTCGETALM .EQU BF_RTC + 6 ; GET ALARM
BF_RTCSETALM .EQU BF_RTC + 7 ; SET ALARM BF_RTCSETALM .EQU BF_RTC + 7 ; SET ALARM
BF_RTCDEVICE .EQU BF_RTC + 8 ; RTC DEVICE INFO REPORT BF_RTCDEVICE .EQU BF_RTC + 8 ; RTC DEVICE INFO REPORT
; ;
BF_EMU .EQU $30 ; DEPRECATED
BF_DSKY .EQU $30
BF_DSKYRESET .EQU BF_DSKY + 0 ; RESET DSKY HARDWARE
BF_DSKYSTAT .EQU BF_DSKY + 1 ; GET KEYPAD STATUS
BF_DSKYGETKEY .EQU BF_DSKY + 2 ; GET KEY FROM KEYPAD
BF_DSKYSHOWHEX .EQU BF_DSKY + 3 ; DISPLAY BINARY VALUE IN HEX
BF_DSKYSHOWSEG .EQU BF_DSKY + 4 ; DISPLAY ENCODED SEGMENT STRING
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_VDA .EQU $40 BF_VDA .EQU $40
BF_VDAINI .EQU BF_VDA + 0 ; INITIALIZE VDU BF_VDAINI .EQU BF_VDA + 0 ; INITIALIZE VDU
@ -98,6 +107,7 @@ BF_SYSGET_CIOFN .EQU $01 ; GET CIO UNIT FN/DATA ADR
BF_SYSGET_DIOCNT .EQU $10 ; GET DISK UNIT COUNT BF_SYSGET_DIOCNT .EQU $10 ; GET DISK UNIT COUNT
BF_SYSGET_DIOFN .EQU $11 ; GET DIO UNIT FN/DATA ADR BF_SYSGET_DIOFN .EQU $11 ; GET DIO UNIT FN/DATA ADR
BF_SYSGET_RTCCNT .EQU $20 ; GET RTC UNIT COUNT BF_SYSGET_RTCCNT .EQU $20 ; GET RTC UNIT COUNT
BF_SYSGET_DSKYCNT .EQU $30 ; GET DSKY UNIT COUNT
BF_SYSGET_VDACNT .EQU $40 ; GET VDA UNIT COUNT BF_SYSGET_VDACNT .EQU $40 ; GET VDA UNIT COUNT
BF_SYSGET_VDAFN .EQU $41 ; GET VDA UNIT FN/DATA ADR BF_SYSGET_VDAFN .EQU $41 ; GET VDA UNIT FN/DATA ADR
BF_SYSGET_SNDCNT .EQU $50 ; GET VDA UNIT COUNT BF_SYSGET_SNDCNT .EQU $50 ; GET VDA UNIT COUNT
@ -334,6 +344,11 @@ RTCDEV_INT .EQU $30 ; PERIODIC INT TIMER
RTCDEV_DS7 .EQU $40 ; DS1307 (I2C) RTCDEV_DS7 .EQU $40 ; DS1307 (I2C)
RTCDEV_RP5 .EQU $50 ; RP5C01 RTCDEV_RP5 .EQU $50 ; RP5C01
; ;
; DSKY DEVICE IDS
;
DSKYDEV_ICM .EQU $00 ; Intersil ICM7218
DSKYDEV_PKD .EQU $10 ; Intel P8279
;
; VIDEO DEVICE IDS ; VIDEO DEVICE IDS
; ;
VDADEV_VDU .EQU $00 ; ECB VDU - MOTOROLA 6545 VDADEV_VDU .EQU $00 ; ECB VDU - MOTOROLA 6545
@ -350,6 +365,37 @@ SNDDEV_AY38910 .EQU $10
SNDDEV_BITMODE .EQU $20 SNDDEV_BITMODE .EQU $20
SNDDEV_YM2612 .EQU $30 SNDDEV_YM2612 .EQU $30
; ;
; DSKY KEYS
;
KY_0 .EQU $00
KY_1 .EQU $01
KY_2 .EQU $02
KY_3 .EQU $03
KY_4 .EQU $04
KY_5 .EQU $05
KY_6 .EQU $06
KY_7 .EQU $07
KY_8 .EQU $08
KY_9 .EQU $09
KY_A .EQU $0A
KY_B .EQU $0B
KY_C .EQU $0C
KY_D .EQU $0D
KY_E .EQU $0E
KY_F .EQU $0F
KY_FW .EQU $10 ; FORWARD
KY_BK .EQU $11 ; BACKWARD
KY_CL .EQU $12 ; CLEAR
KY_EN .EQU $13 ; ENTER
KY_DE .EQU $14 ; DEPOSIT
KY_EX .EQU $15 ; EXAMINE
KY_GO .EQU $16 ; GO
KY_BO .EQU $17 ; BOOT
KY_F4 .EQU $18 ; F4
KY_F3 .EQU $19 ; F3
KY_F2 .EQU $1A ; F2
KY_F1 .EQU $1B ; F1
;
; HBIOS CONTROL BLOCK OFFSETS ; HBIOS CONTROL BLOCK OFFSETS
; WARNING: THESE OFFSETS WILL CHANGE SIGNIFICANTLY BETWEEN RELEASES ; WARNING: THESE OFFSETS WILL CHANGE SIGNIFICANTLY BETWEEN RELEASES
; IT IS STRONGLY RECOMMENDED THAT YOU DO NOT USE THEM! ; IT IS STRONGLY RECOMMENDED THAT YOU DO NOT USE THEM!

2
Source/HBIOS/hdsk.asm

@ -234,9 +234,11 @@ HDSK_RW0:
LD (HDSK_RC),A ; CLEAR RETURN CODE LD (HDSK_RC),A ; CLEAR RETURN CODE
; ;
#IF (DSKYENABLE) #IF (DSKYENABLE)
#IF (DSKYDSKACT)
LD A,HDSK_LBA LD A,HDSK_LBA
CALL LDHLIYA CALL LDHLIYA
CALL HB_DSKACT ; SHOW ACTIVITY CALL HB_DSKACT ; SHOW ACTIVITY
#ENDIF
#ENDIF #ENDIF
; ;
; CONVERT LBA HHHH:LLLL (4 BYTES) ; CONVERT LBA HHHH:LLLL (4 BYTES)

354
Source/HBIOS/icm.asm

@ -0,0 +1,354 @@
;
;==================================================================================================
; DSKY V1 ICM7218 (DISPLAY AND KEYBOARD) ROUTINES
;==================================================================================================
;
; THE ICM MAY COINCIDE ON THE SAME PPI BUS AS A PPISD. IT MAY NOT
; SHARE A PPI BUS WITH A PPIDE. SEE PPI_BUS.TXT FOR MORE INFORMATION.
;
; LED SEGMENTS (BIT VALUES)
;
; +--40--+
; 02 20
; +--04--+
; 08 10
; +--01--+ 80
;
; ICM SCAN CODES ARE ONE BYTE: CCRRRRRR
; BITS 7-6 IDENTFY THE COLUMN OF THE KEY PRESSED
; BITS 5-0 ARE A BITMAP, WITH A BIT ON TO INDICATE ROW OF KEY PRESSED
;
; ____PC0________PC1________PC2________PC3____
; PB5 | $20 [D] $60 [E] $A0 [F] $E0 [BO]
; PB4 | $10 [A] $50 [B] $90 [C] $D0 [GO]
; PB3 | $08 [7] $48 [8] $88 [9] $C8 [EX]
; PB2 | $04 [4] $44 [5] $84 [6] $C4 [DE]
; PB1 | $02 [1] $42 [2] $82 [3] $C2 [EN]
; 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_INIT__________________________________________________________________________________________
;
; CONFIGURE PARALLEL PORT AND CLEAR KEYPAD BUFFER
;____________________________________________________________________________________________________
;
ICM_PREINIT:
LD A,(DSKY_DISPACT) ; DSKY DISPATCHER ALREADY SET?
OR A ; SET FLAGS
RET NZ ; IF ALREADY ACTIVE, ABORT
;
OR $FF ; SIGNAL TO WAIT FOR KEY RELEASE
LD (ICM_KEYBUF),A ; SET IT
;
; PPI PORT B IS NORMALLY SET TO INPUT, BUT HERE WE
; TEMPORARILY SET IT TO OUTPUT. WHILE IN OUTPUT MODE, WE
; WRITE A VALUE OF $FF WHICH WILL BE PERSISTED BY THE PPI
; CHIP BUS HOLD CIRCUIT IF THERE IS NO ICM PRESENT. SO,
; WE CAN SUBSEQUENTLY TEST FOR PPIB=$FF TO SEE IF THERE IS
; NO ICM AND PREVENT PROBLEMS WITH PHANTOM ICM KEY PRESSES.
; IF A ICM IS PRESENT, IT WILL SIMPLY OVERPOWER THE PPI
; BUS HOLD CIRCUIT.
LD A,$80 ; PA OUT, PB OUT, PC OUT
OUT (ICM_PPIX),A
LD A,$FF ; SET PPIB=$FF, BUS HOLD
OUT (ICM_PPIB),A
;
LD A,$82 ; PA OUT, PB IN, PC OUT
OUT (ICM_PPIX),A
;
;IN A,(ICM_PPIB) ; *DEBUG*
;CALL PRTHEXBYTE ; *DEBUG*
;
IN A,(ICM_PPIB) ; READ PPIB
XOR $FF ; INVERT RESULT
;
CALL ICM_RESET
;
RET Z ; BAIL OUT NOW IF NOT PRESENT
;
; RECORD HARDWARE PRESENT
LD A,$FF
LD (ICM_PRESENT),A
;
; REGISTER DRIVER WITH HBIOS
LD BC,ICM_DISPATCH
CALL DSKY_SETDISP
;
RET
;
ICM_INIT:
CALL NEWLINE ; FORMATTING
PRTS("ICM:$") ; FORMATTING
;
PRTS(" IO=0x$") ; FORMATTING
LD A,ICMPPIBASE ; GET BASE PORT
CALL PRTHEXBYTE ; PRINT BASE PORT
;
LD A,(ICM_PRESENT) ; PRESENT?
OR A ; SET FLAGS
RET NZ ; YES, ALL DONE
PRTS(" NOT PRESENT$") ; NOT PRESENT
;
RET
;
; ICM DEVICE FUNCTION DISPATCH ENTRY
; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR
; B: FUNCTION (IN)
;
ICM_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JP Z,ICM_RESET ; RESET DSKY HARDWARE
DEC A
JP Z,ICM_STAT ; GET KEYPAD STATUS
DEC A
JP Z,ICM_GETKEY ; READ A KEY FROM THE KEYPAD
DEC A
JP Z,ICM_SHOWHEX ; DISPLAY A 32-BIT BINARY VALUE IN HEX
DEC A
JP Z,ICM_SHOWSEG ; DISPLAY SEGMENTS
DEC A
JP Z,ICM_KEYLEDS ; SET KEYPAD LEDS
DEC A
JP Z,ICM_STATLED ; SET STATUS LED
DEC A
JP Z,ICM_BEEP ; BEEP DSKY SPEAKER
DEC A
JP Z,ICM_DEVICE ; DEVICE INFO
SYSCHKERR(ERR_NOFUNC)
RET
;
;
;
ICM_RESET:
PUSH AF
LD A,$70 ; PPISD AND 7218 INACTIVE
OUT (ICM_PPIC),A
POP AF
RET
;
; CHECK FOR KEY PRESS, SAVE RAW VALUE, RETURN STATUS
;
ICM_STAT:
LD A,(ICM_KEYBUF) ; GET CURRENT BUF VAL
CP $FF ; $FF MEANS WE ARE WAITING FOR PREV KEY TO BE RELEASED
JR Z,ICM_STAT1 ; CHECK FOR PREV KEY RELEASE
OR A ; DO WE HAVE A SCAN CODE BUFFERED ALREADY?
RET NZ ; IF SO, WE ARE DONE
JR ICM_STAT2 ; OTHERWISE, DO KEY CHECK
ICM_STAT1:
; WAITING FOR PREVIOUS KEY RELEASE
CALL ICM_KEY ; SCAN
JR Z,ICM_STAT2 ; IF ZERO, PREV KEY RELEASED, CONTINUE
XOR A ; SIGNAL NO KEY PRESSED
RET ; AND DONE
ICM_STAT2:
CALL ICM_KEY ; SCAN
LD (ICM_KEYBUF),A ; SAVE RESULT
RET ; RETURN WITH ZF SET APPROPRIATELY
;
; WAIT FOR A ICM KEYPRESS AND RETURN
;
ICM_GETKEY:
CALL ICM_STAT ; CHECK STATUS
JR Z,ICM_GETKEY ; LOOP IF NOTHING READY
LD A,(ICM_KEYBUF)
LD B,24 ; SIZE OF DECODE TABLE
LD C,0 ; INDEX
LD HL,ICM_KEYMAP ; POINT TO BEGINNING OF TABLE
ICM_GETKEY1:
CP (HL) ; MATCH?
JR Z,ICM_GETKEY2 ; FOUND, DONE
INC HL
INC C ; BUMP INDEX
DJNZ ICM_GETKEY1 ; LOOP UNTIL EOT
ICM_GETKEY1A:
LD A,$FF ; NOT FOUND ERR, RETURN $FF
RET
ICM_GETKEY2:
LD A,$FF ; SET KEY BUF TO $FF
LD (ICM_KEYBUF),A ; DO IT
; RETURN THE INDEX POSITION WHERE THE SCAN CODE WAS FOUND
LD E,C ; RETURN INDEX VALUE
XOR A ; SIGNAL SUCCESS
RET
;
;
;
ICM_SHOWHEX:
XOR A ; SIGNAL SUCCESS
RET
;
; 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
XOR A ; SIGNAL SUCCESS
RET
;
;
;
ICM_KEYLEDS:
ICM_STATLED:
ICM_BEEP:
XOR A ; PRETEND SUCCESS
RET
;
; DEVICE INFORMATION
;
ICM_DEVICE:
LD D,DSKYDEV_ICM ; D := DEVICE TYPE
LD E,0 ; E := PHYSICAL DEVICE NUMBER
LD H,0 ; H := MODE
LD L,ICMPPIBASE ; L := BASE I/O ADDRESS
XOR A ; SIGNAL SUCCESS
RET
;
;__ICM_KEY___________________________________________________________________________________________
;
; CHECK FOR KEY PRESS W/ DEBOUNCE
;____________________________________________________________________________________________________
;
ICM_KEY:
CALL ICM_SCAN ; INITIAL KEY PRESS SCAN
LD E,A ; SAVE INITIAL SCAN VALUE
ICM_KEY1:
; MAX BOUNCE TIME FOR OMRON B3F IS 3MS
PUSH DE ; SAVE DE
LD DE,300 ; ~3MS DELAY
CALL VDELAY ; DO IT
CALL ICM_SCAN ; REPEAT SCAN
POP DE ; RESTORE DE
RET Z ; IF NOTHING PRESSED, DONE
CP E ; SAME?
JR ICM_KEY2 ; YES, READY TO RETURN
LD E,A ; OTHERWISE, SAVE NEW SCAN VAL
JR ICM_KEY1 ; AND LOOP UNTIL STABLE VALUE
ICM_KEY2:
OR A ; SET FLAGS BASED ON VALUE
RET ; AND DONE
;
;__ICM_SCAN__________________________________________________________________________________________
;
; SCAN KEYPAD AND RETURN RAW SCAN CODE (RETURNS ZERO IF NO KEY PRESSED)
;____________________________________________________________________________________________________
;
ICM_SCAN:
LD B,4 ; 4 COLUMNS
LD C,$01 ; FIRST COLUMN
LD E,0 ; INITIAL COL ID
ICM_SCAN1:
LD A,C ; COL TO A
OR $70 ; KEEP PPISD AND 7218 INACTIVE
OUT (ICM_PPIC),A ; ACTIVATE COL
IN A,(ICM_PPIB) ; READ ROW BITS
AND $3F ; MASK, WE ONLY HAVE 6 ROWS, OTHERS UNDEFINED
JR NZ,ICM_SCAN2 ; IF NOT ZERO, GOT SOMETHING
RLC C ; NEXT COL
INC E ; BUMP COL ID
DJNZ ICM_SCAN1 ; LOOP THROUGH ALL COLS
XOR A ; NOTHING FOUND, RETURN ZERO
JP ICM_RESET ; RETURN VIA RESET
ICM_SCAN2:
RRC E ; MOVE COL ID
RRC E ; ... TO HIGH BITS 6 & 7
OR E ; COMBINE WITH ROW
JP ICM_RESET ; RETURN VIA RESET
;
;
; 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
;
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:
INC HL
DJNZ ICM_XLAT1
POP HL
POP BC
RET
;
ICM_XTBL .DB $40, $20, $10, $01, $08, $02, $04, $80
;
;_ _TABLE_____________________________________________________________________________________________________________
;
ICM_KEYMAP:
; POS $00 $01 $02 $03 $04 $05 $06 $07
; KEY [0] [1] [2] [3] [4] [5] [6] [7]
.DB $41, $02, $42, $82, $04, $44, $84, $08
;
; POS $08 $09 $0A $0B $0C $0D $0E $0F
; KEY [8] [9] [A] [B] [C] [D] [E] [F]
.DB $48, $88, $10, $50, $90, $20, $60, $A0
;
; POS $10 $11 $12 $13 $14 $15 $16 $17
; KEY [FW] [BK] [CL] [EN] [DE] [EX] [GO] [BO]
.DB $01, $81, $C1, $C2, $C4, $C8, $D0, $E0
;
; KBD WORKING STORAGE
;
ICM_KEYBUF .DB 0
;
;==================================================================================================
; UTILTITY FUNCTIONS
;==================================================================================================
;
;
;==================================================================================================
; STORAGE
;==================================================================================================
;
; SEG DISPLAY WORKING STORAGE
;
ICM_PRESENT .DB 0

6
Source/HBIOS/ide.asm

@ -794,9 +794,11 @@ IDE_PKT_RDSEC:
; SETUP LBA ; SETUP LBA
; ;
#IF (DSKYENABLE) #IF (DSKYENABLE)
#IF (DSKYDSKACT)
LD A,IDE_LBA LD A,IDE_LBA
CALL LDHLIYA CALL LDHLIYA
CALL HB_DSKACT ; SHOW ACTIVITY CALL HB_DSKACT ; SHOW ACTIVITY
#ENDIF
#ENDIF #ENDIF
; ;
; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN
@ -861,9 +863,11 @@ IDE_PKT_WRSEC:
; SETUP LBA ; SETUP LBA
; ;
#IF (DSKYENABLE) #IF (DSKYENABLE)
#IF (DSKYDSKACT)
LD A,IDE_LBA LD A,IDE_LBA
CALL LDHLIYA CALL LDHLIYA
CALL HB_DSKACT ; SHOW ACTIVITY CALL HB_DSKACT ; SHOW ACTIVITY
#ENDIF
#ENDIF #ENDIF
; ;
; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN
@ -891,9 +895,11 @@ IDE_PKT_WRSEC:
IDE_SETADDR: IDE_SETADDR:
; ;
#IF (DSKYENABLE) #IF (DSKYENABLE)
#IF (DSKYDSKACT)
LD A,IDE_LBA LD A,IDE_LBA
CALL LDHLIYA CALL LDHLIYA
CALL HB_DSKACT ; SHOW ACTIVITY CALL HB_DSKACT ; SHOW ACTIVITY
#ENDIF
#ENDIF #ENDIF
; SEND 3 LOWEST BYTES OF LBA IN REVERSE ORDER ; SEND 3 LOWEST BYTES OF LBA IN REVERSE ORDER
; IDE_REG_LBA3 HAS ALREADY BEEN SET ; IDE_REG_LBA3 HAS ALREADY BEEN SET

2
Source/HBIOS/imm.asm

@ -344,9 +344,11 @@ IMM_IO:
LD (IMM_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS LD (IMM_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
; ;
#IF (DSKYENABLE) #IF (DSKYENABLE)
#IF (DSKYDSKACT)
LD A,IMM_LBA LD A,IMM_LBA
CALL LDHLIYA CALL LDHLIYA
CALL HB_DSKACT ; SHOW ACTIVITY CALL HB_DSKACT ; SHOW ACTIVITY
#ENDIF
#ENDIF #ENDIF
; ;
; SETUP LBA ; SETUP LBA

2
Source/HBIOS/md.asm

@ -303,9 +303,11 @@ MD_RW1:
PUSH BC ; SAVE COUNTERS PUSH BC ; SAVE COUNTERS
; ;
#IF (DSKYENABLE) #IF (DSKYENABLE)
#IF (DSKYDSKACT)
LD A,MD_LBA LD A,MD_LBA
CALL LDHLIYA CALL LDHLIYA
CALL HB_DSKACT ; SHOW ACTIVITY CALL HB_DSKACT ; SHOW ACTIVITY
#ENDIF
#ENDIF #ENDIF
; ;
LD HL,(MD_RWFNADR) ; GET PENDING IO FUNCTION ADDRESS LD HL,(MD_RWFNADR) ; GET PENDING IO FUNCTION ADDRESS

726
Source/HBIOS/dskyng.asm → Source/HBIOS/pkd.asm

File diff suppressed because it is too large

2
Source/HBIOS/ppa.asm

@ -340,9 +340,11 @@ PPA_IO:
LD (PPA_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS LD (PPA_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
; ;
#IF (DSKYENABLE) #IF (DSKYENABLE)
#IF (DSKYDSKACT)
LD A,PPA_LBA LD A,PPA_LBA
CALL LDHLIYA CALL LDHLIYA
CALL HB_DSKACT ; SHOW ACTIVITY CALL HB_DSKACT ; SHOW ACTIVITY
#ENDIF
#ENDIF #ENDIF
; ;
; SETUP LBA ; SETUP LBA

25
Source/HBIOS/ppide.asm

@ -800,9 +800,11 @@ PPIDE_PKT_RDSEC:
; SETUP LBA ; SETUP LBA
; ;
#IF (DSKYENABLE) #IF (DSKYENABLE)
#IF (DSKYDSKACT)
LD A,PPIDE_LBA LD A,PPIDE_LBA
CALL LDHLIYA CALL LDHLIYA
CALL HB_DSKACT ; SHOW ACTIVITY CALL HB_DSKACT ; SHOW ACTIVITY
#ENDIF
#ENDIF #ENDIF
; ;
; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN
@ -867,9 +869,11 @@ PPIDE_PKT_WRSEC:
; SETUP LBA ; SETUP LBA
; ;
#IF (DSKYENABLE) #IF (DSKYENABLE)
#IF (DSKYDSKACT)
LD A,PPIDE_LBA LD A,PPIDE_LBA
CALL LDHLIYA CALL LDHLIYA
CALL HB_DSKACT ; SHOW ACTIVITY CALL HB_DSKACT ; SHOW ACTIVITY
#ENDIF
#ENDIF #ENDIF
; ;
; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN
@ -897,9 +901,11 @@ PPIDE_PKT_WRSEC:
PPIDE_SETADDR: PPIDE_SETADDR:
; ;
#IF (DSKYENABLE) #IF (DSKYENABLE)
#IF (DSKYDSKACT)
LD A,PPIDE_LBA LD A,PPIDE_LBA
CALL LDHLIYA CALL LDHLIYA
CALL HB_DSKACT ; SHOW ACTIVITY CALL HB_DSKACT ; SHOW ACTIVITY
#ENDIF
#ENDIF #ENDIF
; SEND 3 LOWEST BYTES OF LBA IN REVERSE ORDER ; SEND 3 LOWEST BYTES OF LBA IN REVERSE ORDER
; IDE_REG_LBA3 HAS ALREADY BEEN SET ; IDE_REG_LBA3 HAS ALREADY BEEN SET
@ -1286,19 +1292,22 @@ PPIDE_RESET:
LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD
OUT (C),A ; WRITE IT OUT (C),A ; WRITE IT
; ;
; IF A DSKYNG IS ACTIVE AND IS ON THE SAME PPI PORT AS THE PPISD BEING
; IF A DSKYNG IS ACTIVE AND IS ON THE SAME PPI PORT AS THE PPIDE BEING
; RESET, THEN THE DSKYNG WILL ALSO BE RESET. SO, THE RESET CODE IS ; RESET, THEN THE DSKYNG WILL ALSO BE RESET. SO, THE RESET CODE IS
; BRACKETED WITH CODE TO SAVE AND RESTORE THE STATE OF THE DSKYNG. ; BRACKETED WITH CODE TO SAVE AND RESTORE THE STATE OF THE DSKYNG.
; THERE IS NO CHECK FOR THE SPECIFIC PPI PORT SINCE IT DOES NO HARM ; THERE IS NO CHECK FOR THE SPECIFIC PPI PORT SINCE IT DOES NO HARM
; IF THE DSKYNG IS SAVED AND RESTORED. ; IF THE DSKYNG IS SAVED AND RESTORED.
; ;
; THIS DOES NOT TEST THAT A DSKYNG IS ACTUALLY PRESENT
; AND OPERATING -- COULD CAUSE PROBLEMS
;
#IF (DSKYENABLE) #IF (DSKYENABLE)
#IF (DSKYMODE == DSKYMODE_NG)
; SAVE CONTENTS OF DSKY DISPLAY ACROSS RESET
#IF (PKDENABLE)
; SAVE CONTENTS OF DSKYNG DISPLAY ACROSS RESET
LD B,8 LD B,8
LD C,0 LD C,0
LD HL,DSKY_BUF LD HL,DSKY_BUF
CALL DSKY_GETSTR
CALL PKD_GETSTR
#ENDIF #ENDIF
#ENDIF #ENDIF
; ;
@ -1319,13 +1328,13 @@ PPIDE_RESET:
CALL VDELAY CALL VDELAY
; ;
#IF (DSKYENABLE) #IF (DSKYENABLE)
#IF (DSKYMODE == DSKYMODE_NG)
; REININT DSKY AND RESTORE CONTENTS
CALL DSKY_REINIT
#IF (PKDENABLE)
; REININT DSKYNG AND RESTORE CONTENTS
CALL PKD_REINIT
LD B,8 LD B,8
LD C,0 LD C,0
LD HL,DSKY_BUF LD HL,DSKY_BUF
CALL DSKY_PUTSTR
CALL PKD_PUTSTR
#ENDIF #ENDIF
#ENDIF #ENDIF
; ;

2
Source/HBIOS/ppp.asm

@ -942,7 +942,9 @@ PPPSD_SENDBLK:
LD A,PPPSD_LBA ; OFFSET OF LBA LD A,PPPSD_LBA ; OFFSET OF LBA
CALL LDHLIYA ; HL := IY + A, REG A TRASHED CALL LDHLIYA ; HL := IY + A, REG A TRASHED
#IF (DSKYENABLE) #IF (DSKYENABLE)
#IF (DSKYDSKACT)
CALL HB_DSKACT ; SHOW ACTIVITY CALL HB_DSKACT ; SHOW ACTIVITY
#ENDIF
#ENDIF #ENDIF
LD B,4 LD B,4
PPPSD_SENDBLK1: PPPSD_SENDBLK1:

2
Source/HBIOS/prp.asm

@ -876,7 +876,9 @@ PRPSD_SETBLK:
LD A,PRPSD_LBA ; OFFSET OF LBA LD A,PRPSD_LBA ; OFFSET OF LBA
CALL LDHLIYA ; HL := IY + A, REG A TRASHED CALL LDHLIYA ; HL := IY + A, REG A TRASHED
#IF (DSKYENABLE) #IF (DSKYENABLE)
#IF (DSKYDSKACT)
CALL HB_DSKACT ; SHOW ACTIVITY CALL HB_DSKACT ; SHOW ACTIVITY
#ENDIF
#ENDIF #ENDIF
OTIR OTIR
RET RET

2
Source/HBIOS/rf.asm

@ -314,9 +314,11 @@ RF_SETIO:
RF_SETADR: RF_SETADR:
; ;
#IF (DSKYENABLE) #IF (DSKYENABLE)
#IF (DSKYDSKACT)
LD A,RF_LBA LD A,RF_LBA
CALL LDHLIYA CALL LDHLIYA
CALL HB_DSKACT ; SHOW ACTIVITY CALL HB_DSKACT ; SHOW ACTIVITY
#ENDIF
#ENDIF #ENDIF
; ;
LD A,(RF_IO) ; OUTPUT THE LOGICAL BLOCK LD A,(RF_IO) ; OUTPUT THE LOGICAL BLOCK

143
Source/HBIOS/romldr.asm

@ -170,6 +170,16 @@ start1:
#if (INTMODE == 1) #if (INTMODE == 1)
ei ei
#endif #endif
;
#if (BIOS == BIOS_WBW)
; Check for DSKY and set flag
ld b,BF_SYSGET ; HBIOS func: get
ld c,BF_SYSGET_DSKYCNT ; get DSKY count
rst 08 ; do it
ld a,e ; put in A
ld (dskyact),a ; save it
#endif
; ;
;======================================================================= ;=======================================================================
; Loader prompt ; Loader prompt
@ -231,18 +241,11 @@ prompt:
call clrbuf ; zero fill the cmd buffer call clrbuf ; zero fill the cmd buffer
; ;
#if (DSKYENABLE) #if (DSKYENABLE)
call DSKY_PREINIT ; *** TEMPORARY ***
call DSKY_RESET ; clear DSKY
ld hl,msg_sel ; boot select msg ld hl,msg_sel ; boot select msg
call DSKY_SHOW ; show on DSKY
#if (DSKYMODE == DSKYMODE_NG)
call DSKY_PUTLED
.db $3f,$3f,$3f,$3f,$00,$00,$00,$00
call DSKY_BEEP
call DSKY_L2ON
#endif
call dsky_show ; show on DSKY
call dsky_highlightallkeys
call dsky_beep
call dsky_l2on
#endif #endif
; ;
wtkey: wtkey:
@ -251,8 +254,7 @@ wtkey:
jr nz,concmd ; if pending, do console command jr nz,concmd ; if pending, do console command
; ;
#if (DSKYENABLE) #if (DSKYENABLE)
call DSKY_STAT ; check DSKY for keypress
or a ; set flags
call dsky_stat ; check DSKY for keypress
jp nz,dskycmd ; if pending, do DSKY command jp nz,dskycmd ; if pending, do DSKY command
#endif #endif
; ;
@ -295,11 +297,8 @@ concmd:
call clrled ; clear LEDs call clrled ; clear LEDs
; ;
#if (DSKYENABLE) #if (DSKYENABLE)
#if (DSKYMODE == DSKYMODE_NG)
call DSKY_PUTLED
.db $00,$00,$00,$00,$00,$00,$00,$00
call DSKY_L2OFF
#endif
call dsky_highlightkeysoff
call dsky_l2off
#endif #endif
; ;
; Get a command line from console and handle it ; Get a command line from console and handle it
@ -516,15 +515,15 @@ fp_flopboot2:
dskycmd: dskycmd:
call clrled ; clear LEDs call clrled ; clear LEDs
; ;
call DSKY_GETKEY ; get DSKY key
call dsky_getkey ; get DSKY key
ld a,e ; put in A
cp $FF ; check for error cp $FF ; check for error
ret z ; abort if so ret z ; abort if so
; ;
#if (DSKYMODE == DSKYMODE_NG)
call DSKY_PUTLED
.db $00,$00,$00,$00,$00,$00,$00,$00
call DSKY_L2OFF
#endif
push af
call dsky_highlightkeysoff
call dsky_l2off
pop af
; ;
; Attempt built-in commands ; Attempt built-in commands
cp KY_BO ; reboot system cp KY_BO ; reboot system
@ -861,7 +860,7 @@ reboot:
; ;
#if (DSKYENABLE) #if (DSKYENABLE)
ld hl,msg_boot ; point to boot message ld hl,msg_boot ; point to boot message
call DSKY_SHOW ; display message
call dsky_show ; display message
#endif #endif
; ;
; cold boot system ; cold boot system
@ -893,7 +892,7 @@ romload:
; ;
#if (DSKYENABLE) #if (DSKYENABLE)
ld hl,msg_load ; point to load message ld hl,msg_load ; point to load message
call DSKY_SHOW ; display message
call dsky_show ; display message
#endif #endif
; ;
#if (BIOS == BIOS_WBW) #if (BIOS == BIOS_WBW)
@ -977,7 +976,7 @@ romload1:
; ;
#if (DSKYENABLE) #if (DSKYENABLE)
ld hl,msg_go ; point to go message ld hl,msg_go ; point to go message
call DSKY_SHOW ; display message
call dsky_show ; display message
#endif #endif
; ;
ld l,(ix+ra_ent) ; HL := app entry address ld l,(ix+ra_ent) ; HL := app entry address
@ -1002,7 +1001,7 @@ diskboot:
; ;
#if (DSKYENABLE) #if (DSKYENABLE)
ld hl,msg_load ; point to load message ld hl,msg_load ; point to load message
call DSKY_SHOW ; display message
call dsky_show ; display message
#endif #endif
; ;
#if (BIOS == BIOS_WBW) #if (BIOS == BIOS_WBW)
@ -1286,7 +1285,7 @@ diskboot10:
; ;
#if (DSKYENABLE) #if (DSKYENABLE)
ld hl,msg_go ; point to go message ld hl,msg_go ; point to go message
call DSKY_SHOW ; display message
call dsky_show ; display message
#endif #endif
; ;
; Jump to entry vector ; Jump to entry vector
@ -2061,6 +2060,60 @@ devunk .db "UNK",0
str_devlst .db "\r\n\r\nDisk Devices:",0 str_devlst .db "\r\n\r\nDisk Devices:",0
; ;
#endif #endif
#if (DSKYENABLE)
;
;=======================================================================
; DSKY interface routines
;=======================================================================
;
dsky_stat:
ld b,BF_DSKYSTAT
jr dsky_hbcall
;
dsky_getkey:
ld b,BF_DSKYGETKEY
jr dsky_hbcall
;
dsky_show:
ld b,BF_DSKYSHOWSEG
jr dsky_hbcall
;
dsky_beep:
ld b,BF_DSKYBEEP
jr dsky_hbcall
;
dsky_l2on:
ld e,1
jr dsky_statled
dsky_l2off:
ld e,0
dsky_statled:
ld b,BF_DSKYSTATLED
ld d,1
jr dsky_hbcall
;
dsky_putled:
ld b,BF_DSKYKEYLEDS
jr dsky_hbcall
;
dsky_highlightallkeys:
ld hl,dsky_highlightallkeyleds
jr dsky_putled
;
dsky_highlightkeysoff:
ld hl,dsky_highlightkeyledsoff
jr dsky_putled
;
dsky_hbcall:
ld a,(dskyact)
or a
ret z
rst 08
ret
;
#endif
; ;
;======================================================================= ;=======================================================================
; Error handlers ; Error handlers
@ -2116,22 +2169,6 @@ str_err_sig .db "No system image on disk",0
str_err_api .db "Unexpected hardware BIOS API failure",0 str_err_api .db "Unexpected hardware BIOS API failure",0
; ;
;======================================================================= ;=======================================================================
; Includes
;=======================================================================
;
#if (DSKYENABLE)
#define DSKY_KBD
#if (DSKYMODE == DSKYMODE_V1)
VDELAY .equ vdelay
DLY2 .equ dly2
#include "dsky.asm"
#endif
#if (DSKYMODE == DSKYMODE_NG)
#include "dskyng.asm"
#endif
#endif
;
;=======================================================================
; Working data storage (initialized) ; Working data storage (initialized)
;======================================================================= ;=======================================================================
; ;
@ -2179,21 +2216,20 @@ str_help .db "\r\n"
.db 0 .db 0
; ;
#if (DSKYENABLE) #if (DSKYENABLE)
#if (DSKYMODE == DSKYMODE_V1)
msg_sel .db $7f,$1d,$1d,$0f,$6c,$00,$00,$00 ; "boot? "
msg_boot .db $7f,$1d,$1d,$0f,$80,$80,$80,$00 ; "boot... "
msg_load .db $0b,$1d,$7d,$3d,$80,$80,$80,$00 ; "load... "
msg_go .db $5b,$1d,$80,$80,$80,$00,$00,$00 ; "go... "
#endif
#if (DSKYMODE == DSKYMODE_NG)
msg_sel .db $7f,$5c,$5c,$78,$53,$00,$00,$00 ; "boot? " 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_boot .db $7f,$5c,$5c,$78,$80,$80,$80,$00 ; "boot... "
msg_load .db $38,$5c,$5f,$5e,$80,$80,$80,$00 ; "load... " msg_load .db $38,$5c,$5f,$5e,$80,$80,$80,$00 ; "load... "
msg_go .db $3d,$5c,$80,$80,$80,$00,$00,$00 ; "go... " msg_go .db $3d,$5c,$80,$80,$80,$00,$00,$00 ; "go... "
#endif
#endif #endif
; ;
;======================================================================= ;=======================================================================
; DSKY keypad led matrix masks
;=======================================================================
;
dsky_highlightallkeyleds .db $3f,$3f,$3f,$3f,$00,$00,$00,$00
dsky_highlightkeyledsoff .db $00,$00,$00,$00,$00,$00,$00,$00
;
;=======================================================================
; ROM Application Table ; ROM Application Table
;======================================================================= ;=======================================================================
; ;
@ -2342,6 +2378,7 @@ bootslice .db 0 ; boot disk slice
loadcnt .db 0 ; num disk sectors to load loadcnt .db 0 ; num disk sectors to load
switches .db 0 ; front panel switches switches .db 0 ; front panel switches
diskcnt .db 0 ; disk unit count value diskcnt .db 0 ; disk unit count value
dskyact .db 0 ; DSKY active if != 0
; ;
;======================================================================= ;=======================================================================
; Pad remainder of ROM Loader ; Pad remainder of ROM Loader

30
Source/HBIOS/sd.asm

@ -1382,7 +1382,9 @@ SD_SETADDR:
LD A,SD_LBA ; OFFSET OF LBA VALUE LD A,SD_LBA ; OFFSET OF LBA VALUE
CALL LDHLIYA ; HL := IY + A, REG A TRASHED CALL LDHLIYA ; HL := IY + A, REG A TRASHED
#IF (DSKYENABLE) #IF (DSKYENABLE)
#IF (DSKYDSKACT)
CALL HB_DSKACT ; SHOW ACTIVITY CALL HB_DSKACT ; SHOW ACTIVITY
#ENDIF
#ENDIF #ENDIF
CALL LD32 ; LOAD IT TO DE:HL, AF IS TRASHED CALL LD32 ; LOAD IT TO DE:HL, AF IS TRASHED
POP AF ; GET CARD TYPE BACK POP AF ; GET CARD TYPE BACK
@ -1564,11 +1566,6 @@ SD_EXECCMD3:
#IF (SDTRACE >= 3) #IF (SDTRACE >= 3)
CALL SD_PRTRC ; IF MAX TRACING, PRINT RC CALL SD_PRTRC ; IF MAX TRACING, PRINT RC
#ENDIF #ENDIF
;;#IF (DSKYENABLE)
;; PUSH AF
;; CALL SD_DSKY ; IF USING DSKY, SHOW IT THERE
;; POP AF
;;#ENDIF
AND ~$01 ; MASK OFF IDLE BIT AND SET FLAGS AND ~$01 ; MASK OFF IDLE BIT AND SET FLAGS
RET Z ; IF RC = 0, NO ERROR, RETURN RET Z ; IF RC = 0, NO ERROR, RETURN
CALL SD_DONE ; IF ERROR, COMPLETE TRANSACTION CALL SD_DONE ; IF ERROR, COMPLETE TRANSACTION
@ -2342,29 +2339,6 @@ SD_PRTPREFIX:
CALL PC_COLON CALL PC_COLON
POP AF POP AF
RET RET
;;;
;;; DISPLAY COMMAND, LOW ORDER WORD OF PARMS, AND RC
;;;
;;#IF (DSKYENABLE)
;;SD_DSKY:
;; PUSH AF
;; PUSH HL
;; LD HL,DSKY_HEXBUF
;; LD A,(SD_CMD)
;; LD (HL),A
;; INC HL
;; LD A,(SD_CMDP2)
;; LD (HL),A
;; INC HL
;; LD A,(SD_CMDP3)
;; LD (HL),A
;; INC HL
;; LD A,(SD_RC)
;; CALL DSKY_HEXOUT
;; POP HL
;; POP AF
;; RET
;;#ENDIF
; ;
;============================================================================= ;=============================================================================
; STRING DATA ; STRING DATA

2
Source/HBIOS/syq.asm

@ -418,7 +418,9 @@ SYQ_IO:
LD A,SYQ_LBA ; LBA OFFSET IN CONFIG LD A,SYQ_LBA ; LBA OFFSET IN CONFIG
CALL LDHLIYA ; POINT TO LBA DWORD CALL LDHLIYA ; POINT TO LBA DWORD
#IF (DSKYENABLE) #IF (DSKYENABLE)
#IF (DSKYDSKACT)
CALL HB_DSKACT ; SHOW ACTIVITY CALL HB_DSKACT ; SHOW ACTIVITY
#ENDIF
#ENDIF #ENDIF
CALL LD32 ; SET DE:HL TO LBA CALL LD32 ; SET DE:HL TO LBA
; ;

2
Source/ver.inc

@ -2,7 +2,7 @@
#DEFINE RMN 3 #DEFINE RMN 3
#DEFINE RUP 0 #DEFINE RUP 0
#DEFINE RTP 0 #DEFINE RTP 0
#DEFINE BIOSVER "3.3.0-dev.26"
#DEFINE BIOSVER "3.3.0-dev.27"
#define rmj RMJ #define rmj RMJ
#define rmn RMN #define rmn RMN
#define rup RUP #define rup RUP

2
Source/ver.lib

@ -3,5 +3,5 @@ rmn equ 3
rup equ 0 rup equ 0
rtp equ 0 rtp equ 0
biosver macro biosver macro
db "3.3.0-dev.26"
db "3.3.0-dev.27"
endm endm

Loading…
Cancel
Save