75 lines
2.7 KiB
NASM
75 lines
2.7 KiB
NASM
;; input data: m0
|
|
;; input data: m1
|
|
;; input data: m2
|
|
|
|
;; variables m3:
|
|
loop_0_ix = 0 ; decrementing counter
|
|
loop_1_start = 1
|
|
|
|
;start = 0
|
|
start = 0 ; constant
|
|
|
|
;; initialization
|
|
;; [X ] [Y ] [D1 ]
|
|
mov (start + 0),ct0
|
|
|
|
;; initialize multiplier output to 2020
|
|
mov 63,ct3
|
|
mvi 2020,mc3 ; m3[63] used as temporary
|
|
mov 63,ct3
|
|
mov m3,y mov 1,rx
|
|
;; initialize variables
|
|
mov loop_0_ix,ct3
|
|
mov (64 - start),mc3 ; loop_0_ix+
|
|
mov (start + 1),mc3 ; loop_1_start+
|
|
|
|
;; outer loop init
|
|
mov loop_inner,top
|
|
mov (64 - start),lop ; (LOP: 64)
|
|
mov 1,pl
|
|
mov loop_1_start,ct3
|
|
solve_loop_0_top:
|
|
;; [X ] [Y ] [D1 ]
|
|
;; calculate inner loop starting index
|
|
;; P: 1 ; A: 64
|
|
mov m3,a mov m3,ct1 ; loop_1_start
|
|
;; pre-decrement lop; effectively a jump to loop_inner
|
|
btm ; (LOP: 63)
|
|
add mov all,mc3 ; loop_1_start+ (delay slot)
|
|
|
|
loop_inner:
|
|
mov m0,p mov m1,a
|
|
add mov mul,p mov alu,a
|
|
sub
|
|
jmp z,found
|
|
nop
|
|
|
|
btm
|
|
;; increment ct1 (A discarded)
|
|
mov mc1,a ; (delay slot)
|
|
|
|
;; increment ct0 (A discarded)
|
|
mov mc0,a
|
|
|
|
loop_exit_test:
|
|
;; [X ] [Y ] [D1 ]
|
|
mov loop_0_ix,ct3
|
|
mov m3,a mov 1,pl ; m3: loop_0_ix
|
|
sub mov alu,a mov all,mc3 ; m3: loop_0_ix+
|
|
jmp nz,solve_loop_0_top
|
|
mov all,lop ; (delay slot)
|
|
|
|
not_found:
|
|
jmp return
|
|
clr a ; (delay slot)
|
|
found:
|
|
;; [X ] [Y ] [D1 ]
|
|
mov m1,x mov m0,y clr a
|
|
mov mul,p
|
|
add mov alu,a ; (delay slot)
|
|
return:
|
|
;;mov 0,ct0
|
|
;;mov all,mc0
|
|
;;endi
|
|
;;nop
|