Hi Aerostar!
Somehow I screwed up my working file and now I have rows 1-9 as white squares while rows 10 and 11 are X's! I have done something stupid just not sure what after several days of trying!
Code:
'****************************************************************
'* Name : NTSC -RPM-V2 *
'* Author : Ed Cannady *
'* Notice : Copyright (c) 2017 *
'* : All Rights Reserved *
'* Date : 06-30-17 *
'* Version : 1.0 *
'* Notes : VIDEO IDENT *
'* : WITH GREAT HELP FROM AEROSTAR *
'****************************************************************
' WORKS USES SYNC FOR SWITCHING BETWEEN MIXED AND FULL TEXT MODE
' GOING FROM VID IN TO TEXT AND BACK TO VID IN
#CONFIG
__config _HS_OSC & _WDT_ON & _MCLRE_ON & _LVP_OFF & _CP_OFF
#ENDCONFIG
'@ device PIC16F628A,HS_OSC,BOD_ON,MCLR_ON,PWRT_ON 'AEROSTAR SET UP
define OSC 20
'---------------------------------------------------------------
'16f628a ED definitions
TVSDA VAR PORTB.4 '0 OUTPUT to pin 11 of stv chip
CS0 VAR PORTB.6 '0 OUTPUT to pin 13 of stv chip
TVSCL VAR PORTB.5 '0 OUTPUT to pin 12 of stv chip
SYNCH0 VAR PORTB.7 '1 INPUT to pin 7 of stv chip
'---------------------------------------------------------------
ZOOMREG CON %0000000011001100 ' 12 ZOOM REGISTER
COLREG CON %0000000011001101 ' 13 COLOUR REGISTER
CONREG CON %0000000011001110 ' 14 CONTROL REGISTER
POSREG CON %0000000011001111 ' 15 POSITION REGISTER
MODEREG CON %0000000011010000 ' 16 MODE REGISTER
ICOUNT VAR BYTE
BITCOUNTER VAR BYTE
WDATA VAR WORD
CHARCOUNTER VAR BYTE
LINECOUNTER VAR BYTE
STVCHAR VAR BYTE
ASCCHAR VAR BYTE
CHARS VAR BYTE
CHARS2 VAR BYTE
TEMP VAR BYTE
TEMP1 VAR BYTE
COUNTER VAR BYTE
PULSES VAR BYTE
CURRENTMODE0 VAR BYTE
PRPM VAR WORD
'----------------------------------------------------------------
' TOPLEFT CON 0
' TOPMIDDLE CON 5
' TOPRIGHT CON 10
' BOTLEFT CON 2560 '10*256
' BOTMIDDLE CON 2565 '(10*256)+ 5
' BOTRIGHT CON 2570 '(10*256)+ 10
'----------------------------------------------------------------
DATA @0,"NTSC.",$FF,"NO SYNCHS RECEIVED",$FF
TRISB = %10001111
'----------------------------------------------------------------
PAUSE 500
GOSUB Init
PAUSE 500
GOSUB Init
CURRENTMODE0=255 ' FORCES TRYSYNCHS TO SET MODE FIRST TIME
Demo:
CHARCOUNTER = 0
LINECOUNTER = 0
' CURRENTMODE0 = 0 '0 = MIXED 1 = TEXT
gosub CLS
GOSUB TRYSYNCHS '==================================
TEMP = 0
LOOPER:
GOSUB HEADER ' LINE 3 RIGHT HAND SIDE TEST.
GOSUB FILLSCREEN
STOPHERE:
GOTO STOPHERE
' PRPM = 6789
' IF CURRENTMODE0=0 THEN ' ONLY WHEN INCOMING VIDEO SIGNAL
' GOSUB HEADER ' LINE 3 RIGHT HAND SIDE TEST.
' ENDIF
' IF CURRENTMODE0=1 THEN
' GOSUB NOVIDEO ' DISPLAYS NO VIDEO IF NO INCOMING SYNCHS
' ENDIF
GOSUB TRYSYNCHS '===========================
' PAUSE 500 'I/2 SECOND DELAY
' TOGGLE HEARTBEAT ' LED
GOTO LOOPER 'DO IT FOREVER
DISPLAYCHAR:
WDATA = %0001011100000000 + STVCHAR
' 11 10 9 8 7654 3210
' WDATA = %0001 0 1 1 1 0000 0000 + STVCHAR
' bit 11 = character background 0 = disabled 1 = enabled
' bit 10 = red
' bit 09 = green
' bit 08 = blue
' 000 = black
' 001 = blue
' 010 = green
' 011 = cyan
' 100 = red
' 101 = magenta
' 110 = yellow
' 111 = white
' bit 7 = blink 1=enable 0=disable
GOSUB SEND
RETURN
SETLINE:
WDATA = LINECOUNTER*256 + CHARCOUNTER
GOSUB Send 'position cursor
RETURN
WasteTime: ' WORKS WITH LESS NOPS
pauseus 20 ' was 20 nops
RETURN
StartCommunication:
TVSCL = 1 'HIGH TVSCL
GOSUB WasteTime
CS0 = 0 'LOW CS0
GOSUB WasteTime
TVSCL = 0 'LOW TVSCL
GOSUB WasteTime
RETURN
StopCommunication:
TVSCL = 1 'HIGH TVSCL
GOSUB WasteTime
CS0 = 1 'HIGH CS0
GOSUB WasteTime
RETURN
SendOne:
TVSDA = 1 'HIGH TVSDA
GOSUB WasteTime
TVSCL = 0 'LOW TVSCL
GOSUB WasteTime
TVSCL = 1 'HIGH TVSCL
GOSUB WasteTime
RETURN
SendZero:
TVSDA = 0 'LOW TVSDA
GOSUB WasteTime
TVSCL = 0 ' LOW TVSCL
GOSUB WasteTime
TVSCL = 1 'HIGH TVSCL
GOSUB WasteTime
TVSDA = 1 'HIGH TVSDA
GOSUB WasteTime
RETURN
OutByte:
FOR BITCOUNTER = 1 TO 16
IF WDATA.15 = 1 THEN
GOSUB SendOne
ELSE
GOSUB SendZero
ENDIF
WDATA = WDATA << 1
NEXT BITCOUNTER
RETURN
Send:
GOSUB StartCommunication
GOSUB OutByte
GOSUB StopCommunication
RETURN
'-------------------------------------------------------------
Init: ' PAUSE 50 added - seems to improve reliability of init
TVSCL = 1 'HIGH TVSCL
TVSDA = 1 'HIGH TVSDA
CS0 = 1 'HIGH CS0
WDATA = $3000 '%110000 00000000
GOSUB Send ' Init STV5730
PAUSE 50
WDATA = $3000
GOSUB Send
PAUSE 50
WDATA = $00DB '%00000000 11011011
GOSUB Send
PAUSE 50
WDATA = $1000 '%00010000 00000000
GOSUB Send
PAUSE 50
'-------------------------------------------------------------
WDATA = %0000000011001100
GOSUB Send ' Init registers (point to register 12)
PAUSE 50
'-------------------------------------------------------------
WDATA = %0001000000000000 'NORMAL
' WDATA = %0001000011110000 '4 PIXELS HORIZ AND VERT
GOSUB Send ' Zoom ADDRESS 12
PAUSE 50
'-------------------------------------------------------------
WDATA = %0001001000000000
' WDATA = %0001001000000100
GOSUB Send ' Color ADDRESS 13
PAUSE 50
'--------------------------------------------------------
WDATA= %0001101011010100
'CHANGE BIT 0 TO 1 FOR TEXT ONLY
GOSUB Send ' Control ADDRESS 14
'-------------------------------------------------------------
WDATA = %0001001100001111
' was WDATA = %0001 0111 1100 1111
GOSUB Send ' Position ADDRESS 15
'-------------------------------------------------------------
WDATA = %0001000100101110 '$183E BIT 11 CHANGED TO 0 M4 = 0
GOSUB Send ' Mode ADDRESS 16 %0001100000111110
'-------------------------------------------------------------
WDATA = $00C0 '%00000000 11000000
GOSUB Send ' Set row attributes
FOR ICOUNT = 0 TO 10
WDATA = %0001000010000001 '%00010000 11000100 was $10C4
' WDATA =%0001000010000111
GOSUB Send
NEXT ICOUNT
RETURN
CLS:
'character=$0B 'SPACE
TEMP1=0 ' LINECOUNTER
TEMP =0 'CHARCOUNTER
loop2:
WDATA = 0 ' LINECOUNTER*256 + CHARCOUNTER ADDRESS
GOSUB Send
LOOP3: ' :CHARACTERS
WDATA = %0001011100001011 ' 1011 0BH SPACECHARACTER
GOSUB Send
TEMP = TEMP + 1
IF TEMP >= 28 THEN
TEMP = 0
TEMP1=TEMP1 + 1
ENDIF
IF TEMP1 >= 11 THEN SCREENBLANK
GOTO LOOP3
SCREENBLANK:
RETURN
GETSTVCHAR: 'CONVERT ASCII TO STV
STVCHAR =$7F ' FORCES CLOCK PICTURE IF ERROR
LOOKDOWN ASCCHAR,["0123456789- ABCDEFGHIJKLMNOPQRSTUVWXYZ:./'abcdefghijklmnopqrstuvwxyz"],STVCHAR
RETURN
HEADER:
LINECOUNTER=0 'SET START POSITION
CHARCOUNTER=1 'SET CURSOR POSITION
GOSUB SETLINE
FOR CHARS2=0 TO 4
READ CHARS2, ASCCHAR
gosub GETSTVCHAR 'CONVERT ASCII TO STV
GOSUB DISPLAYCHAR
NEXT
LINECOUNTER=10 'SET START POSITION
CHARCOUNTER=1 'SET CURSOR POSITION
GOSUB SETLINE
ASCCHAR = "P"
gosub GETSTVCHAR 'CONVERT ASCII TO STV
GOSUB DISPLAYCHAR
ASCCHAR = "R"
gosub GETSTVCHAR 'CONVERT ASCII TO STV
GOSUB DISPLAYCHAR
ASCCHAR = "P"
gosub GETSTVCHAR 'CONVERT ASCII TO STV
GOSUB DISPLAYCHAR
ASCCHAR = "M"
gosub GETSTVCHAR 'CONVERT ASCII TO STV
GOSUB DISPLAYCHAR
ASCCHAR = " "
gosub GETSTVCHAR 'CONVERT ASCII TO STV
GOSUB DISPLAYCHAR
STVCHAR = PRPM DIG 3 '****** DIG VALUES ONLY
GOSUB DISPLAYCHAR 'NEEDS TO BE STVCHAR !!
STVCHAR = PRPM DIG 2
GOSUB DISPLAYCHAR
STVCHAR = PRPM DIG 1
GOSUB DISPLAYCHAR
STVCHAR = PRPM DIG 0
GOSUB DISPLAYCHAR
RETURN
NOVIDEO:
LINECOUNTER=5 'SET START POSITION
CHARCOUNTER=4 'SET CURSOR POSITION
GOSUB SETLINE
FOR CHARS2=6 TO 23 ' FROM EEPROM DATA
READ CHARS2, ASCCHAR
gosub GETSTVCHAR 'CONVERT ASCII TO STV
GOSUB DISPLAYCHAR
NEXT
RETURN
TRYSYNCHS:
PULSES=0
COUNT SYNCH0,4,PULSES '3MS SHOULD COUNT TO 2 OR 3
IF PULSES > 0 THEN MIXED0
FULL0:
IF CURRENTMODE0=1 THEN RETURN
WDATA= %0000000011001110 'CONTROL REGISTER
GOSUB SEND
WDATA= %0001101011010101
'CHANGE BIT 0 TO 1 FOR TEXT ONLY OTIGINAL
' WDATA= %0001101111010100
'CHANGE BIT 0 TO 1 FOR TEXT ONLY
GOSUB SEND
STAYHERE02:
CURRENTMODE0=1
GOSUB CLS
GOBACK0:
RETURN
MIXED0:
IF CURRENTMODE0=0 THEN RETURN
WDATA= %0000000011001110 'CONTROL REGISTER
GOSUB SEND
WDATA= %0001101011010100
GOSUB SEND
STAYHERE01:
CURRENTMODE0=0
GOSUB CLS
RETURN
'----------------------debug fills screen with X------------------
FILLSCREEN:
'character=$0B 'SPACE
TEMP1=0 ' LINECOUNTER
TEMP =0 'CHARCOUNTER
loop2a:
WDATA = 0 ' LINECOUNTER*256 + CHARCOUNTER ADDRESS
GOSUB Send
LOOP3a: ' :CHARACTERS 100011
WDATA = %0001011101100011 ' X CHARACTER
' WDATA = %0001011101110111
' if temp1 =0 then WDATA = %0001011101110111
if temp1 =1 then WDATA = %0001000001100011
if temp1 =2 then WDATA = %0001000101100011
if temp1 =3 then WDATA = %0001001001100011
if temp1 =4 then WDATA = %0001001101100011
if temp1 =5 then WDATA = %0001010001100011
if temp1 =6 then WDATA = %0001010101100011
if temp1 =7 then WDATA = %0001011001100011
if temp1 =8 then WDATA = %0001011101100011
if temp1 >=9 then WDATA = %0001011100100011
GOSUB Send
TEMP = TEMP + 1
IF TEMP >= 28 THEN
TEMP = 0
TEMP1=TEMP1 + 1
ENDIF
IF TEMP1 >= 11 THEN SCREENBLANKA
GOTO LOOP3A
SCREENBLANKA:
RETURN
Thanks, Ed
Bookmarks