;**************************************************************************** ;* * ;* 40 x 25 TV Terminal / TV Controller * ;* * ;* Version 3.0 * ;* * ;* © by Benedikt * ;* * ;* Email: benedikt83 ät gmx.net * ;* * ;* * ;* ergänzt um Cursordarstellung und * ;* * ;* Steuertasten sowie CR-Abfrage * ;* * ;* by Björn Wieck * ;* * ;* Email: bps_of_tbm@t-online.de * ;* * ;* * ;**************************************************************************** ;* * ;* Die Software darf frei kopiert und verändert werden, solange sie nicht * ;* ohne meine Erlaubnis für kommerzielle Zwecke eingesetzt wird. * ;* * ;**************************************************************************** ;* * ;* Diese Software erzeugt ein PAL ähnliches Videosignal, das von allen von * ;* mir getesteten TV geräten aktzeptiert wird. * ;* * ;**************************************************************************** .include "m8def.inc" ;Im Interrupt genutzte und geänderte Register: .def regsave =r2 .def spian =r3 .def spiaus =r4 .def X_Cnt =r5 .def tempi =r16 .def LOOP =r17 .def Y_Cnt =r18 .def C_Cnt =r19 ;zusätzlich: X und Z ;Sonstige Register: .def temp =r20 .def temp2 =r21 .def RX =r22 .def col_count =r23 ;Spaltenzähler für Spalte 0-39 (Für CR und CRSR wichtig) .def csr =r24 ;gesicherter Bildspeicherwert bevor Cursor angezeigt wird ;zusätzlich: Y ;PortB .equ DOUT =1 ;Pixeldaten \ .equ Sync =2 ;Vsync Ausgang } Verbinden .equ MOSI =3 ;Pixeldaten / .equ MISO =4 ;NC .equ SCK =5 ;NC .equ Baudrate =19200 ;Bildgröße .equ XSize =40 ;Bildgröße in X Richtung in Nibbles .equ YSize =25 ;Bildgröße in Y Richtung pro Halbbild ;Horizontal .equ XStart =220 ;Anzahl an CPU Takten zwischen Beginn HSync und Bildbeginn (mindestens 30, und mindestens HSyncbreite) .equ SyncWidth =75 ;Anzahl an CPU Takten für HSync ;Vertikal .equ Height =8 ;Zeichenhöhe .equ Dummy =0 ;Zusätzliche Zwischenzeilen (wird momentan nicht unterstützt, muss 0 sein !) .equ BPSize =50 ;VSync Back Porch in Zeilen (Y Verschiebung) .equ VSize =4 ;VSync Impuls in Zeilen #define LCD ;Zeichen 128-135: Balkenanzeige #define HOR_FILL ;Lücken zwischen den Zeichen füllen ;Interne Konstanten .equ BildSize =YSize*Height ;Bildhöhe in Zeilen .equ BildStart =313-BildSize+YSize ;Bildhöhe in SyncZeilen+Zeichen (interner Zähler) .equ FPSize =(313-YSize*(Height+Dummy))-VSize-BPSize ;Frontporchbreite in Zeilen .equ FPStart =YSize ;Frontporch Start in internen Zählerzeilen .equ VSStart =FPStart+FPSize ;Vsyncstart in internen Zählerzeilen .equ BPStart =VSStart+VSize ;Backporchstart in internen Zählerzeilen .dseg DDRAM: .byte XSize*YSize ;DDRAM ;**************************************************************************** ; Interrupt Vektoren ;**************************************************************************** .cseg .org 0 rjmp Reset .org OC1Aaddr ;Bildbeginn in regsave, sreg cpi Y_Cnt, YSize ;Bildbereich oder schon VSync + Zubehör ? brsh handle_VSync mov tempi, ZH in ZL, TCNT1L ;Timerwert lesen in ZH, TCNT1H subi ZL, low(XStart-10-comp) ;und Korrekturwert berechnen sbci ZH, high(XStart-10-comp) ijmp ;Wartezeit korrigieren nop nop nop nop nop nop nop nop nop nop nop nop nop comp: mov ZH, tempi ldi tempi, XSize mov X_Cnt, tempi hloop: ;Loop für 1 Zeile ld ZL, X+ ;ASCII aus RAM lesen 2 lpm tempi, Z ;Byte aus CGROM lesen 3 out DDRB, spiaus ;SPI aus, Port an 1 out SPDR, tempi ;Byte ausgeben 1 out DDRB, spian ;SPI an, Port aus 1 #ifdef HOR_FILL sbrs tempi, 0 ;Füllpixel setzen 1 cbi PORTB, DOUT ; 1,5 sbrc tempi, 0 ; 1 sbi PORTB, DOUT ; 1,5 #else nop ; 1 nop ; 1 nop ; 1 nop ; 1 nop ; 1 #endif nop ; 1 nop ; 1 dec X_Cnt ; 1 brne hloop ; 2 ; =18, also 16 (für 1 Byte) + Pause dazwischen nop nop nop nop nop nop out DDRB, spiaus ;SPI abschalten cbi PORTB, DOUT ;Bild: schwarz dec C_Cnt ;Zähler für Zeichenhöhe erniedrigen breq skipcloop ;1 Textzeile fertig ausgegeben ? inc ZH ;Nein -> Bilddatenadresse für nächste Pixelzeile laden und subi XL, low(XSize) ;Textadresse wieder an Anfang der Textzeile setzen sbci XH, high(XSize) ; rjmp exit_int skipcloop: ;Alles für neue Textzeile einrichten ldi ZH, 4 ;1024Bytes CGROM Offset ldi C_Cnt, Height ;Zeichenhöhen Counter laden inc Y_Cnt ;Zeilencounter erhöhen rjmp exit_int handle_VSync: inc Y_Cnt ;Zeilenzähler erhöhen cpi Y_Cnt, VSStart ;Beginn VSync ? breq VSyncstart cpi Y_Cnt, BPStart ;Ende VSync ? breq VSyncende cpi Y_Cnt, BildStart ;Bildende ? brsh Bildbeginn rjmp exit_int VSyncstart: ldi tempi, (1<