scu-dsp: add separated div10_unsigned and unparse_base10
This commit is contained in:
parent
566a90782d
commit
5c1b264b8c
16
scu-dsp/advent/2020/day1/runner.m4.asm
Normal file
16
scu-dsp/advent/2020/day1/runner.m4.asm
Normal 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
|
34
scu-dsp/lib/div10_unsigned.asm
Normal file
34
scu-dsp/lib/div10_unsigned.asm
Normal 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
|
57
scu-dsp/lib/unparse_base10.asm
Normal file
57
scu-dsp/lib/unparse_base10.asm
Normal 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
|
Loading…
x
Reference in New Issue
Block a user