
    	.global     _start
    	.align
    	.arm


;*****************************************************************************************************************
;*
;*	ROM start 
;*
;*****************************************************************************************************************

_start


	b	startofromcode		;skip header
	.include "nintendologo.i"
	.ascii	"fonnttest1  "		;spiel name (12 byte)
	.ascii	"font"			;game code
	.ascii	"sp"			;marer code :)
	.byte	$96			;must be $96
	.byte	0			;main unit code
	.byte	0			;device type
	.byte	0,0,0,0,0,0,0		;resv. area
	.byte	0			;software version
	.byte	0			;complement check (wird mit gbarm gesetzt), sonst gehts nicht auf original gba
	.byte	0,0			;reserved area

;*****************************************************************************************************************
;*
;*	PRG start 
;*
;*****************************************************************************************************************

	
startofromcode

	;**** wichtige sachen

        mov     r0, #$12               	;supervisor
        mov     r1, #$1f               	;system 
        msr     cpsr, r0
        ldr     sp,=myirqstackend     	;myirqstack
        msr     cpsr, r1
	ldr	sp,=mystackend		;mystack	
	
	;**** schalte prefetch an
	
	ldr 	r6,=$4000204   		;dma
	ldr	r0,=$4317
	strh	r0,[r6]
	
	
	;**** lösche bss
	
	ldr     r1,=__bss_start
        ldr     r2,=__bss_end
        sub     r2,r2,r1
        bl      memclear32
	
	;**** kopiere iramcode       

	ldr	r0,=__iwram_lma
	ldr	r1,=__iwram_start
	ldr	r2,=__iwram_end
	sub	r2,r2,r1
	bl	dmacpy
	
	;**** kopiere wram 
	
	ldr	r0,=__ewram_lma
	ldr	r1,=__ewram_start
	ldr	r2,=__ewram_end
	sub	r2,r2,r1
	bl	dmacpy

	;**** kopiere data

	ldr     r0,=__data_lma
        ldr     r1,=__data_start
        ldr     r2,=__data_end
	sub	r2,r2,r1
	bl	dmacpy
	
	;**** setze bildschirm
	
	mov 	r6,#$4000000   		;dma
	mov	r1,#$0100
	strh 	r1,[r6]			;store

	;**** copy font
	
	mov	r1,#$1000
	strh	r1,[r6,#8]		;gb0 = map=32768
		
	addr	r0,font_8x8pal
	mov	r1,#$5000000
	mov	r2,#16*2
	bl	dmacpy	

	;**** setze irq

	ldr	r0,=$03007ffc  
	addr	r1,irq
	str	r1,[r0]

	;**** textausgabe
	
	mov	r0,#$6000000	;gfx
	add	r1,r0,#$8000	;map

	mov	r3,#$0	;
	mov	r4,#20
fly
	
	mov	r2,#30
fl1
	strh	r3,[r1],#2
	add	r3,r3,#1
	subs	r2,r2,#1
	bne	fl1
	add	r1,r1,#4
	subs	r4,r4,#1
	bne	fly
		
	;mov	r9,#$6000000
	
	;ldmia	r0,{r1,r2,r3,r4,r5,r6,r7,r8}
	;stmia	r9,{r1,r2,r3,r4,r5,r6,r7,r8}
	
loop	
	
	mov	r2,#10
	bl	wait
	
	mov	r0,#0
	mov	r1,#$5000000
	;strh	r0,[r1]
	
	;**** text1
	
	mov	r12,#0		;x-Start = 0
	ldr	r7,=testtext1
nextc1	
	ldrb	r1,[r7],#1
	cmp	r1,#0
	beq	nonextc1
	
	ldr	r0,=font_8x16	;font
	ldr	r2,=font_8x16tab	;tab
	sub	r1,r1,#32
	ldr	r9,=((((103*32))<<16)|((30*32)))	;fonttilelinesize:screentilelinesize
	mov	r10,#16		;Font höhe
	mov	r11,#$6000000	;dest
	
	ldr	r5,=drawc8X4_th+1
	mov	lr,pc
	bx	r5
	add	r12,r12,#4
	b	nextc1
nonextc1

	;**** text2
	
	mov	r12,#0		;x-Start = 0
	ldr	r7,=testtext2
nextc2	
	ldrb	r1,[r7],#1
	cmp	r1,#0
	beq	nonextc2
	
	ldr	r0,=font_8x16	;font
	ldr	r2,=font_8x16tab	;tab
	sub	r1,r1,#32
	ldr	r9,=((((103*32))<<16)|((30*32)))	;fonttilelinesize:screentilelinesize
	mov	r10,#16		;Font höhe
	ldr	r11,=$6000000+(32*60)	;dest
	
	ldr	r5,=drawc8X4_th+1
	mov	lr,pc
	bx	r5
	add	r12,r12,#4
	b	nextc2
nonextc2
	
	;**** text3
	
	mov	r12,#0		;x-Start = 0
	ldr	r7,=testtext3
nextc3	
	ldrb	r1,[r7],#1
	cmp	r1,#0
	beq	nonextc3
	
	ldr	r0,=font_8x8	;font
	ldr	r2,=font_8x8tab	;tab
	sub	r1,r1,#32
	mov	r10,#8	;Font höhe
	ldr	r11,=$6000000+(32*150)	;dest
	
	ldr	r5,=drawc8X4_th+1
	mov	lr,pc
	bx	r5
	add	r12,r12,#4
	b	nextc3
nonextc3
	
	;****
	
	mov	r0,#$f<<10
	mov	r1,#$5000000
	;strh	r0,[r1]



	b	loop


	
	.pool


testtext1	.asciz	"Es sind auch Fonts mit einer Hoehe von mehr"
testtext2	.asciz	"als 8 Pixel moeglich."
testtext3	.asciz	"Fonts mit klein Buchstabenhoehe (bis 8 Pixel)! Zur Verwendung kommt ein Font, das in seinen Dimensionen nicht groesser als 8 mal 8 Pixel sein sollte und maximal 16 Farben haben darf (wobei Farbe 0 Transparent ist). Die Breiten der einzelnen Buchstaben werden automatisch durch ein externes Tool berechnet. Dadurch kann ein nichtsymetrischer Aufbau garantiert werden. Die groesse ist vielleicht etwas gering, man sollte aber bedenken, dass die Aufloesung des Displays auch sehr gering ist. Die Fontrenderfunktionen sind auf den Tilemodus und den Spritemodus optimiert. Eine Verwendung der normalen Chunkymodus ist fuer den Normalfall sowieso nicht sehr relevant. Die Abstaende zwischen den Buchstaben sind beliebig waehlbar."
;*****************************************************************************************************************
;*
;*	ROM DATA 
;*
;*****************************************************************************************************************


		.align	4

font_8x8tab	.include	"8x8_font2.tab.s"
font_8x16tab	.include	"8x16_font.tab.s"
		.align	4
font_8x8	.include	"8x8_font2.gfx.s";"font_16_2.gfx.i"
font_8x16	.include	"8x16_font.gfx.s"
font_8x8pal	.include	"8x8_font2.pal.s";"font_16_2.pal.i"

;*****************************************************************************************************************
;*
;*	IRAM 
;*
;*****************************************************************************************************************
	
	
  	.SECTION    .iwram,"ax"  
    	.ARM
    	.align		4

irq	

	stmfd	sp!,{lr}
	
	mov	r0,#$4000000
	add	r1,r0,#$100
	add	r2,r0,#$200
				
	;stop irq

	ldrh	r3,[r2,#2]		;irq lesen
	strh	r3,[r2,#2]		;irq ausschalten
	
	ldmfd	sp!,{lr}
	bx	lr

	.bss
		
myirqstack:	.zero	256			;irqstack
myirqstackend:	
	

;*****************************************************************************************************************
;*
;*	WRAM 
;*
;*****************************************************************************************************************

	.section    	.ewram,"ax"
	
 						;bss
    	.global		mystack
  	.global		mystackend
  	.global		stacksave
  	.global		stringbuffer	
  
stacksave	.long	0
mystack		.fill	8192/4,4,$abcddcba		;STACK
mystackend
	
		
	.end
		