Jump to content

  • Log In with Google      Sign In   
  • Create Account

New Old Things

A C64 Game - Step 82

Posted by , in C64 12 January 2013 - - - - - - · 983 views

A few very small updates coming up, here's the next portal stage. Have fun!

Attached Image


Previous Step Next Step

Attached Files




A C64 Game - Step 81

Posted by , in C64 05 January 2013 - - - - - - · 1,028 views

A new pickup! And it shines Posted Image

Sometimes one of those wondrous bullets of Samuel Colt will be dropped. Those can kill any enemy with one shot, so use them well!

Attached Image

The changes are quite simple. In the PickupItem routine we add a handler for those new items:
                  cmp #ITEM_SUPER_BULLET
		  beq .EffectSuperBullet
We make sure only Dean can use it and increase the super bullet counter:



.EffectSuperBullet		 
		  cpx #1
		  beq .SamDoesNotUseBullets
		 
		  inc SUPER_BULLET
The super bullet shot will flash red instead of white, so we add:





		  ;red flash for super bullet
		  lda SUPER_BULLET
		  beq +
		 
		  lda #2
		  jmp ++
		 
+		 
		  lda #1
++		 		  sta VIC_BACKGROUND_COLOR
and finally, at the enemy shot routine we add





                  lda SUPER_BULLET
		  beq +
		 
		  ;directly kill enemy
		  dec SUPER_BULLET
		  jmp .EnemyKilled
		 
+		 
		  lda SPRITE_HP,x
		  dec SPRITE_HP,x
		  lda SPRITE_HP,x
		  beq .EnemyKilled
Done!

BTW, the super bullet also works on bosses!


Previous Step Next Step

Attached Files




A C64 Game - Step 80

Posted by , in C64 08 December 2012 - - - - - - · 1,282 views

Did you notice the huge door in the background? It's about time it opens!

Attached Image

That's actually pretty simple. At the jump-to-next level code we add a check. Whether the open door animation is shown depends on a bit in the LEVEL_CONFIG byte.

GoToNextLevel

		  lda LEVEL_CONFIG

		  and #$04

		  beq .NoDoorAnim

		

		  jsr DoorAnim



.NoDoorAnim


The actual animation is straight forward. The door location is hard coded, and we simply copy the characters one step to the outer side and replace the innermost characters with empty space.

Notice that we use a method which is not possible that easy in todays code: We have a local code loop until the door is completely opened.
Since there are no events to be handled, messages to be retrieved or other OS specific code required, we can do that.





;------------------------------------------------------------

;open door animation

;------------------------------------------------------------

!zone DoorAnim

DoorAnim

		  lda #0

		  sta LEVEL_DONE_DELAY



.DoorAnimLoop

		  jsr WaitFrame

		

		  inc LEVEL_DONE_DELAY

		  lda LEVEL_DONE_DELAY

		  and #$07

		  bne .DoorAnimLoop

		

		  ;open door (16,11)

		  lda #11

		  sta PARAM2

		

-		

		  ldy PARAM2

		  lda SCREEN_LINE_OFFSET_TABLE_LO,y

		  sta ZEROPAGE_POINTER_1

		  lda SCREEN_LINE_OFFSET_TABLE_HI,y

		  sta ZEROPAGE_POINTER_1 + 1

		

		  ldy #17

		  lda (ZEROPAGE_POINTER_1),y

		  dey

		  sta (ZEROPAGE_POINTER_1),y

		  ldy #18

		  lda (ZEROPAGE_POINTER_1),y

		  dey

		  sta (ZEROPAGE_POINTER_1),y

		  ldy #19

		  lda (ZEROPAGE_POINTER_1),y

		  dey

		  sta (ZEROPAGE_POINTER_1),y

		  lda #32

		  ldy #19

		  sta (ZEROPAGE_POINTER_1),y

		

		  ldy #22

		  lda (ZEROPAGE_POINTER_1),y

		  iny

		  sta (ZEROPAGE_POINTER_1),y

		  ldy #21

		  lda (ZEROPAGE_POINTER_1),y

		  iny

		  sta (ZEROPAGE_POINTER_1),y

		  ldy #20

		  lda (ZEROPAGE_POINTER_1),y

		  iny

		  sta (ZEROPAGE_POINTER_1),y

		

		  lda #32

		  ldy #20

		  sta (ZEROPAGE_POINTER_1),y

		

		  inc PARAM2

		  lda PARAM2

		  cmp #21

		  bne -

		  ;

		  lda LEVEL_DONE_DELAY

		  lsr

		  lsr

		  lsr

		  cmp #4

		  bne .DoorAnimLoop

		  ;door is fully open now

