home *** CD-ROM | disk | FTP | other *** search
/ norge.freeshell.org (192.94.73.8) / 192.94.73.8.tar / 192.94.73.8 / pub / computers / cpm / alphatronic / DRIPAK.ZIP / CPM_3-0 / SOURCES / PLIDIO.ASM < prev    next >
Assembly Source File  |  1982-12-31  |  26KB  |  619 lines

  1.         name    'DIOMOD'
  2.         title   'Direct CP/M Calls From PL/I-80'
  3. ;
  4. ;***********************************************************
  5. ;*                                                         *
  6. ;*      cp/m calls from pl/i for direct i/o                *
  7. ;*                                                         *
  8. ;***********************************************************
  9.         public  memptr  ;return pointer to base of free mem
  10.         public  memsiz  ;return size of memory in bytes
  11.         public  memwds  ;return size of memory in words
  12.         public  dfcb0   ;return address of default fcb 0
  13.         public  dfcb1   ;return address of default fcb 1
  14.         public  dbuff   ;return address of default buffer
  15.         public  reboot  ;system reboot (#0)
  16.         public  rdcon   ;read console character (#1)
  17.         public  wrcon   ;write console character(#2)
  18.         public  rdrdr   ;read reader character (#3)
  19.         public  wrpun   ;write punch character (#4)
  20.         public  wrlst   ;write list character (#5)
  21.         public  coninp  ;direct console input (#6a)
  22.         public  conout  ;direct console output (#6b)
  23.         public  rdstat  ;read console status (#6c)
  24.         public  getio   ;get io byte (#8)
  25.         public  setio   ;set i/o byte (#9)
  26.         public  wrstr   ;write string (#10)
  27.         public  rdbuf   ;read console buffer (#10)
  28.         public  break   ;get console status (#11)
  29.         public  vers    ;get version number (#12)
  30.         public  reset   ;reset disk system (#13)
  31.         public  select  ;select disk (#14)
  32.         public  open    ;open file (#15)
  33.         public  close   ;close file (#16)
  34.         public  sear    ;search for file (#17)
  35.         public  searn   ;search for next (#18)
  36.         public  delete  ;delete file (#19)
  37.         public  rdseq   ;read file sequential mode (#20)
  38.         public  wrseq   ;write file sequential mode (#21)
  39.         public  make    ;create file (#22)
  40.         public  rename  ;rename file (#23)
  41.         public  logvec  ;return login vector (#24)
  42.         public  curdsk  ;return current disk number (#25)
  43.         public  setdma  ;set DMA address (#26)
  44.         public  allvec  ;return address of alloc vector (#27)
  45.         public  wpdisk  ;write protect disk (#28)
  46.         public  rovec   ;return read/only vector (#29)
  47.         public  filatt  ;set file attributes (#30)
  48.         public  getdpb  ;get base of disk parm block (#31)
  49.         public  getusr  ;get user code (#32a)
  50.         public  setusr  ;set user code (#32b)
  51.         public  rdran   ;read random (#33)
  52.         public  wrran   ;write random (#34)
  53.         public  filsiz  ;random file size (#35)
  54.         public  setrec  ;set random record pos (#36)
  55.         public  resdrv  ;reset drive (#37)
  56.         public  wrranz  ;write random, zero fill (#40)
  57.         public  sgscb   ;set/get System Control Block byte/word
  58. ;
  59. ;
  60.         extrn   ?begin  ;beginning of free list
  61.         extrn   ?boot   ;system reboot entry point
  62.         extrn   ?bdos   ;bdos entry point
  63.         extrn   ?dfcb0  ;default fcb 0
  64.         extrn   ?dfcb1  ;default fcb 1
  65.         extrn   ?dbuff  ;default buffer
  66. ;
  67. ;***********************************************************
  68. ;*                                                         *
  69. ;*        equates for interface to cp/m bdos               *
  70. ;*                                                         *
  71. ;***********************************************************
  72. cr      equ     0dh     ;carriage return
  73. lf      equ     0ah     ;line feed
  74. eof     equ     1ah     ;end of file
  75. ;
  76. readc   equ     1       ;read character from console
  77. writc   equ     2       ;write console character
  78. rdrf    equ     3       ;reader input
  79. punf    equ     4       ;punch output
  80. listf   equ     5       ;list output function
  81. diof    equ     6       ;direct i/o, version 2.0
  82. getiof  equ     7       ;get i/o byte
  83. setiof  equ     8       ;set i/o byte
  84. printf  equ     9       ;print string function
  85. rdconf  equ     10      ;read console buffer
  86. statf   equ     11      ;return console status
  87. versf   equ     12      ;get version number
  88. resetf  equ     13      ;system reset
  89. seldf   equ     14      ;select disk function
  90. openf   equ     15      ;open file function
  91. closef  equ     16      ;close file
  92. serchf  equ     17      ;search for file
  93. serchn  equ     18      ;search next
  94. deletf  equ     19      ;delete file
  95. readf   equ     20      ;read next record
  96. writf   equ     21      ;write next record
  97. makef   equ     22      ;make file
  98. renamf  equ     23      ;rename file
  99. loginf  equ     24      ;get login vector
  100. cdiskf  equ     25      ;get current disk number
  101. setdmf  equ     26      ;set dma function
  102. getalf  equ     27      ;get allocation base
  103. wrprof  equ     28      ;write protect disk
  104. getrof  equ     29      ;get r/o vector
  105. setatf  equ     30      ;set file attributes
  106. getdpf  equ     31      ;get disk parameter block
  107. userf   equ     32      ;set/get user code
  108. rdranf  equ     33      ;read random
  109. wrranf  equ     34      ;write random
  110. filszf  equ     35      ;compute file size
  111. setrcf  equ     36      ;set random record position
  112. rsdrvf  equ     37      ;reset drive function
  113. wrrnzf  equ     40      ;write random zero fill
  114. scbf    equ     49      ;set/get SCB
  115. ;
  116. ;       utility functions
  117. ;***********************************************************
  118. ;*                                                         *
  119. ;*       general purpose routines used upon entry          *
  120. ;*                                                         *
  121. ;***********************************************************
  122. ;
  123. getp1:  ;get single byte parameter to register e
  124.         mov     e,m             ;low (addr)
  125.         inx     h
  126.         mov     d,m             ;high(addr)
  127.         xchg                    ;hl = .char
  128.         mov     e,m             ;to register e
  129.         ret
  130. ;
  131. getp2:  ;get single word value to DE
  132. getp2i: ;(equivalent to getp2)
  133.         call    getp1
  134.         inx     h
  135.         mov     d,m             ;get high byte as well
  136.         ret
  137. ;
  138. getver: ;get cp/m or mp/m version number
  139.         push    h               ;save possible data adr
  140.         mvi     c,versf
  141.         call    ?bdos
  142.         pop     h               ;recall data addr
  143.         ret
  144. ;
  145. chkv20: ;check for version 2.0 or greater
  146.         call    getver
  147.         cpi     20
  148.         rnc                     ;return if > 2.0
  149. ;       error message and stop
  150.         jmp     vererr          ;version error
  151. ;
  152. chkv22: ;check for version 2.2 or greater
  153.         call    getver
  154.         cpi     22h
  155.         rnc                     ;return if >= 2.2
  156. vererr:
  157.         ;version error, report and terminate
  158.         lxi     d,vermsg
  159.         mvi     c,printf
  160.         call    ?bdos           ;write message
  161.         jmp     ?boot           ;and reboot
  162. vermsg: db      cr,lf,'Later CP/M or MP/M Version Required$'
  163. ;
  164. ;***********************************************************
  165. ;*                                                         *
  166. ;***********************************************************
  167. memptr: ;return pointer to base of free storage
  168.         lhld    ?begin
  169.         ret
  170. ;
  171. ;***********************************************************
  172. ;*                                                         *
  173. ;***********************************************************
  174. memsiz: ;return size of free memory in bytes
  175.         lhld    ?bdos+1         ;base of bdos
  176.         xchg                    ;de = .bdos
  177.         lhld    ?begin          ;beginning of free storage
  178.         mov     a,e             ;low(.bdos)
  179.         sub     l               ;-low(begin)
  180.         mov     l,a             ;back to l
  181.         mov     a,d             ;high(.bdos)
  182.         sbb     h
  183.         mov     h,a             ;hl = mem size remaining
  184.         ret
  185. ;
  186. ;***********************************************************
  187. ;*                                                         *
  188. ;***********************************************************
  189. memwds: ;return size of free memory in words
  190.         call    memsiz          ;hl = size in bytes
  191.         mov     a,h             ;high(size)
  192.         ora     a               ;cy = 0
  193.         rar                     ;cy = ls bit
  194.         mov     h,a             ;back to h
  195.         mov     a,l             ;low(size)
  196.         rar                     ;include ls bit
  197.         mov     l,a             ;back to l
  198.         ret                     ;with wds in hl
  199. ;
  200. ;***********************************************************
  201. ;*                                                         *
  202. ;***********************************************************
  203. dfcb0:  ;return address of default fcb 0
  204.         lxi     h,?dfcb0
  205.         ret
  206. ;
  207. ;***********************************************************
  208. ;*                                                         *
  209. ;***********************************************************
  210. dfcb1:  ;return address of default fcb 1
  211.         lxi     h,?dfcb1
  212.         ret
  213. ;
  214. ;***********************************************************
  215. ;*                                                         *
  216. ;***********************************************************
  217. dbuff:  ;return address of default buffer
  218.         lxi     h,?dbuff
  219.         ret
  220. ;
  221. ;***********************************************************
  222. ;*                                                         *
  223. ;***********************************************************
  224. reboot: ;system reboot (#0)
  225.         jmp     ?boot
  226. ;
  227. ;***********************************************************
  228. ;*                                                         *
  229. ;***********************************************************
  230. rdcon:  ;read console character (#1)
  231.         ;return character value to stack
  232.         mvi     c,readc
  233.         jmp     chrin           ;common code to read char
  234. ;
  235. ;***********************************************************
  236. ;*                                                         *
  237. ;***********************************************************
  238. wrcon:  ;write console character(#2)
  239.         ;1->char(1)
  240.         mvi     c,writc         ;console write function
  241.         jmp     chrout          ;to write the character
  242. ;
  243. ;***********************************************************
  244. ;*                                                         *
  245. ;***********************************************************
  246. rdrdr:  ;read reader character (#3)
  247.         mvi     c,rdrf          ;reader function
  248. chrin:
  249.         ;common code for character input
  250.         call    ?bdos           ;value returned to A
  251.         pop     h               ;return address
  252.         push    psw             ;character to stack
  253.         inx     sp              ;delete flags
  254.         mvi     a,1             ;character length is 1
  255.         pchl                    ;back to calling routine
  256. ;
  257. ;***********************************************************
  258. ;*                                                         *
  259. ;***********************************************************
  260. wrpun:  ;write punch character (#4)
  261.         ;1->char(1)
  262.         mvi     c,punf          ;punch output function
  263.         jmp     chrout          ;common code to write chr
  264. ;
  265. ;***********************************************************
  266. ;*                                                         *
  267. ;***********************************************************
  268. wrlst:  ;write list character (#5)
  269.         ;1->char(1)
  270.         mvi     c,listf         ;list output function
  271. chrout:
  272.         ;common code to write character
  273.         ;1-> character to write
  274.         call    getp1           ;output char to register e
  275.         jmp     ?bdos           ;to write and return
  276. ;
  277. ;***********************************************************
  278. ;*                                                         *
  279. ;***********************************************************
  280. coninp: ;perform console input, char returned in stack
  281.         lxi     h,chrstr        ;return address
  282.         push    h               ;to stack for return
  283.         lhld    ?boot+1         ;base of bios jmp vector
  284.         lxi     d,2*3           ;offset to jmp conin
  285.         dad     d
  286.         pchl                    ;return to chrstr
  287. ;
  288. chrstr: ;create character string, length 1
  289.         pop     h               ;recall return address
  290.         push    psw             ;save character
  291.         inx     sp              ;delete psw
  292.         mvi     a,1             ;string length is 1
  293.         pchl                    ;return to caller
  294. ;
  295. ;***********************************************************
  296. ;*                                                         *
  297. ;***********************************************************
  298. conout: ;direct console output
  299.         ;1->char(1)
  300.         call    getp1           ;get parameter
  301.         mov     c,e             ;character to c
  302.         lhld    ?boot+1         ;base of bios jmp
  303.         lxi     d,3*3           ;console output offset
  304.         dad     d               ;hl = .jmp conout
  305.         pchl                    ;return through handler
  306. ;
  307. ;***********************************************************
  308. ;*                                                         *
  309. ;***********************************************************
  310. rdstat: ;direct console status read
  311.         lxi     h,rdsret        ;read status return
  312.         push    h               ;return to rdsret
  313.         lhld    ?boot+1         ;base of jmp vector
  314.         lxi     d,1*3           ;offset to .jmp const
  315.         dad     d               ;hl = .jmp const
  316.         pchl
  317. ;
  318. ;***********************************************************
  319. ;*                                                         *
  320. ;***********************************************************
  321. getio:  ;get io byte (#8)
  322.         mvi     c,getiof
  323.         jmp     ?bdos           ;value returned to A
  324. ;
  325. ;***********************************************************
  326. ;*                                                         *
  327. ;***********************************************************
  328. setio:  ;set i/o byte (#9)
  329.         ;1->i/o byte
  330.         call    getp1           ;new i/o byte to E
  331.         mvi     c,setiof
  332.         jmp     ?bdos           ;return through bdos
  333. ;
  334. ;***********************************************************
  335. ;*                                                         *
  336. ;***********************************************************
  337. wrstr:  ;write string (#10)
  338.         ;1->addr(string)
  339.         call    getp2           ;get parameter value to DE
  340.         mvi     c,printf        ;print string function
  341.         jmp     ?bdos           ;return through bdos
  342. ;
  343. ;***********************************************************
  344. ;*                                                         *
  345. ;***********************************************************
  346. rdbuf:  ;read console buffer (#10)
  347.         ;1->addr(buff)
  348.         call    getp2i          ;DE = .buff
  349.         mvi     c,rdconf        ;read console function
  350.         jmp     ?bdos           ;return through bdos
  351. ;
  352. ;***********************************************************
  353. ;*                                                         *
  354. ;***********************************************************
  355. break:  ;get console status (#11)
  356.         mvi     c,statf
  357.         call    ?bdos           ;return through bdos
  358. ;
  359. rdsret: ;return clean true value
  360.         ora     a               ;zero?
  361.         rz                      ;return if so
  362.         mvi     a,0ffh          ;clean true value
  363.         ret
  364. ;
  365. ;***********************************************************
  366. ;*                                                         *
  367. ;***********************************************************
  368. vers:   ;get version number (#12)
  369.         mvi     c,versf
  370.         jmp     ?bdos           ;return through bdos
  371. ;
  372. ;***********************************************************
  373. ;*                                                         *
  374. ;***********************************************************
  375. reset:  ;reset disk system (#13)
  376.         mvi     c,resetf
  377.         jmp     ?bdos
  378. ;
  379. ;***********************************************************
  380. ;*                                                         *
  381. ;***********************************************************
  382. select: ;select disk (#14)
  383.         ;1->fixed(7) drive number
  384.         call    getp1           ;disk number to E
  385.         mvi     c,seldf
  386.         jmp     ?bdos           ;return through bdos
  387. ;***********************************************************
  388. ;*                                                         *
  389. ;***********************************************************
  390. open:   ;open file (#15)
  391.         ;1-> addr(fcb)
  392.         call    getp2i          ;fcb address to de
  393.         mvi     c,openf
  394.         jmp     ?bdos           ;return through bdos
  395. ;
  396. ;***********************************************************
  397. ;*                                                         *
  398. ;***********************************************************
  399. close:  ;close file (#16)
  400.         ;1-> addr(fcb)
  401.         call    getp2i          ;.fcb to DE
  402.         mvi     c,closef
  403.         jmp     ?bdos           ;return through bdos
  404. ;
  405. ;***********************************************************
  406. ;*                                                         *
  407. ;***********************************************************
  408. sear:   ;search for file (#17)
  409.         ;1-> addr(fcb)
  410.         call    getp2i          ;.fcb to DE
  411.         mvi     c,serchf
  412.         jmp     ?bdos
  413. ;
  414. ;***********************************************************
  415. ;*                                                         *
  416. ;***********************************************************
  417. searn:  ;search for next (#18)
  418.         mvi     c,serchn        ;search next function
  419.         jmp     ?bdos           ;return through bdos
  420. ;
  421. ;***********************************************************
  422. ;*                                                         *
  423. ;***********************************************************
  424. delete: ;delete file (#19)
  425.         ;1-> addr(fcb)
  426.         call    getp2i          ;.fcb to DE
  427.         mvi     c,deletf
  428.         jmp     ?bdos           ;return through bdos
  429. ;
  430. ;***********************************************************
  431. ;*                                                         *
  432. ;***********************************************************
  433. rdseq:  ;read file sequential mode (#20)
  434.         ;1-> addr(fcb)
  435.         call    getp2i          ;.fcb to DE
  436.         mvi     c,readf
  437.         jmp     ?bdos           ;return through bdos
  438. ;
  439. ;***********************************************************
  440. ;*                                                         *
  441. ;***********************************************************
  442. wrseq:  ;write file sequential mode (#21)
  443.         ;1-> addr(fcb)
  444.         call    getp2i          ;.fcb to DE
  445.         mvi     c,writf
  446.         jmp     ?bdos           ;return through bdos
  447. ;
  448. ;***********************************************************
  449. ;*                                                         *
  450. ;***********************************************************
  451. make:   ;create file (#22)
  452.         ;1-> addr(fcb)
  453.         call    getp2i          ;.fcb to DE
  454.         mvi     c,makef
  455.         jmp     ?bdos           ;return through bdos
  456. ;
  457. ;***********************************************************
  458. ;*                                                         *
  459. ;***********************************************************
  460. rename: ;rename file (#23)
  461.         ;1-> addr(fcb)
  462.         call    getp2i          ;.fcb to DE
  463.         mvi     c,renamf
  464.         jmp     ?bdos           ;return through bdos
  465. ;
  466. ;***********************************************************
  467. ;*                                                         *
  468. ;***********************************************************
  469. logvec: ;return login vector (#24)
  470.         mvi     c,loginf
  471.         jmp     ?bdos           ;return through BDOS
  472. ;
  473. ;***********************************************************
  474. ;*                                                         *
  475. ;***********************************************************
  476. curdsk: ;return current disk number (#25)
  477.         mvi     c,cdiskf
  478.         jmp     ?bdos           ;return value in A
  479. ;
  480. ;***********************************************************
  481. ;*                                                         *
  482. ;***********************************************************
  483. setdma: ;set DMA address (#26)
  484.         ;1-> pointer (dma address)
  485.         call    getp2           ;dma address to DE
  486.         mvi     c,setdmf
  487.         jmp     ?bdos           ;return through bdos
  488. ;
  489. ;***********************************************************
  490. ;*                                                         *
  491. ;***********************************************************
  492. allvec: ;return address of allocation vector (#27)
  493.         mvi     c,getalf
  494.         jmp     ?bdos           ;return through bdos
  495. ;
  496. ;***********************************************************
  497. ;*                                                         *
  498. ;***********************************************************
  499. wpdisk: ;write protect disk (#28)
  500.         call    chkv20          ;must be 2.0 or greater
  501.         mvi     c,wrprof
  502.         jmp     ?bdos
  503. ;
  504. ;***********************************************************
  505. ;*                                                         *
  506. ;***********************************************************
  507. rovec:  ;return read/only vector (#29)
  508.         call    chkv20          ;must be 2.0 or greater
  509.         mvi     c,getrof
  510.         jmp     ?bdos           ;value returned in HL
  511. ;
  512. ;***********************************************************
  513. ;*                                                         *
  514. ;***********************************************************
  515. filatt: ;set file attributes (#30)
  516.         ;1-> addr(fcb)
  517.         call    chkv20          ;must be 2.0 or greater
  518.         call    getp2i          ;.fcb to DE
  519.         mvi     c,setatf
  520.         jmp     ?bdos
  521. ;
  522. ;***********************************************************
  523. ;*                                                         *
  524. ;***********************************************************
  525. getdpb: ;get base of current disk parm block (#31)
  526.         call    chkv20          ;check for 2.0 or greater
  527.         mvi     c,getdpf
  528.         jmp     ?bdos           ;addr returned in HL
  529. ;
  530. ;***********************************************************
  531. ;*                                                         *
  532. ;***********************************************************
  533. getusr: ;get user code to register A
  534.         call    chkv20          ;check for 2.0 or greater
  535.         mvi     e,0ffh          ;to get user code
  536.         mvi     c,userf
  537.         jmp     ?bdos
  538. ;
  539. ;***********************************************************
  540. ;*                                                         *
  541. ;***********************************************************
  542. setusr: ;set user code
  543.         call    chkv20          ;check for 2.0 or greater
  544.         call    getp1           ;code to E
  545.         mvi     c,userf
  546.         jmp     ?bdos
  547. ;
  548. ;***********************************************************
  549. ;*                                                         *
  550. ;***********************************************************
  551. rdran:  ;read random (#33)
  552.         ;1-> addr(fcb)
  553.         call    chkv20          ;check for 2.0 or greater
  554.         call    getp2i          ;.fcb to DE
  555.         mvi     c,rdranf
  556.         jmp     ?bdos           ;return through bdos
  557. ;
  558. ;***********************************************************
  559. ;*                                                         *
  560. ;***********************************************************
  561. wrran:  ;write random (#34)
  562.         ;1-> addr(fcb)
  563.         call    chkv20          ;check for 2.0 or greater
  564.         call    getp2i          ;.fcb to DE
  565.         mvi     c,wrranf
  566.         jmp     ?bdos           ;return through bdos
  567. ;
  568. ;***********************************************************
  569. ;*                                                         *
  570. ;***********************************************************
  571. filsiz: ;compute file size (#35)
  572.         call    chkv20          ;must be 2.0 or greater
  573.         call    getp2           ;.fcb to DE
  574.         mvi     c,filszf
  575.         jmp     ?bdos           ;return through bdos
  576. ;
  577. ;***********************************************************
  578. ;*                                                         *
  579. ;***********************************************************
  580. setrec: ;set random record position (#36)
  581.         call    chkv20          ;must be 2.0 or greater
  582.         call    getp2           ;.fcb to DE
  583.         mvi     c,setrcf
  584.         jmp     ?bdos           ;return through bdos
  585. ;
  586. ;***********************************************************
  587. ;*                                                         *
  588. ;***********************************************************
  589. resdrv: ;reset drive function (#37)
  590.         ;1->drive vector - bit(16)
  591.         call    chkv22          ;must be 2.2 or greater
  592.         call    getp2           ;drive reset vector to DE
  593.         mvi     c,rsdrvf
  594.         jmp     ?bdos           ;return through bdos
  595. ;
  596. ;***********************************************************
  597. ;*                                                         *
  598. ;***********************************************************
  599. wrranz: ;write random, zero fill function
  600.         ;1-> addr(fcb)
  601.         call    chkv22  ;must be 2.2 or greater
  602.         call    getp2i          ;.fcb to DE
  603.         mvi     c,wrrnzf
  604.         jmp     ?bdos
  605. ;
  606. ;***********************************************************
  607. ;*                                                         *
  608. ;***********************************************************
  609. sgscb: ;set/get SCB byte/word
  610.        ;1-> addr(SCB structure)
  611.        call     getp2
  612.        mvi      c,scbf
  613.        jmp      ?bdos
  614. ;
  615. ;***********************************************************
  616. ;*                                                         *
  617. ;***********************************************************
  618.         end
  619.