Kernel version 0.8 : More API cleanup/reorg, fixed bug in READDIRYA crashing reading /

This commit is contained in:
Rémy GIBERT 2016-09-23 17:19:22 +02:00
parent 851883547f
commit d4868fe152
4 changed files with 266 additions and 226 deletions

Binary file not shown.

Binary file not shown.

View File

@ -14,7 +14,6 @@ AUTO 6
*-------------------------------------- *--------------------------------------
ZPPtr1 .EQ ZPBIN ZPPtr1 .EQ ZPBIN
ZPPtr2 .EQ ZPBIN+2 ZPPtr2 .EQ ZPBIN+2
ZPPtr3 .EQ ZPBIN+4
*-------------------------------------- *--------------------------------------
* File Header (16 Bytes) * File Header (16 Bytes)
*-------------------------------------- *--------------------------------------
@ -35,13 +34,9 @@ CS.START cld
.DA CS.DOEVENT .DA CS.DOEVENT
.DA CS.QUIT .DA CS.QUIT
L.LIBSTR .DA LIBSTR L.LIBSTR .DA LIBSTR
L.MSG.VOL.HEADER .DA MSG.VOL.HEADER
L.MSG.DIR.HEADER .DA MSG.DIR.HEADER
L.MSG.VOL .DA MSG.VOL L.MSG.VOL .DA MSG.VOL
L.MSG.DIR .DA MSG.DIR L.MSG.DIR .DA MSG.DIR
L.MSG.FILE .DA MSG.FILE L.MSG.FILE .DA MSG.FILE
L.MSG.VOL.END .DA MSG.VOL.END
L.MSG.DIR.END .DA MSG.DIR.END
L.PRODOS.FT.TXT .DA PRODOS.FT.TXT L.PRODOS.FT.TXT .DA PRODOS.FT.TXT
.DA 0 .DA 0
*-------------------------------------- *--------------------------------------
@ -111,7 +106,23 @@ CS.RUN ldy #bCANCEL
beq .8 beq .8
>LDYA ZPPtr1 lda ZPPtr1
sec
adc (ZPPtr1)
sta ZPPtr2
lda ZPPtr1+1
adc #0
sta ZPPtr2+1
ldy #S.STAT.TYPE
lda (ZPPtr2),y
cmp #$0F Directory ?
bne .31
lda #'/'
>SYSCALL SYS.COutA
.31 >LDYA ZPPtr1
>SYSCALL SYS.PStrOutYA >SYSCALL SYS.PStrOutYA
lda ZPPtr1 lda ZPPtr1
@ -193,13 +204,9 @@ CS.QUIT ldy #hDIR
*-------------------------------------- *--------------------------------------
CS.END CS.END
LIBSTR >PSTRING "libstr.o" LIBSTR >PSTRING "libstr.o"
MSG.VOL.HEADER >CSTRING "Volume Listing Of %S\n"
MSG.DIR.HEADER >CSTRING "Directory Listing Of %S\n"
MSG.VOL >CSTRING "/%S\n" MSG.VOL >CSTRING "/%S\n"
MSG.DIR >CSTRING "/%15S <dir> %a %T %t %T %t\n" MSG.DIR >CSTRING "/%15S <dir> %a %T %t %T %t\n"
MSG.FILE >CSTRING "%15S %S $%H %a %8L %T %t %T %t\n" MSG.FILE >CSTRING "%15S %S $%H %a %8L %T %t %T %t\n"
MSG.VOL.END >CSTRING "%D Files In Volume.\n"
MSG.DIR.END >CSTRING "%D Files In Directory.\n"
*-------------------------------------- *--------------------------------------
PRODOS.FT.COUNT .HS 07 PRODOS.FT.COUNT .HS 07
PRODOS.FT.ID .HS 0406FAFCFDE2FF PRODOS.FT.ID .HS 0406FAFCFDE2FF

View File

