diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c733c4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ + +*.bak +*.lab +*.lst diff --git a/AB_BEWE.ATR b/AB_BEWE.ATR new file mode 100644 index 0000000..43acd9c Binary files /dev/null and b/AB_BEWE.ATR differ diff --git a/README.md b/README.md index f667a0b..92cee2d 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,146 @@ # Avery Breakout - A very break out game proto +A very break out game. Name is a homage to Mr. Avery Lee, also known as [phaeron](https://forums.atariage.com/profile/16457-phaeron/) + +Thank you Avery for everything you are doing for this small community. + +I have shown engine protos before, but it was not a real game, just a few bouncing balls. + +[Pecus](https://github.com/Pecusx) for the rescue! In a couple of evenings we were able to transform it into a (hopefully) playable game. + +Music and SFX by Alex, his first RMT attempt :) + +Font by [DamienG](https://damieng.com/typography/zx-origins/mild-west/) -Second place in the game compo in PSA 2020 virtual SARS-2 demo party. The `backup` folder contains easier to play hi-res, b-w version. -Looking for art input to transform it to a full smallish silly game. + +## 2024-12-07 +We teamed with Pecus and Alex and made a game out of the "tech demo". There are points, game over screen and possibility to add your own levels. + +If there is no DOS, you can play the single built-in level. + +With DOS, the game tries to load `LEVELnnn.DAT` file, starting from `LEVEL001.DAT` from the current directory. + +The levels can be edited on Atari with the enclosed `ED.COM` editor or a PC (end line characters can be LF, CRFL or ATASCII EOL). + +### Level file format: +line 1: number of balls to be hit for the level to succeed + +line 2: `1` means single pixel width of the pattern, `2` double pixel width + +the following lines define the level. Any character is a pixel, space is a space, EOL is the end of line. + +The game displays 46 lines of pixels, but your levels should generally be shorter to make it playable. + +Important! Any error in the level definition causes the game to return to level 000, so if you make a mistake in `LEVEL004.DAT`, +the files `LEVEL005.DAT` and `LEVEL006.DAT` will never be displayed. + +Experiment! + + +## 2020-05-13 +Second place in the game compo in PSA 2020 virtual SARS-2 demo party. + + +### TPS Report: + +## 2012-02-16 +Fork to the colour version. (averybreakout.asm) Graphics mode tests. + + +## build 023: 2010-06-26 + + + idle ball delay loop shortened to 75 loops for a smoother experience + +T027: when ball is down out of the screen and the racquette is over it, it bounces. + Need to add a check for it! (no bounces when out of the screen) + +## build 022: 2010-06-24 +T022: when balls disappear, their traces should disappear, too, even when a new ball is NOT created + now the dead pixels disappear only when a new ball is created. + It has been done by expanding the bottom area, so the balls are going down. + Screen had to been cut 10 lines. Not a big deal. + +T024: detect the ending + Detected (gameIsNotOver label). + + +## build 021: 2010-06-21 ++ apparently the slowest part of the engine is eXistenZcheck - rewrite as a simple stack! + as usual, it was not as simple as thought previously... But works now! + Will be easier to clear traces of the dead balls now. + +## build 020: 2010-06-02 ++ when the racquette is max to the right it does not bounce balls! ++ still problems with racquet + solved - pos+size was >$ff ++ very fast balls get through the left-right side borders + solved by a better usage of "maxSpeed" + +## build 019: 2010-05-27 ++ alive balls are somewhere in the outer space - check where and fix + where: YposTableH -- 00 -- 08 most 01, XposTableH - FF, FE, 00, 01 + basicaly these are places where a ball should never be! + One fix let other "outer-space" related buggies die, too. + The problem was that bouncing ball got behind the border and started to bounce + there and forth outside the screen. Fix - bring it back on the playfield. ++ balls are created somewhere outside the screen ++ when balls disappear, their traces should disappear, too (now 1 pixel stays on screen) ++ high dX balls were sticking to Vborders. Fixed by increasing the margin + +## build 018: 2010-05-26 ++ 1 pixel out of the deleted bunch stays forever (erase/store sequence was invalid) + +build 017: 2010-05-25 ++ too few high dX balls +x low-priority: rewrite memorytables to use lda (zpage,x) addressing (cool:) + Turned out not to be such a low-priority job as wrong sequence of writes + to memorytables make one pixel staying on the screen. Rewrite to simplify! + Turned out that indirect X addressing is not good for it and this is closed. + +## build 016: 2010-05-24 +Forgot about documenting updates... +Basically the game is close to the end, but number of small issues emerged. ++ racquette is too slow (and it was such a work to make it 1-px smooth...) + +## build 006: 2010-05-12 +Collision detection +Ough... turned out to be way more difficult than expected, but now collisions are detected and balls are bouncing! + +## build 005: 2010-05-10 +Snake like plot memory! Lots and lots of pixels, less balls (64 is the max...) + +## build 004: 2010-05-09 +Multiple ballz + +## build 003: 2010-05-08 +Feeling bouncy +simple boundary bounces work nicely. +Unfrtunately number of draws per frame dropped to circa 70. +I guess 64 will be an achievement for 2 frames. + +## build 002: 2010-05-06 +MADS rewrite :-] +;bare plots get circa 320 pixels per frame. I will go for 128 pix max now + +## build 001: 2010-05-04 + +First try: +Strip scorch sources to get clean gr.8 screen. +(and PLOT) + +Basic idea: http://wonderfl.net/c/tNGi/fullscreen + + +### TODO: (old) + +T021: balls are ferking stick to the right part of the screen... + +T023: find and set few nice starting points and speeds to be rotated (remove not really sexy random start) + +T025: do nice game over (when not clear) + +T026: do nice "ALL CLEAR" screen + +T028: (idea) spinning the ball - when ball bounces the racquette when it is moving, dX adds or subs diff --git a/MODE9pp.txt b/art/MODE9pp.txt similarity index 100% rename from MODE9pp.txt rename to art/MODE9pp.txt diff --git a/art/Mild West.fnt b/art/Mild West.fnt new file mode 100644 index 0000000..cc0a65c Binary files /dev/null and b/art/Mild West.fnt differ diff --git a/art/Reflections.fnt b/art/Reflections.fnt new file mode 100644 index 0000000..77974fe Binary files /dev/null and b/art/Reflections.fnt differ diff --git a/art/WIZ.xex b/art/WIZ.xex deleted file mode 100644 index 2821db4..0000000 Binary files a/art/WIZ.xex and /dev/null differ diff --git a/art/WIZs.xex b/art/WIZs.xex deleted file mode 100644 index 652f0d8..0000000 Binary files a/art/WIZs.xex and /dev/null differ diff --git a/art/levels.xlsx b/art/levels.xlsx deleted file mode 100644 index 338268e..0000000 Binary files a/art/levels.xlsx and /dev/null differ diff --git a/art/muzyka.rmt b/art/muzyka.rmt new file mode 100644 index 0000000..973a68f Binary files /dev/null and b/art/muzyka.rmt differ diff --git a/art/muzyka_stripped.rmt b/art/muzyka_stripped.rmt new file mode 100644 index 0000000..e5a40fb Binary files /dev/null and b/art/muzyka_stripped.rmt differ diff --git a/art/rmt_feat.a65 b/art/rmt_feat.a65 new file mode 100755 index 0000000..8649d97 --- /dev/null +++ b/art/rmt_feat.a65 @@ -0,0 +1,42 @@ +;* --------BEGIN-------- +;Settings for music +;* C:\Users\pawel\Dropbox\programming\tetryx\artwork\stripped.rmt +FEAT_SFX equ 1 +FEAT_GLOBALVOLUMEFADE equ 0 ;RMTGLOBALVOLUMEFADE variable +FEAT_NOSTARTINGSONGLINE equ 0 +FEAT_INSTRSPEED equ 1 +FEAT_CONSTANTSPEED equ 0 ;(2 times) +FEAT_COMMAND1 equ 1 ;(25 times) +FEAT_COMMAND2 equ 0 ;(0 times) +FEAT_COMMAND3 equ 0 ;(0 times) +FEAT_COMMAND4 equ 0 ;(0 times) +FEAT_COMMAND5 equ 0 ;(0 times) +FEAT_COMMAND6 equ 0 ;(0 times) +FEAT_COMMAND7SETNOTE equ 0 ;(0 times) +FEAT_COMMAND7VOLUMEONLY equ 0 ;(0 times) +FEAT_PORTAMENTO equ 0 ;(0 times) +FEAT_FILTER equ 0 ;(0 times) +FEAT_FILTERG0L equ 0 ;(0 times) +FEAT_FILTERG1L equ 0 ;(0 times) +FEAT_FILTERG0R equ 0 ;(0 times) +FEAT_FILTERG1R equ 0 ;(0 times) +FEAT_BASS16 equ 0 ;(0 times) +FEAT_BASS16G1L equ 0 ;(0 times) +FEAT_BASS16G3L equ 0 ;(0 times) +FEAT_BASS16G1R equ 0 ;(0 times) +FEAT_BASS16G3R equ 0 ;(0 times) +FEAT_VOLUMEONLYG0L equ 0 ;(0 times) +FEAT_VOLUMEONLYG2L equ 0 ;(0 times) +FEAT_VOLUMEONLYG3L equ 0 ;(0 times) +FEAT_VOLUMEONLYG0R equ 0 ;(0 times) +FEAT_VOLUMEONLYG2R equ 0 ;(0 times) +FEAT_VOLUMEONLYG3R equ 0 ;(0 times) +FEAT_TABLETYPE equ 0 ;(0 times) +FEAT_TABLEMODE equ 0 ;(0 times) +FEAT_TABLEGO equ 0 ;(0 times) +FEAT_AUDCTLMANUALSET equ 0 ;(0 times) +FEAT_VOLUMEMIN equ 0 ;(0 times) +FEAT_EFFECTVIBRATO equ 0 ;(0 times) +FEAT_EFFECTFSHIFT equ 1 ;(1 times) +STEREOMODE equ 0 +;* --------END-------- diff --git a/art/rmtplayr.a65 b/art/rmtplayr.a65 new file mode 100755 index 0000000..a47629b --- /dev/null +++ b/art/rmtplayr.a65 @@ -0,0 +1,1356 @@ +;* +;* Raster Music Tracker, RMT Atari routine version 1.20090108 +;* (c) Radek Sterba, Raster/C.P.U., 2002 - 2009 +;* http://raster.atari.org +;* +;* Warnings: +;* +;* 1. RMT player routine needs 19 itself reserved bytes in zero page (no accessed +;* from any other routines) as well as cca 1KB of memory before the "PLAYER" +;* address for frequency tables and functionary variables. It's: +;* a) from PLAYER-$03c0 to PLAYER for stereo RMTplayer +;* b) from PLAYER-$0320 to PLAYER for mono RMTplayer +;* +;* 2. RMT player routine MUST (!!!) be compiled from the begin of the memory page. +;* i.e. "PLAYER" address can be $..00 only! +;* +;* 3. Because of RMTplayer provides a lot of effects, it spent a lot of CPU time. +;* +;* STEREOMODE equ 0..3 ;0 => compile RMTplayer for 4 tracks mono +;* ;1 => compile RMTplayer for 8 tracks stereo +;* ;2 => compile RMTplayer for 4 tracks stereo L1 R2 R3 L4 +;* ;3 => compile RMTplayer for 4 tracks stereo L1 L2 R3 R4 +;* + IFT STEREOMODE==1 +TRACKS equ 8 + ELS +TRACKS equ 4 + EIF +;* +PLAYER equ *+$400 ;equ $4400 +;* +;* RMT FEATures definitions file +;* For optimizations of RMT player routine to concrete RMT modul only! + icl "rmt_feat.a65" +;* +;* RMT ZeroPage addresses + org RMT_zpvars +p_tis +p_instrstable org *+2 +p_trackslbstable org *+2 +p_trackshbstable org *+2 +p_song org *+2 +ns org *+2 +nr org *+2 +nt org *+2 +reg1 org *+1 +reg2 org *+1 +reg3 org *+1 +tmp org *+1 + IFT FEAT_COMMAND2 +frqaddcmd2 org *+1 + EIF + IFT TRACKS>4 + org PLAYER-$400+$40 + ELS + org PLAYER-$400+$e0 + EIF +track_variables +trackn_db org *+TRACKS +trackn_hb org *+TRACKS +trackn_idx org *+TRACKS +trackn_pause org *+TRACKS +trackn_note org *+TRACKS +trackn_volume org *+TRACKS +trackn_distor org *+TRACKS +trackn_shiftfrq org *+TRACKS + IFT FEAT_PORTAMENTO +trackn_portafrqc org *+TRACKS +trackn_portafrqa org *+TRACKS +trackn_portaspeed org *+TRACKS +trackn_portaspeeda org *+TRACKS +trackn_portadepth org *+TRACKS + EIF +trackn_instrx2 org *+TRACKS +trackn_instrdb org *+TRACKS +trackn_instrhb org *+TRACKS +trackn_instridx org *+TRACKS +trackn_instrlen org *+TRACKS +trackn_instrlop org *+TRACKS +trackn_instrreachend org *+TRACKS +trackn_volumeslidedepth org *+TRACKS +trackn_volumeslidevalue org *+TRACKS + IFT FEAT_VOLUMEMIN +trackn_volumemin org *+TRACKS + EIF +FEAT_EFFECTS equ FEAT_EFFECTVIBRATO||FEAT_EFFECTFSHIFT + IFT FEAT_EFFECTS +trackn_effdelay org *+TRACKS + EIF + IFT FEAT_EFFECTVIBRATO +trackn_effvibratoa org *+TRACKS + EIF + IFT FEAT_EFFECTFSHIFT +trackn_effshift org *+TRACKS + EIF +trackn_tabletypespeed org *+TRACKS + IFT FEAT_TABLEMODE +trackn_tablemode org *+TRACKS + EIF +trackn_tablenote org *+TRACKS +trackn_tablea org *+TRACKS +trackn_tableend org *+TRACKS + IFT FEAT_TABLEGO +trackn_tablelop org *+TRACKS + EIF +trackn_tablespeeda org *+TRACKS + IFT FEAT_FILTER||FEAT_BASS16 +trackn_command org *+TRACKS + EIF + IFT FEAT_BASS16 +trackn_outnote org *+TRACKS + EIF + IFT FEAT_FILTER +trackn_filter org *+TRACKS + EIF +trackn_audf org *+TRACKS +trackn_audc org *+TRACKS + IFT FEAT_AUDCTLMANUALSET +trackn_audctl org *+TRACKS + EIF +v_aspeed org *+1 +track_endvariables + org PLAYER-$100-$140-$40+2 +INSTRPAR equ 12 +tabbeganddistor + dta frqtabpure-frqtab,$00 + dta frqtabpure-frqtab,$20 + dta frqtabpure-frqtab,$40 + dta frqtabbass1-frqtab,$c0 + dta frqtabpure-frqtab,$80 + dta frqtabpure-frqtab,$a0 + dta frqtabbass1-frqtab,$c0 + dta frqtabbass2-frqtab,$c0 + IFT FEAT_EFFECTVIBRATO +vibtabbeg dta 0,vib1-vib0,vib2-vib0,vib3-vib0 +vib0 dta 0 +vib1 dta 1,-1,-1,1 +vib2 dta 1,0,-1,-1,0,1 +vib3 dta 1,1,0,-1,-1,-1,-1,0,1,1 +vibtabnext + dta vib0-vib0+0 + dta vib1-vib0+1,vib1-vib0+2,vib1-vib0+3,vib1-vib0+0 + dta vib2-vib0+1,vib2-vib0+2,vib2-vib0+3,vib2-vib0+4,vib2-vib0+5,vib2-vib0+0 + dta vib3-vib0+1,vib3-vib0+2,vib3-vib0+3,vib3-vib0+4,vib3-vib0+5,vib3-vib0+6,vib3-vib0+7,vib3-vib0+8,vib3-vib0+9,vib3-vib0+0 + EIF + org PLAYER-$100-$140 + IFT FEAT_BASS16 +frqtabbasslo + dta $F2,$33,$96,$E2,$38,$8C,$00,$6A,$E8,$6A,$EF,$80,$08,$AE,$46,$E6 + dta $95,$41,$F6,$B0,$6E,$30,$F6,$BB,$84,$52,$22,$F4,$C8,$A0,$7A,$55 + dta $34,$14,$F5,$D8,$BD,$A4,$8D,$77,$60,$4E,$38,$27,$15,$06,$F7,$E8 + dta $DB,$CF,$C3,$B8,$AC,$A2,$9A,$90,$88,$7F,$78,$70,$6A,$64,$5E,$00 + EIF + org PLAYER-$100-$100 +frqtab + ERT [255 + ldy #0 + tya +ri0 sta track_variables,y + sta track_endvariables-$100,y + iny + bne ri0 + ELS + ldy #track_endvariables-track_variables + lda #0 +ri0 sta track_variables-1,y + dey + bne ri0 + EIF + ldy #4 + lda (ns),y + sta v_maxtracklen + iny + IFT FEAT_CONSTANTSPEED==0 + lda (ns),y + sta v_speed + EIF + IFT FEAT_INSTRSPEED==0 + iny + lda (ns),y + sta v_instrspeed + sta v_ainstrspeed + ELI FEAT_INSTRSPEED>1 + lda #FEAT_INSTRSPEED + sta v_ainstrspeed + EIF + ldy #8 +ri1 lda (ns),y + sta p_tis-8,y + iny + cpy #8+8 + bne ri1 + IFT FEAT_NOSTARTINGSONGLINE==0 + pla + pha + IFT TRACKS>4 + asl @ + asl @ + asl @ + clc + adc p_song + sta p_song + pla + php + and #$e0 + asl @ + rol @ + rol @ + rol @ + ELS + asl @ + asl @ + clc + adc p_song + sta p_song + pla + php + and #$c0 + asl @ + rol @ + rol @ + EIF + plp + adc p_song+1 + sta p_song+1 + EIF + jsr GetSongLineTrackLineInitOfNewSetInstrumentsOnlyRmtp3 +rmt_silence + IFT STEREOMODE>0 + lda #0 + sta $d208 + sta $d218 + ldy #3 + sty $d20f + sty $d21f + ldy #8 +si1 sta $d200,y + sta $d210,y + dey + bpl si1 + ELS + lda #0 + sta $d208 + ldy #3 + sty $d20f + ldy #8 +si1 sta $d200,y + dey + bpl si1 + EIF + IFT FEAT_INSTRSPEED==0 + lda v_instrspeed + ELS + lda #FEAT_INSTRSPEED + EIF + rts +GetSongLineTrackLineInitOfNewSetInstrumentsOnlyRmtp3 +GetSongLine + ldx #0 + stx v_abeat +nn0 +nn1 txa + tay + lda (p_song),y + cmp #$fe + bcs nn2 + tay + lda (p_trackslbstable),y + sta trackn_db,x + lda (p_trackshbstable),y +nn1a sta trackn_hb,x + lda #0 + sta trackn_idx,x + lda #1 +nn1a2 sta trackn_pause,x + lda #$80 + sta trackn_instrx2,x + inx +xtracks01 cpx #TRACKS + bne nn1 + lda p_song + clc +xtracks02 adc #TRACKS + sta p_song + bcc GetTrackLine + inc p_song+1 +nn1b + jmp GetTrackLine +nn2 + beq nn3 +nn2a + lda #0 + beq nn1a2 +nn3 + ldy #2 + lda (p_song),y + tax + iny + lda (p_song),y + sta p_song+1 + stx p_song + ldx #0 + beq nn0 +GetTrackLine +oo0 +oo0a + IFT FEAT_CONSTANTSPEED==0 + lda #$ff +v_speed equ *-1 + sta v_bspeed + EIF + ldx #-1 +oo1 + inx + dec trackn_pause,x + bne oo1x +oo1b + lda trackn_db,x + sta ns + lda trackn_hb,x + sta ns+1 +oo1i + ldy trackn_idx,x + inc trackn_idx,x + lda (ns),y + sta reg1 + and #$3f + cmp #61 + beq oo1a + bcs oo2 + sta trackn_note,x + IFT FEAT_BASS16 + sta trackn_outnote,x + EIF + iny + lda (ns),y + lsr @ + and #$3f*2 + sta trackn_instrx2,x +oo1a + lda #1 + sta trackn_pause,x + ldy trackn_idx,x + inc trackn_idx,x + lda (ns),y + lsr @ + ror reg1 + lsr @ + ror reg1 + lda reg1 + IFT FEAT_GLOBALVOLUMEFADE + sec + sbc #$00 +RMTGLOBALVOLUMEFADE equ *-1 + bcs voig + lda #0 +voig + EIF + and #$f0 + sta trackn_volume,x +oo1x +xtracks03sub1 cpx #TRACKS-1 + bne oo1 + IFT FEAT_CONSTANTSPEED==0 + lda #$ff +v_bspeed equ *-1 + sta v_speed + ELS + lda #FEAT_CONSTANTSPEED + EIF + sta v_aspeed + jmp InitOfNewSetInstrumentsOnly +oo2 + cmp #63 + beq oo63 + lda reg1 + and #$c0 + beq oo62_b + asl @ + rol @ + rol @ + sta trackn_pause,x + jmp oo1x +oo62_b + iny + lda (ns),y + sta trackn_pause,x + inc trackn_idx,x + jmp oo1x +oo63 + lda reg1 + IFT FEAT_CONSTANTSPEED==0 + bmi oo63_1X + iny + lda (ns),y + sta v_bspeed + inc trackn_idx,x + jmp oo1i +oo63_1X + EIF + cmp #255 + beq oo63_11 + iny + lda (ns),y + sta trackn_idx,x + jmp oo1i +oo63_11 + jmp GetSongLine +p2xrmtp3 jmp rmt_p3 +p2x0 dex + bmi p2xrmtp3 +InitOfNewSetInstrumentsOnly +p2x1 ldy trackn_instrx2,x + bmi p2x0 + IFT FEAT_SFX + jsr SetUpInstrumentY2 + jmp p2x0 +rmt_sfx + sta trackn_note,x + IFT FEAT_BASS16 + sta trackn_outnote,x + EIF + lda #$f0 ;* sfx note volume*16 +RMTSFXVOLUME equ *-1 ;* label for sfx note volume parameter overwriting + sta trackn_volume,x + EIF +SetUpInstrumentY2 + lda (p_instrstable),y + sta trackn_instrdb,x + sta nt + iny + lda (p_instrstable),y + sta trackn_instrhb,x + sta nt+1 + IFT FEAT_FILTER + lda #1 + sta trackn_filter,x + EIF + IFT FEAT_TABLEGO + IFT FEAT_FILTER + tay + ELS + ldy #1 + EIF + lda (nt),y + sta trackn_tablelop,x + iny + ELS + ldy #2 + EIF + lda (nt),y + sta trackn_instrlen,x + iny + lda (nt),y + sta trackn_instrlop,x + iny + lda (nt),y + sta trackn_tabletypespeed,x + IFT FEAT_TABLETYPE||FEAT_TABLEMODE + and #$3f + EIF + sta trackn_tablespeeda,x + IFT FEAT_TABLEMODE + lda (nt),y + and #$40 + sta trackn_tablemode,x + EIF + IFT FEAT_AUDCTLMANUALSET + iny + lda (nt),y + sta trackn_audctl,x + iny + ELS + ldy #6 + EIF + lda (nt),y + sta trackn_volumeslidedepth,x + IFT FEAT_VOLUMEMIN + iny + lda (nt),y + sta trackn_volumemin,x + IFT FEAT_EFFECTS + iny + EIF + ELS + IFT FEAT_EFFECTS + ldy #8 + EIF + EIF + IFT FEAT_EFFECTS + lda (nt),y + sta trackn_effdelay,x + IFT FEAT_EFFECTVIBRATO + iny + lda (nt),y + tay + lda vibtabbeg,y + sta trackn_effvibratoa,x + EIF + IFT FEAT_EFFECTFSHIFT + ldy #10 + lda (nt),y + sta trackn_effshift,x + EIF + EIF + lda #128 + sta trackn_volumeslidevalue,x + sta trackn_instrx2,x + asl @ + sta trackn_instrreachend,x + sta trackn_shiftfrq,x + tay + lda (nt),y + sta trackn_tableend,x + adc #0 + sta trackn_instridx,x + lda #INSTRPAR + sta trackn_tablea,x + tay + lda (nt),y + sta trackn_tablenote,x +xata_rtshere + IFT FEAT_SFX + rts + ELS + jmp p2x0 + EIF +rmt_play +rmt_p0 + jsr SetPokey +rmt_p1 + IFT FEAT_INSTRSPEED==0||FEAT_INSTRSPEED>1 + dec v_ainstrspeed + bne rmt_p3 + EIF + IFT FEAT_INSTRSPEED==0 + lda #$ff +v_instrspeed equ *-1 + sta v_ainstrspeed + ELI FEAT_INSTRSPEED>1 + lda #FEAT_INSTRSPEED + sta v_ainstrspeed + EIF +rmt_p2 + dec v_aspeed + bne rmt_p3 + inc v_abeat + lda #$ff +v_abeat equ *-1 + cmp #$ff +v_maxtracklen equ *-1 + beq p2o3 + jmp GetTrackLine +p2o3 + jmp GetSongLineTrackLineInitOfNewSetInstrumentsOnlyRmtp3 +go_ppnext jmp ppnext +rmt_p3 + lda #>frqtab + sta nr+1 +xtracks05sub1 ldx #TRACKS-1 +pp1 + lda trackn_instrhb,x + beq go_ppnext + sta ns+1 + lda trackn_instrdb,x + sta ns + ldy trackn_instridx,x + lda (ns),y + sta reg1 + iny + lda (ns),y + sta reg2 + iny + lda (ns),y + sta reg3 + iny + tya + cmp trackn_instrlen,x + bcc pp2 + beq pp2 + lda #$80 + sta trackn_instrreachend,x +pp1b + lda trackn_instrlop,x +pp2 sta trackn_instridx,x + lda reg1 + IFT TRACKS>4 + cpx #4 + bcc pp2s + lsr @ + lsr @ + lsr @ + lsr @ +pp2s + EIF + and #$0f + ora trackn_volume,x + tay + lda volumetab,y + sta tmp + lda reg2 + and #$0e + tay + lda tabbeganddistor,y + sta nr + lda tmp + ora tabbeganddistor+1,y + sta trackn_audc,x +InstrumentsEffects + IFT FEAT_EFFECTS + lda trackn_effdelay,x + beq ei2 + cmp #1 + bne ei1 + lda trackn_shiftfrq,x + IFT FEAT_EFFECTFSHIFT + clc + adc trackn_effshift,x + EIF + IFT FEAT_EFFECTVIBRATO + clc + ldy trackn_effvibratoa,x + adc vib0,y + EIF + sta trackn_shiftfrq,x + IFT FEAT_EFFECTVIBRATO + lda vibtabnext,y + sta trackn_effvibratoa,x + EIF + jmp ei2 +ei1 + dec trackn_effdelay,x +ei2 + EIF + ldy trackn_tableend,x + cpy #INSTRPAR+1 + bcc ei3 + lda trackn_tablespeeda,x + bpl ei2f +ei2c + tya + cmp trackn_tablea,x + bne ei2c2 + IFT FEAT_TABLEGO + lda trackn_tablelop,x + ELS + lda #INSTRPAR + EIF + sta trackn_tablea,x + bne ei2a +ei2c2 + inc trackn_tablea,x +ei2a + lda trackn_instrdb,x + sta nt + lda trackn_instrhb,x + sta nt+1 + ldy trackn_tablea,x + lda (nt),y + IFT FEAT_TABLEMODE + ldy trackn_tablemode,x + beq ei2e + clc + adc trackn_tablenote,x +ei2e + EIF + sta trackn_tablenote,x + lda trackn_tabletypespeed,x + IFT FEAT_TABLETYPE||FEAT_TABLEMODE + and #$3f + EIF +ei2f + sec + sbc #1 + sta trackn_tablespeeda,x +ei3 + lda trackn_instrreachend,x + bpl ei4 + lda trackn_volume,x + beq ei4 + IFT FEAT_VOLUMEMIN + cmp trackn_volumemin,x + beq ei4 + bcc ei4 + EIF + tay + lda trackn_volumeslidevalue,x + clc + adc trackn_volumeslidedepth,x + sta trackn_volumeslidevalue,x + bcc ei4 + tya + sbc #16 + sta trackn_volume,x +ei4 + IFT FEAT_COMMAND2 + lda #0 + sta frqaddcmd2 + EIF + IFT FEAT_COMMAND1||FEAT_COMMAND2||FEAT_COMMAND3||FEAT_COMMAND4||FEAT_COMMAND5||FEAT_COMMAND6||FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY + lda reg2 + IFT FEAT_FILTER||FEAT_BASS16 + sta trackn_command,x + EIF + and #$70 + IFT 1==[FEAT_COMMAND1+FEAT_COMMAND2+FEAT_COMMAND3+FEAT_COMMAND4+FEAT_COMMAND5+FEAT_COMMAND6+[FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY]] + beq cmd0 + ELS + lsr @ + lsr @ + sta jmx+1 +jmx bcc * + jmp cmd0 + nop + jmp cmd1 + IFT FEAT_COMMAND2||FEAT_COMMAND3||FEAT_COMMAND4||FEAT_COMMAND5||FEAT_COMMAND6||FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY + nop + jmp cmd2 + EIF + IFT FEAT_COMMAND3||FEAT_COMMAND4||FEAT_COMMAND5||FEAT_COMMAND6||FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY + nop + jmp cmd3 + EIF + IFT FEAT_COMMAND4||FEAT_COMMAND5||FEAT_COMMAND6||FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY + nop + jmp cmd4 + EIF + IFT FEAT_COMMAND5||FEAT_COMMAND6||FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY + nop + jmp cmd5 + EIF + IFT FEAT_COMMAND6||FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY + nop + jmp cmd6 + EIF + IFT FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY + nop + jmp cmd7 + EIF + EIF + ELS + IFT FEAT_FILTER||FEAT_BASS16 + lda reg2 + sta trackn_command,x + EIF + EIF +cmd1 + IFT FEAT_COMMAND1 + lda reg3 + jmp cmd0c + EIF +cmd2 + IFT FEAT_COMMAND2 + lda reg3 + sta frqaddcmd2 + lda trackn_note,x + jmp cmd0a + EIF +cmd3 + IFT FEAT_COMMAND3 + lda trackn_note,x + clc + adc reg3 + sta trackn_note,x + jmp cmd0a + EIF +cmd4 + IFT FEAT_COMMAND4 + lda trackn_shiftfrq,x + clc + adc reg3 + sta trackn_shiftfrq,x + lda trackn_note,x + jmp cmd0a + EIF +cmd5 + IFT FEAT_COMMAND5&&FEAT_PORTAMENTO + IFT FEAT_TABLETYPE + lda trackn_tabletypespeed,x + bpl cmd5a1 + ldy trackn_note,x + lda (nr),y + clc + adc trackn_tablenote,x + jmp cmd5ax + EIF +cmd5a1 + lda trackn_note,x + clc + adc trackn_tablenote,x + cmp #61 + bcc cmd5a2 + lda #63 +cmd5a2 + tay + lda (nr),y +cmd5ax + sta trackn_portafrqc,x + ldy reg3 + bne cmd5a + sta trackn_portafrqa,x +cmd5a + tya + lsr @ + lsr @ + lsr @ + lsr @ + sta trackn_portaspeed,x + sta trackn_portaspeeda,x + lda reg3 + and #$0f + sta trackn_portadepth,x + lda trackn_note,x + jmp cmd0a + ELI FEAT_COMMAND5 + lda trackn_note,x + jmp cmd0a + EIF +cmd6 + IFT FEAT_COMMAND6&&FEAT_FILTER + lda reg3 + clc + adc trackn_filter,x + sta trackn_filter,x + lda trackn_note,x + jmp cmd0a + ELI FEAT_COMMAND6 + lda trackn_note,x + jmp cmd0a + EIF +cmd7 + IFT FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY + IFT FEAT_COMMAND7SETNOTE + lda reg3 + IFT FEAT_COMMAND7VOLUMEONLY + cmp #$80 + beq cmd7a + EIF + sta trackn_note,x + jmp cmd0a + EIF + IFT FEAT_COMMAND7VOLUMEONLY +cmd7a + lda trackn_audc,x + ora #$f0 + sta trackn_audc,x + lda trackn_note,x + jmp cmd0a + EIF + EIF +cmd0 + lda trackn_note,x + clc + adc reg3 +cmd0a + IFT FEAT_TABLETYPE + ldy trackn_tabletypespeed,x + bmi cmd0b + EIF + clc + adc trackn_tablenote,x + cmp #61 + bcc cmd0a1 + lda #0 + sta trackn_audc,x + lda #63 +cmd0a1 + IFT FEAT_BASS16 + sta trackn_outnote,x + EIF + tay + lda (nr),y + clc + adc trackn_shiftfrq,x + IFT FEAT_COMMAND2 + clc + adc frqaddcmd2 + EIF + IFT FEAT_TABLETYPE + jmp cmd0c +cmd0b + cmp #61 + bcc cmd0b1 + lda #0 + sta trackn_audc,x + lda #63 +cmd0b1 + tay + lda trackn_shiftfrq,x + clc + adc trackn_tablenote,x + clc + adc (nr),y + IFT FEAT_COMMAND2 + clc + adc frqaddcmd2 + EIF + EIF +cmd0c + sta trackn_audf,x +pp9 + IFT FEAT_PORTAMENTO + lda trackn_portaspeeda,x + beq pp10 + dec trackn_portaspeeda,x + bne pp10 + lda trackn_portaspeed,x + sta trackn_portaspeeda,x + lda trackn_portafrqa,x + cmp trackn_portafrqc,x + beq pp10 + bcs pps1 + adc trackn_portadepth,x + bcs pps8 + cmp trackn_portafrqc,x + bcs pps8 + jmp pps9 +pps1 + sbc trackn_portadepth,x + bcc pps8 + cmp trackn_portafrqc,x + bcs pps9 +pps8 + lda trackn_portafrqc,x +pps9 + sta trackn_portafrqa,x +pp10 + lda reg2 + and #$01 + beq pp11 + lda trackn_portafrqa,x + clc + adc trackn_shiftfrq,x + sta trackn_audf,x +pp11 + EIF +ppnext + dex + bmi rmt_p4 + jmp pp1 +rmt_p4 + IFT FEAT_AUDCTLMANUALSET + lda trackn_audctl+0 + ora trackn_audctl+1 + ora trackn_audctl+2 + ora trackn_audctl+3 + tax + ELS + ldx #0 + EIF +qq1 + stx v_audctl + IFT FEAT_FILTER + IFT FEAT_FILTERG0L + lda trackn_command+0 + bpl qq2 + lda trackn_audc+0 + and #$0f + beq qq2 + lda trackn_audf+0 + clc + adc trackn_filter+0 + sta trackn_audf+2 + IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG2L + lda trackn_audc+2 + and #$10 + bne qq1a + EIF + lda #0 + sta trackn_audc+2 +qq1a + txa + ora #4 + tax + EIF +qq2 + IFT FEAT_FILTERG1L + lda trackn_command+1 + bpl qq3 + lda trackn_audc+1 + and #$0f + beq qq3 + lda trackn_audf+1 + clc + adc trackn_filter+1 + sta trackn_audf+3 + IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG3L + lda trackn_audc+3 + and #$10 + bne qq2a + EIF + lda #0 + sta trackn_audc+3 +qq2a + txa + ora #2 + tax + EIF +qq3 + IFT FEAT_FILTERG0L||FEAT_FILTERG1L + cpx v_audctl + bne qq5 + EIF + EIF + IFT FEAT_BASS16 + IFT FEAT_BASS16G1L + lda trackn_command+1 + and #$0e + cmp #6 + bne qq4 + lda trackn_audc+1 + and #$0f + beq qq4 + ldy trackn_outnote+1 + lda frqtabbasslo,y + sta trackn_audf+0 + lda frqtabbasshi,y + sta trackn_audf+1 + IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG0L + lda trackn_audc+0 + and #$10 + bne qq3a + EIF + lda #0 + sta trackn_audc+0 +qq3a + txa + ora #$50 + tax + EIF +qq4 + IFT FEAT_BASS16G3L + lda trackn_command+3 + and #$0e + cmp #6 + bne qq5 + lda trackn_audc+3 + and #$0f + beq qq5 + ldy trackn_outnote+3 + lda frqtabbasslo,y + sta trackn_audf+2 + lda frqtabbasshi,y + sta trackn_audf+3 + IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG2L + lda trackn_audc+2 + and #$10 + bne qq4a + EIF + lda #0 + sta trackn_audc+2 +qq4a + txa + ora #$28 + tax + EIF + EIF +qq5 + stx v_audctl + IFT TRACKS>4 + IFT FEAT_AUDCTLMANUALSET + lda trackn_audctl+4 + ora trackn_audctl+5 + ora trackn_audctl+6 + ora trackn_audctl+7 + tax + ELS + ldx #0 + EIF + stx v_audctl2 + IFT FEAT_FILTER + IFT FEAT_FILTERG0R + lda trackn_command+0+4 + bpl qs2 + lda trackn_audc+0+4 + and #$0f + beq qs2 + lda trackn_audf+0+4 + clc + adc trackn_filter+0+4 + sta trackn_audf+2+4 + IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG2R + lda trackn_audc+2+4 + and #$10 + bne qs1a + EIF + lda #0 + sta trackn_audc+2+4 +qs1a + txa + ora #4 + tax + EIF +qs2 + IFT FEAT_FILTERG1R + lda trackn_command+1+4 + bpl qs3 + lda trackn_audc+1+4 + and #$0f + beq qs3 + lda trackn_audf+1+4 + clc + adc trackn_filter+1+4 + sta trackn_audf+3+4 + IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG3R + lda trackn_audc+3+4 + and #$10 + bne qs2a + EIF + lda #0 + sta trackn_audc+3+4 +qs2a + txa + ora #2 + tax + EIF +qs3 + IFT FEAT_FILTERG0R||FEAT_FILTERG1R + cpx v_audctl2 + bne qs5 + EIF + EIF + IFT FEAT_BASS16 + IFT FEAT_BASS16G1R + lda trackn_command+1+4 + and #$0e + cmp #6 + bne qs4 + lda trackn_audc+1+4 + and #$0f + beq qs4 + ldy trackn_outnote+1+4 + lda frqtabbasslo,y + sta trackn_audf+0+4 + lda frqtabbasshi,y + sta trackn_audf+1+4 + IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG0R + lda trackn_audc+0+4 + and #$10 + bne qs3a + EIF + lda #0 + sta trackn_audc+0+4 +qs3a + txa + ora #$50 + tax + EIF +qs4 + IFT FEAT_BASS16G3R + lda trackn_command+3+4 + and #$0e + cmp #6 + bne qs5 + lda trackn_audc+3+4 + and #$0f + beq qs5 + ldy trackn_outnote+3+4 + lda frqtabbasslo,y + sta trackn_audf+2+4 + lda frqtabbasshi,y + sta trackn_audf+3+4 + IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG2R + lda trackn_audc+2+4 + and #$10 + bne qs4a + EIF + lda #0 + sta trackn_audc+2+4 +qs4a + txa + ora #$28 + tax + EIF + EIF +qs5 + stx v_audctl2 + EIF +rmt_p5 + IFT FEAT_INSTRSPEED==0||FEAT_INSTRSPEED>1 + lda #$ff +v_ainstrspeed equ *-1 + ELS + lda #1 + EIF + rts +SetPokey + IFT STEREOMODE==1 ;* L1 L2 L3 L4 R1 R2 R3 R4 + ldy #$ff +v_audctl2 equ *-1 + lda trackn_audf+0+4 + ldx trackn_audf+0 +xstastx01 sta $d210 + stx $d200 + lda trackn_audc+0+4 + ldx trackn_audc+0 +xstastx02 sta $d211 + stx $d201 + lda trackn_audf+1+4 + ldx trackn_audf+1 +xstastx03 sta $d212 + stx $d202 + lda trackn_audc+1+4 + ldx trackn_audc+1 +xstastx04 sta $d213 + stx $d203 + lda trackn_audf+2+4 + ldx trackn_audf+2 +xstastx05 sta $d214 + stx $d204 + lda trackn_audc+2+4 + ldx trackn_audc+2 +xstastx06 sta $d215 + stx $d205 + lda trackn_audf+3+4 + ldx trackn_audf+3 +xstastx07 sta $d216 + stx $d206 + lda trackn_audc+3+4 + ldx trackn_audc+3 +xstastx08 sta $d217 + stx $d207 + lda #$ff +v_audctl equ *-1 +xstysta01 sty $d218 + sta $d208 + ELI STEREOMODE==0 ;* L1 L2 L3 L4 + ldy #$ff +v_audctl equ *-1 + lda trackn_audf+0 + ldx trackn_audc+0 + sta $d200 + stx $d201 + lda trackn_audf+1 + ldx trackn_audc+1 + sta $d200+2 + stx $d201+2 + lda trackn_audf+2 + ldx trackn_audc+2 + sta $d200+4 + stx $d201+4 + lda trackn_audf+3 + ldx trackn_audc+3 + sta $d200+6 + stx $d201+6 + sty $d208 + ELI STEREOMODE==2 ;* L1 R2 R3 L4 + ldy #$ff +v_audctl equ *-1 + lda trackn_audf+0 + ldx trackn_audc+0 + sta $d200 + stx $d201 + sta $d210 + lda trackn_audf+1 + ldx trackn_audc+1 + sta $d210+2 + stx $d211+2 + lda trackn_audf+2 + ldx trackn_audc+2 + sta $d210+4 + stx $d211+4 + sta $d200+4 + lda trackn_audf+3 + ldx trackn_audc+3 + sta $d200+6 + stx $d201+6 + sta $d210+6 + sty $d218 + sty $d208 + ELI STEREOMODE==3 ;* L1 L2 R3 R4 + ldy #$ff +v_audctl equ *-1 + lda trackn_audf+0 + ldx trackn_audc+0 + sta $d200 + stx $d201 + lda trackn_audf+1 + ldx trackn_audc+1 + sta $d200+2 + stx $d201+2 + lda trackn_audf+2 + ldx trackn_audc+2 + sta $d210+4 + stx $d211+4 + sta $d200+4 + lda trackn_audf+3 + ldx trackn_audc+3 + sta $d210+6 + stx $d211+6 + sta $d200+6 + sty $d218 + sty $d208 + EIF + rts +RMTPLAYEREND diff --git a/art/wizd.xex b/art/wizd.xex deleted file mode 100644 index 6ddbc4e..0000000 Binary files a/art/wizd.xex and /dev/null differ diff --git a/averybreakout.asm b/averybreakout.asm index 8b3108e..dd46c77 100644 --- a/averybreakout.asm +++ b/averybreakout.asm @@ -2,51 +2,118 @@ ;build 006, 2010-05-12 ;CLEAR! ;あめでと +;--------------------------------------------------- +.IFNDEF TARGET + .def TARGET = 800 ; 5200 +.ENDIF ;--------------------------------------------------- - icl '../lib/atari.hea' - icl '../lib/macro.hea' + OPT r+ ; saves 10 bytes, and probably works :) https://github.com/tebe6502/Mad-Assembler/issues/10 -display=$a000 -screenWidth = 80 ;in pixels -maxLines = 57 ; number of lines on the screen (must be odd) +;--------------------------------------------------- +.macro build + dta d"1.00" ; number of this build (4 bytes) +.endm + +.macro RMTSong + lda #:1 + jsr RMTSongSelect +.endm + +;--------------------------------------------------- + icl 'lib/ATARISYS.ASM' + icl 'lib/MACRO.ASM' + +display = $a000 +screenWidth = 80 ;in pixels +screenBytes = screenWidth/2 ; in bytes +maxLines = 55 ; number of lines on the screen (must be odd) spawnProbability = (256*1/5) -margin = 2 ; top and bottom screen safety margin +margin = 2 ; top and bottom screen safety margin racquetPosMin = $2 ; min position of the paddle moved by the user racquetPosMax = screenWidth-8 ; max position of the paddle moved by the user racquetSize = 10 -maxSpeed = 2; maximum speed of a ball. must be power of 2 ('and #' used) -maxBalls = 100 ; maximum number of moving balls, <$80 (bpl used!) -maxMemory = 7 ; number of saved pixel positions - ;Beware! For easier calc somewhere it uses "modulo maxMemory" - ;calculations and therefore this value must be a power of 2! +maxSpeed = 2 ; maximum speed of a ball. must be power of 2 ('and #' used) +maxBalls = 40 ; maximum number of moving balls, <$80 (bpl used!) +maxMemory = 7 ; number of saved pixel positions + ; Beware! For easier calc somewhere it uses "modulo maxMemory" + ; calculations and therefore this value must be a power of 2 -1 (?)! maxBrickLines = 14 ; maximum number of lines of bricks to be eradicated .zpvar xpos ypos .word = $80 ; position of the ball - .zpvar colour .byte ; colour of the pixel to plot .zpvar deXpos deYpos .byte ;position for deletion - .zpvar dX dY .word ;main loop shortcuts to the table values - ;.zpvar dx dy .word ;delta + .zpvar dX dY .word ;main loop shortcuts to the table values of delta ;xpos, dx - "static point precision" - [dx+1].[dx] (big endian!) ;this static point precision is emulated with .word calcs, just a result is the high byte + .zpvar color .byte ; color of the pixel to plot .zpvar currBall collisionCheck racquetPos MyClok eXistenZstackPtr .byte .zpvar xMemAddr yMemAddr .word ; address where to store memories of the current ball - .zpvar temp .word + .zpvar temp .word + .zpvar displayposition .word + .zpvar inlevel .word .zpvar clearCount clearBallNr .byte .zpvar DLI_A DLI_X dliCount .byte - org $2000 + .zpvar RMT_blocked noSfx SFX_EFFECT .byte + .zpvar AutoPlay .byte ; Auto Play flag ($80 - auto) +RMT_zpvars = AutoPlay+1 ; POZOR!!! RMT vars go here ;--------------------------------------------------- + org $2000 +MODUL + ins 'art/muzyka_stripped.rmt',+5 ; my RMT 1.28 on WINE is apparently broken. I lost some hair here (5, not 6) + .align $100 + icl 'art/rmtplayr.a65' + ;--------------------------------------------------- + .align $400 +font + ins 'art/Mild West.fnt' ; https://damieng.com/typography/zx-origins/mild-west/ dl - .by $80+$20 - dta $4f+$20,a(display) ;VSCROLL - :((maxlines-1)/2) dta a($2f8f) - - ;---- - .by $42+$10 ;Hscroll + .by SKIP3 + dta MODE2+LMS,a(statusBuffer) + ;.by $80+$50 # fancy shmancy vscroll square pixels + ;dta $4f+$20,a(display) ;VSCROLL + ;:((maxlines-1)/2) dta a($2f8f) + .by SKIP1+DLII + .rept (maxlines-1), # + :3 dta MODEF+LMS, a(display+screenBytes*:1) + dta MODEF+LMS+DLII, a(display+screenBytes*:1) + .endr + ;---- + .by MODE2+LMS+SCH ;Hscroll DLracquetAddr0 - .wo racquetDisp - .by $41 - .wo dl + .wo racquetDisp + .by JVB + .wo dl +;--------------------------------------------------- +dl_level + :8 .by SKIP8 + dta 6+LMS,a(LevelText) + dta SKIP8 + dta 6,SKIP4,6 + .by JVB + .wo dl_level +;--------------------------------------------------- +dl_start + :6 .by SKIP3 + dta 6+LMS,a(StartText) + dta 6,SKIP4 + dta 6,SKIP8,SKIP8 + dta 6 + .by SKIP1+DLII + .rept 20, # + :3 dta MODEF+LMS, a(display+screenBytes*:1) + dta MODEF+LMS+DLII, a(display+screenBytes*:1) + .endr + ;---- + .by JVB + .wo dl_start +;--------------------------------------------------- +dl_over + :8 .by SKIP8 + dta 6+LMS,a(OverText) + .by SKIP8 + dta 6 + .by JVB + .wo dl_over ;--------------------------------------------------- racquetDisp :42 .byte $0 @@ -54,33 +121,37 @@ racquetDisp :36 .byte $0 ;-------------------------------------------------- -vint +statusBuffer + dta d" Lives: 5 HS: 000000 Score: 000000 " +score = statusBuffer+33 +HiScore = statusBuffer+17 +Lives = statusBuffer+8 +LevelText + dta d" entering level 000 " + dta d" HIT OUT OF " + dta d" BLOCKS " +OverText + dta d" GAME OVER " + dta d" YOUR SCORE: 000000 " +StartText + dta d" ," + dta d"GAME by PIRX & PECUS" + dta d" MUSIC by ALEX " + dta d"press start to START" +BlocksToHit=LevelText+26 +AllBlocks=LevelText+44 +;-------------------------------------------------- + icl 'lib/fileio.asm' +;-------------------------------------------------- + +;-------------------------------------------------- +.proc vint +;-------------------------------------------------- ;------------JOY------------- ;happy happy joy joy ;check for joystick now -/* - inc MyClok - lda MyClok - and #$07 - bne jNotRight -*/ + ldy PORTA -/* - tya - and #$01 ;up - bne jNotUp - ldx joystickConversion ;up - lda #1 - sta keyboardGrid,x -jNotUp - tya - and #$02 ;down - bne jNotDown - ldx joystickConversion+1 ;up - lda #1 - sta keyboardGrid,x -jNotDown -*/ tya and #$04 ;left bne jNotLeft @@ -108,9 +179,7 @@ jNotRight JNotFire */ - - - lda racquetPos + ;lda racquetPos sec lda #screenWidth-1 @@ -128,27 +197,70 @@ JNotFire and #$01 ;sta HSCROL - ;pos print +/* ;pos print lda racquetPos :4 lsr clc adc #'0' - sta hexDump + sta hexDump lda racquetPos and #$0F clc adc #'0' - sta hexDump+1 - - mva #0 dliCount - mva #13 VSCROL - jmp XITVBV + sta hexDump+1 +*/ + mva #0 dliCount + ; mva #13 VSCROL ; FOX gfx mode only + +/* + bit RMT_blocked + bmi SkipRMTVBL + ; ------- RMT ------- + lda sfx_effect + bmi lab2 + asl @ ; * 2 + tay ;Y = 2,4,..,16 instrument number * 2 (0,2,4,..,126) + ldx #0 ;X = 0 channel (0..3 or 0..7 for stereo module) + lda #0 ;A = 0 note (0..60) + bit noSfx + smi:jsr RASTERMUSICTRACKER+15 ;RMT_SFX start tone (It works only if FEAT_SFX is enabled !!!) + + lda #$ff + sta sfx_effect ;reinit value +lab2 + jsr RASTERMUSICTRACKER+3 ;1 play + ; ------- RMT ------- +SkipRMTVBL + +*/ + ;sfx + lda sfx_effect + bmi lab2 + asl ; * 2 + tay ;Y = 2,4,..,16 instrument number * 2 (0,2,4,..,126) + ldx #3 ;X = 3 channel (0..3 or 0..7 for stereo module) + lda #12 ;A = 12 note (0..60) + jsr RASTERMUSICTRACKER+15 ;RMT_SFX start tone (It works only if FEAT_SFX is enabled !!!) +; + lda #$ff + sta sfx_effect ;reinit value +; +lab2 + jsr RASTERMUSICTRACKER+3 +skipSoundFrame + + jmp XITVBV +.endp ;-------------------------------------------------- -DLI +.proc DLI +;-------------------------------------------------- +/* # fancy shmancy vscroll screen shenanigangs to get the square pixels sta DLI_A stx DLI_X + mva #$80 PRIOR + ldx dliCount sta WSYNC @@ -161,7 +273,7 @@ DLI txa asl asl - ;lda brickColourTab,x + ;lda brickcolorTab,x sta COLBAK inx @@ -169,14 +281,199 @@ DLI ldx DLI_X lda DLI_A rti +*/ + sta DLI_A + mva #$80 PRIOR + + lda VCOUNT + asl + asl + sta WSYNC + sta COLBAK + + lda DLI_A + rti +.endp ;-------------------------------------------------- main +;-------------------------------------------------- + jsr wait_for_depress + jsr MakeDarkScreen jsr initialize + RMTsong song_main_menu + jsr StartScreen + jsr MakeDarkScreen + + mva #$0 AutoPlay + jsr ScoreClear + mva #"5" Lives + jsr clearscreen + mva #$0 LevelType + jsr LoadLevelData.level000 ; set visible number to 000 + jsr BuildLevelFromBuffer + jsr LevelScreen + RMTSong song_ingame +gameloop + jsr initialize.ClearTables + jsr MainScreen + jsr PlayLevel + bit EndLevelFlag ; reason for end level + bmi EndOfLife ; end of life :) + ; end of level (level up) + jsr MakeDarkScreen + jsr NextLevel + jsr LevelScreen + ; RMTSong song_ingame + jsr AudioInit ; after I/O + jmp gameloop +EndOfLife + dec Lives ; decrease Lives + lda Lives + cmp #"0" + beq gameOver ; if no lives - game over + jsr NextLife + jmp gameloop +gameOver + ;game over + RMTSong song_game_over + jsr HiScoreCheckWrite + jsr GameOverScreen +@ lda RANDOM + and #%00001110 + sta COLPF0 + lda CONSOL + and #@consol(start) ; START + beq main + lda TRIG0 ; fire + jeq main + jmp @- +;-------------------------------------------------- +.proc StartScreen +;-------------------------------------------------- + jsr MakeDarkScreen + mva #$ff AutoPlay + sta LevelType ; Title + mva #"9" Lives + jsr clearscreen + jsr BuildLevelFromBuffer + mwa #dl_start dlptrs + lda #$0 ;+GTIACTLBITS + sta GPRIOR + sta COLBAKS + lda #@dmactl(standard|dma) ; normal screen width, DL on, P/M off + sta dmactls + pause 1 +StartLoop + jsr PlayLevel + bit EndLevelFlag ; reason for end level + bmi EndOfStartScreen + ; end of level (level up) + jsr NextLevel + jmp StartLoop +EndOfStartScreen + rts +.endp +;-------------------------------------------------- +.proc NextLife +;-------------------------------------------------- + ldy #maxBalls + sty eXistenZstackPtr + ;OK, one ball starts! + lda eXistenZstack,Y + dey + sty eXistenZstackPtr + tax + jsr randomStart ;just one random pixxxel + ;previously the whole band of ballz + rts +.endp +;-------------------------------------------------- +.proc NextLevel +;-------------------------------------------------- + lda LevelType + beq level000 + bmi levelTitle + ; load level from disk +loadNext + jsr FileUp + jsr LoadLevelData +levelTitle + jsr clearscreen + jsr BuildLevelFromBuffer + jsr initialize.ClearTables + rts ; start level +level000 + mva #1 LevelType ; switch to files + ; reset file number to 000 + ldx #2 +@ lda StartLevelNumber,x + sta LevelNumber,x + dex + bpl @- + jmp loadNext +.endp + +;-------------------------------------------------- +.proc LevelScreen +;-------------------------------------------------- + jsr MakeDarkScreen + ldx #2 +@ lda LevelNumber,x + sec + sbc #$20 + sta LevelText+16,x + dex + bpl @- + mwa #dl_level dlptrs + lda #@dmactl(standard|dma) ; normal screen width, DL on, P/M off + sta dmactls + pause 100 + rts +.endp +;-------------------------------------------------- +.proc GameOverScreen +;-------------------------------------------------- + jsr MakeDarkScreen + ldx #5 +@ lda score,x + sta OverText+33,x + dex + bpl @- + mwa #dl_over dlptrs + lda #%00110010 ; normal screen width, DL on, P/M off + sta dmactls + pause 20 + + rts +.endp +;-------------------------------------------------- +.proc MainScreen +;-------------------------------------------------- + jsr MakeDarkScreen + mwa #dl dlptrs + lda #$0 ;+GTIACTLBITS + sta GPRIOR + sta COLBAKS + lda #@dmactl(standard|dma) ; normal screen width, DL on, P/M off + sta dmactls + pause 1 + rts +.endp +;-------------------------------------------------- +.proc MakeDarkScreen +;-------------------------------------------------- + mva #0 dmactls ; dark screen + ; and wait one frame :) + pause 1 + rts +.endp +;-------------------------------------------------- +.proc PlayLevel +;-------------------------------------------------- loop - mva #maxBalls-1 currBall - jsr cycleColours + jsr cyclecolors flight @@ -208,10 +505,10 @@ flight lda memCycleTable,x clc adc #1 ;next position in the table - cmp #maxMemory - bne notMaxMem - lda #0 -notMaxMem + cmp #maxMemory + bne notMaxMem + lda #0 +notMaxMem sta memCycleTable,x ; memCycleTable saved tax lda xposMemTableAdrL,x @@ -238,23 +535,23 @@ notMaxMem ; deyxpos, deypos (.byte) - pixel position ;-------------------------------------------------- ; let's calculate coordinates from xpos and ypos - ;lda dexpos - lsr - tay + ;lda dexpos + lsr + tay ;--- - ;ldx deypos - lda lineAdrL,x - sta temp - lda lineAdrH,x - sta temp+1 + ;ldx deypos + lda lineAdrL,x + sta temp + lda lineAdrH,x + sta temp+1 - lda dexpos - and #$01 - tax + lda dexpos + and #$01 + tax - lda (temp),y - and debittable,x - sta (temp),y + lda (temp),y + and debittable,x + sta (temp),y ;move the ball!!! adw xpos dX xpos @@ -281,10 +578,13 @@ noTop bcc noBottom ; check if the ball hits the racquette + bit AutoPlay + bmi GoAuto lda CONSOL - and #%00000100 ; OPTION + and #@consol(option) ; OPTION bne bounceNormally - jmp bottomBounce ; turns off the ball kill +GoAuto + jmp bottomBounce ; turns off the ball kill bounceNormally lda ypos+1 @@ -342,6 +642,10 @@ bottomBounce ; sbw #$ffff dy dy ;this does not compile :( negw dY mva #maxLines+margin-2 ypos+1 + bit LevelType + bmi noPingSFX ; no SFX on title screen + mva #sfx_ping sfx_effect +noPingSFX noBottom @@ -369,133 +673,148 @@ noRight ; high byte is the integer position ; low byte is the "fractional" part ; let's calculate coordinates from xpos and ypos - lda xpos+1 - lsr - tay + lda xpos+1 + lsr + tay ;--- - ldx ypos+1 - lda lineAdrL,x - sta temp - lda lineAdrH,x - sta temp+1 + ldx ypos+1 + lda lineAdrL,x + sta temp + lda lineAdrH,x + sta temp+1 - ldx colour - - lda xpos+1 - and #$01 - bne pRightNibble + ldx color + + lda xpos+1 + and #$01 + bne pRightNibble pLeftNibble - lda (temp),y - sta collisionCheck - and #$0F - ora LNColtable,x - sta (temp),y - lda collisionCheck - and #$F0 - cmp #%10000000 - jne noCollision - jmp plotEnd ;unconditional branch + lda (temp),y + sta collisionCheck + and #$0F + ora LNColtable,x + sta (temp),y + lda collisionCheck + and #$F0 + cmp #%10000000 + jne noCollision + jmp plotEnd ;unconditional branch pRightNibble - lda (temp),y - sta collisionCheck - and #$F0 - ora RNColtable,x - sta (temp),y - lda collisionCheck - and #$0F - cmp #%00001000 - jne noCollision + lda (temp),y + sta collisionCheck + and #$F0 + ora RNColtable,x + sta (temp),y + lda collisionCheck + and #$0F + cmp #%00001000 + jne noCollision plotEnd - lda ypos+1 - cmp #maxLines+margin-2-1 - jcs noCollision ;ball is outside the screen! + lda ypos+1 + cmp #maxLines+margin-2-1 + jcs noCollision ;ball is outside the screen! - ;switch direction, Charles - ; an idea for assuming which direction to switch - dX or dY? - ; on a diagram below in the middle there is an approached brick + ;switch direction, Charles + ; an idea for assuming which direction to switch - dX or dY? + ; on a diagram below in the middle there is an approached brick /* - \ / - \-dY / - \ / - -dX [] -dX - / \ - /-dY \ - / \ -*/ - ; it means: - ; if |dX|>|dY| then dX == -dX - ; else dY == -dY - - ; get absolute values - lda dX+1 - bpl dXpositive + \ / + \-dY / + \ / + -dX [] -dX + / \ + /-dY \ + / \ +*/ + ; it means: + ; if |dX|>|dY| then dX == -dX + ; else dY == -dY + + ; get absolute values + lda dX+1 + bpl dXpositive ;dX is negative here - lda dY+1 - bpl dXneg_dYpos + lda dY+1 + bpl dXneg_dYpos ;dX and dY are negative here - cmp dX+1 - bcc dX_gr_dY__dX_dYneg - ; |dY| >= |dX| ; hour 5 - negw dY - jmp bounceDone + cmp dX+1 + bcc dX_gr_dY__dX_dYneg + ; |dY| >= |dX| ; hour 5 + negw dY + jmp bounceDone dX_gr_dY__dX_dYneg - ; hour 4 - negw dX - jmp bounceDone + ; hour 4 + negw dX + jmp bounceDone dXneg_dYpos - ; dY in A - clc - adc dX+1 - bpl dY_gr_dX__dXneg_dYpos - ; |dX| > |dy|; hour 2 - negw dX - jmp bounceDone + ; dY in A + clc + adc dX+1 + bpl dY_gr_dX__dXneg_dYpos + ; |dX| > |dy|; hour 2 + negw dX + jmp bounceDone dY_gr_dX__dXneg_dYpos - ; hour 1 - negw dY - jmp bounceDone + ; hour 1 + negw dY + jmp bounceDone dXpositive - lda dY+1 - bpl dX_dYpositive + lda dY+1 + bpl dX_dYpositive ;dX positive, dY negative - clc - adc dX+1 - bpl dX_gr_dY__dXpos_dYneg - ; hour 7 - negw dY - jmp bounceDone - + clc + adc dX+1 + bpl dX_gr_dY__dXpos_dYneg + ; hour 7 + negw dY + jmp bounceDone + dX_gr_dY__dXpos_dYneg - ; hour 8 - negw dX - jmp bounceDone - + ; hour 8 + negw dX + jmp bounceDone + dX_dYpositive - ;(dY+1)* is in A - cmp dX+1 - bcc dX_gr_dY__dX_dYpos - ; dY > dX ; hour 11 - negw dY - jmp bounceDone + ;(dY+1)* is in A + cmp dX+1 + bcc dX_gr_dY__dX_dYpos + ; dY > dX ; hour 11 + negw dY + jmp bounceDone dX_gr_dY__dX_dYpos - ; dY < dX ; hour 10 - negw dX + ; dY < dX ; hour 10 + negw dX bounceDone -;spawn the new bally - ; if there is still an empty slot for a new ball somewhere... - ;lda RANDOM - ;cmp #spawnProbability - ;bcs noCollision - lda colour - cmp #1 - bne noCollision + ; if Auto Play or OPTION key presset - no score + bit AutoPlay + bmi NoScoreUp + lda CONSOL + and #%00000100 ; OPTION + beq NoScoreUp + jsr ScoreUp +NoScoreUp + dew BricksInLevel + lda BricksInLevel + ora BricksInLevel+1 + bne NoLevelEnd + ; all bricks gone - level ended! + jmp GoNextLevel +NoLevelEnd + ;spawn the new bally + ; if there is still an empty slot for a new ball somewhere... + ;lda RANDOM + ;cmp #spawnProbability + ;bcs noCollision + lda color + cmp #1 + bne noCollision eXistenZcReate ;creates a new ball @@ -526,13 +845,13 @@ eXistenZcReate ; random initial speed and direction lda random bpl dXplus - - lda #-1 + + lda #-1 sta dxTableH,x bne dXlower dXplus - lda #1 + lda #1 sta dxTableH,x dXlower lda random @@ -541,19 +860,15 @@ dXlower ;randomize 1 maxSpeed-1 ;dy can not be too small or the game would take forever lda #1 - sta dyTableH,x + sta dyTableH,x lda random sta dyTableL,x - - - ; sound - ;lda random - ;and #%00001000 - ;lda #%00000000 - ;sta consol - - + ;pong + bit LevelType + bmi noPongSFX ; no SFX on title screen + mva #sfx_pong sfx_effect +noPongSFX noCollision noMoreSlots @@ -596,24 +911,31 @@ flightLoopEnd endOfBallzLoop - ;pause - + dec currBall jpl flight - pause 0;all balls - + pause 1 ;all balls + bit AutoPlay + bpl NoAuto + pause 1 ;additional pause if auto play mode (slower) + lda CONSOL + and #@consol(start) ; START + beq LevelOver ; Start pressed in Auto Play - exit + lda TRIG0 + beq LevelOver + +NoAuto lda eXistenZstackPtr cmp #maxBalls jne loop - - ;game over -gameOver - lda RANDOM - and #$07 - sta COLPM0 - jmp gameOver +LevelOver + ; level over + mva #$ff EndLevelFlag + jsr wait_for_depress + rts + ;------------------- ballDoesNotexist @@ -623,66 +945,74 @@ delayLoop dex bne delayLoop jmp endOfBallzLoop + +GoNextLevel + mva #0 EndLevelFlag ; level ended! + rts + +.endp ;-------------------------------------------------- -fatplot +.proc fatplot ; xpos, ypos (.byte) - pixel position ; xpos<80 -; pixel colour in "colour" +; pixel color in "color" ;-------------------------------------------------- ; let's calculate coordinates from xpos and ypos - lda xpos - lsr - tay + lda xpos + lsr + tay ;--- - ldx ypos - lda lineAdrL,x - sta temp - lda lineAdrH,x - sta temp+1 - - ldx colour + ldx ypos + lda lineAdrL,x + sta temp + lda lineAdrH,x + sta temp+1 + + ldx color - lda xpos - and #$01 - bne fpRightNibble + lda xpos + and #$01 + bne fpRightNibble fpLeftNibble - lda (temp),y - and #$0F - ora LNColtable,x - sta (temp),y - rts + lda (temp),y + and #$0F + ora LNColtable,x + sta (temp),y + rts fpRightNibble - lda (temp),y - and #$F0 - ora RNColtable,x - sta (temp),y - rts + lda (temp),y + and #$F0 + ora RNColtable,x + sta (temp),y + rts +.endp ;-------------------------------------------------- -fatdeplot +.proc fatdeplot ; deyxpos, deypos (.byte) - pixel position ;-------------------------------------------------- ; let's calculate coordinates from xpos and ypos - lda dexpos - lsr - tay + lda dexpos + lsr + tay ;--- - ldx deypos - lda lineAdrL,x - sta temp - lda lineAdrH,x - sta temp+1 + ldx deypos + lda lineAdrL,x + sta temp + lda lineAdrH,x + sta temp+1 - lda dexpos - and #$01 - tax + lda dexpos + and #$01 + tax - lda (temp),y - and debittable,x - sta (temp),y - rts + lda (temp),y + and debittable,x + sta (temp),y + rts +.endp ;-------------------------------------------------- -clearDeadBall +.proc clearDeadBall ;-------------------------------------------------- ;dead ball in clearBallNr @@ -712,49 +1042,161 @@ clearDeadLoop bpl clearDeadLoop rts +.endp ;-------------------------------------------------- -clearScreen +.proc ScoreUp ;-------------------------------------------------- - lda #0 - tax -Loopi1 + inc score+5 + lda score+5 + cmp #"9"+1 ; 9+1 character code + bne ScoreReady + lda #"0" ; 0 character code + sta score+5 + inc score+4 + lda score+4 + cmp #"9"+1 ; 9+1 character code + bne ScoreReady + lda #"0" ; 0 character code + sta score+4 + inc score+3 + lda score+3 + cmp #"9"+1 ; 9+1 character code + bne ScoreReady + lda #"0" ; 0 character code + sta score+3 + inc score+2 + ; bonus !!! :) + lda Lives + cmp #"9" + beq noLivesUP + inc Lives + mva #05 sfx_effect + mva #$ff COLBAKS + pause 2 ; sorry + inc COLBAKS +noLivesUP + ;---------- + lda score+2 + cmp #"9"+1 ; 9+1 character code + bne ScoreReady + lda #"0" ; 0 character code + sta score+2 + inc score+1 + lda score+1 + cmp #"9"+1 ; 9+1 character code + bne ScoreReady + lda #"0" ; 0 character code + sta score+1 + inc score +ScoreReady + rts +.endp +;-------------------------------------------------- +.proc ScoreClear +;-------------------------------------------------- + lda #"0" + ldx #4 +@ sta score,x + dex + bpl @- + rts +.endp +;-------------------------------------------------- +.proc HiScoreCheckWrite +; It checks if the score is greater than hiscore. +; If yes - rewrites the score to hiscore. +;-------------------------------------------------- + lda HiScore + cmp score + bcc higher1 + bne lower + lda HiScore+1 + cmp score+1 + bcc higher2 + bne lower + lda HiScore+2 + cmp score+2 + bcc higher3 + bne lower + lda HiScore+3 + cmp score+3 + bcc higher4 + bne lower + lda HiScore+4 + cmp score+4 + bcc higher5 + bne lower + lda HiScore+5 + cmp score+5 + bcc higher6 +lower + rts +higher1 + lda score + sta HiScore +higher2 + lda score+1 + sta HiScore+1 +higher3 + lda score+2 + sta HiScore+2 +higher4 + lda score+3 + sta HiScore+3 +higher5 + lda score+4 + sta HiScore+4 +higher6 + lda score+5 + sta HiScore+5 + rts +.endp +;-------------------------------------------------- +.proc clearScreen +;-------------------------------------------------- + lda #0 + tax +@ :(maxLines*40/256+1) sta display+$100*#,x - inx - bne Loopi1 - rts + inx + bne @- + rts +.endp ;-------------------------------------------------- -cycleColoursReset - ldy #6 +.proc cyclecolorsReset +;-------------------------------------------------- + ldy #6 cycleRloop - lda colourCycleTabReset,y - sta colourCycleTab,y - dey - bpl cycleRloop - mva #0 colour + lda colorCycleTabReset,y + sta colorCycleTab,y + dey + bpl cycleRloop + mva #0 color +.endp ;-------------------------------------------------- -cycleColours +.proc cyclecolors ;-------------------------------------------------- - inc colour - lda colour - cmp #8 - bne noColourReset - mva #1 colour -noColourReset - ldy #6 + inc color + lda color + cmp #8 + bne nocolorReset + mva #1 color +nocolorReset + ldy #6 cycleCloop - lda colourCycleTab,y - ;sta COLPM1,y - sta COLPM1S,y - dey - bpl cycleCloop + lda colorCycleTab,y + ;sta COLPM1,y + sta PCOLR1,y + dey + bpl cycleCloop -;shift colours +;shift colors /* - 2 - 2 4 - 2 4 6 - 2 4 6 8 - 2 4 6 8 10 + 2 + 2 4 + 2 4 6 + 2 4 6 8 + 2 4 6 8 10 2 4 6 8 10 12 2 4 6 8 10 12 14 4 6 8 10 12 14 2 @@ -765,110 +1207,124 @@ cycleCloop 14 2 4 6 8 10 12 2 4 6 8 10 12 14 4 6 8 10 12 14 -6 8 10 12 14 -8 10 12 14 -10 12 14 -12 14 -14 +6 8 10 12 14 +8 10 12 14 +10 12 14 +12 14 +14 261 262 263 264 265 266 267 */ -cct = colourCycleTab - ldx cct+6 - mva cct+5 cct+6 - mva cct+4 cct+5 - mva cct+3 cct+4 - mva cct+2 cct+3 - mva cct+1 cct+2 - mva cct+0 cct+1 - stx cct+0 +cct = colorCycleTab + ldx cct+6 + mva cct+5 cct+6 + mva cct+4 cct+5 + mva cct+3 cct+4 + mva cct+2 cct+3 + mva cct+1 cct+2 + mva cct+0 cct+1 + stx cct+0 - rts -colourCycleTab - - .by 14,2,4,6,8,10,12 - -colourCycleTabReset - .by 14,2,4,6,8,10,12 -brickColourTab - .by 0 + rts +.endp ;-------------------------------------------------- -initialize -;-------------------------------------------------- - - mva #$00 COLPM0S ; = $02C0 ;- - rejestr-cień COLPM0 +colorCycleTab + + .by 14,2,4,6,8,10,12 + +colorCycleTabReset + .by 14,2,4,6,8,10,12 +brickcolorTab + .by 0 + +;-------------------------------------------------- +.proc AudioInit +;-------------------------------------------------- + ; pokeys init + lda #3 + sta skctl ; put Pokey into Init + sta skctl+$10 + ldx #8 + lda #0 +@ + sta $D200,x ; clear all voices, set AUDCTL to 00 + sta $D210,x ; clear all voices, set AUDCTL to 00 + dex + bpl @- + rts +.endp +;-------------------------------------------------- +.proc initialize +;-------------------------------------------------- + + mva #>font CHBAS + mva #$00 PCOLR0 ; = $02C0 ;- - rejestr-cień COLPM0 + + mva #$7C COLBAKS + + mva #screenWidth/2-racquetSize/4 racquetPos - jsr cycleColoursReset - - mva #$7C COLBAKS - mva #0 dliCount - jsr clearscreen - jsr drawBricks - - lda dmactls - and #$fc - ora #$02 ; normal screen width - ;ora #$01 ; narrow screen width + sta RMT_blocked + + lda #$ff + sta sfx_effect + + JSR AudioInit + + ;RMT INIT + ldx #MODUL ;hi byte of RMT module to Y reg + lda #0 ;starting song line 0-255 to A reg + jsr RASTERMUSICTRACKER ;Init + + + lda #@dmactl(standard|dma) sta dmactls mwa #dl dlptrs - vdli DLI + vdli DLI +ClearTables + jsr cyclecolorsReset + mwa #clear_vars_start temp + ldy #0 +@ + tya + sta (temp),y + inw temp + cpw temp #clear_vars_end + bne @- ; prepare mem address tables (for "snake" routine) - - ;first address initialized - mva #xposMemTable xposMemTableAdrH - mva #yposMemTable yposMemTableAdrH - ;now add maxBalls to the following addresses - ;just take the previous one and add "maxBalls" - ldx #0 + + ;first address initialized + mva #xposMemTable xposMemTableAdrH + mva #yposMemTable yposMemTableAdrH + ;now add maxBalls to the following addresses + ;just take the previous one and add "maxBalls" + ldx #0 initLoop1 - clc - lda xposMemTableAdrL,x - adc #maxBalls ; maxBalls <$80, so it is == 0 - sta xposMemTableAdrH+1,x - clc - lda yposMemTableAdrL,x - adc #maxBalls ; maxBalls <$80, so it is == 0 - sta yposMemTableAdrH+1,x - inx - cpx #maxMemory-1 - bne initLoop1 - ;snake memory addressess initialized! - - ;clear the balleXistenZ (nothing is bouncing!) - ;and other tables - ldx #0 - txa -eXistenZclearLoop - sta balleXistenZ,x - sta dxTableL,x - sta dxTableH,x - sta dyTableL,x - sta dyTableH,x - sta xposTableL,x - sta xposTableH,x - sta yposTableL,x - sta yposTableH,x - sta memCycleTable,x + clc + lda xposMemTableAdrL,x + adc #maxBalls ; maxBalls <$80, so it is == 0 + sta xposMemTableAdrH+1,x + clc + lda yposMemTableAdrL,x + adc #maxBalls ; maxBalls <$80, so it is == 0 + sta yposMemTableAdrH+1,x + inx + cpx #maxMemory-1 + bne initLoop1 - inx - cpx #maxBalls - bne eXistenZclearLoop - sta balleXistenZcatch - - - dex - ; X == maxBalls-1 + ldx #maxBalls-1 txa eXistenZstackFill sta eXistenZstack+1,x @@ -882,70 +1338,77 @@ eXistenZstackFill ;sty clearPtr - ;OK, one ball starts! - - ;ldy eXistenZstackPtr - lda eXistenZstack,Y - dey - sty eXistenZstackPtr - - tax - - - jsr randomStart ;just one random pixxxel - ;previously the whole band of ballz - - ;VBI - mva #screenWidth/2 racquetPos - vmain vint,7 - lda #$80 ;+GTIACTLBITS - sta GTIACTL - sta GTICTLS + ;OK, one ball starts! - mva #1 colour + ;ldy eXistenZstackPtr + lda eXistenZstack,Y + dey + sty eXistenZstackPtr + tax - rts + jsr randomStart ;just one random pixxxel + ;previously the whole band of ballz + + ;VBI + + vmain vint,7 + + mva #1 color + + rts +.endp ;-------------------------------------------------- -drawBricks +.proc drawBricks ;-------------------------------------------------- ; solid maxBrickLines field ; for x=margin to screenWidth-margin: ; for y=margin to maxBrickLines+margin: ; fatplot(x,y) - mva #8 colour - mva #margin*2 ypos + mva #8 color + mva #margin*2 ypos drawBricksLoopY - mva #margin*3 xpos + mva #margin*3 xpos drawBricksLoop - jsr fatplot - inc xpos - lda xpos - cmp #screenWidth-margin*3 - bne drawBricksLoop - inc ypos - lda ypos - cmp #maxBrickLines+margin*2 - bne drawBricksLoopY + jsr fatplot + inc xpos + lda xpos + cmp #screenWidth-margin*3 + bne drawBricksLoop + inc ypos + lda ypos + cmp #maxBrickLines+margin*2 + bne drawBricksLoopY - rts +; set number of bricks in this level + mwa #952 BricksInLevel + rts +.endp ;-------------------------------------------------- -randomStart +.proc randomStart ; X - ball number ;-------------------------------------------------- lda #1 sta balleXistenZ,x - ;randomize margin $ff-margin - lda #40 - sta xposTableH,x + ;randomize 10 70 + lda racquetPos + adc #2 ; do not care about curry, just move the baby to the right + sta xposTableH,x ;randomize margin*2+maxBrickLines maxLines-margin*4 - lda #30 - sta yposTableH,x + lda #54 + sta yposTableH,x ; random initial speed and direction ;randomize 0 maxSpeed-1 + lda random + and #%1 + beq xneg lda #1 ;easy start + bne @+ ; jmp +xneg + lda #-1 +@ sta dxTableH,x lda random sta dxTableL,x @@ -956,23 +1419,373 @@ randomStart lda #1 sta dyTableL,x rts +.endp ;-------------------------------------------------- +.proc FileUp +;-------------------------------------------------- + inc LevelNumber+2 + lda LevelNumber+2 + cmp #'9'+1 ; 9+1 character code + bne NumberReady + lda #'0' ; 0 character code + sta LevelNumber+2 + inc LevelNumber+1 + lda LevelNumber+1 + cmp #'9'+1 ; 9+1 character code + bne NumberReady + lda #'0' ; 0 character code + sta LevelNumber+1 + inc LevelNumber +NumberReady + rts +.endp +;-------------------------------------------------- +.proc LoadLevelData +;-------------------------------------------------- + lda LevelType + beq level000 + bmi levelTitle + ; load level from disk + ; prepare number in filename + ldx #2 +@ lda LevelNumber,x + sta fname+7,x + dex + bpl @- + ; clear buffer + mwa #LevelFileBuff temp + ldy #0 +@ tya + sta (temp),y + inw temp + cpw temp #LevelFileBuffEnd + bne @- + ; try to load file + jsr close + jsr open + bmi open_error + jsr bget + bmi bget_error +go_close jsr close + rts +bget_error + cpy #136 ; EOF + beq go_close +open_error + mva #0 LevelType ; set level to internal 000 +level000 + ; reset file number to 000 + ldx #2 +@ lda StartLevelNumber,x + sta LevelNumber,x + dex + bpl @- +levelTitle + rts +.endp +;-------------------------------------------------- +.proc BuildLevelFromBuffer +;-------------------------------------------------- + lda LevelType + beq level000 + bmi levelTitle + mwa #LevelFileBuff inlevel + jmp PrepareLevel +levelTitle + mwa #Menu_data inlevel + jmp PrepareLevel +level000 + mwa #Level000_data inlevel +PrepareLevel + ldy #0 + sty BricksInLevel + sty BricksInLevel+1 +nextnumber + lda (inlevel),y + inw inlevel + cmp #CR_PC ; skip PC CR + beq nextnumber + cmp #EOL ; Atari LF + beq nextnumber2 + cmp #LF_PC ; PC LF + beq nextnumber2 + ; check valid characters + ldx #9 +@ cmp Numbers,x + beq valid1 + dex + bpl @- + jmp LevelDataError +valid1 ; value in X register + ; now we must multiply BricksInLevel by 10 + asl BricksInLevel + rol BricksInLevel+1 + mwa BricksInLevel temp + asl BricksInLevel + rol BricksInLevel+1 + asl BricksInLevel + rol BricksInLevel+1 + adw temp BricksInLevel BricksInLevel + ; and add value + clc + txa + adc BricksInLevel + sta BricksInLevel + bcc @+ + inc BricksInLevel+1 +@ jmp nextnumber +nextnumber2 + sty BigBrickFlag ; #0 + lda (inlevel),y + inw inlevel + cmp #'1' + beq singlepixel + cmp #'2' + jne LevelDataError +doublepixel + dec BigBrickFlag ; #$ff +singlepixel + lda (inlevel),y + inw inlevel + cmp #CR_PC ; skip PC CR + beq singlepixel + cmp #EOL ; Atari LF + beq makeBricks + cmp #LF_PC ; PC LF + bne singlepixel +; make bricks +makeBricks + mwa #0 temp2 + mva #margin*2 ypos +drawBricksLoopY + mva #0 xpos +drawBricksLoop + ; get data + ldy #0 + lda (inlevel),y + beq LevelDataEnd ; if end of data + inw inlevel + cmp #CR_PC ; skip PC CR + beq drawBricksLoop + cmp #EOL ; Atari LF + beq EndOfLine + cmp #LF_PC ; PC LF + beq EndOfLine ; next line + cmp #' ' + beq NoBrick ; if no brick + ldy #8 + inw temp2 ; real number of bricks + bit BigBrickFlag + bpl OnePixel + inw temp2 ; real number of bricks +OnePixel +NoBrick + sty color + jsr fatplot + inc xpos + bit BigBrickFlag + bpl SmallBrick + jsr fatplot ; second bixel of big brick + inc xpos +SmallBrick + lda xpos + cmp #screenWidth + bne drawBricksLoop + ; if screenwidth is reached we skip all buffer characters up to EOL. + jsr skipToEOL +EndOfLine + inc ypos + lda ypos + cmp #maxlines + bne drawBricksLoopY +LevelDataEnd + cpw BricksInLevel temp2 + bcc BricksOK ; if defined bricks number is bigger tan real + mwa temp2 BricksInLevel ; set to real brick number +BricksOK + mwa #AllBlocks displayposition + mwa temp2 decimal + jsr displaydec5 + mwa #BlocksToHit displayposition + mwa BricksInLevel decimal + jsr displaydec5 + jsr cyclecolorsReset + rts +LevelDataError + ; errer in data - set level to o (internal) and draw level + mva #0 LevelType + jmp level000 +skipToEOL + ldy #0 + lda (inlevel),y + beq skipped ; if end of data + inw inlevel + cmp #EOL ; Atari LF + beq skipped + cmp #LF_PC ; PC LF + bne skipToEOL ; next data character +skipped + rts +.endp +;-------------------------------------------------- +.proc displaydec5 ;decimal (word), displayposition (word) +;-------------------------------------------------- +; displays decimal number as in parameters (in text mode) +; leading zeroes are removed +; the range is (00000..65565 - two bytes) + + ldy #4 ; there will be 5 digits +NextDigit + ldx #16 ; 16-bit dividee so Rotate 16 times + lda #$00 +Rotate000 + aslw decimal + rol ; scroll dividee + ; (as highest byte - additional - byte is A) + cmp #10 ; divider + bcc TooLittle000 ; if A is smaller than divider + ; there is nothing to substract + sbc #10 ; divider + inc decimal ; lowest bit set to 1 + ; because it is 0 and this is the fastest way +TooLittle000 dex + bne Rotate000 ; and Rotate 16 times, Result will be in decimal + tax ; and the rest in A + ; (and it goes to X because + ; it is our decimal digit) + lda digits,x + sta decimalresult,y + dey + bpl NextDigit ; Result again /10 and we have next digit + +;rightnumber + ; displaying without leading zeroes (if zeroes exist then display space at this position) + ldy #0 + ldx #0 ; digit flag (cut leading zeroes) +displayloop + lda decimalresult,y + cpx #0 + bne noleading0 + cpy #4 + beq noleading0 ; if 00000 - last 0 must stay + cmp zero + bne noleading0 + lda #space + beq displaychar ; space = 0 ! +noleading0 + inx ; set flag (no leading zeroes to cut) +displaychar + sta (displayposition),y +nexdigit + iny + cpy #5 + bne displayloop + + rts +.endp +;-------------------------------------------------- +.proc RmtSongSelect +; starting song line 0-255 to A reg +;-------------------------------------------------- +/* + cmp #song_main_menu + beq noingame ; noMusic blocks only ingame songs + bit noMusic + spl:lda #song_silencio +noingame +*/ + mvx #$ff RMT_blocked + ldx #MODUL ; hi byte of RMT module to Y reg + jsr RASTERMUSICTRACKER ; Init + mva #0 RMT_blocked + rts +.endp +;-------------------------------------------------- +.proc wait_for_depress ; ion +;-------------------------------------------------- + lda CONSOL + and:cmp #%00000111 + bne wait_for_depress + lda TRIG0 + beq wait_for_depress + rts +.endp +;-------------------------------------------------- +Menu_data + .byte '200',EOL ; number of bricks in ATASCII before success + .byte '1',EOL ; brick size in pixels + ; 0 1 2 3 4 5 6 7 + ; 01234567890123456789012345678901234567890123456789012345678901234567890123456789 + .byte EOL + .byte ' #### ## ## ####### ###### ## ##',EOL + .byte ' ###### ## ## ## ## ## ## ##',EOL + .byte ' ## ## ## ## ##### ###### ####',EOL + .byte ' ######## #### ## ## ## ##',EOL + .byte ' ## ## ## ####### ## ## ##',EOL + .byte EOL + .byte ' ##### ###### ####### #### ## ## ###### ## ## ########',EOL + .byte ' ## ## ## ## ## ###### ## ## ## ## ## ## ##',EOL + .byte ' ##### ###### ##### ## ## #### ## ## ## ## ##',EOL + .byte ' ## ## ## ## ## ######## ## ## ## ## ## ## ##',EOL + .byte ' ###### ## ## ####### ## ## ## ## ###### ###### ##',EOL + .byte EOL + .byte 0 +Level000_data + .byte '486',EOL ; '952',EOL ; number of bricks (pixes) in ATASCII to be taken out before success + .byte '2',EOL ; brick size in pixels + ; 0 1 2 3 + ; 0123456789012345678901234567890123456789 + .byte EOL,EOL,EOL + :14 .byte ' ##################################',EOL + .byte 0 +LevelFileBuff +LevelFileBuffLen=(screenWidth*maxLines)+20 + .ds LevelFileBuffLen ; Buffer for data from the level file +LevelFileBuffEnd +LevelNumber + .byte '000' +StartLevelNumber + .byte '000' +fname + .byte 'D:LEVEL000.DAT',EOL +;-------------------------------------------------- +EndLevelFlag + .byte 0 ; $ff - level over, $00 - level ended +BigBrickFlag + .byte 0 +BricksInLevel + .word 0 +temp2 + .word 0 +LevelType + .byte 0 ; level type $00 - first level, $01 - level from buffer, $ff - title screen +Numbers + .byte '0123456789' +digits +zero + .byte "0123456789" +space = 0 + .byte " " +decimal + .word 0 +decimalresult + .byte " " lineAdrL :margin .byte marginLine - :maxLines .byte >(display+40*#) - ;:margin .byte >marginLine - :256-maxLines-1*margin .by >marginLine; (display+40*#) ;just to let the plot smear on full .byte ypos - ; $E000 is an address in ROM - the trick to avoid spawning new balls! + :maxLines .byte >(display+screenBytes*#) + :256-maxLines-1*margin .by >marginLine ; (display+40*#) ;just to let the plot smear on full .byte ypos bittable .byte %11110000 +debittable .byte %00001111 -RNColtable ; Right Nibble Colour Table + .byte %11110000 +RNColtable ; Right Nibble color Table .byte %00000000 .byte %00000001 .byte %00000010 @@ -982,7 +1795,7 @@ RNColtable ; Right Nibble Colour Table .byte %00000110 .byte %00000111 .byte %00001000 -LNColtable ; Left Nibble Colour Table +LNColtable ; Left Nibble color Table .byte %00000000 .byte %00010000 .byte %00100000 @@ -992,10 +1805,8 @@ LNColtable ; Left Nibble Colour Table .byte %01100000 .byte %01110000 .byte %10000000 -debittable - .byte %00001111 - .byte %11110000 - +;-------------------------------- +clear_vars_start dxTableL :maxBalls .byte 0 dxTableH :maxBalls .byte 0 dyTableL :maxBalls .byte 0 @@ -1005,7 +1816,7 @@ xposTableL :maxBalls .byte 0 ; "fractional" part xposTableH :maxBalls .byte 0 ; "fractional" part yposTableL :maxBalls .byte 0 ; yposTableH :maxBalls .byte 0 ; -;ball position memory tables - the ball trace works like a "snake" +; ball position memory tables - the ball trace works like a "snake" ; (one set, one erased) ; there are "maxMemory" number of tables, "maxballs" length each ; too bad their addressess are not known in advance, @@ -1021,7 +1832,7 @@ xposMemTable :maxBalls*maxMemory .byte 0 yposMemTable :maxBalls*maxMemory .byte 0 -;addressess of the tables with +;addressess of the tables with snake pixels xposMemTableAdrL :maxMemory .byte 0 xposMemTableAdrH @@ -1033,6 +1844,8 @@ yposMemTableAdrH ;table for keeping the count on the last position to be deleted from the "snake" memCycleTable :maxBalls .byte 0 +clear_vars_end +;-------------------------------- statusBar dta d"rc$" hexDump @@ -1043,6 +1856,18 @@ dyDisp dta d" balls$" ballDisp dta d" " -marginLine :40 .byte 0 +marginLine .ds screenBytes +;-------------------------------- +; names of RMT instruments (sfx) +;-------------------------------- +sfx_ping = $07 +sfx_pong = $08 +;-------------------------------- +; RMT songs (lines) +;-------------------------------- +song_main_menu = $00 +song_ingame = $07 +song_game_over = $12 + RUN main diff --git a/averybreakout.xex b/averybreakout.xex new file mode 100644 index 0000000..659582f Binary files /dev/null and b/averybreakout.xex differ diff --git a/averybreakout_2012.xex b/averybreakout_2012.xex deleted file mode 100644 index 83e16c7..0000000 Binary files a/averybreakout_2012.xex and /dev/null differ diff --git a/changes.txt b/changes.txt deleted file mode 100644 index 60a15ff..0000000 --- a/changes.txt +++ /dev/null @@ -1,97 +0,0 @@ - -TODO -T021: balls are ferking stick to the right part of the screen... -T023: find and set few nice starting points and speeds to be rotated (remove not really sexy random start) -T025: do nice game over (when not clear) -T026: do nice "ALL CLEAR" screen - -T028: (idea) spinning the ball - when ball bounces the racquette when it is moving, dX adds or subs - -Changes: - -2012-02-16 -Fork to the colour version. (averybreakout.asm) Graphics mode tests. - - -build 023: 2010-06-26 - + idle ball delay loop shortened to 75 loops for a smoother experience -T027: when ball is down out of the screen and the racquette is over it, it bounces. - Need to add a check for it! (no bounces when out of the screen) - -build 022: 2010-06-24 -T022: when balls disappear, their traces should disappear, too, even when a new ball is NOT created - now the dead pixels disappear only when a new ball is created. - It has been done by expanding the bottom area, so the balls are going down. - Screen had to been cut 10 lines. Not a big deal. -T024: detect the ending - Detected (gameIsNotOver label). - - -build 021: 2010-06-21 -+ apparently the slowest part of the engine is eXistenZcheck - rewrite as a simple stack! - as usual, it was not as simple as thought previously... But works now! - Will be easier to clear traces of the dead balls now. - -build 020: 2010-06-02 -+ when the racquette is max to the right it does not bounce balls! -+ still problems with racquet - solved - pos+size was >$ff -+ very fast balls get through the left-right side borders - solved by a better usage of "maxSpeed" - -build 019: 2010-05-27 -+ alive balls are somewhere in the outer space - check where and fix - where: YposTableH -- 00 -- 08 most 01, XposTableH - FF, FE, 00, 01 - basicaly these are places where a ball should never be! - One fix let other "outer-space" related buggies die, too. - The problem was that bouncing ball got behind the border and started to bounce - there and forth outside the screen. Fix - bring it back on the playfield. -+ balls are created somewhere outside the screen -+ when balls disappear, their traces should disappear, too (now 1 pixel stays on screen) -+ high dX balls were sticking to Vborders. Fixed by increasing the margin - -build 018: 2010-05-26 -+ 1 pixel out of the deleted bunch stays forever (erase/store sequence was invalid) - - -build 017: 2010-05-25 -+ too few high dX balls -x low-priority: rewrite memorytables to use lda (zpage,x) addressing (cool:) - Turned out not to be such a low-priority job as wrong sequence of writes - to memorytables make one pixel staying on the screen. Rewrite to simplify! - Turned out that indirect X addressing is not good for it and this is closed. - -build 016: 2010-05-24 -Forgot about documenting updates... -Basically the game is close to the end, but number of small issues emerged. -+ racquette is too slow (and it was such a work to make it 1-px smooth...) - -build 006: 2010-05-12 -Collision detection -Ough... turned out to be way more difficult than expected, but now collisions are detected and balls are bouncing! - -build 005: 2010-05-10 -Snake like plot memory! Lots and lots of pixels, less balls (64 is the max...) - - -build 004: 2010-05-09 -Multiple ballz - - -build 003: 2010-05-08 -Feeling bouncy -simple boundary bounces work nicely. -Unfrtunately number of draws per frame dropped to circa 70. -I guess 64 will be an achievement for 2 frames. - -build 002: 2010-05-06 -MADS rewrite :-] -;bare plots get circa 320 pixels per frame. I will go for 128 pix max now - - -build 001: 2010-05-04 - -First try: -Strip scorch sources to get clean gr.8 screen. -(and PLOT) -Basic idea: http://wonderfl.net/c/tNGi/fullscreen diff --git a/levels/LEVEL001.DAT b/levels/LEVEL001.DAT new file mode 100644 index 0000000..09f5378 --- /dev/null +++ b/levels/LEVEL001.DAT @@ -0,0 +1 @@ +2002 #################################### #################################### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ########################## ########################## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #################################### #################################### \ No newline at end of file diff --git a/levels/LEVEL002.DAT b/levels/LEVEL002.DAT new file mode 100644 index 0000000..9db0130 --- /dev/null +++ b/levels/LEVEL002.DAT @@ -0,0 +1 @@ +3002 ########### ## ########### ########## #### ########## ######### ###### ######### ######## ######## ######## ####### ########## ####### ###### ############ ###### ##### ############## ##### #### ################ #### ### ################## ### ## #################### ## # ###################### # ######################## ######################## # ###################### # ## #################### ## ### ################## ### #### ################ #### ##### ############## ##### ###### ############ ###### ####### ########## ####### ######## ######## ######## ######### ###### ######### ########## #### ########## ########### ## ########### \ No newline at end of file diff --git a/levels/LEVEL003.DAT b/levels/LEVEL003.DAT new file mode 100644 index 0000000..a251ac8 --- /dev/null +++ b/levels/LEVEL003.DAT @@ -0,0 +1 @@ +1002 ######## ######## ########## ########## ############ ############ ###### ## #### ###### ## #### ###### ## #### ###### ## #### ###### ## #### ###### ## #### ################## ################## ## ########## ## ## ########## ## #### ###### #### #### ###### #### #### #### #### #### ############## ############## ########## ########## \ No newline at end of file diff --git a/levels/LEVEL004.DAT b/levels/LEVEL004.DAT new file mode 100644 index 0000000..c5cd954 --- /dev/null +++ b/levels/LEVEL004.DAT @@ -0,0 +1,24 @@ +80 +1 + + #### #### #### + #### #### #### + #### #### #### + #### #### #### + #### #### #### + #### #### #### + #### #### #### + ### #### ### + ### #### ### + #### #### #### + #### #### #### + #### #### #### + #### #### #### + #### #### #### + #### #### #### + #### #### #### + ##### #### ##### + ###### #### ###### + ###### #### ###### + ##### #### ##### + #### #### #### diff --git a/levels/LEVEL005.DAT b/levels/LEVEL005.DAT new file mode 100644 index 0000000..64bc80d --- /dev/null +++ b/levels/LEVEL005.DAT @@ -0,0 +1,18 @@ +100 +1 + + ###### + ############ + ############## + ####### # + ###### ####### + ###### ##### + ###### ## + ###### + ###### ## + ###### ##### + ###### ####### + ###### # + ############## + ############ + ###### diff --git a/levels/LEVEL006.DAT b/levels/LEVEL006.DAT new file mode 100644 index 0000000..7c0f334 --- /dev/null +++ b/levels/LEVEL006.DAT @@ -0,0 +1,18 @@ +111 +1 + + ####### # # # # # # # # # ####### # # + # # # # # ## # # # # # # # # # + # # # # # # # # # # # # # # # # + # ####### # # # # # ### # # # # # + # # # ####### # # # # # # # # # # + # # # # # # ## # # # # # # # + # # # # # # # # # # ####### ##### + + # # # ####### ###### # # + # # # # # # # # # + # # # # # # # # # + # # # # ##### ###### # + ####### # # # # # # + # # # # # # # # + # # # ####### # # # diff --git a/lib/5200MACRO.ASM b/lib/5200MACRO.ASM new file mode 100644 index 0000000..7747352 --- /dev/null +++ b/lib/5200MACRO.ASM @@ -0,0 +1,161 @@ +;------------------------------------- + .MACRO ROLW + ROL :1 + ROL :1+1 + .ENDM +;------------------------------------- + .MACRO ASLW + ASL :1 + ROL :1+1 + .ENDM +;------------------------------------- + .MACRO RORW + ROR :1+1 + ROR :1 + .ENDM +;------------------------------------- + .MACRO LSRW + LSR :1+1 + ROR :1 + .ENDM + +;------------------------------------- + .MACRO VMAIN +; VMAIN #WORD,interrupt.vector +; interrupt.vector: +; 0 - VIMIRQ +; 1 - TIMCNT1 +; 2 - TIMCNT2 +; 3 - TIMCNT3 +; 4 - TIMCNT4 +; 5 - TIMCNT5 +; 6 - VVBLKI +; 7 - VVBLKD +; 8 - TIMVEC1 +; 9 - TIMVEC2 +; Initialises Vertical Blank Interrupts +; (works only with system interrupts ON) +;---------- +; on 5200 it sets up deferred VBL ONLY for now + sei + lda #$00 ;Disable all interruptes + sta nmien + sta irqen + +@ lda vcount + bne @- + mwa #:1 VVBLKD + mva #$40 nmien + ;Enable IRQ interrupts + sta pokmsk + sta irqen + cli + + .ENDM +;------------------------------------- + .MACRO VDLI +; VDLI #WORD +; Initialises Display List Interrupts + mwa #:1 VDSLST + mva #$C0 NMIEN + .ENDM +;------------------------------------- + .MACRO halt +?stop + lda RANDOM + and #$05 + sta COLBAK + jmp ?stop + .ENDM +;------------------------------------- + .MACRO KEY +; KEY +; waits for releasing and pressing "any key" + + .ENDM +;------------------------------------- + .MACRO WAIT +; WAIT +; waits one frame (1/50 s(PAL) or 1/60s(NTSC)) +?ze LDA VCOUNT + cmp #16 ; if line<16 then wait for line>15 (long VBI protection) + bcc ?ze + sbc #10 ; last lines correction +?wa cmp VCOUNT + bcc ?wa +?wf cmp VCOUNT + bcs ?wf + .ENDM +;------------------------------------- + .macro waitRTC + lda RTCLOK+1 +?wa cmp RTCLOK+1 + beq ?wa + .endm +;------------------------------------- + .macro negw + ; negate the given word (0-a) +;------------------------------------- + sec + lda #$00 + sbc :1 + sta :1 + lda #$00 + sbc :1+1 + sta :1+1 + .endm +;------------------------------------- + .macro randomize + ;usage: randomize floor ceiling + ;returns (in A) a random .byte between "floor" and "ceiling" + .if :2 < :1 + .error "floor higher than ceiling" + .endif +?rand + lda random + cmp #:2+1-:1 ;ceiling + bcs ?rand + .if %1>0 ; if floor = 0 - no add offset + adc #:1 + .endif + .endm +;------------------------------------- + .macro phx + txa + pha + .endm +;------------------------------------- + .macro phy + tya + pha + .endm +;------------------------------------- + .macro plx + pla + tax + .endm +;------------------------------------- + .macro ply + pla + tay + .endm +;------------------------------------- + .macro txy + txa + tay + .endm +;------------------------------------- + .macro tyx + tya + tax + .endm +;------------------------------------- + .macro pause + ;waits :1 number (byte) of frames + ldx #:1 +?PAUSELOOP + wait + dex + bne ?PAUSELOOP + .ENDM + diff --git a/lib/5200SYS.ASM b/lib/5200SYS.ASM new file mode 100644 index 0000000..0ad696b --- /dev/null +++ b/lib/5200SYS.ASM @@ -0,0 +1,272 @@ +;**************************************************************************** +;* ATARI 5200 CONSOLE * +;* SYSTEM EQUATES * +;**************************************************************************** +; based on https://web.archive.org/web/20200831200348/http://www.atarimuseum.com/videogames/consoles/5200/conv_to_5200.html +; +; OS VARIABLES FOR 5200 +; +; PAGE 0 +POKMSK = $00 ;pokmsk at $00 on Atari 5200 instead of $10 on Atari XL +RTCLOK = $01 ;Actually $01/$02 +CRITIC = $03 +ATRACT = $04 ;attact at $04 on Atari 5200 instead of $4D on Atari XL +DLPTRS = $05 ;DLPTRS at $05/$06 on Atari 5200 instead of $230 on Atari XL +DMACTLS = $07 ;DMACTLS at $07 on Atari 5200 instead of $22f on Atari XL +SSKCTL = skctl ;There is no shadow on Atari 5200 +PCOLR0 EQU $08 ;P0 COLOR +PCOLR1 EQU $09 ;P1 COLOR +PCOLR2 EQU $0a ;P2 COLOR +PCOLR3 EQU $0b ;P3 COLOR +COLOR0 EQU $0c ;COLOR 0 +COLOR1 EQU $0d +COLOR2 EQU $0e +COLOR3 EQU $0f +COLOR4 EQU $10 +COLBAKS EQU COLOR4 +PADDL0 EQU $11 +PADDL1 EQU $12 +PADDL2 EQU $13 +PADDL3 EQU $14 +PADDL4 EQU $15 +PADDL5 EQU $16 +PADDL6 EQU $17 +PADDL7 EQU $18 +STICK0 = $19 ;There is no stick0 but we will make the analog stick look like a digital one and store it here +STRIG0 = $1a ;There is no strig0 but we will make this the shadow of the TRIG0 ($c010) of GTIA +chbas = $1b ;There is no CHBAS but we will make this the shadow of the CHBASE +CONSOL = $1c ;There are no console keys on Atari 5200, so we replace console h/w reads with a new shadow based on the keypad keys +consol_reset = $07;The constant value representing that no consol key is pressed +kbcode = $1d ;There is no keyboard on the Atari 5200, so replace kbcode h/w reads with a byte variable read based on the keypad keys + +; PAGE 2 +VIMIRQ EQU $0200 ;IMMED IRQ VECTOR +VVBLKI EQU $0202 ;IMM VBLK NMI VECTOR +VVBLKD EQU $0204 ;DEF VBLK NMI VECTOR +VDSLST EQU $0206 ;DSP LIST NMI VECTOR +VKEYBD EQU $0208 ;POKEY KB IRQ VECTOR +VKEYCNT EQU $020A ;Keypad routine continuation vector +BRKKY EQU $023C ;BREAK KEY VECTOR +VBREAK EQU $020E ;BRK INST IRQ VECTOR +VSERIN EQU $0210 ;POKEY INPUT RDY IRQ +VSEROR EQU $0212 ;POKEY OUTPUT RDY +VSEROC EQU $0214 ;POKEY OUTPUT DONE +VTIMR1 EQU $0216 ;POKEY TIMER 1 IRQ +VTIMR2 EQU $0218 ;POKEY TIMER 2 IRQ +VTIMR4 EQU $021A ;POKEY TIMER 4 IRQ + + +ROM_SETTINGS = $bfe8 ; game ROM info start (24 bytes total, 20b title, 2b year, 2b start vector) + +; HARDWARE REGISTERS + +; --------------------------------------------------------------------------- +POKEY EQU $EB00 +; --------------------------------------------------------------------------- +; +; READ +; +POT0 EQU POKEY+$00 +POT1 EQU POKEY+$01 +POT2 EQU POKEY+$02 +POT3 EQU POKEY+$03 +POT4 EQU POKEY+$04 +POT5 EQU POKEY+$05 +POT6 EQU POKEY+$06 +POT7 EQU POKEY+$07 +ALLPOT EQU POKEY+$08 +KBCODE_5200 EQU POKEY+$09 +RANDOM EQU POKEY+$0a +POTGO EQU POKEY+$0b +SERIN EQU POKEY+$0d +IRQST EQU POKEY+$0e +SKSTAT EQU POKEY+$0f +; +; WRITE +; +AUDF1 EQU POKEY+$00 +AUDC1 EQU POKEY+$01 +AUDF2 EQU POKEY+$02 +AUDC2 EQU POKEY+$03 +AUDF3 EQU POKEY+$04 +AUDC3 EQU POKEY+$05 +AUDF4 EQU POKEY+$06 +AUDC4 EQU POKEY+$07 +AUDCTL EQU POKEY+$08 +STIMER EQU POKEY+$09 +SKRES EQU POKEY+$0a +SEROUT EQU POKEY+$0d +IRQEN EQU POKEY+$0e +SKCTL EQU POKEY+$0f +; +; +; +; --------------------------------------------------------------------------- +GTIA EQU $C000 +; --------------------------------------------------------------------------- +; +; WRITE +; +HPOSP0 EQU GTIA+$00 +HPOSP1 EQU GTIA+$01 +HPOSP2 EQU GTIA+$02 +HPOSP3 EQU GTIA+$03 +HPOSM0 EQU GTIA+$04 +HPOSM1 EQU GTIA+$05 +HPOSM2 EQU GTIA+$06 +HPOSM3 EQU GTIA+$07 +SIZEP0 EQU GTIA+$08 +SIZEP1 EQU GTIA+$09 +SIZEP2 EQU GTIA+$0a +SIZEP3 EQU GTIA+$0b +SIZEM EQU GTIA+$0c +GRAFP0 EQU GTIA+$0d +GRAFP1 EQU GTIA+$0e +GRAFP2 EQU GTIA+$0f +GRAFP3 EQU GTIA+$10 +GRAFM EQU GTIA+$11 +COLPM0 EQU GTIA+$12 +COLPM1 EQU GTIA+$13 +COLPM2 EQU GTIA+$14 +COLPM3 EQU GTIA+$15 +COLPF0 EQU GTIA+$16 +COLPF1 EQU GTIA+$17 +COLPF2 EQU GTIA+$18 +COLPF3 EQU GTIA+$19 +COLBAK EQU GTIA+$1a +PRIOR EQU GTIA+$1b +GPRIOR = PRIOR ; no PRIOR shadow (GPRIOR) +VDELAY EQU GTIA+$1c +GRACTL EQU GTIA+$1d +HITCLR EQU GTIA+$1e +CONSOL5200 EQU GTIA+$1f ; no CONSOL in 5200 +; +; READ +; +M0PF EQU GTIA+$00 +M1PF EQU GTIA+$01 +M2PF EQU GTIA+$02 +M3PF EQU GTIA+$03 +P0PF EQU GTIA+$04 +P1PF EQU GTIA+$05 +P2PF EQU GTIA+$06 +P3PF EQU GTIA+$07 +M0PL EQU GTIA+$08 +M1PL EQU GTIA+$09 +M2PL EQU GTIA+$0a +M3PL EQU GTIA+$0b +P0PL EQU GTIA+$0c +P1PL EQU GTIA+$0d +P2PL EQU GTIA+$0e +P3PL EQU GTIA+$0f +TRIG0 EQU GTIA+$10 +TRIG1 EQU GTIA+$11 +TRIG2 EQU GTIA+$12 +TRIG3 EQU GTIA+$13 +PAL EQU GTIA+$14 +; +; +; --------------------------------------------------------------------------- +ANTIC EQU $D400 +; --------------------------------------------------------------------------- +; +DMACTL EQU ANTIC+$00 +CHACTL EQU ANTIC+$01 +DLPTR EQU ANTIC+$02 +;DLISTH EQU ANTIC+$03 +HSCROL EQU ANTIC+$04 +VSCROL EQU ANTIC+$05 +PMBASE EQU ANTIC+$07 +CHBASE EQU ANTIC+$09 +WSYNC EQU ANTIC+$0a +VCOUNT EQU ANTIC+$0b +PENH EQU ANTIC+$0c +PENV EQU ANTIC+$0d +NMIEN EQU ANTIC+$0e +NMIRES EQU ANTIC+$0f +NMIST EQU ANTIC+$0f +; +; --------------------------------------------------------------------------- +; Atari ANTIC chip display list equates +; --------------------------------------------------------------------------- +; +JUMP EQU $01 ; display list jump instruction (3 byte) +JVB EQU $41 ; display list jump and wait for vblank instruction (3) +; +SCH EQU $10 ; display list horizontal scrolling +SCV EQU $20 ; display list vertical scrolling +LMS EQU $40 ; display list load memory scan instruction (3 byte) +DLII EQU $80 ; display list interrupt instruction +; +SKIP1 EQU $00 ; display list skip 1 scan line instruction +SKIP2 EQU $10 ; display list skip 2 scan lines instruction +SKIP3 EQU $20 ; display list skip 3 scan lines instruction +SKIP4 EQU $30 ; display list skip 4 scan lines instruction +SKIP5 EQU $40 ; display list skip 5 scan lines instruction +SKIP6 EQU $50 ; display list skip 6 scan lines instruction +SKIP7 EQU $60 ; display list skip 7 scan lines instruction +SKIP8 EQU $70 ; display list skip 8 scan lines instruction +; +MODE2 EQU $02 ; display list mode 2 +MODE4 EQU $04 ; display list mode 4 +MODE8 EQU $08 ; display list mode 8 +MODEE EQU $0E ; display list mode E +MODEF EQU $0F ; display list mode F +; --------------------------------------------------------------------------- +; ENUMS +; --------------------------------------------------------------------------- + +.enum @dmactl + blank = %00 + narrow = %01 + standard= %10 + wide = %11 + missiles= %100 + players = %1000 + lineX1 = %10000 + lineX2 = %00000 + dma = %100000 +.ende + +scr48 = @dmactl(wide|dma|players|missiles|lineX1) +scr40 = @dmactl(standard|dma|players|missiles|lineX1) +scr32 = @dmactl(narrow|dma|players|missiles|lineX1) + +.enum @pmcntl + missiles= %1 + players = %10 + trigs = %100 +.ende + +.enum @gtictl + prior0 = %0 + prior1 = %1 + prior2 = %10 + prior4 = %100 + prior8 = %1000 + ply5 = %10000 ; Fifth Player Enable + mlc = %100000 ; Multiple Color Player Enable + mode9 = %01000000 + mode10 = %10000000 + mode11 = %11000000 +.ende +/* +; commented out to be replaced by the application specific A800 --> 5200 keypad translation +.enum @kbcode + _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _asterisk = $0a + _hash = $0b + _start = $0c + _pause = $0d + _reset = $0e +.ende +*/ \ No newline at end of file diff --git a/lib/ATARISYS.ASM b/lib/ATARISYS.ASM new file mode 100644 index 0000000..7b11904 --- /dev/null +++ b/lib/ATARISYS.ASM @@ -0,0 +1,738 @@ +;**************************************************************************** +;* ATARI PERSONAL COMPUTER * +;* SYSTEM EQUATES * +;**************************************************************************** +; +; OPERATING SYSTEM EQUATE FILE +; +; MODULE ORIGIN TABLE +; +; VECTOR TABLE +; +; HANDLER ENTRY POINTS ARE CALL- +; ED OUT IN THE FOLLOWING VECTOR +; TABLE. THESE ARE THE ADDRESSES +; MINUS ONE. +; +; EXAMPLE FOR EDITOR +; +; E400 OPEN +; 2 CLOSE +; 4 GET +; 6 PUT +; 8 STATUS +; A SPECIAL +; C JUMP TO POWER ON INIT +; F NOT USED +; +EDITRV EQU $E400 ;EDITOR +SCRENV EQU $E410 ;TV SCREEN +KEYBDV EQU $E420 ;KEYBOARD +PRINTV EQU $E430 ;PRINTER +CASETV EQU $E440 ;CASSETTE +; +; JUMP VECTOR TABLE +; +; THE FOLLOWING IS A TABLE OF +; JUMP INSTRUCTIONS TO VARIOUS +; ENTRY POINTS IN THE OPERATING +; SYSTEM +; +DISKIV EQU $E450 ;DISK INITIALIZATION +DSKINV EQU $E453 ;DISK INTERFACE +CIOV EQU $E456 ;CENTRAL I/O ROUTINE +SIOV EQU $E459 ;SERIAL I/O ROUTINE +SETVBV EQU $E45C ;SET SYSTEM TIMERS +SYSVBV EQU $E45F ;VBLANK CALCULATIONS +XITVBV EQU $E462 ;EXIT VBLANK +SIOINV EQU $E465 ;SIO INITIALIZATION +SENDEV EQU $E468 ;SEND ENABLE ROUTINE +INTINV EQU $E46B ;INTRPT HANDLER INIT +CIOINV EQU $E46E ;CIO INITIALIZATION +BLKBDV EQU $E471 ;BLACKBOARD MODE +WARMSV EQU $E474 ;WARM START VECTOR +COLDSV EQU $E477 ;COLD START VECTOR +RBLOKV EQU $E47A ;CASSETTE READ BLOCK +CSOPIV EQU $E47D ;CASSETTE INPUT OPEN +; +; VECTORS ADDED FOR 800XL +; +PUPDIV EQU $E480 ;POWER UP DISPLAY +SLFTSV EQU $E483 ;SELF TEST PROGRAM +PHENTV EQU $E486 ;UPLOADED HANDLER ENTER +PHULNV EQU $E489 ;UPLOADED HANDLER UNLINK +PHINIV EQU $E48C ;UPLOADED HANDLER INIT +; +; OPERATING SYSTEM EQUATES +; +; COMMAND CODES FOR IOCBS +; +_OPEN EQU $03 ;OPEN FOR I/O +GETREC EQU $05 ;GET RECORD (TEXT) +GETCHR EQU $07 ;GET CHARACTER(S) +PUTREC EQU $09 ;PUT RECORD (TEXT) +PUTCHR EQU $0B ;PUT CHARACTER(S) +_CLOSE EQU $0C ;CLOSE DEVICE +STATIS EQU $0D ;STATUS REQUEST +SPECIL EQU $0E ;SPECIAL ENTRY COMMAND +; +; SPECIAL ENTRY COMMANDS +; +DRAWLN EQU $11 ;DRAW LINE +FILLIN EQU $12 ;FILL +RENAME EQU $20 ;RENAME DISK FILE +DELETE EQU $21 ;DELETE DISK FILE +FORMAT EQU $22 ;FORMAT DISK +LOCKFL EQU $23 ;LOCK FILE +UNLOCK EQU $24 ;UNLOCK FILE +POINT EQU $25 ;POINT SECTOR +NOTE EQU $26 ;NOTE SECTOR +IOCFRE EQU $FF ;IOCB "FREE" +; +; AUX1 EQUATES +; () INDICATES WHICH DEVICES +; +APPEND EQU $01 ;WR APPEND(D)-SCN RD(E) +DIRECT EQU $02 ;OPEN DIRECTORY(D) +OPNIN EQU $04 ;OPEN FOR INPUT(ALL) +OPNOT EQU $08 ;OPEN FOR OUTPUT(ALL) +OPNINO EQU $0C ;OPEN INPUT&OUTPUT(ALL) +MXDMOD EQU $10 ;OPEN MIXED MODE(E,S) +INSCLR EQU $20 ;OPEN W/O CLEAR(E,S) +; +; DEVICE NAMES +; +SCREDT EQU 'E' ;SCREEN EDITOR (R/W) +KBD EQU 'K' ;KEYBOARD (R ONLY) +DISPLY EQU 'S' ;SCREEN DISPLAY (R/W) +PRINTR EQU 'P' ;PRINTER (W ONLY) +CASSET EQU 'C' ;CASSETTE (R/W) +RS232 EQU 'R' ;MODEM (R/W) +DISK EQU 'D' ;DISK (R/W) +; +; +; +; OPERATING SYSTEM STATUS CODES +; +SUCCES EQU $01 ;SUCCESSFUL OPERATION +BRKABT EQU $80 ;BREAK KEY ABORT +PRVOPN EQU $81 ;IOCB ALREADY OPEN +NONDEV EQU $82 ;NON-EXISTANT DEVICE +WRONLY EQU $83 ;IOCB OPEN FOR W ONLY +NVALID EQU $84 ;INVALID COMMAND +NOTOPN EQU $85 ;DEVICE/FILE NOT OPEN +BADIOC EQU $86 ;INVALID IOCB # +RDONLY EQU $87 ;IOCB OPEN FOR R ONLY +EOFERR EQU $88 ;END OF FILE +TRNRCD EQU $89 ;TRUNCATED RECORD +TIMOUT EQU $8A ;PERIPHERAL TIMEOUT +DNACK EQU $8B ;DEVICE NO ACKNOWLEDGE +FRMERR EQU $8C ;SERIAL BUS FRAME ERR +CRSROR EQU $8D ;CURSOR OVERRANGE +OVRRUN EQU $8E ;SERIAL DATA OVERRUN +CHKERR EQU $8F ;SERIAL CHECKSUM ERR +DERRER EQU $90 ;PERIPHRAL DEVICE ERR +BADMOD EQU $91 ;BAD SCREEN MODE # +FNCNOT EQU $92 ;NONEXISTANT FUNCTION +SCRMEM EQU $93 ;SCREEN MEM TOO SMALL +FILENF EQU $AA ;FILE NOT FOUND +; +; PAGE ZERO RAM ASSIGNMENTS +; +LNFLG EQU $00 ;LINBUG RAM +NGFLAG EQU $01 ;POWER-UP SELF-TEST FLAG +; +; THESE LOCATIONS NOT CLEARED +; +CASINI EQU $02 ;CASSETTE INIT LOC +RAMLO EQU $04 ;RAM POINTER MEM TST +TRAMSZ EQU $06 ;TEMP REG RAM SIZE +TSTDAT EQU $07 ;RAM TEST DATA REG +; +;CLEARED ON COLDSTART ONLY +; +WARMST EQU $08 ;WARM START FLAG +BOOTQ EQU $09 ;SUCCESSFUL BOOT FLG +DOSVEC EQU $0A ;DOS START VECTOR +DOSINI EQU $0C ;DOS INIT ADDRESS +APPMHI EQU $0E ;APPL MEM HI LIMIT +; +;CLEARED ON COLD OR WARM START +; +POKMSK EQU $10 ;MASK POKEY IRQ +BRKKEY EQU $11 ;BREAK KEY FLAG +RTCLOK EQU $12 ;REAL TIME CLOCK +BUFADR EQU $15 ;INDIRECT BUFF ADDR +ICCOMT EQU $17 ;COMMAND FOR VECTOR +DSKFMS EQU $18 ;FMS POINTER +DSKUTL EQU $1A ;DISK UTILITIES PTR +ABUFPT EQU $1C ;RESERVED +ICHIDZ EQU $20 ;HANDLER INDEX # +ICDNOZ EQU $21 ;DEVICE NUMBER +ICCOMZ EQU $22 ;COMMAND CODE +ICSTAZ EQU $23 ;STATUS RETURN +ICBALZ EQU $24 ;BUFFER ADDRESS +ICBAHZ EQU $25 +ICPTLZ EQU $26 ;PUT BYTE ROUTINE-1 +ICPTHZ EQU $27 +ICBLLZ EQU $28 ;BUFFER LENGTH +ICBLHZ EQU $29 +ICAX1Z EQU $2A ;AUXILIARY BYTES +ICAX2Z EQU $2B +ICSPRZ EQU $2C ;SPARE BYTES +ICIDNO EQU $2E ;IOCB # X 16 +CIOCHR EQU $2F ;CIO CHARACTER BYTE +STATUS EQU $30 ;INTERNAL STATUS +CHKSUM EQU $31 ;CHECKSUM +BUFRLO EQU $32 ;DATA BUFFER LO BYTE +BUFRHI EQU $33 ;DATA BUFFER HI BYTE +BFENLO EQU $34 ;NEXT BYTE PAST DATA +BFENHI EQU $35 ;BUFFER (HI & LO) +LTEMP EQU $36 ;LOADER TEMP +BUFRFL EQU $38 ;DATA BUFFR FULL FLG +RECVDN EQU $39 ;RECIEVE DONE FLAG +XMTDON EQU $3A ;XMIT DONE FLAG +CHKSNT EQU $3B ;CHECKSUM SENT FLAG +NOCKSM EQU $3C ;NO CHKSUM SENT FLAG +;BPTR EQU $3D ;CASSETTE DATA INDEX +FTYPE EQU $3E ;INTERRECORD GAP TYPE +FEOF EQU $3F ;END OF FILE FLAG +FREQ EQU $40 ;BEEP COUNT +SOUNDR EQU $41 ;NOISY I/O FLAG +CRITIC EQU $42 ;CRITICAL MODE +FMSZPG EQU $43 ;FMS ZERO PAGE +ZCHAIN EQU $4A ;HANDLER LOADER TEMP +DSTAT EQU $4C ;DISPLAY STATUS +ATRACT EQU $4D ;ATTRACT FLAG +DRKMSK EQU $4E ;DARK ATTRACT MASK +COLRSH EQU $4F ;COLOR SHIFTER +TMPCHR EQU $50 ;TEMP STORAGE +HOLD1 EQU $51 ;TEMP STORAGE +LMARGN EQU $52 ;LEFT MARGIN (1) +RMARGN EQU $53 ;RIGHT MARGIN (38) +ROWCRS EQU $54 ;CURSOR COUNTERS +COLCRS EQU $55 +DINDEX EQU $57 ;DISPLAY MODE # +SAVMSC EQU $58 ;SCREEN MEM ADDR +OLDROW EQU $5A ;DRAW START POSIT +OLDCOL EQU $5B +OLDCHR EQU $5D ;DATA UNDER CURSOR +OLDADR EQU $5E ;CURSOR MEM ADDR +FKDEF EQU $60 ;FUNC KEY DEFEAT POINTER +PALNTS EQU $62 ;PAL/NTSC FLAG +LOGCOL EQU $63 ;COL IN LOGICAL LINE +ADRESS EQU $64 ;TEMP STORAGE +MLTEMP EQU $66 ;TEMP STORAGE +SAVADR EQU $68 ;TEMP STORAGE +RAMTOP EQU $6A ;AVAILABLE RAM PAGES +BUFCNT EQU $6B ;BUFFER COUNT +BUFSTR EQU $6C ;EDITOR GETCH POINTR +BITMSK EQU $6E ;BIT MASK +SHFAMT EQU $6F ;PIXEL JUSTIFICATION +ROWAC EQU $70 ;ROW ACCUMULATOR +COLAC EQU $72 ;COLUMN ACCUMULATOR +ENDPT EQU $74 ;LINE LENGTH +DELTAR EQU $76 ;DELTA ROW +DELTAC EQU $77 ;DELTA COLUMN +KEYDEF EQU $79 ;KEY DEFEAT POINTER +SWPFLG EQU $7B ;SPLIT SCN CURS CNTL +HOLDCH EQU $7C ;KB CHAR TEMP HOLD +INSDAT EQU $7D ;TEMP STORAGE +COUNTR EQU $7E ;DRAW ITERATION CNT +; +; 80-FF ARE RESERVED FOR USER +; +; NOTE: SEE FLOATING POINT +; SUBROUTINE AREA FOR ZERO +; PAGE CELLS +; +; PAGE 1 - HARDWARE STACK +; +; PAGE TWO RAM ASSIGNMENTS +; +VDSLST EQU $0200 ;DSP LIST NMI VECTOR +VPRCED EQU $0202 ;PROCEED IRQ VECTOR +VINTER EQU $0204 ;INTERUPT IRQ VECTOR +VBREAK EQU $0206 ;BRK INST IRQ VECTOR +VKEYBD EQU $0208 ;POKEY KB IRQ VECTOR +VSERIN EQU $020A ;POKEY INPUT RDY IRQ +VSEROR EQU $020C ;POKEY OUTPUT RDY +VSEROC EQU $020E ;POKEY OUTPUT DONE +VTIMR1 EQU $0210 ;POKEY TIMER 1 IRQ +VTIMR2 EQU $0212 ;POKEY TIMER 2 IRQ +VTIMR4 EQU $0214 ;POKEY TIMER 4 IRQ +VIMIRQ EQU $0216 ;IMMED IRQ VECTOR +CDTMV1 EQU $0218 ;COUNT DOWN TIMER 1 +CDTMV2 EQU $021A ;COUNT DOWN TIMER 2 +CDTMV3 EQU $021C ;COUNT DOWN TIMER 3 +CDTMV4 EQU $021E ;COUNT DOWN TIMER 4 +CDTMV5 EQU $0220 ;COUNT DOWN TIMER 5 +VVBLKI EQU $0222 ;IMM VBLK NMI VECTOR +VVBLKD EQU $0224 ;DEF VBLK NMI VECTOR +CDTMA1 EQU $0226 ;CDTMV1 JSR ADDRESS +CDTMA2 EQU $0228 ;CDTMV2 JSR ADDRESS +CDTMF3 EQU $022A ;CDTMV3 FLAG +SRTIMR EQU $022B ;SOFTWARE REPEAT TMR +CDTMF4 EQU $022C ;CDTMV4 FLAG +INTEMP EQU $022D ;IAN'S TEMP +CDTMF5 EQU $022E ;CDTMV5 FLAG +DMACTLS EQU $022F ;SAVE DMACTL REG +DLPTRS EQU $0230 ;SAVE DISP LIST LO +;SDLSTH EQU $0231 ;SAVE DISP LIST HI +SSKCTL EQU $0232 ;SKCTL REGISTER RAM +LCOUNT EQU $0233 ;LOADER TEMP +LPENH EQU $0234 ;LIGHT PEN HORIZONTAL +LPENV EQU $0235 ;LIGHT PEN VERTICAL +BRKKY EQU $0236 ;BREAK KEY VECTOR +RELADR EQU $0238 ;LOADER REL ADDR +CDEVIC EQU $023A ;COMMAND BUFFER-DEV +CCOMND EQU $023B ;COMMAND BUFFER-CMND +CAUX1 EQU $023C ;COMMAND BUFFER AUX1 +CAUX2 EQU $023D ;COMMAND BUFFER AUX2 +;TEMP EQU $023E ;TEMPORARY RAM CELL +ERRFLG EQU $023F ;DEVICE ERROR FLAG +DFLAGS EQU $0240 ;DISK FLAGS(SECTOR1) +DBSECT EQU $0241 ;# DISK BOOT SECTORS +BOOTAD EQU $0242 ;DISK BOOT ADDRESS +COLDST EQU $0244 ;COLDSTART FLAG 1=CS +RECLEN EQU $0245 ;LOADER LENGTH +DSKTIM EQU $0246 ;DISK TIME OUT REG +VSFLAG EQU $026C ;FINE SCROLL TEMP +KEYDIS EQU $026D ;KEY DISABLE FLAG +FINE EQU $026E ;FINE SCROLL ENABLE(A1200) +GPRIOR EQU $026F ;GLOBAL PRIORITY +PADDL0 EQU $0270 ;POT 0 RAM CELL +PADDL1 EQU $0271 +PADDL2 EQU $0272 +PADDL3 EQU $0273 +STICK0 EQU $0278 ;JOYSTICK 0 RAM CELL +STICK1 EQU $0279 +PTRIG0 EQU $027C ;PADDLE TRIGGER 0 +PTRIG1 EQU $027D +PTRIG2 EQU $027E +PTRIG3 EQU $027F +STRIG0 EQU $0284 ;JOYSTICK TRIGGER 0 +STRIG1 EQU $0285 +HIBYTE EQU $0288 ;LOADER +WMODE EQU $0289 ;CASSETTE R/W MODE +BLIM EQU $028A ;CASSETTE RECORD SIZE +IMASK EQU $028B +JVECK EQU $028C ;JUMP VECTOR +NEWADR EQU $028E ;LOADER NEW ADDRESS +TXTROW EQU $0290 ;TEXT ROWCRS +TXTCOL EQU $0291 ;TEXT COLCRS +TINDEX EQU $0293 ;TEXT INDEX +TXTMSC EQU $0294 ;TEXT WINDOW MEM ADD +TXTOLD EQU $0296 ;TEXT OLDROW & COL +CRETRY EQU $029C ;# COMMAND RETRIES +HOLD3 EQU $029D +SUBTMP EQU $029E +HOLD2 EQU $029F +DMASK EQU $02A0 ;PIXEL LOCATION MASK +TMPLBT EQU $02A1 +ESCFLG EQU $02A2 ;ESCAPE FLAG +TABMAP EQU $02A3 ;TAB STOP MAP +LOGMAP EQU $02B2 ;LINE START BIT MAP +INVFLG EQU $02B6 ;INVERSE VIDEO FLAG +FILFLG EQU $02B7 ;FILL FLAG FOR DRAW +TMPROW EQU $02B8 +TMPCOL EQU $02B9 +SCRFLG EQU $02BB ;SET IF SCROLLING +HOLD4 EQU $02BC ;TEMP USED BY DRAW +DRETRY EQU $02BD ;# OF DEVICE RETRIES +SHFLOK EQU $02BE ;SHIFT/CTL LOCK FLAG +BOTSCR EQU $02BF ;BOTTOM OF SCREEN +PCOLR0 EQU $02C0 ;P0 COLOR +PCOLR1 EQU $02C1 ;P1 COLOR +PCOLR2 EQU $02C2 ;P2 COLOR +PCOLR3 EQU $02C3 ;P3 COLOR +COLOR0 EQU $02C4 ;COLOR 0 +COLOR1 EQU $02C5 +COLOR2 EQU $02C6 +COLOR3 EQU $02C7 +COLOR4 EQU $02C8 +COLBAKS EQU COLOR4 +RUNADR EQU $02C9 ;LOADER +HIUSED EQU $02CB ;LOADER +ZHIUSE EQU $02CD ;LOADER +GBYTEA EQU $02CF ;LOADER +LOADAD EQU $02D1 ;LOADER +ZLOADA EQU $02D3 ;LOADER +DSCTLN EQU $02D5 ;DISK SECTOR LENGTH +ACMISR EQU $02D7 ;RESERVED +KRPDEL EQU $02D9 ;KEY REPEAT DELAY +KEYREP EQU $02DA ;KEY REPEAT RATE(VBLANKS) +NOCLIK EQU $02DB ;CLICK ENABLE/DISABLE +HELPFG EQU $02DC ;HELP KEY FLAG +DMASAV EQU $02DD ;DMA SAVE STATE +PBPNT EQU $02DE ;PRINT BUFFER POINTER +PBUFSZ EQU $02DF ;PRINT BUFFER SIZE +DOSRUN EQU $02E0 ;DOS RUN/INIT ADDRESSES +RAMSIZ EQU $02E4 ;RAM SIZE-HIGH BYTE +MEMTOP EQU $02E5 ;TOP OF AVAIL MEMORY +MEMLO EQU $02E7 ;BOTTOM OF AVAIL MEM +HNDLOD EQU $02E9 ;POLL FLAG (1200) +DVSTAT EQU $02EA ;STATUS BUFFER +CBAUDL EQU $02EE ;CASSETTE BAUD RATE +CBAUDH EQU $02EF +CRSINH EQU $02F0 ;CURSOR INHIBIT 0=ON +KEYDEL EQU $02F1 ;KEY DELAY +CH1 EQU $02F2 ;PRIOR KB CHAR CODE +CHACT EQU $02F3 ;CHACTL REGISTER RAM +CHBAS EQU $02F4 ;CHBAS REGISTER RAM +NEWROW EQU $02F5 ;POINT DRAW GOES TO +NEWCOL EQU $02F6 +ROWINC EQU $02F8 ;ROW INCREMENT VALUE +COLINC EQU $02F9 ;COL INCREMENT VALUE +CHAR EQU $02FA ;INTERNAL CHAR CODE +ATACHR EQU $02FB ;ATASCII CHARACTER +CHKEY EQU $02FC ;KB CHAR CODE (FIFO) +FILDAT EQU $02FD ;RIGHT FILL DATA +DSPFLG EQU $02FE ;DISPLAY FLAG +SSFLAG EQU $02FF ;START/STOP FLAG +; +; PAGE THREE RAM ASSIGNMENTS +; +DDEVIC EQU $0300 ;BUS I.D. NUMBER +DUNIT EQU $0301 ;UNIT NUMBER +DCOMND EQU $0302 ;BUS COMMAND +DSTATS EQU $0303 ;COMMAND TYPE/STATUS +DBUFLO EQU $0304 ;DATA BUFFER LO BYTE +DBUFHI EQU $0305 ;DATA BUFFER HI BYTE +DTIMLO EQU $0306 ;DEVICE TIMEOUT SECS +DUNUSE EQU $0307 ;UNUSED BYTE +DBYTLO EQU $0308 ;# OF BYTES XFERRED +DBYTHI EQU $0309 +DAUX1 EQU $030A ;COMMAND AUX BYTE 1 +DAUX2 EQU $030B ;COMMAND AUX BYTE 2 +TIMER1 EQU $030C ;INITIAL TIMER VALUE +JMPERS EQU $030E ;OPTIONS (1200) +CASFLG EQU $030F ;CASSETE MODE IF SET +TIMER2 EQU $0310 ;FINAL TIMER VALUE +;TEMP1 EQU $0312 ;TEMP STORAGE +;TEMP2 EQU $0313 ;TEMP STORAGE +PTIMOT EQU $0314 ;PRINTER TIMEOUT REG +;TEMP3 EQU $0315 ;TEMP STORAGE +SAVIO EQU $0316 ;SAVE SERIAL IN DATA +TIMFLG EQU $0317 ;TIMEOUT FLAG C BAUD +STACKP EQU $0318 ;SIO STACK PTR SAVE +TSTAT EQU $0319 ;TEMP STATUS HOLDER +HATABS EQU $031A ;HANDLER ADDR TABLE +PUPBT1 EQU $033D ;POWER/UP RESET +PUPBT2 EQU $033E +PUPBT3 EQU $033F +ICHID EQU $0340 ;HANDLER INDEX # +ICDNO EQU $0341 ;DEVICE NUMBER +ICCOM EQU $0342 ;COMMAND CODE +ICSTA EQU $0343 ;STATUS +ICBAL EQU $0344 ;BUFFER ADDR LO BYTE +ICBAH EQU $0345 ;BUFFER ADDR HI BYTE +ICPTL EQU $0346 ;PUT ROUTINE ADDR-1 +ICPTH EQU $0347 +ICBLL EQU $0348 ;BUFFER LENGTH LO +ICBLH EQU $0349 ;BUFFER LENGTH HI +ICAX1 EQU $034A ;AUX BYTE 1 +ICAX2 EQU $034B ;AUX BYTE 2 +ICSPR EQU $034C ;SPARE BYTES +PRNBUF EQU $03C0 ;PRINTER BUFFER (40 BYTES) +SUPERF EQU $03E8 ;SCREEN EDITOR +CKEY EQU $03E9 ;START KEY FLAG +CASSBT EQU $03EA ;CASSETTE BOOT FLAG +CARTCK EQU $03EB ;CARTRIDGE CHECKSUM +ACMVAR EQU $03ED ;RESERVED +MINTLK EQU $03F9 ;RESERVED +GINTLK EQU $03FA ;CART INTERLOCK +CHLINK EQU $03FB ;HANDLER CHAIN +; +; PAGE FOUR RAM ASSIGNMENTS +; +CASBUF EQU $03FD ;CASSETTE BUFFER (131 BYTES) +USAREA EQU $0480 ;USER AREA +; +; PAGE FIVE AND SIX ARE RESERVED +; FOR USER WORK SPACE +; +; COLLEEN MNEMONICS +; +; --------------------------------------------------------------------------- +POKEY EQU $D200 +; --------------------------------------------------------------------------- +; +; READ +; +POT0 EQU POKEY+$00 +POT1 EQU POKEY+$01 +POT2 EQU POKEY+$02 +POT3 EQU POKEY+$03 +POT4 EQU POKEY+$04 +POT5 EQU POKEY+$05 +POT6 EQU POKEY+$06 +POT7 EQU POKEY+$07 +ALLPOT EQU POKEY+$08 +KBCODE EQU POKEY+$09 +RANDOM EQU POKEY+$0a +POTGO EQU POKEY+$0b +SERIN EQU POKEY+$0d +IRQST EQU POKEY+$0e +SKSTAT EQU POKEY+$0f +; +; WRITE +; +AUDF1 EQU POKEY+$00 +AUDC1 EQU POKEY+$01 +AUDF2 EQU POKEY+$02 +AUDC2 EQU POKEY+$03 +AUDF3 EQU POKEY+$04 +AUDC3 EQU POKEY+$05 +AUDF4 EQU POKEY+$06 +AUDC4 EQU POKEY+$07 +AUDCTL EQU POKEY+$08 +STIMER EQU POKEY+$09 +SKRES EQU POKEY+$0a +SEROUT EQU POKEY+$0d +IRQEN EQU POKEY+$0e +SKCTL EQU POKEY+$0f +; +; +; +; --------------------------------------------------------------------------- +GTIA EQU $D000 +; --------------------------------------------------------------------------- +; +; WRITE +; +HPOSP0 EQU GTIA+$00 +HPOSP1 EQU GTIA+$01 +HPOSP2 EQU GTIA+$02 +HPOSP3 EQU GTIA+$03 +HPOSM0 EQU GTIA+$04 +HPOSM1 EQU GTIA+$05 +HPOSM2 EQU GTIA+$06 +HPOSM3 EQU GTIA+$07 +SIZEP0 EQU GTIA+$08 +SIZEP1 EQU GTIA+$09 +SIZEP2 EQU GTIA+$0a +SIZEP3 EQU GTIA+$0b +SIZEM EQU GTIA+$0c +GRAFP0 EQU GTIA+$0d +GRAFP1 EQU GTIA+$0e +GRAFP2 EQU GTIA+$0f +GRAFP3 EQU GTIA+$10 +GRAFM EQU GTIA+$11 +COLPM0 EQU GTIA+$12 +COLPM1 EQU GTIA+$13 +COLPM2 EQU GTIA+$14 +COLPM3 EQU GTIA+$15 +COLPF0 EQU GTIA+$16 +COLPF1 EQU GTIA+$17 +COLPF2 EQU GTIA+$18 +COLPF3 EQU GTIA+$19 +COLBAK EQU GTIA+$1a +PRIOR EQU GTIA+$1b +VDELAY EQU GTIA+$1c +GRACTL EQU GTIA+$1d +HITCLR EQU GTIA+$1e +CONSOL EQU GTIA+$1f +; +; READ +; +M0PF EQU GTIA+$00 +M1PF EQU GTIA+$01 +M2PF EQU GTIA+$02 +M3PF EQU GTIA+$03 +P0PF EQU GTIA+$04 +P1PF EQU GTIA+$05 +P2PF EQU GTIA+$06 +P3PF EQU GTIA+$07 +M0PL EQU GTIA+$08 +M1PL EQU GTIA+$09 +M2PL EQU GTIA+$0a +M3PL EQU GTIA+$0b +P0PL EQU GTIA+$0c +P1PL EQU GTIA+$0d +P2PL EQU GTIA+$0e +P3PL EQU GTIA+$0f +TRIG0 EQU GTIA+$10 +TRIG1 EQU GTIA+$11 +TRIG2 EQU GTIA+$12 +TRIG3 EQU GTIA+$13 +PAL EQU GTIA+$14 +; +; +; --------------------------------------------------------------------------- +ANTIC EQU $D400 +; --------------------------------------------------------------------------- +; +DMACTL EQU ANTIC+$00 +CHACTL EQU ANTIC+$01 +DLPTR EQU ANTIC+$02 +;DLISTH EQU ANTIC+$03 +HSCROL EQU ANTIC+$04 +VSCROL EQU ANTIC+$05 +PMBASE EQU ANTIC+$07 +CHBASE EQU ANTIC+$09 +WSYNC EQU ANTIC+$0a +VCOUNT EQU ANTIC+$0b +PENH EQU ANTIC+$0c +PENV EQU ANTIC+$0d +NMIEN EQU ANTIC+$0e +NMIRES EQU ANTIC+$0f +NMIST EQU ANTIC+$0f +; +; +; --------------------------------------------------------------------------- +PIA EQU $D300 +; --------------------------------------------------------------------------- +; +PORTA EQU PIA+0 +PORTB EQU PIA+1 +PACTL EQU PIA+2 +PBCTL EQU PIA+3 +; +; --------------------------------------------------------------------------- +; Atari ANTIC chip display list equates +; --------------------------------------------------------------------------- +; +JUMP EQU $01 ; display list jump instruction (3 byte) +JVB EQU $41 ; display list jump and wait for vblank instruction (3) +; +SCH EQU $10 ; display list horizontal scrolling +SCV EQU $20 ; display list vertical scrolling +LMS EQU $40 ; display list load memory scan instruction (3 byte) +DLII EQU $80 ; display list interrupt instruction +; +SKIP1 EQU $00 ; display list skip 1 scan line instruction +SKIP2 EQU $10 ; display list skip 2 scan lines instruction +SKIP3 EQU $20 ; display list skip 3 scan lines instruction +SKIP4 EQU $30 ; display list skip 4 scan lines instruction +SKIP5 EQU $40 ; display list skip 5 scan lines instruction +SKIP6 EQU $50 ; display list skip 6 scan lines instruction +SKIP7 EQU $60 ; display list skip 7 scan lines instruction +SKIP8 EQU $70 ; display list skip 8 scan lines instruction +; +MODE2 EQU $02 ; display list mode 2 +MODE4 EQU $04 ; display list mode 4 +MODE8 EQU $08 ; display list mode 8 +MODEE EQU $0E ; display list mode E +MODEF EQU $0F ; display list mode F +; --------------------------------------------------------------------------- +; ENUMS +; --------------------------------------------------------------------------- + +.enum @dmactl + blank = %00 + narrow = %01 + standard= %10 + wide = %11 + missiles= %100 + players = %1000 + lineX1 = %10000 + lineX2 = %00000 + dma = %100000 +.ende + +scr48 = @dmactl(wide|dma|players|missiles|lineX1) +scr40 = @dmactl(standard|dma|players|missiles|lineX1) +scr32 = @dmactl(narrow|dma|players|missiles|lineX1) + +.enum @pmcntl + missiles= %1 + players = %10 + trigs = %100 +.ende + +.enum @gtictl + prior0 = %0 + prior1 = %1 + prior2 = %10 + prior4 = %100 + prior8 = %1000 + ply5 = %10000 ; Fifth Player Enable + mlc = %100000 ; Multiple Color Player Enable + mode9 = %01000000 + mode10 = %10000000 + mode11 = %11000000 +.ende + +.enum @consol + start = %001 + select = %010 + option = %100 +.ende + +; --------------------------------------------------------------------------- +; KBCODEs +; --------------------------------------------------------------------------- +.enum @kbcode + _none = 255 + _esc = 28 + _1 = 31 + _2 = 30 + _3 = 26 + _4 = 24 + _5 = 29 + _6 = 27 + _7 = 51 + _8 = 53 + _9 = 48 + _0 = 50 + _lt = 54 + _gt = 55 + _del = 52 + _tab = 44 + _Q = 47 + _W = 46 + _E = 42 + _R = 40 + _T = 45 + _Y = 43 + _U = 11 + _I = 13 + _O = 8 + _P = 10 + _min = 14 + _up = 14 ; cursor function + _eq = 15 + _down = 15 ; cursor function + _ret = 12 + _A = 63 + _S = 62 + _D = 58 + _F = 56 + _G = 61 + _H = 57 + _J = 1 + _K = 5 + _L = 0 + _semicolon = 2 + _plus = 6 + _left = 6 ; cursor function + _asterisk = 7 + _right = 7 ; cursor function + _caps = 60 + _Z = 23 + _X = 22 + _C = 18 + _V = 16 + _B = 21 + _N = 36 + _M = 37 + _comma = 32 + _dot = 34 + _slash = 38 + _atari = 39 + _help = 17 + _F1 = 3 + _F2 = 4 + _F3 = 19 + _F4 = 20 + _space = 33 +.ende + +; --------------------------------------------------------------------------- +; MISCELLANEOUS +; --------------------------------------------------------------------------- + +EOL = $9b +CR_PC = 13 ; PC CR code +LF_PC = 10 ; PC LF code diff --git a/lib/MACRO.ASM b/lib/MACRO.ASM new file mode 100644 index 0000000..1ce890a --- /dev/null +++ b/lib/MACRO.ASM @@ -0,0 +1,182 @@ +;------------------------------------- + .MACRO ROLW + ROL :1 + ROL :1+1 + .ENDM +;------------------------------------- + .MACRO ASLW + ASL :1 + ROL :1+1 + .ENDM +;------------------------------------- + .MACRO RORW + ROR :1+1 + ROR :1 + .ENDM +;------------------------------------- + .MACRO LSRW + LSR :1+1 + ROR :1 + .ENDM + +;------------------------------------- + .MACRO VMAIN +; VMAIN #WORD,interrupt.vector +; interrupt.vector: +; 0 - VIMIRQ +; 1 - TIMCNT1 +; 2 - TIMCNT2 +; 3 - TIMCNT3 +; 4 - TIMCNT4 +; 5 - TIMCNT5 +; 6 - VVBLKI +; 7 - VVBLKD +; 8 - TIMVEC1 +; 9 - TIMVEC2 +; Initialises Vertical Blank Interrupts +; (works only with system interrupts ON) + LDY # <:1 + LDX # >:1 + LDA #:2 + JSR SETVBV + .ENDM +;------------------------------------- + .MACRO VDLI +; VDLI #WORD +; Initialises Display List Interrupts + LDY # <:1 + LDX # >:1 + LDA #$C0 + STY $0200 + STX $0201 + STA NMIEN + .ENDM +;------------------------------------- + .MACRO VDL +; VDL #WORD +; Changes Display List addres +; and sets width of the screen +; vdl dl,$01 - narrow screen (32 bytes) +; vdl dl,$02 - normal screen (40 bytes) +; vdl dl,$03 - wide screen (48 bytes) +; (works only with system interrupts ON) + + .if %0=2 + lda dmactls + and #$fc + ora #%2 + sta dmactls + .endif + + LDA # <%1 + STA DLPTRS + LDA # >%1 + STA DLPTRS+1 + .ENDM +;------------------------------------- + .MACRO halt +?stop + lda RANDOM + and #$05 + sta COLBAK + jmp ?stop + .ENDM +;------------------------------------- + .MACRO KEY +; KEY +; waits for releasing and pressing "any key" + PHA +?CK1 LDA SKSTAT + AND #$04 + BEQ ?CK1 +?CK LDA SKSTAT + AND #$04 + BNE ?CK + PLA + .ENDM +;------------------------------------- + .MACRO WAIT +; WAIT +; waits one frame (1/50 s(PAL) or 1/60s(NTSC)) +?ze LDA VCOUNT + cmp #16 ; if line<16 then wait for line>15 (long VBI protection) + bcc ?ze + sbc #10 ; last lines correction +?wa cmp VCOUNT + bcc ?wa +?wf cmp VCOUNT + bcs ?wf + .ENDM +;------------------------------------- + .macro waitRTC + lda RTCLOK+2 +?wa cmp RTCLOK+2 + beq ?wa + .endm +;------------------------------------- + .macro negw + ; negate the given word (0-a) +;------------------------------------- + sec + lda #$00 + sbc :1 + sta :1 + lda #$00 + sbc :1+1 + sta :1+1 + .endm +;------------------------------------- + .macro randomize + ;usage: randomize floor ceiling + ;returns (in A) a random .byte between "floor" and "ceiling" + .if :2 < :1 + .error "floor higher than ceiling" + .endif +?rand + lda random + cmp #:2+1-:1 ;ceiling + bcs ?rand + .if %1>0 ; if floor = 0 - no add offset + adc #:1 + .endif + .endm +;------------------------------------- + .macro phx + txa + pha + .endm +;------------------------------------- + .macro phy + tya + pha + .endm +;------------------------------------- + .macro plx + pla + tax + .endm +;------------------------------------- + .macro ply + pla + tay + .endm +;------------------------------------- + .macro txy + txa + tay + .endm +;------------------------------------- + .macro tyx + tya + tax + .endm +;------------------------------------- + .macro pause + ;waits :1 number (byte) of frames + ldx #:1 +?PAUSELOOP + wait + dex + bne ?PAUSELOOP + .ENDM + diff --git a/lib/fileio.asm b/lib/fileio.asm new file mode 100644 index 0000000..406cea1 --- /dev/null +++ b/lib/fileio.asm @@ -0,0 +1,50 @@ +.IF *>0 ;this is a trick that prevents compiling this file alone + +;-------------------------------------------------- +.proc open +;-------------------------------------------------- +; OPEN #1,4,0,"D:LEVEL000.DAT" + + ldx #$10 ;IOCB #1 + lda #$03 ;komenda: OPEN + sta ICCOM,x + lda #fname + sta ICBAH,x + lda #04 ;kod dostępu: $04 odczyt, $08 zapis, $09 dopisywanie, $0c odczyt/zapis + sta ICAX1,x + lda #$00 ;dodatkowy parametr, $00 jest zawsze dobre + sta ICAX2,x + jmp ciov +.endp +;-------------------------------------------------- +.proc bget +;-------------------------------------------------- +; BGET #1,LevelFileBuff,LevelFileBuffLen-2 + + ldx #$10 ;IOCB #1 + lda #$07 ;komenda: GET BYTES / BINARY READ + sta ICCOM,x + lda #LevelFileBuff + sta ICBAH,x + lda #<(LevelFileBuffLen-2) ;wielkosc bloku danych w bajtach + sta ICBLL,x + lda #>(LevelFileBuffLen-2) + sta ICBLH,x + jmp ciov +.endp +;-------------------------------------------------- +.proc close +;-------------------------------------------------- +; CLOSE #1 + ldx #$10 ;IOCB #1 + lda #$0c ;komenda: CLOSE + sta ICCOM,x + jmp ciov +.endp + + +.ENDIF \ No newline at end of file