From 88c0288931a9f79bf8cd8e9b74755e9b7095852d Mon Sep 17 00:00:00 2001 From: Raimon Zamora Date: Fri, 3 Feb 2017 18:59:47 +0100 Subject: [PATCH] New name. Minor corrections. Includes PONG. --- .hgignore | 1 - debug.cpp | 32 ++-- debug.h | 2 +- error.cpp | 6 +- main.cpp | 7 +- vbvm.sln => paco.sln | 2 +- vbvm.vcxproj => paco.vcxproj | 2 +- vbvm.vcxproj.filters => paco.vcxproj.filters | 0 parser.cpp | 1 + test.bas | 188 +++++++++++++++++-- vdp.cpp | 6 + vdp.h | 1 + vm.cpp | 9 +- 13 files changed, 222 insertions(+), 35 deletions(-) rename vbvm.sln => paco.sln (85%) rename vbvm.vcxproj => paco.vcxproj (97%) rename vbvm.vcxproj.filters => paco.vcxproj.filters (100%) diff --git a/.hgignore b/.hgignore index 0fa0807..6e24c41 100644 --- a/.hgignore +++ b/.hgignore @@ -1,6 +1,5 @@ syntax: glob -aee recursos/* bin/* obj/* diff --git a/debug.cpp b/debug.cpp index f803c59..1f2eff1 100644 --- a/debug.cpp +++ b/debug.cpp @@ -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; diff --git a/debug.h b/debug.h index 2152e57..d383a13 100644 --- a/debug.h +++ b/debug.h @@ -1,7 +1,7 @@ #pragma once #include -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); diff --git a/error.cpp b/error.cpp index df03bd2..f3d61bd 100644 --- a/error.cpp +++ b/error.cpp @@ -7,8 +7,10 @@ static bool raised = false; void error_raise(const char* msg) { - raised = true; - sprintf(errormsg, "ERROR: %s at %d:%d.", msg, tkn_get_line()+1, tkn_get_row()+1); + if (!raised) { + raised = true; + sprintf(errormsg, "ERROR: %s at %d:%d.", msg, tkn_get_line() + 1, tkn_get_row() + 1); + } } bool error_raised() { return raised; } diff --git a/main.cpp b/main.cpp index ce91aa6..e7872d4 100644 --- a/main.cpp +++ b/main.cpp @@ -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; } diff --git a/vbvm.sln b/paco.sln similarity index 85% rename from vbvm.sln rename to paco.sln index 9ddaf96..67d1ae7 100644 --- a/vbvm.sln +++ b/paco.sln @@ -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 diff --git a/vbvm.vcxproj b/paco.vcxproj similarity index 97% rename from vbvm.vcxproj rename to paco.vcxproj index 9437084..16cb48d 100644 --- a/vbvm.vcxproj +++ b/paco.vcxproj @@ -13,7 +13,7 @@ {E0E409C8-8E79-4688-A9FB-29BD309B1B52} Win32Proj - vbvm + paco diff --git a/vbvm.vcxproj.filters b/paco.vcxproj.filters similarity index 100% rename from vbvm.vcxproj.filters rename to paco.vcxproj.filters diff --git a/parser.cpp b/parser.cpp index 217e0c7..0577f29 100644 --- a/parser.cpp +++ b/parser.cpp @@ -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--; } } diff --git a/test.bas b/test.bas index 36bd19b..8179356 100644 --- a/test.bas +++ b/test.bas @@ -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 - GOTO MAIN_GAME -PINTA_RED: + 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 + 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 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; }