summaryrefslogtreecommitdiff
path: root/test/popcnt.s
blob: cdb71c5476d81c02610d4e9c97ebd87e87a477f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
; Calculate population count/hamming weight.

.org $1000

popcnt:
	ldb #0		; Reset bit count.
	pha.q		; Create a temporary variable.
	cmp #0		; Set the status flags.
@loop:
	beq @end	; There are no more one bits left, so we're done.
	dec.q sp+1	; Decrement the temp variable.
	dec.q sp+1	; Decrement the temp variable.
	inb		; Increment the bit count.
	and.q sp+1	; AND value with value-1.
	sta.q sp+1	; Place it back in the temp variable.
	bra @loop	; Keep looping.
@end:
	pla.q		; Pull/Pop the temp variable off the stack.
	tba		; Return the bit count.
	rts		; End of popcnt.


reset:
	cps		; Boilerplate reset code.
	ldx.d #$2FFFF	;
	txs		;
	and #0		; Reset A.
	tab		; Reset B.
	tax		; Reset X.
	tay		; Reset Y.
main:
	pha.q		; Save A.
	jsr popcnt	; Get population count.
	tay		; Save it in Y.
	pla.q		; Get A back.
	inc		; Increment A by one.
	bra main	; Keep looping.


.org $FFC0
.qword reset

a
d