home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols000
/
vol040
/
isis-cpm.asm
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
25KB
|
968 lines
;===============================================================
;
; Prom Based CP/M and ISIS 4.0 Bios, August 9, 1981
;
; Version 1.0
;
; (For Tarbell Disk Controller and Dynabyte Video)
;
;===============================================================
;
; This module contains the input/output routines used by ISIS II
; and a CP/M cold boot loader.
;
true equ -1 ; define value of true
false equ not true ; define value of false
debug equ false ; set true if setup assembly for
; ram based debug at 32 memory size
;
stprat equ 2 ; rate 1=6ms, 2=10ms, 3=20ms
hlab equ 8 ; 8 for hd ld at beg of seek
;
; define disk controller base addresses for operations
;
disk equ 0f8h ; disk base address
dcom equ disk ; disk command port
dstat equ disk ; disk status port
track equ disk+1 ; disk track port
sectp equ disk+2 ; disk sector port
ddata equ disk+3 ; disk data port
wait equ disk+4 ; disk wait port
dcont equ disk+4 ; disk control port
;
; define console and printer interface parameter equates
;
cstat equ 00h ; console status port
cdata equ 01h ; console data port
lstat equ 42h ; list status port
ldata equ 43h ; list data port
ckbr equ 00000001b ; keyboard ready bit
cptr equ 10000000b ; crt out ready bit
lptr equ 00000001b ; printer output ready bit
;
; define stack top location
;
stack equ 100h ; top of stack
;
; define ASCII character codes that are referenced
;
cr equ 0dh ; ASCII cariage return
lf equ 0ah ; ASCII linefeed
;
; define ISIS and CP/M storage locations and constants
;
iobyte equ 0003h ; INTEL iobyte
initio equ 0006h ; initial I/O config
memtop equ 0004h ; location ISIS stores the top of ram
;
if debug
monitor equ 08800h ; monitor start
memsiz equ 32 ; ram memory size in decimal kilo bytes
endif ; debug
;
if not debug
monitor equ 0f800h ; monitor start
memsiz equ 62 ; ram memory size in decimal kilo bytes
endif ; not debug
;
memmax equ ((memsiz*1024)/256)-1 ; memory map area
date equ 0715h ; date
verh equ 10h ; version 1.0
;
org 0ffffh
;
db 0 ; set version number of monitor
;
; start of CP/M and ISIS boot load point routine
;
org monitor ; origin of this program
;
jmp start0 ; reset entry point
jmp conin ; console input
jmp reader ; reader input
jmp conout ; console output
jmp punch ; punch output
jmp list ; list output
jmp const ; console input status
jmp iochk ; I/O system status
jmp ioset ; set I/O configuration
jmp memchk ; compute size of memory
jmp dummy ; define user I/O entry points
jmp dummy
dw date ; date stamp for monitor rom
jmp dummy ; upp input
jmp dummy ; upp output
jmp dummy ; upp status
db verh ; version stamp for monitor rom
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; dummy copyright
jmp dummy ; ioccom entry point
jmp dummy ; ioc output
jmp stat78 ; disk controller 1 status
jmp stat88 ; disk controller 2 status
jmp cmmd78 ; disk controller 1
jmp cmmd88 ; disk controller 2
jmp rtyp78 ; disk controller 1 result type
jmp rtyp88 ; disk controller 2 result type
jmp rbyt78 ; disk controller 1 result byte
jmp rbyt88 ; disk controller 2 result byte
;
; disk command to controller that should be at 88h
; hl points to address of I/O parameter block
;
cmmd88: mvi a,2 ; mark this is for controller 2
jmp cmmdent ; go do common I/O command
;
;
; disk command to controller that should be at 78h
; hl points to address of I/O parameter block
;
cmmd78: xra a ; mark this is for controller 1
cmmdent:shld iopb ; save pointer to iopb
lxi h,0 ; make hl 0 for dad
dad sp
shld ostack ; save old stack pointer
lxi sp,newstk ; set up new stack
push d ; save d and e
push b ; save b and c
mov c,a ; drive select bit 1
lxi h,iodone ; make return address
push h ; put it on stack
;
; copy iopb into scratch area
;
lxi d,ioblk ; point to ioblk destination
lhld iopb ; point to source
mvi b,7 ; number of bytes to move
ibkmov: mov a,m ; get a byte
stax d ; store a byte
inx h ; bump pointers
inx d
dcr b ; decrement count
jnz ibkmov ; loop if not done
;
; select disk drive specified in iopb
;
lda dskins ; get disk instruction
rrc
rrc
rrc
rrc ; drive select bits to 1 and 2
ani 1 ; select bit 0
ora c ; select bit 1
call seldsk ; select drive
;
; test if selected drive is ready, error if not ready
;
in dstat ; read status
rlc ; look at drive ready bit
jc rdyerr ; error if not ready
;
; execute disk instruction from iopb
;
lda dskins ; get disk instruction
ani 7 ; look at opcode only
cpi 4
jz iread ; goto INTEL read
cpi 6
jz iwrite ; goto INTEL write
cpi 7
jz iwrite ; do deleted write like normal write
cpi 5
jz iverf ; goto INTEL verify
cpi 1
jz seek ; goto INTEL seek
cpi 2
jz ifrmat ; INTEL format
cpi 3
jz home ; do INTEL home
xra a ; nop, ret result byte=0
ret
;
; disk I/O complete restore regs and restore sp and return
; disk controller simulator exit point
;
iodone: sta resbyt ; save disk status
pop b ; restore regs
pop d
lhld ostack
sphl ; restore stack
lhld iopb
ret ; return to ISIS
;
; user entry point to check the status of the I/O byte
;
iochk: lda iobyte ; get status byte
ret
;
; user entry point to change the I/O byte to a new value
;
ioset: mov a,c ; put new value into the memory
sta iobyte
ret
;
; user entry point to get the value of the top of available memory
;
memchk: lda memtop+1 ; msbyt of top address of memory
dcr a ; change one page less to permit
; monitor to use 256 bytes of ram
mov b,a ; msbyt in b reg
mvi a,0c0h ; ab points to base of user stack
ret ; in 2'nd from top page of ram
;
; dummy I/O routine
;
dummy: xra a
ret ; dummy routine
;
; routine to simulate getting ready status of the single density
; INTEL disk controller hardware
;
stat78: equ $
;
stat88: mvi a,0bh ; show always ready
ret
;
; routine to imitate return of result type byte from the disk
; controller hardware
;
rtyp78: equ $
;
rtyp88: xra a
ret
;
; routine to imitate reading of the result byte from the disk
; controller hardware code was made by the disk operation
; command routines and stored at resbyt in the top page of ram
;
rbyt78: equ $
;
rbyt88: lda resbyt ; get result byte
ret
;
; here to setup start of command inquiry loop to boot either
; a CP/M system disk of up to 62k size or to load an ISIS 40
; system disk that has been patched for disk I/O through this
; prom based i/c-bios software
;
start0: lxi sp,stack ; set stack pointer
;
; put jump to monitor at zero
;
mvi a,0c3h ; put jump to monitor at 0
sta 0000h
lxi h,monitor
shld 0001h
mvi a,01h ; console is crt
sta iobyte
sta initio
;
; calculate top of memory and store at "memtop" for the ISIS
; system operation
;
lxi h,03f00h ; start point for test
pag: inr h ; set to next page
jz fnd ; stop if at end
mov a,m ; get memory byte
cma ; complement it
mov m,a ; put comp in memory
cmp m ; did it go in ok
cma ; invert back
mov m,a ; restore original
jz pag ; loop to next 256 bytes if it changed
fnd: dcx h ; back up a page
mov a,h
cpi memmax ; less than f700h
jc x11 ; if yes then use this value
;
fnd1: mvi h,memmax ; otherwise set memtop to 0f7ffh
;
x11: shld memtop ; set ISIS memory top address
;
; command check loop for monitor operation select
;
iboot: lxi h,stmsg ; point to start msg
call pmsg ; print message
iboot1: call conin ; wait for response
push psw ; echo operator response
mov c,a
call conout
pop psw
ani 05fh ; convert input to upper case
cpi 'C' ; check if CP/M boot
jz cpmboot
cpi 'I' ; or if ISIS boot
jnz iboot ; if neither then prompt again
;
; print ISIS prompt message and then load disk on input of a "cr"
;
isisboot:
;
lxi h,isisms ; print ISIS load message
call pmsg
call conin ; get ready status
cpi cr ; see if a cr
jnz iboot ; start all over if not ISIS boot
lxi h,crlf ; print carriage return linefeed
call pmsg
;
; force interrupt
;
mvi a,0d0h ; force interrupt command
out dcom
in dstat ; clear interrupt
;
; setup scratch area
;
lxi h,0ffffh
shld trtab ; preset track table
shld trtab+2
mvi a,4 ; set up initial out of range disk
sta diskno
xra a
call seldsk ; select drive 0
;
; boot in ISISt0 to location 3000 and execute
;
lxi h,bootpb ; point to boot parameter block
call cmmd78 ; read in disk
ora a
jz 3000h ; if no errors goto ISIS
lxi h,bmsg
call pmsg ; print boot error message
jmp iboot ; if error then go try for another command
;
; iopb for booting ISISt0 in to 3000h
;
bootpb: db 80h ; iocw, no update bit set
db 04h ; I/O instruction, read disk 0
db 26 ; read 26 sectors
db 0 ; track 0
db 1 ; sector 1
dw 3000h ; load address
;
; print CP/M prompt message and then load disk on input of a "cr"
;
cpmboot:lxi h,cpmms ; print CP/M load message
call pmsg
call conin ; get ready status
cpi cr ; see if a cr
jnz iboot ; start all over if not CP/M boot
lxi h,crlf ; print carriage return linefeed
call pmsg
;
; force interrupt
;
mvi a,0d0h ; force interrupt command
out dcom
in dstat ; clear interrupt
;
; setup scratch area
;
lxi h,0ffffh
shld trtab ; preset track table
shld trtab+2
mvi a,4 ; set up initial out of range disk
sta diskno
xra a
call seldsk ; select drive 0
;
; boot normal CP/M track zero sector 1 into ram at zero and
; jump to it to get in rest of CP/M
;
lxi h,cpmpb ; point to boot parameter block
call cmmd78 ; read in disk
ora a
jz 0000h ; if no errors goto CP/M loader
lxi h,bmsg
call pmsg ; print boot error message
jmp iboot ; if error then go try for another command
;
; iopb for booting CP/M track 0 sector 1 into 0000h
;
cpmpb: db 80h ; iocw, no update bit set
db 04h ; I/O instruction, read disk 0
db 01 ; read one sector
db 0 ; track 0
db 1 ; sector 1
dw 0000h ; load address
;
; hardware interface I/O routines for ISIS bios software
;
; check console input status
;
const: in cstat ; read console status
ani ckbr
mvi a,0 ; set a=0
rnz ; return if not ready with a=0
cma
ret
;
; read a character from console
;
conin: in cstat ; read console status
ani ckbr ; if not ready
jnz conin ; keep waiting
in cdata ; read a character
ani 7fh ; make most sig bit=0
ret
;
; write a character to the console device
;
conout: in cstat ; read console status
ani cptr ; if not ready,
jnz conout ; keep waiting
mov a,c ; get character
out cdata ; print it
ret
;
; write a character to the list device
;
list: in lstat ; read list port status
ani lptr ; if not ready,
jz list ; then keep waiting
mov a,c ; get character
out ldata ; print it
ret
;
; select disk number according to register a
;
seldsk: lxi h,diskno ; get addr of old disk no
cmp m ; new=old?
mov c,a ; c=new drive
jz seld1
;
; if changing to a new drive perform a seek to the same track
; this is an undocumented procedure which unloads the head
;
in track ; get the present track
out ddata ; put in 1771 data reg
mvi a,10h ; seek command
out dcom ; seek same track
in wait
;
; get old track number from 1771 and put into table
;
mov e,m ; e=old disk no
mvi d,0 ; clear d for dad
lxi h,trtab ; point to table
dad d ; index into table
in track ; read 1771 track reg
mov m,a ; put into table
;
; get new drive track number from table and put in 1771
;
mov e,c ; e=new disk no
mvi d,0 ; clear d for dad
lxi h,trtab ; point to table
dad d ; index into table
mov a,m ; get new track number
out track ; update 1771 track reg
;
; update diskno and select new drive
;
seld1: mov a,c ; update old disk number
sta diskno
cma
add a ; put bits 1 and 2 at 4 and 5
add a
add a
add a
ori 2
sta latch ; update latch
out dcont ; select drive
;
; if table entry for this drive is ff then this drive is not logged
; and we must do a recalibrate before returning from seldsk
;
mov a,m ; get track from table
inr a ; if 0ffh then recalibrate
rnz
;
; move disk to track zero
;
home: mvi a,stprat+hlab ; restore command
out dcom ; to controller
in wait ; wait for restore complete
in dstat ; read status
ani 91h ; look at these bits
rz ; return good
mvi a,00000100b ; seek error
ret ; return bad
;
; seek track specified in iopb
;
seek: lda itrack ; get track # from iopb
cpi 77 ; more than 77 ?
jnc adrerr ; error if more
mov b,a ; b=destination track
in track ; a= present track no
mov c,a ; c= present track also
cmp b ; dest=present ??
rz ; return if same
;
; this routine is to allow time for the drive
; tunnel erase to terminate before moving the
; head the delay is approx 700 micro-sec @
; 4 mhz cpu time, and double this for 2 mhz cpu's
;
push psw
mvi a,208 ; delay count
busy1: dcr a ; count=count-1
jnz busy1 ; loop til count=0
pop psw
mov a,b ; a=destination track
out ddata ; track to data register
busy: in dstat ; read disk status
rrc ; look at bit 0
jc busy ; wait till not busy
mvi a,10h+stprat+hlab ; get step rate and head load
out dcom ; do seek
in wait ; wait for seek done
in dstat ; read controller status
ani 91h ; look at these bits
rz ; return good
mvi a,00000100b ; seek error
ret ; return bad
;
; hdld-get head-load bit if required
;
hdld: in dstat ; read 1771 status
ani 20h ; look at hl bit
jz hdldy ; load if not loaded
xra a ; otherwise, a=0
ret ; return from hdld
hdldy: mvi a,4 ; set bit to load head
ret ; return from hdld
;
; write sector or sectors specified in iopb
;
iwrite: call seek ; check params and seek track
rnz ; return if seek error
mvi c,20h ; set (c) to write code
jmp ddio ; go do common I/O
;
; verify sector or sectors specified in iopb
;
iverf: call seek ; check parms and perform seek
rnz ; return if seek error
mvi c,080h ; set verify function bit
jmp ddio ; go do common I/O
;
; read sector or sectors specified in iopb
;
iread: call seek ; check params and seek track
rnz ; return if seek error
mvi c,0 ; set read function code and
; fall through to common I/O
;
; do disk common operations
;
ddio: lhld dmaadd ; get dma address in h and l
mvi a,0d0h
out dcom ; force interupt
lda sect ; get iopb sector
ani 1fh ; strip select bit
cpi 27 ; more than 26 ?
jnc adrerr ; error if more
out sectp ; sector to 1771
call hdld ; head loaded ?
adi 88h
push b ; save function byte in (c)
push psw ; strip possible verify bit off (c)
mov a,c
ani 07fh
mov c,a
pop psw
ora c ; read/write
out dcom ; command to 1771
pop b
mov a,c ; get read/write
cpi 020h ; check for write
jz wloop ; if 020h then write
cpi 080h ; check for verify
jz vloop ; if 080h then verify
; must be read if not write/verify
;
; read loop ; else read
;
rloop: in wait ; wait for drq or intrq
ora a ; set flags
jp rdone ; if p then was intrq, done
in ddata ; otherwise drq, get byte
poke: mov m,a ; put into memory
inx h ; bump memory pointer
jmp rloop ; continue reading
;
; read exit
;
rdone: in dstat ; get status
ani 9dh ; look at these error bits
jnz dskerr
; fall through to next record check
;
; next record of multiple record check
;
nxtrec: lxi h,numrec ; point to numrec in iopb
dcr m ; numrec=numrec-1
rz ; return if numrec=0
lhld dmaadd ; else get dma address
lxi d,128
dad d ; hl=hl+128
shld dmaadd ; update dma address
lxi h,sect ; point to sector # in iopb
inr m ; sect=sect+1
mov a,m
cpi 27 ; greater than 26 ??
jc ddio ; continue if range ok
jmp adrerr ; otherwise error
;
; verify loop
;
vloop: in wait ; wait for drq or intrq
ora a ; set flags
jp vdone ; if p then was intrq and done
in ddata ; otherwise drq so get data
; we wont use data if a verify op
inx h ; do pointer anyway
jmp vloop ; go for next byte
;
; verify exit
;
vdone: in dstat ; get operation status
ani 09dh ; mask appropiate bits
jnz dskerr ; go to error tree if I/O error
jmp nxtrec ; see if more records to do
;
; write loop
;
wloop: in wait ; wait for drq or intrq
ora a ; set flags
jp wdone ; if p then was intrq, done
mov a,m ; get a byte from memory
out ddata ; send to 1771
inx h ; bump memory pointer
jmp wloop ; continue writing
;
; write done
;
wdone: in dstat ; read status
ani 0fdh ; look at these error bits
jz nxtrec ; see if more records
;
; disk I/O error sorting tree that converts 1771 error codes into
; those required to emulate an INTEL disk controller
;
dskerr: cpi 10000000b ; test for not ready
jz rdyerr
cpi 01000000b ; test for write protect
jz wprot
cpi 00000100b ; test for lost data
jz losdat
cpi 00011000b ; test for id crc error
jz idcrc
cpi 00010000b ; test for record not found
jz idcrc
; lets say all else is crc
crcerr: mvi a,00000010b ; make code for crc error
ret
;
wprot: mvi a,00100000b ; make code for write protect
ret
;
rdyerr: mvi a,10000000b ; make code for not ready
ret
;
losdat: mvi a,00010000b ; make code for lost data
ret
;
idcrc: mvi a,00001010b ; make code for id crc
ret
;
adrerr: mvi a,00001000b ; make code for adress error
ret
;
; format a track-this routine here due to fact that INTEL controller
; directly supports a track format operation for the "idisk" command
;
ifrmat: in dstat ; read disk status
ani 01000000b
jnz wprot ; error if write protected
call seek ; seek desired track
lda chword ; get channel word
ani 01000000b ; look at format sequence
jnz random ; go setup table for random
;
; sequential format-fill table with fill characters and sequential
; sector numbers fill byte pointed to by dmaadd
;
seq: lhld dmaadd ; point to fill byte
mov d,m ; put fill byte into (d)
mvi a,01h ; start sector number
lxi h,fmttab ; point to format table
seqlp: mov m,a ; put sector into table
inx h
mov m,d ; put fill char into the table
inx h
inr a ; increment sector number
cpi 27 ; table all filled yet?
jnz seqlp
jmp seq1 ; go start format
;
; random format-fill table with sector and fill bytes that was
; built by caller in the iopb pointed data buffer
;
random: lhld dmaadd ; point to callers table
mvi b,52 ; number of entries to move across
lxi d,fmttab ; point to our table
randlp: mov a,m ; get users byte
stax d ; put into our table
inx h ; do pointer adjust for loop
inx d
dcr b ; moved all bytes yet?
jnz randlp
seq1: lxi h,fmttab ; point to format order table
lda itrack ; get track number
mov c,a ; put it in c
mvi e,26 ; set max # sectors
mvi b,40 ; gap 4 preindex 40 bytes of 0ffh
mvi a,0f4h ; load track write command
out dcom ; issue track write
;
; write preindex fill
;
preind: in wait ; wait for drq
ora a ; set flags
jp fmterr ; jmp out if error
mvi a,0ffh ; byte=0ffh
out ddata ; write it on disk
dcr b ; count=count-1
jnz preind ; loop til count=0
mvi b,6 ; count=6
prein1: in wait ; wait for drq
ora a ; set flags
jp fmterr ; jmp out if error
xra a ; byte=0
out ddata ; write it on disk
dcr b ; count=count-1
jnz prein1 ; loop til count=0
;
; write address mark on track
;
in wait ; wait for drq
ora a ; set flags
jp fmterr ; jmp out if error
mvi a,0fch ; load address mark
out ddata ; write it on disk
;
; post index gap
;
postgap:mvi b,26 ; count=26
postid: in wait ; wait for drq
ora a ; set flags
jp fmterr ; jmp out if error
mvi a,0ffh ; byte=0ffh
out ddata ; write it on disk
dcr b ; count=count-1
jnz postid ; loop til count=0
;
; pre id section
;
asect: mvi b,6 ; count=6
sector: in wait ; wait for drq
ora a ; set flags
jp fmterr ; jmp out if error
xra a ; byte=0
out ddata ; write it on track
dcr b ; count=count-1
jnz sector ; loop til count=0
;
; write id address mark
;
in wait ; wait for drq
ora a ; set flags
jp fmterr ; if error jmp out
mvi a,0feh ; get address mark
out ddata ; write it on disk
;
; write track number on disk
;
in wait ; wait for drq
ora a ; set flags
jp fmterr ; jmp out if error
mov a,c ; get track number
out ddata ; write it on disk
;
; write one byte of 00
;
in wait ; wait for drq
ora a ; set flags
jp fmterr ; jmp out if error
xra a ; byte=0
out ddata ; write it on disk
;
; write sector # on disk
;
in wait ; wait for drq
ora a ; set flags
jp fmterr ; jmp out if error
mov a,m ; get sector #
out ddata ; write it on disk
;
; increment table pointer to next byte to point to sector fill byte
;
inx h ; point to fill byte
;
; one more byte 0
;
in wait ; wait for drq
ora a ; set flags
jp fmterr ; jmp out if error
xra a ; byte=0
out ddata ; write it on disk
inr d ; bump sector count
;
; write 2 crc's on this sector
;
in wait ; wait for drq
ora a ; set flags
jp fmterr ; jmp out if error
mvi a,0f7h ; get crc pattern
out ddata ; write it on disk
;
; get sector fill byte to (d) and inx table pointer for next sector
;
mov d,m ; get fill byte
inx h ; point to next sector number
;
; pre data 17 bytes 00
;
mvi b,11 ; count=11
predat: in wait ; wait for drq
ora a ; set flags
jp fmterr ; jmp out if error
mvi a,0ffh ; byte=0ffh
out ddata ; write it on disk
dcr b ; count=count-1
jnz predat ; loop til count=0
mvi b,6 ; count=6
preda1: in wait ; wait for drq
ora a ; set flags
jp fmterr ; jmp out if error
xra a ; byte=0
out ddata ; write it to disk
dcr b ; count=count-1
jnz preda1 ; loop til count=0
;
; data address mark
;
in wait ; wait for drq
ora a ; set flags
jp fmterr ; jmp out if error
mvi a,0fbh ; get data address mark
out ddata ; write it on disk
;
; fill data field with data from table
;
mvi b,128 ; count=128
dfill: in wait ; wait for drq
ora a ; set flags
jp fmterr ; jmp out if error
mov a,d ; get fill byte
out ddata ; write it on disk
dcr b ; count=count-1
jnz dfill ; loop til count=0
;
; write crc's
;
in wait ; wait till drq
ora a ; set flags
jp fmterr ; jmp out if error
mvi a,0f7h ; get crc byte
out ddata ; write it on disk
;
; end of sector fill
;
dcr e ; sectorcount=sectorcount-1
jz endtrk ; jmp if sectorcount=0
datgap: in wait ; wait for drq
ora a ; set flags
jp fmterr ; jmp out if error
mvi a,0ffh ; byte=0ffh
out ddata ; write it on disk
jmp postgap ; do next sector
;
; do track and sector house keeping
;
endtrk: in wait ; wait for drq or intrq
ora a ; set flags
jp fdone ; jmp out if error
mvi a,0ffh ; load a with 0ffh
out ddata ; write it on disk
jmp endtrk ; do until intrq
;
; format error sort routine
;
fdone: in dstat ; read status
ora a ; test for flag
rz ; return if no errors
fmterr: in dstat
jmp dskerr ; error if not zero
;
; read a character from reader device
;
reader: mvi a,1ah ; always return an eof char
;
punch: ret ; punch is a do nothing output
;
; print data pointed to by h and l until a zero is found
;
pmsg: mov a,m ; get character
ora a ; set flags
rz ; ret if char is a zero
mov c,a ; put char in "c"
call conout ; print character
inx h ; bump message pointer
jmp pmsg ; do another character
;
; bios messages
;
stmsg: db cr,lf
db 'ISIS 4.0 Bios, Ver.1.0 implemented by Kelly Smith'
db cr,lf
db 'Use "I" to boot ISIS disk or "C" to boot CP/M disk'
db cr,lf,cr,lf,0
isisms: db cr,lf,cr,lf,'ISIS disk in drive A:, type return ',0
cpmms: db cr,lf,cr,lf,'CP/M disk in drive A:, type return ',0
;
crlf: db cr,lf,0
;
bmsg: db cr,lf,'+++Disk Boot Error+++',0
;
; bios scratch area placed at top of ram in system uses max of 256
; bytes in top ram page
;
org memmax*256 ; set for top page of ram
;
;
trtab: ds 5 ; track table
diskno: ds 1 ; current disk number
latch: ds 1 ; current latch code
resbyt: ds 1 ; result byte
ostack: ds 2 ; old stack storage
iopb: ds 2 ; pointer to iopb
;
; copy of i/o parameter block
;
ioblk: equ $
chword: ds 1 ; channel byte
dskins: ds 1 ; disk instruction
numrec: ds 1 ; number of records to do
itrack: ds 1 ; track address
sect: ds 1 ; current sector address
dmaadd: ds 2 ; current r/w address
fmttab: ds 52 ; storage for format table
ds 20 ; stack space
newstk: ds 1
;
end