diff --git a/scu-dsp/advent/2020/day1/runner.m4.asm b/scu-dsp/advent/2020/day1/runner.m4.asm new file mode 100644 index 0000000..b51bb74 --- /dev/null +++ b/scu-dsp/advent/2020/day1/runner.m4.asm @@ -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 diff --git a/scu-dsp/lib/div10_unsigned.asm b/scu-dsp/lib/div10_unsigned.asm new file mode 100644 index 0000000..083afb9 --- /dev/null +++ b/scu-dsp/lib/div10_unsigned.asm @@ -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 diff --git a/scu-dsp/lib/unparse_base10.asm b/scu-dsp/lib/unparse_base10.asm new file mode 100644 index 0000000..970fc2d --- /dev/null +++ b/scu-dsp/lib/unparse_base10.asm @@ -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