Task

Display a word in inverse video   (or reverse video)   followed by a word in normal video.




;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;	
; Program Start
 
	.equ ramarea, 0x02000000
	.equ CursorX,ramarea		
	.equ CursorY,ramarea+1
 
 
ProgramStart:
	mov sp,#0x03000000			;Init Stack Pointer
 
	mov r4,#0x04000000  		        ;DISPCNT -LCD Control
	mov r2,#0x403    			;4= Layer 2 on / 3= ScreenMode 3
	str r2,[r4]         	
	bl ResetTextCursors			;set text cursors to top left of screen
 
	adr r1,HelloWorld
	mov r2,#0x7FFF
	mov r11,#1
	bl PrintString
 
	adr r1,HelloWorld
	mov r2,#0x7FFF
	mov r11,#0
	bl PrintString
 
 
forever:
	b forever
BitmapFont:
        .include "M:\SrcAll\BitmapFont.asm"
 
HelloWorld:
	.byte "HELLO",255
	.align 4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PrintString:					;Print 255 terminated string 
	STMFD sp!,{r0-r12, lr}
PrintStringAgain:
		ldrB r0,[r1],#1
		cmp r0,#255
		beq PrintStringDone		;Repeat until 255
		bl printchar 			;Print Char
		b PrintStringAgain
PrintStringDone:
	LDMFD sp!,{r0-r12, lr}
	bx lr
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PrintChar:
	;input: R1 = ADDR OF TEXT
	;	R2 = DESIRED COLOR (ABBBBBGGGGGRRRRR   A=Alpha)
	;	CursorX = X POS OF WHERE TO DRAW
	;	CursorY = Y POS OF WHERE TO DRAW
        ;       R11 = 1 FOR INVERTED TEXT, 0 FOR NORMAL TEXT
 
	STMFD sp!,{r4-r12, lr}
 
		mov r4,#0
		mov r5,#0
 
		mov r3,#CursorX
		ldrB r4,[r3]			;X pos
		mov r3,#CursorY
		ldrB r5,[r3]			;Y pos
 
		mov r3,#0x06000000 		;VRAM base
 
		mov r6,r4,lsl #4		;Xpos, 2 bytes per pixel, 8 bytes per char
		add r3,r3,r6
 
	;Ypos, 240 pixels per line,2 bytes per pixel, 8 lines per char
 
		mov r4,r5,lsl #4		
		mov r5,r5,lsl #8
		sub r6,r5,r4
		mov r6,r6,lsl #4		;ypos * 240 * 8 * 2 = ((((ypos << 8)-(ypos << 4)) << 3)<< 1
		add r3,r3,r6
 
		adr r4,BitmapFont 		;Font source
 
		subs r0,r0,#32			;First Char is 32 (space)
		beq LineDone			;if it's a space, just move the cursor without actually writing anything
		add r4,r4,r0,asl #3		;8 bytes per char
 
		mov r6,#8			;8 lines 
DrawLine:
		mov r7,#8 			;8 pixels per line
		ldrb r8,[r4],#1			;Load this piece of the letter
		cmp r11,#1			;does r11 = 1?
		mvneq r8,r8			;if so, flip the bits of r8 before printing.
		mov r9,#0b100000000		;Bit Mask for testing whether to fill
 
DrawPixel:
		tst r8,r9			;Is bit 1?
		strneh r2,[r3]			;Yes? then fill pixel (HalfWord)
		add r3,r3,#2
		mov r9,r9,ror #1		;Bitshift Mask
		subs r7,r7,#1
		bne DrawPixel			;Next Hpixel
 
		add r3,r3,#480-16	        ;Move Down a line (240 pixels * 2 bytes) 
		subs r6,r6,#1			;-1 char (16 px)
		bne DrawLine			;Next Vline
 
LineDone:	
		mov r3,#CursorX
		ldrB r0,[r3]	
		add r0,r0,#1			;Move across screen
		strB r0,[r3]	
		mov r10,#30
		cmp r0,r10
		bleq NewLine
	LDMFD sp!,{r4-r12, lr}
	bx lr
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
NewLine:
	STMFD sp!,{r0-r12, lr}
		mov r3,#CursorX
		mov r0,#0
		strB r0,[r3]
		mov r4,#CursorY
		ldrB r0,[r4]
		add r0,r0,#1
		strB r0,[r4]
	LDMFD sp!,{r0-r12, pc}
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ResetTextCursors:
	STMFD sp!,{r4-r6,lr}
		mov r4,#0
		mov r5,#CursorX
		mov r6,#CursorY
		strB r4,[r5]
		strB r4,[r6]
	LDMFD sp!,{r4-r6,lr}
	bx lr