use of subroutines work

This commit is contained in:
2024-03-05 15:27:34 +01:00
parent 2d532a6403
commit c502303a36
2 changed files with 118 additions and 93 deletions

120
colors.S
View File

@ -3,66 +3,66 @@
.section ".rodata","a" .section ".rodata","a"
screendata_tmpl: screendata_tmpl:
.global screendata_tmpl .global screendata_tmpl
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
.byte _green .byte _red
screendataend_tmpl: screendataend_tmpl:
.byte 0xff .byte 0xff

91
main.S
View File

@ -76,20 +76,21 @@ _start:
;; initialize stack pointer with value from linker ;; initialize stack pointer with value from linker
mov.w #__stack, SP mov.w #__stack, SP
;; ---------------------------------------------- ; ;; ----------------------------------------------
;; load data from template area in rom into ram ; ;; load data from template area in rom into ram
;; uses arbitrary register before loading registers ; ;; uses arbitrary register before loading registers
;; for later use ; ;; for later use
mov.w #screendata, r7 ; mov.w #screendata, r7
mov.w #screendataend, r8 ; mov.w #screendataend, r8
mov.w #screendata_tmpl, r9 ; mov.w #screendata_tmpl, r9
_start_load_next: ;_start_load_next:
mov.b @r9, @r7 ; mov.b @r9, @r7
inc.w r7 ; inc.w r7
inc.w r9 ; inc.w r9
cmp.w r7, r8 ; cmp.w r7, r8
jnz _start_load_next ; jnz _start_load_next
;; ---------------------------------------------- ; ;; ----------------------------------------------
init: init:
;; configuration of GPIO Ports ;; configuration of GPIO Ports
@ -117,6 +118,38 @@ init:
mov.w #OUTMOD_7,&TA1CCTL1 mov.w #OUTMOD_7,&TA1CCTL1
mov.w #OUTMOD_7,&TA1CCTL2 mov.w #OUTMOD_7,&TA1CCTL2
;; initialize bit-counter for isr
mov.b #BIT_COUNTER_INIT_VALUE, BIT_COUNTER_REGISTER
;; initialize isr-sync register, signal BYTE_DONE for the first start
mov.b #SIGNAL_OCTET_DONE, SIGNAL_REGISTER
;; start timer in up mode
bis.w #MC0,&TA1CTL
;; enable interrupts
eint
mainloop:
call #resetscreen
call #drawscreen
jmp mainloop
resetscreen:
;; reset screen data
mov.w #screendata, r7
mov.w #screendataend, r8
resetscreen_continue:
mov.b #_off, @r7
inc.w r7
cmp.w r7, r8
jnz resetscreen_continue
ret
drawscreen:
;; initialize bit-counter for isr ;; initialize bit-counter for isr
mov.b #BIT_COUNTER_INIT_VALUE, BIT_COUNTER_REGISTER mov.b #BIT_COUNTER_INIT_VALUE, BIT_COUNTER_REGISTER
;; initialize isr-sync register, signal BYTE_DONE for the first start ;; initialize isr-sync register, signal BYTE_DONE for the first start
@ -127,15 +160,10 @@ init:
;; screen data end into r8 ;; screen data end into r8
mov.w #screendataend, DATA_END_ADDRESS_REGISTER mov.w #screendataend, DATA_END_ADDRESS_REGISTER
;; start timer in up mode drawscreen_continue:
bis.w #MC0,&TA1CTL
;; enable interrupts
eint
mainloop:
;; prepare next byte to handle by isr ;; prepare next byte to handle by isr
cmp.w DATA_NEXT_ADDRESS_REGISTER, DATA_END_ADDRESS_REGISTER cmp.w DATA_NEXT_ADDRESS_REGISTER, DATA_END_ADDRESS_REGISTER
jz mainloop_data_done jz drawscreen_data_done
;; load next data byte ;; load next data byte
mov.b @DATA_NEXT_ADDRESS_REGISTER, NEXT_DATA_REGISTER mov.b @DATA_NEXT_ADDRESS_REGISTER, NEXT_DATA_REGISTER
@ -148,42 +176,39 @@ mainloop:
;; enable isr ;; enable isr
bis #SIGNAL_ISR_ENABLE, SIGNAL_REGISTER bis #SIGNAL_ISR_ENABLE, SIGNAL_REGISTER
mainloop_wait_for_isr_0: drawscreen_wait_for_isr_0:
;; check bit0 in sync register ;; check bit0 in sync register
bit #SIGNAL_OCTET_DONE, SIGNAL_REGISTER bit #SIGNAL_OCTET_DONE, SIGNAL_REGISTER
jz mainloop_wait_for_isr_0 jz drawscreen_wait_for_isr_0
;; load data ;; load data
mov.b colors(NEXT_DATA_REGISTER), DATA_REGISTER mov.b colors(NEXT_DATA_REGISTER), DATA_REGISTER
;; clear BYTE_DONE ;; clear BYTE_DONE
bic #SIGNAL_OCTET_DONE, SIGNAL_REGISTER bic #SIGNAL_OCTET_DONE, SIGNAL_REGISTER
mainloop_wait_for_isr_1: drawscreen_wait_for_isr_1:
;; check bit0 in sync register ;; check bit0 in sync register
bit #SIGNAL_OCTET_DONE, SIGNAL_REGISTER bit #SIGNAL_OCTET_DONE, SIGNAL_REGISTER
jz mainloop_wait_for_isr_1 jz drawscreen_wait_for_isr_1
;; load data ;; load data
mov.b colors+1(NEXT_DATA_REGISTER), DATA_REGISTER mov.b colors+1(NEXT_DATA_REGISTER), DATA_REGISTER
;; clear BYTE_DONE ;; clear BYTE_DONE
bic #SIGNAL_OCTET_DONE, SIGNAL_REGISTER bic #SIGNAL_OCTET_DONE, SIGNAL_REGISTER
mainloop_wait_for_isr_2: drawscreen_wait_for_isr_2:
;; check bit0 in sync register ;; check bit0 in sync register
bit #SIGNAL_OCTET_DONE, SIGNAL_REGISTER bit #SIGNAL_OCTET_DONE, SIGNAL_REGISTER
jz mainloop_wait_for_isr_2 jz drawscreen_wait_for_isr_2
;; load data ;; load data
mov.b colors+2(NEXT_DATA_REGISTER), DATA_REGISTER mov.b colors+2(NEXT_DATA_REGISTER), DATA_REGISTER
;; clear BYTE_DONE ;; clear BYTE_DONE
bic #SIGNAL_OCTET_DONE, SIGNAL_REGISTER bic #SIGNAL_OCTET_DONE, SIGNAL_REGISTER
;; continue ;; continue
jmp mainloop jmp drawscreen_continue
mainloop_data_done: drawscreen_data_done:
;; signal all data processed, isr finish ;; signal all data processed, isr finish
bis #SIGNAL_ALL_DATA_DONE, SIGNAL_REGISTER bis #SIGNAL_ALL_DATA_DONE, SIGNAL_REGISTER
ret
jmp mainloop_data_done