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