mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-24 17:04:19 +00:00
710 lines
15 KiB
NASM
710 lines
15 KiB
NASM
title 'CP/M BDOS Interface, BDOS, Version 3.0 Dec, 1982'
|
||
;*****************************************************************
|
||
;*****************************************************************
|
||
;** **
|
||
;** B a s i c D i s k O p e r a t i n g S y s t e m **
|
||
;** **
|
||
;** I n t e r f a c e M o d u l e **
|
||
;** **
|
||
;*****************************************************************
|
||
;*****************************************************************
|
||
;
|
||
; Copyright (c) 1978, 1979, 1980, 1981, 1982
|
||
; Digital Research
|
||
; Box 579, Pacific Grove
|
||
; California
|
||
;
|
||
; December 1982
|
||
;
|
||
on equ 0ffffh
|
||
off equ 00000h
|
||
MPM equ off
|
||
BANKED equ off
|
||
|
||
;
|
||
; equates for non graphic characters
|
||
;
|
||
|
||
ctla equ 01h ; control a
|
||
ctlb equ 02h ; control b
|
||
ctlc equ 03h ; control c
|
||
ctle equ 05h ; physical eol
|
||
ctlf equ 06h ; control f
|
||
ctlg equ 07h ; control g
|
||
ctlh equ 08h ; backspace
|
||
ctlk equ 0bh ; control k
|
||
ctlp equ 10h ; prnt toggle
|
||
ctlq equ 11h ; start screen
|
||
ctlr equ 12h ; repeat line
|
||
ctls equ 13h ; stop screen
|
||
ctlu equ 15h ; line delete
|
||
ctlw equ 17h ; control w
|
||
ctlx equ 18h ; =ctl-u
|
||
ctlz equ 1ah ; end of file
|
||
rubout equ 7fh ; char delete
|
||
tab equ 09h ; tab char
|
||
cr equ 0dh ; carriage return
|
||
lf equ 0ah ; line feed
|
||
ctl equ 5eh ; up arrow
|
||
|
||
org 0000h
|
||
base equ $
|
||
|
||
; Base page definitions
|
||
|
||
bnkbdos$pg equ base+0fc00h
|
||
resbdos$pg equ base+0fd00h
|
||
scb$pg equ base+0fb00h
|
||
bios$pg equ base+0ff00h
|
||
|
||
; Bios equates
|
||
|
||
bios equ bios$pg
|
||
bootf equ bios$pg ; 00. cold boot function
|
||
|
||
if BANKED
|
||
|
||
wbootf equ scb$pg+68h ; 01. warm boot function
|
||
constf equ scb$pg+6eh ; 02. console status function
|
||
coninf equ scb$pg+74h ; 03. console input function
|
||
conoutf equ scb$pg+7ah ; 04. console output function
|
||
listf equ scb$pg+80h ; 05. list output function
|
||
|
||
else
|
||
|
||
wbootf equ bios$pg+3 ; 01. warm boot function
|
||
constf equ bios$pg+6 ; 02. console status function
|
||
coninf equ bios$pg+9 ; 03. console input function
|
||
conoutf equ bios$pg+12 ; 04. console output function
|
||
listf equ bios$pg+15 ; 05. list output function
|
||
|
||
endif
|
||
|
||
punchf equ bios$pg+18 ; 06. punch output function
|
||
readerf equ bios$pg+21 ; 07. reader input function
|
||
homef equ bios$pg+24 ; 08. disk home function
|
||
seldskf equ bios$pg+27 ; 09. select disk function
|
||
settrkf equ bios$pg+30 ; 10. set track function
|
||
setsecf equ bios$pg+33 ; 11. set sector function
|
||
setdmaf equ bios$pg+36 ; 12. set dma function
|
||
readf equ bios$pg+39 ; 13. read disk function
|
||
writef equ bios$pg+42 ; 14. write disk function
|
||
liststf equ bios$pg+45 ; 15. list status function
|
||
sectran equ bios$pg+48 ; 16. sector translate
|
||
conoutstf equ bios$pg+51 ; 17. console output status function
|
||
auxinstf equ bios$pg+54 ; 18. aux input status function
|
||
auxoutstf equ bios$pg+57 ; 19. aux output status function
|
||
devtblf equ bios$pg+60 ; 20. retunr device table address fx
|
||
devinitf equ bios$pg+63 ; 21. initialize device function
|
||
drvtblf equ bios$pg+66 ; 22. return drive table address
|
||
multiof equ bios$pg+69 ; 23. multiple i/o function
|
||
flushf equ bios$pg+72 ; 24. flush function
|
||
movef equ bios$pg+75 ; 25. memory move function
|
||
timef equ bios$pg+78 ; 26. system get/set time function
|
||
selmemf equ bios$pg+81 ; 27. select memory function
|
||
setbnkf equ bios$pg+84 ; 28. set dma bank function
|
||
xmovef equ bios$pg+87 ; 29. extended move function
|
||
|
||
if BANKED
|
||
|
||
; System Control Block equates
|
||
|
||
olog equ scb$pg+090h
|
||
rlog equ scb$pg+092h
|
||
|
||
SCB equ scb$pg+09ch
|
||
|
||
; Expansion Area - 6 bytes
|
||
|
||
hashl equ scb$pg+09ch
|
||
hash equ scb$pg+09dh
|
||
version equ scb$pg+0a1h
|
||
|
||
; Utilities Section - 8 bytes
|
||
|
||
util$flgs equ scb$pg+0a2h
|
||
dspl$flgs equ scb$pg+0a6h
|
||
|
||
; CLP Section - 4 bytes
|
||
|
||
clp$flgs equ scb$pg+0aah
|
||
clp$errcde equ scb$pg+0ach
|
||
|
||
; CCP Section - 8 bytes
|
||
|
||
ccp$comlen equ scb$pg+0aeh
|
||
ccp$curdrv equ scb$pg+0afh
|
||
ccp$curusr equ scb$pg+0b0h
|
||
ccp$conbuff equ scb$pg+0b1h
|
||
ccp$flgs equ scb$pg+0b3h
|
||
|
||
; Device I/O Section - 32 bytes
|
||
|
||
conwidth equ scb$pg+0b6h
|
||
column equ scb$pg+0b7h
|
||
conpage equ scb$pg+0b8h
|
||
conline equ scb$pg+0b9h
|
||
conbuffadd equ scb$pg+0bah
|
||
conbufflen equ scb$pg+0bch
|
||
conin$rflg equ scb$pg+0beh
|
||
conout$rflg equ scb$pg+0c0h
|
||
auxin$rflg equ scb$pg+0c2h
|
||
auxout$rflg equ scb$pg+0c4h
|
||
lstout$rflg equ scb$pg+0c6h
|
||
page$mode equ scb$pg+0c8h
|
||
pm$default equ scb$pg+0c9h
|
||
ctlh$act equ scb$pg+0cah
|
||
rubout$act equ scb$pg+0cbh
|
||
type$ahead equ scb$pg+0cch
|
||
contran equ scb$pg+0cdh
|
||
conmode equ scb$pg+0cfh
|
||
outdelim equ scb$pg+0d3h
|
||
listcp equ scb$pg+0d4h
|
||
qflag equ scb$pg+0d5h
|
||
|
||
; BDOS Section - 42 bytes
|
||
|
||
scbadd equ scb$pg+0d6h
|
||
dmaad equ scb$pg+0d8h
|
||
olddsk equ scb$pg+0dah
|
||
info equ scb$pg+0dbh
|
||
resel equ scb$pg+0ddh
|
||
relog equ scb$pg+0deh
|
||
fx equ scb$pg+0dfh
|
||
usrcode equ scb$pg+0e0h
|
||
dcnt equ scb$pg+0e1h
|
||
;searcha equ scb$pg+0e3h
|
||
searchl equ scb$pg+0e5h
|
||
multcnt equ scb$pg+0e6h
|
||
errormode equ scb$pg+0e7h
|
||
searchchain equ scb$pg+0e8h
|
||
temp$drive equ scb$pg+0ech
|
||
errdrv equ scb$pg+0edh
|
||
media$flag equ scb$pg+0f0h
|
||
bdos$flags equ scb$pg+0f3h
|
||
stamp equ scb$pg+0f4h
|
||
commonbase equ scb$pg+0f9h
|
||
error equ scb$pg+0fbh ;jmp error$sub
|
||
bdosadd equ scb$pg+0feh
|
||
|
||
; Resbdos equates
|
||
|
||
resbdos equ resbdos$pg
|
||
move$out equ resbdos$pg+9 ; a=bank #, hl=dest, de=srce
|
||
move$tpa equ resbdos$pg+0ch ; a=bank #, hl=dest, de=srce
|
||
srch$hash equ resbdos$pg+0fh ; a=bank #, hl=hash table addr
|
||
hashmx equ resbdos$pg+12h ; max hash search dcnt
|
||
rd$dir$flag equ resbdos$pg+14h ; directory read flag
|
||
make$xfcb equ resbdos$pg+15h ; make function flag
|
||
find$xfcb equ resbdos$pg+16h ; search function flag
|
||
xdcnt equ resbdos$pg+17h ; dcnt save for empty fcb,
|
||
; user 0 fcb, or xfcb
|
||
xdmaad equ resbdos$pg+19h ; resbdos dma copy area addr
|
||
curdma equ resbdos$pg+1bh ; current dma
|
||
copy$cr$only equ resbdos$pg+1dh ; dont restore fcb flag
|
||
user$info equ resbdos$pg+1eh ; user fcb address
|
||
kbchar equ resbdos$pg+20h ; conbdos look ahead char
|
||
qconinx equ resbdos$pg+21h ; qconin mov a,m routine
|
||
|
||
ELSE
|
||
|
||
move$out equ movef
|
||
move$tpa equ movef
|
||
|
||
ENDIF
|
||
|
||
;
|
||
serial: db '654321'
|
||
;
|
||
; Enter here from the user's program with function number in c,
|
||
; and information address in d,e
|
||
;
|
||
|
||
bdose: ; Arrive here from user programs
|
||
xchg! shld info! xchg ; info=de, de=info
|
||
|
||
mov a,c! sta fx! cpi 14! jc bdose2
|
||
lxi h,0! shld dircnt ; dircnt,multnum = 0
|
||
lda olddsk! sta seldsk ; Set seldsk
|
||
|
||
if BANKED
|
||
dcr a! sta copy$cr$init
|
||
ENDIF
|
||
|
||
; If mult$cnt ~= 1 then read or write commands
|
||
; are handled by the shell
|
||
lda mult$cnt! dcr a! jz bdose2
|
||
lxi h,mult$fxs
|
||
bdose1:
|
||
mov a,m! ora a! jz bdose2
|
||
cmp c! jz shell
|
||
inx h! jmp bdose1
|
||
bdose2:
|
||
mov a,e! sta linfo ; linfo = low(info) - don't equ
|
||
lxi h,0! shld aret ; Return value defaults to 0000
|
||
shld resel ; resel,relog = 0
|
||
; Save user's stack pointer, set to local stack
|
||
dad sp! shld entsp ; entsp = stackptr
|
||
|
||
if not BANKED
|
||
lxi sp,lstack ; local stack setup
|
||
ENDIF
|
||
|
||
lxi h,goback ; Return here after all functions
|
||
push h ; jmp goback equivalent to ret
|
||
mov a,c! cpi nfuncs! jnc high$fxs ; Skip if invalid #
|
||
mov c,e ; possible output character to c
|
||
lxi h,functab! jmp bdos$jmp
|
||
; look for functions 98 ->
|
||
high$fxs:
|
||
cpi 128! jnc test$152
|
||
sui 98! jc lret$eq$ff ; Skip if function < 98
|
||
cpi nfuncs2! jnc lret$eq$ff
|
||
lxi h,functab2
|
||
bdos$jmp:
|
||
mov e,a! mvi d,0 ; de=func, hl=.ciotab
|
||
dad d! dad d! mov e,m! inx h! mov d,m ; de=functab(func)
|
||
lhld info ; info in de for later xchg
|
||
xchg! pchl ; dispatched
|
||
|
||
; CAUTION: In banked systems only,
|
||
; error$sub is referenced indirectly by the SCB ERROR
|
||
; field in RESBDOS as (0fc7ch). This value is converted
|
||
; to the actual address of error$sub by GENSYS. If the offset
|
||
; of error$sub is changed, the SCB ERROR value must also
|
||
; be changed.
|
||
|
||
;
|
||
; error subroutine
|
||
;
|
||
|
||
error$sub:
|
||
mvi b,0! push b! dcr c
|
||
lxi h,errtbl! dad b! dad b
|
||
mov e,m! inx h! mov d,m! xchg
|
||
call errflg
|
||
pop b! lda error$mode! ora a! rnz
|
||
jmp reboote
|
||
|
||
mult$fxs: db 20,21,33,34,40,0
|
||
|
||
if BANKED
|
||
db 'COPYRIGHT (C) 1982,'
|
||
db ' DIGITAL RESEARCH '
|
||
db '151282'
|
||
else
|
||
db 'COPR. ''82 DRI 151282'
|
||
|
||
; 31 level stack
|
||
|
||
dw 0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h
|
||
dw 0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h
|
||
dw 0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h
|
||
dw 0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h
|
||
lstack:
|
||
|
||
endif
|
||
|
||
; dispatch table for functions
|
||
|
||
functab:
|
||
dw rebootx1, func1, func2, func3
|
||
dw punchf, listf, func6, func7
|
||
dw func8, func9, func10, func11
|
||
diskf equ ($-functab)/2 ; disk funcs
|
||
dw func12,func13,func14,func15
|
||
dw func16,func17,func18,func19
|
||
dw func20,func21,func22,func23
|
||
dw func24,func25,func26,func27
|
||
dw func28,func29,func30,func31
|
||
dw func32,func33,func34,func35
|
||
dw func36,func37,func38,func39
|
||
dw func40,lret$eq$ff,func42,func43
|
||
dw func44,func45,func46,func47
|
||
dw func48,func49,func50
|
||
nfuncs equ ($-functab)/2
|
||
|
||
functab2:
|
||
dw func98,func99
|
||
dw func100,func101,func102,func103
|
||
dw func104,func105,func106,func107
|
||
dw func108,func109,func110,func111
|
||
dw func112
|
||
|
||
nfuncs2 equ ($-functab2)/2
|
||
|
||
errtbl:
|
||
dw permsg
|
||
dw rodmsg
|
||
dw rofmsg
|
||
dw selmsg
|
||
dw 0
|
||
dw 0
|
||
dw passmsg
|
||
dw fxstsmsg
|
||
dw wildmsg
|
||
|
||
test$152:
|
||
cpi 152! rnz
|
||
|
||
;
|
||
; PARSE version 3.0b Oct 08 1982 - Doug Huskey
|
||
;
|
||
;
|
||
; DE->.(.filename,.fcb)
|
||
;
|
||
; filename = [d:]file[.type][;password]
|
||
;
|
||
; fcb assignments
|
||
;
|
||
; 0 => drive, 0 = default, 1 = A, 2 = B, ...
|
||
; 1-8 => file, converted to upper case,
|
||
; padded with blanks (left justified)
|
||
; 9-11 => type, converted to upper case,
|
||
; padded with blanks (left justified)
|
||
; 12-15 => set to zero
|
||
; 16-23 => password, converted to upper case,
|
||
; padded with blanks
|
||
; 24-25 => 0000h
|
||
; 26 => length of password (0 - 8)
|
||
;
|
||
; Upon return, HL is set to FFFFH if DE locates
|
||
; an invalid file name;
|
||
; otherwise, HL is set to 0000H if the delimiter
|
||
; following the file name is a 00H (NULL)
|
||
; or a 0DH (CR);
|
||
; otherwise, HL is set to the address of the delimiter
|
||
; following the file name.
|
||
;
|
||
lxi h,sthl$ret
|
||
push h
|
||
lhld info
|
||
mov e,m ;get first parameter
|
||
inx h
|
||
mov d,m
|
||
push d ;save .filename
|
||
inx h
|
||
mov e,m ;get second parameter
|
||
inx h
|
||
mov d,m
|
||
pop h ;DE=.fcb HL=.filename
|
||
xchg
|
||
parse0:
|
||
push h ;save .fcb
|
||
xra a
|
||
mov m,a ;clear drive byte
|
||
inx h
|
||
lxi b,20h*256+11
|
||
call pad ;pad name and type w/ blanks
|
||
lxi b,4
|
||
call pad ;EXT, S1, S2, RC = 0
|
||
lxi b,20h*256+8
|
||
call pad ;pad password field w/ blanks
|
||
lxi b,12
|
||
call pad ;zero 2nd 1/2 of map, cr, r0 - r2
|
||
;
|
||
; skip spaces
|
||
;
|
||
call skps
|
||
;
|
||
; check for drive
|
||
;
|
||
ldax d
|
||
cpi ':' ;is this a drive?
|
||
dcx d
|
||
pop h
|
||
push h ;HL = .fcb
|
||
jnz parse$name
|
||
;
|
||
; Parse the drive-spec
|
||
;
|
||
parsedrv:
|
||
call delim
|
||
jz parse$ok
|
||
sui 'A'
|
||
jc perror1
|
||
cpi 16
|
||
jnc perror1
|
||
inx d
|
||
inx d ;past the ':'
|
||
inr a ;set drive relative to 1
|
||
mov m,a ;store the drive in FCB(0)
|
||
;
|
||
; Parse the file-name
|
||
;
|
||
parse$name:
|
||
inx h ;HL = .fcb(1)
|
||
call delim
|
||
jz parse$ok
|
||
lxi b,7*256
|
||
|
||
parse6: ldax d ;get a character
|
||
cpi '.' ;file-type next?
|
||
jz parse$type ;branch to file-type processing
|
||
cpi ';'
|
||
jz parse$pw
|
||
call gfc ;process one character
|
||
jnz parse6 ;loop if not end of name
|
||
jmp parse$ok
|
||
;
|
||
; Parse the file-type
|
||
;
|
||
parse$type:
|
||
inx d ;advance past dot
|
||
pop h
|
||
push h ;HL =.fcb
|
||
lxi b,9
|
||
dad b ;HL =.fcb(9)
|
||
lxi b,2*256
|
||
|
||
parse8: ldax d
|
||
cpi ';'
|
||
jz parsepw
|
||
call gfc ;process one character
|
||
jnz parse8 ;loop if not end of type
|
||
;
|
||
parse$ok:
|
||
pop b
|
||
push d
|
||
call skps ;skip trailing blanks and tabs
|
||
dcx d
|
||
call delim ;is next nonblank char a delim?
|
||
pop h
|
||
rnz ;no
|
||
lxi h,0
|
||
ora a
|
||
rz ;return zero if delim = 0
|
||
cpi cr
|
||
rz ;return zero if delim = cr
|
||
xchg
|
||
ret
|
||
;
|
||
; handle parser error
|
||
;
|
||
perror:
|
||
pop b ;throw away return addr
|
||
perror1:
|
||
pop b
|
||
lxi h,0ffffh
|
||
ret
|
||
;
|
||
; Parse the password
|
||
;
|
||
parsepw:
|
||
inx d
|
||
pop h
|
||
push h
|
||
lxi b,16
|
||
dad b
|
||
lxi b,7*256+1
|
||
parsepw1:
|
||
call gfc
|
||
jnz parsepw1
|
||
mvi a,7
|
||
sub b
|
||
pop h
|
||
push h
|
||
lxi b,26
|
||
dad b
|
||
mov m,a
|
||
ldax d ;delimiter in A
|
||
jmp parse$ok
|
||
;
|
||
; get next character of name, type or password
|
||
;
|
||
gfc: call delim ;check for end of filename
|
||
rz ;return if so
|
||
cpi ' ' ;check for control characters
|
||
inx d
|
||
jc perror ;error if control characters encountered
|
||
inr b ;error if too big for field
|
||
dcr b
|
||
jm perror
|
||
inr c
|
||
dcr c
|
||
jnz gfc1
|
||
cpi '*' ;trap "match rest of field" character
|
||
jz setmatch
|
||
gfc1: mov m,a ;put character in fcb
|
||
inx h
|
||
dcr b ;decrement field size counter
|
||
ora a ;clear zero flag
|
||
ret
|
||
;;
|
||
setmatch:
|
||
mvi m,'?' ;set match one character
|
||
inx h
|
||
dcr b
|
||
jp setmatch
|
||
ret
|
||
;
|
||
; check for delimiter
|
||
;
|
||
; entry: A = character
|
||
; exit: z = set if char is a delimiter
|
||
;
|
||
delimiters: db cr,tab,' .,:;[]=<>|',0
|
||
|
||
delim: ldax d ;get character
|
||
push h
|
||
lxi h,delimiters
|
||
delim1: cmp m ;is char in table
|
||
jz delim2
|
||
inr m
|
||
dcr m ;end of table? (0)
|
||
inx h
|
||
jnz delim1
|
||
ora a ;reset zero flag
|
||
delim2: pop h
|
||
rz
|
||
;
|
||
; not a delimiter, convert to upper case
|
||
;
|
||
cpi 'a'
|
||
rc
|
||
cpi 'z'+1
|
||
jnc delim3
|
||
ani 05fh
|
||
delim3: ani 07fh
|
||
ret ;return with zero set if so
|
||
;
|
||
; pad with blanks or zeros
|
||
;
|
||
pad: mov m,b
|
||
inx h
|
||
dcr c
|
||
jnz pad
|
||
ret
|
||
;
|
||
; skip blanks and tabs
|
||
;
|
||
skps: ldax d
|
||
inx d
|
||
cpi ' ' ;skip spaces & tabs
|
||
jz skps
|
||
cpi tab
|
||
jz skps
|
||
ret
|
||
;
|
||
; end of PARSE
|
||
;
|
||
|
||
errflg:
|
||
; report error to console, message address in hl
|
||
push h! call crlf ; stack mssg address, new line
|
||
lda adrive! adi 'A'! sta dskerr ; current disk name
|
||
lxi b,dskmsg
|
||
|
||
if BANKED
|
||
call zprint ; the error message
|
||
else
|
||
call print
|
||
endif
|
||
|
||
pop b
|
||
|
||
if BANKED
|
||
lda bdos$flags! ral! jnc zprint
|
||
call zprint ; error message tail
|
||
lda fx! mvi b,30h
|
||
lxi h,pr$fx1
|
||
cpi 100! jc errflg1
|
||
mvi m,31h! inx h! sui 100
|
||
errflg1:
|
||
sui 10! jc errflg2
|
||
inr b! jmp errflg1
|
||
errflg2:
|
||
mov m,b! inx h! adi 3ah! mov m,a
|
||
inx h! mvi m,20h
|
||
lxi h,pr$fcb! mvi m,0
|
||
lda resel! ora a! jz errflg3
|
||
mvi m,20h! push d
|
||
lhld info! inx h! xchg! lxi h,pr$fcb1
|
||
mvi c,8! call move! mvi m,'.'! inx h
|
||
mvi c,3! call move! pop d
|
||
errflg3:
|
||
call crlf
|
||
lxi b,pr$fx! jmp zprint
|
||
|
||
zprint:
|
||
ldax b! ora a! rz
|
||
push b! mov c,a
|
||
call tabout
|
||
pop b! inx b! jmp zprint
|
||
|
||
pr$fx: db 'BDOS Function = '
|
||
pr$fx1: db ' '
|
||
pr$fcb: db ' File = '
|
||
pr$fcb1:ds 12
|
||
db 0
|
||
|
||
else
|
||
jmp print
|
||
endif
|
||
|
||
reboote:
|
||
lxi h,0fffdh! jmp rebootx0 ; BDOS error
|
||
rebootx:
|
||
lxi h,0fffeh ; CTL-C error
|
||
rebootx0:
|
||
shld clp$errcde
|
||
rebootx1:
|
||
jmp wbootf
|
||
|
||
entsp: ds 2 ; entry stack pointer
|
||
|
||
shell:
|
||
lxi h,0! dad sp! shld shell$sp
|
||
|
||
if not BANKED
|
||
lxi sp,shell$stk
|
||
endif
|
||
|
||
lxi h,shell$rtn! push h
|
||
call save$rr! call save$dma
|
||
lda mult$cnt
|
||
mult$io:
|
||
push a! sta mult$num! call cbdos
|
||
ora a! jnz shell$err
|
||
lda fx! cpi 33! cnc incr$rr
|
||
call adv$dma
|
||
pop a! dcr a! jnz mult$io
|
||
mov h,a! mov l,a! ret
|
||
|
||
shell$sp: dw 0
|
||
|
||
dw 0c7c7h,0c7c7h,0c7c7h,0c7c7h,0c7c7h
|
||
|
||
shell$stk: ; shell has 5 level stack
|
||
hold$dma: dw 0
|
||
|
||
cbdos:
|
||
lda fx! mov c,a
|
||
cbdos1:
|
||
lhld info! xchg! jmp bdose2
|
||
|
||
adv$dma:
|
||
lhld dmaad! lxi d,80h! dad d! jmp reset$dma1
|
||
|
||
save$dma:
|
||
lhld dmaad! shld hold$dma! ret
|
||
|
||
reset$dma:
|
||
lhld hold$dma
|
||
reset$dma1:
|
||
shld dmaad! jmp setdma
|
||
|
||
shell$err:
|
||
pop b! inr a! rz
|
||
lda mult$cnt! sub b! mov h,a! ret
|
||
|
||
shell$rtn:
|
||
push h! lda fx! cpi 33! cnc reset$rr
|
||
call reset$dma
|
||
pop d! lhld shell$sp! sphl! xchg
|
||
mov a,l! mov b,h! ret
|
||
|
||
page
|
||
|
||
|
||
|