TITLE "serial interface for t6963 graphics LCD module" LIST p=16F88 ERRORLEVEL 0, -302 ; File: display.asm; Created: Jan-2004, Paddy Strebel ; MGLS12864T 128x64 dots graphics LCD module with T6963 controller. ; FGND GND VCC VLCD /WR /RD /CS C/D /RST D0 D1 D2 D3 D4 D5 D6 D7 FS ; Connections: FGND=0V, GND=0V, VCC=5V, VLCD=ca-5V, /CS=GND, FS=GND ; Oscillator and reset circuit are internal to the PIC16F88. ; Why didn't I use the built-in hardware usart? ; - needs always two pins, even when using only rx or tx ; - port B looses pins at inconvenient locations ; - usart lines have fixed polarity ; RXD (A4) is the receive data input for 9600bps, 8 bit no parity ; For normal receive from another controller or from an RS232 receiver ; connect INV to GND. By pulling INV high the receive data is inverted; ; a 10K resistor from the rx-line to A4 can replace the RS232 receiver. ; ********** ********** ; * *** * ; /RD A2 ** 1 18 ** A1 C/D ; * * ; /WR A3 ** 2 17 ** A0 RST ; * * ; RXD A4 ** 3 16 ** A7 SPK ; * * ; INV A5 ** 4 15 ** A6 BSY ; * * ; GND GND ** 5 14 ** VCC 5V ; * * ; D0 B0 ** 6 13 ** B7 D7 ; * * ; D1 B1 ** 7 12 ** B6 D6 ; * * ; D2 B2 ** 8 11 ** B5 D5 ; * * ; D3 B3 ** 9 10 ** B4 D4 ; * PIC16F88 * ; *********************** ; command arguments action ; ; 0x00 (\0) black = set pixels (default) ; 0x01 (^A) white = clear pixels ; 0x02 (^B) transparent font (default) ; 0x03 (^C) opaque font (slow) ; 0x04 (^D) normal font 8x6 (default) ; 0x05 (^E) big font 16x12 ; 0x06 (^F) pause 100ms ; 0x07 (^G) beep 100ms, 1kHz on SPK ; 0x08 (^H) clear screen, moveto 0 0 ; 0x09 (^I) x y dot x from left, y from bottom ; 0x0A (^J) x y moveto x y ; 0x0B (^K) x y rmoveto x y ; 0x0C (^L) x y lineto x y ; 0x0D (^M) x y rlineto x y ; 0x0E (^N) x y fillto x y ; 0x0F (^O) x y rfillto x y ; ; 16..126 show text from cgrtab at the end of this file. ; Text output moves the current point one char to the right. ; ; T6963 text screen is not used: text can be freely positioned. ; ; The receive buffer is 256 bytes. Provide sufficient delay for ; for command execution when sending more data. BSY is low when ; the buffer is completely empty. ; ; The line algorithm is limited to an area of 128x128 pixels. ; ; Binary-clean serial port from Linux: stty -F /dev/ttyS0 raw ; ; The negative display voltage VLCD can be taken from a MAX232 ; line driver/receiver and a 10k trimmer for brightness control. __IDLOCS H'DDDD' __CONFIG H'2007', H'3F54' ; PWRT on, WDT on, INTRC A7/A6 __CONFIG H'2008', H'3FFC' ; IE switch off, fail-save off INDF EQU 0 ; indirect file access TMR0 EQU 1 ; real time clock counter PCL EQU 2 ; program counter lsb STATUS EQU 3 ; program status FSR EQU 4 ; file selection register PORTA EQU 5 ; i/o port PORTB EQU 6 ; i/o port PCLATH EQU H'0A' ; program counter msb (CALL, GOTO > H'800') INTCON EQU H'0B' ; interrupt control PIR1 EQU H'0C' ; peripheral interrupt flags RCSTA EQU H'18' ; USART receiver control and status RCREG EQU H'1A' ; USART receive data _OPTION EQU H'81' ; OPTION register in bank 1 _TRISA EQU H'85' ; tristate register in bank 1 _TRISB EQU H'86' ; tristate register in bank 1 _PIE1 EQU H'8C' ; peripheral interrupt enable _OSCCON EQU H'8F' ; oscillator control _OSCTUNE EQU H'90' ; oscillator tuning _TXSTA EQU H'98' ; USART transmitter control and status _SPBRG EQU H'99' ; USART baud rate _ANSEL EQU H'9B' ; analog select for porta C EQU 0 ; carry DC EQU 1 ; digit carry Z EQU 2 ; zero PD EQU 3 ; power down TO EQU 4 ; watch dog time out RP0 EQU 5 ; register bank select RP1 EQU 6 ; register bank select IRP EQU 7 ; register bank select (indirect) RST_ EQU 0 ; PORTA, LCD control signals CD_ EQU 1 RD_ EQU 2 WR_ EQU 3 RXD_ EQU 4 INV_ EQU 5 BSY_ EQU 6 SPK_ EQU 7 INV EQU 0 ; inverted receive data WHT EQU 1 ; white on black DWR EQU 2 ; data write BFN EQU 3 ; big font IPX EQU 4 ; invert pixel OFN EQU 5 ; opaque font COLS EQU D'128' ; number of display columns LINS EQU D'64' ; number of display lines ORG H'020' ; (start of RAM) buf RES D'64' ; receive buffer in banks 0,1,2,3 ORG H'060' ; variables savw RES 1 ; interrupt context save savs RES 1 savf RES 1 savp RES 1 tmp0 RES 1 ; temporary storage tmp1 RES 1 tmp2 RES 1 tmp3 RES 1 xx RES 1 ; pixel position yy RES 1 x0 RES 1 ; location y0 RES 1 x1 RES 1 ; destination y1 RES 1 xd RES 1 ; destination - location yd RES 1 xi RES 1 ; increments yi RES 1 rr RES 1 ; reminder cc RES 1 ; factor mm RES 1 ; inclination ll RES 1 ; lcd address low byte hh RES 1 ; lcd address high byte alo RES 1 ; cgr address low (pcl) ahi RES 1 ; cgr address high (pclath) cmd RES 1 ; command byte rxsh RES 1 ; receiver shift register rptr RES 1 ; receive buffer read pointer wptr RES 1 ; receive buffer write pointer flgs RES 1 ; flags ORG H'0E0' ; bank 1 _savw RES 1 ; interrupt context save ORG H'0000' ; reset GOTO main ORG H'0004' ; interrupt intserv MOVWF savw ; save W SWAPF STATUS,W ; status to W CLRF STATUS ; bank 0 MOVWF savs ; save STATUS MOVF FSR,W ; save FSR MOVWF savf ; MOVF PCLATH,W ; save PCLATH MOVWF savp ; CLRF PCLATH ; PCLATH to page 0 rxint MOVF rxsh,W ; startbit ? BTFSS STATUS,Z ; GOTO datab ; startb BSF STATUS,RP0 ; bank 1 BCF _OPTION,5 ; tmr0 source internal clock BCF STATUS,RP0 ; bank 0 MOVLW D'12' ; tmr0 interrupt in middle of first bit MOVWF rxsh ; rxsh to add some clocks more delay dlystb DECFSZ rxsh,F ; GOTO dlystb ; BSF rxsh,7 ; startbit CLRF TMR0 ; 256 clocks GOTO intend ; datab RRF rxsh,F ; shift in new bit BCF rxsh,7 ; BTFSC PORTA,RXD_ ; poll rx-line BSF rxsh,7 ; BTFSC STATUS,C ; startbit rotated to carry? GOTO lastbit ; MOVLW -D'205' ; 208 timclocks - 3 insclocks ADDWF TMR0,F ; GOTO intend ; lastbit MOVF wptr,W ; write rx data to buf ANDLW H'3F' ; ADDLW buf ; BTFSC wptr,6 ; banks 1,3 ? ADDLW H'80' ; MOVWF FSR ; MOVF rxsh,W ; received byte to W BTFSC flgs,INV ; inverted RXD? XORLW B'11111111' ; BTFSC wptr,7 ; banks 2,3 ? BSF STATUS,IRP ; MOVWF INDF ; received byte to buf BCF STATUS,IRP ; INCF wptr,F ; CLRF rxsh ; BSF STATUS,RP0 ; bank 1 BSF _OPTION,5 ; external tmr0 source A4 BCF STATUS,RP0 ; bank 0 MOVLW H'FF' ; preload timer for interrupt MOVWF TMR0 ; intend MOVLW B'00100000' ; clr flags, ena tmr0 interrupt MOVWF INTCON ; MOVF savp,W ; restore PCLATH MOVWF PCLATH ; MOVF savf,W ; restore FSR MOVWF FSR ; SWAPF savs,W ; restore STATUS MOVWF STATUS ; SWAPF savw,F ; restore W SWAPF savw,W ; RETFIE ; also sets GIE ORG H'0080' ; main CLRWDT ; after reset: wdt:128 = ca 2.3s MOVLW B'00001110' ; SPK BSY INV RXD WR RD CD RST MOVWF PORTA ; to port A MOVLW B'00000000' ; D7 .. D0 MOVWF PORTB ; to port B BSF STATUS,RP0 ; bank 1 MOVLW B'00000000' ; all analog pins digital MOVWF _ANSEL MOVLW B'00110000' ; A5 and A4 inputs, other outputs MOVWF _TRISA MOVLW B'00000000' ; Port B outputs MOVWF _TRISB MOVLW B'01110000' ; 8 MHz MOVWF _OSCCON CLRF STATUS ; bank 0 (direct and indexed) MOVLW H'20' ; begin reset vars MOVWF FSR initvar CLRF 0 INCF FSR,F MOVLW H'80' XORWF FSR,W BTFSS STATUS,Z GOTO initvar ; end reset vars BTFSC PORTA,INV_ ; inverted RXD? BSF flgs,INV MOVLW B'11111111' ; nopu, risint, xclk, rise, wdt, :128 BTFSC flgs,INV ; inverted RXD? MOVLW B'11101111' ; nopu, risint, xclk, fall, wdt, :128 BSF STATUS,RP0 ; bank 1 MOVWF _OPTION ; BCF STATUS,RP0 ; bank 0 CALL initlcd CALL grclr CLRF INTCON ; clear all flags and enable-bits MOVLW H'FF' ; preload timer for interrupt MOVWF TMR0 BSF INTCON,5 ; enable tmr0 interrupt BSF INTCON,7 ; enable global interrupt mloop CALL rdbuf MOVWF cmd ; store command ANDLW H'F0' ; < 16 ? BTFSS STATUS,Z GOTO print ckcmd CLRF PCLATH ; computed goto MOVF cmd,W ADDWF PCL,F GOTO setblk ; 0 GOTO setwht ; 1 GOTO tfont ; 2 GOTO ofont ; 3 GOTO nfont ; 4 GOTO bfont ; 5 GOTO pause ; 6 GOTO beep ; 7 GOTO grphclr ; 8 GOTO dotat ; 9 GOTO amoveto ; 10 GOTO rmoveto ; 11 GOTO alineto ; 12 GOTO rlineto ; 13 GOTO afillto ; 14 GOTO rfillto ; 15 setblk BCF flgs,WHT GOTO mloop setwht BSF flgs,WHT GOTO mloop tfont BCF flgs,OFN GOTO mloop ofont BSF flgs,OFN GOTO mloop nfont BCF flgs,BFN GOTO mloop bfont BSF flgs,BFN GOTO mloop pause MOVLW D'100' CALL delay GOTO mloop beep MOVLW D'100' MOVWF tmp1 beep0 BSF PORTA,SPK_ MOVLW D'164' MOVWF tmp0 beep1 DECFSZ tmp0,F GOTO beep1 BCF PORTA,SPK_ MOVLW D'164' MOVWF tmp0 beep2 DECFSZ tmp0,F GOTO beep2 DECFSZ tmp1,F GOTO beep0 GOTO mloop amoveto CALL rdbuf MOVWF x0 CALL rdbuf MOVWF y0 GOTO moveto rmoveto CALL rdbuf ADDWF x0,F CALL rdbuf ADDWF y0,F moveto GOTO mloop alineto CALL rdbuf MOVWF x1 CALL rdbuf MOVWF y1 GOTO lineto rlineto CALL rdbuf ADDWF x0,W MOVWF x1 CALL rdbuf ADDWF y0,W MOVWF y1 lineto CALL line MOVF x1,W ; x0 = x1 MOVWF x0 MOVF y1,W ; y0 = y1 MOVWF y0 GOTO mloop afillto CALL rdbuf MOVWF x1 CALL rdbuf MOVWF y1 GOTO fillto rfillto CALL rdbuf ADDWF x0,W MOVWF x1 CALL rdbuf ADDWF y0,W MOVWF y1 fillto CALL fbox MOVF x1,W ; x0 = x1 MOVWF x0 MOVF y1,W ; y0 = y1 MOVWF y0 GOTO mloop dotat CALL rdbuf MOVWF xx CALL rdbuf MOVWF yy CALL setpix GOTO mloop grphclr CALL grclr GOTO mloop print MOVF cmd,W ; character output ANDLW H'7F' ; 128..255 = 0..127 MOVWF alo CLRF ahi BCF STATUS,C RLF alo,F RLF ahi,F RLF alo,F RLF ahi,F RLF alo,F RLF ahi,F MOVLW H'08' ; cgrtab starts at 0x800 ADDWF ahi,F MOVF y0,W ; yy to char top line ADDLW D'8' BTFSC flgs,BFN ; big font? ADDLW D'8' MOVWF yy MOVLW D'9' ; 9 lines BTFSC flgs,BFN ; big font? ADDLW D'9' MOVWF tmp3 CLRF rr GOTO prtop prlin CLRF rr ; 2nd top line for big font MOVF tmp3,W XORLW D'17' BTFSC STATUS,Z GOTO prtop CALL getcgr ; current address to stack CLRF PCLATH ; returned from cgrtab MOVWF rr BTFSC flgs,BFN ; big font? BTFSC tmp3,0 ; only every 2nd time INCF alo,F RLF rr,F BCF rr,0 prtop DECF yy,F ; next line DECF x0,W ; xx to char left margin BTFSC flgs,BFN ; big font? ADDLW -D'1' MOVWF xx MOVLW D'7' ; 7 rows BTFSC flgs,BFN ; big font? ADDLW D'7' MOVWF tmp2 prcol BTFSS rr,6 BSF flgs,IPX ; char background BTFSS rr,6 BTFSC flgs,OFN ; skip if IPX and not OFN CALL setpix BCF flgs,IPX BTFSC flgs,BFN ; big font? BTFSC tmp2,0 ; only every 2nd time RLF rr,F INCF xx,F DECFSZ tmp2,F GOTO prcol DECFSZ tmp3,F GOTO prlin MOVLW D'6' ; advance x by char width BTFSC flgs,BFN ; big font? ADDLW D'6' ADDWF x0,F GOTO mloop getcgr MOVF ahi,W MOVWF PCLATH MOVF alo,W MOVWF PCL ; GOTO cgrtab, return from there rdbuf0 BCF PORTA,BSY_ rdbuf CLRWDT ; at idle time we loop here MOVF rptr,W ; blocking read data from buf XORWF wptr,W BTFSC STATUS,Z GOTO rdbuf0 BSF PORTA,BSY_ ; data available: MOVF rptr,W ANDLW H'3F' ADDLW buf BTFSC rptr,6 ; banks 1,3 ? ADDLW H'80' MOVWF FSR BTFSC rptr,7 ; banks 2,3 ? BSF STATUS,IRP INCF rptr,F MOVF INDF,W BCF STATUS,IRP RETURN delay MOVWF tmp1 ; delay ca. W ms dlyw1 MOVLW D'248' MOVWF tmp0 dlyw0 NOP GOTO $+1 GOTO $+1 DECFSZ tmp0,F GOTO dlyw0 DECFSZ tmp1,F GOTO dlyw1 RETLW 0 initlcd BSF PORTA,RST_ ; release reset MOVLW 1 CALL delay MOVLW D'00' ; graphics address 0x0000 CALL wrdat MOVLW D'00' CALL wrdat MOVLW H'42' CALL wrcmd MOVLW D'32' ; graphics line 32 x 8bit CALL wrdat MOVLW D'00' CALL wrdat MOVLW H'43' CALL wrcmd MOVLW H'80' ; OR mode CALL wrcmd MOVLW H'98' ; graphics on, text off CALL wrcmd RETURN line CLRF rr ; bresenham algorithm MOVLW 1 ; rr = 0, xi = 1, yi = 1 MOVWF xi MOVWF yi MOVF x1,W ; xd = x1 - x0 MOVWF xd MOVF x0,W MOVWF xx ; xx = x0 SUBWF xd,F BTFSC STATUS,C ; if (xd < 0) {xi = -1; xd = -xd} GOTO contx COMF xi,F INCF xi,F COMF xd,F INCF xd,F contx MOVF y1,W ; yd = y1 - y0 MOVWF yd MOVF y0,W MOVWF yy ; yy = y0 SUBWF yd,F BTFSC STATUS,C ; if (yd < 0) {yi = -1; yd = -yd} GOTO conty COMF yi,F INCF yi,F COMF yd,F INCF yd,F conty MOVF xd,W SUBWF yd,W BTFSC STATUS,C ; if (xd > yd) linex; else liney; GOTO liney linex BCF STATUS,C ; cc = 2 * xd RLF xd,W MOVWF cc RLF yd,W ; mm = 2 * yd MOVWF mm loopx CALL setpix MOVF xx,W ; if (xx == x1) done XORWF x1,W BTFSC STATUS,Z RETURN MOVF xi,W ; xx += xi ADDWF xx,F MOVF mm,W ; rr += mm ADDWF rr,F BTFSC rr,7 ; if (rr > xd) GOTO loopx ; rr < 0 MOVF rr,W SUBWF xd,W BTFSC STATUS,C GOTO loopx ; rr < xd MOVF yi,W ; yy += yi ADDWF yy,F MOVF cc,W ; rr -= cc SUBWF rr,F GOTO loopx liney BCF STATUS,C ; cc = 2 * yd RLF yd,W MOVWF cc RLF xd,W ; mm = 2 * xd MOVWF mm loopy CALL setpix MOVF yy,W ; if (yy == y1) done XORWF y1,W BTFSC STATUS,Z RETURN MOVF yi,W ; yy += yi ADDWF yy,F MOVF mm,W ; rr += mm ADDWF rr,F BTFSC rr,7 ; if (rr > yd) GOTO loopy ; rr < 0 MOVF rr,W SUBWF yd,W BTFSC STATUS,C GOTO loopy ; rr < yd MOVF xi,W ; xx += xi ADDWF xx,F MOVF cc,W ; rr -= cc SUBWF rr,F GOTO loopy fbox CLRF xi ; filled box CLRF yi MOVF x0,W ; if (x1 >= x0) xi = 1; else xi = -1; SUBWF x1,W BTFSC STATUS,C INCF xi,F BTFSS STATUS,C DECF xi,F MOVF y0,W ; if (y1 >= y0) yi = 1; else yi = -1; SUBWF y1,W BTFSC STATUS,C INCF yi,F BTFSS STATUS,C DECF yi,F MOVF y0,W ; yy = y0 MOVWF yy filly MOVF x0,W ; xx = x0 MOVWF xx fillx CALL setpix MOVF xx,W ; if (xx == x1) fillz XORWF x1,W BTFSC STATUS,Z GOTO fillz MOVF xi,W ; xx += xi ADDWF xx,F GOTO fillx fillz MOVF yy,W ; if (yy == y1) RETURN XORWF y1,W BTFSC STATUS,Z RETURN MOVF yi,W ; yy += yi ADDWF yy,F GOTO filly setpix INCF yy,W ; turn y-axis: 0..127 = 127..0 SUBLW LINS MOVWF hh ; hh:ll = y * 32 + xx / 8 MOVF xx,W ; = (y * 256 + xx) / 8 MOVWF ll BCF STATUS,C RRF hh,F RRF ll,F RRF hh,F RRF ll,F RRF hh,F RRF ll,W CALL wrdat MOVF hh,W ANDLW H'1F' CALL wrdat MOVLW H'24' ; set lcd address pointer CALL wrcmd MOVF xx,W ANDLW H'07' SUBLW H'FF' ; set pixel BTFSC flgs,WHT ANDLW H'F7' ; clear pixel BTFSC flgs,IPX XORLW H'08' ; invert pixel CALL wrcmd RETURN grclr MOVLW H'00' ; clear graphics area CALL wrdat MOVLW H'00' CALL wrdat MOVLW H'24' ; set addr CALL wrcmd MOVLW LINS ; lines MOVWF y0 grclr1 MOVLW D'32' ; bytes per line MOVWF x0 grclr0 MOVLW H'00' ; all pixels white BTFSC flgs,WHT MOVLW H'FF' ; all pixels black CALL wrdat MOVLW H'C0' ; write, auto increment CALL wrcmd DECFSZ x0,F GOTO grclr0 DECFSZ y0,F GOTO grclr1 RETURN wrdat BSF flgs,DWR ; needed after status check wrcmd MOVWF tmp0 ; save data/command rdsta BSF STATUS,RP0 ; bank 1 MOVLW B'11111111' ; display data input MOVWF _TRISB BCF STATUS,RP0 ; bank 0 BCF PORTA,RD_ NOP ; setup time sloop MOVF PORTB,W ; read status from port B ANDLW H'03' ; bit 0 and 1 set? XORLW H'03' BTFSS STATUS,Z GOTO sloop ; while busy BSF PORTA,RD_ BSF STATUS,RP0 ; bank 1 CLRF _TRISB ; display data output BCF STATUS,RP0 ; bank 0 wrdc BTFSC flgs,DWR BCF PORTA,CD_ ; c/d low for data BCF flgs,DWR ; release flag MOVF tmp0,W ; recall data/command MOVWF PORTB ; write to port B BCF PORTA,WR_ NOP ; strobe pulse width BSF PORTA,WR_ BSF PORTA,CD_ RETURN ; populate code gap for my simple programmer: (pp88.asm) ORG H'0300' DT 0,0,0,0,0,0,0,0 ORG H'0400' DT 0,0,0,0,0,0,0,0 ORG H'0500' DT 0,0,0,0,0,0,0,0 ORG H'0600' DT 0,0,0,0,0,0,0,0 ORG H'0700' DT 0,0,0,0,0,0,0,0 ORG H'0800' ; character generator rom cgrtab RETLW B'00101010' ; 0 gray RETLW B'00010101' RETLW B'00101010' RETLW B'00010101' RETLW B'00101010' RETLW B'00010101' RETLW B'00101010' RETLW B'00010101' RETLW B'00010101' ; 1 inverse gray RETLW B'00101010' RETLW B'00010101' RETLW B'00101010' RETLW B'00010101' RETLW B'00101010' RETLW B'00010101' RETLW B'00101010' RETLW B'00111111' ; 2 stripes RETLW B'00000000' RETLW B'00111111' RETLW B'00000000' RETLW B'00111111' RETLW B'00000000' RETLW B'00111111' RETLW B'00000000' RETLW B'00010101' ; 3 zepra RETLW B'00010101' RETLW B'00010101' RETLW B'00010101' RETLW B'00010101' RETLW B'00010101' RETLW B'00010101' RETLW B'00010101' RETLW B'00000000' ; 4 right RETLW B'00000100' RETLW B'00000010' RETLW B'00011111' RETLW B'00000010' RETLW B'00000100' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' ; 5 left RETLW B'00000000' RETLW B'00000100' RETLW B'00001000' RETLW B'00011111' RETLW B'00001000' RETLW B'00000100' RETLW B'00000000' RETLW B'00000100' ; 6 up RETLW B'00001110' RETLW B'00010101' RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00000000' RETLW B'00000100' ; 7 down RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00010101' RETLW B'00001110' RETLW B'00000100' RETLW B'00000000' RETLW B'00111111' ; 8 hi RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' ; 9 lo RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00111111' RETLW B'00000000' RETLW B'00010000' ; 10 LF RETLW B'00010000' RETLW B'00010000' RETLW B'00011011' RETLW B'00000010' RETLW B'00000011' RETLW B'00000010' RETLW B'00000010' RETLW B'00000111' ; 11 rise RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00111100' RETLW B'00000000' RETLW B'00111100' ; 12 fall RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00000111' RETLW B'00000000' RETLW B'00001100' ; 13 CR RETLW B'00010000' RETLW B'00010000' RETLW B'00001100' RETLW B'00000110' RETLW B'00000101' RETLW B'00000110' RETLW B'00000101' RETLW B'00000000' ; 14 bullet RETLW B'00000000' RETLW B'00001110' RETLW B'00011111' RETLW B'00001110' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' ; 15 circle RETLW B'00000000' RETLW B'00001110' RETLW B'00010001' RETLW B'00001110' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' ; 16 diamond RETLW B'00000000' RETLW B'00000000' RETLW B'00000100' RETLW B'00001010' RETLW B'00010001' RETLW B'00001010' RETLW B'00000100' RETLW B'00000000' ; 17 mu RETLW B'00000000' RETLW B'00001001' RETLW B'00001001' RETLW B'00001001' RETLW B'00001001' RETLW B'00001111' RETLW B'00010000' RETLW B'00001110' ; 18 sdeg RETLW B'00001010' RETLW B'00001110' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000010' ; 19 flash RETLW B'00000100' RETLW B'00001000' RETLW B'00011111' RETLW B'00000010' RETLW B'00000100' RETLW B'00001000' RETLW B'00000000' RETLW B'00000010' ; 20 sound RETLW B'00000011' RETLW B'00000010' RETLW B'00000010' RETLW B'00001110' RETLW B'00011110' RETLW B'00001100' RETLW B'00000000' RETLW B'00011111' ; 21 busy RETLW B'00010001' RETLW B'00001010' RETLW B'00000100' RETLW B'00001010' RETLW B'00010001' RETLW B'00011111' RETLW B'00000000' RETLW B'00000111' ; 22 sqrt RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00010100' RETLW B'00001100' RETLW B'00000100' RETLW B'00000000' RETLW B'00000010' ; 23 int RETLW B'00000101' RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00010100' RETLW B'00001000' RETLW B'00000000' RETLW B'00011111' ; 24 sum RETLW B'00001001' RETLW B'00000100' RETLW B'00000010' RETLW B'00000100' RETLW B'00001001' RETLW B'00011111' RETLW B'00000000' RETLW B'00000000' ; 25 div RETLW B'00000100' RETLW B'00000000' RETLW B'00011111' RETLW B'00000000' RETLW B'00000100' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' ; 26 cross RETLW B'00000000' RETLW B'00000000' RETLW B'00001010' RETLW B'00000100' RETLW B'00001010' RETLW B'00000000' RETLW B'00000000' RETLW B'00000110' ; 27 deg RETLW B'00001001' RETLW B'00001001' RETLW B'00000110' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00001100' ; 28 sqr RETLW B'00010010' RETLW B'00000100' RETLW B'00001000' RETLW B'00011110' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00001010' ; 29 auml RETLW B'00000000' RETLW B'00001110' RETLW B'00000001' RETLW B'00001111' RETLW B'00010001' RETLW B'00001111' RETLW B'00000000' RETLW B'00001010' ; 30 ouml RETLW B'00000000' RETLW B'00001110' RETLW B'00010001' RETLW B'00010001' RETLW B'00010001' RETLW B'00001110' RETLW B'00000000' RETLW B'00001010' ; 31 uuml RETLW B'00000000' RETLW B'00010001' RETLW B'00010001' RETLW B'00010001' RETLW B'00010001' RETLW B'00001110' RETLW B'00000000' RETLW B'00000000' ; 32 ' ' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000100' ; 33 '!' RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00000000' RETLW B'00000100' RETLW B'00000000' RETLW B'00001010' ; 34 '"' RETLW B'00001010' RETLW B'00001010' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00001010' ; 35 '#' RETLW B'00001010' RETLW B'00011111' RETLW B'00001010' RETLW B'00011111' RETLW B'00001010' RETLW B'00001010' RETLW B'00000000' RETLW B'00000100' ; 36 '$' RETLW B'00001111' RETLW B'00010100' RETLW B'00001110' RETLW B'00000101' RETLW B'00011110' RETLW B'00000100' RETLW B'00000000' RETLW B'00011000' ; 37 '%' RETLW B'00011001' RETLW B'00000010' RETLW B'00000100' RETLW B'00001000' RETLW B'00010011' RETLW B'00000011' RETLW B'00000000' RETLW B'00001000' ; 38 '&' RETLW B'00010100' RETLW B'00010100' RETLW B'00001000' RETLW B'00010101' RETLW B'00010010' RETLW B'00001101' RETLW B'00000000' RETLW B'00000100' ; 39 ''' RETLW B'00000100' RETLW B'00000100' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000010' ; 40 '(' RETLW B'00000100' RETLW B'00001000' RETLW B'00001000' RETLW B'00001000' RETLW B'00000100' RETLW B'00000010' RETLW B'00000000' RETLW B'00001000' ; 41 ')' RETLW B'00000100' RETLW B'00000010' RETLW B'00000010' RETLW B'00000010' RETLW B'00000100' RETLW B'00001000' RETLW B'00000000' RETLW B'00000000' ; 42 '*' RETLW B'00001010' RETLW B'00000100' RETLW B'00011111' RETLW B'00000100' RETLW B'00001010' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' ; 43 '+' RETLW B'00000100' RETLW B'00000100' RETLW B'00011111' RETLW B'00000100' RETLW B'00000100' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' ; 44 ',' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00001100' RETLW B'00001100' RETLW B'00000100' RETLW B'00001000' RETLW B'00000000' ; 45 '-' RETLW B'00000000' RETLW B'00000000' RETLW B'00011110' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' ; 46 '.' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00001100' RETLW B'00001100' RETLW B'00000000' RETLW B'00000000' ; 47 '/' RETLW B'00000001' RETLW B'00000010' RETLW B'00000100' RETLW B'00001000' RETLW B'00010000' RETLW B'00000000' RETLW B'00000000' RETLW B'00001110' ; 48 '0' RETLW B'00010001' RETLW B'00010011' RETLW B'00010101' RETLW B'00011001' RETLW B'00010001' RETLW B'00001110' RETLW B'00000000' RETLW B'00000100' ; 49 '1' RETLW B'00001100' RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00001110' RETLW B'00000000' RETLW B'00001110' ; 50 '2' RETLW B'00010001' RETLW B'00000001' RETLW B'00000010' RETLW B'00000100' RETLW B'00001000' RETLW B'00011111' RETLW B'00000000' RETLW B'00001110' ; 51 '3' RETLW B'00010001' RETLW B'00000001' RETLW B'00000110' RETLW B'00000001' RETLW B'00010001' RETLW B'00001110' RETLW B'00000000' RETLW B'00000010' ; 52 '4' RETLW B'00000110' RETLW B'00001010' RETLW B'00010010' RETLW B'00011111' RETLW B'00000010' RETLW B'00000010' RETLW B'00000000' RETLW B'00011111' ; 53 '5' RETLW B'00010000' RETLW B'00011110' RETLW B'00000001' RETLW B'00000001' RETLW B'00010001' RETLW B'00001110' RETLW B'00000000' RETLW B'00000110' ; 54 '6' RETLW B'00001000' RETLW B'00010000' RETLW B'00011110' RETLW B'00010001' RETLW B'00010001' RETLW B'00001110' RETLW B'00000000' RETLW B'00011111' ; 55 '7' RETLW B'00000001' RETLW B'00000010' RETLW B'00000100' RETLW B'00001000' RETLW B'00001000' RETLW B'00001000' RETLW B'00000000' RETLW B'00001110' ; 56 '8' RETLW B'00010001' RETLW B'00010001' RETLW B'00001110' RETLW B'00010001' RETLW B'00010001' RETLW B'00001110' RETLW B'00000000' RETLW B'00001110' ; 57 '9' RETLW B'00010001' RETLW B'00010001' RETLW B'00001111' RETLW B'00000001' RETLW B'00000010' RETLW B'00001100' RETLW B'00000000' RETLW B'00000000' ; 58 ':' RETLW B'00001100' RETLW B'00001100' RETLW B'00000000' RETLW B'00001100' RETLW B'00001100' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' ; 59 ';' RETLW B'00001100' RETLW B'00001100' RETLW B'00000000' RETLW B'00001100' RETLW B'00001100' RETLW B'00000100' RETLW B'00001000' RETLW B'00000010' ; 60 '<' RETLW B'00000100' RETLW B'00001000' RETLW B'00010000' RETLW B'00001000' RETLW B'00000100' RETLW B'00000010' RETLW B'00000000' RETLW B'00000000' ; 61 '=' RETLW B'00000000' RETLW B'00011111' RETLW B'00000000' RETLW B'00011111' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00010000' ; 62 '>' RETLW B'00001000' RETLW B'00000100' RETLW B'00000010' RETLW B'00000100' RETLW B'00001000' RETLW B'00010000' RETLW B'00000000' RETLW B'00001110' ; 63 '?' RETLW B'00010001' RETLW B'00000001' RETLW B'00000010' RETLW B'00000100' RETLW B'00000000' RETLW B'00000100' RETLW B'00000000' RETLW B'00001110' ; 64 '@' RETLW B'00010001' RETLW B'00010101' RETLW B'00010111' RETLW B'00010100' RETLW B'00010000' RETLW B'00001111' RETLW B'00000000' RETLW B'00001110' ; 65 'A' RETLW B'00010001' RETLW B'00010001' RETLW B'00011111' RETLW B'00010001' RETLW B'00010001' RETLW B'00010001' RETLW B'00000000' RETLW B'00011110' ; 66 'B' RETLW B'00010001' RETLW B'00010001' RETLW B'00011110' RETLW B'00010001' RETLW B'00010001' RETLW B'00011110' RETLW B'00000000' RETLW B'00001110' ; 67 'C' RETLW B'00010001' RETLW B'00010000' RETLW B'00010000' RETLW B'00010000' RETLW B'00010001' RETLW B'00001110' RETLW B'00000000' RETLW B'00011100' ; 68 'D' RETLW B'00010010' RETLW B'00010001' RETLW B'00010001' RETLW B'00010001' RETLW B'00010010' RETLW B'00011100' RETLW B'00000000' RETLW B'00011111' ; 69 'E' RETLW B'00010000' RETLW B'00010000' RETLW B'00011110' RETLW B'00010000' RETLW B'00010000' RETLW B'00011111' RETLW B'00000000' RETLW B'00011111' ; 70 'F' RETLW B'00010000' RETLW B'00010000' RETLW B'00011110' RETLW B'00010000' RETLW B'00010000' RETLW B'00010000' RETLW B'00000000' RETLW B'00001110' ; 71 'G' RETLW B'00010001' RETLW B'00010000' RETLW B'00010000' RETLW B'00010011' RETLW B'00010001' RETLW B'00001111' RETLW B'00000000' RETLW B'00010001' ; 72 'H' RETLW B'00010001' RETLW B'00010001' RETLW B'00011111' RETLW B'00010001' RETLW B'00010001' RETLW B'00010001' RETLW B'00000000' RETLW B'00001110' ; 73 'I' RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00001110' RETLW B'00000000' RETLW B'00000001' ; 74 'J' RETLW B'00000001' RETLW B'00000001' RETLW B'00000001' RETLW B'00010001' RETLW B'00010001' RETLW B'00001110' RETLW B'00000000' RETLW B'00010001' ; 75 'K' RETLW B'00010010' RETLW B'00010100' RETLW B'00011000' RETLW B'00010100' RETLW B'00010010' RETLW B'00010001' RETLW B'00000000' RETLW B'00010000' ; 76 'L' RETLW B'00010000' RETLW B'00010000' RETLW B'00010000' RETLW B'00010000' RETLW B'00010000' RETLW B'00011111' RETLW B'00000000' RETLW B'00010001' ; 77 'M' RETLW B'00011011' RETLW B'00010101' RETLW B'00010101' RETLW B'00010001' RETLW B'00010001' RETLW B'00010001' RETLW B'00000000' RETLW B'00010001' ; 78 'N' RETLW B'00010001' RETLW B'00011001' RETLW B'00010101' RETLW B'00010011' RETLW B'00010001' RETLW B'00010001' RETLW B'00000000' RETLW B'00001110' ; 79 'O' RETLW B'00010001' RETLW B'00010001' RETLW B'00010001' RETLW B'00010001' RETLW B'00010001' RETLW B'00001110' RETLW B'00000000' RETLW B'00011110' ; 80 'P' RETLW B'00010001' RETLW B'00010001' RETLW B'00011110' RETLW B'00010000' RETLW B'00010000' RETLW B'00010000' RETLW B'00000000' RETLW B'00001110' ; 81 'Q' RETLW B'00010001' RETLW B'00010001' RETLW B'00010001' RETLW B'00010101' RETLW B'00010010' RETLW B'00001101' RETLW B'00000000' RETLW B'00011110' ; 82 'R' RETLW B'00010001' RETLW B'00010001' RETLW B'00011110' RETLW B'00010100' RETLW B'00010010' RETLW B'00010001' RETLW B'00000000' RETLW B'00001110' ; 83 'S' RETLW B'00010001' RETLW B'00010000' RETLW B'00001110' RETLW B'00000001' RETLW B'00010001' RETLW B'00001110' RETLW B'00000000' RETLW B'00011111' ; 84 'T' RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00000000' RETLW B'00010001' ; 85 'U' RETLW B'00010001' RETLW B'00010001' RETLW B'00010001' RETLW B'00010001' RETLW B'00010001' RETLW B'00001110' RETLW B'00000000' RETLW B'00010001' ; 86 'V' RETLW B'00010001' RETLW B'00010001' RETLW B'00001010' RETLW B'00001010' RETLW B'00000100' RETLW B'00000100' RETLW B'00000000' RETLW B'00010001' ; 87 'W' RETLW B'00010001' RETLW B'00010001' RETLW B'00010101' RETLW B'00010101' RETLW B'00011011' RETLW B'00010001' RETLW B'00000000' RETLW B'00010001' ; 88 'X' RETLW B'00010001' RETLW B'00001010' RETLW B'00000100' RETLW B'00001010' RETLW B'00010001' RETLW B'00010001' RETLW B'00000000' RETLW B'00010001' ; 89 'Y' RETLW B'00010001' RETLW B'00001010' RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00000000' RETLW B'00011111' ; 90 'Z' RETLW B'00000001' RETLW B'00000010' RETLW B'00000100' RETLW B'00001000' RETLW B'00010000' RETLW B'00011111' RETLW B'00000000' RETLW B'00001110' ; 91 '[' RETLW B'00001000' RETLW B'00001000' RETLW B'00001000' RETLW B'00001000' RETLW B'00001000' RETLW B'00001110' RETLW B'00000000' RETLW B'00000000' ; 92 '\' RETLW B'00010000' RETLW B'00001000' RETLW B'00000100' RETLW B'00000010' RETLW B'00000001' RETLW B'00000000' RETLW B'00000000' RETLW B'00001110' ; 93 ']' RETLW B'00000010' RETLW B'00000010' RETLW B'00000010' RETLW B'00000010' RETLW B'00000010' RETLW B'00001110' RETLW B'00000000' RETLW B'00000100' ; 94 '^' RETLW B'00001010' RETLW B'00010001' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' ; 95 '_' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00011111' RETLW B'00001000' ; 96 '`' RETLW B'00001000' RETLW B'00000100' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' ; 97 'a' RETLW B'00000000' RETLW B'00001110' RETLW B'00000001' RETLW B'00001111' RETLW B'00010001' RETLW B'00001111' RETLW B'00000000' RETLW B'00010000' ; 98 'b' RETLW B'00010000' RETLW B'00011110' RETLW B'00010001' RETLW B'00010001' RETLW B'00010001' RETLW B'00011110' RETLW B'00000000' RETLW B'00000000' ; 99 'c' RETLW B'00000000' RETLW B'00001111' RETLW B'00010000' RETLW B'00010000' RETLW B'00010000' RETLW B'00001111' RETLW B'00000000' RETLW B'00000001' ; 100 'd' RETLW B'00000001' RETLW B'00001111' RETLW B'00010001' RETLW B'00010001' RETLW B'00010001' RETLW B'00001111' RETLW B'00000000' RETLW B'00000000' ; 101 'e' RETLW B'00000000' RETLW B'00001110' RETLW B'00010001' RETLW B'00011111' RETLW B'00010000' RETLW B'00001111' RETLW B'00000000' RETLW B'00000010' ; 102 'f' RETLW B'00000101' RETLW B'00000100' RETLW B'00001110' RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00000000' RETLW B'00000000' ; 103 'g' RETLW B'00000000' RETLW B'00001110' RETLW B'00010001' RETLW B'00010001' RETLW B'00001111' RETLW B'00000001' RETLW B'00001110' RETLW B'00010000' ; 104 'h' RETLW B'00010000' RETLW B'00011110' RETLW B'00010001' RETLW B'00010001' RETLW B'00010001' RETLW B'00010001' RETLW B'00000000' RETLW B'00000100' ; 105 'i' RETLW B'00000000' RETLW B'00001100' RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00001110' RETLW B'00000000' RETLW B'00000010' ; 106 'j' RETLW B'00000000' RETLW B'00000110' RETLW B'00000010' RETLW B'00000010' RETLW B'00000010' RETLW B'00010010' RETLW B'00001100' RETLW B'00001000' ; 107 'k' RETLW B'00001000' RETLW B'00001001' RETLW B'00001010' RETLW B'00001100' RETLW B'00001010' RETLW B'00001001' RETLW B'00000000' RETLW B'00001100' ; 108 'l' RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00001110' RETLW B'00000000' RETLW B'00000000' ; 109 'm' RETLW B'00000000' RETLW B'00011011' RETLW B'00010101' RETLW B'00010101' RETLW B'00010101' RETLW B'00010001' RETLW B'00000000' RETLW B'00000000' ; 110 'n' RETLW B'00000000' RETLW B'00011110' RETLW B'00010001' RETLW B'00010001' RETLW B'00010001' RETLW B'00010001' RETLW B'00000000' RETLW B'00000000' ; 111 'o' RETLW B'00000000' RETLW B'00001110' RETLW B'00010001' RETLW B'00010001' RETLW B'00010001' RETLW B'00001110' RETLW B'00000000' RETLW B'00000000' ; 112 'p' RETLW B'00000000' RETLW B'00011110' RETLW B'00010001' RETLW B'00010001' RETLW B'00011110' RETLW B'00010000' RETLW B'00010000' RETLW B'00000000' ; 113 'q' RETLW B'00000000' RETLW B'00001111' RETLW B'00010001' RETLW B'00010001' RETLW B'00001111' RETLW B'00000001' RETLW B'00000001' RETLW B'00000000' ; 114 'r' RETLW B'00000000' RETLW B'00010111' RETLW B'00011000' RETLW B'00010000' RETLW B'00010000' RETLW B'00010000' RETLW B'00000000' RETLW B'00000000' ; 115 's' RETLW B'00000000' RETLW B'00001111' RETLW B'00010000' RETLW B'00001110' RETLW B'00000001' RETLW B'00011110' RETLW B'00000000' RETLW B'00000100' ; 116 't' RETLW B'00000100' RETLW B'00001110' RETLW B'00000100' RETLW B'00000100' RETLW B'00000101' RETLW B'00000010' RETLW B'00000000' RETLW B'00000000' ; 117 'u' RETLW B'00000000' RETLW B'00010001' RETLW B'00010001' RETLW B'00010001' RETLW B'00010001' RETLW B'00001111' RETLW B'00000000' RETLW B'00000000' ; 118 'v' RETLW B'00000000' RETLW B'00010001' RETLW B'00010001' RETLW B'00010001' RETLW B'00001010' RETLW B'00000100' RETLW B'00000000' RETLW B'00000000' ; 119 'w' RETLW B'00000000' RETLW B'00010001' RETLW B'00010001' RETLW B'00010101' RETLW B'00010101' RETLW B'00001010' RETLW B'00000000' RETLW B'00000000' ; 120 'x' RETLW B'00000000' RETLW B'00010001' RETLW B'00001010' RETLW B'00000100' RETLW B'00001010' RETLW B'00010001' RETLW B'00000000' RETLW B'00000000' ; 121 'y' RETLW B'00000000' RETLW B'00010001' RETLW B'00010001' RETLW B'00010001' RETLW B'00001111' RETLW B'00000001' RETLW B'00001110' RETLW B'00000000' ; 122 'z' RETLW B'00000000' RETLW B'00011111' RETLW B'00000010' RETLW B'00000100' RETLW B'00001000' RETLW B'00011111' RETLW B'00000000' RETLW B'00000110' ; 123 '{' RETLW B'00001000' RETLW B'00001000' RETLW B'00010000' RETLW B'00001000' RETLW B'00001000' RETLW B'00000110' RETLW B'00000000' RETLW B'00000100' ; 124 '|' RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' RETLW B'00000000' RETLW B'00001100' ; 125 '}' RETLW B'00000010' RETLW B'00000010' RETLW B'00000001' RETLW B'00000010' RETLW B'00000010' RETLW B'00001100' RETLW B'00000000' RETLW B'00000000' ; 126 '~' RETLW B'00000000' RETLW B'00001000' RETLW B'00010101' RETLW B'00000010' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00010101' ; 127 rubbout RETLW B'00001010' RETLW B'00010101' RETLW B'00001010' RETLW B'00010101' RETLW B'00001010' RETLW B'00010101' RETLW B'00000000' END;