home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol079 / mpmdio.asm < prev    next >
Assembly Source File  |  1984-04-29  |  15KB  |  495 lines

  1.     name    'MPMDIO'
  2.     title    'Direct MP/M Calls From PL/I-80'
  3. ;
  4. ;  Note:  The CP/M function get version number (#12) has been
  5. ;    included in this module.  If you wish to link both the
  6. ;    DIOMOD and the MPMDIO, you must remove the function
  7. ;    from this module.
  8. ;
  9. ;***********************************************************
  10. ;*                               *
  11. ;*    MP/M calls from pl/i for direct i/o           *
  12. ;*                               *
  13. ;*       This interface is re-entrant.                   *
  14. ;*                               *
  15. ;***********************************************************
  16.     public    amemrq    ;absolute memory request (#128)
  17.     public    rmemrq    ;relocatable memory request (#129)
  18.     public    memfr    ;memory free (#130)
  19.     public    poll    ;poll device (#131)
  20.     public    flgwt    ;flag wait (#132)
  21.     public    flgset    ;flag set (#133)
  22.     public    makque    ;make queue (#134)
  23.     public    opnque    ;open queue (#135)
  24.     public    delque    ;delete queue (#136)
  25.     public    rdque    ;read queue - unconditional (#137)
  26.     public    crdque    ;conditional read queue (#138)
  27.     public    wrque    ;write queue - unconditional (#139)
  28.     public    cwrque    ;conditional write queue (#140)
  29.     public    delay    ;delay (#141)
  30.     public    dsptch    ;dispatch (#142)
  31.     public    term    ;terminate calling process (#143)
  32.     public    crproc    ;create process (#144)
  33.     public    setpri    ;set process priority (#145)
  34.     public    attcon    ;attach console (#146)
  35.     public    detcon    ;detach console (#147)
  36.     public    setcon    ;set console (#148)
  37.     public    asncon    ;assign console (#149)
  38.     public    sclicd    ;send CLI command (#150)
  39.     public    clresp    ;call resident system process (#151)
  40.     public    parse    ;parse filename (#152)
  41.     public    getcon    ;get console number (#153)
  42.     public    sysdat    ;return system data page adr (#154)
  43.     public    gettod    ;get time and date (#155)
  44.     public    rpdadr    ;return process descr adr (#156)
  45.     public    abtspr    ;abort specified process (#57)
  46.  
  47.     public    disabl    ;disable interrupts
  48.     public    enable    ;enable interrupts
  49.  
  50.     public    vers    ;CP/M function - get version number (#12)
  51. ;
  52. ;
  53.     extrn    ?bdos
  54. ;
  55. ;***********************************************************
  56. ;*                               *
  57. ;*    equates for interface to mp/m xdos           *
  58. ;*                               *
  59. ;***********************************************************
  60. amemrqf    equ    128    ;absolute memory request
  61. rmemrqf    equ    129    ;relocatable memory request
  62. memfrf    equ    130    ;memory free
  63. pollf    equ    131    ;poll device
  64. flgwtf    equ    132    ;flag wait
  65. flgsetf    equ    133    ;flag set
  66. makquef    equ    134    ;make queue
  67. opnquef    equ    135    ;open queue
  68. delquef    equ    136    ;delete queue
  69. rdquef    equ    137    ;read queue - unconditional
  70. crdquef    equ    138    ;conditional read queue
  71. wrquef    equ    139    ;write queue - unconditional
  72. cwrquef    equ    140    ;conditional write queue
  73. delayf    equ    141    ;delay
  74. dsptchf    equ    142    ;dispatch
  75. termf    equ    143    ;terminate calling process
  76. crprocf    equ    144    ;create process
  77. setprif    equ    145    ;set process priority
  78. attconf    equ    146    ;attach console
  79. detconf    equ    147    ;detach console
  80. setconf    equ    148    ;set console
  81. asnconf    equ    149    ;assign console
  82. sclicdf    equ    150    ;send CLI command
  83. clrespf    equ    151    ;call resident system process
  84. parsef    equ    152    ;parse filename
  85. getconf    equ    153    ;get console number
  86. sysdatf    equ    154    ;return system data page adr
  87. gettodf    equ    155    ;get time and date
  88. rpdadrf    equ    156    ;return process descr adr
  89. abtsprf    equ    157    ;abort specified process
  90.  
  91. versf    equ    12    ;get version number (CP/M function)
  92. ;
  93. ;    utility functions
  94. ;***********************************************************
  95. ;*                               *
  96. ;*    general purpose routines used upon entry       *
  97. ;*                               *
  98. ;***********************************************************
  99. getp1i:
  100.     call    getp1
  101.     jmp    ?bdos        ;return through bdos
  102.  
  103. getp1:    ;get single byte parameter to register e
  104.     mov    e,m        ;low (addr)
  105.     inx    h
  106.     mov    d,m        ;high (addr)
  107.     xchg            ;hl = .char
  108.     mov    e,m        ;to register e
  109.     ret
  110. ;
  111. getp2:    ;gell    getle word parameter to DE
  112. getp2i:    ;(equivalent to getp2)
  113.     call     getp1
  114.     inx    h
  115.     mov    d,m        ;get high byte as well
  116.     jmp    ?bdos        ;return through bdos
  117. ;
  118. getp3i:    ;get single word parameter to DE
  119.     ;perform bdos call and then compliment result
  120.     call    getp2i
  121.     cma
  122.     ret
  123. ;
  124. ;***********************************************************
  125. ;*                               *
  126. ;***********************************************************
  127. amemrq:    ;absolute memory request (#128)
  128.     ;1->addr(memdscr)
  129.     mvi    c,amemrqf    ;abs mem rqst function
  130.     jmp    getp3i        ;DE = .memdscr
  131.                 ;return through bdos
  132. ;
  133. ;********************rform bdos call and then compliment result
  134.     ca               *
  135. ;***********************************************************
  136. rmemrq:    ;relocatable memory request (#129)
  137.     ;1->addr(memdscr)
  138.     mvi    c,rmemrqf    ;rel mem rqst function
  139.     jmp    getp3i        ;DE = .memdscr
  140.                 ;return through bdos
  141. ;
  142. ;***********************************************************
  143. ;*                               *
  144. ;***********************************************************
  145. memfr:    ;memory free (#130)
  146.     ;1->addr(memdscr)
  147.     mvi    c,memfrf    ;memory free function
  148.     jmp    getp2i        ;DE = .memdscr
  149.                 ;return through bdos
  150. ;
  151. ;***********************************************************
  152. ;*                               *
  153. ;***********************************************************
  154. poll:    ;poll device (#131)
  155.     ;1->fixed(7) poll device number
  156.     mvi    c,pollf        ;poll function
  157.     jmp    getp1i        ;device number to E
  158.                 ;return through bdos
  159. ;
  160. ;***********************************************************
  161. ;*                               *
  162. ;***********************************************************
  163. flgwt:    ;flag wait (#132)
  164.     ;1->fixed(7) flag number
  165.     mvi    c,flgwtf    ;flag wait function
  166.     call    getp1i        ;flag number to E
  167.     cma
  168.     ret
  169. ;
  170. ;***********************************************************
  171. ;*                               *
  172. ;***********************************************************
  173. flgset:    ;flag set (#133)
  174.     ;1->fixed(7) flag number
  175.     mvi    c,flgsetf    ;flag set function
  176.     call    getp1i        ;flag number to E
  177.     cma
  178.     ret
  179. ;
  180. ;***********************************************************
  181. ;*                               *
  182. ;***********************************************************
  183. makque:    ;make queue (#134)
  184.     ;1->addr(qcb)
  185.     mvi    c,makquef    ;make queue function
  186.     jmp    getp2i        ;DE = .qcb
  187.                 ;return through bdos
  188. ;
  189. ;***********************************************************
  190. ;*                               *
  191. ;***********************************************************
  192. opnque:    ;open queue (#135)
  193.     ;1->addr(uqcb)
  194.     mvi    c,opnquef    ;open queue function
  195.     jmp    getp3i        ;DE = .uqcb
  196.                 ;return through bdos
  197. ;
  198. ;***********************************************************
  199. ;*                               *
  200. ;***********************************************************
  201. delque:    ;delete queue (#136)
  202.     ;1->addr(qcb)
  203.     mvi    c,delquef    ;delete queue function
  204.     jmp    getp3i        ;DE = .qcb
  205.                 ;return through bdos
  206. ;
  207. ;***********************************************************
  208. ;*                               *
  209. ;***********************************************************
  210. rdque:    ;read queue - unconditional (#137)
  211.     ;1->addr(uqcb)
  212.     mvi    c,rdquef    ;read queue function
  213.     jmp    getp2i        ;DE = .uqcb
  214.                 ;return through bdos
  215. ;
  216. ;***********************************************************
  217. ;*                               *
  218. ;***********************************************************
  219. crdque:    ;conditional read queue (#138)
  220.     ;1->addr(uqcb)
  221.     mvi    c,crdquef    ;conditional read queue function
  222.     jmp    getp3i        ;DE = .uqcb
  223.                 ;return through bdos
  224. ;
  225. ;***********************************************************
  226. ;*                               *
  227. ;***********************************************************
  228. wrque:    ;write queue - unconditional (#139)
  229.     ;1->addr(uqcb)
  230.     mvi    c,wrquef    ;write queue function
  231.     jmp    getp2i        ;DE = .uqcb
  232.                 ;return through bdos
  233. ;
  234. ;***********************************************************
  235. ;*                               *
  236. ;***********************************************************
  237. cwrque:    ;conditional write queue (#140)
  238.     ;1->addr(uqcb)
  239.     mvi    c,cwrquef    ;conditional write queue function
  240.     jmp    getp3i        ;DE = .uqcb
  241.                 ;return through bdos
  242. ;
  243. ;***********************************************************
  244. ;*                               *
  245. ;***********************************************************
  246. delay:    ;delay (#141)
  247.     ;1->number of ticks to delay
  248.     mvi    c,delayf    ;delay function
  249.     jmp    getp2i        ;DE = #ticks
  250.                 ;return through bdos
  251. ;
  252. ;***********************************************************
  253. ;*                               *
  254. ;***********************************************************
  255. dsptch:    ;dispatch (#142)
  256.     mvi    c,dsptchf    ;dispatch function
  257.     jmp    ?bdos        ;return through bdos
  258. ;
  259. ;***********************************************************
  260. ;*                               *
  261. ;***********************************************************
  262. term:    ;terminate calling process (#143)
  263.     ;1->terminate code
  264.     mvi    c,termf        ;terminate function
  265.     jmp    getp2i        ;DE = terminate code, where
  266.                 ; if D = FF then keep mem seg
  267.                 ; if E = FF term sys process
  268.                 ;return through bdos
  269. ;
  270. ;***********************************************************
  271. ;*                               *
  272. ;***********************************************************
  273. crproc:    ;create process (#144)
  274.     ;1->addr(pdadr)
  275.     mvi    c,crprocf    ;create process function
  276.     jmp    getp2i        ;DE = .pdadr
  277.                 ;return through bdos
  278. ;
  279. ;***********************************************************
  280. ;*                               *
  281. ;***********************************************************
  282. setpri:    ;set process priority (#145)
  283.     ;1->fixed(7) priority
  284.     mvi    c,setprif    ;set priority function
  285.     jmp    getp1i        ;priority to E
  286.                 ;return through bdos
  287. ;
  288. ;***********************************************************
  289. ;*                               *
  290. ;***********************************************************
  291. attcon:    ;attach console (#146)
  292.     mvi    c,attconf    ;attach console function
  293.     jmp    ?bdos        ;return through bdos
  294. ;
  295. ;***********************************************************
  296. ;*                               *
  297. ;***********************************************************
  298. detcon:    ;detach console (#147)
  299.     mvi    c,detconf    ;detach console function
  300.     jmp    ?bdos        ;return through bdos
  301. ;
  302. ;***********************************************************
  303. ;*                               *
  304. ;***********************************************************
  305. setcon:    ;set console (#148)
  306.     ;1->fixed(7) console
  307.     mvi    c,setconf    ;set console function
  308.     jmp    getp1i        ;console to E
  309.                 ;return through bdos
  310. ;
  311. ;***********************************************************
  312. ;*                               *
  313. ;***********************************************************
  314. asncon:    ;assign console (#149)
  315.     ;1->addr(apb)
  316.     mvi    c,asnconf    ;assign console function
  317.     jmp    getp3i        ;DE = .apb
  318.                 ;return through bdos
  319. ;
  320. ;***********************************************************
  321. ;*                               *
  322. ;***********************************************************
  323. sclicd:    ;send CLI command (#150)
  324.     ;1->addr(clicmd)
  325.     mvi    c,sclicdf    ;send CLI command function
  326.     jmp    getp2i        ;DE = .clicmd
  327.                 ;return through bdos
  328. ;
  329. ;***********************************************************
  330. ;*                               *
  331. ;***********************************************************
  332. clresp:    ;call resident system process (#151)
  333.     ;1->addr(cpb)
  334.     call    getp1        ;DE = .cpb
  335.     inx    h
  336.     mov    d,m
  337.     xchg
  338.     mov    c,m
  339.     inx    h
  340.     mov    b,m        ;BC = cpb.name
  341.     inx    h
  342.     mov    d,h
  343.     mov    e,l        ;DE = .cpb.param
  344.     lxi    h,-14
  345.     dad    sp
  346.     sphl            ;make room for uqcb+2 on stk
  347.     push    d
  348. ;
  349. ;    Stack Structure:
  350. ;
  351. ;    +-----------------------+
  352. ;    |   Return Address      |
  353. ;    +-----------------------+
  354. ;    |                       |
  355. ;      uqcb.name(0) - name(7)
  356. ;    |                       |
  357. ;    +-----------------------+
  358. ;    |   uqcb.msgadr         | ---+
  359. ;    +-----------------------+    |
  360. ;    |   uqcb.pointer        |    |
  361. ;    +-----------------------+    |
  362. ;    |  (space for .pliproc) | <--+
  363. ;    +-----------------------+
  364. ;  S--->|   .cpb.param          |
  365. ;    +-----------------------+
  366. ;
  367.     mov    d,h
  368.     mov    e,l
  369.     inx    h
  370.     inx    h
  371.     inx    h
  372.     inx    h
  373.     mov    m,e
  374.     inx    h
  375.     mov    m,d        ;uqcb.msgadr <-
  376.     inx    h
  377.     mvi    e,8
  378. clresploop:
  379.     ldax    b
  380.     mov    m,a
  381.     inx    b
  382.     inx    h
  383.     dcr    e
  384.     jnz    clresploop
  385.     lxi    b,-12
  386.     dad    b        ;HL = .uqcb
  387.     mvi    c,opnquef
  388.     xchg
  389.     call    ?bdos        ;open the cpb.name queue
  390.     inr    a
  391.     lxi    h,0001h
  392.     pop    d        ;DE = cpb.param
  393.     jz    clresprtn    ;queue not found
  394.     lxi    h,2
  395.     dad    sp
  396.     mvi    c,rdquef
  397.     push    d
  398.     xchg
  399.     call    ?bdos        ;read proc adr from queue
  400.     pop    d        ;DE = cpb.param
  401.     pop    h        ;HL = procadr
  402.     push    h
  403.     lxi    b,clresprtn
  404.     push    b        ;setup return addr
  405.     push    h
  406.     xchg
  407.     ret            ;call pliproc (param)
  408. clresprtn:            ;return here from pliproc call
  409.     push    h        ;save returned result
  410.     lxi    h,4
  411.     dad    sp
  412.     xchg            ;DE = .uqcb
  413.     mvi    c,wrquef
  414.     call    ?bdos        ;write proc adr to queue
  415.     pop    d        ;DE = result returned from pliproc
  416.     lxi    h,14
  417.     dad    sp
  418.     sphl            ;discard uqcb on stack
  419.     xchg
  420.     ret            ;return with HL = pliproc()
  421.     ;
  422. ;***********************************************************
  423. ;*                               *
  424. ;***********************************************************
  425. parse:    ;parse filename (#152)
  426.     ;1->addr(pfcb)
  427.     mvi    c,parsef    ;parse filename function
  428.     jmp    getp2i        ;DE = .pfcb
  429.                 ;return through bdos
  430. ;
  431. ;***********************************************************
  432. ;*                               *
  433. ;***********************************************************
  434. getcon:    ;get console number (#153)
  435.     mvi    c,getconf    ;get console function
  436.     jmp    ?bdos        ;return through bdos
  437. ;
  438. ;***********************************************************
  439. ;*                               *
  440. ;***********************************************************
  441. sysdat:    ;return system data page adr (#154)
  442.     mvi    c,sysdatf    ;get system data pg adr fn
  443.     jmp    ?bdos        ;return through bdos
  444. ;
  445. ;***********************************************************
  446. ;*                               *
  447. ;***********************************************************
  448. gettod:    ;get time and date (#155)
  449.     ;1->addr(todadr)
  450.     mvi    c,gettodf    ;get time and date function
  451.     jmp    getp2i        ;DE = .todadr
  452.                 ;return through bdos
  453. ;
  454. ;***********************************************************
  455. ;*                               *
  456. ;***********************************************************
  457. rpdadr:    ;return process descr adr (#156)
  458.     mvi    c,rpdadrf    ;return Proc dscr adr fn
  459.     jmp    ?bdos        ;return through bdos
  460. ;
  461. ;***********************************************************
  462. ;*                               *
  463. ;***********************************************************
  464. abtspr:    ;abort specified process (#57)
  465.     ;1->addr(abtpb)
  466.     mvi    c,abtsprf    ;abort specified proc fn
  467.     jmp    getp3i        ;DE = .abtpb
  468.                 ;return through bdos
  469. ;
  470. ;***********************************************************
  471. ;*                               *
  472. ;***********************************************************
  473. disabl: ;disable interrupts
  474.     di
  475.     ret
  476. ;
  477. ;***********************************************************
  478. ;*                               *
  479. ;***********************************************************
  480. enable:    ;enable interrupts
  481.     ei
  482.     ret
  483. ;
  484. ;***********************************************************
  485. ;*                               *
  486. ;***********************************************************
  487. vers:    ;get version number (#12)  CP/M function
  488.     mvi    c,versf
  489.     jmp    ?bdos        ;return through bdos
  490. ;
  491. ;***********************************************************
  492. ;*                               *
  493. ;***********************************************************
  494.     end
  495.