mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-22 16:04:18 +00:00
127 lines
2.5 KiB
NASM
127 lines
2.5 KiB
NASM
title 'mds cold start loader at 3000h'
|
||
;
|
||
; MDS-800 Cold Start Loader for CP/M 2.0
|
||
;
|
||
; Version 2.0 August, 1979
|
||
;
|
||
false equ 0
|
||
true equ not false
|
||
testing equ false ;if true, then go to mon80 on errors
|
||
;
|
||
if testing
|
||
bias equ 03400h
|
||
endif
|
||
if not testing
|
||
bias equ 0000h
|
||
endif
|
||
cpmb equ bias ;base of dos load
|
||
bdos equ 806h+bias ;entry to dos for calls
|
||
bdose equ 1880h+bias ;end of dos load
|
||
boot equ 1600h+bias ;cold start entry point
|
||
rboot equ boot+3 ;warm start entry point
|
||
;
|
||
org 03000h ;loaded down from hardware boot at 3000h
|
||
;
|
||
bdosl equ bdose-cpmb
|
||
ntrks equ 2 ;number of tracks to read
|
||
bdoss equ bdosl/128 ;number of sectors in dos
|
||
bdos0 equ 25 ;number of bdos sectors on track 0
|
||
bdos1 equ bdoss-bdos0 ;number of sectors on track 1
|
||
;
|
||
mon80 equ 0f800h ;intel monitor base
|
||
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
|
||
recal equ 3h ;recalibrate selected drive
|
||
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
|
||
;
|
||
if testing
|
||
cnc rmon80 ;go to monitor if 11 or 10
|
||
endif
|
||
if not testing
|
||
jnc rstart ;retry the load
|
||
endif
|
||
;
|
||
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
|
||
;
|
||
if testing
|
||
cnz rmon80 ;go to monitor
|
||
endif
|
||
if not testing
|
||
jnz rstart ;retry the load
|
||
endif
|
||
;
|
||
;
|
||
lxi d,iopbl ;length of iopb
|
||
dad d ;addressing next iopb
|
||
dcr b ;count down tracks
|
||
jnz start
|
||
;
|
||
;
|
||
; jmp to boot to print initial message, and set up jmps
|
||
jmp boot
|
||
;
|
||
; parameter blocks
|
||
iopb0: db 80h ;iocw, no update
|
||
db readf ;read function
|
||
db bdos0 ;# sectors to read on track 0
|
||
db 0 ;track 0
|
||
db 2 ;start with sector 2 on track 0
|
||
dw cpmb ;start at base of bdos
|
||
iopbl equ $-iopb0
|
||
;
|
||
iopb1: db 80h
|
||
db readf
|
||
db bdos1 ;sectors to read on track 1
|
||
db 1 ;track 1
|
||
db 1 ;sector 1
|
||
dw cpmb+bdos0*128 ;base of second read
|
||
;
|
||
end
|
||
|