;
; hello8.video.asm
; (c) Neil Gershenfeld CBA MIT 9/4/04
; RS170 hello-world
;

.include "tn15def.inc"
.def temp = R18
.def one = R19
.def sync = R20
.def black = R21
.def out = R22

.cseg
.org 0
rjmp reset

;
; video lines
;
blackline:
;   .db 0b00,0b00,0b01,0b01,0b01,0b01,0b01,0b01,0b01,0b01,0b01,0b01,0b01,0b01,0b01,0b01,0b01,0b01,0b01,0b01,0b01,0b01,0b01
   .db 0b01,0b01,0b01,0b01,0b01,0b01,0b01,0b01,0b01,0b01,0b01,0b01,0b01,0b01,0b01
line1:
;   .db 0b00,0b00,0b01,0b01,0b11,0b01,0b11,0b01,0b11,0b11,0b11,0b01,0b11,0b01,0b01,0b01,0b11,0b01,0b01,0b01,0b11,0b11,0b11
   .db 0b11,0b01,0b11,0b11,0b11,0b11,0b11,0b01,0b01,0b11,0b01,0b01,0b11,0b11,0b11
line2:
;   .db 0b00,0b00,0b01,0b01,0b11,0b01,0b11,0b01,0b11,0b01,0b01,0b01,0b11,0b01,0b01,0b01,0b11,0b01,0b01,0b01,0b11,0b01,0b11
   .db 0b11,0b01,0b11,0b11,0b01,0b01,0b11,0b01,0b01,0b11,0b01,0b01,0b11,0b01,0b11
line3:
;   .db 0b00,0b00,0b01,0b01,0b11,0b11,0b11,0b01,0b11,0b11,0b11,0b01,0b11,0b01,0b01,0b01,0b11,0b01,0b01,0b01,0b11,0b01,0b11
   .db 0b11,0b11,0b11,0b11,0b11,0b11,0b11,0b01,0b01,0b11,0b01,0b01,0b11,0b01,0b11
line4:
;   .db 0b00,0b00,0b01,0b01,0b11,0b01,0b11,0b01,0b11,0b11,0b11,0b01,0b11,0b11,0b11,0b01,0b11,0b11,0b11,0b01,0b11,0b11,0b11
   .db 0b11,0b01,0b11,0b11,0b11,0b11,0b11,0b11,0b11,0b11,0b11,0b11,0b11,0b11,0b11
wbwb:
   .db 0b11,0b01,0b11,0b01,0b11,0b01,0b11,0b01,0b11,0b01,0b11,0b01,0b11,0b01,0b11
bwbw:
   .db 0b01,0b11,0b01,0b11,0b01,0b11,0b01,0b11,0b01,0b11,0b01,0b11,0b01,0b11,0b01
syncline:
   .db 0b01,0b01,0b00,0b00,0b00,0b00,0b00,0b00,0b00,0b00,0b00,0b00,0b00,0b00,0b00,0b00,0b00,0b00,0b00,0b00,0b00,0b00,0b00
;
; output_text_line
;
output_text_line:
   out PORTB, sync
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   out PORTB, black
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   lpm
   out PORTB, R0 ; 1
   add zl, one
   lpm
   out PORTB, R0 ; 2
   add zl, one
   lpm
   out PORTB, R0 ; 3
   add zl, one
   lpm
   out PORTB, black
   nop
   nop
   out PORTB, R0 ; 4
   add zl, one
   lpm
   out PORTB, R0 ; 5
   add zl, one
   lpm
   out PORTB, R0 ; 6
   add zl, one
   lpm
   out PORTB, black
   nop
   nop
   out PORTB, R0 ; 7
   add zl, one
   lpm
   out PORTB, R0 ; 8
   add zl, one
   lpm
   out PORTB, R0 ; 9
   add zl, one
   lpm
   out PORTB, black
   nop
   nop
   out PORTB, R0 ; 10
   add zl, one
   lpm
   out PORTB, R0 ; 11
   add zl, one
   lpm
   out PORTB, R0 ; 12
   add zl, one
   lpm
   out PORTB, black
   nop
   nop
   out PORTB, R0 ; 13
   add zl, one
   lpm
   out PORTB, R0 ; 14
   add zl, one
   lpm
   out PORTB, R0 ; 15
   nop
   nop
   nop
   nop
   out PORTB, black
   ret
