#include "hw.S" .global _start _start: /*mov es, #0*/ movw sp, #0xfed0 ; IAWCTL = 0 -> none? call !siniport call !siniclk ;call !sinitau ;call !siniuart0 call !main delay_long: nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop delay_data: nop ret tx_byte: ; start condition clr1 P0.0 call !delay_long ;27 cyc = 4 cyc + 16 cyc + 7 cyc ; data bits mov c, #8 ; 1 cyc .Lbitloop: ; set 1 bit bf a.0, $.Lsetlo ; 3 cyc hi // 5 cyc lo .Lsethi: nop ; 1 cyc hi // nop ; 1 cyc hi // set1 P0.0 ; 2 cyc hi // br $.Lafterset ; 3 cyc hi // .Lsetlo: clr1 P0.0 ; // 2 cyc lo nop ; // 1 cyc lo nop ; // 1 cyc lo nop ; // 1 cyc lo .Lafterset: ; delay call !delay_data ;12 cyc ; next bit shr a, 1 ; 1 cyc dec c ; 1 cyc bnz $.Lbitloop ; 4 cyc ; stop condition set1 P0.0 call !delay_long call !delay_long ret main: set1 P0.0 call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long loop: mov es, #0xe ;movw bc, #0x0200 mov c, #0 movw hl, #0xfe00 innerloop: mov a, es:[hl] push ax push bc call !tx_byte pop bc pop ax call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long incw hl ;decw bc ;cmpw bc, #0 dec c cmp0 c bnz $innerloop ;movw bc, #0x0200 mov c, #0 ;movw hl, #0xfe00 innerloop2: mov a, es:[hl] push ax push bc call !tx_byte pop bc pop ax call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long incw hl ;decw bc ;cmpw bc, #0 dec c cmp0 c bnz $innerloop2 call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long mov a, #'E' call !delay_long call !delay_long mov a, #'N' call !delay_long call !delay_long mov a, #'D' call !delay_long call !delay_long mov a, #' ' call !delay_long call !delay_long br !loop mov a, #' ' call !tx_byte call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long call !delay_long ;set1 P0.0 br !loop siniport: ; P00 GPIO ; P06 TxD0 mov !PIOR, #0 ; set P0 as output mov !P0, #0 ; disable pullups mov !PU0, #0 ; push-pull output mov !POM0, #0 ; not analog in mov !PMC0, #0x7f ; set port modes ;mov !PM0, #0x0f ; P00 GPIO ; P06 TxD0 mov !PM0, #0 ret siniclk: mov !PER0, #0xe5 ; enable many peripherals mov !OSMC, #0x10 ;mov !HOCODIV, #1 ret