Compare commits

...

11 Commits

Author SHA1 Message Date
Wayne Warthen
364e48a5d3 IMM Driver Cleanup, PPA Driver Skeleton
IMM Driver has rational timeouts now.  It also lights the MG014 LED during activity.
The PPA skeleton just attempts to determine if the PPA interface is present.  It does not attempt any I/O.
2023-05-26 16:48:13 -07:00
Wayne Warthen
63cb89dcfc Preliminary IMM Driver (Zip Drive)
Thanks to Alan Cox for inspiring this.  Much of the code was usurped from Fuzix.
2023-05-23 18:35:18 -07:00
Wayne Warthen
6e316b46f0 Document p-System Volume Management Python Script
- Andrew Davidson created a nice Python script to extract/insert p-System volumes from/to disk images.  Added a reference to his website in the p-System ReadMe.txt file.
2023-05-11 14:20:54 -07:00
Wayne Warthen
3f23396536 Support for MG014 RCBus Parallel Port Module 2023-05-10 18:37:47 -07:00
Wayne Warthen
c628ba10f2 Workaround Z280 CPU Bug for LZSA2
The LZSA2 decompressor invoked a known Z280 CPU bug.  A small modification to the code resolves this.
2023-05-07 17:45:43 -07:00
Wayne Warthen
9358299f14 Z280 Workaround for VGARC
Z280 is having an issue with OTDR instruction when loading the font for VGARC.  For now, the use of OTDR has been eliminated.
2023-05-07 16:27:25 -07:00
Wayne Warthen
d445c4a015 Disable LZSA Compression for Z280
- The LZSA2 decompressor code is failing mysteriously on Z280 CPUs.  I have simply disabled it in the Z280 primary configuration file.
2023-05-04 14:14:36 -07:00
Wayne Warthen
e32002545b VGARC Improvements, Doc Fix
- Added ability to enable VGARC and front panel in default config without I/O conflicts (does **not** support having both types of hardware present at the same time).
- Fixed documentation error in issue #345 reported by @MorfeoMatrixx.
2023-05-03 15:58:12 -07:00
Wayne Warthen
7ac88efac1 Support for VGARC
Initial support for Bill Shen's VGARC video/keyboard module for RCBus.
2023-05-02 19:23:51 -07:00
Wayne Warthen
9f71fe05aa Cleanup IDE and PPIDE drivers
- The use of hardware reset has been improved such that it is generally only used at initial boot up.
- Minor improvements to CF card detection and initialization.
- Implement a simple wait mechanism to accommodate the startup time of the RC2014 SD Pico module.
- Front panel I/O port for SC series of systems has been moved to 0x00 which is consistent with all other systems and avoids some I/O conflicts.
2023-04-30 12:03:16 -07:00
Wayne Warthen
ad3c533145 Fix IDE Detection on Spinning Disks
Prior improvement to IDE device detection broke detection of spinning hard disks.  IDE registers cannot be used prior to device init completion (spin up).  Not a problem for CF, but special steps required to ensure devices are fully initialized before register testing.
2023-04-23 18:47:43 -07:00
78 changed files with 4816 additions and 844 deletions

View File

@@ -5,6 +5,9 @@ Version 3.3
- A?C: Support for SD PIO
- A?C: Support for Z80-Retro SD interface
- WBW: Support per-drive floppy configuration
- WBW: Support for Bill Shen's VGARC
- WBW: Support for MG014 Parallel Port module + printer
- WBW: Support for Zip Drive on emm interface (much inspiration from Alan Cox)
Version 3.2.1
-------------

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -3,7 +3,7 @@
**RomWBW ReadMe** \
Version 3.3 \
Wayne Warthen ([wwarthen@gmail.com](mailto:wwarthen@gmail.com)) \
16 Apr 2023
23 May 2023
# Overview

View File

@@ -1,6 +1,6 @@
RomWBW ReadMe
Wayne Warthen (wwarthen@gmail.com)
16 Apr 2023
23 May 2023

View File

@@ -1918,8 +1918,8 @@ dev06 .db "SD",0
dev07 .db "PRPSD",0
dev08 .db "PPPSD",0
dev09 .db "HDSK",0
dev10 .equ devunk
dev11 .equ devunk
dev10 .db "PPA",0
dev11 .db "IMM",0
dev12 .equ devunk
dev13 .equ devunk
dev14 .equ devunk

View File

@@ -2929,6 +2929,12 @@ DRV_INIT3:
RET
;
DRV_INIT3A:
; CHECK FOR HARD DISK REMOVABLE CARTRIDGE DRIVES
CP DIODEV_PPA ; PPA (ZIP DRIVE) IS REMOVABLE
JR Z,DRV_INIT3B ; IF SO, SKIP MEDIA CHECK
CP DIODEV_IMM ; IMM (ZIP DRIVE) IS REMOVABLE
JR Z,DRV_INIT3B ; IF SO, SKIP MEDIA CHECK
; CHECK FOR ACTIVE AND RETURN IF NOT
PUSH DE ; SAVE DE (HARD DISK VOLUME COUNTER)
PUSH HL ; SAVE DRIVE LIST PTR
@@ -2944,6 +2950,7 @@ DRV_INIT3A:
RET NZ ; IF NO MEDIA, JUST RETURN
DRV_INIT3B:
; IF ACTIVE...
LD (HL),C ; SAVE UNIT NUM IN LIST
INC HL ; BUMP PTR
@@ -3392,8 +3399,8 @@ DEV06 .DB "SD$"
DEV07 .DB "PRPSD$"
DEV08 .DB "PPPSD$"
DEV09 .DB "HDSK$"
DEV10 .EQU DEVUNK
DEV11 .EQU DEVUNK
DEV10 .DB "PPA$"
DEV11 .DB "IMM$"
DEV12 .EQU DEVUNK
DEV13 .EQU DEVUNK
DEV14 .EQU DEVUNK

View File

@@ -181,6 +181,12 @@ dinit3:
ret
;
dinit3a:
; check for hard disk removable cartridge drives
cp 0A0h ; ppa (zip drive) is removable
jr z,dinit3b ; if so, skip media check
cp 0B0h ; imm (zip drive) is removable
jr z,dinit3b ; if so, skip media check
; check for active and return if not
push de ; save de (hard disk volume counter)
push hl ; save drive list ptr
@@ -195,7 +201,8 @@ dinit3a:
pop de ; restore de
ret nz ; if no media, just return
dinit3b:
; if active...
ld (hl),c ; save unit num in list
inc hl ; bump ptr

View File

