;*****************************************************************************************
; 
; 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
;********************************************************************************************************
;********************************************************************************************************
