// Tests that signed indexed subtract works as intended // Commodore 64 PRG executable file .file [name="signed-indexed-subtract.prg", type="prg", segments="Program"] .segmentdef Program [segments="Basic, Code, Data"] .segmentdef Basic [start=$0801] .segmentdef Code [start=$80d] .segmentdef Data [startAfter="Code"] .segment Basic :BasicUpstart(main) .label print_screen = $400 .label print_line_cursor = 4 .label print_char_cursor = 2 .segment Code main: { .label j = 8 ldy #0 __b1: // sub(i, $80) tya ldx #$80 jsr sub // sub(i, $40) tya ldx #$40 jsr sub // sub(i, $40) tya ldx #$40 jsr sub // for(byte i: 0..8) iny cpy #9 bne __b1 // print_cls() jsr print_cls lda #print_screen sta.z print_line_cursor+1 lda #print_screen sta.z print_char_cursor+1 lda #0 sta.z j __b3: // print_sint(words[j]) lda.z j asl tay lda words,y sta.z print_sint.w lda words+1,y sta.z print_sint.w+1 jsr print_sint // print_ln() jsr print_ln // for(byte j: 0..8) inc.z j lda #9 cmp.z j bne __b9 // } rts __b9: lda.z print_line_cursor sta.z print_char_cursor lda.z print_line_cursor+1 sta.z print_char_cursor+1 jmp __b3 } // void sub(__register(A) char idx, __register(X) char s) sub: { // words[idx] -= s asl stx.z $ff tax lda words,x sec sbc.z $ff sta words,x bcs !+ dec words+1,x !: // } rts } // Clear the screen. Also resets current line/char cursor. print_cls: { // memset(print_screen, ' ', 1000) jsr memset // } rts } // Print a signed int as HEX // void print_sint(__zp(6) int w) print_sint: { .label w = 6 // if(w<0) lda.z w+1 bmi __b1 // print_char(' ') lda #' ' jsr print_char __b2: // print_uint((unsigned int)w) jsr print_uint // } rts __b1: // print_char('-') lda #'-' jsr print_char // w = -w lda #0 sec sbc.z w sta.z w lda #0 sbc.z w+1 sta.z w+1 jmp __b2 } // Print a newline print_ln: { __b1: // print_line_cursor + 0x28 lda #$28 clc adc.z print_line_cursor sta.z print_line_cursor bcc !+ inc.z print_line_cursor+1 !: // while (print_line_cursorstr sta.z dst+1 __b1: // for(char* dst = str; dst!=end; dst++) lda.z dst+1 cmp #>end bne __b2 lda.z dst cmp #>4 txa lsr lsr lsr lsr // print_char(print_hextab[b>>4]) tay lda print_hextab,y // Table of hexadecimal digits jsr print_char // b&0xf lda #$f axs #0 // print_char(print_hextab[b&0xf]) lda print_hextab,x jsr print_char // } rts } .segment Data print_hextab: .text "0123456789abcdef" words: .word -$6000, -$600, -$60, -6, 0, 6, $60, $600, $6000