// Tests that signed indexed subtract works as intended .pc = $801 "Basic" :BasicUpstart(main) .pc = $80d "Program" .label print_line_cursor = 7 .label print_char_cursor = 4 main: { ldy #0 __b1: tya ldx #$80 jsr sub tya ldx #$40 jsr sub tya ldx #$40 jsr sub iny cpy #9 bne __b1 jsr print_cls lda #<$400 sta.z print_line_cursor lda #>$400 sta.z print_line_cursor+1 lda #<$400 sta.z print_char_cursor lda #>$400 sta.z print_char_cursor+1 ldx #0 __b3: txa asl tay lda words,y sta.z print_sword.w lda words+1,y sta.z print_sword.w+1 jsr print_sword jsr print_ln inx cpx #9 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 } // Print a newline print_ln: { __b1: lda #$28 clc adc.z print_line_cursor sta.z print_line_cursor bcc !+ inc.z print_line_cursor+1 !: lda.z print_line_cursor+1 cmp.z print_char_cursor+1 bcc __b1 bne !+ lda.z print_line_cursor cmp.z print_char_cursor bcc __b1 !: rts } // Print a signed word as HEX // print_sword(signed word zeropage(2) w) print_sword: { .label w = 2 lda.z w+1 bmi __b1 lda #' ' jsr print_char __b2: jsr print_word rts __b1: lda #'-' jsr print_char sec lda #0 sbc.z w sta.z w lda #0 sbc.z w+1 sta.z w+1 jmp __b2 } // Print a single char // print_char(byte register(A) ch) print_char: { ldy #0 sta (print_char_cursor),y inc.z print_char_cursor bne !+ inc.z print_char_cursor+1 !: rts } // Print a word as HEX // print_word(word zeropage(2) w) print_word: { .label w = 2 lda.z w+1 sta.z print_byte.b jsr print_byte lda.z w sta.z print_byte.b jsr print_byte rts } // Print a byte as HEX // print_byte(byte zeropage(6) b) print_byte: { .label b = 6 lda.z b lsr lsr lsr lsr tay lda print_hextab,y jsr print_char lda #$f and.z b tay lda print_hextab,y jsr print_char rts } // Clear the screen. Also resets current line/char cursor. print_cls: { jsr memset rts } // Copies the character c (an unsigned char) to the first num characters of the object pointed to by the argument str. memset: { .const c = ' ' .const num = $3e8 .label str = $400 .label end = str+num .label dst = 7 lda #str sta.z dst+1 __b1: lda.z dst+1 cmp #>end bne __b2 lda.z dst cmp #