ca65 V2.13.2 - (C) Copyright 1998-2005 Ullrich von Bassewitz Main file : milltest.s Current file: milltest.s 000000r 1 ;; test 6502/6809 hybrid code 000000r 1 000000r 1 ;; apple iie vectors 000000r 1 000000r 1 cout = $FDED ; character out sub 000000r 1 prbyte = $FDDA ; print a hex byte 000000r 1 crout = $FD8E ; CR out sub 000000r 1 warm = $FF69 ; back to monitor 000000r 1 000000r 1 ;; my variables/vectors 000000r 1 000000r 1 org = $800 ; start here 000000r 1 ptr = $0 000000r 1 slot = $2 000000r 1 done = $3 000000r 1 millend = $BFFF ; 6809 $FFFF 000000r 1 base = $C080 000000r 1 000000r 1 ;; macros 000000r 1 000000r 1 .macro sprint arg, cr 000000r 1 .local str 000000r 1 .local skip 000000r 1 .if .match ({arg},"") 000000r 1 lda #str 000000r 1 jsr print 000000r 1 beq skip 000000r 1 str: .byte arg 000000r 1 .ifnblank cr 000000r 1 .byte cr 000000r 1 .endif 000000r 1 .byte $0 000000r 1 skip: 000000r 1 .else 000000r 1 lda #arg 000000r 1 jsr print 000000r 1 .ifnblank cr 000000r 1 jsr crout 000000r 1 .endif 000000r 1 .endif 000000r 1 .endmacro 000000r 1 000000r 1 000000r 1 .org org 000800 1 000800 1 ; check for mill 000800 1 20 7E 08 jsr gotmill ; got mill? 000803 1 B0 15 bcs :+ ; carry = mill, y = slot ($10 - $70) 000805 1 A9 0E A0 08 sprint "No MILL",$0D 000809 1 20 C8 08 F0 00080D 1 09 4E 6F 20 000811 1 4D 49 4C 4C 000815 1 0D 00 000817 1 4C 69 FF jmp warm ; game over 00081A 1 00081A 1 ; print info 00081A 1 84 02 : sty slot ; save slot ($10 - $70) 00081C 1 A9 25 A0 08 sprint "MILL in slot " ; display it 000820 1 20 C8 08 F0 000824 1 0E 4D 49 4C 000828 1 4C 20 69 6E 00082C 1 20 73 6C 6F 000830 1 74 20 00 000833 1 A5 02 lda slot 000835 1 4A lsr ; divide by 16 000836 1 4A lsr 000837 1 4A lsr 000838 1 4A lsr 000839 1 09 B0 ora #$B0 ; make it an ASCII number 00083B 1 20 ED FD jsr cout ; print it 00083E 1 20 8E FD jsr crout ; CR 000841 1 000841 1 ; zero out target address 000841 1 A9 00 lda #0 ; reset $8000 000843 1 8D 00 80 sta $8000 ; and 000846 1 20 DA FD jsr prbyte ; print it 000849 1 20 8E FD jsr crout 00084C 1 A9 00 lda #0 ; set done mailbox 00084E 1 85 03 sta done 000850 1 000850 1 20 9A 08 jsr domill ; dispatch "the mill" 000853 1 000853 1 A9 5C A0 08 : sprint "waiting for done",$0D 000857 1 20 C8 08 F0 00085B 1 12 77 61 69 00085F 1 74 69 6E 67 000863 1 20 66 6F 72 000867 1 20 64 6F 6E 00086B 1 65 0D 00 00086E 1 A5 03 lda done ; wait for done != 0 000870 1 F0 E1 beq :- 000872 1 000872 1 AD 00 80 lda $8000 ; print mill results 000875 1 20 DA FD jsr prbyte 000878 1 20 8E FD jsr crout 00087B 1 00087B 1 4C 69 FF jmp warm 00087E 1 00087E 1 ; check $C0[9-D,F][0,1,7] for #$C0, if a match, then got slot, 00087E 1 ; if not, well, no MILL, slot left in y 00087E 1 gotmill: 00087E 1 A0 00 ldy #$00 ; slot 0? 000880 1 98 : tya 000881 1 18 clc 000882 1 69 10 adc #$10 ; next card, #$10 - #$70 (1 - 7) 000884 1 30 13 bmi :+ ; if #$80, no card 000886 1 A8 tay 000887 1 A9 C0 lda #$C0 000889 1 D9 80 C0 cmp base,y 00088C 1 D0 F2 bne :- 00088E 1 D9 81 C0 cmp $C081,y 000891 1 D0 ED bne :- 000893 1 D9 87 C0 cmp $C087,y 000896 1 D0 E8 bne :- 000898 1 38 sec ; got mill 000899 1 60 : rts ; y with slot number (#$10-#$70) 00089A 1 00089A 1 domill: 00089A 1 A4 02 ldy slot ; get slot number ($10-$70) 00089C 1 A9 00 lda #0 00089E 1 99 81 C0 sta base+1,y ; halt mill 0008A1 1 99 82 C0 sta base+2,y ; reset mill 0008A4 1 99 86 C0 sta base+6,y ; do not map rom 0008A7 1 A9 80 lda #$80 0008A9 1 99 83 C0 sta base+3,y ; setup interupts 0008AC 1 99 84 C0 sta base+4,y 0008AF 1 99 85 C0 sta base+5,y 0008B2 1 99 87 C0 sta base+7,y ; set default address translation 0008B5 1 A9 C8 lda #>millcode ; high (big endian) 0008B7 1 8D FE BF sta millend-1 ; 6809 $FFFE 0008BA 1 A9 DB lda #