mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2024-11-25 18:33:11 +00:00
apple2 has 64k now
This commit is contained in:
parent
27cae568fc
commit
113fdd4099
@ -1,3 +1,9 @@
|
|||||||
|
|
||||||
|
/*
|
||||||
|
* An Apple ][ port of the Cosmic Impalas game
|
||||||
|
* described in the book
|
||||||
|
* "Making 8-bit Arcade Games in C"
|
||||||
|
*/
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <conio.h>
|
#include <conio.h>
|
||||||
@ -14,6 +20,7 @@ typedef unsigned short word;
|
|||||||
#define PEEK(addr) (*(unsigned char*) (addr))
|
#define PEEK(addr) (*(unsigned char*) (addr))
|
||||||
#define PEEKW(addr) (*(unsigned*) (addr))
|
#define PEEKW(addr) (*(unsigned*) (addr))
|
||||||
#define STROBE(addr) __asm__ ("sta %w", addr)
|
#define STROBE(addr) __asm__ ("sta %w", addr)
|
||||||
|
|
||||||
// speaker click
|
// speaker click
|
||||||
#define CLICK STROBE(0xc030)
|
#define CLICK STROBE(0xc030)
|
||||||
|
|
||||||
@ -78,8 +85,6 @@ const byte MOD7[256] = {
|
|||||||
// bitmask table
|
// bitmask table
|
||||||
const byte BIT7[7] = { 1, 2, 4, 8, 16, 32, 64 };
|
const byte BIT7[7] = { 1, 2, 4, 8, 16, 32, 64 };
|
||||||
|
|
||||||
#pragma static-locals(on)
|
|
||||||
|
|
||||||
/// SOUND FUNCTIONS
|
/// SOUND FUNCTIONS
|
||||||
|
|
||||||
void tone(byte period, byte dur, sbyte mod) {
|
void tone(byte period, byte dur, sbyte mod) {
|
||||||
@ -93,6 +98,7 @@ void tone(byte period, byte dur, sbyte mod) {
|
|||||||
|
|
||||||
/// GRAPHICS FUNCTIONS
|
/// GRAPHICS FUNCTIONS
|
||||||
|
|
||||||
|
// clear screen and set graphics mode
|
||||||
void clrscr() {
|
void clrscr() {
|
||||||
STROBE(0xc052); // turn off mixed-mode
|
STROBE(0xc052); // turn off mixed-mode
|
||||||
STROBE(0xc054); // page 1
|
STROBE(0xc054); // page 1
|
||||||
@ -101,6 +107,7 @@ void clrscr() {
|
|||||||
memset((byte*)0x2000, 0, 0x2000); // clear page 1
|
memset((byte*)0x2000, 0, 0x2000); // clear page 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// draw (xor) vertical line
|
||||||
void xor_vline(byte x, byte y1, byte y2) {
|
void xor_vline(byte x, byte y1, byte y2) {
|
||||||
byte xb = DIV7[x]; // divide x by 7
|
byte xb = DIV7[x]; // divide x by 7
|
||||||
byte mask = BIT7[MOD7[x]]; // lookup bitmask for remainder
|
byte mask = BIT7[MOD7[x]]; // lookup bitmask for remainder
|
||||||
@ -111,6 +118,7 @@ void xor_vline(byte x, byte y1, byte y2) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// draw (xor) a pixel
|
||||||
void xor_pixel(byte x, byte y) {
|
void xor_pixel(byte x, byte y) {
|
||||||
xor_vline(x, y, y); // draw line with 1-pixel height
|
xor_vline(x, y, y); // draw line with 1-pixel height
|
||||||
}
|
}
|
||||||
@ -119,6 +127,7 @@ typedef enum {
|
|||||||
OP_DRAW, OP_XOR, OP_ERASE
|
OP_DRAW, OP_XOR, OP_ERASE
|
||||||
} GraphicsOperation;
|
} GraphicsOperation;
|
||||||
|
|
||||||
|
// render a sprite with the given graphics operation
|
||||||
byte render_sprite(const byte* src, byte x, byte y, byte op) {
|
byte render_sprite(const byte* src, byte x, byte y, byte op) {
|
||||||
byte i,j;
|
byte i,j;
|
||||||
byte w = *src++; // get width from 1st byte of sprite
|
byte w = *src++; // get width from 1st byte of sprite
|
||||||
@ -481,9 +490,9 @@ void move_bomb() {
|
|||||||
byte leftover = xor_sprite(bomb_bitmap, bomb_x, bomb_y); // erase
|
byte leftover = xor_sprite(bomb_bitmap, bomb_x, bomb_y); // erase
|
||||||
if (bomb_y > 192-12) {
|
if (bomb_y > 192-12) {
|
||||||
bomb_y = 0;
|
bomb_y = 0;
|
||||||
} else if (leftover) {
|
} else if (leftover & 0x7f) { // don't count hi bit
|
||||||
erase_sprite(bomb_bitmap, bomb_x, bomb_y); // erase bunker
|
erase_sprite(bomb_bitmap, bomb_x, bomb_y); // erase bunker
|
||||||
if (bomb_y > 192-22) {
|
if (bomb_y > 192-23) {
|
||||||
// player was hit (probably)
|
// player was hit (probably)
|
||||||
destroy_player();
|
destroy_player();
|
||||||
}
|
}
|
||||||
|
@ -121,7 +121,7 @@ const _Apple2Platform = function(mainElement) {
|
|||||||
if (address == 0xc070)
|
if (address == 0xc070)
|
||||||
return noise() | 0x80;
|
return noise() | 0x80;
|
||||||
case 8:
|
case 8:
|
||||||
return 0; // TODO doLanguageCardIO(address, value);
|
return doLanguageCardIO(address);
|
||||||
case 9: case 10: case 11: case 12: case 13: case 14: case 15:
|
case 9: case 10: case 11: case 12: case 13: case 14: case 15:
|
||||||
return noise(); // return slots[slot-8].doIO(address, value);
|
return noise(); // return slots[slot-8].doIO(address, value);
|
||||||
}
|
}
|
||||||
@ -281,7 +281,7 @@ const _Apple2Platform = function(mainElement) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function doLanguageCardIO(address, value)
|
function doLanguageCardIO(address:number)
|
||||||
{
|
{
|
||||||
switch (address & 0x0f) {
|
switch (address & 0x0f) {
|
||||||
// Select aux RAM bank 2, write protected.
|
// Select aux RAM bank 2, write protected.
|
||||||
|
Loading…
Reference in New Issue
Block a user