2019-02-17 23:12:29 +00:00
|
|
|
// Generates a 16-bit signed sinus
|
2018-03-05 00:00:33 +00:00
|
|
|
.pc = $801 "Basic"
|
|
|
|
:BasicUpstart(main)
|
|
|
|
.pc = $80d "Program"
|
2019-04-19 08:50:15 +00:00
|
|
|
.const SIZEOF_SIGNED_WORD = 2
|
2019-02-17 23:12:29 +00:00
|
|
|
// PI*2 in u[4.28] format
|
2018-03-05 00:00:33 +00:00
|
|
|
.const PI2_u4f28 = $6487ed51
|
2019-02-17 23:12:29 +00:00
|
|
|
// PI in u[4.28] format
|
2018-03-05 00:00:33 +00:00
|
|
|
.const PI_u4f28 = $3243f6a9
|
2019-02-17 23:12:29 +00:00
|
|
|
// PI/2 in u[4.28] format
|
2018-03-05 00:00:33 +00:00
|
|
|
.const PI_HALF_u4f28 = $1921fb54
|
2019-02-17 23:12:29 +00:00
|
|
|
// PI in u[4.12] format
|
2018-03-05 00:00:33 +00:00
|
|
|
.const PI_u4f12 = $3244
|
2019-02-17 23:12:29 +00:00
|
|
|
// PI/2 in u[4.12] format
|
2018-03-05 00:00:33 +00:00
|
|
|
.const PI_HALF_u4f12 = $1922
|
2018-03-25 21:40:38 +00:00
|
|
|
.label print_line_cursor = $400
|
2019-07-31 11:47:21 +00:00
|
|
|
.label rem16u = 6
|
|
|
|
.label print_char_cursor = $1f
|
2018-03-05 00:00:33 +00:00
|
|
|
main: {
|
|
|
|
.label wavelength = $78
|
2019-07-31 11:47:21 +00:00
|
|
|
.label sw = $1d
|
|
|
|
.label st1 = 6
|
|
|
|
.label st2 = $e
|
2018-03-05 00:00:33 +00:00
|
|
|
jsr sin16s_gen
|
|
|
|
jsr sin16s_genb
|
|
|
|
jsr print_cls
|
|
|
|
ldx #0
|
2018-03-25 21:40:38 +00:00
|
|
|
lda #<print_line_cursor
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z print_char_cursor
|
2018-03-25 21:40:38 +00:00
|
|
|
lda #>print_line_cursor
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z print_char_cursor+1
|
2018-03-05 00:00:33 +00:00
|
|
|
lda #<sintab2
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z st2
|
2018-03-05 00:00:33 +00:00
|
|
|
lda #>sintab2
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z st2+1
|
2018-03-05 00:00:33 +00:00
|
|
|
lda #<sintab1
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z st1
|
2018-03-05 00:00:33 +00:00
|
|
|
lda #>sintab1
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z st1+1
|
2018-03-05 00:00:33 +00:00
|
|
|
b1:
|
|
|
|
ldy #0
|
|
|
|
sec
|
|
|
|
lda (st1),y
|
|
|
|
sbc (st2),y
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z sw
|
2018-03-05 00:00:33 +00:00
|
|
|
iny
|
|
|
|
lda (st1),y
|
|
|
|
sbc (st2),y
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z sw+1
|
2018-03-05 00:00:33 +00:00
|
|
|
bmi b2
|
|
|
|
lda #<str1
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z print_str.str
|
2018-03-05 00:00:33 +00:00
|
|
|
lda #>str1
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z print_str.str+1
|
2018-03-05 00:00:33 +00:00
|
|
|
jsr print_str
|
|
|
|
b2:
|
|
|
|
jsr print_sword
|
|
|
|
lda #<str
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z print_str.str
|
2018-03-05 00:00:33 +00:00
|
|
|
lda #>str
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z print_str.str+1
|
2018-03-05 00:00:33 +00:00
|
|
|
jsr print_str
|
2019-04-19 08:50:15 +00:00
|
|
|
lda #SIZEOF_SIGNED_WORD
|
2018-03-05 00:00:33 +00:00
|
|
|
clc
|
2019-08-07 19:00:19 +00:00
|
|
|
adc.z st1
|
|
|
|
sta.z st1
|
2018-04-24 21:15:18 +00:00
|
|
|
bcc !+
|
2019-08-07 19:00:19 +00:00
|
|
|
inc.z st1+1
|
2018-04-24 21:15:18 +00:00
|
|
|
!:
|
2019-04-19 08:50:15 +00:00
|
|
|
lda #SIZEOF_SIGNED_WORD
|
2018-04-24 21:15:18 +00:00
|
|
|
clc
|
2019-08-07 19:00:19 +00:00
|
|
|
adc.z st2
|
|
|
|
sta.z st2
|
2018-04-24 21:15:18 +00:00
|
|
|
bcc !+
|
2019-08-07 19:00:19 +00:00
|
|
|
inc.z st2+1
|
2018-04-24 21:15:18 +00:00
|
|
|
!:
|
2018-03-05 00:00:33 +00:00
|
|
|
inx
|
|
|
|
cpx #$78
|
|
|
|
bne b1
|
|
|
|
rts
|
2019-08-07 17:36:19 +00:00
|
|
|
str: .text " "
|
|
|
|
.byte 0
|
|
|
|
str1: .text " "
|
|
|
|
.byte 0
|
2018-07-21 09:13:32 +00:00
|
|
|
sintab1: .fill 2*$78, 0
|
|
|
|
sintab2: .fill 2*$78, 0
|
2018-03-05 00:00:33 +00:00
|
|
|
}
|
2019-02-17 23:12:29 +00:00
|
|
|
// Print a zero-terminated string
|
2019-07-31 11:47:21 +00:00
|
|
|
// print_str(byte* zeropage($15) str)
|
2018-03-05 00:00:33 +00:00
|
|
|
print_str: {
|
2019-07-31 11:47:21 +00:00
|
|
|
.label str = $15
|
2018-03-05 00:00:33 +00:00
|
|
|
b1:
|
|
|
|
ldy #0
|
|
|
|
lda (str),y
|
2019-08-07 17:48:56 +00:00
|
|
|
cmp #0
|
2018-03-05 00:00:33 +00:00
|
|
|
bne b2
|
|
|
|
rts
|
|
|
|
b2:
|
|
|
|
ldy #0
|
|
|
|
lda (str),y
|
2018-03-25 21:40:38 +00:00
|
|
|
sta (print_char_cursor),y
|
2019-08-07 19:00:19 +00:00
|
|
|
inc.z print_char_cursor
|
2018-03-05 00:00:33 +00:00
|
|
|
bne !+
|
2019-08-07 19:00:19 +00:00
|
|
|
inc.z print_char_cursor+1
|
2018-03-05 00:00:33 +00:00
|
|
|
!:
|
2019-08-07 19:00:19 +00:00
|
|
|
inc.z str
|
2018-03-05 00:00:33 +00:00
|
|
|
bne !+
|
2019-08-07 19:00:19 +00:00
|
|
|
inc.z str+1
|
2018-03-05 00:00:33 +00:00
|
|
|
!:
|
|
|
|
jmp b1
|
|
|
|
}
|
2019-02-17 23:12:29 +00:00
|
|
|
// Print a signed word as HEX
|
2019-07-31 11:47:21 +00:00
|
|
|
// print_sword(signed word zeropage($1d) w)
|
2018-03-05 00:00:33 +00:00
|
|
|
print_sword: {
|
2019-07-31 11:47:21 +00:00
|
|
|
.label w = $1d
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z w+1
|
2019-06-30 13:30:08 +00:00
|
|
|
bmi b1
|
|
|
|
lda #' '
|
|
|
|
jsr print_char
|
|
|
|
b2:
|
|
|
|
jsr print_word
|
|
|
|
rts
|
|
|
|
b1:
|
2018-03-05 00:00:33 +00:00
|
|
|
lda #'-'
|
|
|
|
jsr print_char
|
|
|
|
sec
|
2019-06-21 20:12:04 +00:00
|
|
|
lda #0
|
2019-08-07 19:00:19 +00:00
|
|
|
sbc.z w
|
|
|
|
sta.z w
|
2019-06-21 20:12:04 +00:00
|
|
|
lda #0
|
2019-08-07 19:00:19 +00:00
|
|
|
sbc.z w+1
|
|
|
|
sta.z w+1
|
2019-06-30 13:30:08 +00:00
|
|
|
jmp b2
|
|
|
|
}
|
|
|
|
// Print a single char
|
|
|
|
// print_char(byte register(A) ch)
|
|
|
|
print_char: {
|
|
|
|
ldy #0
|
|
|
|
sta (print_char_cursor),y
|
2019-08-07 19:00:19 +00:00
|
|
|
inc.z print_char_cursor
|
2019-06-30 13:30:08 +00:00
|
|
|
bne !+
|
2019-08-07 19:00:19 +00:00
|
|
|
inc.z print_char_cursor+1
|
2019-06-30 13:30:08 +00:00
|
|
|
!:
|
2018-03-05 00:00:33 +00:00
|
|
|
rts
|
|
|
|
}
|
2019-02-17 23:12:29 +00:00
|
|
|
// Print a word as HEX
|
2019-07-31 11:47:21 +00:00
|
|
|
// print_word(word zeropage($1d) w)
|
2018-03-05 00:00:33 +00:00
|
|
|
print_word: {
|
2019-07-31 11:47:21 +00:00
|
|
|
.label w = $1d
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z w+1
|
|
|
|
sta.z print_byte.b
|
2018-03-05 00:00:33 +00:00
|
|
|
jsr print_byte
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z w
|
|
|
|
sta.z print_byte.b
|
2018-03-05 00:00:33 +00:00
|
|
|
jsr print_byte
|
|
|
|
rts
|
|
|
|
}
|
2019-02-17 23:12:29 +00:00
|
|
|
// Print a byte as HEX
|
2019-07-31 11:47:21 +00:00
|
|
|
// print_byte(byte zeropage($10) b)
|
2018-03-05 00:00:33 +00:00
|
|
|
print_byte: {
|
2019-07-31 11:47:21 +00:00
|
|
|
.label b = $10
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z b
|
2018-03-05 00:00:33 +00:00
|
|
|
lsr
|
|
|
|
lsr
|
|
|
|
lsr
|
|
|
|
lsr
|
|
|
|
tay
|
2018-04-02 22:02:25 +00:00
|
|
|
lda print_hextab,y
|
2018-03-05 00:00:33 +00:00
|
|
|
jsr print_char
|
|
|
|
lda #$f
|
2019-08-07 19:00:19 +00:00
|
|
|
and.z b
|
2018-03-05 00:00:33 +00:00
|
|
|
tay
|
2018-04-02 22:02:25 +00:00
|
|
|
lda print_hextab,y
|
2018-03-05 00:00:33 +00:00
|
|
|
jsr print_char
|
|
|
|
rts
|
|
|
|
}
|
2019-02-17 23:12:29 +00:00
|
|
|
// Clear the screen. Also resets current line/char cursor.
|
2018-03-05 00:00:33 +00:00
|
|
|
print_cls: {
|
2019-07-17 23:54:16 +00:00
|
|
|
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 = print_line_cursor
|
|
|
|
.label end = str+num
|
2019-07-31 11:47:21 +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-08-25 20:21:56 +00:00
|
|
|
b1:
|
|
|
|
lda.z dst+1
|
|
|
|
cmp #>end
|
|
|
|
bne b2
|
|
|
|
lda.z dst
|
|
|
|
cmp #<end
|
|
|
|
bne b2
|
|
|
|
rts
|
2019-08-07 09:27:55 +00:00
|
|
|
b2:
|
2019-07-17 23:54:16 +00:00
|
|
|
lda #c
|
2018-03-05 00:00:33 +00:00
|
|
|
ldy #0
|
2019-07-17 23:54:16 +00:00
|
|
|
sta (dst),y
|
2019-08-07 19:00:19 +00:00
|
|
|
inc.z dst
|
2018-03-05 00:00:33 +00:00
|
|
|
bne !+
|
2019-08-07 19:00:19 +00:00
|
|
|
inc.z dst+1
|
2018-03-05 00:00:33 +00:00
|
|
|
!:
|
2019-08-25 20:21:56 +00:00
|
|
|
jmp b1
|
2018-03-05 00:00:33 +00:00
|
|
|
}
|
2019-02-17 23:12:29 +00:00
|
|
|
// Generate signed (large) word sinus table - on the full -$7fff - $7fff range
|
|
|
|
// sintab - the table to generate into
|
|
|
|
// wavelength - the number of sinus points in a total sinus wavelength (the size of the table)
|
2019-08-07 09:27:55 +00:00
|
|
|
// sin16s_genb(signed word* zeropage($15) sintab)
|
2018-03-05 00:00:33 +00:00
|
|
|
sin16s_genb: {
|
2019-08-07 09:27:55 +00:00
|
|
|
.label _3 = $1f
|
2019-07-31 11:47:21 +00:00
|
|
|
.label step = $17
|
2019-08-07 09:27:55 +00:00
|
|
|
.label sintab = $15
|
2019-07-31 11:47:21 +00:00
|
|
|
.label x = $a
|
2019-08-07 09:27:55 +00:00
|
|
|
.label i = $e
|
2018-03-05 00:00:33 +00:00
|
|
|
jsr div32u16u
|
|
|
|
lda #<main.sintab2
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z sintab
|
2018-03-05 00:00:33 +00:00
|
|
|
lda #>main.sintab2
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z sintab+1
|
2019-05-18 21:58:04 +00:00
|
|
|
lda #0
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z x
|
|
|
|
sta.z x+1
|
|
|
|
sta.z x+2
|
|
|
|
sta.z x+3
|
|
|
|
sta.z i
|
|
|
|
sta.z i+1
|
2019-08-25 20:21:56 +00:00
|
|
|
// u[4.28]
|
|
|
|
b1:
|
|
|
|
lda.z i+1
|
|
|
|
cmp #>main.wavelength
|
|
|
|
bcc b2
|
|
|
|
bne !+
|
|
|
|
lda.z i
|
|
|
|
cmp #<main.wavelength
|
|
|
|
bcc b2
|
|
|
|
!:
|
|
|
|
rts
|
2019-08-07 09:27:55 +00:00
|
|
|
b2:
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z x+2
|
|
|
|
sta.z sin16sb.x
|
|
|
|
lda.z x+3
|
|
|
|
sta.z sin16sb.x+1
|
2018-03-05 00:00:33 +00:00
|
|
|
jsr sin16sb
|
|
|
|
ldy #0
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z _3
|
2018-03-05 00:00:33 +00:00
|
|
|
sta (sintab),y
|
|
|
|
iny
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z _3+1
|
2018-03-05 00:00:33 +00:00
|
|
|
sta (sintab),y
|
2019-04-19 08:50:15 +00:00
|
|
|
lda #SIZEOF_SIGNED_WORD
|
2018-04-24 21:15:18 +00:00
|
|
|
clc
|
2019-08-07 19:00:19 +00:00
|
|
|
adc.z sintab
|
|
|
|
sta.z sintab
|
2018-04-24 21:15:18 +00:00
|
|
|
bcc !+
|
2019-08-07 19:00:19 +00:00
|
|
|
inc.z sintab+1
|
2018-04-24 21:15:18 +00:00
|
|
|
!:
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z x
|
2018-03-05 00:00:33 +00:00
|
|
|
clc
|
2019-08-07 19:00:19 +00:00
|
|
|
adc.z step
|
|
|
|
sta.z x
|
|
|
|
lda.z x+1
|
|
|
|
adc.z step+1
|
|
|
|
sta.z x+1
|
|
|
|
lda.z x+2
|
|
|
|
adc.z step+2
|
|
|
|
sta.z x+2
|
|
|
|
lda.z x+3
|
|
|
|
adc.z step+3
|
|
|
|
sta.z x+3
|
|
|
|
inc.z i
|
2018-03-05 00:00:33 +00:00
|
|
|
bne !+
|
2019-08-07 19:00:19 +00:00
|
|
|
inc.z i+1
|
2018-03-05 00:00:33 +00:00
|
|
|
!:
|
2019-08-25 20:21:56 +00:00
|
|
|
jmp b1
|
2018-03-05 00:00:33 +00:00
|
|
|
}
|
2019-02-17 23:12:29 +00:00
|
|
|
// Calculate signed word sinus sin(x)
|
|
|
|
// x: unsigned dword input u[4.28] in the interval $00000000 - PI2_u4f28
|
|
|
|
// result: signed word sin(x) s[0.15] - using the full range -$7fff - $7fff
|
2019-07-31 11:47:21 +00:00
|
|
|
// sin16sb(word zeropage($1d) x)
|
2018-03-05 00:00:33 +00:00
|
|
|
sin16sb: {
|
2019-07-31 11:47:21 +00:00
|
|
|
.label x = $1d
|
|
|
|
.label return = $1f
|
|
|
|
.label x1 = $1d
|
|
|
|
.label x2 = 6
|
|
|
|
.label x3 = 6
|
|
|
|
.label x3_6 = $1b
|
|
|
|
.label usinx = $1f
|
|
|
|
.label x4 = 6
|
|
|
|
.label x5 = $1b
|
|
|
|
.label x5_128 = $1b
|
|
|
|
.label sinx = $1f
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z x+1
|
2018-03-05 00:00:33 +00:00
|
|
|
cmp #>PI_u4f12
|
|
|
|
bcc b4
|
|
|
|
bne !+
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z x
|
2018-03-05 00:00:33 +00:00
|
|
|
cmp #<PI_u4f12
|
|
|
|
bcc b4
|
|
|
|
!:
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z x
|
2018-03-05 00:00:33 +00:00
|
|
|
sec
|
|
|
|
sbc #<PI_u4f12
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z x
|
|
|
|
lda.z x+1
|
2018-03-05 00:00:33 +00:00
|
|
|
sbc #>PI_u4f12
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z x+1
|
2019-06-21 22:25:28 +00:00
|
|
|
ldy #1
|
2018-03-05 00:00:33 +00:00
|
|
|
jmp b1
|
|
|
|
b4:
|
2019-06-21 22:25:28 +00:00
|
|
|
ldy #0
|
2018-03-05 00:00:33 +00:00
|
|
|
b1:
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z x+1
|
2018-03-05 00:00:33 +00:00
|
|
|
cmp #>PI_HALF_u4f12
|
|
|
|
bcc b2
|
|
|
|
bne !+
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z x
|
2018-03-05 00:00:33 +00:00
|
|
|
cmp #<PI_HALF_u4f12
|
|
|
|
bcc b2
|
|
|
|
!:
|
|
|
|
sec
|
|
|
|
lda #<PI_u4f12
|
2019-08-07 19:00:19 +00:00
|
|
|
sbc.z x
|
|
|
|
sta.z x
|
2018-03-05 00:00:33 +00:00
|
|
|
lda #>PI_u4f12
|
2019-08-07 19:00:19 +00:00
|
|
|
sbc.z x+1
|
|
|
|
sta.z x+1
|
2018-03-05 00:00:33 +00:00
|
|
|
b2:
|
2019-08-07 19:00:19 +00:00
|
|
|
asl.z x1
|
|
|
|
rol.z x1+1
|
|
|
|
asl.z x1
|
|
|
|
rol.z x1+1
|
|
|
|
asl.z x1
|
|
|
|
rol.z x1+1
|
|
|
|
lda.z x1
|
|
|
|
sta.z mulu16_sel.v1
|
|
|
|
lda.z x1+1
|
|
|
|
sta.z mulu16_sel.v1+1
|
|
|
|
lda.z x1
|
|
|
|
sta.z mulu16_sel.v2
|
|
|
|
lda.z x1+1
|
|
|
|
sta.z mulu16_sel.v2+1
|
2018-03-05 00:00:33 +00:00
|
|
|
ldx #0
|
|
|
|
jsr mulu16_sel
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z mulu16_sel.return_18
|
|
|
|
sta.z x2
|
|
|
|
lda.z mulu16_sel.return_18+1
|
|
|
|
sta.z x2+1
|
|
|
|
lda.z x1
|
|
|
|
sta.z mulu16_sel.v2
|
|
|
|
lda.z x1+1
|
|
|
|
sta.z mulu16_sel.v2+1
|
2018-03-05 00:00:33 +00:00
|
|
|
ldx #1
|
|
|
|
jsr mulu16_sel
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z mulu16_sel.return_17
|
|
|
|
sta.z mulu16_sel.return
|
|
|
|
lda.z mulu16_sel.return_17+1
|
|
|
|
sta.z mulu16_sel.return+1
|
2018-03-05 00:00:33 +00:00
|
|
|
ldx #1
|
|
|
|
lda #<$10000/6
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z mulu16_sel.v2
|
2018-03-05 00:00:33 +00:00
|
|
|
lda #>$10000/6
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z mulu16_sel.v2+1
|
2018-03-05 00:00:33 +00:00
|
|
|
jsr mulu16_sel
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z x1
|
2018-03-05 00:00:33 +00:00
|
|
|
sec
|
2019-08-07 19:00:19 +00:00
|
|
|
sbc.z x3_6
|
|
|
|
sta.z usinx
|
|
|
|
lda.z x1+1
|
|
|
|
sbc.z x3_6+1
|
|
|
|
sta.z usinx+1
|
|
|
|
lda.z x1
|
|
|
|
sta.z mulu16_sel.v2
|
|
|
|
lda.z x1+1
|
|
|
|
sta.z mulu16_sel.v2+1
|
2018-03-05 00:00:33 +00:00
|
|
|
ldx #0
|
|
|
|
jsr mulu16_sel
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z mulu16_sel.return_17
|
|
|
|
sta.z mulu16_sel.return
|
|
|
|
lda.z mulu16_sel.return_17+1
|
|
|
|
sta.z mulu16_sel.return+1
|
|
|
|
lda.z x1
|
|
|
|
sta.z mulu16_sel.v2
|
|
|
|
lda.z x1+1
|
|
|
|
sta.z mulu16_sel.v2+1
|
2018-03-05 00:00:33 +00:00
|
|
|
ldx #0
|
|
|
|
jsr mulu16_sel
|
2019-08-07 19:00:19 +00:00
|
|
|
lsr.z x5_128+1
|
|
|
|
ror.z x5_128
|
|
|
|
lsr.z x5_128+1
|
|
|
|
ror.z x5_128
|
|
|
|
lsr.z x5_128+1
|
|
|
|
ror.z x5_128
|
|
|
|
lsr.z x5_128+1
|
|
|
|
ror.z x5_128
|
|
|
|
lda.z usinx
|
2018-03-05 00:00:33 +00:00
|
|
|
clc
|
2019-08-07 19:00:19 +00:00
|
|
|
adc.z x5_128
|
|
|
|
sta.z usinx
|
|
|
|
lda.z usinx+1
|
|
|
|
adc.z x5_128+1
|
|
|
|
sta.z usinx+1
|
2019-06-21 22:25:28 +00:00
|
|
|
cpy #0
|
2018-03-05 00:00:33 +00:00
|
|
|
beq b3
|
|
|
|
sec
|
2019-06-21 20:12:04 +00:00
|
|
|
lda #0
|
2019-08-07 19:00:19 +00:00
|
|
|
sbc.z sinx
|
|
|
|
sta.z sinx
|
2019-06-21 20:12:04 +00:00
|
|
|
lda #0
|
2019-08-07 19:00:19 +00:00
|
|
|
sbc.z sinx+1
|
|
|
|
sta.z sinx+1
|
2018-03-05 00:00:33 +00:00
|
|
|
b3:
|
|
|
|
rts
|
|
|
|
}
|
2019-02-17 23:12:29 +00:00
|
|
|
// Calculate val*val for two unsigned word values - the result is 16 selected bits of the 32-bit result.
|
|
|
|
// The select parameter indicates how many of the highest bits of the 32-bit result to skip
|
2019-07-31 11:47:21 +00:00
|
|
|
// mulu16_sel(word zeropage(6) v1, word zeropage(8) v2, byte register(X) select)
|
2018-03-05 00:00:33 +00:00
|
|
|
mulu16_sel: {
|
2019-07-31 11:47:21 +00:00
|
|
|
.label _0 = $11
|
|
|
|
.label _1 = $11
|
|
|
|
.label v1 = 6
|
|
|
|
.label v2 = 8
|
|
|
|
.label return = 6
|
|
|
|
.label return_11 = $1b
|
|
|
|
.label return_14 = $1b
|
|
|
|
.label return_16 = $1b
|
|
|
|
.label return_17 = $1b
|
|
|
|
.label return_18 = $1b
|
|
|
|
.label return_20 = $1b
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z v1
|
|
|
|
sta.z mul16u.a
|
|
|
|
lda.z v1+1
|
|
|
|
sta.z mul16u.a+1
|
2018-03-05 00:00:33 +00:00
|
|
|
jsr mul16u
|
|
|
|
cpx #0
|
|
|
|
beq !e+
|
|
|
|
!:
|
2019-08-07 19:00:19 +00:00
|
|
|
asl.z _1
|
|
|
|
rol.z _1+1
|
|
|
|
rol.z _1+2
|
|
|
|
rol.z _1+3
|
2018-03-05 00:00:33 +00:00
|
|
|
dex
|
|
|
|
bne !-
|
|
|
|
!e:
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z _1+2
|
|
|
|
sta.z return_17
|
|
|
|
lda.z _1+3
|
|
|
|
sta.z return_17+1
|
2018-03-05 00:00:33 +00:00
|
|
|
rts
|
|
|
|
}
|
2019-02-17 23:12:29 +00:00
|
|
|
// Perform binary multiplication of two unsigned 16-bit words into a 32-bit unsigned double word
|
2019-07-31 11:47:21 +00:00
|
|
|
// mul16u(word zeropage($1b) a, word zeropage(8) b)
|
2018-03-05 00:00:33 +00:00
|
|
|
mul16u: {
|
2019-07-31 11:47:21 +00:00
|
|
|
.label a = $1b
|
|
|
|
.label mb = 2
|
|
|
|
.label res = $11
|
|
|
|
.label b = 8
|
|
|
|
.label return = $11
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z b
|
|
|
|
sta.z mb
|
|
|
|
lda.z b+1
|
|
|
|
sta.z mb+1
|
2018-03-05 00:00:33 +00:00
|
|
|
lda #0
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z mb+2
|
|
|
|
sta.z mb+3
|
|
|
|
sta.z res
|
|
|
|
sta.z res+1
|
|
|
|
sta.z res+2
|
|
|
|
sta.z res+3
|
2018-03-05 00:00:33 +00:00
|
|
|
b1:
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z a
|
2018-03-05 00:00:33 +00:00
|
|
|
bne b2
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z a+1
|
2018-03-05 00:00:33 +00:00
|
|
|
bne b2
|
|
|
|
rts
|
|
|
|
b2:
|
2019-08-21 23:51:32 +00:00
|
|
|
lda #1
|
|
|
|
and.z a
|
2018-03-05 00:00:33 +00:00
|
|
|
cmp #0
|
2019-03-31 15:57:54 +00:00
|
|
|
beq b3
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z res
|
2018-03-05 00:00:33 +00:00
|
|
|
clc
|
2019-08-07 19:00:19 +00:00
|
|
|
adc.z mb
|
|
|
|
sta.z res
|
|
|
|
lda.z res+1
|
|
|
|
adc.z mb+1
|
|
|
|
sta.z res+1
|
|
|
|
lda.z res+2
|
|
|
|
adc.z mb+2
|
|
|
|
sta.z res+2
|
|
|
|
lda.z res+3
|
|
|
|
adc.z mb+3
|
|
|
|
sta.z res+3
|
2019-03-31 15:57:54 +00:00
|
|
|
b3:
|
2019-08-07 19:00:19 +00:00
|
|
|
lsr.z a+1
|
|
|
|
ror.z a
|
|
|
|
asl.z mb
|
|
|
|
rol.z mb+1
|
|
|
|
rol.z mb+2
|
|
|
|
rol.z mb+3
|
2018-03-05 00:00:33 +00:00
|
|
|
jmp b1
|
|
|
|
}
|
2019-02-17 23:12:29 +00:00
|
|
|
// Divide unsigned 32-bit dword dividend with a 16-bit word divisor
|
|
|
|
// The 16-bit word remainder can be found in rem16u after the division
|
2018-03-05 00:00:33 +00:00
|
|
|
div32u16u: {
|
2019-07-31 11:47:21 +00:00
|
|
|
.label quotient_hi = $1d
|
|
|
|
.label quotient_lo = $1b
|
|
|
|
.label return = $17
|
2018-04-24 23:11:28 +00:00
|
|
|
lda #<PI2_u4f28>>$10
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z divr16u.dividend
|
2018-04-24 23:11:28 +00:00
|
|
|
lda #>PI2_u4f28>>$10
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z divr16u.dividend+1
|
2019-07-10 18:54:35 +00:00
|
|
|
lda #<0
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z divr16u.rem
|
|
|
|
sta.z divr16u.rem+1
|
2018-03-05 00:00:33 +00:00
|
|
|
jsr divr16u
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z divr16u.return
|
|
|
|
sta.z quotient_hi
|
|
|
|
lda.z divr16u.return+1
|
|
|
|
sta.z quotient_hi+1
|
2018-04-24 23:11:28 +00:00
|
|
|
lda #<PI2_u4f28&$ffff
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z divr16u.dividend
|
2018-04-24 23:11:28 +00:00
|
|
|
lda #>PI2_u4f28&$ffff
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z divr16u.dividend+1
|
2018-03-05 00:00:33 +00:00
|
|
|
jsr divr16u
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z quotient_hi
|
|
|
|
sta.z return+2
|
|
|
|
lda.z quotient_hi+1
|
|
|
|
sta.z return+3
|
|
|
|
lda.z quotient_lo
|
|
|
|
sta.z return
|
|
|
|
lda.z quotient_lo+1
|
|
|
|
sta.z return+1
|
2018-03-05 00:00:33 +00:00
|
|
|
rts
|
|
|
|
}
|
2019-02-17 23:12:29 +00:00
|
|
|
// Performs division on two 16 bit unsigned words and an initial remainder
|
|
|
|
// Returns the quotient dividend/divisor.
|
|
|
|
// The final remainder will be set into the global variable rem16u
|
|
|
|
// Implemented using simple binary division
|
2019-07-31 11:47:21 +00:00
|
|
|
// divr16u(word zeropage(8) dividend, word zeropage(6) rem)
|
2018-03-05 00:00:33 +00:00
|
|
|
divr16u: {
|
2019-07-31 11:47:21 +00:00
|
|
|
.label rem = 6
|
|
|
|
.label dividend = 8
|
|
|
|
.label quotient = $1b
|
|
|
|
.label return = $1b
|
2018-03-05 00:00:33 +00:00
|
|
|
ldx #0
|
|
|
|
txa
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z quotient
|
|
|
|
sta.z quotient+1
|
2018-03-05 00:00:33 +00:00
|
|
|
b1:
|
2019-08-07 19:00:19 +00:00
|
|
|
asl.z rem
|
|
|
|
rol.z rem+1
|
|
|
|
lda.z dividend+1
|
2018-03-05 00:00:33 +00:00
|
|
|
and #$80
|
|
|
|
cmp #0
|
|
|
|
beq b2
|
|
|
|
lda #1
|
2019-08-07 19:00:19 +00:00
|
|
|
ora.z rem
|
|
|
|
sta.z rem
|
2018-03-05 00:00:33 +00:00
|
|
|
b2:
|
2019-08-07 19:00:19 +00:00
|
|
|
asl.z dividend
|
|
|
|
rol.z dividend+1
|
|
|
|
asl.z quotient
|
|
|
|
rol.z quotient+1
|
|
|
|
lda.z rem+1
|
2018-04-24 23:11:28 +00:00
|
|
|
cmp #>main.wavelength
|
2018-03-05 00:00:33 +00:00
|
|
|
bcc b3
|
|
|
|
bne !+
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z rem
|
2018-04-24 23:11:28 +00:00
|
|
|
cmp #<main.wavelength
|
2018-03-05 00:00:33 +00:00
|
|
|
bcc b3
|
|
|
|
!:
|
2019-08-07 19:00:19 +00:00
|
|
|
inc.z quotient
|
2018-03-05 00:00:33 +00:00
|
|
|
bne !+
|
2019-08-07 19:00:19 +00:00
|
|
|
inc.z quotient+1
|
2018-03-05 00:00:33 +00:00
|
|
|
!:
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z rem
|
2018-03-05 00:00:33 +00:00
|
|
|
sec
|
2018-04-24 23:11:28 +00:00
|
|
|
sbc #<main.wavelength
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z rem
|
|
|
|
lda.z rem+1
|
2018-04-24 23:11:28 +00:00
|
|
|
sbc #>main.wavelength
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z rem+1
|
2018-03-05 00:00:33 +00:00
|
|
|
b3:
|
|
|
|
inx
|
|
|
|
cpx #$10
|
|
|
|
bne b1
|
|
|
|
rts
|
|
|
|
}
|
2019-02-17 23:12:29 +00:00
|
|
|
// Generate signed (large) word sinus table - on the full -$7fff - $7fff range
|
|
|
|
// sintab - the table to generate into
|
|
|
|
// wavelength - the number of sinus points in a total sinus wavelength (the size of the table)
|
2019-08-07 09:27:55 +00:00
|
|
|
// sin16s_gen(signed word* zeropage($e) sintab)
|
2018-03-05 00:00:33 +00:00
|
|
|
sin16s_gen: {
|
2019-08-07 09:27:55 +00:00
|
|
|
.label _2 = $15
|
2019-07-31 11:47:21 +00:00
|
|
|
.label step = $17
|
2019-08-07 09:27:55 +00:00
|
|
|
.label sintab = $e
|
2019-07-31 11:47:21 +00:00
|
|
|
.label x = $a
|
2019-08-07 09:27:55 +00:00
|
|
|
.label i = $1d
|
2018-03-05 00:00:33 +00:00
|
|
|
jsr div32u16u
|
|
|
|
lda #<main.sintab1
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z sintab
|
2018-03-05 00:00:33 +00:00
|
|
|
lda #>main.sintab1
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z sintab+1
|
2019-05-18 21:58:04 +00:00
|
|
|
lda #0
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z x
|
|
|
|
sta.z x+1
|
|
|
|
sta.z x+2
|
|
|
|
sta.z x+3
|
|
|
|
sta.z i
|
|
|
|
sta.z i+1
|
2019-08-25 20:21:56 +00:00
|
|
|
// u[4.28]
|
|
|
|
b1:
|
|
|
|
lda.z i+1
|
|
|
|
cmp #>main.wavelength
|
|
|
|
bcc b2
|
|
|
|
bne !+
|
|
|
|
lda.z i
|
|
|
|
cmp #<main.wavelength
|
|
|
|
bcc b2
|
|
|
|
!:
|
|
|
|
rts
|
2019-08-07 09:27:55 +00:00
|
|
|
b2:
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z x
|
|
|
|
sta.z sin16s.x
|
|
|
|
lda.z x+1
|
|
|
|
sta.z sin16s.x+1
|
|
|
|
lda.z x+2
|
|
|
|
sta.z sin16s.x+2
|
|
|
|
lda.z x+3
|
|
|
|
sta.z sin16s.x+3
|
2018-03-05 00:00:33 +00:00
|
|
|
jsr sin16s
|
|
|
|
ldy #0
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z _2
|
2018-03-05 00:00:33 +00:00
|
|
|
sta (sintab),y
|
|
|
|
iny
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z _2+1
|
2018-03-05 00:00:33 +00:00
|
|
|
sta (sintab),y
|
2019-04-19 08:50:15 +00:00
|
|
|
lda #SIZEOF_SIGNED_WORD
|
2018-04-24 21:15:18 +00:00
|
|
|
clc
|
2019-08-07 19:00:19 +00:00
|
|
|
adc.z sintab
|
|
|
|
sta.z sintab
|
2018-04-24 21:15:18 +00:00
|
|
|
bcc !+
|
2019-08-07 19:00:19 +00:00
|
|
|
inc.z sintab+1
|
2018-04-24 21:15:18 +00:00
|
|
|
!:
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z x
|
2018-03-05 00:00:33 +00:00
|
|
|
clc
|
2019-08-07 19:00:19 +00:00
|
|
|
adc.z step
|
|
|
|
sta.z x
|
|
|
|
lda.z x+1
|
|
|
|
adc.z step+1
|
|
|
|
sta.z x+1
|
|
|
|
lda.z x+2
|
|
|
|
adc.z step+2
|
|
|
|
sta.z x+2
|
|
|
|
lda.z x+3
|
|
|
|
adc.z step+3
|
|
|
|
sta.z x+3
|
|
|
|
inc.z i
|
2018-03-05 00:00:33 +00:00
|
|
|
bne !+
|
2019-08-07 19:00:19 +00:00
|
|
|
inc.z i+1
|
2018-03-05 00:00:33 +00:00
|
|
|
!:
|
2019-08-25 20:21:56 +00:00
|
|
|
jmp b1
|
2018-03-05 00:00:33 +00:00
|
|
|
}
|
2019-02-17 23:12:29 +00:00
|
|
|
// Calculate signed word sinus sin(x)
|
|
|
|
// x: unsigned dword input u[4.28] in the interval $00000000 - PI2_u4f28
|
|
|
|
// result: signed word sin(x) s[0.15] - using the full range -$7fff - $7fff
|
2019-07-31 11:47:21 +00:00
|
|
|
// sin16s(dword zeropage($11) x)
|
2018-03-05 00:00:33 +00:00
|
|
|
sin16s: {
|
2019-07-31 11:47:21 +00:00
|
|
|
.label _4 = $11
|
|
|
|
.label x = $11
|
|
|
|
.label return = $15
|
|
|
|
.label x1 = $1f
|
|
|
|
.label x2 = 6
|
|
|
|
.label x3 = 6
|
|
|
|
.label x3_6 = $1b
|
|
|
|
.label usinx = $15
|
|
|
|
.label x4 = 6
|
|
|
|
.label x5 = $1b
|
|
|
|
.label x5_128 = $1b
|
|
|
|
.label sinx = $15
|
|
|
|
.label isUpper = $10
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z x+3
|
2018-03-05 00:00:33 +00:00
|
|
|
cmp #>PI_u4f28>>$10
|
|
|
|
bcc b4
|
|
|
|
bne !+
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z x+2
|
2018-03-05 00:00:33 +00:00
|
|
|
cmp #<PI_u4f28>>$10
|
|
|
|
bcc b4
|
|
|
|
bne !+
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z x+1
|
2018-03-05 00:00:33 +00:00
|
|
|
cmp #>PI_u4f28
|
|
|
|
bcc b4
|
|
|
|
bne !+
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z x
|
2018-03-05 00:00:33 +00:00
|
|
|
cmp #<PI_u4f28
|
|
|
|
bcc b4
|
|
|
|
!:
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z x
|
2018-03-05 00:00:33 +00:00
|
|
|
sec
|
|
|
|
sbc #<PI_u4f28
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z x
|
|
|
|
lda.z x+1
|
2018-03-05 00:00:33 +00:00
|
|
|
sbc #>PI_u4f28
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z x+1
|
|
|
|
lda.z x+2
|
2018-03-05 00:00:33 +00:00
|
|
|
sbc #<PI_u4f28>>$10
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z x+2
|
|
|
|
lda.z x+3
|
2018-03-05 00:00:33 +00:00
|
|
|
sbc #>PI_u4f28>>$10
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z x+3
|
2018-03-05 00:00:33 +00:00
|
|
|
lda #1
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z isUpper
|
2018-03-05 00:00:33 +00:00
|
|
|
jmp b1
|
|
|
|
b4:
|
|
|
|
lda #0
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z isUpper
|
2018-03-05 00:00:33 +00:00
|
|
|
b1:
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z x+3
|
2018-03-05 00:00:33 +00:00
|
|
|
cmp #>PI_HALF_u4f28>>$10
|
|
|
|
bcc b2
|
|
|
|
bne !+
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z x+2
|
2018-03-05 00:00:33 +00:00
|
|
|
cmp #<PI_HALF_u4f28>>$10
|
|
|
|
bcc b2
|
|
|
|
bne !+
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z x+1
|
2018-03-05 00:00:33 +00:00
|
|
|
cmp #>PI_HALF_u4f28
|
|
|
|
bcc b2
|
|
|
|
bne !+
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z x
|
2018-03-05 00:00:33 +00:00
|
|
|
cmp #<PI_HALF_u4f28
|
|
|
|
bcc b2
|
|
|
|
!:
|
|
|
|
lda #<PI_u4f28
|
|
|
|
sec
|
2019-08-07 19:00:19 +00:00
|
|
|
sbc.z x
|
|
|
|
sta.z x
|
2018-03-05 00:00:33 +00:00
|
|
|
lda #>PI_u4f28
|
2019-08-07 19:00:19 +00:00
|
|
|
sbc.z x+1
|
|
|
|
sta.z x+1
|
2018-03-05 00:00:33 +00:00
|
|
|
lda #<PI_u4f28>>$10
|
2019-08-07 19:00:19 +00:00
|
|
|
sbc.z x+2
|
|
|
|
sta.z x+2
|
2018-03-05 00:00:33 +00:00
|
|
|
lda #>PI_u4f28>>$10
|
2019-08-07 19:00:19 +00:00
|
|
|
sbc.z x+3
|
|
|
|
sta.z x+3
|
2018-03-05 00:00:33 +00:00
|
|
|
b2:
|
|
|
|
ldy #3
|
|
|
|
!:
|
2019-08-07 19:00:19 +00:00
|
|
|
asl.z _4
|
|
|
|
rol.z _4+1
|
|
|
|
rol.z _4+2
|
|
|
|
rol.z _4+3
|
2018-03-05 00:00:33 +00:00
|
|
|
dey
|
|
|
|
bne !-
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z _4+2
|
|
|
|
sta.z x1
|
|
|
|
lda.z _4+3
|
|
|
|
sta.z x1+1
|
|
|
|
lda.z x1
|
|
|
|
sta.z mulu16_sel.v1
|
|
|
|
lda.z x1+1
|
|
|
|
sta.z mulu16_sel.v1+1
|
|
|
|
lda.z x1
|
|
|
|
sta.z mulu16_sel.v2
|
|
|
|
lda.z x1+1
|
|
|
|
sta.z mulu16_sel.v2+1
|
2018-03-05 00:00:33 +00:00
|
|
|
ldx #0
|
|
|
|
jsr mulu16_sel
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z mulu16_sel.return_17
|
|
|
|
sta.z mulu16_sel.return
|
|
|
|
lda.z mulu16_sel.return_17+1
|
|
|
|
sta.z mulu16_sel.return+1
|
|
|
|
lda.z x1
|
|
|
|
sta.z mulu16_sel.v2
|
|
|
|
lda.z x1+1
|
|
|
|
sta.z mulu16_sel.v2+1
|
2018-03-05 00:00:33 +00:00
|
|
|
ldx #1
|
|
|
|
jsr mulu16_sel
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z mulu16_sel.return_17
|
|
|
|
sta.z mulu16_sel.return
|
|
|
|
lda.z mulu16_sel.return_17+1
|
|
|
|
sta.z mulu16_sel.return+1
|
2018-03-05 00:00:33 +00:00
|
|
|
ldx #1
|
|
|
|
lda #<$10000/6
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z mulu16_sel.v2
|
2018-03-05 00:00:33 +00:00
|
|
|
lda #>$10000/6
|
2019-08-07 19:00:19 +00:00
|
|
|
sta.z mulu16_sel.v2+1
|
2018-03-05 00:00:33 +00:00
|
|
|
jsr mulu16_sel
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z x1
|
2018-03-05 00:00:33 +00:00
|
|
|
sec
|
2019-08-07 19:00:19 +00:00
|
|
|
sbc.z x3_6
|
|
|
|
sta.z usinx
|
|
|
|
lda.z x1+1
|
|
|
|
sbc.z x3_6+1
|
|
|
|
sta.z usinx+1
|
|
|
|
lda.z x1
|
|
|
|
sta.z mulu16_sel.v2
|
|
|
|
lda.z x1+1
|
|
|
|
sta.z mulu16_sel.v2+1
|
2018-03-05 00:00:33 +00:00
|
|
|
ldx #0
|
|
|
|
jsr mulu16_sel
|
2019-08-07 19:00:19 +00:00
|
|
|
lda.z mulu16_sel.return_17
|
|
|
|
sta.z mulu16_sel.return
|
|
|
|
lda.z mulu16_sel.return_17+1
|
|
|
|
sta.z mulu16_sel.return+1
|
|
|
|
lda.z x1
|
|
|
|
sta.z mulu16_sel.v2
|
|
|
|
lda.z x1+1
|
|
|
|
sta.z mulu16_sel.v2+1
|
2018-03-05 00:00:33 +00:00
|
|
|
ldx #0
|
|
|
|
jsr mulu16_sel
|
2019-08-07 19:00:19 +00:00
|
|
|
lsr.z x5_128+1
|
|
|
|
ror.z x5_128
|
|
|
|
lsr.z x5_128+1
|
|
|
|
ror.z x5_128
|
|
|
|
lsr.z x5_128+1
|
|
|
|
ror.z x5_128
|
|
|
|
lsr.z x5_128+1
|
|
|
|
ror.z x5_128
|
|
|
|
lda.z usinx
|
2018-03-05 00:00:33 +00:00
|
|
|
clc
|
2019-08-07 19:00:19 +00:00
|
|
|
adc.z x5_128
|
|
|
|
sta.z usinx
|
|
|
|
lda.z usinx+1
|
|
|
|
adc.z x5_128+1
|
|
|
|
sta.z usinx+1
|
|
|
|
lda.z isUpper
|
2018-12-02 20:31:03 +00:00
|
|
|
cmp #0
|
2018-03-05 00:00:33 +00:00
|
|
|
beq b3
|
|
|
|
sec
|
2019-06-21 20:12:04 +00:00
|
|
|
lda #0
|
2019-08-07 19:00:19 +00:00
|
|
|
sbc.z sinx
|
|
|
|
sta.z sinx
|
2019-06-21 20:12:04 +00:00
|
|
|
lda #0
|
2019-08-07 19:00:19 +00:00
|
|
|
sbc.z sinx+1
|
|
|
|
sta.z sinx+1
|
2018-03-05 00:00:33 +00:00
|
|
|
b3:
|
|
|
|
rts
|
|
|
|
}
|
2018-04-02 22:02:25 +00:00
|
|
|
print_hextab: .text "0123456789abcdef"
|