mirror of
https://github.com/jonthomasson/retro1.git
synced 2024-06-01 22:41:44 +00:00
213 lines
9.8 KiB
Plaintext
213 lines
9.8 KiB
Plaintext
ca65 V2.15 - Git f7cdfbf
|
|
Main file : string.s65
|
|
Current file: string.s65
|
|
|
|
000000r 1 .setcpu "6502"
|
|
000000r 1 .include "macros.inc65"
|
|
000000r 2 ; Push A and X, destroys A
|
|
000000r 2 .macro phax
|
|
000000r 2 pha
|
|
000000r 2 txa
|
|
000000r 2 pha
|
|
000000r 2 .endmacro
|
|
000000r 2
|
|
000000r 2 ; Push A and Y, destroys A
|
|
000000r 2 .macro phay
|
|
000000r 2 pha
|
|
000000r 2 tya
|
|
000000r 2 pha
|
|
000000r 2 .endmacro
|
|
000000r 2
|
|
000000r 2 ; Push A, X and Y, destroys A
|
|
000000r 2 .macro phaxy
|
|
000000r 2 pha
|
|
000000r 2 txa
|
|
000000r 2 pha
|
|
000000r 2 tya
|
|
000000r 2 pha
|
|
000000r 2 .endmacro
|
|
000000r 2
|
|
000000r 2 ; Pull A and X
|
|
000000r 2 .macro plax
|
|
000000r 2 pla
|
|
000000r 2 tax
|
|
000000r 2 pla
|
|
000000r 2 .endmacro
|
|
000000r 2
|
|
000000r 2 ; Pull A and Y
|
|
000000r 2 .macro play
|
|
000000r 2 pla
|
|
000000r 2 tay
|
|
000000r 2 pla
|
|
000000r 2 .endmacro
|
|
000000r 2
|
|
000000r 2 ; Pull A, X and Y
|
|
000000r 2 .macro plaxy
|
|
000000r 2 pla
|
|
000000r 2 tay
|
|
000000r 2 pla
|
|
000000r 2 tax
|
|
000000r 2 pla
|
|
000000r 2 .endmacro
|
|
000000r 2
|
|
000000r 2 ; Load zero page register reg/reg+1 with the 16-bit value, destroys A
|
|
000000r 2 .macro ld16 reg, value
|
|
000000r 2 lda #<(value)
|
|
000000r 2 sta reg
|
|
000000r 2 lda #>(value)
|
|
000000r 2 sta reg + 1
|
|
000000r 2 .endmacro
|
|
000000r 2
|
|
000000r 1 .include "zeropage.inc65"
|
|
000000r 2 RES = $00
|
|
000000r 2 R0 = $02
|
|
000000r 2 R1 = $04
|
|
000000r 2 TMP0 = $06
|
|
000000r 2 TMP1 = $08
|
|
000000r 2
|
|
000000r 1
|
|
000000r 1 .export fmt_hex_char
|
|
000000r 1 .export fmt_bin_string
|
|
000000r 1 .export fmt_hex_string
|
|
000000r 1 .export scan_hex_char
|
|
000000r 1 .export scan_hex
|
|
000000r 1 .export scan_hex16
|
|
000000r 1
|
|
000000r 1 .code
|
|
000000r 1
|
|
000000r 1 ; Format the value of the accu as a binary string
|
|
000000r 1 ; The string is written into (R0)..(R0)+8 (9 bytes)
|
|
000000r 1 85 06 fmt_bin_string: sta TMP0
|
|
000002r 1 48 98 48 phay
|
|
000005r 1 A0 08 ldy #8
|
|
000007r 1 A9 00 lda #0
|
|
000009r 1 91 02 sta (R0),y
|
|
00000Br 1 88 dey
|
|
00000Cr 1 46 06 @next_bit: lsr TMP0
|
|
00000Er 1 B0 05 bcs @bit_is_1
|
|
000010r 1 A9 30 @bit_is_0: lda #'0'
|
|
000012r 1 4C rr rr jmp @store_char
|
|
000015r 1 A9 31 @bit_is_1: lda #'1'
|
|
000017r 1 91 02 @store_char: sta (R0),y
|
|
000019r 1 88 dey
|
|
00001Ar 1 10 F0 bpl @next_bit
|
|
00001Cr 1 68 A8 68 play
|
|
00001Fr 1 60 rts
|
|
000020r 1
|
|
000020r 1 ; Convert the 4-bit value of the accu into it's hex ascii character
|
|
000020r 1 ; The hex ascii character is returned in the accu
|
|
000020r 1 C9 0A fmt_hex_char: cmp #10
|
|
000022r 1 90 07 bcc @less_then_10
|
|
000024r 1 38 @greater_then_10: sec
|
|
000025r 1 E9 0A sbc #10
|
|
000027r 1 18 clc
|
|
000028r 1 69 41 adc #'A'
|
|
00002Ar 1 60 rts
|
|
00002Br 1 18 @less_then_10: clc
|
|
00002Cr 1 69 30 adc #'0'
|
|
00002Er 1 60 rts
|
|
00002Fr 1
|
|
00002Fr 1 ; Format the value of the accu as a hex string
|
|
00002Fr 1 ; The string is written into (R0)..(R0)+2 (3 bytes)
|
|
00002Fr 1 85 06 fmt_hex_string: sta TMP0
|
|
000031r 1 48 98 48 phay
|
|
000034r 1 A0 00 ldy #0
|
|
000036r 1 A5 06 lda TMP0
|
|
000038r 1 4A lsr
|
|
000039r 1 4A lsr
|
|
00003Ar 1 4A lsr
|
|
00003Br 1 4A lsr
|
|
00003Cr 1 20 rr rr jsr fmt_hex_char
|
|
00003Fr 1 91 02 sta (R0),y
|
|
000041r 1 C8 iny
|
|
000042r 1 A5 06 lda TMP0
|
|
000044r 1 29 0F and #$0f
|
|
000046r 1 20 rr rr jsr fmt_hex_char
|
|
000049r 1 91 02 sta (R0),y
|
|
00004Br 1 C8 iny
|
|
00004Cr 1 A9 00 lda #0
|
|
00004Er 1 91 02 sta (R0),y
|
|
000050r 1 68 A8 68 play
|
|
000053r 1 60 rts
|
|
000054r 1
|
|
000054r 1 ; Convert the hex character in the accu to its integer value
|
|
000054r 1 ; The integer value is returned in the accu
|
|
000054r 1 C9 30 scan_hex_char: cmp #'0'
|
|
000056r 1 90 20 bcc @invalid
|
|
000058r 1 C9 3A cmp #('9' + 1)
|
|
00005Ar 1 B0 04 bcs @no_digit
|
|
00005Cr 1 38 sec
|
|
00005Dr 1 E9 30 sbc #'0'
|
|
00005Fr 1 60 rts
|
|
000060r 1 C9 41 @no_digit: cmp #'A'
|
|
000062r 1 90 14 bcc @invalid
|
|
000064r 1 C9 47 cmp #('F' + 1)
|
|
000066r 1 B0 04 bcs @no_upper_hex
|
|
000068r 1 38 sec
|
|
000069r 1 E9 37 sbc #('A' - 10)
|
|
00006Br 1 60 rts
|
|
00006Cr 1 C9 61 @no_upper_hex: cmp #'a'
|
|
00006Er 1 90 08 bcc @invalid
|
|
000070r 1 C9 67 cmp #('f' + 1)
|
|
000072r 1 B0 04 bcs @invalid
|
|
000074r 1 38 sec
|
|
000075r 1 E9 57 sbc #('a' - 10)
|
|
000077r 1 60 rts
|
|
000078r 1 A9 00 @invalid: lda #0
|
|
00007Ar 1 60 rts
|
|
00007Br 1
|
|
00007Br 1 ; Convert two hex characters starting at (R0) into an integer value
|
|
00007Br 1 ; The integer value is returned in the accu
|
|
00007Br 1 98 scan_hex: tya
|
|
00007Cr 1 48 pha
|
|
00007Dr 1 A0 00 ldy #0
|
|
00007Fr 1 B1 02 lda (R0),y
|
|
000081r 1 20 rr rr jsr scan_hex_char
|
|
000084r 1 0A asl
|
|
000085r 1 0A asl
|
|
000086r 1 0A asl
|
|
000087r 1 0A asl
|
|
000088r 1 85 06 sta TMP0
|
|
00008Ar 1 C8 iny
|
|
00008Br 1 B1 02 lda (R0),y
|
|
00008Dr 1 20 rr rr jsr scan_hex_char
|
|
000090r 1 05 06 ora TMP0
|
|
000092r 1 85 06 sta TMP0
|
|
000094r 1 68 pla
|
|
000095r 1 A8 tay
|
|
000096r 1 A5 06 lda TMP0
|
|
000098r 1 60 rts
|
|
000099r 1
|
|
000099r 1 ; Convert four hex characters starting at (R0) into an integer value
|
|
000099r 1 ; The integer value is returned in RES..RES+1
|
|
000099r 1 48 98 48 scan_hex16: phay
|
|
00009Cr 1 A0 00 ldy #0
|
|
00009Er 1 B1 02 lda (R0),y
|
|
0000A0r 1 20 rr rr jsr scan_hex_char
|
|
0000A3r 1 0A asl
|
|
0000A4r 1 0A asl
|
|
0000A5r 1 0A asl
|
|
0000A6r 1 0A asl
|
|
0000A7r 1 85 01 sta RES + 1
|
|
0000A9r 1 C8 iny
|
|
0000AAr 1 B1 02 lda (R0),y
|
|
0000ACr 1 20 rr rr jsr scan_hex_char
|
|
0000AFr 1 05 01 ora RES + 1
|
|
0000B1r 1 85 01 sta RES + 1
|
|
0000B3r 1 C8 iny
|
|
0000B4r 1 B1 02 lda (R0),y
|
|
0000B6r 1 20 rr rr jsr scan_hex_char
|
|
0000B9r 1 0A asl
|
|
0000BAr 1 0A asl
|
|
0000BBr 1 0A asl
|
|
0000BCr 1 0A asl
|
|
0000BDr 1 85 00 sta RES
|
|
0000BFr 1 C8 iny
|
|
0000C0r 1 B1 02 lda (R0),y
|
|
0000C2r 1 20 rr rr jsr scan_hex_char
|
|
0000C5r 1 05 00 ora RES
|
|
0000C7r 1 85 00 sta RES
|
|
0000C9r 1 68 A8 68 play
|
|
0000CCr 1 60 rts
|
|
0000CCr 1
|