@@ -889,6 +889,28 @@ written in C and requires SDCC to compile. As such it is not part of
the RomWBW build process. However, the full project and source code is
found in the [FAT GitHub Repository](https://github.com/wwarthen/FAT).
## Known Issues
CP/M (and workalike) OSes have significant restrictions on filename
characters. The FAT application will block any attempt to create a
file on the CP/M filesystem containing any of these prohibited
characters:
| `< > . , ; : = ? * [ ] _ % | ( ) / \`
The operation will be aborted with "`Error: Invalid Path Name`" if such
a filename character is encountered.
Since MS-DOS does allow some of these characters, you can have
issues when copying files from MS-DOS to CP/M if the MS-DOS filenames
use these characters. Unfortunately, FAT is not yet smart enough to
substitute illegal characters with legal ones. So, you will need to
clean the filenames before trying to copy them to CP/M.
The FAT application does try to detect the scenario where you are
copying a file to itself. However, this detection is not perfect and
can corrupt a file if it occurs. Be careful to avoid this.
`\clearpage`{=latex}
# TUNE

View File

@@ -2221,7 +2221,7 @@ rate of the ASCI port(s) will be affected.
| **Entry Parameters** | **Returned Values** |
|----------------------------------------|----------------------------------------|
| B: 0xF8 | A: Status |
| B: 0xF9 | A: Status |
| C: 0xF4 | |
| L: LEDs | |

View File

@@ -3808,6 +3808,7 @@ the RomWBW HBIOS configuration.
- WDC Floppy Disk Controller w/ 3.5" HD Drives
- Onboard IDE Hard Disk Interface Module
- PPIDE Hard Disk Interface Module
- VGARC Video & Keyboard Module
- Serial baud rate is usually determined by hardware for ACIA and
SIO interfaces
@@ -3831,6 +3832,7 @@ the RomWBW HBIOS configuration.
- WDC Floppy Disk Controller w/ 3.5" HD Drives
- Onboard IDE Hard Disk Interface Module
- PPIDE Hard Disk Interface Module
- VGARC Video & Keyboard Module
- Serial baud rate is usually determined by hardware for ACIA and
SIO interfaces
@@ -3854,6 +3856,7 @@ the RomWBW HBIOS configuration.
- WDC Floppy Disk Controller w/ 3.5" HD Drives
- Onboard IDE Hard Disk Interface Module
- PPIDE Hard Disk Interface Module
- VGARC Video & Keyboard Module
- Serial baud rate is usually determined by hardware for ACIA and
SIO interfaces
@@ -3893,7 +3896,8 @@ may be discovered by RomWBW in your system.
| DSKY | System | Keypad & Display |
| DSRTC | RTC | Maxim DS1302 Real-Time Clock w/ NVRAM |
| DUART | Char | SCC2681 or compatible Dual UART |
| FD | Disk | 8272 of compatible Floppy Disk Controller |
| EMM | Disk | Disk drive on Parallel Port emm interface (Zip Drive) |
| FD | Disk | 8272 or compatible Floppy Disk Controller |
| GDC | Video | uPD7220 Video Display Controller |
| HDSK | Disk | SIMH Simulator Hard Disk |
| IDE | Disk | IDE/ATA Hard Disk Interface |
@@ -3923,5 +3927,6 @@ may be discovered by RomWBW in your system.
| USB-FIFO | Char | FT232H-based ECB USB FIFO |
| VDU | Video | MC6845 Family Video Display Controller |
| VGA | Video | HD6445CP4-based Video Display Controller |
| VRC | Video | VGARC Video Display Controller |
| YM | Audio | YM2612 Programmable Sound Generator |
| Z2U | Char | Zilog Z280 CPU Built-in Serial Ports |

View File

@@ -11,8 +11,8 @@ echo Preparing compressed font files...
lzsa -f2 -r font8x8u.bin font8x8c.bin || exit /b
lzsa -f2 -r font8x11u.bin font8x11c.bin || exit /b
lzsa -f2 -r font8x16u.bin font8x16c.bin || exit /b
lzsa -f2 -r fontcgau.bin fontcgac.bin || exit /b
lzsa -f2 -r fontvgarcu.bin fontvgarcc.bin || exit /b
fonttool font8x8u.bin > font8x8u.asm || exit /b
fonttool font8x11u.bin > font8x11u.asm || exit /b
@@ -20,6 +20,7 @@ fonttool font8x16u.bin > font8x16u.asm || exit /b
fonttool font8x8c.bin > font8x8c.asm || exit /b
fonttool font8x11c.bin > font8x11c.asm || exit /b
fonttool font8x16c.bin > font8x16c.asm || exit /b
fonttool fontcgau.bin > fontcgau.asm || exit /b
fonttool fontcgac.bin > fontcgac.asm || exit /b
fonttool fontvgarcu.bin > fontvgarcu.asm || exit /b
fonttool fontvgarcc.bin > fontvgarcc.asm || exit /b

View File

@@ -1,8 +1,8 @@
OBJECTS = \
font8x8u.asm font8x11u.asm font8x16u.asm fontcgau.asm \
font8x8c.asm font8x11c.asm font8x16c.asm fontcgac.asm
font8x8u.asm font8x11u.asm font8x16u.asm fontcgau.asm fontvgarcu.asm \
font8x8c.asm font8x11c.asm font8x16c.asm fontcgac.asm fontvgarcc.asm
OTHERS = font8x8c.bin font8x11c.bin font8x16c.bin fontcgac.bin
OTHERS = font8x8c.bin font8x11c.bin font8x16c.bin fontcgac.bin fontvgarcc.bin
TOOLS = ../../Tools
@@ -26,5 +26,8 @@ font8x16c.bin: font8x16u.bin
fontcgac.bin: fontcgau.bin
$(BINDIR)/lzsa -f2 -r $< $@
fontvgarcc.bin: fontvgarcu.bin
$(BINDIR)/lzsa -f2 -r $< $@
%.asm: %.bin
$(BINDIR)/bin2asm $< > $@

BIN
Source/Fonts/fontvgarcu.bin Normal file

Binary file not shown.

View File

@@ -48,6 +48,8 @@ DSKYMODE .SET DSKYMODE_NG ; DSKY VERSION: DSKYMODE_[V1|NG]
UARTINTS .SET FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3
;UARTCFG .SET UARTCFG | SER_RTS
;
LPTENABLE .SET TRUE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM)
;
CVDUMON .SET CVDUMON_CGA ; CVDU: CVDU MONITOR SETUP: CVDUMON_[NONE|CGA|EGA]
;
FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM)

View File

@@ -29,7 +29,8 @@
CPUOSC .SET 18432000 ; CPU OSC FREQ IN MHZ
CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS
FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES
;
MEMMGR .SET MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180]
;
@@ -48,6 +49,7 @@ SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM)
TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO]
MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER)
VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
;
;

View File

@@ -29,7 +29,8 @@
CPUOSC .SET 18432000 ; CPU OSC FREQ IN MHZ
CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS
FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES
;
MEMMGR .SET MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180]
;
@@ -48,9 +49,9 @@ SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM)
TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO]
MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER)
VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
;
;
AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
AYMODE .SET AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC]
SN76489ENABLE .SET FALSE ; SN: ENABLE SN76489 SOUND DRIVER

View File

@@ -30,7 +30,8 @@ CPUOSC .SET 12000000 ; CPU OSC FREQ IN MHZ
INTMODE .SET 1 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2
CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS
FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES
;
MEMMGR .SET MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180]
;
@@ -47,6 +48,7 @@ SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM)
TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO]
MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER)
VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
;
AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER

View File

@@ -30,7 +30,8 @@ CPUOSC .SET 12000000 ; CPU OSC FREQ IN MHZ
INTMODE .SET 3 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2
CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS
FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES
;
MEMMGR .SET MM_Z280 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280]
;
@@ -47,6 +48,7 @@ SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM)
TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO]
MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER)
VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
;
AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER

View File

@@ -32,7 +32,8 @@ CPUOSC .SET 12000000 ; CPU OSC FREQ IN MHZ
INTMODE .SET 3 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2
CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS
FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES
;
MEMMGR .SET MM_Z280 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280]
;
@@ -53,7 +54,8 @@ SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM)
TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO]
MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER)
VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
VRCENABLE .SET TRUE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
VDAEMU_SERKBD .SET $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
;
AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
AYMODE .SET AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC]

View File

@@ -32,7 +32,8 @@ CPUOSC .SET 14745600 ; CPU OSC FREQ IN MHZ
INTMODE .SET 3 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2
CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS
FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES
;
MEMMGR .SET MM_Z280 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280]
;
@@ -61,7 +62,8 @@ SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM)
TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO]
MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER)
VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
VRCENABLE .SET TRUE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
VDAEMU_SERKBD .SET $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
;
AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
AYMODE .SET AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC]

View File

@@ -33,13 +33,12 @@ CPUOSC .SET 10000000 ; CPU OSC FREQ IN MHZ
CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
INTMODE .SET 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280)
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS
FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES
;
WDOGMODE .SET WDOG_EZZ80 ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
WDOGIO .SET $6F ; WATCHDOG REGISTER ADR
;
DIAGENABLE .SET FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
;
DSRTCENABLE .SET TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM)
RP5RTCENABLE .SET FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM)
;
@@ -62,6 +61,7 @@ TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO]
MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER)
VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
;
AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
@@ -75,5 +75,6 @@ IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM)
PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM)
SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM)
SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT SC ONLY
IMMENABLE .SET FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
;
PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM)

View File

@@ -30,7 +30,8 @@ CPUOSC .SET 7372800 ; CPU OSC FREQ IN MHZ
INTMODE .SET 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2
CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS
FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES
;
DSRTCENABLE .SET TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM)
RP5RTCENABLE .SET FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM)
@@ -57,6 +58,7 @@ TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO]
MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER)
VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
;
AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
@@ -70,5 +72,6 @@ IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM)
PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM)
SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM)
SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT SC ONLY
IMMENABLE .SET FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
;
PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM)

View File

@@ -29,7 +29,8 @@
CPUOSC .SET 7372800 ; CPU OSC FREQ IN MHZ
CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS
FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES
;
SKZENABLE .SET TRUE ; ENABLE SERGEY'S Z80-512K FEATURES
SKZDIV .SET DIV_12 ; UART CLK (CLK2) DIVIDER FOR Z80-512K
@@ -52,6 +53,7 @@ TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO]
MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER)
VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
;
AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
@@ -65,5 +67,6 @@ IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM)
PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM)
SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM)
SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT SC ONLY
IMMENABLE .SET FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
;
PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM)

View File

@@ -29,7 +29,8 @@
CPUOSC .SET 7372800 ; CPU OSC FREQ IN MHZ
CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS
FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES
;
DSRTCENABLE .SET TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM)
RP5RTCENABLE .SET FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM)
@@ -39,10 +40,13 @@ ACIAENABLE .SET TRUE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM)
SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM)
DUARTENABLE .SET FALSE ; DUART: ENABLE 2681/2692 SERIAL DRIVER (DUART.ASM)
;
LPTENABLE .SET FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM)
;
TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO]
MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER)
VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
;
AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
@@ -57,5 +61,6 @@ PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM)
SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM)
SDMODE .SET SDMODE_PIO ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|PIO|USR]
SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT SC ONLY
IMMENABLE .SET FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
;
PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM)

View File

@@ -33,13 +33,13 @@ CPUOSC .SET 16000000 ; CPU OSC FREQ IN MHZ
CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
INTMODE .SET 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280)
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS
FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES
;
EIPCENABLE .SET TRUE ; EIPC: ENABLE Z80 EIPC (Z84C15) INITIALIZATION
WDOGMODE .SET WDOG_EZZ80 ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
WDOGIO .SET $6F ; WATCHDOG REGISTER ADR
;
DIAGENABLE .SET FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
LEDENABLE .SET TRUE ; ENABLES STATUS LED (SINGLE LED)
LEDPORT .SET $6E ; STATUS LED PORT ADDRESS
;
@@ -67,6 +67,7 @@ TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO]
MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER)
VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
;
AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
@@ -81,5 +82,6 @@ IDE0BASE .SET $90 ; IDE 0: IO BASE ADDRESS
PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM)
SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM)
SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT SC ONLY
IMMENABLE .SET FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
;
PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM)

View File

@@ -30,7 +30,8 @@
CPUOSC .SET 14745600 ; CPU OSC FREQ IN MHZ
CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS
FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES
;
RAMSIZE .SET 1536 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!)
MEMMGR .SET MM_ZRC ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180]
@@ -44,7 +45,8 @@ TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO]
MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER)
VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
VRCENABLE .SET TRUE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
VDAEMU_SERKBD .SET $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
;
AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
AYMODE .SET AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC]
@@ -57,5 +59,6 @@ IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM)
PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM)
SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM)
SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT SC ONLY
IMMENABLE .SET FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
;
PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM)

View File

@@ -31,7 +31,8 @@
CPUOSC .SET 7372800 ; CPU OSC FREQ IN MHZ
CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS
FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES
;
RAMSIZE .SET 2048 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!)
ROMSIZE .SET 0 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!)
@@ -48,6 +49,7 @@ TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO]
MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER)
VRCENABLE .SET TRUE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
;
AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
@@ -61,5 +63,6 @@ IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM)
PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM)
SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM)
SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT SC ONLY
IMMENABLE .SET FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
;
PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM)

View File

@@ -35,7 +35,8 @@ USELZSA2 .SET TRUE ; ENABLE FONT COMPRESSION
;
KIOENABLE .SET TRUE ; ENABLE ZILOG KIO SUPPORT
;
DIAGENABLE .SET TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
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)
;

View File

@@ -35,9 +35,9 @@ Z180_CLKDIV .SET 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2
Z180_MEMWAIT .SET 0 ; Z180: MEMORY WAIT STATES (0-3)
Z180_IOWAIT .SET 1 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3)
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
DIAGENABLE .SET TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .SET $0D ; DIAGNOSTIC PORT ADDRESS
FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS
FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES
FPLED_IO .SET $0D ; FP: PORT ADDRESS FOR FP LEDS
;
DSRTCENABLE .SET TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM)
INTRTCENABLE .SET TRUE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM)
@@ -51,6 +51,7 @@ TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO]
MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER)
VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
;
AY38910ENABLE .SET TRUE ; AY: AY-3-8910 / YM2149 SOUND DRIVER

View File

@@ -35,8 +35,10 @@ Z180_CLKDIV .SET 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2
Z180_MEMWAIT .SET 0 ; Z180: MEMORY WAIT STATES (0-3)
Z180_IOWAIT .SET 1 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3)
;
FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS
FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES
;
LEDENABLE .SET TRUE ; ENABLE STATUS LED (SINGLE LED)
DIAGENABLE .SET FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
;
DSRTCENABLE .SET TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM)
INTRTCENABLE .SET TRUE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM)
@@ -50,6 +52,7 @@ TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO]
MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER)
VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
;
AY38910ENABLE .SET TRUE ; AY: AY-3-8910 / YM2149 SOUND DRIVER

View File

@@ -34,8 +34,10 @@ Z180_CLKDIV .SET 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2
Z180_MEMWAIT .SET 0 ; Z180: MEMORY WAIT STATES (0-3)
Z180_IOWAIT .SET 1 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3)
;
FPLED_ENABLE .SET FALSE ; FP: ENABLES FRONT PANEL LEDS
FPSW_ENABLE .SET FALSE ; FP: ENABLES FRONT PANEL SWITCHES
;
LEDENABLE .SET TRUE ; ENABLE STATUS LED (SINGLE LED)
DIAGENABLE .SET FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
;
DSRTCENABLE .SET FALSE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM)
INTRTCENABLE .SET TRUE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM)

View File

@@ -34,11 +34,10 @@ Z180_CLKDIV .SET 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2
Z180_MEMWAIT .SET 0 ; Z180: MEMORY WAIT STATES (0-3)
Z180_IOWAIT .SET 1 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3)
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
FPBASE .SET $A0 ; FRONT PANEL I/O PORT BASE ADDRESS
FPLED_ENABLE .SET FALSE ; FP: ENABLES FRONT PANEL LEDS
FPSW_ENABLE .SET FALSE ; FP: ENABLES FRONT PANEL SWITCHES
;
LEDENABLE .SET TRUE ; ENABLE STATUS LED (SINGLE LED)
DIAGENABLE .SET TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .SET $A0 ; DIAGNOSTIC PORT ADDRESS
;
DSRTCENABLE .SET TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM)
INTRTCENABLE .SET TRUE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM)

View File

@@ -34,11 +34,10 @@ Z180_CLKDIV .SET 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2
Z180_MEMWAIT .SET 0 ; Z180: MEMORY WAIT STATES (0-3)
Z180_IOWAIT .SET 1 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3)
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
FPBASE .SET $A0 ; FRONT PANEL I/O PORT BASE ADDRESS
FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS
FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES
;
LEDENABLE .SET TRUE ; ENABLE STATUS LED (SINGLE LED)
DIAGENABLE .SET TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .SET $A0 ; DIAGNOSTIC PORT ADDRESS
;
DSRTCENABLE .SET TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM)
INTRTCENABLE .SET TRUE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM)

View File

@@ -24,7 +24,8 @@ endif
include $(TOOLS)/Makefile.inc
FONTS := font8x11c.asm font8x11u.asm font8x16c.asm font8x16u.asm font8x8c.asm font8x8u.asm fontcgac.asm fontcgau.asm
FONTS := font8x11c.asm font8x11u.asm font8x16c.asm font8x16u.asm font8x8c.asm font8x8u.asm \
fontcgac.asm fontcgau.asm fontvgarcc.asm fontvgarcu.asm
ifeq ($(CPUFAM),2)
TASM=$(BINDIR)/uz80as -t hd64180

View File

@@ -634,9 +634,9 @@ ANSI_BEL:
ANSI_BS:
LD A,(ANSI_COL) ; GET CURRENT COLUMN
DEC A ; BACK IT UP BY ONE
RET C ; IF CARRY, MARGIN EXCEEDED, ABORT
RET M ; IF CARRY, MARGIN EXCEEDED, ABORT
LD (ANSI_COL),A ; SAVE NEW COLUMN
JP ANSI_XY ; UDPATE CUSROR AND RETURN
JP ANSI_XY ; UDPATE CURSOR AND RETURN
;
ANSI_CR:
XOR A ; ZERO ACCUM

View File

@@ -66,11 +66,12 @@ SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES
;
WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
;
FPENABLE .EQU FALSE ; ENABLES FRONT PANEL SWITCHES
FPBASE .EQU $00 ; FRONT PANEL I/O PORT BASE ADDRESS
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS
FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
;
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
;
LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED)
@@ -174,6 +175,7 @@ TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO]
TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
;
MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM)
MDROM .EQU TRUE ; MD: ENABLE ROM DISK
@@ -250,6 +252,10 @@ PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR
;
LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM)
;
PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM)
;
IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
;
PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP

View File

@@ -95,11 +95,12 @@ SKZDIV .EQU DIV_1 ; UART CLK (CLK2) DIVIDER FOR Z80-512K
WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
WDOGIO .EQU $6F ; WATCHDOG REGISTER ADR
;
FPENABLE .EQU FALSE ; ENABLES FRONT PANEL SWITCHES
FPBASE .EQU $00 ; FRONT PANEL I/O PORT BASE ADDRESS
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS
FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
;
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
;
LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED)
@@ -228,6 +229,7 @@ TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|M
TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43]
VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
;
MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM)
MDROM .EQU TRUE ; MD: ENABLE ROM DISK
@@ -309,10 +311,28 @@ PIO0BASE .EQU $B8 ; PIO 0: REGISTERS BASE ADR
PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR
;
LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM)
LPTMODE .EQU LPTMODE_NONE ; LPT: DRIVER MODE: LPTMODE_[NONE|IBM|MG014]
LPTCNT .EQU 1 ; LPT: NUMBER OF CHIPS TO DETECT (1-2)
LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
LPT0BASE .EQU $E8 ; LPT 0: REGISTERS BASE ADR
LPT1BASE .EQU $EC ; LPT 1: REGISTERS BASE ADR
;
PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM)
PPACNT .EQU 1 ; PPA: NUMBER OF PPA DEVICES (1-2)
PPATRACE .EQU 1 ; PPA: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
PPA0MODE .EQU PPAMODE_MG014 ; PPA 0: DRIVER MODE: PPAMODE_[NONE|MG014]
PPA0BASE .EQU LPT0BASE ; PPA 0: BASE I/O ADDRESS OF PPI FOR PPA
PPA1MODE .EQU PPAMODE_MG014 ; PPA 1: DRIVER MODE: PPAMODE_[NONE|MG014]
PPA1BASE .EQU LPT1BASE ; PPA 1: BASE I/O ADDRESS OF PPI FOR PPA
;
IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
IMMCNT .EQU 1 ; IMM: NUMBER OF IMM DEVICES (1-2)
IMMTRACE .EQU 1 ; IMM: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
IMM0MODE .EQU IMMMODE_MG014 ; IMM 0: DRIVER MODE: IMMMODE_[NONE|MG014]
IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM
IMM1MODE .EQU IMMMODE_MG014 ; IMM 1: DRIVER MODE: IMMMODE_[NONE|MG014]
IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM
;
PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO4BASE .EQU $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD
PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)

View File

@@ -60,11 +60,12 @@ SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES
;
WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
;
FPENABLE .EQU FALSE ; ENABLES FRONT PANEL SWITCHES
FPBASE .EQU $00 ; FRONT PANEL I/O PORT BASE ADDRESS
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS
FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
;
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
;
LEDENABLE .EQU TRUE ; ENABLES STATUS LED
@@ -156,6 +157,7 @@ TMSMODE .EQU TMSMODE_MBC ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MS
TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43]
VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
;
MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM)
MDROM .EQU TRUE ; MD: ENABLE ROM DISK
@@ -232,11 +234,29 @@ PIOCNT .EQU 2 ; PIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP
PIO0BASE .EQU $B8 ; PIO 0: REGISTERS BASE ADR
PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR
;
LPTENABLE .EQU TRUE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM)
LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM)
LPTMODE .EQU LPTMODE_IBM ; LPT: DRIVER MODE: LPTMODE_[NONE|IBM|MG014]
LPTCNT .EQU 1 ; LPT: NUMBER OF CHIPS TO DETECT (1-2)
LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
LPT0BASE .EQU $E8 ; LPT 0: REGISTERS BASE ADR
LPT1BASE .EQU $EC ; LPT 1: REGISTERS BASE ADR
;
PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM)
PPACNT .EQU 1 ; PPA: NUMBER OF PPA DEVICES (1-2)
PPATRACE .EQU 1 ; PPA: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
PPA0MODE .EQU PPAMODE_MG014 ; PPA 0: DRIVER MODE: PPAMODE_[NONE|MG014]
PPA0BASE .EQU LPT0BASE ; PPA 0: BASE I/O ADDRESS OF PPI FOR PPA
PPA1MODE .EQU PPAMODE_MG014 ; PPA 1: DRIVER MODE: PPAMODE_[NONE|MG014]
PPA1BASE .EQU LPT1BASE ; PPA 1: BASE I/O ADDRESS OF PPI FOR PPA
;
IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
IMMCNT .EQU 1 ; IMM: NUMBER OF IMM DEVICES (1-2)
IMMTRACE .EQU 1 ; IMM: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
IMM0MODE .EQU IMMMODE_MG014 ; IMM 0: DRIVER MODE: IMMMODE_[NONE|MG014]
IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM
IMM1MODE .EQU IMMMODE_MG014 ; IMM 1: DRIVER MODE: IMMMODE_[NONE|MG014]
IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM
;
PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO4BASE .EQU $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD
PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)

View File

@@ -66,11 +66,12 @@ SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES
;
WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
;
FPENABLE .EQU FALSE ; ENABLES FRONT PANEL SWITCHES
FPBASE .EQU $00 ; FRONT PANEL I/O PORT BASE ADDRESS
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS
FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
;
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
;
LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED)
@@ -167,6 +168,7 @@ TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MS
TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43]
VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
;
MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM)
MDROM .EQU TRUE ; MD: ENABLE ROM DISK
@@ -246,10 +248,16 @@ PIO0BASE .EQU $B8 ; PIO 0: REGISTERS BASE ADR
PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR
;
LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM)
LPTMODE .EQU LPTMODE_NONE ; LPT: DRIVER MODE: LPTMODE_[NONE|IBM|MG014]
LPTCNT .EQU 1 ; LPT: NUMBER OF CHIPS TO DETECT (1-2)
LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
LPT0BASE .EQU $E8 ; LPT 0: REGISTERS BASE ADR
LPT1BASE .EQU $EC ; LPT 1: REGISTERS BASE ADR
;
PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM)
;
IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
;
PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO4BASE .EQU $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD
PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)

View File

@@ -68,11 +68,12 @@ SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES
;
WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
;
FPENABLE .EQU FALSE ; ENABLES FRONT PANEL SWITCHES
FPBASE .EQU $00 ; FRONT PANEL I/O PORT BASE ADDRESS
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS
FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
;
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
;
LEDENABLE .EQU FALSE ; ENABLES STATUS LED
@@ -169,6 +170,7 @@ TMSMODE .EQU TMSMODE_N8 ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSX
TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43]
VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
;
MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM)
MDROM .EQU TRUE ; MD: ENABLE ROM DISK
@@ -245,6 +247,10 @@ PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR
;
LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM)
;
PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM)
;
IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
;
PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO4BASE .EQU $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD
PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)

View File

@@ -71,6 +71,13 @@ FPBASE .EQU $00 ; FRONT PANEL I/O PORT BASE ADDRESS
DIAGENABLE .EQU TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS
;
FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
FPSW_ENABLE .EQU TRUE ; FP: ENABLES FRONT PANEL SWITCHES
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
;
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
;
LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED)
@@ -174,6 +181,7 @@ TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO]
TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
;
MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM)
MDROM .EQU TRUE ; MD: ENABLE ROM DISK
@@ -249,6 +257,27 @@ PIO0BASE .EQU $B8 ; PIO 0: REGISTERS BASE ADR
PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR
;
LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM)
LPTMODE .EQU LPTMODE_MG014 ; LPT: DRIVER MODE: LPTMODE_[NONE|IBM|MG014]
LPTCNT .EQU 1 ; LPT: NUMBER OF CHIPS TO DETECT (1-2)
LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
LPT0BASE .EQU $18 ; LPT 0: REGISTERS BASE ADR
LPT1BASE .EQU $00 ; LPT 1: REGISTERS BASE ADR
;
PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM)
PPACNT .EQU 1 ; PPA: NUMBER OF PPA DEVICES (1-2)
PPATRACE .EQU 1 ; PPA: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
PPA0MODE .EQU PPAMODE_MG014 ; PPA 0: DRIVER MODE: PPAMODE_[NONE|MG014]
PPA0BASE .EQU LPT0BASE ; PPA 0: BASE I/O ADDRESS OF PPI FOR PPA
PPA1MODE .EQU PPAMODE_MG014 ; PPA 1: DRIVER MODE: PPAMODE_[NONE|MG014]
PPA1BASE .EQU LPT1BASE ; PPA 1: BASE I/O ADDRESS OF PPI FOR PPA
;
IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
IMMCNT .EQU 1 ; IMM: NUMBER OF IMM DEVICES (1-2)
IMMTRACE .EQU 1 ; IMM: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
IMM0MODE .EQU IMMMODE_MG014 ; IMM 0: DRIVER MODE: IMMMODE_[NONE|MG014]
IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM
IMM1MODE .EQU IMMMODE_MG014 ; IMM 1: DRIVER MODE: IMMMODE_[NONE|MG014]
IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM
;
PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)

View File

@@ -66,11 +66,12 @@ SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES
;
WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
;
FPENABLE .EQU FALSE ; ENABLES FRONT PANEL SWITCHES
FPBASE .EQU $00 ; FRONT PANEL I/O PORT BASE ADDRESS
DIAGENABLE .EQU TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS
FPLED_ENABLE .EQU TRUE ; FP: ENABLES FRONT PANEL LEDS
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
;
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
;
LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED)
@@ -184,6 +185,7 @@ TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO]
TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
;
MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM)
MDROM .EQU TRUE ; MD: ENABLE ROM DISK
@@ -259,6 +261,27 @@ PIO0BASE .EQU $B8 ; PIO 0: REGISTERS BASE ADR
PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR
;
LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM)
LPTMODE .EQU LPTMODE_MG014 ; LPT: DRIVER MODE: LPTMODE_[NONE|IBM|MG014]
LPTCNT .EQU 1 ; LPT: NUMBER OF CHIPS TO DETECT (1-2)
LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
LPT0BASE .EQU $18 ; LPT 0: REGISTERS BASE ADR
LPT1BASE .EQU $00 ; LPT 1: REGISTERS BASE ADR
;
PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM)
PPACNT .EQU 1 ; PPA: NUMBER OF PPA DEVICES (1-2)
PPATRACE .EQU 1 ; PPA: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
PPA0MODE .EQU PPAMODE_MG014 ; PPA 0: DRIVER MODE: PPAMODE_[NONE|MG014]
PPA0BASE .EQU LPT0BASE ; PPA 0: BASE I/O ADDRESS OF PPI FOR PPA
PPA1MODE .EQU PPAMODE_MG014 ; PPA 1: DRIVER MODE: PPAMODE_[NONE|MG014]
PPA1BASE .EQU LPT1BASE ; PPA 1: BASE I/O ADDRESS OF PPI FOR PPA
;
IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
IMMCNT .EQU 1 ; IMM: NUMBER OF IMM DEVICES (1-2)
IMMTRACE .EQU 1 ; IMM: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
IMM0MODE .EQU IMMMODE_MG014 ; IMM 0: DRIVER MODE: IMMMODE_[NONE|MG014]
IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM
IMM1MODE .EQU IMMMODE_MG014 ; IMM 1: DRIVER MODE: IMMMODE_[NONE|MG014]
IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM
;
PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)

View File

@@ -65,11 +65,12 @@ SKZDIV .EQU DIV_1 ; UART CLK (CLK2) DIVIDER FOR Z80-512K
WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
WDOGIO .EQU $6E ; WATCHDOG REGISTER ADR
;
FPENABLE .EQU FALSE ; ENABLES FRONT PANEL SWITCHES
FPBASE .EQU $00 ; FRONT PANEL I/O PORT BASE ADDRESS
DIAGENABLE .EQU TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS
FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
;
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
;
LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED)
@@ -86,8 +87,8 @@ VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE]
KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE]
PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE]
MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER)
MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE]
;
@@ -178,6 +179,7 @@ TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO]
TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
;
MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM)
MDROM .EQU TRUE ; MD: ENABLE ROM DISK
@@ -253,6 +255,27 @@ PIO0BASE .EQU $B8 ; PIO 0: REGISTERS BASE ADR
PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR
;
LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM)
LPTMODE .EQU LPTMODE_MG014 ; LPT: DRIVER MODE: LPTMODE_[NONE|IBM|MG014]
LPTCNT .EQU 1 ; LPT: NUMBER OF CHIPS TO DETECT (1-2)
LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
LPT0BASE .EQU $0C ; LPT 0: REGISTERS BASE ADR
LPT1BASE .EQU $00 ; LPT 1: REGISTERS BASE ADR
;
PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM)
PPACNT .EQU 1 ; PPA: NUMBER OF PPA DEVICES (1-2)
PPATRACE .EQU 1 ; PPA: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
PPA0MODE .EQU PPAMODE_MG014 ; PPA 0: DRIVER MODE: PPAMODE_[NONE|MG014]
PPA0BASE .EQU LPT0BASE ; PPA 0: BASE I/O ADDRESS OF PPI FOR PPA
PPA1MODE .EQU PPAMODE_MG014 ; PPA 1: DRIVER MODE: PPAMODE_[NONE|MG014]
PPA1BASE .EQU LPT1BASE ; PPA 1: BASE I/O ADDRESS OF PPI FOR PPA
;
IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
IMMCNT .EQU 1 ; IMM: NUMBER OF IMM DEVICES (1-2)
IMMTRACE .EQU 1 ; IMM: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
IMM0MODE .EQU IMMMODE_MG014 ; IMM 0: DRIVER MODE: IMMMODE_[NONE|MG014]
IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM
IMM1MODE .EQU IMMMODE_MG014 ; IMM 1: DRIVER MODE: IMMMODE_[NONE|MG014]
IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM
;
PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)

View File

@@ -66,11 +66,12 @@ SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES
;
WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
;
FPENABLE .EQU FALSE ; ENABLES FRONT PANEL SWITCHES
FPBASE .EQU $00 ; FRONT PANEL I/O PORT BASE ADDRESS
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS
FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
;
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
;
LEDENABLE .EQU FALSE ; ENABLES STATUS LED
@@ -158,6 +159,7 @@ TMSMODE .EQU TMSMODE_N8 ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSX
TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43]
VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
;
MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM)
MDROM .EQU TRUE ; MD: ENABLE ROM DISK
@@ -234,6 +236,10 @@ PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR
;
LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM)
;
PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM)
;
IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
;
PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO4BASE .EQU $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD
PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)

View File

@@ -60,11 +60,12 @@ SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES
;
WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
;
FPENABLE .EQU FALSE ; ENABLES FRONT PANEL SWITCHES
FPBASE .EQU $00 ; FRONT PANEL I/O PORT BASE ADDRESS
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS
FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
;
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
;
LEDENABLE .EQU FALSE ; ENABLES STATUS LED
@@ -156,6 +157,7 @@ TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MS
TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43]
VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
;
MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM)
MDROM .EQU TRUE ; MD: ENABLE ROM DISK
@@ -232,9 +234,10 @@ PIO0BASE .EQU $B8 ; PIO 0: REGISTERS BASE ADR
PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR
;
LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM)
LPTCNT .EQU 1 ; LPT: NUMBER OF CHIPS TO DETECT (1-2)
LPT0BASE .EQU $E8 ; LPT 0: REGISTERS BASE ADR
LPT1BASE .EQU $EC ; LPT 1: REGISTERS BASE ADR
;
PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM)
;
IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
;
PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO4BASE .EQU $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD

View File

@@ -66,11 +66,12 @@ SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES
;
WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
;
FPENABLE .EQU FALSE ; ENABLES FRONT PANEL SWITCHES
FPBASE .EQU $0D ; FRONT PANEL I/O PORT BASE ADDRESS
DIAGENABLE .EQU TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $0D ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS
FPLED_ENABLE .EQU TRUE ; FP: ENABLES FRONT PANEL LEDS
FPLED_IO .EQU $0D ; FP: PORT ADDRESS FOR FP LEDS
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
;
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
;
LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED)
@@ -174,6 +175,7 @@ TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO]
TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
;
MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM)
MDROM .EQU TRUE ; MD: ENABLE ROM DISK
@@ -249,6 +251,27 @@ PIO0BASE .EQU $B8 ; PIO 0: REGISTERS BASE ADR
PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR
;
LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM)
LPTMODE .EQU LPTMODE_MG014 ; LPT: DRIVER MODE: LPTMODE_[NONE|IBM|MG014]
LPTCNT .EQU 1 ; LPT: NUMBER OF CHIPS TO DETECT (1-2)
LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
LPT0BASE .EQU $18 ; LPT 0: REGISTERS BASE ADR
LPT1BASE .EQU $00 ; LPT 1: REGISTERS BASE ADR
;
PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM)
PPACNT .EQU 1 ; PPA: NUMBER OF PPA DEVICES (1-2)
PPATRACE .EQU 1 ; PPA: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
PPA0MODE .EQU PPAMODE_MG014 ; PPA 0: DRIVER MODE: PPAMODE_[NONE|MG014]
PPA0BASE .EQU LPT0BASE ; PPA 0: BASE I/O ADDRESS OF PPI FOR PPA
PPA1MODE .EQU PPAMODE_MG014 ; PPA 1: DRIVER MODE: PPAMODE_[NONE|MG014]
PPA1BASE .EQU LPT1BASE ; PPA 1: BASE I/O ADDRESS OF PPI FOR PPA
;
IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
IMMCNT .EQU 1 ; IMM: NUMBER OF IMM DEVICES (1-2)
IMMTRACE .EQU 1 ; IMM: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
IMM0MODE .EQU IMMMODE_MG014 ; IMM 0: DRIVER MODE: IMMMODE_[NONE|MG014]
IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM
IMM1MODE .EQU IMMMODE_MG014 ; IMM 1: DRIVER MODE: IMMMODE_[NONE|MG014]
IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM
;
PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)

View File

@@ -19,7 +19,9 @@
CPUFAM .EQU CPU_Z80 ; CPU FAMILY: CPU_[Z80|Z180|Z280]
BIOS .EQU BIOS_UNA ; HARDWARE BIOS: BIOS_[WBW|UNA]
;
FPENABLE .EQU FALSE ; ENABLES FRONT PANEL SWITCHES
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
;
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
;
BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE
;
@@ -34,5 +36,3 @@ ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!)
RTCIO .EQU $70 ; RTC LATCH REGISTER ADR
;
DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE)
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING

View File

@@ -63,11 +63,12 @@ SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES
;
WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
;
FPENABLE .EQU FALSE ; ENABLES FRONT PANEL SWITCHES
FPBASE .EQU $00 ; FRONT PANEL I/O PORT BASE ADDRESS
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS
FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
;
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
;
LEDENABLE .EQU FALSE ; ENABLES STATUS LED
@@ -158,6 +159,7 @@ TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO]
TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
;
MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM)
MDROM .EQU TRUE ; MD: ENABLE ROM DISK
@@ -204,6 +206,10 @@ PIOENABLE .EQU FALSE ; PIO: ENABLE ZILOG PIO DRIVER (PIO.ASM)
;
LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM)
;
PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM)
;
IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
;
PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP

View File

@@ -52,11 +52,12 @@ SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES
;
WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
;
FPENABLE .EQU FALSE ; ENABLES FRONT PANEL SWITCHES
FPBASE .EQU $00 ; FRONT PANEL I/O PORT BASE ADDRESS
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS
FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
;
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
;
LEDENABLE .EQU FALSE ; ENABLES STATUS LED
@@ -128,6 +129,7 @@ TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO]
TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
;
MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM)
MDROM .EQU TRUE ; MD: ENABLE ROM DISK
@@ -175,6 +177,10 @@ PIOENABLE .EQU FALSE ; PIO: ENABLE ZILOG PIO DRIVER (PIO.ASM)
;
LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM)
;
PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM)
;
IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
;
PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP

View File

@@ -63,11 +63,12 @@ SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES
;
WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
;
FPENABLE .EQU FALSE ; ENABLES FRONT PANEL SWITCHES
FPBASE .EQU $00 ; FRONT PANEL I/O PORT BASE ADDRESS
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS
FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
;
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
;
LEDENABLE .EQU FALSE ; ENABLES STATUS LED
@@ -139,6 +140,7 @@ TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO]
TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
;
MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM)
MDROM .EQU TRUE ; MD: ENABLE ROM DISK
@@ -186,6 +188,10 @@ PIOENABLE .EQU FALSE ; PIO: ENABLE ZILOG PIO DRIVER (PIO.ASM)
;
LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM)
;
PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM)
;
IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
;
PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP

View File

@@ -902,5 +902,6 @@ CVDU_INIT8563:
;==================================================================================================
;
CVDU_IDAT:
.DB KBDMODE_PS2 ; PS/2 8242 KEYBOARD CONTROLLER
.DB CVDU_KBDST
.DB CVDU_KBDDATA

View File

@@ -325,5 +325,6 @@ GDC_POS .DW 0 ; CURRENT DISPLAY POSITION
;==================================================================================================
;
GDC_IDAT:
.DB KBDMODE_PS2 ; PS/2 8242 KEYBOARD CONTROLLER
.DB GDC_KBDST
.DB GDC_KBDDATA

View File

@@ -105,10 +105,11 @@ MODCNT .SET MODCNT + 1
;
;
;
#IF (DIAGENABLE)
#IF (FPLED_ENABLE)
#DEFINE DIAG(N) PUSH AF
#DEFCONT \ LD A,N
#DEFCONT \ OUT (DIAGPORT),A
; #DEFCONT \ OUT (DIAGPORT),A
#DEFCONT \ CALL FP_SETLEDS
#DEFCONT \ POP AF
#ELSE
#DEFINE DIAG(N) \;
@@ -1109,16 +1110,9 @@ HB_START:
;
#IFDEF APPBOOT
#IF (MEMMGR == MM_Z280)
LD A,DIAG_01
OUT (DIAGPORT),A
LD DE,Z280_BOOTERR
LD C,9
LD A,DIAG_02
OUT (DIAGPORT),A
CALL $0005
LD A,DIAG_04
OUT (DIAGPORT),A
RET
LD DE,Z280_BOOTERR ; POINT TO ERROR MESSAGE
LD C,9 ; BDOS FUNC 9: WRITE STR
JP $0005 ; DO IT AND RETURN TO OS
;
Z280_BOOTERR .TEXT "\r\n\r\n*** Application mode boot not supported under Z280 native memory management!!!\r\n\r\n$"
#ENDIF
@@ -1144,9 +1138,10 @@ Z280_BOOTERR .TEXT "\r\n\r\n*** Application mode boot not supported under Z280 n
OUT0 (RPH_ACR),A ; ... REGISTER IS INITIALIZED
#ENDIF
;
#IF (DIAGENABLE)
#IF (FPLED_ENABLE)
; NO STACK YET, SO CAN'T USE DIAG() MACRO
LD A,DIAG_01
OUT (DIAGPORT),A
OUT (FPLED_IO),A
#ENDIF
#IF (LEDENABLE)
#IF (LEDMODE == LEDMODE_STD)
@@ -1255,8 +1250,6 @@ Z280_INITZ:
LD A,Z180_BASE
OUT0 ($3F),A ; AT RESET, ICR IS AT $3F
DIAG(DIAG_02)
; DISABLE REFRESH
XOR A
OUT0 (Z180_RCR),A
@@ -1268,11 +1261,11 @@ Z280_INITZ:
; SET DEFAULT CPU CLOCK MULTIPLIERS (XTAL / 2)
;
; IT HAS BEEN REPORTED THAT CMR NEEDS TO BE SET PRIOR TO CCR
; WHEN USING AN INPUT FREQUENCY THAT IS XTAL / 2.
; I NEVER EXPERIENCED A PROBLEM RELATED TO ORDER, BUT JUST
; BILL MCMULLEN REPORTED THAT CMR NEEDS TO BE SET PRIOR TO CCR
; WHEN USING A CPU FREQUENCY (PHI) THAT IS XTAL * 2.
; HERE WE ARE SETTING CPU FREQUENCY TO XTAL / 2, BUT JUST
; FOR GOOD MEASURE, CMR IS SET PRIOR TO CCR BELOW.
; https://www.retrobrewcomputers.org/forum/index.php?t=msg&th=316&#msg_5045
; https://www.retrobrewcomputers.org/forum/index.php?t=msg&th=316&goto=5045&#msg_5045
XOR A
OUT0 (Z180_CMR),A
OUT0 (Z180_CCR),A
@@ -1349,10 +1342,12 @@ Z280_INITZ:
; NOT WANT TO EFFECT RAM UNTIL AFTER THE BACKUP BATTERY STATUS CHECK
; IS PERFORMED NEXT.
;
#IF (DIAGENABLE)
#IF (FPLED_ENABLE)
; NO STACK YET, SO CAN'T USE DIAG() MACRO
LD A,DIAG_02
OUT (DIAGPORT),A
OUT (FPLED_IO),A
#ENDIF
;
; WE USE THE TWO BYTES IMMEDIATELY BELOW THE PROXY TO STORE A COUPLE
; VALUES TEMPORARILY BECAUSE WE MAY BE OPERATING IN ROM AT THIS POINT.
@@ -2232,29 +2227,6 @@ NOT_REC_M0:
CALL DSKY_SHOW
#ENDIF
;
#IF FPENABLE
;
; IF FRONT PANEL IS ENABLED IN CONFIG, WE NEED TO CHECK TO SEE IF THE
; HARDWARE REALLY EXISTS. THE ONLY WAY TO DO THAT IS TO SEE IF THE
; FRONT PANEL PORT SEEMS TO BE VALID (NOT FLOATING). HERE WE JUST
; DO THE CHECKING AND RECORD WHETHER THE FP SWITCHES ARE USEABLE.
;
; THE SWITCH HARDWARE MAY OR MAY NOT BE INSTALLED. SO, HERE WE
; ATTEMPT TO CONFIRM WE HAVE A VALID PORT. CREDIT TO STEPHEN
; COUSINS FOR THIS APPROACH.
LD C,FPBASE ; ADR OF SWITCH PORT
IN C,(C) ; READ IT USING IN (C)
IN A,(FPBASE) ; READ IT USING IN (PORT)
CP C ; PORT FLOATING ON MISMATCH
JR NZ,HB_SWZ ; ABORT IF FLOATING
CP $FF ; $FF ALSO MEANS PORT INACTIVE
JR Z,HB_SWZ ; ABORT IF SO
OR $FF ; SIGNAL FP EXISTS
LD (HB_HASFP),A ; AND SAVE IT
HB_SWZ:
;
#ENDIF
;
#IF FALSE
;
; TEST DEBUG ***************************************************************************************
@@ -2792,7 +2764,12 @@ HB_WDZ:
;
#ENDIF
;
#IF FPENABLE
; THIS IS A GOOD PLACE TO DETERMINE IF FRONT PANEL HARDWARE REALLY
; EXISTS.
;
CALL FP_DETECT
;
#IF (FPSW_ENABLE)
;
; IF WE HAVE FRONT PANEL SWITCHES, THIS IS THE RIGHT PLACE TO HANDLE
; ANY CONSOLE CHANGE REQUESTS. THE FRONT PANEL HAS TWO SWITCHES
@@ -2802,12 +2779,12 @@ HB_WDZ:
; DEVICE.
;
PRTS("\r\nFP: IO=0x$")
LD A,FPBASE
LD A,FPSW_IO
CALL PRTHEXBYTE
;
; THE EXISTENCE OF THE FP WAS TESTED EARLIER. IF IT DOESN'T
; EXIST, BAIL OUT.
LD A,(HB_HASFP) ; GET FP EXISTENCE FLAG
LD A,(FPSW_ACTIVE) ; GET FP EXISTENCE FLAG
OR A ; SET FLAGS
JR NZ,HB_FP1 ; IF WE HAVE ONE, CONTINUE
;
@@ -2823,7 +2800,7 @@ HB_FP1:
; OF A CRT DEVICE -- IT WILL JUST FAILBACK TO FIRST SERIAL
; PORT.
PRTS(" SWITCHES=0x$") ; TAG
IN A,(FPBASE) ; GET SWITCH SETTINGS
CALL FP_GETSWITCHES ; GET SWITCH SETTINGS
CALL PRTHEXBYTE ; DISPLAY VALUE
LD B,A ; SAVE IN REG B
AND SW_CRT ; TEST CRT BIT
@@ -3232,6 +3209,9 @@ HB_INITTBL:
#IF (TMSENABLE)
.DW TMS_INIT
#ENDIF
#IF (VRCENABLE)
.DW VRC_INIT
#ENDIF
;#IF (DSKYENABLE)
; .DW DSKY_INIT
;#ENDIF
@@ -3259,6 +3239,12 @@ HB_INITTBL:
#IF (HDSKENABLE)
.DW HDSK_INIT
#ENDIF
#IF (PPAENABLE)
.DW PPA_INIT
#ENDIF
#IF (IMMENABLE)
.DW IMM_INIT
#ENDIF
#IF (PRPENABLE)
.DW PRP_INIT
#ENDIF
@@ -3488,7 +3474,7 @@ HB_DSKREAD:
;
LD (HB_DSKCMD),BC ; SAVE HBIOS FUNC & UNIT
;
#IF (DIAGENABLE)
#IF (FPLED_ENABLE & FPLED_DSKACT)
; SAVE DISK UNIT NUMBER BIT MASK
LD A,C ; GET DISK UNIT NUMBER
LD B,A ; PUT IN B FOR LOOP COUNTER
@@ -3578,7 +3564,7 @@ HB_DSKWRITE:
;
LD (HB_DSKCMD),BC ; SAVE HBIOS FUNC & UNIT
;
#IF (DIAGENABLE)
#IF (FPLED_ENABLE & FPLED_DSKACT)
; SAVE DISK UNIT NUMBER BIT MASK
LD A,C ; GET DISK UNIT NUMBER
LD B,A ; PUT IN B FOR LOOP COUNTER
@@ -3675,9 +3661,9 @@ HB_DSKIOX:
;
HB_DSKFN:
PUSH BC ; SAVE COUNTERS
#IF (DIAGENABLE & DIAGDISKIO)
#IF (FPLED_ENABLE & FPLED_DSKACT)
LD A,(HB_DSKBIT) ; LOAD UNIT DISK BIT MASK
OUT (DIAGPORT),A ; DISPLAY ON DIAG LEDS
CALL FP_SETLEDS ; DISPLAY ON DIAG LEDS
#ENDIF
#IF (LEDENABLE & LEDDISKIO)
LED(%00000101) ; BIT 0 FOR TINY Z80 & MBC, BIT 2 FOR SCXXX
@@ -3685,8 +3671,8 @@ HB_DSKFN:
LD E,1 ; ONE SECTOR
HB_DSKFNADR .EQU $+1
CALL PANIC ; READ ONE SECTOR
#IF (DIAGENABLE & DIAGDISKIO)
DIAG(DIAG_00) ; CLEAR DIAG LEDS
#IF (FPLED_ENABLE & FPLED_DSKACT)
DIAG($00) ; CLEAR DIAG LEDS
#ENDIF
#IF (LEDENABLE & LEDDISKIO)
LED($00)
@@ -4536,11 +4522,11 @@ SYS_GETCPUSPD1:
;
SYS_GETPANEL:
;
#IF FPENABLE
LD A,(HB_HASFP) ; GET FP EXISTS FLAG
#IF (FPSW_ENABLE)
LD A,(FPSW_ACTIVE) ; FP SWITCHES ACTIVE?
OR A ; SET FLAGS
JR Z,SYS_GETPANEL1 ; HANDLE NOT EXISTS
IN A,(FPBASE) ; READ SWITCHES
CALL FP_GETSWITCHES ; READ SWITCHES
LD H,0 ; FOR FUTURE
LD L,A ; PUT SWITCHES VALUE IN L
XOR A ; SIGNAL SUCCESS
@@ -4848,9 +4834,9 @@ SYS_SETCPUSPD_ERR:
;
SYS_SETPANEL:
;
#IF DIAGENABLE
#IF (FPLED_ENABLE)
LD A,L
OUT (DIAGPORT),A
CALL FP_SETLEDS
XOR A
RET
#ELSE
@@ -6181,6 +6167,15 @@ SIZ_GDC .EQU $ - ORG_GDC
.ECHO " bytes.\n"
#ENDIF
;
#IF (VRCENABLE)
ORG_VRC .EQU $
#INCLUDE "vrc.asm"
SIZ_VRC .EQU $ - ORG_VRC
.ECHO "VRC occupies "
.ECHO SIZ_VRC
.ECHO " bytes.\n"
#ENDIF
;
#IF (DMAENABLE)
ORG_DMA .EQU $
#INCLUDE "dma.asm"
@@ -6236,12 +6231,22 @@ FONTCGA:
.ECHO " CGA"
#ENDIF
;
#IFDEF USEFONTVGARC
FONTVGARC:
#IF USELZSA2
#INCLUDE "fontvgarcc.asm"
#ELSE
#INCLUDE "fontvgarcu.asm"
#ENDIF
.ECHO " VGARC"
#ENDIF
;
SIZ_FONTS .EQU $ - ORG_FONTS
.ECHO " occupy "
.ECHO SIZ_FONTS
.ECHO " bytes.\n"
;
#IF (CVDUENABLE | VGAENABLE) | GDCENABLE | (TMSENABLE & ((TMSMODE == TMSMODE_MSXKBD) | (TMSMODE == TMSMODE_MBC)))
#IF (CVDUENABLE | VGAENABLE | GDCENABLE | VRCENABLE | (TMSENABLE & ((TMSMODE == TMSMODE_MSXKBD) | (TMSMODE == TMSMODE_MBC))))
ORG_KBD .EQU $
#INCLUDE "kbd.asm"
SIZ_KBD .EQU $ - ORG_KBD
@@ -6349,6 +6354,24 @@ SIZ_HDSK .EQU $ - ORG_HDSK
.ECHO " bytes.\n"
#ENDIF
;
#IF (PPAENABLE)
ORG_PPA .EQU $
#INCLUDE "ppa.asm"
SIZ_PPA .EQU $ - ORG_PPA
.ECHO "PPA occupies "
.ECHO SIZ_PPA
.ECHO " bytes.\n"
#ENDIF
;
#IF (IMMENABLE)
ORG_IMM .EQU $
#INCLUDE "imm.asm"
SIZ_IMM .EQU $ - ORG_IMM
.ECHO "IMM occupies "
.ECHO SIZ_IMM
.ECHO " bytes.\n"
#ENDIF
;
#IF (TERMENABLE)
ORG_TERM .EQU $
#INCLUDE "term.asm"
@@ -6438,11 +6461,101 @@ SIZ_YM2612 .EQU $ - ORG_YM2612
;
; INCLUDE LZSA2 decompression engine if required.
;
#IF ((VGAENABLE | CVDUENABLE | TMSENABLE | GDCENABLE) & USELZSA2)
#IF ((VGAENABLE | CVDUENABLE | TMSENABLE | GDCENABLE | VRCENABLE) & USELZSA2)
#INCLUDE "unlzsa2s.asm"
#ENDIF
;
; DETECT CPU SPEED USING DS-1302 RTC
;==================================================================================================
; FRONT PANEL SUPPORT
;==================================================================================================
;
; FRONT PANEL HARDWARE DETECTION
;
; WE ARE REALLY JUST CHECKING FOR SWITCHES. NO WAY TO QUERY FOR
; LEDS. WE CHECK FOR I/O CONFLICT WITH VGARC IF ACTIVE.
;
FP_DETECT:
; D: LEDS ACTIVE, E: SWITCHES ACTIVE
LD D,TRUE ; ASSUME ACTIVE FOR NOW
LD E,TRUE ; ASSUME ACTIVE FOR NOW
;
; IF VGARC IS ENABLED, CHECK IF IT IS ACTIVE. IF SO AND THE
; I/O PORTS CONFLICT, DEACTIVATE FRONT PANEL.
;
#IF (VRCENABLE)
LD A,(VRC_ACTIVE) ; GET VGARC ACTIVE STATUS
OR A ; SET FLAGS
JR Z,FP_DETECT1 ; IF NO, CONTINUE
#IF ((FPLED_IO >= $00) & (FPLED_IO <= $0F))
; CONFLICT, DEACTIVATE LEDS
LD D,FALSE ; FP LEDS NOT ACTIVE
#ENDIF
#IF ((FPSW_IO >= $00) & (FPSW_IO <= $0F))
; CONFLICT, DEACTIVATE SWITCHES
LD E,FALSE ; FP SWITCHES NOT ACTIVE
#ENDIF
#ENDIF
;
FP_DETECT1:
; THE SWITCH HARDWARE MAY OR MAY NOT BE INSTALLED. SO, HERE WE
; ATTEMPT TO CONFIRM WE HAVE A VALID PORT. CREDIT TO STEPHEN
; COUSINS FOR THIS APPROACH.
LD C,FPSW_IO ; ADR OF SWITCH PORT
IN C,(C) ; READ IT USING IN (C)
IN A,(FPSW_IO) ; READ IT USING IN (PORT)
CP C ; PORT FLOATING ON MISMATCH
JR NZ,FP_DETECT2 ; NO H/W, SET FLAG
CP $FF ; PORT FLOATING ON $FF
JR Z,FP_DETECT2 ; NO H/W, SET FLAG
JR FP_DETECTZ ; H/W EXISTS, DONE
;
FP_DETECT2:
LD E,FALSE ; RECORD NOT PRESENT
;
FP_DETECTZ:
LD (FP_ACTIVE),DE ; RECORD RESULTS
RET ; DONE
;
#IF (FPLED_ENABLE)
;
; SET FRONT PANEL LEDS FROM VALUE IN A
;
FP_SETLEDS:
PUSH HL ; SAVE HL
LD L,A ; LED VALUE TO L
LD A,(FPLED_ACTIVE) ; LEDS ACTIVE?
OR A ; SET FLAGS
LD A,L ; RESTORE REG A
JR Z,FP_SETLEDS1 ; BAIL OUT IF NOT ACTIVE
OUT (FPLED_IO),A ; WRITE
FP_SETLEDS1:
POP HL ; RESTORE HL
RET ; DONE
;
;
#ENDIF
;
#IF (FPSW_ENABLE)
;
; GET FRONT PANEL SWITCH SETTINGS
;
FP_GETSWITCHES:
LD A,(FPSW_ACTIVE) ; SWITCHES ACTIVE?
OR A ; SET FLAGS
RET Z ; BAIL OUT IF NOT ACTIVE
IN A,(FPSW_IO) ; READ SWITCHES
RET ; DONE
;
;
#ENDIF
;
FP_ACTIVE:
FPSW_ACTIVE .DB TRUE
FPLED_ACTIVE .DB TRUE
;
;==================================================================================================
; CPU SPEED DETECTION USING DS-1302 RTC
;==================================================================================================
;
HB_CPUSPD:
;
@@ -6558,116 +6671,6 @@ HB_CPUSPD2:
OR $FF ; SIGNAL ERROR
RET ; AND DONE
;
; SYSTEM CHECK: DUMP MACHINE STATE AND CONTINUE?
;
SYSCHKA:
; CHECK DIAG LEVEL TO SEE IF WE SHOULD DISPLAY
PUSH AF ; PRESERVE INCOMING AF VALUE
LD A,(CB_DIAGLVL) ; GET DIAGNOSTIC LEVEL
CP DL_ERROR ; >= ERROR LEVEL
JR C,SYSCHK1 ; IF NOT, GO HOME
POP AF ; RESTORE INCOMING AF VALUE
;
; DISPLAY SYSCHK MESSAGE
PUSH DE ; PRESERVE DE VALUE
LD DE,STR_SYSCHK ; POINT TO PREFIX STRING
CALL WRITESTR ; PRINT IT
POP DE ; RESTORE DE VALUE
CALL XREGDMP ; DUMP REGISTERS
; DISPLAY ERROR CODE. IT IS AT RETURN ADDRESS+1 .. LD A,XX
EX (SP),HL ; GET RETURN ADDRESS
INC HL ; POINT TO THE ERROR CODE
PUSH AF
LD A,(HL) ; DISPLAY
CALL PRTHEXBYTE
POP AF
DEC HL ; RESTORE RETURN ADDRESS
EX (SP),HL
;
JR CONTINUE ; CHECK W/ USER
;
SYSCHK1:
; RETURN IF MESSAGING BYPASSED BY DIAG LEVEL
POP AF
RET
;
; PANIC: DUMP MACHINE STATE AND HALT
;
PANIC:
PUSH DE
LD DE,STR_PANIC
CALL WRITESTR
POP DE
CALL XREGDMP ; DUMP REGISTERS
JR SYSHALT ; FULL STOP
;
;
;
CONTINUE:
PUSH AF
CONTINUE1:
PUSH DE
LD DE,STR_CONTINUE
CALL WRITESTR
POP DE
CALL CIN
RES 5,A ; FORCE UPPERCASE (IMPERFECTLY)
CALL COUT ; ECHO
CP 'Y'
JR Z,CONTINUE3
CP 'N'
JR Z,SYSHALT
JR CONTINUE1
CONTINUE3:
CALL NEWLINE
POP AF
RET
;
;
;
SYSHALT:
LD DE,STR_HALT
CALL WRITESTR
DI
HALT
;
; PRINT VALUE OF HL AS THOUSANDTHS, IE. 0.000
;
PRTD3M:
PUSH BC
PUSH DE
PUSH HL
LD E,'0'
LD BC,-10000
CALL PRTD3M1
LD E,0
LD BC,-1000
CALL PRTD3M1
CALL PC_PERIOD
LD BC,-100
CALL PRTD3M1
LD C,-10
CALL PRTD3M1
LD C,-1
CALL PRTD3M1
POP HL
POP DE
POP BC
RET
PRTD3M1:
LD A,'0' - 1
PRTD3M2:
INC A
ADD HL,BC
JR C,PRTD3M2
SBC HL,BC
CP E
JR Z,PRTD3M3
LD E,0
CALL COUT
PRTD3M3:
RET
;==================================================================================================
; DISPLAY SUMMARY OF ATTACHED UNITS/DEVICES
;==================================================================================================
@@ -6783,7 +6786,6 @@ PS_PRTDC:
RES 7,D ; CLEAR LBA BIT
LD B,11 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB
CALL SRL32 ; RIGHT SHIFT
;CALL PRTDEC ; PRINT LOW WORD IN DECIMAL (HIGH WORD DISCARDED)
CALL PRTDEC32 ; PRINT DWORD IN DECIMAL
PRTS("MB$") ; PRINT SUFFIX
CALL PC_COMMA
@@ -6798,7 +6800,6 @@ PS_PRTDC1:
RES 7,D ; CLEAR LBA BIT
LD B,1 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB
CALL SRL32 ; RIGHT SHIFT
;CALL PRTDEC ; PRINT LOW WORD IN DECIMAL (HIGH WORD DISCARDED)
CALL PRTDEC32 ; PRINT DWORD IN DECIMAL
PRTS("KB$") ; PRINT SUFFIX
CALL PC_COMMA
@@ -7155,6 +7156,8 @@ PS_DDSD .TEXT "SD$"
PS_DDPRPSD .TEXT "PRPSD$"
PS_DDPPPSD .TEXT "PPPSD$"
PS_DDHDSK .TEXT "HDSK$"
PS_DDPPA .TEXT "PPA$"
PS_DDIMM .TEXT "IMM$"
;
; DISK TYPE STRINGS
;
@@ -7221,6 +7224,7 @@ PS_VDCVDU .TEXT "CVDU$"
PS_VDGDC .TEXT "GDC$"
PS_VDTMS .TEXT "TMS$"
PS_VDVGA .TEXT "VGA$"
PS_VDVRC .TEXT "VRC$"
;
; VIDEO TYPE STRINGS
;
@@ -7360,7 +7364,7 @@ CST2:
RET
;
;==================================================================================================
; MISCELLANEOUS UTILITY FUNCTIONS
; INTERNAL UTILITY FUNCTIONS
;==================================================================================================
;
; SET HL TO IY+A, A IS TRASHED
@@ -7397,6 +7401,117 @@ HB_CHS2LBA:
XOR A
RET
;
; SYSTEM CHECK: DUMP MACHINE STATE AND CONTINUE?
;
SYSCHKA:
; CHECK DIAG LEVEL TO SEE IF WE SHOULD DISPLAY
PUSH AF ; PRESERVE INCOMING AF VALUE
LD A,(CB_DIAGLVL) ; GET DIAGNOSTIC LEVEL
CP DL_ERROR ; >= ERROR LEVEL
JR C,SYSCHK1 ; IF NOT, GO HOME
POP AF ; RESTORE INCOMING AF VALUE
;
; DISPLAY SYSCHK MESSAGE
PUSH DE ; PRESERVE DE VALUE
LD DE,STR_SYSCHK ; POINT TO PREFIX STRING
CALL WRITESTR ; PRINT IT
POP DE ; RESTORE DE VALUE
CALL XREGDMP ; DUMP REGISTERS
; DISPLAY ERROR CODE. IT IS AT RETURN ADDRESS+1 .. LD A,XX
EX (SP),HL ; GET RETURN ADDRESS
INC HL ; POINT TO THE ERROR CODE
PUSH AF
LD A,(HL) ; DISPLAY
CALL PRTHEXBYTE
POP AF
DEC HL ; RESTORE RETURN ADDRESS
EX (SP),HL
;
JR CONTINUE ; CHECK W/ USER
;
SYSCHK1:
; RETURN IF MESSAGING BYPASSED BY DIAG LEVEL
POP AF
RET
;
; PANIC: DUMP MACHINE STATE AND HALT
;
PANIC:
PUSH DE
LD DE,STR_PANIC
CALL WRITESTR
POP DE
CALL XREGDMP ; DUMP REGISTERS
JR SYSHALT ; FULL STOP
;
;
;
CONTINUE:
PUSH AF
CONTINUE1:
PUSH DE
LD DE,STR_CONTINUE
CALL WRITESTR
POP DE
CALL CIN
RES 5,A ; FORCE UPPERCASE (IMPERFECTLY)
CALL COUT ; ECHO
CP 'Y'
JR Z,CONTINUE3
CP 'N'
JR Z,SYSHALT
JR CONTINUE1
CONTINUE3:
CALL NEWLINE
POP AF
RET
;
;
;
SYSHALT:
LD DE,STR_HALT
CALL WRITESTR
DI
HALT
;
; PRINT VALUE OF HL AS THOUSANDTHS, IE. 0.000
;
PRTD3M:
PUSH BC
PUSH DE
PUSH HL
LD E,'0'
LD BC,-10000
CALL PRTD3M1
LD E,0
LD BC,-1000
CALL PRTD3M1
CALL PC_PERIOD
LD BC,-100
CALL PRTD3M1
LD C,-10
CALL PRTD3M1
LD C,-1
CALL PRTD3M1
POP HL
POP DE
POP BC
RET
PRTD3M1:
LD A,'0' - 1
PRTD3M2:
INC A
ADD HL,BC
JR C,PRTD3M2
SBC HL,BC
CP E
JR Z,PRTD3M3
LD E,0
CALL COUT
PRTD3M3:
RET
;
;==================================================================================================
; HBIOS GLOBAL DATA
;==================================================================================================

View File

@@ -321,6 +321,8 @@ DIODEV_SD .EQU $60
DIODEV_PRPSD .EQU $70
DIODEV_PPPSD .EQU $80
DIODEV_HDSK .EQU $90
DIODEV_PPA .EQU $A0
DIODEV_IMM .EQU $B0
;
; RTC DEVICE IDS
;
@@ -338,7 +340,7 @@ VDADEV_CVDU .EQU $10 ; ECB COLOR VDU - MOS 8563
VDADEV_GDC .EQU $20 ; GRAPHICS DISPLAY CTLR - UPD7220
VDADEV_TMS .EQU $30 ; N8 ONBOARD VDA SUBSYSTEM - TMS 9918
VDADEV_VGA .EQU $40 ; ECB VGA3 - HITACHI HD6445
;VDADEV_V9958 .EQU $50 ; V9958 VDU
VDADEV_VRC .EQU $50 ; VGARC
;
; SOUND DEVICE IDS
;

View File

@@ -4,7 +4,6 @@
;=============================================================================
;
; TODO:
; - FIX SCALER CONSTANT
; - GOPARTNER NEEDS TO HANDLE "NO PARTNER" CONDITION
; - IMPLEMENT H/W PROBES FOR DIO AND DIDE
;
@@ -126,9 +125,13 @@ IDE_REG_DRVADR .EQU $0F ; DRIVE ADDRESS REGISTER (R)
;
; COMMAND BYTES
;
IDE_CIDE_NOP .EQU $00
IDE_CIDE_DEVRES .EQU $08
IDE_CIDE_RECAL .EQU $10
IDE_CIDE_READ .EQU $20
IDE_CIDE_WRITE .EQU $30
IDE_CIDE_DEVDIAG .EQU $90
IDE_CIDE_IDPKTDEV .EQU $A1
IDE_CIDE_IDDEV .EQU $EC
IDE_CIDE_SETFEAT .EQU $EF
;
@@ -153,6 +156,7 @@ IDE_STIOERR .EQU -4
IDE_STRDYTO .EQU -5
IDE_STDRQTO .EQU -6
IDE_STBSYTO .EQU -7
IDE_STNOTSUP .EQU -8
;
; DRIVE SELECTION BYTES (FOR USE IN DRIVE/HEAD REGISTER)
;
@@ -290,15 +294,18 @@ IDE_DEV2S: ; DEVICE 2, SLAVE
;
; THE IDE_WAITXXX FUNCTIONS ARE BUILT TO TIMEOUT AS NEEDED SO DRIVER WILL
; NOT HANG IF DEVICE IS UNRESPONSIVE. DIFFERENT TIMEOUTS ARE USED DEPENDING
; ON THE SITUATION. GENERALLY, THE FAST TIMEOUT IS USED TO PROBE FOR DEVICES
; USING FUNCTIONS THAT PERFORM NO I/O. OTHERWISE THE NORMAL TIMEOUT IS USED.
; IDE SPEC ALLOWS FOR UP TO 30 SECS MAX TO RESPOND. IN PRACTICE, THIS IS WAY
; TOO LONG, BUT IF YOU ARE USING A VERY OLD DEVICE, THESE TIMEOUTS MAY NEED TO
; BE ADJUSTED. NOTE THAT THESE ARE BYTE VALUES, SO YOU CANNOT EXCEED 255.
; THE TIMEOUTS ARE IN UNITS OF .05 SECONDS.
; ON THE SITUATION. THE SLOW TIMEOUT IS USED TO WAIT FOR A DEVICE TO
; BECOME READY AFTER A HARD RESET (SPIN UP, ETC.). THE NORMAL TIMEOUT
; IS USED DURING NORMAL OPERATION FOR ALL I/O OPERATIONS WHICH SHOULD
; OCCUR PRETTY FAST. NOTE THAT THE ATA SPEC ALLOWS UP TO 30 SECONDS
; FOR DEVICES TO RESPOND. WE ARE USING MUCH MORE AGGRESSIVE VALUES
; BASED ON REAL WORLD EXPERIENCE.
; THE PICO TIMEOUT (TOPICO) IS A SPECIAL TIMEOUT FOR THE RC2014 SD
; PICO TO WAIT FOR THE PICO DEVICE TO INITIALIZE.
;
IDE_TONORM .EQU 200 ; NORMAL TIMEOUT IS 10 SECS
IDE_TOFAST .EQU 10 ; FAST TIMEOUT IS 0.5 SECS
IDE_TOSLOW .EQU 200 ; SLOW TIMEOUT IS 20 SECS
IDE_TONORM .EQU 5 ; NORMAL TIMEOUT IS 0.55 SECS
IDE_TOPICO .EQU 50 ; RC2014 SD PICO (5 SECONDS)
;
;=============================================================================
; INITIALIZATION ENTRY POINT
@@ -306,9 +313,12 @@ IDE_TOFAST .EQU 10 ; FAST TIMEOUT IS 0.5 SECS
;
IDE_INIT:
; COMPUTE CPU SPEED COMPENSATED TIMEOUT SCALER
; AT 1MHZ, THE SCALER IS 218 (50000US / 229TS = 218)
; SCALER IS THEREFORE 218 * CPU SPEED IN MHZ
LD DE,961 ; LOAD SCALER FOR 1MHZ
; ONE INTERNAL LOOP IN WAITBSY IS 180TS. ON A 1 MHZ CPU, 1 TS
; TAKES 1NS. SO 1/10 SECOND IS 100000 TS ON A 1 MHZ CPU.
; SINCE 1 INTERNAL LOOP IS 180 TS, IT TAKES 100000 / 180 = 556
; INTERNAL LOOPS FOR 1/10 SECOND. SO, WE WANT TO USE
; 523 * CPU MHZ FOR INTERNAL LOOP COUNT.
LD DE,556 ; LOAD SCALER FOR 1MHZ
LD A,(CB_CPUMHZ) ; LOAD CPU SPEED IN MHZ
CALL MULT8X16 ; HL := DE * A
LD (IDE_TOSCALER),HL ; SAVE IT
@@ -359,7 +369,7 @@ IDE_INIT2A:
LD DE,IDE_STR_NOHW ; NOT PRESENT MESSAGE
CALL WRITESTR ; DISPLAY IT
JR IDE_INIT4 ; SKIP CFG ENTRY
;
;
IDE_INIT3:
CALL IDE_RESET ; RESET THE BUS
CALL IDE_INIT5 ; DETECT/INIT MASTER
@@ -367,7 +377,7 @@ IDE_INIT3:
CALL IDE_GOPARTNER ; SWITCH IY TO PARTNER CFG
CALL IDE_INIT5 ; DETECT/INIT SLAVE
POP IY ; RESTORE CFG PTR
;
;
IDE_INIT4:
LD DE,IDE_CFGSIZ ; SIZE OF CFG TABLE ENTRY
ADD IY,DE ; BUMP POINTER
@@ -385,13 +395,28 @@ IDE_INIT5:
PUSH IY ; CFG ENTRY POINTER
POP DE ; COPY TO DE
CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE
;
; START PRINTING DEVICE INFO
CALL IDE_PRTPREFIX ; PRINT DEVICE PREFIX
LD A,(IY+IDE_TYPE)
LD DE,IDE_STR_TYPEATA
CP IDE_TYPEATA
CALL Z,WRITESTR
LD DE,IDE_STR_TYPEATAPI
CP IDE_TYPEATAPI
CALL Z,WRITESTR
;
; CHECK FOR BAD STATUS
LD A,(IY+IDE_STAT) ; GET STATUS
OR A ; SET FLAGS
JP NZ,IDE_PRTSTAT ; EXIT VIA PRINT STATUS
JP Z,IDE_INIT6
CALL PC_SPACE
JP NZ,IDE_PRTSTATSTR ; EXIT VIA PRINT STATUS STRING
;
CALL IDE_PRTPREFIX ; PRINT DEVICE PREFIX
IDE_INIT6:
LD A,(IY+IDE_TYPE) ; GET DEVICE TYPE
CP IDE_TYPEATA ; ATA?
RET NZ ; IF NOT, THEN DONE
;
LD DE,IDE_STR_8BIT
BIT 1,(IY+IDE_ACC) ; 8 BIT ACCESS?
@@ -555,26 +580,12 @@ IDE_DEVICE1:
IDE_MEDIA:
LD A,E ; GET FLAGS
OR A ; SET FLAGS
JR Z,IDE_MEDIA2 ; JUST REPORT CURRENT STATUS AND MEDIA
JR Z,IDE_MEDIA1 ; JUST REPORT CURRENT STATUS AND MEDIA
;
; GET CURRENT STATUS
LD A,(IY+IDE_STAT) ; GET STATUS
OR A ; SET FLAGS
JR NZ,IDE_MEDIA1 ; ERROR ACTIVE, GO RIGHT TO RESET
;
; USE IDENTIFY COMMAND TO CHECK DEVICE
LD HL,IDE_TIMEOUT ; POINT TO TIMEOUT
LD (HL),IDE_TOFAST ; USE FAST TIMEOUT DURING IDENTIFY COMMAND
CALL IDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT
CALL IDE_IDENTIFY ; EXECUTE IDENTIFY COMMAND
LD HL,IDE_TIMEOUT ; POINT TO TIMEOUT
LD (HL),IDE_TONORM ; BACK TO NORMAL TIMEOUT
JR Z,IDE_MEDIA2 ; IF SUCCESS, BYPASS RESET
;CALL IDE_RESET ; RESET IDE INTERFACE
CALL IDE_INITUNIT ; RE-INITIALIZE UNIT
;
IDE_MEDIA1:
CALL IDE_RESET ; RESET IDE INTERFACE
;
IDE_MEDIA2:
LD A,(IY+IDE_STAT) ; GET STATUS
OR A ; SET FLAGS
LD D,0 ; NO MEDIA CHANGE DETECTED
@@ -655,6 +666,32 @@ IDE_SETFEAT:
;
;
;
IDE_NOP:
#IF (IDETRACE >= 3)
CALL IDE_PRTPREFIX
PRTS(" NOP$")
#ENDIF
LD A,(IDE_DRVHD)
;OUT (IDE_IO_DRVHD),A
CALL IDE_OUT
.DB IDE_REG_DRVHD
#IF (IDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
;
; EXECUTE THE NOP COMMAND, BUT DON'T WAIT FOR DRDY, JUST
; MAKE SURE BUSY IS CLEAR. THIS COMMAND IS USED DURING
; DEVICE DETECTION/INITIALIZATION AND ATAPI DEVICES WILL
; NOT ASSERT DRDY AFTER RESET.
LD A,IDE_CIDE_NOP ; CMD = NOP
LD (IDE_CMD),A ; SAVE IT
CALL IDE_WAITBSY
RET NZ
JP IDE_RUNCMD1 ; RUN COMMAND AND EXIT
;
;
;
IDE_IDENTIFY:
#IF (IDETRACE >= 3)
CALL IDE_PRTPREFIX
@@ -672,6 +709,40 @@ IDE_IDENTIFY:
LD (IDE_CMD),A
CALL IDE_RUNCMD
RET NZ
CALL IDE_IN
.DB IDE_REG_STAT
BIT 3,A ; IS DRQ SET?
JP Z,IDE_NOMEDIA
;
LD HL,HB_WRKBUF
JP IDE_GETBUF ; EXIT THRU BUFRD
;
;
;
IDE_IDENTIFYPACKET:
#IF (IDETRACE >= 3)
CALL IDE_PRTPREFIX
PRTS(" IDPKTDEV$")
#ENDIF
LD A,(IDE_DRVHD)
;OUT (IDE_IO_DRVHD),A
CALL IDE_OUT
.DB IDE_REG_DRVHD
#IF (IDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
LD A,IDE_CIDE_IDPKTDEV
LD (IDE_CMD),A
CALL IDE_RUNCMD
RET NZ
;
CALL IDE_IN
.DB IDE_REG_STAT
BIT 3,A ; IS DRQ SET?
JP Z,IDE_NOMEDIA
;
LD HL,HB_WRKBUF
JP IDE_GETBUF ; EXIT THRU BUFRD
;
@@ -766,10 +837,6 @@ IDE_SETADDR:
#ENDIF
CALL IDE_OUT
.DB IDE_REG_COUNT
;;;
;;#IF (DSKYENABLE)
;; CALL IDE_DSKY
;;#ENDIF
;
RET
;
@@ -781,6 +848,7 @@ IDE_RUNCMD:
CALL IDE_WAITRDY ; WAIT FOR DRIVE READY
RET NZ ; BAIL OUT ON TIMEOUT
;
IDE_RUNCMD1:
LD A,(IDE_CMD) ; GET THE COMMAND
#IF (IDETRACE >= 3)
CALL PC_SPACE
@@ -937,47 +1005,14 @@ IDE_RESET:
PRTS(" RESET$")
#ENDIF
;
;#IF (IDEMODE == IDEMODE_RC)
; HARD RESET
;
; OLDER CF CARDS DO NOT SEEM TO SET THE
; REGISTERS ON RESET, SO HERE WE FAKE THINGS BY
; SETTING THEM AS A RESET WOULD. SO WE ALWAYS
; DO THE FAKE.
;LD A,(IY+IDE_MODE) ; GET MODE
;CP IDEMODE_RC ; RCBUS?
;JR NZ,IDE_RESET2 ; IF NOT, BYPASS
;
; RCBUS CANNOT ADDRESS THE DEVICE CONTROL PORT AND
; HAS NO WAY TO PERFORM A HARD RESET FROM SOFTWARE,
; SO FAKE IT BY SETTING THE REGISTERS TO THE SAME
; VALUES THAT A RESET WOULD CAUSE.
#IF (IDETRACE >= 3)
PRTS(" FAKE$")
#ENDIF
XOR A
;OUT (IDE_IO_CYLLO),A
CALL IDE_OUT
.DB IDE_REG_CYLLO
;OUT (IDE_IO_CYLHI),A
CALL IDE_OUT
.DB IDE_REG_CYLHI
INC A
;OUT (IDE_IO_COUNT),A
CALL IDE_OUT
.DB IDE_REG_COUNT
;OUT (IDE_IO_SECT),A
CALL IDE_OUT
.DB IDE_REG_SECT
;
IDE_RESET2:
;
;#ENDIF
;
;#IF (IDEMODE == IDEMODE_MK4)
; RESET LINE IS NORMALLY PULSED AT POWER ON. HOWEVER, THIS IS NOT
; DONE FOR MK4 BUILT-IN IDE PORT, SO WE DO IT NOW.
;
LD A,(IY+IDE_MODE) ; GET MODE
CP IDEMODE_MK4 ; MK4?
JR NZ,IDE_RESET1 ; IF NOT, BYPASS
JR NZ,IDE_RESET2 ; IF NOT, BYPASS
;
; USE HARDWARE RESET LINE
#IF (IDETRACE >= 3)
@@ -996,66 +1031,59 @@ IDE_RESET2:
LD DE,20
CALL VDELAY
;
IDE_RESET1:
; SOME CF CARDS AND CF CARD EMULATORS NEED A LITTLE TIME TO
; "BOOT" THEIR INTERNAL ELECTRONICS, SO THEY CANNOT ASSERT BUSY
; IMMEDIATELY. A SMALL WAIT IS PERFORMED HERE TO GIVE SUCH DEVICES
; A BETTER CHANCE TO SUCCEED LATER.
;
;#ENDIF
;;; CALL LDELAY ; DELAY FOR SLAVE INIT
LD DE,150000 / 16 ;
CALL VDELAY ; SMALL DELAY
;
;#IF ((IDEMODE != IDEMODE_MK4) & (IDEMODE != IDEMODE_RC))
JR IDE_RESET3 ; SKIP SOFT RESET
;
; SOFT RESET
;
; RC CANNOT ACCESS DEVICE CONTROL REG, SO SKIP THIS
;
IDE_RESET2:
LD A,(IY+IDE_MODE) ; GET MODE
CP IDEMODE_MK4 ; MK4?
JR Z,IDE_RESET3 ; IF SO, BYPASS
CP IDEMODE_RC ; RCBUS?
JR Z,IDE_RESET3 ; IF SO, BYPASS
JR Z,IDE_RESET4 ; IF SO, BYPASS
;
; INITIATE SOFT RESET
#IF (IDETRACE >= 3)
PRTS(" SOFT$")
#ENDIF
LD A,%00001110 ; NO INTERRUPTS, ASSERT RESET BOTH DRIVES
LD A,%00001110 ; ASSERT RESET, NO INTERRUPTS
;OUT (IDE_IO_CTRL),A
CALL IDE_OUT
.DB IDE_REG_CTRL
LD DE,20 ; DELAY 320US (SPEC IS >= 25US)
CALL VDELAY
;
IDE_RESET3:
;
;#ENDIF
; CONFIGURE OPERATION AND END SOFT RESET
;
LD DE,2 ; DELAY 32US (SPEC IS >= 25US)
CALL VDELAY
;
;#IF (IDEMODE != IDEMODE_RC)
;
LD A,(IY+IDE_MODE) ; GET MODE
CP IDEMODE_RC ; RCBUS?
JR Z,IDE_RESET4 ; IF SO, BYPASS
;
; CONFIGURE OPERATION AND END SOFT RESET
#IF (IDETRACE >= 3)
PRTS(" CONFIG$")
#ENDIF
LD A,%00001010 ; NO INTERRUPTS, DEASSERT RESET
LD DE,20 ; DELAY 320US (SPEC IS >= 25US)
CALL VDELAY
LD A,%00001010 ; DEASSERT RESET, NO INTERRUPTS
;OUT (IDE_IO_CTRL),A ; PUSH TO REGISTER
CALL IDE_OUT
.DB IDE_REG_CTRL
;
IDE_RESET4:
;
;#ENDIF
;
; SPEC ALLOWS UP TO 450MS FOR DEVICES TO ASSERT THEIR PRESENCE
; VIA -DASP. I ENCOUNTER PROBLEMS LATER ON IF I DON'T WAIT HERE
; FOR THAT TO OCCUR. THUS FAR, IT APPEARS THAT 150MS IS SUFFICIENT
; FOR ANY DEVICE ENCOUNTERED. MAY NEED TO EXTEND BACK TO 500MS
; IF A SLOWER DEVICE IS ENCOUNTERED.
;
;LD DE,500000/16 ; ~500MS
LD DE,150000/16 ; ~???MS
CALL VDELAY
LD HL,IDE_TONORM ; NORMAL TIMEOUT NOW
LD (IDE_TIMEOUT),HL ; AND RESTORE IT
;
; INITIALIZE THE INDIVIDUAL UNITS (MASTER AND SLAVE).
; BASED ON TESTING, IT APPEARS THAT THE MASTER UNIT MUST
; BE DONE FIRST OR THIS BEHAVES BADLY.
;
PUSH IY ; SAVE CFG PTR
BIT 0,(IY+IDE_ACC) ; MASTER?
CALL Z,IDE_GOPARTNER ; IF NOT, SWITCH TO MASTER
@@ -1073,14 +1101,10 @@ IDE_INITUNIT:
CALL IDE_SELUNIT ; SELECT UNIT
RET NZ ; ABORT IF ERROR
LD HL,IDE_TIMEOUT ; POINT TO TIMEOUT
LD (HL),IDE_TONORM ; SET NORMAL TIMEOUT
CALL IDE_PROBE ; DO PROBE
RET NZ ; JUST RETURN IF NOTHING THERE
CALL IDE_INITDEV ; IF FOUND, ATTEMPT TO INIT DEVICE
RET ; DONE
JP IDE_INITDEV ; EXIT VIA INITDEV
;
; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT
; UNIT IS SPECIFIED IN IDE_UNIT
@@ -1095,9 +1119,15 @@ IDE_SELUNIT:
BIT 0,(IY+IDE_ACC) ; MASTER?
JR Z,IDE_SELUNIT1 ; HANDLE SLAVE
LD A,IDE_DRVMASTER ; MASTER
#IF (IDETRACE >= 3)
PRTS(" MASTER$")
#ENDIF
JR IDE_SELUNIT2
IDE_SELUNIT1:
LD A,IDE_DRVSLAVE ; SLAVE
#IF (IDETRACE >= 3)
PRTS(" SLAVE$")
#ENDIF
IDE_SELUNIT2:
LD (IDE_DRVHD),A ; SAVE IT
XOR A ; SUCCESS
@@ -1106,10 +1136,25 @@ IDE_SELUNIT2:
;
;
IDE_PROBE:
;
; PROBE FOR A DRIVE ON THE INTERFACE (EITHER MASTER OR SLAVE).
; IDEALLY, THIS IS BEING CALLED IMMEDIATELY AFTER A HARD OR SOFT
; INTERFACE RESET. HOWEVER, THERE ARE SOME HARDWARE IMPLEMENTATTIONS
; WHICH ARE NOT CAPABLE OF EITHER A HARD NOR SOFT RESET. SO THIS
; CODE SHOULD TRY TO HANDLE THE SCENARIO WHERE NO INTERFACE RESET
; HAS OCCURRED.
;
#IF (IDETRACE >= 3)
CALL IDE_PRTPREFIX
PRTS(" PROBE$") ; LABEL FOR IO ADDRESS
#ENDIF
;
#IF (IDETRACE >= 3)
CALL IDE_IN
.DB IDE_REG_STAT
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
;
; SELECT DEVICE (MASTER/SLAVE)
LD A,(IDE_DRVHD)
@@ -1120,20 +1165,96 @@ IDE_PROBE:
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
;
CALL DELAY ; DELAY ~16US
;
; THE RC2014 SD PICO TAKES A FEW SECONDS TO INITIALIZE. DURING THIS
; TIME IT APPEARS TO RETURN $00. BELOW IS A SPECIAL CASE FOR RC2014
; TO WAIT FOR THIS DEVICE TO INITIALIZE. WE ONLY DO THIS IF THE
; MASTER DEVICE IS BEING PROBED. WHEN THE SLAVE DEVICE IS
; SELECTED, THE SD PICO WILL ALWAYS RETURN ZERO AND CAUSE AN
; UNNECESSARY DELAY.
;
LD A,(IY+IDE_MODE) ; GET MODE BITS
CP IDEMODE_RC ; RCBUS?
JR NZ,IDE_PROBE0 ; IF NOT, BYPASS
;
LD A,(IDE_DRVHD) ; GET CURRENT SETTING
BIT 4,A ; TEST SLAVE BIT
JR NZ,IDE_PROBE0 ; IF SO, BYPASS
;
CALL IDE_IN
.DB IDE_REG_STAT
#IF (IDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
OR A ; SET FLAGS
JR NZ,IDE_PROBE0 ; SKIP IF NOT $00
;
#IF (IDETRACE >= 3)
PRTS(" WAIT$")
#ENDIF
LD HL,(IDE_TIMEOUT) ; GET CURRENT TIMEOUT
PUSH HL ; SAVE IT
LD HL,IDE_TOPICO ; SLOW TIMEOUT FOR THIS
LD (IDE_TIMEOUT),HL ; SET IT
CALL IDE_WAIT00 ; WAIT FOR $00 TO CLEAR
POP HL ; RECOVER TIMEOUT
LD (IDE_TIMEOUT),HL ; SET IT
;
; IF WE GET HERE AND THE DRIVE IS STILL INITIALIZING, WE NEED TO
; WAIT UNTIL THE DRIVE IS READY. IN THIS CASE BUSY *WILL* BE HIGH.
; BASED ON TESTING, DRDY AND DSC VALUES VARY. EVERYTHING ELSE SEEMS
; TO BE ZERO. SO, WE FILTER OUT DRDY & DSC, THEN LOOK FOR BUSY=1
; AND ALL ELSE ZERO. THIS GENERALLY AVOIDS VALUES THAT ARE TYPICAL
; FOR FLOATING PORTS AND SO CAN BE USED TO DETERMINE IF WE NEED TO
; WAIT FOR THE DEVICE TO BE READY. THIS WAIT IS MANDATORY BECAUSE
; SOME (IF NOT ALL) DEVICES WILL NOT PERSIST REGISTER VALUES UNTIL
; THE DRIVE IS READY.
;
IDE_PROBE0:
CALL IDE_IN
.DB IDE_REG_STAT
#IF (IDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
;
AND %10101111 ; FILTER OUT DRDY & DSC
CP $80 ; INIT IN PROGRESS?
JR NZ,IDE_PROBE1 ; IF NOT, SKIP AHEAD
;
#IF (IDETRACE >= 3)
PRTS(" WAIT$")
#ENDIF
;
LD HL,(IDE_TIMEOUT) ; GET CURRENT TIMEOUT
PUSH HL ; SAVE IT
LD HL,IDE_TOSLOW ; SLOW TIMEOUT FOR THIS
LD (IDE_TIMEOUT),HL ; SET IT
CALL IDE_WAITBSY ; WAIT FOR BUSY TO CLEAR
POP HL ; RECOVER TIMEOUT
LD (IDE_TIMEOUT),HL ; SET IT
;
#IF (IDETRACE >= 3)
CALL IDE_IN
.DB IDE_REG_STAT
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
;
; TEST FOR PRESENCE OF IDE REGISTERS. USE LBA0/1 TO SEE
; IF VALUE CAN BE PERSISTED. THE USE OF BOTH LBA0 AND LBA1
; IS TO MAINTAIN CONSISTENCY WITH TGHE THE PPIDE DRIVER BECAUSE
; IS TO MAINTAIN CONSISTENCY WITH THE THE PPIDE DRIVER BECAUSE
; PPI ITSELF WILL PERSIST THE LAST VALUE WRITTEN, SO WE USE
; MULTIPLE REGISTERS TO WORK AROUND THIS FALSE POSITIVE.
; MULTIPLE REGISTERS TO WORK AROUND THIS.
;
IDE_PROBE1:
; $AA -> LBA0
LD A,$AA
CALL IDE_OUT
.DB IDE_REG_LBA0
;
;
; $55 => LBA1
LD A,$55
CALL IDE_OUT
@@ -1163,42 +1284,34 @@ IDE_PROBE:
CALL IDE_REGDUMP
#ENDIF
;
;JR IDE_PROBE1 ; *DEBUG*
;
IDE_PROBE0:
CALL IDE_WAITBSY ; WAIT FOR BUSY TO CLEAR
JP NZ,IDE_NOMEDIA ; CONVERT TIMEOUT TO NO MEDIA AND RETURN
;
#IF (IDETRACE >= 3)
CALL IDE_REGDUMP
#ENDIF
;
; CHECK STATUS
;IN A,(IDE_IO_STAT) ; GET STATUS
CALL IDE_IN
.DB IDE_REG_STAT
#IF (IDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE ; IF DEBUG, PRINT STATUS
#ENDIF
OR A ; SET FLAGS TO TEST FOR ZERO
JP Z,IDE_NOMEDIA
;
IDE_PROBE1:
; ASSUME ATA DEVICE FOR NOW, RECORD TYPE AND RETURN SUCCESS
LD A,IDE_TYPEATA ; TYPE = ATA
LD (IY+IDE_TYPE),A ; SET IT IN INSTANCE DATA
XOR A ; SIGNAL SUCCESS
RET ; DONE, NOTE THAT A=0 AND Z IS SET
XOR A
RET
;
; (RE)INITIALIZE DEVICE
;
IDE_INITDEV:
;
LD A,(IY+IDE_TYPE) ; GET THE DEVICE TYPE
OR A ; SET FLAGS
JP Z,IDE_NOMEDIA ; EXIT SETTING NO MEDIA STATUS
#IF (IDETRACE >= 3)
CALL IDE_PRTPREFIX
PRTS(" INITDEV$") ; LABEL FOR IO ADDRESS
#ENDIF
;
; IF THE IDE STATUS BYTE IS $00, WE HAVE EITHER A NON-PRESENT SLAVE
; OR AN ATAPI DEVICE. TO DIFFERENTIATE THESE POSSIBILITIES, WE RUN
; A NOP COMMAND. IF WE HAVE AN ATAPI DEVICE, THIS WILL CAUSE THE
; STATUS BYTE TO BE "NORMAL" (NON-ZERO). IF THE STATUS IS STILL
; ZERO, WE ABORT WITH A NO MEDIA STATUS. NOTE THAT THE NOP COMMAND
; RETURNS A COMMAND ERROR BY DESIGN. WE JUST IGNORE THE ERROR.
;
CALL IDE_NOP
CALL IDE_IN
.DB IDE_REG_STAT
OR A
JP Z,IDE_NOMEDIA
;
; WE NEED TO SETUP 8-BIT MODE BEFORE DOING ANYTHING ELSE
;
IDE_INITDEV0A:
BIT 1,(IY+IDE_ACC) ; 8 BIT ACCESS?
JR Z,IDE_INITDEV0 ; NO, DO 16 BIT INIT
LD A,IDE_FEAT_ENABLE8BIT ; FEATURE VALUE = ENABLE 8-BIT PIO
@@ -1216,10 +1329,14 @@ IDE_INITDEV0:
IDE_INITDEV00:
;
CALL IDE_IDENTIFY ; EXECUTE IDENTIFY COMMAND
RET NZ ; BAIL OUT ON ERROR
JR NZ,IDE_INITDEVP ; ON ERROR, TRY PACKET DEVICE
;
; DECLARE WE ARE ATA
LD A,IDE_TYPEATA ; OTHERWISE TYPE=ATA
LD (IY+IDE_TYPE),A ; SET IT IN INSTANCE DATA
;
LD DE,HB_WRKBUF ; POINT TO BUFFER
#IF (IDETRACE >= 3)
#IF (IDETRACE >= 4)
CALL DUMP_BUFFER ; DUMP IT IF DEBUGGING
#ENDIF
;
@@ -1239,38 +1356,15 @@ IDE_INITDEV00:
CALL PRTHEXWORD
#ENDIF
;
; SEE PAGE 114 OF CF+ & CF SPECIFICATION REV. 3.0 FOR CF CARD
; SIGNATURE VALUES. ALL OF THE BELOW ARE DOCUMENTED THERE EXCEPT
; $045A WHICH IS A VALUE DISCOVERED ON A CF<->SD CARD ADAPTER.
;
; SIGNATURE $045A IS NOT LISTED IN THE CF SPEC. IT WAS ADDED BECAUSE
; IT WAS SEEN IN THE WILD ON A CF-SD ADAPTER. HOWEVER IT HAS NOW
; ALSO BEEN SEEN ON A SPINNING HARD DISK. SINCE IT IS AMBIGUOUS, I
; WILL CONSIDER IT TO BE A HARD DISK.
;
LD BC,$848A ; STANDARD CF CARD SIGNATURE %1000 1111 1000 1010
CALL IDE_INITDEV000 ; TEST & SET
LD BC,$044A ; ALT SIG FOR CF NON-REMOVABLE %0000 0100 0100 1010
CALL IDE_INITDEV000 ; TEST & SET
;LD BC,$045A ; ?ALT SIG FOR CF NON-REMOVABLE %0000 0100 0101 1010
;CALL IDE_INITDEV000 ; TEST & SET
LD BC,$0040 ; ALT SIG FOR CF NON-REMOVABLE %0000 0000 0100 0000
CALL IDE_INITDEV000 ; TEST & SET
JR IDE_INITDEV1 ; CONTINUE INIT
;
IDE_INITDEV000:
; CHECK IF FIRST WORD OF IDENTIFY DATA MATCHES VALUE IN BC
; AND SET CF FLAG IF SO
LD HL,(HB_WRKBUF) ; FIRST WORD OF IDENTIFY DATA
OR A ; CLEAR CARRY
SBC HL,BC ; COMPARE
RET NZ ; ABORT IF NOT EQUAL
; DETERMINE IF COMPACTFLASH MEDIA
LD A,(HB_WRKBUF+(83*2)) ; LOW BYTE OF WORD 83
BIT 2,A ; TEST CFA FEATURE SET BIT
JR Z,IDE_INITDEV1 ; IF NOT, SKIP
SET 0,(IY+IDE_MED) ; ELSE SET FLAGS BIT FOR CF MEDIA
RET ; AND RETURN
;
IDE_INITDEV1:
; DETERMINE IF LBA CAPABLE
LD A,(HB_WRKBUF+98+1) ; GET BYTE WITH LBA BIT FROM BUFFER
LD A,(HB_WRKBUF+98+1) ; HIGH BYTE OF WORD 49
BIT 1,A ; CHECK THE LBA BIT
JR Z,IDE_INITDEV2 ; NOT SET, BYPASS
SET 1,(IY+IDE_MED) ; SET FLAGS BIT FOR LBA
@@ -1287,12 +1381,39 @@ IDE_INITDEV2:
POP BC ; RECOVER POINTER TO CAPACITY ENTRY
CALL ST32 ; SAVE CAPACITY
;
; RESET CARD STATUS TO 0 (OK)
; RECORD STATUS OK
XOR A ; A := 0 (STATUS = OK)
LD (IY+IDE_STAT),A ; SAVE IT
;
RET ; RETURN, A=0, Z SET
;
;
;
IDE_INITDEVP:
CALL IDE_IDENTIFYPACKET ; EXECUTE IDENTIFY COMMAND
RET NZ ; BAIL OUT ON ERROR
;
; DECLARE WE ARE ATAPI
LD A,IDE_TYPEATAPI ; OTHERWISE TYPE=ATAPI
LD (IY+IDE_TYPE),A ; SET IT IN INSTANCE DATA
;
LD DE,HB_WRKBUF ; POINT TO BUFFER
#IF (IDETRACE >= 4)
CALL DUMP_BUFFER ; DUMP IT IF DEBUGGING
#ENDIF
;
LD (IY+IDE_MED),0 ; CLEAR FLAGS
;
; DONE FOR NOW, ATAPI NOT INPLEMENTED
;
; RETURN NOT SUPPORTED STATUS
JP IDE_NOTSUP ; NOT SUPPORTED
;
; ; RECORD STATUS OK
; XOR A ; A := 0 (STATUS = OK)
; LD (IY+IDE_STAT),A ; SAVE IT
; RET
;
; SWITCH IY POINTER FROM CURRENT UNIT CFG TO PARTNER UNIT CFG
;
IDE_GOPARTNER:
@@ -1338,7 +1459,7 @@ IDE_WAITRDY2:
;
;
IDE_WAITDRQ:
LD A,(IDE_TIMEOUT) ; GET TIMEOUT IN 0.05 SECS
LD A,(IDE_TIMEOUT) ; GET TIMEOUT IN 0.1 SECS
LD B,A ; PUT IN OUTER LOOP VAR
IDE_WAITDRQ1:
LD DE,(IDE_TOSCALER) ; CPU SPPED SCALER TO INNER LOOP VAR
@@ -1360,14 +1481,14 @@ IDE_WAITDRQ2:
;
;
IDE_WAITBSY:
LD A,(IDE_TIMEOUT) ; GET TIMEOUT IN 0.05 SECS
LD A,(IDE_TIMEOUT) ; GET TIMEOUT IN 0.1 SECS
LD B,A ; PUT IN OUTER LOOP VAR
IDE_WAITBSY1:
LD DE,(IDE_TOSCALER) ; CPU SPPED SCALER TO INNER LOOP VAR
IDE_WAITBSY2:
;IN A,(IDE_IO_STAT) ; WAIT FOR DRIVE'S 512 BYTE READ BUFFER ; 11TS
CALL IDE_IN ; 17TS + ???TS
.DB IDE_REG_STAT ; 0TS
;IN A,(IDE_IO_STAT) ; WAIT FOR DRIVE'S 512 BYTE READ BUFFER
CALL IDE_IN ; 17TS + 121TS
.DB IDE_REG_STAT
LD C,A ; SAVE IT ; 4TS
AND %10000000 ; TO FILL (OR READY TO FILL) ; 7TS
RET Z ; 5TS
@@ -1376,25 +1497,45 @@ IDE_WAITBSY2:
OR E ; 4TS
JR NZ,IDE_WAITBSY2 ; 12TS
DJNZ IDE_WAITBSY1 ; -----
JP IDE_BSYTO ; EXIT WITH BSYTO ERR ; ??TS
JP IDE_BSYTO ; EXIT WITH BSYTO ERR ; 180
;
;
;
IDE_WAIT00:
LD A,(IDE_TIMEOUT) ; GET TIMEOUT IN 0.1 SECS
LD B,A ; PUT IN OUTER LOOP VAR
IDE_WAIT001:
LD DE,(IDE_TOSCALER) ; CPU SPPED SCALER TO INNER LOOP VAR
IDE_WAIT002:
;IN A,(IDE_IO_STAT) ; WAIT FOR DRIVE'S 512 BYTE READ BUFFER
CALL IDE_IN
.DB IDE_REG_STAT
OR A ; SET FLAGS
RET NZ ; DONE IF NOT ZERO
DEC DE
LD A,D
OR E
JR NZ,IDE_WAIT002
DJNZ IDE_WAIT001
RET ; DONE
;
; READ A VALUE FROM THE DEVICE POINTED TO BY IY AND RETURN IT IN A
;
IDE_IN:
EX (SP),HL ; GET PARM POINTER
PUSH BC
LD A,(HL)
INC HL
LD C,(IY+IDE_IOBASE)
ADD A,C
LD C,A
IN A,(C)
POP BC
EX (SP),HL ; RESTORE STACK
RET
;
; OUTPUT VALUE IN A TO THE DEVICE POINTED TO BY IY
;
IDE_IN:
EX (SP),HL ; GET PARM POINTER ; 19TS
PUSH BC ; 11TS
LD A,(HL) ; 7TS
INC HL ; 6TS
LD C,(IY+IDE_IOBASE) ; 19TS
ADD A,C ; 4TS
LD C,A ; 4TS
IN A,(C) ; 12TS
POP BC ; 10TS
EX (SP),HL ; RESTORE STACK ; 19TS
RET ; 10TS
; ; ----
; OUTPUT VALUE IN A TO THE DEVICE POINTED TO BY IY ; 121TS
;
IDE_OUT:
EX (SP),HL ; GET PARM POINTER
PUSH BC
@@ -1444,6 +1585,10 @@ IDE_BSYTO:
LD A,IDE_STBSYTO
JR IDE_ERR
;
IDE_NOTSUP:
LD A,IDE_STNOTSUP
JR IDE_ERR
;
IDE_ERR:
LD (IY+IDE_STAT),A ; SAVE NEW STATUS
;
@@ -1461,39 +1606,15 @@ IDE_PRTERR:
RET Z ; DONE IF NO ERRORS
; FALL THRU TO IDE_PRTSTAT
;
; PRINT STATUS STRING (STATUS NUM IN A)
; PRINT FULL DEVICE STATUS LINE
;
IDE_PRTSTAT:
PUSH AF
PUSH DE
PUSH HL
LD A,(IY+IDE_STAT)
OR A
LD DE,IDE_STR_STOK
JR Z,IDE_PRTSTAT1
INC A
LD DE,IDE_STR_STINVUNIT
CP IDE_STINVUNIT
JR Z,IDE_PRTSTAT2 ; INVALID UNIT IS SPECIAL CASE
INC A
LD DE,IDE_STR_STNOMEDIA
JR Z,IDE_PRTSTAT1
INC A
LD DE,IDE_STR_STCMDERR
JR Z,IDE_PRTSTAT1
INC A
LD DE,IDE_STR_STIOERR
JR Z,IDE_PRTSTAT1
INC A
LD DE,IDE_STR_STRDYTO
JR Z,IDE_PRTSTAT1
INC A
LD DE,IDE_STR_STDRQTO
JR Z,IDE_PRTSTAT1
INC A
LD DE,IDE_STR_STBSYTO
JR Z,IDE_PRTSTAT1
LD DE,IDE_STR_STUNK
IDE_PRTSTAT1:
CALL IDE_PRTPREFIX ; PRINT UNIT PREFIX
JR IDE_PRTSTAT3
IDE_PRTSTAT2:
@@ -1501,12 +1622,52 @@ IDE_PRTSTAT2:
PRTS("IDE:$") ; NO UNIT NUM IN PREFIX FOR INVALID UNIT
IDE_PRTSTAT3:
CALL PC_SPACE ; FORMATTING
CALL WRITESTR
CALL IDE_PRTSTATSTR
POP HL
POP DE
POP AF
RET
;
; PRINT STATUS STRING
;
IDE_PRTSTATSTR:
PUSH AF
PUSH DE
LD A,(IY+IDE_STAT)
OR A
LD DE,IDE_STR_STOK
JR Z,IDE_PRTSTATSTR1
INC A
LD DE,IDE_STR_STINVUNIT
JR Z,IDE_PRTSTATSTR1
INC A
LD DE,IDE_STR_STNOMEDIA
JR Z,IDE_PRTSTATSTR1
INC A
LD DE,IDE_STR_STCMDERR
JR Z,IDE_PRTSTATSTR1
INC A
LD DE,IDE_STR_STIOERR
JR Z,IDE_PRTSTATSTR1
INC A
LD DE,IDE_STR_STRDYTO
JR Z,IDE_PRTSTATSTR1
INC A
LD DE,IDE_STR_STDRQTO
JR Z,IDE_PRTSTATSTR1
INC A
LD DE,IDE_STR_STBSYTO
JR Z,IDE_PRTSTATSTR1
INC A
LD DE,IDE_STR_STNOTSUP
JR Z,IDE_PRTSTATSTR1
LD DE,IDE_STR_STUNK
IDE_PRTSTATSTR1:
CALL WRITESTR
POP DE
POP AF
RET
;
; PRINT ALL REGISTERS DIRECTLY FROM DEVICE
; DEVICE MUST BE SELECTED PRIOR TO CALL
;
@@ -1546,30 +1707,6 @@ IDE_PRTPREFIX1:
CALL PC_COLON
POP AF
RET
;;;
;;;
;;;
;;#IF (DSKYENABLE)
;;IDE_DSKY:
;; LD HL,DSKY_HEXBUF ; POINT TO DSKY BUFFER
;; CALL IDE_IN
;; .DB IDE_REG_DRVHD
;; LD (HL),A ; SAVE IN BUFFER
;; INC HL ; INCREMENT BUFFER POINTER
;; CALL IDE_IN
;; .DB IDE_REG_CYLHI
;; LD (HL),A ; SAVE IN BUFFER
;; INC HL ; INCREMENT BUFFER POINTER
;; CALL IDE_IN
;; .DB IDE_REG_CYLLO
;; LD (HL),A ; SAVE IN BUFFER
;; INC HL ; INCREMENT BUFFER POINTER
;; CALL IDE_IN
;; .DB IDE_REG_SECT
;; LD (HL),A ; SAVE IN BUFFER
;; CALL DSKY_HEXOUT ; SEND IT TO DSKY
;; RET
;;#ENDIF
;
;=============================================================================
; STRING DATA
@@ -1583,6 +1720,7 @@ IDE_STR_STIOERR .TEXT "IO ERROR$"
IDE_STR_STRDYTO .TEXT "READY TIMEOUT$"
IDE_STR_STDRQTO .TEXT "DRQ TIMEOUT$"
IDE_STR_STBSYTO .TEXT "BUSY TIMEOUT$"
IDE_STR_STNOTSUP .TEXT "NOT SUPPORTED$"
IDE_STR_STUNK .TEXT "UNKNOWN ERROR$"
;
IDE_STR_NO .TEXT "NO$"
@@ -1594,12 +1732,15 @@ IDE_STR_MODE_DIDE .TEXT "DIDE$"
IDE_STR_MODE_MK4 .TEXT "MK4$"
IDE_STR_MODE_RC .TEXT "RC$"
;
IDE_STR_TYPEATA .TEXT " ATA$"
IDE_STR_TYPEATAPI .TEXT " ATAPI$"
;
;=============================================================================
; DATA STORAGE
;=============================================================================
;
IDE_TIMEOUT .DB IDE_TONORM ; WAIT FUNCS TIMEOUT IN TENTHS OF SEC
IDE_TOSCALER .DW CPUMHZ * 961 ; WAIT FUNCS SCALER FOR CPU SPEED
IDE_TOSCALER .DW CPUMHZ * 556 ; WAIT FUNCS SCALER FOR CPU SPEED
;
IDE_CMD .DB 0 ; PENDING COMMAND TO PROCESS
IDE_IOFNADR .DW 0 ; PENDING IO FUNCTION ADDRESS

1552
Source/HBIOS/imm.asm Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -14,9 +14,10 @@
;
; DRIVER DATA OFFSETS (FROM IY)
;
KBD_ST .EQU 0 ; BYTE, STATUS PORT NUM (R)
KBD_MODE .EQU 0 ; BYTE, KEYBOARD MODE (STD OR VRC)
KBD_ST .EQU 1 ; BYTE, STATUS PORT NUM (R)
KBD_CMD .EQU KBD_ST ; BYTE, CMD PORT NUM (W)
KBD_DAT .EQU 1 ; BYTE, DATA PORT NUM (R/W)
KBD_DAT .EQU 2 ; BYTE, DATA PORT NUM (R/W)
;
; TIMING CONSTANTS
;
@@ -69,17 +70,33 @@ KBD_INIT:
LD (KBD_REPEAT),A ; SAVE IT
LD A,KBD_DEFSTATE ; GET DEFAULT STATE
LD (KBD_STATE),A ; SAVE IT
;
LD A,(IY+KBD_MODE) ; GET KBD MODE BYTE
CP KBDMODE_VRC ; VRC?
JR Z,KBD_INIT1 ; IF SO, MUST ASSUME PRESENT
;
LD A,$AA ; CONTROLLER SELF TEST
CALL KBD_PUTCMD ; SEND IT
CALL KBD_GETDATA ; CONTROLLER SHOULD RESPOND WITH $55 (ACK)
;
CP $55 ; IS IT THERE?
JR Z,KBD_INIT1 ; IF SO, CONTINUE
PRTS(" NOT PRESENT$") ; DIAGNOSE PROBLEM
RET ; BAIL OUT
;
KBD_INIT1:
PRTS(" MODE=$") ; TAG
LD A,(IY+KBD_MODE) ; GET MODE VALUE
LD DE,KBD_STR_MODEPS2
CP KBDMODE_PS2
JR Z,KBD_INIT2
LD DE,KBD_STR_MODEVRC
CP KBDMODE_VRC
JR Z,KBD_INIT2
LD DE,KBD_STR_MODEUNK
KBD_INIT2:
CALL WRITESTR
;
LD A,$60 ; SET COMMAND REGISTER
CALL KBD_PUTCMD ; SEND IT
; LD A,$60 ; XLAT ENABLED, MOUSE DISABLED, NO INTS
@@ -88,11 +105,6 @@ KBD_INIT1:
CALL KBD_GETDATA ; GOBBLE UP $AA FROM POWER UP, AS NEEDED
; LD A,$AE ; COMMAND = ENABLE KEYBOARD
; CALL KBD_PUTCMD ; SEND IT
; LD A,$A7 ; COMMAND = DISABLE MOUSE
; CALL KBD_PUTCMD ; SEND IT
CALL KBD_RESET ; RESET THE KEYBOARD
CALL KBD_SETLEDS ; UPDATE LEDS BASED ON CURRENT TOGGLE STATE BITS
CALL KBD_SETRPT ; UPDATE REPEAT RATE BASED ON CURRENT SETTING
@@ -177,6 +189,9 @@ KBD_PUTCMD:
; PUT A CMD BYTE FROM A TO THE KEYBOARD INTERFACE WITH TIMEOUT
;
LD E,A ; SAVE INCOMING VALUE IN E
LD A,(IY+KBD_MODE) ; GET MODE BYTE
CP KBDMODE_VRC ; VGARC KEYBOARD?
JR Z,KBD_PUTCMD2 ; BAIL OUT
LD B,KBD_WAITTO ; SETUP TO LOOP
KBD_PUTCMD0:
CALL KBD_OST ; GET OUTPUT REGISTER STATUS
@@ -194,6 +209,7 @@ KBD_PUTCMD1:
#ENDIF
LD C,(IY+KBD_CMD) ; COMMAND PORT
OUT (C),A ; WRITE IT
KBD_PUTCMD2:
XOR A ; SIGNAL SUCCESS
RET
;
@@ -203,6 +219,9 @@ KBD_PUTDATA:
; PUT A DATA BYTE FROM A TO THE KEYBOARD INTERFACE WITH TIMEOUT
;
LD E,A ; SAVE INCOMING VALUE IN E
LD A,(IY+KBD_MODE) ; GET MODE BYTE
CP KBDMODE_VRC ; VGARC KEYBOARD?
JR Z,KBD_PUTDATA2 ; BAIL OUT
LD B,KBD_WAITTO ; SETUP TO LOOP
KBD_PUTDATA0:
CALL KBD_OST ; GET OUTPUT REGISTER STATUS
@@ -219,6 +238,7 @@ KBD_PUTDATA1:
#ENDIF
LD C,(IY+KBD_DAT) ; DATA PORT
OUT (C),A ; WRITE IT
KBD_PUTDATA2:
XOR A ; SIGNAL SUCCESS
RET
;
@@ -681,11 +701,21 @@ KBD_DECNEW: ; START NEW KEYPRESS (CLEAR ALL STATUS BITS)
LD (KBD_STATUS),A ; CLEAR STATUS
JP KBD_DEC1 ; RESTART THE ENGINE
;
; DRIVER DATA
;
KBD_STR_MODEPS2 .TEXT "PS2$"
KBD_STR_MODEVRC .TEXT "VRC$"
KBD_STR_MODEUNK .TEXT "???$"
;
;
;
#IF (KBDKBLOUT == KBD_US)
;
;__________________________________________________________________________________________________
;
; MAPPING TABLES US/ENGLISH
;__________________________________________________________________________________________________
;
KBD_MAPSTD: ; SCANCODE IS INDEX INTO TABLE TO RESULTANT LOOKUP KEYCODE
.DB $FF,$E8,$FF,$E4,$E2,$E0,$E1,$EB,$FF,$E9,$E7,$E5,$E3,$09,'`',$FF
.DB $FF,$B4,$B0,$FF,$B2,'q','1',$FF,$FF,$FF,'z','s','a','w','2',$FF
@@ -722,7 +752,9 @@ KBD_MAPNUMPAD: ; KEYCODE TRANSLATION FROM NUMPAD RANGE TO STD ASCII/KEYCODES
.DB $F3,$F7,$F5,$F8,$FF,$F9,$F2,$F6,$F4,$F0,$F1,$2F,$2A,$2D,$2B,$0D
.DB $31,$32,$33,$34,$35,$36,$37,$38,$39,$30,$2E,$2F,$2A,$2D,$2B,$0D
#ENDIF
;
#IF (KBDKBLOUT == KBD_DE)
;
;__________________________________________________________________________________________________
;
; MAPPING TABLES GERMAN

View File

@@ -3,12 +3,15 @@
; CENTRONICS (LPT) INTERFACE DRIVER
;==================================================================================================
;
; CENTRONICS-STYLE PARALLEL PRINTER DRIVER. ASSUMES IBM STYLE
; HARDWARE INTERFACE AS DESCRIBED BELOW.
; CENTRONICS-STYLE PARALLEL PRINTER DRIVER.
;
; IMPLEMENTED AS A ROMWBW CHARACTER DEVICE. CURRENTLY HANDLES OUPUT
; ONLY.
;
;==================================================================================================
;
; IBM STYLE INTERFACE (USED BY NHYODYNE PRINT MODULE):
;
; PORT 0 (INPUT/OUTPUT):
;
; D7 D6 D5 D4 D3 D2 D1 D0
@@ -20,7 +23,7 @@
;
; D7 D6 D5 D4 D3 D2 D1 D0
; +-------+-------+-------+-------+-------+-------+-------+-------+
; | BUSY | ACK | POUT | SEL | ERR | 0 | 0 | 0 |
; | /BUSY | /ACK | POUT | SEL | /ERR | 0 | 0 | 0 |
; +-------+-------+-------+-------+-------+-------+-------+-------+
;
; PORT 2 (INPUT/OUTPUT):
@@ -30,16 +33,40 @@
; | STAT1 | STAT0 | ENBL | PINT | SEL | RES | LF | STB |
; +-------+-------+-------+-------+-------+-------+-------+-------+
;
LPT_NONE .EQU 0 ; NOT PRESENT
LPT_IBM .EQU 1 ; IBM PC STYLE INTERFACE
;==================================================================================================
;
; MG014 STYLE INTERFACE (USED BY RCBUS MG014 MODULE):
;
; PORT 0 (INPUT/OUTPUT):
;
; D7 D6 D5 D4 D3 D2 D1 D0
; +-------+-------+-------+-------+-------+-------+-------+-------+
; | PD7 | PD6 | PD5 | PD4 | PD3 | PD2 | PD1 | PD0 |
; +-------+-------+-------+-------+-------+-------+-------+-------+
;
; PORT 1 (INPUT):
;
; D7 D6 D5 D4 D3 D2 D1 D0
; +-------+-------+-------+-------+-------+-------+-------+-------+
; | | | | /ERR | SEL | POUT | BUSY | /ACK |
; +-------+-------+-------+-------+-------+-------+-------+-------+
;
; PORT 2 (INPUT/OUTPUT):
;
; D7 D6 D5 D4 D3 D2 D1 D0
; +-------+-------+-------+-------+-------+-------+-------+-------+
; | LED | | | | /SEL | /RES | /LF | /STB |
; +-------+-------+-------+-------+-------+-------+-------+-------+
;
;==================================================================================================
;
; PRE-CONSOLE INITIALIZATION - DETECT AND INIT HARDWARE
;
LPT_PREINIT:
;
; SETUP THE DISPATCH TABLE ENTRIES
; NOTE: INTS WILL BE DISABLED WHEN PREINIT IS CALLED AND THEY MUST REMIAIN
; DISABLED.
; NOTE: INTS WILL BE DISABLED WHEN PREINIT IS CALLED AND THEY MUST
; REMAIN DISABLED.
;
LD B,LPT_CFGCNT ; LOOP CONTROL
XOR A ; ZERO TO ACCUM
@@ -136,18 +163,26 @@ LPT_IN:
LPT_OUT:
CALL LPT_OST ; READY TO SEND?
JR Z,LPT_OUT ; LOOP IF NOT
LD A,(IY+3)
LD C,A ; PORT 0 (DATA)
OUT (C),E ; OUTPUT DATA TO PORT
CALL DELAY ; IGNORE ANYTHING BACK AFTER A RESET
LD A,%00001101 ; SELECT & STROBE, LEDS OFF
INC C ; PUT CONTROL PORT IN C
INC C
OUT (C),A ; OUTPUT DATA TO PORT
CALL DELAY ; IGNORE ANYTHING BACK AFTER A RESET
LD A,%00001100 ; SELECT, LEDS OFF
OUT (C),A ; OUTPUT DATA TO PORT
LD C,(IY+3) ; PORT 0 (DATA)
OUT (C),E ; OUTPUT DATA TO PORT
#IF (LPTMODE == LPTMODE_IBM)
LD A,%00001101 ; SELECT & STROBE, LEDS OFF
#ENDIF
#IF (LPTMODE == LPTMODE_MG014)
LD A,%00000100 ; SELECT & STROBE, LED OFF
#ENDIF
INC C ; PUT CONTROL PORT IN C
INC C
OUT (C),A ; OUTPUT DATA TO PORT
CALL DELAY
#IF (LPTMODE == LPTMODE_IBM)
LD A,%00001100 ; SELECT, LEDS OFF
#ENDIF
#IF (LPTMODE == LPTMODE_MG014)
LD A,%00000101 ; SELECT, LED OFF
#ENDIF
OUT (C),A ; OUTPUT DATA TO PORT
CALL DELAY
XOR A ; SIGNAL SUCCESS
RET
;
@@ -161,11 +196,16 @@ LPT_IST:
; OUTPUT STATUS
;
LPT_OST:
LD A,(IY+3)
LD C,A ; PORT 0 (DATA)
INC C ; SELECT STATUS PORT
IN A,(C) ; GET STATUS INFO
AND %10000000 ; ONLY INTERESTED IN BUSY FLAG
LD C,(IY+3) ; BASE PORT
INC C ; SELECT STATUS PORT
IN A,(C) ; GET STATUS INFO
#IF (LPTMODE == LPTMODE_IBM)
AND %10000000 ; ISOLATE /BUSY
#ENDIF
#IF (LPTMODE == LPTMODE_MG014)
AND %00000010 ; ISOLATE BUSY
XOR %00000010 ; INVERT TO READY
#ENDIF
RET ; DONE
;
; INITIALIZE DEVICE
@@ -180,20 +220,40 @@ LPT_INITDEV:
; PREINIT ABOVE. PREINIT IS NOT ALLOWED TO ENABLE INTS!
;
LPT_INITDEVX:
LD A,(IY+3)
LD C,A ; PORT 0 (DATA)
;
#IF (LPTMODE == LPTMODE_IBM)
;
LD C,(IY+3) ; PORT 0 (DATA)
XOR A ; CLEAR ACCUM
OUT (C),A ; SEND IT
INC C ; BUMP TO
INC C ; ... PORT 2
LD A,%00001000 ; SELECT AND ASSERT RESET, LEDS OFF
OUT (C),A ; SEND IT
CALL LDELAY ; HALF SECOND DELAY
CALL LDELAY ; HALF SECOND DELAY
LD A,%00001100 ; SELECT AND DEASSERT RESET, LEDS OFF
OUT (C),A ; SEND IT
XOR A ; SIGNAL SUCCESS
RET ; RETURN
;
#ENDIF
;
#IF (LPTMODE == LPTMODE_MG014)
LD A,(IY+3) ; BASE PORT
ADD A,3 ; BUMP TO CONTROL PORT
LD C,A ; MOVE TO C FOR I/O
LD A,$82 ; CONFIG A OUT, B IN, C OUT
OUT (C),A ; DO IT
DEC C ; OUTPUT PORT
LD A,$81 ; STROBE OFF, SELECT ON, RES ON, LED ON
OUT (C),A ; SEND IT
CALL LDELAY ; HALF SECOND DELAY
LD A,$05 ; STROBE OFF, SELECT ON, RES OFF, LED OFF
OUT (C),A ; SEND IT
XOR A ; SIGNAL SUCCESS
RET ; RETURN
#ENDIF
;
;
;
LPT_QUERY:
@@ -215,17 +275,26 @@ LPT_DEVICE:
;
; LPT DETECTION ROUTINE
;
#IF (LPTMODE == LPTMODE_NONE)
;
LPT_DETECT:
LD A,(IY+3) ; BASE PORT ADDRESS
LD C,A ; PUT IN C FOR I/O
LD A,LPTMODE_NONE ; NOTHING TO DETECT
RET
;
#ENDIF
;
#IF (LPTMODE == LPTMODE_IBM)
;
LPT_DETECT:
LD C,(IY+3) ; BASE PORT ADDRESS
CALL LPT_DETECT2 ; CHECK IT
JR Z,LPT_DETECT1 ; FOUND IT, RECORD IT
LD A,LPT_NONE ; NOTHING FOUND
LD A,LPTMODE_NONE ; NOTHING FOUND
RET ; DONE
;
LPT_DETECT1:
; LPT FOUND, RECORD IT
LD A,LPT_IBM ; RETURN CHIP TYPE
LD A,LPTMODE_IBM ; RETURN CHIP TYPE
RET ; DONE
;
LPT_DETECT2:
@@ -253,6 +322,43 @@ LPT_DETECT2:
CP $A5 ; CORRECT?
RET ; RETURN (ZF SET CORRECTLY)
;
#ENDIF
;
#IF (LPTMODE == LPTMODE_MG014)
LPT_DETECT:
;
; TEST FOR PPI EXISTENCE
; WE SETUP THE PPI TO WRITE, THEN WRITE A VALUE OF $A5
; TO PORT A (DATALO), THEN READ IT BACK. IF THE PPI IS THERE
; THEN THE BUS HOLD CIRCUITRY WILL READ BACK THE $A5. SINCE
; WE ARE IN WRITE MODE, AN IDE CONTROLLER WILL NOT BE ABLE TO
; INTERFERE WITH THE VALUE BEING READ.
;
LD A,(IY+3) ; BASE IO ADDRESS
ADD A,3 ; BUMP TO CONTROL PORT
LD C,A ; PUT IN C
LD A,$80 ; SET PORT A TO WRITE
OUT (C),A ; WRITE IT
;
LD C,(IY+3) ; PPI PORT A
LD A,$A5 ; TEST VALUE
OUT (C),A ; PUSH VALUE TO PORT
IN A,(C) ; GET PORT VALUE
#IF (LPTTRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
CP $A5 ; CHECK FOR TEST VALUE
JR Z,LPT_DETECT1 ; FOUND IT
LD A,LPTMODE_NONE ; NOT FOUND
RET
;
LPT_DETECT1:
; LPT FOUND, RECORD IT
LD A,LPTMODE_MG014 ; RETURN CHIP TYPE
RET ; DONE
#ENDIF
;
;
;
LPT_PRTCFG:
@@ -266,7 +372,7 @@ LPT_PRTCFG:
CALL PRTHEXBYTE ; PRINT BASE PORT
; PRINT THE LPT TYPE
CALL PC_SPACE ; FORMATTING
PRTS(": MODE=$") ; FORMATTING
LD A,(IY+1) ; GET LPT TYPE BYTE
RLCA ; MAKE IT A WORD OFFSET
LD HL,LPT_TYPE_MAP ; POINT HL TO TYPE MAP TABLE
@@ -291,9 +397,11 @@ LPT_PRTCFG:
LPT_TYPE_MAP:
.DW LPT_STR_NONE
.DW LPT_STR_IBM
.DW LPT_STR_MG014
;
LPT_STR_NONE .DB "<NOT PRESENT>$"
LPT_STR_IBM .DB "IBM$"
LPT_STR_MG014 .DB "MG014$"
;
; WORKING VARIABLES
;

892
Source/HBIOS/ppa.asm Normal file
View File

@@ -0,0 +1,892 @@
;
;=============================================================================
; PPA DISK DRIVER
;=============================================================================
;
; PARALLEL PORT INTERFACE FOR SCSI DISK DEVICES USING A PARALLEL PORT
; ADAPTER. PRIMARILY TARGETS PARALLEL PORT IOMEGA ZIP DRIVES.
;
; CURRENTLY CODED SPECIFICALLY FOR RCBUS MG014 PARALLEL PORT HARDWARE.
; INTENDED TO CO-EXIST WITH LPT DRIVER.
;
; CREATED BY WAYNE WARTHEN FOR ROMWBW HBIOS.
; MUCH OF THE CODE IS DERIVED FROM FUZIX (ALAN COX).
;
; 5/23/2023 WBW - INITIAL RELEASE
; 5/26/3023 WBW - CLEAN UP, LED ACTIVITY
;
;=============================================================================
;
; MG014 STYLE INTERFACE (USED BY RCBUS MG014 MODULE):
;
; PORT 0 (INPUT/OUTPUT):
;
; D7 D6 D5 D4 D3 D2 D1 D0
; +-------+-------+-------+-------+-------+-------+-------+-------+
; | PD7 | PD6 | PD5 | PD4 | PD3 | PD2 | PD1 | PD0 |
; +-------+-------+-------+-------+-------+-------+-------+-------+
;
; PORT 1 (INPUT):
;
; D7 D6 D5 D4 D3 D2 D1 D0
; +-------+-------+-------+-------+-------+-------+-------+-------+
; | | | | /ERR | SEL | POUT | BUSY | /ACK |
; +-------+-------+-------+-------+-------+-------+-------+-------+
;
; PORT 2 (INPUT/OUTPUT):
;
; D7 D6 D5 D4 D3 D2 D1 D0
; +-------+-------+-------+-------+-------+-------+-------+-------+
; | LED | | | | /SEL | /RES | /LF | /STB |
; +-------+-------+-------+-------+-------+-------+-------+-------+
;
;=============================================================================
;
; TODO:
;
; - CLEAN UP WAIT LOOP STUFF
;
; - OPTIMIZE READ/WRITE LOOPS
;
; NOTES:
;
; - THIS DRIVER IS FOR THE ZIP DRIVE PPA INTERFACE. IT WILL SIMPLY
; FAIL TO EVEN RECOGNIZE A ZIP DRIVE WITH THE OLDER PPA INTERFACE.
; THERE DOES NOT SEEM TO BE A WAY TO VISUALLY DETERMINE IF A ZIP
; DRIVE IS PPA OR PPA. SIGH.
;
; - THERE ARE SOME HARD CODED TIMEOUT LOOPS IN THE CODE. THEY ARE
; WORKING OK ON A 7 MHZ Z80. THEY ARE LIKELY TO NEED TWEAKING ON
; FASTER CPUS.
;
; - THIS DRIVER OPERATES PURELY IN NIBBLE MODE. I SUSPECT IT IS
; POSSIBLE TO USE FULL BYTE MODE (PS2 STYLE), BUT I HAVE NOT
; ATTEMPTED IT.
;
; - RELATIVE TO ABOVE, THIS BEAST IS SLOW. IN ADDITION TO THE
; NIBBLE MODE READS, THE MG014 ASSIGNS SIGNALS DIFFERENTLY THAN
; THE STANDARD IBM PARALLEL PORT WHICH NECESSITATES A BUNCH OF EXTRA
; BIT FIDDLING ON EVERY READ.
;
; - SOME OF THE DATA TRANSFERS HAVE NO BUFFER OVERRUN CHECKS. IT IS
; ASSUMED SCSI DEVICES WILL SEND/REQUEST THE EXPECTED NUMBER OF BYTES.
;
; PPA PORT OFFSETS
;
PPA_IODATA .EQU 0 ; PORT A, DATA, OUT
PPA_IOSTAT .EQU 1 ; PORT B, STATUS, IN
PPA_IOCTRL .EQU 2 ; PORT C, CTRL, OUT
PPA_IOSETUP .EQU 3 ; PPI SETUP
;
; SCSI UNIT IDS
;
PPA_SELF .EQU 7
PPA_TGT .EQU 6
;
; PPA DEVICE STATUS
;
PPA_STOK .EQU 0
PPA_STINVUNIT .EQU -1
PPA_STNOMEDIA .EQU -2
PPA_STCMDERR .EQU -3
PPA_STIOERR .EQU -4
PPA_STTO .EQU -5
PPA_STNOTSUP .EQU -6
;
; PPA DEVICE CONFIGURATION
;
PPA_CFGSIZ .EQU 12 ; SIZE OF CFG TBL ENTRIES
;
; PER DEVICE DATA OFFSETS IN CONFIG TABLE ENTRIES
;
PPA_DEV .EQU 0 ; OFFSET OF DEVICE NUMBER (BYTE)
PPA_MODE .EQU 1 ; OPERATION MODE: PPA MODE (BYTE)
PPA_STAT .EQU 2 ; LAST STATUS (BYTE)
PPA_IOBASE .EQU 3 ; IO BASE ADDRESS (BYTE)
PPA_MEDCAP .EQU 4 ; MEDIA CAPACITY (DWORD)
PPA_LBA .EQU 8 ; OFFSET OF LBA (DWORD)
;
;=============================================================================
; INITIALIZATION ENTRY POINT
;=============================================================================
;
PPA_INIT:
LD IY,PPA_CFG ; POINT TO START OF CONFIG TABLE
;
PPA_INIT1:
LD A,(IY) ; LOAD FIRST BYTE TO CHECK FOR END
CP $FF ; CHECK FOR END OF TABLE VALUE
JR NZ,PPA_INIT2 ; IF NOT END OF TABLE, CONTINUE
XOR A ; SIGNAL SUCCESS
RET ; AND RETURN
;
PPA_INIT2:
CALL NEWLINE ; FORMATTING
PRTS("PPA:$") ; DRIVER LABEL
;
PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS
LD A,(IY+PPA_IOBASE) ; GET IO BASE ADDRES
CALL PRTHEXBYTE ; DISPLAY IT
;
PRTS(" MODE=$") ; LABEL FOR MODE
LD A,(IY+PPA_MODE) ; GET MODE BITS
LD DE,PPA_STR_MODE_NONE ; MODE LABEL
CP PPAMODE_NONE ; TEST FOR MODE
JR Z,PPA_INIT3 ; IF SO, DISPLAY IT
LD DE,PPA_STR_MODE_MG014 ; MODE LABEL
CP PPAMODE_MG014 ; TEST FOR MODE
JR Z,PPA_INIT3 ; IF SO, DISPLAY IT
LD DE,PPA_STR_MODE_UNK ; MODE LABEL
PPA_INIT3:
CALL WRITESTR ; DISPLAY MODE
;
; CHECK FOR HARDWARE PRESENCE
CALL PPA_DETECT ; PROBE FOR INTERFACE
JR Z,PPA_INIT4 ; IF FOUND, CONTINUE
CALL PC_SPACE ; FORMATTING
LD DE,PPA_STR_NOHW ; NO PPA MESSAGE
CALL WRITESTR ; DISPLAY IT
JR PPA_INIT6 ; SKIP CFG ENTRY
;
PPA_INIT4:
; UPDATE DRIVER RELATIVE UNIT NUMBER IN CONFIG TABLE
LD A,(PPA_DEVNUM) ; GET NEXT UNIT NUM TO ASSIGN
LD (IY+PPA_DEV),A ; UPDATE IT
INC A ; BUMP TO NEXT UNIT NUM TO ASSIGN
LD (PPA_DEVNUM),A ; SAVE IT
;
; ADD UNIT TO GLOBAL DISK UNIT TABLE
LD BC,PPA_FNTBL ; BC := FUNC TABLE ADR
PUSH IY ; CFG ENTRY POINTER
POP DE ; COPY TO DE
CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE
;
CALL PPA_RESET ; RESET/INIT THE INTERFACE
;
; START PRINTING DEVICE INFO
CALL PPA_PRTPREFIX ; PRINT DEVICE PREFIX
;
; CHECK FOR BAD STATUS
LD A,(IY+PPA_STAT) ; GET STATUS
OR A ; SET FLAGS
JP Z,PPA_INIT5 ; CONTINUE
CALL PC_SPACE ; FORMATTING
CALL PPA_PRTSTATSTR ; PRINT STATUS STRING
JR PPA_INIT6 ; LOOP TILL DONE
;
PPA_INIT5:
; PRINT STORAGE CAPACITY (BLOCK COUNT)
PRTS(" BLOCKS=0x$") ; PRINT FIELD LABEL
LD A,PPA_MEDCAP ; OFFSET TO CAPACITY FIELD
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
CALL LD32 ; GET THE CAPACITY VALUE
CALL PRTHEX32 ; PRINT HEX VALUE
;
; PRINT STORAGE SIZE IN MB
PRTS(" SIZE=$") ; PRINT FIELD LABEL
LD B,11 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB
CALL SRL32 ; RIGHT SHIFT
CALL PRTDEC32 ; PRINT DWORD IN DECIMAL
PRTS("MB$") ; PRINT SUFFIX
;
PPA_INIT6:
LD DE,PPA_CFGSIZ ; SIZE OF CFG TABLE ENTRY
ADD IY,DE ; BUMP POINTER
JP PPA_INIT1 ; AND LOOP
;
;----------------------------------------------------------------------
; PROBE FOR PPA HARDWARE
;----------------------------------------------------------------------
;
; ON RETURN, ZF SET INDICATES HARDWARE FOUND
;
PPA_DETECT:
; INITIALIZE 8255
LD A,(IY+PPA_IOBASE) ; BASE PORT
ADD A,PPA_IOSETUP ; BUMP TO SETUP PORT
LD C,A ; MOVE TO C FOR I/O
LD A,$82 ; CONFIG A OUT, B IN, C OUT
OUT (C),A ; DO IT
CALL DELAY ; BRIEF DELAY FOR GOOD MEASURE
;
LD A,$AA
CALL PPA_WRITEDATA
CALL PPA_DISCONNECT
CALL PPA_CONNECT
LD A,$06
CALL PPA_WRITECTRL
CALL PPA_READSTATUS
;
CALL PC_SPACE
CALL PRTHEXBYTE
;
AND $F0
CP $F0
JR NZ,PPA_DETECT_FAIL
LD A,$04
CALL PPA_WRITECTRL
CALL PPA_READSTATUS
;
CALL PC_SPACE
CALL PRTHEXBYTE
;
AND $F0
CP $80
JR NZ,PPA_DETECT_FAIL
LD A,$AA
CALL PPA_WRITEDATA
LD A,$0C
CALL PPA_WRITECTRL
CALL PPA_CONNECT
LD A,$40
CALL PPA_WRITEDATA
LD A,$08
CALL PPA_WRITECTRL
LD A,$0C
CALL PPA_WRITECTRL
CALL PPA_DISCONNECT
;
XOR A ; SIGNAL SUCCESS
RET ; AND RETURN
;
PPA_DETECT_FAIL:
OR $FF ; SIGNAL FAILURE
RET NZ
;
;=============================================================================
; DRIVER FUNCTION TABLE
;=============================================================================
;
PPA_FNTBL:
.DW PPA_STATUS
.DW PPA_RESET
.DW PPA_SEEK
.DW PPA_READ
.DW PPA_WRITE
.DW PPA_VERIFY
.DW PPA_FORMAT
.DW PPA_DEVICE
.DW PPA_MEDIA
.DW PPA_DEFMED
.DW PPA_CAP
.DW PPA_GEOM
#IF (($ - PPA_FNTBL) != (DIO_FNCNT * 2))
.ECHO "*** INVALID PPA FUNCTION TABLE ***\n"
#ENDIF
;
PPA_VERIFY:
PPA_FORMAT:
PPA_DEFMED:
SYSCHKERR(ERR_NOTIMPL) ; NOT IMPLEMENTED
RET
;
;
;
PPA_READ:
CALL HB_DSKREAD ; HOOK DISK READ CONTROLLER
LD A,SCSI_CMD_READ ; SETUP SCSI READ
LD (PPA_CMD_RW),A ; AND SAVE IT IN SCSI CMD
JP PPA_IO ; DO THE I/O
;
;
;
PPA_WRITE:
CALL HB_DSKREAD ; HOOK DISK WRITE CONTROLLER
LD A,SCSI_CMD_WRITE ; SETUP SCSI WRITE
LD (PPA_CMD_RW),A ; AND SAVE IT IN SCSI CMD
JP PPA_IO ; DO THE I/O
;
;
;
PPA_IO:
LD (PPA_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
CALL PPA_CHKERR ; CHECK FOR ERR STATUS AND RESET IF SO
JR NZ,PPA_IO3 ; BAIL OUT ON ERROR
;
; SETUP LBA
; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN
LD HL,PPA_CMD_RW+1 ; START OF LBA FIELD IN CDB (MSB)
LD A,(IY+PPA_LBA+2) ; THIRD BYTE OF LBA FIELD IN CFG (MSB)
LD (HL),A
INC HL
LD A,(IY+PPA_LBA+1)
LD (HL),A
INC HL
LD A,(IY+PPA_LBA+0)
LD (HL),A
INC HL
;
; DO SCSI IO
LD DE,(PPA_DSKBUF) ; DISK BUFFER TO DE
LD BC,512 ; ONE SECTOR, 512 BYTES
LD HL,PPA_CMD_RW ; POINT TO READ/WRITE CMD TEMPLATE
CALL PPA_RUNCMD ; RUN THE SCSI ENGINE
CALL Z,PPA_CHKCMD ; IF EXIT OK, CHECK SCSI RESULTS
JR NZ,PPA_IO2 ; IF ERROR, SKIP INCREMENT
; INCREMENT LBA
LD A,PPA_LBA ; LBA OFFSET
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
CALL INC32HL ; INCREMENT THE VALUE
; INCREMENT DMA
LD HL,IDE_DSKBUF+1 ; POINT TO MSB OF BUFFER ADR
INC (HL) ; BUMP DMA BY
INC (HL) ; ... 512 BYTES
XOR A ; SIGNAL SUCCESS
;
PPA_IO2:
PPA_IO3:
LD HL,(PPA_DSKBUF) ; CURRENT DMA TO HL
OR A ; SET FLAGS BASED ON RETURN CODE
RET Z ; RETURN IF SUCCESS
LD A,ERR_IO ; SIGNAL IO ERROR
OR A ; SET FLAGS
RET ; AND DONE
;
;
;
PPA_STATUS:
; RETURN UNIT STATUS
LD A,(IY+PPA_STAT) ; GET STATUS OF SELECTED DEVICE
OR A ; SET FLAGS
RET ; AND RETURN
;
;
;
PPA_RESET:
JP PPA_INITDEV ; JUST (RE)INIT DEVICE
;
;
;
PPA_DEVICE:
LD D,DIODEV_PPA ; D := DEVICE TYPE
LD E,(IY+PPA_DEV) ; E := PHYSICAL DEVICE NUMBER
LD C,%01000000 ; C := REMOVABLE HARD DISK
LD H,(IY+PPA_MODE) ; H := MODE
LD L,(IY+PPA_IOBASE) ; L := BASE I/O ADDRESS
XOR A ; SIGNAL SUCCESS
RET
;
; PPA_GETMED
;
PPA_MEDIA:
LD A,E ; GET FLAGS
OR A ; SET FLAGS
JR Z,PPA_MEDIA1 ; JUST REPORT CURRENT STATUS AND MEDIA
;
CALL PPA_RESET ; RESET INCLUDES MEDIA CHECK
;
PPA_MEDIA1:
LD A,(IY+PPA_STAT) ; GET STATUS
OR A ; SET FLAGS
LD D,0 ; NO MEDIA CHANGE DETECTED
LD E,MID_HD ; ASSUME WE ARE OK
RET Z ; RETURN IF GOOD INIT
LD E,MID_NONE ; SIGNAL NO MEDIA
LD A,ERR_NOMEDIA ; NO MEDIA ERROR
OR A ; SET FLAGS
RET ; AND RETURN
;
;
;
PPA_SEEK:
BIT 7,D ; CHECK FOR LBA FLAG
CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA
RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA)
LD (IY+PPA_LBA+0),L ; SAVE NEW LBA
LD (IY+PPA_LBA+1),H ; ...
LD (IY+PPA_LBA+2),E ; ...
LD (IY+PPA_LBA+3),D ; ...
XOR A ; SIGNAL SUCCESS
RET ; AND RETURN
;
;
;
PPA_CAP:
LD A,(IY+PPA_STAT) ; GET STATUS
PUSH AF ; SAVE IT
LD A,PPA_MEDCAP ; OFFSET TO CAPACITY FIELD
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
CALL LD32 ; GET THE CURRENT CAPACITY INTO DE:HL
LD BC,512 ; 512 BYTES PER BLOCK
POP AF ; RECOVER STATUS
OR A ; SET FLAGS
RET
;
;
;
PPA_GEOM:
; FOR LBA, WE SIMULATE CHS ACCESS USING 16 HEADS AND 16 SECTORS
; RETURN HS:CC -> DE:HL, SET HIGH BIT OF D TO INDICATE LBA CAPABLE
CALL PPA_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC
LD L,H ; DIVIDE BY 256 FOR # TRACKS
LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL
LD D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT
LD E,16 ; SECTORS / TRACK = 16
RET ; DONE, A STILL HAS PPA_CAP STATUS
;
;=============================================================================
; FUNCTION SUPPORT ROUTINES
;=============================================================================
;
;
;
PPA_DELAY:
PUSH AF
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
POP AF
RET
;
;
;
PPA_WAITDONE:
LD HL,0 ; TIMEOUT COUNTER
PPA_WAITDONE1:
CALL PPA_READSTATUS
AND $F0
BIT 7,A
RET NZ
DEC HL
LD A,H
OR L
JP Z,IMM_CMD_TIMEOUT ; TIMEOUT
JR PPA_WAITDONE1
;
; OUTPUT BYTE IN A TO THE DATA PORT
;
PPA_WRITEDATA:
LD C,(IY+PPA_IOBASE) ; DATA PORT IS AT IOBASE
OUT (C),A ; WRITE THE BYTE
;CALL DELAY ; IS THIS NEEDED???
RET ; DONE
;
;
;
PPA_WRITECTRL:
; IBM PC INVERTS ALL BUT C2 ON THE BUS, MG014 DOES NOT.
; BELOW TRANSLATES FROM IBM -> MG014. IT ALSO INVERTS THE
; MG014 LED SIMPLY TO MAKE IT EASY TO KEEP LED ON DURING
; ALL ACTIVITY.
XOR $0B | $80 ; HIGH BIT IS MG014 LED
LD C,(IY+PPA_IOBASE) ; GET BASE IO ADDRESS
INC C ; BUMP TO CONTROL PORT
INC C
OUT (C),A ; WRITE TO CONTROL PORT
;CALL DELAY ; IS THIS NEEDED?
RET ; DONE
;
; READ THE PARALLEL PORT INPUT LINES (STATUS) AND MAP SIGNALS FROM
; MG014 TO IBM STANDARD. NOTE POLARITY CHANGE REQUIRED FOR BUSY.
;
; MG014 IBM PC
; -------- --------
; 0: /ACK 6: /ACK
; 1: BUSY 7: /BUSY
; 2: POUT 5: POUT
; 3: SEL 4: SEL
; 4: /ERR 3: /ERR
;
PPA_READSTATUS:
LD C,(IY+PPA_IOBASE) ; IOBASE TO C
INC C ; BUMP TO STATUS PORT
IN A,(C) ; READ IT
LD C,0 ; INIT RESULT
;
; SHUFFLE BITS
BIT 0,A ; 0: /ACK
JR Z,PPA_READSTATUS1
SET 6,C ; 6: /ACK
;
PPA_READSTATUS1:
;
BIT 1,A ; 1: BUSY
JR NZ,PPA_READSTATUS2 ; POLARITY CHANGE!
SET 7,C ; 7: /BUSY
;
PPA_READSTATUS2:
;
BIT 2,A ; 2: POUT
JR Z,PPA_READSTATUS3
SET 5,C ; 5: POUT
;
PPA_READSTATUS3:
;
BIT 3,A ; 3: SEL
JR Z,PPA_READSTATUS4
SET 4,C ; 4: SEL
;
PPA_READSTATUS4:
;
BIT 4,A ; 4: /ERR
JR Z,PPA_READSTATUS5
SET 3,C ; 3: /ERR
;
PPA_READSTATUS5:
LD A,C ; RESULT TO A
RET
;
;
;
PPA_DPULSE:
CALL PPA_WRITEDATA
LD A,$0C
CALL PPA_WRITECTRL
LD A,$0E
CALL PPA_WRITECTRL
LD A,$0C ;?
CALL PPA_WRITECTRL ;?
LD A,$04
CALL PPA_WRITECTRL
LD A,$0C
CALL PPA_WRITECTRL
RET
;
;
;
PPA_CPULSE:
CALL PPA_WRITEDATA
LD A,$04
CALL PPA_WRITECTRL
LD A,$06
CALL PPA_WRITECTRL
LD A,$04
CALL PPA_WRITECTRL
LD A,$0C
CALL PPA_WRITECTRL
RET
;
;
;
PPA_CONNECT:
LD A,$00
CALL PPA_CPULSE
LD A,$3C
CALL PPA_CPULSE
LD A,$20
CALL PPA_CPULSE
LD A,$8F
CALL PPA_CPULSE
RET
;
;
;
PPA_DISCONNECT:
LD A,$00
CALL PPA_DPULSE
LD A,$3C
CALL PPA_DPULSE
LD A,$20
CALL PPA_DPULSE
LD A,$0F
CALL PPA_DPULSE
RET
;
; SCSI SELECT PROCESS
;
;
PPA_SELECT:
LD A,1 << PPA_TGT
CALL PPA_WRITEDATA
LD A,$0E
CALL PPA_WRITECTRL
LD A,$0C
CALL PPA_WRITECTRL
LD A,1 << PPA_SELF
CALL PPA_WRITEDATA
LD A,$08
CALL PPA_WRITECTRL
;
LD HL,0 ; TIMEOUT COUNTER
;
PPA_SELECT1:
CALL PPA_READSTATUS
OR $F0
RET NZ
DEC HL
LD A,H
OR L
RET Z ; TIMEOUT
JR PPA_SELECT1
;
; SEND SCSI CMD BYTE STRING. AT ENTRY, HL POINTS TO START OF
; COMMAND BYTES. THE LENGTH OF THE COMMAND STRING MUST PRECEED
; THE COMMAND BYTES (HL - 1).
;
; NOTE THAT DATA IS SENT AS BYTE PAIRS! EACH LOOP SENDS 2 BYTES.
; DATA OUTPOUT IS BURSTED (NO CHECK FOR BUSY). SEEMS TO WORK FINE.
;
PPA_SENDCMD:
JP PPA_ERR ; NOW DO STANDARD ERR PROCESSING
;
; THIS IS THE MAIN SCSI ENGINE. BASICALLY, IT SELECTS THE DEVICE
; ON THE BUS, SENDS THE COMMAND, THEN PROCESSES THE RESULT.
;
; HL: COMMAND BUFFER
; DE: TRANSFER BUFFER
; BC: TRANSFER LENGTH (0=VARIABLE)
;
PPA_RUNCMD:
JP PPA_ERR ; NOW DO STANDARD ERR PROCESSING
;
; ERRORS SHOULD GENERALLY NOT CAUSE SCSI PROCESSING TO FAIL. IF A
; DEVICE ERROR (I.E., READ ERROR) OCCURS, THEN THE SCSI PROTOCOL WILL
; PROVIDE ERROR INFORMATION. THE STATUS RESULT OF THE SCSI COMMAND
; WILL INDICATE IF AN ERROR OCCURRED. ADDITIONALLY, IF THE ERROR IS
; A CHECK CONDITION ERROR, THEN IT IS MANDATORY TO ISSUE A SENSE
; REQUEST SCSI COMMAND TO CLEAR THE ERROR AND RETRIEVE DETAILED ERROR
; INFO.
;
PPA_CHKCMD:
; SCSI COMMAND COMPLETED, CHECK SCSI CMD STATUS
LD A,(PPA_CMDSTAT) ; GET STATUS BYTE
OR A ; SET FLAGS
RET Z ; IF ZERO, ALL GOOD, DONE
;
; DO WE HAVE A CHECK CONDITION?
CP 2 ; CHECK CONDITION RESULT?
JR Z,PPA_CHKCMD1 ; IF SO, REQUEST SENSE
JP PPA_IOERR ; ELSE, GENERAL I/O ERROR
;
PPA_CHKCMD1:
; USE REQUEST SENSE CMD TO GET ERROR DETAILS
LD DE,HB_WRKBUF ; PUT DATA IN WORK BUF
LD BC,0 ; VARIABLE LENGTH REQUEST
LD HL,PPA_CMD_SENSE ; REQUEST SENSE CMD
CALL PPA_RUNCMD ; DO IT
JP NZ,PPA_IOERR ; BAIL IF ERROR IN CMD
;
; REQ SENSE CMD COMPLETED
#IF (PPATRACE >= 3)
LD A,16
LD DE,HB_WRKBUF
CALL Z,PRTHEXBUF
#ENDIF
;
; CHECK SCSI CMD STATUS
LD A,(PPA_CMDSTAT) ; GET STATUS BYTE
OR A ; SET FLAGS
JP NZ,PPA_IOERR ; IF FAILED, GENERAL I/O ERROR
;
; RETURN RESULT BASED ON REQ SENSE DATA
; TODO: WE NEED TO CHECK THE SENSE KEY FIRST!!!
LD A,(HB_WRKBUF+12) ; GET ADDITIONAL SENSE CODE
CP $3A ; NO MEDIA?
JP Z,PPA_NOMEDIA ; IF SO, RETURN NO MEDIA ERR
JP PPA_IOERR ; ELSE GENERAL I/O ERR
;
; CHECK CURRENT DEVICE FOR ERROR STATUS AND ATTEMPT TO RECOVER
; VIA RESET IF DEVICE IS IN ERROR.
;
PPA_CHKERR:
LD A,(IY+PPA_STAT) ; GET STATUS
OR A ; SET FLAGS
CALL NZ,PPA_RESET ; IF ERROR STATUS, RESET BUS
RET
;
; (RE)INITIALIZE DEVICE
;
PPA_INITDEV:
; INITIALIZE 8255
LD A,(IY+PPA_IOBASE) ; BASE PORT
ADD A,PPA_IOSETUP ; BUMP TO SETUP PORT
LD C,A ; MOVE TO C FOR I/O
LD A,$82 ; CONFIG A OUT, B IN, C OUT
OUT (C),A ; DO IT
CALL DELAY ; SHORT DELAY FOR BUS SETTLE
;
;=============================================================================
; ERROR HANDLING AND DIAGNOSTICS
;=============================================================================
;
; ERROR HANDLERS
;
PPA_INVUNIT:
LD A,PPA_STINVUNIT
JR PPA_ERR2 ; SPECIAL CASE FOR INVALID UNIT
;
PPA_NOMEDIA:
LD A,PPA_STNOMEDIA
JR PPA_ERR
;
PPA_CMDERR:
LD A,PPA_STCMDERR
JR PPA_ERR
;
PPA_IOERR:
LD A,PPA_STIOERR
JR PPA_ERR
;
PPA_TO:
LD A,PPA_STTO
JR PPA_ERR
;
PPA_NOTSUP:
LD A,PPA_STNOTSUP
JR PPA_ERR
;
PPA_ERR:
LD (IY+PPA_STAT),A ; SAVE NEW STATUS
;
PPA_ERR2:
#IF (PPATRACE >= 2)
CALL PPA_PRTSTAT
#ENDIF
OR A ; SET FLAGS
RET
;
;
;
PPA_PRTERR:
RET Z ; DONE IF NO ERRORS
; FALL THRU TO PPA_PRTSTAT
;
; PRINT FULL DEVICE STATUS LINE
;
PPA_PRTSTAT:
PUSH AF
PUSH DE
PUSH HL
LD A,(IY+PPA_STAT)
CP PPA_STINVUNIT
JR Z,PPA_PRTSTAT2 ; INVALID UNIT IS SPECIAL CASE
CALL PPA_PRTPREFIX ; PRINT UNIT PREFIX
JR PPA_PRTSTAT3
PPA_PRTSTAT2:
CALL NEWLINE
PRTS("PPA:$") ; NO UNIT NUM IN PREFIX FOR INVALID UNIT
PPA_PRTSTAT3:
CALL PC_SPACE ; FORMATTING
CALL PPA_PRTSTATSTR
POP HL
POP DE
POP AF
RET
;
; PRINT STATUS STRING
;
PPA_PRTSTATSTR:
PUSH AF
PUSH DE
LD A,(IY+PPA_STAT)
OR A
LD DE,PPA_STR_STOK
JR Z,PPA_PRTSTATSTR1
INC A
LD DE,PPA_STR_STINVUNIT
JR Z,PPA_PRTSTATSTR1
INC A
LD DE,PPA_STR_STNOMEDIA
JR Z,PPA_PRTSTATSTR1
INC A
LD DE,PPA_STR_STCMDERR
JR Z,PPA_PRTSTATSTR1
INC A
LD DE,PPA_STR_STIOERR
JR Z,PPA_PRTSTATSTR1
INC A
LD DE,PPA_STR_STTO
JR Z,PPA_PRTSTATSTR1
INC A
LD DE,PPA_STR_STNOTSUP
JR Z,PPA_PRTSTATSTR1
LD DE,PPA_STR_STUNK
PPA_PRTSTATSTR1:
CALL WRITESTR
POP DE
POP AF
RET
;
; PRINT DIAGNONSTIC PREFIX
;
PPA_PRTPREFIX:
PUSH AF
CALL NEWLINE
PRTS("PPA$")
LD A,(IY+PPA_DEV) ; GET CURRENT DEVICE NUM
CP $FE ; NOT YET ASSIGNED?
JR Z,PPA_PRTPREFIX1 ; SKIP DEV NUM IF SO
CALL PRTDECB
PPA_PRTPREFIX1:
CALL PC_COLON
POP AF
RET
;
;=============================================================================
; STRING DATA
;=============================================================================
;
PPA_STR_STOK .TEXT "OK$"
PPA_STR_STINVUNIT .TEXT "INVALID UNIT$"
PPA_STR_STNOMEDIA .TEXT "NO MEDIA$"
PPA_STR_STCMDERR .TEXT "COMMAND ERROR$"
PPA_STR_STIOERR .TEXT "IO ERROR$"
PPA_STR_STTO .TEXT "TIMEOUT$"
PPA_STR_STNOTSUP .TEXT "NOT SUPPORTED$"
PPA_STR_STUNK .TEXT "UNKNOWN ERROR$"
;
PPA_STR_NOHW .TEXT "NOT PRESENT$"
;
PPA_STR_MODE_NONE .TEXT "NONE$"
PPA_STR_MODE_MG014 .TEXT "MG014$"
PPA_STR_MODE_UNK .TEXT "???$"
;
;=============================================================================
; DATA STORAGE
;=============================================================================
;
PPA_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT
PPA_CMDSTK .DW 0 ; STACK PTR FOR CMD ABORTING
PPA_DSKBUF .DW 0 ; WORKING DISK BUFFER POINTER
PPA_XFRLEN .DW 0 ; WORKING TRANSFER LENGTH
PPA_CMDSTAT .DB 0, 0 ; CMD RESULT STATUS
;
PPA_TYPE_MAP:
.DW PPA_STR_NONE
.DW PPA_STR_MG014
;
PPA_STR_NONE .DB "<NOT PRESENT>$"
PPA_STR_MG014 .DB "MG014$"
;
; SCSI COMMAND TEMPLATES (LENGTH PREFIXED)
;
.DB 6
PPA_CMD_RW .DB $00, $00, $00, $00, $01, $00 ; READ/WRITE SECTOR
.DB 6
PPA_CMD_SENSE .DB $03, $00, $00, $00, $FF, $00 ; REQUEST SENSE DATA
.DB 10
PPA_CMD_RDCAP .DB $25, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; READ CAPACITY
;
; PPA DEVICE CONFIGURATION TABLE
;
PPA_CFG:
;
#IF (PPACNT >= 1)
;
PPA0_CFG: ; DEVICE 0
.DB 0 ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY)
.DB PPA0MODE ; DRIVER DEVICE MODE
.DB 0 ; DEVICE STATUS
.DB PPA0BASE ; IO BASE ADDRESS
.DW 0,0 ; DEVICE CAPACITY
.DW 0,0 ; CURRENT LBA
#ENDIF
;
#IF (PPACNT >= 2)
;
PPA1_CFG: ; DEVICE 1
.DB 0 ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY)
.DB PPA1MODE ; DRIVER DEVICE MODE
.DB 0 ; DEVICE STATUS
.DB PPA1BASE ; IO BASE ADDRESS
.DW 0,0 ; DEVICE CAPACITY
.DW 0,0 ; CURRENT LBA
#ENDIF
;
#IF ($ - PPA_CFG) != (PPACNT * PPA_CFGSIZ)
.ECHO "*** INVALID PPA CONFIG TABLE ***\n"
#ENDIF
;
.DB $FF ; END MARKER

