P******************************** * * * MACRO LIBRARY * * * * with 2 program examples * * * * 10/26/85 * * * * Use it as a guide * * * ******************************** * After stripping out the examples and other junk * you can paste this in your program, or use it * with the USE opcode. GETCFG = $FF6B ;Get config for bank # in X PRIMM = $FF7D ;Print immediate utility CHRIN = $FFCF CHROUT = $FFD2 PLOT = $FFF0 BANK MAC LDA #0 ;Rom up STA $FF00 LDX #]1 JSR GETCFG STA $FF00 <<< INCD MAC INC ]1 BNE NC INC ]1+1 NC <<< DECD MAC LDA ]1 BNE ND DEC ]1+1 ND DEC ]1 <<< MOV MAC LDA ]1 STA ]2 <<< MOVD MAC MOV ]1 ;]2 MOV ]1+1 ;]2+1 <<< STIND MAC MOV ]1 ;(]2),Y INY MOV ]1+1 ;(]2),Y <<< LDIND MAC MOV (]1),Y ;]2 INY MOV (]1),Y ;]2+1 <<< ADD MAC CLC LDA ]1 ADC ]2 STA ]3 LDA ]1+1 ADC ]2+1 STA ]3+1 <<< SUB MAC SEC LDA ]1 SBC ]2 STA ]3 LDA ]1+1 SBC ]2+1 STA ]3+1 <<< ADDX MAC TXA CLC ADC ]1 STA ]2 LDA ]1+1 ADC #0 STA ]2+1 <<< ADDY MAC TYA CLC ADC ]1 STA ]2 LDA ]1+1 ADC #0 STA ]2+1 <<< ADDNUM MAC LDA #]1 CLC ADC ]2 STA ]2 BCC NI INC ]2+1 NI <<< SWAP MAC LDA ]1 PHA LDA ]2 STA ]1 PLA STA ]2 <<< CMPD MAC LDA ]1 CMP ]2 LDA ]1+1 SBC ]2+1 <<< CMPADRS MAC LDA ]1 CMP #<]2 LDA ]1+1 SBC #>]2 <<< POKE MAC MOV #]2 ;]1 <<< SETPNT MAC POKE ]1 ;]2 POKE ]1+1 ;>]2 <<< CMPSTR MAC LP LDA (]2),Y AND #%01111111 CMP ]1,Y BNE OUT DEY BPL LP INY OUT <<< PRCHR MAC LDA #]1 JSR CHROUT <<< PRADRS MAC LDX ]1 LDA ]1+1 JSR PRNTAX <<< GOTOXY MAC LDY #]1 LDX #]2 CLC JSR PLOT <<< PRINT MAC JSR PRIMM IF '=]1 TXT ]1 ELSE HEX ]1 TXT ]2 FIN BRK <<< ********** Examples ************ EXP OFF ;Do not print macro expansion TR ;Limit to 3 bytes printed/line SAVOBJ KBD EXAMPLE KBD ******************************** * * Example 1 * * (Find input ASCII string in * memory from $1C00 to $EFFF.) * * To use: LOAD "SEARCH.O",8,1 * Type NEW if in direct mode, * then SYS 20*256. * * Put EXAMPLE = 1 to assemble * ******************************** DO EXAMPLE-1 ELSE PL = $8B QL = $8D LEN = $8F IN = $200 START = $1C00 END = $F000 IMAIN = $302 ORG $1400 PRINT 93 ;'text to locate:'0D SETPNT PL ;START INPUT LDX #0 :INP JSR CHRIN AND #%01111111 STA IN,X CMP #$D BEQ :INGOT INX CPX #$59 BLT :INP BGE INPUT :INGOT DEX BPL :ISINP JMP :EXIT ;Leave if no input :ISINP STX LEN ADDX PL ;QL :NXCMP BANK 0 LDY LEN CMPSTR IN ;PL BNE :NEXT BANK $F ;Bank in rom to call kernel PRCHR $D ;Found, print location PRCHR '$' PRADRS PL :NEXT INCD PL INCD QL CMPADRS QL ;END ;Finished? BLT :NXCMP BANK $F PRINT 0D ;'sys 20*256 for more'0D :EXIT JMP (IMAIN) * Subroutine to print A,X in hex: PRNTAX JSR PRBYTE ;Print A in hex TXA ;Get X PRBYTE PHA ;Subroutine to print A in hex LUP 4 LSR --^ JSR PRNIB ;Print high nibble PLA ;Get low nibble AND #$F PRNIB ORA #'0' CMP #'9'+1 BLT :PRIT ADC #'a'-'9'-2 :PRIT JMP CHROUT ERR ^$1C00 DO SAVOBJ SAVE "@0:SEARCH" FIN ;Of SAVOBJ conditional FIN ;Of EXAMPLE conditional PAG ******************************** * * Example 2 * * (Revive a dead BASIC prog.) * * To use: LOAD "REVIVE.O",8,1 * set BANK 15 and then SYS 20*256. * The dead program, if any, * will be back. * * Put EXAMPLE = 2 to assemble * ******************************** DO EXAMPLE-2 ELSE PL = $8B QL = $8D TXTTAB = $2D LINKSET = $AF87 BASWARM = $4003 ORG $1400 BANK 0 MOVD TXTTAB ;PL ADDNUM 4 ;PL LDY #0 FNDEND LDA (PL),Y ;Find end of first line PHP INCD PL PLP BNE FNDEND STIND PL ;TXTTAB ;First link :LOOP DEY ;Now Y=0 LDIND PL ;QL ;Put next link in QL LDA QL ;Is link ORA QL+1 ;= 0 ? BEQ :FIXPNT CMPD QL ;PL ;Validity check BLT :BADPROG MOVD QL ;PL ;Set up for loop JMP :LOOP :FIXPNT BANK $F JMP LINKSET ;Let BASIC finish it up :BADPROG BANK $F JMP BASWARM ERR ^$1C00 DO SAVOBJ SAVE "@0:REVIVE" FIN ;Of SAVOBJ conditional FIN ;Of EXAMPLE conditional