Files
RomWBW/Source/BPBIOS/bpbio-ww.z80
2021-10-15 16:02:39 -07:00

512 lines
14 KiB
Z80 Assembly
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
;*****************************************************************************
; BP-BIOS. Banked, Portable BIOS.
; Copyright (c) 1989-93 by Cameron W. Cotrill and Harold F. Bower
;
; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2 of the License, or (at
; your option) any later version.
;
; This program is distributed in the hope that it will be useful, but
; WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
; General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program; if not, write to the Free Software
; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
;
;----------------------------------------------------------------------------
; This BIOS is broken into modules that allow it to be ported across a
; wide variety of Z80 compatible systems. All hardware specific drivers
; are isolated to separate modules. All hardware independent modules (such
; as deblocking and IO redirection) are similarly broken out.
;
; The BP BIOS supports IOBYTE, but in a unique manner. Four physical devices
; are defined - COM1, COM2, PIO, and NULL. These are assigned to the CON,
; AUXIN, AUXOUT, and LST logical devices by the I/O byte. The NULL device is
; a bit bucket for output, and returns nulls for input.
;
; IOBYTE DESCRIPTION: LIST AUXOUT AUXIN CON
; D7->D0 XX XX XX XX
;
; XX: 00=COM1 01=COM2 10=PIO 11=NULL
;
;+++++++++++++++++ Retro-Brew HBIOS Version ++++++++++++++++++
;
; This configuration of the B/P Bios is for Retro-Brew (formerly
; called N8VEM) Single board computers with HBIOS. Multifunction
; chips on the board provide the services needed by a CP/M BIOS.
; This version of BPBios was derived from the P-112 version.
; The primary chips and the functions provided are:
;
; For Mark IV or N8
; Zilog Z80182 Z180 Core CPU, MMU, DMA
; ASCI0, ASCI1 (Serial async, available on header, expansion)
; CTC1 Optional 'heartbeat' clock, GP timer
;
; Dallas DS-1202 Primary Realtime clock
; Non-volatile battery-backed RAM (config data)
;
; 28F512 Flash ROM Boot code, device initialization
; and ROM disk
; 512 KB Static RAM On board RAM
;
; For SBC V1/2, ZETA or SIMH
; Zilog Z80 Z80 core at 4 Mhz
; UART 16650 compatible UART
; Dallas DS-1202 Primary Real time clock
; 28F512 Flash ROM Boot code, device initializtion, monitor and
; ROM disk
; 512k Static RAM On board RAM
;
; Ver Date Revision Description
; --- --------- -----------------------
; 1.8 04 Apr 21 - Update for ROMWBW version 3.0.1 LN
; 1.7 01 Jul 17 - Updated for HBIOS version 2.8.1 WW+LN
; 1.6 04 Sep 16 - Updated for HBIOS version 2.8 pre 5 WW+LN
; 1.5 15 May 15 - Updated for new versin of HBIOS WW+LN
; 1.4 24 Mar 14 - Initial HBIOS test Release WW+LN
; 1.3 28 Aug 01 - Scrubbed for GPL Release. HFB
; 1.2 - 30 Aug 97 - Expanded HD CDB length to 12 bytes for CDROM. HFB
; 1.1 - 11 May 97 - Added IDE Hard Drive, updated files to latest
; version. HFB
; 1.0 - 13 Aug 96 - Initial Release for P112 from YASBEC release. HFB
;*****************************************************************************
NAME BPBIO
FALSE EQU 0
TRUE EQU NOT FALSE
NO EQU FALSE
YES EQU TRUE
; << ****** SYSTEM SPECIFIC ****** >>
; << Insert ROMWBW definitions here >>
INCLUDE ROMWBW.LIB ; << for version # in ROM >>
; << ****** SYSTEM SPECIFIC ****** >>
; << Insert DEF-xxxx.LIB definition >>
INCLUDE DEF-WW.LIB ; << file for your configuration. >>
CSEG
;.....
; Ascii Character Equates
ETX EQU 03H ; End-of-Text
ACK EQU 06H ; Acknowledge
BELL EQU 07H ; Bell Character
CR EQU 0DH
LF EQU 0AH
XON EQU 11H ; X-On (Control-Q)
XOFF EQU 13H ; X-Off (Control-S)
ESC EQU 1BH
; Miscellaneous Equates
WRUAL EQU 2 ; DOS code for unallocated write
LOCKF EQU LOW [NOT AUTOSL] ;Lock flag for format default
ALONE EQU FALSE ; Boot code equate
; Include ENV definitions
IF Z3
IF ZSDOS2
MACLIB Z3BASEF.LIB
ELSE
MACLIB Z3BASE.LIB
ENDIF
ENDIF
PAGE
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; BIOS Entry Jump Table - This MUST be in Common Memory
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
CSEG
BIOSJT: JP CBOOT ; 00 Cold Boot
JP WBOOT ; 01 Warm Boot
JP CONST ; 02 console input status * (IOP+12)
JP CONIN ; 03 console input * (IOP+15)
JP CONOUT ; 04 console output * (IOP+18)
JP LIST ; 05 list output * (IOP+21)
JP AUXOUT ; 06 aux out (punch) * (IOP+24)
JP AUXIN ; 07 aux in (reader) * (IOP+27)
JP HOME ; 08 seek track 0
JP SELDSK ; 09 select logical drive
JP SETTRK ; 10 select track
JP SETSEC ; 11 select sector
JP SETDMA ; 12 set dma address for disk xfer
JP READ ; 13 disk read
JP WRITE ; 14 disk write
JP LISTST ; 15 list output status * (IOP+30)
JP SECTRN ; 16 logical -> physical sector xlate
; --- <<< End of CP/M 2.2 Vectors >>>
JP CONOST ; 17 Console Output Status
JP AUXIST ; 18 Aux Input Status
JP AUXOST ; 19 Aux Output Status
JP DEVTBL ; 20 CP/M 3 Device Table
JP DEVINI ; 21 Character Device Init (Near CP/M 3)
JP DRVTBL ; 22 DPH Pointer Table for A-P
JP 0 ; 23 RESERVED FOR MULTIO
JP FLUSH ; 24 Flush Deblocker
JP MOVE ; 25 Perform possible Inter-Bank Move
IF CLOCK
JP TIME ; 26 Get/Set RTC (Zsdos params)
ELSE
JP ISTRUE ; 26..return 0FFH (No Clock) if No code
ENDIF ;clock
;JP SELMEM ; 27 Select Alternate Memory Bank
JP HB_SELMEM ; 27 Select Alternate Memory Bank
JP SETBNK ; 28 Select DMA Memory bank
JP XMOVE ; 29 Set Source/Destination Banks for Move
; --- <<< End of CP/M 3 Vectors >>>
JP RETBIO ; 30 Return BIOS Addresses
JP ISTRUE ; 31 Direct Disk I/O - Not implemented
JP STFARC ; 32 Set Bank for FRJP and FRCALL
JP FRJP ; 33 Jump to (HL) in Alternate Bank
JP FRCLR ; 34 Clear Stack switcher from Alt Bank Jumps
; (used for error exits)
JP FRGETB ; 35 Load A,(HL) from Alternate Bank
JP FRGETW ; 36 Load DE,(HL) from Alternate Bank
JP FRPUTB ; 37 Load (HL),A to Alternate Bank
JP FRPUTW ; 38 Load (HL),DE to Alternate Bank
JP RETMEM ; 39 Return Current Active Memory Bank
CPR EQU BIOSJT-800H-0E00H
DOS EQU BIOSJT-0E00H
; End of BIOS Jump Table
PAGE
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; Boot / Banked Routine Linkage
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
IF BANKED
COMMON /BANK2/
ROMJT:
IF INROM
JP INSYNC
INSYNC: JP BOOTER ; Cold start loader
ELSE
JP 0 ; Reserved
JP 0
ENDIF ; Inrom
JDIRIO: JP ISTRUE ; Low Level HDC/FDC Functions
JHDCIO: JP ISTRUE ; Low Level HDC Functions (combined w/FDCIO)
JBREAD: JP BREAD ; BIOS Read
JBWRT: JP BWRT ; BIOS Write
JBSTRN: JP BSTRN ; BIOS Sectran
IF INROM
INCLUDE BOOTROM.Z80 ; Boot Routines
ENDIF ; Inrom
ENDIF ; Banked
PAGE
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; C o n f i g u r a t i o n A r e a
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; << ****** HARDWARE SPECIFIC ****** >>
; << Insert ICFG-xxx to initialize >>
INCLUDE ICFG-WW.Z80 ; << your computer's IO system >>
PAGE
; << ****** Hardware Specific ****** >>
; << Enter Low level Byte I/O driver >>
INCLUDE IIO-WW.Z80 ; << routines in file IIO-xxxx.Z80 >>
PAGE
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; Cold Start Code
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
DSEG
; << ***** Hardware Specific ***** >>
; << Insert the Cold boot routines >>
INCLUDE CBOOT-WW.Z80 ; << in file CBOOT-xx.Z80 >>
; << ****** Hardware Specific ****** >>
; << HBIOS interface routines in >>
INCLUDE HBIOS.Z80 ; << HBIOS.Z80 >>
; Deblocking Buffer Allocation
IF [BANKED OR INROM]
COMMON /B2RAM/
IF INROM
HSTBUF: DEFS INITCS ; Use a 1k buffer w/below
ELSE
HSTBUF EQU CBOOT0 ; Use CBOOT0 code for part of buffer w/below
ENDIF ;INROM
ELSE
DSEG
HSTBUF EQU CBOOT
ENDIF ;[BANKED OR INROM]
DEFS 1024-(INITCS) ; Use a 1 k buffer
HSTSIZ EQU HSTBUF+1024 ; Added label for Hard Drive ext. interface
PAGE
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; Disk Data Structures
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
MXFDIR EQU 255 ; Max number of dir entries-1 for floppy
MXFALC EQU 880 ; If High Density or 8" drives can be handled,
; set this for 880 (1.76 MB), otherwise the
; value can be reduced to 400 (800 KB), the
; maximum for 80 track, Double-Sided formats.
CSEG
IF BANKED
COMMON /BANK2/
ENDIF
DPB: ; Marker for DPB start
;.XLIST ; Don't print these due to size
IF AUTOSL
INCLUDE DPB.LIB ; Default selection of common DD formats
IF FLOPYH
INCLUDE DPB-H.LIB ; If "High-Density" Disk formats desired,
ENDIF ; FLOPYH
IF FLOPY8
INCLUDE DPB-8.LIB ; If 8" or HD Floppy Disks can be handled,
ENDIF ;FLOPY8 ; add default Autoselect DPB's
IF MORDPB
INCLUDE DPB2.LIB ; Additional assignable DPB's (4+4 unused)
ENDIF ;mordpb
ELSE ;Not autosl
INCLUDE DPBRAM.LIB ; RAM-based DPB's, 1 per physical Format
ENDIF ; AUTOSL
NRDPB EQU [$-DPB]/DPBSIZ ; Calc number of DPB's
CSEG ; Hard & Ramdisk DPBs and DPHs go in Code Seg
;.xlist
IF HARDDSK
; << ****** Hardware Specific ****** >>
; << Insert DPB Info for Hard Disk >>
INCLUDE DPBHD-WW.LIB ; << Drives as DPBHD-xx.LIB >>
ENDIF ; HARDDSK
;.list
PAGE
INCLUDE DPH.LIB ; Disk parameter headers
;.xlist
IF HARDDSK
INCLUDE DPHHD.LIB ; Insert DPH Info for Hard Disk Partitions
ENDIF ;HARDDSK
;.list
.LIST
PAGE
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; Banked Memory Support Routines
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; Bank Control Routines. Used only in Banked Systems
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
IF BANKED ; << ****** HARDWARE SPECIFIC ****** >>
; << Enter the Inter-Bank Movement >>
INCLUDE IBMV-WW.Z80 ; << routines in IBMV-xxx.Z80 >>
ELSE ; If Not Banked, Use these hooks
CSEG
MOVE: LDIR
RET
SELMEM:
IF HB_DEBUG AND FALSE
CALL PRTSTRD
DEFB '[SELMEM (STUB): $'
CALL PRTHEXBYTE
CALL PRTSTRD
DEFB ']',CR,LF,'$'
ENDIF
SETBNK:
RETMEM:
XMOVE:
GOSYSB:
FRCLR:
STFARC: RET
FRJP: JP (HL)
FRGETB: LD A,(HL)
RET
FRGETW: LD E,(HL)
INC HL
LD D,(HL)
DEC HL
RET
FRPUTB: LD (HL),A
RET
FRPUTW: LD (HL),E
INC HL
LD (HL),D
DEC HL
RET
ENDIF ;(not) banked
IF HB_DEBUG
; << ****** Hardware Specific ****** >>
; << HBIOS Diagnostic Support >>
INCLUDE UTIL.Z80 ; << Routines >>
ELSE ; If Not Debug, Use these hooks
CSEG
PANIC: DI
HALT
ENDIF ; HB_DEBUG
PAGE
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; Core BIOS Code
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; Return BIOS Addresses
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
CSEG
RETBIO: LD BC,BIOSJT ; Get address of bios base
LD DE,CONFIG ; Point to configuration area
LD HL,DEVCFG ; Point to Char IO Device Table
LD A,VERS ; Return BIOS Version
RET
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; Return DPH Table Address
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
DRVTBL: LD HL,DPHTBL ; Point to DPH table
RET
PAGE
INCLUDE BYTEIO.Z80 ; Con:, aux:, lst: redirection
PAGE
INCLUDE SELRWD.Z80 ; Physical driver link for disks
PAGE
INCLUDE DEBLOCK.Z80 ; Hstbuf deblocker
PAGE
INCLUDE SECTRAN.Z80 ; Sector translation
PAGE
IF AUTOSL
INCLUDE SELFLP2.Z80 ; Floppy disk select
ELSE
INCLUDE SELFLP1.Z80
ENDIF ;AUTOSL
PAGE
INCLUDE FLOPPY.Z80 ; Hardware independent floppy routines
PAGE
; << ****** Hardware Specific ****** >>
INCLUDE FDC-WW.Z80 ; << This Driver is for HBIOS >>
PAGE
; << ****** Hardware Specific ****** >>
INCLUDE TIM-WW.Z80 ; << This Driver is for HBIOS >>
PAGE
IF HARDDSK ; << ****** Hardware Specific ****** >>
INCLUDE HARD-WW.Z80 ; << This Driver is for HBIOS >>
PAGE
ENDIF ;HARDDSK
; << ****** Hardware Specific ****** >>
; << Enter Warm Boot routines in >>
INCLUDE WBOOT-WW.Z80 ; << WBOOT-xx.Z80 >>
;.....
; Status bytes of general use placed at end of Data area
DSEG
HDONE: DEFS 1 ; HDC Flag 0=Ready, 1=Busy, 0FFH=Done
ERFLAG: DEFS 1 ; Disk Operation Error Code
DEFS 3 ; Reserved
IF [BANKED AND ZSDOS2]
COMMON /B2RAM/ ; Put this label in Banked Memory
ENDIF ;[BANKED AND ZSDOS2] ; ..else in Dseg
BRAME: DEFS 2 ; Use as dynamic sizing label for Hard Drive
; ALV buffers, and storage area for sizing.
; ALV Buffers build up from here in memory
CSEG
; Display warning if we are assembling for MOVCPM integration and the
; combined CSEG/Initialized DSEG size exceeds 1 or 2 Boot Records
PRINTX MACRO %NN
.printx %NN
ENDM
LIMIT EQU $-BIOSJT+INITCS
IF MOVCPM AND LIMIT > 4480
.printx
.printx **** BIOS too big (>4480) for Boot Tracks! ****
PRINTX %LIMIT
.printx
ELSE
IF MOVCPM AND LIMIT > 4352
.printx
.printx ++++ BIOS exceeds (>4352) 2-Sector Boot Record ++++
PRINTX %LIMIT
.printx
ENDIF ;IF MOVCPM AND LIMIT > 4352
ENDIF ;MOVCPM AND LIMIT > 4480
NSECTS EQU ($+INITCS-BIOSJT)/128+1
IF INROM
INCLUDE BOOTRAM.Z80
ENDIF ;INROM
IF HB_DEBUG
CSEG
XORG DEFL $
ORG 0
ORG_CSEG EQU $
ORG XORG
DSEG
XORG DEFL $
ORG 0
ORG_DSEG EQU $
ORG XORG
IF BANKED
COMMON /BANK2/
XORG DEFL $
ORG 0
ORG_BANK2 EQU $
ORG XORG
COMMON /B2RAM/
XORG DEFL $
ORG 0
ORG_B2RAM EQU $
ORG XORG
COMMON /RESVD/
XORG DEFL $
ORG 0
ORG_RESVD EQU $
ORG XORG
ENDIF ; BANKED
ENDIF ; HB_DEBUG
END