name 'N8VEM' title 'N8VEM RomWBW 2.0 HBIOS Calls From PL/I-80' ;*********************************************************** ;* * ;* N8VEM 2.0 HBIOS calls from pl/i * ;* * ;*********************************************************** public getcfg ;copy syscfg to high memory location ;; 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) ;;; ;;; ;; 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 ; utility functions ;*********************************************************** ;* * ;* general purpose routines used upon entry * ;* * ;*********************************************************** ; DE -> destination for syscfg getcfg: mov e,m inx h mov d,m mvi b,0f0h ; GETSYSCFG db 0cfh ; rst 08 ret ;;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 ;; 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 ;;; ;;;*********************************************************** ;;;* * ;;;*********************************************************** end