scu-dsp: add separated div10_unsigned and unparse_base10

This commit is contained in:
Zack Buhman 2025-08-12 19:24:12 -05:00
parent 566a90782d
commit 5c1b264b8c
3 changed files with 107 additions and 0 deletions

View File

@ -0,0 +1,16 @@
;;
;; transfer to vdp2
;;
;; vdp2 address calculation
mvi ((8 * 0x4000 + (64 - 8) * 4 + 0x05e00000) >> 2),wa0
mov 0,ct3
;; clr a mov 0,ct3
;; add mov alu,a
;; mov all,wa0
;; end vdp2 address calculation
dma1 mc3,d0,8
dma_wait:
jmp t0,dma_wait
nop

View File

@ -0,0 +1,34 @@
;;
;; function: div10_unsigned
;;
;; argument: ry
;; return: a ← ry / 10
;; maximum ry is somewhere between 2 ^ 21 and 2 ^ 22
div10_unsigned:
;; 1 / 10 * (2 ^ 24) ~= 1677722 = 0x19999a
mvi 1677722,rx
mov mul,p clr a
ad2 mov alu,a
;; ALH: [nmlkjihgfedcba9876543210________]
;; ALL: [76543210________________________]
clr a mov alh,pl ; alh is (a >> 16)
add mov alu,a
;; ALL: [nmlkjihgfedcba9876543210________]
;; rotate left 24 requires fewer cycles than shift right 8
rl8 mov alu,a
rl8 mov alu,a
rl8 mov alu,a
;; ALL: [________nmlkjihgfedcba9876543210]
;; mask 24 bit result
mvi 0xffffff,pl
;; return to caller ; reset ct0
btm
and mov alu,a mov 0,ct0

View File

@ -0,0 +1,57 @@
;;
;; inline function: unparse_base10
;;
;; argument: m2[0]
;; return: base10 + 16 in m3[56 - 63]
;; requires: div10_unsigned
unparse_base10:
;; clear end of m3
mov (64 - 8),ct3
mov 7,lop
lps
mov 0,mc3
mov (64 - 8),ct3
;; output: m3
unparse_base10_loop:
mov 0,ct2
mvi div10_unsigned,pc
;; [X ] [Y ] [D1 ]
mov mc2,y mov 1,lop ; mvi imm,pc delay slot (executed twice)
;; after function return:
mov all,mc0 ; m0[1] (1234)
mov all,pl
;; mod10: multiply by 10:
sl mov alu,a
sl mov alu,a
sl mov alu,a
add mov alu,a
add mov alu,a mov 0,ct0 ; restore ct0 after 'mov all,mc1'
;; a: 12340
mov mc0,a mov all,pl
;; a: 12345 m0[0]
;; p: 12340
;; mod10: subtract (a - p)
sub mov alu,a mov 16,pl
;; a: 5
;; convert to vdp2 character
add mov alu,a
;; store digit in m3
mov mc0,p clr a mov all,mc3 ; m0[1]
;; p: 1234
;; a: 0
add mov alu,a mov 0,ct0
;; a: 1234
jmp nz,unparse_base10_loop
mov all,mc0 ; jmp delay slot