; VIDEO COMPOSITE PAL IO DEVICE ; ; @language: AVR ASM ; ; This file is part of Pat80 IO Devices. ; ; Pat80 IO Devices is free software: you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation, either version 3 of the License, or ; (at your option) any later version. ; ; Pat80 IO Devices is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License ; along with Pat80 IO Devices. If not, see . ; ; ; INTERFACING WITH PAT80: ; Use PortB as data port. Before writing anything, issue a read (pin RW HIGH) and check the busy pin on the data port. ; If the busy pin is high, retry reading until goes low. When the busy pin goes low, we have... TODO ; ; ELECTRONICALLY: ; The data port PB0 is tied to ground with a 1KOhm resistance. When the MC is busy drawing the screen, the data port is in ; high impedance state, so that avoids causing bus contention, but when read returns a 0bXXXXXXX0 byte. When the MC starts vsync, ; begins checking the port for data... TODO ; ; PINS: ; Video: ; Video pin: PA0 (pin 1) (but all PORTA is used) ; Sync pin: PC0 (pin 22) ; Communication: ; Data port is PORTB [INPUT] ; CLK (clock) signal is on PORTD0 [INPUT] ; RS (register select) on PORTD1 [INPUT] ; BUSY signal is on PORTD2 [OUTPUT] ; Debug: ; Debug hsync single pulse on pin: PC1 (pin 23) (may be disabled) ; .include "m1284def.inc" ; Atmega 1280 device definition ; *** reserved registers *** ; Video generator registers: ; X(R27, R26) .def STATUS = r25 ; signal status (see STATUS TABLE) .def VG_HIGH_ACCUM = r24 ; an accumulator in high registers to be used only by video_generator in interrupt .def LINE_COUNTER = r23 ; Character generator registers: .def POS_COLUMN = r22 ; POS_COLUMN (0-46) represents the character/chunk column .def POS_ROWP = r21 ; POS_ROWP (0-255) represent the chunk row. The caracter row is POS_ROWP/FONT_HEIGHT .def HIGH_ACCUM = r20 ; an accumulator in high registers to be used outside of interrupts .def A = r0 ; general purpose accumulator to be used outside of interrupts ; Hardware pins and ports .equ VIDEO_PORT_OUT = PORTA ; Used all PORTA, but connected only PA0 .equ SYNC_PIN = PC0 ; Sync pin (pin 22) .equ DEBUG_PIN = PC1 ; DEBUG: Single vertical sync pulse to trigger oscilloscope (pin 23) .equ DATA_PORT_IN = PIND .equ CLK_PIN = PC2 .equ RS_PIN = PC3 .equ BUSY_PIN = PC4 ; Memory map .equ FRAMEBUFFER = 0x0F70 .equ FRAMEBUFFER_END = 0x3C00 .equ SCREEN_HEIGHT = 248 ; start vector .org 0x0000 rjmp main ; reset vector: jump to main label .org 0x001E rjmp on_tim1_ovf ; interrupt for timer 1 overflow (used by video generation) .org 0x40 ; main program main: ; **** I/O SETUP **** ; pins setup sbi DDRC, SYNC_PIN ; set pin as output sbi DDRC, DEBUG_PIN ; set pin as output sbi DDRC, BUSY_PIN ; set pin as output cbi DDRD, CLK_PIN ; set pin as input ldi HIGH_ACCUM, 0xFF out DDRA, HIGH_ACCUM ; set port as output (contains video pin) ldi HIGH_ACCUM, 0x00 out DDRB, HIGH_ACCUM ; set port as input (used as data bus) ; **** MEMORY SETUP **** call clear_screen ; **** TIMERS AND DRAWING IMAGE ROUTINES SETUP **** ; Timer setup (use 16-bit counter TC1) ; The Power Reduction TC1 and TC3 bits in the Power Reduction Registers (PRR0.PRTIM1 and ; PRR1.PRTIM3) must be written to zero to enable the TC1 and TC3 module. ldi HIGH_ACCUM, 0b00000000 sts PRR0, HIGH_ACCUM ; Set timer prescaler to 1:1 LDI HIGH_ACCUM,0b00000001 sts TCCR1B,HIGH_ACCUM ; Enambe timer1 overflow interrupt LDI HIGH_ACCUM,0b00000001 STS TIMSK1,HIGH_ACCUM ; Enable interrupts globally SEI ; Timer setup completed. ; **** MAIN ROUTINE **** ; Wait for data (it never exits) ;jmp comm_init ; draw example image ;call draw_cat ; test draw character routine call cursor_pos_home dctest: ldi r18, 0x41 draw_chars: mov HIGH_ACCUM, r18 call draw_char dc_continue: ; wait ser r19 dc_wait_loop_1: ser r16 dc_wait_loop_2: dec r16 brne dc_wait_loop_2 dec r19 brne dc_wait_loop_1 ; wait ; ser r19 ; dc_wait_loop_a1: ; ser r16 ; dc_wait_loop_a2: ; dec r16 ; brne dc_wait_loop_a2 ; dec r19 ; brne dc_wait_loop_a1 ; ; wait ; ser r19 ; dc_wait_loop_s1: ; ser r16 ; dc_wait_loop_s2: ; dec r16 ; brne dc_wait_loop_s2 ; dec r19 ; brne dc_wait_loop_s1 ; ; wait ; ser r19 ; dc_wait_loop_d1: ; ser r16 ; dc_wait_loop_d2: ; dec r16 ; brne dc_wait_loop_d2 ; dec r19 ; brne dc_wait_loop_d1 ; ; wait ; ser r19 ; dc_wait_loop_f1: ; ser r16 ; dc_wait_loop_f2: ; dec r16 ; brne dc_wait_loop_f2 ; dec r19 ; brne dc_wait_loop_f1 inc r18 cpi r18, 0x5B brne draw_chars call draw_carriage_return jmp dctest forever: jmp forever .include "video_generator.asm" ; Asyncronous timer-interrupt-based video generation .include "character_generator.asm" ; Character generator ;.include "communication.asm" ; Communication with Pat80 .include "font.asm" ; Font face ;.include "example_data/cat.asm" ; Cat image