#!/bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #!/bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # assmtest # assmtest.l # makefile # user.nr # This archive created: Tue Apr 2 14:21:42 1985 # By: James Van Ornum (AT&T-Bell Laboratories) export PATH; PATH=/bin:$PATH if test -f 'assmtest' then echo shar: over-writing existing file "'assmtest'" fi cat << \SHAR_EOF > 'assmtest' ;****************************************** ; Test file for the 65c02 assembler - as65c02 ; assemble as ; as65c02 -nisv assmtest ; and compare output with assmtest.l ;****************************************** ;; comment treatment ;****************************************** aa = $10; ';' immediately after the '0' B = $20 space to comment subfield C = $30 tab to comment subfield DEFGHIjkl = $FFEE D =DEFGHIjkl ;****************************************** ; Number formats ;****************************************** start *= $4 ; location counter adjust .byte %0101 ; binary number .byte 022,@22,^o22 ; octal numbers - three forms .byte 22 ; decimal number .byte $22,$ff,$FF ; hex - upper/lower case .byte 'a,'b ; single ASCII characters ;****************************************** ;; ASCII character string ;****************************************** .byte "abcd\t\n",0 ; tab and new line escaped ;****************************************** ; Operation checks ;****************************************** .word aa+B ; addition .word aa-B ; subtraction .word aa*B ; multiplication .word B/aa ; division .word C%B ; modulo .word B!C ; exclusive OR .word ~C ; one's complement .word B&C ; logical AND .word aa|B ; logical OR .word D\ ; low byte .word D^ ; high byte .word * ; current location .word aa,B,C .word B* ; one level of parenthesis .dbyt D ; high byte-low byte word .word D/256,D%256 ;****************************************** ; Addressing Mode Check ;****************************************** *=$0100 lda =aa ; immediate addressing lda #aa ; immediate addressing, alternate lda D ; direct addessing LDA aa ; page zero addressing, aa < 256 a1 = 512 a2 = 500 lda a1-a2 ; also page zero asl A ; accumulator addressing AsL a ; accumulator addressing also brk ; implied addressing lda (aa,X) ; indirect,X addressing lda (aa),Y ; indirect,Y addressing lda aa,X ; zero page,X addressing lda D,X ; absolute,X addressing lda D,Y ; absolute,Y addressing bcc *-$10 ; relative addressing jmp (D) ; indirect addressing jmp (a2,x) ; abs indexed indirect adc (aa) ; indirect zero page ldx aa,Y ; zero page,Y addressing ldx aa,y ; alternate index name .nlst ;****************************************** ; opcode check ;****************************************** adc =01 and =01 and (aa) asl A bcc *+2 bcs *+2 beq *+2 bit $01 bit $301,x bit $01,x bmi *+2 bne *+2 bpl *+2 bra *+2 brk bvc *+2 bvs *+2 clc cld cli clv cmp =01 cmp (aa) cpx =01 cpy =01 dea dec $01 dex dey eor =01 eor (aa) ina inc $01 inx iny jmp *+3 jsr *+3 lda =01 lda (aa) ldx =01 ldy =01 lsr A nop ora =01 ora (aa) pha php phx phy pla plp plx ply rol A ror A rti rts sbc =01 sbc (aa) sec sed sei sta $01 sta (aa) stx $01 sty $01 stz $301 stz $301,x stz $01 stz $01,x tax tay trb $301 trb $01 tsb $301 tsb $01 tsx txa txs tya .title some way for a listing .sbttl check for .ifeq .ifeq 0 .byte 1,2,3,$34,@10 .endc .ifne 0 .word 1234,$4354,@7777 .endc ; now check nesting .ifeq 0 lda . .ifne 0 m2 .asciz /help/ .endc m3 nasc .endc msb ON .asciz /high order bits on / nasc 1 msb off .asciz /high order bits off/ nasc 0 m31 org *+2 m4 .word .+34 m41 org .+2 m5 .byte ; now lets try some blank lines .asciz /this is ok?/ nasc .byte 0,$e .word 2 ;how about two in a row .title what does the control l mean .sbttl perhaps is the Dec 20 way of new page, anyway ignore it .ifeq 1 .sbttl Lets check to see if we skip .asciz /this should not assemble/ .sbttl these lines .endc .sbttl now this is the living end aaaa equ aa+3 aaa equ abc+5 .byte 3 abc nasc .byte 255 org $100 .asciz /1/ jmp d jmp d+2 lda cba lda abc-4 .byte 3 nasc <1> nasc <22> 1 baaa = 7+d ; can you handle this nasc 0 d lda #4 cba .word 2345 bbc ldx d+3^ lda cba lda baaa jmp bbc lda #3 rep lda #23 org $fe .ifeq <.\-$ff> ;what does the loc counter say nop .endc .ifeq <.\-$fe> ; loc ctr nop nop .endc SHAR_EOF if test -f 'assmtest.l' then echo shar: over-writing existing file "'assmtest.l'" fi cat << \SHAR_EOF > 'assmtest.l' as65c02 - version 4.1b - 11/22/84 - JHV [gvw] 1 ;****************************************** 2 ; Test file for the 65c02 assembler - as65c02 3 ; assemble as 4 ; as65c02 -nisv assmtest 5 ; and compare output with assmtest.l 6 ;****************************************** 7 ; ; comment treatment 8 ;****************************************** 9 0010 aa = $10 ; ';' immediately after the '0' 10 0020 B = $20 space to comment subfield 11 0030 C = $30 tab to comment subfield 12 FFEE DEFGHIjkl = $FFEE 13 FFEE D =DEFGHIjkl 14 ;****************************************** 15 ; Number formats 16 ;****************************************** 17 0004 start *= $4 ; location counter adjust 18 0004 05 .byte %0101 ; binary number 19 0005 12 12 12 .byte 022,@22,^o22 ; octal numbers - three forms 20 0008 16 .byte 22 ; decimal number 21 0009 22 FF FF .byte $22,$ff,$FF ; hex - upper/lower case 22 000C 61 62 .byte 'a,'b ; single ASCII characters 23 ;****************************************** 24 ; ; ASCII character string 25 ;****************************************** 26 000E 61 62 63 .byte "abcd\t\n",0 ; tab and new line escaped 0011 64 09 0A 0014 00 27 ;****************************************** 28 ; Operation checks 29 ;****************************************** 30 0015 30 00 .word aa+B ; addition 31 0017 F0 FF .word aa-B ; subtraction 32 0019 00 02 .word aa*B ; multiplication 33 001B 02 00 .word B/aa ; division 34 001D 10 00 .word C%B ; modulo 35 001F 10 00 .word B!C ; exclusive OR 36 0021 CF FF .word ~C ; one's complement 37 0023 20 00 .word B&C ; logical AND 38 0025 30 00 .word aa|B ; logical OR 39 0027 EE 00 .word D\ ; low byte 40 0029 FF 00 .word D^ ; high byte 41 002B 2B 00 .word * ; current location 42 002D 10 00 .word aa,B,C 002F 20 00 0031 30 00 43 0033 00 08 .word B* ; one level of parenthesis 44 0035 FF EE .dbyt D ; high byte-low byte word 45 0037 FF 00 .word D/256,D%256 0039 EE 00 46 ;****************************************** 47 ; Addressing Mode Check 48 ;****************************************** 49 0100 *=$0100 50 0100 A9 10 lda =aa ; immediate addressing 51 0102 A9 10 lda #aa ; immediate addressing, alternate 52 0104 AD EE FF lda D ; direct addessing 53 0107 A5 10 LDA aa ; page zero addressing, aa < 256 54 0200 a1 = 512 55 01F4 a2 = 500 56 0109 A5 0C lda a1-a2 ; also page zero 57 010B 0A asl A ; accumulator addressing 58 010C 0A AsL a ; accumulator addressing also 59 010D 00 brk ; implied addressing 60 010E A1 10 lda (aa,X) ; indirect,X addressing 61 0110 B1 10 lda (aa),Y ; indirect,Y addressing 62 0112 B5 10 lda aa,X ; zero page,X addressing 63 0114 BD EE FF lda D,X ; absolute,X addressing 64 0117 B9 EE FF lda D,Y ; absolute,Y addressing 65 011A 90 EE bcc *-$10 ; relative addressing 66 011C 6C EE FF jmp (D) ; indirect addressing 67 011F 7C F4 01 jmp (a2,x) ; abs indexed indirect 68 0122 72 10 adc (aa) ; indirect zero page 69 0124 B6 10 ldx aa,Y ; zero page,Y addressing 70 0126 B6 10 ldx aa,y ; alternate index name 72 ;****************************************** 73 ; opcode check 74 ;****************************************** 75 0128 69 01 adc =01 76 012A 29 01 and =01 77 012C 32 10 and (aa) 78 012E 0A asl A 79 012F 90 00 bcc *+2 80 0131 B0 00 bcs *+2 81 0133 F0 00 beq *+2 82 0135 24 01 bit $01 83 0137 3C 01 03 bit $301,x 84 013A 34 01 bit $01,x 85 013C 30 00 bmi *+2 86 013E D0 00 bne *+2 87 0140 10 00 bpl *+2 88 0142 80 00 bra *+2 89 0144 00 brk 90 0145 50 00 bvc *+2 91 0147 70 00 bvs *+2 92 0149 18 clc 93 014A D8 cld 94 014B 58 cli 95 014C B8 clv 96 014D C9 01 cmp =01 97 014F D2 10 cmp (aa) 98 0151 E0 01 cpx =01 99 0153 C0 01 cpy =01 100 0155 3A dea 101 0156 C6 01 dec $01 102 0158 CA dex 103 0159 88 dey 104 015A 49 01 eor =01 105 015C 52 10 eor (aa) 106 015E 1A ina 107 015F E6 01 inc $01 108 0161 E8 inx 109 0162 C8 iny 110 0163 4C 66 01 jmp *+3 111 0166 20 69 01 jsr *+3 112 0169 A9 01 lda =01 113 016B B2 10 lda (aa) 114 016D A2 01 ldx =01 115 016F A0 01 ldy =01 116 0171 4A lsr A 117 0172 EA nop 118 0173 09 01 ora =01 119 0175 12 10 ora (aa) 120 0177 48 pha 121 0178 08 php 122 0179 DA phx 123 017A 5A phy 124 017B 68 pla 125 017C 28 plp 126 017D FA plx 127 017E 7A ply 128 017F 2A rol A 129 0180 6A ror A 130 0181 40 rti 131 0182 60 rts 132 0183 E9 01 sbc =01 133 0185 F2 10 sbc (aa) 134 0187 38 sec 135 0188 F8 sed 136 0189 78 sei 137 018A 85 01 sta $01 138 018C 92 10 sta (aa) 139 018E 86 01 stx $01 140 0190 84 01 sty $01 141 0192 9C 01 03 stz $301 142 0195 9E 01 03 stz $301,x 143 0198 64 01 stz $01 144 019A 74 01 stz $01,x 145 019C AA tax 146 019D A8 tay 147 019E 1C 01 03 trb $301 148 01A1 14 01 trb $01 149 01A3 0C 01 03 tsb $301 150 01A6 04 01 tsb $01 151 01A8 BA tsx 152 01A9 8A txa 153 01AA 9A txs 154 01AB 98 tya 155 .title some way for a listing 156 .sbttl check for .ifeq 157 .ifeq 0 158 01AC 01 02 03 .byte 1,2,3,$34,@10 01AF 34 08 159 .endc 160 .ifne 0 161 .word 1234,$4354,@7777 162 .endc 163 ; now check nesting 164 .ifeq 0 165 01B1 AD B1 01 lda . 166 .ifne 0 167 m2 .asciz /help/ 168 .endc 169 01B4 ED EF F2 m3 nasc 01B7 E5 A0 EF 01BA E6 A0 F3 01BD E1 ED E5 170 .endc 171 msb ON 172 01C0 E8 E9 E7 .asciz /high order bits on / 01C3 E8 A0 EF 01C6 F2 E4 E5 01C9 F2 A0 E2 01CC E9 F4 F3 01CF A0 EF EE 01D2 A0 00 173 01D4 F3 E8 EF nasc 1 01D7 F5 EC E4 01DA A0 EE EF 01DD F4 A0 E2 01E0 E5 A0 E1 01E3 E6 E6 E5 01E6 E3 F4 E5 01E9 E4 00 174 msb off 175 01EB 68 69 67 .asciz /high order bits off/ 01EE 68 20 6F 01F1 72 64 65 01F4 72 20 62 01F7 69 74 73 01FA 20 6F 66 01FD 66 00 176 01FF F3 F4 E9 nasc 0 0202 EC EC A0 0205 EE EF F4 0208 A0 E1 E6 020B E6 E5 E3 020E F4 E5 E4 177 0213 m31 org *+2 178 0213 35 02 m4 .word .+34 179 0217 m41 org .+2 180 0217 00 m5 .byte 181 ; now lets try some blank lines 182 0218 74 68 69 .asciz /this is ok?/ 021B 73 20 69 021E 73 20 6F 0221 6B 3F 00 183 184 0224 E8 EF F7 nasc 0227 A0 E1 E2 022A EF F5 F4 022D A0 F4 E8 0230 E9 F3 185 186 0232 00 0E .byte 0,$e 187 188 189 0234 02 00 .word 2 ;how about two in a row 190 .title what does the control l mean 191 .sbttl perhaps is the Dec 20 way of new page, anyway ignore it 192 .ifeq 1 193 .sbttl Lets check to see if we skip 194 .asciz /this should not assemble/ 195 .sbttl these lines 196 .endc 197 .sbttl now this is the living end 198 0013 aaaa equ aa+3 199 023C aaa equ abc+5 200 0236 03 .byte 3 201 0237 F4 E8 E5 abc nasc 023A A0 E5 EE 023D E4 202 023E FF .byte 255 203 0100 org $100 204 0100 31 00 .asciz /1/ 205 0102 4C 18 01 jmp d 206 0105 4C 1A 01 jmp d+2 207 0108 AD 1A 01 lda cba 208 010B AD 33 02 lda abc-4 209 010E 03 .byte 3 210 010F B1 nasc <1> 211 0110 B2 B2 00 nasc <22> 1 212 011F baaa = 7+d ; can you handle this 213 0113 F4 E8 F2 nasc 0 0116 E5 E5 214 0118 A9 04 d lda #4 215 011A 29 09 cba .word 2345 216 011C bbc 217 011C A6 01 ldx d+3^ 218 011E AD 1A 01 lda cba 219 0121 AD 1F 01 lda baaa 220 0124 4C 1C 01 jmp bbc 221 0127 A9 03 lda #3 222 0129 A9 17 rep lda #23 223 00FE org $fe 224 .ifeq <.\-$ff> ;what does the loc counter say 225 nop 226 .endc 227 .ifeq <.\-$fe> ; loc ctr 228 00FE EA nop 229 00FF EA nop 230 .endc aa 10:00 0010 B 20:00 0020 C 30:00 0030 DEFGHIjkl EE:FF FFEE D EE:FF FFEE start 04:00 0004 a1 00:02 0200 a2 F4:01 01F4 m2 00:00 0000 m3 B4:01 01B4 m31 13:02 0213 m4 13:02 0213 m41 17:02 0217 m5 17:02 0217 aaaa 13:00 0013 aaa 3C:02 023C abc 37:02 0237 d 18:01 0118 cba 1A:01 011A baaa 1F:01 011F bbc 1C:01 011C rep 29:01 0129 SHAR_EOF if test -f 'makefile' then echo shar: over-writing existing file "'makefile'" fi cat << \SHAR_EOF > 'makefile' as6502: assm0.o assm1.o assm2.o assm3.o cc assm0.o assm1.o assm2.o assm3.o -o as65c02 assm0.o: assm.d1 assm.d2 assm0.c cc -c -O assm0.c assm1.o: assm.d1 assm.d2 assm1.c cc -c -O assm1.c assm2.o: assm.d1 assm.d2 assm2.c cc -c -O assm2.c assm3.o: assm.d1 assm.d2 assm3.c cc -c -O assm3.c check: assmtest.l assmtest.l: as6502 assmtest as65c02 -nisv assmtest > temp touch assmtest.l diff assmtest.l temp manuals: as6502.l user.l as6502.l: as6502.1 nroff -man as6502.1 > as6502.l user.l: user.nr nroff user.nr > user.l clean: rm assm0.o assm1.o assm2.o assm3.o temp as6502.l user.l SHAR_EOF if test -f 'user.nr' then echo shar: over-writing existing file "'user.nr'" fi cat << \SHAR_EOF > 'user.nr' .de hd 'sp 3 .tl ''\fBas6502 User Notes\fR'Page %' 'sp 2 .. .de fo 'bp .. .wh 0 hd .wh -3 fo .br \fBSOURCE LINE FORMAT\fR: .ti 0.5i .sp 1