/* Atari VCS Color Bars Program */ #pragma origin $F800 //2k Cartridge #include //TIA and RIOT Registers #include //Initialize VCS zeropage char clrbkg; //Color Background zeropage char clrofs; //Color Offset zeropage char clrmsk; //Color/B&W Mask /* Generate Vertical Sync Signal */ void vtsync() { X=49; //49*64 Cycles (37 Scanlines) A=2; //Set Bit 2 (D1) WSYNC=A; //Wait for end of Scanline VSYNC=A; //Turn On Vertical Sync TIM64T=X; //Set Timer WSYNC=A; //Wait 2 More Scanlines WSYNC=A; A=0; //Clear Bit 2 (D1) WSYNC=A; //Wait for End of 3rd Scanline VSYNC=A; //Turn Off Vertical Sync return; } /* Execute Vertical Blank Code */ void vtblnk() { clrmsk = (SWCHB & 8) ? $FF : $0F; if (SWCHB & 64) clrofs--; else clrofs++; A=0; //Clear All Bits return; } /* Execute Kernel Code */ void kernel() { do WSYNC=A; while(INTIM); VBLANK=0; //Turn Off Vertical Blank X=192; //Draw 192 Scanlines do { clrbkg = X; if (!SWCHB & 128) clrbkg<<; A = clrbkg + clrofs & clrmsk; //Set Background Color WSYNC = A; //Wait for end of Scanline COLUBK = A; //Set Background Color X--; } while (X); return; } /* Execute Overscan Code */ void ovrscn() { WSYNC=A; //Wait for end of Scanline A=2; //Set Bit 2 (D1) VBLANK=A; //Turn On Vertical Blank TIM64T = 32; //Delay 32*64 Cycles (27 Scanlines) do { WSYNC=A; //Wait for end of Scanline } while(INTIM); return; } irqbrk: //Code to Execute when BRK Instruction is Encountered main: //Start of Program Code vtsync(); //Generate Vertical Sync Signal vtblnk(); //Generate Vertical Blank Signal kernel(); //Execute Kernal Code ovrscn(); //Execute Overscan Code goto main; #include //Finalization Code