A2osX/SCMASM.31/SCI.S.CAT.txt

492 lines
13 KiB
Plaintext
Raw Normal View History

NEW
AUTO 3,1
*--------------------------------------
* CATALOG COMMAND
*--------------------------------
CAT
LDA #39
.HS 2C SKIP OVER TWO BYTES
CATALOG
LDA #79
STA CAT.WIDTH
LDA #0 CLEAR ACCUMULATED BLOCKS COUNTER
STA BLOCKS
STA BLOCKS+1
LDA FBITS TEST FOR TYPE AND PATHNAME
AND #$05
LSR PATHNAME BIT INTO CARRY
BNE .1 ...TYPE STATED
STA VAL.T SET T=0, LIST ALL TYPES
.1 BCS .2 ...PATH GIVEN
JSR GET.FILE.INFO NONE STATED, GET PREFIX
BCS .8 ...ERROR
*---GET DIRECTORY----------------
.2 JSR OPEN.READ.DIR.HEADER
BCS .8 ...ERROR
LDY #0 Print directory pathname
.15 LDA PATHNAME.ONE.BUFFER+1,Y
ORA #$80
JSR COUT
INY
CPY PATHNAME.ONE.BUFFER
BCC .15
JSR CROUT
*---PRINT TITLES-----------------
LDA #Q.DIRHDR
JSR FIND.AND.PUT.MSG.IN.WBUF
JSR PRINT.CATALOG.LINE
*---IF NO MORE FILES, FINISHED---
.3 LDA FILE.COUNT ANY FILES LEFT?
ORA FILE.COUNT+1
BEQ .7 ...NO, FINISHED
*---NEXT FILE DESCRIPTION--------
JSR READ.NEXT.ENTRY
BCS .8 ...ERROR
LDA VAL.T CHECK IF WE LIKE THIS TYPE
BEQ .4 ...WE LIKE THEM ALL
CMP DIRBUF+16 FILE TYPE
BNE .5 ...NO, SKIP OVER IT
.4 JSR FORMAT.CAT.ENTRY
JSR PRINT.CATALOG.LINE PRINT IT
*---CHECK FOR PAUSE/ABORT--------
.5 JSR CHECK.KEY SEE IF KEYPRESS
BMI .3 ...NO, CONTINUE CATALOG
BEQ .7 ...<CR> or <ESC>, abort
*---<CR> or <ESC>, so abort------
.6 JSR CHECK.KEY
BMI .6 WAIT FOR KEY
BNE .3 ...NOT CR OR ESC, CONTINUE
*---<CR> or <ESC>, abort---------
.7 LDX CAT.INDEX
LDA FILE.REFNUMS,X
JSR CLOSE.ONE.FILE
BCS .8 ...ERROR
JMP FREE.BLOCKS FORMAT BLOCKS FREE ETC.
.8 RTS
*--------------------------------
CHECK.KEY
LDA $C000 SEE IF KEYSTROKE
BPL .1 ...NO
STA $C010 ...YES, CLEAR STROBE
.1 EOR #$8D SET .EQ. IF <RET>
BEQ .2 ...YES
EOR #$8D^$9B OR IF <ESC>
.2 RTS .MI. IF NO KEY
*--------------------------------
* FORMAT BLOCKS FREE/INUSE
*--------------------------------
FREE.BLOCKS
JSR ZERO.ACCUM
JSR BLANK.WBUF
LDA #Q.BLOCKS.ABOVE
JSR FIND.AND.PUT.MSG.IN.WBUF
LDA BLOCKS
LDX BLOCKS+1
LDY #24
JSR CONVERT.TO.DECIMAL
JSR PRINT.MESSAGE
*--------------------------------
LDA #PATHNAME.ONE.BUFFER+1 set up ONLINE call
STA MISC.PARMS+2 to read volume name
LDA /PATHNAME.ONE.BUFFER+1
STA MISC.PARMS+3
LDA UNIT
STA MISC.PARMS+1
JSR MLI.C5 ONLINE
BCS .1 ...ERROR
*---Setup GET FILE INFO call-----
LDA PATHNAME.ONE.BUFFER+1
AND #$0F
TAX
INX
STX PATHNAME.ONE.BUFFER
LDA #"/"
STA PATHNAME.ONE.BUFFER+1
JSR GET.FILE.INFO
BCS .1 ...ERROR
*---Format the bottom line-------
JSR BLANK.WBUF
LDA #Q.BLOCKS
JSR FIND.AND.PUT.MSG.IN.WBUF
*---Total Blocks in Volume-------
LDA GET.SET.PARMS+5
LDX GET.SET.PARMS+6
LDY #51
JSR CONVERT.TO.DECIMAL
*---Blocks Used in Volume--------
LDA GET.SET.PARMS+8
LDX GET.SET.PARMS+9
LDY #24
JSR CONVERT.TO.DECIMAL
*---Blocks Free in Volume--------
LDA GET.SET.PARMS+5
SEC
SBC GET.SET.PARMS+8
PHA
LDA GET.SET.PARMS+6
SBC GET.SET.PARMS+9
TAX
PLA
LDY #37
JSR CONVERT.TO.DECIMAL
JSR PRINT.CATALOG.LINE
CLC
.1 RTS
*--------------------------------
* OPEN/READ DIRECTORY HEADER
*--------------------------------
OPEN.READ.DIR.HEADER
JSR ALLOCATE.UPPER.BUFFER
STX CAT.INDEX
LDX #$0F IS STORAGE TYPE = VOL DIR?
CPX GET.SET.PARMS+7
BNE .1 ...NO
STX GET.SET.PARMS+4 ...YES, MAKE TYPE = DIR
.1 LDA #$01 FILE MUST BE READABLE
JSR OPEN.DIRECTORY
BCS .3 ...ERROR
LDX CAT.INDEX
STA FILE.REFNUMS,X
LDA #DIRBUF
STA READ.WRITE.PARMS+2
LDA /DIRBUF
STA READ.WRITE.PARMS+3
LDA #$2B
STA READ.WRITE.PARMS+4
STA MISC.PARMS+2
LDA #0
STA READ.WRITE.PARMS+5
JSR MLI.CA READ
BCS .3
LDX #3
.2 LDA DIRBUF+35,X ENTRY LENGTH, ENTRIES/BLOCK,
STA ENTRY.LENGTH,X and FILE COUNT
DEX
BPL .2
LDA #1
STA ENTRY.COUNTER
.3 RTS
*--------------------------------
* READ NEXT DIRECTORY ENTRY
*--------------------------------
READ.NEXT.ENTRY
.1 LDY ENTRY.COUNTER
CPY ENTRIES.PER.BLOCK
BCC .2
*---Skip ahead remainder bytes---
LDA #4
SBC MISC.PARMS+2
STA READ.WRITE.PARMS+4
JSR MLI.CA
BCS .4 ...ERROR
LDY #0
LDA #4
STA MISC.PARMS+2
*---Read a file description------
.2 INY NEXT ENTRY
STY ENTRY.COUNTER
LDA ENTRY.LENGTH
STA READ.WRITE.PARMS+4
ADC MISC.PARMS+2
STA MISC.PARMS+2
JSR MLI.CA READ
BCS .4 ...ERROR
*---Check if deleted file--------
LDA DIRBUF
AND #$F0
BEQ .1 ...deleted
*---Count the file---------------
LDA FILE.COUNT
BNE .3
DEC FILE.COUNT+1
.3 DEC FILE.COUNT
.4 RTS
*--------------------------------
* FORMAT CATALOG ENTRY LINE
*--------------------------------
.DO LOWERCASE=1
FORMAT.CAT.BITS .HS 8040201008040201
.FIN
FORMAT.CAT.ENTRY
JSR BLANK.WBUF
.DO LOWERCASE=1
lda DIRBUF+$1D
bpl .18
lda DIRBUF
and #$0f
tay
.10 cpy #8
bcs .13
lda DIRBUF+$1D
and FORMAT.CAT.BITS,y
beq .15
bne .14
.13 lda DIRBUF+$1C
and FORMAT.CAT.BITS-8,y
beq .15
.14 lda DIRBUF,y
eor #$20
sta DIRBUF,y
.15 dey
bne .10
.18 .FIN
LDA DIRBUF LENGTH OF FILENAME
AND #$0F
TAY
.1 LDA DIRBUF,Y
ORA #$80
STA WBUF+7,Y
DEY
BNE .1
STY ACCUM+2
*---GET FILE TYPE----------------
LDA DIRBUF+16 FILE TYPE
LDX #LAST.FILE.TYPE
LDY #3 POINT INTO WBUF
.2 CMP FILE.TYPES,X
BEQ .3 ...MATCH!
DEX
DEX
DEX
DEX
BPL .2
JSR CONVERT.TO.HEX
JMP .6
.3 DEX
LDA FILE.TYPES,X
JSR STUFF.WBUF.AND.BACKUP
BNE .3
*---SKIP IF 40-COLUMN------------
BIT CAT.WIDTH
BVC .7
*---Display AuxType--------------
LDY #"R" Use "R=" if type TXT
LDA DIRBUF+16 FILE TYPE
CMP #$04
BEQ .5 ...it is TXT
CMP #$06 Use "A=" if type BIN
BNE .6 ...not BIN, just show $xxxx
LDY #"A" ...BIN
.5 STY WBUF+73
LDA #"="
STA WBUF+74
.6 LDY #78
LDA DIRBUF+31 AUXTYPE
JSR CONVERT.TO.HEX
LDA DIRBUF+32 "
JSR CONVERT.TO.HEX
*---Show file length-------------
LDA DIRBUF+23 EOF MARK MSB
STA ACCUM+2
LDA DIRBUF+21 EOF MARK
LDX DIRBUF+22 " "
LDY #70
JSR CONVERT.TO.DECIMAL
*---CREATION DATE/TIME-----------
LDX #$18 OFFSET IN DIRBUF
LDY #61 OFFSET IN WBUF
JSR FORMAT.DATE.AND.TIME
*---Blocks in the file-----------
.7 LDY #27
LDA DIRBUF+19 BLOCKS IN USE
LDX DIRBUF+20 "
JSR CONVERT.TO.DECIMAL
CLC
LDA BLOCKS
ADC DIRBUF+19
STA BLOCKS
LDA BLOCKS+1
ADC DIRBUF+20
STA BLOCKS+1
*---Access code------------------
LDA DIRBUF+30 ACCESS
AND #$C2
CMP #$C2
BEQ .8
LDA #"*" LOCKED
STA WBUF+1
*---Modified Date/Time-----------
.8 LDX #$21 OFFSET IN DIRBUF
LDY #44 OFFSET IN WBUF
*--------------------------------
* FORMAT DATE & TIME
* --MSB--- --LSB---
* YYYYYYYM MMMDDDDD
*--------------------------------
FORMAT.DATE.AND.TIME
LDA DIRBUF,X MMMDDDDD
AND #$1F 000DDDDD
BEQ .1 ...DAY=0, NO DATE
STA DAY
LDA DIRBUF+1,X YYYYYYYM
LSR 0YYYYYYY
STA YEAR
CMP #100
BCS .1 ...YEAR>99, NO DATE
LDA DIRBUF+1,X YYYYYYYM
LSR M INTO CARRY
LDA DIRBUF,X MMMDDDDD
ROL MMDDDDDM M
ROL MDDDDDMM M
ROL DDDDDMMM M
ROL DDDDMMMM
AND #$0F 0000MMMM
BEQ .1 ...MONTH=0, NO DATE
CMP #13
BCC .3 ...MONTH=1...12, GOOD
*---Format <NO DATE>-------------
.1 TYA
SEC
SBC #6 BACK UP OVER TIME SLOT
TAY
LDX #8
.2 LDA NO.DATE.MSG,X
JSR STUFF.WBUF.AND.BACKUP
DEX
BPL .2
RTS
*---Format date, time------------
.3 STA MONTH
LDA DIRBUF+3,X HOURS
PHA
LDA DIRBUF+2,X MINUTES
LDX #0 HIGH BYTE
CMP #60 IF > 59, USE 0
BCC .4 0...59
TXA
.4 JSR CONVERT.DECIMAL.TWO.DIGITS
LDA #":" SEPARATE WITH ":"
STA WBUF+2,Y
PLA HOURS
LDX #0 HIGH BYTE
CMP #24 IF > 24, USE 0
BCC .5 0...23
TXA
.5 JSR CONVERT.DECIMAL.TWO.DIGITS
LDA YEAR
JSR CONVERT.DECIMAL.TWO.DIGITS
LDX MONTH
LDA MONTH.NAMES-1+24,X
JSR STUFF.WBUF.AND.BACKUP
LDA MONTH.NAMES-1+12,X
JSR STUFF.WBUF.AND.BACKUP
LDA MONTH.NAMES-1,X
JSR STUFF.WBUF.AND.BACKUP
LDA #"-"
STA WBUF+5,Y
JSR STUFF.WBUF.AND.BACKUP
LDA DAY
LDX #0 HIGH BYTE
* JMP CONVERT.TO.DECIMAL
*--------------------------------
* CONVERT TO DECIMAL
*--------------------------------
CONVERT.TO.DECIMAL
STX ACCUM+1
STA ACCUM
.1 JSR DIVIDE.ACCUM.BY.TEN
ORA #$B0
JSR STUFF.WBUF.AND.BACKUP
LDA ACCUM
ORA ACCUM+1
ORA ACCUM+2
BNE .1
RTS
*--------------------------------
* CONVERT 2 DIGIT NUMBER
*--------------------------------
CONVERT.DECIMAL.TWO.DIGITS
CLC
ADC #100 FORCE TWO DIGITS TO PRINT
JSR CONVERT.TO.DECIMAL
LDA #" " COVER UP THE "1"
INY
*--------------------------------
STUFF.WBUF.AND.BACKUP
STA WBUF+1,Y
DEY
RTS
*--------------------------------
* CONVERT TO HEX
*--------------------------------
CONVERT.TO.HEX
PHA
AND #$0F
JSR .1
PLA
LSR
LSR
LSR
LSR
.1 ORA #$B0
CMP #$BA
BCC .2
ADC #6
.2 JSR STUFF.WBUF.AND.BACKUP
LDA #"$"
STA WBUF+1,Y
RTS
*--------------------------------
* DIVIDE ACCUM BY TEN
*--------------------------------
* DIVIDE 24-BIT VALUE IN ACCUM BY TEN
* RETURN REMAINDER IN A-REG
*--------------------------------
DIVIDE.ACCUM.BY.TEN
LDX #24 24 BITS IN DIVIDEND
LDA #0 START WITH REM=0
.1 JSR SHIFT.ACCUM.LEFT
ROL
CMP #10
BCC .2 ...STILL < 10
SBC #10
INC ACCUM QUOTIENT BIT
.2 DEX NEXT BIT
BNE .1
RTS
*--------------------------------
BLANK.WBUF
LDA #" "
LDY #79
.1 JSR STUFF.WBUF.AND.BACKUP
BPL .1
RTS
*--------------------------------
NOW JSR GP.MLI
.DA #$82,0000
JSR BLANK.WBUF
LDX #4
.1 LDA GP.DATE-1,X
STA DIRBUF-1,X
DEX
BNE .1
LDY #15
JSR FORMAT.DATE.AND.TIME
LDA #20
STA CAT.WIDTH
*** JMP PRINT.CATALOG.LINE
*--------------------------------
PRINT.CATALOG.LINE
LDX CAT.WIDTH
LDA #$8D
STA WBUF+1,X
JSR PRINT.MESSAGE
CLC because a SEC would indicate ERROR
RTS
*--------------------------------------
MAN
SAVE usr/src/scmasm.31/sci.s.cat
LOAD usr/src/scmasm.31/scmasm.s
ASM