tm@polari.UUCP (Toshi Morita) (07/24/90)
U:;$^ ; ; Pidgin macro set (6502) for Merlin Pro/ProDOS ; ; by Toshiyasu Morita ; ; Started: 9/1/88 @ 9:49 am ; ; ; Header macros & other misc macros ; :top; @ LST OFF; @ ORG $2000; @ JMP _beginmain:; @ PUT PIDGIN.RT; :top.gs; @ LST OFF; @ ORG $2000; @ JMP _beginmain:; @ PUT PIDGIN.GS.RT; :bottom; @_progend:; @ TYP $FF; @ SAV TEST; :beginmain(AC,IAV); @ LST ON; _beginmain:; @ LST OFF; @ CLD; :endmain; @ RTS; :const K$$=+$$$; _K^P1C^P2C EQU ^V3S^V4*^V5*^!0N; :ascii '$$$$$$$$$'; ASC '^P1C^P2C^P3C^P4C^P5C^P6C^P7C^P8C^P9C'; :null; HEX 00; ; ; Basic datatype definition macros ; :byte $$; _^P1C^P2C: DS 1; :int I$$; _I^P1C^P2C: DS 2; :byte $$($$$); _^P1C^P2C: DS ^V3S^V4*^V5*^!0N; :int I$$($$$); _I^P1C^P2C: DS 2*^V3S^V4*^V5*^!0N; :byte $$($$$$$); _^P1C^P2C: DS ^V3S^V4*^V5*^V6*^V7*^!0N; ; ; Set variables to constants macros ; :$$='$'; @ LDA #'^P3C'; @ STA _^P1C^P2C:; :$$=K$$; @ LDA #_K^P3C^P4C; @ STA _^P1C^P2C:; :$$=+$$$; @ LDA #^V3S^V4*^V5*^!0N; @ STA _^P1C^P2C:; :I$$=+00000; Special-case macro to generate shorter code @ LDA #0; @ STA _I^P1C^P2C:; @ STA _I^P1C^P2C:+1; :I$$=+$$$$$; @ LDA #<^V3S^V4*^V5*^V6*^V7*^!0N; @ STA _I^P1C^P2C:; @ LDA #>^V3S^V4*^V5*^V6*^V7*^!0N; @ STA _I^P1C^P2C:+1; :I$$=heap; @ LDA #<_progend:; @ STA _I^P1C^P2C:; @ LDA #>_progend:; @ STA _I^P1C^P2C:; ; ; Data conversion macros ; :$$=$$; @ LDA _^P3C^P4C:; @ STA _^P1C^P2C:; :I$$=I$$; @ LDA _I^P3C^P4C:; @ STA _I^P1C^P2C:; @ LDA _I^P3C^P4C:+1; @ STA _I^P1C^P2C:+1; :I$$=$$; @ LDA _^P3C^P4C:; @ STA _I^P1C^P2C:; @ LDA #0; @ STA _I^P1C^P2C:+1; :$$=I$$; @ LDA _I^P3C^P4C:; @ STA _^P1C^P2C:; :pack(I$$,$$,$$); @ LDA _^P5C^P6C:; @ STA _I^P1C^P2C:; @ LDA _^P3C^P4C:; @ STA _I^P1C^P2C:+1; :unpack(I$$,$$,$$); @ LDA _I^P1C^P2C:; @ STA _^P3C^P4C:; @ LDA _I^P1C^P2C:+1; @ STA _^P5C^P6C:; ; ; Array operations ; :$$=$$($$); @ LDY _^P5C^P6C:; @ LDA _^P3C^P4C:,Y; @ STA _^P1C^P2C:; :$$($$)=$$; @ LDA _^P5C^P6C:; @ LDY _^P3C^P4C:; @ STA _^P1C^P2C:,Y; :$$($$)=+$$$; @ LDA #^V5S^V6*^V7*^!0N; @ LDY _^P3C^P4C:; @ STA _^P1C^P2C:,Y; :$$($$)=K$$; @ LDA #_K^P5C^P6C; @ LDY _^P3C^P4C:; @ STA _^P1C^P2C:,Y; :$$($$)='$'; @ LDA #'^P5C'; @ LDY _^P3C^P4C:; @ STA _^P1C^P2C:,Y; :$$=$$(I$$); Macro OK @ LDA #<_^P3C^P4C:; @ CLC; @ ADC _I^P5C^P6C:; @ STA PNTR; @ LDA #>_^P3C^P4C:; @ ADC _I^P5C^P6C:+1; @ STA PNTR+1; @ LDY #0; @ LDA (PNTR),Y; @ STA _^P1C^P2C:; :$$(I$$)=$$; @ LDA #<_^P1C^P2C:; @ CLC; @ ADC _I^P3C^P4C:; @ STA PNTR; @ LDA #>_^P1C^P2C:; @ ADC _I^P3C^P4C:+1; @ STA PNTR+1; @ LDA _^P5C^P6C:; @ LDY #0; @ STA (PNTR),Y; :$$(I$$)=+$$$; @ LDA #<_^P1C^P2C:; @ CLC; @ ADC _I^P3C^P4C:; @ STA PNTR; @ LDA #>_^P1C^P2C:; @ ADC _I^P3C^P4C:+1; @ STA PNTR+1; @ LDA #^V5S^V6*^V7*^!0N; @ LDY #0; @ STA (PNTR),Y; :$$(I$$)=K$$; @ LDA #<_^P1C^P2C:; @ CLC; @ ADC _I^P3C^P4C:; @ STA PNTR; @ LDA #>_^P1C^P2C:; @ ADC _I^P3C^P4C:+1; @ STA PNTR+1; @ LDA #_K^P5C^P6C; @ LDY #0; @ STA (PNTR),Y; :$$(I$$)='$'; @ LDA #<_^P1C^P2C:; @ CLC; @ ADC _I^P3C^P4C:; @ STA PNTR; @ LDA #>_^P1C^P2C:; @ ADC _I^P3C^P4C:+1; @ STA PNTR+1; @ LDA #'^P5C'; @ LDY #0; @ STA (PNTR),Y; :I$$=I$$($$); @ LDA _^P5C^P6C:; @ ASL; @ TAY; @ LDA _I^P3C^P4C:,Y; @ STA _I^P1C^P2C:; @ LDA _I^P3C^P4C:+1,Y; @ STA _I^P1C^P2C:+1; :I$$($$)=I$$; @ LDX #0; @ LDA _^P3C^P4C:; @ ASL; @ BCC *+3; @ INX; @ CLC; @ ADC #<_I^P1C^P2C:; @ STA PNTR; @ TXA; @ ADC #>_I^P1C^P2C:+1; @ STA PNTR+1; @ LDA _I^P5C^P6C:; @ LDY #0; @ STA (PNTR),Y; @ LDA _I^P5C^P6C:+1; @ INY; @ STA (PNTR),Y; :I$$=I$$(I$$); @ LDA #<_I^P3C^P4C:; @ CLC; @ ADC _I^P5C^P6C:; @ STA PNTR; @ LDA #>_I^P3C^P4C:; @ ADC _I^P5C^P6C:+1; @ STA PNTR+1; @ LDY #0; @ LDA (PNTR),Y; @ STA _I^P1C^P2C:; @ INY; @ LDA (PNTR),Y; @ STA _I^P1C^P2C:+1; :I$$(I$$)=I$$; @ LDA #<_I^P1C^P2C:; @ CLC; @ ADC _I^P3C^P4C:; @ STA PNTR; @ LDA #>_I^P1C^P2C:; @ ADC _I^P3C^P4C:+1; @ STA PNTR+1; @ LDY #0; @ LDA _I^P5C^P6C:; @ STA (PNTR),Y; @ INY; @ LDA _I^P5C^P6C:+1; @ STA (PNTR),Y; ; ; Heap operations ; :$$=(I$$); @ LDA _I^P3C^P4C:; @ STA PNTR; @ LDA _I^P3C^P4C:+1; @ STA PNTR+1; @ LDX #0; @ LDA (PNTR,X); @ STA _^P1C^P2C:; :(I$$)=$$; @ LDA _I^P1C^P2C:; @ STA PNTR; @ LDA _I^P1C^P2C:+1; @ STA PNTR+1; @ LDA _^P3C^P4C:; @ LDX #0; @ STA (PNTR,X); :(I$$)='$'; @ LDA _I^P1C^P2C:; @ STA PNTR; @ LDA _I^P1C^P2C:+1; @ STA PNTR+1; @ LDA #'^P3C'; @ LDX #0; @ STA (PNTR,X); :(I$$)=K$$; @ LDA _I^P1C^P2C:; @ STA PNTR; @ LDA _I^P1C^P2C:+1; @ STA PNTR+1; @ LDA #_K^P3C^P4C; @ LDX #0; @ STA (PNTR,X); :(I$$)=+$$$; @ LDA _I^P1C^P2C:; @ STA PNTR; @ LDA _I^P1C^P2C:+1; @ STA PNTR+1; @ LDA #^V3S^V4*^V5*^!0N; @ LDX #0; @ STA (PNTR,X); :I$$=(I$$); @ LDA _I^P3C^P4C:; @ STA PNTR; @ LDA _I^P3C^P4C:+1; @ STA PNTR+1; @ LDY #0; @ LDA (PNTR),Y; @ STA _I^P1C^P2C:; @ INY; @ LDA (PNTR),Y; @ STA _I^P1C^P2C:+1; :(I$$)=I$$; @ LDA _I^P1C^P2C:; @ STA PNTR; @ LDA _I^P1C^P2C:+1; @ STA PNTR+1; @ LDY #0; @ LDA _I^P3C^P4C:; @ STA (PNTR),Y; @ INY; @ LDA _I^P3C^P4C:+1; @ STA (PNTR),Y; ; ; Arithmetic operations ; :$$=$$+$$; @ LDA _^P3C^P4C:; @ CLC; @ ADC _^P5C^P6C:; @ STA _^P1C^P2C:; :$$=$$-$$; @ LDA _^P3C^P4C:; @ SEC; @ SBC _^P5C^P6C:; @ STA _^P1C^P2C:; :$$=$$&$$; @ LDA _^P3C^P4C:; @ AND _^P5C^P6C:; @ STA _^P1C^P2C:; :$$=$$?$$; @ LDA _^P3C^P4C:; @ ORA _^P5C^P6C:; @ STA _^P1C^P2C:; :$$=$$%$$; @ LDA _^P3C^P4C:; @ ORA _^P5C^P6C:; @ STA _^P1C^P2C:; :I$$=-I$$; @ LDA #0; @ SEC; @ SBC _I^P3C^P4C:; @ STA _I^P1C^P2C:; @ LDA #0; @ SBC _I^P3C^P4C:+1; @ STA _I^P1C^P2C:+1; :I$$=I$$+$$; @ LDA _I^P3C^P4C:; @ CLC; @ ADC _^P5C^P6C:; @ STA _I^P1C^P2C:; @ LDA _I^P3C^P4C:+1; @ ADC #0; @ STA _I^P1C^P2C:+1; :I$$=I$$+I$$; @ LDA _I^P3C^P4C:; @ CLC; @ ADC _I^P5C^P6C:; @ STA _I^P1C^P2C:; @ LDA _I^P3C^P4C:+1; @ ADC _I^P5C^P6C:+1; @ STA _I^P1C^P2C:+1; :I$$=I$$-$$; @ LDA _I^P3C^P4C:; @ SEC; @ SBC _^P5C^P6C:; @ STA _I^P1C^P2C:; @ LDA _I^P3C^P4C:+1; @ SBC #0; @ STA _I^P1C^P2C:+1; :I$$=I$$-I$$; @ LDA _I^P3C^P4C:; @ SEC; @ SBC _I^P5C^P6C:; @ STA _I^P1C^P2C:; @ LDA _I^P3C^P4C:+1; @ SBC _I^P5C^P6C:+1; @ STA _I^P1C^P2C:+1; ;I$$=I$$*I$$; :I$$=I$$/I$$; ; ; Comparison operators ; :$$!=$$; @ LDA _^P3C^P4C:; @ EOR #$FF; @ STA _^P1C^P2C:; :$$=$$==$$; @ LDX #$FF; @ LDA _^P3C^P4C:; @ CMP _^P5C^P6C:; @ BEQ *+3; @ INX; @ STX _^P1C^P2C:; :$$=$$!=$$; @ LDX #$FF; @ LDA _^P3C^P4C:; @ CMP _^P5C^P6C:; @ BNE *+3; @ INX; @ STX _^P1C^P2C:; :$$=$$<=$$; Macro OK @ LDX #$FF; @ LDA _^P3C^P4C:; @ CMP _^P5C^P6C:; @ BCC *+3; @ INX; @ STX _^P1C^P2C:; :$$=$$<!$$; @ LDX #$FF; @ LDA _^P3C^P4C:; @ CMP _^P5C^P6C:; @ BEQ *+5; @ BCC *+3; @ INX; @ STX _^P1C^P2C:; :$$=$$==K$$; @ LDX #$FF; @ LDA _^P3C^P4C:; @ CMP #_K^P5C^P6C; @ BEQ *+3; @ INX; @ STX _^P1C^P2C:; :$$=$$!=K$$; @ LDX #$FF; @ LDA _^P3C^P4C:; @ CMP #_K^P5C^P6C; @ BNE *+3; @ INX; @ STX _^P1C^P2C:; :$$=$$<=K$$; @ LDX #$FF; @ LDA _^P3C^P4C:; @ CMP #_K^P5C^P6C; @ BCC *+5; @ BEQ *+3; @ INX; @ STX _^P1C^P2C:; :$$=$$<!K$$; @ LDX #$FF; @ LDA _^P3C^P4C:; @ CMP #_K^P5C^P6C; @ BCC *+3; @ INX; @ STX _^P1C^P2C:; :$$=I$$==I$$; @ LDX #$FF; @ LDA _I^P3C^P4C:; @ CMP _I^P5C^P6C:; @ BNE *+10; @ LDA _I^P3C^P4C:+1; @ CMP _I^P5C^P6C:+1; @ BEQ *+3; @ INX; @ STX _^P1C^P2C:; :$$=I$$!=I$$; @ LDX #$FF; @ LDA _I^P3C^P4C:; @ CMP _I^P5C^P6C:; @ BNE *+11; @ LDA _I^P3C^P4C:+1; @ CMP _I^P5C^P6C:+1; @ BNE *+3; @ INX; @ STX _^P1C^P2C:; :$$=I$$<=I$$; Macro OK @ LDX #$FF; @ LDA _I^P3C^P4C:+1; @ CMP _I^P5C^P6C:+1; @ BCC *+17; @ BEQ *+4; @ BCS *+12; @ LDA _I^P3C^P4C:; @ CMP _I^P5C^P6C:; @ BEQ *+5; @ BCC *+3; @ INX; @ STX _^P1C^P2C:; :$$=I$$<!I$$; Macro OK @ LDX #$FF; @ LDA _I^P3C^P4C:+1; @ CMP _I^P5C^P6C:+1; @ BCC *+15; @ BEQ *+4; @ BCS *+10; @ LDA _I^P3C^P4C:; @ CMP _I^P5C^P6C:; @ BCC *+3; @ INX; @ STX _^P1C^P2C:; ; ; C-like increment/decrement operators ; :$$--; Macro OK @ DEC _^P1C^P2C:; :$$++; Macro OK @ INC _^P1C^P2C:; :I$$--; Macro OK @ LDA _I^P1C^P2C:; @ BNE *+5; @ DEC _I^P1C^P2C:+1; @ DEC _I^P1C^P2C:; :I$$++; Macro OK @ INC _I^P1C^P2C:; @ BNE *+5; @ INC _I^P1C^P2C:+1; ; ; Conditionals ; ; (if-else-endif construct) :if $$; @ LDA _^P1C^P2C:; @ BNE *+5; @ JMP _F^U0S^S0N:; :else; @ JMP _F^U0P^P0N^!9P:; _F^P9N:; ^P0S :endif; _F^!0N:; ; (choose on $$-case $$-default-endchoose construct) :choose on $$; Macro OK @ LDA _^P1C^P2C:; ^U0S^N3S^U1S; @ JMP *+6; :case $$; Macro OK ^!0P^!9P^!8P @ JMP _XC^P0N:; _UP^P8N: CMP _^P1C^P2C:; @ BEQ *+5; @ JMP _UP^U1S^S8N^N0S^P0S:; :case K$$; ^!0P^!9P^!8P @ JMP _XC^P0N:; _UP^P8N: CMP #_K^P1C^P2C; @ BEQ *+5; @ JMP _UP^U1S^S8N^N0S^P0S:; :case '$'; ^!0P^!9P^!8P @ JMP _XC^P0N:; _UP^P8N: CMP #'^P1C'; @ BEQ *+5; @ JMP _UP^U1S^S8N^N0S^P0S:; :case +$$$; Macro OK ^!0P^!9P^!8P @ JMP _XC^P0N:; _UP^P8N: CMP #^V1S^V2*^V3*^!0N; @ BEQ *+5; @ JMP _UP^U1S^S8N^N0S^P0S:; :default; Macro OK ^!0P^!9P^!8P @ JMP _XC^P0N:; _UP^P8N:; ^P0S :endchoose; Macro OK _XC^!0N@:; ; (while-on $$-endwhile construct) :while; Macro OK ^U0S_X^S0N:; :on $$; Macro OK @ LDA _^P1C^P2C:; @ BNE *+5; @ JMP _W^S0N:; :endwhile; Macro OK @ JMP _X^S0N:; _W^!0N:; ; ; Gotos & subroutines ; :loc $$; __LLO^P1C^P2C:; :loc $$$$$$$$$; __LLO^P1C^P2C^P3C^P4C^P5C^P6C^P7C^P8C^P9C:; :sub $$; @ LST ON; __^P1C^P2C:; @ LST OFF; :sub $$$$$$$$$; @ LST ON; __^P1C^P2C^P3C^P4C^P5C^P6C^P7C^P8C^P9C:; @ LST OFF; :goto $$; @ JMP __LLO^P1C^P2C:; :goto $$$$$$$$$; @ JMP __LLO^P1C^P2C^P3C^P4C^P5C^P6C^P7C^P8C^P9C:; :gosub $$; @ JSR __^P1C^P2C:; :gosub $$$$$$$$$; @ JSR __^P1C^P2C^P3C^P4C^P5C^P6C^P7C^P8C^P9C:; :call I$$; @ LDA #>*+9; @ PHA; @ LDA #<*+6; @ PHA; @ JMP (_I^P1C^P2C:); :endsub; @ RTS; :return; @ RTS; ; ; I/O subroutines ; :decprt I$$; Macro OK @ LDY _I^P1C^P2C:; @ LDX _I^P1C^P2C:+1; @ JSR __PRTDEC; :read $$; @ JSR __GETKEY; @ STA _^P1C^P2C:; :write $$; @ LDA _^P1C^P2C:; @ JSR __COUT; :write K$$; @ LDA #_K^P1C^P2C; @ JSR __COUT; :write '$'; @ LDA #'^P1C'; @ JSR __COUT; :ms '$$$$$$$$$'; @ JSR __MSG; @ ASC "^P1C^P2C^P3C^P4C^P5C^P6C^P7C^P8C^P9C"; @ BRK; :curpos($$,$$); @ LDA _^P1C^P2C:; @ STA CV; @ JSR BASCALC; @ LDA _^P3C^P4C:; @ STA CH; :curpos(+$$$,+$$$); @ LDA #^V1S^V2*^V3*^!0N; @ STA CV; @ JSR BASCALC; @ LDA #^V4S^V5*^V6*^!0N; @ STA CH; ; ; File I/O subroutines ; :I$$,I$$=file_len($); @ JSR __FLEN; @ DFB ^P5C; @ DW I_^P1C^P2C:,I_^P3C^P4C:; :file_open($,$$); @ JSR __FOPEN; @ DFB ^P1C; @ DW _^P2C^P3C:; :file_read($,$$,I$$); @ JSR __FREAD; @ DFB ^P1C; @ DW _^P2C^P3C:,_I^P4C^P5C:; :file_close($); @ JSR __FCLOSE; @ DFB ^P1C; ; ; Serial I/O subroutines ; :modem_init; @ JSR __MINIT; :modem_read($$); @ JSR __MREAD; @ STA _^P1C^P2C:; :modem_write($$); @ LDA _^P1C^P2C:; @ JSR __MWRITE; :?modem_read($$); @ LDA #1; @ JSR __MREADY; @ STA _^P1C^P2C:; :?modem_write($$); @ LDA #0; @ JSR __MREADY; @ STA _^P1C^P2C:;