;----------------------------------------------------------------------------------------------------------------------------------- ;----------- QUARK10 COLOR VGA ENGINE FOR PIC10F322 / CODING BY RADICAL BRAD / VERSION FEB 28 2016 ;----------- PORT USAGE : A0=SYNC / A1=COLOR1 / A2=COLOR2 / A3=JOYSTICK ;----------------------------------------------------------------------------------------------------------------------------------- ;----------------------------------------------------------------------------------------------------------------------------------- ;----------- PIC10F322 CONFIGURATION : INTERNAL CLOCK / MASTER CLEAR DISABLED / NO WATCHDOG ;----------------------------------------------------------------------------------------------------------------------------------- RADIX DEC INCLUDE "P10F322.inc" __CONFIG _FOSC_INTOSC & _BOREN_OFF & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _LVP_OFF & _LPBOR_OFF & _BORV_LO & _WRT_OFF ;----------------------------------------------------------------------------------------------------------------------------------- ;----------- VIDEO ENGINE REGISTERS : 064-091 (28 BYTES) ;----------------------------------------------------------------------------------------------------------------------------------- BLACK EQU 001 WHITE EQU 007 BLUE EQU 003 YELLOW EQU 005 VCTR EQU 064 VDIV EQU 065 SYNC EQU 066 BUTS EQU 067 VMEM EQU 068 ;----------------------------------------------------------------------------------------------------------------------------------- ;----------- GAME CODE REGISTERS : 092-127 (36 BYTES) ;----------------------------------------------------------------------------------------------------------------------------------- temp equ 092 SX equ 093 SY equ 094 SD equ 095 SX2 equ 096 SY2 equ 097 SX3 equ 098 SY3 equ 099 SX4 equ 100 SY4 equ 101 SPD equ 102 BCLR equ 103 ;----------------------------------------------------------------------------------------------------------------------------------- ;----------- RESET VECTOR : ADDRESS 000 (2) ;----------------------------------------------------------------------------------------------------------------------------------- ORG 000 goto @RESET ;2 ;----------------------------------------------------------------------------------------------------------------------------------- ;----------- VIDEO DRIVER INTERRUPT : 640/4 X 480/8 VGA STANDARD @ 4 MHZ = 16 MHZ CLOCK ;----------------------------------------------------------------------------------------------------------------------------------- ;-- HSP : 064/4 = 016 FROM 000 TO 015 ;-- HBP : 032/4 = 008 FROM 016 TO 024 ;-- HPX : 400/4 = 100 FROM 024 TO 123 ;-- HFP : 016/4 = 004 FROM 124 TO 127 ;-- HCT : 512/4 = 128 ;-- VLN : 480/8 = 060 FROM 000 TO 059 ;-- VFP : 011/8 = 001 FROM 060 TO 060 ;-- VSP : 002/8 = 001 FROM 061 TO 061 ;-- VBP : 032/8 = 003 FROM 062 TO 064 ;-- VCT : 525/8 = 065 ;----------------------------------------------------------------------------------------------------------------------------------- ;----------- COMPOSITE SYNC + BACK PORCH : 24 CLK (+9) ;----------------------------------------------------------------------------------------------------------------------------------- ORG 004 ;3 ;-- COMPOSITE SYNC PULSE ON (3) bcf PORTA,0 ;1 btfsc SYNC,0 ;1/2 bsf PORTA,0 ;1 ;-- VERTICAL COUNTER DIVIDER BY EIGHT (5) incf VDIV ;1 btfsc VDIV,3 ;1/2 incf VCTR ;1 btfsc VDIV,3 ;1/2 clrf VDIV ;1 ;-- VERTICAL SYNC PULSE ON AT LINE 61 (5) bcf SYNC,0 ;1 movlw 061 ;1 subwf VCTR,0 ;1 btfsc STATUS,Z ;1/2 bsf SYNC,0 ;1 ;-- VERTICAL COUNTER WRAP AT LINE 65 (4) movlw 066 ;1 subwf VCTR,0 ;1 btfsc STATUS,Z ;1/2 clrf VCTR ;1 ;-- COMPOSITE SYNC PULSE OFF (2) movlw 001 ;1 xorwf PORTA,1 ;1 ;-- LINE GRAPHICS MEMORY ARBITER (3) movf VDIV,0 ;1 btfsc STATUS,Z ;1/2 goto @ARBITER ;2 ;-- HORIZONTAL PIXELS OFF AT LINE 60 (4) movlw 060 ;1 subwf VCTR,0 ;1 btfsc STATUS,C ;1/2 goto @VEXIT ;2 ;-- AUTO MEMORY CLEAR CONTROL (5) movlw 007 ;1 subwf VDIV,0 ;1 btfsc STATUS,C ;1/2 goto @HLINE1 ;2 nop ;1 ;----------------------------------------------------------------------------------------------------------------------------------- ;----------- HORIZONTAL PIXEL LINE : (100-4) / 4 = 24 PIXELS ;----------------------------------------------------------------------------------------------------------------------------------- movf VMEM+000,W ;1 movwf PORTA ;1 goto $+1 movf VMEM+001,W ;1 movwf PORTA ;1 goto $+1 movf VMEM+002,W ;1 movwf PORTA ;1 goto $+1 movf VMEM+003,W ;1 movwf PORTA ;1 goto $+1 movf VMEM+004,W ;1 movwf PORTA ;1 goto $+1 movf VMEM+005,W ;1 movwf PORTA ;1 goto $+1 movf VMEM+006,W ;1 movwf PORTA ;1 goto $+1 movf VMEM+007,W ;1 movwf PORTA ;1 goto $+1 movf VMEM+008,W ;1 movwf PORTA ;1 goto $+1 movf VMEM+009,W ;1 movwf PORTA ;1 goto $+1 movf VMEM+010,W ;1 movwf PORTA ;1 goto $+1 movf VMEM+011,W ;1 movwf PORTA ;1 goto $+1 movf VMEM+012,W ;1 movwf PORTA ;1 goto $+1 movf VMEM+013,W ;1 movwf PORTA ;1 goto $+1 movf VMEM+014,W ;1 movwf PORTA ;1 goto $+1 movf VMEM+015,W ;1 movwf PORTA ;1 goto $+1 movf VMEM+016,W ;1 movwf PORTA ;1 goto $+1 movf VMEM+017,W ;1 movwf PORTA ;1 goto $+1 movf VMEM+018,W ;1 movwf PORTA ;1 goto $+1 movf VMEM+019,W ;1 movwf PORTA ;1 goto $+1 movf VMEM+020,W ;1 movwf PORTA ;1 goto $+1 movf VMEM+021,W ;1 movwf PORTA ;1 goto $+1 movf VMEM+022,W ;1 movwf PORTA ;1 goto $+1 movf VMEM+023,W ;1 movwf PORTA ;1 goto $+1 goto @HLINE2 @HLINE1 movf VMEM+000,W ;1 movwf PORTA ;1 movf BCLR,W ;1 movwf VMEM+000 ;1 movf VMEM+001,W ;1 movwf PORTA ;1 movf BCLR,W ;1 movwf VMEM+001 ;1 movf VMEM+002,W ;1 movwf PORTA ;1 movf BCLR,W ;1 movwf VMEM+002 ;1 movf VMEM+003,W ;1 movwf PORTA ;1 movf BCLR,W ;1 movwf VMEM+003 ;1 movf VMEM+004,W ;1 movwf PORTA ;1 movf BCLR,W ;1 movwf VMEM+004 ;1 movf VMEM+005,W ;1 movwf PORTA ;1 movf BCLR,W ;1 movwf VMEM+005 ;1 movf VMEM+006,W ;1 movwf PORTA ;1 movf BCLR,W ;1 movwf VMEM+006 ;1 movf VMEM+007,W ;1 movwf PORTA ;1 movf BCLR,W ;1 movwf VMEM+007 ;1 movf VMEM+008,W ;1 movwf PORTA ;1 movf BCLR,W ;1 movwf VMEM+008 ;1 movf VMEM+009,W ;1 movwf PORTA ;1 movf BCLR,W ;1 movwf VMEM+009 ;1 movf VMEM+010,W ;1 movwf PORTA ;1 movf BCLR,W ;1 movwf VMEM+010 ;1 movf VMEM+011,W ;1 movwf PORTA ;1 movf BCLR,W ;1 movwf VMEM+011 ;1 movf VMEM+012,W ;1 movwf PORTA ;1 movf BCLR,W ;1 movwf VMEM+012 ;1 movf VMEM+013,W ;1 movwf PORTA ;1 movf BCLR,W ;1 movwf VMEM+013 ;1 movf VMEM+014,W ;1 movwf PORTA ;1 movf BCLR,W ;1 movwf VMEM+014 ;1 movf VMEM+015,W ;1 movwf PORTA ;1 movf BCLR,W ;1 movwf VMEM+015 ;1 movf VMEM+016,W ;1 movwf PORTA ;1 movf BCLR,W ;1 movwf VMEM+016 ;1 movf VMEM+017,W ;1 movwf PORTA ;1 movf BCLR,W ;1 movwf VMEM+017 ;1 movf VMEM+018,W ;1 movwf PORTA ;1 movf BCLR,W ;1 movwf VMEM+018 ;1 movf VMEM+019,W ;1 movwf PORTA ;1 movf BCLR,W ;1 movwf VMEM+019 ;1 movf VMEM+020,W ;1 movwf PORTA ;1 movf BCLR,W ;1 movwf VMEM+020 ;1 movf VMEM+021,W ;1 movwf PORTA ;1 movf BCLR,W ;1 movwf VMEM+021 ;1 movf VMEM+022,W ;1 movwf PORTA ;1 movf BCLR,W ;1 movwf VMEM+022 ;1 movf VMEM+023,W ;1 movwf PORTA ;1 movf BCLR,W ;1 movwf VMEM+023 ;1 goto @HLINE2 @HLINE2 ;----------------------------------------------------------------------------------------------------------------------------------- ;----------- HORIZONTAL FRONT PORCH : 4 CLK (+1) ;----------------------------------------------------------------------------------------------------------------------------------- ;-- HORIZONTAL BLANKING (2) movlw 001 ;1 movwf PORTA ;1 ;-- CLEAR INTERRUPT & RETURN TO MAIN (3) @VEXIT bcf PIR1,TMR2IF ;1 retfie ;2 ;----------------------------------------------------------------------------------------------------------------------------------- ;----------- STARTUP RESET SEQUENCE ;----------------------------------------------------------------------------------------------------------------------------------- @RESET ;-- SET INTERNAL CLOCK TO 16 MHZ movlw b'01110000' movwf OSCCON ;-- SETUP IO : A0=SYNC / A1=COLOR1 / A2=COLOR2 / A3=AUDIO movlw b'00001000' movwf TRISA movwf ANSELA bcf OPTION_REG,7 ;-- TIMER2 SETUP : INTERRUPT AT 55 HZ REFRESH movlw b'00000100' movwf T2CON movlw 136 movwf PR2 ;-- CLEAR VIDEO MEMORY ; movlw 048 ; movwf VDIV ; movlw VMEM ; movwf FSR ; movlw 003 ;@CMEM ; movwf INDF ; incf FSR ; decfsz VDIV ; goto @CMEM ;-- STARTUP VALUES movlw 10 movwf SX movwf SY movlw 14 movwf SX2 movwf SY2 movlw 18 movwf SX3 movwf SY3 movlw 20 movwf SX4 movwf SY4 movlw 12 movwf SD movlw 003 movwf BCLR ;-- ENABLE VIDEO DRIVER INTERRUPT movlw b'00000010' movwf PIE1 movlw b'11000000' movwf INTCON goto $-0 ;-- GRAPHIC MEMORY ARBITER @ARBITER movlw 060 subwf VCTR,0 btfsc STATUS,C goto @LOGIC ;----------------------------------------------------------------------------------------------------------------------------------- ;----------- LINE RENDERING ROUTINE ;----------------------------------------------------------------------------------------------------------------------------------- ;-- RESET VIDMEM POINTER movlw VMEM movwf FSR ;-- CALCULATE SPRITE Y LOCATION movfw SY subwf VCTR,0 btfss STATUS,Z goto @SPRT1 ;-- CALCULATE SPRITE X LOCATION movf SX,0 addwf FSR,1 movlw YELLOW movwf INDF @SPRT1 ;-- CALCULATE SPRITE Y LOCATION2 movlw VMEM movwf FSR movfw SY2 subwf VCTR,0 btfss STATUS,Z goto @SPRT2 ;-- CALCULATE SPRITE X LOCATION2 movf SX2,0 addwf FSR,1 movlw WHITE movwf INDF @SPRT2 ;-- CALCULATE SPRITE Y LOCATION3 movlw VMEM movwf FSR movfw SY3 subwf VCTR,W btfss STATUS,Z goto @SPRT3 ;-- CALCULATE SPRITE X LOCATION3 movf SX3,0 addwf FSR,1 movlw BLACK movwf INDF @SPRT3 ;-- CALCULATE SPRITE Y LOCATION4 movlw VMEM movwf FSR movfw SY4 subwf VCTR,0 btfss STATUS,Z goto @SPRT4 ;-- CALCULATE SPRITE X LOCATION4 movf SX4,0 addwf FSR,1 movlw YELLOW movwf INDF @SPRT4 ;-- END OF LINE RENDERING ROUTINE goto @VEXIT ;----------------------------------------------------------------------------------------------------------------------------------- ;----------- GAME LOGIC ROUTINE ;----------------------------------------------------------------------------------------------------------------------------------- @LOGIC ;--- SPRITES SPEED incf SPD movlw 012 subwf SPD,W btfss STATUS,Z goto @NOMOVE clrf SPD ;-- MOVE SPRITE LEFT btfsc SD,0 decf SX movlw 000 subwf SX,W btfsc STATUS,Z bcf SD,0 ;-- MOVE SPRITE RIGHT btfss SD,0 incf SX movlw 024 subwf SX,W btfsc STATUS,Z bsf SD,0 ;-- MOVE SPRITE UP btfsc SD,1 decf SY movlw 000 subwf SY,W btfsc STATUS,Z bcf SD,1 ;-- MOVE SPRITE DOWN btfss SD,1 incf SY movlw 060 subwf SY,W btfsc STATUS,Z bsf SD,1 ;-- MOVE SPRITE LEFT2 btfsc SD,2 decf SX2 movlw 000 subwf SX2,W btfsc STATUS,Z bcf SD,2 ;-- MOVE SPRITE RIGHT2 btfss SD,2 incf SX2 movlw 024 subwf SX2,W btfsc STATUS,Z bsf SD,2 ;-- MOVE SPRITE UP 2 btfsc SD,3 decf SY2 movlw 000 subwf SY2,W btfsc STATUS,Z bcf SD,3 ;-- MOVE SPRITE DOWN2 btfss SD,3 incf SY2 movlw 060 subwf SY2,W btfsc STATUS,Z bsf SD,3 @SPD2 ;-- MOVE SPRITE LEFT3 btfsc SD,4 decf SX3 movlw 000 subwf SX3,W btfsc STATUS,Z bcf SD,4 ;-- MOVE SPRITE RIGHT3 btfss SD,4 incf SX3 movlw 024 subwf SX3,W btfsc STATUS,Z bsf SD,4 ;-- MOVE SPRITE UP3 btfsc SD,5 decf SY3 movlw 000 subwf SY3,W btfsc STATUS,Z bcf SD,5 ;-- MOVE SPRITE DOWN3 btfss SD,5 incf SY3 movlw 060 subwf SY3,W btfsc STATUS,Z bsf SD,5 ;-- MOVE SPRITE LEFT4 btfsc SD,6 decf SX4 movlw 000 subwf SX4,W btfsc STATUS,Z bcf SD,6 ;-- MOVE SPRITE RIGHT4 btfss SD,6 incf SX4 movlw 024 subwf SX4,W btfsc STATUS,Z bsf SD,6 ;-- MOVE SPRITE UP4 btfsc SD,7 decf SY4 movlw 000 subwf SY4,W btfsc STATUS,Z bcf SD,7 ;-- MOVE SPRITE DOWN4 btfss SD,7 incf SY4 movlw 060 subwf SY4,W btfsc STATUS,Z bsf SD,7 @NOMOVE ;-- END OF GAME LOGIC ROUTINE goto @VEXIT END