You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

604 lines
18 KiB

;*****************************************************************************
; 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
;
;+++++++++++++++++ D-X Designs Pty Ltd P112 Version ++++++++++++++++++
;
; This configuration of the B/P Bios is for Dave Brooks' Project 112 Single
; board computer. Multifunction chips on the board provide the services
; needed by a CP/M BIOS. The primary chips and the functions provided are:
;
; Zilog Z80182 Z180 Core CPU, MMU, DMA
; ESCC #1 COM1 Serial Port w/handshake signals, RS-232
; ESCC #2 (available on header, coded as expansion)
; ASCI0, ASCI1 (Serial async, available on header, expansion)
; CTC1 Optional 'heartbeat' clock, GP timer
;
; SMC FDC37C665 Enhanced 765-derivative Floppy Disk Controller
; COM2 - 16550-compatible Serial, RS-232
; PAR1 - Centronics Parallel port (Printer)
;
; Dallas DS-1202 Primary Realtime clock
; Non-volatile battery-backed RAM (config data)
;
; 28F256 Flash ROM Boot code, device initialization
; (onboard programmable)
; 32/128/512 KB Static RAM
;
; Ver Date Revision Description
; --- --------- ------------------------
; 1.3 28 Aug 01 - Scrubbed for GPL Release. HFB
; 1.2 - 30 Aug 97 - Expanded SCSI CDB length to 12 bytes for CDROM. HFB
; 1.1 - 11 May 97 - Added IDE Hard Drive instead of Normal SCSI, 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 DEF-xxxx.LIB definition >>
INCLUDE DEF-WW.LIB ; << file for your configuration. >>
; << ****** SYSTEM SPECIFIC ****** >>
; << Insert DEF-xxxx.LIB definition >>
INCLUDE ROMWBW.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
IF Z3
; MACLIB Z3BASE.LIB ; Include ENV definitions
IF CONF_T
MACLIB Z3BASET.LIB
ENDIF
IF CONF_N
MACLIB Z3BASEN.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 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 DIRDIO ; 31 Direct Disk I/O
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 DIRIO ; Low Level HDC/FDC Functions
JHDCIO: JP DIRIO ; 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 >>
; 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 ;not banked
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
IF FLOPY8
INCLUDE DPB-8.LIB ; If 8" or HD Floppy Disks can be handled,
ENDIF ; 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
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
;.list
IF RAMDSK
; << ****** Hardware Specific ****** >>
; << Insert DPB Info for RAM Disk >>
INCLUDE DPBM-WW.LIB ; << in file DPBM-xxx.LIB >>
ENDIF
PAGE
INCLUDE DPH.LIB ; Disk parameter headers
;.xlist
IF HARDDSK
INCLUDE DPHHD.LIB ; Insert DPH Info for Hard Disk Partitions
ENDIF
;.list
IF RAMDSK
INCLUDE DPHM.LIB ; Insert DPH Info for RAM Disk
ENDIF
.LIST
PAGE
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; Disk Driver Low - Level Function Links
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; Direct Disk I / O
; Call with: Function Number in C, Driver number in B,
; Args in A, DE, HL
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
CSEG
DIRDIO:
; CALL PRTSTRD
; DEFB '[DIRDIO',']$'
IF BANKED
CALL BIOSTK
CALL GOSYSB ; Bank in the system bank
JP JDIRIO ; And jump to Banked-BIOS function
COMMON /BANK2/
ENDIF
DIRIO: PUSH HL ; Save user's HL
PUSH AF ; ..and A reg for range checks
LD A,B
CP MAXDDA ; Legal Driver #?
JR NC,DIRIOX ; ..jump Error Exit if Not
PUSH BC
LD HL,DDIOTB
LD C,B ; Driver number
LD B,0
ADD HL,BC
ADD HL,BC ; Index into table
ADD HL,BC
LD A,(HL) ; Max call number
INC HL
LD C,(HL)
INC HL
LD H,(HL)
LD L,C ; Service vector table address in HL
POP BC ; Requested call
DEC A ; Correct Max Call # for Testing
JP M,DIRIOX ; ..jump Error exit if 0 --> FF (No Calls)
CP C ; Greater than Maximum Function?
JR C,DIRIOX ; ..jump Error exit if so
PUSH BC ; Else Save BC
LD B,0
ADD HL,BC
ADD HL,BC ; Add twice for Word index
LD B,(HL)
INC HL
LD H,(HL)
LD L,B ; Put vector in HL
POP BC ; Restore User's BC register
POP AF ; .Restore A and Flags
EX (SP),HL ; ..restore HL, Vector to TOS
RET ; Jump to Routine
DIRIOX: POP AF ; Clear stack
POP HL
OR 0FFH ; Set Error return
RET ; ..and quit
; Direct Disk Access Table Pointer Table
DDIOTB: DEFB 0
DEFW 00 ; No Driver 0
DEFB MAXFFN
DEFW FDFUNC ; 1 is Primary Floppy Driver
IF HARDDSK
DEFB MAXHFN
DEFW HDFUNC ; 2 is Primary Hard Disk Driver
ENDIF ;harddsk
IF [RAMDSK AND NOT HARDDSK]
DEFB 0
DEFW 00 ; (Dummy 2 if not installed)
ENDIF ;ramdsk and not harddsk
IF RAMDSK
DEFB 0
DEFW 00 ; 3 is Primary RAM Disk Driver (No Functions)
ENDIF ;ramdsk
MAXDDA EQU ($-DDIOTB)/3 ; Number of entries in pointer table
; Floppy Drive Function Table and Numbers
FDFUNC: DEFW STMODE ; 00 set mode
DEFW STSIZE ; 01 set drive size
DEFW STHDRV ; 02 set head and drive
DEFW STSECT ; 03 set sector #, size and eot
DEFW SPEC ; 04 specify srt, hlt, hut
DEFW RECAL ; 05 home the floppy
DEFW SEEK ; 06 seek track
DEFW SREAD ; 07 read
DEFW SWRITE ; 08 write
DEFW READID ; 09 read id
DEFW RETDST ; 10 return drive status & result ptr
DEFW FMTTRK ; 11 format a track
MAXFFN EQU [$-FDFUNC]/2
; Hard Disk Function Table and Numbers
IF HARDDSK
HDFUNC: DEFW HDVALS ; 00 Set Xfer Address, Return Interface Parms
DEFW HDSLCT ; 01 Select Device (& Logical Unit w/SCSI)
DEFW HD_RW ; 02 Direct Hard Disk Driver
MAXHFN EQU [$-HDFUNC]/2
ENDIF ;harddsk
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
MOVE: LDIR
RET
SETBNK:
SELMEM:
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
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
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
INCLUDE UTIL.Z80
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
PAGE
INCLUDE FLOPPY.Z80 ; Hardware independent floppy routines
PAGE
; << ****** Hardware Specific ****** >>
; << This Driver is for the Standard >>
INCLUDE FDC-WW.Z80 ; << MicroSystems (SMC) FDC37C665 >>
PAGE
; << ****** Hardware Specific ****** >>
; << Enter routines for your timer >>
INCLUDE TIM-WW.Z80 ; << and clock in TIM-xxxx.Z80 >>
PAGE
IF HARDDSK ; << ****** Hardware Specific ****** >>
IF SCSI ; << Enter driver routines for your >>
INCLUDE HARD-WW.Z80 ; << Hard Disk in HARD-xxx.Z80 >>
ENDIF
IF IDE
INCLUDE HARDIDE.Z80
ENDIF
IF SIMHDSK
INCLUDE HARDSIM.Z80
ENDIF
IF HBDSK
INCLUDE HARDHB.Z80
ENDIF
PAGE
ENDIF
IF RAMDSK ; << ****** Hardware Specific ****** >>
INCLUDE RAMD-WW.Z80 ; << Enter driver routines for RAM >>
PAGE ; << Disk in RAMD-xxx.Z80 >>
ENDIF
; << ****** Hardware Specific ****** >>
; << Enter Warm Boot routines in >>
INCLUDE WBOOT-WW.Z80 ; << WBOOT-xx.Z80 >>
; << ****** Hardware Specific ****** >>
; << HBIOS interface routines in >>
INCLUDE HBIOS.Z80 ; << HBIOS.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
; Add Character IO buffers here to insure they are at end of DSEG
IF BUFFA0 AND MORDEV AND NOT MOVCPM
COM4Q: DEFS 1 ; Char count in Queue
DEFS QSIZE ; 1 to 255 character type-ahead buffer
ENDIF
IF BUFFA1 AND MORDEV AND NOT MOVCPM
COM5Q: DEFS 1 ; Char count in Queue
DEFS QSIZE ; 1 to 255 character type-ahead buffer
ENDIF
IF (BUFFA0 OR BUFFA1) AND MORDEV AND NOT MOVCPM
DEFS 12 ; Stack for Buffered char IO routines
INTSP: DEFS 2 ; Storage for entry Stack Ptr
ENDIF
; Flags Bytes for Com1/Com2 Flow Control
IF XONOFF
COM1WT: DEFS 1 ; B7=0 - Output Ok, B7=1 - Output Stopped
COM2WT: DEFS 1 ; B0=0 - Input Ok, B0=1 - Input Halted
IF ESCC_B AND MORDEV AND NOT MOVCPM
COM3WT: DEFS 1 ; Flags for Expansion devices
ENDIF
IF ASCI_0 AND MORDEV AND NOT MOVCPM
COM4WT: DEFS 1
ENDIF
IF ASCI_1 AND MORDEV AND NOT MOVCPM
COM5WT: DEFS 1
ENDIF
ENDIF ;XonOff
PAOR: DEFS 1 ; Parallel Output Ready Flag
IF [BANKED AND ZSDOS2]
COMMON /B2RAM/ ; Put this label in Banked Memory
ENDIF ; ..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
ENDIF
NSECTS EQU ($+INITCS-BIOSJT)/128+1
IF INROM
INCLUDE BOOTRAM.Z80
ENDIF
END