Mercurial > hg > Members > kono > nitros9-code
changeset 2445:6231225a182e
Updated with SetStat and GetStat op entry points
author | boisy |
---|---|
date | Fri, 26 Feb 2010 12:38:07 +0000 |
parents | 597d98fc261e |
children | 0ae4857f8f82 |
files | level1/modules/rfm.asm |
diffstat | 1 files changed, 430 insertions(+), 309 deletions(-) [+] |
line wrap: on
line diff
--- a/level1/modules/rfm.asm Fri Feb 26 05:24:46 2010 +0000 +++ b/level1/modules/rfm.asm Fri Feb 26 12:38:07 2010 +0000 @@ -5,28 +5,28 @@ * 1 2010/02/20 AAW * first version - just send ops - nam RFM - ttl Remote File Manager - - IFP1 - use defsfile - use rfmdefs - use dwdefs.d - ENDC + nam RFM + ttl Remote File Manager -tylg set FlMgr+Objct -atrv set ReEnt+rev -rev set 0 -edition equ 1 + ifp1 + use defsfile + use rfmdefs + use dwdefs.d + endc - mod eom,RFMName,tylg,atrv,RFMEnt,size +tylg set FlMgr+Objct +atrv set ReEnt+rev +rev set 0 +edition equ 1 - -size equ . + mod eom,RFMName,tylg,atrv,RFMEnt,size -RFMName fcs /RFM/ - fcb edition +size equ . + + +RFMName fcs /RFM/ + fcb edition @@ -38,307 +38,428 @@ * U = Callers register stack pointer * -RFMEnt lbra create Create path - lbra open Open path - lbra makdir Makdir - lbra chgdir Chgdir - lbra delete Delete - lbra seek Seek - lbra read Read character - lbra write Write character - lbra readln ReadLn - lbra writln WriteLn - lbra getstt Get Status - lbra setstt Set Status - lbra close Close path +RFMEnt lbra create Create path + lbra open Open path + lbra makdir Makdir + lbra chgdir Chgdir + lbra delete Delete + lbra seek Seek + lbra read Read character + lbra write Write character + lbra readln ReadLn + lbra writln WriteLn + lbra getstt Get Status + lbra setstt Set Status + lbra close Close path + +create ldb #DW.create + bra create1 + + +open ldb #DW.open +create1 pshs u,y ; RD Regs + + ldx PD.DEV,y ; to our static storage + pshs x ; PD.DEV PD Regs -create ldb #DW.create - bra create1 +* put path # on stack + lda ,y + sta V.PATHNUM,x + pshs a ; p# PD.DEV PD Regs + +* put rfm op and DW op on stack + + lda #OP_VFM + pshs d ; DWOP RFMOP p# PD.DEV PD Regs - -open ldb #DW.open -create1 pshs u,y ; RD Regs +* TODO lets not create multiple buffers when multiple open/create on same path +* get system mem + ldd #256 + os9 F$SRqMem ; ask for D bytes (# bytes server said is coming) + ldx 3,s ; PD.DEV + stu V.BUF,x + + leax ,s ; point X to stack + ldy #3 ; 3 bytes to send + + ifgt Level-1 + ldu <D.DWSubAddr + else + ldu >D.DWSubAddr + endc + + jsr 6,u + leas 3,s ;clean stack PD.DEV PD Regs + +* now send path string - ldx PD.DEV,y ; to our static storage - pshs x ; PD.DEV PD Regs - - * put path # on stack - lda ,y - sta V.PATHNUM,x - pshs a ; p# PD.DEV PD Regs - - * put rfm op and DW op on stack - - lda #OP_VFM - pshs d ; DWOP RFMOP p# PD.DEV PD Regs - - * TODO lets not create multiple buffers when multiple open/create on same path - * get system mem - ldd #256 - os9 F$SRqMem ; ask for D bytes (# bytes server said is coming) - ldx 3,s ; PD.DEV - stu V.BUF,x - - leax ,s ; point X to stack - ldy #3 ; 3 bytes to send - - ifgt Level-1 - ldu <D.DWSubAddr - else - ldu >D.DWSubAddr - endc - - jsr 6,u - leas 3,s ;clean stack PD.DEV PD Regs - - * now send path string - - * copy path string +* copy path string + + clr ,-s ; set size ctr to 0 + + ldx <D.Proc ; get curr proc desc + ldb P$Task,x ; get task # + + ldx 5,s ; original U - Regs + ldx R$X,x ; should be X from caller + + ldy 1,s ; pd.dev + ldy V.BUF,y + +open1 os9 f$ldabx + sta ,y+ + leax 1,x + inc ,s + cmpa #C$CR + bne open1 + +* store advanced X in calling process (SCF does this.. ?) + leax -1,x + ldy 5,s ; original U + stx R$X,y - leas -1,s ; use stack for counter 0 PD.DEV PD Regs - clr ,s ; set size ctr to 0 - - - ldx <D.Proc get curr proc desc - ldb P$Task,x get task # - - ldx 5,s ; original U - Regs - ldx R$X,x ; should be X from caller - - ldy 1,s ; pd.dev - ldy V.BUF,y - -open1 os9 f$ldabx - sta ,y+ - leax 1,x - inc ,s - cmpa #$0D - bne open1 - - * store advanced X in calling process (SCF does this.. ?) - leax -1,x - ldy 5,s ; original U - stx R$X,y - - * send to server - clra - ldb ,s ; counter - tfr d,y ; set Y to pathlen - ldx 1,s ; pd.dev - ldx V.BUF,x - jsr 6,u - - * read response from server -> B - leax ,s - ldy #1 - jsr 3,u - - * pull server's response into B - puls b ; PD.DEV PD Regs - tstb - beq open2 - - orcc #1 ;set error -open2 leas 4,s ; Regs - puls u ; clean stack - rts +* send to server + clra + ldb ,s ; counter + tfr d,y ; set Y to pathlen + ldx 1,s ; pd.dev + ldx V.BUF,x + jsr 6,u + +* read response from server -> B + leax ,s + ldy #1 + jsr 3,u + +* pull server's response into B + puls b ; PD.DEV PD Regs + tstb + beq open2 + + orcc #1 ;set error +open2 leas 4,s ; Regs + puls u ; clean stack + rts + +makdir lda #DW.makdir + lbra sendit +chgdir lda #DW.chgdir + lbra sendit +delete lda #DW.delete + lbra sendit +seek lda #DW.seek + lbra sendit -makdir lda #DW.makdir - lbra sendit -chgdir lda #DW.chgdir - lbra sendit -delete lda #DW.delete - lbra sendit -seek lda #DW.seek - lbra sendit - -read ldb #DW.read - bra read1 ; join readln routine - - - -write lda #DW.write - lbra sendit - - - -readln ldb #DW.readln -read1 pshs y,u - - ldx PD.DEV,y ; to our static storage - pshs x ; PD.DEV PD Regs - - * put path # on stack - lda ,y - sta V.PATHNUM,x - pshs a ; p# PD.DEV PD Regs - - * put rfm op and DW op on stack - - lda #OP_VFM - pshs d ; DWOP RFMOP p# PD.DEV PD Regs - - leax ,s ; point X to stack - ldy #3 ; 3 bytes to send - - * set U to dwsub - ifgt Level-1 - ldu <D.DWSubAddr - else - ldu >D.DWSubAddr - endc - - * send dw op, rfm op, path # - jsr 6,u - leas 3,s ;clean stack - PD.DEV PD Regs - - * put caller's Y on stack (maximum allowed bytes) - ldx 4,s - ldx R$Y,x - pshs x - - * send 2 bytes from stack - leax ,s - ldy #2 - jsr 6,u - - leas 1,s ; leave 1 byte for server response in next section - - * read # bytes coming (0 = eof) from server - leax ,s - ldy #1 - jsr 3,u - - * store size - clra - puls b ;PD.DEV PD Regs - - - * check for 0 - tstb - beq readln1 ; 0 bytes = EOF - - * read the data from server if > 0 - pshs d ;xfersz PD.DEV PD Regs - - * load data from server into mem block - ldx 2,s ; pd.dev - ldx V.BUF,x - ldy ,s ;xfersz - jsr 3,u - - * F$Move - * a = my task # - * b = caller's task # - * X = source ptr - * Y = byte count - * U = dest ptr - - * move from our mem to caller - - puls y ;Y = byte count (already set?) - PD.DEV PD Regs - - ldx 4,s - ldu R$X,x ; U = caller's X = dest ptr - - lda <D.SysTsk ; A = system task # - - ldx <D.Proc get calling proc desc - ldb P$Task,x ; B = callers task # - - puls x ; pd.dev - PD Regs - ldx V.BUF,x - - * F$Move the bytes (seems to work) - os9 F$Move - - * assume everything worked (not good) - clrb - *ldy xfersz,pc ; Y is supposed to be set to bytes read.. do we need to set this in the caller's regs? - bra readln2 - -readln1 ldb #E$EOF - ldy #0 ; Y should be 0 if we didnt read any? in callers regs? - orcc #1 ; set error bit - leas 2,s ; clean stack down - -readln2 puls y,u - rts +read ldb #DW.read + bra read1 ; join readln routine + + + +write lda #DW.write + lbra sendit + + + +readln ldb #DW.readln +read1 pshs y,u + + ldx PD.DEV,y ; to our static storage + pshs x ; PD.DEV PD Regs + +* put path # on stack + lda ,y + sta V.PATHNUM,x + pshs a ; p# PD.DEV PD Regs + +* put rfm op and DW op on stack + + lda #OP_VFM + pshs d ; DWOP RFMOP p# PD.DEV PD Regs + + leax ,s ; point X to stack + ldy #3 ; 3 bytes to send + +* set U to dwsub + ifgt Level-1 + ldu <D.DWSubAddr + else + ldu >D.DWSubAddr + endc + +* send dw op, rfm op, path # + jsr 6,u + leas 3,s ;clean stack - PD.DEV PD Regs + +* put caller's Y on stack (maximum allowed bytes) + ldx 4,s + ldx R$Y,x + pshs x + +* send 2 bytes from stack + leax ,s + ldy #2 + jsr 6,u + + leas 1,s ; leave 1 byte for server response in next section + +* read # bytes coming (0 = eof) from server + leax ,s + ldy #1 + jsr 3,u + +* store size + clra + puls b ;PD.DEV PD Regs + + +* check for 0 + tstb + beq readln1 ; 0 bytes = EOF + +* read the data from server if > 0 + pshs d ;xfersz PD.DEV PD Regs + +* load data from server into mem block + ldx 2,s ; pd.dev + ldx V.BUF,x + ldy ,s ;xfersz + jsr 3,u + +* F$Move +* a = my task # +* b = caller's task # +* X = source ptr +* Y = byte count +* U = dest ptr + +* move from our mem to caller + + puls y ;Y = byte count (already set?) - PD.DEV PD Regs + + ldx 4,s + ldu R$X,x ; U = caller's X = dest ptr + + lda <D.SysTsk ; A = system task # + + ldx <D.Proc get calling proc desc + ldb P$Task,x ; B = callers task # + + puls x ; pd.dev - PD Regs + ldx V.BUF,x + +* F$Move the bytes (seems to work) + os9 F$Move + +* assume everything worked (not good) + clrb +*ldy xfersz,pc ; Y is supposed to be set to bytes read.. do we need to set this in the caller's regs? + bra readln2 + +readln1 ldb #E$EOF + ldy #0 ; Y should be 0 if we didnt read any? in callers regs? + orcc #1 ; set error bit + leas 2,s ; clean stack down + +readln2 puls y,u + rts *ldu origu,pc ; put U back to the entry value.. needed? * rts - -writln lda #DW.writln - lbra sendit -getstt lda #DW.getstt - lbra sendit -setstt lda #DW.setstt - lbra sendit - -close pshs u,y - - * put path # on stack - lda ,y - pshs a - - * put rfm op and DW op on stack - ldb #DW.close - lda #OP_VFM - pshs d - - leax ,s ; point X to stack - ldy #3 ; 3 bytes to send - ifgt Level-1 - ldu <D.DWSubAddr - else - ldu >D.DWSubAddr - endc - - jsr 6,u - leas 2,s ;clean stack (leave 1 byte) - - * read server response - leax ,s - ldy #1 - jsr 3,u - - * free system mem - ldd #256 - ldx 1,s ; orig Y - ldx PD.DEV,x - ldu V.BUF,x - os9 F$SRtMem - - ldb ,s ; server sends result code - beq close1 - orcc #1 ; set error flag if != 0 -close1 leas 1,s - puls u,y - rts - - + +writln lda #DW.writln + lbra sendit + +* +* I$GetStat Entry Point +* +* Entry: +* +* Exit: +* +* Error: CC Carry set +* B = errcode +* +getstt + lda #DW.getstt + lbsr sendit + + ldb R$B,u get function code + beq GstOPT + cmpb #SS.EOF + beq GstEOF + cmpb #SS.Ready + beq GstReady + cmpb #SS.Size + beq GstSize + cmpb #SS.Pos + beq GstPos + cmpb #SS.FD + beq GstFD + cmpb #SS.FDInf + beq GstFDInf + comb + ldb #E$UnkSvc + rts + +* SS.OPT +* RBF does nothing here, so we do nothing +GstOPT + rts + +* SS.EOF +* Entry A = path +* B = SS.EOF +GstEOF + rts + +* SS.Ready - Check for data available on path +* Entry A = path +* B = SS.Ready +GstReady + clr R$B,u always mark no data ready + rts + +* SS.Size - Return size of file opened on path +* Entry A = path +* B = SS.SIZ +* Exit X = msw of files size +* U = lsw of files size +GstSize + rts + +* SS.Pos - Return the current position in the file +* Entry A = path +* B = SS.Pos +* Exit X = msw of pos +* U = lsw of pos +GstPOS + rts + +* SS.FD - Return file descriptor sector +* Entry: A = path +* B = SS.FD +* X = ptr to 256 byte buffer +* Y = # of bytes of FD required + +GstFD + rts + +* SS.FDInf - +* Entry: A = path +* B = SS.FDInf +* X = ptr to 256 byte buffer +* Y = msb - Length of read +* lsb - MSB of LSN +* U = LSW of LSN +GstFDInf + rts + + + +* +* I$SetStat Entry Point +* +* Entry: +* +* Exit: +* +* Error: CC Carry set +* B = errcode +* +setstt lda #DW.setstt + lbsr sendit + + ldb R$B,u + beq SstOpt + cmpb #SS.Size + beq SstSize + cmpb #SS.FD + beq SstFD + cmpb #SS.Lock + beq SstLock + cmpb #SS.RsBit + beq SstRsBit + cmpb #SS.Attr + beq SstAttr + cmpb #SS.FSig + beq SstFSig + comb + ldb #E$UnkSvc + rts + +SstOpt +SstSize +SstFD +SstLock +SstRsBit +SstAttr +SstFSig + rts + + +close pshs u,y + +* put path # on stack + lda ,y + pshs a + +* put rfm op and DW op on stack + ldb #DW.close + lda #OP_VFM + pshs d + + leax ,s ; point X to stack + ldy #3 ; 3 bytes to send + ifgt Level-1 + ldu <D.DWSubAddr + else + ldu >D.DWSubAddr + endc + + jsr 6,u + leas 2,s ;clean stack (leave 1 byte) + +* read server response + leax ,s + ldy #1 + jsr 3,u + +* free system mem + ldd #256 + ldx 1,s ; orig Y + ldx PD.DEV,x + ldu V.BUF,x + os9 F$SRtMem + + ldb ,s ; server sends result code + beq close1 + orcc #1 ; set error flag if != 0 +close1 leas 1,s + puls u,y + rts + + * just send OP_VMF + vfmop -sendit pshs a - - lda #OP_VFM ; load command - pshs a ; command store on stack - leax ,s ; point X to stack - ldy #2 ; 2 byte to send - ifgt Level-1 - ldu <D.DWSubAddr - else - ldu >D.DWSubAddr - endc - - jsr 6,u - leas 2,s ;clean stack - - clrb - rts +sendit pshs a - - emod -eom equ * - end + lda #OP_VFM ; load command + pshs a ; command store on stack + leax ,s ; point X to stack + ldy #2 ; 2 byte to send + ifgt Level-1 + ldu <D.DWSubAddr + else + ldu >D.DWSubAddr + endc + jsr 6,u + leas 2,s ;clean stack + + clrb + rts + + emod +eom equ * + end +