;
; output_sync_line
;
output_sync_line:
   lpm
   out PORTB, R0 ; 1
   add zl, one
   lpm
   out PORTB, R0 ; 2
   add zl, one
   lpm
   out PORTB, R0 ; 3
   add zl, one
   lpm
   out PORTB, R0 ; 4
   add zl, one
   lpm
   out PORTB, R0 ; 5
   add zl, one
   lpm
   out PORTB, R0 ; 6
   add zl, one
   lpm
   out PORTB, R0 ; 7
   add zl, one
   lpm
   out PORTB, R0 ; 8
   add zl, one
   lpm
   out PORTB, R0 ; 9
   add zl, one
   lpm
   out PORTB, R0 ; 10
   add zl, one
   lpm
   out PORTB, R0 ; 11
   add zl, one
   lpm
   out PORTB, R0 ; 12
   add zl, one
   lpm
   out PORTB, R0 ; 13
   add zl, one
   lpm
   out PORTB, R0 ; 14
   add zl, one
   lpm
   out PORTB, R0 ; 15
   add zl, one
   lpm
   out PORTB, R0 ; 16
   add zl, one
   lpm
   out PORTB, R0 ; 17
   add zl, one
   lpm
   out PORTB, R0 ; 18
   add zl, one
   lpm
   out PORTB, R0 ; 19
   add zl, one
   lpm
   out PORTB, R0 ; 20
   add zl, one
   lpm
   out PORTB, R0 ; 21
   add zl, one
   lpm
   out PORTB, R0 ; 22
   add zl, one
   lpm
   out PORTB, R0 ; 23
   ret
;
; main program
;
reset:
   ldi temp, 0xa0 ; maximum RC clock
   out OSCCAL, temp
   sbi DDRB, PB0 ; output on DAC bits
   sbi DDRB, PB1 ; 
   ldi one, 1
   ldi black, 0b01
   ldi sync, 0b00
   loop:
      ; 242 image lines
      ldi temp, 32
      above_loop:
         ldi zl,low(blackline*2)
       ;  ldi zh,high(blackline*2)
         rcall output_text_line
	 dec temp
	 brne above_loop
      ldi temp, 34
      line1_loop:
         ldi zl,low(line1)
        ; ldi zh,high(line1)
         rcall output_text_line
	 dec temp
	 brne line1_loop
      ldi temp, 34
      line2_loop:
         ldi zl,low(line2)
        ; ldi zh,high(line2)
         rcall output_text_line
	 dec temp
	 brne line2_loop
      ldi temp, 34
      line3_loop:
         ldi zl,low(line3)
        ; ldi zh,high(line3)
         rcall output_text_line
	 dec temp
	 brne line3_loop
      ldi temp, 34
      line4_loop:
         ldi zl,low(line2)
       ;  ldi zh,high(line2)
         rcall output_text_line
	 dec temp
	 brne line4_loop
      ldi temp, 34
      line5_loop:
         ldi zl,low(line4)
       ;  ldi zh,high(line4)
         rcall output_text_line
	 dec temp
	 brne line5_loop
      ldi temp, 32
      below_loop:
         ldi zl,low(blackline*2)
       ;  ldi zh,high(blackline*2)
         rcall output_text_line
	 dec temp
	 brne below_loop
      ; 243-7 black lines
      ldi temp, 5
      pre_sync_loop:
         ldi zl,low(blackline*2)
       ;  ldi zh,high(blackline*2)
         rcall output_text_line
	 dec temp
	 brne pre_sync_loop
      ; 248-50 sync lines
      ldi temp, 3
      sync_loop:
         ldi zl,low(syncline*2)
        ; ldi zh,high(syncline*2)
         rcall output_sync_line
	 dec temp
	 brne sync_loop
      ; 251-262 black lines
      ldi temp, 12
      post_sync_loop:
         ldi zl,low(blackline*2)
        ; ldi zh,high(blackline*2)
         rcall output_text_line
	 dec temp
	 brne post_sync_loop

      rjmp loop