-

		  jsr WaitFrame

		

		  inc LEVEL_DONE_DELAY

		  lda LEVEL_DONE_DELAY

		  cmp #200

		  bne -

		  rts



Also, since I'm going on vacation this tutorial takes a break until next year. Thanks for your support so far, have fun!


Previous Step Next Step

Attached Files




A C64 Game - Step 79

Posted by , in C64 01 December 2012 - - - - - - · 993 views

Almost a new feature: For the final level range the enemies spawn in waves. In this level, after beating the wolfmen two more waves of other enemies come in. And all without any more memory in the level data!

Attached Image

The key is in the previously used SPAWN_SPOT_SPAWN_COUNT. We use the upper 4 bits to contain the wave the spawn spots is part of. This limits us to 15 enemies per spawn spot which we were never even close to.

We add a new counter named NUMBER_DELAYED_SPAWN_SPOTS_ALIVE. This contains the number of spawn spots that are currently not active (future waves). SPAWN_SPOT_LEVEL holds the wave number (in the upper for bits, that's why we add 16)

The ProcessSpawnSpots routine is enhanced thusly:

		  lda NUMBER_ENEMIES_ALIVE
		  ora NUMBER_SPAWN_SPOTS_ALIVE
		  bne .NoDelayedSpawnSpots
		
		  lda NUMBER_DELAYED_SPAWN_SPOTS_ALIVE
		  beq .NoDelayedSpawnSpots
		
		  ;undelay them now
		  lda SPAWN_SPOT_LEVEL
		  clc
		  adc #16
		  sta SPAWN_SPOT_LEVEL
		
		  ;check all spots
		  ldx #0
-		
		  lda SPAWN_SPOT_ACTIVE,x
		  beq +
		
		  lda SPAWN_SPOT_SPAWN_COUNT,x
		  and #$f0
		  cmp SPAWN_SPOT_LEVEL
		  bne +
		
		  ;undelay now
		  lda SPAWN_SPOT_SPAWN_COUNT,x
		  and #$0f
		  sta SPAWN_SPOT_SPAWN_COUNT,x
		
		  dec NUMBER_DELAYED_SPAWN_SPOTS_ALIVE
		  inc NUMBER_SPAWN_SPOTS_ALIVE
		
+		
		  inx
		  cpx #SPAWN_SPOT_COUNT
		  bne -
.NoDelayedSpawnSpots

Obviously in the spawn spot update loop we need to skip any spawn spots where the upper four bits are set:

		  lda SPAWN_SPOT_SPAWN_COUNT,x
		  and #$f0
		  bne .NextSpawnSpot

Also, during level buildup we need to increment the correct counter depending on the upper four bits again:

;count
		  iny
		  lda (ZEROPAGE_POINTER_1),y
		  sta SPAWN_SPOT_SPAWN_COUNT,x
		
		  ;upper 4 bits set? then it's a delayed spawn spot!
		  and #$f0
		  bne +
		  inc NUMBER_SPAWN_SPOTS_ALIVE
		  jmp ++
+
		  inc NUMBER_DELAYED_SPAWN_SPOTS_ALIVE
++

Have fun surviving!


Previous Step Next Step

Attached Files




A C64 Game - Step 78

Posted by , in C64 24 November 2012 - - - - - - · 1,178 views

Added and streamlined all story pages. Now we have locations (mentioned) and a crude "story arc". Plus a little animation on the last two bosses. There's no higher meaning behind the locations, I just wandered about USA with Google maps ;)

Showing no code this time, since it's merely added text to existing tables.

The aforementioned animation is a simple xor call on the sprite pointer:

		  lda SPRITE_POINTER_BASE,x
		  eor #1
		  sta SPRITE_POINTER_BASE,x

Attached Image


Previous Step Next Step

Attached Files




A C64 Game - Step 77

Posted by , in C64 17 November 2012 - - - - - - · 1,150 views

And another boss. This one is different, as it spawns bats to the left and right. And is only vulnerable during that part ;)

Attached Image

The boss routine is a bit bigger this time. The attacking bat code is already there, so nothing to add on that part.
As behaviours got increasingly complex I started to write the state values on top of the routines. Remember, any states with MSB set (>=128) mark the object as invincible.

