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
aee
recursos/*
bin/*
obj/*

View File

@@ -8,10 +8,11 @@ typedef unsigned char byte;
typedef unsigned short word;
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_Texture* debug_texture = nullptr;
static SDL_Rect src, dst;
static bool visible = false;
static Uint8 ink[4];
static Uint8 paper[4];
static unsigned char* debug_mem = nullptr;
@@ -289,15 +290,7 @@ void debug_print_asm(byte offset) {
}
void debug_init(unsigned char* mem) {
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];
void debug_show_window() {
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_window_id = SDL_GetWindowID(debug_window);
@@ -311,8 +304,20 @@ void debug_init(unsigned char* mem) {
SDL_SetTextureBlendMode(debug_texture, SDL_BLENDMODE_BLEND);
stbi_image_free(buffer);
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);
long fsize = ftell(f);
fseek(f, 0, SEEK_SET); //same as rewind(f);
@@ -321,10 +326,11 @@ void debug_init(unsigned char* mem) {
fclose(f);
program[fsize] = 0;
debug_update();
if (window_shown) debug_update();
}
void debug_update() {
if (!visible) debug_show_window();
debug_set_paper(128, 128, 128);
debug_clear();
@@ -339,12 +345,14 @@ void debug_update() {
}
void debug_hide() {
if (!visible) return;
debug_set_paper(128, 128, 128);
debug_clear();
SDL_RenderPresent(debug_renderer);
}
void debug_mouse_event(SDL_Event& event) {
if (!visible) return;
if (event.window.windowID != debug_window_id) return;
if (event.type == SDL_MOUSEBUTTONDOWN) {
int x, y;

View File

@@ -1,7 +1,7 @@
#pragma once
#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_hide();
void debug_mouse_event(SDL_Event& event);

View File

@@ -7,8 +7,10 @@ static bool raised = false;
void error_raise(const char* msg) {
if (!raised) {
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; }

View File

@@ -53,7 +53,7 @@ int main(int argc, char** argv) {
debug_init(vm_get_memory());
const bool* breakpoints = debug_get_breakpoints();
bool running = false;
bool running = true;
static bool should_quit = false;
static SDL_Event sdlEvent;
@@ -77,9 +77,10 @@ int main(int argc, char** argv) {
just_pressed = sdlEvent.key.keysym.scancode;
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_F10) { vm_big_step(); debug_update(); }
if (sdlEvent.key.keysym.scancode == SDL_SCANCODE_F11) { vm_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) { 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_F1) { vdp_switch_fullscreen(); }
break;
case SDL_KEYUP:
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
VisualStudioVersion = 12.0.31101.0
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
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution

View File

@@ -13,7 +13,7 @@
<PropertyGroup Label="Globals">
<ProjectGuid>{E0E409C8-8E79-4688-A9FB-29BD309B1B52}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>vbvm</RootNamespace>
<RootNamespace>paco</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<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) {
label[i] = 48 + (value % 10);
value = value / 10;
i--;
}
}

186
test.bas
View File

@@ -1,3 +1,5 @@
SETMUSIC 0 "l5cccfrf>l6c." PLAYMUSIC
START:
BORDER INK_BLACK
COLOR INK_WHITE + PAPER_BLACK
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 4 PRINT CHR &h87, CHR &h81, CHR &h8D, CHR &h85, CHR &h85, CHR &h85, CHR &h8D, CHR &h85
W = 0
SETMUSIC 0 "cdef"
PLAYMUSIC
MENU_BLINK:
LOCATE 3 8 PRINT "PRESS CTRL"
LOCATE 4 9 PRINT "TO PLAY"
UPDATESCR
INC W
IF KEYPRESSED BTN_A THEN GOTO MAIN_GAME END
IF KEYPRESSED BTN_A THEN GOTO INIT_GAME END
IF W < 25 THEN
GOTO MENU_BLINK
END
@@ -21,18 +21,73 @@ MENU_BLINK2:
LOCATE 4 9 PRINT " "
UPDATESCR
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
W = 0
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
GOSUB PINTA_RED
LOCATE 6 1 PRINT "0"
LOCATE 9 1 PRINT "0"
GOSUB DRAW_NET
GOSUB DRAW_SCORE
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
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
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 2 &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 10 &HD1 INK_WHITE + PAPER_BLACK
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_Texture* sdlTexture = NULL;
static SDL_Rect src, dst;
static bool fullscreen = false;
static const Uint8* keys = nullptr;
static Uint8 just_pressed = SDL_SCANCODE_UNKNOWN;
@@ -148,6 +149,11 @@ void vdp_flip() {
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) {
data_stack[data_stack_pos++] = value;
}

1
vdp.h
View File

@@ -3,6 +3,7 @@
void vdp_init();
void vdp_quit();
void vdp_flip();
void vdp_switch_fullscreen();
void vdp_data_out(const unsigned char& value);
void vdp_cmd_out(const unsigned char& value);
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]--];
bool sleeping = false;
Uint32 time, delay = 0;
static void load_rom() {
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); }
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;
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_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_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;
}