TTL 'Librarian V 1' ******************************** * * * ADE librarian version 1.0 * * * * program by Steve Swallow * * * * (c) 1983 SYSTEM software * * * ******************************** ; MOS calls OSWRCH EQU &FFEE ;write character OSNEWL EQU &FFE7 ;new line OSASCI EQU &FFE3 ;write printable char OSWORD EQU &FFF1 ;general system call OSBYTE EQU &FFF4 ;*FX call OSBPUT EQU &FFD4 ;file write byte OSBGET EQU &FFD7 ;file read byte OSFIND EQU &FFCE ;open file OSCLI EQU &FFF7 ;*commands BRKV EQU &202 ;error vector BRKP EQU &FD ;pointer after BRK ; working storage DSECT ORG &70 ;user's zero page with BASIC NEXT DW 0 ;next free byte in RAM MACRO DW 0 ;pointer to macro text ORG &700 ;BASIC input buffer ALL DFB 0 ;flag for '/' INDEX DFB 0 ;point command ICHAN DFB 0 ;input file OCHAN DFB 0 ;output file MASK DFB 0 ;erase/recover mask LAST DW 0 ;previous NEXT value NAME DS 6 ;macro name FILE DS 16 ;file name HIMEM DW 0 ;RAM top OLDBV DW 0 ;old BRK vector OLDSP DFB 0 ;Old stack pointer CBUF DS 81 ;command line DEND ***** macro definitions ***** GET SYSLIB,VDU,FX,ERROR,OSW ;open file ; parameters are address of name ; mode to open and address to save channel OPEN MACRO LDX #>@1 LDY #<@1 LDA #@2 JSR OSFIND STA @3 ENDM ; close file CLOSE MACRO LDY @1 LDA #0 JSR OSFIND ENDM ; move word MOVEW MACRO LDA @1 STA @2 LDA @1+1 STA @2+1 ENDM ; store 16 bit value STOREW MACRO LDA #>@1 STA @2 LDA #<@1 STA @2+1 ENDM ; store 8 bit value STORE MACRO LDA #@1 STA @2 ENDM ; increment word INCW MACRO INC @1 BNE L1 INC @1+1 L1 ENDM ; get character from CBUF SKIP MACRO L1 INX LDA CBUF,X CMP #32 BEQ L1 CMP #13 ENDM ; mark end of RAM in use MARK MACRO LDY #0 TYA STA (NEXT),Y INY STA (NEXT),Y ENDM ************************************** ; program starts at &1900 to ; allow maximum memory with disc ; system . Move to &1B00 for econet. ORG &1900 TSX ;Save stack pointer to STX OLDSP ;return to caller FX 132,0,0 STX HIMEM STY HIMEM+1 ;and save MOVEW BRKV,OLDBV STOREW REPORT,BRKV STOREW WORKAR,NEXT STOREW 0,WORKAR STORE 0,OCHAN ERROR 0,Librarian V1.0 ; CRLF routines used by commands CRLF2 JSR CRLF ;do double line feed CRLF JMP OSNEWL ; INPUT line control block for OSWORD 0 INPUT DW CBUF DFB 80,32,126 ; Help screen comes up if null line typed HELP STR '|M' STR 'I Open and read input file' STR 'O Open output file' STR 'W Write macros' STR 'Z Close file' STR 'L List macros' STR 'P Print macros' STR 'C Catalogue macros' STR 'D Delete macros' STR 'R Recover macros' STR 'X Exit|M' BRK ; get file name GETFN LDY #0 LDX INDEX ;point start LDA CBUF,X CMP #13 BNE GF1 ERROR 4,Please give file name GF1 LDA CBUF,X STA FILE,Y INY CPY #13 BNE GF2 LDA #13 ;default STA FILE,Y RTS GF2 INX CMP #13 BNE GF1 RTS ; get macro name GMAC LDY #0 BIT ALL ;if / given use ****** BMI GALL LDX INDEX ;point name LDA CBUF,X CMP #13 ;no name? BNE GM2 ERROR 3,Please specify which macros GM2 LDA CBUF,X CMP #13 ;end? BEQ GM1 STA NAME,Y INY INX CPY #6 BNE GM2 RTS ;full name given GM1 LDA #' ' ;Pad with spaces GM4 STA NAME,Y INY CPY #6 BNE GM4 RTS ; Translate / to ****** GALL LDA #'* BNE GM4 ************************************** ; ERROR report drops into main loop REPORT VDU 3 JSR CRLF LDY #1 ;print offending text REP1 LDA (BRKP),Y BEQ REP2 ;done JSR OSWRCH INY BNE REP1 REP2 FX 126,0,0 JSR CRLF2 LDX OLDSP ;reset stack TXS ; main loop LOOP VDU ':' OSW 0,INPUT BCC LP1 ;CR terminated ESCAPE ERROR 1,Escape ; process command LP1 LDX #&FF ;index command line SKIP BNE LP2 ; in null line then offer help LDX #0 LP11 LDA HELP,X BEQ LOOP JSR OSASCI INX BNE LP11 ; see if '/' wild card preceeds command LP2 PHA STORE 0,ALL PLA CMP #'/ BNE LP20 DEC ALL ;set flag SKIP BNE LP20 BADCMD ERROR 2,Unknown command LP20 PHA SKIP STX INDEX PLA CMP #'* BNE LP200 ;do star LDX #>CBUF LDY #LOOP-1 PHA LDA CMDS+2,X ;after a visit here PHA LDA CMDS+1,X PHA BIT ALL ;/ status RTS ;Go do command CMDS DFB 'L DW LIST-1 DFB 'P DW PRINT-1 DFB 'D DW DELETE-1 DFB 'X DW EXIT-1 DFB 'C DW CAT-1 DFB 'I DW IFILE-1 DFB 'O DW OFILE-1 DFB 'Z DW EF-1 DFB 'W DW WRITE-1 DFB 'N DW NEW-1 BRK ************************************** ***** THE COMMANDS ***** ; I read input file IFILE JSR GETFN MOVEW NEXT,LAST OPEN FILE,&40,ICHAN TAY ;file found? BNE IN1 ERROR 5,File not found IN1 LDY ICHAN ;read byte JSR OSBGET BCS EOF ;at end AND #$7F ;strip bit 7 LDY #0 STA (NEXT),Y ;store INCW NEXT LDA NEXT+1 CMP HIMEM+1 ;out of memory? BNE IN1 LDA #0 CLOSE ICHAN MOVEW LAST,NEXT MARK ERROR 6,No room EOF CLOSE ICHAN DEC NEXT ;point 2nd zero LDX NEXT INX BNE EOF1 DEC NEXT+1 EOF1 RTS ; O open output file OFILE LDA OCHAN BEQ OF1 ERROR 7,"O" already active OF1 JSR GETFN OPEN FILE,&40,OCHAN TAY BEQ OF2 ;no so create new file CLOSE OCHAN STORE 0,OCHAN ERROR 8,File exists OF2 OPEN FILE,&80,OCHAN RTS ; Z close file EF LDA #0 LDY OCHAN BEQ EF1 JSR OSBPUT CLOSE OCHAN STORE 0,OCHAN EF1 RTS ; N new - CLEAR MEMORY NEW STOREW 0,WORKAR STOREW WORKAR,NEXT ERROR 0,Memory cleared ; macro matching routines ; carry clear if macro found to ; match name. GMACF JSR GMAC FIRST STOREW WORKAR,MACRO FIND LDY #0 LDA (MACRO),Y ;at end of buffer? BEQ NFOUND ;then not found BMI FIND1 ;this macro deleted FIND2 LDA NAME,Y CMP #'* ;wild card? BEQ WILD CMP (MACRO),Y BNE FIND1 ;no match WILD INY CPY #6 BNE FIND2 CLC RTS ;found so carry clear NFOUND SEC RTS ; find next macro FIND1 LDY #0 FI1 LDA (MACRO),Y INCW MACRO CMP #0 BNE FI1 BEQ FIND ; P print PRINT VDU 2 ; L list LIST JSR GMACF ;get macro & first BCS NOMAC ;not found LILP JSR CRLF2 LDY #0 LDX #0 LI1 LDA (MACRO),Y JSR OSWRCH ;print name INCW MACRO INX CPX #6 BNE LI1 LINE JSR CRLF ;Skip after title LDX #0 ;print head position LI3 LDA (MACRO),Y INCW MACRO CMP #0 ;at end? BEQ LIDONE CMP #13 ;end one line? BEQ LINE CMP #9 ;tabulate? BNE LI2 ; expand tabs TAB LDA #' ' JSR LIOUT TXA AND #7 BNE TAB BEQ LI3 LI2 JSR LIOUT BNE LI3 LIOUT JSR OSASCI INX RTS LIDONE JSR FIND ;more macros? BCC LILP VDU 3 RTS NOMAC ERROR 9,Macro not found ; D delete DELETE LDA #&80 ;delete mask STA MASK JSR GMACF ;get first BCS NOMAC DR1 LDY #0 LDA (MACRO),Y AND #&7F ORA MASK ;alter bit 7 STA (MACRO),Y JSR FIND1 BCC DR1 ;more macros? RTS ; W write, delete macro as it is written out WRITE LDA OCHAN BNE WR10 ;file has been opened ERROR 10,No output file WR10 JSR GMACF WRERR BCS NOMAC WR0 LDX #0 WR11 LDA M1,X BEQ WR100 JSR OSWRCH INX BNE WR11 ; write name to screen/file WR100 LDY #0 ;first byte LDA (MACRO),Y JSR OSWRCH LDY OCHAN JSR OSBPUT LDY #0 ORA #&80 ;set bit 7 STA (MACRO),Y INCW MACRO LDX #5 ;print five more WR12 LDA (MACRO),Y JSR OSWRCH INY DEX BNE WR12 JSR CRLF ; write out rest WR1 LDY #0 LDA (MACRO),Y LDY OCHAN JSR OSBPUT PHA INCW MACRO PLA BNE WR1 JSR FIND ;more macros? BCC WR0 RTS M1 ASC 'Writing: ' BRK ; C catalog CAT JSR GMACF BCS WRERR ;No macros CAT0 LDY #0 ; print name of one macro found CAT1 LDA (MACRO),Y JSR OSWRCH INY CPY #6 BNE CAT1 ; pad with blanks to 10 chars LDX #4 LDA #' ' CAT2 JSR OSWRCH DEX BNE CAT2 JSR FIND1 ;find next BCC CAT0 CATX JMP CRLF2 ;done EXIT BPL QUIT ;no writing JSR WRITE ;else write buffer JSR EF QUIT JSR CRLF2 MOVEW OLDBV,BRKV LDX OLDSP TXS RTS ;return to caller WORKAR BRK ;start of macro storage