;------------------------------------------------------------
;boss #5
;state 128 = find target Y
;state 129 = move towards target Y
;state 0 = attack
;state 130 = cool off
;------------------------------------------------------------
!zone BehaviourBoss6
BehaviourBoss6
BOSS_MOVE_SPEED = 1
		  lda SPRITE_HITBACK,x
		  beq .NoHitBack
		  dec SPRITE_HITBACK,x
		
		  ldy SPRITE_HITBACK,x
		  lda BOSS_FLASH_TABLE,y
		  sta VIC_SPRITE_COLOR,x
		
		  cpy #0
		  bne .NoHitBack
		  lda #1
		  sta VIC_SPRITE_COLOR,x
		  ;keep invulnerable
.NoHitBack	  
		  lda DELAYED_GENERIC_COUNTER
		  and #$03
		  bne .NoAnimUpdate
		
.NoAnimUpdate  
		  lda SPRITE_STATE,x
		  beq .Attack
		  cmp #128
		  bne +
		  jmp .FindTargetY
+		
		  cmp #129
		  beq .MoveTowardsTarget
		  cmp #130
		  beq .CoolOff
		
		  lda #0
		  sta SPRITE_STATE,x
		  rts
		
.CoolOff
		  inc SPRITE_MODE_POS,x
		  lda SPRITE_MODE_POS,x
		  cmp #30
		  bne +
		
		  lda #128
		  sta SPRITE_STATE,x
		
+		
		  rts
		
.Attack
		  inc SPRITE_MOVE_POS,x
		  lda SPRITE_MOVE_POS,x
		  and #$1f
		  cmp #$1f
		  beq +
		  rts
		
+		
		  ;free bats
		  inc SPRITE_MODE_POS,x
		  lda SPRITE_MODE_POS,x
		  cmp #5
		  bne +
		
		  lda #130
		  sta SPRITE_STATE,x
		  lda #0
		  sta SPRITE_MODE_POS,x
		  rts
		
+		
		  lda SPRITE_CHAR_POS_X,x
		  sta PARAM1
		  lda SPRITE_CHAR_POS_Y,x
		  sta PARAM2
		  inc PARAM2
		  stx PARAM10
		  jsr FindEmptySpriteSlot
		  beq ++
		
		  lda #TYPE_BAT_ATTACKING
		  sta PARAM3
		  jsr SpawnObject
		  lda #0
		  sta SPRITE_DIRECTION,x
		  jsr FindEmptySpriteSlot
		  beq ++
		  jsr SpawnObject
		  lda #1
		  sta SPRITE_DIRECTION,x
		
++		
		  ldx PARAM10
		  rts
		
		
.MoveTowardsTarget
		  ;player index in y
		  lda SPRITE_VALUE,x
		  cmp SPRITE_CHAR_POS_Y,x
		  bne +

		  ;arrived at target Y
		  lda #0
		  sta SPRITE_MODE_POS,x
		  sta SPRITE_STATE,x
		  rts
		
+		
		  bpl .MoveDown
		
		  ;move up?
		  lda SPRITE_DIRECTION_Y,x
		  bne .AlreadyLookingUp
		  lda SPRITE_MOVE_POS_Y,x
		  beq .TurnUNow
		  dec SPRITE_MOVE_POS_Y,x
		  bne .DoGhostMove
		
.TurnUNow		
		  ;turning now
		  lda #1
		  sta SPRITE_DIRECTION_Y,x
		  jmp .DoGhostMove
		
.AlreadyLookingUp
		  lda SPRITE_MOVE_POS_Y,x
		  cmp #BOSS_MOVE_SPEED
		  beq .DoGhostMove
		  inc SPRITE_MOVE_POS_Y,x
		  jmp .DoGhostMove
		
.MoveDown
		  lda SPRITE_DIRECTION_Y,x
		  beq .AlreadyLookingDown
		
		  lda SPRITE_MOVE_POS_Y,x
		  beq .TurnDNow
		  dec SPRITE_MOVE_POS_Y,x
		  bne .DoGhostMove
		
		  ;turning now
.TurnDNow		
		  lda #0
		  sta SPRITE_DIRECTION_Y,x
		  jmp .DoGhostMove
		
.AlreadyLookingDown
		  lda SPRITE_MOVE_POS_Y,x
		  cmp #BOSS_MOVE_SPEED
		  beq .DoGhostMove
		  inc SPRITE_MOVE_POS_Y,x
		  jmp .DoGhostMove
