view os9/level2/vrbf.asm @ 45:07c84761da6f

dd vrbf asm code
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 19 Jul 2018 16:21:47 +0900
parents
children ec9f494497e1
line wrap: on
line source

********************************************************************
* Virtual RBF - Random Block File Manager
*

         nam   VRBF
         ttl   VRandom Block File Manager

         ifp1  
         use   defsfile
         endc  

rev      set   $00
ty       set   FlMgr
         IFNE  H6309
lg       set   Obj6309
         ELSE
lg       set   Objct
         ENDC
tylg     set   ty+lg
atrv     set   ReEnt+rev
edition  set   37

         org   $00
size     equ   .

         mod   eom,name,tylg,atrv,start,size

name     fcs   /VRBF/
         fcb   edition

*L0012    fcb   DRVMEM


****************************
*
* Main entry point for RBF
*
* Entry: Y = Path descriptor pointer
*        U = Register stack pointer

start    bra   Create
         nop   
         lbra  Open
         lbra  MakDir
         lbra  ChgDir
         lbra  Delete
         lbra  Seek
         lbra  Read
         lbra  Write
         lbra  ReadLn
         lbra  WriteLn
         lbra  GetStat
         lbra  SetStat
         lbra  Close


*
* I$Create Entry Point
*
* Entry: A = access mode desired (0 read, 1 write, 2 update, bit 4 for exex)
*        B = file attributes
*        X = address of the pathlist
*
* Exit:  A = pathnum
*        X = last byte of pathlist address
*
* Error: CC Carry set
*        B = errcode
*
Create   pshs  y,u		Preserve path desc ptr
         sta   PD.MOD,y
         bsr   setuppd
         stb   4,u              put file attribute
         ldb   #$d0
         stb   ,u
         ldb   ,u
         beq   ok00
err00    orcc  #$1
ok00     pull  y,u,pc

setuppd  pshs  x   
         ldu   #$FFc0           vdisk port
         lda   <PD.DRV,y
         sta   1,u
         ldx   <D.Proc          get process pointer
         cmpx  <D.SysPrc
         beq   sysmode
         lda   #0
sysmode  sta   2,u
         lda   PD.MOD,y
         bita  #EXEC.
         bne   usechx
         lda   P$DIO+5,x        get curwdir #pdnumber
         bra   s1
usechx   lda   P$DIO+11,x       get curxdir #pdnumber
s1       sta   3,u
         ldy   PD.PD,y          path number and mode
         puls  x,pc

*
* I$Open Entry Point
*
* Entry: A = access mode desired
*        X = address of the pathlist
*
* Exit:  A = pathnum
*        X = last byte of pathlist address
*
* Error: CC Carry set
*        B = errcode
*
Open     pshs  y,u
         sta   PD.MOD,y
         bsr   setuppd
         ldb   #$d1
         stb   ,u
         ldb   ,u
         beq   ok00
         bra   er00

*
* I$MakDir Entry Point
*
* Entry: X = address of the pathlist
*
* Exit:  X = last byte of pathlist address
*
* Error: CC Carry set
*        B = errcode
*
MakDir   pshs  y,u
         sta   PD.MOD,y
         bsr   setuppd
         ldb   #$d2
         stb   ,u
         ldb   ,u
         beq   ok00
         bra   er00


*
* I$Close Entry Point
*
* Entry: A = path number
*
* Exit:
*
* Error: CC Carry set
*        B = errcode
*
Close    pshs  y,u
         bsr   setuppd
         ldb   #$db
         stb   ,u
         ldb   ,u
         beq   ok00
         bra   er00


*
* I$ChgDir Entry Point
*
* Entry:
*
* Exit:
*
* Error: CC Carry set
*        B = errcode
*
ChgDir   pshs  y,u
         bsr   setuppd
         ldb   #$d4
         stb   ,u
         ldb   ,u
         bne   er00

         ldb   PD.MOD,y		get current file mode
         bitb  #UPDAT.		read or write mode?
         beq   CD30D		no, skip ahead
* Change current data dir
         sta   P$DIO+5,x
CD30D    bitb  #EXEC.		is it execution dir?
         beq   CD31C		no, skip ahead
* Change current execution directory
         sta   P$DIO+11,x
         bra   ok00

*
* I$Delete Entry Point
*
* Entry:
*
* Exit:
*
* Error: CC Carry set
*        B = errcode
*
*
Delete   pshs  y,u
         bsr   setuppd
         ldb   #$d5
         stb   ,u
         ldb   ,u
         beq   ok00
         bra   er00

*
* I$Seek Entry Point
*
* Entry:
*
* Exit:
*
* Error: CC Carry set
*        B = errcode
*
Seek     pshs  y,u
         bsr   setuppd
         ldb   #$d6
         stb   ,u
         ldb   ,u
         beq   ok00
         bra   er00

*
* I$ReadLn Entry Point
*
* Entry:
*
* Exit:
*
* Error: CC Carry set
*        B = errcode
*
ReadLn   pshs  y,u
         bsr   setuppd
         ldb   #$d7
         stb   ,u
         ldb   ,u
         beq   ok00
         bra   er00

*
* I$Read Entry Point
*
* Entry:
*
* Exit:
*
* Error: CC Carry set
*        B = errcode
*
Read     pshs  y,u
         bsr   setuppd
         ldb   #$d8
         stb   ,u
         ldb   ,u
         beq   ok00
         bra   er00
         beq   Read4BB		no, allow it
         bsr   Read4BC		do reading


*
* I$WritLn Entry Point
*
* Entry:
*
* Exit:
*
* Error: CC Carry set
*        B = errcode
*
WriteLn  pshs  y,u
         bsr   setuppd
         ldb   #$d9
         stb   ,u
         ldb   ,u
         beq   ok00
         bra   er00

*
* I$Write Entry Point
*
* Entry:
*
* Exit:
*
* Error: CC Carry set
*        B = errcode
*
Write    pshs  y,u
         bsr   setuppd
         ldb   #$da
         stb   ,u
         ldb   ,u
         beq   ok00
         bra   er00

*
* I$GetStat Entry Point
*
* Entry:
*
* Exit:
*
* Error: CC Carry set
*        B = errcode
*
GetStat  pshs  y,u
         ldb   R$B,u		get function code
         bsr   setuppd
         ldb   #$dc
         stb   ,u
         ldb   ,u
         beq   ok00
         bra   er00


*
* I$SetStat Entry Point
*
* Entry:
*
* Exit:
*
* Error: CC Carry set
*        B = errcode
*
SetStat  pshs  y,u
         ldb   R$B,u		get function code
         bsr   setuppd
         ldb   #$dd
         stb   ,u
         ldb   ,u
         beq   ok00
         bra   er00


         emod  
eom      equ   *
         end