Home » Archimedes archive » Archimedes World » archimedes_world_volume_14_issue_12_scp.adf » !AcornAns_AcornAns » !Brolly/s/plot

!Brolly/s/plot

This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.

Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.

Tape/disk: Home » Archimedes archive » Archimedes World » archimedes_world_volume_14_issue_12_scp.adf » !AcornAns_AcornAns
Filename: !Brolly/s/plot
Read OK:
File size: 4931 bytes
Load address: 0000
Exec address: 0000
File contents
	^	0
next	#	4
name	#	12
width	#	4
height	#	4
lbit	#	4
rbit	#	4
image	#	4
mask	#	4
mode	#	4

rbank	RN	r4
rscrst	RN	r5
rox	RN	r6
roy	RN	r7
rlx	RN	r8
rly	RN	r9

area	RN	a1
spr	RN	a2
x	RN	a3
y	RN	a4

spr_e	RN	a1
x_e	RN	a2
y_e	RN	a3

x_r	RN	a1
y_r	RN	a2
w_r	RN	a3
h_r	RN	a4
c_r	RN	r12

h	RN	a1

	IMPORT	bank
	IMPORT	scrst
	IMPORT	originx
	IMPORT	originy
	IMPORT	lx
	IMPORT	ly

vbls	DCD	bank, scrst, originx, originy, lx, ly

; plot_brolly
; a leaf APCS function
;
; C prototype:
; void plot_brolly(void *area, void *spr, int x, int y);
;
; nb  assumes fits vertically on screen but may lie off either side (in which case osplot used)
;     else lies on screen & can do a fast plot with no clipping
; nb2 also assumes sprite is multiple of 8 pixels wide, is 4bpp & screen mode is 640 pixels wide
;
	EXPORT	plot_brolly

pbnsta	DCB	"plot_brolly", 0
	ALIGN
pbnend	DCD	&ff000000 + pbnend - pbnsta