View File

@@ -4,7 +4,6 @@
;=============================================================================
;
; TODO:
; - FIX SCALER CONSTANT
; - GOPARTNER NEEDS TO HANDLE "NO PARTNER" CONDITION
;
; NOTES:
@@ -144,9 +143,13 @@ PPIDE_REG_DRVADR .EQU PPIDE_CTL_CS3 | $07 ; DRIVE ADDRESS REGISTER (R)
;
; COMMAND BYTES
;
PPIDE_CIDE_NOP .EQU $00
PPIDE_CIDE_DEVRES .EQU $08
PPIDE_CMD_RECAL .EQU $10
PPIDE_CMD_READ .EQU $20
PPIDE_CMD_WRITE .EQU $30
PPIDE_CIDE_DEVDIAG .EQU $90
PPIDE_CIDE_IDPKTDEV .EQU $A1
PPIDE_CMD_IDDEV .EQU $EC
PPIDE_CMD_SETFEAT .EQU $EF
;
@@ -171,6 +174,7 @@ PPIDE_STIOERR .EQU -4
PPIDE_STRDYTO .EQU -5
PPIDE_STDRQTO .EQU -6
PPIDE_STBSYTO .EQU -7
PPIDE_STNOTSUP .EQU -8
;
; DRIVE SELECTION BYTES (FOR USE IN DRIVE/HEAD REGISTER)
;
@@ -217,7 +221,7 @@ PPIDE_DEV0M: ; DEVICE 0, MASTER
.DW 0,0 ; DEVICE CAPACITY
.DW 0,0 ; CURRENT LBA
.DB PPIDE0BASE ; DATALO
.DB PPIDE0BASE+2 ; CTL
.DB PPIDE0BASE+2 ; CTL
.DB PPIDE0BASE+3 ; PPI
.DW PPIDE_DEV0S ; PARTNER
;
@@ -230,7 +234,7 @@ PPIDE_DEV0S: ; DEVICE 0, SLAVE
.DW 0,0 ; DEVICE CAPACITY
.DW 0,0 ; CURRENT LBA
.DB PPIDE0BASE ; DATALO
.DB PPIDE0BASE+2 ; CTL
.DB PPIDE0BASE+2 ; CTL
.DB PPIDE0BASE+3 ; PPI
.DW PPIDE_DEV0M ; PARTNER
;
@@ -247,7 +251,7 @@ PPIDE_DEV1M: ; DEVICE 1, MASTER
.DW 0,0 ; DEVICE CAPACITY
.DW 0,0 ; CURRENT LBA
.DB PPIDE1BASE ; DATALO
.DB PPIDE1BASE+2 ; CTL
.DB PPIDE1BASE+2 ; CTL
.DB PPIDE1BASE+3 ; PPI
.DW PPIDE_DEV1S ; PARTNER
;
@@ -260,7 +264,7 @@ PPIDE_DEV1S: ; DEVICE 1, SLAVE
.DW 0,0 ; DEVICE CAPACITY
.DW 0,0 ; CURRENT LBA
.DB PPIDE1BASE ; DATALO
.DB PPIDE1BASE+2 ; CTL
.DB PPIDE1BASE+2 ; CTL
.DB PPIDE1BASE+3 ; PPI
.DW PPIDE_DEV1M ; PARTNER
;
@@ -277,10 +281,10 @@ PPIDE_DEV2M: ; DEVICE 2, MASTER
.DW 0,0 ; DEVICE CAPACITY
.DW 0,0 ; CURRENT LBA
.DB PPIDE2BASE ; DATALO
.DB PPIDE2BASE+2 ; CTL
.DB PPIDE2BASE+2 ; CTL
.DB PPIDE2BASE+3 ; PPI
.DW PPIDE_DEV2S ; PARTNER
;
;
PPIDE_DEV2S: ; DEVICE 2, SLAVE
.DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY)
.DB 0 ; DEVICE STATUS
@@ -290,7 +294,7 @@ PPIDE_DEV2S: ; DEVICE 2, SLAVE
.DW 0,0 ; DEVICE CAPACITY
.DW 0,0 ; CURRENT LBA
.DB PPIDE2BASE ; DATALO
.DB PPIDE2BASE+2 ; CTL
.DB PPIDE2BASE+2 ; CTL
.DB PPIDE2BASE+3 ; PPI
.DW PPIDE_DEV2M ; PARTNER
;
@@ -302,17 +306,17 @@ PPIDE_DEV2S: ; DEVICE 2, SLAVE
;
.DB $FF ; END OF TABLE MARKER
;
; THE IDE_WAITXXX FUNCTIONS ARE BUILT TO TIMEOUT AS NEEDED SO DRIVER WILL
; THE PPIDE_WAITXXX FUNCTIONS ARE BUILT TO TIMEOUT AS NEEDED SO DRIVER WILL
; NOT HANG IF DEVICE IS UNRESPONSIVE. DIFFERENT TIMEOUTS ARE USED DEPENDING
; ON THE SITUATION. GENERALLY, THE FAST TIMEOUT IS USED TO PROBE FOR DEVICES
; USING FUNCTIONS THAT PERFORM NO I/O. OTHERWISE THE NORMAL TIMEOUT IS USED.
; IDE SPEC ALLOWS FOR UP TO 30 SECS MAX TO RESPOND. IN PRACTICE, THIS IS WAY
; TOO LONG, BUT IF YOU ARE USING A VERY OLD DEVICE, THESE TIMEOUTS MAY NEED TO
; BE ADJUSTED. NOTE THAT THESE ARE BYTE VALUES, SO YOU CANNOT EXCEED 255.
; THE TIMEOUTS ARE IN UNITS OF .05 SECONDS.
; ON THE SITUATION. THE SLOW TIMEOUT IS USED TO WAIT FOR A DEVICE TO
; BECOME READY AFTER A HARD RESET (SPIN UP, ETC.). THE NORMAL TIMEOUT
; IS USED DURING NORMAL OPERATION FOR ALL I/O OPERATIONS WHICH SHOULD
; OCCUR PRETTY FAST. NOTE THAT THE ATA SPEC ALLOWS UP TO 30 SECONDS
; FOR DEVICES TO RESPOND. WE ARE USING MUCH MORE AGGRESSIVE VALUES
; BASED ON REAL WORLD EXPERIENCE.
;
PPIDE_TONORM .EQU 200 ; NORMAL TIMEOUT IS 10 SECS
PPIDE_TOFAST .EQU 10 ; FAST TIMEOUT IS 0.5 SECS
PPIDE_TOSLOW .EQU 200 ; SLOW TIMEOUT IS 20 SECS
PPIDE_TONORM .EQU 5 ; NORMAL TIMEOUT IS 0.5 SECS
;
;=============================================================================
; INITIALIZATION ENTRY POINT
@@ -320,9 +324,12 @@ PPIDE_TOFAST .EQU 10 ; FAST TIMEOUT IS 0.5 SECS
;
PPIDE_INIT:
; COMPUTE CPU SPEED COMPENSATED TIMEOUT SCALER
; AT 1MHZ, THE SCALER IS 218 (50000US / 229TS = 218)
; SCALER IS THEREFORE 218 * CPU SPEED IN MHZ
LD DE,218 ; LOAD SCALER FOR 1MHZ
; ONE INTERNAL LOOP IN WAITBSY IS 263TS. ON A 1 MHZ CPU, 1 TS
; TAKES 1NS. SO 1/10 SECOND IS 100000 TS ON A 1 MHZ CPU.
; SINCE 1 INTERNAL LOOP IS 263 TS, IT TAKES 100000 / 263 = 356
; INTERNAL LOOPS FOR 1/10 SECOND. SO, WE WANT TO USE
; 356 * CPU MHZ FOR INTERNAL LOOP COUNT.
LD DE,380 ; LOAD SCALER FOR 1MHZ
LD A,(CB_CPUMHZ) ; LOAD CPU SPEED IN MHZ
CALL MULT8X16 ; HL := DE * A
LD (PPIDE_TOSCALER),HL ; SAVE IT
@@ -355,7 +362,7 @@ PPIDE_INIT2:
LD DE,PPIDE_STR_NOPPI ; NO PPI MESSAGE
CALL WRITESTR ; DISPLAY IT
JR PPIDE_INIT4 ; SKIP CFG ENTRY
;
;
PPIDE_INIT3:
CALL PPIDE_RESET ; RESET THE BUS
CALL PPIDE_INIT5 ; DETECT/INIT MASTER
@@ -363,7 +370,7 @@ PPIDE_INIT3:
CALL PPIDE_GOPARTNER ; SWITCH IY TO PARTNER CFG
CALL PPIDE_INIT5 ; DETECT/INIT SLAVE
POP IY ; RESTORE CFG PTR
;
;
PPIDE_INIT4:
LD DE,PPIDE_CFGSIZ ; SIZE OF CFG TABLE ENTRY
ADD IY,DE ; BUMP POINTER
@@ -381,13 +388,28 @@ PPIDE_INIT5:
PUSH IY ; CFG ENTRY POINTER
POP DE ; COPY TO DE
CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE
;
; START PRINTING DEVICE INFO
CALL PPIDE_PRTPREFIX ; PRINT DEVICE PREFIX
LD A,(IY+PPIDE_TYPE)
LD DE,PPIDE_STR_TYPEATA
CP PPIDE_TYPEATA
CALL Z,WRITESTR
LD DE,PPIDE_STR_TYPEATAPI
CP PPIDE_TYPEATAPI
CALL Z,WRITESTR
;
; CHECK FOR BAD STATUS
LD A,(IY+PPIDE_STAT) ; GET STATUS
OR A ; SET FLAGS
JP NZ,PPIDE_PRTSTAT ; EXIT VIA PRINT STATUS
JP Z,PPIDE_INIT6
CALL PC_SPACE
JP NZ,PPIDE_PRTSTATSTR ; EXIT VIA PRINT STATUS STRING
;
CALL PPIDE_PRTPREFIX ; PRINT DEVICE PREFIX
PPIDE_INIT6:
LD A,(IY+PPIDE_TYPE) ; GET DEVICE TYPE
CP PPIDE_TYPEATA ; ATA?
RET NZ ; IF NOT, THEN DONE
;
LD DE,PPIDE_STR_8BIT
BIT 1,(IY+PPIDE_ACC) ; 8 BIT ACCESS?
@@ -426,9 +448,9 @@ PPIDE_INIT5:
PPIDE_DETECT:
;
; TEST FOR PPI EXISTENCE
; WE SETUP THE PPI TO WRITE, THEN WRITE A VALUE OF ZERO
; WE SETUP THE PPI TO WRITE, THEN WRITE A VALUE OF $A5
; TO PORT A (DATALO), THEN READ IT BACK. IF THE PPI IS THERE
; THEN THE BUS HOLD CIRCUITRY WILL READ BACK THE ZERO. SINCE
; THEN THE BUS HOLD CIRCUITRY WILL READ BACK THE $A5. SINCE
; WE ARE IN WRITE MODE, AN IDE CONTROLLER WILL NOT BE ABLE TO
; INTERFERE WITH THE VALUE BEING READ.
;
@@ -437,14 +459,14 @@ PPIDE_DETECT:
OUT (C),A ; WRITE IT
;
LD C,(IY+PPIDE_DATALO) ; PPI PORT A, DATALO
XOR A ; VALUE ZERO
LD A,$A5 ; TEST VALUE
OUT (C),A ; PUSH VALUE TO PORT
IN A,(C) ; GET PORT VALUE
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
OR A ; SET FLAGS
CP $A5 ; CHECK FOR TEST VALUE
RET ; AND RETURN
;
;=============================================================================
@@ -564,26 +586,12 @@ PPIDE_DEVICE1:
PPIDE_MEDIA:
LD A,E ; GET FLAGS
OR A ; SET FLAGS
JR Z,PPIDE_MEDIA2 ; JUST REPORT CURRENT STATUS AND MEDIA
JR Z,PPIDE_MEDIA1 ; JUST REPORT CURRENT STATUS AND MEDIA
;
; GET CURRENT STATUS
LD A,(IY+PPIDE_STAT) ; GET STATUS
OR A ; SET FLAGS
JR NZ,PPIDE_MEDIA1 ; ERROR ACTIVE, GO RIGHT TO RESET
;
; USE IDENTIFY COMMAND TO CHECK DEVICE
LD HL,PPIDE_TIMEOUT ; POINT TO TIMEOUT
LD (HL),PPIDE_TOFAST ; USE FAST TIMEOUT DURING IDENTIFY COMMAND
CALL PPIDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT
CALL PPIDE_IDENTIFY ; EXECUTE IDENTIFY COMMAND
LD HL,PPIDE_TIMEOUT ; POINT TO TIMEOUT
LD (HL),PPIDE_TONORM ; BACK TO NORMAL TIMEOUT
JR Z,PPIDE_MEDIA2 ; IF SUCCESS, BYPASS RESET
;CALL PPIDE_RESET ; RESET IDE INTERFACE
CALL PPIDE_INITUNIT ; RE-INITIALIZE UNIT
;
PPIDE_MEDIA1:
CALL PPIDE_RESET ; RESET IDE INTERFACE
;
PPIDE_MEDIA2:
LD A,(IY+PPIDE_STAT) ; GET STATUS
OR A ; SET FLAGS
LD D,0 ; NO MEDIA CHANGE DETECTED
@@ -666,6 +674,32 @@ PPIDE_SETFEAT:
;
;
;
PPIDE_NOP:
#IF (PPIDETRACE >= 3)
CALL PPIDE_PRTPREFIX
PRTS(" NOP$")
#ENDIF
LD A,(PPIDE_DRVHD)
;OUT (PPIDE_IO_DRVHD),A
CALL PPIDE_OUT
.DB PPIDE_REG_DRVHD
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
;
; EXECUTE THE NOP COMMAND, BUT DON'T WAIT FOR DRDY, JUST
; MAKE SURE BUSY IS CLEAR. THIS COMMAND IS USED DURING
; DEVICE DETECTION/INITIALIZATION AND ATAPI DEVICES WILL
; NOT ASSERT DRDY AFTER RESET.
LD A,PPIDE_CIDE_NOP ; CMD = NOP
LD (PPIDE_CMD),A ; SAVE IT
CALL PPIDE_WAITBSY
RET NZ
JP PPIDE_RUNCMD1 ; RUN COMMAND AND EXIT
;
;
;
PPIDE_IDENTIFY:
#IF (PPIDETRACE >= 3)
CALL PPIDE_PRTPREFIX
@@ -683,6 +717,35 @@ PPIDE_IDENTIFY:
LD (PPIDE_CMD),A
CALL PPIDE_RUNCMD
RET NZ
;
LD HL,HB_WRKBUF
JP PPIDE_GETBUF ; EXIT THRU BUFRD
;
;
;
PPIDE_IDENTIFYPACKET:
#IF (PPIDETRACE >= 3)
CALL PPIDE_PRTPREFIX
PRTS(" IDPKTDEV$")
#ENDIF
LD A,(PPIDE_DRVHD)
;OUT (PPIDE_IO_DRVHD),A
CALL PPIDE_OUT
.DB PPIDE_REG_DRVHD
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
LD A,PPIDE_CIDE_IDPKTDEV
LD (PPIDE_CMD),A
CALL PPIDE_RUNCMD
RET NZ
;
CALL PPIDE_IN
.DB PPIDE_REG_STAT
BIT 6,A ; IS DRQ SET?
JP Z,PPIDE_NOMEDIA
;
LD HL,HB_WRKBUF
JP PPIDE_GETBUF ; EXIT THRU BUFRD
;
@@ -777,10 +840,6 @@ PPIDE_SETADDR:
#ENDIF
CALL PPIDE_OUT
.DB PPIDE_REG_COUNT
;
;;#IF (DSKYENABLE)
;; CALL PPIDE_DSKY
;;#ENDIF
;
RET
;
@@ -792,6 +851,7 @@ PPIDE_RUNCMD:
CALL PPIDE_WAITRDY ; WAIT FOR DRIVE READY
RET NZ ; BAIL OUT ON TIMEOUT
;
PPIDE_RUNCMD1:
LD A,(PPIDE_CMD) ; GET THE COMMAND
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
@@ -982,7 +1042,7 @@ PPIDE_GETRES:
; HARDWARE INTERFACE ROUTINES
;=============================================================================
;
; SOFT RESET OF ALL DEVICES ON BUS
; RESET ALL DEVICES ON BUS
;
PPIDE_RESET:
#IF (PPIDETRACE >= 3)
@@ -990,26 +1050,10 @@ PPIDE_RESET:
PRTS(" RESET$")
#ENDIF
;
; OLDER CF CARDS DO NOT SEEM TO SET THE
; REGISTERS ON RESET, SO HERE WE FAKE THINGS BY
; SETTING THEM AS A RESET WOULD
#IF (PPIDETRACE >= 3)
PRTS(" FAKE$")
#ENDIF
XOR A
;OUT (IDE_IO_CYLLO),A
CALL PPIDE_OUT
.DB PPIDE_REG_CYLLO
;OUT (IDE_IO_CYLHI),A
CALL PPIDE_OUT
.DB PPIDE_REG_CYLHI
INC A
;OUT (IDE_IO_COUNT),A
CALL PPIDE_OUT
.DB PPIDE_REG_COUNT
;OUT (IDE_IO_SECT),A
CALL PPIDE_OUT
.DB PPIDE_REG_SECT
; HARD RESET
;
; RESET LINE IS NORMALLY PULSED AT POWER ON. HOWEVER, THIS IS NOT
; DONE FOR PPIDE DEVICES, SO WE DO IT NOW.
;
; SETUP PPI TO READ
LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ
@@ -1034,18 +1078,21 @@ PPIDE_RESET:
#ENDIF
;
; PULSE IDE RESET LINE
#IF (PPIDETRACE >= 3)
PRTS(" HARD$")
#ENDIF
LD A,PPIDE_CTL_RESET
;OUT (PPIDE_IO_CTL),A
LD C,(IY+PPIDE_CTL) ; SET IDE ADDRESS
OUT (C),A
LD DE,20
LD DE,20 ; DELAY 320US (SPEC IS >= 25US)
CALL VDELAY
XOR A
;OUT (PPIDE_IO_CTL),A
OUT (C),A
LD DE,20
CALL VDELAY
;
;
#IF (DSKYENABLE)
#IF (DSKYMODE == DSKYMODE_NG)
; REININT DSKY AND RESTORE CONTENTS
@@ -1057,24 +1104,55 @@ PPIDE_RESET:
#ENDIF
#ENDIF
;
LD A,%00001010 ; SET ~IEN, NO INTERRUPTS
; SOME CF CARDS AND CF CARD EMULATORS NEED A LITTLE TIME TO
; "BOOT" THEIR INTERNAL ELECTRONICS, SO THEY CANNOT ASSERT BUSY
; IMMEDIATELY. A SMALL WAIT IS PERFORMED HERE TO GIVE SUCH DEVICES
; A BETTER CHANCE TO SUCCEED LATER.
;
;;; CALL LDELAY ; DELAY FOR SLAVE INIT
LD DE,150000 / 16 ;
CALL VDELAY ; SMALL DELAY
;
JR PPIDE_RESET3 ; SKIP SOFT RESET
;
; SOFT RESET
;
; RC CANNOT ACCESS DEVICE CONTROL REG, SO SKIP THIS
;
PPIDE_RESET2:
; INITIATE SOFT RESET
#IF (IDETRACE >= 3)
PRTS(" SOFT$")
#ENDIF
LD A,%00001110 ; ASSERT RESET, NO INTERRUPTS
;OUT (PPIDE_IO_CTRL),A
CALL PPIDE_OUT
.DB PPIDE_REG_CTRL
LD DE,20 ; DELAY 320US (SPEC IS >= 25US)
CALL VDELAY
;
PPIDE_RESET3:
;
; CONFIGURE OPERATION AND END SOFT RESET
;
#IF (PPIDETRACE >= 3)
PRTS(" CONFIG$")
#ENDIF
LD A,%00001010 ; DEASSERT RESET, NO INTERRUPTS
;OUT (PPIDE_REG_CTRL),A
CALL PPIDE_OUT
.DB PPIDE_REG_CTRL
;
; SPEC ALLOWS UP TO 450MS FOR DEVICES TO ASSERT THEIR PRESENCE
; VIA -DASP. I ENCOUNTER PROBLEMS LATER ON IF I DON'T WAIT HERE
; FOR THAT TO OCCUR. THUS FAR, IT APPEARS THAT 150MS IS SUFFICIENT
; FOR ANY DEVICE ENCOUNTERED. MAY NEED TO EXTEND BACK TO 500MS
; IF A SLOWER DEVICE IS ENCOUNTERED.
;
;LD DE,500000/16 ; ~500MS
LD DE,150000/16 ; ~???MS
LD DE,20 ; DELAY 320US (SPEC IS >= 25US)
CALL VDELAY
;
PPIDE_RESET5:
LD HL,PPIDE_TONORM ; NORMAL TIMEOUT NOW
LD (PPIDE_TIMEOUT),HL ; AND RESTORE IT
;
; INITIALIZE THE INDIVIDUAL UNITS (MASTER AND SLAVE).
; BASED ON TESTING, IT APPEARS THAT THE MASTER UNIT MUST
; BE DONE FIRST OR THIS BEHAVES BADLY.
;
PUSH IY ; SAVE CFG PTR
BIT 0,(IY+PPIDE_ACC) ; MASTER?
CALL Z,PPIDE_GOPARTNER ; IF NOT, SWITCH TO MASTER
@@ -1082,7 +1160,7 @@ PPIDE_RESET:
CALL PPIDE_GOPARTNER ; POINT TO SLAVE
CALL PPIDE_INITUNIT ; INIT PARTNER UNIT
POP IY ; RECOVER ORIG CFG PTR
;
;
XOR A ; SIGNAL SUCCESS
RET ; AND DONE
;
@@ -1092,14 +1170,10 @@ PPIDE_INITUNIT:
CALL PPIDE_SELUNIT ; SELECT UNIT
RET NZ ; ABORT IF ERROR
LD HL,PPIDE_TIMEOUT ; POINT TO TIMEOUT
LD (HL),PPIDE_TONORM ; SET NORMAL TIMEOUT
CALL PPIDE_PROBE ; DO PROBE
RET NZ ; JUST RETURN IF NOTHING THERE
CALL PPIDE_INITDEV ; IF FOUND, ATTEMPT TO INIT DEVICE
RET ; DONE
JP PPIDE_INITDEV ; EXIT VIA INITDEV
;
; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT
;
@@ -1111,10 +1185,16 @@ PPIDE_SELUNIT:
BIT 0,(IY+PPIDE_ACC) ; MASTER?
JR Z,PPIDE_SELUNIT1 ; HANDLE SLAVE
LD A,PPIDE_DRVMASTER ; MASTER
JR PPIDE_SELUNIT2
PPIDE_SELUNIT1:
#IF (PPIDETRACE >= 3)
PRTS(" MASTER$")
#ENDIF
JR PPIDE_SELUNIT2
PPIDE_SELUNIT1:
LD A,PPIDE_DRVSLAVE ; SLAVE
PPIDE_SELUNIT2:
#IF (PPIDETRACE >= 3)
PRTS(" SLAVE$")
#ENDIF
PPIDE_SELUNIT2:
LD (PPIDE_DRVHD),A ; SAVE IT
XOR A ; SUCCESS
RET
@@ -1122,10 +1202,25 @@ PPIDE_SELUNIT2:
;
;
PPIDE_PROBE:
;
; PROBE FOR A DRIVE ON THE INTERFACE (EITHER MASTER OR SLAVE).
; IDEALLY, THIS IS BEING CALLED IMMEDIATELY AFTER A HARD OR SOFT
; INTERFACE RESET. HOWEVER, THERE ARE SOME HARDWARE IMPLEMENTATTIONS
; WHICH ARE CAPABLE OF NEITHER A HARD NOR SOFT RESET. SO THIS
; CODE SHOULD TRY TO HANDLE THE SCENARIO WHERE NO INTERFACE RESET
; HAS OCCURRED.
;
#IF (PPIDETRACE >= 3)
CALL PPIDE_PRTPREFIX
PRTS(" PROBE$") ; LABEL FOR IO ADDRESS
#ENDIF
;
#IF (PPIDETRACE >= 3)
CALL PPIDE_IN
.DB PPIDE_REG_STAT
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
;
; SELECT DEVICE (MASTER/SLAVE)
LD A,(PPIDE_DRVHD)
@@ -1136,20 +1231,60 @@ PPIDE_PROBE:
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
;
CALL DELAY ; DELAY ~16US
;
; IF WE GET HERE AND THE DRIVE IS STILL INITIALIZING, WE NEED TO
; WAIT UNTIL THE DRIVE IS READY. IN THIS CASE BUSY *WILL* BE HIGH.
; BASED ON TESTING, DRDY AND DSC VALUES VARY. EVERYTHING ELSE SEEMS
; TO BE ZERO. SO, WE FILTER OUT DRDY & DSC, THEN LOOK FOR BUSY=1
; AND ALL ELSE ZERO. THIS GENERALLY AVOIDS VALUES THAT ARE TYPICAL
; FOR FLOATING PORTS AND SO CAN BE USED TO DETERMINE IF WE NEED TO
; WAIT FOR THE DEVICE TO BE READY. THIS WAIT IS MANDATORY BECAUSE
; SOME (IF NOT ALL) DEVICES WILL NOT PERSIST REGISTER VALUES UNTIL
; THE DRIVE IS READY.
;
CALL PPIDE_IN
.DB PPIDE_REG_STAT
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
;
AND %10101111 ; FILTER OUT DRDY & DSC
CP $80 ; INIT IN PROGRESS?
JR NZ,PPIDE_PROBE1 ; IF NOT, SKIP AHEAD
;
#IF (PPIDETRACE >= 3)
PRTS(" WAIT$")
#ENDIF
;
LD HL,(PPIDE_TIMEOUT) ; GET CURRENT TIMEOUT
PUSH HL ; SAVE IT
LD HL,PPIDE_TOSLOW ; SLOW TIMEOUT FOR THIS
LD (PPIDE_TIMEOUT),HL ; SET IT
CALL PPIDE_WAITBSY ; WAIT FOR BUSY TO CLEAR
POP HL ; RECOVER TIMEOUT
LD (PPIDE_TIMEOUT),HL ; SET IT
;
#IF (PPIDETRACE >= 3)
CALL PPIDE_IN
.DB PPIDE_REG_STAT
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
;
; TEST FOR PRESENCE OF IDE REGISTERS. USE LBA0/1 TO SEE
; IF VALUE CAN BE PERSISTED. THE USE OF BOTH LBA0 AND LBA1
; IS TO MAINTAIN CONSISTENCY WITH TGHE THE PPIDE DRIVER BECAUSE
; PPI ITSELF WILL PERSIST THE LAST VALUE WRITTEN, SO WE USE
; MULTIPLE REGISTERS TO WORK AROUND THIS FALSE POSITIVE.
;
PPIDE_PROBE1:
; $AA -> LBA0
LD A,$AA
CALL PPIDE_OUT
.DB PPIDE_REG_LBA0
;
;
; $55 => LBA1
LD A,$55
CALL PPIDE_OUT
@@ -1179,42 +1314,34 @@ PPIDE_PROBE:
CALL PPIDE_REGDUMP
#ENDIF
;
;JR PPIDE_PROBE1 ; *DEBUG*
;
PPIDE_PROBE0:
CALL PPIDE_WAITBSY ; WAIT FOR BUSY TO CLEAR
JP NZ,PPIDE_NOMEDIA ; CONVERT TIMEOUT TO NO MEDIA AND RETURN
;
#IF (PPIDETRACE >= 3)
CALL PPIDE_REGDUMP
#ENDIF
;
; CHECK STATUS
; IN A,(PPIDE_REG_STAT) ; GET STATUS
CALL PPIDE_IN
.DB PPIDE_REG_STAT
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE ; IF DEBUG, PRINT STATUS
#ENDIF
OR A ; SET FLAGS TO TEST FOR ZERO
JP Z,PPIDE_NOMEDIA ; CONTINUE IF NON-ZERO
;
PPIDE_PROBE1:
; ASSUME ATA DEVICE FOR NOW, RECORD TYPE AND RETURN SUCCESS
LD A,PPIDE_TYPEATA ; TYPE = ATA
LD (IY+PPIDE_TYPE),A ; SET IT IN INSTANCE DATA
XOR A ; SIGNAL SUCCESS
RET ; DONE, NOTE THAT A=0 AND Z IS SET
XOR A
RET
;
; (RE)INITIALIZE DEVICE
;
PPIDE_INITDEV:
;
LD A,(IY+PPIDE_TYPE) ; GET THE DEVICE TYPE
OR A ; SET FLAGS
JP Z,PPIDE_NOMEDIA ; EXIT SETTING NO MEDIA STATUS
#IF (PPIDETRACE >= 3)
CALL PPIDE_PRTPREFIX
PRTS(" INITDEV$") ; LABEL FOR IO ADDRESS
#ENDIF
;
; IF THE IDE STATUS BYTE IS $00, WE HAVE EITHER A NON-PRESENT SLAVE
; OR AN ATAPI DEVICE. TO DIFFERENTIATE THESE POSSIBILITIES, WE RUN
; A NOP COMMAND. IF WE HAVE AN ATAPI DEVICE, THIS WILL CAUSE THE
; STATUS BYTE TO BE "NORMAL" (NON-ZERO). IF THE STATUS IS STILL
; ZERO, WE ABORT WITH A NO MEDIA STATUS. NOTE THAT THE NOP COMMAND
; RETURNS A COMMAND ERROR BY DESIGN. WE JUST IGNORE THE ERROR.
;
CALL PPIDE_NOP
CALL PPIDE_IN
.DB PPIDE_REG_STAT
OR A
JP Z,PPIDE_NOMEDIA
;
; WE NEED TO SETUP 8-BIT MODE BEFORE DOING ANYTHING ELSE
;
PPIDE_INITDEV0A:
BIT 1,(IY+PPIDE_ACC) ; 8 BIT ACCESS?
JR Z,PPIDE_INITDEV0 ; NO, DO 16 BIT INIT
LD A,PPIDE_FEAT_ENABLE8BIT ; FEATURE VALUE = ENABLE 8-BIT PIO
@@ -1232,10 +1359,14 @@ PPIDE_INITDEV0:
PPIDE_INITDEV00:
;
CALL PPIDE_IDENTIFY ; EXECUTE PPIDENTIFY COMMAND
RET NZ ; BAIL OUT ON ERROR
JR NZ,PPIDE_INITDEVP ; ON ERROR, TRY PACKET DEVICE
;
; DECLARE WE ARE ATA
LD A,PPIDE_TYPEATA ; OTHERWISE TYPE=ATA
LD (IY+PPIDE_TYPE),A ; SET IT IN INSTANCE DATA
;
LD DE,HB_WRKBUF ; POINT TO BUFFER
#IF (PPIDETRACE >= 3)
#IF (PPIDETRACE >= 4)
CALL DUMP_BUFFER ; DUMP IT IF DEBUGGING
#ENDIF
;
@@ -1255,38 +1386,15 @@ PPIDE_INITDEV00:
CALL PRTHEXWORD
#ENDIF
;
; SEE PAGE 114 OF CF+ & CF SPECIFICATION REV. 3.0 FOR CF CARD
; SIGNATURE VALUES. ALL OF THE BELOW ARE DOCUMENTED THERE EXCEPT
; $045A WHICH IS A VALUE DISCOVERED ON A CF<->SD CARD ADAPTER.
;
; SIGNATURE $045A IS NOT LISTED IN THE CF SPEC. IT WAS ADDED BECAUSE
; IT WAS SEEN IN THE WILD ON A CF-SD ADAPTER. HOWEVER IT HAS NOW
; ALSO BEEN SEEN ON A SPINNING HARD DISK. SINCE IT IS AMBIGUOUS, I
; WILL CONSIDER IT TO BE A HARD DISK.
;
LD BC,$848A ; STANDARD CF CARD SIGNATURE %1000 1111 1000 1010
CALL PPIDE_INITDEV000 ; TEST & SET
LD BC,$044A ; ALT SIG FOR CF NON-REMOVABLE %0000 0100 0100 1010
CALL PPIDE_INITDEV000 ; TEST & SET
;LD BC,$045A ; ?ALT SIG FOR CF NON-REMOVABLE %0000 0100 0101 1010
;CALL PPIDE_INITDEV000 ; TEST & SET
LD BC,$0040 ; ALT SIG FOR CF NON-REMOVABLE %0000 0000 0100 0000
CALL PPIDE_INITDEV000 ; TEST & SET
JR PPIDE_INITDEV1 ; CONTINUE INIT
;
PPIDE_INITDEV000:
; CHECK IF FIRST WORD OF IDENTIFY DATA MATCHES VALUE IN BC
; AND SET CF FLAG IF SO
LD HL,(HB_WRKBUF) ; FIRST WORD OF IDENTIFY DATA
OR A ; CLEAR CARRY
SBC HL,BC ; COMPARE
RET NZ ; ABORT IF NOT EQUAL
; DETERMINE IF COMPACTFLASH MEDIA
LD A,(HB_WRKBUF+(83*2)) ; LOW BYTE OF WORD 83
BIT 2,A ; TEST CFA FEATURE SET BIT
JR Z,PPIDE_INITDEV1 ; IF NOT, SKIP
SET 0,(IY+PPIDE_MED) ; ELSE SET FLAGS BIT FOR CF MEDIA
RET ; AND RETURN
;
PPIDE_INITDEV1:
; DETERMINE IF LBA CAPABLE
LD A,(HB_WRKBUF+98+1) ; GET BYTE WITH LBA BIT FROM BUFFER
LD A,(HB_WRKBUF+98+1) ; HIGH BYTE OF WORD 49
BIT 1,A ; CHECK THE LBA BIT
JR Z,PPIDE_INITDEV2 ; NOT SET, BYPASS
SET 1,(IY+PPIDE_MED) ; SET FLAGS BIT FOR LBA
@@ -1303,12 +1411,39 @@ PPIDE_INITDEV2:
POP BC ; RECOVER POINTER TO CAPACITY ENTRY
CALL ST32 ; SAVE CAPACITY
;
; RESET CARD STATUS TO 0 (OK)
; RECORD STATUS OK
XOR A ; A := 0 (STATUS = OK)
LD (IY+PPIDE_STAT),A ; SAVE IT
;
RET ; RETURN, A=0, Z SET
;
;
;
PPIDE_INITDEVP:
CALL PPIDE_IDENTIFYPACKET ; EXECUTE IDENTIFY COMMAND
RET NZ ; BAIL OUT ON ERROR
;
; DECLARE WE ARE ATAPI
LD A,PPIDE_TYPEATAPI ; OTHERWISE TYPE=ATAPI
LD (IY+PPIDE_TYPE),A ; SET IT IN INSTANCE DATA
;
LD DE,HB_WRKBUF ; POINT TO BUFFER
#IF (PPIDETRACE >= 4)
CALL DUMP_BUFFER ; DUMP IT IF DEBUGGING
#ENDIF
;
LD (IY+PPIDE_MED),0 ; CLEAR FLAGS
;
; DONE FOR NOW, ATAPI NOT INPLEMENTED
;
; RETURN NOT SUPPORTED STATUS
JP PPIDE_NOTSUP ; NOT SUPPORTED
;
; ; RECORD STATUS OK
; XOR A ; A := 0 (STATUS = OK)
; LD (IY+PPIDE_STAT),A ; SAVE IT
; RET
;
; SWITCH IY POINTER FROM CURRENT UNIT CFG TO PARTNER UNIT CFG
;
PPIDE_GOPARTNER:
@@ -1332,7 +1467,7 @@ PPIDE_CHKERR:
;
;
PPIDE_WAITRDY:
LD A,(PPIDE_TIMEOUT) ; GET TIMEOUT IN 0.05 SECS
LD A,(PPIDE_TIMEOUT) ; GET TIMEOUT IN 0.1 SECS
LD B,A ; PUT IN OUTER LOOP VAR
PPIDE_WAITRDY1:
LD DE,(PPIDE_TOSCALER) ; CPU SPEED SCALER TO INNER LOOP VAR
@@ -1354,7 +1489,7 @@ PPIDE_WAITRDY2:
;
;
PPIDE_WAITDRQ:
LD A,(PPIDE_TIMEOUT) ; GET TIMEOUT IN 0.05 SECS
LD A,(PPIDE_TIMEOUT) ; GET TIMEOUT IN 0.1 SECS
LD B,A ; PUT IN OUTER LOOP VAR
PPIDE_WAITDRQ1:
LD DE,(PPIDE_TOSCALER) ; CPU SPEED SCALER TO INNER LOOP VAR
@@ -1376,14 +1511,14 @@ PPIDE_WAITDRQ2:
;
;
PPIDE_WAITBSY:
LD A,(PPIDE_TIMEOUT) ; GET TIMEOUT IN 0.05 SECS
LD A,(PPIDE_TIMEOUT) ; GET TIMEOUT IN 0.1 SECS
LD B,A ; PUT IN OUTER LOOP VAR
PPIDE_WAITBSY1:
LD DE,(PPIDE_TOSCALER) ; CPU SPEED SCALER TO INNER LOOP VAR
PPIDE_WAITBSY2:
;IN A,(PPIDE_REG_STAT) ; READ STATUS
CALL PPIDE_IN ; 17TS + 170TS
.DB PPIDE_REG_STAT ; 0TS
CALL PPIDE_IN ; 17TS + 204TS
.DB PPIDE_REG_STAT
LD C,A ; SAVE IT ; 4TS
AND %10000000 ; TO FILL (OR READY TO FILL) ; 7TS
RET Z ; 5TS
@@ -1392,32 +1527,32 @@ PPIDE_WAITBSY2:
OR E ; 4TS
JR NZ,PPIDE_WAITBSY2 ; 12TS
DJNZ PPIDE_WAITBSY1 ; -----
JP PPIDE_BSYTO ; EXIT WITH BSYTO ERR ; 229TS
JP PPIDE_BSYTO ; EXIT WITH BSYTO ERR ; 263TS
;
; READ A VALUE FROM THE DEVICE POINTED TO BY IY AND RETURN IT IN A
;
;
PPIDE_IN:
EX (SP),HL ; GET PARM POINTER ; 19TS
PUSH BC ; SAVE INCOMING BC ; 11TS
LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ ; 7TS
;OUT (PPIDE_IO_PPI),A ; DO IT ; 11TS
LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD
OUT (C),A ; WRITE IT
;OUT (PPIDE_IO_PPI),A ; DO IT
LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD ; 19TS
OUT (C),A ; WRITE IT ; 12TS
;
LD B,(HL) ; GET CTL PORT VALUE ; 7TS
;LD C,PPIDE_IO_CTL ; SETUP PORT TO WRITE ; 7TS
;LD C,PPIDE_IO_CTL ; SETUP PORT TO WRITE
;LD C,(IY+PPIDE_CTL) ; SET IDE ADDRESS
DEC C ; SET IDE ADDRESS
DEC C ; SET IDE ADDRESS ; 4TS
OUT (C),B ; SET ADDRESS LINES ; 12TS
SET 6,B ; TURN ON READ BIT ; 8TS
OUT (C),B ; ASSERT READ LINE ; 12TS
;
;IN A,(PPIDE_IO_DATALO) ; GET DATA VALUE FROM DEVICE ; 11TS
DEC C
DEC C
IN A,(C) ; GET DATA VALUE FROM DEVICE
INC C
INC C
;IN A,(PPIDE_IO_DATALO) ; GET DATA VALUE FROM DEVICE
DEC C ; 4TS
DEC C ; 4TS
IN A,(C) ; GET DATA VALUE FROM DEVICE ; 12
INC C ; 4TS
INC C ; 4TS
;
RES 6,B ; CLEAR READ BIT ; 8TS
OUT (C),B ; DEASSERT READ LINE ; 12TS
@@ -1425,9 +1560,9 @@ PPIDE_IN:
INC HL ; POINT PAST PARM ; 6TS
EX (SP),HL ; RESTORE STACK ; 19TS
RET ; 10TS
; ; -----
; OUTPUT VALUE IN A TO THE DEVICE POINTED TO BY IY ; 204TS
;
; OUTPUT VALUE IN A TO THE DEVICE POINTED TO BY IY
;
PPIDE_OUT:
; *** TODO *** FIX ORDER OF SET/CLEAR WRITE LINE
EX (SP),HL ; GET PARM POINTER
@@ -1495,6 +1630,10 @@ PPIDE_BSYTO:
LD A,PPIDE_STBSYTO
JR PPIDE_ERR
;
PPIDE_NOTSUP:
LD A,PPIDE_STNOTSUP
JR PPIDE_ERR
;
PPIDE_ERR:
LD (IY+PPIDE_STAT),A ; SAVE NEW STATUS
;
@@ -1512,39 +1651,15 @@ PPIDE_PRTERR:
RET Z ; DONE IF NO ERRORS
; FALL THRU TO PPIDE_PRTSTAT
;
; PRINT STATUS STRING (STATUS NUM IN A)
; PRINT FULL DEVICE STATUS LINE
;
PPIDE_PRTSTAT:
PUSH AF
PUSH DE
PUSH HL
LD A,(IY+PPIDE_STAT)
OR A
LD DE,PPIDE_STR_STOK
JR Z,PPIDE_PRTSTAT1
INC A
LD DE,PPIDE_STR_STINVUNIT
CP PPIDE_STINVUNIT
JR Z,PPIDE_PRTSTAT2 ; INVALID UNIT IS SPECIAL CASE
INC A
LD DE,PPIDE_STR_STNOMEDIA
JR Z,PPIDE_PRTSTAT1
INC A
LD DE,PPIDE_STR_STCMDERR
JR Z,PPIDE_PRTSTAT1
INC A
LD DE,PPIDE_STR_STIOERR
JR Z,PPIDE_PRTSTAT1
INC A
LD DE,PPIDE_STR_STRDYTO
JR Z,PPIDE_PRTSTAT1
INC A
LD DE,PPIDE_STR_STDRQTO
JR Z,PPIDE_PRTSTAT1
INC A
LD DE,PPIDE_STR_STBSYTO
JR Z,PPIDE_PRTSTAT1
LD DE,PPIDE_STR_STUNK
PPIDE_PRTSTAT1:
CALL PPIDE_PRTPREFIX ; PRINT UNIT PREFIX
JR PPIDE_PRTSTAT3
PPIDE_PRTSTAT2:
@@ -1552,12 +1667,52 @@ PPIDE_PRTSTAT2:
PRTS("PPIDE:$") ; NO UNIT NUM IN PREFIX FOR INVALID UNIT
PPIDE_PRTSTAT3:
CALL PC_SPACE ; FORMATTING
CALL WRITESTR
CALL PPIDE_PRTSTATSTR
POP HL
POP DE
POP AF
RET
;
; PRINT STATUS STRING
;
PPIDE_PRTSTATSTR:
PUSH AF
PUSH DE
LD A,(IY+PPIDE_STAT)
OR A
LD DE,PPIDE_STR_STOK
JR Z,PPIDE_PRTSTATSTR1
INC A
LD DE,PPIDE_STR_STINVUNIT
JR Z,PPIDE_PRTSTATSTR1
INC A
LD DE,PPIDE_STR_STNOMEDIA
JR Z,PPIDE_PRTSTATSTR1
INC A
LD DE,PPIDE_STR_STCMDERR
JR Z,PPIDE_PRTSTATSTR1
INC A
LD DE,PPIDE_STR_STIOERR
JR Z,PPIDE_PRTSTATSTR1
INC A
LD DE,PPIDE_STR_STRDYTO
JR Z,PPIDE_PRTSTATSTR1
INC A
LD DE,PPIDE_STR_STDRQTO
JR Z,PPIDE_PRTSTATSTR1
INC A
LD DE,PPIDE_STR_STBSYTO
JR Z,PPIDE_PRTSTATSTR1
INC A
LD DE,PPIDE_STR_STNOTSUP
JR Z,PPIDE_PRTSTATSTR1
LD DE,PPIDE_STR_STUNK
PPIDE_PRTSTATSTR1:
CALL WRITESTR
POP DE
POP AF
RET
;
; PRINT ALL REGISTERS DIRECTLY FROM DEVICE
; DEVICE MUST BE SELECTED PRIOR TO CALL
;
@@ -1616,30 +1771,6 @@ PPIDE_PRTPREFIX1:
CALL PC_COLON
POP AF
RET
;;;
;;;
;;;
;;#IF (DSKYENABLE)
;;PPIDE_DSKY:
;; LD HL,DSKY_HEXBUF ; POINT TO DSKY BUFFER
;; CALL PPIDE_IN
;; .DB PPIDE_REG_DRVHD
;; LD (HL),A ; SAVE IN BUFFER
;; INC HL ; INCREMENT BUFFER POINTER
;; CALL PPIDE_IN
;; .DB PPIDE_REG_CYLHI
;; LD (HL),A ; SAVE IN BUFFER
;; INC HL ; INCREMENT BUFFER POINTER
;; CALL PPIDE_IN
;; .DB PPIDE_REG_CYLLO
;; LD (HL),A ; SAVE IN BUFFER
;; INC HL ; INCREMENT BUFFER POINTER
;; CALL PPIDE_IN
;; .DB PPIDE_REG_SECT
;; LD (HL),A ; SAVE IN BUFFER
;; CALL DSKY_HEXOUT ; SEND IT TO DSKY
;; RET
;;#ENDIF
;
;=============================================================================
; STRING DATA
@@ -1653,18 +1784,22 @@ PPIDE_STR_STIOERR .TEXT "IO ERROR$"
PPIDE_STR_STRDYTO .TEXT "READY TIMEOUT$"
PPIDE_STR_STDRQTO .TEXT "DRQ TIMEOUT$"
PPIDE_STR_STBSYTO .TEXT "BUSY TIMEOUT$"
PPIDE_STR_STNOTSUP .TEXT "NOT SUPPORTED$"
PPIDE_STR_STUNK .TEXT "UNKNOWN ERROR$"
;
PPIDE_STR_NO .TEXT "NO$"
PPIDE_STR_NOPPI .TEXT "PPI NOT PRESENT$"
PPIDE_STR_8BIT .TEXT " 8-BIT$"
;
PPIDE_STR_TYPEATA .TEXT " ATA$"
PPIDE_STR_TYPEATAPI .TEXT " ATAPI$"
;
;=============================================================================
; DATA STORAGE
;=============================================================================
;
PPIDE_TIMEOUT .DB PPIDE_TONORM ; WAIT FUNCS TIMEOUT IN TENTHS OF SEC
PPIDE_TOSCALER .DW CPUMHZ * 218 ; WAIT FUNCS SCALER FOR CPU SPEED
PPIDE_TOSCALER .DW CPUMHZ * 380 ; WAIT FUNCS SCALER FOR CPU SPEED
;
PPIDE_CMD .DB 0 ; PENDING COMMAND TO PROCESS
PPIDE_IOFNADR .DW 0 ; PENDING IO FUNCTION ADDRESS

