0001 ************************************************** 0002 * * 0003 * doug.asm 0004 * 0005 * 0006 * Try out of 6809 assembler 0007 * 0008 * The cpu resets $FFFF 0009 * 0010 * 0011 * Objectives 0012 * 0013 * 0014 * set up vectors 0015 * run start up code 0016 * run simple code 0017 * 0018 * usage: 0019 * ./as9 doug.asm -l s19 0020 * 6809/a.out doug.s19 0021 * 0022 * 0023 ************************************************* 0024 * PC 0025 * U 0026 * S 0027 * Y 0028 * X 0029 * D { A,B 0030 * DP 0031 * CC 0032 ************************************************* 0033 0034 0035 0036 0037 ************************************************* 0038 * sec 1.0 JUMP vectors for Processor reset and interupts. 0039 ************************************************* 0040 ** 0041 * SWI2 0042 * SWI3 0043 * FIRQ 0044 * IRQ 0045 * SWI 0046 * NMI 0047 * RESET 0048 ** 0049 fff2 ORG $FFF2 0050 fff2 e0 2d FDB SWI2rtn 0051 fff4 e0 2f FDB SWI3rtn 0052 fff6 e0 31 FDB FIRQrtn 0053 fff8 e0 33 FDB IRQrtn 0054 fffa e0 35 FDB SWIrtn 0055 fffc e0 37 FDB NMIrtn 0056 fffe e0 39 FDB RESETrtn 0057 0058 0059 0060 0200 ORG $0200 0061 0200 00 00 CAT: FDB 0 0062 0202 00 00 DOUG: FDB 0 0063 0064 0065 ************************************************* 0066 * sec 1.0 Start of real code 0067 ************************************************* 0068 f800 ORG $F800 0069 e000 ORG $E000 0070 0071 0072 * send character to screen 0073 SUBWAITTX 0074 e000 b7 ff d1 STA $FFD1 0075 0076 WAITTX 0077 e003 b6 ff d0 LDA $FFD0 0078 e006 86 01 LDA #$01 0079 e008 84 02 ANDA #$02 0080 e00a 27 f7 BEQ WAITTX 0081 0082 e00c 12 NOP 0083 0084 e00d 39 RTS 0085 0086 0087 INIT 0088 * NOP 0089 0090 * *** load Stack pointer 0091 e00e 10 ce 01 00 LDS #$0100 0092 * NOP 0093 * NOP 0094 * LDX #$D200 0095 0096 0097 ************************************************* 0098 * sec 1.0 Main Loop 0099 ************************************************* 0100 0101 LOOP 0102 0103 * LDA #$40 0104 * JSR SUBWAITTX 0105 0106 * JMP LOOP 0107 0108 * JSR SUB1 0109 * JSR SUB2 0110 * JSR SUB3 0111 0112 0113 * Look up char and print out string 0114 e012 8e 00 00 LDX #0 0115 e015 86 42 LDA #'B' 0116 e017 bd e1 46 JSR SUB4 0117 e01a 86 41 LDA #'A' 0118 e01c bd e1 46 JSR SUB4 0119 e01f 86 43 LDA #'C' 0120 e021 bd e1 46 JSR SUB4 0121 e024 86 45 LDA #'E' 0122 e026 bd e1 46 JSR SUB4 0123 e029 12 nop 0124 e02a 7e e0 12 JMP LOOP 0125 0126 0127 0128 ************************************************* 0129 * sec 1.0 Interupt routines 0130 ************************************************* 0131 0132 0133 SWI2rtn 0134 e02d 12 NOP 0135 e02e 3b RTI 0136 0137 SWI3rtn 0138 e02f 12 NOP 0139 e030 3b RTI 0140 0141 FIRQrtn 0142 e031 12 NOP 0143 e032 3b RTI 0144 0145 IRQrtn 0146 e033 12 NOP 0147 e034 3b RTI 0148 0149 SWIrtn 0150 e035 12 NOP 0151 e036 3b RTI 0152 0153 NMIrtn 0154 e037 12 NOP 0155 e038 3b RTI 0156 0157 RESETrtn 0158 e039 7e e0 0e JMP INIT 0159 e03c 3b RTI 0160 0161 0162 0163 ************************************************* 0164 * sec 1.0 subroutines 0165 ************************************************* 0166 0167 0168 SUB1 0169 e03d 12 nop 0170 0171 * *** Software interupt 0172 e03e 3f SWI 0173 e03f 12 nop 0174 e040 39 rts 0175 0176 0177 0178 SUB2 0179 0180 0181 0182 e041 be e0 d8 ldx MSG1 ; load X with 2 bytes from string 0183 * ; load X as pointer to string and load A with each char from string 0184 e044 8e e0 d8 ldx #MSG1 0185 e047 a6 80 lda ,x+ 0186 e049 a6 80 lda ,x+ 0187 e04b a6 80 lda ,x+ 0188 e04d a6 80 lda ,x+ 0189 e04f a6 80 lda ,x+ 0190 e051 a6 80 lda ,x+ 0191 0192 e053 a6 82 lda ,-x 0193 e055 a6 82 lda ,-x 0194 e057 a6 82 lda ,-x 0195 e059 a6 82 lda ,-x 0196 e05b a6 82 lda ,-x 0197 e05d a6 82 lda ,-x 0198 0199 0200 0201 e05f 12 nop 0202 * ;IMMEDIATE ADDRESSING, load register with value 0203 e060 86 20 LDA #$20 0204 e062 8e f0 00 LDX #$f000 0205 e065 10 8e 02 00 ldy #CAT 0206 0207 * ;load efective address 0208 e069 30 0a leax 10,x ; add 10 to X 0209 e06b 30 89 01 f4 leax 500,x ; add 500 to x 0210 0211 * ;Add A reg to Y and store in Y 0212 e06f 31 a6 leay A,Y 0213 0214 * ;Add D reg to Y and store in Y 0215 e071 31 ab leay D,Y 0216 0217 0218 e073 33 56 leau -10,u ; add -10 to u 0219 e075 32 76 leas -10,s 0220 e077 32 6a leas 10,s 0221 e079 30 65 leax 5,s 0222 0223 e07b 86 20 lda #$20 0224 0225 ; try some auto increment 0226 ; ?? x seems to remain the same 0227 e07d a6 80 lda 0,x+ 0228 e07f a6 81 lda 0,x++ 0229 0230 e081 a6 80 lda 0,x+ 0231 e083 a6 81 lda 0,x++ 0232 0233 e085 a6 80 lda 0,x+ 0234 e087 a6 81 lda 0,x++ 0235 0236 0237 ; LOAD Efective Address Instructions 0238 ; try some auto increment 0239 ; ?? x seems to remain the same 0240 0241 ; Data Sheet explains: 0242 ; LEAa, b+ 0243 ; b -> temp 0244 ; b+1 -> b 0245 ; temp -> a 0246 ; 0247 0248 ; LEAa, -b 0249 ; b-1 -> temp 0250 ; b-1 -> b 0251 ; temp -> a 0252 ; 0253 0254 0255 0256 0257 e089 30 80 leax 0,x+ 0258 e08b 30 80 leax 0,x+ 0259 0260 e08d 31 a0 leay 0,y+ 0261 e08f 31 a0 leay 0,y+ 0262 0263 ; ?? x->y, then x=x+2 0264 e091 31 81 leay 0,x++ 0265 e093 31 81 leay 0,x++ 0266 0267 ; ?? y->x, then y=y+2 0268 e095 30 a1 leax 0,y++ 0269 e097 30 a1 leax 0,y++ 0270 0271 0272 0273 ; LEAa, -b 0274 ; b-1 -> temp 0275 ; b-1 -> b 0276 ; temp -> a 0277 ; 0278 0279 ; disassebled as leax ,x 0280 ; x- is illegal, only x+ allowed 0281 e099 30 80 leax 0,x+ ; disassebled as leax ,x 0282 e09b 30 82 leax 0,-x ; disassebled as leax ,x 0283 0284 e09d 31 a0 leay 0,y+ ; disassebled as leay ,y 0285 e09f 31 a2 leay 0,-y ; disassebled as leay ,y 0286 0287 e0a1 12 nop 0288 e0a2 12 nop 0289 0290 0291 ; LEAa, -b 0292 ; b-1 -> temp 0293 ; b-1 -> b 0294 ; temp -> a 0295 ; 0296 0297 ; disassebled as leax ,x 0298 ; x-- illegal 0299 0300 e0a3 30 83 leax 0,--x ; x decrememted 0301 e0a5 30 83 leax 0,--x ; 0302 0303 e0a7 31 a3 leay 0,--y ; 0304 e0a9 31 a3 leay 0,--y ; 0305 0306 0307 ; LOAD Efective Address Instructions 0308 ; try some auto increment 0309 ; ?? x seems to remain the same 0310 0311 ; Data Sheet explains: 0312 ; LEAa, b+ 0313 ; b -> temp 0314 ; b+1 -> b 0315 ; temp -> a 0316 ; 0317 0318 ; LEAa, -b 0319 ; b-1 -> temp 0320 ; b-1 -> b 0321 ; temp -> a 0322 ; 0323 0324 0325 ; 0326 0327 e0ab 31 83 leay 0,--x 0328 e0ad 31 83 leay 0,--x 0329 0330 e0af 30 a2 leax 0,-y 0331 e0b1 30 a2 leax 0,-y 0332 0333 0334 0335 0336 e0b3 31 81 leay 0,x++ 0337 e0b5 31 81 leay 0,x++ 0338 e0b7 31 81 leay 0,x++ 0339 e0b9 31 81 leay 0,x++ 0340 0341 0342 ; these do not seem to do anything 0343 e0bb 30 81 leax 0,x++ 0344 e0bd 30 81 leax 0,x++ 0345 e0bf 30 81 leax 0,x++ 0346 e0c1 30 81 leax 0,x++ 0347 * ;Load D which is A B as 16 bit 0348 0349 e0c3 be e0 d8 ldx MSG1 0350 e0c6 ec 91 ldd [,x++] 0351 e0c8 ec 91 ldd [,x++] 0352 e0ca ec 91 ldd [,x++] 0353 e0cc ec 91 ldd [,x++] 0354 0355 e0ce ec 93 ldd [,--x] 0356 e0d0 ec 93 ldd [,--x] 0357 e0d2 ec 93 ldd [,--x] 0358 e0d4 ec 93 ldd [,--x] 0359 0360 0361 e0d6 12 nop 0362 e0d7 39 rts 0363 0364 ************************************************* 0365 * sec 1.0 strings 0366 ************************************************* 0367 0368 e0d8 68 65 6c 6c 6f 20 MSG1 FCC 'hello doug' 64 6f 75 67 0369 0370 ************************************************* 0371 * sec 1.0 subroutines 0372 ************************************************* 0373 0374 SUB3 0375 0376 * TST - sets flag based 0377 0378 e0e2 86 ff lda #$0ff 0379 e0e4 4d tsta 0380 0381 e0e5 86 00 lda #$00 0382 e0e7 4d tsta 0383 0384 e0e8 86 01 lda #$01 0385 e0ea 4d tsta 0386 0387 e0eb 86 80 lda #$080 0388 e0ed 4d tsta 0389 0390 * compare 0391 0392 e0ee 86 ff lda #$0ff 0393 e0f0 81 00 cmpa #$00 0394 0395 e0f2 81 80 cmpa #$80 0396 0397 e0f4 81 01 cmpa #$01 0398 0399 e0f6 81 ff cmpa #$ff 0400 0401 * compare 0402 0403 e0f8 86 ff lda #$0ff 0404 e0fa 81 00 cmpa #$00 0405 0406 e0fc 81 80 cmpa #$80 0407 0408 e0fe 81 01 cmpa #$01 0409 0410 e100 81 ff cmpa #$ff 0411 0412 * compare 0413 0414 e102 86 ff lda #$0ff 0415 e104 81 00 cmpa #$00 0416 0417 e106 81 80 cmpa #$80 0418 0419 e108 81 01 cmpa #$01 0420 0421 e10a 81 ff cmpa #$ff 0422 0423 0424 e10c 39 rts 0425 0426 0427 ************************************************* 0428 * sec 1.0 subroutines 0429 ************************************************* 0430 0431 MSG4table 0432 e10d 41 FCB #'A' 0433 e10e e1 19 FDB MSG4str1 0434 e110 42 FCB #'B' 0435 e111 e1 27 FDB MSG4str2 0436 e113 61 FCB #'a' 0437 e114 e1 36 FDB MSG4str3 0438 e116 00 FCB #0 0439 e117 00 00 FDB 0 0440 0441 0442 MSG4str1 0443 0444 e119 3a 31 2d 68 65 6c FCC ":1-hello doug" 6c 6f 20 64 6f 75 67 0445 e126 00 FCB #0 0446 0447 MSG4str2 0448 e127 3a 32 2d 68 65 6c FCC ":2-hello henry" 6c 6f 20 68 65 6e 72 79 0449 e135 00 FCB #0 0450 0451 MSG4str3 0452 e136 3a 33 2d 68 65 6c FCC ":3-hello frank" 6c 6f 20 66 72 61 6e 6b 0453 e144 00 FCB #0 0454 0455 e145 00 FCB #0 0456 0457 * ************************************ 0458 * SUB4 look up A in table and return address of NULL terminated string 0459 * 0460 * 'a' 0461 * ADDRESSS 0462 * 'b' 0463 * ADDRESSS 0464 * 'c' 0465 * ADDRESSS 0466 * 'd' 0467 * ADDRESSS 0468 * 0 0469 * 0 0470 * 0471 * ************************************ 0472 0473 SUB4 0474 * lookup character intable and find address 0475 * LDA #'A' 0476 0477 * 0478 * Load x with a recognisable number 0479 * 0480 e146 8e 00 04 LDX #$0004 0481 e149 8e e1 0d LDX #MSG4table 0482 0483 SUB4loop 0484 * 0485 * LDB ,x 0486 * is next 0487 0488 e14c 6d 84 TST ,x 0489 e14e 27 15 beq SUB4notFound 0490 e150 a1 80 CMPA ,x+ 0491 e152 27 05 beq SUB4found 0492 0493 SUB4a 0494 * increment past address 0495 e154 a1 81 CMPA ,x++ 0496 e156 7e e1 4c jmp SUB4loop 0497 0498 SUB4found 0499 * load X with wanted address 0500 e159 30 94 LEAX [,x] 0501 0502 SUB4foundAndShow 0503 e15b a6 80 LDA ,x+ 0504 e15d 27 06 beq SUB4notFound 0505 e15f 12 nop 0506 e160 12 nop 0507 e161 12 nop 0508 e162 7e e1 5b JMP SUB4foundAndShow 0509 0510 0511 SUB4notFound 0512 e165 12 nop 0513 e166 12 nop 0514 0515 0516 e167 39 rts