name 'DIOMOD' title 'Direct CP/M Calls From PL/I-80' ; ;*********************************************************** ;* * ;* cp/m calls from pl/i for direct i/o * ;* * ;*********************************************************** public memptr ;return pointer to base of free mem public memsiz ;return size of memory in bytes public memwds ;return size of memory in words public dfcb0 ;return address of default fcb 0 public dfcb1 ;return address of default fcb 1 public dbuff ;return address of default buffer public reboot ;system reboot (#0) public rdcon ;read console character (#1) public wrcon ;write console character(#2) public rdrdr ;read reader character (#3) public wrpun ;write punch character (#4) public wrlst ;write list character (#5) public coninp ;direct console input (#6a) public conout ;direct console output (#6b) public rdstat ;read console status (#6c) public getio ;get io byte (#8) public setio ;set i/o byte (#9) public wrstr ;write string (#10) public rdbuf ;read console buffer (#10) public break ;get console status (#11) public vers ;get version number (#12) public reset ;reset disk system (#13) public select ;select disk (#14) public open ;open file (#15) public close ;close file (#16) public sear ;search for file (#17) public searn ;search for next (#18) public delete ;delete file (#19) public rdseq ;read file sequential mode (#20) public wrseq ;write file sequential mode (#21) public make ;create file (#22) public rename ;rename file (#23) public logvec ;return login vector (#24) public curdsk ;return current disk number (#25) public setdma ;set DMA address (#26) public allvec ;return address of alloc vector (#27) public wpdisk ;write protect disk (#28) public rovec ;return read/only vector (#29) public filatt ;set file attributes (#30) public getdpb ;get base of disk parm block (#31) public getusr ;get user code (#32a) public setusr ;set user code (#32b) public rdran ;read random (#33) public wrran ;write random (#34) public filsiz ;random file size (#35) public setrec ;set random record pos (#36) public resdrv ;reset drive (#37) public wrranz ;write random, zero fill (#40) public sgscb ;set/get System Control Block byte/word ; ; extrn ?begin ;beginning of free list extrn ?boot ;system reboot entry point extrn ?bdos ;bdos entry point extrn ?dfcb0 ;default fcb 0 extrn ?dfcb1 ;default fcb 1 extrn ?dbuff ;default buffer ; ;*********************************************************** ;* * ;* equates for interface to cp/m bdos * ;* * ;*********************************************************** cr equ 0dh ;carriage return lf equ 0ah ;line feed eof equ 1ah ;end of file ; readc equ 1 ;read character from console writc equ 2 ;write console character rdrf equ 3 ;reader input punf equ 4 ;punch output listf equ 5 ;list output function diof equ 6 ;direct i/o, version 2.0 getiof equ 7 ;get i/o byte setiof equ 8 ;set i/o byte printf equ 9 ;print string function rdconf equ 10 ;read console buffer statf equ 11 ;return console status versf equ 12 ;get version number resetf equ 13 ;system reset seldf equ 14 ;select disk function openf equ 15 ;open file function closef equ 16 ;close file serchf equ 17 ;search for file serchn equ 18 ;search next deletf equ 19 ;delete file readf equ 20 ;read next record writf equ 21 ;write next record makef equ 22 ;make file renamf equ 23 ;rename file loginf equ 24 ;get login vector cdiskf equ 25 ;get current disk number setdmf equ 26 ;set dma function getalf equ 27 ;get allocation base wrprof equ 28 ;write protect disk getrof equ 29 ;get r/o vector setatf equ 30 ;set file attributes getdpf equ 31 ;get disk parameter block userf equ 32 ;set/get user code rdranf equ 33 ;read random wrranf equ 34 ;write random filszf equ 35 ;compute file size setrcf equ 36 ;set random record position rsdrvf equ 37 ;reset drive function wrrnzf equ 40 ;write random zero fill scbf equ 49 ;set/get SCB ; ; utility functions ;*********************************************************** ;* * ;* general purpose routines used upon entry * ;* * ;*********************************************************** ; 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: ;get single word value to DE getp2i: ;(equivalent to getp2) call getp1 inx h mov d,m ;get high byte as well ret ; getver: ;get cp/m or mp/m version number push h ;save possible data adr mvi c,versf call ?bdos pop h ;recall data addr ret ; chkv20: ;check for version 2.0 or greater call getver cpi 20 rnc ;return if > 2.0 ; error message and stop jmp vererr ;version error ; chkv22: ;check for version 2.2 or greater call getver cpi 22h rnc ;return if >= 2.2 vererr: ;version error, report and terminate lxi d,vermsg mvi c,printf call ?bdos ;write message jmp ?boot ;and reboot vermsg: db cr,lf,'Later CP/M or MP/M Version Required$' ; ;*********************************************************** ;* * ;*********************************************************** memptr: ;return pointer to base of free storage lhld ?begin ret ; ;*********************************************************** ;* * ;*********************************************************** memsiz: ;return size of free memory in bytes lhld ?bdos+1 ;base of bdos xchg ;de = .bdos lhld ?begin ;beginning of free storage mov a,e ;low(.bdos) sub l ;-low(begin) mov l,a ;back to l mov a,d ;high(.bdos) sbb h mov h,a ;hl = mem size remaining ret ; ;*********************************************************** ;* * ;*********************************************************** memwds: ;return size of free memory in words call memsiz ;hl = size in bytes mov a,h ;high(size) ora a ;cy = 0 rar ;cy = ls bit mov h,a ;back to h mov a,l ;low(size) rar ;include ls bit mov l,a ;back to l ret ;with wds in hl ; ;*********************************************************** ;* * ;*********************************************************** dfcb0: ;return address of default fcb 0 lxi h,?dfcb0 ret ; ;*********************************************************** ;* * ;*********************************************************** dfcb1: ;return address of default fcb 1 lxi h,?dfcb1 ret ; ;*********************************************************** ;* * ;*********************************************************** dbuff: ;return address of default buffer lxi h,?dbuff ret ; ;*********************************************************** ;* * ;*********************************************************** reboot: ;system reboot (#0) jmp ?boot ; ;*********************************************************** ;* * ;*********************************************************** rdcon: ;read console character (#1) ;return character value to stack mvi c,readc jmp chrin ;common code to read char ; ;*********************************************************** ;* * ;*********************************************************** wrcon: ;write console character(#2) ;1->char(1) mvi c,writc ;console write function jmp chrout ;to write the character ; ;*********************************************************** ;* * ;*********************************************************** rdrdr: ;read reader character (#3) mvi c,rdrf ;reader function chrin: ;common code for character input call ?bdos ;value returned to A pop h ;return address push psw ;character to stack inx sp ;delete flags mvi a,1 ;character length is 1 pchl ;back to calling routine ; ;*********************************************************** ;* * ;*********************************************************** wrpun: ;write punch character (#4) ;1->char(1) mvi c,punf ;punch output function jmp chrout ;common code to write chr ; ;*********************************************************** ;* * ;*********************************************************** wrlst: ;write list character (#5) ;1->char(1) mvi c,listf ;list output function chrout: ;common code to write character ;1-> character to write call getp1 ;output char to register e jmp ?bdos ;to write and return ; ;*********************************************************** ;* * ;*********************************************************** coninp: ;perform console input, char returned in stack lxi h,chrstr ;return address push h ;to stack for return lhld ?boot+1 ;base of bios jmp vector lxi d,2*3 ;offset to jmp conin dad d pchl ;return to chrstr ; chrstr: ;create character string, length 1 pop h ;recall return address push psw ;save character inx sp ;delete psw mvi a,1 ;string length is 1 pchl ;return to caller ; ;*********************************************************** ;* * ;*********************************************************** conout: ;direct console output ;1->char(1) call getp1 ;get parameter mov c,e ;character to c lhld ?boot+1 ;base of bios jmp lxi d,3*3 ;console output offset dad d ;hl = .jmp conout pchl ;return through handler ; ;*********************************************************** ;* * ;*********************************************************** rdstat: ;direct console status read lxi h,rdsret ;read status return push h ;return to rdsret lhld ?boot+1 ;base of jmp vector lxi d,1*3 ;offset to .jmp const dad d ;hl = .jmp const pchl ; ;*********************************************************** ;* * ;*********************************************************** getio: ;get io byte (#8) mvi c,getiof jmp ?bdos ;value returned to A ; ;*********************************************************** ;* * ;*********************************************************** setio: ;set i/o byte (#9) ;1->i/o byte call getp1 ;new i/o byte to E mvi c,setiof jmp ?bdos ;return through bdos ; ;*********************************************************** ;* * ;*********************************************************** wrstr: ;write string (#10) ;1->addr(string) call getp2 ;get parameter value to DE mvi c,printf ;print string function jmp ?bdos ;return through bdos ; ;*********************************************************** ;* * ;*********************************************************** rdbuf: ;read console buffer (#10) ;1->addr(buff) call getp2i ;DE = .buff mvi c,rdconf ;read console function jmp ?bdos ;return through bdos ; ;*********************************************************** ;* * ;*********************************************************** break: ;get console status (#11) mvi c,statf call ?bdos ;return through bdos ; rdsret: ;return clean true value ora a ;zero? rz ;return if so mvi a,0ffh ;clean true value ret ; ;*********************************************************** ;* * ;*********************************************************** vers: ;get version number (#12) mvi c,versf jmp ?bdos ;return through bdos ; ;*********************************************************** ;* * ;*********************************************************** reset: ;reset disk system (#13) mvi c,resetf jmp ?bdos ; ;*********************************************************** ;* * ;*********************************************************** select: ;select disk (#14) ;1->fixed(7) drive number call getp1 ;disk number to E mvi c,seldf jmp ?bdos ;return through bdos ;*********************************************************** ;* * ;*********************************************************** open: ;open file (#15) ;1-> addr(fcb) call getp2i ;fcb address to de mvi c,openf jmp ?bdos ;return through bdos ; ;*********************************************************** ;* * ;*********************************************************** close: ;close file (#16) ;1-> addr(fcb) call getp2i ;.fcb to DE mvi c,closef jmp ?bdos ;return through bdos ; ;*********************************************************** ;* * ;*********************************************************** sear: ;search for file (#17) ;1-> addr(fcb) call getp2i ;.fcb to DE mvi c,serchf jmp ?bdos ; ;*********************************************************** ;* * ;*********************************************************** searn: ;search for next (#18) mvi c,serchn ;search next function jmp ?bdos ;return through bdos ; ;*********************************************************** ;* * ;*********************************************************** delete: ;delete file (#19) ;1-> addr(fcb) call getp2i ;.fcb to DE mvi c,deletf jmp ?bdos ;return through bdos ; ;*********************************************************** ;* * ;*********************************************************** rdseq: ;read file sequential mode (#20) ;1-> addr(fcb) call getp2i ;.fcb to DE mvi c,readf jmp ?bdos ;return through bdos ; ;*********************************************************** ;* * ;*********************************************************** wrseq: ;write file sequential mode (#21) ;1-> addr(fcb) call getp2i ;.fcb to DE mvi c,writf jmp ?bdos ;return through bdos ; ;*********************************************************** ;* * ;*********************************************************** make: ;create file (#22) ;1-> addr(fcb) call getp2i ;.fcb to DE mvi c,makef jmp ?bdos ;return through bdos ; ;*********************************************************** ;* * ;*********************************************************** rename: ;rename file (#23) ;1-> addr(fcb) call getp2i ;.fcb to DE mvi c,renamf jmp ?bdos ;return through bdos ; ;*********************************************************** ;* * ;*********************************************************** logvec: ;return login vector (#24) mvi c,loginf jmp ?bdos ;return through BDOS ; ;*********************************************************** ;* * ;*********************************************************** curdsk: ;return current disk number (#25) mvi c,cdiskf jmp ?bdos ;return value in A ; ;*********************************************************** ;* * ;*********************************************************** setdma: ;set DMA address (#26) ;1-> pointer (dma address) call getp2 ;dma address to DE mvi c,setdmf jmp ?bdos ;return through bdos ; ;*********************************************************** ;* * ;*********************************************************** allvec: ;return address of allocation vector (#27) mvi c,getalf jmp ?bdos ;return through bdos ; ;*********************************************************** ;* * ;*********************************************************** wpdisk: ;write protect disk (#28) call chkv20 ;must be 2.0 or greater mvi c,wrprof jmp ?bdos ; ;*********************************************************** ;* * ;*********************************************************** rovec: ;return read/only vector (#29) call chkv20 ;must be 2.0 or greater mvi c,getrof jmp ?bdos ;value returned in HL ; ;*********************************************************** ;* * ;*********************************************************** filatt: ;set file attributes (#30) ;1-> addr(fcb) call chkv20 ;must be 2.0 or greater call getp2i ;.fcb to DE mvi c,setatf jmp ?bdos ; ;*********************************************************** ;* * ;*********************************************************** getdpb: ;get base of current disk parm block (#31) call chkv20 ;check for 2.0 or greater mvi c,getdpf jmp ?bdos ;addr returned in HL ; ;*********************************************************** ;* * ;*********************************************************** getusr: ;get user code to register A call chkv20 ;check for 2.0 or greater mvi e,0ffh ;to get user code mvi c,userf jmp ?bdos ; ;*********************************************************** ;* * ;*********************************************************** setusr: ;set user code call chkv20 ;check for 2.0 or greater call getp1 ;code to E mvi c,userf jmp ?bdos ; ;*********************************************************** ;* * ;*********************************************************** rdran: ;read random (#33) ;1-> addr(fcb) call chkv20 ;check for 2.0 or greater call getp2i ;.fcb to DE mvi c,rdranf jmp ?bdos ;return through bdos ; ;*********************************************************** ;* * ;*********************************************************** wrran: ;write random (#34) ;1-> addr(fcb) call chkv20 ;check for 2.0 or greater call getp2i ;.fcb to DE mvi c,wrranf jmp ?bdos ;return through bdos ; ;*********************************************************** ;* * ;*********************************************************** filsiz: ;compute file size (#35) call chkv20 ;must be 2.0 or greater call getp2 ;.fcb to DE mvi c,filszf jmp ?bdos ;return through bdos ; ;*********************************************************** ;* * ;*********************************************************** setrec: ;set random record position (#36) call chkv20 ;must be 2.0 or greater call getp2 ;.fcb to DE mvi c,setrcf jmp ?bdos ;return through bdos ; ;*********************************************************** ;* * ;*********************************************************** resdrv: ;reset drive function (#37) ;1->drive vector - bit(16) call chkv22 ;must be 2.2 or greater call getp2 ;drive reset vector to DE mvi c,rsdrvf jmp ?bdos ;return through bdos ; ;*********************************************************** ;* * ;*********************************************************** wrranz: ;write random, zero fill function ;1-> addr(fcb) call chkv22 ;must be 2.2 or greater call getp2i ;.fcb to DE mvi c,wrrnzf jmp ?bdos ; ;*********************************************************** ;* * ;*********************************************************** sgscb: ;set/get SCB byte/word ;1-> addr(SCB structure) call getp2 mvi c,scbf jmp ?bdos ; ;*********************************************************** ;* * ;*********************************************************** end