;***************************************************************************** ; EL Display Panel (Finlux) ; Dsp Real-Time Video (DRTV) Generator Engine ; Version 4 - Direct read from program memory, no buffering ; pads all data to 32-byte boundaries ; allows mixed text and graphics ; future: will upload serial directly to program memory ; ; Other Files Required : p30F4013.gld, p30f4013.inc ; Tools Used : MPLAB IDE : 7.xx ; ; Hardware: Dual Display Controller Board, Panel #2 ;***************************************************************************** .equ __30F4013, 1 .include "p30f4013.inc" ;............................................................................. ; Configuration bits: ;............................................................................. config __FOSC, CSW_FSCM_OFF & XT_PLL16 ;16xPLL - 120MHz/30MIPs at 7.37MHz XTAL config __FWDT, WDT_OFF ;Turn off Watchdog Timer config __FBORPOR, PBOR_ON & BORV_27 & PWRT_16 & MCLR_EN ;Set Brown-out Reset voltage and config __FGS, CODE_PROT_OFF ;Set Code Protection Off ;............................................................................. ; Global Declarations: ;............................................................................. .global __reset ;Label for first line of code. .global __ICD2RAM ;Allows ICD2 to be used ; .global __U1RXInterrupt ;ISR for receiving serial data .global __OscillatorFail ;Declare Oscillator Fail trap routine label .global __AddressError ;Declare Address Error trap routine label .global __StackError ;Declare Stack Error trap routine label .global __MathError ;Declare Math Error trap routine label ;............................................................................. ; Variable Storage in Data space (beginning at 0x850) ;............................................................................. .section .data .align 2 DotCtr: .space 2 ;Video Clock LineCtr: .space 2 ;Video Line RasterCtr: .space 2 ;Scan line for one line of text 0-15 (scan each twice) BufferPtr: .space 2 ;Pointer for ASCII text buffer BufferLineStart: .space 2 ;Start location of line in text buffer ScrollLine: .space 2 ;Top line ScrollScan: .space 2 ;Scan Line (0-7) cyclic FrameCtr: .space 2 ;Frame counter for scrolling WritePtr: .space 2 ;Pointer for ISR Write Panel2Ctr: .space 2 ;Byte counter to panel 2 WriteEnable:.space 2 ;Buffer write enable InvEnable: .space 2 ;Enable inverse characters ;............................................................................. ; Constants ;............................................................................. ;PORT B I/O Lines to panel .equ VIDEO,#9 ;Video Signal .equ HSYNC,#11 ;Horiz sync 15.96 KHz .equ VSYNC,#10 ;Frame clock 61Hz .equ DCLK,#12 ;Dot Clock 6MHz .equiv FCY, 7372800*4 ;Instruction Cycle Frequency .equiv BAUDRATE, 9600 ;Operating Baud Rate .equ ACK,#0x06 .equ NAK,#0x15 .equ INV_ON,#0x11 .equ INV_OFF,#0x12 ;............................................................................. ; Code Section in Program Memory ;............................................................................. .section .text ;Start of Code section ;#################################### ;########### MAIN CODE ########## ;#################################### __reset: ;Setup Stack for Calls in program memory nop nop mov #__SP_init,W15 mov #__SPLIM_init, W0 ;Initialize the Stack Pointer Limit Register mov W0, SPLIM bset CORCON,#IF ;Select Integer mode for DSP Multiplier ;Setup Ports mov #0x0000,W1 ;RB0-RB15=Output mov W1,TRISB ;*************************************************************** ;* Direct Scan Engine * ;* * ;* Scan text directly from program memory, padding lines as * ;* the scan progresses * ;*************************************************************** clr ScrollLine clr ScrollScan NextFrame: ;Every 2 frames, increment scan line to scroll display continually inc FrameCtr ;Every two frames, increment scan line btss FrameCtr,#1 bra SameFrameData clr FrameCtr inc ScrollScan ;Cycle Scan Line 0-15 (0-7 twice) btss ScrollScan,#4 bra SameFrameData ;Scrolling: Realign the top line (to start the display) with the next text segment ;Go to the current 'ScrollLine' and search for the next return char clr ScrollScan SearchFirstReturn: mov ScrollLine,w6 mov #tbloffset(Message),w0 add w6,w0,w6 ;Calc address of current top line in buffer SearchNextReturn: inc ScrollLine tblrdl.b [W6++],w4 ;Grab the character to display mov #0xFF,w1 ;If top line is EndOfBuffer, reset buffer to zero cp.b w1,w4 bra Z,ResetLineZero mov #13,w1 cp.b w1,w4 bra NZ,SearchNextReturn bra SameFrameData ResetLineZero: clr ScrollLine ;Compensates for overscan of first line bra SearchFirstReturn ;Realign with next text segment (not first) SameFrameData: bset LATB,#HSYNC ;One Tvclk period before VSYNC nop bclr LATB,#VSYNC ;Generate Vertical Sync bset LATB,#VSYNC clr LineCtr ;256 Lines to scan ;>>>>Reset ScrollLine to top when bottom of buffer is reached (when 0xFF is received) ;>>>>This is Just-in-case, to prevent buffer overrun ... should not be required mov ScrollLine,w0 ; mov #2048,w1 ;Circular buffer (wrap around) ; mov #48,w1 ; cp w0,w1 ; bra NZ,Go ; clr ScrollLine ; clr w0 Go: mov w0,BufferLineStart ;Scan a partial line at the top of the screen mov ScrollScan,w0 ;Starting with 'ScrollScan' raster, 'ScrollLine' line mov w0,RasterCtr NextLine: bset LATB,#HSYNC ;One Tvclk period before VSYNC clr DotCtr mov BufferLineStart,w0 mov w0,BufferPtr dec BufferPtr NextEightDots: inc BufferPtr ;Get text character to display from buffer mov BufferPtr,w6 mov #tbloffset(Message),w0 add w6,w0,w6 ;Calc address in buffer clr w7 tblrdl.b [W6],w4 ;Grab the character to display mov.b W4,W7 ;Current char is in W7 clr w11 mov.b w4,w11 ;Save current char in W11 mov #32,w1 ;Used to check for a SPACE (blank) char cp w7,w1 ;Accelerator: If a blank/space, bra Z,ScanEightBlanks ;Fast-scan eight dots mov #13,w1 ;Used to check for a RETURN char cp w7,w1 ;Accelerator: If a return char, bra Z,ScanToEndOfLine ;Fast-scan blank dots until the end of the line mov #0xFF,w1 ;Used to check for a END_OF_TEXT char cp w7,w1 ;Accelerator: If an end char, bra NZ,SkipBufferReset ;Reset Buffer to beginning clr BufferPtr ;Allows display to start zt beginning of buffer again dec BufferPtr bra NextEightDots ;Go back and get the first char of the first string SkipBufferReset: rlnc w7,w7 ;Multiply char# by eight (addr of the char pattern) rlnc w7,w7 rlnc w7,w7 mov #tbloffset(CharGen), w5 ;Base Ptr to char table add w5,w7,w5 ;Address of start of chargen pattern (Base_Char*8) mov RasterCtr,w8 ;Scan each line twice rrnc w8,w8 and #0x000F,w8 add w5,w8,w5 ;Base+Char*8+RasterLine --> w5 tblrdl.b [W5],w4 ;Retrieved pattern of eight consecutive pixels ScanEight: ;A regular scan of eight dots in w4 mov #9,w6 ;Eight dots across per character NextDot: dec w6,w6 bra Z,NextEightDots bset LATB,#VIDEO ;Start with video Off btss w4,#0 bclr LATB,#VIDEO rrnc w4,w4 bset LATB,#DCLK bclr LATB,#DCLK inc DotCtr btss DotCtr,#8 ;Test if >0x100 columns bra NextDot bra GenerateHSync ScanEightBlanks: ;A fast scan of eight blank dots (one space) mov #9,w6 ;Eight dots across per character NextBlankDot: dec w6,w6 bra Z,NextEightDots bclr LATB,#VIDEO bset LATB,#DCLK bclr LATB,#DCLK inc DotCtr btss DotCtr,#8 ;Test if >0x100 columns bra NextBlankDot bra GenerateHSync ScanToEndOfLine: ;Generate blank video to the end of the current line bclr LATB,#VIDEO bset LATB,#DCLK bclr LATB,#DCLK inc DotCtr btss DotCtr,#8 ;Test if >0x100 columns bra ScanToEndOfLine ;At the end of each line, HSYNC goes low for 4 Tvlck cycles GenerateHSync: bclr LATB,#HSYNC ;H Sync Low for 4 clocks mov #4,W1 mov W1,DotCtr HSyncWait: bset LATB,#DCLK bclr LATB,#DCLK dec DotCtr bra NZ,HSyncWait ;Get and scan the next line, No VSYNC within a frame inc RasterCtr btss RasterCtr,#4 ;Cycle RasterCtr from 0 through 15 (double-scans) bra SameTextLine clr RasterCtr inc BufferPtr ;Point to next char in the stream mov BufferPtr,w0 mov w0,BufferLineStart bra SameTextLine SameTextLine: inc LineCtr btss LineCtr,#8 ;Test if >0x100 lines bra NextLine ;After 256th Line (HS), delay for 300uS to VS active edge ;At 30MIPS, 30 instructions=1uS, 9000=300uS ;300uS is 10000 instructions at 30 MIPS mov #1000,W1 mov W1,DotCtr EndDly: nop ;Loop consumes 9 clocks *1000 nop nop nop nop nop nop dec DotCtr bra NZ,EndDly goto NextFrame ;============================================================================== ; Utility Functions ;------------------------------------------------------------------------------ ;============================================================================== ; Error traps - add code to recover as required ;------------------------------------------------------------------------------ __OscillatorFail: ;Oscillator Fail Error trap routine bclr INTCON1, #OSCFAIL ;Reset oscillator fail trap flag bra RecoverFromError __AddressError: ;Address Error trap routine bclr INTCON1, #ADDRERR ;Reset address error trap flag bra RecoverFromError __StackError: ;Stack overflow Error trap routine bclr INTCON1, #STKERR ;Reset stack error trap flag bra RecoverFromError __MathError: ;Math (Arithmetic) Error trap routine bclr INTCON1, #MATHERR ;Reset math error trap flag bra RecoverFromError RecoverFromError: nop ;BREAKPOINT HERE for testing nop nop bset LATD,#9 ;Turn LED on RD9 on continually to show error retfie ;Just keep going despite error (Test) ;------------------------------------------------------------------------------ ;.section .const,"r" ;Character Generator - Taken from an Ohio Scientific Model 600 CPU CG-4 ROM ;Characters are located at byte location AsciiChar#*8+LineNo where LineNo is 0-7 CharGen: ;Characters < 128 are REGULAR VIDEO .BYTE 0x5A, 0x7E, 0x5A, 0x18, 0x18, 0x5A, 0x7E, 0x5A ;Char 0 .BYTE 0x42, 0x7E, 0x5A, 0x18, 0x18, 0x5A, 0x7E, 0x42 ;Char 1 .BYTE 0x81, 0x42, 0x24, 0x24, 0x24, 0x24, 0x42, 0x81 ;Char 2 .BYTE 0x81, 0x42, 0x3C, 0x00, 0x00, 0x3C, 0x42, 0x81 ;Char 3 .BYTE 0x00, 0x00, 0x00, 0x24, 0x99, 0x5A, 0xFF, 0x00 ;Char 4 .BYTE 0x80, 0x00, 0x00, 0xC0, 0xC0, 0xFC, 0xFE, 0xFC ;Char 5 .BYTE 0x01, 0x01, 0x01, 0x03, 0xC7, 0xFF, 0xFF, 0x7F ;Char 6 .BYTE 0x80, 0x80, 0x80, 0xC0, 0xE3, 0xFF, 0xFF, 0xFE ;Char 7 .BYTE 0x01, 0x00, 0x00, 0x03, 0x03, 0x3F, 0x7F, 0x3F ;Char 8 .BYTE 0x00, 0x00, 0xFE, 0x20, 0x20, 0xF8, 0xE0, 0x00 ;Char 9 .BYTE 0x00, 0x00, 0x18, 0xFE, 0x07, 0x1F, 0x1F, 0x00 ;Char 10 .BYTE 0x00, 0x00, 0x18, 0x7F, 0xE0, 0xF8, 0xF8, 0x00 ;Char 11 .BYTE 0x00, 0x00, 0x7F, 0x04, 0x04, 0x1F, 0x07, 0x00 ;Char 12 .BYTE 0x18, 0x3C, 0x7E, 0xFE, 0x7E, 0x3C, 0x10, 0x10 ;Char 13 .BYTE 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x7E, 0x6A, 0x7A ;Char 14 .BYTE 0x18, 0xBC, 0xFE, 0xFF, 0xB5, 0xFF, 0xB5, 0xFD ;Char 15 .BYTE 0x18, 0x3C, 0x5A, 0x18, 0x18, 0x18, 0x18, 0x3C ;Char 16 .BYTE 0xF0, 0xE0, 0xF0, 0xB8, 0x1D, 0x0E, 0x04, 0x08 ;Char 17 .BYTE 0x00, 0x20, 0x41, 0xFF, 0xFF, 0x41, 0x20, 0x00 ;Char 18 .BYTE 0x08, 0x04, 0x0E, 0x1D, 0xB8, 0xF0, 0xE0, 0xF0 ;Char 19 .BYTE 0x3C, 0x18, 0x18, 0x18, 0x18, 0x5A, 0x3C, 0x18 ;Char 20 .BYTE 0x10, 0x20, 0x70, 0xB8, 0x1D, 0x0F, 0x07, 0x0F ;Char 21 .BYTE 0x00, 0x04, 0x82, 0xFF, 0xFF, 0x82, 0x04, 0x00 ;Char 22 .BYTE 0x0F, 0x07, 0x0F, 0x1D, 0xB8, 0x70, 0x20, 0x10 ;Char 23 .BYTE 0x00, 0x7C, 0x52, 0x7C, 0x50, 0x50, 0x50, 0x00 ;Char 24 .BYTE 0x00, 0x00, 0x00, 0x40, 0x7E, 0x02, 0x00, 0x00 ;Char 25 .BYTE 0x00, 0x1C, 0x14, 0x14, 0x3E, 0x14, 0x1C, 0x00 ;Char 26 .BYTE 0x00, 0x1C, 0x14, 0x14, 0x14, 0x14, 0x1C, 0x00 ;Char 27 .BYTE 0x00, 0x7E, 0x40, 0x48, 0x4C, 0x4E, 0x0C, 0x08 ;Char 28 .BYTE 0x18, 0x24, 0x42, 0x81, 0x18, 0x24, 0x42, 0x81 ;Char 29 .BYTE 0x00, 0x7E, 0x42, 0x24, 0x18, 0x18, 0x18, 0x18 ;Char 30 .BYTE 0x81, 0x42, 0x24, 0x18, 0x81, 0x42, 0x24, 0x18 ;Char 31 .BYTE 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ;Char 32 .BYTE 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x08, 0x00 ;Char 33 ! .BYTE 0x14, 0x14, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00 ;Char 34 " .BYTE 0x14, 0x14, 0x3E, 0x14, 0x3E, 0x14, 0x14, 0x00 ;Char 35 # .BYTE 0x08, 0x3C, 0x0A, 0x1C, 0x28, 0x1E, 0x08, 0x00 ;Char 36 $ .BYTE 0x06, 0x26, 0x10, 0x08, 0x04, 0x32, 0x30, 0x00 ;Char 37 % .BYTE 0x04, 0x0A, 0x0A, 0x04, 0x2A, 0x12, 0x2C, 0x00 ;Char 38 & .BYTE 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00 ;Char 39 ' .BYTE 0x08, 0x04, 0x02, 0x02, 0x02, 0x04, 0x08, 0x00 ;Char 40 ( .BYTE 0x08, 0x10, 0x20, 0x20, 0x20, 0x10, 0x08, 0x00 ;Char 41 ) .BYTE 0x08, 0x2A, 0x1C, 0x08, 0x1C, 0x2A, 0x08, 0x00 ;Char 42 * .BYTE 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, 0x00 ;Char 43 + .BYTE 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x04, 0x00 ;Char 44 , .BYTE 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00 ;Char 45 - .BYTE 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00 ;Char 46 . .BYTE 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0x00 ;Char 47 / .BYTE 0x1C, 0x22, 0x32, 0x2A, 0x26, 0x22, 0x1C, 0x00 ;Char 48 0 .BYTE 0x08, 0x0C, 0x08, 0x08, 0x08, 0x08, 0x1C, 0x00 ;Char 49 1 .BYTE 0x1C, 0x22, 0x20, 0x18, 0x04, 0x02, 0x3E, 0x00 ;Char 50 2 .BYTE 0x3E, 0x20, 0x10, 0x18, 0x20, 0x22, 0x1C, 0x00 ;Char 51 3 .BYTE 0x10, 0x18, 0x14, 0x12, 0x3E, 0x10, 0x10, 0x00 ;Char 52 4 .BYTE 0x3E, 0x02, 0x1E, 0x20, 0x20, 0x22, 0x1C, 0x00 ;Char 53 5 .BYTE 0x38, 0x04, 0x02, 0x1E, 0x22, 0x22, 0x1C, 0x00 ;Char 54 6 .BYTE 0x3E, 0x20, 0x10, 0x08, 0x04, 0x04, 0x04, 0x00 ;Char 55 7 .BYTE 0x1C, 0x22, 0x22, 0x1C, 0x22, 0x22, 0x1C, 0x00 ;Char 56 8 .BYTE 0x1C, 0x22, 0x22, 0x3C, 0x20, 0x10, 0x0E, 0x00 ;Char 57 9 .BYTE 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00 ;Char 58 : .BYTE 0x00, 0x00, 0x08, 0x00, 0x08, 0x08, 0x04, 0x00 ;Char 59 ; .BYTE 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x00 ;Char 60 < .BYTE 0x00, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x00, 0x00 ;Char 61 = .BYTE 0x04, 0x08, 0x10, 0x20, 0x10, 0x08, 0x04, 0x00 ;Char 62 > .BYTE 0x1C, 0x22, 0x10, 0x08, 0x08, 0x00, 0x08, 0x00 ;Char 63 ? .BYTE 0x1C, 0x22, 0x2A, 0x3A, 0x1A, 0x02, 0x3C, 0x00 ;Char 64 @ .BYTE 0x08, 0x14, 0x22, 0x22, 0x3E, 0x22, 0x22, 0x00 ;Char 65 A .BYTE 0x1E, 0x22, 0x22, 0x1E, 0x22, 0x22, 0x1E, 0x00 ;Char 66 B .BYTE 0x1C, 0x22, 0x02, 0x02, 0x02, 0x22, 0x1C, 0x00 ;Char 67 C .BYTE 0x1E, 0x22, 0x22, 0x22, 0x22, 0x22, 0x1E, 0x00 ;Char 68 D .BYTE 0x3E, 0x02, 0x02, 0x1E, 0x02, 0x02, 0x3E, 0x00 ;Char 69 E .BYTE 0x3E, 0x02, 0x02, 0x1E, 0x02, 0x02, 0x02, 0x00 ;Char 70 F .BYTE 0x3C, 0x02, 0x02, 0x02, 0x32, 0x22, 0x3C, 0x00 ;Char 71 G .BYTE 0x22, 0x22, 0x22, 0x3E, 0x22, 0x22, 0x22, 0x00 ;Char 72 H .BYTE 0x1C, 0x08, 0x08, 0x08, 0x08, 0x08, 0x1C, 0x00 ;Char 73 I .BYTE 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x1C, 0x00 ;Char 74 J .BYTE 0x22, 0x12, 0x0A, 0x06, 0x0A, 0x12, 0x22, 0x00 ;Char 75 K .BYTE 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x3E, 0x00 ;Char 76 L .BYTE 0x22, 0x36, 0x2A, 0x2A, 0x22, 0x22, 0x22, 0x00 ;Char 77 M .BYTE 0x22, 0x22, 0x26, 0x2A, 0x32, 0x22, 0x22, 0x00 ;Char 78 N .BYTE 0x1C, 0x22, 0x22, 0x22, 0x22, 0x22, 0x1C, 0x00 ;Char 79 O .BYTE 0x1E, 0x22, 0x22, 0x1E, 0x02, 0x02, 0x02, 0x00 ;Char 80 P .BYTE 0x1C, 0x22, 0x22, 0x22, 0x2A, 0x12, 0x2C, 0x00 ;Char 81 Q .BYTE 0x1E, 0x22, 0x22, 0x1E, 0x0A, 0x12, 0x22, 0x00 ;Char 82 R .BYTE 0x1C, 0x22, 0x02, 0x1C, 0x20, 0x22, 0x1C, 0x00 ;Char 83 S .BYTE 0x3E, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00 ;Char 84 T .BYTE 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x1C, 0x00 ;Char 85 U .BYTE 0x22, 0x22, 0x22, 0x22, 0x22, 0x14, 0x08, 0x00 ;Char 86 V .BYTE 0x22, 0x22, 0x22, 0x2A, 0x2A, 0x36, 0x22, 0x00 ;Char 87 W .BYTE 0x22, 0x22, 0x14, 0x08, 0x14, 0x22, 0x22, 0x00 ;Char 88 X .BYTE 0x22, 0x22, 0x14, 0x08, 0x08, 0x08, 0x08, 0x00 ;Char 89 Y .BYTE 0x3E, 0x20, 0x10, 0x08, 0x04, 0x02, 0x3E, 0x00 ;Char 90 Z .BYTE 0x3E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x3E, 0x00 ;Char 91 [ .BYTE 0x00, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, 0x00 ;Char 92 \ .BYTE 0x3E, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3E, 0x00 ;Char 93 ] .BYTE 0x00, 0x00, 0x08, 0x14, 0x22, 0x00, 0x00, 0x00 ;Char 94 ^ .BYTE 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00 ;Char 95 _ .BYTE 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ;Char 96 ` .BYTE 0x00, 0x00, 0x2C, 0x32, 0x22, 0x32, 0x2C, 0x00 ;Char 97 a .BYTE 0x02, 0x02, 0x1A, 0x26, 0x22, 0x26, 0x1A, 0x00 ;Char 98 b .BYTE 0x00, 0x00, 0x3C, 0x02, 0x02, 0x02, 0x3C, 0x00 ;Char 99 c .BYTE 0x20, 0x20, 0x2C, 0x32, 0x22, 0x32, 0x2C, 0x00 ;Char 100 d .BYTE 0x00, 0x00, 0x1C, 0x22, 0x3E, 0x02, 0x1C, 0x00 ;Char 101 e .BYTE 0x10, 0x08, 0x08, 0x1C, 0x08, 0x08, 0x08, 0x00 ;Char 102 f .BYTE 0x00, 0x2C, 0x32, 0x22, 0x32, 0x2C, 0x20, 0x1C ;Char 103 g .BYTE 0x02, 0x02, 0x1E, 0x22, 0x22, 0x22, 0x22, 0x00 ;Char 104 h .BYTE 0x00, 0x08, 0x00, 0x0C, 0x08, 0x08, 0x1C, 0x00 ;Char 105 i .BYTE 0x00, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x0C ;Char 106 j .BYTE 0x02, 0x22, 0x12, 0x0A, 0x0E, 0x12, 0x22, 0x00 ;Char 107 k .BYTE 0x0C, 0x08, 0x08, 0x08, 0x08, 0x08, 0x1C, 0x00 ;Char 108 l .BYTE 0x00, 0x00, 0x16, 0x2A, 0x2A, 0x2A, 0x2A, 0x00 ;Char 109 m .BYTE 0x00, 0x00, 0x1E, 0x22, 0x22, 0x22, 0x22, 0x00 ;Char 110 n .BYTE 0x00, 0x00, 0x1C, 0x22, 0x22, 0x22, 0x1C, 0x00 ;Char 111 o .BYTE 0x00, 0x1A, 0x26, 0x22, 0x26, 0x1A, 0x02, 0x02 ;Char 112 p .BYTE 0x00, 0x2C, 0x32, 0x22, 0x32, 0x2C, 0x20, 0x20 ;Char 113 q .BYTE 0x00, 0x00, 0x1A, 0x06, 0x02, 0x02, 0x02, 0x00 ;Char 114 r .BYTE 0x00, 0x00, 0x3C, 0x02, 0x1C, 0x20, 0x1E, 0x00 ;Char 115 s .BYTE 0x00, 0x08, 0x3E, 0x08, 0x08, 0x08, 0x08, 0x00 ;Char 116 t .BYTE 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x3C, 0x00 ;Char 117 u .BYTE 0x00, 0x00, 0x22, 0x22, 0x14, 0x14, 0x08, 0x00 ;Char 118 v .BYTE 0x00, 0x00, 0x22, 0x22, 0x22, 0x2A, 0x14, 0x00 ;Char 119 w .BYTE 0x00, 0x00, 0x22, 0x14, 0x08, 0x14, 0x22, 0x00 ;Char 120 x .BYTE 0x00, 0x00, 0x24, 0x24, 0x24, 0x3C, 0x20, 0x1C ;Char 121 y .BYTE 0x00, 0x00, 0x3E, 0x10, 0x08, 0x04, 0x3E, 0x00 ;Char 122 z .BYTE 0x30, 0x08, 0x08, 0x04, 0x08, 0x08, 0x30, 0x00 ;Char 123 { .BYTE 0x06, 0x08, 0x08, 0x10, 0x08, 0x08, 0x06, 0x00 ;Char 124 | .BYTE 0x08, 0x08, 0x08, 0x00, 0x08, 0x08, 0x08, 0x00 ;Char 125 } .BYTE 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x00 ;Char 126 ~ .BYTE 0x00, 0x00, 0x20, 0x1C, 0x02, 0x00, 0x00, 0x00 ;Char 127  ;Characters > 127 are INVERSE VIDEO .BYTE 0xA5, 0x81, 0xA5, 0xE7, 0xE7, 0xA5, 0x81, 0xA5 ;Char 0 Inverse .BYTE 0xBD, 0x81, 0xA5, 0xE7, 0xE7, 0xA5, 0x81, 0xBD ;Char 1 Inverse .BYTE 0x7E, 0xBD, 0xDB, 0xDB, 0xDB, 0xDB, 0xBD, 0x7E ;Char 2 Inverse .BYTE 0x7E, 0xBD, 0xC3, 0xFF, 0xFF, 0xC3, 0xBD, 0x7E ;Char 3 Inverse .BYTE 0xFF, 0xFF, 0xFF, 0xDB, 0x66, 0xA5, 0x00, 0xFF ;Char 4 Inverse .BYTE 0x7F, 0xFF, 0xFF, 0x3F, 0x3F, 0x03, 0x01, 0x03 ;Char 5 Inverse .BYTE 0xFE, 0xFE, 0xFE, 0xFC, 0x38, 0x00, 0x00, 0x80 ;Char 6 Inverse .BYTE 0x7F, 0x7F, 0x7F, 0x3F, 0x1C, 0x00, 0x00, 0x01 ;Char 7 Inverse .BYTE 0xFE, 0xFF, 0xFF, 0xFC, 0xFC, 0xC0, 0x80, 0xC0 ;Char 8 Inverse .BYTE 0xFF, 0xFF, 0x01, 0xDF, 0xDF, 0x07, 0x1F, 0xFF ;Char 9 Inverse .BYTE 0xFF, 0xFF, 0xE7, 0x01, 0xF8, 0xE0, 0xE0, 0xFF ;Char 10 Inverse .BYTE 0xFF, 0xFF, 0xE7, 0x80, 0x1F, 0x07, 0x07, 0xFF ;Char 11 Inverse .BYTE 0xFF, 0xFF, 0x80, 0xFB, 0xFB, 0xE0, 0xF8, 0xFF ;Char 12 Inverse .BYTE 0xE7, 0xC3, 0x81, 0x01, 0x81, 0xC3, 0xEF, 0xEF ;Char 13 Inverse .BYTE 0xFF, 0xFF, 0xE7, 0xC3, 0x81, 0x81, 0x95, 0x85 ;Char 14 Inverse .BYTE 0xE7, 0x43, 0x01, 0x00, 0x4A, 0x00, 0x4A, 0x02 ;Char 15 Inverse .BYTE 0xE7, 0xC3, 0xA5, 0xE7, 0xE7, 0xE7, 0xE7, 0xC3 ;Char 16 Inverse .BYTE 0x0F, 0x1F, 0x0F, 0x47, 0xE2, 0xF1, 0xFB, 0xF7 ;Char 17 Inverse .BYTE 0xFF, 0xDF, 0xBE, 0x00, 0x00, 0xBE, 0xDF, 0xFF ;Char 18 Inverse .BYTE 0xF7, 0xFB, 0xF1, 0xE2, 0x47, 0x0F, 0x1F, 0x0F ;Char 19 Inverse .BYTE 0xC3, 0xE7, 0xE7, 0xE7, 0xE7, 0xA5, 0xC3, 0xE7 ;Char 20 Inverse .BYTE 0xEF, 0xDF, 0x8F, 0x47, 0xE2, 0xF0, 0xF8, 0xF0 ;Char 21 Inverse .BYTE 0xFF, 0xFB, 0x7D, 0x00, 0x00, 0x7D, 0xFB, 0xFF ;Char 22 Inverse .BYTE 0xF0, 0xF8, 0xF0, 0xE2, 0x47, 0x8F, 0xDF, 0xEF ;Char 23 Inverse .BYTE 0xFF, 0x83, 0xAD, 0x83, 0xAF, 0xAF, 0xAF, 0xFF ;Char 24 Inverse .BYTE 0xFF, 0xFF, 0xFF, 0xBF, 0x81, 0xFD, 0xFF, 0xFF ;Char 25 Inverse .BYTE 0xFF, 0xE3, 0xEB, 0xEB, 0xC1, 0xEB, 0xE3, 0xFF ;Char 26 Inverse .BYTE 0xFF, 0xE3, 0xEB, 0xEB, 0xEB, 0xEB, 0xE3, 0xFF ;Char 27 Inverse .BYTE 0xFF, 0x81, 0xBF, 0xB7, 0xB3, 0xB1, 0xF3, 0xF7 ;Char 28 Inverse .BYTE 0xE7, 0xDB, 0xBD, 0x7E, 0xE7, 0xDB, 0xBD, 0x7E ;Char 29 Inverse .BYTE 0xFF, 0x81, 0xBD, 0xDB, 0xE7, 0xE7, 0xE7, 0xE7 ;Char 30 Inverse .BYTE 0x7E, 0xBD, 0xDB, 0xE7, 0x7E, 0xBD, 0xDB, 0xE7 ;Char 31 Inverse .BYTE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ;Char 32 Inverse .BYTE 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xFF, 0xF7, 0xFF ;Char 33 Inverse .BYTE 0xEB, 0xEB, 0xEB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ;Char 34 " Inverse .BYTE 0xEB, 0xEB, 0xC1, 0xEB, 0xC1, 0xEB, 0xEB, 0xFF ;Char 35 # Inverse .BYTE 0xF7, 0xC3, 0xF5, 0xE3, 0xD7, 0xE1, 0xF7, 0xFF ;Char 36 $ Inverse .BYTE 0xF9, 0xD9, 0xEF, 0xF7, 0xFB, 0xCD, 0xCF, 0xFF ;Char 37 % Inverse .BYTE 0xFB, 0xF5, 0xF5, 0xFB, 0xD5, 0xED, 0xD3, 0xFF ;Char 38 & Inverse .BYTE 0xF7, 0xF7, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ;Char 39 ' Inverse .BYTE 0xF7, 0xFB, 0xFD, 0xFD, 0xFD, 0xFB, 0xF7, 0xFF ;Char 40 ( Inverse .BYTE 0xF7, 0xEF, 0xDF, 0xDF, 0xDF, 0xEF, 0xF7, 0xFF ;Char 41 ) Inverse .BYTE 0xF7, 0xD5, 0xE3, 0xF7, 0xE3, 0xD5, 0xF7, 0xFF ;Char 42 * Inverse .BYTE 0xFF, 0xF7, 0xF7, 0xC1, 0xF7, 0xF7, 0xFF, 0xFF ;Char 43 + Inverse .BYTE 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xF7, 0xFB, 0xFF ;Char 44 , Inverse .BYTE 0xFF, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF ;Char 45 - Inverse .BYTE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF ;Char 46 . Inverse .BYTE 0xFF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xFF, 0xFF ;Char 47 / Inverse .BYTE 0xE3, 0xDD, 0xCD, 0xD5, 0xD9, 0xDD, 0xE3, 0xFF ;Char 48 0 Inverse .BYTE 0xF7, 0xF3, 0xF7, 0xF7, 0xF7, 0xF7, 0xE3, 0xFF ;Char 49 1 Inverse .BYTE 0xE3, 0xDD, 0xDF, 0xE7, 0xFB, 0xFD, 0xC1, 0xFF ;Char 50 2 Inverse .BYTE 0xC1, 0xDF, 0xEF, 0xE7, 0xDF, 0xDD, 0xE3, 0xFF ;Char 51 3 Inverse .BYTE 0xEF, 0xE7, 0xEB, 0xED, 0xC1, 0xEF, 0xEF, 0xFF ;Char 52 4 Inverse .BYTE 0xC1, 0xFD, 0xE1, 0xDF, 0xDF, 0xDD, 0xE3, 0xFF ;Char 53 5 Inverse .BYTE 0xC7, 0xFB, 0xFD, 0xE1, 0xDD, 0xDD, 0xE3, 0xFF ;Char 54 6 Inverse .BYTE 0xC1, 0xDF, 0xEF, 0xF7, 0xFB, 0xFB, 0xFB, 0xFF ;Char 55 7 Inverse .BYTE 0xE3, 0xDD, 0xDD, 0xE3, 0xDD, 0xDD, 0xE3, 0xFF ;Char 56 8 Inverse .BYTE 0xE3, 0xDD, 0xDD, 0xC3, 0xDF, 0xEF, 0xF1, 0xFF ;Char 57 9 Inverse .BYTE 0xFF, 0xFF, 0xF7, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF ;Char 58 : Inverse .BYTE 0xFF, 0xFF, 0xF7, 0xFF, 0xF7, 0xF7, 0xFB, 0xFF ;Char 59 ; Inverse .BYTE 0xEF, 0xF7, 0xFB, 0xFD, 0xFB, 0xF7, 0xEF, 0xFF ;Char 60 < Inverse .BYTE 0xFF, 0xFF, 0xC1, 0xFF, 0xC1, 0xFF, 0xFF, 0xFF ;Char 61 = Inverse .BYTE 0xFB, 0xF7, 0xEF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFF ;Char 62 > Inverse .BYTE 0xE3, 0xDD, 0xEF, 0xF7, 0xF7, 0xFF, 0xF7, 0xFF ;Char 63 ? Inverse .BYTE 0xE3, 0xDD, 0xD5, 0xC5, 0xE5, 0xFD, 0xC3, 0xFF ;Char 64 @ Inverse .BYTE 0xF7, 0xEB, 0xDD, 0xDD, 0xC1, 0xDD, 0xDD, 0xFF ;Char 65 A Inverse .BYTE 0xE1, 0xDD, 0xDD, 0xE1, 0xDD, 0xDD, 0xE1, 0xFF ;Char 66 B Inverse .BYTE 0xE3, 0xDD, 0xFD, 0xFD, 0xFD, 0xDD, 0xE3, 0xFF ;Char 67 C Inverse .BYTE 0xE1, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xE1, 0xFF ;Char 68 D Inverse .BYTE 0xC1, 0xFD, 0xFD, 0xE1, 0xFD, 0xFD, 0xC1, 0xFF ;Char 69 E Inverse .BYTE 0xC1, 0xFD, 0xFD, 0xE1, 0xFD, 0xFD, 0xFD, 0xFF ;Char 70 F Inverse .BYTE 0xC3, 0xFD, 0xFD, 0xFD, 0xCD, 0xDD, 0xC3, 0xFF ;Char 71 G Inverse .BYTE 0xDD, 0xDD, 0xDD, 0xC1, 0xDD, 0xDD, 0xDD, 0xFF ;Char 72 H Inverse .BYTE 0xE3, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xE3, 0xFF ;Char 73 I Inverse .BYTE 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDD, 0xE3, 0xFF ;Char 74 J Inverse .BYTE 0xDD, 0xED, 0xF5, 0xF9, 0xF5, 0xED, 0xDD, 0xFF ;Char 75 K Inverse .BYTE 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0xC1, 0xFF ;Char 76 L Inverse .BYTE 0xDD, 0xC9, 0xD5, 0xD5, 0xDD, 0xDD, 0xDD, 0xFF ;Char 77 M Inverse .BYTE 0xDD, 0xDD, 0xD9, 0xD5, 0xCD, 0xDD, 0xDD, 0xFF ;Char 78 N Inverse .BYTE 0xE3, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xE3, 0xFF ;Char 79 O Inverse .BYTE 0xE1, 0xDD, 0xDD, 0xE1, 0xFD, 0xFD, 0xFD, 0xFF ;Char 80 P Inverse .BYTE 0xE3, 0xDD, 0xDD, 0xDD, 0xD5, 0xED, 0xD3, 0xFF ;Char 81 Q Inverse .BYTE 0xE1, 0xDD, 0xDD, 0xE1, 0xF5, 0xED, 0xDD, 0xFF ;Char 82 R Inverse .BYTE 0xE3, 0xDD, 0xFD, 0xE3, 0xDF, 0xDD, 0xE3, 0xFF ;Char 83 S Inverse .BYTE 0xC1, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xFF ;Char 84 T Inverse .BYTE 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xE3, 0xFF ;Char 85 U Inverse .BYTE 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xEB, 0xF7, 0xFF ;Char 86 V Inverse .BYTE 0xDD, 0xDD, 0xDD, 0xD5, 0xD5, 0xC9, 0xDD, 0xFF ;Char 87 W Inverse .BYTE 0xDD, 0xDD, 0xEB, 0xF7, 0xEB, 0xDD, 0xDD, 0xFF ;Char 88 X Inverse .BYTE 0xDD, 0xDD, 0xEB, 0xF7, 0xF7, 0xF7, 0xF7, 0xFF ;Char 89 Y Inverse .BYTE 0xC1, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xC1, 0xFF ;Char 90 Z Inverse .BYTE 0xC1, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xC1, 0xFF ;Char 91 [ Inverse .BYTE 0xFF, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xFF, 0xFF ;Char 92 \ Inverse .BYTE 0xC1, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xC1, 0xFF ;Char 93 ] Inverse .BYTE 0xFF, 0xFF, 0xF7, 0xEB, 0xDD, 0xFF, 0xFF, 0xFF ;Char 94 ^ Inverse .BYTE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xFF ;Char 95 _ Inverse .BYTE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ;Char 96 ` Inverse .BYTE 0xFF, 0xFF, 0xD3, 0xCD, 0xDD, 0xCD, 0xD3, 0xFF ;Char 97 a Inverse .BYTE 0xFD, 0xFD, 0xE5, 0xD9, 0xDD, 0xD9, 0xE5, 0xFF ;Char 98 b Inverse .BYTE 0xFF, 0xFF, 0xC3, 0xFD, 0xFD, 0xFD, 0xC3, 0xFF ;Char 99 c Inverse .BYTE 0xDF, 0xDF, 0xD3, 0xCD, 0xDD, 0xCD, 0xD3, 0xFF ;Char 100 d Inverse .BYTE 0xFF, 0xFF, 0xE3, 0xDD, 0xC1, 0xFD, 0xE3, 0xFF ;Char 101 e Inverse .BYTE 0xEF, 0xF7, 0xF7, 0xE3, 0xF7, 0xF7, 0xF7, 0xFF ;Char 102 f Inverse .BYTE 0xFF, 0xD3, 0xCD, 0xDD, 0xCD, 0xD3, 0xDF, 0xE3 ;Char 103 g Inverse .BYTE 0xFD, 0xFD, 0xE1, 0xDD, 0xDD, 0xDD, 0xDD, 0xFF ;Char 104 h Inverse .BYTE 0xFF, 0xF7, 0xFF, 0xF3, 0xF7, 0xF7, 0xE3, 0xFF ;Char 105 i Inverse .BYTE 0xFF, 0xEF, 0xFF, 0xEF, 0xEF, 0xEF, 0xEF, 0xF3 ;Char 106 j Inverse .BYTE 0xFD, 0xDD, 0xED, 0xF5, 0xF1, 0xED, 0xDD, 0xFF ;Char 107 k Inverse .BYTE 0xF3, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xE3, 0xFF ;Char 108 l Inverse .BYTE 0xFF, 0xFF, 0xE9, 0xD5, 0xD5, 0xD5, 0xD5, 0xFF ;Char 109 m Inverse .BYTE 0xFF, 0xFF, 0xE1, 0xDD, 0xDD, 0xDD, 0xDD, 0xFF ;Char 110 n Inverse .BYTE 0xFF, 0xFF, 0xE3, 0xDD, 0xDD, 0xDD, 0xE3, 0xFF ;Char 111 o Inverse .BYTE 0xFF, 0xE5, 0xD9, 0xDD, 0xD9, 0xE5, 0xFD, 0xFD ;Char 112 p Inverse .BYTE 0xFF, 0xD3, 0xCD, 0xDD, 0xCD, 0xD3, 0xDF, 0xDF ;Char 113 q Inverse .BYTE 0xFF, 0xFF, 0xE5, 0xF9, 0xFD, 0xFD, 0xFD, 0xFF ;Char 114 r Inverse .BYTE 0xFF, 0xFF, 0xC3, 0xFD, 0xE3, 0xDF, 0xE1, 0xFF ;Char 115 s Inverse .BYTE 0xFF, 0xF7, 0xC1, 0xF7, 0xF7, 0xF7, 0xF7, 0xFF ;Char 116 t Inverse .BYTE 0xFF, 0xFF, 0xDD, 0xDD, 0xDD, 0xDD, 0xC3, 0xFF ;Char 117 u Inverse .BYTE 0xFF, 0xFF, 0xDD, 0xDD, 0xEB, 0xEB, 0xF7, 0xFF ;Char 118 v Inverse .BYTE 0xFF, 0xFF, 0xDD, 0xDD, 0xDD, 0xD5, 0xEB, 0xFF ;Char 119 w Inverse .BYTE 0xFF, 0xFF, 0xDD, 0xEB, 0xF7, 0xEB, 0xDD, 0xFF ;Char 120 x Inverse .BYTE 0xFF, 0xFF, 0xDB, 0xDB, 0xDB, 0xC3, 0xDF, 0xE3 ;Char 121 y Inverse .BYTE 0xFF, 0xFF, 0xC1, 0xEF, 0xF7, 0xFB, 0xC1, 0xFF ;Char 122 z Inverse .BYTE 0xCF, 0xF7, 0xF7, 0xFB, 0xF7, 0xF7, 0xCF, 0xFF ;Char 123 { Inverse .BYTE 0xF9, 0xF7, 0xF7, 0xEF, 0xF7, 0xF7, 0xF9, 0xFF ;Char 124 | Inverse .BYTE 0xF7, 0xF7, 0xF7, 0xFF, 0xF7, 0xF7, 0xF7, 0xFF ;Char 125 } Inverse .BYTE 0xFF, 0xF7, 0xFF, 0xC1, 0xFF, 0xF7, 0xFF, 0xFF ;Char 126 ~ Inverse .BYTE 0xFF, 0xFF, 0xDF, 0xE3, 0xFD, 0xFF, 0xFF, 0xFF ;Char 127  Inverse Message: .ascii "DRTV-T Real Time Video Engine\r" .ascii "Ver. 1.04 (Text Display)\r" .ascii "OSI CG-4 Character Set Loaded\r" .byte 201,238,246,229,242,243,229 ;"Inverse" .ascii " Character Set Loaded\r\r" .ascii "Professor M. Csele, 2007\r\r" ; .ascii "Test Line 7\rTest Line 8\rTest Line 9\rTest Line 10\r" ; .ascii "Test Line 11\rTest Line 12\rTest Line 13\rTest Line 14\r" ; .ascii "Test Line 15\rTest Line 16\rTest Line 17\rTest Line 18\r" ; .ascii "Test Line 19\rTest Line 20\rTest Line 21\rTest Line 22\r" ; .ascii "Test Line 23\rTest Line 24\rTest Line 25\rTest Line 26\r" ; .ascii "Fill\rFill\r\r" .byte 0xFF ;Signifies end of message