View File

@@ -904,7 +904,7 @@ PPPSD_GETCSD:
CALL PPP_SNDCMD ; SEND COMMAND
RET NZ ; ABORT ON ERROR
LD B,16 ; GET 4 BYTES
LD B,16 ; GET 16 BYTES
LD HL,PPPSD_CSDBUF
PPPSD_GETCSD1:
CALL PPP_GETBYTE

View File

@@ -1352,20 +1352,24 @@ diskread:
;
clrled:
#if (BIOS == BIOS_WBW)
#if (DIAGENABLE)
xor a ; zero accum
out (DIAGPORT),a ; clear diag leds
#if (FPLED_ENABLE)
;xor a ; zero accum
;out (FPLED_IO),a ; clear diag leds
ld b,BF_SYSSET ; HBIOS SysGet
ld c,BF_SYSSET_PANEL ; ... Panel swiches value
ld l,$00 ; all LEDs off
rst 08 ; do it
#endif
#if (LEDENABLE)
#if (LEDMODE == LEDMODE_STD)
ld a,$FF ; led is inverted
out (LEDPORT),a ; clear led
ld a,$FF ; led is inverted
out (LEDPORT),a ; clear led
#endif
#if (LEDMODE == LEDMODE_RTC)
; Bits 0 and 1 of the RTC latch are for the LEDs.
ld a,(HB_RTCVAL)
and ~%00000011
out (RTCIO),a ; clear led
out (RTCIO),a ; clear led
ld (HB_RTCVAL),a
#endif
#endif

