;~x!ins MP/prm="ti:+FILE/nl/ni" ;+ ; File i/o macros - does csi parsing and block i/o. ; The general usage: ; CSI ;data space ; fdblabel: ; FDB lun B/R [block] ;data space ; ;block=block io buf ; ; FILE string-address string-len ;instruction space ; OPEN #fdblabel wrt/rd/upd/mod ;instruction space ; bcc ok ; note: use oldfile.mac for production version - this one's for speed ;- $MACRO CSI .MCALL CSI$ CSI$ .EVEN CSIBLK:: .BLKB C.SIZE $ENDM ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $MACRO FILE ADDR-OF-STRING LEN-STR ;I%DOUT <;FILE addr-of-string len-str> ?? 4 ; .MCALL CSI$1,CSI$2 ; I%DOUT <;CSI$1 #CSIBLK,#@1,#@2> MOV #CSIBLK,R0 MOV #@1,C.CMLD+2(R0) MOV #@2,C.CMLD(R0) JSR PC,.CSI1 BCS #@4 ; I%DOUT <;CSI$2 ,OUTPUT> MOVB #CS.OUT,(R0) JSR PC,.CSI2 #@4=. $ENDM ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $MACRO FDB lun,B/R,[block] ;I%DOUT <;FDB lun B/R,[block]> .mcall fdbdf$,cbyte$,cword$,fdoff$ fdoff$ DEF$L fdbdf$ ; I%DOUT <;fdop$a #@1,csiblk+c.dsds> CBYTE$ <#@1>,F.LUN CWORD$ ,F.DSPT I%IDN <#@2> < fdat$a r.fix,,512.> I%IDN <#@2> < CBYTE$ ,F.RACC> I%IDN <#@2> < fdat$a r.var,fd.cr> I%NB <#@3> <** <> < .mcall fdbk$a> < fdbk$a #@3,512.>> $ENDM ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $MACRO fdat$a just a subset of this, only what we need ; .MACRO FDAT$A RTYP,RATT,RSIZ,CNTG,ALOC I%NB <#@1> < CBYTE$ <#@1>,F.RTYP> I%NB <#@2> < CBYTE$ <#@2>,F.RATT> I%NB <#@3> < CWORD$ <#@3>,F.RSIZ> $ENDM ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; Original, the above is much faster thru macro-11 ;$MACRO FDB lun,B/R,[block] ;I%DOUT <;FDB lun B/R,[block]> ; .mcall fdop$a,fdat$a,fdbdf$,fdrc$a,fdbk$a ; fdbdf$ ; fdop$a #@1,csiblk+c.dsds ;I%IDN <#@2> < fdat$a r.fix,,512.> ;I%IDN <#@2> < fdrc$a fd.rwm> ;I%IDN <#@2> < fdat$a r.var,fd.cr> ;I%NB <#@3> < fdbk$a #@3,512.> ;$ENDM ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $MACRO OPEN fdb RD/WRT/UPD/MOD ;I%DOUT <;OPEN fdb rd/wrt/upd/mod> ; .mcall open$ ; I%DOUT <;open$ #@1,#fo.#@2> MOV #@1,R0 MOVB #fo.#@2,F.FACC(R0) JSR PC,.OPEN $ENDM ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; simple block i/o always waits, uses ef 20. $MACRO READ-BLOCK fdb block# input-buffer ; .mcall read$,wait$ ;READ$ #@1,#@3,#512.,#@2,#20. ;WAIT$ ; I%DOUT <;READ$ #@1,#@3,#512.,#@2,#20.> MOV #@1,R0 MOV #@3,F.BKDS+2(R0) MOV #512.,F.BKDS(R0) MOV #@2,-(SP) MOV @(SP),F.BKVB(R0) ADD #2,(SP) MOV @(SP)+,F.BKVB+2(R0) MOVB #20.,F.BKEF(R0) JSR PC,.READ IF CC ; I%DOUT <;WAIT$> JSR PC,.WAIT FI $ENDM $MACRO READ-LINE fdb input-buffer [max-size] .mcall get$ get$ #@1 #@2 #@3 mov r1,-(sp) mov f.nrbd+2(r0),r1 add f.nrbd(r0),r1 clrb (r1) mov (sp)+,r1 $ENDM