home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
ENTERPRS
/
CPM
/
UTILS
/
S
/
ZEN2.LBR
/
BIOS85.ASM
< prev
next >
Wrap
Assembly Source File
|
2000-06-30
|
42KB
|
1,762 lines
TITLE 'CP/M-85 BIOS (8085 CODE PORTION) 10 MAR 83'
;***
;
; THIS IS THE 8085 CODED PORTION OF THE BIOS FOR CP/M-85.
; IT RESIDES IN THE FILE 'BIOS85.SYS'.
;
TRUE EQU 1
FALSE EQU 0
ASM86 EQU FALSE
REL0 EQU TRUE
;*** MACROS
;
;** EXTRA PSEUDO OPS FOR USE WITH MAC
;
RB MACRO A
DS A
ENDM
RW MACRO A
DS 2*A
ENDM
;*** EQUATES
;
;** Z-MACHINE MEMORY MAP UTILIZATION EQUATES
;
BOOTORG EQU 0400H ;BOOT CODE LOAD ADDRESS
BCODEL EQU 256+32 ;MAXIMUM BOOT CODE LENGTH
BLDR88 EQU BOOTORG+BCODEL ;BIOS LOADER (8088 PORTION)
BLDR88L EQU 64 ;MAXIMUM BIOS LOADER (8088) LENGTH
B88STK EQU 2*1024 ;8088 STACK AREA
B88DAT EQU B88STK ;MONITOR ROM DATA AREA START ADDR
BIOS88 EQU 4*1024 ;WHERE 8088 CODE OF BIOS WILL RESIDE
BLDRP0 EQU 16*1024 ;BIOS LOADER PAGE ZERO BIAS VALUE
IF REL0
BLOADER EQU 0000H ;WHERE BOOT CODE LOADS BIOS LOADER
ENDIF
IF NOT REL0
BLOADER EQU 0100H ;WHERE BOOT CODE LOADS BIOS LOADER
ENDIF
BLDR85L EQU 8*128-BCODEL-BLDR88L ;MAXIMUM BIOS LOADER (8085) LENGTH
BOOT85 EQU 0000H ;WHERE 8085 STARTS AFTER PROCESSOR SWAP
SWISWAP EQU 0FEH ;SWI FOR SWAPPING PROCESSORS
SWAPVEC EQU SWISWAP*4 ; VECTOR ADDRESS
BIAS EQU 0
;** CP/M-85 SYSTEM EQUATES
;
; OS VALUES
CCPL EQU 0800H ;LENGTH OF CCP
BDOSL EQU 0E00H ;LENGTH OF BDOS
; RESERVED LOCATIONS IN PAGE ZERO
ORG BIAS
BOOT RB 3 ;JUMP TO WARM START ENTRY
IOBYTE RB 1 ;IOBYTE
DFTDRV RB 1 ;CURRENT EFAULT DRIVE
BDOS RB 3 ;JUMP TO BDOS
INT1 RB 8 ;INTERRUPT LOCATION 1
INT2 RB 8 ;INTERRUPT LOCATION 2
INT3 RB 8 ;INTERRUPT LOCATION 3
INT4 RB 8 ;INTERRUPT LOCATION 4
INT5 RB 8 ;INTERRUPT LOCATION 5
INT6 RB 8 ;INTERRUPT LOCATION 6 (RESERVED)
INT7 RB 8 ;INTERRUPT LOCATION 7 (USED BY DDT)
BSCR RB 16 ;16 BYTE SCRATCH AREA FOR BIOS
RB 12 ;12 BYTES NOT USED BUT RESERVED
TFCB RB 36 ;TRANSIENT DEFAULT FCB
TFCB2 EQU TFCB+16 ;TRANSIENT 2ND FILENAME
TBUFF RB 128 ;DEFAULT DISK BUFFER
TPA RB 0 ;START OF TRANSIENT PROGRAM AREA
; HEATH PAGE ZERO LOCATIONS
IF ASM86
ORG OFFSET INT1+3
ENDIF
IF NOT ASM86
ORG INT1+3
ENDIF
TICCNT RW 2 ;32 BIT TIMER TIC COUNTER
TIMEFLG RB 1 ;TIMER 2 FLAG (0=RUNNING , 1=TIME OUT)
IF ASM86
ORG OFFSET INT2
ENDIF
IF NOT ASM86
ORG INT2
ENDIF
COMREG RB 0 ;BIOS88 COMMUNICATION REGION
COMFUNC RB 1 ; BIOS FUNCTION VALUE = (#-CBOOT)/3
COMRA RB 1 ; (A)
COMRBC RW 0 ; (BC)
COMRC RB 1 ; (C)
COMRB RB 1 ; (B)
COMRDE RW 0 ; (DE)
COMRE RB 1 ; (E)
COMRD RB 1 ; (D)
COMRHL RW 0 ; (HL)
COMRL RB 1 ; (L)
COMRH RB 1 ; (H)
COMWHO RB 1 ;WHICH PROCESSOR IS RUNNING
; ZPSPPS5 = 8085
; ZPSPPS8 = 8088
BDMAP EQU BSCR+00H ;DRIVE MAP (MAX OF 8 ENTRIES 0-7)
IF ASM86
BBIOS EQU WORD PTR BSCR+0EH ;TRUE ADDRESS FOR START OF BIOS
ENDIF
IF NOT ASM86
BBIOS EQU BSCR+0EH ;TRUE ADDRESS FOR START OF BIOS
ENDIF
; CP/M FUNCTIONS
RESET EQU 0 ;SYSTEM RESET
RDCON EQU 1 ;READ CONSOLE
WRCON EQU 2 ;WRITE CONSOLE
RDRDR EQU 3 ;READ READER
WRPUN EQU 4 ;WRITE PUNCH
WRLST EQU 5 ;WRITE LIST
DCONIO EQU 6 ;DIRECT CONSOLE I/O (2)
IOSTAT EQU 7 ;INTERROGATE I/O STATUS
ASTAT EQU 8 ;ALTER I/O STATUS
PRCONB EQU 9 ;PRINT CONSOLE BUFFER
RDCONB EQU 10 ;READ CONSOLE BUFFER
CCSTAT EQU 11 ;CHECK CONSOLE STATUS
LDH EQU 12 ;LIFT DISK HEAD
CPMVER EQU LDH ;GET CP/M VERSION (2)
RDS EQU 13 ;RESET DISK SYSTEM
SELDSK EQU 14 ;SELECT DISK
OPEN EQU 15 ;OPEN FILE
CLOSE EQU 16 ;CLOSE FILE
S1ST EQU 17 ;SEARCH FIRST
SNXT EQU 18 ;SEARCH NEXT
DELETE EQU 19 ;DELETE FILE
READ EQU 20 ;READ RECORD
WRITE EQU 21 ;WRITE RECORD
CREATE EQU 22 ;CREATE FILE
RENAME EQU 23 ;RENAME FILE
ILOG EQU 24 ;INTERROGATE LOGIN
IDSK EQU 25 ;INTERROGATE DISK
SETDMA EQU 26 ;SET DMA ADDRESS
IALLOC EQU 27 ;INTERROGATE ALLOCATION
WPD EQU 28 ;WRITE PROTECT DISK
GROV EQU 29 ;GET READ/ONLY VECTOR
SFA EQU 30 ;SET FILE ATTRIBUTES
GADPB EQU 31 ;GET ADDR OF DPB
SGUSR EQU 32 ;SET/GET USER CODE
READRR EQU 33 ;READ RANDOM RECORD
WRITERR EQU 34 ;WRITE RANDOM RECORD
CFSIZE EQU 35 ;COMPUTE FILE SIZE
SRR EQU 36 ;SET RANDOM RECORD
RESDRV EQU 37 ;RESET DRIVE
WRITERZ EQU 40 ;WRITE RANDOM WITH ZERO FILL
; BIOS ENTRY POINTS.
; GIVEN AS DISPLACEMENTS FROM WARM BOOT ENTRY POINT WHOSE
; ADDRESS IS USUALLY AT LOCATION BOOT+1.
; TO COMPUTE DISPLACEMENTS FROM VALUE STORED AT 'BBIOS'
; SUBTRACT 'CBOOT'. EG. DISPLACEMENT FOR WARM BOOT = WBOOT-CBOOT
CBOOT EQU -0003H ;COLD BOOT
WBOOT EQU 0000H ;WARM BOOT
CONST EQU 0003H ;CONSOLE STATUS
CONIN EQU 0006H ;CONSOLE INPUT
CONOUT EQU 0009H ;CONSOLE OUTPUT
LSTOUT EQU 000CH ;LIST OUTPUT
PUNOUT EQU 000FH ;PUNCH OUTPUT
RDRIN EQU 0012H ;READER INPUT
HOME EQU 0015H ;HOME DISK
SETDSK EQU 0018H ;SET (SELECT) DISK DRIVE
SETTRK EQU 001BH ;SET TRACK NUMBER
SETSEC EQU 001EH ;SET SECTOR NUMBER
SDMA EQU 0021H ;SET DMA ADDRESS
BREAD EQU 0024H ;READ SELECTED SECTOR
BWRITE EQU 0027H ;WRITE SELECTED SECTOR
BLSTST EQU 002AH ;CHECK LIST DEVICE STATUS
BSECTRN EQU 002DH ;SECTOR TRANSLATE ROUTINE
BFMT EQU 0030H ;FORMAT
BRDTRK EQU 0033H ;READ TRACK
BWRTRK EQU 0036H ;WRITE TRACK
BWPC EQU 0039H ;WRITE PROTECT CHECK
BCBD EQU 003CH ;CLEAR BUFFERS FOR DRIVE
; BIOS WRITE TYPES
BWRNOR EQU 0 ;NORMAL WRITE
BWRDIR EQU 1 ;WRITE TO A DIRECTORY SECTOR
BRWUA1 EQU 2 ;WRITE TO 1ST SECTOR OF UNALLOC BLOCK
; FILE CONTROL BLOCK
ORG 0
FCBDN RB 1 ;DISK NAME
FCBFN RB 8 ;FILE NAME
FCBFNL EQU 8 ;FILE NAME LENGTH
FCBFT RB 3 ;FILE TYPE
FCBFTL EQU 3 ;FILE TYPE LENGTH
FCBRO EQU FCBFT+0 ;R/O FLAG
FCBROF EQU 10000000B ; R/O FLAG VALUE
FCBSYS EQU FCBFT+1 ;SYS FLAG
FCBSYSF EQU 10000000B ; SYS FLAG VALUE
FCBEX RB 1 ;EXTENT
RB 1
FCBRWF RB 1 ;R/W FLAG
FCBRWFF EQU 10000000B ; R/W FLAG VALUE
FCBRC RB 1 ;RECORD COUNT
FCBDM RB 16 ;DISK ALLOCATION MAP
FCBNR RB 1 ;NEXT RECORD TO BE READ OR WRITTEN
FCBLS EQU 33 ;FCB LENGTH FOR SEQUENTIAL I/O
FCBRR RB 3 ;RANDOM RECORD POINTER
FCBLR EQU 36 ;FCB LENGTH FOR RANDOM I/O
;** CHARACTER I/O TABLE DEFINITIONS
;
ORG 0
; TABLE
CIOTBL RB 0
CIOBP RB 1 ;BASE PORT
CIOBR RW 1 ;BAUD RATE
CIOF1 RB 1 ;FLAG BYTE 1
CIOF2 RB 1 ;FLAG BYTE 2
CIOIM RB 1 ;INPUT READY MASK
CIOIPM RB 1 ;INPUT READY POLARITY MASK
CIOOM RB 1 ;OUTPUT READY MASK
CIOOPM RB 1 ;OUTPUT READY POLARITY MASK
CIOECNT RB 1 ;# OF CHARACTERS BEFORE SENDING <ETX>
CIOECTR RB 1 ;CHARACTER COUNTER FOR SENDING <ETX>
CIONCHR RB 1 ;SEND NULLS AFTER THIS CHARACTER
CIONCNT RB 1 ;# OF NULLS TO SEND
CIONCTR RB 1 ;NULL COUNTER
CIOVAL1 RB 1 ;DEVICE DEPENDANT VALUE 1
CIOVAL2 RB 1 ;DEVICE DEPENDANT VALUE 2
CIOVAL3 RB 1 ;DEVICE DEPENDANT VALUE 3
CIOVAL4 RB 1 ;DEVICE DEPNEDANT VALUE 4
CIOVAL5 RB 1 ;DEVICE DEPENDANT VALUE 5
CIOVAL6 RB 1 ;DEVICE DEPENDANT VALUE 6
CIOVAL7 RB 1 ;DEVICE DEPENDANT VALUE 7
CIOVAL8 RB 1 ;DEVICE DEPENDANT VALUE 8
CIOIN RW 1 ;ADDRESS OF DEVICE INIT ROUTINE
CIOIS RW 1 ;ADDRESS OF INPUT INPUT STATUS ROUTINE
CIOID RW 1 ;ADDRESS OF INPUT DATA ROUTINE
CIOOS RW 1 ;ADDRESS OF INPUT OUTPUT STATUS ROUTINE
CIOOD RW 1 ;ADDRESS OF OUTPUT DATA ROUTINE
IF ASM86
CIOTBLL EQU OFFSET $-OFFSET CIOTBL ;LENGTH OF CIO TABLE
ENDIF
IF NOT ASM86
CIOTBLL EQU $-CIOTBL ;LENGTH OF CIO TABLE
ENDIF
; FLAG BYTE 1
CIOSPI EQU 00000001B ;STRIP PARITY BIT ON INPUT
CIOSPO EQU 00000010B ;STRIP PARITY BIT ON OUTPUT
CIOMLI EQU 00000100B ;MAP LOWER CASE ON INPUT
CIOMLO EQU 00001000B ;MAP LOWER CASE ON OUTPUT
CIOEAH EQU 00010000B ;USE <ETX>/<ACK> HANDSHAKING
CIODCH EQU 00100000B ;USE <DC1>/<DC3> HANDSHAKING
; FLAG BYTE 2
CIOW4A EQU CIOEAH ;<ETX> SENT, WAITING FOR <ACK>
CIOW4D EQU CIODCH ;WAITING FOR <DC1>
;** DEFINITION OF LOCATIONS AT THE HEAD OF THE BIOS FOR CP/M-85
;
; * * * N O T E * * *
;
; IF THE BIOS IS ALTERED, THEN THIS FILE MUST ALSO BE UPDATED.
;
BVERSN EQU 101 ;VERSION # FOR CURRENT BIOS
; USE THIS EQUATE IN USER PROGRAMS
; THAT WISH TO KNOW VERSION #
; THEY WERE ASSEMBLED FOR
BREVSN EQU ' ' ;REVISION LETTER
BMO EQU 03 ;DATE
BDY EQU 10
BYR EQU 83
NDRIVES EQU 6 ;MAXIMUM NUMBER OF DRIVE TABLES
;
ORG 0042H ;SKIP BIOS JUMP VECTOR CODE
BIOSVER RB 1 ;BIOS VERSION
DEFIOB RB 1 ;DEFAULT I/O BYTE
MODE RB 1 ;MODE FLAGS BYTE
BSIZE RB 1 ;BIOS SIZE IN PAGES
BEND RW 1 ;ENDING ADDR OF BIOS + 1
HECNT RW 1 ;HARD ERROR COUNT (SINCE COLD BOOT)
SECNT RW 1 ;SOFT ERROR COUNT (SINCE COLD BOOT)
NDISKS RB 1 ;NUMBER OF DISK POSSIBLE IN THIS BIOS
; AUTO EXEC COMMAND BUFFERS
AUTOCBC RB 41 ;COLD BOOT AUTO COMMAND
AUTOWBC RB 41 ;WARM BOOT AUTO COMMAND
; CHARACTER I/O TABLES
CRTTBL RB CIOTBLL ;CRT: (KEYBOARD/DISPLAY)
SERATBL RB CIOTBLL ;SERIAL PORT A
SERBTBL RB CIOTBLL ;SERIAL PORT B
PPRTTBL RB CIOTBLL ;PARALLEL PRINTER PORT
DUMMYTBL RB CIOTBLL ;DUMMY UNIT
; DISK PARAMETER ENTRY TABLES
DPEBASE RB 0 ;START OF DISK PARAMETER ENTRY TABLES
;** 6821 PERIPHERAL INTERFACE ADAPTER EQUATES
;
; REGISTER DISPLACEMENTS
PIADATA EQU 0 ;PERIPHERAL DATA REGISTER A
PIADDRA EQU 0 ;DATA DIRECTION REGISTER A
PIACTLA EQU 1 ;CONTROL REGISTER A
PIADATB EQU 2 ;PERIPHERAL DATA REGISTER B
PIADDRB EQU 2 ;DATA DIRECTION REGISTER B
PIACTLB EQU 3 ;CONTROL REGISTER B
; CONTROL WORD FORMAT
PIAC1 EQU 00000011B ;CONTROL OF CA1(CB1) INTERRUPT LINE
PIAC10 EQU 00H ; ACTIVE TRANSITION 1->0
; IRQ PIN IS DISABLED
PIAC11 EQU 01H ; ACTIVE TRANSITION 1->0
; IRQ PIN IS ENABLED
PIAC12 EQU 02H ; ACTIVE TRANSITION 0->1
; IRQ PIN IS DISABLED
PIAC13 EQU 03H ; ACTIVE TRANSITION 0->1
; IRQ PIN IS ENABLED
PIADDAC EQU 00000100B ;DATA DIRECTION ACCESS CONTROL BIT
; 0=DATA DIRECTION REG , 1=PERIPHERAL DATA REG
PIAC2 EQU 00111000B ;CONTROL OF CA2(CB2)
; INPUT MODES
PIAC20 EQU 00H ; ACTIVE TRANSITION 1->0
; IRQ PIN IS DISABLED
PIAC21 EQU 08H ; ACTIVE TRANSITION 1->0
; IRQ PIN IS ENABLED
PIAC22 EQU 10H ; ACTIVE TRANSITION 0->1
; IRQ PIN IS DISABLED
PIAC23 EQU 18H ; ACTIVE TRANSITION 0->1
; IRQ PIN IS ENABLED
; OUTPUT MODES
PIAC24 EQU 20H ; 0 ON R(W) OPERATION , 1 ON ACTIVE CA1(CB1)
PIAC25 EQU 28H ; 0 ON R(W) OPERATION , 1 ON E AFTER DESELECT
PIAC26 EQU 30H ; RESET
PIAC27 EQU 38H ; SET
PIAIRQ2 EQU 01000000B ;IRQ FOR CA2(CB2)
PIAIRQ1 EQU 10000000B ;IRQ FOR CA1(CB1)
;** EP2DEF -- EQUATES FOR ENHANCED PROGRAMMABLE COMMUNICATION
; INTERFACE CHIP 2661-2.
;
; PORT DISPLACEMENTS
EPDATA EQU 0 ;DATA
EPSTAT EQU 1 ;STATUS
EPSYN EQU 1 ;SYN1/SYN2/DLE
EPMODE EQU 2 ;MODE
EPCMD EQU 3 ;COMMAND
; STATUS REGISTER
EPTXR EQU 00000001B ;TRANSMITTER READY
EPRXR EQU 00000010B ;RECEIVER READY
EPTXE EQU 00000100B ;TRANSMITTER EMPTY
EPDSC EQU 00000100B ;DATA SET CHANGE
EPPE EQU 00001000B ;PARITY ERROR
EPOE EQU 00010000B ;OVERRUN ERROR
EPFE EQU 00100000B ;FRAME ERROR
EPSD EQU 00100000B ;SYNC DETECTED
EPDCD EQU 01000000B ;DATA CARRIER DETECT
EPDSR EQU 10000000B ;DATA SET READY
; MODE REGISTER 1
EPMBRF EQU 00000011B ;MODE AND BAUDRATE FACTOR
EPS1X EQU 000H ; SYNCHRONOUS 1X RATE
EPA1X EQU 001H ; ASYNCHRONOUS 1X RATE
EPA16X EQU 002H ; ASYNCHRONOUS 16X RATE
EPA64X EQU 003H ; ASYNCHRONOUS 64X RATE
EPCL EQU 00001100B ;CHARACTER LENGTH
EPCL5 EQU 000H ; LENGTH 5
EPCL6 EQU 004H ; LENGTH 6
EPCL7 EQU 008H ; LENGTH 7
EPCL8 EQU 00CH ; LENGTH 8
EPPC EQU 00010000B ;PARITY CONTROL (0=DISABLED , 1=ENABLED)
EPPT EQU 00100000B ;PARITY TYPE (0=ODD , 1=EVEN)
EPASBL EQU 11000000B ;ASYNCHRONOUS STOP BIT LENGTH
EPSB1 EQU 040H ; LENGTH 1
EPSB15 EQU 080H ; LENGTH 1.5
EPSB2 EQU 0C0H ; LENGTH 2
EPSTC EQU 01000000B ;SYNCHRONOUS TRANSPARENCY CONTROL
; (0=NORMAL , 1=TRANSPARENT)
EPNSC EQU 10000000B ;NUMBER OF SYNC CHARACTERS
; (0=DOUBLE , 1=SINGLE)
; MODE REGISTER 2
EPBRS EQU 00001111B ;BAUD RATE SELECTION
EPMR2U EQU 11110000B ;SEE TEXT
; COMMAND REGISTER
EPTXEN EQU 00000001B ;TRANSMITTER ENABLE
EPDTR EQU 00000010B ;DATA TERMINAL READY
EPRXEN EQU 00000100B ;RECEIVER ENABLE
EPSBRK EQU 00001000B ;SEND BREAK (ASYNC)
EPSDLE EQU 00001000B ;SEND DLE (SYNC)
EPRESE EQU 00010000B ;RESET STATUS ERRORS
EPRTS EQU 00100000B ;REQUEST TO SEND
EPOM EQU 11000000B ;OPERATING MODE
EPNORM EQU 000H ; NORMAL
EPOM1 EQU 040H ; MODE 1
EPOMLL EQU 080H ; LOCAL LOOP BACK
EPOMRL EQU 0C0H ; REMOTE LOOP BACK
; BAUDRATE SELECTION VALUES
EPB455 EQU 0 ;45.5
EPB050 EQU 1 ;50
EPB075 EQU 2 ;75
EPB110 EQU 3 ;110
EPB134 EQU 4 ;134.5
EPB150 EQU 5 ;150
EPB300 EQU 6 ;300
EPB600 EQU 7 ;600
EPB120 EQU 8 ;1200
EPB180 EQU 9 ;1800
EPB200 EQU 10 ;2000
EPB240 EQU 11 ;2400
EPB480 EQU 12 ;4800
EPB960 EQU 13 ;9600
EPB192 EQU 14 ;19200
EPB384 EQU 15 ;38400
;** Z207 EQUATES
;
; PORT ASSIGNMENTS
FDBASE EQU 0B0H ;BASE PORT ADDRESS
FDCMD EQU FDBASE ;1797 COMMAND REGISTER
FDSTA EQU FDBASE ; STATUS REGISTER
FDTRK EQU FDBASE+1 ; TRACK REGISTER
FDSEC EQU FDBASE+2 ; SECTOR REGISTER
FDDAT EQU FDBASE+3 ; DATA REGISTER
FDCON EQU FDBASE+4 ;DISK CONTROL PORT
FDAS EQU FDBASE+5 ;AUX STATUS PORT
; COMMANDS
FDCRST EQU 000H ;RESTORE
FDCSEK EQU 010H ;SEEK
FDCSTP EQU 020H ;STEP
FDCSTI EQU 040H ;STEP IN
FDCSTO EQU 060H ;STEP OUT
FDCRDS EQU 080H ;READ SECTOR
FDCWRS EQU 0A0H ;WRITE SECTOR
FDCRDA EQU 0C0H ;READ ADDRESS
FDCRDT EQU 0E0H ;READ TRACK
FDCWRT EQU 0F0H ;WRITE TRACK
FDCFI EQU 0D0H ;FORCE INTERRUPT
; TYPE 1 COMMAND FLAGS
FDFUTR EQU 00010000B ;UPDATE TRACK REGISTER
FDFHLB EQU 00001000B ;HEAD LOAD AT BEGINNING
FDFVRF EQU 00000100B ;VERIFY FLAGS
; TYPE 1 COMMAND STEP RATE FLAGS
FDFSRM EQU 00000011B ;STEP RATE MASK
FDFS6 EQU 00000000B ;STEP RATE 6(3) MS
FDFS12 EQU 00000001B ; 12(6)
FDFS20 EQU 00000010B ; 20(10)
FDFS30 EQU 00000011B ; 30(15)
; TYPE 2&3 COMMAND FLAGS
FDFMRF EQU 00010000B ;MULTIPLE RECORD FLAG
FDFSLF EQU 00001000B ;SECTOR LENGTH FLAG
FDFDLF EQU 00000100B ;30 MS DELAY
FDFSS1 EQU 00000010B ;SELECT SIDE 1
FDFDDM EQU 00000001B ;DELETED DATA MARK
; TYPE 4 COMMAND FLAGS
FDFINI EQU 00000000B ;TERMINATE WITH NO INTERRUPT
FDFII0 EQU 00000001B ;NOT READY TO READY TRANSITION
FDFII1 EQU 00000010B ;READY TO NOT READY TRANSITION
FDFII2 EQU 00000100B ;INDEX PULSE
FDFII3 EQU 00001000B ;IMMEDIATE INTERRUPT
; STATUS FLAGS
FDSNRD EQU 10000000B ;NOT READY
FDSWPV EQU 01000000B ;WRITE PROTECT VIOLATION
FDSHLD EQU 00100000B ;HEAD IS LOADED
FDSRTE EQU 00100000B ;RECORD TYPE
FDSWTF EQU 00100000B ;WRITE FAULT
FDSSEK EQU 00010000B ;SEEK ERROR
FDSRNF EQU 00010000B ;RECORD NOT FOUND
FDSCRC EQU 00001000B ;CRC ERROR
FDSTK0 EQU 00000100B ;FOUND TRACK 0
FDSLDT EQU 00000100B ;LOST DATA
FDSIND EQU 00000010B ;INDEX HOLE
FDSDRQ EQU 00000010B ;DRQ
FDSBSY EQU 00000001B ;BUSY
; INFO RETURNED BY A READ ADDRESS COMMAND
FDRATRK EQU 0 ;TRACK
FDRASID EQU 1 ;SIDE
FDRASEC EQU 2 ;SECTOR
FDRASL EQU 3 ;SECTOR LENGTH
FDRACRC EQU 4 ;2 BYTE CRC
FDRAL EQU 6 ;LENGTH OF READ ADDRESS INFO
; DISK HEADER SECTOR LENGTH VALUES
FDSL128 EQU 0 ;SECTOR LENGTH 128
FDSL256 EQU 1 ;SECTOR LENGTH 256
FDSL512 EQU 2 ;SECTOR LENGTH 512
FDSL1K EQU 3 ;SECTOR LENGTH 1024
; CONTROL REGISTER FLAGS
CONDS EQU 00000011B ;DRIVE SELECT BITS
CONDS8 EQU 00000100B ;0=5 1/4" , 1=8"
CONDSEN EQU 00001000B ;DRIVE SELECT ENABLE
CONPC EQU 00010000B ;WRITE PRE-COMPENSATION
; 5 1/4" 0=YES , 1=NO
; 8" 0=ALL TRACKS , 1=TRACKS 44-76
CON5FS EQU 00100000B ;5 1/4" FAST STEP
CONWE EQU 01000000B ;ENABLE WAIT FOR DRQ OR IRQ
CONSD EQU 10000000B ;ENABLE SINGLE DENSITY
; AUXILARY STATUS REGISTER FLAGS
ASIRQ EQU 00000001B ;1797 INTERRUPT REQUEST
ASMO EQU 00000010B ;5 1/4" MOTOR ON
AS96T EQU 00001000B ;5 1/4" DRIVES ARE 96TPI
AS5PC EQU 00010000B ;5 1/4" DRIVES NEED WRITE PRE-COMPENSATION
AS2S EQU 01000000B ;SELECTED 8" DRIVE CONTAINS 2 SIDED MEDIA
ASDRQ EQU 10000000B ;1797 DRQ
; MISCELLANEOUS VALUES
NTRKS37 EQU 40 ;# TRACKS SINGLE DENSITY 5 1/4" (48 TPI)
NTRKD37 EQU 80 ;# TRACKS DOUBLE DENSITY 5 1/4" (96 TPI)
NTRK837 EQU 77 ;NUMBER OF TRACKS 8"
NSBT37 EQU 52 ;NUMBER OF CP/M RECORDS TO BE LOADED AT BOOT
;** Z217 EQUATES
;
WINSPT EQU 18 ;# PHYSICAL SECTORS PER TRACK
WICSZ EQU 512 ;CELL SIZE USED
;* PORT ASSIGNMENTS
WIPBASE EQU 0AEH ;BASE PORT
WIPCMD EQU WIPBASE+0 ; COMMAND
WIPSTAT EQU WIPBASE+0 ; HARDWARE STATUS
WIPRES EQU WIPBASE+1 ; RESET
WIPINTA EQU WIPBASE+1 ; INTERRUPT ACKNOWLEDGE/HARDWARE STATUS
;* HARDWARE STATUS REGISTER
WISINT EQU 10000000B ;INTERRUPT PENDING
WISBUSY EQU 01000000B ;BUSY
WISBM EQU 00100000B ;BURST MODE
WISTMA EQU 00010000B ;TMA IN PROGRESS
WISERR EQU 00001000B ;ERROR
WISIERR EQU 00000100B ;IMMEDIATE MODE ERROR
WISPAUS EQU 00000010B ;PAUSED
WISDONE EQU 00000001B ;DONE
;* DIRECT MODE COMMANDS
WISETUP EQU 08H ;SETUP
WIEXEC EQU 10H ;EXECUTE
WIPAUS EQU 18H ;PAUSE
WICONT EQU 20H ;CONTINUE
;* CONTROL BLOCK COMMANDS
WIRECAL EQU 00H ;RECALIBRATE
WISTAT EQU 01H ;STATUS
WIWRL EQU 10H ;WRITE LOGICAL
WIRDL EQU 11H ;READ LOGICAL
WISEKL EQU 13H ;SEEK LOGICAL
WIFMTD EQU 20H ;FORMAT DRIVE
WIFMTT EQU 21H ;FORMAT TRACK
WISDP EQU 22H ;SET DRIVE PARAMETERS
WIWRA EQU 30H ;WRITE ABSOLUTE
WIRDA EQU 31H ;READ ABSOLUTE
WISEKA EQU 33H ;SEEK ABSOLUTE
;* FORMAT OF COMMANDS
; TYPE 0 & 1
ORG 0
WI01BLK RB 0
WI01OP RB 1 ;COMMAND OP CODE
WI01DHS RB 1 ;BIT 7-5 -- DRIVE SELECT
; 4-0 -- HIGH BYTE OF LOG SECTOR #
WI01D EQU 11100000B ; DRIVE SELECT MASK
WI01HS EQU 00011111B ; HIGH BYTE OF LOG SECTOR # MASK
WI01MS RB 1 ;MIDDLE BYTE OF LOGICAL SECTOR #
WI01LS RB 1 ;LOW BYTE OF LOGICAL SECTOR #
WI01SC RB 1 ;SECTOR COUNT
WI01HT RB 1 ;HIGH BYTE OF DATA TMA ADDRESS
WI01MT RB 1 ;MIDDLE BYTE OF DATA TMA ADDRESS
WI01LT RB 1 ;LOW BYTE OF DATA TMA ADDRESS
WI01HN RB 1 ;HIGH BYTE OF NEXT COMMAND ADDRESS
WI01MN RB 1 ;MIDDLE BYTE OF NEXT COMMAND ADDRESS
WI01LN RB 1 ;LOW BYTE OF NEXT COMMAND ADDRESS
WI01FLG RB 1 ;FLAGS
WI01EEC RB 1 ;ERROR CODE
WI01EDH RB 1 ;BIT 7-5 -- DRIVE SELECT
; 4-0 -- HIGHT BYTE OF LOG SECTOR #
WI01ED EQU 11100000B ; ERROR DRIVE SELECT MASK
WI01EHS EQU 00011111B ; ERROR HIGH BYTE OF LOG SECTOR # MASK
WI01EMS RB 1 ;ERROR MIDDLE BYTE OF LOGICAL SECTOR #
WI01ELS RB 1 ;ERROR LOW BYTE OF LOGICAL SECTOR #
IF ASM86
WI01BKL EQU OFFSET $ - OFFSET WI01BLK
ENDIF
IF NOT ASM86
WI01BKL EQU $-WI01BLK
ENDIF
IF WI01BKL NE 16
%: TYPE 0 & 1 COMMAND BLOCK IS WRONG LENGTH
ENDIF
; TYPE 2
ORG 0
WI2BLK RB 0
WI2OP RB 1 ;COMMAND OP CODE
WI2DH RB 1 ;BIT 7-5 -- DRIVE SELECT
; 2-0 -- (MAX) HEAD #
WI2D EQU 11100000B ; DRIVE SELECT MASK
WI2H EQU 00000111B ; HEAD # MASK
WI2HMC RB 1 ;HIGH BYTE OF MAX CYLINDER #
WI2LMC RB 1 ;LOW BYTE OF MAX CYLINDER #
WI2HRWC RB 1 ;HIGH BYTE OF RWC CYLINDER #
WI2LRWC RB 1 ;LOW BYTE OF RWC CYLINDER #
WI2HPC RB 1 ;HIGH BYTE OF PRE-COMP CYLINDER #
WI2LPC RB 1 ;LOW BYTE OF PRE-COMP CYLINDER #
WI2SR RB 1 ;STEP RATE (LSB = 20uS)
WI2ECC RB 1 ;ECC SPAN
WI2CSIF RB 1 ;BIT 6 -- CELL SIZE
; 4-0 -- INTERLEAVE FACTOR
WI2CS EQU 01000000B ; CELL SIZE MASK
WI2CS5 EQU 00000000B ; CELL SIZE = 512 BYTES/LOG SECTOR
WI2CS1K EQU 01000000B ; CELL SIZE = 1024 BYTES/LOG SECTOR
WI2IF EQU 00011111B ; INTERLEAVE FACTOR MASK
WI2FC RB 1 ;FILL CHARACTER
WI2EEC RB 1 ;ERROR CODE
WI2EHS RB 1 ;BIT 7-5 -- ERROR HEAD #
; 4-0 -- ERROR SECTOR #
WI2EH EQU 11100000B ; ERROR HEAD # MASK
WI2ES EQU 00011111B ; ERROR SECTOR # MASK
WI2EHC RB 1 ;ERROR HIGH BYTE OF CYLINDER #
WI2ELC RB 1 ;ERROR LOW BYTE OF CYLINDER #
IF ASM86
WI2BLKL EQU OFFSET $ - OFFSET WI2BLK
ENDIF
IF NOT ASM86
WI2BLKL EQU $-WI2BLK
ENDIF
IF WI2BLKL NE 16
%: TYPE 2 COMMAND BLOCK IS WRONG LENGTH
ENDIF
; TYPE 3
ORG 0
WI3BLK RB 0
WI3OP RB 1 ;COMMAND OP CODE
WI3DH RB 1 ;BIT 7-5 -- DRIVE SELECT
; 2-0 -- HEAD #
WI3D EQU 11100000B ; DRIVE SELECT MASK
WI3H EQU 00000111B ; HEAD # MASK
WI3HC RB 1 ;HIGH BYTE OF CYLINDER #
WI3LC RB 1 ;LOW BYTE OF CYLINDER #
WI3S RB 1 ;SECTOR #
WI3HT RB 1 ;HIGH BYTE OF DATA TMA ADDRESS
WI3MT RB 1 ;MIDDLE BYTE OF DATA TMA ADDRESS
WI3LT RB 1 ;LOW BYTE OF DATA TMA ADDRESS
WI3HN RB 1 ;HIGH BYTE OF NEXT COMMAND ADDRESS
WI3MN RB 1 ;MIDDLE BYTE OF NEXT COMMAND ADDRESS
WI3LN RB 1 ;LOW BYTE OF NEXT COMMAND ADDRESS
WI3FLG RB 1 ;FLAGS
WI3EEC RB 1 ;ERROR CODE
WI3EHS RB 1 ;BIT 7-5 -- ERROR HEAD #
; 4-0 -- ERROR SECTOR #
WI3EH EQU 11100000B ; ERROR HEAD # MASK
WI3ES EQU 00011111B ; ERROR SECTOR # MASK
WI3EHC RB 1 ;ERROR HIGH BYTE OF CYLINDER #
WI3ELC RB 1 ;ERROR LOW BYTE OF CYLINDER #
IF ASM86
WI3BLKL EQU OFFSET $ - OFFSET WI3BLK
ENDIF
IF NOT ASM86
WI3BLKL EQU $-WI3BLK
ENDIF
IF WI3BLKL NE 16
%: TYPE 3 COMMAND BLOCK IS WRONG LENGTH
ENDIF
; COMMAND BLOCK FLAG BYTE
WIFINTE EQU 10000000B ;INTERRUPTS ENABLED
WIFBM EQU 01000000B ;USE BURST MODE TMA
WIFIPCC EQU 00100000B ;IGNORE PAUSE AND CONTINUE COMMANDS
WIFIDR EQU 00000100B ;DISABLE RETRIES
WIFDECC EQU 00000010B ;DISABLE ECC
WIFCHN EQU 00000001B ;CHAIN NEXT COMMAND IMMEDIATELY
;* FORMAT OF STATUS RETURNED BY 01 COMMAND
ORG 0
WISBLK RB 0
WISFLG RB 1 ;FLAG BYTE
WISDR EQU 00000100B ; BIT 2 -- DRIVE READY
WISACC EQU 00000010B ; 1 -- ACCESSED
WISSC EQU 00000001B ; 0 -- SEEK COMPLETE
WISHMC RB 1 ;HIGH BYTE OF MAX CYLINDER #
WISLMC RB 1 ;LOW BYTE OF MAX CYLINDER #
WISHRWC RB 1 ;HIGH BYTE OF RWC CYLINDER #
WISLRWC RB 1 ;LOW BYTE OF RWC CYLINDER #
WISHPC RB 1 ;HIGH BYTE OF PRE-COMP CYLINDER #
WISLPC RB 1 ;LOW BYTE OF PRE-COMP CYLINDER #
WISHCC RB 1 ;HIGH BYTE OF CURRENT CYLINDER #
WISLCC RB 1 ;LOW BYTE OF CURRENT CYLINDER #
WISSR RB 1 ;STEP RATE (LSB = 20uS)
RB 1 ;RESERVED
WISIF RB 1 ;INTERLEAVE FACTOR
WISCS RB 1 ;CELL SIZE
WISCS5 EQU 1 ; = 512 BYTES/LOG SECTOR
WISCS1K EQU 2 ; = 1024 BYTES/LOG SECTOR
WISMH RB 1 ;MAX HEAD #
WISFC RB 1 ;FILL CHARACTER
RB 1 ;RESERVED
IF ASM86
WISBLKL EQU OFFSET $ - OFFSET WISBLK
ENDIF
IF NOT ASM86
WISBLKL EQU $-WISBLK
ENDIF
IF WISBLKL NE 16
%: STATUS BLOCK IS WRONG LENGTH
ENDIF
;* ERROR CODES
WIENE EQU 00H ;NO ERROR
WIEDNR EQU 01H ;DRIVE NOT READY
WIENSC EQU 02H ;NO SEEK COMPLETE
WIENT0 EQU 03H ;NO TRACK 0
WIENI EQU 04H ;NO INDEX
WIENDS EQU 05H ;NO DRIVE SELECT
WIEHNF EQU 10H ;HEADER ADDRESS MARK NOT FOUND
WIESEK EQU 11H ;SEEK ERROR (BAD CYLINDER # IN HEADER)
WIESNF EQU 12H ;SECTOR NOT FOUND
WIEECCH EQU 13H ;ECC ERROR IN HEADER
WIEDNF EQU 14H ;DATA ADDRESS MARK NOT FOUND
WIENECC EQU 15H ;NONCORRECTABLE ECC ERROR IN DATA FIELD
WIEECC EQU 16H ;CORRECTABLE ECC ERROR IN DATA FIELD
WIEWF EQU 17H ;WRITE FAULT
WIEIOP EQU 20H ;ILLEGAL OP CODE
WIEIDA EQU 21H ;ILLEGAL DISK ADDRESS
WIEFMTP EQU 22H ;FORMAT PROTECTED
WIEWRP EQU 23H ;WRITE PROTECTED
WIEMISC EQU 30H ;MISCELLANEOUS ERROR
WIEDIAG EQU 40H ;ERROR DURING DIAGNOSTIC
WIEPNA EQU 80H ;PARTION NOT ASSIGNED
WIESNWP EQU 81H ;SECTOR NOT WITHIN PARTITION
;* CP/M RELATED VALUES
WIRPS EQU WICSZ/128 ;CP/M RECORDS PER SECTOR
WIRPT EQU WIRPS*WINSPT ;CP/M RECORDS PER TRACK
WINST EQU 1 ;# OF SYSTEM TRACKS
WINSYS EQU WINST*WINSPT ;# SECTORS IN SYSTEM TRACK(S)
WIMIN EQU 1024/WICSZ*64+WINSYS ;MINIMUM # USEABLE SECTORS
WIMAX EQU 1024/WICSZ*8*1024+WINSYS ;MAX # USEABLE SECTORS
;** DISK PARAMETER TABLE EQUATES
;
; DISK PARAMETER ENTRY DESCRIPTION
ORG 0
DPEXLT RW 1 ;SECTOR TRANSLATE TABLE ADDRESS
RW 3
DPEDIRB RW 1 ;DIRECTORY BUFFER ADDRESS
DPEDPB RW 1 ;DISK PARAMETER BLOCK ADDRESS
DPECSV RW 1 ;CHECKSUM VECTOR ADDRESS
DPEALV RW 1 ;ALLOCATION VECTOR ADDRESS
DPEHTH RB 8 ;HEATH EXTENSIONS
DPEL EQU 24 ;LENGTH OF DISK PARAMETER ENTRY
; HEATH EXTENSIONS
DPEFLAG EQU DPEHTH+0 ;FLAGS
DPETYPE EQU 11100000B ;BIT 7-5 = DEVICE TYPE
DPENE EQU 00000000B ; NON-EXISTENT
DPEZ207 EQU 00100000B ; Z207
DPEZ217 EQU 01000000B ; Z217
DPE48RO EQU 00010000B ;BIT 4 -- FOR Z207
; 48 TPI MEDIA IN 96 TPI DRIVE (R/O)
DPE96T EQU 00001000B ;BIT 3 -- 0=48 TPI DRIVE 1=96 TPI DRIVE
DPEASGN EQU 00001000B ;BIT 3 -- FOR Z217 WINCHESTER DISK
; 0=UNASSIGNED A PARTITION
; 1=ASSIGNED A PARTITION
DPET0SD EQU 00000100B ;BIT 2 -- 1=TRACK 0 IS SINGLE DENSITY
DPEDD EQU 00000010B ;BIT 1 -- 0=SINGLE DENSITY 1=DOUBLE
DPELSIO EQU 00000010B ;BIT 1 -- Z217 LOGICAL SECTOR I/O
DPE2S EQU 00000001B ;BIT 0 -- 0=SINGLE SIDED 1=DOUBLE
DPEPRIM EQU 00000001B ;BIT 0 -- Z217 PRIMARY DPE FOR UNIT
DPEUNIT EQU DPEHTH+1 ;UNIT SELECT VALUE
DPERPS EQU DPEHTH+2 ;CP/M RECORDS PER PHYSICAL SECTOR
DPERPAB EQU DPEHTH+3 ;CP/M RECORDS PER ALLOCATION BLOCK
DPETRK EQU DPEHTH+4 ;TRACK COUNTER
DPEUNK EQU 10000000B ; TRACK POSITION UNKNOWN
DPELPB EQU DPEHTH+4 ;Z217 LOWER PARTITION BOUNDARY (LOG SECTOR #)
DPESEK EQU DPEHTH+5 ;MOTOR SPEED AND SEEK SPEED
;BIT 3-0 = SEEK SPEED VALUE
DPEFS EQU 01000000B ;BIT 6 = FAST STEP FOR Z207
DPEMO EQU 10000000B ;BIT 7 = MOTOR UP TO SPEED FLAG
; 0=1 SEC 1=250 MSEC
DPEUPB EQU DPEHTH+6 ;Z217 UPPER PARTITION BOUNDARY + 1
DPEFLG2 EQU DPEHTH+6 ;2ND FLAG BYTE
DPEHLS EQU 00000100B ;BIT 2 DRIVE HAS HEAD LOAD SELONOID
DPEIMG EQU 00000010B ;BIT 1 IMAGINARY DRIVE
DPE96TM EQU 00000001B ;BIT 0 0=48 TPI MEDIA 1=96 TPI MEDIA
DPELUN EQU DPEHTH+7 ;LAST LOGICAL UNIT MOUNTED
DPELOG EQU 11110000B ; CP/M LOGICAL DRIVE NAME FOR THIS ENTRY
DPEREAL EQU 00001111B ; FOR IMAGINARY DRIVE, LOGICAL DRIVE NAME
; FOR CORRESPONDING REAL DRIVE
DPEMNT EQU 00001111B ; FOR REAL DRIVE, LOGICAL DRIVE NAME FOR
; CURRENLY MOUNTED DISK
DPEHL EQU 8 ;LENGTH OF HEATH EXTENSION
; DISK PARAMETER BLOCK
ORG 0
DPBSPT RW 1 ;SECTORS PER TRACK
DPBBSH RB 1 ;BLOCK SHIFT FACTOR
DPBBLM RB 1 ;BLOCK MASK
DPBEXM RB 1 ;EXTENT MASK
DPBDSM RW 1 ;TOTAL # OF BLOCKS - 1
DPBDRM RW 1 ;# OF DIRECTORY ENTRIES - 1
DPBAL0 RB 1 ;INITIAL AL0 VALUE
DPBAL1 RB 1 ;INITIAL AL1 VALUE
DPBCKS RW 1 ;SIZE OF DIRECTORY CHECK VECTOR
DPBOFF RW 1 ;NUMBER OF SYSTEM TRACKS
DPBL EQU 15 ;LENGTH OF DISK PARAMETER BLOCK
;** Z-MACHINE PORT ASSIGNMENTS
;
ZVIDEO EQU 0D8H ;VIDEO 68A21
ZCRTC EQU 0DCH ;VIDEO 6845 CRTC
ZLPEN EQU 0DEH ;LIGHT PEN COUNTER
ZGDP EQU 0E0H ;GENERAL DATA PORT (68A21)
ZTIMER EQU 0E4H ;8253 TIMER
ZSERA EQU 0E8H ;SERIAL A
ZSERB EQU 0ECH ;SERIAL B
Z8259AS EQU 0F0H ;8259A SLAVE
Z8259AM EQU 0F2H ;8259A MASTER
ZKEYBD EQU 0F4H ;KEYBOARD
ZTSTAT EQU 0FBH ;TIMER STATUS
ZMCL EQU 0FCH ;MEMORY CONTROL LATCH
ZHAL EQU 0FDH ;HI-ADDRESS LATCH
ZPSP EQU 0FEH ;PROCESSOR SWAP PORT
ZDIPSW EQU 0FFH ;DIP SWITCHES
; MEMORY CONTROL LATCH
ZMCLMS EQU 00000011B ;MAP SELECT MASK
ZMS0 EQU 000H ; MAP SELECT 0
ZMS1 EQU 001H ; MAP SELECT 1
ZMS2 EQU 002H ; MAP SELECT 2
ZMS3 EQU 003H ; MAP SELECT 3
ZMCLRM EQU 00001100B ;MONITOR ROM MAPPING
ZRM0 EQU 000H ; POWER UP MODE - ROM EVERYWHERE ON READS
ZRM1 EQU 004H ; ROM AT THE TOP 8K OF EVERY 64K
ZRM2 EQU 008H ; ROM AT THE TOP 8K OF THE 8088'S ADDR SPACE
ZRM3 EQU 00CH ; DISABLE ROM
ZMCLP EQU 00110000B ;PARITY HANDLING
ZMCLPZ EQU 00010000B ; 0=SET PARITY TO THE ZERO STATE
ZMCLPK EQU 00100000B ; 0=DISABLE PARITY CHECKING CIRCUITRY
; HI-ADDRESS LATCH
ZHAL85 EQU 11111111B ;8085 MASK
ZHAL88 EQU 00001111B ;8088 MASK
; PROCESSOR SWAP PORT
ZPSPPS EQU 10000000B ;PROCESSOR SELECT (0=8085 , 1=8088)
ZPSPPS5 EQU 000H ; SELECT 8085
ZPSPPS8 EQU 080H ; SELECT 8088
ZPSPGIS EQU 00000010B ;GENERATE INTERRUPT ON SWAPPING
ZPSPI88 EQU 00000001B ;8088 PROCESSES ALL INTERRUPTS
;** Z-100 GENERAL DATA PORT DEFINITIONS
;
; HARDWARE IS A 6821
;
; PORT ASSIGNMENTS
GDPDATA EQU ZGDP+PIADATA ;DATA PORT A
GDPDDRA EQU ZGDP+PIADDRA ;DATA DIRECTION PORT A
GDPCTLA EQU ZGDP+PIACTLA ;CONTROL PORT A
GDPDATB EQU ZGDP+PIADATB ;DATA PORT B
GDPDDRB EQU ZGDP+PIADDRB ;DATA DIRECTION PORT B
GDPCTLB EQU ZGDP+PIACTLB ;CONTROL PORT B
; CONTROL PORT A ASSIGNMENTS
GDPCAV EQU PIAC12+PIAC23+PIADDAC ;INITIALIZATION VALUE
LPENSI EQU PIAIRQ1 ;CA1 = LIGHT PEN STROBE
; INTERRUPT ON 0->1
VSYNCI EQU PIAIRQ2 ;CA2 = VERTICAL SYNC
; INTERRUPT ON 0->1
; DATA DIRECTION PORT A ASSIGNMENTS
GDPDDAV EQU 10101111B
; DATA PORT A ASSIGNMENTS
PPRTM10 EQU 00000011B ;PRINTER D1-D0 MASK
PPRTSTB EQU 00000100B ;PRINTER STROBE (OUTPUT ACTIVE LOW)
PPRTPRM EQU 00001000B ;PRINTER PRIME (OUTPUT ACTIVE LOW)
VSYNC EQU 00010000B ;VERTICAL SYNC (INPUT ACTIVE HIGH)
VSYNCE EQU 00100000B ;VERT SYNC TO CA2 (0=DISABLE, 1=ENABLE)
LPEN EQU 01000000B ;LIGHT PEN SWITCH (INPUT ACTIVE HIGH)
LPENSE EQU 10000000B ;LIGHT PEN STROBE TO CA1 (0=DISABLE, 1=ENABLE)
; CONTROL PORT B ASSIGNMENTS
GDPCBV EQU PIAC12+PIAC20+PIADDAC ;INITIALIZATION VALUE
PRTACKI EQU PIAIRQ1 ;CB1 = PRINTER ACKNOWLEDGE
; NO INTERRUPT ON 0->1
PRTBSYI EQU PIAIRQ2 ;CB2 = PRINTER BUSY
; NO INTERRUPT ON 1->0
; DATA DIRECTION PORT B ASSIGNMENTS
GDPBDDV EQU 11111100B
; DATA PORT B ASSIGNMENTS
PPRTBSY EQU 00000001B ;PRINTER BUSY (INPUT ACTIVE HIGH)
PPRTFLT EQU 00000010B ;PRINTER FAULT (INPUT ACTIVE LOW)
PPRTM72 EQU 11111100B ;PRINTER D7-D2 MASK
;** Z-MACHINE KEYBOARD DEFINITIONS
;
; PORT ASSIGNMENTS
ZKEYBDD EQU ZKEYBD+0 ;DATA
ZKEYBDC EQU ZKEYBD+1 ;COMMAND
ZKEYBDS EQU ZKEYBD+1 ;STATUS
; STATUS REGISTER
ZKEYOBF EQU 00000001B ;OUTPUT BUFFER FULL
ZKEYIBF EQU 00000010B ;INPUT BUFFER FULL
; COMMANDS
ZKEYRES EQU 000H ;RESET
ZKEYARO EQU 001H ;AUTOREPEAT ON
ZKEYARF EQU 002H ;AUTOREPEAT OFF
ZKEYKCO EQU 003H ;KEY CLICK ON
ZKEYKCF EQU 004H ;KEY CLICK OFF
ZKEYCF EQU 005H ;CLEAR FIFO
ZKEYCLK EQU 006H ;CLICK
ZKEYBEP EQU 007H ;BEEP
ZKEYEK EQU 008H ;ENABLE KEYBOARD
ZKEYDK EQU 009H ;DISABLE KEYBOARD
ZKEYUDM EQU 00AH ;KEY UP/DOWN MODE
ZKEYNSM EQU 00BH ;NORMAL SCAN MODE
ZKEYEI EQU 00CH ;ENABLE INTERRUPTS
ZKEYDI EQU 00DH ;DISABLE INTERRUPTS
; SPECIAL KEYS
ZKEYBRK EQU 0AAH ;BREAK KEY
;** MISCELLANEOUS EQUATES
IF REL0
ORG 0000H
ELSE
ORG 0100H
ENDIF
BIOSORG EQU $
CCPORG EQU BIOSORG-BDOSL-CCPL ;ORIGIN FOR CCP
CCPAUTO EQU CCPORG ; ENTRY TO CCP FOR AUTO EXEC COMMAND
CCPNORM EQU CCPORG+3 ; NORMAL ENTRY TO CCP
CCPCMD EQU CCPORG+7 ; BUFFER FOR AUTO EXEC COMMAND
AUTOCL EQU 40 ; MAX COMMAND LENGTH
BDOSORG EQU BIOSORG-BDOSL ;ORIGIN FOR BDOS
BDOSE EQU BDOSORG+6 ; ENTRY TO BDOS
MIJMP EQU 0C3H ;8080 'JMP' INSTRUCTION
PAGE
;** BIOS JUMP VECTORS
;
JMP CBOOTE ;COLD BOOT ENTRY
JMP WBOOTE ;WARM BOOT
JMP CONSTE ;CONSOLE STATUS
JMP CONINE ;CONSOLE INPUT
JMP CONOUTE ;CONSOLE OUTPUT ENTRY
JMP LSTOUTE ;LIST OUTPUT
JMP PUNOUTE ;PUNCH OUTPUT
JMP RDRINE ;READER INPUT
JMP HOMEE ;HOME HEAD ENTRY
JMP SETDSKE ;SET DISK ENTRY
JMP SETTRKE ;SET TRACK ENTRY
JMP SETSECE ;SET SECTOR ENTRY
JMP SETDMAE ;SET DMA ENTRY
JMP READE ;READ CP/M SECTOR ENTRY
JMP WRITEE ;WRITE CP/M SECTOR ENTRY
JMP LSTSTE ;LIST STATUS
JMP SECTRNE ;SECTOR TRANSLATE ENTRY
JMP FORMATE ;FORMAT
JMP RDTRKE ;READ TRACK
JMP WRTRKE ;WRITE TRACK
JMP WPCE ;WRITE PROTECT CHECK
JMP CLRBUFD ;CLEAR BUFFERS FOR DRIVE
PAGE
;** BIOS HEADER TABLES
;
DB BVERSN ;BIOS VERSION
DB 00010101B ;DEFAULT I/O BYTE
XMODE DB 0 ;MODE FLAGS
DB (BIOSEND-BIOSORG+256)/256 ;BIOS SIZE IN PAGES
DW BIOSEND ;ENDING ADDR OF BIOS + 1
DW 0 ;HARD ERROR COUNT (SINCE COLD BOOT)
DW 0 ;SOFT ERROR COUNT (SINCE COLD BOOT)
DB NDRIVES ;NUMBER OF DRIVES POSSIBLE IN THIS BIOS
; AUTO EXEC COMMAND BUFFERS
ACBC DB 0 ;COLD BOOT AUTO COMMAND
DS AUTOCL
AWBC DB 0 ;WARM BOOT AUTO COMMAND
DS AUTOCL
; CHARACTER I/O DEVICE TABLES
XCRTTBL DS 0 ;CRT: TABLE
DB 0
DW 0
DB 0,0
DB 0FFH,0
DB 0,0
DB 0,0
DB 0,0,0
DB 0,0,0,0,0,0,0,0
DW 0,0,0,0,0
IF $-XCRTTBL NE CIOTBLL
%: CRT: CIO TABLE IS NOT CORRECT
ENDIF
TTYTBL DS 0 ;TTY: (SERIAL PORT A)
DB ZSERA
DW EPB480
DB 0,0
DB EPRXR,0
DB EPDCD+EPTXR,0
DB 0,0
DB 0,0,0
DB EPSB1+EPCL8+EPA16X
DB 070H
DB EPNORM+EPRTS+EPRESE+EPRXEN+EPDTR+EPTXEN
DB 0,0,0,0,0
DW 0,0,0,0,0
IF $-TTYTBL NE CIOTBLL
%: TTY: CIO TABLE IS NOT CORRECT
ENDIF
UL1TBL DS 0 ;UC1: , UR1: , UP1: , UL1: (SERIAL PORT B)
DB ZSERB
DW EPB300
DB 0,0
DB EPDSR+EPDCD+EPRXR,0
DB EPDSR+EPDCD+EPTXR,0
DB 0,0
DB 0,0,0
DB EPSB1+EPCL8+EPA16X
DB 070H
DB EPNORM+EPRTS+EPRESE+EPRXEN+EPDTR+EPTXEN
DB 0,0,0,0,0
DW 0,0,0,0,0
IF $-UL1TBL NE CIOTBLL
%: UL1: CIO TABLE IS NOT CORRECT
ENDIF
LPTTBL DS 0 ;LPT: (GENERAL DATA PORT PARALLEL PRINTER)
DB 0
DW 0
DB 0,0
DB 0,0
DB PPRTBSY,PPRTBSY
DB 0,0
DB 0,0,0
DB LPENSE+VSYNCE+PPRTPRM+PPRTSTB
DB GDPDDAV
DB GDPCAV
DB 0
DB GDPBDDV
DB GDPCBV
DB 0,0
DW 0,0,0,0,0
IF $-LPTTBL NE CIOTBLL
%: LPT: CIO TABLE IS NOT CORRECT
ENDIF
XDUMMY DS 0 ;DUMMY UNIT
DB 0
DW 0
DB 0,0
DB 0,0
DB 0,0
DB 0,0
DB 0,0,0
DB 0,0,0,0,0,0,0,0
DW 0,0,0,0,0
IF $-XDUMMY NE CIOTBLL
%: DUMMY CIO TABLE IS NOT CORRECT
ENDIF
; DISK PARAMETER ENTRY TABLES
IF $-BIOSORG NE DPEBASE
%: BIOS HEADER IS NOT CORRECT
ENDIF
DPE1A DS 0 ;PHYSICAL DRIVE 0 -- Z207 5 1/4"
DW 0,0,0,0
DW DIRBUF
DW DPB1A
DW CSV1A
DW ALV1A
DB DPEZ207+DPEDD
DB 0
DB 0
DB 0
DB DPEUNK
DB DPEMO+FDFS6
DB 0
DB 0
IF $-DPE1A NE DPEL
%: DPE1A IS INCORRECT LENGTH
ENDIF
DPE1B DS 0 ;PHYSICAL DRIVE 1 -- Z207 5 1/4"
DW 0,0,0,0
DW DIRBUF
DW DPB1B
DW CSV1B
DW ALV1B
DB DPEZ207+DPEDD
DB 1
DB 0
DB 0
DB DPEUNK
DB DPEMO+FDFS6
DB 0
DB 0
IF $-DPE1B NE DPEL
%: DPE1B IS INCORRECT LENGTH
ENDIF
DPE1C DS 0 ;PHYSICAL DRIVE 2 -- Z207 8"
DW XLATE1,0,0,0
DW DIRBUF
DW DPB1C
DW CSV1C
DW ALV1C
DB DPEZ207+DPET0SD+DPEDD
DB CONPC+CONDS8+0
DB 0
DB 0
DB DPEUNK
DB FDFS6
DB DPEHLS
DB 0
IF $-DPE1C NE DPEL
%: DPE1C IS INCORRECT LENGTH
ENDIF
DPE1D DS 0 ;PHYSICAL DRIVE 3 -- Z207 8"
DW XLATE2,0,0,0
DW DIRBUF
DW DPB1D
DW CSV1D
DW ALV1D
DB DPEZ207+DPET0SD+DPEDD
DB CONPC+CONDS8+1
DB 0
DB 0
DB DPEUNK
DB FDFS6
DB DPEHLS
DB 0
IF $-DPE1D NE DPEL
%: DPE1D IS INCORRECT LENGTH
ENDIF
DPE2A DS 0 ;Z217 -- PARTITION 1
DW 0,0,0,0
DW DIRBUF
DW DPB2A
DW 0
DW ALV2A
DB DPEZ217+DPEPRIM
DB 0
DB WIRPS
DB 0
DB 0
DB 0
DB 0
DB 0
IF $-DPE2A NE DPEL
%: DPE2A IS INCORRECT LENGTH
ENDIF
DPE2B DS 0 ;Z217 -- PARTITION 2
DW 0,0,0,0
DW DIRBUF
DW DPB2B
DW 0
DW ALV2B
DB DPEZ217
DB 0
DB WIRPS
DB 0
DB 0
DB 0
DB 0
DB 0
IF $-DPE2B NE DPEL
%: DPE2B IS INCORRECT LENGTH
ENDIF
PAGE
;** COLD BOOT ENTRY
;
; ENTRY: NONE
; EXIT: (C)=DEFAULT DRIVE # ('A:')
; VIA: AUTO ON
; AUTO OFF
; USES: ALL
;
CBOOTE:
LXI SP,STACK ;INIT STACK POINTER
MVI A,(CBOOT-CBOOT)/3 ;SET FUNCTION # IN SPECIAL LOCATION
STA BLDRP0+COMFUNC ; SINCE COLD BOOTING FROM BIOS LOADER
CALL SWAP881 ;8088 CODE DOES MOST OF THE INITIALIZATION
MVI C,0 ;DEFAULT DRIVE IS 'A:'
LXI D,ACBC ;POINTER TO AUTO COMMAND BUFFER
JMP WB1 ;MERGE WITH WARM BOOT CODE
;** WARM BOOT ENTRY
;
; ENTRY: NONE
; EXIT: (C)=DEFAULT DRIVE #
; VIA: AUTO ON
; AUTO OFF
; USES: ALL
;
WBOOTE:
LXI SP,STACK ;INIT STACK POINTER
MVI A,(WBOOT-CBOOT)/3 ;SET FUNCTION #
CALL SWAP88 ;8088 CODES DOES MOST OF WARM BOOT
LDA DFTDRV ;GET DEFAULT DRIVE
MOV C,A
LXI D,AWBC ;POINTER TO AUTO COMMAND BUFFER
WB1:
MVI A,MIJMP ;SET PAGE ZERO VALUES
LXI H,BIOSORG+3
STA BOOT
SHLD BOOT+1
LXI H,BDOSE
STA BDOS
SHLD BDOS+1
LDAX D ;CHECK IF AUTO SHOULD BE DONE
ORA A
JZ CCPNORM ; BR IF NO
LDA CCPCMD-1 ;FILL COMMAND BUFFER WITH NULLS
LXI H,CCPCMD+1
WB2: MVI M,0
INX H
DCR A
JNZ WB2
LDAX D ;MOVE AUTO COMMAND TO CCP
MOV B,A ; COMMAND BUFFER
INR B
LXI H,CCPCMD
WB3: LDAX D
MOV M,A
INX D
INX H
DCR B
JNZ WB3
JMP CCPAUTO ;BR TO CCP ENTRY FOR AUTO
;** CONSOLE STATUS ENTRY
;
; ENTRY: NONE
; EXIT: (A)=STATUS
; 0=NO CHARACTER AVAILABLE , 0FFH=CHARACTER AVAILABLE
; USES: ALL
;
CONSTE:
MVI A,(CONST-CBOOT)/3 ;SET FUNCTION #
JMP SWAP88 ;RETURN VIA 'SWAP88'
;** CONSOLE INPUT ENTRY
;
; ENTRY: NONE
; EXIT: (A)=CHARACTER FROM CONSOLE
; USES: ALL
;
CONINE:
MVI A,(CONIN-CBOOT)/3 ;SET FUNCTION #
JMP SWAP88 ;RETURN VIA 'SWAP88'
;** CONSOLE OUTPUT ENTRY
;
; ENTRY: (C)=CHARACTER
; EXIT: NONE
; USES: ALL
CONOUTE:
MVI A,(CONOUT-CBOOT)/3 ;SET FUNCTION #
JMP SWAP88 ;RETURN VIA 'SWAP88'
;** LIST OUTPUT ENTRY
;
; ENTRY: (C)=CHARACTER
; EXIT: NONE
; USES: ALL
;
LSTOUTE:
MVI A,(LSTOUT-CBOOT)/3 ;SET FUNCTION #
JMP SWAP88 ;RETURN VIA 'SWAP88'
;** PUNCH OUTPUT ENTRY
;
; ENTRY: (C)=CHARACTER
; EXIT: NONE
; USES: ALL
;
PUNOUTE:
MVI A,(PUNOUT-CBOOT)/3 ;SET FUNCTION #
JMP SWAP88 ;RETURN VIA 'SWAP88'
;** READER INPUT ENTRY
;
; ENTRY: NONE
; EXIT: (A)=CHARACTER READ FROM READER
; USES: ALL
;
RDRINE:
MVI A,(RDRIN-CBOOT)/3 ;SET FUNCTION #
JMP SWAP88 ;RETURN VIA 'SWAP88'
;** SET DISK DRIVE ENTRY
;
; ENTRY: (C)=DRIVE NUMBER
; (E)=LSB INDICATES 1ST TIME SELECTION
; 0=1ST TIME , 1=SUBSEQUENT TIMES
; EXIT: (HL)=ADDRESS OF DPE FOR DRIVE
; =0 IF ERROR
; USES: ALL
;
SETDSKE:
LXI H,XLATES ;ADDRESS OF XLATE TABLE ADDRESSES
MVI A,(SETDSK-CBOOT)/3 ;SET FUNCTION #
JMP SWAP88 ;RETURN VIA 'SWAP88'
;** HOME HEAD ENTRY
;
; ENTRY: NONE
; EXIT: NONE
; USES: ALL
HOMEE:
MVI A,(HOME-CBOOT)/3 ;SET FUNCTION #
JMP SWAP88 ;RETURN VIA 'SWAP88'
;** SET TRACK NUMBER ENTRY
;
; ENTRY: (BC)=TRACK NUMBER
; EXIT: NONE
; USES: ALL
;
SETTRKE:
MVI A,(SETTRK-CBOOT)/3 ;SET FUNCTION #
JMP SWAP88 ;RETURN VIA 'SWAP88'
;** SET SECTOR NUMMBER ENTRY
;
; ENTRY: (BC)=SECTOR NUMBER
; EXIT: NONE
; USES: ALL
;
SETSECE:
MVI A,(SETSEC-CBOOT)/3 ;SET FUNCTION #
JMP SWAP88 ;RETURN VIA 'SWAP88'
;** SET DMA ADDRESS
;
; ENTRY: (BC)=ADDRESS
; EXIT: NONE
; USES: ALL
;
SETDMAE:
MVI A,(SDMA-CBOOT)/3 ;SET FUNCTION #
JMP SWAP88 ;RETURN VIA 'SWAP88'
;** READ CP/M SECTOR ENTRY
;
; ENTRY: NONE
; EXIT: (A)=ERROR CODE
; 0=NO ERROR , 1=ERROR
; USES: ALL
;
READE:
MVI A,(BREAD-CBOOT)/3 ;SET FUNCTION #
JMP SWAP88 ;RETURN VIA 'SWAP88'
;** WRITE CP/M SECTOR ENTRY
;
; ENTRY: (C)=TYPE OF WRITE
; 0=NORMAL WRITE
; 1=WRITE TO A DIRECTORY SECTOR
; 2=1ST WRITE TO A SECTOR IN AN UNALLOCATED BLOCK
; EXIT: (A)=ERROR CODE
; 0=NO ERROR , 1=ERROR
; USES: ALL
;
WRITEE:
MVI A,(BWRITE-CBOOT)/3 ;SET FUNCTION #
JMP SWAP88 ;RETURN VIA 'SWAP88'
;** CHECK LIST DEVICE STATUS ENTRY
;
; ENTRY: NONE
; EXIT: (A)=STATUS
; 0=NOT READY , 0FFH=READY
; USES: ALL
;
LSTSTE:
MVI A,(BLSTST-CBOOT)/3 ;SET FUNCTION #
JMP SWAP88 ;RETURN VIA 'SWAP88'
;** SECTOR TRANSLATE ENTRY
;
; ENTRY: (BC)=SECTOR NUMBER
; (DE)=POINTER TO TRANSLATE TABLE
; EXIT: (HL)=TRANSLATED SECTOR NUMBER
; USES: ALL
;
SECTRNE:
MVI A,(BSECTRN-CBOOT)/3 ;SET FUNCTION #
JMP SWAP88 ;RETURN VIA 'SWAP88'
;** FORMAT ENTRY
;
; ENTRY: (C)=VERIFY FLAG (0=NO , 1=YES)
; EXIT: (A)=STATUS BYTE
; USES: ALL
;
FORMATE:
MVI A,(BFMT-CBOOT)/3 ;SET FUNCTION #
JMP SWAP88 ;RETURN VIA 'SWAP88'
;** READ TRACK ENTRY
;
; ENTRY: NONE
; EXIT: (A)=ERROR STATUS
; USES: ALL
;
RDTRKE:
MVI A,(BRDTRK-CBOOT)/3 ;SET FUNCTION #
JMP SWAP88 ;RETURN VIA 'SWAP88'
;** WRITE TRACK ENTRY
;
; ENTRY: NONE
; EXIT: (A)=ERROR STATUS
; USES: ALL
;
WRTRKE:
MVI A,(BWRTRK-CBOOT)/3 ;SET FUNCTION #
JMP SWAP88 ;RETURN VIA 'SWAP88'
;** WRITE PROTECT CHECK
;
; ENTRY: NONE
; EXIT: (A)=STATUS (0=R/W , 1=R/O)
; USES: ALL
;
WPCE:
MVI A,(BWPC-CBOOT)/3 ;SET FUNCTION #
JMP SWAP88 ;RETURN VIA 'SWAP88'
;** CLEAR BUFFERS FOR DRIVE
;
; ENTRY: NONE
; EXIT: NONE
; USES: ALL
;
CLRBUFD:
MVI A,(BCBD-CBOOT)/3 ;SET FUNCTION #
; JMP SWAP88 ;RETURN VIA 'SWAP88'
IF $ NE SWAP88
%: SWAP88 MUST BE NEXT
ENDIF
PAGE
;* SWAP88 -- SWAP TO 8088 PROCESSOR
;
; ENTRY: (A)=FUNCTION #
; EXIT: (A),(HL)=VALUES PASSED BACK IN COMMUNICATION REGION
; USES: ALL
;
SWAP88:
STA COMFUNC ;SAVE FUNCTION # IN COM REGION
SHLD COMRHL ;STORE (HL) IN COM REGION
MOV H,B ;STORE (BC) IN COM REGION
MOV L,C
SHLD COMRBC
XCHG ;STORE (DE) IN COM REGION
SHLD COMRDE
SWAP881:
DI ;INSURE INTERRUPTS IN 8085 ARE OFF
MVI A,ZPSPPS5 ;TURN OFF 8088'S PROCESSING OF INT'S
OUT ZPSP
MVI A,ZPSPPS8 ;8088 PROCESSOR GETTING CONTROL
STA COMWHO
OUT ZPSP ;SWAP PROCESSOR TO 8088
LDA COMRA ;RETRIEVE (A)
LHLD COMRHL ;RETRIEVE (HL)
RET
PAGE
;** DATA STORAGE
;
XLATES DS 0 ;XLATE TABLE ADDRESSES
DW 0 ; NO XLATE
DW XLATE1 ; 8" SINGLE DENSITY
DW XLATE2 ; 8" DOUBLE DENSITY
XLATE1 DS 0 ;8" SINGLE DENSITY SECTOR TRANSLATE TABLE
DB 1,7,13,19,25
DB 5,11,17,23
DB 3,9,15,21
DB 2,8,14,20,26
DB 6,12,18,24
DB 4,10,16,22
XLATE2 DS 0 ;8" DOUBLE DENSITY SECTOR TRANSLATE TABLE
DB 1,2,19,20,37,38
DB 3,4,21,22,39,40
DB 5,6,23,24,41,42
DB 7,8,25,26,43,44
DB 9,10,27,28,45,46
DB 11,12,29,30,47,48
DB 13,14,31,32,49,50
DB 15,16,33,34,51,52
DB 17,18,35,36
PATCH DS 64 ;PATCH AREA
DIRBUF DS 128
DPB1A DS DPBL
CSV1A DS 64
ALV1A DS 77
DPB1B DS DPBL
CSV1B DS 64
ALV1B DS 77
DPB1C DS DPBL
CSV1C DS 64
ALV1C DS 77
DPB1D DS DPBL
CSV1D DS 64
ALV1D DS 77
DPB2A DS DPBL
ALV2A DS 256
DPB2B DS DPBL
ALV2B DS 256
DS 8 ;STACK AREA
STACK DS 0
BIOSEND EQU $-1
END
77
DP