View File

@@ -242,6 +242,22 @@ GDCMODE_NONE .EQU 0
GDCMODE_ECB .EQU 1 ; ECB GDC
GDCMODE_RPH .EQU 2 ; RPH GDC
;
; LPT DRIVER MODE SELECTIONS
;
LPTMODE_NONE .EQU 0 ; NONE
LPTMODE_IBM .EQU 1 ; IBM STYLE INTERFACE
LPTMODE_MG014 .EQU 2 ; RCBUS MG014 STYLE INTERFACE
;
; PPA DRIVER MODE SELECTIONS
;
PPAMODE_NONE .EQU 0 ; NONE
PPAMODE_MG014 .EQU 1 ; RCBUS MG014 STYLE INTERFACE
;
; IMM DRIVER MODE SELECTIONS
;
IMMMODE_NONE .EQU 0 ; NONE
IMMMODE_MG014 .EQU 1 ; RCBUS MG014 STYLE INTERFACE
;
; GDC MONITOR SELECTIONS
;
GDCMON_NONE .EQU 0
@@ -257,6 +273,12 @@ DMAMODE_Z280 .EQU 3 ; Z280 INTEGRATED DMA
DMAMODE_RC .EQU 4 ; RCBUS Z80 DMA
DMAMODE_MBC .EQU 5 ; MBC
;
; KEYBOARD MODE SELECTIONS
;
KBDMODE_NONE .EQU 0
KBDMODE_PS2 .EQU 1 ; PS/2 KEYBOARD CONTROLLER
KBDMODE_VRC .EQU 2 ; VGARC KEYBOARD CONTROLLER
;
; SERIAL DEVICE CONFIGURATION CONSTANTS
;
SER_DATA5 .EQU 0 << 0
@@ -425,6 +447,16 @@ SPD_UNSUP .EQU 0 ; PLATFORM CAN CHANGE SPEEDS BUT IS UNSUPPORTED
SPD_HIGH .EQU 1 ; PLATFORM CAN CHANGE SPEED, STARTS HIGH
SPD_LOW .EQU 2 ; PLATFORM CAN CHANGE SPEED, STARTS LOW
;
; SCSI COMMAND CODES (SHOULD BE IT IT'S OWN FILE)
;
SCSI_CMD_READ .EQU $08
SCSI_CMD_INQ .EQU $12
SCSI_CMD_TEST .EQU $00
SCSI_CMD_START .EQU $1B
SCSI_CMD_SENSE .EQU $03
SCSI_CMD_WRITE .EQU $0A
SCSI_CMD_RDCAP .EQU $25
;
#INCLUDE "build.inc" ; INCLUDE USER CONFIG, ADD VARIANT, TIMESTAMP, & ROMSIZE
;
; INCLUDE Z180 REGISTER DEFINITIONS

View File

@@ -942,10 +942,10 @@ TMS_IDAT:
.DB TMS_PPIX ; PPI CONTROL PORT
#ENDIF
#IF ((TMSMODE == TMSMODE_MSXKBD) | (TMSMODE == TMSMODE_MBC))
.DB KBDMODE_PS2 ; PS/2 8242 KEYBOARD CONTROLLER
.DB TMS_KBDST ; 8242 CMD/STATUS PORT
.DB TMS_KBDDATA ; 8242 DATA PORT
.DB 0 ; FILLER
.DB 0 ; FILER
#ENDIF
;
.DB TMS_DATREG

View File

@@ -1,3 +1,4 @@
; WARNING: This code does not seem to be working on Z280. WBW - 5/3/2023
;
; Size-optimized LZSA2 decompressor by spke & uniabis (134 bytes)
;
@@ -59,8 +60,8 @@
; 3. This notice may not be removed or altered from any source distribution.
;
; #DEFINE BACKWARD_DECOMPRESS ; uncomment for data compressed with option -b (+5 bytes, -3% speed)
; #DEFINE AVOID_SELFMODIFYING_CODE ; uncomment to disallow self-modifying code (-1 byte, -4% speed)
; #DEFINE BACKWARD_DECOMPRESS ; uncomment for data compressed with option -b (+5 bytes, -3% speed)
; #DEFINE AVOID_SELFMODIFYING_CODE ; uncomment to disallow self-modifying code (-1 byte, -4% speed)
#IFNDEF BACKWARD_DECOMPRESS
@@ -78,7 +79,7 @@
#DEFINE ADD_OFFSET \
#DEFCONT \ ld a,e \ sub l \ ld l,a
#DEFCONT \ ld a,d \ sbc h \ ld h,a ; 6*4 = 24t / 6 bytes
#DEFCONT \ ld a,d \ sbc h \ ld h,a ; 6*4 = 24t / 6 bytes
#DEFINE BLOCKCOPY \
#DEFCONT \ lddr
@@ -117,7 +118,7 @@ MatchLen: and %00000111 \ add a,2 \ cp 9
call z,ExtendedCode
CopyMatch: ld c,a
push hl ; BC = len, DE = dest, HL = -offset, SP -> [src]
push hl ; BC = len, DE = dest, HL = -offset, SP -> [src]
#IFNDEF AVOID_SELFMODIFYING_CODE
PrevOffset .EQU $+1 \ ld hl,0
@@ -125,8 +126,8 @@ PrevOffset .EQU $+1 \ ld hl,0
push ix \ pop hl
#ENDIF
ADD_OFFSET
BLOCKCOPY ; BC = 0, DE = dest
pop hl ; HL = src
BLOCKCOPY ; BC = 0, DE = dest
pop hl ; HL = src
ReadToken: ld a,(hl) \ NEXT_HL \ push af
and %00011000 \ jr z,NoLiterals
@@ -162,12 +163,16 @@ ExtendedCode: call ReadNibble \ inc a \ jr z,ExtraByte
ExtraByte ld a,15 \ add a,c \ add a,(hl) \ NEXT_HL \ ret nc
ld a,(hl) \ NEXT_HL
ld b,(hl) \ NEXT_HL \ ret nz
pop bc ; RET is not needed, because RET from ReadNibble is sufficient
pop bc ; RET is not needed, because RET from ReadNibble is sufficient
ReadNibble: ld c,a
skipLDCA xor a \ ex af,af' \ ret m
skipLDCA xor a \ nop \ ex af,af' \ ret m ; NOP for Z280 bug
ld a,(hl) \ or $F0 \ ex af,af'
ld a,(hl) \ NEXT_HL \ or $0F
rrca \ rrca \ rrca \ rrca \ ret
; The extraneous NOP instruction above is to workaround a bug in the
; Z280 processor where ex af,af' can copy rather than swap the flags
; register.
; See https://www.retrobrewcomputers.org/forum/index.php?t=msg&goto=10183&

View File

@@ -1039,5 +1039,6 @@ REGS_VGA:
;==================================================================================================
;
VGA_IDAT:
.DB KBDMODE_PS2 ; PS/2 8242 KEYBOARD CONTROLLER
.DB VGA_KBDST
.DB VGA_KBDDATA

670
Source/HBIOS/vrc.asm Normal file
View File

@@ -0,0 +1,670 @@
;======================================================================
; VIDEO DRIVER FOR VGARC
; https://www.retrobrewcomputers.org/doku.php?id=builderpages:plasmo:vgarc1:vgarc1home
;
; WRITTEN BY: WAYNE WARTHEN -- 5/1/2023
;======================================================================
;
; TODO:
;
;======================================================================
; VGARC DRIVER - CONSTANTS
;======================================================================
;
VRC_BASE .EQU $00 ; FIRST CHAR DATA PORT
VRC_FONTBASE .EQU VRC_BASE + $0C ; FIRST FONT PORT
VRC_SCROLLIO .EQU $F5 ; SCROLL REG PORT
;
VRC_KBDDATA .EQU $F4
VRC_KBDST .EQU $F5
;
VRC_ROWS .EQU 48
VRC_COLS .EQU 64
;
#DEFINE USEFONTVGARC
#DEFINE VRC_FONT FONTVGARC
;
TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER
;
;======================================================================
; VRC DRIVER - INITIALIZATION
;======================================================================
;
VRC_INIT:
LD IY,VRC_IDAT ; POINTER TO INSTANCE DATA
;
CALL NEWLINE ; FORMATTING
PRTS("VRC: IO=0x$")
LD A,VRC_BASE
CALL PRTHEXBYTE
CALL VRC_PROBE ; CHECK FOR HW PRESENCE
JR Z,VRC_INIT1 ; CONTINUE IF HW PRESENT
;
; HARDWARE NOT PRESENT
PRTS(" NOT PRESENT$")
OR $FF ; SIGNAL FAILURE
RET
;
VRC_INIT1:
; RECORD DRIVER ACTIVE
OR $FF
LD (VRC_ACTIVE),A
; DISPLAY CONSOLE DIMENSIONS
LD A,VRC_COLS
CALL PC_SPACE
CALL PRTDECB
LD A,'X'
CALL COUT
LD A,VRC_ROWS
CALL PRTDECB
PRTS(" TEXT$")
; HARDWARE INITIALIZATION
CALL VRC_CRTINIT ; SETUP THE VGARC CHIP REGISTERS
CALL VRC_LOADFONT ; LOAD FONT DATA FROM ROM TO VGARC STORAGE
CALL VRC_VDARES ; RESET
CALL KBD_INIT ; INITIALIZE KEYBOARD DRIVER
; ADD OURSELVES TO VDA DISPATCH TABLE
LD BC,VRC_FNTBL ; BC := FUNCTION TABLE ADDRESS
LD DE,VRC_IDAT ; DE := VGARC INSTANCE DATA PTR
CALL VDA_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED
; INITIALIZE EMULATION
LD C,A ; C := ASSIGNED VIDEO DEVICE NUM
LD DE,VRC_FNTBL ; DE := FUNCTION TABLE ADDRESS
LD HL,VRC_IDAT ; HL := VGARC INSTANCE DATA PTR
CALL TERM_ATTACH ; DO IT
XOR A ; SIGNAL SUCCESS
RET
;
;======================================================================
; VGARC DRIVER - VIDEO DISPLAY ADAPTER (VDA) FUNCTIONS
;======================================================================
;
VRC_FNTBL:
.DW VRC_VDAINI
.DW VRC_VDAQRY
.DW VRC_VDARES
.DW VRC_VDADEV
.DW VRC_VDASCS
.DW VRC_VDASCP
.DW VRC_VDASAT
.DW VRC_VDASCO
.DW VRC_VDAWRC
.DW VRC_VDAFIL
.DW VRC_VDACPY
.DW VRC_VDASCR
.DW KBD_STAT
.DW KBD_FLUSH
.DW KBD_READ
.DW VRC_VDARDC
#IF (($ - VRC_FNTBL) != (VDA_FNCNT * 2))
.ECHO "*** INVALID VRC FUNCTION TABLE ***\n"
!!!!!
#ENDIF
VRC_VDAINI:
; RESET VDA
; CURRENTLY IGNORES VIDEO MODE AND BITMAP DATA
CALL VRC_VDARES ; RESET VDA
XOR A ; SIGNAL SUCCESS
RET
VRC_VDAQRY:
LD C,$00 ; MODE ZERO IS ALL WE KNOW
LD D,VRC_ROWS ; ROWS
LD E,VRC_COLS ; COLS
LD HL,0 ; EXTRACTION OF CURRENT BITMAP DATA NOT SUPPORTED YET
XOR A ; SIGNAL SUCCESS
RET
VRC_VDARES:
XOR A ; CLEAR ATTRIBUTES (REV VIDEO OFF)
LD (VRC_ATTR),A ; SAVE IT
DEC A ; INIT CUR NESTING, INIT TO HIDDEN
LD (VRC_CURSOR),A ; SAVE IT
LD HL,0 ; ZERO THE SCROLL OFFSET
LD (VRC_OFF),HL ; SAVE VALUE
XOR A ; ZERO
LD (VRC_LOFF),A ; SCROLL OFFSET (LINES)
LD A,' ' ; BLANK THE SCREEN
LD DE,VRC_ROWS*VRC_COLS ; FILL ENTIRE BUFFER
CALL VRC_FILL ; DO IT
LD DE,0 ; ROW = 0, COL = 0
CALL VRC_XY ; SEND CURSOR TO TOP LEFT
CALL VRC_SHOWCUR ; NOW SHOW THE CURSOR
;
XOR A ; SIGNAL SUCCESS
RET
VRC_VDADEV:
LD D,VDADEV_VRC ; D := DEVICE TYPE
LD E,0 ; E := PHYSICAL UNIT IS ALWAYS ZERO
LD H,0 ; H := 0, DRIVER HAS NO MODES
LD L,VRC_BASE ; L := BASE I/O ADDRESS
XOR A ; SIGNAL SUCCESS
RET
VRC_VDASCS:
SYSCHKERR(ERR_NOTIMPL) ; NOT IMPLEMENTED (YET)
RET
VRC_VDASCP:
CALL VRC_XY ; SET CURSOR POSITION
XOR A ; SIGNAL SUCCESS
RET
VRC_VDASAT:
; INCOMING IS: -----RUB (R=REVERSE, U=UNDERLINE, B=BLINK)
;
; ALL WE SUPPORT IS REVERSE. MOVE BIT TO BIT 7 OF ATTR BYTE
LD A,E ; GET ATTR VALUE
RRCA ; ROTATE TO BIT 7
RRCA
RRCA
AND $80 ; ENSURE ONLY BIT 7
LD (VRC_ATTR),A ; SAVE IT
XOR A ; SIGNAL SUCCESS
RET ; DONE
VRC_VDASCO:
; INCOMING IS: IBGRIBGR (I=INTENSITY, B=BLUE, G=GREEN, R=RED)
;
; NONE SUPPORTED, IGNORE
XOR A ; SIGNAL SUCCESS
RET ; DONE
VRC_VDAWRC:
LD A,E ; CHARACTER TO WRITE GOES IN A
CALL VRC_PUTCHAR ; PUT IT ON THE SCREEN
XOR A ; SIGNAL SUCCESS
RET
VRC_VDAFIL:
LD A,E ; FILL CHARACTER GOES IN A
EX DE,HL ; FILL LENGTH GOES IN DE
CALL VRC_FILL ; DO THE FILL
XOR A ; SIGNAL SUCCESS
RET
VRC_VDACPY:
; LENGTH IN HL, SOURCE ROW/COL IN DE, DEST IS VRC_POS
; BLKCPY USES: HL=SOURCE, DE=DEST, BC=COUNT
PUSH HL ; SAVE LENGTH
CALL VRC_XY2IDX ; ROW/COL IN DE -> SOURCE ADR IN HL
POP BC ; RECOVER LENGTH IN BC
LD DE,(VRC_POS) ; PUT DEST IN DE
JP VRC_BLKCPY ; DO A BLOCK COPY
VRC_VDASCR:
LD A,E ; LOAD E INTO A
OR A ; SET FLAGS
RET Z ; IF ZERO, WE ARE DONE
PUSH DE ; SAVE E
JP M,VRC_VDASCR1 ; E IS NEGATIVE, REVERSE SCROLL
CALL VRC_SCROLL ; SCROLL FORWARD ONE LINE
POP DE ; RECOVER E
DEC E ; DECREMENT IT
JR VRC_VDASCR ; LOOP
VRC_VDASCR1:
CALL VRC_RSCROLL ; SCROLL REVERSE ONE LINE
POP DE ; RECOVER E
INC E ; INCREMENT IT
JR VRC_VDASCR ; LOOP
;----------------------------------------------------------------------
; READ VALUE AT CURRENT VDU BUFFER POSITION
; RETURN E = CHARACTER, B = COLOUR, C = ATTRIBUTES
;----------------------------------------------------------------------
VRC_VDARDC:
OR $FF ; UNSUPPORTED FUNCTION
RET
;
;======================================================================
; VGARC DRIVER - PRIVATE DRIVER FUNCTIONS
;======================================================================
;
;
;----------------------------------------------------------------------
; PROBE FOR VGARC HARDWARE
;----------------------------------------------------------------------
;
; ON RETURN, ZF SET INDICATES HARDWARE FOUND
;
VRC_PROBE:
LD C,VRC_BASE + 1 ; +1 AVOIDS LEDS
LD B,$00
LD A,$AA
OUT (C),A
INC B
LD A,$55
OUT (C),A
DEC B
IN A,(C)
CP $AA
RET NZ
INC B
IN A,(C)
CP $55
RET
;
;----------------------------------------------------------------------
; CRTC DISPLAY CONTROLLER CHIP INITIALIZATION
;----------------------------------------------------------------------
;
VRC_CRTINIT:
XOR A ; ZERO ACCUM
LD A,$80 ; ACTIVATE AND ZERO HW SCROLL
OUT (VRC_SCROLLIO),A ; RESET HW SCROLL
RET ; DONE
;
;----------------------------------------------------------------------
; LOAD FONT DATA
;----------------------------------------------------------------------
;
VRC_LOADFONT:
;
#IF USELZSA2
LD (VRC_STACK),SP ; SAVE STACK
LD HL,(VRC_STACK) ; AND SHIFT IT
LD DE,$2000 ; DOWN 4KB TO
OR A ; CREATE A
SBC HL,DE ; DECOMPRESSION BUFFER
LD SP,HL ; HL POINTS TO BUFFER
EX DE,HL ; START OF STACK BUFFER
PUSH DE ; SAVE IT
LD HL,VRC_FONT ; START OF FONT DATA
CALL DLZSA2 ; DECOMPRESS TO DE
POP HL ; RECALL STACK BUFFER POSITION
#ELSE
LD HL,VRC_FONT ; START OF FONT DATA
#ENDIF
;
#IF 0
; THIS APPROACH TO LOADING FONTS IS BEST (FASTEST), BUT IS
; CAUSING ARTIFACTS ON THE DISPLAYED FONTS WHEN RUN ON A
; Z280. IT IS NOT CLEAR WHAT THE PROBLEM IS (POSSIBLY
; Z280 BUG), BUT FOR NOW WE AVOID THIS AND USE AN
; ALTERNATIVE APPROACH BELOW.
LD DE,0+(128*8)-1 ; LENGTH OF FONT DATA - 1
ADD HL,DE ; ADD TO HL
LD BC,VRC_FONTBASE+3 ; WORK BACKWARDS
OTDR ; DO 4 PAGES
DEC C
OTDR
DEC C
OTDR
DEC C
OTDR
DEC C
#ENDIF
;
#IF 1
; ALTERNATIVE APPROACH TO LOADING FONTS. THIS ONE AVOIDS
; THE USE OF OTDR WHICH SEEMS TO CAUSE PROBLEMS ON Z280.
LD B,0
LD C,VRC_FONTBASE
VRC_LOADFONT1:
LD A,(HL)
OUT (C),A
INC HL
INC B
JR NZ,VRC_LOADFONT1
INC C
LD A,C
CP VRC_FONTBASE + 4
JR NZ,VRC_LOADFONT1
#ENDIF
;
#IF USELZSA2
LD HL,(VRC_STACK) ; ERASE DECOMPRESS BUFFER
LD SP,HL ; BY RESTORING THE STACK
RET ; DONE
VRC_STACK .DW 0
#ELSE
RET
#ENDIF
;
;----------------------------------------------------------------------
; SET CURSOR POSITION TO ROW IN D AND COLUMN IN E
;----------------------------------------------------------------------
;
VRC_XY:
PUSH DE ; SAVE NEW POSITION FOR NOW
CALL VRC_HIDECUR ; HIDE THE CURSOR
POP DE ; RECOVER INCOMING ROW/COL
CALL VRC_XY2IDX ; CONVERT ROW/COL TO BUF IDX
LD (VRC_POS),HL ; SAVE THE RESULT (DISPLAY POSITION)
JP VRC_SHOWCUR ; SHOW THE CURSOR AND EXIT
;
;----------------------------------------------------------------------
; CONVERT XY COORDINATES IN DE INTO LINEAR INDEX IN HL
; D=ROW, E=COL
;----------------------------------------------------------------------
;
VRC_XY2IDX:
LD A,E ; SAVE COLUMN NUMBER IN A
LD H,D ; SET H TO ROW NUMBER
LD E,VRC_COLS ; SET E TO ROW LENGTH
CALL MULT8 ; MULTIPLY TO GET ROW OFFSET, H * E = HL, E=0, B=0
LD E,A ; GET COLUMN BACK
ADD HL,DE ; ADD IT IN
LD DE,(VRC_OFF) ; SCREEN OFFSET
ADD HL,DE ; ADJUST
;
PUSH HL ; SAVE IT
LD DE,VRC_ROWS * VRC_COLS ; DE := BUF SIZE
OR A ; CLEAR CARRY
SBC HL,DE ; SUBTRACT FROM HL
JR C,VRC_XY2IDX1 ; BYPASS IF NO WRAP
POP DE ; THROW AWAY TOS
RET ; DONE
VRC_XY2IDX1:
POP HL ; NO WRAP, RESTORE
RET ; RETURN
;
;----------------------------------------------------------------------
; SHOW OR HIDE CURSOR
;----------------------------------------------------------------------
;
; VGARC USES HIGH BIT OF CHAR VALUE FOR INVERSE VIDEO. WE HAVE NO
; HARDWARE CURSOR, SO WE LEVERAGE THE INVERSE VIDEO TO SHOW A CURSOR.
; SINCE ANY OPERATION THAT POTENTIALLY OVERWERITES THE CURSOR POSITION
; COULD DESTROY THE CURSOR, WE HAVE A COUPLE FUNCTIONS TO SHOW AND
; HIDE THE CURSOR. A VARIABLE IS USED TO TRACK THE SHOW/HIDE
; OPERATIONS BECAUSE WE MAY HAVE NESTED CALLS. ZERO MEANS SHOW
; REAL CURSOR. ANY VALUE LESS THAN ZERO MEANS HIDDEN.
;
VRC_SHOWCUR:
LD A,(VRC_CURSOR) ; GET CURRENT NESTING VALUE
INC A ; INCREMENT TO SHOW
LD (VRC_CURSOR),A ; SAVE IT
RET NZ ; ALREADY SHOWN, NOTHING TO DO
;
; WE TRANSITIONED FROM NON-ZERO TO ZERO. NEED TO ACTUALLY
; SHOW THE CURSOR NOW.
;
JR VRC_FLIPCUR
;
VRC_HIDECUR:
LD A,(VRC_CURSOR) ; GET CURRENT NESTING VALUE
DEC A ; DECREMENT TO HIDE
LD (VRC_CURSOR),A ; SAVE IT
INC A ; BACK TO ORIGINAL VALUE
RET NZ ; ALREADY HIDDEN, NOTHING TO DO
;
; WE TRANSITIONED FROM ZERO TO NEGATIVE. NEED TO ACTUALLY
; HIDE THE CURSOR NOW. SINCE SHOWING AND HIDING ARE THE
; SAME OPERATION (FLIP REV VID BIT), WE REUSE CODE ABOVE.
;
JR VRC_FLIPCUR
;
VRC_FLIPCUR:
; SHOWING OR HIDING THE CURSOR IS THE SAME OPERATION.
; SO WE USE COMMON CODE TO FLIP THE REV VID BIT.
LD HL,(VRC_POS) ; CURSOR POSITION
LD B,L ; INVERT FOR I/O
LD C,H
IN A,(C) ; GET VALUE
XOR $80 ; FLIP REV VID BIT
OUT (C),A ; WRITE NEW VALUE
RET
;
;----------------------------------------------------------------------
; WRITE VALUE IN A TO CURRENT VDU BUFFER POSITION, ADVANCE CURSOR
;----------------------------------------------------------------------
;
VRC_PUTCHAR:
; WRITE CHAR AT CURRENT CURSOR POSITION. SINCE THE CURSOR
; IS JUST THE HIGH BIT (REV VIDEO), WE FIRST TURN OFF THE
; CURSOR, WRITE THE CHAR, UPDATE THE CURSOR POSITION, AND
; FINALLY TURN THE CURSOR BACK ON AT THE NEW POSITION.
;
PUSH AF ; SAVE INCOMING CHAR
CALL VRC_HIDECUR ; HIDE CURSOR
POP AF
LD HL,(VRC_POS) ; GET CUR BUF POSITION
LD B,L ; INVERT FOR I/O
LD C,H
AND $7F ; SUPPRESS ATTRIBUTE (HI BIT)
LD L,A ; PUT VALUE IN L
LD A,(VRC_ATTR) ; GET CURRENT ATTRIBUTE
OR L ; COMBINE WITH CHAR VALUE
OUT (C),A ; WRITE VALUE TO BUFFER
;
; SET CURSOR AT NEW POSITION
LD HL,(VRC_POS) ; GET CURRENT BUF OFFSET
INC HL ; INCREMENT
PUSH HL ; SAVE IT
LD DE,VRC_ROWS * VRC_COLS ; DE := BUF SIZE
OR A ; CLEAR CARRY
SBC HL,DE ; SUBTRACT FROM HL
JR C,VRC_PUTCHAR1 ; BYPASS IF NO WRAP
POP DE ; THROW AWAY TOS
LD HL,0 ; BACK TO START
JR VRC_PUTCHAR2 ; CONTINUE
VRC_PUTCHAR1:
POP HL ; NO WRAP, RESTORE
VRC_PUTCHAR2:
LD (VRC_POS),HL ; SAVE NEW POSITION
JP VRC_SHOWCUR ; SHOW IT AND RETURN
;
;----------------------------------------------------------------------
; FILL AREA IN BUFFER WITH SPECIFIED CHARACTER AND CURRENT COLOR/ATTRIBUTE
; STARTING AT THE CURRENT FRAME BUFFER POSITION
; A: FILL CHARACTER
; DE: NUMBER OF CHARACTERS TO FILL
;----------------------------------------------------------------------
;
VRC_FILL:
LD (VRC_FILL1+1),A ; SAVE FILL CHAR
PUSH DE ; SAVE INCOMING DE
CALL VRC_HIDECUR ; HIDE CURSOR
POP DE ; RESTORE INCOMING DE
LD HL,(VRC_POS) ; STARTING POSITION
;
VRC_FILL1:
LD A,$FF ; FILL CHAR
LD B,L ; INVERT FOR I/O
LD C,H
OUT (C),A ; PUT CHAR TO BUF
;
DEC DE ; DECREMENT COUNT
LD A,D ; TEST FOR ZERO
OR E
JP Z,VRC_SHOWCUR ; EXIT VIA SHOW CURSOR IF DONE
;
INC HL ; INCREMENT
PUSH HL ; SAVE IT
LD BC,VRC_ROWS * VRC_COLS ; BC := BUF SIZE
OR A ; CLEAR CARRY
SBC HL,BC ; SUBTRACT FROM HL
JR C,VRC_FILL2 ; BYPASS IF NO WRAP
POP BC ; THROW AWAY TOS
LD HL,0 ; BACK TO START
JR VRC_FILL3 ; CONTINUE
VRC_FILL2:
POP HL ; NO WRAP, RESTORE
VRC_FILL3:
LD (VRC_POS),HL ; SAVE NEW POSITION
JR VRC_FILL1 ; LOOP TILL DONE
;
;----------------------------------------------------------------------
; SCROLL ENTIRE SCREEN FORWARD BY ONE LINE (CURSOR POSITION UNCHANGED)
;----------------------------------------------------------------------
;
VRC_SCROLL:
; SCROLL DOWN 1 LINE VIA HARDWARE
CALL VRC_HIDECUR ; SUPPRESS CURSOR
LD A,(VRC_LOFF) ; GET LINE OFFSET
INC A ; BUMP
CP VRC_ROWS ; OVERFLOW?
JR C,VRC_SCROLL1 ; IF NOT, SKIP
XOR A ; ELSE, BACK TO ZERO
VRC_SCROLL1:
LD (VRC_LOFF),A ; SAVE NEW VALUE
OR $80 ; SET HW SCROLL ENABLE BIT
OUT (VRC_SCROLLIO),A ; DO IT
;
; ADJUST BUFFER OFFSET
LD HL,(VRC_OFF) ; BUFFER OFFSET
LD DE,VRC_COLS ; COLUMNS
ADD HL,DE ; ADD TO GET NEW OFFSET
PUSH HL ; SAVE IT
LD DE,VRC_ROWS * VRC_COLS ; DE := BUF SIZE
OR A ; CLEAR CARRY
SBC HL,DE ; SUBTRACT FROM HL
JR C,VRC_SCROLL2 ; BYPASS IF NO WRAP
POP DE ; BURN TOS
JR VRC_SCROLL3 ; CONTINUE
VRC_SCROLL2:
POP HL ; NO WRAP, RESTORE HL
VRC_SCROLL3:
LD (VRC_OFF),HL ; SAVE NEW OFFSET
;
; FILL EXPOSED LINE
LD HL,(VRC_POS) ; GET CURSOR POS
PUSH HL ; SAVE IT
LD D,VRC_ROWS - 1 ; LAST ROW
LD E,0 ; FIRST COLUMN
CALL VRC_XY2IDX ; HL = START OF LAST LINE
LD (VRC_POS),HL ; SET FILL POSITION
LD A,' ' ; FILL WITH BLANKS
LD DE,VRC_COLS ; FILL ONE LINE
CALL VRC_FILL ; FILL LAST LINE
POP HL ; RECOVER CURSOR POS
LD (VRC_POS),HL ; PUT VALUE BACK
;
; ADJUST CURSOR POSITION
LD HL,(VRC_POS) ; CURSOR POSITION
LD DE,VRC_COLS ; COLUMNS
ADD HL,DE ; NEW CURSOR POS
PUSH HL ; SAVE IT
LD DE,VRC_ROWS * VRC_COLS ; DE := DISPLAY SIZE
OR A ; CLEAR CARRY
SBC HL,DE ; SUBTRACT FROM HL
JR C,VRC_SCROLL4 ; BYPASS IF NO WRAP
POP DE ; BURN TOS
JR VRC_SCROLL5 ; CONTINUE
VRC_SCROLL4:
POP HL ; NO WRAP, RESTORE HL
VRC_SCROLL5:
LD (VRC_POS),HL ; SAVE NEW CURSOR POS
JP VRC_SHOWCUR ; EXIT VIA SHOW CURSOR
;
;----------------------------------------------------------------------
; REVERSE SCROLL ENTIRE SCREEN BY ONE LINE (CURSOR POSITION UNCHANGED)
;----------------------------------------------------------------------
;
VRC_RSCROLL:
; SCROLL UP 1 LINE VIA HARDWARE
CALL VRC_HIDECUR ; SUPPRESS CURSOR
LD A,(VRC_LOFF) ; GET LINE OFFSET
DEC A ; BUMP
CP $FF ; OVERFLOW?
JR NZ,VRC_RSCROLL1 ; IF NOT, SKIP
LD A,VRC_ROWS - 1 ; ELSE, BACK TO LAST ROW
VRC_RSCROLL1:
LD (VRC_LOFF),A ; SAVE NEW VALUE
OR $80 ; SET HW SCROLL ENABLE BIT
OUT (VRC_SCROLLIO),A ; DO IT
;
; ADJUST BUFFER OFFSET
LD HL,(VRC_OFF) ; BUFFER OFFSET
LD DE,VRC_COLS ; COLUMNS
OR A ; CLEAR CARRY
SBC HL,DE ; SUBTRACT TO GET NEW OFFSET
PUSH HL ; SAVE IT
JR NC,VRC_RSCROLL2 ; BYPASS IF NO WRAP
LD DE,VRC_ROWS * VRC_COLS ; DISPLAY SIZE
ADD HL,DE ; HANDLE WRAP
POP DE ; BURN TOS
JR VRC_RSCROLL3 ; CONTINUE
VRC_RSCROLL2:
POP HL ; NO WRAP, RESTORE HL
VRC_RSCROLL3:
LD (VRC_OFF),HL ; SAVE NEW OFFSET
;
; FILL EXPOSED LINE
LD HL,(VRC_POS) ; GET CURSOR POS
PUSH HL ; SAVE IT
LD D,0 ; FIRST ROW
LD E,0 ; FIRST COLUMN
CALL VRC_XY2IDX ; HL = START OF FIRST LINE
LD (VRC_POS),HL ; SET FILL POSITION
LD A,' ' ; FILL WITH BLANKS
LD DE,VRC_COLS ; FILL ONE LINE
CALL VRC_FILL ; FILL FIRST LINE
POP HL ; RECOVER CURSOR POS
LD (VRC_POS),HL ; PUT VALUE BACK
;
; ADJUST CURSOR POSITION
LD HL,(VRC_POS) ; CURSOR POSITION
LD DE,VRC_COLS ; COLUMNS
OR A ; CLEAR CARRY
SBC HL,DE ; NEW CURSOR POS
PUSH HL ; SAVE IT
JR NC,VRC_RSCROLL4 ; BYPASS IF NO WRAP
LD DE,VRC_ROWS * VRC_COLS ; DISPLAY SIZE
ADD HL,DE ; HANDLE WRAP
POP DE ; BURN TOS
JR VRC_RSCROLL5 ; CONTINUE
VRC_RSCROLL4:
POP HL ; NO WRAP, RESTORE HL
VRC_RSCROLL5:
LD (VRC_POS),HL ; SAVE NEW CURSOR POS
JP VRC_SHOWCUR ; EXIT VIA SHOW CURSOR
;
;----------------------------------------------------------------------
; BLOCK COPY BC BYTES FROM HL TO DE
;----------------------------------------------------------------------
;
VRC_BLKCPY:
PUSH BC
PUSH HL
CALL VRC_HIDECUR
POP HL
POP BC
;
VRC_BLKCPY1:
LD A,B
OR C
JP Z,VRC_SHOWCUR ; EXIT VIA SHOW CURSOR
;
PUSH BC ; SAVE LOOP CTL
LD B,L ; INVERT FOR I/O
LD C,H
IN A,(C) ; GET SOURCE CHAR
LD B,E ; INVERT FOR I/O
LD C,D
OUT (C),A ; WRITE DEST CHAR
POP BC ; RESTORE LOOP CTL
;
INC HL ; NEXT SRC CHAR
INC DE ; NEXT DEST CHAR
DEC BC ; DEC COUNT
JR VRC_BLKCPY1 ; LOOP TILL DONE
;
;==================================================================================================
; VGARC DRIVER - DATA
;==================================================================================================
;
VRC_ATTR .DB 0 ; CURRENT COLOR
VRC_POS .DW 0 ; CURRENT DISPLAY POSITION
VRC_OFF .DW 0 ; SCREEN START OFFSET INTO DISP BUF
VRC_LOFF .DB 0 ; LINE OFFSET INTO DISP BUF
VRC_CURSOR .DB 0 ; CURSOR NESTING LEVEL
VRC_ACTIVE .DB FALSE ; FLAG FOR DRIVER ACTIVE
;
;==================================================================================================
; VGA DRIVER - INSTANCE DATA
;==================================================================================================
;
VRC_IDAT:
.DB KBDMODE_VRC ; VGARC KEYBOARD CONTROLLER
.DB VRC_KBDST
.DB VRC_KBDDATA

View File

@@ -48,7 +48,7 @@ The layout of the first track does not conform exactly to the
recommended p-System layout. The recommended layout is not possible
because it conflicts with the RomWBW definition for a boot track.
However, the changes are only slightly different sector assignments for
the different boot componets -- the general boot sequence and mechanism
the different boot components -- the general boot sequence and mechanism
for the p-System is completely standard.
The logical disk geometry used by this p-System
@@ -77,14 +77,17 @@ escape sequence handling configuration. The debugger code as added to
SYSTEM.PASCAL to enable the debug function. SYSTEM.INTERP was modified
to enable the extended BIOS functions.
The build/makefile creates the psys disk image (psys.img) by adding
concatentating psys.vol and blank.vol (after adding track 0 contents to
The build/makefile creates the psys disk image (psys.img) by
concatenating psys.vol and blank.vol (after adding track 0 contents to
each). psys.vol and blank.vol are recognized by CiderPress and
CiderPress can be used to add/remove files from these volumes.
However, there is currently no straightforward way to extract the
volumes from the disk image. If you are good with a binary disk
editor, you can do it that way. Please contact me if you are
interested in pursuing that.
To extract volumes from a disk image, Andrew Davidson has created
a nice Python script that can extract p-System volumes from an
existing disk image file. The extracted volume can be manipulated
by CiderPress. The script is also capable of re-inserting a modified
volume back into the disk image file. This tool is available at:
https://github.com/robosnacks/psysimg.
There is currently no support for floppy drives.
@@ -119,7 +122,7 @@ that SofTech produced a IV.1 with some nice enhancements (like
subsidiary volumes and decent support for ANSI/VT-100 terminals). I
have been unable to track down the IV.1 distribution media despite
trying very hard. If anyone knows of a source for the media of the
Adapable p-System for Z80, I would love to get hold of it.
Adaptable p-System for Z80, I would love to get hold of it.
3:58 PM Tuesday, January 17, 2023
@@ -138,4 +141,10 @@ arrow keys transmitted by an ANSI/VT-100 terminal. In this case,
the setup program was used to define up/down/left/right like
WordStar does: ^E,^X,^S,^D.
5:48 PM Tuesday, January 17, 2023
5:48 PM Tuesday, January 17, 2023
Updated instructions above to include a reference to Andrew
Davidson's Python script that will extract/insert volumes from/to
a disk image.
1:31 PM Thursday, May 11, 2023

Binary file not shown.

View File

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

View File

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