;--------------------------------------------------------------------------- ; * Subject: [stella] Crackers' Easy Playfield Graphics Code ; * From: crackers@freenet.hamilton.on.ca ; * Date: Sat, 8 Mar 1997 15:33:43 -0500 (EST) ;--------------------------------------------------------------------------- processor 6502 VSYNC = $00 ;this tells assembler what VBLANK = $01 ;the locations of all those funky WSYNC = $02 ;2600 codes are COLUPF = $08 ; COLUBK = $09 ;you can see that this demo doesn't really do CTRLPF = $0A ;much. PF0 = $0D ; PF1 = $0E ;I had also made some stupid 5:00 in the morning PF2 = $0F ;errors here that wouldn't let my first attempt CXCLR = $2C ;compile. Make sure you are well rested before you INTIM = $284 ;attempt to programme the Atari 2600 or you risk TIM64T = $296 ;losing your sanity. org $F000 start SEI ;setting up the 6507 CLD LDX #$FF TXS LDA #$00 zero STA $00,X ;zeroing out all the locations DEX BNE zero main JSR vertb ;this is the main loop of the programme JSR scrnvar ;starts with vertical blank then loads the screen JSR draw ;variables then draws the screen, then does the JSR oscan ;overscan, then does it all over and over again JMP main ;until you terminate the programme. scrnvar LDA #$00 ;make the playfield graphics black STA COLUPF LDA #$4F ;make the background pink STA COLUBK LDA #$01 ;reflect the left half of the playfield on the STA CTRLPF ;right RTS vertb LDX #$00 ;thank you Nick Bensema for teaching us all LDA #$02 ;how to do a vertical blank. STA WSYNC ;who knows if I could have figured out this one STA WSYNC ;on my own. I want to have your baby! STA WSYNC STA VSYNC ;<- here was one of my 5:00 in the morning errors. STA WSYNC ;I had typed WSYNC instead of VSYNC. Bleary eyes STA WSYNC ;and programming make a deadly combination! LDA #$2C STA TIM64T ;much like cheese burgers an loneliness. LDA #$00 STA CXCLR ;<- don't know why I left this in... but what the STA WSYNC ;heck it looks cute. STA VSYNC ;**********CHANGED CODE FROM ORIGINAL************** RTS ;had made another stupid 5am error. (STA WSYNC) draw LDA INTIM ;getting ready to draw the screen BNE draw STA WSYNC STA VBLANK LDY #$08 ;how many scanlines is each block? LDX #$17 ;number of blocks of data. LDY * LDX = 192! load LDA playf0,X ;load in the data for playfield 1 STA PF0 LDA playf1,X ;load in the data for playfield 2 STA PF1 LDA playf2,X ;load in the data for playfield 3 STA PF2 grfx STA WSYNC ;draw the scanline DEY ;decrease the block number BEQ block ;if it's zero it's time for a new block JMP grfx ;if not then repeat the previous scanline block TXA ;another 5 A.M. error had "LDA X" what was I on? BEQ clear ;checks to see if you've reached the last block. DEX ;if not then got ot the next block number. LDY #$08 ;set up for a new block. JMP load ;go load your new block of data in. clear LDA #$02 ;all done the screen. Now let's clear everything STA WSYNC ;and get ready for the next exciting screen. STA VBLANK ;which in this case, just happens to be the same LDX PF0 ;as the first. LDX PF1 ;isn't this fun? LDX PF2 RTS oscan LDX #$1E ;now we're getting ready to do the 30 lines of ;overscan waste STA WSYNC ;and in this demo we're just going blow them all DEX ;off. But in a real game you wouldn't waste all BNE waste ;these valuable cycles. Not unles you want a RTS ;really dull game. org $FF00 playf0 .byte $00 ;and here are the graphics for each block. My programme .byte $00 ;draws 24 blocks each is 8 scan lines high. 24*8=192 .byte $00 ;so by changing the values for LDY and LDX up in the .byte $00 ;draw routine you can alter your vertical resolution for .byte $00 ;your playfield graphics. Just make sure that both values .byte $00 ;multiply together to make 192. This will let you draw .byte $00 ;1*192=192 .byte $00 ;2*96 =192 .byte $00 ;4*48 =192 .byte $00 ;6*32 =192 .byte $00 ;8*24 =192 (also makes nice square blocks!) .byte $20 ;16*12=192 .byte $20 ;32*6 =192 (okay, we're getting rediculous) .byte $70 ;64*3 =192 .byte $f0 ;96*2 =192 .byte $f0 ;192*1=192 .byte $f0 ; .byte $e0 ;Anyways... also note that the graphics data here .byte $e0 ;is stored upsidedown. Trust me, it's much easier .byte $c0 ;to load it this way. .byte $80 ; .byte $00 ;Using this kind of drawing routine would make it easy .byte $00 ;to create a playfield graphics editor that will auto .byte $00 ;generate the playfield data in a text file. Then you playf1 .byte $00 ;can just cut and paste the data into your source code. .byte $00 ;But I honestly don't know how well my playfield drawing .byte $00 ;routine can be adapted to work in a game. Maybe our .byte $00 ;resident "2600 Gods" Nick Bensema or Bob Colbert can .byte $00 ;offer some criticism. .byte $00 ; .byte $00 ;Well that's about all I've got to say on the subject. .byte $00 ;It was actually a lot of fun figuring this stuff out .byte $00 ;and now that I've actually written my own code to draw .byte $00 ;a screen, the 2600 is a lot less scary now. .byte $10 ;But don't expect a game from me anytime soon. What i've .byte $10 ;just done now is the equivalent of a .byte $11 ;10 PRINT "HELLO" .byte $3b ;20 GOTO 10 .byte $7b ;basic programme. It's simple and probably silly, and no .byte $ff ;doubt the real programmers will look at it and laugh at .byte $ff ;me and say something like. "Feh! I could have done that .byte $ff ;whole thing with three lines of code!" .byte $ff ;But hey, we've all got to start somewhere. .byte $ff ;Anyways, feel free to muck about with this and draw your .byte $ff ;own playfield pictures by editing the data. Maybe we .byte $ff ;could have an informal "2600 playfield graphics art .byte $7c ;contest." .byte $30 ; playf2 .byte $00 ;incidently... if you don't know what this is supposed .byte $00 ;to be a picture of, try singing "Nanana nanana Nanana .byte $80 ;nanana" over and over while looking at the picture. .byte $80 ; .byte $c0 ; .byte $c0 ; CRACKERS .byte $c0 ; (Baby's first code from hell!!!!!!) .byte $e2 ; .byte $e2 ; .byte $f2 ; .byte $fa ; .byte $ff ; .byte $1f ; .byte $5f ; .byte $5f ; .byte $9f ; .byte $df ; .byte $cf ; .byte $af ; .byte $93 ; .byte $71 ; .byte $38 ; .byte $0c ;This code is PUBLIC DOMAIN. .byte $04 ;By Chris "Crackers" Cracknell, March 8, 1997 org $FFFC .word start .word start