diff --git a/src/libsrc/apple/hgrsprite.pla b/src/libsrc/apple/hgrsprite.pla index 4b6c03d..b20656a 100644 --- a/src/libsrc/apple/hgrsprite.pla +++ b/src/libsrc/apple/hgrsprite.pla @@ -137,8 +137,8 @@ export def spriteCompile(w, h, xcenter, ycenter, srcptr)#1 sprtptr->s_height = h sprtptr->s_xcenter = xcenter sprtptr->s_ycenter = ycenter - sprtptr=>s_under[0] = 0//heapalloc(spritesize) - sprtptr=>s_under[1] = 0//heapalloc(spritesize) + sprtptr=>s_under[0] = 0 + sprtptr=>s_under[1] = 0 for i = 0 to 13 sprtptr=>s_map[i] = heapalloc(spritesize) sprtptr=>s_mask[i] = heapalloc(spritesize) @@ -158,15 +158,14 @@ export def spriteCompile(w, h, xcenter, ycenter, srcptr)#1 return sprtptr end export def spriteDup(sprtsrc)#1 - var sprtdup, spritesize + var sprtdup byte i sprtdup = heapalloc(t_sprite) if not sprtdup; return 0; fin memcpy(sprtdup, sprtsrc, t_sprite) - //spritesize = sprtdup=>s_size - sprtdup=>s_under[0] = 0//heapalloc(spritesize) - sprtdup=>s_under[1] = 0//heapalloc(spritesize) + sprtdup=>s_under[0] = 0 + sprtdup=>s_under[1] = 0 return sprtdup end export def spriteRead(filestr)#1 @@ -175,20 +174,20 @@ export def spriteRead(filestr)#1 sprtptr = heapalloc(t_sprite) if not sprtptr; return 0; fin - refnum = fileio:open(@filestr) + refnum = fileio:open(filestr) if refnum if fileio:read(refnum, sprtptr, t_sprite) == t_sprite spritesize = sprtptr=>s_size - sprtptr=>s_under[0] = heapalloc(spritesize) - sprtptr=>s_under[1] = heapalloc(spritesize) - if not sprtptr=>s_under[0] or not sprtptr=>s_under[1] - heaprelease(sprtptr) - fileio:close(refnum) - return 0 - fin + sprtptr=>s_under[0] = 0 + sprtptr=>s_under[1] = 0 for i = 0 to 13 - sprtptr=>s_map[i] = 0//heapalloc(spritesize) - sprtptr=>s_mask[i] = 0//heapalloc(spritesize) + sprtptr=>s_map[i] = heapalloc(spritesize) + sprtptr=>s_mask[i] = heapalloc(spritesize) + if not sprtptr=>s_map[i] or not sprtptr=>s_mask[i] + heaprelease(sprtptr) + fileio:close(refnum) + return 0 + fin fileio:read(refnum, sprtptr=>s_map[i], spritesize) fileio:read(refnum, sprtptr=>s_mask[i], spritesize) next @@ -207,9 +206,9 @@ export def spriteSave(filestr, sprtptr)#1 var spritesize byte refnum, i - fileio:destroy(@filestr) - if fileio:create(@filestr, $06, $0000) == FILE_ERR_OK - refnum = fileio:open(@filestr) + fileio:destroy(filestr) + if fileio:create(filestr, $06, $0000) == FILE_ERR_OK + refnum = fileio:open(filestr) if refnum if fileio:write(refnum, sprtptr, t_sprite) == t_sprite spritesize = sprtptr=>s_size diff --git a/src/libsrc/apple/sndseq.pla b/src/libsrc/apple/sndseq.pla index 152d951..b070ece 100755 --- a/src/libsrc/apple/sndseq.pla +++ b/src/libsrc/apple/sndseq.pla @@ -305,7 +305,7 @@ TONELP SBC #$01 ; 2 ;+4 = 11 (from BNE above) +++ BIT $C000 ; 4 - BMI TONEXIT ; 2 + NOP ; 2 BPL TONELP ; 3 ;--- ;+9 = 20 diff --git a/src/makefile b/src/makefile index fdd4797..743d721 100755 --- a/src/makefile +++ b/src/makefile @@ -66,6 +66,7 @@ HGRSPRITE = rel/apple/HGRSPRITE\#FE1000 LINES = rel/LINES\#FE1000 GRAFIX = rel/apple/GRAFIX\#FE1000 SFM = rel/apple/SFM\#FE1000 +SFMSPRT = rel/apple/SFMSPRT\#FE1000 GFXDEMO = rel/apple/GFXDEMO\#FE1000 JOYBUZZ = rel/apple/JOYBUZZ\#FE1000 PORTIO = rel/apple/PORTIO\#FE1000 @@ -105,7 +106,7 @@ TXTTYPE = .TXT #SYSTYPE = \#FF2000 #TXTTYPE = \#040000 -apple: $(PLVMZP_APL) $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVMJIT) $(PLVM802) $(PLVM03) $(PLVMJIT03) $(CMD) $(CMDJIT) $(JIT) $(JIT16) $(JITUNE) $(SOSCMD) $(SOSCMDJIT) $(PLASMAPLASM) $(CODEOPT) $(ZIP) $(MATCHFILES) $(ARGS) $(MEMMGR) $(MEMTEST) $(FIBER) $(FIBERTEST) $(LONGJMP) $(ED) $(MON) $(COPY) $(DEL) $(REN) $(CAT) $(NEWDIR) $(TYPE) $(SOS) $(ROD) $(SIEVE) $(PRIMEGAP) $(MOUSE) $(UTHERNET2) $(UTHERNET) $(ETHERIP) $(INET) $(DHCP) $(HTTPD) $(TFTPD) $(ROGUE) $(ROGUEMAP) $(ROGUECOMBAT) $(SFM) $(GRAFIX) $(GFXDEMO) $(LINES) $(HGRSPRITE) $(HGRLIB) $(HGRTEST) $(GRLIB) $(DGRLIB) $(GRTEST) $(DGRTEST) $(HGRTEST) $(FILEIO_APL) $(CONIO_APL) $(JOYBUZZ) $(PORTIO) $(SPIPORT) $(SDFAT) $(FATCAT) $(FATGET) $(FATPUT) $(FATWDSK) $(FATRDSK) $(INT32) $(INT32TEST) $(SANE) $(FPSTR) $(FPU) $(SANITY) $(LZ4) $(LZ4CAT) $(RPNCALC) $(SNDSEQ) $(PLAYSEQ) +apple: $(PLVMZP_APL) $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVMJIT) $(PLVM802) $(PLVM03) $(PLVMJIT03) $(CMD) $(CMDJIT) $(JIT) $(JIT16) $(JITUNE) $(SOSCMD) $(SOSCMDJIT) $(PLASMAPLASM) $(CODEOPT) $(ZIP) $(MATCHFILES) $(ARGS) $(MEMMGR) $(MEMTEST) $(FIBER) $(FIBERTEST) $(LONGJMP) $(ED) $(MON) $(COPY) $(DEL) $(REN) $(CAT) $(NEWDIR) $(TYPE) $(SOS) $(ROD) $(SIEVE) $(PRIMEGAP) $(MOUSE) $(UTHERNET2) $(UTHERNET) $(ETHERIP) $(INET) $(DHCP) $(HTTPD) $(TFTPD) $(ROGUE) $(ROGUEMAP) $(ROGUECOMBAT) $(SFM) $(SFMSPRT) $(GRAFIX) $(GFXDEMO) $(LINES) $(HGRSPRITE) $(HGRLIB) $(HGRTEST) $(GRLIB) $(DGRLIB) $(GRTEST) $(DGRTEST) $(HGRTEST) $(FILEIO_APL) $(CONIO_APL) $(JOYBUZZ) $(PORTIO) $(SPIPORT) $(SDFAT) $(FATCAT) $(FATGET) $(FATPUT) $(FATWDSK) $(FATRDSK) $(INT32) $(INT32TEST) $(SANE) $(FPSTR) $(FPU) $(SANITY) $(LZ4) $(LZ4CAT) $(RPNCALC) $(SNDSEQ) $(PLAYSEQ) -rm vmsrc/plvmzp.inc @@ -263,6 +264,10 @@ $(SFM): samplesrc/sfm.pla $(PLVM02) $(PLASM) ./$(PLASM) -AMOW < samplesrc/sfm.pla > samplesrc/sfm.a acme --setpc 4094 -o $(SFM) samplesrc/sfm.a +$(SFMSPRT): samplesrc/sfmsprt.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMOW < samplesrc/sfmsprt.pla > samplesrc/sfmsprt.a + acme --setpc 4094 -o $(SFMSPRT) samplesrc/sfmsprt.a + $(ROGUE): samplesrc/rogue.pla $(PLVM02) $(PLASM) ./$(PLASM) -AMOW < samplesrc/rogue.pla > samplesrc/rogue.a acme --setpc 4094 -o $(ROGUE) samplesrc/rogue.a diff --git a/src/mkrel b/src/mkrel index aa184cf..9dfe67a 100755 --- a/src/mkrel +++ b/src/mkrel @@ -75,12 +75,15 @@ cp rel/apple/HGRTEST#FE1000 prodos/demos/HGRTEST.REL cp rel/apple/GRTEST#FE1000 prodos/demos/GRTEST.REL cp rel/apple/DGRTEST#FE1000 prodos/demos/DGRTEST.REL cp rel/apple/HGRTEST#FE1000 prodos/demos/HGRTEST.REL -cp rel/apple/SFM#FE1000 prodos/demos/SFM.REL cp rel/apple/ROD#FE1000 prodos/demos/ROD.REL cp rel/RPNCALC#FE1000 prodos/demos/RPNCALC.REL cp rel/LZ4CAT#FE1000 prodos/demos/LZ4CAT.REL cp rel/PRIMEGAP#FE1000 prodos/demos/PRIMEGAP.REL +mkdir prodos/demos/spiders +cp rel/apple/SFM#FE1000 prodos/demos/spiders/SFM.REL +cp rel/apple/SFMSPRT#FE1000 prodos/demos/spiders/SFMSPRT.REL + mkdir prodos/demos/rogue cp rel/ROGUE#FE1000 prodos/demos/rogue/ROGUE.REL cp rel/ROGUECOMBAT#FE1000 prodos/demos/rogue/ROGUECOMBAT.REL @@ -134,6 +137,7 @@ cp samplesrc/fatcat.pla prodos/bld/samples/FATCAT.PLA.TXT cp samplesrc/gfxdemo.pla prodos/bld/samples/GFXDEMO.PLA.TXT cp samplesrc/lz4cat.pla prodos/bld/samples/Z4CAT.PLA.TXT cp samplesrc/sfm.pla prodos/bld/samples/SFM.PLA.TXT +cp samplesrc/sfmsprt.pla prodos/bld/samples/SFMSPRT.PLA.TXT #mkdir prodos/bld/examples #cp samplesrc/examples/ex.1.pla prodos/bld/examples/EX.1.PLA.TXT diff --git a/src/samplesrc/sfm.pla b/src/samplesrc/sfm.pla index 731eba7..bf90a62 100644 --- a/src/samplesrc/sfm.pla +++ b/src/samplesrc/sfm.pla @@ -1,3 +1,6 @@ +// +// Ziggy Stardust and the Spiders from Mars +// include "inc/cmdsys.plh" include "inc/hgrlib.plh" include "inc/hgrsprite.plh" @@ -9,185 +12,93 @@ const SHIP_SPRTNUM = 0 const MISSLE_SPRTNUM = 1 const WEB_SPRTBASE = 2 const SPIDER_SPRTEBASE = 8 -const FULL_CHARGE = 20 +const LASER_RECHARGE = 20 +const MISSLE_RELOAD = 10 const ATTACK_SPEED = 12 const SWARM_LIMIT = 52 const FASTMOVE_LIMIT = 120 const WEB_LIMIT = 152 const YSHIP = 180 +const LASER_BUZZ = 20 +const ATTACK_BUZZ = 5 +const WEB1_BUZZ = 10 +const WEB2_BUZZ = 12 +const WEB3_BUZZ = 14 +const SPLAT_BUZZ = 40 -byte egg3 = $88,$88,$83,$33,$38,$88,$88 -byte = $88,$83,$33,$11,$33,$38,$88 -byte = $83,$31,$11,$11,$11,$13,$38 -byte = $33,$11,$11,$11,$11,$11,$33 -byte = $33,$11,$11,$11,$11,$11,$33 -byte = $33,$11,$11,$11,$11,$11,$33 -byte = $33,$11,$11,$11,$11,$11,$33 -byte = $33,$11,$11,$11,$11,$11,$33 -byte = $33,$11,$11,$11,$11,$11,$33 -byte = $83,$31,$11,$11,$11,$13,$38 -byte = $88,$83,$33,$11,$33,$38,$88 -byte = $88,$88,$83,$33,$38,$88,$88 -byte egg2 = $88,$88,$83,$33,$38,$88,$88 -byte = $88,$83,$33,$11,$33,$38,$88 -byte = $83,$30,$11,$00,$11,$13,$38 -byte = $33,$11,$00,$11,$00,$11,$33 -byte = $33,$00,$11,$00,$11,$00,$33 -byte = $33,$11,$00,$11,$00,$11,$33 -byte = $33,$00,$11,$00,$11,$00,$33 -byte = $33,$11,$00,$11,$00,$11,$33 -byte = $33,$00,$11,$00,$11,$00,$33 -byte = $83,$31,$00,$11,$00,$13,$38 -byte = $88,$83,$33,$00,$33,$38,$88 -byte = $88,$88,$83,$33,$38,$88,$88 -byte egg1 = $88,$88,$83,$33,$38,$88,$88 -byte = $88,$83,$33,$00,$33,$38,$88 -byte = $83,$30,$00,$00,$00,$03,$38 -byte = $33,$00,$00,$00,$00,$00,$33 -byte = $33,$00,$00,$00,$00,$00,$33 -byte = $33,$00,$00,$00,$00,$00,$33 -byte = $33,$00,$00,$00,$00,$00,$33 -byte = $33,$00,$00,$00,$00,$00,$33 -byte = $33,$00,$00,$00,$00,$00,$33 -byte = $83,$30,$00,$00,$00,$03,$38 -byte = $88,$83,$33,$11,$33,$38,$88 -byte = $88,$88,$83,$33,$38,$88,$88 -byte spider3 = $33,$88,$88,$33,$33,$33,$33,$88,$88,$33 -byte = $33,$88,$83,$32,$22,$22,$23,$38,$88,$33 -byte = $83,$38,$83,$32,$22,$22,$23,$38,$83,$38 -byte = $88,$83,$33,$22,$22,$22,$22,$33,$38,$88 -byte = $33,$88,$33,$22,$22,$22,$22,$33,$88,$33 -byte = $88,$33,$38,$33,$22,$22,$33,$83,$33,$88 -byte = $88,$88,$83,$33,$22,$22,$33,$38,$88,$88 -byte = $88,$33,$33,$33,$22,$22,$33,$33,$33,$88 -byte = $33,$88,$88,$88,$33,$33,$88,$88,$88,$33 -byte = $88,$88,$33,$33,$22,$22,$33,$33,$88,$88 -byte = $88,$33,$88,$33,$22,$22,$33,$88,$33,$88 -byte = $33,$88,$88,$83,$32,$23,$38,$88,$88,$33 -byte = $88,$88,$88,$88,$33,$33,$88,$88,$88,$88 -byte spider2 = $33,$88,$88,$33,$33,$33,$33,$88,$88,$33 -byte = $33,$88,$83,$30,$02,$20,$03,$38,$88,$33 -byte = $83,$38,$83,$32,$20,$02,$23,$38,$83,$38 -byte = $88,$83,$33,$20,$02,$20,$02,$33,$38,$88 -byte = $33,$88,$33,$02,$20,$02,$20,$33,$88,$33 -byte = $88,$33,$38,$30,$02,$20,$03,$83,$33,$88 -byte = $88,$88,$83,$33,$20,$02,$33,$38,$88,$88 -byte = $88,$33,$33,$30,$02,$20,$03,$33,$33,$88 -byte = $33,$88,$88,$88,$33,$33,$88,$88,$88,$33 -byte = $88,$88,$33,$30,$02,$20,$03,$33,$88,$88 -byte = $88,$33,$88,$33,$20,$02,$33,$88,$33,$88 -byte = $33,$88,$88,$83,$32,$23,$38,$88,$88,$33 -byte = $88,$88,$88,$88,$33,$33,$88,$88,$88,$88 -byte spider1 = $33,$88,$88,$33,$33,$33,$33,$88,$88,$33 -byte = $33,$88,$83,$30,$00,$00,$03,$38,$88,$33 -byte = $83,$38,$83,$30,$00,$00,$03,$38,$83,$38 -byte = $88,$83,$33,$00,$00,$00,$00,$33,$38,$88 -byte = $33,$88,$33,$00,$00,$00,$00,$33,$88,$33 -byte = $88,$33,$38,$33,$00,$00,$33,$83,$33,$88 -byte = $88,$88,$83,$33,$00,$00,$33,$38,$88,$88 -byte = $88,$33,$33,$30,$00,$00,$03,$33,$33,$88 -byte = $33,$88,$88,$88,$33,$33,$88,$88,$88,$33 -byte = $88,$88,$33,$30,$00,$00,$03,$33,$88,$88 -byte = $88,$33,$88,$33,$00,$00,$33,$88,$33,$88 -byte = $33,$88,$88,$83,$30,$03,$38,$88,$88,$33 -byte = $88,$88,$88,$88,$33,$33,$88,$88,$88,$88 -byte web1 = $88,$83,$38,$88 -byte = $88,$38,$83,$88 -byte = $88,$38,$83,$88 -byte = $88,$33,$33,$88 -byte = $83,$38,$83,$38 -byte = $83,$38,$83,$38 -byte = $83,$38,$83,$38 -byte = $33,$33,$33,$33 -byte web2 = $88,$33,$83,$38,$33,$88 -byte = $88,$38,$83,$38,$83,$88 -byte = $83,$38,$83,$38,$83,$38 -byte = $83,$33,$33,$33,$33,$38 -byte = $83,$38,$83,$38,$83,$38 -byte = $83,$38,$83,$38,$83,$38 -byte = $33,$88,$83,$38,$88,$33 -byte = $33,$33,$33,$33,$33,$33 -byte web3 = $88,$83,$38,$83,$38,$83,$38,$83,$38,$88 -byte = $88,$83,$38,$83,$38,$83,$38,$83,$38,$88 -byte = $88,$33,$88,$33,$88,$88,$33,$88,$33,$88 -byte = $88,$33,$33,$33,$33,$33,$33,$33,$33,$88 -byte = $83,$38,$88,$33,$83,$38,$33,$88,$83,$38 -byte = $83,$38,$83,$38,$83,$38,$83,$38,$83,$38 -byte = $33,$88,$83,$38,$83,$38,$83,$38,$88,$33 -byte = $33,$38,$33,$33,$33,$33,$33,$33,$33,$33 -byte ship = $CC,$CC,$CC,$77,$CC,$CC,$CC -byte = $CC,$CC,$C7,$77,$7C,$CC,$CC -byte = $CC,$CC,$C7,$77,$7C,$CC,$CC -byte = $CC,$CC,$C7,$77,$7C,$CC,$CC -byte = $CC,$CC,$C7,$77,$7C,$CC,$CC -byte = $77,$CC,$77,$66,$77,$CC,$77 -byte = $77,$CC,$77,$66,$77,$CC,$77 -byte = $77,$CC,$77,$66,$77,$CC,$77 -byte = $77,$CC,$77,$77,$77,$CC,$77 -byte = $77,$CC,$77,$77,$77,$CC,$77 -byte = $77,$CC,$77,$77,$77,$CC,$77 -byte = $77,$C7,$77,$77,$77,$7C,$77 -byte = $77,$77,$75,$55,$57,$77,$77 -byte = $77,$77,$75,$55,$57,$77,$77 -byte missle = $CC,$55,$CC -byte = $CC,$55,$CC -byte = $CC,$55,$CC -byte = $CC,$55,$CC -byte = $CC,$55,$CC -byte = $CC,$55,$CC -byte = $C5,$55,$5C -byte = $55,$55,$55 -byte dummy = $88,$88,$88,$88 -byte = $88,$88,$88,$88 -byte = $88,$88,$88,$88 -byte = $88,$88,$88,$88 -byte = $88,$88,$88,$88 -byte = $88,$88,$88,$88 -byte = $88,$88,$88,$88 -byte = $88,$88,$88,$88 -var sprtEgg1, sprtEgg2, sprtEgg3 -var sprtSpider1, sprtSpider2, sprtSpider3 +var sprtEgg1, sprtEgg2, sprtEgg3, sprtEgg +var sprtSpider1, sprtSpider2, sprtSpider3, sprtSpider +var sprtSplat1, sprtSplat2 var sprtWeb1, sprtWeb2, sprtWeb3 var sprtShip, sprtMissle, sprtDummy var[NUMSTARS] xstar byte[NUMSTARS] ystar -byte won, curstar -def initStars#0 - byte k - - xstar[0] = 99 - ystar[0] = 10 - hgrColor(3) - hgrXorPlot(xstar[0], ystar[0]) - for k = 1 to NUMSTARS-1 - xstar[k] = (xstar[k - 1] + 97 - k) % 280 - ystar[k] = (ystar[k - 1] + 19 + k) % YSHIP - hgrXorPlot(xstar[k], ystar[k]) - next - curstar = 0 -end -def updateStars#0 - hgrColor(3) - hgrXorPlot(xstar[curstar], ystar[curstar]) - ystar[curstar]++ - if ystar[curstar] > YSHIP - ystar[curstar] = 0 - fin - hgrXorPlot(xstar[curstar], ystar[curstar]) - curstar++ - if curstar >= NUMSTARS; curstar = 0; fin -end +byte curstar, buzz + +// +// Apple II speaker tone generator routine +// +//asm spkrTone(pitch, duration)#0 +byte _spkrTone[] +byte = $86, $E5 // STX ESP +byte = $B4, $C0 // LDY ESTKH,X +byte = $B5, $D0 // LDA ESTKL,X +byte = $F0, $01 // BEQ +1 +byte = $C8 // INY +byte = $85, $08 // STA DSTL +byte = $84, $09 // STY DSTH +byte = $B4, $C1 // LDY ESTKL+1,X +byte = $B5, $D1 // LDA ESTKL+1,X +byte = $F0, $01 // BEQ +1 +byte = $C8 // INY +byte = $85, $E7 // STA TMPL +byte = $84, $E8 // STY TMPH +byte = $AA // TAX +byte = $A9, $FF // LDA #$FF +byte = $08 // PHP +byte = $78 // SEI +byte = $EA // NOP +byte = $EA // NOP +byte = $B0, $00 // BCS +0 +byte = $38 // SEC +byte = $CA // DEX +byte = $D0, $18 // BNE +18 +byte = $88 // DEY +byte = $D0, $17 // BNE +17 +byte = $2C, $30, $C0 // BIT $C030 +byte = $A6, $E7 // LDX TMPL +byte = $A4, $E8 // LDY TMPH +byte = $E9, $01 // SBC #$01 +byte = $B0, $EA // BCS -EA +byte = $C6, $08 // DEC DSTL +byte = $D0, $EA // BNE -EA +byte = $C6, $09 // DEC DSTH +byte = $D0, $E6 // BNE -E6 +byte = $F0, $07 // BEQ +8 +byte = $EA // NOP +byte = $EA // NOP +byte = $EA, $EA // BIT $C000 (nope) +byte = $EA // NOP +byte = $D0, $EB // BNE -EA +byte = $28 // PLP +byte = $A6, $E5 // LDX ESP +byte = $E8 // INX +byte = $E8 // INX +byte = $60 // RTS + def game(spdrcnt)#1 var[8] xspdr, yspdr, ixspdr, iyspdr, hatch var xship, xmissle, leftxlaser, rightxlaser, attack - byte[8] life - byte lasercharge, misslecnt, ymissle, leftylaser, rightylaser, lefthit, righthit, width + byte[8] life, death + byte lasercharging, missleloading, misslecnt, ymissle + byte leftylaser, rightylaser, lefthit, righthit, sprtnum[], width byte spdrnum, k, xdelta, ydelta, btn0, btn1, webstate - xship = 140 - ymissle = 255 // Not active value - misslecnt = 6 - lasercharge = FULL_CHARGE + xship = 140 + ymissle = 255 // Not active value + misslecnt = 6 + missleloading = FALSE + lasercharging = FALSE // // Initialize the spiders (first is special) // @@ -197,6 +108,7 @@ def game(spdrcnt)#1 iyspdr[0] = -1 hatch[0] = 1 life[0] = 3 + death[0] = 0 attack = -1 webstate = 0 // @@ -211,6 +123,7 @@ def game(spdrcnt)#1 iyspdr[k] = -iyspdr[k - 1] hatch[k] = k / 2 + 1//hatch[k - 1] + 1 life[k] = 3 + death[k] = 0 next // // Initialize missle display @@ -222,7 +135,7 @@ def game(spdrcnt)#1 spriteDrawXor(sprtMissle) next hgrColor(1) - hgrRect(4, YSHIP+6, FULL_CHARGE * 4 + 4, 188) + hgrRect(4, YSHIP+6, LASER_RECHARGE * 4 + 4, 188) // // Main game loop // @@ -278,11 +191,13 @@ def game(spdrcnt)#1 iyspdr[k] = 0 spriteAdd(2, sprtWeb1) spritePosIndex(xspdr[k], WEB_LIMIT+7, 2) + buzz = WEB1_BUZZ webstate = 1 break is 1 spriteAdd(3, sprtWeb2) spritePosIndex(xspdr[k], WEB_LIMIT+15, 3) + buzz = WEB2_BUZZ webstate = 2 break is 2 @@ -299,6 +214,7 @@ def game(spdrcnt)#1 // return FALSE fin + buzz = WEB3_BUZZ webstate++ wend else @@ -306,7 +222,9 @@ def game(spdrcnt)#1 // // Move towards player during attack, but not too fast // - xspdr[k] = xspdr[k] + (xship - xspdr[k]) / (yspdr[k] > FASTMOVE_LIMIT ?? 2 :: 4) + xdelta = yspdr[k] > FASTMOVE_LIMIT ?? 2 :: 4 + xspdr[k] = xspdr[k] + (xship - xspdr[k]) / xdelta + buzz = ATTACK_BUZZ else // // Retreat at a progressively faster rate @@ -351,21 +269,47 @@ def game(spdrcnt)#1 fin fin spritePosIndex(xspdr[k], yspdr[k], k+SPIDER_SPRTEBASE) + elsif death[k] + // + // Splat sequence + // + death[k]-- + if death[k] + spriteAdd(k+SPIDER_SPRTEBASE, spriteDup(sprtSplat2)) + spritePosIndex(xspdr[k], yspdr[k], k+SPIDER_SPRTEBASE) + else + spriteAdd(k+SPIDER_SPRTEBASE, spriteDup(sprtDummy)) + spritePosIndex(0, 0, k+SPIDER_SPRTEBASE) + spdrcnt-- + if not spdrcnt + return TRUE + fin + buzz = SPLAT_BUZZ + fin fin next // // Move ship // - xdelta, ydelta, btn0, btn1 = joypos(ymissle/4) + xdelta, ydelta, btn0, btn1 = joypos(buzz) + buzz = spdrcnt * 4 xship = xship + ((xdelta + 4) / 8 - 5) if xship < 0; xship = 0; fin if xship > 279; xship = 279; fin - if btn0 and misslecnt and ymissle == 255 + spritePosIndex(xship, YSHIP, SHIP_SPRTNUM) + // + // Missle + // + if misslecnt and missleloading + missleloading-- + fin + if btn0 and not missleloading // // Fire missle // - xmissle = xship - ymissle = YSHIP-15 + xmissle = xship + ymissle = YSHIP-15 + missleloading = MISSLE_RELOAD misslecnt-- spritePos(misslecnt * 16 + 160, 184, sprtMissle) // Erase from armory spriteDrawXor(sprtMissle) @@ -396,9 +340,10 @@ def game(spdrcnt)#1 // // Hit & kill spider // - life[k] = 0 - spriteAdd(k+SPIDER_SPRTEBASE, spriteDup(sprtDummy)) - spritePosIndex(0, 0, k+SPIDER_SPRTEBASE) + life[k] = 0 + death[k] = 2 + spriteAdd(k+SPIDER_SPRTEBASE, spriteDup(sprtSplat1)) + spritePosIndex(xspdr[k], yspdr[k], k+SPIDER_SPRTEBASE) if attack == k // Was it attacking? attack = -1 spriteDel(2) @@ -406,10 +351,6 @@ def game(spdrcnt)#1 spriteDel(4) webstate = 0 fin - spdrcnt-- - if not spdrcnt - return TRUE - fin // // Remove missle // @@ -419,26 +360,30 @@ def game(spdrcnt)#1 fin fin next + buzz = ymissle/4 fin fin - if lasercharge < FULL_CHARGE - lasercharge++ + // + // Lasers + // + if lasercharging + lasercharging-- hgrColor(1) - hgrRect((lasercharge - 1) * 4 + 5, YSHIP+6, lasercharge * 4 + 4, 188) + hgrRect(81 - lasercharging*4, YSHIP+6, 84 - lasercharging*4, 188) fin - if btn1 and lasercharge == FULL_CHARGE + if btn1 and not lasercharging // // Fire laser // hgrColor(0) - hgrRect(4, YSHIP+6, FULL_CHARGE * 4 + 4, 188) - lasercharge = 0 - leftxlaser = xship - 7 - rightxlaser = xship + 7 - leftylaser = 0 - rightylaser = 0 - lefthit = 255 - righthit = 255 + hgrRect(4, YSHIP+6, LASER_RECHARGE * 4 + 4, 188) + lasercharging = LASER_RECHARGE + leftxlaser = xship - 7 + rightxlaser = xship + 7 + leftylaser = 0 + rightylaser = 0 + lefthit = 255 + righthit = 255 for k = 0 to spdrnum if life[k] // @@ -449,13 +394,13 @@ def game(spdrcnt)#1 else width = 10 // Spider width fin - if leftxlaser >= xspdr[k] - width and leftxlaser <= xspdr[k] + width + if leftxlaser >= xspdr[k]-width and leftxlaser <= xspdr[k]+width if yspdr[k] > leftylaser lefthit = k leftylaser = yspdr[k] fin fin - if rightxlaser >= xspdr[k] - width and rightxlaser <= xspdr[k] + width + if rightxlaser >= xspdr[k]-width and rightxlaser <= xspdr[k]+width if yspdr[k] > rightylaser righthit = k rightylaser = yspdr[k] @@ -467,10 +412,6 @@ def game(spdrcnt)#1 // Draw Laser beams // hgrColor(3) - //for k=0 to 1 - // if leftxlaser + k >= 0; hgrXorVLin(leftylaser, YSHIP-8, leftxlaser+k); fin - // if rightxlaser + k < 280;hgrXorVLin(rightylaser, YSHIP-8, rightxlaser-k); fin - //next if leftxlaser >= 0 hgrXorVLin(leftylaser, YSHIP-8, leftxlaser) hgrXorVLin(leftylaser, YSHIP-8, leftxlaser+1) @@ -479,7 +420,10 @@ def game(spdrcnt)#1 hgrXorVLin(rightylaser, YSHIP-8, rightxlaser) hgrXorVLin(rightylaser, YSHIP-8, rightxlaser-1) fin + buzz = LASER_BUZZ + (@_spkrTone)(15, 1)#0 if lefthit <> 255 + sprtnum = lefthit + SPIDER_SPRTEBASE // // Hit // @@ -488,8 +432,9 @@ def game(spdrcnt)#1 // // Kill spider // - spriteAdd(lefthit + SPIDER_SPRTEBASE, spriteDup(sprtDummy)) - spritePosIndex(0, 0, lefthit + SPIDER_SPRTEBASE) + death[lefthit] = 2 + spriteAdd(sprtnum, spriteDup(sprtSplat1)) + spritePosIndex(xspdr[lefthit], yspdr[lefthit], sprtnum) if attack == lefthit // Was it attacking? spriteDel(2) spriteDel(3) @@ -497,23 +442,22 @@ def game(spdrcnt)#1 webstate = 0 attack = -1 fin - spdrcnt-- - if not spdrcnt - return TRUE - fin else // // Dim color to show life status // if hatch[lefthit] - spriteAdd(lefthit + SPIDER_SPRTEBASE, spriteDup(life[lefthit] == 2 ?? sprtEgg2 :: sprtEgg1)) + sprtEgg = life[lefthit] == 2 ?? sprtEgg2 :: sprtEgg1 + spriteAdd(sprtnum, spriteDup(sprtEgg)) else - spriteAdd(lefthit + SPIDER_SPRTEBASE, spriteDup(life[lefthit] == 2 ?? sprtSpider2 :: sprtSpider1)) + sprtSpider = life[lefthit] == 2 ?? sprtSpider2 :: sprtSpider1 + spriteAdd(sprtnum, spriteDup(sprtSpider)) fin - spritePosIndex(xspdr[lefthit], yspdr[lefthit], lefthit+SPIDER_SPRTEBASE) + spritePosIndex(xspdr[lefthit], yspdr[lefthit], sprtnum) fin fin if righthit <> 255 and life[righthit] + sprtnum = righthit + SPIDER_SPRTEBASE // // Hit // @@ -522,8 +466,9 @@ def game(spdrcnt)#1 // // Kill spider // - spriteAdd(righthit + SPIDER_SPRTEBASE, spriteDup(sprtDummy)) - spritePosIndex(0, 0, righthit + SPIDER_SPRTEBASE) + death[righthit] = 2 + spriteAdd(sprtnum, spriteDup(sprtSplat1)) + spritePosIndex(xspdr[righthit], yspdr[righthit], sprtnum) if attack == righthit // Was it attacking? spriteDel(2) spriteDel(3) @@ -531,30 +476,24 @@ def game(spdrcnt)#1 webstate = 0 attack = -1 fin - spdrcnt-- - if not spdrcnt - return TRUE - fin else // // Dim color to show life status // if hatch[righthit] - spriteAdd(righthit + SPIDER_SPRTEBASE, spriteDup(life[righthit] == 2 ?? sprtEgg2 :: sprtEgg1)) + sprtEgg = life[righthit] == 2 ?? sprtEgg2 :: sprtEgg1 + spriteAdd(sprtnum, spriteDup(sprtEgg)) else - spriteAdd(righthit + SPIDER_SPRTEBASE, spriteDup(life[righthit] == 2 ?? sprtSpider2 :: sprtSpider1)) + sprtSpider = life[righthit] == 2 ?? sprtSpider2 :: sprtSpider1 + spriteAdd(sprtnum, spriteDup(sprtSpider)) fin - spritePosIndex(xspdr[righthit], yspdr[righthit], righthit+SPIDER_SPRTEBASE) + spritePosIndex(xspdr[righthit], yspdr[righthit], sprtnum) fin fin // // Undraw lasers // hgrColor(3) - //for k=0 to 1 - // if leftxlaser + k >= 0; hgrXorVLin(leftylaser, YSHIP-8, leftxlaser+k); fin - // if rightxlaser + k < 280;hgrXorVLin(rightylaser, YSHIP-8, rightxlaser-k); fin - //next if leftxlaser >= 0 hgrXorVLin(leftylaser, YSHIP-8, leftxlaser) hgrXorVLin(leftylaser, YSHIP-8, leftxlaser+1) @@ -564,35 +503,110 @@ def game(spdrcnt)#1 hgrXorVLin(rightylaser, YSHIP-8, rightxlaser-1) fin fin - spritePosIndex(xship, YSHIP, SHIP_SPRTNUM) spriteDrawXorList() - updateStars - until ^$C000 == $9B + // + // Update stars + // + hgrColor(3) + hgrXorPlot(xstar[curstar], ystar[curstar]) + ystar[curstar]++ + if ystar[curstar] > YSHIP + ystar[curstar] = 0 + fin + hgrXorPlot(xstar[curstar], ystar[curstar]) + curstar++ + if curstar >= NUMSTARS; curstar = 0; fin + until ^$C000 == $9B // ESCape key pressed getc return FALSE end - +// +// Initialization +// +puts("Loading"); +putc('.') +sprtShip = spriteRead("SHIP") +if not sprtShip + cmdsys:modexec("SFMSPRT") + sprtShip = spriteRead("SHIP") + if not sprtShip + puts("\nError: Unable to compile sprites.\n") + return -1 + fin +fin +putc('.') +sprtMissle = spriteRead("MISSLE") +putc('.') +sprtEgg3 = spriteRead("EGG3") +putc('.') +sprtEgg2 = spriteRead("EGG2") +putc('.') +sprtEgg1 = spriteRead("EGG1") +putc('.') +sprtSpider3= spriteRead("SPIDER3") +putc('.') +sprtSpider2= spriteRead("SPIDER2") +putc('.') +sprtSpider1= spriteRead("SPIDER1") +putc('.') +sprtWeb1 = spriteRead("WEB1") +putc('.') +sprtWeb2 = spriteRead("WEB2") +putc('.') +sprtWeb3 = spriteRead("WEB3") +putc('.') +sprtSplat1 = spriteRead("SPLAT1") +putc('.') +sprtSplat2 = spriteRead("SPLAT2") +putc('.') +sprtDummy = spriteRead("DUMMY") +// +// Heat up JIT compiler +// +spriteAdd(0, sprtDummy) +for curstar = 0 to 50 + putc('.') + spriteDrawXorList() +next hgrMode -spriteDrawBuf(hgrDrawBuf(0)) // So we can see the compile process -sprtShip = spriteCompile(14, 14, 7, 13, @ship) -sprtMissle = spriteCompile( 6, 8, 3, 0, @missle) -sprtEgg3 = spriteCompile(14, 12, 7, 6, @egg3) -sprtEgg2 = spriteCompile(14, 12, 7, 6, @egg2) -sprtEgg1 = spriteCompile(14, 12, 7, 6, @egg1) -sprtSpider3= spriteCompile(20, 13, 10, 6, @spider3) -sprtSpider2= spriteCompile(20, 13, 10, 6, @spider2) -sprtSpider1= spriteCompile(20, 13, 10, 6, @spider1) -sprtWeb1 = spriteCompile( 8, 8, 4, 0, @web1) -sprtWeb2 = spriteCompile(12, 8, 6, 0, @web2) -sprtWeb3 = spriteCompile(20, 8, 10, 0, @web3) -sprtDummy = spriteCompile( 7, 8, 0, 0, @dummy) -hgrColor(0) -hgrClear() +spriteDrawBuf(hgrDrawBuf(0)) // Single buffered spriteAdd(SHIP_SPRTNUM, sprtShip) spriteAdd(SPIDER_SPRTEBASE, sprtEgg3) -initStars -won = game(8) +// +// Init stars +// +xstar[0] = 99 +ystar[0] = 10 +hgrColor(3) +hgrXorPlot(xstar[0], ystar[0]) +for curstar = 1 to NUMSTARS-1 + xstar[curstar] = (xstar[curstar - 1] + 97 - curstar) % 280 + ystar[curstar] = (ystar[curstar - 1] + 19 + curstar) % YSHIP + hgrXorPlot(xstar[curstar], ystar[curstar]) +next +curstar = 0 +if game(8) + // + // Won + // + spriteDrawXorList() + (@_spkrTone)(100, 20)#0 + (@_spkrTone)(75, 20)#0 + (@_spkrTone)(15, 20)#0 + (@_spkrTone)(25, 100)#0 +else + // + // Lost + // + spriteDrawXorList() + (@_spkrTone)(100, 50)#0 + spriteDrawXor(sprtShip) + (@_spkrTone)(150, 50)#0 + spriteDrawXor(sprtShip) + (@_spkrTone)(100, 50)#0 + spriteDrawXor(sprtShip) + (@_spkrTone)(150, 50)#0 +fin txtMode -puts(won ?? "You won!\n" :: "You lost.\n") -puts("Available memory: "); puti(heapavail()); putln +puts("\nAvailable memory: "); puti(heapavail()); putln done diff --git a/src/tftpbld b/src/tftpbld index 57f2819..d781be5 100755 --- a/src/tftpbld +++ b/src/tftpbld @@ -53,5 +53,6 @@ echo "BLD/SAMPLES/FATCAT.PLA"; atftp $1 --put -l samplesrc/fatcat.pla -r $ echo "BLD/SAMPLES/GFXDEMO.PLA"; atftp $1 --put -l samplesrc/gfxdemo.pla -r $2/BLD/SAMPLES/GFXDEMO.PLA#040000 echo "BLD/SAMPLES/LZ4CAT.PLA"; atftp $1 --put -l samplesrc/lz4cat.pla -r $2/BLD/SAMPLES/LZ4CAT.PLA#040000 echo "BLD/SAMPLES/SFM.PLA"; atftp $1 --put -l samplesrc/sfm.pla -r $2/BLD/SAMPLES/SFM.PLA#040000 +echo "BLD/SAMPLES/SFMSPRT.PLA"; atftp $1 --put -l samplesrc/sfmsprt.pla -r $2/BLD/SAMPLES/SFMSPRT.PLA#040000 echo "BLD/SAMPLES/MON.PLA"; atftp $1 --put -l utilsrc/apple/mon.pla -r $2/BLD/SAMPLES/MON.PLA#040000 diff --git a/src/tftpdemos b/src/tftpdemos index bf22589..54d052c 100755 --- a/src/tftpdemos +++ b/src/tftpdemos @@ -9,7 +9,10 @@ echo "DEMOS/HGRTEST"; atftp $1 --put -l rel/apple/HGRTEST#FE1000 echo "DEMOS/GRTEST"; atftp $1 --put -l rel/apple/GRTEST#FE1000 -r $2/DEMOS/GRTEST#FE1000 echo "DEMOS/INT32TEST"; atftp $1 --put -l rel/INT32TEST#FE1000 -r $2/DEMOS/INT32TEST#FE1000 echo "DEMOS/DGRTEST"; atftp $1 --put -l rel/apple/DGRTEST#FE1000 -r $2/DEMOS/DGRTEST#FE1000 -echo "DEMOS/SFM"; atftp $1 --put -l rel/apple/SFM#FE1000 -r $2/DEMOS/SFM#FE1000 + +# Spiders from Mars +echo "DEMOS/SPIDERS/SFM"; atftp $1 --put -l rel/apple/SFM#FE1000 -r $2/DEMOS/SPIDERS/SFM#FE1000 +echo "DEMOS/SPIDERS/SFMSPRT"; atftp $1 --put -l rel/apple/SFMSPRT#FE1000 -r $2/DEMOS/SPIDERS/SFMSPRT#FE1000 # Music demo echo "DEMOS/MUSIC/PLAYSEQ"; atftp $1 --put -l rel/apple/PLAYSEQ#FE1000 -r $2/DEMOS/MUSIC/PLAYSEQ#FE1000