This simple software makes a color bar or cross-hatch pattern on PC VGA or SVGA monitor. Its very simple just look at the circuit for all pin definitions.
The pins ra.0 to ra.2 are the respective outs for blue, red and green signals, and rb.0 and rb.1 the sync H and V. The rb.3 pin is used to change the mode, from bars, to cross-hatch.
Really, there is not too much that I can say about the project; the SX software generates all the signals, keeping count of the clock cycles. Look at the code and you'll have a better idea of how it works.
I'm using it to test many monitors, and it gives me a good result. I have found that in some cheap Samsung or Goldstar monitors there is a difference in the V size.
You can put it all together in a little box to bring it with you in your pocket.
Good Luck !
;***************************************************************************************** ; ; Filename: VGA Monitor tester.src ; ; Author: Alberto Geraci ; BTX Sistemas ; Argentina. ; ; Revision: 1.01 ; ; Freq: 50MHz ; ; Compiled using: SX-Key. ; ; Date Written : January 16, 2002 ; ; Last Revised : January 25, 2002 ; ; Program Description: ; ; Super Simple !! VGA Monitor tester ; Simple project to demostrate the SX power running at 50Mhz ; It generates color bars and white lines in 640x480 mode. ; ; Interface Pins: ; ; azul = ra0 = pin 1 ; rojo = ra1 = pin 3 ; verde= ra2 = pin 2 ; ; H sync = rb0 = pin 13 ; V sync = rb1 = pin 14 ;***************************************************************************************** ; DEVICE SX18L,OSCHS3,TURBO,stackx_optionx,protect RESET Start FREQ 50_000_000 counter equ $08 repeat equ $09 times equ $0A lazo equ $0B Start mov ra, #%00000000 mov !ra,#%11110000 mov rb, #%00000011 mov !rb,#%00001000 mov w,#$0E mov M,w mov !rb,#%11110111 mov w,#$0F mov M,w org 20 ; ; MACROS ; ;*** MACRO VSYNC **************************************************************************************** vsync MACRO ;3180 cycles ; 63.6 uSeg ;; 28 + 3.8 + 28 + 3.8 ;;1400+190+1399+191 ;********** PULSO DE SINCRO V ******************************************************************* clrb rb.1 ; 1 cycle ; bajo el bit 6 ( comienza el pulso de sync ) mov counter,#174 ; 2 cycles :pupV1 nop nop ; 1 cycle nop ; 1 cycle decsz counter ; 1 cycle ; jmp @:pupV1 nop ; 1 cycle nop ; 1 cycle nop ; 1 cycle ;********** PULSO DE SINCRO H ******************************************************************* clrb rb.0 ; 1 cycle ; bajo el bit 6 ( comienza el pulso de sync ) mov counter,#38 ; 2 cycles :pupH2 decsz counter ; 1 cycle ; jmp @:pupH2 ; 4 cycles ; setb rb.0 ; 1 cycle ; subo el bit 6 ( termina el pulso de sync ) ;************************************************************************************************ mov counter,#175 ; 2 cycles :pupV2 nop nop ; 1 cycle nop ; 1 cycle decsz counter ; 1 cycle ; jmp @:pupV2 ; 4 cycles ;********** PULSO DE SINCRO H ******************************************************************* clrb rb.0 ; 1 cycle ; bajo el bit 6 ( comienza el pulso de sync ) mov counter,#38 ; 2 cycles :pupH3 decsz counter ; 1 cycle ; jmp @:pupH3 ; 4 cycles ; ;************************************************************************************************ mov rb,#%00000011 ; 2 cycles ;************************************************************************************************ ENDM ;******************************************************************************************************** ;******************************************************************************************************** Barras ; ****** ahora tengo que hacer portico delantero vertical ************************************** mov times,#2 jtama call @linea_vac2 decsz times ; cuando termino salgo perdiendo 5 cycles del decsz y del ret jmp @jtama ; *********************************************************************************************** ; ****** ahora tengo que hacer sincro vertical ************************************************ vsync ; *********************************************************************************************** ; ****** ahora tengo que hacer 33 lineas de portico superior y comienzo ************************* mov times,#19 jmp @jcc jcc nop nop jtama2 call @linea_vac decsz times ; cuando termino salgo perdiendo 5 cycles del decsz y del ret jmp @jtama2 ; *********************************************************************************************** ; ****** ahora tengo que hacer 240 lineas de video ********************************************* mov times,#254 nop jtama3 call @linea decsz times ; cuando termino salgo perdiendo 5 cycles del decsz y del ret jmp @jtama3 ; *********************************************************************************************** ; ****** ahora tengo que hacer 8 lineas de parte inferior de pantalla ************************** mov times,#8 nop jtama5 call @linea_vac decsz times ; cuando termino salgo perdiendo 5 cycles del decsz y del ret jmp @jtama5 ; *********************************************************************************************** sb $06.3 jmp @Barras ;******************************************************************************************************** ;******************************************************************************************************** Cross_hatch ; ****** ahora tengo que hacer portico delantero vertical ************************************** mov times,#2 otama call @linea_vac2 decsz times ; cuando termino salgo perdiendo 5 cycles del decsz y del ret jmp @otama ; *********************************************************************************************** ; ****** ahora tengo que hacer sincro vertical ************************************************ vsync ; *********************************************************************************************** ; ****** ahora tengo que hacer 19 lineas de portico uperior y comienzo ************************* mov times,#21 jmp @cc cc nop nop otama2 call @linea_vac decsz times ; cuando termino salgo perdiendo 5 cycles del decsz y del ret jmp @otama2 ; *********************************************************************************************** ; ****** ahora tengo que hacer 254 lineas de video ********************************************* mov times,#1 nop ftama20 call @crossv decsz times ; cuando termino salgo perdiendo 5 cycles del decsz y del ret jmp @ftama20 mov times,#30 nop ftama1 call @crossh decsz times ; cuando termino salgo perdiendo 5 cycles del decsz y del ret jmp @ftama1 mov times,#1 nop ftama2 call @crossv decsz times ; cuando termino salgo perdiendo 5 cycles del decsz y del ret jmp @ftama2 mov times,#30 nop ftama3 call @crossh decsz times ; cuando termino salgo perdiendo 5 cycles del decsz y del ret jmp @ftama3 mov times,#1 nop ftama4 call @crossv decsz times ; cuando termino salgo perdiendo 5 cycles del decsz y del ret jmp @ftama4 mov times,#30 nop ftama5 call @crossh decsz times ; cuando termino salgo perdiendo 5 cycles del decsz y del ret jmp @ftama5 mov times,#1 nop ftama6 call @crossv decsz times ; cuando termino salgo perdiendo 5 cycles del decsz y del ret jmp @ftama6 mov times,#30 nop ftama7 call @crossh decsz times ; cuando termino salgo perdiendo 5 cycles del decsz y del ret jmp @ftama7 mov times,#1 nop ftama8 call @crossv decsz times ; cuando termino salgo perdiendo 5 cycles del decsz y del ret jmp @ftama8 mov times,#30 nop ftama9 call @crossh decsz times ; cuando termino salgo perdiendo 5 cycles del decsz y del ret jmp @ftama9 mov times,#1 nop ftama10 call @crossv decsz times ; cuando termino salgo perdiendo 5 cycles del decsz y del ret jmp @ftama10 mov times,#30 nop ftama11 call @crossh decsz times ; cuando termino salgo perdiendo 5 cycles del decsz y del ret jmp @ftama11 mov times,#1 nop ftama12 call @crossv decsz times ; cuando termino salgo perdiendo 5 cycles del decsz y del ret jmp @ftama12 mov times,#30 nop ftama13 call @crossh decsz times ; cuando termino salgo perdiendo 5 cycles del decsz y del ret jmp @ftama13 mov times,#1 nop ftama14 call @crossv decsz times ; cuando termino salgo perdiendo 5 cycles del decsz y del ret jmp @ftama14 mov times,#30 nop ftama15 call @crossh decsz times ; cuando termino salgo perdiendo 5 cycles del decsz y del ret jmp @ftama15 mov times,#1 nop ftama16 call @crossv decsz times ; cuando termino salgo perdiendo 5 cycles del decsz y del ret jmp @ftama16 ; *********************************************************************************************** ; ****** ahora tengo que hacer 8 lineas de parte inferior de pantalla ************************** mov times,#11 nop otama5 call @linea_vac decsz times ; cuando termino salgo perdiendo 5 cycles del decsz y del ret jmp @otama5 ; *********************************************************************************************** snb $06.3 jmp @Cross_hatch jmp @Barras ; ; org 600 ;******************************************************************************************************** ;******************************************************************************************************** ;**** FUNCION CROSSH ************************************************************************************* ; 1400 cycles ;28 uSeg + 3.8 del sincro ; ; tambien lleva el sicro H esta. Y las barras de color ; 90 portico delantero ; 1284 de video ; 26 portico trasero ;************************************************************************************************ crossh mov counter,#15 ; 2 cycles ; delantero :clupit decsz counter ; 1 cycle ; jmp @:clupit ; 4 cycles ; jmp @:provi3 ;************************************************************************************************ ; Aca me quedan 1284 cycles para dibujar las barras 160 cycles cada una +2+2 ******************** :provi3 nop ; 1 cycle nop ; 1 cycle mov repeat,#9 :zir mov ra,#%11110111 ; 2 cycles jmp @:cirix :cirix mov ra,#%11110000 ; 2 cycles mov counter,#26 ; 2 cycles ; delantero :cir2 decsz counter ; 1 cycle ; jmp @:cir2 ; 4 cycles ; decsz repeat ; 1 cycle ; jmp @:zir ; 4 cycles ; nop ; 1 cycle nop ; 1 cycle nop ; ;************************************************************************************************ ;************************************************************************************************ mov counter,#5 ; 2 cycles ; delantero :clupi2 decsz counter ; 1 cycle ; jmp @:clupi2 ; 4 cycles ; nop ; 1 cycle nop ; 1 cycle ;************************************************************************************************ ;********** PULSO DE SINCRO H ******************************************************************* clrb rb.0 ; 1 cycle ; bajo el bit 6 ( comienza el pulso de sync ) mov counter,#38 ; 2 cycles :pupH1 decsz counter ; 1 cycle ; jmp @:pupH1 ; 4 cycles ; setb rb.0 ; 1 cycle ; subo el bit 6 ( termina el pulso de sync ) ;************************************************************************************************ ret ;******************************************************************************************************** ; ; ;******************************************************************************************************** ;**** FUNCION CROSSV ************************************************************************************* ; 1400 cycles ;28 uSeg + 3.8 del sincro ; ; tambien lleva el sicro H esta. Y las barras de color ; 90 portico delantero ; 1284 de video ; 26 portico trasero ;************************************************************************************************ crossv mov counter,#15 ; 2 cycles ; delantero :cvupit decsz counter ; 1 cycle ; jmp @:cvupit ; 4 cycles ; jmp @:provi :provi jmp @:provi2 ;************************************************************************************************ ; Aca me quedan 1284 cycles para dibujar las barras 160 cycles cada una +2+2 ******************** :provi2 mov ra,#%11110111 ; 2 cycles mov counter,#160 ; 2 cycles ; delantero :cxr2 nop nop nop decsz counter ; 1 cycle ; jmp @:cxr2 ; 4 cycles ; mov ra,#%11110000 ; 2 cycles nop ; 1 cycle nop ; ;************************************************************************************************ ;************************************************************************************************ mov counter,#5 ; 2 cycles ; delantero :cvupi2 decsz counter ; 1 cycle ; jmp @:cvupi2 ; 4 cycles ; nop ; 1 cycle nop ; 1 cycle ;************************************************************************************************ ;********** PULSO DE SINCRO H ******************************************************************* clrb rb.0 ; 1 cycle ; bajo el bit 6 ( comienza el pulso de sync ) mov counter,#38 ; 2 cycles :vupH1 decsz counter ; 1 cycle ; jmp @:vupH1 ; 4 cycles ; setb rb.0 ; 1 cycle ; subo el bit 6 ( termina el pulso de sync ) ;************************************************************************************************ ret ;******************************************************************************************************** ; ; org 700 ;******************************************************************************************************** ;******************************************************************************************************** ;**** FUNCION LINEA_VAC *************************************************************************************** ; 1400 cycles ;28 uSeg + 3.8 del sincro ; ; tambien lleva el sicro H esta. ;************************************************************************************************ linea_vac mov counter,#174 ; 2 cycles ; iba 173 pero con 174 anda mejor (revisar) :dlupL4 nop ; 1 cycle nop ; 1 cycle nop ; 1 cycle decsz counter ; 1 cycle ; jmp @:dlupL4 ; 4 cycles ; nop ; 1 cycle nop ; 1 cycle nop ; 1 cycle nop ; 1 cycle nop ; 1 cycle ; nop ; 1 cycle ;************************************************************************************************ ;********** PULSO DE SINCRO H ******************************************************************* clrb rb.0 ; 1 cycle ; bajo el bit 6 ( comienza el pulso de sync ) mov counter,#38 ; 2 cycles :pupH1 decsz counter ; 1 cycle ; jmp @:pupH1 ; 4 cycles ; setb rb.0 ; 1 cycle ; subo el bit 6 ( termina el pulso de sync ) ;************************************************************************************************ ret ;******************************************************************************************************** ; ; ;**** FUNCION LINEA_VAC2 *************************************************************************************** ; 1400 cycles ;28 uSeg + 3.8 del sincro ; ; volver de la ultima sub de linea_vac ( es decir esta se usa para hacer el jmp al main ) ; tambien lleva el sicro H esta. ;************************************************************************************************ linea_vac2 mov counter,#174 ; 2 cycles :dlupv4 nop ; 1 cycle nop ; 1 cycle nop ; 1 cycle decsz counter ; 1 cycle ; jmp @:dlupv4 ; 4 cycles ; nop ; 1 cycle ;************************************************************************************************ ;********** PULSO DE SINCRO H ******************************************************************* clrb rb.0 ; 1 cycle ; bajo el bit 6 ( comienza el pulso de sync ) mov counter,#38 ; 2 cycles :pupvH1 decsz counter ; 1 cycle ; jmp @:pupvH1 ; 4 cycles ; setb rb.0 ; 1 cycle ; subo el bit 6 ( termina el pulso de sync ) ;************************************************************************************************ ret ;******************************************************************************************************** ; ; ;**** FUNCION LINEA ************************************************************************************* ; 1400 cycles ;28 uSeg + 3.8 del sincro ; ; tambien lleva el sicro H esta. Y las barras de color ; 90 portico delantero ; 1284 de video ; 26 portico trasero ;************************************************************************************************ linea mov counter,#15 ; 2 cycles ; delantero :lupit decsz counter ; 1 cycle ; jmp @:lupit ; 4 cycles ; nop ; 1 cycle ; nop ; 1 cycle nop ; 1 cycle nop ; 1 cycle ;************************************************************************************************ ; Aca me quedan 1284 cycles para dibujar las barras 160 cycles cada una +2+2 ******************** nop ; 1 cycle nop ; 1 cycle ; ** BARRA ***************************************************************** mov ra,#%11110000 ; 2 cycles mov counter,#31 ; 2 cycles ; delantero jmp @:bar1 ; 4 cycles :bar1 decsz counter ; 1 cycle ; jmp @:bar1 ; 4 cycles ; ; ** BARRA ***************************************************************** mov ra,#%11110001 ; 2 cycles mov counter,#31 ; 2 cycles ; delantero jmp @:bar2 ; 4 cycles :bar2 decsz counter ; 1 cycle ; jmp @:bar2 ; 4 cycles ; ; ** BARRA ***************************************************************** mov ra,#%11110010 ; 2 cycles mov counter,#31 ; 2 cycles ; delantero jmp @:bar3 ; 4 cycles :bar3 decsz counter ; 1 cycle ; jmp @:bar3 ; 4 cycles ; ; ** BARRA ***************************************************************** mov ra,#%11110011 ; 2 cycles mov counter,#31 ; 2 cycles ; delantero jmp @:bar4 ; 4 cycles :bar4 decsz counter ; 1 cycle ; jmp @:bar4 ; 4 cycles ; ; ** BARRA ***************************************************************** mov ra,#%11110100 ; 2 cycles mov counter,#31 ; 2 cycles ; delantero jmp @:bar5 ; 4 cycles :bar5 decsz counter ; 1 cycle ; jmp @:bar5 ; 4 cycles ; ; ** BARRA ***************************************************************** mov ra,#%11110101 ; 2 cycles mov counter,#31 ; 2 cycles ; delantero jmp @:bar6 ; 4 cycles :bar6 decsz counter ; 1 cycle ; jmp @:bar6 ; 4 cycles ; ; ** BARRA ***************************************************************** mov ra,#%11110110 ; 2 cycles mov counter,#31 ; 2 cycles ; delantero jmp @:bar7 ; 4 cycles :bar7 decsz counter ; 1 cycle ; jmp @:bar7 ; 4 cycles ; ; ** BARRA ***************************************************************** mov ra,#%11110111 ; 2 cycles mov counter,#31 ; 2 cycles ; delantero jmp @:bar8 ; 4 cycles :bar8 decsz counter ; 1 cycle ; jmp @:bar8 ; 4 cycles ; mov ra,#%11110000 ; 2 cycles ;************************************************************************************************ ;************************************************************************************************ mov counter,#5 ; 2 cycles ; delantero :lupi2 decsz counter ; 1 cycle ; jmp @:lupi2 ; 4 cycles ; nop ; 1 cycle nop ; 1 cycle ;************************************************************************************************ ;********** PULSO DE SINCRO H ******************************************************************* clrb rb.0 ; 1 cycle ; bajo el bit 6 ( comienza el pulso de sync ) mov counter,#38 ; 2 cycles :pupH1 decsz counter ; 1 cycle ; jmp @:pupH1 ; 4 cycles ; setb rb.0 ; 1 cycle ; subo el bit 6 ( termina el pulso de sync ) ;************************************************************************************************ ret ;******************************************************************************************************** ;********************************************************************************************************
Questions: