mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-25 01:14:21 +00:00
96 lines
1.9 KiB
NASM
96 lines
1.9 KiB
NASM
; 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
|
||
|