New name. Minor corrections. Includes PONG.
This commit is contained in:
@@ -1,6 +1,5 @@
|
|||||||
syntax: glob
|
syntax: glob
|
||||||
|
|
||||||
aee
|
|
||||||
recursos/*
|
recursos/*
|
||||||
bin/*
|
bin/*
|
||||||
obj/*
|
obj/*
|
||||||
|
|||||||
32
debug.cpp
32
debug.cpp
@@ -8,10 +8,11 @@ typedef unsigned char byte;
|
|||||||
typedef unsigned short word;
|
typedef unsigned short word;
|
||||||
|
|
||||||
static SDL_Window* debug_window = nullptr;
|
static SDL_Window* debug_window = nullptr;
|
||||||
static Uint32 debug_window_id;
|
static Uint32 debug_window_id = 0;
|
||||||
static SDL_Renderer* debug_renderer = nullptr;
|
static SDL_Renderer* debug_renderer = nullptr;
|
||||||
static SDL_Texture* debug_texture = nullptr;
|
static SDL_Texture* debug_texture = nullptr;
|
||||||
static SDL_Rect src, dst;
|
static SDL_Rect src, dst;
|
||||||
|
static bool visible = false;
|
||||||
static Uint8 ink[4];
|
static Uint8 ink[4];
|
||||||
static Uint8 paper[4];
|
static Uint8 paper[4];
|
||||||
static unsigned char* debug_mem = nullptr;
|
static unsigned char* debug_mem = nullptr;
|
||||||
@@ -289,15 +290,7 @@ void debug_print_asm(byte offset) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void debug_init(unsigned char* mem) {
|
void debug_show_window() {
|
||||||
debug_mem = mem;
|
|
||||||
lines = parser_get_lines();
|
|
||||||
|
|
||||||
rX = (unsigned short*)&debug_mem[0xFFFA];
|
|
||||||
rY = &debug_mem[0xFFFC];
|
|
||||||
rZ = &debug_mem[0xFFFD];
|
|
||||||
pc = (unsigned short*)&debug_mem[0xFFFE];
|
|
||||||
|
|
||||||
debug_window = SDL_CreateWindow("Definitely PaCo Debugger", 1120, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN);
|
debug_window = SDL_CreateWindow("Definitely PaCo Debugger", 1120, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN);
|
||||||
debug_renderer = SDL_CreateRenderer(debug_window, -1, SDL_RENDERER_PRESENTVSYNC);
|
debug_renderer = SDL_CreateRenderer(debug_window, -1, SDL_RENDERER_PRESENTVSYNC);
|
||||||
debug_window_id = SDL_GetWindowID(debug_window);
|
debug_window_id = SDL_GetWindowID(debug_window);
|
||||||
@@ -311,8 +304,20 @@ void debug_init(unsigned char* mem) {
|
|||||||
SDL_SetTextureBlendMode(debug_texture, SDL_BLENDMODE_BLEND);
|
SDL_SetTextureBlendMode(debug_texture, SDL_BLENDMODE_BLEND);
|
||||||
stbi_image_free(buffer);
|
stbi_image_free(buffer);
|
||||||
fclose(f);
|
fclose(f);
|
||||||
|
}
|
||||||
|
|
||||||
f = fopen("test.bas", "rb");
|
void debug_init(unsigned char* mem, const bool window_shown) {
|
||||||
|
debug_mem = mem;
|
||||||
|
lines = parser_get_lines();
|
||||||
|
|
||||||
|
rX = (unsigned short*)&debug_mem[0xFFFA];
|
||||||
|
rY = &debug_mem[0xFFFC];
|
||||||
|
rZ = &debug_mem[0xFFFD];
|
||||||
|
pc = (unsigned short*)&debug_mem[0xFFFE];
|
||||||
|
|
||||||
|
if (window_shown) debug_show_window();
|
||||||
|
|
||||||
|
FILE* f = fopen("test.bas", "rb");
|
||||||
fseek(f, 0, SEEK_END);
|
fseek(f, 0, SEEK_END);
|
||||||
long fsize = ftell(f);
|
long fsize = ftell(f);
|
||||||
fseek(f, 0, SEEK_SET); //same as rewind(f);
|
fseek(f, 0, SEEK_SET); //same as rewind(f);
|
||||||
@@ -321,10 +326,11 @@ void debug_init(unsigned char* mem) {
|
|||||||
fclose(f);
|
fclose(f);
|
||||||
program[fsize] = 0;
|
program[fsize] = 0;
|
||||||
|
|
||||||
debug_update();
|
if (window_shown) debug_update();
|
||||||
}
|
}
|
||||||
|
|
||||||
void debug_update() {
|
void debug_update() {
|
||||||
|
if (!visible) debug_show_window();
|
||||||
debug_set_paper(128, 128, 128);
|
debug_set_paper(128, 128, 128);
|
||||||
debug_clear();
|
debug_clear();
|
||||||
|
|
||||||
@@ -339,12 +345,14 @@ void debug_update() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void debug_hide() {
|
void debug_hide() {
|
||||||
|
if (!visible) return;
|
||||||
debug_set_paper(128, 128, 128);
|
debug_set_paper(128, 128, 128);
|
||||||
debug_clear();
|
debug_clear();
|
||||||
SDL_RenderPresent(debug_renderer);
|
SDL_RenderPresent(debug_renderer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void debug_mouse_event(SDL_Event& event) {
|
void debug_mouse_event(SDL_Event& event) {
|
||||||
|
if (!visible) return;
|
||||||
if (event.window.windowID != debug_window_id) return;
|
if (event.window.windowID != debug_window_id) return;
|
||||||
if (event.type == SDL_MOUSEBUTTONDOWN) {
|
if (event.type == SDL_MOUSEBUTTONDOWN) {
|
||||||
int x, y;
|
int x, y;
|
||||||
|
|||||||
2
debug.h
2
debug.h
@@ -1,7 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
|
|
||||||
void debug_init(unsigned char* mem);
|
void debug_init(unsigned char* mem, const bool window_shown = false);
|
||||||
void debug_update();
|
void debug_update();
|
||||||
void debug_hide();
|
void debug_hide();
|
||||||
void debug_mouse_event(SDL_Event& event);
|
void debug_mouse_event(SDL_Event& event);
|
||||||
|
|||||||
@@ -7,9 +7,11 @@ static bool raised = false;
|
|||||||
|
|
||||||
|
|
||||||
void error_raise(const char* msg) {
|
void error_raise(const char* msg) {
|
||||||
|
if (!raised) {
|
||||||
raised = true;
|
raised = true;
|
||||||
sprintf(errormsg, "ERROR: %s at %d:%d.", msg, tkn_get_line() + 1, tkn_get_row() + 1);
|
sprintf(errormsg, "ERROR: %s at %d:%d.", msg, tkn_get_line() + 1, tkn_get_row() + 1);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool error_raised() { return raised; }
|
bool error_raised() { return raised; }
|
||||||
|
|
||||||
|
|||||||
7
main.cpp
7
main.cpp
@@ -53,7 +53,7 @@ int main(int argc, char** argv) {
|
|||||||
debug_init(vm_get_memory());
|
debug_init(vm_get_memory());
|
||||||
const bool* breakpoints = debug_get_breakpoints();
|
const bool* breakpoints = debug_get_breakpoints();
|
||||||
|
|
||||||
bool running = false;
|
bool running = true;
|
||||||
|
|
||||||
static bool should_quit = false;
|
static bool should_quit = false;
|
||||||
static SDL_Event sdlEvent;
|
static SDL_Event sdlEvent;
|
||||||
@@ -77,9 +77,10 @@ int main(int argc, char** argv) {
|
|||||||
just_pressed = sdlEvent.key.keysym.scancode;
|
just_pressed = sdlEvent.key.keysym.scancode;
|
||||||
if (sdlEvent.key.keysym.scancode == SDL_SCANCODE_SPACE) { anykey = true; }
|
if (sdlEvent.key.keysym.scancode == SDL_SCANCODE_SPACE) { anykey = true; }
|
||||||
if (sdlEvent.key.keysym.scancode == SDL_SCANCODE_ESCAPE) { should_quit = true; }
|
if (sdlEvent.key.keysym.scancode == SDL_SCANCODE_ESCAPE) { should_quit = true; }
|
||||||
if (sdlEvent.key.keysym.scancode == SDL_SCANCODE_F10) { vm_big_step(); debug_update(); }
|
if (sdlEvent.key.keysym.scancode == SDL_SCANCODE_F10) { if (!running) { vm_big_step(); debug_update(); } }
|
||||||
if (sdlEvent.key.keysym.scancode == SDL_SCANCODE_F11) { vm_step(); debug_update(); }
|
if (sdlEvent.key.keysym.scancode == SDL_SCANCODE_F11) { if (!running) { vm_step(); debug_update(); } }
|
||||||
if (sdlEvent.key.keysym.scancode == SDL_SCANCODE_F5) { running = !running; if (!running) debug_update(); else debug_hide(); }
|
if (sdlEvent.key.keysym.scancode == SDL_SCANCODE_F5) { running = !running; if (!running) debug_update(); else debug_hide(); }
|
||||||
|
if (sdlEvent.key.keysym.scancode == SDL_SCANCODE_F1) { vdp_switch_fullscreen(); }
|
||||||
break;
|
break;
|
||||||
case SDL_KEYUP:
|
case SDL_KEYUP:
|
||||||
if (sdlEvent.key.keysym.scancode == SDL_SCANCODE_SPACE) { anykey = false; }
|
if (sdlEvent.key.keysym.scancode == SDL_SCANCODE_SPACE) { anykey = false; }
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
|
|||||||
# Visual Studio 2013
|
# Visual Studio 2013
|
||||||
VisualStudioVersion = 12.0.31101.0
|
VisualStudioVersion = 12.0.31101.0
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vbvm", "vbvm.vcxproj", "{E0E409C8-8E79-4688-A9FB-29BD309B1B52}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "paco", "paco.vcxproj", "{E0E409C8-8E79-4688-A9FB-29BD309B1B52}"
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
<PropertyGroup Label="Globals">
|
<PropertyGroup Label="Globals">
|
||||||
<ProjectGuid>{E0E409C8-8E79-4688-A9FB-29BD309B1B52}</ProjectGuid>
|
<ProjectGuid>{E0E409C8-8E79-4688-A9FB-29BD309B1B52}</ProjectGuid>
|
||||||
<Keyword>Win32Proj</Keyword>
|
<Keyword>Win32Proj</Keyword>
|
||||||
<RootNamespace>vbvm</RootNamespace>
|
<RootNamespace>paco</RootNamespace>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
@@ -79,6 +79,7 @@ static void int_to_string(int value, char* label) {
|
|||||||
while (value > 0) {
|
while (value > 0) {
|
||||||
label[i] = 48 + (value % 10);
|
label[i] = 48 + (value % 10);
|
||||||
value = value / 10;
|
value = value / 10;
|
||||||
|
i--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
186
test.bas
186
test.bas
@@ -1,3 +1,5 @@
|
|||||||
|
SETMUSIC 0 "l5cccfrf>l6c." PLAYMUSIC
|
||||||
|
START:
|
||||||
BORDER INK_BLACK
|
BORDER INK_BLACK
|
||||||
COLOR INK_WHITE + PAPER_BLACK
|
COLOR INK_WHITE + PAPER_BLACK
|
||||||
CLS
|
CLS
|
||||||
@@ -5,14 +7,12 @@
|
|||||||
LOCATE 4 3 PRINT CHR &h85, CHR &h85, CHR &h85, CHR &h85, CHR &h85, CHR &h85, CHR &h85, CHR &h84
|
LOCATE 4 3 PRINT CHR &h85, CHR &h85, CHR &h85, CHR &h85, CHR &h85, CHR &h85, CHR &h85, CHR &h84
|
||||||
LOCATE 4 4 PRINT CHR &h87, CHR &h81, CHR &h8D, CHR &h85, CHR &h85, CHR &h85, CHR &h8D, CHR &h85
|
LOCATE 4 4 PRINT CHR &h87, CHR &h81, CHR &h8D, CHR &h85, CHR &h85, CHR &h85, CHR &h8D, CHR &h85
|
||||||
W = 0
|
W = 0
|
||||||
SETMUSIC 0 "cdef"
|
|
||||||
PLAYMUSIC
|
|
||||||
MENU_BLINK:
|
MENU_BLINK:
|
||||||
LOCATE 3 8 PRINT "PRESS CTRL"
|
LOCATE 3 8 PRINT "PRESS CTRL"
|
||||||
LOCATE 4 9 PRINT "TO PLAY"
|
LOCATE 4 9 PRINT "TO PLAY"
|
||||||
UPDATESCR
|
UPDATESCR
|
||||||
INC W
|
INC W
|
||||||
IF KEYPRESSED BTN_A THEN GOTO MAIN_GAME END
|
IF KEYPRESSED BTN_A THEN GOTO INIT_GAME END
|
||||||
IF W < 25 THEN
|
IF W < 25 THEN
|
||||||
GOTO MENU_BLINK
|
GOTO MENU_BLINK
|
||||||
END
|
END
|
||||||
@@ -21,18 +21,73 @@ MENU_BLINK2:
|
|||||||
LOCATE 4 9 PRINT " "
|
LOCATE 4 9 PRINT " "
|
||||||
UPDATESCR
|
UPDATESCR
|
||||||
INC W
|
INC W
|
||||||
IF KEYPRESSED BTN_A THEN GOTO MAIN_GAME END
|
IF KEYPRESSED BTN_A THEN GOTO INIT_GAME END
|
||||||
IF W < 50 THEN GOTO MENU_BLINK2 END
|
IF W < 50 THEN GOTO MENU_BLINK2 END
|
||||||
W = 0
|
W = 0
|
||||||
GOTO MENU_BLINK
|
GOTO MENU_BLINK
|
||||||
MAIN_GAME:
|
INIT_GAME:
|
||||||
|
P1_Y = 48
|
||||||
|
P1_SCORE = 0
|
||||||
|
P2_Y = 48
|
||||||
|
P2_SCORE = 0
|
||||||
|
BALL_X = 67
|
||||||
|
BALL_Y = 48
|
||||||
|
BALL_DX = 1
|
||||||
|
BALL_DY = 1
|
||||||
|
SETSPRITE 0 &HE7 INK_WHITE
|
||||||
|
SETSPRITE 1 &h95 INK_WHITE
|
||||||
|
SETSPRITE 2 &h95 INK_WHITE
|
||||||
|
SETSPRITE 3 &h95 INK_WHITE
|
||||||
|
SETSPRITE 4 &h95 INK_WHITE
|
||||||
CLS
|
CLS
|
||||||
GOSUB PINTA_RED
|
GOSUB DRAW_NET
|
||||||
LOCATE 6 1 PRINT "0"
|
GOSUB DRAW_SCORE
|
||||||
LOCATE 9 1 PRINT "0"
|
GOSUB DRAW_P1
|
||||||
|
GOSUB DRAW_P2
|
||||||
|
MAIN_GAME:
|
||||||
|
IF (P1_SCORE = 10) OR (P2_SCORE = 10) THEN GOTO END_GAME END
|
||||||
|
GOSUB DRAW_BALL
|
||||||
|
TIME = 32
|
||||||
|
PRE_GAME:
|
||||||
|
GOSUB PROCESS_PLAYER1
|
||||||
|
DEC TIME
|
||||||
UPDATESCR
|
UPDATESCR
|
||||||
|
IF TIME > 0 THEN GOTO PRE_GAME END
|
||||||
|
GAME:
|
||||||
|
GOSUB PROCESS_PLAYER1
|
||||||
|
GOSUB PROCESS_PLAYER2
|
||||||
|
GOSUB MOVE_BALL
|
||||||
|
IF (BALL_X > 8) AND (BALL_X < 14) THEN GOSUB BOUNCE_P1 END
|
||||||
|
IF (BALL_X < 128) AND (BALL_X > 122) THEN GOSUB BOUNCE_P2 END
|
||||||
|
IF (BALL_X > 135) THEN
|
||||||
|
INC P1_SCORE
|
||||||
|
BALL_X = 67
|
||||||
|
BALL_Y = 48
|
||||||
|
BALL_DX = -1
|
||||||
|
GOSUB FLASH_BORDER
|
||||||
|
GOSUB DRAW_SCORE
|
||||||
|
GOSUB POINT
|
||||||
GOTO MAIN_GAME
|
GOTO MAIN_GAME
|
||||||
PINTA_RED:
|
END
|
||||||
|
IF (BALL_X < 2) THEN
|
||||||
|
INC P2_SCORE
|
||||||
|
BALL_X = 67
|
||||||
|
BALL_Y = 48
|
||||||
|
BALL_DX = 1
|
||||||
|
GOSUB FLASH_BORDER
|
||||||
|
GOSUB DRAW_SCORE
|
||||||
|
GOSUB POINT
|
||||||
|
GOTO MAIN_GAME
|
||||||
|
END
|
||||||
|
IF (BALL_Y > 96) OR (BALL_Y < 8) THEN BALL_DY = -BALL_DY END
|
||||||
|
UPDATESCR
|
||||||
|
GOTO GAME
|
||||||
|
FLASH_BORDER:
|
||||||
|
BORDER INK_WHITE
|
||||||
|
UPDATESCR
|
||||||
|
BORDER INK_BLACK
|
||||||
|
RETURN
|
||||||
|
DRAW_NET:
|
||||||
PUTCHAR 7 0 &HD1 INK_WHITE + PAPER_BLACK
|
PUTCHAR 7 0 &HD1 INK_WHITE + PAPER_BLACK
|
||||||
PUTCHAR 7 2 &HD1 INK_WHITE + PAPER_BLACK
|
PUTCHAR 7 2 &HD1 INK_WHITE + PAPER_BLACK
|
||||||
PUTCHAR 7 4 &HD1 INK_WHITE + PAPER_BLACK
|
PUTCHAR 7 4 &HD1 INK_WHITE + PAPER_BLACK
|
||||||
@@ -40,4 +95,115 @@ PINTA_RED:
|
|||||||
PUTCHAR 7 8 &HD1 INK_WHITE + PAPER_BLACK
|
PUTCHAR 7 8 &HD1 INK_WHITE + PAPER_BLACK
|
||||||
PUTCHAR 7 10 &HD1 INK_WHITE + PAPER_BLACK
|
PUTCHAR 7 10 &HD1 INK_WHITE + PAPER_BLACK
|
||||||
RETURN
|
RETURN
|
||||||
|
DRAW_SCORE:
|
||||||
|
LOCATE 6 1 PRINT STR P1_SCORE
|
||||||
|
LOCATE 9 1 PRINT STR P2_SCORE
|
||||||
|
RETURN
|
||||||
|
DRAW_P1:
|
||||||
|
PUTSPRITE 1 8 P1_Y
|
||||||
|
PUTSPRITE 2 8 P1_Y+8
|
||||||
|
RETURN
|
||||||
|
DRAW_P2:
|
||||||
|
PUTSPRITE 3 128 P2_Y
|
||||||
|
PUTSPRITE 4 128 P2_Y+8
|
||||||
|
RETURN
|
||||||
|
DRAW_BALL:
|
||||||
|
PUTSPRITE 0 BALL_X BALL_Y
|
||||||
|
RETURN
|
||||||
|
PROCESS_PLAYER1:
|
||||||
|
IF KEYPRESSED BTN_UP THEN
|
||||||
|
DEC P1_Y DEC P1_Y
|
||||||
|
IF P1_Y < 8 THEN P1_Y = 8 END
|
||||||
|
GOSUB DRAW_P1
|
||||||
|
ELSE
|
||||||
|
IF KEYPRESSED BTN_DOWN THEN
|
||||||
|
INC P1_Y INC P1_Y
|
||||||
|
IF P1_Y > 88 THEN P1_Y = 88 END
|
||||||
|
GOSUB DRAW_P1
|
||||||
|
END
|
||||||
|
END
|
||||||
|
RETURN
|
||||||
|
PROCESS_PLAYER2:
|
||||||
|
IF BALL_Y < P2_Y+8 THEN DEC P2_Y END
|
||||||
|
IF BALL_Y > P2_Y+8 THEN INC P2_Y END
|
||||||
|
GOSUB DRAW_P2
|
||||||
|
RETURN
|
||||||
|
MOVE_BALL:
|
||||||
|
BALL_X = BALL_X + BALL_DX
|
||||||
|
BALL_Y = BALL_Y + BALL_DY
|
||||||
|
GOSUB DRAW_BALL
|
||||||
|
RETURN
|
||||||
|
BOUNCE_P1:
|
||||||
|
IF (P1_Y <= BALL_Y+7) AND (P1_Y > BALL_Y+1) THEN
|
||||||
|
BALL_DY = -2
|
||||||
|
BALL_DX = 1
|
||||||
|
GOTO PING
|
||||||
|
END
|
||||||
|
IF (P1_Y <= BALL_Y+1) AND (P1_Y+5 > BALL_Y) THEN
|
||||||
|
BALL_DY = -1
|
||||||
|
IF BALL_DX = -1 THEN BALL_DX = 1 ELSE BALL_DX = 2 END
|
||||||
|
GOTO PING
|
||||||
|
END
|
||||||
|
IF (P1_Y+5 <= BALL_Y) AND (P1_Y+11 > BALL_Y) THEN
|
||||||
|
BALL_DY = 0
|
||||||
|
BALL_DX = 2
|
||||||
|
GOTO PING
|
||||||
|
END
|
||||||
|
IF (P1_Y+11 <= BALL_Y) AND (P1_Y+17 > BALL_Y) THEN
|
||||||
|
BALL_DY = 1
|
||||||
|
IF BALL_DX = -1 THEN BALL_DX = 1 ELSE BALL_DX = 2 END
|
||||||
|
GOTO PING
|
||||||
|
END
|
||||||
|
IF (P1_Y+17 <= BALL_Y) AND (P1_Y+23 > BALL_Y) THEN
|
||||||
|
BALL_DY = 2
|
||||||
|
BALL_DX = 1
|
||||||
|
GOTO PING
|
||||||
|
END
|
||||||
|
RETURN
|
||||||
|
BOUNCE_P2:
|
||||||
|
IF (P2_Y <= BALL_Y+7) AND (P2_Y > BALL_Y+1) THEN
|
||||||
|
BALL_DY = -2
|
||||||
|
BALL_DX = -1
|
||||||
|
GOTO PING
|
||||||
|
END
|
||||||
|
IF (P2_Y <= BALL_Y+1) AND (P2_Y+5 > BALL_Y) THEN
|
||||||
|
BALL_DY = -1
|
||||||
|
IF BALL_DX = 1 THEN BALL_DX = -1 ELSE BALL_DX = -2 END
|
||||||
|
GOTO PING
|
||||||
|
END
|
||||||
|
IF (P2_Y+5 <= BALL_Y) AND (P2_Y+11 > BALL_Y) THEN
|
||||||
|
BALL_DY = 0
|
||||||
|
BALL_DX = -2
|
||||||
|
GOTO PING
|
||||||
|
END
|
||||||
|
IF (P2_Y+11 <= BALL_Y) AND (P2_Y+17 > BALL_Y) THEN
|
||||||
|
BALL_DY = 1
|
||||||
|
IF BALL_DX = 1 THEN BALL_DX = -1 ELSE BALL_DX = -2 END
|
||||||
|
GOTO PING
|
||||||
|
END
|
||||||
|
IF (P2_Y+17 <= BALL_Y) AND (P2_Y+23 > BALL_Y) THEN
|
||||||
|
BALL_DY = 2
|
||||||
|
BALL_DX = -1
|
||||||
|
GOTO PING
|
||||||
|
END
|
||||||
|
RETURN
|
||||||
|
PING:
|
||||||
|
SETMUSIC 0 "l1o7c" PLAYMUSIC
|
||||||
|
RETURN
|
||||||
|
POINT:
|
||||||
|
SETMUSIC 0 "l2o2bec" PLAYMUSIC
|
||||||
|
RETURN
|
||||||
|
END_GAME:
|
||||||
|
LOCATE 3 5 PRINT "GAME OVER"
|
||||||
|
LOCATE 1 7
|
||||||
|
IF P1_SCORE = 10 THEN PRINT "PLAYER 1 WINS!" END
|
||||||
|
IF P2_SCORE = 10 THEN PRINT "PLAYER 2 WINS!" END
|
||||||
|
UPDATESCR
|
||||||
|
SETMUSIC 0 "l5o5ccr<a#argrfrrr<f" PLAYMUSIC
|
||||||
|
WAIT 4
|
||||||
|
PUTSPRITE 0 0 0
|
||||||
|
PUTSPRITE 1 0 0
|
||||||
|
PUTSPRITE 2 0 0
|
||||||
|
PUTSPRITE 3 0 0
|
||||||
|
PUTSPRITE 4 0 0
|
||||||
|
GOTO START
|
||||||
|
|||||||
6
vdp.cpp
6
vdp.cpp
@@ -26,6 +26,7 @@ static SDL_Window* sdlWindow = NULL;
|
|||||||
static SDL_Renderer* sdlRenderer = NULL;
|
static SDL_Renderer* sdlRenderer = NULL;
|
||||||
static SDL_Texture* sdlTexture = NULL;
|
static SDL_Texture* sdlTexture = NULL;
|
||||||
static SDL_Rect src, dst;
|
static SDL_Rect src, dst;
|
||||||
|
static bool fullscreen = false;
|
||||||
static const Uint8* keys = nullptr;
|
static const Uint8* keys = nullptr;
|
||||||
static Uint8 just_pressed = SDL_SCANCODE_UNKNOWN;
|
static Uint8 just_pressed = SDL_SCANCODE_UNKNOWN;
|
||||||
|
|
||||||
@@ -148,6 +149,11 @@ void vdp_flip() {
|
|||||||
SDL_RenderPresent(sdlRenderer);
|
SDL_RenderPresent(sdlRenderer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void vdp_switch_fullscreen() {
|
||||||
|
SDL_SetWindowFullscreen(sdlWindow, fullscreen ? 0 : SDL_WINDOW_FULLSCREEN_DESKTOP);
|
||||||
|
fullscreen = !fullscreen;
|
||||||
|
}
|
||||||
|
|
||||||
void vdp_data_out(const unsigned char& value) {
|
void vdp_data_out(const unsigned char& value) {
|
||||||
data_stack[data_stack_pos++] = value;
|
data_stack[data_stack_pos++] = value;
|
||||||
}
|
}
|
||||||
|
|||||||
1
vdp.h
1
vdp.h
@@ -3,6 +3,7 @@
|
|||||||
void vdp_init();
|
void vdp_init();
|
||||||
void vdp_quit();
|
void vdp_quit();
|
||||||
void vdp_flip();
|
void vdp_flip();
|
||||||
|
void vdp_switch_fullscreen();
|
||||||
void vdp_data_out(const unsigned char& value);
|
void vdp_data_out(const unsigned char& value);
|
||||||
void vdp_cmd_out(const unsigned char& value);
|
void vdp_cmd_out(const unsigned char& value);
|
||||||
unsigned char vdp_in();
|
unsigned char vdp_in();
|
||||||
|
|||||||
9
vm.cpp
9
vm.cpp
@@ -114,7 +114,7 @@ static int vm_cycles = 0;
|
|||||||
#define GRAB(x) a = x[x[0]--]; b = x[x[0]--];
|
#define GRAB(x) a = x[x[0]--]; b = x[x[0]--];
|
||||||
|
|
||||||
bool sleeping = false;
|
bool sleeping = false;
|
||||||
|
Uint32 time, delay = 0;
|
||||||
|
|
||||||
static void load_rom() {
|
static void load_rom() {
|
||||||
FILE *f = fopen("rom.bin", "rb");
|
FILE *f = fopen("rom.bin", "rb");
|
||||||
@@ -162,7 +162,10 @@ void vm_init(const char* filename) {
|
|||||||
inline unsigned short WORD() { vm_pc += 2; return vm_program[vm_pc - 2] + (vm_program[vm_pc - 1] << 8); }
|
inline unsigned short WORD() { vm_pc += 2; return vm_program[vm_pc - 2] + (vm_program[vm_pc - 1] << 8); }
|
||||||
|
|
||||||
const unsigned short vm_step() {
|
const unsigned short vm_step() {
|
||||||
if (sleeping) return vm_pc;
|
if (delay > 0) {
|
||||||
|
if (SDL_GetTicks() - time < delay) return vm_pc;
|
||||||
|
delay = 0;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned char a, b, c;
|
unsigned char a, b, c;
|
||||||
OPS opcode = (OPS)vm_program[vm_pc++];
|
OPS opcode = (OPS)vm_program[vm_pc++];
|
||||||
@@ -239,7 +242,7 @@ const unsigned short vm_step() {
|
|||||||
case OP_GEQ: GRAB(ds); PUSH(ds, b >= a); vm_cycles++; break;
|
case OP_GEQ: GRAB(ds); PUSH(ds, b >= a); vm_cycles++; break;
|
||||||
case OP_IN: PUSH(ds, in_ports[vm_program[vm_pc++]]()); vm_cycles++; break;
|
case OP_IN: PUSH(ds, in_ports[vm_program[vm_pc++]]()); vm_cycles++; break;
|
||||||
case OP_OUT: out_ports[vm_program[vm_pc++]](POP(ds)); vm_cycles++; break;
|
case OP_OUT: out_ports[vm_program[vm_pc++]](POP(ds)); vm_cycles++; break;
|
||||||
case OP_SLEEP: SDL_Delay(POP(ds) * 1000); vm_cycles++; break;
|
case OP_SLEEP: delay = POP(ds) * 1000; time = SDL_GetTicks(); vm_cycles++; break;
|
||||||
}
|
}
|
||||||
return vm_pc;
|
return vm_pc;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user