diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index cc4f2d11..d35f75a0 100644 Binary files a/Doc/RomWBW Applications.pdf and b/Doc/RomWBW Applications.pdf differ diff --git a/Doc/RomWBW Disk Catalog.pdf b/Doc/RomWBW Disk Catalog.pdf index 750d3a32..8f200df2 100644 Binary files a/Doc/RomWBW Disk Catalog.pdf and b/Doc/RomWBW Disk Catalog.pdf differ diff --git a/Doc/RomWBW Errata.pdf b/Doc/RomWBW Errata.pdf index a33d9da4..5af2c6a9 100644 Binary files a/Doc/RomWBW Errata.pdf and b/Doc/RomWBW Errata.pdf differ diff --git a/Doc/RomWBW ROM Applications.pdf b/Doc/RomWBW ROM Applications.pdf index 7c58dbeb..5d762a6a 100644 Binary files a/Doc/RomWBW ROM Applications.pdf and b/Doc/RomWBW ROM Applications.pdf differ diff --git a/Doc/RomWBW System Guide.pdf b/Doc/RomWBW System Guide.pdf index 5cab0d79..3dddc092 100644 Binary files a/Doc/RomWBW System Guide.pdf and b/Doc/RomWBW System Guide.pdf differ diff --git a/Doc/RomWBW User Guide.pdf b/Doc/RomWBW User Guide.pdf index da0be1a5..dff4dbb7 100644 Binary files a/Doc/RomWBW User Guide.pdf and b/Doc/RomWBW User Guide.pdf differ diff --git a/ReadMe.md b/ReadMe.md index dd9e1917..fcb94c14 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -3,7 +3,7 @@ **RomWBW ReadMe** \ Version 3.3 \ Wayne Warthen ([wwarthen@gmail.com](mailto:wwarthen@gmail.com)) \ -20 Jun 2023 +28 Jun 2023 # Overview diff --git a/ReadMe.txt b/ReadMe.txt index 36fea024..f2870482 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -1,6 +1,6 @@ RomWBW ReadMe Wayne Warthen (wwarthen@gmail.com) -20 Jun 2023 +28 Jun 2023 diff --git a/Source/Doc/SystemGuide.md b/Source/Doc/SystemGuide.md index 4250d8f8..a0f7aa27 100644 --- a/Source/Doc/SystemGuide.md +++ b/Source/Doc/SystemGuide.md @@ -1009,6 +1009,198 @@ used. `\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) The VDA functions are provided as a common interface to Video Display diff --git a/Source/Doc/UserGuide.md b/Source/Doc/UserGuide.md index e34d7ab8..1a1bf256 100644 --- a/Source/Doc/UserGuide.md +++ b/Source/Doc/UserGuide.md @@ -3943,7 +3943,6 @@ may be discovered by RomWBW in your system. | DMA | System | Zilog DMA Controller | | DS1307 | RTC | Maxim DS1307 PCF I2C Real-Time Clock w/ NVRAM | | DS1501RTC | RTC | Maxim DS1501/DS1511 Watchdog Real-Time Clock | -| DSKY | System | Keypad & Display | | DSRTC | RTC | Maxim DS1302 Real-Time Clock w/ NVRAM | | DUART | Char | SCC2681 or compatible Dual UART | | 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 | | HDSK | Disk | SIMH Simulator Hard Disk | | IDE | Disk | IDE/ATA Hard Disk Interface | +| ICM | DsKy | ICM7218-based Display/Keypad on PPI | | IMM | Disk | IMM Zip Drive on PPI | | INTRTC | RTC | Interrupt-based Real Time Clock | | 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 | | I2C | System | I2C Interface | | PIO | Char | Zilog Parallel Interface Controller | +| PKD | DsKy | P8279-based Display/Keypad on PPI | | PPIDE | Disk | 8255 IDE/ATA Hard Disk Interface | | PPA | Disk | PPA Zip Drive on PPI | | PPK | Kbd | Matrix Keyboard | diff --git a/Source/HBIOS/API.txt b/Source/HBIOS/API.txt index 3afccd89..c1c7175b 100644 --- a/Source/HBIOS/API.txt +++ b/Source/HBIOS/API.txt @@ -484,3 +484,93 @@ TERM_ATTACH: (C=VIDEO UNIT, DE=_DISPATCH) - QUERY ATTACHED VDA FOR SCREEN SIZE (VIA _VDADISP) - INITIALIZE ALL WORKING VARIABLES AND EMULATOR STATE - 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. diff --git a/Source/HBIOS/Config/MBC_std.asm b/Source/HBIOS/Config/MBC_std.asm index 3691a06a..acb01161 100644 --- a/Source/HBIOS/Config/MBC_std.asm +++ b/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 ; -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 ;UARTCFG .SET UARTCFG | SER_RTS diff --git a/Source/HBIOS/Config/SBC_max.asm b/Source/HBIOS/Config/SBC_max.asm index e682b1c0..f2ff533d 100644 --- a/Source/HBIOS/Config/SBC_max.asm +++ b/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 ; 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) ; diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index 2528e4d4..e9bbc521 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -108,10 +108,13 @@ LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS 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 CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP diff --git a/Source/HBIOS/cfg_mbc.asm b/Source/HBIOS/cfg_mbc.asm index 8d670220..db2d5ebd 100644 --- a/Source/HBIOS/cfg_mbc.asm +++ b/Source/HBIOS/cfg_mbc.asm @@ -73,10 +73,13 @@ LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC] LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS 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 CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index 3582161d..07a55cc2 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -79,10 +79,13 @@ LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS 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 CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index f65b6f92..73f2b5f9 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -81,10 +81,13 @@ LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC] LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS 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 CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP diff --git a/Source/HBIOS/cfg_rph.asm b/Source/HBIOS/cfg_rph.asm index 09d330cc..8ec96877 100644 --- a/Source/HBIOS/cfg_rph.asm +++ b/Source/HBIOS/cfg_rph.asm @@ -79,10 +79,13 @@ LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC] LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS 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 CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 36158a10..0dde69e6 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -73,10 +73,13 @@ LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC] LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS 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 CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP diff --git a/Source/HBIOS/cfg_z80retro.asm b/Source/HBIOS/cfg_z80retro.asm index dae8f9b2..93e3bc08 100644 --- a/Source/HBIOS/cfg_z80retro.asm +++ b/Source/HBIOS/cfg_z80retro.asm @@ -76,10 +76,13 @@ LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC] LEDPORT .EQU $00 ; STATUS LED PORT ADDRESS 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 CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP diff --git a/Source/HBIOS/cfg_zeta.asm b/Source/HBIOS/cfg_zeta.asm index 635ffc88..527bf5ff 100644 --- a/Source/HBIOS/cfg_zeta.asm +++ b/Source/HBIOS/cfg_zeta.asm @@ -65,10 +65,13 @@ LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC] LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS 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 CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP diff --git a/Source/HBIOS/cfg_zeta2.asm b/Source/HBIOS/cfg_zeta2.asm index 5a224502..1ca49564 100644 --- a/Source/HBIOS/cfg_zeta2.asm +++ b/Source/HBIOS/cfg_zeta2.asm @@ -76,10 +76,13 @@ LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC] LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS 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 CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP diff --git a/Source/HBIOS/dbgmon.asm b/Source/HBIOS/dbgmon.asm index a2a37042..5bf6fdca 100644 --- a/Source/HBIOS/dbgmon.asm +++ b/Source/HBIOS/dbgmon.asm @@ -31,12 +31,7 @@ BUFLEN .EQU 40 ; INPUT LINE LENGTH JP DSKY_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 ; @@ -149,10 +144,7 @@ SERIALCMDLOOP: ;_____________________________________________________________________________ ; INITIALIZE: - ;LD A,$C3 ; JP OPCODE - ;LD (0),A ; STORE AT $0000 - ;LD (1),HL ; STORE AT $0001 - +; #IF (BIOS == BIOS_UNA) ; INSTALL UNA INVOCATION VECTOR FOR RST 08 LD A,$C3 ; JP INSTRUCTION @@ -160,14 +152,6 @@ INITIALIZE: LD HL,($FFFE) ; UNA ENTRY VECTOR LD (9),HL ; STORE AT 0x0009 #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 ; @@ -1278,14 +1262,6 @@ TXT_HELP .TEXT "\r\nMonitor Commands (all values in hex):" ; #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_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: + ; SHOULD WE DO SOMETHING HERE TO CONFIRM THAT A DSKY + ; IS ACTUALLY OPERATING??? LD SP,MON_STACK ; SET THE STACK POINTER - ;EI ; INTS OK NOW LD HL,DSKY_ENTRY ; RESTART ADDRESS CALL INITIALIZE ; @@ -1305,12 +1282,7 @@ DSKY_ENTRY: ; START UP THE SYSTEM WITH THE FRONT PANEL INTERFACE ;_____________________________________________________________________________ ; - CALL DSKY_PREINIT ; INITIALIZE DSKY - - #IF (DSKYMODE == DSKYMODE_NG) CALL DSKY_BEEP - #ENDIF - ; ;__COMMAND_PARSE______________________________________________________________ ; @@ -1320,17 +1292,12 @@ DSKY_ENTRY: FRONTPANELLOOP: LD HL,CPUUP ; SET POINTER TO CPU UP MSG CALL DSKY_SHOW ; DISPLAY UNENCODED - - #IF (DSKYMODE == DSKYMODE_NG) CALL DSKY_HIGHLIGHTCMDKEYS 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 - #ENDIF + POP AF FRONTPANELLOOP1: CP KY_PR ; IS PORT READ? @@ -1366,11 +1333,7 @@ DOBOOT: ;_____________________________________________________________________________ ; DOPORTREAD: - - #IF (DSKYMODE == DSKYMODE_NG) CALL DSKY_HIGHLIGHTNUMKEYS - #ENDIF - CALL GETPORT ; GET PORT INTO A PORTREADLOOP: LD C,A ; STORE PORT IN "C" @@ -1393,11 +1356,7 @@ PORTREADGETKEY: ;_____________________________________________________________________________ ; DOPORTWRITE: - - #IF (DSKYMODE == DSKYMODE_NG) CALL DSKY_HIGHLIGHTNUMKEYS - #ENDIF - CALL GETPORT ; GET PORT INTO A PORTWRITELOOP: LD L,A ; SAVE PORT NUM @@ -1419,18 +1378,10 @@ PORTWRITEGETKEY: ;_____________________________________________________________________________ ; DOGO: - -#IF (DSKYMODE == DSKYMODE_NG) CALL DSKY_HIGHLIGHTNUMKEYS - #ENDIF - CALL GETADDR ; GET ADDRESS INTO HL - - #IF (DSKYMODE == DSKYMODE_NG) + PUSH HL CALL DSKY_HIGHLIGHTKEYSOFF - #ENDIF - - PUSH HL ; EXEC ADR TO TOS LD HL,GOTO ; POINT TO "GO" MSG CALL INITBUF POP HL @@ -1450,11 +1401,7 @@ DOGO: ;_____________________________________________________________________________ ; DOEXAMINE: - - #IF (DSKYMODE == DSKYMODE_NG) CALL DSKY_HIGHLIGHTNUMKEYS - #ENDIF - CALL GETADDR ; GET ADDRESS INTO HL EXAMINELOOP: LD DE,DISPLAYBUF+0 @@ -1470,11 +1417,7 @@ EXAMINELOOP: LD A,(HL) ; GET VALUE FROM ADDRESS IN HL CALL PUTVALUE CALL ENCDISPLAY ; DISPLAY BUFFER ON DISPLAYS - - #IF (DSKYMODE == DSKYMODE_NG) CALL DSKY_HIGHLIGHTFWDKEYS - #ENDIF - EXAMINEGETKEY: CALL KB_GET ; GET KEY FROM KB CP KY_EN ; [EN] PRESSED, INC ADDRESS AND LOOP @@ -1492,11 +1435,7 @@ EXAMINEFW: ;_____________________________________________________________________________ ; DODEPOSIT: - - #IF (DSKYMODE == DSKYMODE_NG) CALL DSKY_HIGHLIGHTNUMKEYS - #ENDIF - CALL GETADDR ; GET ADDRESS INTO HL DEPOSITLOOP: LD DE,DISPLAYBUF+0 @@ -1513,11 +1452,7 @@ DEPOSITLOOP: LD DE,DISPLAYBUF+6 ; DISPLAY WRITTEN MEM VALUE CALL PUTVALUE ; ... WITHOUT DP'S CALL ENCDISPLAY ; DISPLAY BUFFER CONTENTS - - #IF (DSKYMODE == DSKYMODE_NG) CALL DSKY_HIGHLIGHTFWDKEYS - #ENDIF - DEPOSITGETKEY: CALL KB_GET ; GET KEY FROM KB CP KY_EN ; [EN] PRESSED, INC ADDRESS AND LOOP @@ -1684,6 +1619,7 @@ KB_GET: PUSH DE PUSH HL ; SAVE HL CALL DSKY_GETKEY ; GET A KEY + LD A,E ; PUT KEY CODE IN A CP KY_EN ; ENTER? JR Z,KB_GET1 ; IF YES, RET TO CALLER CP $10 ; HEX DIGIT? @@ -1710,7 +1646,7 @@ INITBUF: ; ;__ENCDISPLAY_________________________________________________________________ ; -; DISPLAY CONTENTS OF DISPLAYBUF DECODED PER SEGDECODE TABLE +; DISPLAY CONTENTS OF DISPLAYBUF ENCODED PER SEGDECODE TABLE ;_____________________________________________________________________________ ; ENCDISPLAY: @@ -1720,7 +1656,7 @@ ENCDISPLAY: ; ;__ENCBUF_____________________________________________________________________ ; -; DISPLAY CONTENTS OF BUFFER AT HL DECODED PER SEGDECODE TABLE +; DISPLAY CONTENTS OF BUFFER AT HL ENCODED PER SEGDECODE TABLE ;_____________________________________________________________________________ ; ENCBUF: @@ -1736,7 +1672,6 @@ ENCBUF1: INC HL ; BUMP TO NEXT BYTE FOR NEXT PASS PUSH AF ; SAVE IT AND $80 ; ISOLATE HI BIT (DP) - ;XOR $80 ; FLIP IT LD C,A ; SAVE IN C POP AF ; RECOVER ORIGINAL AND $7F ; REMOVE HI BIT (DP) @@ -1757,36 +1692,62 @@ ENCBUF1: POP HL ; RESTORE HL 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) 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' .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 +DSKY_BUF .FILL 8,0 ; #ELSE ; @@ -1949,130 +1887,6 @@ ADDHLA: INC H 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 diff --git a/Source/HBIOS/dsky.asm b/Source/HBIOS/dsky.asm deleted file mode 100644 index c0da58e7..00000000 --- a/Source/HBIOS/dsky.asm +++ /dev/null @@ -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 diff --git a/Source/HBIOS/fd.asm b/Source/HBIOS/fd.asm index e20cffaf..f89a1663 100644 --- a/Source/HBIOS/fd.asm +++ b/Source/HBIOS/fd.asm @@ -1130,9 +1130,11 @@ FD_RETRY1: FD_START: ; #IF (DSKYENABLE) + #IF (DSKYDSKACT) LD A,4 CALL LDHLIYA CALL HB_DSKACTCHS ; SHOW ACTIVITY + #ENDIF #ENDIF ; LD A,(FCD_FDCRDY) @@ -1202,9 +1204,6 @@ FD_RUN1: RET FD_RUNCHK: -;;#IF (DSKYENABLE) -;; CALL FD_DSKY -;;#ENDIF FD_RUNEXIT: LD A,(FST_RC) @@ -1221,23 +1220,6 @@ FD_RUNERR: 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) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 56e50427..e95b6ae8 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -63,7 +63,6 @@ ; - decode.asm ; - encode.asm ; - [xio|mio].asm -; - [dsky.asm|dskyng.asm] ; - unlzsa2s.asm ; ; INCLUDE GENERIC STUFF @@ -1878,6 +1877,35 @@ HB_CPU1: CALL DSRTC_PREINIT #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) ; ; SET THE SK Z80-512K UART CLK2 DIVIDER AS @@ -2211,22 +2239,6 @@ NOT_REC_M0: #ENDIF 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 ; ; TEST DEBUG *************************************************************************************** @@ -3078,9 +3090,6 @@ HB_INITRLEN .EQU (($ - HB_INIT_REC) / 2) ;================================================================================================== ; HB_PCINITTBL: -#IF (DSKYENABLE) - .DW DSKY_PREINIT -#ENDIF #IF (ASCIENABLE) .DW ASCI_PREINIT #ENDIF @@ -3128,7 +3137,14 @@ HB_INITTBL: .DW CTC_INIT #ENDIF #IF (DSKYENABLE) - .DW DSKY_INIT + #IF (ICMENABLE) + .DW ICM_INIT + #ENDIF +#ENDIF +#IF (DSKYENABLE) + #IF (PKDENABLE) + .DW PKD_INIT + #ENDIF #ENDIF #IF (AY38910ENABLE) .DW AY38910_INIT ; AUDIBLE INDICATOR OF BOOT START @@ -3212,9 +3228,6 @@ HB_INITTBL: #IF (VRCENABLE) .DW VRC_INIT #ENDIF -;#IF (DSKYENABLE) -; .DW DSKY_INIT -;#ENDIF #IF (DMAENABLE) .DW DMA_INIT #ENDIF @@ -3322,8 +3335,8 @@ HB_DISPATCH1: JP C,DIO_DISPATCH CP BF_RTC + $10 ; $20-$2F: REAL TIME CLOCK (RTC) 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 JP C,VDA_DISPATCH 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 ; #IF (DSKYENABLE) + #IF (DSKYDSKACT) ; ;================================================================================================== ; DSKY DISK ACTIVITY MONITOR @@ -3740,7 +3754,8 @@ HB_DSKACT2: LD (DSKY_BUF+7),A ; SAVE IT HB_DSKACT3: EX DE,HL ; SEG DISPLAY BUF TO HL - CALL DSKY_SHOW ; DISPLAY ON DSKY + LD B,BF_DSKYSHOWSEG + CALL DSKY_DISPATCH POP HL POP DE POP BC @@ -3780,6 +3795,7 @@ HB_DSKACTCHS: LD (DE),A ; ADD TO BUF JR HB_DSKACT2 ; + #ENDIF #ENDIF ; ;================================================================================================== @@ -3815,6 +3831,38 @@ RTC_DISPADR .DW RTC_DISPERR ; RTC DISPATCH ADDRESS 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 ;================================================================================================== ; @@ -4216,6 +4264,8 @@ SYS_GET: JP Z,SYS_GETDIOFN CP BF_SYSGET_RTCCNT JP Z,SYS_GETRTCCNT + CP BF_SYSGET_DSKYCNT + JP Z,SYS_GETDSKYCNT CP BF_SYSGET_VDACNT JP Z,SYS_GETVDACNT CP BF_SYSGET_VDAFN @@ -4303,6 +4353,18 @@ SYS_GETRTCCNT1: XOR A ; SIGNALS SUCCESS 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 ; SYS_GETVDACNT: @@ -5069,6 +5131,50 @@ HB_IM1PTR .DW HB_IVT ; POINTER FOR NEXT IM1 ENTRY ; #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) @@ -5966,6 +6072,28 @@ Z280_SYSCALL_GO: ; 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) ORG_DSRTC .EQU $ #INCLUDE "dsrtc.asm" @@ -6461,16 +6589,6 @@ SIZ_YM2612 .EQU $ - ORG_YM2612 #INCLUDE "mio.asm" #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. ; #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$" ; #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 " - #ENDIF #ENDIF ; HB_APPBNK .DB 0 ; START BANK WHEN RUN IN APP MODE @@ -7628,6 +7741,41 @@ MG014_STATMAPHI: ; #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 $ ; SLACK .EQU BNKTOP - $ diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index 628ccb6e..57e7d749 100644 --- a/Source/HBIOS/hbios.inc +++ b/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_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_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_DIOFN .EQU $11 ; GET DIO UNIT FN/DATA ADR 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_VDAFN .EQU $41 ; GET VDA UNIT FN/DATA ADR 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_RP5 .EQU $50 ; RP5C01 ; +; DSKY DEVICE IDS +; +DSKYDEV_ICM .EQU $00 ; Intersil ICM7218 +DSKYDEV_PKD .EQU $10 ; Intel P8279 +; ; VIDEO DEVICE IDS ; VDADEV_VDU .EQU $00 ; ECB VDU - MOTOROLA 6545 @@ -350,6 +365,37 @@ SNDDEV_AY38910 .EQU $10 SNDDEV_BITMODE .EQU $20 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 ; WARNING: THESE OFFSETS WILL CHANGE SIGNIFICANTLY BETWEEN RELEASES ; IT IS STRONGLY RECOMMENDED THAT YOU DO NOT USE THEM! diff --git a/Source/HBIOS/hdsk.asm b/Source/HBIOS/hdsk.asm index 4076fb78..2349de36 100644 --- a/Source/HBIOS/hdsk.asm +++ b/Source/HBIOS/hdsk.asm @@ -234,9 +234,11 @@ HDSK_RW0: LD (HDSK_RC),A ; CLEAR RETURN CODE ; #IF (DSKYENABLE) + #IF (DSKYDSKACT) LD A,HDSK_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF #ENDIF ; ; CONVERT LBA HHHH:LLLL (4 BYTES) diff --git a/Source/HBIOS/icm.asm b/Source/HBIOS/icm.asm new file mode 100644 index 00000000..8a7e620b --- /dev/null +++ b/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 diff --git a/Source/HBIOS/ide.asm b/Source/HBIOS/ide.asm index a1fe1e9e..2c80dd08 100644 --- a/Source/HBIOS/ide.asm +++ b/Source/HBIOS/ide.asm @@ -794,9 +794,11 @@ IDE_PKT_RDSEC: ; SETUP LBA ; #IF (DSKYENABLE) + #IF (DSKYDSKACT) LD A,IDE_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF #ENDIF ; ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN @@ -861,9 +863,11 @@ IDE_PKT_WRSEC: ; SETUP LBA ; #IF (DSKYENABLE) + #IF (DSKYDSKACT) LD A,IDE_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF #ENDIF ; ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN @@ -891,9 +895,11 @@ IDE_PKT_WRSEC: IDE_SETADDR: ; #IF (DSKYENABLE) + #IF (DSKYDSKACT) LD A,IDE_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF #ENDIF ; SEND 3 LOWEST BYTES OF LBA IN REVERSE ORDER ; IDE_REG_LBA3 HAS ALREADY BEEN SET diff --git a/Source/HBIOS/imm.asm b/Source/HBIOS/imm.asm index 2f5b457d..d9076758 100644 --- a/Source/HBIOS/imm.asm +++ b/Source/HBIOS/imm.asm @@ -344,9 +344,11 @@ IMM_IO: LD (IMM_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS ; #IF (DSKYENABLE) + #IF (DSKYDSKACT) LD A,IMM_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF #ENDIF ; ; SETUP LBA diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index 2ada547a..dd5d1d79 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -303,9 +303,11 @@ MD_RW1: PUSH BC ; SAVE COUNTERS ; #IF (DSKYENABLE) + #IF (DSKYDSKACT) LD A,MD_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF #ENDIF ; LD HL,(MD_RWFNADR) ; GET PENDING IO FUNCTION ADDRESS diff --git a/Source/HBIOS/dskyng.asm b/Source/HBIOS/pkd.asm similarity index 50% rename from Source/HBIOS/dskyng.asm rename to Source/HBIOS/pkd.asm index fde11a51..cc5f35a3 100644 --- a/Source/HBIOS/dskyng.asm +++ b/Source/HBIOS/pkd.asm @@ -1,9 +1,9 @@ ; ;================================================================================================== -; DSKYNG (DISPLAY AND KEYBOARD NEXT GENERATION) ROUTINES +; DSKY NEXT GENERATION PKD (DISPLAY AND KEYBOARD) ROUTINES ;================================================================================================== ; -; A DSKYNG CAN SHARE A PPI BUS WITH EITHER A PPIDE OR PPISD. +; A PKD CAN SHARE A PPI BUS WITH EITHER A PPIDE OR PPISD. ; SEE PPI_BUS.TXT FOR MORE INFORMATION. ; ; LED SEGMENTS (BIT VALUES) @@ -39,13 +39,13 @@ ; 10 10 10 10 10 ; 20 20 20 20 20 L1 L2 BUZZ ; -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 +PKD_PPIA .EQU PKDPPIBASE + 0 ; PORT A +PKD_PPIB .EQU PKDPPIBASE + 1 ; PORT B +PKD_PPIC .EQU PKDPPIBASE + 2 ; PORT C +PKD_PPIX .EQU PKDPPIBASE + 3 ; PPI CONTROL PORT ; -DSKY_PPIX_RD: .EQU %10010010 ; PPIX VALUE FOR READS -DSKY_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 ; ; PIO CHANNEL C: ; @@ -55,18 +55,18 @@ DSKY_PPIX_WR: .EQU %10000010 ; PPIX VALUE FOR WRITES ; SETTING BITS 3 & 4 WILL ASSERT /CS ON 3279 ; CLEAR BITS 1 OR 2 TO ASSERT READ/WRITE ; -DSKY_PPI_IDLE: .EQU %00000110 +PKD_PPI_IDLE .EQU %00000110 ; -DSKY_CMD_CLR: .EQU %11011111 ; CLEAR (ALL OFF) -DSKY_CMD_CLRX: .EQU %11010011 ; CLEAR (ALL ON) -DSKY_CMD_WDSP: .EQU %10010000 ; WRITE DISPLAY RAM -DSKY_CMD_RDSP: .EQU %01110000 ; READ DISPLAY RAM -DSKY_CMD_CLK: .EQU %00100000 ; SET CLK PRESCALE -DSKY_CMD_FIFO: .EQU %01000000 ; READ FIFO +PKD_CMD_CLR .EQU %11011111 ; CLEAR (ALL OFF) +PKD_CMD_CLRX .EQU %11010011 ; CLEAR (ALL ON) +PKD_CMD_WDSP .EQU %10010000 ; WRITE DISPLAY RAM +PKD_CMD_RDSP .EQU %01110000 ; READ DISPLAY RAM +PKD_CMD_CLK .EQU %00100000 ; SET CLK PRESCALE +PKD_CMD_FIFO .EQU %01000000 ; READ FIFO ; -DSKY_PRESCL: .EQU DSKYOSC/100000 ; PRESCALER +PKD_PRESCL .EQU PKDOSC/100000 ; PRESCALER ; -;__DSKY_PREINIT______________________________________________________________________________________ +;__PKD_PREINIT_______________________________________________________________________________________ ; ; CONFIGURE PARALLEL PORT AND INITIALIZE 8279 ;____________________________________________________________________________________________________ @@ -74,200 +74,283 @@ DSKY_PRESCL: .EQU DSKYOSC/100000 ; PRESCALER ; ; HARDWARE RESET 8279 BY PULSING RESET LINE ; -DSKY_PREINIT: +PKD_PREINIT: + LD A,(DSKY_DISPACT) ; DSKY DISPATCHER ALREADY SET? + OR A ; SET FLAGS + RET NZ ; IF ALREADY ACTIVE, ABORT +; ; CHECK FOR PPI - CALL DSKY_PPIDETECT ; TEST FOR PPI HARDWARE + CALL PKD_PPIDETECT ; TEST FOR PPI HARDWARE RET NZ ; BAIL OUT IF NOT THERE - ; SETUP PPI TO DEFAULT MODE - CALL DSKY_PPIRD - ; INIT 8279 VALUES TO IDLE STATE - LD A,DSKY_PPI_IDLE - OUT (PPIC),A +; + ; SETUP PPI TO IDLE STATE + CALL PKD_PPIIDLE + LD A,PKD_PPI_IDLE + OUT (PKD_PPIC),A +; ; PULSE RESET SIGNAL ON 8279 SET 7,A - OUT (PPIC),A + OUT (PKD_PPIC),A RES 7,A - OUT (PPIC),A + OUT (PKD_PPIC),A +; ; INITIALIZE 8279 - CALL DSKY_REINIT - ; NOW SEE IF A DSKYNG IS REALLY THERE... - LD A,$A5 - LD (DSKY_BUF),A - LD HL,DSKY_BUF + CALL PKD_REINIT +; + ; NOW SEE IF A PKD IS REALLY THERE... + LD A,$71 LD C,0 - LD B,1 - CALL DSKY_PUTSTR - LD HL,DSKY_BUF + CALL PKD_PUTBYTE LD C,0 - LD B,1 - CALL DSKY_GETSTR - LD A,(DSKY_BUF) - CP $A5 + CALL PKD_GETBYTE + CP $71 RET NZ ; BAIL OUT IF MISCOMPARE +; + ; RECORD HARDWARE PRESENT LD A,$FF - LD (DSKY_PRESENT),A - RET + LD (PKD_PRESENT),A ; -DSKY_REINIT: - CALL DSKY_PPIIDLE - ; SET CLOCK SCALER TO 20 - LD A,DSKY_CMD_CLK | DSKY_PRESCL - CALL DSKY_CMD - ; FALL THRU -; -DSKY_RESET: - ; RESET DSKY -- CLEAR RAM AND FIFO - LD A,DSKY_CMD_CLR - CALL DSKY_CMD -; - ; 8259 TAKES ~160US TO CLEAR RAM DURING WHICH TIME WRITES TO - ; DISPLAY RAM ARE INHIBITED. HIGH BIT OF STATUS BYTE IS SET - ; DURING THIS WINDOW. TO PREVENT A DEADLOCK, A LOOP COUNTER - ; IS USED TO IMPLEMENT A TIMEOUT. - LD B,0 ; TIMEOUT LOOP COUNTER -DSKY_RESET1: - PUSH BC ; SAVE COUNTER - CALL DSKY_ST ; GET STATUS BYTE - POP BC ; RECOVER COUNTER - BIT 7,A ; BIT 7 IS DISPLAY RAM BUSY - JR Z,DSKY_RESET2 ; MOVE ON IF DONE - DJNZ DSKY_RESET1 ; LOOP TILL TIMEOUT + ; REGISTER DRIVER WITH HBIOS + LD BC,PKD_DISPATCH + CALL DSKY_SETDISP ; -DSKY_RESET2: RET ; -;__DSKY_INIT_________________________________________________________________________________________ +PKD_REINIT: + CALL PKD_PPIIDLE + ; SET CLOCK SCALER TO 20 + LD A,PKD_CMD_CLK | PKD_PRESCL + CALL PKD_CMD + JP PKD_RESET +; +;__PKD_INIT__________________________________________________________________________________________ ; ; DISPLAY DSKY INFO ;____________________________________________________________________________________________________ ; -#IFDEF HBIOS -; -DSKY_INIT: +PKD_INIT: CALL NEWLINE ; FORMATTING - PRTS("DSKY:$") ; FORMATTING + PRTS("PKD:$") ; FORMATTING ; PRTS(" IO=0x$") ; FORMATTING - LD A,DSKYPPIBASE ; GET BASE PORT + LD A,PKDPPIBASE ; GET BASE PORT CALL PRTHEXBYTE ; PRINT BASE PORT - PRTS(" MODE=$") ; FORMATTING - PRTS("NG$") ; PRINT DSKY TYPE ; - LD A,(DSKY_PRESENT) ; PRESENT? + LD A,(PKD_PRESENT) ; PRESENT? OR A ; SET FLAGS RET NZ ; YES, ALL DONE PRTS(" NOT PRESENT$") ; NOT PRESENT RET ; DONE ; -#ENDIF -; -;__DSKY_PPIDETECT____________________________________________________________________________________ -; -; PROBE FOR PPI HARDWARE -;____________________________________________________________________________________________________ -; -DSKY_PPIDETECT: +; DSKY DEVICE FUNCTION DISPATCH ENTRY +; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR +; B: FUNCTION (IN) +; +PKD_DISPATCH: + LD A,B ; GET REQUESTED FUNCTION + AND $0F ; ISOLATE SUB-FUNCTION + JP Z,PKD_RESET ; RESET DSKY HARDWARE + DEC A + JP Z,PKD_STAT ; GET KEYPAD STATUS + DEC A + JP Z,PKD_GETKEY ; READ A KEY FROM THE KEYPAD + DEC A + JP Z,PKD_SHOWHEX ; DISPLAY A 32-BIT BINARY VALUE IN HEX + DEC A + JP Z,PKD_SHOWSEG ; DISPLAY SEGMENTS + DEC A + JP Z,PKD_KEYLEDS ; SET KEYPAD LEDS + DEC A + JP Z,PKD_STATLED ; SET STATUS LED + DEC A + JP Z,PKD_BEEP ; BEEP DSKY SPEAKER + DEC A + JP Z,PKD_DEVICE ; DEVICE INFO + SYSCHKERR(ERR_NOFUNC) + RET ; - ; TEST FOR PPI EXISTENCE - ; WE SETUP THE PPI TO WRITE, THEN WRITE A VALUE OF ZERO - ; TO PORT A (DATALO), THEN READ IT BACK. IF THE PPI IS THERE - ; THEN THE BUS HOLD CIRCUITRY WILL READ BACK THE ZERO. SINCE - ; WE ARE IN WRITE MODE, AN IDE CONTROLLER WILL NOT BE ABLE TO - ; INTERFERE WITH THE VALUE BEING READ. - CALL DSKY_PPIWR +; RESET DSKY -- CLEAR RAM AND FIFO ; - LD C,PPIA ; PPI PORT A - XOR A ; VALUE ZERO - OUT (C),A ; PUSH VALUE TO PORT - IN A,(C) ; GET PORT VALUE - OR A ; SET FLAGS - RET ; AND RETURN +PKD_RESET: + LD A,PKD_CMD_CLR + CALL PKD_CMD +; + ; 8259 TAKES ~160US TO CLEAR RAM DURING WHICH TIME WRITES TO + ; DISPLAY RAM ARE INHIBITED. HIGH BIT OF STATUS BYTE IS SET + ; DURING THIS WINDOW. TO PREVENT A DEADLOCK, A LOOP COUNTER + ; IS USED TO IMPLEMENT A TIMEOUT. + LD B,0 ; TIMEOUT LOOP COUNTER +PKD_RESET1: + PUSH BC ; SAVE COUNTER + CALL PKD_ST ; GET STATUS BYTE + POP BC ; RECOVER COUNTER + BIT 7,A ; BIT 7 IS DISPLAY RAM BUSY + JR Z,PKD_RESET2 ; MOVE ON IF DONE + DJNZ PKD_RESET1 ; LOOP TILL TIMEOUT ; -#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 -KY_F4 .EQU $18 ; F4 -KY_F3 .EQU $19 ; F3 -KY_F2 .EQU $20 ; F2 -KY_F1 .EQU $21 ; F1 -; -;__DSKY_STAT_________________________________________________________________________________________ +PKD_RESET2: + RET ; ; CHECK FOR KEY PRESS, SAVE RAW VALUE, RETURN STATUS -;____________________________________________________________________________________________________ ; -DSKY_STAT: - LD A,(DSKY_PRESENT) ; DOES IT EXIST? +PKD_STAT: + LD A,(PKD_PRESENT) ; DOES IT EXIST? OR A ; SET FLAGS RET Z ; ABORT WITH A=0 IF NOT THERE - CALL DSKY_ST + CALL PKD_ST AND $0F ; ISOLATE THE CUR FIFO LEN RET ; -;__DSKY_GETKEY_____________________________________________________________________________________ -; ; WAIT FOR A DSKY KEYPRESS AND RETURN -;____________________________________________________________________________________________________ ; -DSKY_GETKEY: - LD A,(DSKY_PRESENT) ; DOES IT EXIST? +PKD_GETKEY: + LD A,(PKD_PRESENT) ; DOES IT EXIST? OR A ; SET FLAGS - JR Z,DSKY_GETKEY1A ; ABORT IF NOT PRESENT - CALL DSKY_STAT - JR Z,DSKY_GETKEY ; LOOP IF NOTHING THERE - LD A,DSKY_CMD_FIFO - CALL DSKY_CMD - CALL DSKY_DIN + JR Z,PKD_GETKEY1A ; ABORT IF NOT PRESENT + CALL PKD_STAT + JR Z,PKD_GETKEY ; LOOP IF NOTHING THERE + LD A,PKD_CMD_FIFO + CALL PKD_CMD + CALL PKD_DIN XOR %11000000 ; FLIP POLARITY OF SHIFT/CTL BITS PUSH AF ; SAVE VALUE AND $3F ; STRIP SHIFT/CTL BITS FOR LOOKUP LD B,28 ; SIZE OF DECODE TABLE LD C,0 ; INDEX - LD HL,DSKY_KEYMAP ; POINT TO BEGINNING OF TABLE -DSKY_GETKEY1: + LD HL,PKD_KEYMAP ; POINT TO BEGINNING OF TABLE +PKD_GETKEY1: CP (HL) ; MATCH? - JR Z,DSKY_GETKEY2 ; FOUND, DONE + JR Z,PKD_GETKEY2 ; FOUND, DONE INC HL INC C ; BUMP INDEX - DJNZ DSKY_GETKEY1 ; LOOP UNTIL EOT + DJNZ PKD_GETKEY1 ; LOOP UNTIL EOT POP AF ; FIX STACK -DSKY_GETKEY1A: +PKD_GETKEY1A: LD A,$FF ; NOT FOUND ERR, RETURN $FF RET -DSKY_GETKEY2: +PKD_GETKEY2: ; RETURN THE INDEX POSITION WHERE THE SCAN CODE WAS FOUND ; THE ORIGINAL SHIFT/CTRL BITS ARE RESTORED POP AF ; RESTORE RAW VALUE AND %11000000 ; ISOLATE SHIFT/CTRL BITS OR C ; COMBINE WITH INDEX VALUE + LD E,A ; PUT IN E FOR RETURN + XOR A ; SIGNAL SUCCESS + RET +; +; +; +PKD_SHOWHEX: + XOR A ; SIGNAL SUCCESS + RET +; +; +; +PKD_SHOWSEG: + LD C,0 ; STARTING DISPLAY POSITION + LD B,DSKY_BUFLEN ; NUMBER OF CHARS + CALL PKD_PUTSTR ; DO IT + XOR A ; SIGNAL SUCCESS + RET +; +; +; +PKD_KEYLEDS: + CALL PKD_PUTLED ; DO IT + XOR A ; SIGNAL SUCCESS + RET +; +; +; +PKD_STATLED: + LD A,$0D ; PORT FOR FIRST LED + ADD A,D ; ADD LED NUM + LD C,A ; PUT IN C + LD A,E ; LED STATE INDICATOR + OR A ; SET FLAGS + JR NZ,PKD_STATLED1 ; HANDLE "ON" +; + ; TURN LED OFF + PUSH BC ; SAVE LED NUM + CALL PKD_GETBYTE ; GET CUR VALUE + AND ~$20 ; BIT 5 OFF + JR PKD_STATLED2 ; FINISH UP +; +PKD_STATLED1: + ; TURN LED ON + PUSH BC ; SAVE LED NUM + CALL PKD_GETBYTE ; GET CUR VALUE + OR $20 ; BIT 5 ON +; +PKD_STATLED2: + POP BC ; RECOVER LED NUM + CALL PKD_PUTBYTE ; PUT NEW VALUE + XOR A ; SIGNAL SUCCESS + RET +; +; BEEP THE SPEAKER ON THE PKD +; +PKD_BEEP: + PUSH BC + LD C,$0F + CALL PKD_GETBYTE + OR $20 + LD C,$0F + CALL PKD_PUTBYTE +; + ; TIMER + PUSH HL + LD hl,$8FFF +PKD_BEEP1: + DEC HL + LD A,H + CP 0 + JR NZ,PKD_BEEP1 + POP HL + LD C,$0F + CALL PKD_GETBYTE + AND $DF + LD C,$0F + CALL PKD_PUTBYTE + POP BC + XOR A ; SIGNAL SUCCESS + RET +; +; DEVICE INFORMATION +; +PKD_DEVICE: + LD D,DSKYDEV_PKD ; D := DEVICE TYPE + LD E,0 ; E := PHYSICAL DEVICE NUMBER + LD H,0 ; H := MODE + LD L,PKDPPIBASE ; L := BASE I/O ADDRESS + XOR A ; SIGNAL SUCCESS RET ; +;__PKD_PPIDETECT_____________________________________________________________________________________ +; +; PROBE FOR PPI HARDWARE +;____________________________________________________________________________________________________ +; +PKD_PPIDETECT: +; + ; TEST FOR PPI EXISTENCE + ; WE SETUP THE PPI TO WRITE, THEN WRITE A VALUE OF ZERO + ; TO PORT A (DATALO), THEN READ IT BACK. IF THE PPI IS THERE + ; THEN THE BUS HOLD CIRCUITRY WILL READ BACK THE ZERO. SINCE + ; WE ARE IN WRITE MODE, AN IDE CONTROLLER WILL NOT BE ABLE TO + ; INTERFERE WITH THE VALUE BEING READ. + CALL PKD_PPIWR +; + LD C,PKD_PPIA ; PPI PORT A + XOR A ; VALUE ZERO + OUT (C),A ; PUSH VALUE TO PORT + IN A,(C) ; GET PORT VALUE + OR A ; SET FLAGS + RET ; AND RETURN +; ;_KEYMAP_TABLE_____________________________________________________________________________________________________________ ; -DSKY_KEYMAP: +PKD_KEYMAP: ; POS $00 $01 $02 $03 $04 $05 $06 $07 ; KEY [0] [1] [2] [3] [4] [5] [6] [7] .DB $0D, $04, $0C, $14, $03, $0B, $13, $02 @@ -280,93 +363,41 @@ DSKY_KEYMAP: ; KEY [FW] [BK] [CL] [EN] [DE] [EX] [GO] [BO] .DB $05, $15, $1D, $1C, $1B, $1A, $19, $18 - ; POS $18 $19 $20 $21 + ; POS $18 $19 $1A $1B ; KEY [F4] [F3] [F2] [F1] .DB $23, $22, $21, $20 ; -#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: - LD C,0 ; STARTING DISPLAY POSITION - LD B,DSKY_BUFLEN ; NUMBER OF CHARS - JP DSKY_PUTSTR -; ;================================================================================================== -; DSKYNG OUTPUT ROUTINES +; PKD OUTPUT ROUTINES ;================================================================================================== ; ; SEND DSKY COMMAND BYTE IN REGISTER A ; TRASHES BC ; -DSKY_CMD: +PKD_CMD: LD B,$01 - JR DSKY_DOUT2 + JR PKD_DOUT2 ; ; SEND DSKY DATA BYTE IN REGISTER A ; TRASHES BC ; -DSKY_DOUT: +PKD_DOUT: LD B,$00 ; -DSKY_DOUT2: +PKD_DOUT2: ; ; SAVE INCOMING DATA BYTE PUSH AF ; ; SET PPI LINE CONFIG TO WRITE MODE - CALL DSKY_PPIWR + CALL PKD_PPIWR ; ; SETUP - LD C,PPIC + LD C,PKD_PPIC ; ; SET ADDRESS FIRST - LD A,DSKY_PPI_IDLE + LD A,PKD_PPI_IDLE OR B OUT (C),A ; @@ -380,7 +411,7 @@ DSKY_DOUT2: ; ; ASSERT DATA BYTE VALUE POP AF - OUT (PPIA),A + OUT (PKD_PPIA),A ; ; PULSE /WR RES 1,B @@ -399,35 +430,35 @@ DSKY_DOUT2: OUT (C),B ; ; DONE - CALL DSKY_PPIIDLE + CALL PKD_PPIIDLE RET ; ;================================================================================================== -; DSKYNG OUTPUT ROUTINES +; PKD INPUT ROUTINES ;================================================================================================== ; ; RETURN DSKY STATUS VALUE IN A ; TRASHES BC ; -DSKY_ST: +PKD_ST: LD B,$01 - JR DSKY_DIN2 + JR PKD_DIN2 ; ; RETURN NEXT DATA VALUE IN A ; TRASHES BC ; -DSKY_DIN: +PKD_DIN: LD B,$00 ; -DSKY_DIN2: +PKD_DIN2: ; SET PPI LINE CONFIG TO READ MODE - CALL DSKY_PPIRD + CALL PKD_PPIRD ; ; SETUP - LD C,PPIC + LD C,PKD_PPIC ; ; SET ADDRESS FIRST - LD A,DSKY_PPI_IDLE + LD A,PKD_PPI_IDLE OR B OUT (C),A ; @@ -444,7 +475,7 @@ DSKY_DIN2: OUT (C),B ; ; GET VALUE - IN A,(PPIA) + IN A,(PKD_PPIA) ; ; DEASSERT /RD SET 2,B @@ -460,51 +491,51 @@ DSKY_DIN2: OUT (C),B ; ; DONE - CALL DSKY_PPIIDLE + CALL PKD_PPIIDLE RET ; ;================================================================================================== -; DSKYNG UTILITY ROUTINES +; PKD UTILITY ROUTINES ;================================================================================================== ; -; BLANK DSKYNG DISPLAY (WITHOUT USING CLEAR) +; BLANK PKD DISPLAY (WITHOUT USING CLEAR) ; -DSKY_BLANK: - LD A,DSKY_CMD_WDSP - CALL DSKY_CMD +PKD_BLANK: + LD A,PKD_CMD_WDSP + CALL PKD_CMD LD B,16 -DSKY_BLANK1: +PKD_BLANK1: PUSH BC LD A,$FF - CALL DSKY_DOUT + CALL PKD_DOUT POP BC - DJNZ DSKY_BLANK1 + DJNZ PKD_BLANK1 RET ; ; WRITE A RAW BYTE VALUE TO DSKY DISPLAY RAM ; AT LOCATION IN REGISTER C, VALUE IN A. ; -DSKY_PUTBYTE: +PKD_PUTBYTE: PUSH BC PUSH AF LD A,C - ADD A,DSKY_CMD_WDSP - CALL DSKY_CMD + ADD A,PKD_CMD_WDSP + CALL PKD_CMD POP AF XOR $FF - CALL DSKY_DOUT + CALL PKD_DOUT POP BC RET ; ; READ A RAW BYTE VALUE FROM DSKY DISPLAY RAM ; AT LOCATION IN REGISTER C, VALUE RETURNED IN A ; -DSKY_GETBYTE: +PKD_GETBYTE: PUSH BC LD A,C - ADD A,DSKY_CMD_RDSP - CALL DSKY_CMD - CALL DSKY_DIN + ADD A,PKD_CMD_RDSP + CALL PKD_CMD + CALL PKD_DIN XOR $FF POP BC RET @@ -512,191 +543,89 @@ DSKY_GETBYTE: ; WRITE A STRING OF RAW BYTE VALUES TO DSKY DISPLAY RAM ; AT LOCATION IN REGISTER C, LENGTH IN B, ADDRESS IN HL. ; -DSKY_PUTSTR: +PKD_PUTSTR: PUSH BC LD A,C - ADD A,DSKY_CMD_WDSP - CALL DSKY_CMD + ADD A,PKD_CMD_WDSP + CALL PKD_CMD POP BC ; -DSKY_PUTSTR1: +PKD_PUTSTR1: LD A,(HL) XOR $FF INC HL PUSH BC - CALL DSKY_DOUT + CALL PKD_DOUT POP BC - DJNZ DSKY_PUTSTR1 + DJNZ PKD_PUTSTR1 RET ; ; READ A STRING OF RAW BYTE VALUES FROM DSKY DISPLAY RAM ; AT LOCATION IN REGISTER C, LENGTH IN B, ADDRESS IN HL. ; -DSKY_GETSTR: +PKD_GETSTR: PUSH BC LD A,C - ADD A,DSKY_CMD_RDSP - CALL DSKY_CMD + ADD A,PKD_CMD_RDSP + CALL PKD_CMD POP BC ; -DSKY_GETSTR1: +PKD_GETSTR1: PUSH BC - CALL DSKY_DIN + CALL PKD_DIN POP BC XOR $FF LD (HL),A INC HL - DJNZ DSKY_GETSTR1 + DJNZ PKD_GETSTR1 RET ; -; This function is intended to update the LEDs. It expects 8 bytes -; following the call, and updates the entire matrix. -; -; EXAMPLE: -; CALL DSKY_PUTLED -; .DB $00,$00,$00,$00,$00,$00,$00,$00 +; UPDATE THE KEYPAD KEY LEDS. HL POINTS TO AN 8 BYTE BITMAP BUFFER +; THAT DEFINES ALL KEYPAD LED VALUES. THE ENTIRE MATRIX IS UPDATED. ; -DSKY_PUTLED: - EX (SP),HL +PKD_PUTLED: PUSH AF PUSH BC LD C,8 -DSKY_PUTLED_1: +PKD_PUTLED_1: LD A,(HL) PUSH BC - CALL DSKY_PUTBYTE + CALL PKD_PUTBYTE POP BC INC C INC HL LD A,C CP $10 - JP NZ,DSKY_PUTLED_1 - POP BC - POP AF - EX (SP),HL - RET -; -; This function is intended to beep the speaker on the DSKY -; -DSKY_BEEP: - PUSH AF - PUSH BC - - LD C,$0F - CALL DSKY_GETBYTE - OR $20 - LD C,$0F - CALL DSKY_PUTBYTE - -;;; timer . . . - PUSH HL - LD hl,$8FFF -DSKY_BEEP1: - DEC HL - LD A,H - CP 0 - JP NZ,DSKY_BEEP1 - POP HL - - LD C,$0F - CALL DSKY_GETBYTE - AND $DF - LD C,$0F - CALL DSKY_PUTBYTE - - POP BC - POP AF - RET -; -; This function is intended to turn on DSKY L1 -; -DSKY_L1ON: - PUSH AF - PUSH BC - - LD C,$0D - CALL DSKY_GETBYTE - OR $20 - LD C,$0D - CALL DSKY_PUTBYTE - - POP BC - POP AF - RET -; -; This function is intended to turn on DSKY L2 -; -DSKY_L2ON: - PUSH AF - PUSH BC - - LD C,$0E - CALL DSKY_GETBYTE - OR $20 - LD C,$0E - CALL DSKY_PUTBYTE - - POP BC - POP AF - RET -; -; This function is intended to turn off DSKY L1 -; -DSKY_L1OFF: - PUSH AF - PUSH BC - - LD C,$0D - CALL DSKY_GETBYTE - AND $DF - LD C,$0D - CALL DSKY_PUTBYTE - - POP BC - POP AF - RET -; -; This function is intended to turn off DSKY L2 -; -DSKY_L2OFF: - PUSH AF - PUSH BC - - LD C,$0E - CALL DSKY_GETBYTE - AND $DF - LD C,$0E - CALL DSKY_PUTBYTE - + JP NZ,PKD_PUTLED_1 POP BC POP AF RET ; ;================================================================================================== -; DSKYNG LINE CONTROL ROUTINES +; PKD LINE CONTROL ROUTINES ;================================================================================================== ; ; SETUP PPI FOR WRITING: PUT PPI PORT A IN OUTPUT MODE ; AVOID REWRTING PPIX IF ALREADY IN OUTPUT MODE ; -DSKY_PPIWR: +PKD_PPIWR: PUSH AF ; ; CHECK FOR WRITE MODE - LD A,(DSKY_PPIX_VAL) - CP DSKY_PPIX_WR - JR Z,DSKY_PPIWR1 + LD A,(PKD_PPIX_VAL) + CP PKD_PPIX_WR + JR Z,PKD_PPIWR1 ; ; SET PPI TO WRITE MODE - LD A,DSKY_PPIX_WR - OUT (PPIX),A - LD (DSKY_PPIX_VAL),A + LD A,PKD_PPIX_WR + OUT (PKD_PPIX),A + LD (PKD_PPIX_VAL),A ; ; RESTORE PORT C (MAY NOT BE NEEDED) - LD A,DSKY_PPI_IDLE - OUT (PPIC),A + LD A,PKD_PPI_IDLE + OUT (PKD_PPIC),A ; -DSKY_PPIWR1: +PKD_PPIWR1: ; POP AF RET @@ -704,71 +633,36 @@ DSKY_PPIWR1: ; SETUP PPI FOR READING: PUT PPI PORT A IN INPUT MODE ; AVOID REWRTING PPIX IF ALREADY IN INPUT MODE ; -DSKY_PPIRD: +PKD_PPIRD: PUSH AF ; ; CHECK FOR READ MODE - LD A,(DSKY_PPIX_VAL) - CP DSKY_PPIX_RD - JR Z,DSKY_PPIRD1 + LD A,(PKD_PPIX_VAL) + CP PKD_PPIX_RD + JR Z,PKD_PPIRD1 ; ; SET PPI TO READ MODE - LD A,DSKY_PPIX_RD - OUT (PPIX),A - LD (DSKY_PPIX_VAL),A + LD A,PKD_PPIX_RD + OUT (PKD_PPIX),A + LD (PKD_PPIX_VAL),A ; -DSKY_PPIRD1: +PKD_PPIRD1: POP AF RET ; ; RELEASE USE OF PPI ; -DSKY_PPIIDLE: - JR DSKY_PPIRD ; SAME AS READ MODE +PKD_PPIIDLE: + JR PKD_PPIRD ; SAME AS READ MODE ; ;================================================================================================== ; 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 $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_PPIX_VAL: .DB 0 -DSKY_PRESENT: .DB 0 -; -; SEG DISPLAY WORKING STORAGE -; -DSKY_BUF .FILL 8,0 -DSKY_BUFLEN .EQU $ - DSKY_BUF -DSKY_HEXBUF .FILL 4,0 -DSKY_HEXBUFLEN .EQU $ - DSKY_HEXBUF +PKD_PPIX_VAL .DB 0 ; PPIX SHADOW REG +PKD_PRESENT .DB 0 ; HARDWARE PRESENT FLAG diff --git a/Source/HBIOS/ppa.asm b/Source/HBIOS/ppa.asm index c9da8303..9af70614 100644 --- a/Source/HBIOS/ppa.asm +++ b/Source/HBIOS/ppa.asm @@ -340,9 +340,11 @@ PPA_IO: LD (PPA_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS ; #IF (DSKYENABLE) + #IF (DSKYDSKACT) LD A,PPA_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF #ENDIF ; ; SETUP LBA diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index acf13295..5449899d 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -800,9 +800,11 @@ PPIDE_PKT_RDSEC: ; SETUP LBA ; #IF (DSKYENABLE) + #IF (DSKYDSKACT) LD A,PPIDE_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF #ENDIF ; ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN @@ -867,9 +869,11 @@ PPIDE_PKT_WRSEC: ; SETUP LBA ; #IF (DSKYENABLE) + #IF (DSKYDSKACT) LD A,PPIDE_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF #ENDIF ; ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN @@ -897,9 +901,11 @@ PPIDE_PKT_WRSEC: PPIDE_SETADDR: ; #IF (DSKYENABLE) + #IF (DSKYDSKACT) LD A,PPIDE_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF #ENDIF ; SEND 3 LOWEST BYTES OF LBA IN REVERSE ORDER ; IDE_REG_LBA3 HAS ALREADY BEEN SET @@ -1286,19 +1292,22 @@ PPIDE_RESET: LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD 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 ; 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 ; 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 (DSKYMODE == DSKYMODE_NG) - ; SAVE CONTENTS OF DSKY DISPLAY ACROSS RESET + #IF (PKDENABLE) + ; SAVE CONTENTS OF DSKYNG DISPLAY ACROSS RESET LD B,8 LD C,0 LD HL,DSKY_BUF - CALL DSKY_GETSTR + CALL PKD_GETSTR #ENDIF #ENDIF ; @@ -1319,13 +1328,13 @@ PPIDE_RESET: CALL VDELAY ; #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 C,0 LD HL,DSKY_BUF - CALL DSKY_PUTSTR + CALL PKD_PUTSTR #ENDIF #ENDIF ; diff --git a/Source/HBIOS/ppp.asm b/Source/HBIOS/ppp.asm index 25f11e5b..5d3345a7 100644 --- a/Source/HBIOS/ppp.asm +++ b/Source/HBIOS/ppp.asm @@ -942,7 +942,9 @@ PPPSD_SENDBLK: LD A,PPPSD_LBA ; OFFSET OF LBA CALL LDHLIYA ; HL := IY + A, REG A TRASHED #IF (DSKYENABLE) + #IF (DSKYDSKACT) CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF #ENDIF LD B,4 PPPSD_SENDBLK1: diff --git a/Source/HBIOS/prp.asm b/Source/HBIOS/prp.asm index 960895dc..6e18d0d3 100644 --- a/Source/HBIOS/prp.asm +++ b/Source/HBIOS/prp.asm @@ -876,7 +876,9 @@ PRPSD_SETBLK: LD A,PRPSD_LBA ; OFFSET OF LBA CALL LDHLIYA ; HL := IY + A, REG A TRASHED #IF (DSKYENABLE) + #IF (DSKYDSKACT) CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF #ENDIF OTIR RET diff --git a/Source/HBIOS/rf.asm b/Source/HBIOS/rf.asm index 8af08c78..f9bc94f1 100644 --- a/Source/HBIOS/rf.asm +++ b/Source/HBIOS/rf.asm @@ -314,9 +314,11 @@ RF_SETIO: RF_SETADR: ; #IF (DSKYENABLE) + #IF (DSKYDSKACT) LD A,RF_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF #ENDIF ; LD A,(RF_IO) ; OUTPUT THE LOGICAL BLOCK diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 380340e9..4782d4d5 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -170,6 +170,16 @@ start1: #if (INTMODE == 1) ei #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 @@ -231,18 +241,11 @@ prompt: call clrbuf ; zero fill the cmd buffer ; #if (DSKYENABLE) - call DSKY_PREINIT ; *** TEMPORARY *** - call DSKY_RESET ; clear DSKY 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 ; wtkey: @@ -251,8 +254,7 @@ wtkey: jr nz,concmd ; if pending, do console command ; #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 #endif ; @@ -295,11 +297,8 @@ concmd: call clrled ; clear LEDs ; #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 ; ; Get a command line from console and handle it @@ -516,15 +515,15 @@ fp_flopboot2: dskycmd: 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 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 cp KY_BO ; reboot system @@ -861,7 +860,7 @@ reboot: ; #if (DSKYENABLE) ld hl,msg_boot ; point to boot message - call DSKY_SHOW ; display message + call dsky_show ; display message #endif ; ; cold boot system @@ -893,7 +892,7 @@ romload: ; #if (DSKYENABLE) ld hl,msg_load ; point to load message - call DSKY_SHOW ; display message + call dsky_show ; display message #endif ; #if (BIOS == BIOS_WBW) @@ -977,7 +976,7 @@ romload1: ; #if (DSKYENABLE) ld hl,msg_go ; point to go message - call DSKY_SHOW ; display message + call dsky_show ; display message #endif ; ld l,(ix+ra_ent) ; HL := app entry address @@ -1002,7 +1001,7 @@ diskboot: ; #if (DSKYENABLE) ld hl,msg_load ; point to load message - call DSKY_SHOW ; display message + call dsky_show ; display message #endif ; #if (BIOS == BIOS_WBW) @@ -1286,7 +1285,7 @@ diskboot10: ; #if (DSKYENABLE) ld hl,msg_go ; point to go message - call DSKY_SHOW ; display message + call dsky_show ; display message #endif ; ; Jump to entry vector @@ -2061,6 +2060,60 @@ devunk .db "UNK",0 str_devlst .db "\r\n\r\nDisk Devices:",0 ; #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 @@ -2116,22 +2169,6 @@ str_err_sig .db "No system image on disk",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) ;======================================================================= ; @@ -2179,21 +2216,20 @@ str_help .db "\r\n" .db 0 ; #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_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 +;======================================================================= +; +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 ;======================================================================= ; @@ -2342,6 +2378,7 @@ bootslice .db 0 ; boot disk slice loadcnt .db 0 ; num disk sectors to load switches .db 0 ; front panel switches diskcnt .db 0 ; disk unit count value +dskyact .db 0 ; DSKY active if != 0 ; ;======================================================================= ; Pad remainder of ROM Loader diff --git a/Source/HBIOS/sd.asm b/Source/HBIOS/sd.asm index 39b44d90..3207b64b 100644 --- a/Source/HBIOS/sd.asm +++ b/Source/HBIOS/sd.asm @@ -1382,7 +1382,9 @@ SD_SETADDR: LD A,SD_LBA ; OFFSET OF LBA VALUE CALL LDHLIYA ; HL := IY + A, REG A TRASHED #IF (DSKYENABLE) + #IF (DSKYDSKACT) CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF #ENDIF CALL LD32 ; LOAD IT TO DE:HL, AF IS TRASHED POP AF ; GET CARD TYPE BACK @@ -1564,11 +1566,6 @@ SD_EXECCMD3: #IF (SDTRACE >= 3) CALL SD_PRTRC ; IF MAX TRACING, PRINT RC #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 RET Z ; IF RC = 0, NO ERROR, RETURN CALL SD_DONE ; IF ERROR, COMPLETE TRANSACTION @@ -2342,29 +2339,6 @@ SD_PRTPREFIX: CALL PC_COLON POP AF 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 diff --git a/Source/HBIOS/syq.asm b/Source/HBIOS/syq.asm index 8350d915..29126f9e 100644 --- a/Source/HBIOS/syq.asm +++ b/Source/HBIOS/syq.asm @@ -418,7 +418,9 @@ SYQ_IO: LD A,SYQ_LBA ; LBA OFFSET IN CONFIG CALL LDHLIYA ; POINT TO LBA DWORD #IF (DSKYENABLE) + #IF (DSKYDSKACT) CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF #ENDIF CALL LD32 ; SET DE:HL TO LBA ; diff --git a/Source/ver.inc b/Source/ver.inc index af20d72b..1d42d359 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 3 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.3.0-dev.26" +#DEFINE BIOSVER "3.3.0-dev.27" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index 99efa83e..8d53d433 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 3 rup equ 0 rtp equ 0 biosver macro - db "3.3.0-dev.26" + db "3.3.0-dev.27" endm