@ -22,7 +22,7 @@ K.OPENDIRYA jsr K.PFTCheckPathYA
bcs .9 bcs .9
>STYA ZPQuickPtr1 >STYA ZPQuickPtr1
stx hDIR stx K.OPENDIRYA.hDIR
lda (ZPQuickPtr2) lda (ZPQuickPtr2)
cmp #1 One char ? cmp #1 One char ?
@ -53,7 +53,7 @@ K.OPENDIRYA jsr K.PFTCheckPathYA
ldy #S.DIR.PRODOS.REF ldy #S.DIR.PRODOS.REF
sta (ZPQuickPtr1),y sta (ZPQuickPtr1),y
.8 lda hDIR .8 lda K.OPENDIRYA.hDIR
clc clc
rts rts
@ -63,7 +63,7 @@ K.OPENDIRYA jsr K.PFTCheckPathYA
sec sec
.99 rts .99 rts
*-------------------------------------- *--------------------------------------
hDIR .BS 1 K.OPENDIRYA.hDIR .BS 1
*-------------------------------------- *--------------------------------------
* In : * In :
* A = hDIR * A = hDIR
@ -71,6 +71,15 @@ hDIR .BS 1
* CC : X = hDIREND, Y,A = PTR to S.DIRENT * CC : X = hDIREND, Y,A = PTR to S.DIRENT
* CS : A = EC, A = 0 : no more entry * CS : A = EC, A = 0 : no more entry
*-------------------------------------- *--------------------------------------
K.READDIRA.hMem .BS 1
K.READDIRA.hDIRENT .BS 1
K.READDIRA.BufSize .BS 2
K.READDIRA.EL .BS 1
K.READDIRA.EBP .BS 1
K.READDIRA.EC .BS 2
K.READDIRA.ECIB .BS 1
K.READDIRA.EC2Return .BS 1
*--------------------------------------
K.READDIRA jsr K.PFTCheckDirA K.READDIRA jsr K.PFTCheckDirA
jsr K.GetMemPtrA jsr K.GetMemPtrA
>STYA ZPQuickPtr1 >STYA ZPQuickPtr1
@ -87,38 +96,45 @@ K.READDIRA jsr K.PFTCheckDirA
.9 lda #0 .9 lda #0
sec CS,A=0 no more entry sec CS,A=0 no more entry
K.READDIRA.RTS rts rts
*--------------------------------------
K.READDIRA.ROOT stz MLICALL.PARAMS+1 All Volumes K.READDIRA.ROOT stz MLICALL.PARAMS+1 All Volumes
>LDYAI KrnBuffer256
>STYA MLICALL.PARAMS+2
>STYA ZPQuickPtr2 For PASS #2
>MLICALL MLIONLINE
bcs K.READDIRA.RTS
lda #1 +1 for Ending 0 >PUSHWI 256 Get a 256 bytes buffer for ONLINE call...
sta BufSize >PUSHBI 0
stz BufSize+1 jsr K.GetMem
bcs .99
stx K.READDIRA.hMem
>STYA MLICALL.PARAMS+2
>STYA ZPQuickPtr2 For PASS #1 & #2
>MLICALL MLIONLINE
bcc .10
.98 jsr K.READDIRA.CLN
sec
.99 rts
* pass #1 compute BufSize.....
.10 lda #1 +1 for Ending 0
sta K.READDIRA.BufSize
stz K.READDIRA.BufSize+1
stz K.READDIRA.EC
ldy #0 ldy #0
.1 lda KrnBuffer256,y .1 lda (ZPQuickPtr2),y
and #$0F and #$0F
beq .2 beq .2
inc K.READDIRA.EC increase entry count
sec Add Filelen +1 sec Add Filelen +1
adc BufSize adc #S.STAT will ends with CC
sta BufSize adc K.READDIRA.BufSize
bcc .11 sta K.READDIRA.BufSize
inc BufSize+1 bcc .2
inc K.READDIRA.BufSize+1
.11 lda #S.STAT
adc BufSize
sta BufSize
bcc .12
inc BufSize+1
.12 inx
.2 tya .2 tya
clc clc
@ -126,78 +142,39 @@ K.READDIRA.ROOT stz MLICALL.PARAMS+1 All Volumes
tay tay
bcc .1 loop until 256 bytes scanned bcc .1 loop until 256 bytes scanned
txa * pass #2 Fill Buffer...
beq K.READDIRA.RTS A=0, CS no more DIRENT jsr K.READDIRA.GetBuf
bcs .98
sta EntryCount
>PUSHW BufSize
>PUSHBI S.MEM.F.INIT0
jsr K.GetMem
bcs K.READDIRA.RTS
stx hDIRENT
>STYA ZPQuickPtr3
>STYA ZPQuickPtr4
.3 lda (ZPQuickPtr2) .3 lda (ZPQuickPtr2)
and #$0F and #$0F
beq .88 beq .88
tay
tax tax
sta (ZPQuickPtr3)
inc
sta VolName Build a string with leading / for GetFileInfo
.4 lda (ZPQuickPtr2),y >LDYAI ZPQuickPtr4 Store actual PTR for MLIGETFILEINFO
sta (ZPQuickPtr3),y >STYA MLICALL.PARAMS+1
sta VolName+1,y
dey
bne .4
lda #'/'
sta VolName+1
txa txa
sec inc
adc ZPQuickPtr3 jsr K.READDIRA.AddToBuf
sta ZPQuickPtr3 lda #'/'
bcc .41 jsr K.READDIRA.AddToBuf
inc ZPQuickPtr3+1
ldy #1
.4 lda (ZPQuickPtr2),y
jsr K.READDIRA.AddToBuf
iny
dex
bne .4
.41 >LDYAI VolName
>STYA MLICALL.PARAMS+1
>MLICALL MLIGETFILEINFO >MLICALL MLIGETFILEINFO
bcs .80 bcs .80
lda MLICALL.PARAMS+S.FILEINFO.ACCESS
cmp #S.FILEINFO.ACCESS.FULL
bne .5
lda #S.STAT.MODE.XO+S.STAT.MODE.WO+S.STAT.MODE.RO
bra .6
.5 and #S.FILEINFO.ACCESS.R
beq .6
lda #S.STAT.MODE.XO+S.STAT.MODE.RO
.6 ldy #S.STAT.MODE
sta (ZPQuickPtr3),y
ldy #S.STAT.BLOCKS
lda MLICALL.PARAMS+S.FILEINFO.AUXTYPE
sta (ZPQuickPtr3),y
iny
lda MLICALL.PARAMS+S.FILEINFO.AUXTYPE
sta (ZPQuickPtr3),y
ldy #S.STAT.BLKSIZE+1
lda #2 Block size is $200 for ProDOS
sta (ZPQuickPtr3),y
.80 lda ZPQuickPtr3 .80 jsr K.READDIRA.ADDSTAT
clc
adc #S.STAT
sta ZPQuickPtr3
bcc .88
inc ZPQuickPtr3+1
.88 lda ZPQuickPtr2 .88 lda ZPQuickPtr2
clc clc
@ -205,20 +182,21 @@ K.READDIRA.ROOT stz MLICALL.PARAMS+1 All Volumes
sta ZPQuickPtr2 sta ZPQuickPtr2
bcc .89 bcc .89
inc ZPQuickPtr2+1 inc ZPQuickPtr2+1
.89 dec EntryCount .89 dec K.READDIRA.EC
bne .3 bne .3
lda #0 * lda #0 done by S.MEM.F.INIT0
sta (ZPQuickPtr3) Ending 0 * sta (ZPQuickPtr4) Ending 0
ldy #S.DIR.F ldy #S.DIR.F
lda #S.DIR.F.NOMORE lda #S.DIR.F.NOMORE
sta (ZPQuickPtr1),y sta (ZPQuickPtr1),y
ldx hDIRENT jsr K.READDIRA.CLN Discard ONLINE BUFFER
>LDYA ZPQuickPtr4
clc lda K.READDIRA.hDIRENT
rts tax
jmp K.GetMemPtrA
*-------------------------------------- *--------------------------------------
K.READDIRA.DIR ldy #S.DIR.PRODOS.REF K.READDIRA.DIR ldy #S.DIR.PRODOS.REF
lda (ZPQuickPtr1),y lda (ZPQuickPtr1),y
@ -236,12 +214,13 @@ K.READDIRA.DIR ldy #S.DIR.PRODOS.REF
tya tya
* clc CC from K.GetMem * clc CC from K.GetMem
adc #4 Skip 4 bytes linked list adc #4 Skip 4 bytes linked list
tay sta ZPQuickPtr2 PTR to Buffer for PASS #1
sta ZPQuickPtr3 PTR to Buffer for PASS #2
pla pla
adc #0 adc #0
sta ZPQuickPtr2+1 PTR to Buffer for PASS #1
>STYA ZPQuickPtr2 PTR to Buffer for PASS #1 sta ZPQuickPtr3+1 PTR to Buffer for PASS #2
>STYA ZPQuickPtr3 PTR to Buffer for PASS #2
>LDYAI 512 >LDYAI 512
>STYA MLICALL.PARAMS+4 >STYA MLICALL.PARAMS+4
@ -255,17 +234,14 @@ K.READDIRA.DIR ldy #S.DIR.PRODOS.REF
ldy #$1f+3 ldy #$1f+3
ldx #3 ldx #3
.1 lda (ZPQuickPtr2),y Get EntryLength.... From Block .1 lda (ZPQuickPtr2),y Get K.READDIRA.EL.... From Block
sta EntryLength,x sta K.READDIRA.EL,x
dey dey
dex dex
bpl .1 bpl .1
bra .4 bra .4
.98 pha .98 jsr K.READDIRA.CLN
lda K.READDIRA.hMem
jsr K.FreeMemA
pla
sec sec
.99 rts .99 rts
@ -273,67 +249,120 @@ K.READDIRA.DIR ldy #S.DIR.PRODOS.REF
ldx #3 ldx #3
.3 lda (ZPQuickPtr1),y get this session parameters from S.DIR .3 lda (ZPQuickPtr1),y get this session parameters from S.DIR
sta EntryLength,x sta K.READDIRA.EL,x
dey dey
dex dex
bpl .3 bpl .3
.4 ldx EntryCount .4 ldx K.READDIRA.EC
cpx EntryPerBlock cpx K.READDIRA.EBP
lda EntryCount+1 lda K.READDIRA.EC+1
sbc #0 sbc #0
bcc .5 We have less than EPB to read bcc .5 We have less than EPB to read
ldx EntryPerBlock ldx K.READDIRA.EBP
.5 stx EntryCountIB .5 stx K.READDIRA.ECIB
stz EntryCount2Return stz K.READDIRA.EC2Return
lda #1 For Ending 0 lda #1 For Ending 0
sta BufSize sta K.READDIRA.BufSize
stz BufSize+1 stz K.READDIRA.BufSize+1
* pass #1 compute BufSize..... * pass #1 compute BufSize.....
K.READDIRA.DIR1 lda (ZPQuickPtr2) X = EntryCount In This Block
.51 lda (ZPQuickPtr2) X = EntryCount In This Block
beq .7 Free slot....goto next beq .7 Free slot....goto next
jsr S.READDIR.CHK tay save LEN
and #$F0 get storage_type
cmp #$F0 Volume header ?
beq .1
cmp #$E0 directory header ?
beq .2
inc K.READDIRA.EC2Return regular DIR or File....
tya
and #$F get filename len
sec add "#<filename>" + S.STAT
adc #S.STAT
.HS 2C bit abs
.1 lda #2+S.STAT add "1." string + S.STAT
.HS 2C bit abs
.2 lda #2+S.STAT+3+S.STAT add "1." + S.STAT + "2.." + S.STAT...
clc
adc K.READDIRA.BufSize
sta K.READDIRA.BufSize
bcc .7
inc K.READDIRA.BufSize+1
.7 lda ZPQuickPtr2 .7 lda ZPQuickPtr2
clc clc
adc EntryLength adc K.READDIRA.EL
sta ZPQuickPtr2 sta ZPQuickPtr2
bcc .71 bcc .8
inc ZPQuickPtr2+1 inc ZPQuickPtr2+1
.71 dex .8 dex
bne .51 bne K.READDIRA.DIR1
* pass #2 Fill Buffer... * pass #2 Fill Buffer...
>PUSHW BufSize Get a BufSize bytes buffer for storing results K.READDIRA.DIR2 jsr K.READDIRA.GetBuf
>PUSHBI S.MEM.F.INIT0 make sure 0 fiiled
jsr K.GetMem
bcs .98 bcs .98
stx K.READDIRA.hDIR
>STYA ZPQuickPtr4
.72 jsr DecEntryCount ldy #S.DIR.PRODOS.EL Check if first run....
bcc .80 no more file to list... lda (ZPQuickPtr1),y
bne .73
lda (ZPQuickPtr3) lda (ZPQuickPtr3)
and #$F0
cmp #$F0 Vol Header ?
bne .72
jsr K.READDIRA.ADD.
bra .78
.72 cmp #$E0 Dir Header ?
bne .73
jsr K.READDIRA.ADD.
jsr K.READDIRA.ADD..
bra .78
.73 lda K.READDIRA.EC
sec
sbc #1
sta K.READDIRA.EC
bcs .74
lda K.READDIRA.EC+1
sbc #0
sta K.READDIRA.EC+1 CC, we reached $ffff
bcc .80 no more file to list...
.74 lda (ZPQuickPtr3)
beq .78 beq .78
jsr K.READDIRA.ADD and #$F0
cmp #$D0 Directory ?
bne .75
jsr K.READDIRA.ADDD
bra .78
.75 jsr K.READDIRA.ADDF
.78 lda ZPQuickPtr3 .78 lda ZPQuickPtr3
clc clc
adc EntryLength adc K.READDIRA.EL
sta ZPQuickPtr3 sta ZPQuickPtr3
bcc .79 bcc .79
inc ZPQuickPtr3+1 inc ZPQuickPtr3+1
.79 dec EntryCountIB .79 dec K.READDIRA.ECIB
bne .72 bne .72
.80 .80
@ -343,91 +372,95 @@ K.READDIRA.DIR ldy #S.DIR.PRODOS.REF
ldx #3 ldx #3
ldy #S.DIR.PRODOS.EL+3 ldy #S.DIR.PRODOS.EL+3
.8 lda EntryLength,x Store back this session prameters to S.DIR .8 lda K.READDIRA.EL,x Store back this session prameters to S.DIR
sta (ZPQuickPtr1),y sta (ZPQuickPtr1),y
dey dey
dex dex
bpl .8 bpl .8
jsr .98 Discard READBUFFER jsr K.READDIRA.CLN Discard READBUFFER
lda K.READDIRA.hDIR lda K.READDIRA.hDIRENT
tax tax
jsr K.GetMemPtrA jmp K.GetMemPtrA
clc
.98 jsr K.READDIRA.CLN
sec
rts rts
*-------------------------------------- *--------------------------------------
S.READDIR.CHK tay save LEN K.READDIRA.CLN pha
lda K.READDIRA.hMem
and #$F0 get storage_type jsr K.FreeMemA
cmp #$E0 directory header ? pla
bne .1 rts
inc EntryCount2Return yes, return 2 ".."
lda #S.STAT+3 add "#.." string + S.STAT
jsr K.READDIRA.AddBufSize
bra .2 go add "." Entry
.1 cmp #$F0 Volume header ?
bne .3
.2 lda #S.STAT+2 add "#." string + S.STAT
bra .4
.3 tya
and #$F get filename len
sec Add 1 for LEN
adc #S.STAT
.4 jsr K.READDIRA.AddBufSize
inc EntryCount2Return
rts
*-------------------------------------- *--------------------------------------
K.READDIRA.ADD and #$F0 K.READDIRA.GetBuf
cmp #$F0 Volume header ? >PUSHW K.READDIRA.BufSize Get a BufSize bytes buffer for storing results
bne .10 >PUSHBI S.MEM.F.INIT0 make sure 0 filled
jsr K.GetMem
lda #1 bcs .9
stx K.READDIRA.hDIRENT
>STYA ZPQuickPtr4
.9 rts
*--------------------------------------
K.READDIRA.ADD. lda #1
jsr K.READDIRA.AddToBuf jsr K.READDIRA.AddToBuf
lda #'.' filename="1." lda #'.' filename="1."
jsr K.READDIRA.AddToBuf jsr K.READDIRA.AddToBuf
jsr K.READDIRA.ClrStat
ldy #$25 total_blocks ldy #$25 total_blocks
lda (ZPQuickPtr3),y lda (ZPQuickPtr3),y
tax sta KrnBuffer256+S.STAT.BLOCKS
iny iny
lda (ZPQuickPtr3),y lda (ZPQuickPtr3),y
sta KrnBuffer256+S.STAT.BLOCKS+1
ldy #S.STAT.BLOCKS+1 bra K.READDIRA.ADDSTAT
sta (ZPQuickPtr4),y *--------------------------------------
dey K.READDIRA.ADD..
txa
sta (ZPQuickPtr4),y
bra .80
.10 cmp #$E0 directory header ?
bne .20
lda #2 lda #2
jsr K.READDIRA.AddToBuf jsr K.READDIRA.AddToBuf
lda #'.' filename="2.." lda #'.' filename="2.."
jsr K.READDIRA.AddToBuf jsr K.READDIRA.AddToBuf
jsr K.READDIRA.AddToBuf jsr K.READDIRA.AddToBuf
bra .80
.20 cmp #$D0 directory ?
bne .30
jsr K.READDIRA.AddFNToBuf
bra .80 jsr K.READDIRA.ClrStat
.30 jsr K.READDIRA.AddFNToBuf
.80 lda ZPQuickPtr4 bra K.READDIRA.ADDSTAT
*--------------------------------------
K.READDIRA.ADDD jsr K.READDIRA.AddFNToBuf
jsr K.READDIRA.ClrStat
bra K.READDIRA.ADDSTAT
*--------------------------------------
K.READDIRA.ADDF jsr K.READDIRA.AddFNToBuf
jsr K.READDIRA.ClrStat
ldy #$10 type
lda (ZPQuickPtr3),y
sta KrnBuffer256+S.STAT.TYPE
ldy #$1F auxtype
lda (ZPQuickPtr3),y
sta KrnBuffer256+S.STAT.AUXTYPE
iny
lda (ZPQuickPtr3),y
sta KrnBuffer256+S.STAT.AUXTYPE+1
*--------------------------------------
K.READDIRA.AddStat
ldy #S.STAT-1
.1 lda KrnBuffer256,y
sta (ZPQuickPtr4),y
dey
bpl .1
lda ZPQuickPtr4
clc clc
adc #S.STAT adc #S.STAT
sta ZPQuickPtr4 sta ZPQuickPtr4
@ -435,13 +468,13 @@ K.READDIRA.ADD and #$F0
inc ZPQuickPtr4+1 inc ZPQuickPtr4+1
.8 rts .8 rts
*-------------------------------------- *--------------------------------------
K.READDIRA.AddBufSize K.READDIRA.ClrStat
clc ldx #S.STAT-1
adc BufSize
sta BufSize .1 stz KrnBuffer256,x
bcc .9 dey
inc BufSize+1 bpl .1
.9 rts rts
*-------------------------------------- *--------------------------------------
K.READDIRA.AddFNToBuf K.READDIRA.AddFNToBuf
lda (ZPQuickPtr3) lda (ZPQuickPtr3)
@ -465,18 +498,29 @@ K.READDIRA.AddToBuf
inc ZPQuickPtr4+1 inc ZPQuickPtr4+1
.8 rts .8 rts
*-------------------------------------- *--------------------------------------
DecEntryCount lda EntryCount lda MLICALL.PARAMS+S.FILEINFO.ACCESS
sec cmp #S.FILEINFO.ACCESS.FULL
sbc #1 bne .5
sta EntryCount
bcs .9 CS, 0 or more lda #S.STAT.MODE.XO+S.STAT.MODE.WO+S.STAT.MODE.RO
lda EntryCount+1 bra .6
sbc #0
sta EntryCount+1 CC, we reached $ffff .5 and #S.FILEINFO.ACCESS.R
.9 rts beq .6
*-------------------------------------- lda #S.STAT.MODE.XO+S.STAT.MODE.RO
K.READDIRA.hMem .BS 1
K.READDIRA.hDIR .BS 1 .6 ldy #S.STAT.MODE
sta (ZPQuickPtr3),y
ldy #S.STAT.BLOCKS
lda MLICALL.PARAMS+S.FILEINFO.AUXTYPE
sta (ZPQuickPtr3),y
iny
lda MLICALL.PARAMS+S.FILEINFO.AUXTYPE
sta (ZPQuickPtr3),y
ldy #S.STAT.BLKSIZE+1
lda #2 Block size is $200 for ProDOS
sta (ZPQuickPtr3),y
*-------------------------------------- *--------------------------------------
* In : * In :
* A = hDIR * A = hDIR
@ -513,17 +557,6 @@ K.MKDIRYA jsr K.PFTCheckPathYA
>MLICALL MLICREATE >MLICALL MLICREATE
rts rts
*-------------------------------------- *--------------------------------------
hONLINE .BS 1
hDIRENT .BS 1
BufSize .BS 2
EntryLength .BS 1
EntryPerBlock .BS 1
EntryCount .BS 2
EntryCountIB .BS 1
EntryCount2Return .BS 1
VolName .BS 17
*--------------------------------------
MAN MAN
SAVE SYS/KERNEL.S.DIR SAVE SYS/KERNEL.S.DIR
LOAD SYS/KERNEL.S LOAD SYS/KERNEL.S