.DoGhostMove
		  ;move X times
		  ldy SPRITE_MOVE_POS_Y,x
		  sty PARAM4
		  beq .MoveDone
		
		  lda SPRITE_DIRECTION_Y,x
		  beq .DoDown
.MoveLoopU
		  jsr ObjectMoveUpBlocking
		  dec PARAM4
		  bne .MoveLoopU
		  jmp .MoveDone
		
.DoDown
.MoveLoopD
		  jsr ObjectMoveDownBlockingNoPlatform
		  dec PARAM4
		  bne .MoveLoopD
		
.MoveDone	  
		  rts
		
.FindTargetY
		  lda #4
		  sta PARAM5
		  lda #18
		  sta PARAM6
		  jsr GenerateRangedRandom
		  sta SPRITE_VALUE,x
		  inc SPRITE_STATE,x
		  rts

Have fun!


Previous Step Next Step

Attached Files




A C64 Game - Step 76

Posted by , in C64 10 November 2012 - - - - - - · 1,293 views

And yet another 10 stages. A few animation bugs show up with the water, in general there seems to be another fixing step coming up.

Attached Image

Have fun!


Previous Step Next Step

Attached Files




A C64 Game - Step 75

Posted by , in C64 03 November 2012 - - - - - - · 1,313 views

And more! Now the executable hit the load barrier, so Exomizer is the only way to go onwards (before it was optional). Added a new waterfall char with the same effect as low water.

Attached Image

At the same location the other char is initiated we add this:

ldx #0
-		
		  lda $F800 + 143 * 8,x
		  sta ANIM_TILE2_BYTES,x
		  sta ANIM_TILE2_BYTES + 8,x
		
		  inx
		  dey
		  cpx #8
		  bne -

At the location where we animate the first char we add this. Note that the second sta at $c000 is for the second char set.

;animate water tile
		  lda DELAYED_GENERIC_COUNTER
		  and #$03
		  bne +
		
		  inc ANIM_POS
		  lda ANIM_POS
		  and #$07
		  tay
		
		  lda ANIM_TILE_BYTES,y
		  sta $F800 + 111 * 8
		  sta $C000 + 111 * 8
		  lda ANIM_TILE_BYTES + 8,y
		  sta $F800 + 111 * 8 + 1
		  sta $C000 + 111 * 8 + 1
		  sty PARAM1
		  lda #7
		  sec
		  sbc PARAM1
		  tay
		  ldx #0
-		
		  lda ANIM_TILE2_BYTES,y
		  sta $F800 + 143 * 8,x
		  sta $C000 + 143 * 8,x
		
		  inx
		  iny
		  cpx #8
		  bne -
		
		
+


And finally, the actual check for the water char (143) is enhanced:

;check if we're in water
		  ldy SPRITE_CHAR_POS_Y,x
		  lda SCREEN_LINE_OFFSET_TABLE_LO,y
		  sta ZEROPAGE_POINTER_1
		  lda SCREEN_BACK_LINE_OFFSET_TABLE_HI,y
		  sta ZEROPAGE_POINTER_1 + 1
		  lda SPRITE_CHAR_POS_X,x
		  tay
		  lda (ZEROPAGE_POINTER_1),y
		  cmp #111
		  beq .NextObject
		  cmp #143
		  beq .NextObject

Another enhancement, due to packing. Now that the packer takes care of putting the sprites and characters sets at their target location we can comment them out (plus their copy routines).
With ACME or the C64 Studio assembler you do it like this:

!ifndef CRUNCHED {
CHARSET
		  !binary "j.chr"
CHARSET_2		
		  !binary "j2.chr"
		
SPRITES
		  !binary "j.spr"
END_OF_FILE
}

That's all there is to this step, have fun!


Previous Step Next Step

Attached Files




A C64 Game - Step 74

Posted by , in C64 26 October 2012 - - - - - - · 1,143 views

Another boss!

And one, that works differently than the others before him.

Attached Image

This boss is spawning bats that fly left/right and vanish once hitting the screen border.
Thus we remove the path-8-flying bat and replace it by a simple attacking bat:

