Subject: [stella] Etch-a-sketch source code From: Robert "A." Colbert <colbertb@xxxxxxxxxxxx> Date: Tue, 11 Mar 1997 10:37:47 -0600 |
Hi, I promised you this a while back! This is my Etch-a-sketch emulator for the 2600! Please feel free to comment on it. It only works on PC Atari 1.4 and above or a real Supercharger since it uses supercharger RAM. Compiling this code creates an 8448 byte .bin. If you want to try this on a regular 2600, try removing all of the lines from "org $e800" on (near the end) and the "org $c800 / .byte $00" lines (at the beginning), these were included to make an acceptable .bin for the emulator, but I'm not sure if the checksums are o.k. for a real SC. At any rate, removing those lines will give you a 4096 byte file that you can then use with makewav to create a good .wav. Bob Colbert ---- Begin of code -- ; Here is my Etch-a-sketch emulator ; Please do not distribute this code ; As I plan on finishing it up sometime soon! ; The joysticks are used right for various reasons ; Sometime I would like to use the Paddles, but that ; would take some serious coding. ; the reset button clears the screen, and the select button ; changes the drawing mode. ; ; This only works on a real SC and PC Atari Emulator right now!!! ; ; HAVE FUN!!! ; ; Code Copyright 1997 by Bob Colbert! (It will be freeware when I'm done!) ; ; Compile using DASM etch.s -f3 -oetch.bin ; processor 6502 VSYNC = $00; VBLANK = $01; WSYNC = $02; RSYNC = $03; NUSIZ0 = $04; NUSIZ1 = $05; COLUP0 = $06; COLUP1 = $07; COLUPF = $08; COLUBK = $09; CTRLPF = $0A; REFP0 = $0B; REFP1 = $0C; PF0 = $0D; PF1 = $0E; PF2 = $0F; RESP0 = $10; POSH2 = $11; RESP1 = $11; RESM0 = $12; RESM1 = $13; RESBL = $14; AUDC0 = $15; AUDC1 = $16; AUDF0 = $17; AUDF1 = $18; AUDV0 = $19; AUDV1 = $1A; GRP0 = $1B; GRP1 = $1C; ENAM0 = $1D; ENAM1 = $1E; ENABL = $1F; HMP0 = $20; HMP1 = $21; HMM0 = $22; HMM1 = $23; HMBL = $24; VDELP0 = $25; VDEL01 = $26; VDELBL = $27; RESMP0 = $28; RESMP1 = $29; HMOVE = $2A; HMCLR = $2B; CXCLR = $2C; CXM0P = $30; CXM1P = $31; CXP0FB = $32; CXP1FB = $33; CXM0FB = $34; CXM1FB = $35; CXBLPF = $36; CXPPMM = $37; INPT0 = $38; INPT1 = $39; INPT2 = $3A; INPT3 = $3B; INPT4 = $3C; INPT5 = $3D; SWCHA = $280; SWACNT = $281; SWCHB = $282; SWBCNT = $283; INTIM = $284; TIM1T = $294; TIM8T = $295; TIM64T = $296; T1024T = $297; page equ $81 tempvar equ $82 char1 equ $84 char2 equ $86 char3 equ $88 char4 equ $8a char5 equ $8c char6 equ $8e char7 equ $90 char8 equ $92 char9 equ $94 char10 equ $96 char11 equ $98 char12 equ $9a charx equ $9c tmpadrlo equ $9e tmpadrhi equ $9f enable equ $a0 xpos equ $a1 ypos equ $a2 sclin equ $a3 temp2 equ $a4 mode equ $a5 lastmode equ $a6 pgcount equ $a7 temp equ $a8 hknob equ $a9 vknob equ $aa hkdata equ $ab vkdata equ $ac org $c800 .byte $0 org $d000 cld clc lda $80 ora #$02 sta enable ldx #$17 loop5 lda table1,x sta char1,x dex bpl loop5 restart lda #$0 sta page sta pgcount sta xpos sta ypos sta hknob sta vknob sta mode Start ldy #$10 jsr junk Start1 inc page inc pgcount lda #$00 ;get contents of memory sta PF0 sta PF1 sta PF2 ;save into a pattern control register sta COLUBK lda #$01 sta CTRLPF ;set background control register lda #$42 sta COLUPF lda #$04 sta COLUP1 ;set right side color sta COLUP0 ldy #$57 sty WSYNC ;wait for horizontal sync lda #$02 ora INPT0 sta VBLANK ;start vertical blanking sty VSYNC ;start vertical retrace lda #$2A sta TIM8T ;set timer for appropriate length Loop4 ldy INTIM bne Loop4 ;waste time sty WSYNC ;wait for horizontal sync sty VSYNC ;end vertical retrace period lda #$24 sta TIM64T ;set timer for next wait Loop3 ldy INTIM bne Loop3 ;waste time sty WSYNC ;wait for horizontal sync lda #$00 sta VBLANK ;end vertical blanking sty WSYNC sty WSYNC lda #$e4 sta sclin sta WSYNC lda #$00 sta PF0 sta PF2 sta REFP0 sta HMP1 lda #$03 sta NUSIZ0 sta NUSIZ1 loop6 stx WSYNC ldx sclin cpx #$e4 bne bb1 lda #$7f sta PF1 lda #$ff sta PF2 bb1 cpx #$D0 beq b2 dec sclin bne loop6 b2 lda page and #$01 tax jsr drawit lda #$7f sta PF1 lda #$ff sta PF2 lda #$0 ldy #$5 jsr junk sta NUSIZ0 sta NUSIZ1 lda #$7 sta COLUP0 sta COLUP1 sta WSYNC ldy #$2 jsr delay sta RESP0 ldy #$2 jsr delay sta RESP1 sta WSYNC ldy #$6 jsr drawknobs ldy #$8 jsr junk lda #$0 sta PF1 sta PF2 ldy #$1 jsr junk lda mode sta PF1 ldy #$08 jsr junk lda #$0 sta PF1 lda INPT4 and #$80 beq ckjoystk ldy mode nojoy lda pgcount cmp modespeed,y beq ckjoystk lda modewait,y tay jsr junk jmp z1 ckjoystk lda #$0 sta pgcount sta temp lda SWCHA and #$f0 eor #$f0 bne joymovd ldy #$4 jsr junk jmp z3 joymovd eor #$f0 ldy mode cpy #$1 bne mode2 pha jsr plot pla mode2 ldy #$2 jsr junk rol bcs joy1 ldy xpos cpy #$5f beq joy1 inc xpos dec hknob joy1 rol bcs joy2 ldy xpos cpy #$0 beq joy2 dec xpos inc hknob joy2 ; sta WSYNC rol bcs joy3 ldy ypos cpy #$0 beq z1 dec ypos inc vknob joy3 rol bcs z1 ldy ypos cpy #$77 beq z1 inc ypos dec vknob z1 jsr plot z3 ldy #$0 lda SWCHB ror bcc reset ror bcc select lda mode cmp #$5 beq reset sty lastmode jmp Start reset lda mode cmp #$5 beq reset0 lda #$5 sta mode lda #$77 sta ypos reset0 lda #$5f sta xpos reset1 jsr plot lda xpos clc sbc #$7 sta xpos bpl reset1 dec ypos bmi reset2 jmp Start1 reset2 jmp restart select iny cpy lastmode beq oldsel sty lastmode dey sty pgcount inc mode lda mode cmp #$4 bmi oldsel sty mode oldsel jmp Start junk sta WSYNC dey bpl junk rts drawknobs lda #$1 sta temp dk ldy temp lda hknob,y cmp #$14 bne dk0 lda #$0 sta hknob,y dk0 cmp #$ff bne dk1 lda #$13 sta hknob,y dk1 tay ldx #$8 lda knoblist,y bmi dk1a ldx #$0 dk1a ldy temp stx REFP0,y stx temp2 and #$ff clc adc #$0 sta hkdata,y dec temp bpl dk sta WSYNC dk1b lda #$6 sta temp dk2 ldx #$1 dk2a lda hkdata,x sta temp2 and #$7f clc adc temp tay lda knobs,y ldy temp2 bpl dk2b clc ror dk2b sta GRP0,x dex bpl dk2a sta WSYNC dec temp bpl dk2 lda #$0 sta GRP0 sta GRP1 sta REFP0 sta REFP1 sta WSYNC rts subtim sty temp lda sclin clc sbc temp rts delay dey bpl delay rts drawit lda #$01 ldy #$05 sta WSYNC loop1 dey bpl loop1 txa sta RESP0 clc ror ror tax nop nop sta RESP1 adc #$70 sta HMP0 txa clc adc #$40 sta HMP1 sta WSYNC sta HMOVE lda #$77 sta tempvar tay lda #$70 sta PF1 lda #$00 sta PF2 lda #$04 cpx #$0 bne loop2b loop2 lda (char11),y sta charx sta WSYNC lda (char5),y tax lda (char1),Y sta GRP0 lda (char7),y sta GRP1 nop cmp tempvar lda (char3),y sta GRP0 nop stx GRP0 nop nop lda (char9),y sta GRP1 lda charx sta GRP1 dey bpl loop2 sty tempvar lda #$00 sta GRP1 sta GRP0 rts loop2b lda (char12),y sta WSYNC sta charx lda (char6),y tax lda (char2),Y sta GRP0 lda (char8),y sta GRP1 nop cmp tempvar lda (char4),y sta GRP0 NOP stx GRP0 nop nop lda (char10),y sta GRP1 lda charx sta GRP1 dey bpl loop2b sty tempvar lda #$00 sta GRP1 sta GRP0 rts table1 .byte <d0 .byte >d0 .byte <d1 .byte >d1 .byte <d2 .byte >d2 .byte <d3 .byte >d3 .byte <d4 .byte >d4 .byte <d5 .byte >d5 .byte <d6 .byte >d6 .byte <d7 .byte >d7 .byte <d8 .byte >d8 .byte <d9 .byte >d9 .byte <da .byte >da .byte <db .byte >db org $d900 plot lda xpos tay plot1 ror ror ror ror and #$f clc adc #$fa sta tmpadrhi tya and #$0f tax and #$08 beq plot2 lda #$80 plot2 sta tmpadrlo lda pixel,x ldy ypos ldx mode cpx #$1 beq plot2a cpx #$5 beq clear ora (tmpadrlo),y jmp plot2b clear lda #$0 beq plot2b plot2a eor (tmpadrlo),y plot2b tax ldy enable lda $f000,y sta $fff8 ldy ypos lda $f000,x lda (tmpadrlo),y ldy $80 lda $f000,y sta $fff8 plot3 rts pixel .byte $80,$40,$20,$10,$08,$04,$02,$01,$80,$40,$20,$10,$08,$04,$02,$01 modespeed .byte $01,$03,$05,$f modewait .byte $02,$04,$02,$02,$08 knoblist .byte $00,$bc,$b6,$b0,$aa,$a4,$9e,$98,$92,$8c .byte $06,$0c,$12,$18,$1e,$24,$2a,$30,$36,$3c knobs .byte $38 ; | XXX | .byte $7C ; | XXXXX | .byte $FE ; |XXXXXXX | .byte $EE ; |XXX XXX | .byte $EE ; |XXX XXX | .byte $6C ; | XX XX | .byte $28 ; | X X | .byte $6C ; | XX XX | .byte $EE ; |XXX XXX | .byte $EE ; |XXX XXX | .byte $FE ; |XXXXXXX | .byte $7C ; | XXXXX | .byte $38 ; | XXX | .byte $74 ; | XXX X | .byte $EE ; |XXX XXX | .byte $EE ; |XXX XXX | .byte $FE ; |XXXXXXX | .byte $7C ; | XXXXX | .byte $38 ; | XXX | .byte $78 ; | XXXX | .byte $F6 ; |XXXX XX | .byte $EE ; |XXX XXX | .byte $FE ; |XXXXXXX | .byte $7C ; | XXXXX | .byte $38 ; | XXX | .byte $7C ; | XXXXX | .byte $F0 ; |XXXX | .byte $EE ; |XXX XXX | .byte $FE ; |XXXXXXX | .byte $7C ; | XXXXX | .byte $38 ; | XXX | .byte $7C ; | XXXXX | .byte $F8 ; |XXXXX | .byte $E6 ; |XXX XX | .byte $FE ; |XXXXXXX | .byte $7C ; | XXXXX | .byte $38 ; | XXX | .byte $7C ; | XXXXX | .byte $FE ; |XXXXXXX | .byte $E0 ; |XXX | .byte $FE ; |XXXXXXX | .byte $7C ; | XXXXX | .byte $38 ; | XXX | .byte $7C ; | XXXXX | .byte $FE ; |XXXXXXX | .byte $E6 ; |XXX XX | .byte $FA ; |XXXXX X | .byte $7C ; | XXXXX | .byte $38 ; | XXX | .byte $7C ; | XXXXX | .byte $FE ; |XXXXXXX | .byte $EE ; |XXX XXX | .byte $F6 ; |XXXX XX | .byte $78 ; | XXXX | .byte $38 ; | XXX | .byte $7C ; | XXXXX | .byte $FE ; |XXXXXXX | .byte $EE ; |XXX XXX | .byte $F6 ; |XXXX XX | .byte $74 ; | XXX X | .byte $38 ; | XXX | .byte $7C ; | XXXXX | .byte $FE ; |XXXXXXX | .byte $EE ; |XXX XXX | .byte $EE ; |XXX XXX | .byte $74 ; | XXX X | .byte $38 ; | XXX | org $da00 d0 ds 128 d1 ds 128 d2 ds 128 d3 ds 128 d4 ds 128 d5 ds 128 d6 ds 128 d7 ds 128 d8 ds 128 d9 ds 128 da ds 128 db ds 120 org $dffc .byte $00,$F0,$00,$F0 org $e800 .byte $00,$f0 .byte $1c .byte $18 .byte $0b .byte $00 .byte $24 .byte $02 org $e810 .byte $00,$04,$08,$0c,$10,$14,$18,$1c,$01,$05,$09,$0d .byte $11,$15,$19,$1d,$02,$06,$0a,$0e,$12,$16,$1a,$1e org $e840 .byte $00,$00,$00,$00,$00,$00,$00,$00,$db,$61,$6a,$48 .byte $44,$40,$3c,$38,$53,$c2,$4b,$47,$43,$3f,$3b,$5b org $e8ff .byte $00 ----End of Code---- Wanna write a game for the Atari 2600? Check out http://www.novia.net/~rcolbert -- Archives available at http://www.biglist.com/lists/stella/archives/ E-mail UNSUBSCRIBE in the body to stella-request@xxxxxxxxxxx to be removed.
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[stella] Having Carts Made (fwd), crackers | Thread | [stella] Supercharger, Dan Boris |
Re: [stella] Displaying scores - ho, Greg Troutman | Date | [stella] Supercharger, Dan Boris |
Month |