Files
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

96 lines
1.9 KiB
NASM
Raw Permalink 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.

; MDS-800 Cold Start Loader for MP/M 2.0
;
; VERSION 2.0 09/1481
;
mpmldrb equ 0100h ;base of MP/M loader
;
org 3000h ;loaded here by hardware
;
ntrks equ 2 ;tracks to read
mpmldr0 equ 25 ;# on track 0
mpmldr1 equ 26 ;# on track 1
;
rmon80 equ 0ff0fh ;restart location for mon80
base equ 078h ;'base' used by controller
rtype equ base+1 ;result type
rbyte equ base+3 ;result byte
reset equ base+7 ;reset controller
;
dstat equ base ;disk status port
ilow equ base+1 ;low iopb address
ihigh equ base+2 ;high iopb address
bsw equ 0ffh ;boot switch
readf equ 4h ;disk read function
stack equ 100h ;use end of boot for stack
;
rstart:
lxi sp,stack;in case of call to mon80
; clear disk status
in rtype
in rbyte
; check if boot switch is off
coldstart:
in bsw
ani 02h ;switch on?
jnz coldstart
; clear the controller
out reset ;logic cleared
;
;
mvi b,ntrks ;number of tracks to read
lxi h,iopb0
;
start:
;
; read first/next track into cpmb
mov a,l
out ilow
mov a,h
out ihigh
wait0: in dstat
ani 4
jz wait0
;
; check disk status
in rtype
ani 11b
cpi 2
;
jnc rstart ;retry the load
;
in rbyte ;i/o complete, check status
; if not ready, then go to mon80
ral
cc rmon80 ;not ready bit set
rar ;restore
ani 11110b ;overrun/addr err/seek/crc/xxxx
;
jnz rstart ;retry the load
;
;
lxi d,iopbl ;length of iopb
dad d ;addressing next iopb
dcr b ;count down tracks
jnz start
;
;
; jmp to the MP/M loader
jmp mpmldrb
;
; parameter blocks
iopb0: db 80h ;iocw, no update
db readf ;read function
db mpmldr0 ;# sectors to read trk 0
db 0 ;track 0
db 2 ;start with sector 2, trk 0
dw mpmldrb ;start at base of bdos
iopbl equ $-iopb0
;
iopb1: db 80h
db readf
db mpmldr1 ;sectors to read on track 1
db 1 ;track 1
db 1 ;sector 1
dw mpmldrb+mpmldr0*128 ;base of second read
end