saturn-examples/scu-dsp/lib/unparse_base10.asm

59 lines
1.6 KiB
NASM

;;
;; inline function: unparse_base10
;;
;; argument: m2[0]
;; return: base10 + 16 in m3[56:63]
;; requires: div10_unsigned
;; [X ] [Y ] [D1 ]
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,mc2 ; m2[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,ct2 ; restore ct2 after 'mov all,mc2'
;; a: 12340
mov mc2,a mov all,pl
;; a: 12345 m2[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 mc2,p clr a mov all,mc3 ; m2[1]
;; p: 1234
;; a: 0
add mov alu,a mov 0,ct2
;; a: 1234
jmp nz,unparse_base10_loop
mov all,mc2 ; jmp delay slot