home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols000
/
vol079
/
mpmdio.asm
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
15KB
|
495 lines
name 'MPMDIO'
title 'Direct MP/M Calls From PL/I-80'
;
; Note: The CP/M function get version number (#12) has been
; included in this module. If you wish to link both the
; DIOMOD and the MPMDIO, you must remove the function
; from this module.
;
;***********************************************************
;* *
;* MP/M calls from pl/i for direct i/o *
;* *
;* This interface is re-entrant. *
;* *
;***********************************************************
public amemrq ;absolute memory request (#128)
public rmemrq ;relocatable memory request (#129)
public memfr ;memory free (#130)
public poll ;poll device (#131)
public flgwt ;flag wait (#132)
public flgset ;flag set (#133)
public makque ;make queue (#134)
public opnque ;open queue (#135)
public delque ;delete queue (#136)
public rdque ;read queue - unconditional (#137)
public crdque ;conditional read queue (#138)
public wrque ;write queue - unconditional (#139)
public cwrque ;conditional write queue (#140)
public delay ;delay (#141)
public dsptch ;dispatch (#142)
public term ;terminate calling process (#143)
public crproc ;create process (#144)
public setpri ;set process priority (#145)
public attcon ;attach console (#146)
public detcon ;detach console (#147)
public setcon ;set console (#148)
public asncon ;assign console (#149)
public sclicd ;send CLI command (#150)
public clresp ;call resident system process (#151)
public parse ;parse filename (#152)
public getcon ;get console number (#153)
public sysdat ;return system data page adr (#154)
public gettod ;get time and date (#155)
public rpdadr ;return process descr adr (#156)
public abtspr ;abort specified process (#57)
public disabl ;disable interrupts
public enable ;enable interrupts
public vers ;CP/M function - get version number (#12)
;
;
extrn ?bdos
;
;***********************************************************
;* *
;* equates for interface to mp/m xdos *
;* *
;***********************************************************
amemrqf equ 128 ;absolute memory request
rmemrqf equ 129 ;relocatable memory request
memfrf equ 130 ;memory free
pollf equ 131 ;poll device
flgwtf equ 132 ;flag wait
flgsetf equ 133 ;flag set
makquef equ 134 ;make queue
opnquef equ 135 ;open queue
delquef equ 136 ;delete queue
rdquef equ 137 ;read queue - unconditional
crdquef equ 138 ;conditional read queue
wrquef equ 139 ;write queue - unconditional
cwrquef equ 140 ;conditional write queue
delayf equ 141 ;delay
dsptchf equ 142 ;dispatch
termf equ 143 ;terminate calling process
crprocf equ 144 ;create process
setprif equ 145 ;set process priority
attconf equ 146 ;attach console
detconf equ 147 ;detach console
setconf equ 148 ;set console
asnconf equ 149 ;assign console
sclicdf equ 150 ;send CLI command
clrespf equ 151 ;call resident system process
parsef equ 152 ;parse filename
getconf equ 153 ;get console number
sysdatf equ 154 ;return system data page adr
gettodf equ 155 ;get time and date
rpdadrf equ 156 ;return process descr adr
abtsprf equ 157 ;abort specified process
versf equ 12 ;get version number (CP/M function)
;
; utility functions
;***********************************************************
;* *
;* general purpose routines used upon entry *
;* *
;***********************************************************
getp1i:
call getp1
jmp ?bdos ;return through bdos
getp1: ;get single byte parameter to register e
mov e,m ;low (addr)
inx h
mov d,m ;high (addr)
xchg ;hl = .char
mov e,m ;to register e
ret
;
getp2: ;gell getle word parameter to DE
getp2i: ;(equivalent to getp2)
call getp1
inx h
mov d,m ;get high byte as well
jmp ?bdos ;return through bdos
;
getp3i: ;get single word parameter to DE
;perform bdos call and then compliment result
call getp2i
cma
ret
;
;***********************************************************
;* *
;***********************************************************
amemrq: ;absolute memory request (#128)
;1->addr(memdscr)
mvi c,amemrqf ;abs mem rqst function
jmp getp3i ;DE = .memdscr
;return through bdos
;
;********************rform bdos call and then compliment result
ca *
;***********************************************************
rmemrq: ;relocatable memory request (#129)
;1->addr(memdscr)
mvi c,rmemrqf ;rel mem rqst function
jmp getp3i ;DE = .memdscr
;return through bdos
;
;***********************************************************
;* *
;***********************************************************
memfr: ;memory free (#130)
;1->addr(memdscr)
mvi c,memfrf ;memory free function
jmp getp2i ;DE = .memdscr
;return through bdos
;
;***********************************************************
;* *
;***********************************************************
poll: ;poll device (#131)
;1->fixed(7) poll device number
mvi c,pollf ;poll function
jmp getp1i ;device number to E
;return through bdos
;
;***********************************************************
;* *
;***********************************************************
flgwt: ;flag wait (#132)
;1->fixed(7) flag number
mvi c,flgwtf ;flag wait function
call getp1i ;flag number to E
cma
ret
;
;***********************************************************
;* *
;***********************************************************
flgset: ;flag set (#133)
;1->fixed(7) flag number
mvi c,flgsetf ;flag set function
call getp1i ;flag number to E
cma
ret
;
;***********************************************************
;* *
;***********************************************************
makque: ;make queue (#134)
;1->addr(qcb)
mvi c,makquef ;make queue function
jmp getp2i ;DE = .qcb
;return through bdos
;
;***********************************************************
;* *
;***********************************************************
opnque: ;open queue (#135)
;1->addr(uqcb)
mvi c,opnquef ;open queue function
jmp getp3i ;DE = .uqcb
;return through bdos
;
;***********************************************************
;* *
;***********************************************************
delque: ;delete queue (#136)
;1->addr(qcb)
mvi c,delquef ;delete queue function
jmp getp3i ;DE = .qcb
;return through bdos
;
;***********************************************************
;* *
;***********************************************************
rdque: ;read queue - unconditional (#137)
;1->addr(uqcb)
mvi c,rdquef ;read queue function
jmp getp2i ;DE = .uqcb
;return through bdos
;
;***********************************************************
;* *
;***********************************************************
crdque: ;conditional read queue (#138)
;1->addr(uqcb)
mvi c,crdquef ;conditional read queue function
jmp getp3i ;DE = .uqcb
;return through bdos
;
;***********************************************************
;* *
;***********************************************************
wrque: ;write queue - unconditional (#139)
;1->addr(uqcb)
mvi c,wrquef ;write queue function
jmp getp2i ;DE = .uqcb
;return through bdos
;
;***********************************************************
;* *
;***********************************************************
cwrque: ;conditional write queue (#140)
;1->addr(uqcb)
mvi c,cwrquef ;conditional write queue function
jmp getp3i ;DE = .uqcb
;return through bdos
;
;***********************************************************
;* *
;***********************************************************
delay: ;delay (#141)
;1->number of ticks to delay
mvi c,delayf ;delay function
jmp getp2i ;DE = #ticks
;return through bdos
;
;***********************************************************
;* *
;***********************************************************
dsptch: ;dispatch (#142)
mvi c,dsptchf ;dispatch function
jmp ?bdos ;return through bdos
;
;***********************************************************
;* *
;***********************************************************
term: ;terminate calling process (#143)
;1->terminate code
mvi c,termf ;terminate function
jmp getp2i ;DE = terminate code, where
; if D = FF then keep mem seg
; if E = FF term sys process
;return through bdos
;
;***********************************************************
;* *
;***********************************************************
crproc: ;create process (#144)
;1->addr(pdadr)
mvi c,crprocf ;create process function
jmp getp2i ;DE = .pdadr
;return through bdos
;
;***********************************************************
;* *
;***********************************************************
setpri: ;set process priority (#145)
;1->fixed(7) priority
mvi c,setprif ;set priority function
jmp getp1i ;priority to E
;return through bdos
;
;***********************************************************
;* *
;***********************************************************
attcon: ;attach console (#146)
mvi c,attconf ;attach console function
jmp ?bdos ;return through bdos
;
;***********************************************************
;* *
;***********************************************************
detcon: ;detach console (#147)
mvi c,detconf ;detach console function
jmp ?bdos ;return through bdos
;
;***********************************************************
;* *
;***********************************************************
setcon: ;set console (#148)
;1->fixed(7) console
mvi c,setconf ;set console function
jmp getp1i ;console to E
;return through bdos
;
;***********************************************************
;* *
;***********************************************************
asncon: ;assign console (#149)
;1->addr(apb)
mvi c,asnconf ;assign console function
jmp getp3i ;DE = .apb
;return through bdos
;
;***********************************************************
;* *
;***********************************************************
sclicd: ;send CLI command (#150)
;1->addr(clicmd)
mvi c,sclicdf ;send CLI command function
jmp getp2i ;DE = .clicmd
;return through bdos
;
;***********************************************************
;* *
;***********************************************************
clresp: ;call resident system process (#151)
;1->addr(cpb)
call getp1 ;DE = .cpb
inx h
mov d,m
xchg
mov c,m
inx h
mov b,m ;BC = cpb.name
inx h
mov d,h
mov e,l ;DE = .cpb.param
lxi h,-14
dad sp
sphl ;make room for uqcb+2 on stk
push d
;
; Stack Structure:
;
; +-----------------------+
; | Return Address |
; +-----------------------+
; | |
; uqcb.name(0) - name(7)
; | |
; +-----------------------+
; | uqcb.msgadr | ---+
; +-----------------------+ |
; | uqcb.pointer | |
; +-----------------------+ |
; | (space for .pliproc) | <--+
; +-----------------------+
; S--->| .cpb.param |
; +-----------------------+
;
mov d,h
mov e,l
inx h
inx h
inx h
inx h
mov m,e
inx h
mov m,d ;uqcb.msgadr <-
inx h
mvi e,8
clresploop:
ldax b
mov m,a
inx b
inx h
dcr e
jnz clresploop
lxi b,-12
dad b ;HL = .uqcb
mvi c,opnquef
xchg
call ?bdos ;open the cpb.name queue
inr a
lxi h,0001h
pop d ;DE = cpb.param
jz clresprtn ;queue not found
lxi h,2
dad sp
mvi c,rdquef
push d
xchg
call ?bdos ;read proc adr from queue
pop d ;DE = cpb.param
pop h ;HL = procadr
push h
lxi b,clresprtn
push b ;setup return addr
push h
xchg
ret ;call pliproc (param)
clresprtn: ;return here from pliproc call
push h ;save returned result
lxi h,4
dad sp
xchg ;DE = .uqcb
mvi c,wrquef
call ?bdos ;write proc adr to queue
pop d ;DE = result returned from pliproc
lxi h,14
dad sp
sphl ;discard uqcb on stack
xchg
ret ;return with HL = pliproc()
;
;***********************************************************
;* *
;***********************************************************
parse: ;parse filename (#152)
;1->addr(pfcb)
mvi c,parsef ;parse filename function
jmp getp2i ;DE = .pfcb
;return through bdos
;
;***********************************************************
;* *
;***********************************************************
getcon: ;get console number (#153)
mvi c,getconf ;get console function
jmp ?bdos ;return through bdos
;
;***********************************************************
;* *
;***********************************************************
sysdat: ;return system data page adr (#154)
mvi c,sysdatf ;get system data pg adr fn
jmp ?bdos ;return through bdos
;
;***********************************************************
;* *
;***********************************************************
gettod: ;get time and date (#155)
;1->addr(todadr)
mvi c,gettodf ;get time and date function
jmp getp2i ;DE = .todadr
;return through bdos
;
;***********************************************************
;* *
;***********************************************************
rpdadr: ;return process descr adr (#156)
mvi c,rpdadrf ;return Proc dscr adr fn
jmp ?bdos ;return through bdos
;
;***********************************************************
;* *
;***********************************************************
abtspr: ;abort specified process (#57)
;1->addr(abtpb)
mvi c,abtsprf ;abort specified proc fn
jmp getp3i ;DE = .abtpb
;return through bdos
;
;***********************************************************
;* *
;***********************************************************
disabl: ;disable interrupts
di
ret
;
;***********************************************************
;* *
;***********************************************************
enable: ;enable interrupts
ei
ret
;
;***********************************************************
;* *
;***********************************************************
vers: ;get version number (#12) CP/M function
mvi c,versf
jmp ?bdos ;return through bdos
;
;***********************************************************
;* *
;***********************************************************
end