From 521af19e50c65aad1ff6067407da8d149bde491a Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Sun, 10 Apr 2016 16:21:29 -0700 Subject: [PATCH] VDA Device Initialization Flow Cleanup --- Source/CBIOS/cbios.asm | 39 +++++-- Source/HBIOS/API.txt | 119 ++++++------------- Source/HBIOS/Config/mk4_cvdu.asm | 5 - Source/HBIOS/Config/plt_mk4.asm | 5 +- Source/HBIOS/Config/plt_n8.asm | 5 +- Source/HBIOS/Config/plt_sbc.asm | 5 +- Source/HBIOS/Config/plt_zeta.asm | 6 +- Source/HBIOS/Config/plt_zeta2.asm | 70 +---------- Source/HBIOS/Config/sbc_cvdu.asm | 7 +- Source/HBIOS/Config/sbc_diskio3+cvdu.asm | 7 +- Source/HBIOS/Config/sbc_vdu.asm | 5 - Source/HBIOS/ansi.asm | 48 +++++--- Source/HBIOS/cvdu.asm | 51 +++----- Source/HBIOS/hbios.asm | 141 ++++++++--------------- Source/HBIOS/hbios.inc | 28 ++--- Source/HBIOS/romldr.asm | 5 +- Source/HBIOS/term.asm | 74 ++++++++++++ Source/HBIOS/tms.asm | 58 +++++----- Source/HBIOS/tty.asm | 44 +++++-- Source/HBIOS/uart.asm | 20 ++-- Source/HBIOS/vdu.asm | 47 +++----- 21 files changed, 347 insertions(+), 442 deletions(-) create mode 100644 Source/HBIOS/term.asm diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index f2a9e8e3..8485db22 100644 --- a/Source/CBIOS/cbios.asm +++ b/Source/CBIOS/cbios.asm @@ -40,8 +40,8 @@ DEV_NUL .EQU $FF ; NUL: ; ; MEMORY LAYOUT ; -IOBYTE .EQU 3 ; LOC IN PAGE 0 OF I/O DEFINITION BYTE -CDISK .EQU 4 ; LOC IN PAGE 0 OF CURRENT DISK NUMBER 0=A,...,15=P +IOBYTE .EQU 3 ; LOC IN PAGE 0 OF I/O DEFINITION BYTE +CDISK .EQU 4 ; LOC IN PAGE 0 OF CURRENT DISK NUMBER 0=A,...,15=P ; CCP_LOC .EQU CPM_LOC CCP_SIZ .EQU $800 @@ -221,12 +221,36 @@ DEVMAP: ; Disk mapping is done using a drive map table (DRVMAP) which is built ; dynamically at cold boot. See the DRV_INIT routine. This table is ; made up of entries as documented below. The table is prefixed with one -; byte indicating the number of entries. The index of the entry indicates +; byte indicating the number of entries. The postion of the entry indicates ; the drive letter, so the first entry is A:, the second entry is B:, etc. ; -; BYTE: UNIT -; BYTE: SLICE -; WORD: DPH ADDRESS +; UNIT: BIOS DISK UNIT # (BYTE) +; SLICE: DISK SLICE NUMBER (BYTE) +; DPH: DPH ADDRESS OF DRIVE (WORD) +; +; DRVMAP --+ +; | DRIVE A | DRIVE B | | DRIVE N | +; +-----V------+-------+-----+--------------------+ +--------------------+ +; | N | UNIT | SLICE | DPH | UNIT | SLICE | DPH | ... | UNIT | SLICE | DPH | +; +----8+-----8+------8+-+-16+-----8+------8+-+-16+ +-----8+------8+-+-16+ +; | | | +; +--------------------+ +-> [DPH] +-> [DPH] +; | +; V-----+-------+-------+-------+--------+-----+-----+-----+ +; DPH: | XLT | 0000H | 0000H | 0000H | DIRBUF | DPB | CSV | ALV | +; +---16+-----16+-----16+-----16+------16+-+-16+-+-16+-+-16+ +; (ONE DPH PER DRIVE) | | | +; | | +----------+ +; | | | +; +----------------------+ V-------------+ V-------------+ +; | | CSV BUF | | ALV BUF | +; | +-------------+ +-------------+ +; | (CSZ BYTES) (ASZ BYTES) +; | +; +-----+-----+-----V-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ +; DPB: | CSZ | ASZ | BLS | SPT | BSH | BLM | EXM | DSM | DRM | AL0 | AL1 | CKS | OFF | +; +---16+---16+----8+---16+----8+----8+----8+---16+---16+----8+----8+---16+---16+ +; |<--- PREFIX ---->|<------------------- STANDARD CP/M DPB ------------------->| ; ;================================================================================================== ; DPB MAPPING TABLE @@ -1996,7 +2020,8 @@ DEV_INIT0: RST 08 ; D := DEVICE TYPE, E := PHYSICAL UNIT NUMBER POP HL ; RESTORE TARGET LD A,D ; DEVICE TYPE TO A - CP CIODEV_VDU ; COMPARE TO FIRST VIDEO DEVICE + ; FIX: BELOW SHOULD TEST THE "TERMINAL" BIT INSTEAD OF CHECKING DEVICE NUMBER + CP CIODEV_TERM ; COMPARE TO FIRST VIDEO DEVICE POP BC ; RESTORE LOOP CONTROL LD A,C ; UNIT INDEX TO ACCUM ;CALL C,JPHL ; DO IT IF DEVICE TYPE < VDU diff --git a/Source/HBIOS/API.txt b/Source/HBIOS/API.txt index 3e4797cf..33feefe0 100644 --- a/Source/HBIOS/API.txt +++ b/Source/HBIOS/API.txt @@ -132,11 +132,10 @@ DEVICE ($06): E=Device Number C=Device Attributes - Serial Device Attributes Byte: - ;7: 1=Floppy, 0=Hard Disk (or similar, e.g. CF, SD, RAM) - - H=Media Type (RS-232, Terminal, etc.) - L=Video Unit Id (if Media Type == VDA) + Disk Device Attributes Byte: + 7: 0=RS-232, 1=Terminal + + If Terminal, 3-0 is attached Video Unit # ============== Disk Functions @@ -265,14 +264,15 @@ Disk 6 SD0: SD Card 4096M, LBA Disk 7 PRPSD0: SD Card 2048M, LBA Disk 8 RF0: RAM Floppy 4M, LBA Serial 0 UART0: RS-232 38400,8N1,HFC -Serial 1 PRPCON0: Direct -- -Serial 2 CVDU0: Direct -- -Serial 2 VDU0: Direct -- -Serial 2 TMS0: Direct -- -Video 0 PRPCON0: VDA Text 80x25, ANSI -Video 1 CVDU0: VDA Text 80x25, ANSI -Video 2 VDU0: VDA Text 80x25, ANSI -Video 3 TMS0: VDA Text 40x25, TTY +Serial 1 PRPCON0: Terminal Video 0 +Serial 2 CVDU0: Terminal Video 1 +Serial 3 VDU0: Terminal Video 2 +Serial 4 TMS0: Terminal Video 3 +Video 0 PRPCON0: CRT Text 80x25, ANSI +Video 1 CVDU0: CRT Text 80x25, ANSI +Video 2 VDU0: CRT Text 80x25, ANSI +Video 3 TMS0: CRT Text 40x25, TTY +Video 4 NEC0 CRT Graphics 600x400 Unit: Function Group & Unit Index Device: _DEVICE Device Type & Device Num @@ -287,83 +287,30 @@ Capacity/Mode: ----------------------------------------------------------------------------------- _INIT: - - INIT HARDWARE + - INIT CRT HARDWARE + - INIT KEYBOARD HARDWARE + - CALL _VDARES () - ADD OURSELVES TO VDA_TBL - - ADD OURSELVES TO CIO_TBL - - GOTO _VDAINIT + - CALL TERM_ATTACH (C=VIDEO UNIT, DE=_DISPATCH) -_VDAINIT: (BC=FUNCTION/DEVID, HL=BITMAP ADR, D=TERMTYPE, E=VIDEO MODE) - - CALL _VDARESET - - INITIALIZE EMULATION BY CALLING EMU_INIT (B=TERMTYPE, C=DEVTYPE, DE=VDADISPADR) ==> (DE=CIODISPADR) - - SAVE DE TO _CIODISPADR TO FORWARD SUBSEQUENT CIO FUNCTION CALLS +_VDARES: () + - HOME CURSOR + - CLEAR SCREEN - RETURN (A=STATUS) -_VDARESET: - - RESET HARDWARE +TERM_ATTACH: (C=VIDEO UNIT, DE=_DISPATCH) + - CALL _INIT (B=TERM DEV NUM, C=VIDEO UNIT, DE=_DISPATCH) + - ADD OURSELVES TO CIO_TBL USING _DISPATCH - RETURN (A=STATUS) -EMU_INIT: (B=TERMTYPE, C=DEVTYPE, DE=VDADISPADR) ==> (DE=CIODISPADR) - - GOTO TO _INIT BASED ON VALUE IN B - -_INIT: (C=DEVTYPE, DE=VDADISPADR) ==> (DE=CIODISPADR) - - RECORD C TO _DEVTYPE SO _DEVICE FUNCTION CAN RETURN IT - - RECORD DE IN _VDADISPADR FOR LATER USE IN CALLING PARENT VDA DRIVER - - INITIALIZE/RESET EMULATION ENGINE - - RETURN (A=STATUS, DE=CIODISPADR) - --------------------------- - -md -hdsk -rf -ide -sd -ppide -fd -prp -ppp - --------------------------- - -0: RAM- RAMdrive on the Z180 SBC Mark IV board -LBASupported UserAddressableSectors 832 - -1: ROM- ROMdrive on the Z180 SBC Mark IV board -LBASupported UserAddressableSectors 768 - -2: IDE- SanDisk SDCFHSNJC-004G -s/n: DMZ031215013440 fmw: HDX 7.08 -CHS: 7751:16:63 nSectors 7813008 MaxBlkTransfer 1 -LBASupported UserAddressableSectors 7813120 - -3: IDE- SanDisk SDCFHSNJC-004G -s/n: BKZ031215015432 fmw: HDX 7.08 -CHS: 7751:16:63 nSectors 7813008 MaxBlkTransfer 1 -LBASupported UserAddressableSectors 7813120 - -4: SD- SD SU02G -s/n: 139401536 fmw: 8.0 d/c: 2013-07 -LBASupported UserAddressableSectors 1931264 - -Boot UNA unit number or ROM? [R,X,0..4] (R): - -N8VEM UNA CP/M (Will Sowerbutts, 2014-08-01 git cbed09) - -Unit Disk Driver Capacity Slices Start LBA Flags -0 RAM0 Memory 416.0KB 1 0x00000000 (formatted) -1 ROM0 Memory 384.0KB 1 0x00000000 -2 IDE0 Dual-IDE 3.7GB 469 0x00000000 MBR FGN -3 IDE1 Dual-IDE 3.7GB 469 0x00000000 MBR FGN -4 SD0 CSIO-SD 943.0MB 0 0x00000000 MBR FGN - -Drive A: assigned to RAM0 slice 0 -Drive B: assigned to ROM0 slice 0 -Drive C: assigned to IDE0 slice 0 -Drive D: assigned to IDE1 slice 0 - -Loading Residual CP/M at 0xE100 ... done. -CP/M 2.2 Copyright 1979 (c) by Digital Research - ---- - +_INIT: (B=TERM DEV NUM, C=VIDEO UNIT, DE=_DISPATCH) + - SAVE TERM DEV NUM TO _DEVNUM + - SAVE VIDEO UNIT TO _VDAUNIT + - SAVE _DISPATCH TO _VDADISPADR + - CALL _RESET () + - RETURN (DE=_DISPATCH, A=STATUS) +_RESET: () + - QUERY ATTACHED VDA FOR SCREEN SIZE (VIA _VDADISP) + - INITIALIZE ALL WORKING VARIABLES AND EMULATOR STATE + - RETURN (A=STATUS) diff --git a/Source/HBIOS/Config/mk4_cvdu.asm b/Source/HBIOS/Config/mk4_cvdu.asm index c96e38f3..01f48332 100644 --- a/Source/HBIOS/Config/mk4_cvdu.asm +++ b/Source/HBIOS/Config/mk4_cvdu.asm @@ -6,8 +6,3 @@ CRTACT .SET FALSE ; ACTIVATE CRT AT STARTUP ; CVDUENABLE .SET TRUE ; ENABLE CVDU BOARD SUPPORT -; -KBDENABLE .SET TRUE ; PS/2 KEYBOARD ON I8242 -; -TTYENABLE .SET TRUE ; INCLUDE TTY EMULATION SUPPORT -ANSIENABLE .SET TRUE ; INCLUDE ANSI EMULATION SUPPORT diff --git a/Source/HBIOS/Config/plt_mk4.asm b/Source/HBIOS/Config/plt_mk4.asm index ef931ea8..30fcb5af 100644 --- a/Source/HBIOS/Config/plt_mk4.asm +++ b/Source/HBIOS/Config/plt_mk4.asm @@ -94,13 +94,10 @@ PPPCONENABLE .EQU TRUE ; TRUE FOR PROPIO CONSOLE SUPPORT (PS/2 KBD & VGA VIDEO) HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE) ; -PPKENABLE .EQU FALSE ; TRUE FOR PARALLEL PORT KEYBOARD PPKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPKENABLE = TRUE) -KBDENABLE .EQU FALSE ; TRUE FOR PS/2 KEYBOARD ON I8242 KBDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF KBDENABLE = TRUE) ; -TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT -ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT +TERMENABLE .EQU FALSE ; TERM PSEUDO DEVICE, WILL BE ENABLED IF A VDA IS ENABLED ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABLE = TRUE) ; BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS) diff --git a/Source/HBIOS/Config/plt_n8.asm b/Source/HBIOS/Config/plt_n8.asm index 7477d9c9..8b7870e5 100644 --- a/Source/HBIOS/Config/plt_n8.asm +++ b/Source/HBIOS/Config/plt_n8.asm @@ -71,13 +71,10 @@ PPPCONENABLE .EQU TRUE ; TRUE FOR PROPIO CONSOLE SUPPORT (PS/2 KBD & VGA VIDEO) ; HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT ; -PPKENABLE .EQU TRUE ; TRUE FOR PARALLEL PORT KEYBOARD PPKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPKENABLE = TRUE) -KBDENABLE .EQU FALSE ; TRUE FOR PS/2 KEYBOARD ON I8242 KBDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF KBDENABLE = TRUE) ; -TTYENABLE .EQU TRUE ; INCLUDE TTY EMULATION SUPPORT -ANSIENABLE .EQU TRUE ; INCLUDE ANSI EMULATION SUPPORT +TERMENABLE .EQU FALSE ; TERM PSEUDO DEVICE, WILL BE ENABLED IF A VDA IS ENABLED ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABLE = TRUE) ; BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS) diff --git a/Source/HBIOS/Config/plt_sbc.asm b/Source/HBIOS/Config/plt_sbc.asm index e8b9e787..170aa9a3 100644 --- a/Source/HBIOS/Config/plt_sbc.asm +++ b/Source/HBIOS/Config/plt_sbc.asm @@ -88,13 +88,10 @@ PPPENABLE .EQU FALSE ; TRUE FOR PARPORTPROP SUPPORT HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE) ; -PPKENABLE .EQU FALSE ; TRUE FOR PARALLEL PORT KEYBOARD PPKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPKENABLE = TRUE) -KBDENABLE .EQU FALSE ; TRUE FOR PS/2 KEYBOARD ON I8242 KBDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF KBDENABLE = TRUE) ; -TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT -ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT +TERMENABLE .EQU FALSE ; TERM PSEUDO DEVICE, WILL BE ENABLED IF A VDA IS ENABLED ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABLE = TRUE) ; BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS) diff --git a/Source/HBIOS/Config/plt_zeta.asm b/Source/HBIOS/Config/plt_zeta.asm index 6c9c7ac5..17061353 100644 --- a/Source/HBIOS/Config/plt_zeta.asm +++ b/Source/HBIOS/Config/plt_zeta.asm @@ -65,11 +65,7 @@ PPPCONENABLE .EQU TRUE ; TRUE FOR PROPIO CONSOLE SUPPORT (PS/2 KBD & VGA VIDEO) ; HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT ; -PPKENABLE .EQU FALSE ; TRUE FOR PARALLEL PORT KEYBOARD -KBDENABLE .EQU FALSE ; TRUE FOR PS/2 KEYBOARD ON I8242 -; -TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT -ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT +TERMENABLE .EQU FALSE ; TERM PSEUDO DEVICE, WILL BE ENABLED IF A VDA IS ENABLED ; BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS) BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE diff --git a/Source/HBIOS/Config/plt_zeta2.asm b/Source/HBIOS/Config/plt_zeta2.asm index f499fce9..658d152e 100644 --- a/Source/HBIOS/Config/plt_zeta2.asm +++ b/Source/HBIOS/Config/plt_zeta2.asm @@ -5,72 +5,6 @@ ; ; BUILD CONFIGURATION OPTIONS ; -CPUOSC .EQU 20000000 ; CPU OSC FREQ -RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!! -CONBAUD .EQU 38400 ; DEFAULT BAUDRATE USED BELOW +#INCLUDE "Config/plt_zeta.asm" ; USE ZETA CONFIG TO START ; -CRTACT .EQU FALSE ; CRT ACTIVATION AT STARTUP -VDAEMU .EQU EMUTYP_ANSI ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...) -; -DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE) -; -SIMRTCENABLE .EQU FALSE ; SIMH CLOCK DRIVER -DSRTCENABLE .EQU TRUE ; DS-1302 CLOCK DRIVER -DSRTCMODE .EQU DSRTCMODE_STD ; DSRTCMODE_STD, DSRTCMODE_MFPIC -; -UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE) -UARTOSC .EQU 1843200 ; UART OSC FREQUENCY -UARTCNT .EQU 1 ; NUMBER OF UARTS -UART0IOB .EQU $68 ; IOBASE (SBC ONBOARD UART) -UART0BAUD .EQU CONBAUD ; BAUDRATE -UART0FEAT .EQU UF_FIFO ; FEATURE FLAGS: UF_FIFO | UF_AFC -; -ASCIENABLE .EQU FALSE ; TRUE FOR Z180 ASCI SUPPORT -; -VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT -CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT -NECENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT -TMSENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT -; -MDENABLE .EQU TRUE ; TRUE FOR ROM/RAM DISK SUPPORT (ALMOST ALWAYS WANT THIS ENABLED) -MDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF MDENABLE = TRUE) -; -FDENABLE .EQU TRUE ; TRUE FOR FLOPPY SUPPORT -FDMODE .EQU FDMODE_ZETA2 ; FDMODE_DIO, FDMODE_ZETA, FDMODE_DIDE, FDMODE_N8, FDMODE_DIO3 -FDTRACE .EQU 1 ; 0=SILENT, 1=FATAL ERRORS, 2=ALL ERRORS, 3=EVERYTHING (ONLY RELEVANT IF FDENABLE = TRUE) -FDMEDIA .EQU FDM144 ; FDM720, FDM144, FDM360, FDM120 (ONLY RELEVANT IF FDENABLE = TRUE) -FDMEDIAALT .EQU FDM720 ; ALTERNATE MEDIA TO TRY, SAME CHOICES AS ABOVE (ONLY RELEVANT IF FDMAUTO = TRUE) -FDMAUTO .EQU TRUE ; SELECT BETWEEN MEDIA OPTS ABOVE AUTOMATICALLY -; -RFENABLE .EQU FALSE ; TRUE FOR RAM FLOPPY SUPPORT -; -IDEENABLE .EQU FALSE ; TRUE FOR IDE SUPPORT -; -PPIDEENABLE .EQU FALSE ; TRUE FOR PPIDE SUPPORT (DO NOT COMBINE WITH DSKYENABLE) -PPIDEMODE .EQU PPIDEMODE_SBC ; PPIDEMODE_SBC, PPPIDEMODE_DIO3, PPIDEMODE_MFP, PPIDEMODE_N8 -PPIDETRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPIDEENABLE = TRUE) -PPIDE8BIT .EQU FALSE ; USE IDE 8BIT TRANSFERS (PROBABLY ONLY WORKS FOR CF CARDS!) -; -SDENABLE .EQU FALSE ; TRUE FOR SD SUPPORT -SDMODE .EQU SDMODE_PPI ; SDMODE_JUHA, SDMODE_CSIO, SDMODE_UART, SDMODE_PPI, SDMODE_DSD -SDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE) -SDCSIOFAST .EQU FALSE ; TABLE-DRIVEN BIT INVERTER -; -PRPENABLE .EQU FALSE ; TRUE FOR PROPIO SUPPORT -; -PPPENABLE .EQU FALSE ; TRUE FOR PARPORTPROP SUPPORT -PPPSDENABLE .EQU TRUE ; TRUE FOR PARPORTPROP SD SUPPORT -PPPSDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPPENABLE = TRUE) -PPPCONENABLE .EQU TRUE ; TRUE FOR PROPIO CONSOLE SUPPORT (PS/2 KBD & VGA VIDEO) -; -HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT -; -PPKENABLE .EQU FALSE ; TRUE FOR PARALLEL PORT KEYBOARD -KBDENABLE .EQU FALSE ; TRUE FOR PS/2 KEYBOARD ON I8242 -; -TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT -ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT -; -BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS) -BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE -BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT +FDMODE .SET FDMODE_ZETA2 ; FDMODE_DIO, FDMODE_ZETA, FDMODE_DIDE, FDMODE_N8, FDMODE_DIO3 diff --git a/Source/HBIOS/Config/sbc_cvdu.asm b/Source/HBIOS/Config/sbc_cvdu.asm index dc6d423c..35094fd1 100644 --- a/Source/HBIOS/Config/sbc_cvdu.asm +++ b/Source/HBIOS/Config/sbc_cvdu.asm @@ -3,11 +3,6 @@ ; SBC CVDU CONFIGURATION ;================================================================================================== ; -CRTACT .SET FALSE ; ACTIVATE CRT AT STARTUP +CRTACT .SET TRUE ; ACTIVATE CRT AT STARTUP ; CVDUENABLE .SET TRUE ; ENABLE CVDU BOARD SUPPORT -; -KBDENABLE .SET TRUE ; PS/2 KEYBOARD ON I8242 -; -TTYENABLE .SET TRUE ; INCLUDE TTY EMULATION SUPPORT -ANSIENABLE .SET TRUE ; INCLUDE ANSI EMULATION SUPPORT diff --git a/Source/HBIOS/Config/sbc_diskio3+cvdu.asm b/Source/HBIOS/Config/sbc_diskio3+cvdu.asm index 3b3d15ba..5498d945 100644 --- a/Source/HBIOS/Config/sbc_diskio3+cvdu.asm +++ b/Source/HBIOS/Config/sbc_diskio3+cvdu.asm @@ -3,16 +3,11 @@ ; SBC DISKIO V3 + CVDU CONFIGURATION ;================================================================================================== ; -CRTACT .SET FALSE ; ACTIVATE CRT AT STARTUP +CRTACT .SET TRUE ; ACTIVATE CRT AT STARTUP VDAEMU .SET EMUTYP_ANSI ; SELECT ANSI TERMINAL EMULATION ; CVDUENABLE .SET TRUE ; ENABLE CVDU BOARD SUPPORT ; -KBDENABLE .SET TRUE ; PS/2 KEYBOARD ON I8242 -; -TTYENABLE .SET TRUE ; INCLUDE TTY EMULATION SUPPORT -ANSIENABLE .SET TRUE ; INCLUDE ANSI EMULATION SUPPORT -; FDENABLE .SET TRUE ; ENABLE FLOPPY SUPPORT FDMODE .SET FDMODE_DIO3 ; USE DISKIO V3 MODE ; diff --git a/Source/HBIOS/Config/sbc_vdu.asm b/Source/HBIOS/Config/sbc_vdu.asm index e6c2eeb2..88c27605 100644 --- a/Source/HBIOS/Config/sbc_vdu.asm +++ b/Source/HBIOS/Config/sbc_vdu.asm @@ -6,8 +6,3 @@ CRTACT .SET TRUE ; ACTIVATE CRT AT STARTUP ; VDUENABLE .SET TRUE ; ENABLE VDU BOARD SUPPORT -; -PPKENABLE .SET TRUE ; PARALLEL PORT KEYBOARD -; -TTYENABLE .SET TRUE ; INCLUDE TTY EMULATION SUPPORT -ANSIENABLE .SET TRUE ; INCLUDE ANSI EMULATION SUPPORT diff --git a/Source/HBIOS/ansi.asm b/Source/HBIOS/ansi.asm index 4613b77f..be63fabb 100644 --- a/Source/HBIOS/ansi.asm +++ b/Source/HBIOS/ansi.asm @@ -20,17 +20,27 @@ ANSI_DEFCOLOR .EQU 7 ; WHITE ON BLACK ; ; INITIALIZATION OF EMULATION MODULE CALLED BY PARENT VDA DRIVER ; ON ENTRY: -; C: CIO UNIT NUMBER OF CALLING VDA DRIVER ; DE: DISPATCH ADDRESS OF CALLING VDA DRIVER ; RETURNS: ; DE: OUR CIO DISPATCH ADDRESS ; ANSI_INIT: - ; SAVE INCOMING VDA DISPATCH ADDRESS - LD A,C ; VDA DRIVER'S DEVICE TYPE - LD (ANSI_DEVTYPE),A ; ... SAVED LOCALLY - LD (ANSI_VDADISPADR),DE ; RECORD NEW VDA DISPATCH ADDRESS + ; PREVENT ATTEMPTS TO INIT MULTIPLE INSTANCES FOR NOW + LD A,(ANSI_VDAUNIT) ; LOAD CURRENT VDA UNIT VALUE + INC A ; SHOULD BE $FF, INC TO $00 + RET NZ ; IF NOT 0, PREVIOUSLY ATTACHED, RETURN W/ NZ +; + ; SAVE INCOMING DATA + LD A,B ; TERMINAL DEVICE NUM PASSED IN B + LD (ANSI_DEVNUM),A ; SAVE IT + LD A,C ; VDA UNIT NUMBER PASSED IN C + LD (ANSI_VDAUNIT),A ; SAVE IT + LD (ANSI_VDADISPADR),DE ; RECORD VDA DISPATCH ADDRESS +; + ; INIT/RESET OUR INTERNAL STATE CALL ANSI_RESET ; FULL RESET OF EMULATOR INTERNAL STATE + RET NZ ; BAIL OUT ON ERROR +; LD DE,ANSI_DISPATCH ; RETURN OUR DISPATCH ADDRESS XOR A ; SIGNAL SUCCESS RET ; RETURN @@ -65,11 +75,12 @@ ANSI_RESET: LD HL,ANSI_TABS ; POINT TO TAB STOP BITMAP LD B,32 ; INIT 32 BYTES ; -ANSI_INIT2: ; LOOP TO RESET TAB STOPS +ANSI_RESET1: ; LOOP TO RESET TAB STOPS LD (HL),A ; SET A BYTE INC HL ; POINT TO NEXT BYTE - DJNZ ANSI_INIT2 ; LOOP TILL ALL BYTES DONE + DJNZ ANSI_RESET1 ; LOOP TILL ALL BYTES DONE ; + XOR A RET ; ; @@ -199,8 +210,13 @@ ANSI_CIOOST: ; VIDEO OUTPUT IS *ALWAYS* READY ; INITIALIZE ; ANSI_CIOINIT: - XOR A ; NOTHING TO DO, SIGNAL SUCCESS - RET ; ... AND RETURN + ; RESET THE ATTACHED VDA DEVICE + LD B,BF_VDAINI ; FUNC: INIT + LD E,-1 ; DO NOT CHANGE VIDEO MODE + LD HL,0 ; DO NOT LOAD A BITMAP + CALL ANSI_VDADISP ; CALL THE VDA DRIVER + ; RESET OUR INTERNAL STATE AND RETURN + JP ANSI_RESET ; RESET OURSELVES AND RETURN ; ; QUERY STATUS ; @@ -213,10 +229,13 @@ ANSI_CIOQUERY: ; REPORT DEVICE ; ANSI_CIODEVICE: - LD A,(ANSI_DEVTYPE) ; GET DEVICE TYPE WE ARE EMULATING FOR - LD D,A ; AND PASS BACK IN D - LD E,C ; E := PHYSICAL UNIT - XOR A ; SIGNAL SUCCESS + LD D,CIODEV_TERM ; TYPE IS TERMINAL + LD A,(ANSI_DEVNUM) ; GET DEVICE NUMBER + LD E,A ; PUT IT IN E + LD A,(ANSI_VDAUNIT) ; GET VDA UNIT NUM + SET 7,A ; SET BIT 7 TO INDICATE TERMINAL TYPE + LD C,A ; PUT IT IN C + XOR A ; SIGNAL SUCCESS RET ; ;================================================================================================== @@ -1381,4 +1400,5 @@ ANSI_PARIDX .DB 0 ; NUMBER OF PARAMETERS RECORDED ANSI_PARLST .FILL 16,0 ; PARAMETER VALUE LIST (UP TO 16 BYTE VALUES) ANSI_VARLEN .EQU $ - ANSI_VARS ; -ANSI_DEVTYPE .DB $FF ; DEVICE TYPE OF PARENT VDA'S CIO DEVICE +ANSI_VDAUNIT .DB $FF ; VIDEO UNIT NUM OF ATTACHED VDA DEVICE +ANSI_DEVNUM .DB $FF ; TERMINAL DEVICE NUMBER diff --git a/Source/HBIOS/cvdu.asm b/Source/HBIOS/cvdu.asm index 297dbaa2..ed5ef75e 100644 --- a/Source/HBIOS/cvdu.asm +++ b/Source/HBIOS/cvdu.asm @@ -22,6 +22,8 @@ CVDU_DATA .EQU $EC ; READ/WRITE M8563 DATA CVDU_ROWS .EQU 25 CVDU_COLS .EQU 80 ; +TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER +; ;====================================================================== ; CVDU DRIVER - INITIALIZATION ;====================================================================== @@ -37,34 +39,22 @@ CVDU_INIT: CALL PRTDEC PRTS("KB$") CALL CVDU_LOADFONT ; LOAD FONT DATA FROM ROM TO CVDU STRORAGE + CALL CVDU_VDARES + CALL KBD_INIT ; INITIALIZE KEYBOARD DRIVER ; ADD OURSELVES TO VDA DISPATCH TABLE LD B,0 ; PHYSICAL UNIT IS ZERO LD C,VDADEV_CVDU ; DEVICE TYPE LD DE,0 ; UNIT DATA BLOB ADDRESS CALL VDA_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED - - ; ADD OURSELVES TO CIO DISPATCH TABLE - ;LD B,0 ; PHYSICAL UNIT IS ZERO - ;LD C,CIODEV_CVDU ; DEVICE TYPE - ;LD DE,0 ; UNIT DATA BLOB ADDRESS - LD D,0 ; PHYSICAL UNIT IS ZERO - LD E,CIODEV_CVDU ; DEVICE TYPE - LD BC,CVDU_DISPCIO ; BC := DISPATCH ADDRESS - CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED - LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE - - LD D,VDAEMU ; DEFAULT EMULATION - LD E,0 ; VIDEO MODE = 0 - JP CVDU_VDAINI -; -;====================================================================== -; CVDU DRIVER - CHARACTER I/O (CIO) DISPATCHER AND FUNCTIONS -;====================================================================== -; -CVDU_DISPCIO: - JP PANIC -CVDU_CIODISPADR .EQU $ - 2 + + ; INITIALIZE EMULATION + LD C,A ; C := ASSIGNED VIDEO DEVICE NUM + LD DE,CVDU_DISPATCH ; DE := DISPATCH ADDRESS + CALL TERM_ATTACH ; DO IT + + XOR A ; SIGNAL SUCCESS + RET ; ;====================================================================== ; CVDU DRIVER - VIDEO DISPLAY ADAPTER (VDA) DISPATCHER AND FUNCTIONS @@ -107,17 +97,8 @@ CVDU_DISPATCH: CVDU_VDAINI: ; RESET VDA - PUSH DE ; SAVE EMULATION TYPE (IN D) + ; CURRENTLY IGNORES VIDEO MODE AND BITMAP DATA CALL CVDU_VDARES ; RESET VDA - POP DE ; RECOVER EMULATION TYPE - - ; INITIALIZE EMULATION - LD B,D ; EMULATION TYPE TO B - LD C,CIODEV_CVDU ; PASS OUR DEVICE TYPE IN C - LD DE,CVDU_DISPATCH ; DISPATCH ADDRESS TO DE - CALL EMU_INIT ; INITIALIZE EMULATION, DE := CIO DISPATCHER - LD (CVDU_CIODISPADR),DE ; SAVE EMULATORS CIO DISPATCH INTERFACE ADDRESS - XOR A ; SIGNAL SUCCESS RET @@ -146,7 +127,7 @@ CVDU_VDARES: CVDU_VDADEV: LD D,VDADEV_CVDU ; D := DEVICE TYPE - LD E,C ; E := PHYSICAL UNIT + LD E,0 ; E := PHYSICAL UNIT IS ALWAYS ZERO XOR A ; SIGNAL SUCCESS RET @@ -769,4 +750,6 @@ CVDU_INIT8563: ; CVDU DRIVER - FONT DATA ;================================================================================================== ; -#INCLUDE "cvdu_font.asm" \ No newline at end of file +#INCLUDE "cvdu_font.asm" +; +#INCLUDE "kbd.asm" diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 2c165cd2..119662f1 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -592,10 +592,7 @@ INITSYS1: LD (HCB + HCB_CONDEV),A ; SAVE IT AS ACTIVE CONSOLE DEVICE ; ; DISPLAY HBIOS BANNER ON NEW CONSOLE - CALL NEWLINE - CALL NEWLINE PRTX(STR_BANNER) - CALL NEWLINE #ENDIF ; INITSYS2: @@ -663,12 +660,6 @@ HB_INITTBL: #IF (PPPENABLE) .DW PPP_INIT #ENDIF -#IF (PPKENABLE) - .DW PPK_INIT -#ENDIF -#IF (KBDENABLE) - .DW KBD_INIT -#ENDIF ; HB_INITTBLLEN .EQU (($ - HB_INITTBL) / 2) ; @@ -1056,38 +1047,6 @@ RTC_DISPATCH: CALL PANIC ; ;================================================================================================== -; EMULATION INITIALIZATION DISPATCHER -;================================================================================================== -; -; EMULATOR MODULES ARE INITIALIZED BY THE VDA DRIVER THAT USES THEM. -; THE VDA DRIVER CALLS EMU_INIT TO DISPATCH THE INITIALIZATION REQUEST -; TO THE CORRRECT EMULATION MODULE. -; -; B: EMULATION TYPE ID (1=TTY, 2=ANSI, ETC.) -; C: VDA DRIVER'S VDA DEVICE TYPE -; DE: VDA DRIVER'S DISPATCH ADDRESS -; -; -EMU_INIT: - LD A,B ; GET REQUESTED EMULATION -; - DEC A ; 1 = TTY -#IF (TTYENABLE) - LD HL,TTY_INIT - JR Z,EMU_INIT1 -#ENDIF - DEC A ; 2 = ANSI -#IF (ANSIENABLE) - LD HL,ANSI_INIT - JR Z,EMU_INIT1 -#ENDIF - CALL PANIC ; INVALID - RET -; -EMU_INIT1: - JP (HL) ; DO THE EMULATOR INIT, DE := CIO DISPATCH ADR -; -;================================================================================================== ; VIDEO DISPLAY ADAPTER DEVICE DISPATCHER ;================================================================================================== ; @@ -1784,39 +1743,12 @@ SIZ_HDSK .EQU $ - ORG_HDSK .ECHO " bytes.\n" #ENDIF -#IF (PPKENABLE) -ORG_PPK .EQU $ - #INCLUDE "ppk.asm" -SIZ_PPK .EQU $ - ORG_PPK - .ECHO "PPK occupies " - .ECHO SIZ_PPK - .ECHO " bytes.\n" -#ENDIF - -#IF (KBDENABLE) -ORG_KBD .EQU $ - #INCLUDE "kbd.asm" -SIZ_KBD .EQU $ - ORG_KBD - .ECHO "KBD occupies " - .ECHO SIZ_KBD - .ECHO " bytes.\n" -#ENDIF - -#IF (TTYENABLE) -ORG_TTY .EQU $ - #INCLUDE "tty.asm" -SIZ_TTY .EQU $ - ORG_TTY - .ECHO "TTY occupies " - .ECHO SIZ_TTY - .ECHO " bytes.\n" -#ENDIF - -#IF (ANSIENABLE) -ORG_ANSI .EQU $ - #INCLUDE "ansi.asm" -SIZ_ANSI .EQU $ - ORG_ANSI - .ECHO "ANSI occupies " - .ECHO SIZ_ANSI +#IF (TERMENABLE) +ORG_TERM .EQU $ + #INCLUDE "term.asm" +SIZ_TERM .EQU $ - ORG_TERM + .ECHO "TERM occupies " + .ECHO SIZ_TERM .ECHO " bytes.\n" #ENDIF ; @@ -2270,15 +2202,15 @@ PS_SERIAL: ; ; DEVICE COLUMN LD B,BF_CIODEVICE ; FUNC=GET DEVICE INFO, UNIT NUM STILL IN C - RST 08 ; DE:=DEVTYP/NUM, H:=DISK ATTRIBUTES + RST 08 ; DE:=DEVTYP/NUM, C:=DISK ATTRIBUTES PUSH BC ; SAVE ATTRIBUTES LD HL,PS_SDSTRREF ; POINT TO SERIAL DEVICE TYPE NAME TABLE CALL PS_PRTDEV ; PRINT SERIAL DEVICE NMEMONIC PADDED TO FIELD WIDTH - POP DE ; RECOVER ATTRIBUTES - PUSH DE ; SAVE ATTRIBUTES AGAIN + POP BC ; RECOVER ATTRIBUTES + PUSH BC ; SAVE ATTRIBUTES AGAIN CALL PS_PRTST ; PRINT SERIAL TYPE - POP DE ; RESTORE ATTRIBUTES - POP BC ; RESTORE UNIT NUM + POP BC ; RESTORE ATTRIBUTES + POP DE ; RESTORE UNIT NUM CALL PS_PRTSC ; PRINT SERIAL CONFIG ; CALL NEWLINE @@ -2287,7 +2219,13 @@ PS_SERIAL: ; PRINT SERIAL TYPE (SERIAL ATTRIBUTE IN E) ; PS_PRTST: - CALL PS_PRTNUL ; NUL FOR NOW + LD HL,PS_STRS232 ; ASSUME RS-232 + BIT 7,C ; 0=RS-232, 1=TERMINAL + JR Z,PS_PRTST1 ; HANDLE TERMINAL TYPE + LD HL,PS_STTERM ; TYPE IS TERMINAL +; +PS_PRTST1: + CALL PS_PRT ; PRINT $ TERM STRING AT (HL), C:=CHARS PRINTED LD A,18 ; 18 CHAR FIELD SUB C CALL PS_PAD ; PAD N SPACES (SPECIFIED IN A) @@ -2296,6 +2234,10 @@ PS_PRTST: ; PRINT SERIAL CONFIG (UNIT IN C, ATTRIBUTE IN E) ; PS_PRTSC: + BIT 7,C ; 0=RS-232, 1=TERMINAL + JR NZ,PS_PRTSC1 ; PRINT TERMINAL CONFIG +; + ; PRINT RS-232 CONFIG LD B,BF_CIOQUERY ; HBIOS FUNC: GET CIO CONFIG RST 08 ; DE:HL := BAUD RATE LD A,D ; TEST FOR $FF @@ -2308,7 +2250,21 @@ PS_PRTSC: CALL PC_COMMA PRTS(" 8N1$") RET - +; +PS_PRTSC1: + ; PRINT TERMINAL CONFIG + PRTS("Video $") ; FORMATTING + LD A,C ; GET ATTRIBUTE VALUE + AND $0F ; ISOLATE VIDEO UNIT NUM + CALL PRTDECB ; PRINT IT + CALL PC_COMMA +#IF (VDAEMU == EMUTYP_TTY) + PRTS(" TTY$") +#ENDIF +#IF (VDAEMU == EMUTYP_ANSI) + PRTS(" ANSI$") +#ENDIF + RET ; ; PRINT ONE LINE VIDEO UNIT/DEVICE INFO, VIDEO UNIT INDEX IN C ; @@ -2340,7 +2296,8 @@ PS_VIDEO: ; PRINT VIDEO TYPE (VIDEO ATTRIBUTE IN E) ; PS_PRTVT: - CALL PS_PRTNUL ; NUL FOR NOW + LD HL,PS_VTCRT ; ASSUME CRT + CALL PS_PRT ; PRINT $ TERM STRING AT (HL), C:=CHARS PRINTED LD A,18 ; 18 CHAR FIELD SUB C CALL PS_PAD ; PAD N SPACES (SPECIFIED IN A) @@ -2349,8 +2306,9 @@ PS_PRTVT: ; PRINT VIDEO CONFIG (UNIT IN C, ATTRIBUTE IN E) ; PS_PRTVC: - PRTS("TEXT$") + PRTS("Text$") CALL PC_COMMA + CALL PC_SPACE LD B,BF_VDAQRY ; FUNC: QUERY FOR VDA CONFIG RST 08 ; D:=ROWS, E:=COLS LD A,E @@ -2470,20 +2428,22 @@ PS_FLPED .TEXT "ED$" ; SERIAL DEVICE STRINGS ; PS_SDSTRREF: - .DW PS_SDUART, PS_SDASCI, PS_SDVDU, PS_SDCVDU - .DW PS_SDNEC, PS_SDTMS, PS_SDPRPCON, PS_SDPPPCON + .DW PS_SDUART, PS_SDASCI, PS_SDTERM, + .DW PS_SDPRPCON, PS_SDPPPCON ; PS_SDUART .TEXT "UART$" PS_SDASCI .TEXT "ASCI$" -PS_SDVDU .TEXT "VDU$" -PS_SDCVDU .TEXT "CVDU$" -PS_SDNEC .TEXT "NEC$" -PS_SDTMS .TEXT "TMS$" +PS_SDTERM .TEXT "TERM$" PS_SDPRPCON .TEXT "PRPCON$" PS_SDPPPCON .TEXT "PPPCON$" ; ; SERIAL TYPE STRINGS ; +PS_STRS232 .TEXT "RS-232$" +PS_STTERM .TEXT "Terminal$" +; +; SERIAL TYPE STRINGS +; ; ; VIDEO DEVICE STRINGS ; @@ -2495,8 +2455,9 @@ PS_VDCVDU .TEXT "CVDU$" PS_VDNEC .TEXT "NEC$" PS_VDTMS .TEXT "TMS$" ; -; SERIAL TYPE STRINGS +; VIDEO TYPE STRINGS ; +PS_VTCRT .TEXT "CRT$" ; ; VIDEO CONFIG STRINGS ; diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index 0b3f383f..d59dba92 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -32,7 +32,7 @@ BF_RTCGETBYT .EQU BF_RTC + 2 ; GET NVRAM BYTE BY INDEX BF_RTCSETBYT .EQU BF_RTC + 3 ; SET NVRAM BYTE BY INDEX BF_RTCGETBLK .EQU BF_RTC + 4 ; GET NVRAM DATA BLOCK BF_RTCSETBLK .EQU BF_RTC + 5 ; SET NVRAM DATA BLOCK -;; +; BF_EMU .EQU $30 ; DEPRECATED ; BF_VDA .EQU $40 @@ -55,15 +55,15 @@ BF_VDAKRD .EQU BF_VDA + 14 ; READ KEYBOARD BF_SYS .EQU $F0 BF_SYSSETBNK .EQU BF_SYS + 0 ; SET CURRENT BANK BF_SYSGETBNK .EQU BF_SYS + 1 ; GET CURRENT BANK -BF_SYSSETCPY .EQU BF_SYS + 2 ; COPY TO/FROM RAM/ROM MEMORY BANK -BF_SYSBNKCPY .EQU BF_SYS + 3 ; EXTENDED COPY SETUP +BF_SYSSETCPY .EQU BF_SYS + 2 ; BANK MEMORY COPY SETUP +BF_SYSBNKCPY .EQU BF_SYS + 3 ; BANK MEMORY COPY BF_SYSALLOC .EQU BF_SYS + 4 ; ALLOC HBIOS HEAP MEMORY BF_SYSFREE .EQU BF_SYS + 5 ; FREE HBIOS HEAP MEMORY BF_SYSVER .EQU BF_SYS + 6 ; GET HBIOS VERSION BF_SYSGET .EQU BF_SYS + 7 ; GET HBIOS INFO BF_SYSSET .EQU BF_SYS + 8 ; SET HBIOS PARAMETERS -BF_PEEK .EQU BF_SYS + 9 ; GET A BYTE FROM ALT BANK -BF_POKE .EQU BF_SYS + 10 ; PUT A BYTE TO ALT BANK +BF_PEEK .EQU BF_SYS + 9 ; GET A BYTE VALUE FROM ALT BANK +BF_POKE .EQU BF_SYS + 10 ; SET A BYTE VALUE IN ALT BANK ; BF_SYSGET_CIOCNT .EQU $00 ; GET CHAR UNIT COUNT BF_SYSGET_DIOCNT .EQU $10 ; GET DISK UNIT COUNT @@ -75,19 +75,14 @@ BF_SYSGET_BNKINFO .EQU $F2 ; GET BANK ASSIGNMENT INFO ; BF_SYSSET_BOOTINFO .EQU $E0 ; SET BOOT INFORMATION ; -; CHARACTER DEVICE IDS +; SERIAL DEVICE IDS ; CIODEV_UART .EQU $00 CIODEV_ASCI .EQU $10 -CIODEV_VDU .EQU $20 -CIODEV_CVDU .EQU $30 -CIODEV_NEC .EQU $40 -CIODEV_TMS .EQU $50 -CIODEV_PRPCON .EQU $60 -CIODEV_PPPCON .EQU $70 +CIODEV_TERM .EQU $20 +CIODEV_PRPCON .EQU $30 +CIODEV_PPPCON .EQU $40 CIODEV_CONSOLE .EQU $D0 -;CIODEV_VDA .EQU $E0 ; DEPRECATED -;CIODEV_NUL .EQU $F0 ; DEPRECATED ; ; DISK DEVICE IDS ; @@ -102,12 +97,11 @@ DIODEV_PRPSD .EQU $70 DIODEV_PPPSD .EQU $80 DIODEV_HDSK .EQU $90 ; -; VDA DEVICE IDS +; VIDEO DEVICE IDS ; -;VDADEV_NONE .EQU $00 ; NO VDA DEVICE VDADEV_VDU .EQU $00 ; ECB VDU - MOTOROLA 6545 VDADEV_CVDU .EQU $10 ; ECB COLOR VDU - MOS 8563 -VDADEV_NEC .EQU $20 ; ECB NEC UPD7220 (NOT IMPLEMENTED) +VDADEV_NEC .EQU $20 ; ECB UPD7220 - NEC UPD7220 VDADEV_TMS .EQU $30 ; N8 ONBOARD VDA SUBSYSTEM - TMS 9918 ; ; EMULATION TYPES diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 3a7463aa..2d2c1853 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -65,7 +65,7 @@ ZSYSIMG .EQU $5000 .ORG $ + $8000 ; SET ORG BASED ON OUR NEW LOCATION IN RAM PHASE2: ; BANNER - CALL NEWLINE + ;CALL NEWLINE LD DE,STR_BANNER CALL WRITESTR @@ -875,7 +875,8 @@ STR_NOBOOT .DB "\r\nDisk not bootable!$" STR_BOOTERR .DB "\r\nBoot failure!$" ; STR_BANNER .DB "\r\n", PLATFORM_NAME, " Boot Loader$" -STR_BOOTMENU .DB "\r\nBoot: (C)PM, (Z)System, (M)onitor,\r\n" +STR_BOOTMENU .DB "\r\n" + .DB "Boot: (C)PM, (Z)System, (M)onitor,\r\n" .DB " (L)ist disks, or Disk Unit # ===> $" ; .IF DSKYENABLE diff --git a/Source/HBIOS/term.asm b/Source/HBIOS/term.asm new file mode 100644 index 00000000..5f1a36fe --- /dev/null +++ b/Source/HBIOS/term.asm @@ -0,0 +1,74 @@ +;====================================================================== +; TERMINAL DRIVER FOR SBC PROJECT +; +; SERIAL PSEUDO-DEVICE DRIVER PROVIDES A TERMINAL EMULATION +; INTERFACE FOR VDA DEVICES +; +; WRITTEN BY: WAYNE WARTHEN -- 04/10/2016 +;====================================================================== +; +; TODO: +; - HANDLE MULTIPLE INSTANCES +; +;====================================================================== +; TERMINAL DRIVER - CONSTANTS +;====================================================================== +; +; +;====================================================================== +; TERMINAL DRIVER - ATTACH +;====================================================================== +; +; A VDA DRIVER CALLS THE ATTACH FUNCTION WHEN IT INITIALIZES TO +; CREATE A TERMINAL EMULATION INSTANCE. THE VDA DRIVER PASSES +; IN IT'S DISPATCH ADDRESS FOR USE BY THE EMULATION MODULES. THE +; TERMINAL DRIVER ADDS ITSELF AS AN ENTRY IN THE SERIAL UNIT LIST. +; +; CURRENTLY, ONLY A SINGLE INSTANCE OF THE TERMINAL DRIVER IS SUPPORTED. +; ANY ATTEMPT TO ATTACH AFTER THE FIRST WILL RETURN A FAILURE. +; +; C: VIDEO UNIT NUMBER OF CALLING VDA DRIVER +; DE: VDA DRIVER'S DISPATCH ADDRESS +; +TERM_ATTACH: +; + LD A,(TERM_DEVCNT) ; GET NEXT DEVICE NUMBER TO USE + LD B,A ; PUT IT IN B +; + ; SETUP EMULATOR MODULE DISPATCH ADDRESS BASED ON DESIRED EMULATION + ; EMULATOR PASSES BACK IT'S DISPATCH ADDRESS IN DE + OR $FF ; PRESET FAILURE +#IF (VDAEMU == EMUTYP_TTY) + CALL TTY_INIT ; INIT TTY, DE := TTY_DISPATCH +#ENDIF +#IF (VDAEMU == EMUTYP_ANSI) + CALL ANSI_INIT ; INIT ANSI, DE := ANSI_DISPATCH +#ENDIF + RET NZ ; BAIL OUT ON ERROR +; + ; ADD OURSELVES TO CIO DISPATCH TABLE + PUSH DE ; COPY EMULATOR DISPATCH ADDRESS + POP BC ; ... TO BC + LD DE,0 ; DE := DATA BLOB (NONE AT THIS POINT) + CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED + LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE +; + ; INCREMENT DEVICE COUNT + LD HL,TERM_DEVCNT ; POINT TO DEVICE COUNT + INC (HL) ; INCREMENT IT +; + XOR A ; SIGNAL SUCCESS + RET ; RETURN +; +;====================================================================== +; TERMINAL DRIVER PRIVATE DATA +;====================================================================== +; +TERM_DEVCNT .DB 0 ; TERMINAL DEVICE COUNT +; +;====================================================================== +; EMULATION MODULES +;====================================================================== +; +#INCLUDE "tty.asm" +#INCLUDE "ansi.asm" diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index 993116bb..eac6ef3f 100644 --- a/Source/HBIOS/tms.asm +++ b/Source/HBIOS/tms.asm @@ -20,6 +20,8 @@ TMS_DATREG .EQU N8_BASE + $18 ; READ/WRITE DATA TMS_ROWS .EQU 24 TMS_COLS .EQU 40 ; +TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER +; ; BELOW WAS TUNED FOR N8 AT 18MHZ WITH 3 IO WAIT STATES ; WILL NEED TO BE MODIFIED FOR DIFFERENT ACCESS SPEEDS ; IF YOU SEE SCREEN CORRUPTION, ADJUST THIS!!! @@ -38,6 +40,8 @@ TMS_INIT: ; CALL TMS_CRTINIT ; SETUP THE TMS CHIP REGISTERS CALL TMS_LOADFONT ; LOAD FONT DATA FROM ROM TO TMS STRORAGE + CALL TMS_VDARES + CALL PPK_INIT ; INITIALIZE KEYBOARD DRIVER ; ; ADD OURSELVES TO VDA DISPATCH TABLE LD B,0 ; PHYSICAL UNIT IS ZERO @@ -45,19 +49,19 @@ TMS_INIT: LD DE,0 ; UNIT DATA BLOB ADDRESS CALL VDA_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED ; - ; ADD OURSELVES TO CIO DISPATCH TABLE - ;LD B,0 ; PHYSICAL UNIT IS ZERO - ;LD C,CIODEV_TMS ; DEVICE TYPE - ;LD DE,0 ; UNIT DATA BLOB ADDRESS - LD D,0 ; PHYSICAL UNIT IS ZERO - LD E,CIODEV_TMS ; DEVICE TYPE - LD BC,TMS_DISPCIO ; BC := DISPATCH ADDRESS - CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED - LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE - - LD D,VDAEMU ; DEFAULT EMULATION - LD E,0 ; VIDEO MODE = 0 - JP TMS_VDAINI + ; ADD OURSELVES TO VDA DISPATCH TABLE + LD B,0 ; PHYSICAL UNIT IS ZERO + LD C,VDADEV_TMS ; DEVICE TYPE + LD DE,0 ; UNIT DATA BLOB ADDRESS + CALL VDA_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED + + ; INITIALIZE EMULATION + LD C,A ; C := ASSIGNED VIDEO DEVICE NUM + LD DE,TMS_DISPATCH ; DE := DISPATCH ADDRESS + CALL TERM_ATTACH ; DO IT + + XOR A ; SIGNAL SUCCESS + RET ; ;====================================================================== ; TMS DRIVER - CHARACTER I/O (CIO) DISPATCHER AND FUNCTIONS @@ -108,21 +112,11 @@ TMS_DISPATCH: TMS_VDAINI: ; RESET VDA - PUSH DE ; SAVE EMULATION TYPE (IN D) + ; CURRENTLY IGNORES VIDEO MODE AND BITMAP DATA CALL TMS_VDARES ; RESET VDA - POP DE ; RECOVER EMULATION TYPE - - ; INITIALIZE EMULATION - LD B,D ; EMULATION TYPE TO B - LD C,CIODEV_TMS ; PASS OUR DEVICE TYPE IN C - LD DE,TMS_DISPATCH ; DISPATCH ADDRESS TO DE - CALL EMU_INIT ; INITIALIZE EMULATION, DE := CIO DISPATCHER - LD (TMS_CIODISPADR),DE ; SAVE EMULATORS CIO DISPATCH INTERFACE ADDRESS - XOR A ; SIGNAL SUCCESS RET - TMS_VDAQRY: LD C,$00 ; MODE ZERO IS ALL WE KNOW LD D,TMS_ROWS ; ROWS @@ -131,12 +125,6 @@ TMS_VDAQRY: XOR A ; SIGNAL SUCCESS RET -TMS_VDADEV: - LD D,VDADEV_TMS ; D := DEVICE TYPE - LD E,C ; E := PHYSICAL UNIT - XOR A ; SIGNAL SUCCESS - RET - TMS_VDARES: LD DE,0 ; ROW = 0, COL = 0 CALL TMS_XY ; SEND CURSOR TO TOP LEFT @@ -153,6 +141,12 @@ TMS_VDARES: XOR A ; SIGNAL SUCCESS RET +TMS_VDADEV: + LD D,VDADEV_TMS ; D := DEVICE TYPE + LD E,0 ; E := PHYSICAL UNIT IS ALWAYS ZERO + XOR A ; SIGNAL SUCCESS + RET + TMS_VDASCS: CALL PANIC ; NOT IMPLEMENTED (YET) @@ -676,4 +670,6 @@ TMS_INIT9918LEN .EQU $ - TMS_INIT9918 ;================================================================================================== ; TMS_FONTDATA: -#INCLUDE "TMS_font.inc" \ No newline at end of file +#INCLUDE "TMS_font.inc" +; +#INCLUDE "ppk.asm" diff --git a/Source/HBIOS/tty.asm b/Source/HBIOS/tty.asm index e8d55476..47eda688 100644 --- a/Source/HBIOS/tty.asm +++ b/Source/HBIOS/tty.asm @@ -14,10 +14,22 @@ ; DE: OUR CIO DISPATCH ADDRESS ; TTY_INIT: - ; SAVE CALLING VDA DRIVER'S CIO UNIT NUMBER AND VDA DISPATCH ADDRESS - LD A,C ; VDA DRIVER'S DEVICE TYPE - LD (TTY_DEVTYPE),A ; ... SAVED LOCALLY - LD (TTY_VDADISPADR),DE ; ALSO SAVE VDA DRIVER'S DISPATCH ADDRESS + ; PREVENT ATTEMPTS TO INIT MULTIPLE INSTANCES FOR NOW + LD A,(TTY_VDAUNIT) ; LOAD CURRENT VDA UNIT VALUE + INC A ; SHOULD BE $FF, INC TO $00 + RET NZ ; IF NOT 0, PREVIOUSLY ATTACHED, RETURN W/ NZ +; + ; SAVE INCOMING DATA + LD A,B ; TERMINAL DEVICE NUM PASSED IN B + LD (TTY_DEVNUM),A ; SAVE IT + LD A,C ; VDA UNIT NUMBER PASSED IN C + LD (TTY_VDAUNIT),A ; SAVE IT + LD (TTY_VDADISPADR),DE ; RECORD VDA DISPATCH ADDRESS +; + ; INIT/RESET OUR INTERNAL STATE + CALL TTY_RESET ; FULL RESET OF EMULATOR INTERNAL STATE + RET NZ ; BAIL OUT ON ERROR +; LD DE,TTY_DISPATCH ; RETURN OUR DISPATCH ADDRESS XOR A ; SIGNAL SUCCESS RET ; RETURN @@ -32,6 +44,7 @@ TTY_RESET: LD DE,0 ; DE := 0, CURSOR TO HOME POSITION 0,0 LD (TTY_POS),DE ; SAVE CURSOR POSITION ; + XOR A ; SIGNAL SUCCESS RET ; DONE ; ; @@ -89,8 +102,13 @@ TTY_CIOOST: ; ; TTY_CIOINIT: - XOR A ; NOTHING TO DO, SIGNAL SUCCESS - RET ; ... AND RETURN + ; RESET THE ATTACHED VDA DEVICE + LD B,BF_VDAINI ; FUNC: INIT + LD E,-1 ; DO NOT CHANGE VIDEO MODE + LD HL,0 ; DO NOT LOAD A BITMAP + CALL ANSI_VDADISP ; CALL THE VDA DRIVER + ; RESET OUR INTERNAL STATE AND RETURN + JP TTY_RESET ; RESET OURSELVES AND RETURN ; ; ; @@ -103,10 +121,13 @@ TTY_CIOQUERY: ; ; TTY_CIODEVICE: - LD A,(TTY_DEVTYPE) ; GET DEVICE TYPE WE ARE EMULATING FOR - LD D,A ; AND PASS BACK IN D - LD E,C ; E := DEVICE NUMBER - XOR A ; SIGNAL SUCCESS + LD D,CIODEV_TERM ; TYPE IS TERMINAL + LD A,(TTY_DEVNUM) ; GET DEVICE NUMBER + LD E,A ; PUT IT IN E + LD A,(TTY_VDAUNIT) ; GET VDA UNIT NUM + SET 7,A ; SET BIT 7 TO INDICATE TERMINAL TYPE + LD C,A ; PUT IT IN C + XOR A ; SIGNAL SUCCESS RET ; ; @@ -188,4 +209,5 @@ TTY_DIM: TTY_COLS .DB 80 ; NUMBER OF COLUMNS ON SCREEN TTY_ROWS .DB 24 ; NUMBER OF ROWS ON SCREEN ; -TTY_DEVTYPE .DB $FF ; DEVICE TYPE OF PARENT VDA'S CIO DEVICE +TTY_VDAUNIT .DB $FF ; VIDEO UNIT NUM OF ATTACHED VDA DEVICE +TTY_DEVNUM .DB $FF ; TERMINAL DEVICE NUMBER diff --git a/Source/HBIOS/uart.asm b/Source/HBIOS/uart.asm index b4d1c499..609194dd 100644 --- a/Source/HBIOS/uart.asm +++ b/Source/HBIOS/uart.asm @@ -197,9 +197,9 @@ UART_INITP00: UART_INITP0: ; DETECT THE UART TYPE CALL UART_DETECT ; DETERMINE UART TYPE + LD (UART_TYPE),A ; SAVE TYPE OR A ; SET FLAGS RET Z ; ABORT IF NOTHING THERE - LD (UART_TYPE),A ; SAVE TYPE ; UPDATE WORKING UART DEVICE NUM LD HL,UART_DEV ; POINT TO CURRENT UART DEVICE NUM @@ -207,15 +207,6 @@ UART_INITP0: INC (HL) ; INCREMENT IT (FOR NEXT LOOP) LD (IY),A ; UDPATE UNIT NUM - ; ANNOUNCE PORT - CALL NEWLINE ; FORMATTING - PRTS("UART$") ; FORMATTING - LD A,(IY) ; DEVICE NUM - CALL PRTDECB ; PRINT DEVICE NUM - PRTS(": IO=0x$") ; FORMATTING - LD A,(IY + 1) ; GET BASE PORT - CALL PRTHEXBYTE ; PRINT BASE PORT -; ; SETUP FOR GENERIC INIT ROUTINE LD A,(IY + 3) ; GET FEATURES BYTE LD (UART_FUNC),A ; SAVE IT @@ -335,6 +326,15 @@ UART_INITP1: PRTC(']') #ENDIF + ; ANNOUNCE PORT + CALL NEWLINE ; FORMATTING + PRTS("UART$") ; FORMATTING + LD A,(IY) ; DEVICE NUM + CALL PRTDECB ; PRINT DEVICE NUM + PRTS(": IO=0x$") ; FORMATTING + LD A,(IY + 1) ; GET BASE PORT + CALL PRTHEXBYTE ; PRINT BASE PORT + ; PRINT THE UART TYPE LD A,(UART_TYPE) RLCA diff --git a/Source/HBIOS/vdu.asm b/Source/HBIOS/vdu.asm index 2ed5105d..19795236 100644 --- a/Source/HBIOS/vdu.asm +++ b/Source/HBIOS/vdu.asm @@ -23,6 +23,8 @@ VDU_STAT .EQU 0F2h ; VDU STATUS/REGISTER VDU_REG .EQU 0F2h ; VDU STATUS/REGISTER VDU_DATA .EQU 0F3h ; VDU DATA REGISTER ; +TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER +; ;====================================================================== ; VDU DRIVER - INITIALIZATION ;====================================================================== @@ -34,6 +36,8 @@ VDU_INIT: CALL PRTHEXBYTE ; CALL VDU_CRTINIT ; INIT SY6845 VDU CHIP + CALL VDU_VDARES + CALL PPK_INIT ; INITIALIZE KEYBOARD DRIVER ; ; ADD OURSELVES TO VDA DISPATCH TABLE LD B,0 ; PHYSICAL UNIT IS ZERO @@ -41,27 +45,13 @@ VDU_INIT: LD DE,0 ; UNIT DATA BLOB ADDRESS CALL VDA_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED ; - ; ADD OURSELVES TO CIO DISPATCH TABLE - ;LD B,0 ; PHYSICAL UNIT IS ZERO - ;LD C,CIODEV_VDU ; DEVICE TYPE - ;LD DE,0 ; UNIT DATA BLOB ADDRESS - LD D,0 ; PHYSICAL UNIT IS ZERO - LD E,CIODEV_VDU ; DEVICE TYPE - LD BC,VDU_DISPCIO ; BC := DISPATCH ADDRESS - CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED - LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE - - LD D,VDAEMU ; DEFAULT EMULATION - LD E,0 ; VIDEO MODE = 0 - JP VDU_VDAINI -; -;====================================================================== -; VDU DRIVER - CHARACTER I/O (CIO) DISPATCHER AND FUNCTIONS -;====================================================================== -; -VDU_DISPCIO: - JP PANIC -VDU_CIODISPADR .EQU $ - 2 + ; INITIALIZE EMULATION + LD C,A ; ASSIGNED VIDEO UNIT IN C + LD DE,VDU_DISPATCH ; DE := DISPATCH ADDRESS + CALL TERM_ATTACH ; DO IT + + XOR A ; SIGNAL SUCCESS + RET ; ;====================================================================== ; VDU DRIVER - VIDEO DISPLAY ADAPTER (VDA) DISPATCHER AND FUNCTIONS @@ -104,17 +94,8 @@ VDU_DISPATCH: VDU_VDAINI: ; RESET VDA - PUSH DE ; SAVE EMULATION TYPE (IN D) + ; CURRENTLY IGNORES VIDEO MODE AND BITMAP DATA CALL VDU_VDARES ; RESET VDA - POP DE ; RECOVER EMULATION TYPE - - ; INITIALIZE EMULATION - LD B,D ; EMULATION TYPE TO B - LD C,CIODEV_VDU ; PASS OUR DEVICE TYPE IN C - LD DE,VDU_DISPATCH ; DISPATCH ADDRESS TO DE - CALL EMU_INIT ; INITIALIZE EMULATION, DE := CIO DISPATCHER - LD (VDU_CIODISPADR),DE ; SAVE EMULATORS CIO DISPATCH INTERFACE ADDRESS - XOR A ; SIGNAL SUCCESS RET @@ -126,7 +107,6 @@ VDU_VDAQRY: RET VDU_VDARES: - ;JR VDU_RESET ; DO THE RESET LD DE,0 LD (VDU_OFFSET),DE CALL VDU_XY @@ -139,7 +119,7 @@ VDU_VDARES: VDU_VDADEV: LD D,VDADEV_VDU ; D := DEVICE TYPE - LD E,C ; E := PHYSICAL UNIT + LD E,0 ; E := PHYSICAL UNIT IS ALWAYS ZERO XOR A ; SIGNAL SUCCESS RET @@ -526,3 +506,4 @@ VDU_INIT6845: ; NEAREST NUMBER OF LINES IS 312 = (R4+1) * (R9+1) + R5. ; 15625 / 312 = 50.08 FIELDS PER SECOND (NEAR ENOUGH-DGG) ; +#INCLUDE "ppk.asm"