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 ... or , abort *--- or , so abort------ .6 JSR CHECK.KEY BMI .6 WAIT FOR KEY BNE .3 ...NOT CR OR ESC, CONTINUE *--- or , 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 BEQ .2 ...YES EOR #$8D^$9B OR IF .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 ------------- .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