2021-06-19 20:11:26 +00:00
|
|
|
/// @file
|
2021-06-19 19:26:05 +00:00
|
|
|
/// A lightweight library for printing on the C64.
|
2021-06-19 20:28:44 +00:00
|
|
|
///
|
2021-06-19 19:26:05 +00:00
|
|
|
/// Printing with this library is done by calling print_ function for each element
|
2020-12-21 07:57:41 +00:00
|
|
|
// Commodore 64 PRG executable file
|
|
|
|
.file [name="test-lowhigh.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
|
2018-02-15 18:50:33 +00:00
|
|
|
:BasicUpstart(main)
|
2020-06-27 18:32:09 +00:00
|
|
|
.label print_screen = $400
|
2021-09-23 06:24:56 +00:00
|
|
|
.label print_line_cursor = 6
|
|
|
|
.label print_char_cursor = 2
|
|
|
|
.label print_char_cursor_1 = 6
|
|
|
|
.label print_line_cursor_1 = 4
|
2020-12-21 07:57:41 +00:00
|
|
|
.segment Code
|
2018-02-15 18:50:33 +00:00
|
|
|
main: {
|
2021-09-23 06:24:56 +00:00
|
|
|
.label __3 = 8
|
|
|
|
.label __6 = 2
|
|
|
|
.label __28 = 8
|
|
|
|
.label __29 = 2
|
|
|
|
.label dw2 = $a
|
|
|
|
.label dw = $e
|
2020-02-23 08:44:36 +00:00
|
|
|
// print_cls()
|
2018-02-15 18:50:33 +00:00
|
|
|
jsr print_cls
|
2020-06-27 18:32:09 +00:00
|
|
|
lda #<print_screen
|
2019-10-19 23:43:51 +00:00
|
|
|
sta.z print_char_cursor_1
|
2020-06-27 18:32:09 +00:00
|
|
|
lda #>print_screen
|
2019-10-19 23:43:51 +00:00
|
|
|
sta.z print_char_cursor_1+1
|
2020-06-27 18:32:09 +00:00
|
|
|
lda #<print_screen
|
2019-10-19 23:43:51 +00:00
|
|
|
sta.z print_line_cursor_1
|
2020-06-27 18:32:09 +00:00
|
|
|
lda #>print_screen
|
2019-10-19 23:43:51 +00:00
|
|
|
sta.z print_line_cursor_1+1
|
2018-02-15 18:50:33 +00:00
|
|
|
lda #<$12345678
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z dw
|
2018-02-15 18:50:33 +00:00
|
|
|
lda #>$12345678
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z dw+1
|
2018-02-15 18:50:33 +00:00
|
|
|
lda #<$12345678>>$10
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z dw+2
|
2018-02-15 18:50:33 +00:00
|
|
|
lda #>$12345678>>$10
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z dw+3
|
2019-09-29 21:13:37 +00:00
|
|
|
__b1:
|
2020-02-23 08:44:36 +00:00
|
|
|
// for( dword dw = $12345678; dw != $12345690; dw++ )
|
2019-08-25 20:21:56 +00:00
|
|
|
lda.z dw+3
|
|
|
|
cmp #>$12345690>>$10
|
2019-09-29 21:13:37 +00:00
|
|
|
bne __b2
|
2019-08-25 20:21:56 +00:00
|
|
|
lda.z dw+2
|
|
|
|
cmp #<$12345690>>$10
|
2019-09-29 21:13:37 +00:00
|
|
|
bne __b2
|
2019-08-25 20:21:56 +00:00
|
|
|
lda.z dw+1
|
|
|
|
cmp #>$12345690
|
2019-09-29 21:13:37 +00:00
|
|
|
bne __b2
|
2019-08-25 20:21:56 +00:00
|
|
|
lda.z dw
|
|
|
|
cmp #<$12345690
|
2019-09-29 21:13:37 +00:00
|
|
|
bne __b2
|
2020-02-23 08:44:36 +00:00
|
|
|
// }
|
2019-08-25 20:21:56 +00:00
|
|
|
rts
|
2019-09-29 21:13:37 +00:00
|
|
|
__b2:
|
2021-06-11 19:41:01 +00:00
|
|
|
// WORD1(dw)
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z dw+2
|
2019-09-29 21:13:37 +00:00
|
|
|
sta.z __3
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z dw+3
|
2019-09-29 21:13:37 +00:00
|
|
|
sta.z __3+1
|
2021-06-11 19:41:01 +00:00
|
|
|
// WORD1(dw2) = WORD1(dw) + $1111
|
|
|
|
lda.z __28
|
2021-06-29 22:58:50 +00:00
|
|
|
clc
|
2018-02-15 18:50:33 +00:00
|
|
|
adc #<$1111
|
2021-06-11 19:41:01 +00:00
|
|
|
sta.z __28
|
|
|
|
lda.z __28+1
|
2018-02-15 18:50:33 +00:00
|
|
|
adc #>$1111
|
2021-06-11 19:41:01 +00:00
|
|
|
sta.z __28+1
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z dw
|
|
|
|
sta.z dw2
|
|
|
|
lda.z dw+1
|
|
|
|
sta.z dw2+1
|
2021-06-11 19:41:01 +00:00
|
|
|
lda.z __28
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z dw2+2
|
2021-06-11 19:41:01 +00:00
|
|
|
lda.z __28+1
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z dw2+3
|
2021-06-11 19:41:01 +00:00
|
|
|
// WORD0(dw)
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z dw
|
2019-09-29 21:13:37 +00:00
|
|
|
sta.z __6
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z dw+1
|
2019-09-29 21:13:37 +00:00
|
|
|
sta.z __6+1
|
2021-06-11 19:41:01 +00:00
|
|
|
// WORD0(dw2) = WORD0(dw) + $1111
|
|
|
|
lda.z __29
|
2021-06-29 22:58:50 +00:00
|
|
|
clc
|
2018-02-15 18:50:33 +00:00
|
|
|
adc #<$1111
|
2021-06-11 19:41:01 +00:00
|
|
|
sta.z __29
|
|
|
|
lda.z __29+1
|
2018-02-15 18:50:33 +00:00
|
|
|
adc #>$1111
|
2021-06-11 19:41:01 +00:00
|
|
|
sta.z __29+1
|
|
|
|
lda.z __29
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z dw2
|
2021-06-11 19:41:01 +00:00
|
|
|
lda.z __29+1
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z dw2+1
|
2020-04-13 18:00:13 +00:00
|
|
|
// print_ulong(dw2)
|
2020-03-07 21:38:40 +00:00
|
|
|
// Test set/get low word of dword
|
2020-04-13 18:00:13 +00:00
|
|
|
jsr print_ulong
|
2020-02-23 08:44:36 +00:00
|
|
|
// print_char(' ')
|
2018-02-15 18:50:33 +00:00
|
|
|
lda #' '
|
|
|
|
jsr print_char
|
2021-06-11 19:41:01 +00:00
|
|
|
// print_uint(WORD1(dw2))
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z dw2+2
|
2020-04-13 18:00:13 +00:00
|
|
|
sta.z print_uint.w
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z dw2+3
|
2020-04-13 18:00:13 +00:00
|
|
|
sta.z print_uint.w+1
|
|
|
|
jsr print_uint
|
2020-02-23 08:44:36 +00:00
|
|
|
// print_char(' ')
|
2020-03-07 21:38:40 +00:00
|
|
|
// Test get high word of dword
|
2018-02-15 18:50:33 +00:00
|
|
|
lda #' '
|
|
|
|
jsr print_char
|
2021-06-11 19:41:01 +00:00
|
|
|
// print_uint(WORD0(dw2))
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z dw2
|
2020-04-13 18:00:13 +00:00
|
|
|
sta.z print_uint.w
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z dw2+1
|
2020-04-13 18:00:13 +00:00
|
|
|
sta.z print_uint.w+1
|
|
|
|
jsr print_uint
|
2020-02-23 08:44:36 +00:00
|
|
|
// print_char(' ')
|
2020-03-07 21:38:40 +00:00
|
|
|
// Test get low word of dword
|
2018-02-15 18:50:33 +00:00
|
|
|
lda #' '
|
|
|
|
jsr print_char
|
2021-06-11 19:41:01 +00:00
|
|
|
// print_uchar(BYTE3(dw2))
|
|
|
|
ldx.z dw2+3
|
2020-04-13 18:06:30 +00:00
|
|
|
jsr print_uchar
|
2020-02-23 08:44:36 +00:00
|
|
|
// print_char(' ')
|
2020-03-07 21:38:40 +00:00
|
|
|
// Test get high high byte of dword
|
2018-02-15 18:50:33 +00:00
|
|
|
lda #' '
|
|
|
|
jsr print_char
|
2021-06-11 19:41:01 +00:00
|
|
|
// print_uchar(BYTE2(dw2))
|
|
|
|
ldx.z dw2+2
|
2020-04-13 18:06:30 +00:00
|
|
|
jsr print_uchar
|
2020-02-23 08:44:36 +00:00
|
|
|
// print_char(' ')
|
2020-03-07 21:38:40 +00:00
|
|
|
// Test get low high byte of dword
|
2018-02-15 18:50:33 +00:00
|
|
|
lda #' '
|
|
|
|
jsr print_char
|
2021-06-11 19:41:01 +00:00
|
|
|
// print_uchar(BYTE1(dw2))
|
|
|
|
ldx.z dw2+1
|
2020-04-13 18:06:30 +00:00
|
|
|
jsr print_uchar
|
2020-02-23 08:44:36 +00:00
|
|
|
// print_char(' ')
|
2020-03-07 21:38:40 +00:00
|
|
|
// Test get high low byte of dword
|
2018-02-15 18:50:33 +00:00
|
|
|
lda #' '
|
|
|
|
jsr print_char
|
2021-06-11 19:41:01 +00:00
|
|
|
// print_uchar(BYTE0(dw2))
|
|
|
|
ldx.z dw2
|
2020-04-13 18:06:30 +00:00
|
|
|
jsr print_uchar
|
2020-02-23 08:44:36 +00:00
|
|
|
// print_ln()
|
2020-03-07 21:38:40 +00:00
|
|
|
// Test get low low byte of dword
|
2018-02-15 18:50:33 +00:00
|
|
|
jsr print_ln
|
2020-02-23 08:44:36 +00:00
|
|
|
// for( dword dw = $12345678; dw != $12345690; dw++ )
|
2019-08-07 19:00:19 +00:00
|
|
|
inc.z dw
|
2018-02-15 18:50:33 +00:00
|
|
|
bne !+
|
2019-08-07 19:00:19 +00:00
|
|
|
inc.z dw+1
|
2018-02-15 18:50:33 +00:00
|
|
|
bne !+
|
2019-08-07 19:00:19 +00:00
|
|
|
inc.z dw+2
|
2018-02-15 18:50:33 +00:00
|
|
|
bne !+
|
2019-08-07 19:00:19 +00:00
|
|
|
inc.z dw+3
|
2018-02-15 18:50:33 +00:00
|
|
|
!:
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z print_line_cursor
|
2019-10-19 23:43:51 +00:00
|
|
|
sta.z print_line_cursor_1
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z print_line_cursor+1
|
2019-10-19 23:43:51 +00:00
|
|
|
sta.z print_line_cursor_1+1
|
2019-09-29 21:13:37 +00:00
|
|
|
jmp __b1
|
2018-02-15 18:50:33 +00:00
|
|
|
}
|
2020-06-27 21:26:57 +00:00
|
|
|
// Clear the screen. Also resets current line/char cursor.
|
|
|
|
print_cls: {
|
|
|
|
// memset(print_screen, ' ', 1000)
|
|
|
|
jsr memset
|
2020-02-23 08:44:36 +00:00
|
|
|
// }
|
2018-02-15 18:50:33 +00:00
|
|
|
rts
|
|
|
|
}
|
2020-06-27 21:26:57 +00:00
|
|
|
// Print a unsigned long as HEX
|
2021-09-23 06:24:56 +00:00
|
|
|
// void print_ulong(__zp($a) unsigned long dw)
|
2020-06-27 21:26:57 +00:00
|
|
|
print_ulong: {
|
2021-09-23 06:24:56 +00:00
|
|
|
.label dw = $a
|
2021-06-12 18:57:35 +00:00
|
|
|
// print_uint(WORD1(dw))
|
2020-06-27 21:26:57 +00:00
|
|
|
lda.z dw+2
|
|
|
|
sta.z print_uint.w
|
|
|
|
lda.z dw+3
|
|
|
|
sta.z print_uint.w+1
|
|
|
|
lda.z print_char_cursor_1
|
|
|
|
sta.z print_char_cursor
|
|
|
|
lda.z print_char_cursor_1+1
|
|
|
|
sta.z print_char_cursor+1
|
2021-06-12 18:57:35 +00:00
|
|
|
// print_uint(WORD1(dw))
|
2020-06-27 21:26:57 +00:00
|
|
|
jsr print_uint
|
2021-06-12 18:57:35 +00:00
|
|
|
// print_uint(WORD0(dw))
|
2020-06-27 21:26:57 +00:00
|
|
|
lda.z dw
|
|
|
|
sta.z print_uint.w
|
|
|
|
lda.z dw+1
|
|
|
|
sta.z print_uint.w+1
|
|
|
|
jsr print_uint
|
2020-02-23 08:44:36 +00:00
|
|
|
// }
|
2018-02-15 18:50:33 +00:00
|
|
|
rts
|
|
|
|
}
|
2019-02-17 23:12:29 +00:00
|
|
|
// Print a single char
|
2021-08-10 15:48:55 +00:00
|
|
|
// void print_char(__register(A) char ch)
|
2018-02-15 18:50:33 +00:00
|
|
|
print_char: {
|
2020-02-23 08:44:36 +00:00
|
|
|
// *(print_char_cursor++) = ch
|
2018-02-15 18:50:33 +00:00
|
|
|
ldy #0
|
2018-03-25 21:40:38 +00:00
|
|
|
sta (print_char_cursor),y
|
2020-02-23 08:44:36 +00:00
|
|
|
// *(print_char_cursor++) = ch;
|
2019-08-07 19:00:19 +00:00
|
|
|
inc.z print_char_cursor
|
2018-02-15 18:50:33 +00:00
|
|
|
bne !+
|
2019-08-07 19:00:19 +00:00
|
|
|
inc.z print_char_cursor+1
|
2018-02-15 18:50:33 +00:00
|
|
|
!:
|
2020-02-23 08:44:36 +00:00
|
|
|
// }
|
2018-02-15 18:50:33 +00:00
|
|
|
rts
|
|
|
|
}
|
2020-04-13 18:00:13 +00:00
|
|
|
// Print a unsigned int as HEX
|
2021-09-23 06:24:56 +00:00
|
|
|
// void print_uint(__zp(8) unsigned int w)
|
2020-04-13 18:00:13 +00:00
|
|
|
print_uint: {
|
2021-09-23 06:24:56 +00:00
|
|
|
.label w = 8
|
2021-06-12 18:57:35 +00:00
|
|
|
// print_uchar(BYTE1(w))
|
2020-03-22 21:26:39 +00:00
|
|
|
ldx.z w+1
|
2020-04-13 18:06:30 +00:00
|
|
|
jsr print_uchar
|
2021-06-12 18:57:35 +00:00
|
|
|
// print_uchar(BYTE0(w))
|
2020-03-22 21:26:39 +00:00
|
|
|
ldx.z w
|
2020-04-13 18:06:30 +00:00
|
|
|
jsr print_uchar
|
2020-02-23 08:44:36 +00:00
|
|
|
// }
|
2018-02-15 18:50:33 +00:00
|
|
|
rts
|
|
|
|
}
|
2020-06-27 21:26:57 +00:00
|
|
|
// Print a char as HEX
|
2021-08-10 15:48:55 +00:00
|
|
|
// void print_uchar(__register(X) char b)
|
2020-06-27 21:26:57 +00:00
|
|
|
print_uchar: {
|
|
|
|
// b>>4
|
|
|
|
txa
|
|
|
|
lsr
|
|
|
|
lsr
|
|
|
|
lsr
|
|
|
|
lsr
|
|
|
|
// print_char(print_hextab[b>>4])
|
|
|
|
tay
|
|
|
|
lda print_hextab,y
|
|
|
|
// Table of hexadecimal digits
|
|
|
|
jsr print_char
|
2024-01-02 18:45:16 +00:00
|
|
|
// b&0xf
|
2020-06-27 21:26:57 +00:00
|
|
|
lda #$f
|
|
|
|
axs #0
|
2024-01-02 18:45:16 +00:00
|
|
|
// print_char(print_hextab[b&0xf])
|
2020-06-27 21:26:57 +00:00
|
|
|
lda print_hextab,x
|
|
|
|
jsr print_char
|
2020-02-23 08:44:36 +00:00
|
|
|
// }
|
2018-02-15 18:50:33 +00:00
|
|
|
rts
|
|
|
|
}
|
2020-06-27 21:26:57 +00:00
|
|
|
// Print a newline
|
|
|
|
print_ln: {
|
|
|
|
__b1:
|
2024-01-02 18:45:16 +00:00
|
|
|
// print_line_cursor + 0x28
|
2020-06-27 21:26:57 +00:00
|
|
|
lda #$28
|
|
|
|
clc
|
|
|
|
adc.z print_line_cursor_1
|
|
|
|
sta.z print_line_cursor
|
|
|
|
lda #0
|
|
|
|
adc.z print_line_cursor_1+1
|
|
|
|
sta.z print_line_cursor+1
|
|
|
|
// while (print_line_cursor<print_char_cursor)
|
|
|
|
cmp.z print_char_cursor+1
|
|
|
|
bcc __b2
|
|
|
|
bne !+
|
|
|
|
lda.z print_line_cursor
|
|
|
|
cmp.z print_char_cursor
|
|
|
|
bcc __b2
|
|
|
|
!:
|
2020-02-23 08:44:36 +00:00
|
|
|
// }
|
2019-07-17 23:54:16 +00:00
|
|
|
rts
|
2020-06-27 21:26:57 +00:00
|
|
|
__b2:
|
|
|
|
lda.z print_line_cursor
|
|
|
|
sta.z print_line_cursor_1
|
|
|
|
lda.z print_line_cursor+1
|
|
|
|
sta.z print_line_cursor_1+1
|
|
|
|
jmp __b1
|
2019-07-17 23:54:16 +00:00
|
|
|
}
|
|
|
|
// Copies the character c (an unsigned char) to the first num characters of the object pointed to by the argument str.
|
2021-08-10 15:48:55 +00:00
|
|
|
// void * memset(void *str, char c, unsigned int num)
|
2019-07-17 23:54:16 +00:00
|
|
|
memset: {
|
|
|
|
.const c = ' '
|
|
|
|
.const num = $3e8
|
2020-06-27 18:32:09 +00:00
|
|
|
.label str = print_screen
|
2019-07-17 23:54:16 +00:00
|
|
|
.label end = str+num
|
2021-09-23 06:24:56 +00:00
|
|
|
.label dst = 6
|
2019-07-17 23:54:16 +00:00
|
|
|
lda #<str
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z dst
|
2019-07-17 23:54:16 +00:00
|
|
|
lda #>str
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z dst+1
|
2019-09-29 21:13:37 +00:00
|
|
|
__b1:
|
2020-02-23 08:44:36 +00:00
|
|
|
// for(char* dst = str; dst!=end; dst++)
|
2019-08-25 20:21:56 +00:00
|
|
|
lda.z dst+1
|
|
|
|
cmp #>end
|
2019-09-29 21:13:37 +00:00
|
|
|
bne __b2
|
2019-08-25 20:21:56 +00:00
|
|
|
lda.z dst
|
|
|
|
cmp #<end
|
2019-09-29 21:13:37 +00:00
|
|
|
bne __b2
|
2020-02-23 08:44:36 +00:00
|
|
|
// }
|
2019-08-25 20:21:56 +00:00
|
|
|
rts
|
2019-09-29 21:13:37 +00:00
|
|
|
__b2:
|
2020-02-23 08:44:36 +00:00
|
|
|
// *dst = c
|
2019-07-17 23:54:16 +00:00
|
|
|
lda #c
|
2018-02-15 18:50:33 +00:00
|
|
|
ldy #0
|
2019-07-17 23:54:16 +00:00
|
|
|
sta (dst),y
|
2020-02-23 08:44:36 +00:00
|
|
|
// for(char* dst = str; dst!=end; dst++)
|
2019-08-07 19:00:19 +00:00
|
|
|
inc.z dst
|
2018-02-15 18:50:33 +00:00
|
|
|
bne !+
|
2019-08-07 19:00:19 +00:00
|
|
|
inc.z dst+1
|
2018-02-15 18:50:33 +00:00
|
|
|
!:
|
2019-09-29 21:13:37 +00:00
|
|
|
jmp __b1
|
2018-02-15 18:50:33 +00:00
|
|
|
}
|
2020-12-21 07:57:41 +00:00
|
|
|
.segment Data
|
2018-04-02 22:02:25 +00:00
|
|
|
print_hextab: .text "0123456789abcdef"
|