summaryrefslogtreecommitdiff
path: root/boards/ek-lm4f120xl/stellaris-vga/vga.S
diff options
context:
space:
mode:
authorYuval Adam <yuv.adm@gmail.com>2013-05-16 14:02:38 +0300
committerYuval Adam <yuv.adm@gmail.com>2013-05-16 14:02:38 +0300
commitcf0dc0a31634bf18eef97d73fa9640abf0382f08 (patch)
treec76064198a741d5e1b2a061cb981b3dbf7c2a3d4 /boards/ek-lm4f120xl/stellaris-vga/vga.S
parent6cff82a4bc7ed9fcc7e9ad73a4542d5b1e7c1328 (diff)
Added stellaris-vga subproject
Diffstat (limited to 'boards/ek-lm4f120xl/stellaris-vga/vga.S')
-rw-r--r--boards/ek-lm4f120xl/stellaris-vga/vga.S213
1 files changed, 213 insertions, 0 deletions
diff --git a/boards/ek-lm4f120xl/stellaris-vga/vga.S b/boards/ek-lm4f120xl/stellaris-vga/vga.S
new file mode 100644
index 0000000..286d954
--- /dev/null
+++ b/boards/ek-lm4f120xl/stellaris-vga/vga.S
@@ -0,0 +1,213 @@
+ .file "vga.S"
+
+ .data
+ .align 2
+ .globl LineCount
+
+LineCount: .word 0
+
+ .text
+ .align 2
+ .globl Timer0IntHandler
+ .type Timer0IntHandler, %function
+
+Timer0IntHandler:
+ @ horizontal timing
+ @ hfp 40 (1-40)
+ @ hsp 128 (41-168)
+ @ hbp 88 (169-256)
+ @ hpx 800 (257-1056)
+ @ total = 1056
+
+ @ vertical timing
+ @ vsp 4 (1-4)
+ @ vbp 23 (5-27)
+ @ vln 600 (28-627)
+ @ vfp 1 (628)
+ @ total = 628
+
+ @ *********
+ @ ** hfp ** [40 cycles]
+ @ *********
+
+ @ prologue [3 cycles]
+ push {r3, lr}
+
+ @ save regs [7 cycles]
+ push {r1, r2, r3, r4, r5, r6}
+
+ @ clear interrupt timer [5 cycles]
+ mov r1, #1 @ TIMER_TIMA_TIMEOUT
+ ldr r0, =0x40030000 @ TIMER0_BASE
+ str r1, [r0, #0x24] @ *(TIMER0_BASE + TIMER_O_ICR) = TIMER_TIMA_TIMEOUT
+
+ @ ptr to GPIO_PORTB_BASE in r0 [3 cycles]
+ @ (this will be persisted)
+ ldr r0, =0x40005000 @ GPIO_PORTB_BASE
+ nop
+
+ @ ptr to GPIO_PORTB_BASE in r1 [3 cycles]
+ @ (this will be persisted)
+ ldr r1, =0x40024000 @ GPIO_PORTE_BASE
+ nop
+
+ @ ptr to line counter [3 cycles]
+ @ (this will be persisted)
+ ldr r2, =LineCount
+ nop
+
+ @ waste cycles [16 cycles]
+ mov r3, #0
+loop_0: @ {3*4-1=11 cycles}
+ add r3, #1
+ cmp r3, #3
+ bne loop_0 @2
+
+ @ hsync setup [4 cycles]
+ ldrb r3,[r0]
+ mov r4, #0xfd
+ and r3, r4
+
+ @ *********
+ @ ** hsp ** [128 cycles]
+ @ *********
+
+ @ set hsync low [2 cycles]
+ str r3, [r0] @ GPIO_PIN_1 clear
+
+ @ reset line counter [8 cycles]
+ ldr r4, =629
+ cmp r3, r4
+ beq .Lline_reset
+ nop
+ nop
+ b .Lno_reset
+.Lline_reset:
+ mov r3, #0
+ str r3, [r2]
+.Lno_reset:
+
+ @ inc line counter [5 cycles]
+ ldr r3, [r2]
+ add r3, #1
+ str r3, [r2]
+
+ @ vsync on at line 1 [9 cycles]
+ cmp r3, #1 @ now at start of vsp
+ beq .Lvsync_on
+ nop
+ nop
+ nop
+ nop
+ nop
+ b .Lcont_0
+.Lvsync_on: @ {6 cycles}
+ ldrb r3,[r0]
+ mov r4, #0xfe
+ and r3, r4
+ str r3, [r0] @ GPIO_PIN_0 clear
+.Lcont_0:
+
+ @ vsync off at line 5 [11 cycles]
+ ldr r3, [r2]
+ cmp r3, #5
+ beq .Lvsync_off
+ nop
+ nop
+ nop
+ nop
+ nop
+ b .Lcont_1
+.Lvsync_off: @ {6 cycles}
+ ldrb r3,[r0]
+ mov r4, #1
+ orr r3, r4
+ str r3, [r0] @ GPIO_PIN_0 set
+.Lcont_1:
+
+ @ activate pixels on line 28 [6 cycles]
+ ldr r3, [r2]
+ cmp r3, #28
+ beq .Lactivate_px
+ b .Lcont_2
+.Lactivate_px: @ {1 cycle}
+ mov r6, #1
+.Lcont_2:
+
+ @ deactivate pixels on line 628 [7 cycles]
+ ldr r3, [r2]
+ ldr r4, =628
+ cmp r3, r4
+ beq .Ldeactivate_px
+ b .Lcont_3
+.Ldeactivate_px: @ {1 cycle}
+ mov r6, #0
+.Lcont_3:
+
+ @ waste cycles [74 cycles]
+ mov r0, #0
+.Lwasteloop_1: @ {18*4-1=71 cycles}
+ add r0, #1
+ cmp r0, #14
+ bne .Lwasteloop_1 @2
+ nop
+ nop
+
+ @ hsync off [6 cycles]
+ ldrb r3,[r0]
+ mov r4, #2
+ orr r3, r4 @ GPIO_PIN_1 set
+ str r3, [r0]
+
+ @ *********
+ @ ** hbp ** [88 cycles]
+ @ *********
+ @ exit on vblank [3 cycles]
+ cmp r6, #0
+ beq end
+ nop
+
+ @ waste cycles [83 cycles]
+ mov r3, #0
+.Lwasteloop_2: @ {20*4-1=79 cycles}
+ add r3, #1
+ cmp r3, #19
+ bne .Lwasteloop_2
+ nop
+ nop
+ nop
+
+ @ set up color counter [1 cycle]
+ mov r4, #0
+
+ @ set initial rgb [1 cycle]
+ mov r3, #0
+
+ @ *********
+ @ ** hpx ** [800 cycles]
+ @ *********
+
+ @ output pattern [800 cycles]
+.Lcolor_loop: @ {100*8-1=799}
+ str r3, [r1]
+ add r3, #1
+ add r4, #1
+ cmp r4, #100
+ nop
+ bne .Lcolor_loop
+ nop
+
+ @ *********
+
+ @ horizontal blanking
+ mov r3, #0
+ str r3, [r1]
+
+end:
+ @ restore regs [7 cycles]
+ pop {r1, r2, r3, r4, r5, r6}
+
+ @ return from interrupt [4 cycles]
+ pop {r3, pc}
+ .word 0x40030000 @addmi r0, r3, r0
+