!zone BehaviourBatAttacking
BehaviourBatAttacking
		  lda DELAYED_GENERIC_COUNTER
		  and #$03
		  bne .NoAnimUpdate
		
		  inc SPRITE_ANIM_POS,x
		  lda SPRITE_ANIM_POS,x
		  and #$03
		  sta SPRITE_ANIM_POS,x
		
		  tay
		  lda BAT_ANIMATION,y
		  sta SPRITE_POINTER_BASE,x
		
.NoAnimUpdate		
		  lda #3
		  sta PARAM1
		  lda SPRITE_DIRECTION,x
		  beq .MoveRight
.MoveLeft
		  jsr ObjectMoveLeft
		  dec PARAM1
		  bne .MoveLeft
		  jmp .XMoveDone
		
.MoveRight
		  jsr ObjectMoveRight
		  dec PARAM1
		  bne .MoveRight
		
.XMoveDone
		  lda SPRITE_CHAR_POS_X,x
		  cmp #255
		  beq .RemoveMe
		  cmp #39
		  beq .RemoveMe
		  rts
		
.RemoveMe
		  inc SPAWN_NO_ITEM
		  jsr KillEnemy
		  dec SPAWN_NO_ITEM
		  rts


The boss itself is not really clever. It calculates a random y position, moves there, spawns bats and starts all over again. Note that it is only vulnerable while spawning bats though Posted Image
Remember, vulnerability is controlled by having the MSB set in SPRITE_STATE,x.

;------------------------------------------------------------
;boss #5
;state 0 = find target Y
;state 1 = move towards target Y
;state 2 = attack
;state 3 = cool off
;------------------------------------------------------------
!zone BehaviourBoss5
BehaviourBoss5
BOSS_MOVE_SPEED = 1
		  lda SPRITE_HITBACK,x
		  beq .NoHitBack
		  dec SPRITE_HITBACK,x
		
		  ldy SPRITE_HITBACK,x
		  lda BOSS_FLASH_TABLE,y
		  sta VIC_SPRITE_COLOR,x
		
		  cpy #0
		  bne .NoHitBack
		  lda #1
		  sta VIC_SPRITE_COLOR,x
		  ;make vulnerable again
		  lda SPRITE_STATE,x
		  cmp #128
		  bne .NoHitBack
		
		
		  lda #0
		  sta SPRITE_STATE,x
	  
.NoHitBack	  
		  lda DELAYED_GENERIC_COUNTER
		  and #$03
		  bne .NoAnimUpdate
		
.NoAnimUpdate  
		  lda SPRITE_STATE,x
		  bne +
		  jmp .FindTargetY
+		
		  cmp #1
		  beq .MoveTowardsTarget
		  cmp #2
		  beq .Attack
		  cmp #3
		  beq .CoolOff
		
		  lda #0
		  sta SPRITE_STATE,x
		  rts
		
.CoolOff
		  inc SPRITE_MODE_POS,x
		  lda SPRITE_MODE_POS,x
		  cmp #30
		  bne +
		
		  lda #0
		  sta SPRITE_STATE,x
		
+		
		  rts
		
.Attack
		  inc SPRITE_MOVE_POS,x
		  lda SPRITE_MOVE_POS,x
		  and #$1f
		  cmp #$1f
		  beq +
		  rts
		
+		
		  ;free bats
		  inc SPRITE_MODE_POS,x
		  lda SPRITE_MODE_POS,x
		  cmp #5
		  bne +
		
		  inc SPRITE_STATE,x
		  lda #0
		  sta SPRITE_MODE_POS,x
		  rts
		
+		
		  lda SPRITE_CHAR_POS_X,x
		  sta PARAM1
		  lda SPRITE_CHAR_POS_Y,x
		  sta PARAM2
		  inc PARAM2
		  stx PARAM10
		  jsr FindEmptySpriteSlot
		  beq ++
		
		  lda #TYPE_BAT_ATTACKING
		  sta PARAM3
		  jsr SpawnObject
		  lda #0
		  sta SPRITE_DIRECTION,x
		  jsr FindEmptySpriteSlot
		  beq ++
		  jsr SpawnObject
		  lda #1
		  sta SPRITE_DIRECTION,x
		
++		
		  ldx PARAM10
		  rts
		
		
.MoveTowardsTarget
		  ;player index in y
		  lda SPRITE_VALUE,x
		  cmp SPRITE_CHAR_POS_Y,x
		  bne +

		  ;arrived at target Y
		  inc SPRITE_STATE,x
		  lda #0
		  sta SPRITE_MODE_POS,x
		  rts
		
