New name. Minor corrections. Includes PONG.

This commit is contained in:
2017-02-03 18:59:47 +01:00
parent fa4abcbf2c
commit 88c0288931
13 changed files with 222 additions and 35 deletions

View File

@@ -1,6 +1,5 @@
syntax: glob syntax: glob
aee
recursos/* recursos/*
bin/* bin/*
obj/* obj/*

View File

@@ -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;

View File

@@ -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);

View File

@@ -7,8 +7,10 @@ static bool raised = false;
void error_raise(const char* msg) { void error_raise(const char* msg) {
raised = true; if (!raised) {
sprintf(errormsg, "ERROR: %s at %d:%d.", msg, tkn_get_line()+1, tkn_get_row()+1); raised = true;
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; }

View File

@@ -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; }

View File

@@ -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

View File

@@ -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">

View File

@@ -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--;
} }
} }

188
test.bas
View File

@@ -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
GOTO MAIN_GAME IF TIME > 0 THEN GOTO PRE_GAME END
PINTA_RED: 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
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

View File

@@ -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
View File

@@ -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
View File

@@ -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;
} }