plot_brolly

	STMFD	sp!, {r4-r9, sl, fp, lr}
	ADR	r4, vbls
	LDMIA	r4, {r4-r9}
	LDR	r4, [rbank]
	SUB	r4, r4, #1
	LDR	r5, [rscrst, r4, LSL #2]	; screen base addr for VDU output
	LDR	rox, [rox]
	LDR	roy, [roy]
	LDR	rlx, [rlx]
	LDR	rly, [rly]
	ADD	r10, x, rox
	RSB	r11, y, roy
	MOVS	r10, r10, ASR rlx		; x pixel coord rel left screen } of bottom left
	MOV	r11, r11, ASR rly		; y pixel coord rel top screen  } of object
	BMI	pb_useosplot
	LDR	r12, [spr, #width]
	ADD	r12, r12, #1			; width in words
	ADD	r14, r10, r12, ASL #3
	CMP	r14, #640
	BLE	pb_usefastplot
pb_useosplot
	MOV	r5, #0
	MOV	r4, y
	MOV	r3, x
	MOV	r2, spr
	MOV	r1, area
	MOV	r0, #512
	ADD	r0, r0, #34
	SWI	XOS_SpriteOp
	B	pb_exit
pb_usefastplot
	LDR	r14, [spr, #height]
	SUB	r11, r11, r14
	ADD	r11, r11, r11, ASL #2
	ADD	r5, r5, r11, ASL #6
	AND	r0, r10, #7
	BIC	r10, r10, #7
	ADD	r5, r5, r10, ASR #1		; screen top left of brolly
	LDR	r4, [spr, #image]
	ADD	r4, spr, r4			; brolly sprite top left
	ADD	r6, r14, #1			; number of rows to plot
	MOV	r0, r0, ASL #2
	RSB	r1, r0, #32
pb_nextrow
	MOV	r7, r4				; start of current row in sprite
	MOV	r10, r5				; start of current row on screen
	MOV	r11, r12			; number of cols to plot
	MOV	r2, #0
pb_nextcol
	LDR	r8, [r7], #4
	ORR	r9, r2, r8, LSL r0
	MOV	r2, r8, LSR r1
	STR	r9, [r10], #4
	SUBS	r11, r11, #1
	BLE	pb_endcol
	LDR	r8, [r7], #4
	ORR	r9, r2, r8, LSL r0
	MOV	r2, r8, LSR r1
	STR	r9, [r10], #4
	SUBS	r11, r11, #1
	BLE	pb_endcol
	LDR	r8, [r7], #4
	ORR	r9, r2, r8, LSL r0
	MOV	r2, r8, LSR r1
	STR	r9, [r10], #4
	SUBS	r11, r11, #1
	BLE	pb_endcol
	LDR	r8, [r7], #4
	ORR	r9, r2, r8, LSL r0
	MOV	r2, r8, LSR r1
	STR	r9, [r10], #4
	SUBS	r11, r11, #1
	BGT	pb_nextcol
pb_endcol
	CMP	r0, #0
	STRNE	r2, [r10], #4
	ADD	r4, r4, r12, LSL #2
	ADD	r5, r5, #320
	SUBS	r6, r6, #1
	BGT	pb_nextrow

pb_exit	LDMFD	sp!, {r4-r9, sl, fp, pc}^



; plot_hand
; a leaf APCS function
;
; C prototype:
; void plot_hand(void *area, void *spr, int x, int y);
;
; nb  assumes fits on screen & can do a fast plot with no clipping
; nb2 also assumes sprite is multiple of 8 pixels wide, is 4bpp & screen mode is 640 pixels wide
; ignore sprite mask if it has one, but treat colour 0 pixels as transparent;
; also, treat screen pixels of colours 8 to 15 as lying infront of hand sprite
;
	EXPORT	plot_hand

phnsta	DCB	"plot_hand", 0
	ALIGN
phnend	DCD	&ff000000 + phnend - phnsta

phsp	DCD	0

plot_hand

	STMFD	sp!, {r4-r9, sl, fp, lr}
	STR	sp, phsp
	ADR	r4, vbls
	LDMIA	r4, {r4-r9}
	LDR	r4, [rbank]
	SUB	r4, r4, #1
	LDR	r5, [rscrst, r4, LSL #2]	; screen base addr for VDU output
	LDR	rox, [rox]
	LDR	roy, [roy]
	LDR	rlx, [rlx]
	LDR	rly, [rly]
	ADD	r10, x, rox
	RSB	r11, y, roy
	MOV	r10, r10, ASR rlx		; x pixel coord rel left screen } of bottom left
	MOV	r11, r11, ASR rly		; y pixel coord rel top screen  } of object
	CMP	r10, #25			; constain to be not off left side screen
	MOVLT	r10, #25
	LDR	r12, [spr, #width]
	ADD	r12, r12, #1			; width in words
	ADD	r14, r10, r12, ASL #3
	CMP	r14, #612
	MOVGT	r14, r12, ASL #3		; constrain to be not off right side screen
	RSBGT	r10, r14, #612
	LDR	r14, [spr, #height]
	SUB	r11, r11, r14
	ADD	r11, r11, r11, ASL #2
	ADD	r5, r5, r11, ASL #6
	AND	r0, r10, #7
	BIC	r10, r10, #7
	ADD	r5, r5, r10, ASR #1		; screen top left of hand
	LDR	r4, [spr, #image]
	ADD	r4, spr, r4			; hand sprite top left
	ADD	r6, r14, #1			; number of rows to plot
	MOV	r0, r0, ASL #2
	RSB	r1, r0, #32
	MOV	r14, #&88
	ORR	r14, r14, r14, LSL #8
	ORR	r14, r14, r14, LSL #16		; masking constant &88888888
ph_nextrow
	MOV	r7, r4				; start of current row in sprite
	MOV	r10, r5				; start of current row on screen
	MOV	r11, r12			; number of cols to plot
	MOV	r2, #0
ph_nextcol
	LDR	r8, [r7], #4
	ORR	r9, r2, r8, LSL r0		; shifted hand sprite data
	MOV	r2, r8, LSR r1
	LDR	r8, [r10]			; screen data
	ORR	r13, r9, r9, LSL #2
	ORR	r13, r13, r13, LSL #1
	AND	r13, r13, r14
	BIC	r13, r13, r8
	ORR	r13, r13, r13, LSR #1
	ORR	r13, r13, r13, LSR #2
	AND	r9, r9, r13
	BIC	r8, r8, r13
	ORR	r9, r8, r9
	STR	r9, [r10], #4
	SUBS	r11, r11, #1
	BLE	ph_endcol
	LDR	r8, [r7], #4
	ORR	r9, r2, r8, LSL r0
	MOV	r2, r8, LSR r1
	LDR	r8, [r10]			; screen data
	ORR	r13, r9, r9, LSL #2
	ORR	r13, r13, r13, LSL #1
	AND	r13, r13, r14
	BIC	r13, r13, r8
	ORR	r13, r13, r13, LSR #1
	ORR	r13, r13, r13, LSR #2
	AND	r9, r9, r13
	BIC	r8, r8, r13
	ORR	r9, r8, r9
	STR	r9, [r10], #4
	SUBS	r11, r11, #1
	BLE	ph_endcol
	LDR	r8, [r7], #4
	ORR	r9, r2, r8, LSL r0
	MOV	r2, r8, LSR r1
	LDR	r8, [r10]			; screen data
	ORR	r13, r9, r9, LSL #2
	ORR	r13, r13, r13, LSL #1
	AND	r13, r13, r14
	BIC	r13, r13, r8
	ORR	r13, r13, r13, LSR #1
	ORR	r13, r13, r13, LSR #2
	AND	r9, r9, r13
	BIC	r8, r8, r13
	ORR	r9, r8, r9
	STR	r9, [r10], #4
	SUBS	r11, r11, #1
	BLE	ph_endcol
	LDR	r8, [r7], #4
	ORR	r9, r2, r8, LSL r0
	MOV	r2, r8, LSR r1
	LDR	r8, [r10]			; screen data
	ORR	r13, r9, r9, LSL #2
	ORR	r13, r13, r13, LSL #1
	AND	r13, r13, r14
	BIC	r13, r13, r8
	ORR	r13, r13, r13, LSR #1
	ORR	r13, r13, r13, LSR #2
	AND	r9, r9, r13
	BIC	r8, r8, r13
	ORR	r9, r8, r9
	STR	r9, [r10], #4
	SUBS	r11, r11, #1
	BGT	ph_nextcol
ph_endcol
	CMP	r0, #0
	BEQ	ph_donecol
	LDR	r8, [r10]			; screen data
	ORR	r13, r2, r2, LSL #2
	ORR	r13, r13, r13, LSL #1
	AND	r13, r13, r14
	BIC	r13, r13, r8
	ORR	r13, r13, r13, LSR #1
	ORR	r13, r13, r13, LSR #2
	AND	r2, r2, r13
	BIC	r8, r8, r13
	ORR	r2, r8, r2
	STR	r2, [r10], #4
ph_donecol
	ADD	r4, r4, r12, LSL #2
	ADD	r5, r5, #320
	SUBS	r6, r6, #1
	BGT	ph_nextrow

ph_exit	LDR	sp, phsp
	LDMFD	sp!, {r4-r9, sl, fp, pc}^



; plot_number
; a leaf APCS function
;
; C prototype:
; void plot_number(void *area, void *spr, int x, int y);
;
; nb  assumes fits on screen & can do a fast plot with no clipping
; also that is being printed at a word aligned address (ie x is a multiple of 8)
; assumes sprite is 32 by ht pixels, 4bpp & screen mode is 640 pixels wide
; (ht = 32 if vga else 16)
;

	MACRO
$label  pn_seg	$r1, $r2
	ASSERT	$r1 <> $r2
$label	AND	r1, r14, $r2
	AND	r0, r14, $r2, LSR #4
	AND	$r2, r14, $r1
	AND	$r1, r14, $r1, LSR #4
	ADD	$r2, $r2, r1
	ADD	$r1, $r1, r0
	AND	r1, r14, $r2, LSR #4
	AND	r0, r14, $r1, LSR #4
	AND	$r2, r14, $r2
	AND	$r1, r14, $r1
	ORR	r1, r1, r1, LSL #1
	ORR	r0, r0, r0, LSL #1
	ORR	r1, r1, r1, LSL #2
	ORR	r0, r0, r0, LSL #2
	ORR	$r2, $r2, r1
	ORR	$r1, $r1, r0
	ORR	$r2, $r2, $r1, LSL #4
	MEND

	EXPORT	plot_number

pnnsta	DCB	"plot_number", 0
	ALIGN
pnnend	DCD	&ff000000 + pnnend - pnnsta

pnsp	DCD	0

plot_number

	STMFD	sp!, {r4-r9, sl, fp, lr}
	STR	sp, pnsp
	ADR	r4, vbls
	LDMIA	r4, {r4-r9}
	LDR	r4, [rbank]
	SUB	r4, r4, #1
	LDR	r5, [rscrst, r4, LSL #2]	; screen base addr for VDU output
	LDR	rox, [rox]
	LDR	roy, [roy]
	LDR	rlx, [rlx]
	LDR	rly, [rly]
	ADD	r10, x, rox
	RSB	r11, y, roy
	SUB	r11, r11, #64
	MOV	r10, r10, ASR rlx		; x pixel coord rel left screen } of top left
	MOV	r11, r11, ASR rly		; y pixel coord rel top screen  } of object
	ADD	r11, r11, #1
	ADD	r11, r11, r11, ASL #2
	ADD	r5, r5, r11, ASL #6
	BIC	r10, r10, #7
	ADD	r5, r5, r10, ASR #1		; screen top left of number
	LDR	r4, [spr, #image]
	ADD	r4, spr, r4			; number sprite top left
	MOV	r3, #64
	MOV	r3, r3, ASR rly
	MOV	r14, #&0f
	ORR	r14, r14, r14, LSL #8
	ORR	r14, r14, r14, LSL #16
pn_loop	LDMIA	r4!, {r6,r7,r8,r9}
	LDMIA	r5, {r10,r11,r12,r13}
	pn_seg	r6, r10
	pn_seg	r7, r11
	pn_seg	r8, r12
	pn_seg	r9, r13
	STMIA   r5, {r10,r11,r12,r13}
	ADD	r5, r5, #320
	SUBS	r3, r3, #1
	BNE	pn_loop
pn_exit	LDR	sp, pnsp
	LDMFD	sp!, {r4-r9, sl, fp, pc}^



; plot_bar
; a leaf APCS function
;
; C prototype:
; void plot_bar(int x, int y, int w, int h, int c);
;
; plot a blank rectangle of width w, height h, bottom left at x, y in colour c
; assume mode is 640 pixels wide 4bpp & rectangle lies within screen area
; also, that x is a multiple of 2 as is w
;
	EXPORT	plot_bar

rfnsta	DCB	"plot_bar", 0
	ALIGN
rfnend	DCD	&ff000000 + rfnend - rfnsta

plot_bar

	LDR	ip, [sp]			; colour in r12
	STMFD	sp!, {r4-r9, sl, fp, lr}
	CMP	w_r, #0
	ADDMI	x_r, x_r, w_r
	ADDMI	x_r, x_r, #1
	RSBMI	w_r, w_r, #0
	CMP	h_r, #0
	ADDMI	y_r, y_r, h_r
	ADDMI	y_r, y_r, #1
	RSBMI	h_r, h_r, #0
	ADRL	r4, vbls
	LDMIA	r4, {r4-r9}
	LDR	r4, [rbank]
	SUB	r4, r4, #1
	LDR	r5, [rscrst, r4, LSL #2]	; screen base addr for VDU output
	LDR	rox, [rox]
	LDR	roy, [roy]
	LDR	rlx, [rlx]
	ADD	rlx, rlx, #1
	LDR	rly, [rly]
	ADD	r10, x_r, rox
	RSB	r11, y_r, roy
	MOV	r10, r10, ASR rlx		; x byte coord rel left screen } of bottom left
	MOV	r11, r11, ASR rly		; y pixel coord rel top screen  } of rectangle
	MOV	w_r, w_r, ASR rlx		; width row in bytes
	MOV	h_r, h_r, ASR rly
	ADD	r11, r11, #1
	SUB	r11, r11, h_r			; y pixel coord top rectangle
	ADD	r14, r10, w_r			; x byte coord just beyond right side
	ADD	r11, r11, r11, ASL #2
	ADD	r5, r5, r11, ASL #6
	ADD	r5, r5, r10
	RSB	r6, r10, #4
	AND	r6, r6, #3			; # pixels on row left upto word boundary
	ADD	r10, r10, r6
	AND	r7, r14, #3			; # pixels on row right beyond word bdry
	SUB	r8, r14, r10
	MOV	r8, r8, ASR #2			; # whole words on each row
	ORR	r0, c_r, c_r, LSL #4
	ORR	r0, r0, r0, LSL #8
	ORR	r0, r0, r0, LSL #16
rf_nextrow
	MOV	r10, r5
	MOVS	r11, r6
	BEQ	rf_rowwords
	STRB	r0, [r10], #1
	SUBS	r11, r11, #1
	BEQ	rf_rowwords
	STRB	r0, [r10], #1
	SUBS	r11, r11, #1
	BEQ	rf_rowwords
	STRB	r0, [r10], #1
rf_rowwords
	MOVS	r11, r8
	BEQ	rf_rowendwords
rf_rowwordscont
	STR	r0, [r10], #4
	SUBS	r11, r11, #1
	BEQ	rf_rowendwords
	STR	r0, [r10], #4
	SUBS	r11, r11, #1
	BEQ	rf_rowendwords
	STR	r0, [r10], #4
	SUBS	r11, r11, #1
	BEQ	rf_rowendwords
	STR	r0, [r10], #4
	SUBS	r11, r11, #1
	BNE	rf_rowwordscont
rf_rowendwords
	MOVS	r11, r7
	BEQ	rf_endrow
	STRB	r0, [r10], #1
	SUBS	r11, r11, #1
	BEQ	rf_endrow
	STRB	r0, [r10], #1
	SUBS	r11, r11, #1
	BEQ	rf_endrow
	STRB	r0, [r10], #1
rf_endrow
	ADD	r5, r5, #320
	SUBS	h_r, h_r, #1
	BGT	rf_nextrow

rf_exit	LDMFD	sp!, {r4-r9, sl, fp, pc}^



; erase_brolly
; a leaf APCS function
;
; C prototype:
; void erase_brolly(void *spr, int x, int y);
;
; plot a blank rectangle of sprite dimensions at x,y
; assumptions as for plot_brolly
;
; nb written in response to discovery that a full screen clear was using nearly
; 60% of frame time - use of this function to erase brolly & hand reduces this to 16%
; doubling game speed
;
	EXPORT	erase_brolly

esnsta	DCB	"erase_brolly", 0
	ALIGN
esnend	DCD	&ff000000 + esnend - esnsta

erase_brolly

	STMFD	sp!, {r4-r9, sl, fp, lr}
	ADRL	r4, vbls
	LDMIA	r4, {r4-r9}
	LDR	r4, [rbank]
	SUB	r4, r4, #1
	LDR	r5, [rscrst, r4, LSL #2]	; screen base addr for VDU output
	LDR	rox, [rox]
	LDR	roy, [roy]
	LDR	rlx, [rlx]
	LDR	rly, [rly]
	ADD	r10, x_e, rox
	RSB	r11, y_e, roy
	MOVS	r10, r10, ASR rlx		; x pixel coord rel left screen } of bottom left
	MOV	r11, r11, ASR rly		; y pixel coord rel top screen  } of object
	MOVMI	r10, #0				; bodge if partly off screen left
	LDR	r12, [spr_e, #width]
	ADD	r12, r12, #1			; width in words
	ADD	r14, r10, r12, ASL #3
	CMP	r14, #640
	MOVGT	r14, r12, ASL #3
	RSBGT	r10, r14, #640			; bodge if partly off screen right
	LDR	r14, [spr_e, #height]
	SUB	r11, r11, r14
	ADD	r11, r11, r11, ASL #2
	ADD	r5, r5, r11, ASL #6
	TST	r10, #7
	ADDNE	r12, r12, #1
	BIC	r10, r10, #7
	ADD	r5, r5, r10, ASR #1		; screen top left of sprite
	ADD	r6, r14, #1			; number of rows to plot
	AND	r14, r12, #3
	MOVS	r12, r12, ASR #2
	MOV	r0, #0
	BEQ	es_narrow
	MOV	r1, r0
	MOV	r2, r0
	MOV	r3, r0
es_nextrow
	MOV	r10, r5
	MOV	r11, r12
es_nextcol
	STR	r2, [r10], #4
	STMIA	r10!, {r0-r3}
	SUBS	r11, r11, #1
	BLE	es_endmultcol
	STR	r2, [r10], #4
	STMIA	r10!, {r0-r3}
	SUBS	r11, r11, #1
	BLE	es_endmultcol
	STR	r2, [r10], #4
	STMIA	r10!, {r0-r3}
	SUBS	r11, r11, #1
	BLE	es_endmultcol
	STR	r2, [r10], #4
	STMIA	r10!, {r0-r3}
	SUBS	r11, r11, #1
	BGT	es_nextcol
es_endmultcol
	MOV	r11, r14
	STR	r0, [r10], #4
	SUBS	r11, r11, #1
	BLE	es_endcol
	STR	r0, [r10], #4
	SUBS	r11, r11, #1
	BLE	es_endcol
	STR	r0, [r10], #4
	SUBS	r11, r11, #1
	BLE	es_endcol
	STR	r0, [r10], #4
es_endcol
	ADD	r5, r5, #320
	SUBS	r6, r6, #1
	BGT	es_nextrow
	B	es_exit
es_narrow
es_nnextrow
	MOV	r10, r5
	MOV	r11, r14
	STR	r0, [r10], #4
	SUBS	r11, r11, #1
	BLE	es_nendcol
	STR	r0, [r10], #4
	SUBS	r11, r11, #1
	BLE	es_nendcol
	STR	r0, [r10], #4
	SUBS	r11, r11, #1
	BLE	es_nendcol
	STR	r0, [r10], #4
es_nendcol
	ADD	r5, r5, #320
	SUBS	r6, r6, #1
	BGT	es_nnextrow

es_exit	LDMFD	sp!, {r4-r9, sl, fp, pc}^



; erase_hand
; a leaf APCS function
;
; C prototype:
; void erase_hand(void *area, void *spr, int x, int y);
;
; nb  assumes fits on screen & no clipping needed
; nb2 also assumes sprite is multiple of 8 pixels wide, is 4bpp & screen mode is 640 pixels wide
; ignore sprite mask if it has one, but treat colour 0 pixels as transparent;
; also, treat screen pixels of colours 8 to 15 as lying infront of hand sprite
;
	EXPORT	erase_hand

ehnsta	DCB	"erase_hand", 0
	ALIGN
ehnend	DCD	&ff000000 + ehnend - ehnsta

ehsp	DCD	0

erase_hand

	STMFD	sp!, {r4-r9, sl, fp, lr}
	STR	sp, ehsp
	ADRL	r4, vbls
	LDMIA	r4, {r4-r9}
	LDR	r4, [rbank]
	SUB	r4, r4, #1
	LDR	r5, [rscrst, r4, LSL #2]	; screen base addr for VDU output
	LDR	rox, [rox]
	LDR	roy, [roy]
	LDR	rlx, [rlx]
	LDR	rly, [rly]
	ADD	r10, x, rox
	RSB	r11, y, roy
	MOV	r10, r10, ASR rlx		; x pixel coord rel left screen } of bottom left
	MOV	r11, r11, ASR rly		; y pixel coord rel top screen  } of object
	CMP	r10, #25			; constain to be not off left side screen
	MOVLT	r10, #25
	LDR	r12, [spr, #width]
	ADD	r12, r12, #1			; width in words
	ADD	r14, r10, r12, ASL #3
	CMP	r14, #612
	MOVGT	r14, r12, ASL #3		; constrain to be not off right side screen
	RSBGT	r10, r14, #612
	LDR	r14, [spr, #height]
	SUB	r11, r11, r14
	ADD	r11, r11, r11, ASL #2
	ADD	r5, r5, r11, ASL #6
	AND	r0, r10, #7
	BIC	r10, r10, #7
	ADD	r5, r5, r10, ASR #1		; screen top left of hand
	ADD	r6, r14, #1			; number of rows to plot
	MOV	r0, r0, ASL #2
	RSB	r1, r0, #32
	MOV	r14, #&88
	ORR	r14, r14, r14, LSL #8
	ORR	r14, r14, r14, LSL #16		; masking constant &88888888
eh_nextrow
	MOV	r10, r5				; start of current row on screen
	MOV	r11, r12			; number of cols to plot
eh_nextcol
	LDR	r8, [r10]			; screen data
	AND	r9, r8, r14
	ORR	r9, r9, r9, LSR #1
	ORR	r9, r9, r9, LSR #2
	AND	r8, r8, r9
	STR	r8, [r10], #4
	SUBS	r11, r11, #1
	BLE	eh_endcol
	LDR	r8, [r10]			; screen data
	AND	r9, r8, r14
	ORR	r9, r9, r9, LSR #1
	ORR	r9, r9, r9, LSR #2
	AND	r8, r8, r9
	STR	r8, [r10], #4
	SUBS	r11, r11, #1
	BLE	eh_endcol
	LDR	r8, [r10]			; screen data
	AND	r9, r8, r14
	ORR	r9, r9, r9, LSR #1
	ORR	r9, r9, r9, LSR #2
	AND	r8, r8, r9
	STR	r8, [r10], #4
	SUBS	r11, r11, #1
	BLE	eh_endcol
	LDR	r8, [r10]			; screen data
	AND	r9, r8, r14
	ORR	r9, r9, r9, LSR #1
	ORR	r9, r9, r9, LSR #2
	AND	r8, r8, r9
	STR	r8, [r10], #4
	SUBS	r11, r11, #1
	BGT	eh_nextcol
eh_endcol
	CMP	r0, #0
	LDRNE	r8, [r10]			; screen data
	ANDNE	r9, r8, r14
	ORRNE	r9, r9, r9, LSR #1
	ORRNE	r9, r9, r9, LSR #2
	ANDNE	r8, r8, r9
	STRNE	r8, [r10], #4
	ADD	r5, r5, #320
	SUBS	r6, r6, #1
	BGT	eh_nextrow

eh_exit	LDR	sp, ehsp
	LDMFD	sp!, {r4-r9, sl, fp, pc}^



; erase_number
; a leaf APCS function
;
; C prototype:
; void erase_number(void *area, void *spr, int x, int y);
;
; actually this fn plots a 32 x ht sprite on screen over the number - sprite
; should be set up before to a copy of the background behind the number
; (ht = 32 if vga else 16)
;
; nb  assumes fits on screen & can do a fast plot with no clipping
; also that is being printed at a word aligned address (ie x is a multiple of 8)
; assumes sprite is 32 by ht pixels, 4bpp & screen mode is 640 pixels wide
;
	EXPORT	erase_number

ennsta	DCB	"erase_number", 0
	ALIGN
ennend	DCD	&ff000000 + ennend - ennsta

erase_number

	STMFD	sp!, {r4-r9, sl, fp, lr}
	ADRL	r4, vbls
	LDMIA	r4, {r4-r9}
	LDR	r4, [rbank]
	SUB	r4, r4, #1
	LDR	r5, [rscrst, r4, LSL #2]	; screen base addr for VDU output
	LDR	rox, [rox]
	LDR	roy, [roy]
	LDR	rlx, [rlx]
	LDR	rly, [rly]
	ADD	r10, x, rox
	RSB	r11, y, roy
	SUB	r11, r11, #64
	MOV	r10, r10, ASR rlx		; x pixel coord rel left screen } of top left
	MOV	r11, r11, ASR rly		; y pixel coord rel top screen  } of object
	ADD	r11, r11, #1
	ADD	r11, r11, r11, ASL #2
	ADD	r5, r5, r11, ASL #6
	BIC	r10, r10, #7
	ADD	r5, r5, r10, ASR #1		; screen top left of number
	LDR	r4, [spr, #image]
	ADD	r4, spr, r4			; sprite top left
	MOV	r3, #32
	MOV	r3, r3, ASR rly
en_loop	LDMIA	r4!, {r6,r7,r8,r9}
	STMIA   r5, {r6,r7,r8,r9}
	ADD	r5, r5, #320
	LDMIA	r4!, {r6,r7,r8,r9}
	STMIA   r5, {r6,r7,r8,r9}
	ADD	r5, r5, #320
	SUBS	r3, r3, #1
	BNE	en_loop
en_exit	LDMFD	sp!, {r4-r9, sl, fp, pc}^



; erase_bar
; a leaf APCS function
;
; C prototype:
; void erase_bar(int h, void *spr, int x, int y);
;
; actually this fn plots a 320 x h sprite on screen over the bar region - sprite
; should be set up before to a copy of the background behind the bar
;
; nb  assumes fits on screen & can do a fast plot with no clipping
; also that is being printed at a word aligned address (ie x is a multiple of 8)
; assumes sprite is 320 by (h>>rly) pixels, 4bpp & screen mode is 640 pixels wide
;
	EXPORT	erase_bar

ebnsta	DCB	"erase_bar", 0
	ALIGN
ebnend	DCD	&ff000000 + ebnend - ebnsta

erase_bar

	STMFD	sp!, {r4-r9, sl, fp, lr}
	ADRL	r4, vbls
	LDMIA	r4, {r4-r9}
	LDR	r4, [rbank]
	SUB	r4, r4, #1
	LDR	r5, [rscrst, r4, LSL #2]	; screen base addr for VDU output
	LDR	rox, [rox]
	LDR	roy, [roy]
	LDR	rlx, [rlx]
	LDR	rly, [rly]
	ADD	r10, x, rox
	RSB	r11, y, roy
	SUB	r11, r11, h
	MOV	r10, r10, ASR rlx		; x pixel coord rel left screen } of top left
	MOV	r11, r11, ASR rly		; y pixel coord rel top screen  } of object
	ADD	r11, r11, #1
	ADD	r11, r11, r11, ASL #2
	ADD	r5, r5, r11, ASL #6
	BIC	r10, r10, #7
	ADD	r2, r5, r10, ASR #1		; screen top left of number
	LDR	r4, [spr, #image]
	ADD	r1, spr, r4			; sprite top left
	MOV	h, h, ASR rly
eb_loop	LDMIA	r1!, {r3-r12}
	STMIA   r2!, {r3-r12}
	LDMIA	r1!, {r3-r12}
	STMIA   r2!, {r3-r12}
	LDMIA	r1!, {r3-r12}
	STMIA   r2!, {r3-r12}
	LDMIA	r1!, {r3-r12}
	STMIA   r2!, {r3-r12}
	ADD	r2, r2, #320-160
	SUBS	h, h, #1
	BNE	eb_loop
eb_exit	LDMFD	sp!, {r4-r9, sl, fp, pc}^



	END
00000000  0a 09 5e 09 30 0a 6e 65  78 74 09 23 09 34 0a 6e  |..^.0.next.#.4.n|
00000010  61 6d 65 09 23 09 31 32  0a 77 69 64 74 68 09 23  |ame.#.12.width.#|
00000020  09 34 0a 68 65 69 67 68  74 09 23 09 34 0a 6c 62  |.4.height.#.4.lb|
00000030  69 74 09 23 09 34 0a 72  62 69 74 09 23 09 34 0a  |it.#.4.rbit.#.4.|
00000040  69 6d 61 67 65 09 23 09  34 0a 6d 61 73 6b 09 23  |image.#.4.mask.#|
00000050  09 34 0a 6d 6f 64 65 09  23 09 34 0a 0a 72 62 61  |.4.mode.#.4..rba|
00000060  6e 6b 09 52 4e 09 72 34  0a 72 73 63 72 73 74 09  |nk.RN.r4.rscrst.|
00000070  52 4e 09 72 35 0a 72 6f  78 09 52 4e 09 72 36 0a  |RN.r5.rox.RN.r6.|
00000080  72 6f 79 09 52 4e 09 72  37 0a 72 6c 78 09 52 4e  |roy.RN.r7.rlx.RN|
00000090  09 72 38 0a 72 6c 79 09  52 4e 09 72 39 0a 0a 61  |.r8.rly.RN.r9..a|
000000a0  72 65 61 09 52 4e 09 61  31 0a 73 70 72 09 52 4e  |rea.RN.a1.spr.RN|
000000b0  09 61 32 0a 78 09 52 4e  09 61 33 0a 79 09 52 4e  |.a2.x.RN.a3.y.RN|
000000c0  09 61 34 0a 0a 73 70 72  5f 65 09 52 4e 09 61 31  |.a4..spr_e.RN.a1|
000000d0  0a 78 5f 65 09 52 4e 09  61 32 0a 79 5f 65 09 52  |.x_e.RN.a2.y_e.R|
000000e0  4e 09 61 33 0a 0a 78 5f  72 09 52 4e 09 61 31 0a  |N.a3..x_r.RN.a1.|
000000f0  79 5f 72 09 52 4e 09 61  32 0a 77 5f 72 09 52 4e  |y_r.RN.a2.w_r.RN|
00000100  09 61 33 0a 68 5f 72 09  52 4e 09 61 34 0a 63 5f  |.a3.h_r.RN.a4.c_|
00000110  72 09 52 4e 09 72 31 32  0a 0a 68 09 52 4e 09 61  |r.RN.r12..h.RN.a|
00000120  31 0a 0a 09 49 4d 50 4f  52 54 09 62 61 6e 6b 0a  |1...IMPORT.bank.|
00000130  09 49 4d 50 4f 52 54 09  73 63 72 73 74 0a 09 49  |.IMPORT.scrst..I|
00000140  4d 50 4f 52 54 09 6f 72  69 67 69 6e 78 0a 09 49  |MPORT.originx..I|
00000150  4d 50 4f 52 54 09 6f 72  69 67 69 6e 79 0a 09 49  |MPORT.originy..I|
00000160  4d 50 4f 52 54 09 6c 78  0a 09 49 4d 50 4f 52 54  |MPORT.lx..IMPORT|
00000170  09 6c 79 0a 0a 76 62 6c  73 09 44 43 44 09 62 61  |.ly..vbls.DCD.ba|
00000180  6e 6b 2c 20 73 63 72 73  74 2c 20 6f 72 69 67 69  |nk, scrst, origi|
00000190  6e 78 2c 20 6f 72 69 67  69 6e 79 2c 20 6c 78 2c  |nx, originy, lx,|
000001a0  20 6c 79 0a 0a 3b 20 70  6c 6f 74 5f 62 72 6f 6c  | ly..; plot_brol|
000001b0  6c 79 0a 3b 20 61 20 6c  65 61 66 20 41 50 43 53  |ly.; a leaf APCS|
000001c0  20 66 75 6e 63 74 69 6f  6e 0a 3b 0a 3b 20 43 20  | function.;.; C |
000001d0  70 72 6f 74 6f 74 79 70  65 3a 0a 3b 20 76 6f 69  |prototype:.; voi|
000001e0  64 20 70 6c 6f 74 5f 62  72 6f 6c 6c 79 28 76 6f  |d plot_brolly(vo|
000001f0  69 64 20 2a 61 72 65 61  2c 20 76 6f 69 64 20 2a  |id *area, void *|
00000200  73 70 72 2c 20 69 6e 74  20 78 2c 20 69 6e 74 20  |spr, int x, int |
00000210  79 29 3b 0a 3b 0a 3b 20  6e 62 20 20 61 73 73 75  |y);.;.; nb  assu|
00000220  6d 65 73 20 66 69 74 73  20 76 65 72 74 69 63 61  |mes fits vertica|
00000230  6c 6c 79 20 6f 6e 20 73  63 72 65 65 6e 20 62 75  |lly on screen bu|
00000240  74 20 6d 61 79 20 6c 69  65 20 6f 66 66 20 65 69  |t may lie off ei|
00000250  74 68 65 72 20 73 69 64  65 20 28 69 6e 20 77 68  |ther side (in wh|
00000260  69 63 68 20 63 61 73 65  20 6f 73 70 6c 6f 74 20  |ich case osplot |
00000270  75 73 65 64 29 0a 3b 20  20 20 20 20 65 6c 73 65  |used).;     else|
00000280  20 6c 69 65 73 20 6f 6e  20 73 63 72 65 65 6e 20  | lies on screen |
00000290  26 20 63 61 6e 20 64 6f  20 61 20 66 61 73 74 20  |& can do a fast |
000002a0  70 6c 6f 74 20 77 69 74  68 20 6e 6f 20 63 6c 69  |plot with no cli|
000002b0  70 70 69 6e 67 0a 3b 20  6e 62 32 20 61 6c 73 6f  |pping.; nb2 also|
000002c0  20 61 73 73 75 6d 65 73  20 73 70 72 69 74 65 20  | assumes sprite |
000002d0  69 73 20 6d 75 6c 74 69  70 6c 65 20 6f 66 20 38  |is multiple of 8|
000002e0  20 70 69 78 65 6c 73 20  77 69 64 65 2c 20 69 73  | pixels wide, is|
000002f0  20 34 62 70 70 20 26 20  73 63 72 65 65 6e 20 6d  | 4bpp & screen m|
00000300  6f 64 65 20 69 73 20 36  34 30 20 70 69 78 65 6c  |ode is 640 pixel|
00000310  73 20 77 69 64 65 0a 3b  0a 09 45 58 50 4f 52 54  |s wide.;..EXPORT|
00000320  09 70 6c 6f 74 5f 62 72  6f 6c 6c 79 0a 0a 70 62  |.plot_brolly..pb|
00000330  6e 73 74 61 09 44 43 42  09 22 70 6c 6f 74 5f 62  |nsta.DCB."plot_b|
00000340  72 6f 6c 6c 79 22 2c 20  30 0a 09 41 4c 49 47 4e  |rolly", 0..ALIGN|
00000350  0a 70 62 6e 65 6e 64 09  44 43 44 09 26 66 66 30  |.pbnend.DCD.&ff0|
00000360  30 30 30 30 30 20 2b 20  70 62 6e 65 6e 64 20 2d  |00000 + pbnend -|
00000370  20 70 62 6e 73 74 61 0a  0a 70 6c 6f 74 5f 62 72  | pbnsta..plot_br|
00000380  6f 6c 6c 79 0a 0a 09 53  54 4d 46 44 09 73 70 21  |olly...STMFD.sp!|
00000390  2c 20 7b 72 34 2d 72 39  2c 20 73 6c 2c 20 66 70  |, {r4-r9, sl, fp|
000003a0  2c 20 6c 72 7d 0a 09 41  44 52 09 72 34 2c 20 76  |, lr}..ADR.r4, v|
000003b0  62 6c 73 0a 09 4c 44 4d  49 41 09 72 34 2c 20 7b  |bls..LDMIA.r4, {|
000003c0  72 34 2d 72 39 7d 0a 09  4c 44 52 09 72 34 2c 20  |r4-r9}..LDR.r4, |
000003d0  5b 72 62 61 6e 6b 5d 0a  09 53 55 42 09 72 34 2c  |[rbank]..SUB.r4,|
000003e0  20 72 34 2c 20 23 31 0a  09 4c 44 52 09 72 35 2c  | r4, #1..LDR.r5,|
000003f0  20 5b 72 73 63 72 73 74  2c 20 72 34 2c 20 4c 53  | [rscrst, r4, LS|
00000400  4c 20 23 32 5d 09 3b 20  73 63 72 65 65 6e 20 62  |L #2].; screen b|
00000410  61 73 65 20 61 64 64 72  20 66 6f 72 20 56 44 55  |ase addr for VDU|
00000420  20 6f 75 74 70 75 74 0a  09 4c 44 52 09 72 6f 78  | output..LDR.rox|
00000430  2c 20 5b 72 6f 78 5d 0a  09 4c 44 52 09 72 6f 79  |, [rox]..LDR.roy|
00000440  2c 20 5b 72 6f 79 5d 0a  09 4c 44 52 09 72 6c 78  |, [roy]..LDR.rlx|
00000450  2c 20 5b 72 6c 78 5d 0a  09 4c 44 52 09 72 6c 79  |, [rlx]..LDR.rly|
00000460  2c 20 5b 72 6c 79 5d 0a  09 41 44 44 09 72 31 30  |, [rly]..ADD.r10|
00000470  2c 20 78 2c 20 72 6f 78  0a 09 52 53 42 09 72 31  |, x, rox..RSB.r1|
00000480  31 2c 20 79 2c 20 72 6f  79 0a 09 4d 4f 56 53 09  |1, y, roy..MOVS.|
00000490  72 31 30 2c 20 72 31 30  2c 20 41 53 52 20 72 6c  |r10, r10, ASR rl|
000004a0  78 09 09 3b 20 78 20 70  69 78 65 6c 20 63 6f 6f  |x..; x pixel coo|
000004b0  72 64 20 72 65 6c 20 6c  65 66 74 20 73 63 72 65  |rd rel left scre|
000004c0  65 6e 20 7d 20 6f 66 20  62 6f 74 74 6f 6d 20 6c  |en } of bottom l|
000004d0  65 66 74 0a 09 4d 4f 56  09 72 31 31 2c 20 72 31  |eft..MOV.r11, r1|
000004e0  31 2c 20 41 53 52 20 72  6c 79 09 09 3b 20 79 20  |1, ASR rly..; y |
000004f0  70 69 78 65 6c 20 63 6f  6f 72 64 20 72 65 6c 20  |pixel coord rel |
00000500  74 6f 70 20 73 63 72 65  65 6e 20 20 7d 20 6f 66  |top screen  } of|
00000510  20 6f 62 6a 65 63 74 0a  09 42 4d 49 09 70 62 5f  | object..BMI.pb_|
00000520  75 73 65 6f 73 70 6c 6f  74 0a 09 4c 44 52 09 72  |useosplot..LDR.r|
00000530  31 32 2c 20 5b 73 70 72  2c 20 23 77 69 64 74 68  |12, [spr, #width|
00000540  5d 0a 09 41 44 44 09 72  31 32 2c 20 72 31 32 2c  |]..ADD.r12, r12,|
00000550  20 23 31 09 09 09 3b 20  77 69 64 74 68 20 69 6e  | #1...; width in|
00000560  20 77 6f 72 64 73 0a 09  41 44 44 09 72 31 34 2c  | words..ADD.r14,|
00000570  20 72 31 30 2c 20 72 31  32 2c 20 41 53 4c 20 23  | r10, r12, ASL #|
00000580  33 0a 09 43 4d 50 09 72  31 34 2c 20 23 36 34 30  |3..CMP.r14, #640|
00000590  0a 09 42 4c 45 09 70 62  5f 75 73 65 66 61 73 74  |..BLE.pb_usefast|
000005a0  70 6c 6f 74 0a 70 62 5f  75 73 65 6f 73 70 6c 6f  |plot.pb_useosplo|
000005b0  74 0a 09 4d 4f 56 09 72  35 2c 20 23 30 0a 09 4d  |t..MOV.r5, #0..M|
000005c0  4f 56 09 72 34 2c 20 79  0a 09 4d 4f 56 09 72 33  |OV.r4, y..MOV.r3|
000005d0  2c 20 78 0a 09 4d 4f 56  09 72 32 2c 20 73 70 72  |, x..MOV.r2, spr|
000005e0  0a 09 4d 4f 56 09 72 31  2c 20 61 72 65 61 0a 09  |..MOV.r1, area..|
000005f0  4d 4f 56 09 72 30 2c 20  23 35 31 32 0a 09 41 44  |MOV.r0, #512..AD|
00000600  44 09 72 30 2c 20 72 30  2c 20 23 33 34 0a 09 53  |D.r0, r0, #34..S|
00000610  57 49 09 58 4f 53 5f 53  70 72 69 74 65 4f 70 0a  |WI.XOS_SpriteOp.|
00000620  09 42 09 70 62 5f 65 78  69 74 0a 70 62 5f 75 73  |.B.pb_exit.pb_us|
00000630  65 66 61 73 74 70 6c 6f  74 0a 09 4c 44 52 09 72  |efastplot..LDR.r|
00000640  31 34 2c 20 5b 73 70 72  2c 20 23 68 65 69 67 68  |14, [spr, #heigh|
00000650  74 5d 0a 09 53 55 42 09  72 31 31 2c 20 72 31 31  |t]..SUB.r11, r11|
00000660  2c 20 72 31 34 0a 09 41  44 44 09 72 31 31 2c 20  |, r14..ADD.r11, |
00000670  72 31 31 2c 20 72 31 31  2c 20 41 53 4c 20 23 32  |r11, r11, ASL #2|
00000680  0a 09 41 44 44 09 72 35  2c 20 72 35 2c 20 72 31  |..ADD.r5, r5, r1|
00000690  31 2c 20 41 53 4c 20 23  36 0a 09 41 4e 44 09 72  |1, ASL #6..AND.r|
000006a0  30 2c 20 72 31 30 2c 20  23 37 0a 09 42 49 43 09  |0, r10, #7..BIC.|
000006b0  72 31 30 2c 20 72 31 30  2c 20 23 37 0a 09 41 44  |r10, r10, #7..AD|
000006c0  44 09 72 35 2c 20 72 35  2c 20 72 31 30 2c 20 41  |D.r5, r5, r10, A|
000006d0  53 52 20 23 31 09 09 3b  20 73 63 72 65 65 6e 20  |SR #1..; screen |
000006e0  74 6f 70 20 6c 65 66 74  20 6f 66 20 62 72 6f 6c  |top left of brol|
000006f0  6c 79 0a 09 4c 44 52 09  72 34 2c 20 5b 73 70 72  |ly..LDR.r4, [spr|
00000700  2c 20 23 69 6d 61 67 65  5d 0a 09 41 44 44 09 72  |, #image]..ADD.r|
00000710  34 2c 20 73 70 72 2c 20  72 34 09 09 09 3b 20 62  |4, spr, r4...; b|
00000720  72 6f 6c 6c 79 20 73 70  72 69 74 65 20 74 6f 70  |rolly sprite top|
00000730  20 6c 65 66 74 0a 09 41  44 44 09 72 36 2c 20 72  | left..ADD.r6, r|
00000740  31 34 2c 20 23 31 09 09  09 3b 20 6e 75 6d 62 65  |14, #1...; numbe|
00000750  72 20 6f 66 20 72 6f 77  73 20 74 6f 20 70 6c 6f  |r of rows to plo|
00000760  74 0a 09 4d 4f 56 09 72  30 2c 20 72 30 2c 20 41  |t..MOV.r0, r0, A|
00000770  53 4c 20 23 32 0a 09 52  53 42 09 72 31 2c 20 72  |SL #2..RSB.r1, r|
00000780  30 2c 20 23 33 32 0a 70  62 5f 6e 65 78 74 72 6f  |0, #32.pb_nextro|
00000790  77 0a 09 4d 4f 56 09 72  37 2c 20 72 34 09 09 09  |w..MOV.r7, r4...|
000007a0  09 3b 20 73 74 61 72 74  20 6f 66 20 63 75 72 72  |.; start of curr|
000007b0  65 6e 74 20 72 6f 77 20  69 6e 20 73 70 72 69 74  |ent row in sprit|
000007c0  65 0a 09 4d 4f 56 09 72  31 30 2c 20 72 35 09 09  |e..MOV.r10, r5..|
000007d0  09 09 3b 20 73 74 61 72  74 20 6f 66 20 63 75 72  |..; start of cur|
000007e0  72 65 6e 74 20 72 6f 77  20 6f 6e 20 73 63 72 65  |rent row on scre|
000007f0  65 6e 0a 09 4d 4f 56 09  72 31 31 2c 20 72 31 32  |en..MOV.r11, r12|
00000800  09 09 09 3b 20 6e 75 6d  62 65 72 20 6f 66 20 63  |...; number of c|
00000810  6f 6c 73 20 74 6f 20 70  6c 6f 74 0a 09 4d 4f 56  |ols to plot..MOV|
00000820  09 72 32 2c 20 23 30 0a  70 62 5f 6e 65 78 74 63  |.r2, #0.pb_nextc|
00000830  6f 6c 0a 09 4c 44 52 09  72 38 2c 20 5b 72 37 5d  |ol..LDR.r8, [r7]|
00000840  2c 20 23 34 0a 09 4f 52  52 09 72 39 2c 20 72 32  |, #4..ORR.r9, r2|
00000850  2c 20 72 38 2c 20 4c 53  4c 20 72 30 0a 09 4d 4f  |, r8, LSL r0..MO|
00000860  56 09 72 32 2c 20 72 38  2c 20 4c 53 52 20 72 31  |V.r2, r8, LSR r1|
00000870  0a 09 53 54 52 09 72 39  2c 20 5b 72 31 30 5d 2c  |..STR.r9, [r10],|
00000880  20 23 34 0a 09 53 55 42  53 09 72 31 31 2c 20 72  | #4..SUBS.r11, r|
00000890  31 31 2c 20 23 31 0a 09  42 4c 45 09 70 62 5f 65  |11, #1..BLE.pb_e|
000008a0  6e 64 63 6f 6c 0a 09 4c  44 52 09 72 38 2c 20 5b  |ndcol..LDR.r8, [|
000008b0  72 37 5d 2c 20 23 34 0a  09 4f 52 52 09 72 39 2c  |r7], #4..ORR.r9,|
000008c0  20 72 32 2c 20 72 38 2c  20 4c 53 4c 20 72 30 0a  | r2, r8, LSL r0.|
000008d0  09 4d 4f 56 09 72 32 2c  20 72 38 2c 20 4c 53 52  |.MOV.r2, r8, LSR|
000008e0  20 72 31 0a 09 53 54 52  09 72 39 2c 20 5b 72 31  | r1..STR.r9, [r1|
000008f0  30 5d 2c 20 23 34 0a 09  53 55 42 53 09 72 31 31  |0], #4..SUBS.r11|
00000900  2c 20 72 31 31 2c 20 23  31 0a 09 42 4c 45 09 70  |, r11, #1..BLE.p|
00000910  62 5f 65 6e 64 63 6f 6c  0a 09 4c 44 52 09 72 38  |b_endcol..LDR.r8|
00000920  2c 20 5b 72 37 5d 2c 20  23 34 0a 09 4f 52 52 09  |, [r7], #4..ORR.|
00000930  72 39 2c 20 72 32 2c 20  72 38 2c 20 4c 53 4c 20  |r9, r2, r8, LSL |
00000940  72 30 0a 09 4d 4f 56 09  72 32 2c 20 72 38 2c 20  |r0..MOV.r2, r8, |
00000950  4c 53 52 20 72 31 0a 09  53 54 52 09 72 39 2c 20  |LSR r1..STR.r9, |
00000960  5b 72 31 30 5d 2c 20 23  34 0a 09 53 55 42 53 09  |[r10], #4..SUBS.|
00000970  72 31 31 2c 20 72 31 31  2c 20 23 31 0a 09 42 4c  |r11, r11, #1..BL|
00000980  45 09 70 62 5f 65 6e 64  63 6f 6c 0a 09 4c 44 52  |E.pb_endcol..LDR|
00000990  09 72 38 2c 20 5b 72 37  5d 2c 20 23 34 0a 09 4f  |.r8, [r7], #4..O|
000009a0  52 52 09 72 39 2c 20 72  32 2c 20 72 38 2c 20 4c  |RR.r9, r2, r8, L|
000009b0  53 4c 20 72 30 0a 09 4d  4f 56 09 72 32 2c 20 72  |SL r0..MOV.r2, r|
000009c0  38 2c 20 4c 53 52 20 72  31 0a 09 53 54 52 09 72  |8, LSR r1..STR.r|
000009d0  39 2c 20 5b 72 31 30 5d  2c 20 23 34 0a 09 53 55  |9, [r10], #4..SU|
000009e0  42 53 09 72 31 31 2c 20  72 31 31 2c 20 23 31 0a  |BS.r11, r11, #1.|
000009f0  09 42 47 54 09 70 62 5f  6e 65 78 74 63 6f 6c 0a  |.BGT.pb_nextcol.|
00000a00  70 62 5f 65 6e 64 63 6f  6c 0a 09 43 4d 50 09 72  |pb_endcol..CMP.r|
00000a10  30 2c 20 23 30 0a 09 53  54 52 4e 45 09 72 32 2c  |0, #0..STRNE.r2,|
00000a20  20 5b 72 31 30 5d 2c 20  23 34 0a 09 41 44 44 09  | [r10], #4..ADD.|
00000a30  72 34 2c 20 72 34 2c 20  72 31 32 2c 20 4c 53 4c  |r4, r4, r12, LSL|
00000a40  20 23 32 0a 09 41 44 44  09 72 35 2c 20 72 35 2c  | #2..ADD.r5, r5,|
00000a50  20 23 33 32 30 0a 09 53  55 42 53 09 72 36 2c 20  | #320..SUBS.r6, |
00000a60  72 36 2c 20 23 31 0a 09  42 47 54 09 70 62 5f 6e  |r6, #1..BGT.pb_n|
00000a70  65 78 74 72 6f 77 0a 0a  70 62 5f 65 78 69 74 09  |extrow..pb_exit.|
00000a80  4c 44 4d 46 44 09 73 70  21 2c 20 7b 72 34 2d 72  |LDMFD.sp!, {r4-r|
00000a90  39 2c 20 73 6c 2c 20 66  70 2c 20 70 63 7d 5e 0a  |9, sl, fp, pc}^.|
00000aa0  0a 0a 0a 3b 20 70 6c 6f  74 5f 68 61 6e 64 0a 3b  |...; plot_hand.;|
00000ab0  20 61 20 6c 65 61 66 20  41 50 43 53 20 66 75 6e  | a leaf APCS fun|
00000ac0  63 74 69 6f 6e 0a 3b 0a  3b 20 43 20 70 72 6f 74  |ction.;.; C prot|
00000ad0  6f 74 79 70 65 3a 0a 3b  20 76 6f 69 64 20 70 6c  |otype:.; void pl|
00000ae0  6f 74 5f 68 61 6e 64 28  76 6f 69 64 20 2a 61 72  |ot_hand(void *ar|
00000af0  65 61 2c 20 76 6f 69 64  20 2a 73 70 72 2c 20 69  |ea, void *spr, i|
00000b00  6e 74 20 78 2c 20 69 6e  74 20 79 29 3b 0a 3b 0a  |nt x, int y);.;.|
00000b10  3b 20 6e 62 20 20 61 73  73 75 6d 65 73 20 66 69  |; nb  assumes fi|
00000b20  74 73 20 6f 6e 20 73 63  72 65 65 6e 20 26 20 63  |ts on screen & c|
00000b30  61 6e 20 64 6f 20 61 20  66 61 73 74 20 70 6c 6f  |an do a fast plo|
00000b40  74 20 77 69 74 68 20 6e  6f 20 63 6c 69 70 70 69  |t with no clippi|
00000b50  6e 67 0a 3b 20 6e 62 32  20 61 6c 73 6f 20 61 73  |ng.; nb2 also as|
00000b60  73 75 6d 65 73 20 73 70  72 69 74 65 20 69 73 20  |sumes sprite is |
00000b70  6d 75 6c 74 69 70 6c 65  20 6f 66 20 38 20 70 69  |multiple of 8 pi|
00000b80  78 65 6c 73 20 77 69 64  65 2c 20 69 73 20 34 62  |xels wide, is 4b|
00000b90  70 70 20 26 20 73 63 72  65 65 6e 20 6d 6f 64 65  |pp & screen mode|
00000ba0  20 69 73 20 36 34 30 20  70 69 78 65 6c 73 20 77  | is 640 pixels w|
00000bb0  69 64 65 0a 3b 20 69 67  6e 6f 72 65 20 73 70 72  |ide.; ignore spr|
00000bc0  69 74 65 20 6d 61 73 6b  20 69 66 20 69 74 20 68  |ite mask if it h|
00000bd0  61 73 20 6f 6e 65 2c 20  62 75 74 20 74 72 65 61  |as one, but trea|
00000be0  74 20 63 6f 6c 6f 75 72  20 30 20 70 69 78 65 6c  |t colour 0 pixel|
00000bf0  73 20 61 73 20 74 72 61  6e 73 70 61 72 65 6e 74  |s as transparent|
00000c00  3b 0a 3b 20 61 6c 73 6f  2c 20 74 72 65 61 74 20  |;.; also, treat |
00000c10  73 63 72 65 65 6e 20 70  69 78 65 6c 73 20 6f 66  |screen pixels of|
00000c20  20 63 6f 6c 6f 75 72 73  20 38 20 74 6f 20 31 35  | colours 8 to 15|
00000c30  20 61 73 20 6c 79 69 6e  67 20 69 6e 66 72 6f 6e  | as lying infron|
00000c40  74 20 6f 66 20 68 61 6e  64 20 73 70 72 69 74 65  |t of hand sprite|
00000c50  0a 3b 0a 09 45 58 50 4f  52 54 09 70 6c 6f 74 5f  |.;..EXPORT.plot_|
00000c60  68 61 6e 64 0a 0a 70 68  6e 73 74 61 09 44 43 42  |hand..phnsta.DCB|
00000c70  09 22 70 6c 6f 74 5f 68  61 6e 64 22 2c 20 30 0a  |."plot_hand", 0.|
00000c80  09 41 4c 49 47 4e 0a 70  68 6e 65 6e 64 09 44 43  |.ALIGN.phnend.DC|
00000c90  44 09 26 66 66 30 30 30  30 30 30 20 2b 20 70 68  |D.&ff000000 + ph|
00000ca0  6e 65 6e 64 20 2d 20 70  68 6e 73 74 61 0a 0a 70  |nend - phnsta..p|
00000cb0  68 73 70 09 44 43 44 09  30 0a 0a 70 6c 6f 74 5f  |hsp.DCD.0..plot_|
00000cc0  68 61 6e 64 0a 0a 09 53  54 4d 46 44 09 73 70 21  |hand...STMFD.sp!|
00000cd0  2c 20 7b 72 34 2d 72 39  2c 20 73 6c 2c 20 66 70  |, {r4-r9, sl, fp|
00000ce0  2c 20 6c 72 7d 0a 09 53  54 52 09 73 70 2c 20 70  |, lr}..STR.sp, p|
00000cf0  68 73 70 0a 09 41 44 52  09 72 34 2c 20 76 62 6c  |hsp..ADR.r4, vbl|
00000d00  73 0a 09 4c 44 4d 49 41  09 72 34 2c 20 7b 72 34  |s..LDMIA.r4, {r4|
00000d10  2d 72 39 7d 0a 09 4c 44  52 09 72 34 2c 20 5b 72  |-r9}..LDR.r4, [r|
00000d20  62 61 6e 6b 5d 0a 09 53  55 42 09 72 34 2c 20 72  |bank]..SUB.r4, r|
00000d30  34 2c 20 23 31 0a 09 4c  44 52 09 72 35 2c 20 5b  |4, #1..LDR.r5, [|
00000d40  72 73 63 72 73 74 2c 20  72 34 2c 20 4c 53 4c 20  |rscrst, r4, LSL |
00000d50  23 32 5d 09 3b 20 73 63  72 65 65 6e 20 62 61 73  |#2].; screen bas|
00000d60  65 20 61 64 64 72 20 66  6f 72 20 56 44 55 20 6f  |e addr for VDU o|
00000d70  75 74 70 75 74 0a 09 4c  44 52 09 72 6f 78 2c 20  |utput..LDR.rox, |
00000d80  5b 72 6f 78 5d 0a 09 4c  44 52 09 72 6f 79 2c 20  |[rox]..LDR.roy, |
00000d90  5b 72 6f 79 5d 0a 09 4c  44 52 09 72 6c 78 2c 20  |[roy]..LDR.rlx, |
00000da0  5b 72 6c 78 5d 0a 09 4c  44 52 09 72 6c 79 2c 20  |[rlx]..LDR.rly, |
00000db0  5b 72 6c 79 5d 0a 09 41  44 44 09 72 31 30 2c 20  |[rly]..ADD.r10, |
00000dc0  78 2c 20 72 6f 78 0a 09  52 53 42 09 72 31 31 2c  |x, rox..RSB.r11,|
00000dd0  20 79 2c 20 72 6f 79 0a  09 4d 4f 56 09 72 31 30  | y, roy..MOV.r10|
00000de0  2c 20 72 31 30 2c 20 41  53 52 20 72 6c 78 09 09  |, r10, ASR rlx..|
00000df0  3b 20 78 20 70 69 78 65  6c 20 63 6f 6f 72 64 20  |; x pixel coord |
00000e00  72 65 6c 20 6c 65 66 74  20 73 63 72 65 65 6e 20  |rel left screen |
00000e10  7d 20 6f 66 20 62 6f 74  74 6f 6d 20 6c 65 66 74  |} of bottom left|
00000e20  0a 09 4d 4f 56 09 72 31  31 2c 20 72 31 31 2c 20  |..MOV.r11, r11, |
00000e30  41 53 52 20 72 6c 79 09  09 3b 20 79 20 70 69 78  |ASR rly..; y pix|
00000e40  65 6c 20 63 6f 6f 72 64  20 72 65 6c 20 74 6f 70  |el coord rel top|
00000e50  20 73 63 72 65 65 6e 20  20 7d 20 6f 66 20 6f 62  | screen  } of ob|
00000e60  6a 65 63 74 0a 09 43 4d  50 09 72 31 30 2c 20 23  |ject..CMP.r10, #|
00000e70  32 35 09 09 09 3b 20 63  6f 6e 73 74 61 69 6e 20  |25...; constain |
00000e80  74 6f 20 62 65 20 6e 6f  74 20 6f 66 66 20 6c 65  |to be not off le|
00000e90  66 74 20 73 69 64 65 20  73 63 72 65 65 6e 0a 09  |ft side screen..|
00000ea0  4d 4f 56 4c 54 09 72 31  30 2c 20 23 32 35 0a 09  |MOVLT.r10, #25..|
00000eb0  4c 44 52 09 72 31 32 2c  20 5b 73 70 72 2c 20 23  |LDR.r12, [spr, #|
00000ec0  77 69 64 74 68 5d 0a 09  41 44 44 09 72 31 32 2c  |width]..ADD.r12,|
00000ed0  20 72 31 32 2c 20 23 31  09 09 09 3b 20 77 69 64  | r12, #1...; wid|
00000ee0  74 68 20 69 6e 20 77 6f  72 64 73 0a 09 41 44 44  |th in words..ADD|
00000ef0  09 72 31 34 2c 20 72 31  30 2c 20 72 31 32 2c 20  |.r14, r10, r12, |
00000f00  41 53 4c 20 23 33 0a 09  43 4d 50 09 72 31 34 2c  |ASL #3..CMP.r14,|
00000f10  20 23 36 31 32 0a 09 4d  4f 56 47 54 09 72 31 34  | #612..MOVGT.r14|
00000f20  2c 20 72 31 32 2c 20 41  53 4c 20 23 33 09 09 3b  |, r12, ASL #3..;|
00000f30  20 63 6f 6e 73 74 72 61  69 6e 20 74 6f 20 62 65  | constrain to be|
00000f40  20 6e 6f 74 20 6f 66 66  20 72 69 67 68 74 20 73  | not off right s|
00000f50  69 64 65 20 73 63 72 65  65 6e 0a 09 52 53 42 47  |ide screen..RSBG|
00000f60  54 09 72 31 30 2c 20 72  31 34 2c 20 23 36 31 32  |T.r10, r14, #612|
00000f70  0a 09 4c 44 52 09 72 31  34 2c 20 5b 73 70 72 2c  |..LDR.r14, [spr,|
00000f80  20 23 68 65 69 67 68 74  5d 0a 09 53 55 42 09 72  | #height]..SUB.r|
00000f90  31 31 2c 20 72 31 31 2c  20 72 31 34 0a 09 41 44  |11, r11, r14..AD|
00000fa0  44 09 72 31 31 2c 20 72  31 31 2c 20 72 31 31 2c  |D.r11, r11, r11,|
00000fb0  20 41 53 4c 20 23 32 0a  09 41 44 44 09 72 35 2c  | ASL #2..ADD.r5,|
00000fc0  20 72 35 2c 20 72 31 31  2c 20 41 53 4c 20 23 36  | r5, r11, ASL #6|
00000fd0  0a 09 41 4e 44 09 72 30  2c 20 72 31 30 2c 20 23  |..AND.r0, r10, #|
00000fe0  37 0a 09 42 49 43 09 72  31 30 2c 20 72 31 30 2c  |7..BIC.r10, r10,|
00000ff0  20 23 37 0a 09 41 44 44  09 72 35 2c 20 72 35 2c  | #7..ADD.r5, r5,|
00001000  20 72 31 30 2c 20 41 53  52 20 23 31 09 09 3b 20  | r10, ASR #1..; |
00001010  73 63 72 65 65 6e 20 74  6f 70 20 6c 65 66 74 20  |screen top left |
00001020  6f 66 20 68 61 6e 64 0a  09 4c 44 52 09 72 34 2c  |of hand..LDR.r4,|
00001030  20 5b 73 70 72 2c 20 23  69 6d 61 67 65 5d 0a 09  | [spr, #image]..|
00001040  41 44 44 09 72 34 2c 20  73 70 72 2c 20 72 34 09  |ADD.r4, spr, r4.|
00001050  09 09 3b 20 68 61 6e 64  20 73 70 72 69 74 65 20  |..; hand sprite |
00001060  74 6f 70 20 6c 65 66 74  0a 09 41 44 44 09 72 36  |top left..ADD.r6|
00001070  2c 20 72 31 34 2c 20 23  31 09 09 09 3b 20 6e 75  |, r14, #1...; nu|
00001080  6d 62 65 72 20 6f 66 20  72 6f 77 73 20 74 6f 20  |mber of rows to |
00001090  70 6c 6f 74 0a 09 4d 4f  56 09 72 30 2c 20 72 30  |plot..MOV.r0, r0|
000010a0  2c 20 41 53 4c 20 23 32  0a 09 52 53 42 09 72 31  |, ASL #2..RSB.r1|
000010b0  2c 20 72 30 2c 20 23 33  32 0a 09 4d 4f 56 09 72  |, r0, #32..MOV.r|
000010c0  31 34 2c 20 23 26 38 38  0a 09 4f 52 52 09 72 31  |14, #&88..ORR.r1|
000010d0  34 2c 20 72 31 34 2c 20  72 31 34 2c 20 4c 53 4c  |4, r14, r14, LSL|
000010e0  20 23 38 0a 09 4f 52 52  09 72 31 34 2c 20 72 31  | #8..ORR.r14, r1|
000010f0  34 2c 20 72 31 34 2c 20  4c 53 4c 20 23 31 36 09  |4, r14, LSL #16.|
00001100  09 3b 20 6d 61 73 6b 69  6e 67 20 63 6f 6e 73 74  |.; masking const|
00001110  61 6e 74 20 26 38 38 38  38 38 38 38 38 0a 70 68  |ant &88888888.ph|
00001120  5f 6e 65 78 74 72 6f 77  0a 09 4d 4f 56 09 72 37  |_nextrow..MOV.r7|
00001130  2c 20 72 34 09 09 09 09  3b 20 73 74 61 72 74 20  |, r4....; start |
00001140  6f 66 20 63 75 72 72 65  6e 74 20 72 6f 77 20 69  |of current row i|
00001150  6e 20 73 70 72 69 74 65  0a 09 4d 4f 56 09 72 31  |n sprite..MOV.r1|
00001160  30 2c 20 72 35 09 09 09  09 3b 20 73 74 61 72 74  |0, r5....; start|
00001170  20 6f 66 20 63 75 72 72  65 6e 74 20 72 6f 77 20  | of current row |
00001180  6f 6e 20 73 63 72 65 65  6e 0a 09 4d 4f 56 09 72  |on screen..MOV.r|
00001190  31 31 2c 20 72 31 32 09  09 09 3b 20 6e 75 6d 62  |11, r12...; numb|
000011a0  65 72 20 6f 66 20 63 6f  6c 73 20 74 6f 20 70 6c  |er of cols to pl|
000011b0  6f 74 0a 09 4d 4f 56 09  72 32 2c 20 23 30 0a 70  |ot..MOV.r2, #0.p|
000011c0  68 5f 6e 65 78 74 63 6f  6c 0a 09 4c 44 52 09 72  |h_nextcol..LDR.r|
000011d0  38 2c 20 5b 72 37 5d 2c  20 23 34 0a 09 4f 52 52  |8, [r7], #4..ORR|
000011e0  09 72 39 2c 20 72 32 2c  20 72 38 2c 20 4c 53 4c  |.r9, r2, r8, LSL|
000011f0  20 72 30 09 09 3b 20 73  68 69 66 74 65 64 20 68  | r0..; shifted h|
00001200  61 6e 64 20 73 70 72 69  74 65 20 64 61 74 61 0a  |and sprite data.|
00001210  09 4d 4f 56 09 72 32 2c  20 72 38 2c 20 4c 53 52  |.MOV.r2, r8, LSR|
00001220  20 72 31 0a 09 4c 44 52  09 72 38 2c 20 5b 72 31  | r1..LDR.r8, [r1|
00001230  30 5d 09 09 09 3b 20 73  63 72 65 65 6e 20 64 61  |0]...; screen da|
00001240  74 61 0a 09 4f 52 52 09  72 31 33 2c 20 72 39 2c  |ta..ORR.r13, r9,|
00001250  20 72 39 2c 20 4c 53 4c  20 23 32 0a 09 4f 52 52  | r9, LSL #2..ORR|
00001260  09 72 31 33 2c 20 72 31  33 2c 20 72 31 33 2c 20  |.r13, r13, r13, |
00001270  4c 53 4c 20 23 31 0a 09  41 4e 44 09 72 31 33 2c  |LSL #1..AND.r13,|
00001280  20 72 31 33 2c 20 72 31  34 0a 09 42 49 43 09 72  | r13, r14..BIC.r|
00001290  31 33 2c 20 72 31 33 2c  20 72 38 0a 09 4f 52 52  |13, r13, r8..ORR|
000012a0  09 72 31 33 2c 20 72 31  33 2c 20 72 31 33 2c 20  |.r13, r13, r13, |
000012b0  4c 53 52 20 23 31 0a 09  4f 52 52 09 72 31 33 2c  |LSR #1..ORR.r13,|
000012c0  20 72 31 33 2c 20 72 31  33 2c 20 4c 53 52 20 23  | r13, r13, LSR #|
000012d0  32 0a 09 41 4e 44 09 72  39 2c 20 72 39 2c 20 72  |2..AND.r9, r9, r|
000012e0  31 33 0a 09 42 49 43 09  72 38 2c 20 72 38 2c 20  |13..BIC.r8, r8, |
000012f0  72 31 33 0a 09 4f 52 52  09 72 39 2c 20 72 38 2c  |r13..ORR.r9, r8,|
00001300  20 72 39 0a 09 53 54 52  09 72 39 2c 20 5b 72 31  | r9..STR.r9, [r1|
00001310  30 5d 2c 20 23 34 0a 09  53 55 42 53 09 72 31 31  |0], #4..SUBS.r11|
00001320  2c 20 72 31 31 2c 20 23  31 0a 09 42 4c 45 09 70  |, r11, #1..BLE.p|
00001330  68 5f 65 6e 64 63 6f 6c  0a 09 4c 44 52 09 72 38  |h_endcol..LDR.r8|
00001340  2c 20 5b 72 37 5d 2c 20  23 34 0a 09 4f 52 52 09  |, [r7], #4..ORR.|
00001350  72 39 2c 20 72 32 2c 20  72 38 2c 20 4c 53 4c 20  |r9, r2, r8, LSL |
00001360  72 30 0a 09 4d 4f 56 09  72 32 2c 20 72 38 2c 20  |r0..MOV.r2, r8, |
00001370  4c 53 52 20 72 31 0a 09  4c 44 52 09 72 38 2c 20  |LSR r1..LDR.r8, |
00001380  5b 72 31 30 5d 09 09 09  3b 20 73 63 72 65 65 6e  |[r10]...; screen|
00001390  20 64 61 74 61 0a 09 4f  52 52 09 72 31 33 2c 20  | data..ORR.r13, |
000013a0  72 39 2c 20 72 39 2c 20  4c 53 4c 20 23 32 0a 09  |r9, r9, LSL #2..|
000013b0  4f 52 52 09 72 31 33 2c  20 72 31 33 2c 20 72 31  |ORR.r13, r13, r1|
000013c0  33 2c 20 4c 53 4c 20 23  31 0a 09 41 4e 44 09 72  |3, LSL #1..AND.r|
000013d0  31 33 2c 20 72 31 33 2c  20 72 31 34 0a 09 42 49  |13, r13, r14..BI|
000013e0  43 09 72 31 33 2c 20 72  31 33 2c 20 72 38 0a 09  |C.r13, r13, r8..|
000013f0  4f 52 52 09 72 31 33 2c  20 72 31 33 2c 20 72 31  |ORR.r13, r13, r1|
00001400  33 2c 20 4c 53 52 20 23  31 0a 09 4f 52 52 09 72  |3, LSR #1..ORR.r|
00001410  31 33 2c 20 72 31 33 2c  20 72 31 33 2c 20 4c 53  |13, r13, r13, LS|
00001420  52 20 23 32 0a 09 41 4e  44 09 72 39 2c 20 72 39  |R #2..AND.r9, r9|
00001430  2c 20 72 31 33 0a 09 42  49 43 09 72 38 2c 20 72  |, r13..BIC.r8, r|
00001440  38 2c 20 72 31 33 0a 09  4f 52 52 09 72 39 2c 20  |8, r13..ORR.r9, |
00001450  72 38 2c 20 72 39 0a 09  53 54 52 09 72 39 2c 20  |r8, r9..STR.r9, |
00001460  5b 72 31 30 5d 2c 20 23  34 0a 09 53 55 42 53 09  |[r10], #4..SUBS.|
00001470  72 31 31 2c 20 72 31 31  2c 20 23 31 0a 09 42 4c  |r11, r11, #1..BL|
00001480  45 09 70 68 5f 65 6e 64  63 6f 6c 0a 09 4c 44 52  |E.ph_endcol..LDR|
00001490  09 72 38 2c 20 5b 72 37  5d 2c 20 23 34 0a 09 4f  |.r8, [r7], #4..O|
000014a0  52 52 09 72 39 2c 20 72  32 2c 20 72 38 2c 20 4c  |RR.r9, r2, r8, L|
000014b0  53 4c 20 72 30 0a 09 4d  4f 56 09 72 32 2c 20 72  |SL r0..MOV.r2, r|
000014c0  38 2c 20 4c 53 52 20 72  31 0a 09 4c 44 52 09 72  |8, LSR r1..LDR.r|
000014d0  38 2c 20 5b 72 31 30 5d  09 09 09 3b 20 73 63 72  |8, [r10]...; scr|
000014e0  65 65 6e 20 64 61 74 61  0a 09 4f 52 52 09 72 31  |een data..ORR.r1|
000014f0  33 2c 20 72 39 2c 20 72  39 2c 20 4c 53 4c 20 23  |3, r9, r9, LSL #|
00001500  32 0a 09 4f 52 52 09 72  31 33 2c 20 72 31 33 2c  |2..ORR.r13, r13,|
00001510  20 72 31 33 2c 20 4c 53  4c 20 23 31 0a 09 41 4e  | r13, LSL #1..AN|
00001520  44 09 72 31 33 2c 20 72  31 33 2c 20 72 31 34 0a  |D.r13, r13, r14.|
00001530  09 42 49 43 09 72 31 33  2c 20 72 31 33 2c 20 72  |.BIC.r13, r13, r|
00001540  38 0a 09 4f 52 52 09 72  31 33 2c 20 72 31 33 2c  |8..ORR.r13, r13,|
00001550  20 72 31 33 2c 20 4c 53  52 20 23 31 0a 09 4f 52  | r13, LSR #1..OR|
00001560  52 09 72 31 33 2c 20 72  31 33 2c 20 72 31 33 2c  |R.r13, r13, r13,|
00001570  20 4c 53 52 20 23 32 0a  09 41 4e 44 09 72 39 2c  | LSR #2..AND.r9,|
00001580  20 72 39 2c 20 72 31 33  0a 09 42 49 43 09 72 38  | r9, r13..BIC.r8|
00001590  2c 20 72 38 2c 20 72 31  33 0a 09 4f 52 52 09 72  |, r8, r13..ORR.r|
000015a0  39 2c 20 72 38 2c 20 72  39 0a 09 53 54 52 09 72  |9, r8, r9..STR.r|
000015b0  39 2c 20 5b 72 31 30 5d  2c 20 23 34 0a 09 53 55  |9, [r10], #4..SU|
000015c0  42 53 09 72 31 31 2c 20  72 31 31 2c 20 23 31 0a  |BS.r11, r11, #1.|
000015d0  09 42 4c 45 09 70 68 5f  65 6e 64 63 6f 6c 0a 09  |.BLE.ph_endcol..|
000015e0  4c 44 52 09 72 38 2c 20  5b 72 37 5d 2c 20 23 34  |LDR.r8, [r7], #4|
000015f0  0a 09 4f 52 52 09 72 39  2c 20 72 32 2c 20 72 38  |..ORR.r9, r2, r8|
00001600  2c 20 4c 53 4c 20 72 30  0a 09 4d 4f 56 09 72 32  |, LSL r0..MOV.r2|
00001610  2c 20 72 38 2c 20 4c 53  52 20 72 31 0a 09 4c 44  |, r8, LSR r1..LD|
00001620  52 09 72 38 2c 20 5b 72  31 30 5d 09 09 09 3b 20  |R.r8, [r10]...; |
00001630  73 63 72 65 65 6e 20 64  61 74 61 0a 09 4f 52 52  |screen data..ORR|
00001640  09 72 31 33 2c 20 72 39  2c 20 72 39 2c 20 4c 53  |.r13, r9, r9, LS|
00001650  4c 20 23 32 0a 09 4f 52  52 09 72 31 33 2c 20 72  |L #2..ORR.r13, r|
00001660  31 33 2c 20 72 31 33 2c  20 4c 53 4c 20 23 31 0a  |13, r13, LSL #1.|
00001670  09 41 4e 44 09 72 31 33  2c 20 72 31 33 2c 20 72  |.AND.r13, r13, r|
00001680  31 34 0a 09 42 49 43 09  72 31 33 2c 20 72 31 33  |14..BIC.r13, r13|
00001690  2c 20 72 38 0a 09 4f 52  52 09 72 31 33 2c 20 72  |, r8..ORR.r13, r|
000016a0  31 33 2c 20 72 31 33 2c  20 4c 53 52 20 23 31 0a  |13, r13, LSR #1.|
000016b0  09 4f 52 52 09 72 31 33  2c 20 72 31 33 2c 20 72  |.ORR.r13, r13, r|
000016c0  31 33 2c 20 4c 53 52 20  23 32 0a 09 41 4e 44 09  |13, LSR #2..AND.|
000016d0  72 39 2c 20 72 39 2c 20  72 31 33 0a 09 42 49 43  |r9, r9, r13..BIC|
000016e0  09 72 38 2c 20 72 38 2c  20 72 31 33 0a 09 4f 52  |.r8, r8, r13..OR|
000016f0  52 09 72 39 2c 20 72 38  2c 20 72 39 0a 09 53 54  |R.r9, r8, r9..ST|
00001700  52 09 72 39 2c 20 5b 72  31 30 5d 2c 20 23 34 0a  |R.r9, [r10], #4.|
00001710  09 53 55 42 53 09 72 31  31 2c 20 72 31 31 2c 20  |.SUBS.r11, r11, |
00001720  23 31 0a 09 42 47 54 09  70 68 5f 6e 65 78 74 63  |#1..BGT.ph_nextc|
00001730  6f 6c 0a 70 68 5f 65 6e  64 63 6f 6c 0a 09 43 4d  |ol.ph_endcol..CM|
00001740  50 09 72 30 2c 20 23 30  0a 09 42 45 51 09 70 68  |P.r0, #0..BEQ.ph|
00001750  5f 64 6f 6e 65 63 6f 6c  0a 09 4c 44 52 09 72 38  |_donecol..LDR.r8|
00001760  2c 20 5b 72 31 30 5d 09  09 09 3b 20 73 63 72 65  |, [r10]...; scre|
00001770  65 6e 20 64 61 74 61 0a  09 4f 52 52 09 72 31 33  |en data..ORR.r13|
00001780  2c 20 72 32 2c 20 72 32  2c 20 4c 53 4c 20 23 32  |, r2, r2, LSL #2|
00001790  0a 09 4f 52 52 09 72 31  33 2c 20 72 31 33 2c 20  |..ORR.r13, r13, |
000017a0  72 31 33 2c 20 4c 53 4c  20 23 31 0a 09 41 4e 44  |r13, LSL #1..AND|
000017b0  09 72 31 33 2c 20 72 31  33 2c 20 72 31 34 0a 09  |.r13, r13, r14..|
000017c0  42 49 43 09 72 31 33 2c  20 72 31 33 2c 20 72 38  |BIC.r13, r13, r8|
000017d0  0a 09 4f 52 52 09 72 31  33 2c 20 72 31 33 2c 20  |..ORR.r13, r13, |
000017e0  72 31 33 2c 20 4c 53 52  20 23 31 0a 09 4f 52 52  |r13, LSR #1..ORR|
000017f0  09 72 31 33 2c 20 72 31  33 2c 20 72 31 33 2c 20  |.r13, r13, r13, |
00001800  4c 53 52 20 23 32 0a 09  41 4e 44 09 72 32 2c 20  |LSR #2..AND.r2, |
00001810  72 32 2c 20 72 31 33 0a  09 42 49 43 09 72 38 2c  |r2, r13..BIC.r8,|
00001820  20 72 38 2c 20 72 31 33  0a 09 4f 52 52 09 72 32  | r8, r13..ORR.r2|
00001830  2c 20 72 38 2c 20 72 32  0a 09 53 54 52 09 72 32  |, r8, r2..STR.r2|
00001840  2c 20 5b 72 31 30 5d 2c  20 23 34 0a 70 68 5f 64  |, [r10], #4.ph_d|
00001850  6f 6e 65 63 6f 6c 0a 09  41 44 44 09 72 34 2c 20  |onecol..ADD.r4, |
00001860  72 34 2c 20 72 31 32 2c  20 4c 53 4c 20 23 32 0a  |r4, r12, LSL #2.|
00001870  09 41 44 44 09 72 35 2c  20 72 35 2c 20 23 33 32  |.ADD.r5, r5, #32|
00001880  30 0a 09 53 55 42 53 09  72 36 2c 20 72 36 2c 20  |0..SUBS.r6, r6, |
00001890  23 31 0a 09 42 47 54 09  70 68 5f 6e 65 78 74 72  |#1..BGT.ph_nextr|
000018a0  6f 77 0a 0a 70 68 5f 65  78 69 74 09 4c 44 52 09  |ow..ph_exit.LDR.|
000018b0  73 70 2c 20 70 68 73 70  0a 09 4c 44 4d 46 44 09  |sp, phsp..LDMFD.|
000018c0  73 70 21 2c 20 7b 72 34  2d 72 39 2c 20 73 6c 2c  |sp!, {r4-r9, sl,|
000018d0  20 66 70 2c 20 70 63 7d  5e 0a 0a 0a 0a 3b 20 70  | fp, pc}^....; p|
000018e0  6c 6f 74 5f 6e 75 6d 62  65 72 0a 3b 20 61 20 6c  |lot_number.; a l|
000018f0  65 61 66 20 41 50 43 53  20 66 75 6e 63 74 69 6f  |eaf APCS functio|
00001900  6e 0a 3b 0a 3b 20 43 20  70 72 6f 74 6f 74 79 70  |n.;.; C prototyp|
00001910  65 3a 0a 3b 20 76 6f 69  64 20 70 6c 6f 74 5f 6e  |e:.; void plot_n|
00001920  75 6d 62 65 72 28 76 6f  69 64 20 2a 61 72 65 61  |umber(void *area|
00001930  2c 20 76 6f 69 64 20 2a  73 70 72 2c 20 69 6e 74  |, void *spr, int|
00001940  20 78 2c 20 69 6e 74 20  79 29 3b 0a 3b 0a 3b 20  | x, int y);.;.; |
00001950  6e 62 20 20 61 73 73 75  6d 65 73 20 66 69 74 73  |nb  assumes fits|
00001960  20 6f 6e 20 73 63 72 65  65 6e 20 26 20 63 61 6e  | on screen & can|
00001970  20 64 6f 20 61 20 66 61  73 74 20 70 6c 6f 74 20  | do a fast plot |
00001980  77 69 74 68 20 6e 6f 20  63 6c 69 70 70 69 6e 67  |with no clipping|
00001990  0a 3b 20 61 6c 73 6f 20  74 68 61 74 20 69 73 20  |.; also that is |
000019a0  62 65 69 6e 67 20 70 72  69 6e 74 65 64 20 61 74  |being printed at|
000019b0  20 61 20 77 6f 72 64 20  61 6c 69 67 6e 65 64 20  | a word aligned |
000019c0  61 64 64 72 65 73 73 20  28 69 65 20 78 20 69 73  |address (ie x is|
000019d0  20 61 20 6d 75 6c 74 69  70 6c 65 20 6f 66 20 38  | a multiple of 8|
000019e0  29 0a 3b 20 61 73 73 75  6d 65 73 20 73 70 72 69  |).; assumes spri|
000019f0  74 65 20 69 73 20 33 32  20 62 79 20 68 74 20 70  |te is 32 by ht p|
00001a00  69 78 65 6c 73 2c 20 34  62 70 70 20 26 20 73 63  |ixels, 4bpp & sc|
00001a10  72 65 65 6e 20 6d 6f 64  65 20 69 73 20 36 34 30  |reen mode is 640|
00001a20  20 70 69 78 65 6c 73 20  77 69 64 65 0a 3b 20 28  | pixels wide.; (|
00001a30  68 74 20 3d 20 33 32 20  69 66 20 76 67 61 20 65  |ht = 32 if vga e|
00001a40  6c 73 65 20 31 36 29 0a  3b 0a 0a 09 4d 41 43 52  |lse 16).;...MACR|
00001a50  4f 0a 24 6c 61 62 65 6c  20 20 70 6e 5f 73 65 67  |O.$label  pn_seg|
00001a60  09 24 72 31 2c 20 24 72  32 0a 09 41 53 53 45 52  |.$r1, $r2..ASSER|
00001a70  54 09 24 72 31 20 3c 3e  20 24 72 32 0a 24 6c 61  |T.$r1 <> $r2.$la|
00001a80  62 65 6c 09 41 4e 44 09  72 31 2c 20 72 31 34 2c  |bel.AND.r1, r14,|
00001a90  20 24 72 32 0a 09 41 4e  44 09 72 30 2c 20 72 31  | $r2..AND.r0, r1|
00001aa0  34 2c 20 24 72 32 2c 20  4c 53 52 20 23 34 0a 09  |4, $r2, LSR #4..|
00001ab0  41 4e 44 09 24 72 32 2c  20 72 31 34 2c 20 24 72  |AND.$r2, r14, $r|
00001ac0  31 0a 09 41 4e 44 09 24  72 31 2c 20 72 31 34 2c  |1..AND.$r1, r14,|
00001ad0  20 24 72 31 2c 20 4c 53  52 20 23 34 0a 09 41 44  | $r1, LSR #4..AD|
00001ae0  44 09 24 72 32 2c 20 24  72 32 2c 20 72 31 0a 09  |D.$r2, $r2, r1..|
00001af0  41 44 44 09 24 72 31 2c  20 24 72 31 2c 20 72 30  |ADD.$r1, $r1, r0|
00001b00  0a 09 41 4e 44 09 72 31  2c 20 72 31 34 2c 20 24  |..AND.r1, r14, $|
00001b10  72 32 2c 20 4c 53 52 20  23 34 0a 09 41 4e 44 09  |r2, LSR #4..AND.|
00001b20  72 30 2c 20 72 31 34 2c  20 24 72 31 2c 20 4c 53  |r0, r14, $r1, LS|
00001b30  52 20 23 34 0a 09 41 4e  44 09 24 72 32 2c 20 72  |R #4..AND.$r2, r|
00001b40  31 34 2c 20 24 72 32 0a  09 41 4e 44 09 24 72 31  |14, $r2..AND.$r1|
00001b50  2c 20 72 31 34 2c 20 24  72 31 0a 09 4f 52 52 09  |, r14, $r1..ORR.|
00001b60  72 31 2c 20 72 31 2c 20  72 31 2c 20 4c 53 4c 20  |r1, r1, r1, LSL |
00001b70  23 31 0a 09 4f 52 52 09  72 30 2c 20 72 30 2c 20  |#1..ORR.r0, r0, |
00001b80  72 30 2c 20 4c 53 4c 20  23 31 0a 09 4f 52 52 09  |r0, LSL #1..ORR.|
00001b90  72 31 2c 20 72 31 2c 20  72 31 2c 20 4c 53 4c 20  |r1, r1, r1, LSL |
00001ba0  23 32 0a 09 4f 52 52 09  72 30 2c 20 72 30 2c 20  |#2..ORR.r0, r0, |
00001bb0  72 30 2c 20 4c 53 4c 20  23 32 0a 09 4f 52 52 09  |r0, LSL #2..ORR.|
00001bc0  24 72 32 2c 20 24 72 32  2c 20 72 31 0a 09 4f 52  |$r2, $r2, r1..OR|
00001bd0  52 09 24 72 31 2c 20 24  72 31 2c 20 72 30 0a 09  |R.$r1, $r1, r0..|
00001be0  4f 52 52 09 24 72 32 2c  20 24 72 32 2c 20 24 72  |ORR.$r2, $r2, $r|
00001bf0  31 2c 20 4c 53 4c 20 23  34 0a 09 4d 45 4e 44 0a  |1, LSL #4..MEND.|
00001c00  0a 09 45 58 50 4f 52 54  09 70 6c 6f 74 5f 6e 75  |..EXPORT.plot_nu|
00001c10  6d 62 65 72 0a 0a 70 6e  6e 73 74 61 09 44 43 42  |mber..pnnsta.DCB|
00001c20  09 22 70 6c 6f 74 5f 6e  75 6d 62 65 72 22 2c 20  |."plot_number", |
00001c30  30 0a 09 41 4c 49 47 4e  0a 70 6e 6e 65 6e 64 09  |0..ALIGN.pnnend.|
00001c40  44 43 44 09 26 66 66 30  30 30 30 30 30 20 2b 20  |DCD.&ff000000 + |
00001c50  70 6e 6e 65 6e 64 20 2d  20 70 6e 6e 73 74 61 0a  |pnnend - pnnsta.|
00001c60  0a 70 6e 73 70 09 44 43  44 09 30 0a 0a 70 6c 6f  |.pnsp.DCD.0..plo|
00001c70  74 5f 6e 75 6d 62 65 72  0a 0a 09 53 54 4d 46 44  |t_number...STMFD|
00001c80  09 73 70 21 2c 20 7b 72  34 2d 72 39 2c 20 73 6c  |.sp!, {r4-r9, sl|
00001c90  2c 20 66 70 2c 20 6c 72  7d 0a 09 53 54 52 09 73  |, fp, lr}..STR.s|
00001ca0  70 2c 20 70 6e 73 70 0a  09 41 44 52 09 72 34 2c  |p, pnsp..ADR.r4,|
00001cb0  20 76 62 6c 73 0a 09 4c  44 4d 49 41 09 72 34 2c  | vbls..LDMIA.r4,|
00001cc0  20 7b 72 34 2d 72 39 7d  0a 09 4c 44 52 09 72 34  | {r4-r9}..LDR.r4|
00001cd0  2c 20 5b 72 62 61 6e 6b  5d 0a 09 53 55 42 09 72  |, [rbank]..SUB.r|
00001ce0  34 2c 20 72 34 2c 20 23  31 0a 09 4c 44 52 09 72  |4, r4, #1..LDR.r|
00001cf0  35 2c 20 5b 72 73 63 72  73 74 2c 20 72 34 2c 20  |5, [rscrst, r4, |
00001d00  4c 53 4c 20 23 32 5d 09  3b 20 73 63 72 65 65 6e  |LSL #2].; screen|
00001d10  20 62 61 73 65 20 61 64  64 72 20 66 6f 72 20 56  | base addr for V|
00001d20  44 55 20 6f 75 74 70 75  74 0a 09 4c 44 52 09 72  |DU output..LDR.r|
00001d30  6f 78 2c 20 5b 72 6f 78  5d 0a 09 4c 44 52 09 72  |ox, [rox]..LDR.r|
00001d40  6f 79 2c 20 5b 72 6f 79  5d 0a 09 4c 44 52 09 72  |oy, [roy]..LDR.r|
00001d50  6c 78 2c 20 5b 72 6c 78  5d 0a 09 4c 44 52 09 72  |lx, [rlx]..LDR.r|
00001d60  6c 79 2c 20 5b 72 6c 79  5d 0a 09 41 44 44 09 72  |ly, [rly]..ADD.r|
00001d70  31 30 2c 20 78 2c 20 72  6f 78 0a 09 52 53 42 09  |10, x, rox..RSB.|
00001d80  72 31 31 2c 20 79 2c 20  72 6f 79 0a 09 53 55 42  |r11, y, roy..SUB|
00001d90  09 72 31 31 2c 20 72 31  31 2c 20 23 36 34 0a 09  |.r11, r11, #64..|
00001da0  4d 4f 56 09 72 31 30 2c  20 72 31 30 2c 20 41 53  |MOV.r10, r10, AS|
00001db0  52 20 72 6c 78 09 09 3b  20 78 20 70 69 78 65 6c  |R rlx..; x pixel|
00001dc0  20 63 6f 6f 72 64 20 72  65 6c 20 6c 65 66 74 20  | coord rel left |
00001dd0  73 63 72 65 65 6e 20 7d  20 6f 66 20 74 6f 70 20  |screen } of top |
00001de0  6c 65 66 74 0a 09 4d 4f  56 09 72 31 31 2c 20 72  |left..MOV.r11, r|
00001df0  31 31 2c 20 41 53 52 20  72 6c 79 09 09 3b 20 79  |11, ASR rly..; y|
00001e00  20 70 69 78 65 6c 20 63  6f 6f 72 64 20 72 65 6c  | pixel coord rel|
00001e10  20 74 6f 70 20 73 63 72  65 65 6e 20 20 7d 20 6f  | top screen  } o|
00001e20  66 20 6f 62 6a 65 63 74  0a 09 41 44 44 09 72 31  |f object..ADD.r1|
00001e30  31 2c 20 72 31 31 2c 20  23 31 0a 09 41 44 44 09  |1, r11, #1..ADD.|
00001e40  72 31 31 2c 20 72 31 31  2c 20 72 31 31 2c 20 41  |r11, r11, r11, A|
00001e50  53 4c 20 23 32 0a 09 41  44 44 09 72 35 2c 20 72  |SL #2..ADD.r5, r|
00001e60  35 2c 20 72 31 31 2c 20  41 53 4c 20 23 36 0a 09  |5, r11, ASL #6..|
00001e70  42 49 43 09 72 31 30 2c  20 72 31 30 2c 20 23 37  |BIC.r10, r10, #7|
00001e80  0a 09 41 44 44 09 72 35  2c 20 72 35 2c 20 72 31  |..ADD.r5, r5, r1|
00001e90  30 2c 20 41 53 52 20 23  31 09 09 3b 20 73 63 72  |0, ASR #1..; scr|
00001ea0  65 65 6e 20 74 6f 70 20  6c 65 66 74 20 6f 66 20  |een top left of |
00001eb0  6e 75 6d 62 65 72 0a 09  4c 44 52 09 72 34 2c 20  |number..LDR.r4, |
00001ec0  5b 73 70 72 2c 20 23 69  6d 61 67 65 5d 0a 09 41  |[spr, #image]..A|
00001ed0  44 44 09 72 34 2c 20 73  70 72 2c 20 72 34 09 09  |DD.r4, spr, r4..|
00001ee0  09 3b 20 6e 75 6d 62 65  72 20 73 70 72 69 74 65  |.; number sprite|
00001ef0  20 74 6f 70 20 6c 65 66  74 0a 09 4d 4f 56 09 72  | top left..MOV.r|
00001f00  33 2c 20 23 36 34 0a 09  4d 4f 56 09 72 33 2c 20  |3, #64..MOV.r3, |
00001f10  72 33 2c 20 41 53 52 20  72 6c 79 0a 09 4d 4f 56  |r3, ASR rly..MOV|
00001f20  09 72 31 34 2c 20 23 26  30 66 0a 09 4f 52 52 09  |.r14, #&0f..ORR.|
00001f30  72 31 34 2c 20 72 31 34  2c 20 72 31 34 2c 20 4c  |r14, r14, r14, L|
00001f40  53 4c 20 23 38 0a 09 4f  52 52 09 72 31 34 2c 20  |SL #8..ORR.r14, |
00001f50  72 31 34 2c 20 72 31 34  2c 20 4c 53 4c 20 23 31  |r14, r14, LSL #1|
00001f60  36 0a 70 6e 5f 6c 6f 6f  70 09 4c 44 4d 49 41 09  |6.pn_loop.LDMIA.|
00001f70  72 34 21 2c 20 7b 72 36  2c 72 37 2c 72 38 2c 72  |r4!, {r6,r7,r8,r|
00001f80  39 7d 0a 09 4c 44 4d 49  41 09 72 35 2c 20 7b 72  |9}..LDMIA.r5, {r|
00001f90  31 30 2c 72 31 31 2c 72  31 32 2c 72 31 33 7d 0a  |10,r11,r12,r13}.|
00001fa0  09 70 6e 5f 73 65 67 09  72 36 2c 20 72 31 30 0a  |.pn_seg.r6, r10.|
00001fb0  09 70 6e 5f 73 65 67 09  72 37 2c 20 72 31 31 0a  |.pn_seg.r7, r11.|
00001fc0  09 70 6e 5f 73 65 67 09  72 38 2c 20 72 31 32 0a  |.pn_seg.r8, r12.|
00001fd0  09 70 6e 5f 73 65 67 09  72 39 2c 20 72 31 33 0a  |.pn_seg.r9, r13.|
00001fe0  09 53 54 4d 49 41 20 20  20 72 35 2c 20 7b 72 31  |.STMIA   r5, {r1|
00001ff0  30 2c 72 31 31 2c 72 31  32 2c 72 31 33 7d 0a 09  |0,r11,r12,r13}..|
00002000  41 44 44 09 72 35 2c 20  72 35 2c 20 23 33 32 30  |ADD.r5, r5, #320|
00002010  0a 09 53 55 42 53 09 72  33 2c 20 72 33 2c 20 23  |..SUBS.r3, r3, #|
00002020  31 0a 09 42 4e 45 09 70  6e 5f 6c 6f 6f 70 0a 70  |1..BNE.pn_loop.p|
00002030  6e 5f 65 78 69 74 09 4c  44 52 09 73 70 2c 20 70  |n_exit.LDR.sp, p|
00002040  6e 73 70 0a 09 4c 44 4d  46 44 09 73 70 21 2c 20  |nsp..LDMFD.sp!, |
00002050  7b 72 34 2d 72 39 2c 20  73 6c 2c 20 66 70 2c 20  |{r4-r9, sl, fp, |
00002060  70 63 7d 5e 0a 0a 0a 0a  3b 20 70 6c 6f 74 5f 62  |pc}^....; plot_b|
00002070  61 72 0a 3b 20 61 20 6c  65 61 66 20 41 50 43 53  |ar.; a leaf APCS|
00002080  20 66 75 6e 63 74 69 6f  6e 0a 3b 0a 3b 20 43 20  | function.;.; C |
00002090  70 72 6f 74 6f 74 79 70  65 3a 0a 3b 20 76 6f 69  |prototype:.; voi|
000020a0  64 20 70 6c 6f 74 5f 62  61 72 28 69 6e 74 20 78  |d plot_bar(int x|
000020b0  2c 20 69 6e 74 20 79 2c  20 69 6e 74 20 77 2c 20  |, int y, int w, |
000020c0  69 6e 74 20 68 2c 20 69  6e 74 20 63 29 3b 0a 3b  |int h, int c);.;|
000020d0  0a 3b 20 70 6c 6f 74 20  61 20 62 6c 61 6e 6b 20  |.; plot a blank |
000020e0  72 65 63 74 61 6e 67 6c  65 20 6f 66 20 77 69 64  |rectangle of wid|
000020f0  74 68 20 77 2c 20 68 65  69 67 68 74 20 68 2c 20  |th w, height h, |
00002100  62 6f 74 74 6f 6d 20 6c  65 66 74 20 61 74 20 78  |bottom left at x|
00002110  2c 20 79 20 69 6e 20 63  6f 6c 6f 75 72 20 63 0a  |, y in colour c.|
00002120  3b 20 61 73 73 75 6d 65  20 6d 6f 64 65 20 69 73  |; assume mode is|
00002130  20 36 34 30 20 70 69 78  65 6c 73 20 77 69 64 65  | 640 pixels wide|
00002140  20 34 62 70 70 20 26 20  72 65 63 74 61 6e 67 6c  | 4bpp & rectangl|
00002150  65 20 6c 69 65 73 20 77  69 74 68 69 6e 20 73 63  |e lies within sc|
00002160  72 65 65 6e 20 61 72 65  61 0a 3b 20 61 6c 73 6f  |reen area.; also|
00002170  2c 20 74 68 61 74 20 78  20 69 73 20 61 20 6d 75  |, that x is a mu|
00002180  6c 74 69 70 6c 65 20 6f  66 20 32 20 61 73 20 69  |ltiple of 2 as i|
00002190  73 20 77 0a 3b 0a 09 45  58 50 4f 52 54 09 70 6c  |s w.;..EXPORT.pl|
000021a0  6f 74 5f 62 61 72 0a 0a  72 66 6e 73 74 61 09 44  |ot_bar..rfnsta.D|
000021b0  43 42 09 22 70 6c 6f 74  5f 62 61 72 22 2c 20 30  |CB."plot_bar", 0|
000021c0  0a 09 41 4c 49 47 4e 0a  72 66 6e 65 6e 64 09 44  |..ALIGN.rfnend.D|
000021d0  43 44 09 26 66 66 30 30  30 30 30 30 20 2b 20 72  |CD.&ff000000 + r|
000021e0  66 6e 65 6e 64 20 2d 20  72 66 6e 73 74 61 0a 0a  |fnend - rfnsta..|
000021f0  70 6c 6f 74 5f 62 61 72  0a 0a 09 4c 44 52 09 69  |plot_bar...LDR.i|
00002200  70 2c 20 5b 73 70 5d 09  09 09 3b 20 63 6f 6c 6f  |p, [sp]...; colo|
00002210  75 72 20 69 6e 20 72 31  32 0a 09 53 54 4d 46 44  |ur in r12..STMFD|
00002220  09 73 70 21 2c 20 7b 72  34 2d 72 39 2c 20 73 6c  |.sp!, {r4-r9, sl|
00002230  2c 20 66 70 2c 20 6c 72  7d 0a 09 43 4d 50 09 77  |, fp, lr}..CMP.w|
00002240  5f 72 2c 20 23 30 0a 09  41 44 44 4d 49 09 78 5f  |_r, #0..ADDMI.x_|
00002250  72 2c 20 78 5f 72 2c 20  77 5f 72 0a 09 41 44 44  |r, x_r, w_r..ADD|
00002260  4d 49 09 78 5f 72 2c 20  78 5f 72 2c 20 23 31 0a  |MI.x_r, x_r, #1.|
00002270  09 52 53 42 4d 49 09 77  5f 72 2c 20 77 5f 72 2c  |.RSBMI.w_r, w_r,|
00002280  20 23 30 0a 09 43 4d 50  09 68 5f 72 2c 20 23 30  | #0..CMP.h_r, #0|
00002290  0a 09 41 44 44 4d 49 09  79 5f 72 2c 20 79 5f 72  |..ADDMI.y_r, y_r|
000022a0  2c 20 68 5f 72 0a 09 41  44 44 4d 49 09 79 5f 72  |, h_r..ADDMI.y_r|
000022b0  2c 20 79 5f 72 2c 20 23  31 0a 09 52 53 42 4d 49  |, y_r, #1..RSBMI|
000022c0  09 68 5f 72 2c 20 68 5f  72 2c 20 23 30 0a 09 41  |.h_r, h_r, #0..A|
000022d0  44 52 4c 09 72 34 2c 20  76 62 6c 73 0a 09 4c 44  |DRL.r4, vbls..LD|
000022e0  4d 49 41 09 72 34 2c 20  7b 72 34 2d 72 39 7d 0a  |MIA.r4, {r4-r9}.|
000022f0  09 4c 44 52 09 72 34 2c  20 5b 72 62 61 6e 6b 5d  |.LDR.r4, [rbank]|
00002300  0a 09 53 55 42 09 72 34  2c 20 72 34 2c 20 23 31  |..SUB.r4, r4, #1|
00002310  0a 09 4c 44 52 09 72 35  2c 20 5b 72 73 63 72 73  |..LDR.r5, [rscrs|
00002320  74 2c 20 72 34 2c 20 4c  53 4c 20 23 32 5d 09 3b  |t, r4, LSL #2].;|
00002330  20 73 63 72 65 65 6e 20  62 61 73 65 20 61 64 64  | screen base add|
00002340  72 20 66 6f 72 20 56 44  55 20 6f 75 74 70 75 74  |r for VDU output|
00002350  0a 09 4c 44 52 09 72 6f  78 2c 20 5b 72 6f 78 5d  |..LDR.rox, [rox]|
00002360  0a 09 4c 44 52 09 72 6f  79 2c 20 5b 72 6f 79 5d  |..LDR.roy, [roy]|
00002370  0a 09 4c 44 52 09 72 6c  78 2c 20 5b 72 6c 78 5d  |..LDR.rlx, [rlx]|
00002380  0a 09 41 44 44 09 72 6c  78 2c 20 72 6c 78 2c 20  |..ADD.rlx, rlx, |
00002390  23 31 0a 09 4c 44 52 09  72 6c 79 2c 20 5b 72 6c  |#1..LDR.rly, [rl|
000023a0  79 5d 0a 09 41 44 44 09  72 31 30 2c 20 78 5f 72  |y]..ADD.r10, x_r|
000023b0  2c 20 72 6f 78 0a 09 52  53 42 09 72 31 31 2c 20  |, rox..RSB.r11, |
000023c0  79 5f 72 2c 20 72 6f 79  0a 09 4d 4f 56 09 72 31  |y_r, roy..MOV.r1|
000023d0  30 2c 20 72 31 30 2c 20  41 53 52 20 72 6c 78 09  |0, r10, ASR rlx.|
000023e0  09 3b 20 78 20 62 79 74  65 20 63 6f 6f 72 64 20  |.; x byte coord |
000023f0  72 65 6c 20 6c 65 66 74  20 73 63 72 65 65 6e 20  |rel left screen |
00002400  7d 20 6f 66 20 62 6f 74  74 6f 6d 20 6c 65 66 74  |} of bottom left|
00002410  0a 09 4d 4f 56 09 72 31  31 2c 20 72 31 31 2c 20  |..MOV.r11, r11, |
00002420  41 53 52 20 72 6c 79 09  09 3b 20 79 20 70 69 78  |ASR rly..; y pix|
00002430  65 6c 20 63 6f 6f 72 64  20 72 65 6c 20 74 6f 70  |el coord rel top|
00002440  20 73 63 72 65 65 6e 20  20 7d 20 6f 66 20 72 65  | screen  } of re|
00002450  63 74 61 6e 67 6c 65 0a  09 4d 4f 56 09 77 5f 72  |ctangle..MOV.w_r|
00002460  2c 20 77 5f 72 2c 20 41  53 52 20 72 6c 78 09 09  |, w_r, ASR rlx..|
00002470  3b 20 77 69 64 74 68 20  72 6f 77 20 69 6e 20 62  |; width row in b|
00002480  79 74 65 73 0a 09 4d 4f  56 09 68 5f 72 2c 20 68  |ytes..MOV.h_r, h|
00002490  5f 72 2c 20 41 53 52 20  72 6c 79 0a 09 41 44 44  |_r, ASR rly..ADD|
000024a0  09 72 31 31 2c 20 72 31  31 2c 20 23 31 0a 09 53  |.r11, r11, #1..S|
000024b0  55 42 09 72 31 31 2c 20  72 31 31 2c 20 68 5f 72  |UB.r11, r11, h_r|
000024c0  09 09 09 3b 20 79 20 70  69 78 65 6c 20 63 6f 6f  |...; y pixel coo|
000024d0  72 64 20 74 6f 70 20 72  65 63 74 61 6e 67 6c 65  |rd top rectangle|
000024e0  0a 09 41 44 44 09 72 31  34 2c 20 72 31 30 2c 20  |..ADD.r14, r10, |
000024f0  77 5f 72 09 09 09 3b 20  78 20 62 79 74 65 20 63  |w_r...; x byte c|
00002500  6f 6f 72 64 20 6a 75 73  74 20 62 65 79 6f 6e 64  |oord just beyond|
00002510  20 72 69 67 68 74 20 73  69 64 65 0a 09 41 44 44  | right side..ADD|
00002520  09 72 31 31 2c 20 72 31  31 2c 20 72 31 31 2c 20  |.r11, r11, r11, |
00002530  41 53 4c 20 23 32 0a 09  41 44 44 09 72 35 2c 20  |ASL #2..ADD.r5, |
00002540  72 35 2c 20 72 31 31 2c  20 41 53 4c 20 23 36 0a  |r5, r11, ASL #6.|
00002550  09 41 44 44 09 72 35 2c  20 72 35 2c 20 72 31 30  |.ADD.r5, r5, r10|
00002560  0a 09 52 53 42 09 72 36  2c 20 72 31 30 2c 20 23  |..RSB.r6, r10, #|
00002570  34 0a 09 41 4e 44 09 72  36 2c 20 72 36 2c 20 23  |4..AND.r6, r6, #|
00002580  33 09 09 09 3b 20 23 20  70 69 78 65 6c 73 20 6f  |3...; # pixels o|
00002590  6e 20 72 6f 77 20 6c 65  66 74 20 75 70 74 6f 20  |n row left upto |
000025a0  77 6f 72 64 20 62 6f 75  6e 64 61 72 79 0a 09 41  |word boundary..A|
000025b0  44 44 09 72 31 30 2c 20  72 31 30 2c 20 72 36 0a  |DD.r10, r10, r6.|
000025c0  09 41 4e 44 09 72 37 2c  20 72 31 34 2c 20 23 33  |.AND.r7, r14, #3|
000025d0  09 09 09 3b 20 23 20 70  69 78 65 6c 73 20 6f 6e  |...; # pixels on|
000025e0  20 72 6f 77 20 72 69 67  68 74 20 62 65 79 6f 6e  | row right beyon|
000025f0  64 20 77 6f 72 64 20 62  64 72 79 0a 09 53 55 42  |d word bdry..SUB|
00002600  09 72 38 2c 20 72 31 34  2c 20 72 31 30 0a 09 4d  |.r8, r14, r10..M|
00002610  4f 56 09 72 38 2c 20 72  38 2c 20 41 53 52 20 23  |OV.r8, r8, ASR #|
00002620  32 09 09 09 3b 20 23 20  77 68 6f 6c 65 20 77 6f  |2...; # whole wo|
00002630  72 64 73 20 6f 6e 20 65  61 63 68 20 72 6f 77 0a  |rds on each row.|
00002640  09 4f 52 52 09 72 30 2c  20 63 5f 72 2c 20 63 5f  |.ORR.r0, c_r, c_|
00002650  72 2c 20 4c 53 4c 20 23  34 0a 09 4f 52 52 09 72  |r, LSL #4..ORR.r|
00002660  30 2c 20 72 30 2c 20 72  30 2c 20 4c 53 4c 20 23  |0, r0, r0, LSL #|
00002670  38 0a 09 4f 52 52 09 72  30 2c 20 72 30 2c 20 72  |8..ORR.r0, r0, r|
00002680  30 2c 20 4c 53 4c 20 23  31 36 0a 72 66 5f 6e 65  |0, LSL #16.rf_ne|
00002690  78 74 72 6f 77 0a 09 4d  4f 56 09 72 31 30 2c 20  |xtrow..MOV.r10, |
000026a0  72 35 0a 09 4d 4f 56 53  09 72 31 31 2c 20 72 36  |r5..MOVS.r11, r6|
000026b0  0a 09 42 45 51 09 72 66  5f 72 6f 77 77 6f 72 64  |..BEQ.rf_rowword|
000026c0  73 0a 09 53 54 52 42 09  72 30 2c 20 5b 72 31 30  |s..STRB.r0, [r10|
000026d0  5d 2c 20 23 31 0a 09 53  55 42 53 09 72 31 31 2c  |], #1..SUBS.r11,|
000026e0  20 72 31 31 2c 20 23 31  0a 09 42 45 51 09 72 66  | r11, #1..BEQ.rf|
000026f0  5f 72 6f 77 77 6f 72 64  73 0a 09 53 54 52 42 09  |_rowwords..STRB.|
00002700  72 30 2c 20 5b 72 31 30  5d 2c 20 23 31 0a 09 53  |r0, [r10], #1..S|
00002710  55 42 53 09 72 31 31 2c  20 72 31 31 2c 20 23 31  |UBS.r11, r11, #1|
00002720  0a 09 42 45 51 09 72 66  5f 72 6f 77 77 6f 72 64  |..BEQ.rf_rowword|
00002730  73 0a 09 53 54 52 42 09  72 30 2c 20 5b 72 31 30  |s..STRB.r0, [r10|
00002740  5d 2c 20 23 31 0a 72 66  5f 72 6f 77 77 6f 72 64  |], #1.rf_rowword|
00002750  73 0a 09 4d 4f 56 53 09  72 31 31 2c 20 72 38 0a  |s..MOVS.r11, r8.|
00002760  09 42 45 51 09 72 66 5f  72 6f 77 65 6e 64 77 6f  |.BEQ.rf_rowendwo|
00002770  72 64 73 0a 72 66 5f 72  6f 77 77 6f 72 64 73 63  |rds.rf_rowwordsc|
00002780  6f 6e 74 0a 09 53 54 52  09 72 30 2c 20 5b 72 31  |ont..STR.r0, [r1|
00002790  30 5d 2c 20 23 34 0a 09  53 55 42 53 09 72 31 31  |0], #4..SUBS.r11|
000027a0  2c 20 72 31 31 2c 20 23  31 0a 09 42 45 51 09 72  |, r11, #1..BEQ.r|
000027b0  66 5f 72 6f 77 65 6e 64  77 6f 72 64 73 0a 09 53  |f_rowendwords..S|
000027c0  54 52 09 72 30 2c 20 5b  72 31 30 5d 2c 20 23 34  |TR.r0, [r10], #4|
000027d0  0a 09 53 55 42 53 09 72  31 31 2c 20 72 31 31 2c  |..SUBS.r11, r11,|
000027e0  20 23 31 0a 09 42 45 51  09 72 66 5f 72 6f 77 65  | #1..BEQ.rf_rowe|
000027f0  6e 64 77 6f 72 64 73 0a  09 53 54 52 09 72 30 2c  |ndwords..STR.r0,|
00002800  20 5b 72 31 30 5d 2c 20  23 34 0a 09 53 55 42 53  | [r10], #4..SUBS|
00002810  09 72 31 31 2c 20 72 31  31 2c 20 23 31 0a 09 42  |.r11, r11, #1..B|
00002820  45 51 09 72 66 5f 72 6f  77 65 6e 64 77 6f 72 64  |EQ.rf_rowendword|
00002830  73 0a 09 53 54 52 09 72  30 2c 20 5b 72 31 30 5d  |s..STR.r0, [r10]|
00002840  2c 20 23 34 0a 09 53 55  42 53 09 72 31 31 2c 20  |, #4..SUBS.r11, |
00002850  72 31 31 2c 20 23 31 0a  09 42 4e 45 09 72 66 5f  |r11, #1..BNE.rf_|
00002860  72 6f 77 77 6f 72 64 73  63 6f 6e 74 0a 72 66 5f  |rowwordscont.rf_|
00002870  72 6f 77 65 6e 64 77 6f  72 64 73 0a 09 4d 4f 56  |rowendwords..MOV|
00002880  53 09 72 31 31 2c 20 72  37 0a 09 42 45 51 09 72  |S.r11, r7..BEQ.r|
00002890  66 5f 65 6e 64 72 6f 77  0a 09 53 54 52 42 09 72  |f_endrow..STRB.r|
000028a0  30 2c 20 5b 72 31 30 5d  2c 20 23 31 0a 09 53 55  |0, [r10], #1..SU|
000028b0  42 53 09 72 31 31 2c 20  72 31 31 2c 20 23 31 0a  |BS.r11, r11, #1.|
000028c0  09 42 45 51 09 72 66 5f  65 6e 64 72 6f 77 0a 09  |.BEQ.rf_endrow..|
000028d0  53 54 52 42 09 72 30 2c  20 5b 72 31 30 5d 2c 20  |STRB.r0, [r10], |
000028e0  23 31 0a 09 53 55 42 53  09 72 31 31 2c 20 72 31  |#1..SUBS.r11, r1|
000028f0  31 2c 20 23 31 0a 09 42  45 51 09 72 66 5f 65 6e  |1, #1..BEQ.rf_en|
00002900  64 72 6f 77 0a 09 53 54  52 42 09 72 30 2c 20 5b  |drow..STRB.r0, [|
00002910  72 31 30 5d 2c 20 23 31  0a 72 66 5f 65 6e 64 72  |r10], #1.rf_endr|
00002920  6f 77 0a 09 41 44 44 09  72 35 2c 20 72 35 2c 20  |ow..ADD.r5, r5, |
00002930  23 33 32 30 0a 09 53 55  42 53 09 68 5f 72 2c 20  |#320..SUBS.h_r, |
00002940  68 5f 72 2c 20 23 31 0a  09 42 47 54 09 72 66 5f  |h_r, #1..BGT.rf_|
00002950  6e 65 78 74 72 6f 77 0a  0a 72 66 5f 65 78 69 74  |nextrow..rf_exit|
00002960  09 4c 44 4d 46 44 09 73  70 21 2c 20 7b 72 34 2d  |.LDMFD.sp!, {r4-|
00002970  72 39 2c 20 73 6c 2c 20  66 70 2c 20 70 63 7d 5e  |r9, sl, fp, pc}^|
00002980  0a 0a 0a 0a 3b 20 65 72  61 73 65 5f 62 72 6f 6c  |....; erase_brol|
00002990  6c 79 0a 3b 20 61 20 6c  65 61 66 20 41 50 43 53  |ly.; a leaf APCS|
000029a0  20 66 75 6e 63 74 69 6f  6e 0a 3b 0a 3b 20 43 20  | function.;.; C |
000029b0  70 72 6f 74 6f 74 79 70  65 3a 0a 3b 20 76 6f 69  |prototype:.; voi|
000029c0  64 20 65 72 61 73 65 5f  62 72 6f 6c 6c 79 28 76  |d erase_brolly(v|
000029d0  6f 69 64 20 2a 73 70 72  2c 20 69 6e 74 20 78 2c  |oid *spr, int x,|
000029e0  20 69 6e 74 20 79 29 3b  0a 3b 0a 3b 20 70 6c 6f  | int y);.;.; plo|
000029f0  74 20 61 20 62 6c 61 6e  6b 20 72 65 63 74 61 6e  |t a blank rectan|
00002a00  67 6c 65 20 6f 66 20 73  70 72 69 74 65 20 64 69  |gle of sprite di|
00002a10  6d 65 6e 73 69 6f 6e 73  20 61 74 20 78 2c 79 0a  |mensions at x,y.|
00002a20  3b 20 61 73 73 75 6d 70  74 69 6f 6e 73 20 61 73  |; assumptions as|
00002a30  20 66 6f 72 20 70 6c 6f  74 5f 62 72 6f 6c 6c 79  | for plot_brolly|
00002a40  0a 3b 0a 3b 20 6e 62 20  77 72 69 74 74 65 6e 20  |.;.; nb written |
00002a50  69 6e 20 72 65 73 70 6f  6e 73 65 20 74 6f 20 64  |in response to d|
00002a60  69 73 63 6f 76 65 72 79  20 74 68 61 74 20 61 20  |iscovery that a |
00002a70  66 75 6c 6c 20 73 63 72  65 65 6e 20 63 6c 65 61  |full screen clea|
00002a80  72 20 77 61 73 20 75 73  69 6e 67 20 6e 65 61 72  |r was using near|
00002a90  6c 79 0a 3b 20 36 30 25  20 6f 66 20 66 72 61 6d  |ly.; 60% of fram|
00002aa0  65 20 74 69 6d 65 20 2d  20 75 73 65 20 6f 66 20  |e time - use of |
00002ab0  74 68 69 73 20 66 75 6e  63 74 69 6f 6e 20 74 6f  |this function to|
00002ac0  20 65 72 61 73 65 20 62  72 6f 6c 6c 79 20 26 20  | erase brolly & |
00002ad0  68 61 6e 64 20 72 65 64  75 63 65 73 20 74 68 69  |hand reduces thi|
00002ae0  73 20 74 6f 20 31 36 25  0a 3b 20 64 6f 75 62 6c  |s to 16%.; doubl|
00002af0  69 6e 67 20 67 61 6d 65  20 73 70 65 65 64 0a 3b  |ing game speed.;|
00002b00  0a 09 45 58 50 4f 52 54  09 65 72 61 73 65 5f 62  |..EXPORT.erase_b|
00002b10  72 6f 6c 6c 79 0a 0a 65  73 6e 73 74 61 09 44 43  |rolly..esnsta.DC|
00002b20  42 09 22 65 72 61 73 65  5f 62 72 6f 6c 6c 79 22  |B."erase_brolly"|
00002b30  2c 20 30 0a 09 41 4c 49  47 4e 0a 65 73 6e 65 6e  |, 0..ALIGN.esnen|
00002b40  64 09 44 43 44 09 26 66  66 30 30 30 30 30 30 20  |d.DCD.&ff000000 |
00002b50  2b 20 65 73 6e 65 6e 64  20 2d 20 65 73 6e 73 74  |+ esnend - esnst|
00002b60  61 0a 0a 65 72 61 73 65  5f 62 72 6f 6c 6c 79 0a  |a..erase_brolly.|
00002b70  0a 09 53 54 4d 46 44 09  73 70 21 2c 20 7b 72 34  |..STMFD.sp!, {r4|
00002b80  2d 72 39 2c 20 73 6c 2c  20 66 70 2c 20 6c 72 7d  |-r9, sl, fp, lr}|
00002b90  0a 09 41 44 52 4c 09 72  34 2c 20 76 62 6c 73 0a  |..ADRL.r4, vbls.|
00002ba0  09 4c 44 4d 49 41 09 72  34 2c 20 7b 72 34 2d 72  |.LDMIA.r4, {r4-r|
00002bb0  39 7d 0a 09 4c 44 52 09  72 34 2c 20 5b 72 62 61  |9}..LDR.r4, [rba|
00002bc0  6e 6b 5d 0a 09 53 55 42  09 72 34 2c 20 72 34 2c  |nk]..SUB.r4, r4,|
00002bd0  20 23 31 0a 09 4c 44 52  09 72 35 2c 20 5b 72 73  | #1..LDR.r5, [rs|
00002be0  63 72 73 74 2c 20 72 34  2c 20 4c 53 4c 20 23 32  |crst, r4, LSL #2|
00002bf0  5d 09 3b 20 73 63 72 65  65 6e 20 62 61 73 65 20  |].; screen base |
00002c00  61 64 64 72 20 66 6f 72  20 56 44 55 20 6f 75 74  |addr for VDU out|
00002c10  70 75 74 0a 09 4c 44 52  09 72 6f 78 2c 20 5b 72  |put..LDR.rox, [r|
00002c20  6f 78 5d 0a 09 4c 44 52  09 72 6f 79 2c 20 5b 72  |ox]..LDR.roy, [r|
00002c30  6f 79 5d 0a 09 4c 44 52  09 72 6c 78 2c 20 5b 72  |oy]..LDR.rlx, [r|
00002c40  6c 78 5d 0a 09 4c 44 52  09 72 6c 79 2c 20 5b 72  |lx]..LDR.rly, [r|
00002c50  6c 79 5d 0a 09 41 44 44  09 72 31 30 2c 20 78 5f  |ly]..ADD.r10, x_|
00002c60  65 2c 20 72 6f 78 0a 09  52 53 42 09 72 31 31 2c  |e, rox..RSB.r11,|
00002c70  20 79 5f 65 2c 20 72 6f  79 0a 09 4d 4f 56 53 09  | y_e, roy..MOVS.|
00002c80  72 31 30 2c 20 72 31 30  2c 20 41 53 52 20 72 6c  |r10, r10, ASR rl|
00002c90  78 09 09 3b 20 78 20 70  69 78 65 6c 20 63 6f 6f  |x..; x pixel coo|
00002ca0  72 64 20 72 65 6c 20 6c  65 66 74 20 73 63 72 65  |rd rel left scre|
00002cb0  65 6e 20 7d 20 6f 66 20  62 6f 74 74 6f 6d 20 6c  |en } of bottom l|
00002cc0  65 66 74 0a 09 4d 4f 56  09 72 31 31 2c 20 72 31  |eft..MOV.r11, r1|
00002cd0  31 2c 20 41 53 52 20 72  6c 79 09 09 3b 20 79 20  |1, ASR rly..; y |
00002ce0  70 69 78 65 6c 20 63 6f  6f 72 64 20 72 65 6c 20  |pixel coord rel |
00002cf0  74 6f 70 20 73 63 72 65  65 6e 20 20 7d 20 6f 66  |top screen  } of|
00002d00  20 6f 62 6a 65 63 74 0a  09 4d 4f 56 4d 49 09 72  | object..MOVMI.r|
00002d10  31 30 2c 20 23 30 09 09  09 09 3b 20 62 6f 64 67  |10, #0....; bodg|
00002d20  65 20 69 66 20 70 61 72  74 6c 79 20 6f 66 66 20  |e if partly off |
00002d30  73 63 72 65 65 6e 20 6c  65 66 74 0a 09 4c 44 52  |screen left..LDR|
00002d40  09 72 31 32 2c 20 5b 73  70 72 5f 65 2c 20 23 77  |.r12, [spr_e, #w|
00002d50  69 64 74 68 5d 0a 09 41  44 44 09 72 31 32 2c 20  |idth]..ADD.r12, |
00002d60  72 31 32 2c 20 23 31 09  09 09 3b 20 77 69 64 74  |r12, #1...; widt|
00002d70  68 20 69 6e 20 77 6f 72  64 73 0a 09 41 44 44 09  |h in words..ADD.|
00002d80  72 31 34 2c 20 72 31 30  2c 20 72 31 32 2c 20 41  |r14, r10, r12, A|
00002d90  53 4c 20 23 33 0a 09 43  4d 50 09 72 31 34 2c 20  |SL #3..CMP.r14, |
00002da0  23 36 34 30 0a 09 4d 4f  56 47 54 09 72 31 34 2c  |#640..MOVGT.r14,|
00002db0  20 72 31 32 2c 20 41 53  4c 20 23 33 0a 09 52 53  | r12, ASL #3..RS|
00002dc0  42 47 54 09 72 31 30 2c  20 72 31 34 2c 20 23 36  |BGT.r10, r14, #6|
00002dd0  34 30 09 09 09 3b 20 62  6f 64 67 65 20 69 66 20  |40...; bodge if |
00002de0  70 61 72 74 6c 79 20 6f  66 66 20 73 63 72 65 65  |partly off scree|
00002df0  6e 20 72 69 67 68 74 0a  09 4c 44 52 09 72 31 34  |n right..LDR.r14|
00002e00  2c 20 5b 73 70 72 5f 65  2c 20 23 68 65 69 67 68  |, [spr_e, #heigh|
00002e10  74 5d 0a 09 53 55 42 09  72 31 31 2c 20 72 31 31  |t]..SUB.r11, r11|
00002e20  2c 20 72 31 34 0a 09 41  44 44 09 72 31 31 2c 20  |, r14..ADD.r11, |
00002e30  72 31 31 2c 20 72 31 31  2c 20 41 53 4c 20 23 32  |r11, r11, ASL #2|
00002e40  0a 09 41 44 44 09 72 35  2c 20 72 35 2c 20 72 31  |..ADD.r5, r5, r1|
00002e50  31 2c 20 41 53 4c 20 23  36 0a 09 54 53 54 09 72  |1, ASL #6..TST.r|
00002e60  31 30 2c 20 23 37 0a 09  41 44 44 4e 45 09 72 31  |10, #7..ADDNE.r1|
00002e70  32 2c 20 72 31 32 2c 20  23 31 0a 09 42 49 43 09  |2, r12, #1..BIC.|
00002e80  72 31 30 2c 20 72 31 30  2c 20 23 37 0a 09 41 44  |r10, r10, #7..AD|
00002e90  44 09 72 35 2c 20 72 35  2c 20 72 31 30 2c 20 41  |D.r5, r5, r10, A|
00002ea0  53 52 20 23 31 09 09 3b  20 73 63 72 65 65 6e 20  |SR #1..; screen |
00002eb0  74 6f 70 20 6c 65 66 74  20 6f 66 20 73 70 72 69  |top left of spri|
00002ec0  74 65 0a 09 41 44 44 09  72 36 2c 20 72 31 34 2c  |te..ADD.r6, r14,|
00002ed0  20 23 31 09 09 09 3b 20  6e 75 6d 62 65 72 20 6f  | #1...; number o|
00002ee0  66 20 72 6f 77 73 20 74  6f 20 70 6c 6f 74 0a 09  |f rows to plot..|
00002ef0  41 4e 44 09 72 31 34 2c  20 72 31 32 2c 20 23 33  |AND.r14, r12, #3|
00002f00  0a 09 4d 4f 56 53 09 72  31 32 2c 20 72 31 32 2c  |..MOVS.r12, r12,|
00002f10  20 41 53 52 20 23 32 0a  09 4d 4f 56 09 72 30 2c  | ASR #2..MOV.r0,|
00002f20  20 23 30 0a 09 42 45 51  09 65 73 5f 6e 61 72 72  | #0..BEQ.es_narr|
00002f30  6f 77 0a 09 4d 4f 56 09  72 31 2c 20 72 30 0a 09  |ow..MOV.r1, r0..|
00002f40  4d 4f 56 09 72 32 2c 20  72 30 0a 09 4d 4f 56 09  |MOV.r2, r0..MOV.|
00002f50  72 33 2c 20 72 30 0a 65  73 5f 6e 65 78 74 72 6f  |r3, r0.es_nextro|
00002f60  77 0a 09 4d 4f 56 09 72  31 30 2c 20 72 35 0a 09  |w..MOV.r10, r5..|
00002f70  4d 4f 56 09 72 31 31 2c  20 72 31 32 0a 65 73 5f  |MOV.r11, r12.es_|
00002f80  6e 65 78 74 63 6f 6c 0a  09 53 54 52 09 72 32 2c  |nextcol..STR.r2,|
00002f90  20 5b 72 31 30 5d 2c 20  23 34 0a 09 53 54 4d 49  | [r10], #4..STMI|
00002fa0  41 09 72 31 30 21 2c 20  7b 72 30 2d 72 33 7d 0a  |A.r10!, {r0-r3}.|
00002fb0  09 53 55 42 53 09 72 31  31 2c 20 72 31 31 2c 20  |.SUBS.r11, r11, |
00002fc0  23 31 0a 09 42 4c 45 09  65 73 5f 65 6e 64 6d 75  |#1..BLE.es_endmu|
00002fd0  6c 74 63 6f 6c 0a 09 53  54 52 09 72 32 2c 20 5b  |ltcol..STR.r2, [|
00002fe0  72 31 30 5d 2c 20 23 34  0a 09 53 54 4d 49 41 09  |r10], #4..STMIA.|
00002ff0  72 31 30 21 2c 20 7b 72  30 2d 72 33 7d 0a 09 53  |r10!, {r0-r3}..S|
00003000  55 42 53 09 72 31 31 2c  20 72 31 31 2c 20 23 31  |UBS.r11, r11, #1|
00003010  0a 09 42 4c 45 09 65 73  5f 65 6e 64 6d 75 6c 74  |..BLE.es_endmult|
00003020  63 6f 6c 0a 09 53 54 52  09 72 32 2c 20 5b 72 31  |col..STR.r2, [r1|
00003030  30 5d 2c 20 23 34 0a 09  53 54 4d 49 41 09 72 31  |0], #4..STMIA.r1|
00003040  30 21 2c 20 7b 72 30 2d  72 33 7d 0a 09 53 55 42  |0!, {r0-r3}..SUB|
00003050  53 09 72 31 31 2c 20 72  31 31 2c 20 23 31 0a 09  |S.r11, r11, #1..|
00003060  42 4c 45 09 65 73 5f 65  6e 64 6d 75 6c 74 63 6f  |BLE.es_endmultco|
00003070  6c 0a 09 53 54 52 09 72  32 2c 20 5b 72 31 30 5d  |l..STR.r2, [r10]|
00003080  2c 20 23 34 0a 09 53 54  4d 49 41 09 72 31 30 21  |, #4..STMIA.r10!|
00003090  2c 20 7b 72 30 2d 72 33  7d 0a 09 53 55 42 53 09  |, {r0-r3}..SUBS.|
000030a0  72 31 31 2c 20 72 31 31  2c 20 23 31 0a 09 42 47  |r11, r11, #1..BG|
000030b0  54 09 65 73 5f 6e 65 78  74 63 6f 6c 0a 65 73 5f  |T.es_nextcol.es_|
000030c0  65 6e 64 6d 75 6c 74 63  6f 6c 0a 09 4d 4f 56 09  |endmultcol..MOV.|
000030d0  72 31 31 2c 20 72 31 34  0a 09 53 54 52 09 72 30  |r11, r14..STR.r0|
000030e0  2c 20 5b 72 31 30 5d 2c  20 23 34 0a 09 53 55 42  |, [r10], #4..SUB|
000030f0  53 09 72 31 31 2c 20 72  31 31 2c 20 23 31 0a 09  |S.r11, r11, #1..|
00003100  42 4c 45 09 65 73 5f 65  6e 64 63 6f 6c 0a 09 53  |BLE.es_endcol..S|
00003110  54 52 09 72 30 2c 20 5b  72 31 30 5d 2c 20 23 34  |TR.r0, [r10], #4|
00003120  0a 09 53 55 42 53 09 72  31 31 2c 20 72 31 31 2c  |..SUBS.r11, r11,|
00003130  20 23 31 0a 09 42 4c 45  09 65 73 5f 65 6e 64 63  | #1..BLE.es_endc|
00003140  6f 6c 0a 09 53 54 52 09  72 30 2c 20 5b 72 31 30  |ol..STR.r0, [r10|
00003150  5d 2c 20 23 34 0a 09 53  55 42 53 09 72 31 31 2c  |], #4..SUBS.r11,|
00003160  20 72 31 31 2c 20 23 31  0a 09 42 4c 45 09 65 73  | r11, #1..BLE.es|
00003170  5f 65 6e 64 63 6f 6c 0a  09 53 54 52 09 72 30 2c  |_endcol..STR.r0,|
00003180  20 5b 72 31 30 5d 2c 20  23 34 0a 65 73 5f 65 6e  | [r10], #4.es_en|
00003190  64 63 6f 6c 0a 09 41 44  44 09 72 35 2c 20 72 35  |dcol..ADD.r5, r5|
000031a0  2c 20 23 33 32 30 0a 09  53 55 42 53 09 72 36 2c  |, #320..SUBS.r6,|
000031b0  20 72 36 2c 20 23 31 0a  09 42 47 54 09 65 73 5f  | r6, #1..BGT.es_|
000031c0  6e 65 78 74 72 6f 77 0a  09 42 09 65 73 5f 65 78  |nextrow..B.es_ex|
000031d0  69 74 0a 65 73 5f 6e 61  72 72 6f 77 0a 65 73 5f  |it.es_narrow.es_|
000031e0  6e 6e 65 78 74 72 6f 77  0a 09 4d 4f 56 09 72 31  |nnextrow..MOV.r1|
000031f0  30 2c 20 72 35 0a 09 4d  4f 56 09 72 31 31 2c 20  |0, r5..MOV.r11, |
00003200  72 31 34 0a 09 53 54 52  09 72 30 2c 20 5b 72 31  |r14..STR.r0, [r1|
00003210  30 5d 2c 20 23 34 0a 09  53 55 42 53 09 72 31 31  |0], #4..SUBS.r11|
00003220  2c 20 72 31 31 2c 20 23  31 0a 09 42 4c 45 09 65  |, r11, #1..BLE.e|
00003230  73 5f 6e 65 6e 64 63 6f  6c 0a 09 53 54 52 09 72  |s_nendcol..STR.r|
00003240  30 2c 20 5b 72 31 30 5d  2c 20 23 34 0a 09 53 55  |0, [r10], #4..SU|
00003250  42 53 09 72 31 31 2c 20  72 31 31 2c 20 23 31 0a  |BS.r11, r11, #1.|
00003260  09 42 4c 45 09 65 73 5f  6e 65 6e 64 63 6f 6c 0a  |.BLE.es_nendcol.|
00003270  09 53 54 52 09 72 30 2c  20 5b 72 31 30 5d 2c 20  |.STR.r0, [r10], |
00003280  23 34 0a 09 53 55 42 53  09 72 31 31 2c 20 72 31  |#4..SUBS.r11, r1|
00003290  31 2c 20 23 31 0a 09 42  4c 45 09 65 73 5f 6e 65  |1, #1..BLE.es_ne|
000032a0  6e 64 63 6f 6c 0a 09 53  54 52 09 72 30 2c 20 5b  |ndcol..STR.r0, [|
000032b0  72 31 30 5d 2c 20 23 34  0a 65 73 5f 6e 65 6e 64  |r10], #4.es_nend|
000032c0  63 6f 6c 0a 09 41 44 44  09 72 35 2c 20 72 35 2c  |col..ADD.r5, r5,|
000032d0  20 23 33 32 30 0a 09 53  55 42 53 09 72 36 2c 20  | #320..SUBS.r6, |
000032e0  72 36 2c 20 23 31 0a 09  42 47 54 09 65 73 5f 6e  |r6, #1..BGT.es_n|
000032f0  6e 65 78 74 72 6f 77 0a  0a 65 73 5f 65 78 69 74  |nextrow..es_exit|
00003300  09 4c 44 4d 46 44 09 73  70 21 2c 20 7b 72 34 2d  |.LDMFD.sp!, {r4-|
00003310  72 39 2c 20 73 6c 2c 20  66 70 2c 20 70 63 7d 5e  |r9, sl, fp, pc}^|
00003320  0a 0a 0a 0a 3b 20 65 72  61 73 65 5f 68 61 6e 64  |....; erase_hand|
00003330  0a 3b 20 61 20 6c 65 61  66 20 41 50 43 53 20 66  |.; a leaf APCS f|
00003340  75 6e 63 74 69 6f 6e 0a  3b 0a 3b 20 43 20 70 72  |unction.;.; C pr|
00003350  6f 74 6f 74 79 70 65 3a  0a 3b 20 76 6f 69 64 20  |ototype:.; void |
00003360  65 72 61 73 65 5f 68 61  6e 64 28 76 6f 69 64 20  |erase_hand(void |
00003370  2a 61 72 65 61 2c 20 76  6f 69 64 20 2a 73 70 72  |*area, void *spr|
00003380  2c 20 69 6e 74 20 78 2c  20 69 6e 74 20 79 29 3b  |, int x, int y);|
00003390  0a 3b 0a 3b 20 6e 62 20  20 61 73 73 75 6d 65 73  |.;.; nb  assumes|
000033a0  20 66 69 74 73 20 6f 6e  20 73 63 72 65 65 6e 20  | fits on screen |
000033b0  26 20 6e 6f 20 63 6c 69  70 70 69 6e 67 20 6e 65  |& no clipping ne|
000033c0  65 64 65 64 0a 3b 20 6e  62 32 20 61 6c 73 6f 20  |eded.; nb2 also |
000033d0  61 73 73 75 6d 65 73 20  73 70 72 69 74 65 20 69  |assumes sprite i|
000033e0  73 20 6d 75 6c 74 69 70  6c 65 20 6f 66 20 38 20  |s multiple of 8 |
000033f0  70 69 78 65 6c 73 20 77  69 64 65 2c 20 69 73 20  |pixels wide, is |
00003400  34 62 70 70 20 26 20 73  63 72 65 65 6e 20 6d 6f  |4bpp & screen mo|
00003410  64 65 20 69 73 20 36 34  30 20 70 69 78 65 6c 73  |de is 640 pixels|
00003420  20 77 69 64 65 0a 3b 20  69 67 6e 6f 72 65 20 73  | wide.; ignore s|
00003430  70 72 69 74 65 20 6d 61  73 6b 20 69 66 20 69 74  |prite mask if it|
00003440  20 68 61 73 20 6f 6e 65  2c 20 62 75 74 20 74 72  | has one, but tr|
00003450  65 61 74 20 63 6f 6c 6f  75 72 20 30 20 70 69 78  |eat colour 0 pix|
00003460  65 6c 73 20 61 73 20 74  72 61 6e 73 70 61 72 65  |els as transpare|
00003470  6e 74 3b 0a 3b 20 61 6c  73 6f 2c 20 74 72 65 61  |nt;.; also, trea|
00003480  74 20 73 63 72 65 65 6e  20 70 69 78 65 6c 73 20  |t screen pixels |
00003490  6f 66 20 63 6f 6c 6f 75  72 73 20 38 20 74 6f 20  |of colours 8 to |
000034a0  31 35 20 61 73 20 6c 79  69 6e 67 20 69 6e 66 72  |15 as lying infr|
000034b0  6f 6e 74 20 6f 66 20 68  61 6e 64 20 73 70 72 69  |ont of hand spri|
000034c0  74 65 0a 3b 0a 09 45 58  50 4f 52 54 09 65 72 61  |te.;..EXPORT.era|
000034d0  73 65 5f 68 61 6e 64 0a  0a 65 68 6e 73 74 61 09  |se_hand..ehnsta.|
000034e0  44 43 42 09 22 65 72 61  73 65 5f 68 61 6e 64 22  |DCB."erase_hand"|
000034f0  2c 20 30 0a 09 41 4c 49  47 4e 0a 65 68 6e 65 6e  |, 0..ALIGN.ehnen|
00003500  64 09 44 43 44 09 26 66  66 30 30 30 30 30 30 20  |d.DCD.&ff000000 |
00003510  2b 20 65 68 6e 65 6e 64  20 2d 20 65 68 6e 73 74  |+ ehnend - ehnst|
00003520  61 0a 0a 65 68 73 70 09  44 43 44 09 30 0a 0a 65  |a..ehsp.DCD.0..e|
00003530  72 61 73 65 5f 68 61 6e  64 0a 0a 09 53 54 4d 46  |rase_hand...STMF|
00003540  44 09 73 70 21 2c 20 7b  72 34 2d 72 39 2c 20 73  |D.sp!, {r4-r9, s|
00003550  6c 2c 20 66 70 2c 20 6c  72 7d 0a 09 53 54 52 09  |l, fp, lr}..STR.|
00003560  73 70 2c 20 65 68 73 70  0a 09 41 44 52 4c 09 72  |sp, ehsp..ADRL.r|
00003570  34 2c 20 76 62 6c 73 0a  09 4c 44 4d 49 41 09 72  |4, vbls..LDMIA.r|
00003580  34 2c 20 7b 72 34 2d 72  39 7d 0a 09 4c 44 52 09  |4, {r4-r9}..LDR.|
00003590  72 34 2c 20 5b 72 62 61  6e 6b 5d 0a 09 53 55 42  |r4, [rbank]..SUB|
000035a0  09 72 34 2c 20 72 34 2c  20 23 31 0a 09 4c 44 52  |.r4, r4, #1..LDR|
000035b0  09 72 35 2c 20 5b 72 73  63 72 73 74 2c 20 72 34  |.r5, [rscrst, r4|
000035c0  2c 20 4c 53 4c 20 23 32  5d 09 3b 20 73 63 72 65  |, LSL #2].; scre|
000035d0  65 6e 20 62 61 73 65 20  61 64 64 72 20 66 6f 72  |en base addr for|
000035e0  20 56 44 55 20 6f 75 74  70 75 74 0a 09 4c 44 52  | VDU output..LDR|
000035f0  09 72 6f 78 2c 20 5b 72  6f 78 5d 0a 09 4c 44 52  |.rox, [rox]..LDR|
00003600  09 72 6f 79 2c 20 5b 72  6f 79 5d 0a 09 4c 44 52  |.roy, [roy]..LDR|
00003610  09 72 6c 78 2c 20 5b 72  6c 78 5d 0a 09 4c 44 52  |.rlx, [rlx]..LDR|
00003620  09 72 6c 79 2c 20 5b 72  6c 79 5d 0a 09 41 44 44  |.rly, [rly]..ADD|
00003630  09 72 31 30 2c 20 78 2c  20 72 6f 78 0a 09 52 53  |.r10, x, rox..RS|
00003640  42 09 72 31 31 2c 20 79  2c 20 72 6f 79 0a 09 4d  |B.r11, y, roy..M|
00003650  4f 56 09 72 31 30 2c 20  72 31 30 2c 20 41 53 52  |OV.r10, r10, ASR|
00003660  20 72 6c 78 09 09 3b 20  78 20 70 69 78 65 6c 20  | rlx..; x pixel |
00003670  63 6f 6f 72 64 20 72 65  6c 20 6c 65 66 74 20 73  |coord rel left s|
00003680  63 72 65 65 6e 20 7d 20  6f 66 20 62 6f 74 74 6f  |creen } of botto|
00003690  6d 20 6c 65 66 74 0a 09  4d 4f 56 09 72 31 31 2c  |m left..MOV.r11,|
000036a0  20 72 31 31 2c 20 41 53  52 20 72 6c 79 09 09 3b  | r11, ASR rly..;|
000036b0  20 79 20 70 69 78 65 6c  20 63 6f 6f 72 64 20 72  | y pixel coord r|
000036c0  65 6c 20 74 6f 70 20 73  63 72 65 65 6e 20 20 7d  |el top screen  }|
000036d0  20 6f 66 20 6f 62 6a 65  63 74 0a 09 43 4d 50 09  | of object..CMP.|
000036e0  72 31 30 2c 20 23 32 35  09 09 09 3b 20 63 6f 6e  |r10, #25...; con|
000036f0  73 74 61 69 6e 20 74 6f  20 62 65 20 6e 6f 74 20  |stain to be not |
00003700  6f 66 66 20 6c 65 66 74  20 73 69 64 65 20 73 63  |off left side sc|
00003710  72 65 65 6e 0a 09 4d 4f  56 4c 54 09 72 31 30 2c  |reen..MOVLT.r10,|
00003720  20 23 32 35 0a 09 4c 44  52 09 72 31 32 2c 20 5b  | #25..LDR.r12, [|
00003730  73 70 72 2c 20 23 77 69  64 74 68 5d 0a 09 41 44  |spr, #width]..AD|
00003740  44 09 72 31 32 2c 20 72  31 32 2c 20 23 31 09 09  |D.r12, r12, #1..|
00003750  09 3b 20 77 69 64 74 68  20 69 6e 20 77 6f 72 64  |.; width in word|
00003760  73 0a 09 41 44 44 09 72  31 34 2c 20 72 31 30 2c  |s..ADD.r14, r10,|
00003770  20 72 31 32 2c 20 41 53  4c 20 23 33 0a 09 43 4d  | r12, ASL #3..CM|
00003780  50 09 72 31 34 2c 20 23  36 31 32 0a 09 4d 4f 56  |P.r14, #612..MOV|
00003790  47 54 09 72 31 34 2c 20  72 31 32 2c 20 41 53 4c  |GT.r14, r12, ASL|
000037a0  20 23 33 09 09 3b 20 63  6f 6e 73 74 72 61 69 6e  | #3..; constrain|
000037b0  20 74 6f 20 62 65 20 6e  6f 74 20 6f 66 66 20 72  | to be not off r|
000037c0  69 67 68 74 20 73 69 64  65 20 73 63 72 65 65 6e  |ight side screen|
000037d0  0a 09 52 53 42 47 54 09  72 31 30 2c 20 72 31 34  |..RSBGT.r10, r14|
000037e0  2c 20 23 36 31 32 0a 09  4c 44 52 09 72 31 34 2c  |, #612..LDR.r14,|
000037f0  20 5b 73 70 72 2c 20 23  68 65 69 67 68 74 5d 0a  | [spr, #height].|
00003800  09 53 55 42 09 72 31 31  2c 20 72 31 31 2c 20 72  |.SUB.r11, r11, r|
00003810  31 34 0a 09 41 44 44 09  72 31 31 2c 20 72 31 31  |14..ADD.r11, r11|
00003820  2c 20 72 31 31 2c 20 41  53 4c 20 23 32 0a 09 41  |, r11, ASL #2..A|
00003830  44 44 09 72 35 2c 20 72  35 2c 20 72 31 31 2c 20  |DD.r5, r5, r11, |
00003840  41 53 4c 20 23 36 0a 09  41 4e 44 09 72 30 2c 20  |ASL #6..AND.r0, |
00003850  72 31 30 2c 20 23 37 0a  09 42 49 43 09 72 31 30  |r10, #7..BIC.r10|
00003860  2c 20 72 31 30 2c 20 23  37 0a 09 41 44 44 09 72  |, r10, #7..ADD.r|
00003870  35 2c 20 72 35 2c 20 72  31 30 2c 20 41 53 52 20  |5, r5, r10, ASR |
00003880  23 31 09 09 3b 20 73 63  72 65 65 6e 20 74 6f 70  |#1..; screen top|
00003890  20 6c 65 66 74 20 6f 66  20 68 61 6e 64 0a 09 41  | left of hand..A|
000038a0  44 44 09 72 36 2c 20 72  31 34 2c 20 23 31 09 09  |DD.r6, r14, #1..|
000038b0  09 3b 20 6e 75 6d 62 65  72 20 6f 66 20 72 6f 77  |.; number of row|
000038c0  73 20 74 6f 20 70 6c 6f  74 0a 09 4d 4f 56 09 72  |s to plot..MOV.r|
000038d0  30 2c 20 72 30 2c 20 41  53 4c 20 23 32 0a 09 52  |0, r0, ASL #2..R|
000038e0  53 42 09 72 31 2c 20 72  30 2c 20 23 33 32 0a 09  |SB.r1, r0, #32..|
000038f0  4d 4f 56 09 72 31 34 2c  20 23 26 38 38 0a 09 4f  |MOV.r14, #&88..O|
00003900  52 52 09 72 31 34 2c 20  72 31 34 2c 20 72 31 34  |RR.r14, r14, r14|
00003910  2c 20 4c 53 4c 20 23 38  0a 09 4f 52 52 09 72 31  |, LSL #8..ORR.r1|
00003920  34 2c 20 72 31 34 2c 20  72 31 34 2c 20 4c 53 4c  |4, r14, r14, LSL|
00003930  20 23 31 36 09 09 3b 20  6d 61 73 6b 69 6e 67 20  | #16..; masking |
00003940  63 6f 6e 73 74 61 6e 74  20 26 38 38 38 38 38 38  |constant &888888|
00003950  38 38 0a 65 68 5f 6e 65  78 74 72 6f 77 0a 09 4d  |88.eh_nextrow..M|
00003960  4f 56 09 72 31 30 2c 20  72 35 09 09 09 09 3b 20  |OV.r10, r5....; |
00003970  73 74 61 72 74 20 6f 66  20 63 75 72 72 65 6e 74  |start of current|
00003980  20 72 6f 77 20 6f 6e 20  73 63 72 65 65 6e 0a 09  | row on screen..|
00003990  4d 4f 56 09 72 31 31 2c  20 72 31 32 09 09 09 3b  |MOV.r11, r12...;|
000039a0  20 6e 75 6d 62 65 72 20  6f 66 20 63 6f 6c 73 20  | number of cols |
000039b0  74 6f 20 70 6c 6f 74 0a  65 68 5f 6e 65 78 74 63  |to plot.eh_nextc|
000039c0  6f 6c 0a 09 4c 44 52 09  72 38 2c 20 5b 72 31 30  |ol..LDR.r8, [r10|
000039d0  5d 09 09 09 3b 20 73 63  72 65 65 6e 20 64 61 74  |]...; screen dat|
000039e0  61 0a 09 41 4e 44 09 72  39 2c 20 72 38 2c 20 72  |a..AND.r9, r8, r|
000039f0  31 34 0a 09 4f 52 52 09  72 39 2c 20 72 39 2c 20  |14..ORR.r9, r9, |
00003a00  72 39 2c 20 4c 53 52 20  23 31 0a 09 4f 52 52 09  |r9, LSR #1..ORR.|
00003a10  72 39 2c 20 72 39 2c 20  72 39 2c 20 4c 53 52 20  |r9, r9, r9, LSR |
00003a20  23 32 0a 09 41 4e 44 09  72 38 2c 20 72 38 2c 20  |#2..AND.r8, r8, |
00003a30  72 39 0a 09 53 54 52 09  72 38 2c 20 5b 72 31 30  |r9..STR.r8, [r10|
00003a40  5d 2c 20 23 34 0a 09 53  55 42 53 09 72 31 31 2c  |], #4..SUBS.r11,|
00003a50  20 72 31 31 2c 20 23 31  0a 09 42 4c 45 09 65 68  | r11, #1..BLE.eh|
00003a60  5f 65 6e 64 63 6f 6c 0a  09 4c 44 52 09 72 38 2c  |_endcol..LDR.r8,|
00003a70  20 5b 72 31 30 5d 09 09  09 3b 20 73 63 72 65 65  | [r10]...; scree|
00003a80  6e 20 64 61 74 61 0a 09  41 4e 44 09 72 39 2c 20  |n data..AND.r9, |
00003a90  72 38 2c 20 72 31 34 0a  09 4f 52 52 09 72 39 2c  |r8, r14..ORR.r9,|
00003aa0  20 72 39 2c 20 72 39 2c  20 4c 53 52 20 23 31 0a  | r9, r9, LSR #1.|
00003ab0  09 4f 52 52 09 72 39 2c  20 72 39 2c 20 72 39 2c  |.ORR.r9, r9, r9,|
00003ac0  20 4c 53 52 20 23 32 0a  09 41 4e 44 09 72 38 2c  | LSR #2..AND.r8,|
00003ad0  20 72 38 2c 20 72 39 0a  09 53 54 52 09 72 38 2c  | r8, r9..STR.r8,|
00003ae0  20 5b 72 31 30 5d 2c 20  23 34 0a 09 53 55 42 53  | [r10], #4..SUBS|
00003af0  09 72 31 31 2c 20 72 31  31 2c 20 23 31 0a 09 42  |.r11, r11, #1..B|
00003b00  4c 45 09 65 68 5f 65 6e  64 63 6f 6c 0a 09 4c 44  |LE.eh_endcol..LD|
00003b10  52 09 72 38 2c 20 5b 72  31 30 5d 09 09 09 3b 20  |R.r8, [r10]...; |
00003b20  73 63 72 65 65 6e 20 64  61 74 61 0a 09 41 4e 44  |screen data..AND|
00003b30  09 72 39 2c 20 72 38 2c  20 72 31 34 0a 09 4f 52  |.r9, r8, r14..OR|
00003b40  52 09 72 39 2c 20 72 39  2c 20 72 39 2c 20 4c 53  |R.r9, r9, r9, LS|
00003b50  52 20 23 31 0a 09 4f 52  52 09 72 39 2c 20 72 39  |R #1..ORR.r9, r9|
00003b60  2c 20 72 39 2c 20 4c 53  52 20 23 32 0a 09 41 4e  |, r9, LSR #2..AN|
00003b70  44 09 72 38 2c 20 72 38  2c 20 72 39 0a 09 53 54  |D.r8, r8, r9..ST|
00003b80  52 09 72 38 2c 20 5b 72  31 30 5d 2c 20 23 34 0a  |R.r8, [r10], #4.|
00003b90  09 53 55 42 53 09 72 31  31 2c 20 72 31 31 2c 20  |.SUBS.r11, r11, |
00003ba0  23 31 0a 09 42 4c 45 09  65 68 5f 65 6e 64 63 6f  |#1..BLE.eh_endco|
00003bb0  6c 0a 09 4c 44 52 09 72  38 2c 20 5b 72 31 30 5d  |l..LDR.r8, [r10]|
00003bc0  09 09 09 3b 20 73 63 72  65 65 6e 20 64 61 74 61  |...; screen data|
00003bd0  0a 09 41 4e 44 09 72 39  2c 20 72 38 2c 20 72 31  |..AND.r9, r8, r1|
00003be0  34 0a 09 4f 52 52 09 72  39 2c 20 72 39 2c 20 72  |4..ORR.r9, r9, r|
00003bf0  39 2c 20 4c 53 52 20 23  31 0a 09 4f 52 52 09 72  |9, LSR #1..ORR.r|
00003c00  39 2c 20 72 39 2c 20 72  39 2c 20 4c 53 52 20 23  |9, r9, r9, LSR #|
00003c10  32 0a 09 41 4e 44 09 72  38 2c 20 72 38 2c 20 72  |2..AND.r8, r8, r|
00003c20  39 0a 09 53 54 52 09 72  38 2c 20 5b 72 31 30 5d  |9..STR.r8, [r10]|
00003c30  2c 20 23 34 0a 09 53 55  42 53 09 72 31 31 2c 20  |, #4..SUBS.r11, |
00003c40  72 31 31 2c 20 23 31 0a  09 42 47 54 09 65 68 5f  |r11, #1..BGT.eh_|
00003c50  6e 65 78 74 63 6f 6c 0a  65 68 5f 65 6e 64 63 6f  |nextcol.eh_endco|
00003c60  6c 0a 09 43 4d 50 09 72  30 2c 20 23 30 0a 09 4c  |l..CMP.r0, #0..L|
00003c70  44 52 4e 45 09 72 38 2c  20 5b 72 31 30 5d 09 09  |DRNE.r8, [r10]..|
00003c80  09 3b 20 73 63 72 65 65  6e 20 64 61 74 61 0a 09  |.; screen data..|
00003c90  41 4e 44 4e 45 09 72 39  2c 20 72 38 2c 20 72 31  |ANDNE.r9, r8, r1|
00003ca0  34 0a 09 4f 52 52 4e 45  09 72 39 2c 20 72 39 2c  |4..ORRNE.r9, r9,|
00003cb0  20 72 39 2c 20 4c 53 52  20 23 31 0a 09 4f 52 52  | r9, LSR #1..ORR|
00003cc0  4e 45 09 72 39 2c 20 72  39 2c 20 72 39 2c 20 4c  |NE.r9, r9, r9, L|
00003cd0  53 52 20 23 32 0a 09 41  4e 44 4e 45 09 72 38 2c  |SR #2..ANDNE.r8,|
00003ce0  20 72 38 2c 20 72 39 0a  09 53 54 52 4e 45 09 72  | r8, r9..STRNE.r|
00003cf0  38 2c 20 5b 72 31 30 5d  2c 20 23 34 0a 09 41 44  |8, [r10], #4..AD|
00003d00  44 09 72 35 2c 20 72 35  2c 20 23 33 32 30 0a 09  |D.r5, r5, #320..|
00003d10  53 55 42 53 09 72 36 2c  20 72 36 2c 20 23 31 0a  |SUBS.r6, r6, #1.|
00003d20  09 42 47 54 09 65 68 5f  6e 65 78 74 72 6f 77 0a  |.BGT.eh_nextrow.|
00003d30  0a 65 68 5f 65 78 69 74  09 4c 44 52 09 73 70 2c  |.eh_exit.LDR.sp,|
00003d40  20 65 68 73 70 0a 09 4c  44 4d 46 44 09 73 70 21  | ehsp..LDMFD.sp!|
00003d50  2c 20 7b 72 34 2d 72 39  2c 20 73 6c 2c 20 66 70  |, {r4-r9, sl, fp|
00003d60  2c 20 70 63 7d 5e 0a 0a  0a 0a 3b 20 65 72 61 73  |, pc}^....; eras|
00003d70  65 5f 6e 75 6d 62 65 72  0a 3b 20 61 20 6c 65 61  |e_number.; a lea|
00003d80  66 20 41 50 43 53 20 66  75 6e 63 74 69 6f 6e 0a  |f APCS function.|
00003d90  3b 0a 3b 20 43 20 70 72  6f 74 6f 74 79 70 65 3a  |;.; C prototype:|
00003da0  0a 3b 20 76 6f 69 64 20  65 72 61 73 65 5f 6e 75  |.; void erase_nu|
00003db0  6d 62 65 72 28 76 6f 69  64 20 2a 61 72 65 61 2c  |mber(void *area,|
00003dc0  20 76 6f 69 64 20 2a 73  70 72 2c 20 69 6e 74 20  | void *spr, int |
00003dd0  78 2c 20 69 6e 74 20 79  29 3b 0a 3b 0a 3b 20 61  |x, int y);.;.; a|
00003de0  63 74 75 61 6c 6c 79 20  74 68 69 73 20 66 6e 20  |ctually this fn |
00003df0  70 6c 6f 74 73 20 61 20  33 32 20 78 20 68 74 20  |plots a 32 x ht |
00003e00  73 70 72 69 74 65 20 6f  6e 20 73 63 72 65 65 6e  |sprite on screen|
00003e10  20 6f 76 65 72 20 74 68  65 20 6e 75 6d 62 65 72  | over the number|
00003e20  20 2d 20 73 70 72 69 74  65 0a 3b 20 73 68 6f 75  | - sprite.; shou|
00003e30  6c 64 20 62 65 20 73 65  74 20 75 70 20 62 65 66  |ld be set up bef|
00003e40  6f 72 65 20 74 6f 20 61  20 63 6f 70 79 20 6f 66  |ore to a copy of|
00003e50  20 74 68 65 20 62 61 63  6b 67 72 6f 75 6e 64 20  | the background |
00003e60  62 65 68 69 6e 64 20 74  68 65 20 6e 75 6d 62 65  |behind the numbe|
00003e70  72 0a 3b 20 28 68 74 20  3d 20 33 32 20 69 66 20  |r.; (ht = 32 if |
00003e80  76 67 61 20 65 6c 73 65  20 31 36 29 0a 3b 0a 3b  |vga else 16).;.;|
00003e90  20 6e 62 20 20 61 73 73  75 6d 65 73 20 66 69 74  | nb  assumes fit|
00003ea0  73 20 6f 6e 20 73 63 72  65 65 6e 20 26 20 63 61  |s on screen & ca|
00003eb0  6e 20 64 6f 20 61 20 66  61 73 74 20 70 6c 6f 74  |n do a fast plot|
00003ec0  20 77 69 74 68 20 6e 6f  20 63 6c 69 70 70 69 6e  | with no clippin|
00003ed0  67 0a 3b 20 61 6c 73 6f  20 74 68 61 74 20 69 73  |g.; also that is|
00003ee0  20 62 65 69 6e 67 20 70  72 69 6e 74 65 64 20 61  | being printed a|
00003ef0  74 20 61 20 77 6f 72 64  20 61 6c 69 67 6e 65 64  |t a word aligned|
00003f00  20 61 64 64 72 65 73 73  20 28 69 65 20 78 20 69  | address (ie x i|
00003f10  73 20 61 20 6d 75 6c 74  69 70 6c 65 20 6f 66 20  |s a multiple of |
00003f20  38 29 0a 3b 20 61 73 73  75 6d 65 73 20 73 70 72  |8).; assumes spr|
00003f30  69 74 65 20 69 73 20 33  32 20 62 79 20 68 74 20  |ite is 32 by ht |
00003f40  70 69 78 65 6c 73 2c 20  34 62 70 70 20 26 20 73  |pixels, 4bpp & s|
00003f50  63 72 65 65 6e 20 6d 6f  64 65 20 69 73 20 36 34  |creen mode is 64|
00003f60  30 20 70 69 78 65 6c 73  20 77 69 64 65 0a 3b 0a  |0 pixels wide.;.|
00003f70  09 45 58 50 4f 52 54 09  65 72 61 73 65 5f 6e 75  |.EXPORT.erase_nu|
00003f80  6d 62 65 72 0a 0a 65 6e  6e 73 74 61 09 44 43 42  |mber..ennsta.DCB|
00003f90  09 22 65 72 61 73 65 5f  6e 75 6d 62 65 72 22 2c  |."erase_number",|
00003fa0  20 30 0a 09 41 4c 49 47  4e 0a 65 6e 6e 65 6e 64  | 0..ALIGN.ennend|
00003fb0  09 44 43 44 09 26 66 66  30 30 30 30 30 30 20 2b  |.DCD.&ff000000 +|
00003fc0  20 65 6e 6e 65 6e 64 20  2d 20 65 6e 6e 73 74 61  | ennend - ennsta|
00003fd0  0a 0a 65 72 61 73 65 5f  6e 75 6d 62 65 72 0a 0a  |..erase_number..|
00003fe0  09 53 54 4d 46 44 09 73  70 21 2c 20 7b 72 34 2d  |.STMFD.sp!, {r4-|
00003ff0  72 39 2c 20 73 6c 2c 20  66 70 2c 20 6c 72 7d 0a  |r9, sl, fp, lr}.|
00004000  09 41 44 52 4c 09 72 34  2c 20 76 62 6c 73 0a 09  |.ADRL.r4, vbls..|
00004010  4c 44 4d 49 41 09 72 34  2c 20 7b 72 34 2d 72 39  |LDMIA.r4, {r4-r9|
00004020  7d 0a 09 4c 44 52 09 72  34 2c 20 5b 72 62 61 6e  |}..LDR.r4, [rban|
00004030  6b 5d 0a 09 53 55 42 09  72 34 2c 20 72 34 2c 20  |k]..SUB.r4, r4, |
00004040  23 31 0a 09 4c 44 52 09  72 35 2c 20 5b 72 73 63  |#1..LDR.r5, [rsc|
00004050  72 73 74 2c 20 72 34 2c  20 4c 53 4c 20 23 32 5d  |rst, r4, LSL #2]|
00004060  09 3b 20 73 63 72 65 65  6e 20 62 61 73 65 20 61  |.; screen base a|
00004070  64 64 72 20 66 6f 72 20  56 44 55 20 6f 75 74 70  |ddr for VDU outp|
00004080  75 74 0a 09 4c 44 52 09  72 6f 78 2c 20 5b 72 6f  |ut..LDR.rox, [ro|
00004090  78 5d 0a 09 4c 44 52 09  72 6f 79 2c 20 5b 72 6f  |x]..LDR.roy, [ro|
000040a0  79 5d 0a 09 4c 44 52 09  72 6c 78 2c 20 5b 72 6c  |y]..LDR.rlx, [rl|
000040b0  78 5d 0a 09 4c 44 52 09  72 6c 79 2c 20 5b 72 6c  |x]..LDR.rly, [rl|
000040c0  79 5d 0a 09 41 44 44 09  72 31 30 2c 20 78 2c 20  |y]..ADD.r10, x, |
000040d0  72 6f 78 0a 09 52 53 42  09 72 31 31 2c 20 79 2c  |rox..RSB.r11, y,|
000040e0  20 72 6f 79 0a 09 53 55  42 09 72 31 31 2c 20 72  | roy..SUB.r11, r|
000040f0  31 31 2c 20 23 36 34 0a  09 4d 4f 56 09 72 31 30  |11, #64..MOV.r10|
00004100  2c 20 72 31 30 2c 20 41  53 52 20 72 6c 78 09 09  |, r10, ASR rlx..|
00004110  3b 20 78 20 70 69 78 65  6c 20 63 6f 6f 72 64 20  |; x pixel coord |
00004120  72 65 6c 20 6c 65 66 74  20 73 63 72 65 65 6e 20  |rel left screen |
00004130  7d 20 6f 66 20 74 6f 70  20 6c 65 66 74 0a 09 4d  |} of top left..M|
00004140  4f 56 09 72 31 31 2c 20  72 31 31 2c 20 41 53 52  |OV.r11, r11, ASR|
00004150  20 72 6c 79 09 09 3b 20  79 20 70 69 78 65 6c 20  | rly..; y pixel |
00004160  63 6f 6f 72 64 20 72 65  6c 20 74 6f 70 20 73 63  |coord rel top sc|
00004170  72 65 65 6e 20 20 7d 20  6f 66 20 6f 62 6a 65 63  |reen  } of objec|
00004180  74 0a 09 41 44 44 09 72  31 31 2c 20 72 31 31 2c  |t..ADD.r11, r11,|
00004190  20 23 31 0a 09 41 44 44  09 72 31 31 2c 20 72 31  | #1..ADD.r11, r1|
000041a0  31 2c 20 72 31 31 2c 20  41 53 4c 20 23 32 0a 09  |1, r11, ASL #2..|
000041b0  41 44 44 09 72 35 2c 20  72 35 2c 20 72 31 31 2c  |ADD.r5, r5, r11,|
000041c0  20 41 53 4c 20 23 36 0a  09 42 49 43 09 72 31 30  | ASL #6..BIC.r10|
000041d0  2c 20 72 31 30 2c 20 23  37 0a 09 41 44 44 09 72  |, r10, #7..ADD.r|
000041e0  35 2c 20 72 35 2c 20 72  31 30 2c 20 41 53 52 20  |5, r5, r10, ASR |
000041f0  23 31 09 09 3b 20 73 63  72 65 65 6e 20 74 6f 70  |#1..; screen top|
00004200  20 6c 65 66 74 20 6f 66  20 6e 75 6d 62 65 72 0a  | left of number.|
00004210  09 4c 44 52 09 72 34 2c  20 5b 73 70 72 2c 20 23  |.LDR.r4, [spr, #|
00004220  69 6d 61 67 65 5d 0a 09  41 44 44 09 72 34 2c 20  |image]..ADD.r4, |
00004230  73 70 72 2c 20 72 34 09  09 09 3b 20 73 70 72 69  |spr, r4...; spri|
00004240  74 65 20 74 6f 70 20 6c  65 66 74 0a 09 4d 4f 56  |te top left..MOV|
00004250  09 72 33 2c 20 23 33 32  0a 09 4d 4f 56 09 72 33  |.r3, #32..MOV.r3|
00004260  2c 20 72 33 2c 20 41 53  52 20 72 6c 79 0a 65 6e  |, r3, ASR rly.en|
00004270  5f 6c 6f 6f 70 09 4c 44  4d 49 41 09 72 34 21 2c  |_loop.LDMIA.r4!,|
00004280  20 7b 72 36 2c 72 37 2c  72 38 2c 72 39 7d 0a 09  | {r6,r7,r8,r9}..|
00004290  53 54 4d 49 41 20 20 20  72 35 2c 20 7b 72 36 2c  |STMIA   r5, {r6,|
000042a0  72 37 2c 72 38 2c 72 39  7d 0a 09 41 44 44 09 72  |r7,r8,r9}..ADD.r|
000042b0  35 2c 20 72 35 2c 20 23  33 32 30 0a 09 4c 44 4d  |5, r5, #320..LDM|
000042c0  49 41 09 72 34 21 2c 20  7b 72 36 2c 72 37 2c 72  |IA.r4!, {r6,r7,r|
000042d0  38 2c 72 39 7d 0a 09 53  54 4d 49 41 20 20 20 72  |8,r9}..STMIA   r|
000042e0  35 2c 20 7b 72 36 2c 72  37 2c 72 38 2c 72 39 7d  |5, {r6,r7,r8,r9}|
000042f0  0a 09 41 44 44 09 72 35  2c 20 72 35 2c 20 23 33  |..ADD.r5, r5, #3|
00004300  32 30 0a 09 53 55 42 53  09 72 33 2c 20 72 33 2c  |20..SUBS.r3, r3,|
00004310  20 23 31 0a 09 42 4e 45  09 65 6e 5f 6c 6f 6f 70  | #1..BNE.en_loop|
00004320  0a 65 6e 5f 65 78 69 74  09 4c 44 4d 46 44 09 73  |.en_exit.LDMFD.s|
00004330  70 21 2c 20 7b 72 34 2d  72 39 2c 20 73 6c 2c 20  |p!, {r4-r9, sl, |
00004340  66 70 2c 20 70 63 7d 5e  0a 0a 0a 0a 3b 20 65 72  |fp, pc}^....; er|
00004350  61 73 65 5f 62 61 72 0a  3b 20 61 20 6c 65 61 66  |ase_bar.; a leaf|
00004360  20 41 50 43 53 20 66 75  6e 63 74 69 6f 6e 0a 3b  | APCS function.;|
00004370  0a 3b 20 43 20 70 72 6f  74 6f 74 79 70 65 3a 0a  |.; C prototype:.|
00004380  3b 20 76 6f 69 64 20 65  72 61 73 65 5f 62 61 72  |; void erase_bar|
00004390  28 69 6e 74 20 68 2c 20  76 6f 69 64 20 2a 73 70  |(int h, void *sp|
000043a0  72 2c 20 69 6e 74 20 78  2c 20 69 6e 74 20 79 29  |r, int x, int y)|
000043b0  3b 0a 3b 0a 3b 20 61 63  74 75 61 6c 6c 79 20 74  |;.;.; actually t|
000043c0  68 69 73 20 66 6e 20 70  6c 6f 74 73 20 61 20 33  |his fn plots a 3|
000043d0  32 30 20 78 20 68 20 73  70 72 69 74 65 20 6f 6e  |20 x h sprite on|
000043e0  20 73 63 72 65 65 6e 20  6f 76 65 72 20 74 68 65  | screen over the|
000043f0  20 62 61 72 20 72 65 67  69 6f 6e 20 2d 20 73 70  | bar region - sp|
00004400  72 69 74 65 0a 3b 20 73  68 6f 75 6c 64 20 62 65  |rite.; should be|
00004410  20 73 65 74 20 75 70 20  62 65 66 6f 72 65 20 74  | set up before t|
00004420  6f 20 61 20 63 6f 70 79  20 6f 66 20 74 68 65 20  |o a copy of the |
00004430  62 61 63 6b 67 72 6f 75  6e 64 20 62 65 68 69 6e  |background behin|
00004440  64 20 74 68 65 20 62 61  72 0a 3b 0a 3b 20 6e 62  |d the bar.;.; nb|
00004450  20 20 61 73 73 75 6d 65  73 20 66 69 74 73 20 6f  |  assumes fits o|
00004460  6e 20 73 63 72 65 65 6e  20 26 20 63 61 6e 20 64  |n screen & can d|
00004470  6f 20 61 20 66 61 73 74  20 70 6c 6f 74 20 77 69  |o a fast plot wi|
00004480  74 68 20 6e 6f 20 63 6c  69 70 70 69 6e 67 0a 3b  |th no clipping.;|
00004490  20 61 6c 73 6f 20 74 68  61 74 20 69 73 20 62 65  | also that is be|
000044a0  69 6e 67 20 70 72 69 6e  74 65 64 20 61 74 20 61  |ing printed at a|
000044b0  20 77 6f 72 64 20 61 6c  69 67 6e 65 64 20 61 64  | word aligned ad|
000044c0  64 72 65 73 73 20 28 69  65 20 78 20 69 73 20 61  |dress (ie x is a|
000044d0  20 6d 75 6c 74 69 70 6c  65 20 6f 66 20 38 29 0a  | multiple of 8).|
000044e0  3b 20 61 73 73 75 6d 65  73 20 73 70 72 69 74 65  |; assumes sprite|
000044f0  20 69 73 20 33 32 30 20  62 79 20 28 68 3e 3e 72  | is 320 by (h>>r|
00004500  6c 79 29 20 70 69 78 65  6c 73 2c 20 34 62 70 70  |ly) pixels, 4bpp|
00004510  20 26 20 73 63 72 65 65  6e 20 6d 6f 64 65 20 69  | & screen mode i|
00004520  73 20 36 34 30 20 70 69  78 65 6c 73 20 77 69 64  |s 640 pixels wid|
00004530  65 0a 3b 0a 09 45 58 50  4f 52 54 09 65 72 61 73  |e.;..EXPORT.eras|
00004540  65 5f 62 61 72 0a 0a 65  62 6e 73 74 61 09 44 43  |e_bar..ebnsta.DC|
00004550  42 09 22 65 72 61 73 65  5f 62 61 72 22 2c 20 30  |B."erase_bar", 0|
00004560  0a 09 41 4c 49 47 4e 0a  65 62 6e 65 6e 64 09 44  |..ALIGN.ebnend.D|
00004570  43 44 09 26 66 66 30 30  30 30 30 30 20 2b 20 65  |CD.&ff000000 + e|
00004580  62 6e 65 6e 64 20 2d 20  65 62 6e 73 74 61 0a 0a  |bnend - ebnsta..|
00004590  65 72 61 73 65 5f 62 61  72 0a 0a 09 53 54 4d 46  |erase_bar...STMF|
000045a0  44 09 73 70 21 2c 20 7b  72 34 2d 72 39 2c 20 73  |D.sp!, {r4-r9, s|
000045b0  6c 2c 20 66 70 2c 20 6c  72 7d 0a 09 41 44 52 4c  |l, fp, lr}..ADRL|
000045c0  09 72 34 2c 20 76 62 6c  73 0a 09 4c 44 4d 49 41  |.r4, vbls..LDMIA|
000045d0  09 72 34 2c 20 7b 72 34  2d 72 39 7d 0a 09 4c 44  |.r4, {r4-r9}..LD|
000045e0  52 09 72 34 2c 20 5b 72  62 61 6e 6b 5d 0a 09 53  |R.r4, [rbank]..S|
000045f0  55 42 09 72 34 2c 20 72  34 2c 20 23 31 0a 09 4c  |UB.r4, r4, #1..L|
00004600  44 52 09 72 35 2c 20 5b  72 73 63 72 73 74 2c 20  |DR.r5, [rscrst, |
00004610  72 34 2c 20 4c 53 4c 20  23 32 5d 09 3b 20 73 63  |r4, LSL #2].; sc|
00004620  72 65 65 6e 20 62 61 73  65 20 61 64 64 72 20 66  |reen base addr f|
00004630  6f 72 20 56 44 55 20 6f  75 74 70 75 74 0a 09 4c  |or VDU output..L|
00004640  44 52 09 72 6f 78 2c 20  5b 72 6f 78 5d 0a 09 4c  |DR.rox, [rox]..L|
00004650  44 52 09 72 6f 79 2c 20  5b 72 6f 79 5d 0a 09 4c  |DR.roy, [roy]..L|
00004660  44 52 09 72 6c 78 2c 20  5b 72 6c 78 5d 0a 09 4c  |DR.rlx, [rlx]..L|
00004670  44 52 09 72 6c 79 2c 20  5b 72 6c 79 5d 0a 09 41  |DR.rly, [rly]..A|
00004680  44 44 09 72 31 30 2c 20  78 2c 20 72 6f 78 0a 09  |DD.r10, x, rox..|
00004690  52 53 42 09 72 31 31 2c  20 79 2c 20 72 6f 79 0a  |RSB.r11, y, roy.|
000046a0  09 53 55 42 09 72 31 31  2c 20 72 31 31 2c 20 68  |.SUB.r11, r11, h|
000046b0  0a 09 4d 4f 56 09 72 31  30 2c 20 72 31 30 2c 20  |..MOV.r10, r10, |
000046c0  41 53 52 20 72 6c 78 09  09 3b 20 78 20 70 69 78  |ASR rlx..; x pix|
000046d0  65 6c 20 63 6f 6f 72 64  20 72 65 6c 20 6c 65 66  |el coord rel lef|
000046e0  74 20 73 63 72 65 65 6e  20 7d 20 6f 66 20 74 6f  |t screen } of to|
000046f0  70 20 6c 65 66 74 0a 09  4d 4f 56 09 72 31 31 2c  |p left..MOV.r11,|
00004700  20 72 31 31 2c 20 41 53  52 20 72 6c 79 09 09 3b  | r11, ASR rly..;|
00004710  20 79 20 70 69 78 65 6c  20 63 6f 6f 72 64 20 72  | y pixel coord r|
00004720  65 6c 20 74 6f 70 20 73  63 72 65 65 6e 20 20 7d  |el top screen  }|
00004730  20 6f 66 20 6f 62 6a 65  63 74 0a 09 41 44 44 09  | of object..ADD.|
00004740  72 31 31 2c 20 72 31 31  2c 20 23 31 0a 09 41 44  |r11, r11, #1..AD|
00004750  44 09 72 31 31 2c 20 72  31 31 2c 20 72 31 31 2c  |D.r11, r11, r11,|
00004760  20 41 53 4c 20 23 32 0a  09 41 44 44 09 72 35 2c  | ASL #2..ADD.r5,|
00004770  20 72 35 2c 20 72 31 31  2c 20 41 53 4c 20 23 36  | r5, r11, ASL #6|
00004780  0a 09 42 49 43 09 72 31  30 2c 20 72 31 30 2c 20  |..BIC.r10, r10, |
00004790  23 37 0a 09 41 44 44 09  72 32 2c 20 72 35 2c 20  |#7..ADD.r2, r5, |
000047a0  72 31 30 2c 20 41 53 52  20 23 31 09 09 3b 20 73  |r10, ASR #1..; s|
000047b0  63 72 65 65 6e 20 74 6f  70 20 6c 65 66 74 20 6f  |creen top left o|
000047c0  66 20 6e 75 6d 62 65 72  0a 09 4c 44 52 09 72 34  |f number..LDR.r4|
000047d0  2c 20 5b 73 70 72 2c 20  23 69 6d 61 67 65 5d 0a  |, [spr, #image].|
000047e0  09 41 44 44 09 72 31 2c  20 73 70 72 2c 20 72 34  |.ADD.r1, spr, r4|
000047f0  09 09 09 3b 20 73 70 72  69 74 65 20 74 6f 70 20  |...; sprite top |
00004800  6c 65 66 74 0a 09 4d 4f  56 09 68 2c 20 68 2c 20  |left..MOV.h, h, |
00004810  41 53 52 20 72 6c 79 0a  65 62 5f 6c 6f 6f 70 09  |ASR rly.eb_loop.|
00004820  4c 44 4d 49 41 09 72 31  21 2c 20 7b 72 33 2d 72  |LDMIA.r1!, {r3-r|
00004830  31 32 7d 0a 09 53 54 4d  49 41 20 20 20 72 32 21  |12}..STMIA   r2!|
00004840  2c 20 7b 72 33 2d 72 31  32 7d 0a 09 4c 44 4d 49  |, {r3-r12}..LDMI|
00004850  41 09 72 31 21 2c 20 7b  72 33 2d 72 31 32 7d 0a  |A.r1!, {r3-r12}.|
00004860  09 53 54 4d 49 41 20 20  20 72 32 21 2c 20 7b 72  |.STMIA   r2!, {r|
00004870  33 2d 72 31 32 7d 0a 09  4c 44 4d 49 41 09 72 31  |3-r12}..LDMIA.r1|
00004880  21 2c 20 7b 72 33 2d 72  31 32 7d 0a 09 53 54 4d  |!, {r3-r12}..STM|
00004890  49 41 20 20 20 72 32 21  2c 20 7b 72 33 2d 72 31  |IA   r2!, {r3-r1|
000048a0  32 7d 0a 09 4c 44 4d 49  41 09 72 31 21 2c 20 7b  |2}..LDMIA.r1!, {|
000048b0  72 33 2d 72 31 32 7d 0a  09 53 54 4d 49 41 20 20  |r3-r12}..STMIA  |
000048c0  20 72 32 21 2c 20 7b 72  33 2d 72 31 32 7d 0a 09  | r2!, {r3-r12}..|
000048d0  41 44 44 09 72 32 2c 20  72 32 2c 20 23 33 32 30  |ADD.r2, r2, #320|
000048e0  2d 31 36 30 0a 09 53 55  42 53 09 68 2c 20 68 2c  |-160..SUBS.h, h,|
000048f0  20 23 31 0a 09 42 4e 45  09 65 62 5f 6c 6f 6f 70  | #1..BNE.eb_loop|
00004900  0a 65 62 5f 65 78 69 74  09 4c 44 4d 46 44 09 73  |.eb_exit.LDMFD.s|
00004910  70 21 2c 20 7b 72 34 2d  72 39 2c 20 73 6c 2c 20  |p!, {r4-r9, sl, |
00004920  66 70 2c 20 70 63 7d 5e  0a 0a 0a 0a 09 45 4e 44  |fp, pc}^.....END|
00004930  0a                                                |.|
00004931