+		
		  bpl .MoveDown
		
		  ;move up?
		  lda SPRITE_DIRECTION_Y,x
		  bne .AlreadyLookingUp
		  lda SPRITE_MOVE_POS_Y,x
		  beq .TurnUNow
		  dec SPRITE_MOVE_POS_Y,x
		  bne .DoGhostMove
		
.TurnUNow		
		  ;turning now
		  lda #1
		  sta SPRITE_DIRECTION_Y,x
		  jmp .DoGhostMove
		
.AlreadyLookingUp
		  lda SPRITE_MOVE_POS_Y,x
		  cmp #BOSS_MOVE_SPEED
		  beq .DoGhostMove
		  inc SPRITE_MOVE_POS_Y,x
		  jmp .DoGhostMove
		
.MoveDown
		  lda SPRITE_DIRECTION_Y,x
		  beq .AlreadyLookingDown
		
		  lda SPRITE_MOVE_POS_Y,x
		  beq .TurnDNow
		  dec SPRITE_MOVE_POS_Y,x
		  bne .DoGhostMove
		
		  ;turning now
.TurnDNow		
		  lda #0
		  sta SPRITE_DIRECTION_Y,x
		  jmp .DoGhostMove
		
.AlreadyLookingDown
		  lda SPRITE_MOVE_POS_Y,x
		  cmp #BOSS_MOVE_SPEED
		  beq .DoGhostMove
		  inc SPRITE_MOVE_POS_Y,x
		  jmp .DoGhostMove
.DoGhostMove
		  ;move X times
		  ldy SPRITE_MOVE_POS_Y,x
		  sty PARAM4
		  beq .MoveDone
		
		  lda SPRITE_DIRECTION_Y,x
		  beq .DoDown
.MoveLoopU
		  jsr ObjectMoveUpBlocking
		  dec PARAM4
		  bne .MoveLoopU
		  jmp .MoveDone
		
.DoDown
.MoveLoopD
		  jsr ObjectMoveDownBlockingNoPlatform
		  dec PARAM4
		  bne .MoveLoopD
		
.MoveDone	  
		  rts
		
.FindTargetY
		  lda #4
		  sta PARAM5
		  lda #18
		  sta PARAM6
		  jsr GenerateRangedRandom
		  sta SPRITE_VALUE,x
		  inc SPRITE_STATE,x
		  rts

For the boss routine we require a little utility function which returns a ranged random number. No division or module means manual work: create random number, subtract range until it's small enough, then add the lower range.


;lower end = PARAM5		
;higher end = PARAM6
GenerateRangedRandom
		  lda PARAM6
		  sec
		  sbc PARAM5
		  clc
		  adc #1
		  sta PARAM6
		  jsr GenerateRandomNumber
.CheckValue		
		  cmp PARAM6
		  bcc .ValueOk
		
		  ;too high
		  sec
		  sbc PARAM6
		  jmp .CheckValue
.ValueOk
		  clc
		  adc PARAM5
		  rts


Have fun!



Previous Step Next Step

Attached Files




A C64 Game - Step 73

Posted by , in C64 19 October 2012 - - - - - - · 1,170 views

Nothing new code wise this time, but something necessary: Packing.

The normal file now hits the 40Kb mark, and it's slowly getting too big to simply load. Remember the memory layout?
There is free memory from 2048 to 49151. Above that address the Basic and Kernal are overlayed over RAM. And both are active by default when loading.

Here comes Exomizer to the rescue. It's a cross plattform packer tool targetting old computers with little memory. It compiles code parts, unpacks them to specific memory locations and even takes care of the ROM/RAM settings. Terrific!

In the .zip file there's the executable and a changed .c64 project file. In C64 Studio you'll now find a new build config "Default Crunched". This builds the file as normal and as a post build step calls Exomizer:
$(BuildTargetPath)/exomizer sfx 2064 $(BuildTargetFilename) -t64 -n -o $(BuildTargetPath)/gamecrunched.bin
..and copies over to the original output file name:
copy $(BuildTargetPath)\gamecrunched.bin $(BuildTargetPath)\jmain.prg /Y

The latter step allows us to still debug through the code as usual, since C64 Studio starts the file with the name given in the !to directive.

Attached File  step73.zip (181.65KB)
downloads: 119

Previous Step Next Step






December 2016 »

S M T W T F S
    123
4567 8 910
11121314151617
18192021222324
25262728293031