diff options
| author | 2025-08-09 15:53:03 +0330 | |
|---|---|---|
| committer | 2025-08-09 15:53:03 +0330 | |
| commit | e08942e676cebe3e113c55f05e93ad73c541a306 (patch) | |
| tree | c2d95b29bc63b79a7b812604142939d992c93e69 | |
| parent | macros!! (diff) | |
vscode theme extension
| -rw-r--r-- | code.pasm | 20 | ||||
| -rw-r--r-- | pasm-syntax/package.json | 26 | ||||
| -rw-r--r-- | pasm-syntax/pasm-syntax-0.0.1.vsix | bin | 0 -> 2163 bytes | |||
| -rw-r--r-- | pasm-syntax/syntaxes/pasm.tmLanguage.json | 145 | ||||
| -rwxr-xr-x | penus | bin | 0 -> 16424 bytes | |||
| -rw-r--r-- | penus.c | 30 | ||||
| -rw-r--r-- | pu.c | 122 |
7 files changed, 341 insertions, 2 deletions
@@ -1,5 +1,23 @@ (1 ar4 con 60 ar2 r4a mem con 1 ar4 con 60 ar3 con 0 ar2 con 2 hlt) +(2 con 255 ar7 con 2 ar2 con 1 ar3 con 2 hlt) +# init sdl (1000, 600) +con 0 ar3 con 2 ar2 con 1000 ar4 con 600 ar5 con 2 hlt +# set color to 200,200,0,255 +con 200 ar4 con 200 ar5 con 0 ar6 @2 -hlt
\ No newline at end of file +# save spot +r8a ar6 + +# clear screen +con 2 ar2 con 2 ar3 con 2 hlt + +# present screen +con 2 ar2 con 3 ar3 con 2 hlt + +# jump-back +r6a ar8 + +# quit +con 0 hlt diff --git a/pasm-syntax/package.json b/pasm-syntax/package.json new file mode 100644 index 0000000..d287cc2 --- /dev/null +++ b/pasm-syntax/package.json @@ -0,0 +1,26 @@ +{ + "name": "pasm-syntax", + "displayName": "PASM Syntax", + "description": "Syntax highlighting for PASM custom assembly", + "version": "0.0.1", + "engines": { + "vscode": "^1.50.0" + }, + "categories": ["Programming Languages"], + "contributes": { + "languages": [ + { + "id": "pasm", + "aliases": ["PASM", "pasm"], + "extensions": [".pasm"] + } + ], + "grammars": [ + { + "language": "pasm", + "scopeName": "source.pasm", + "path": "./syntaxes/pasm.tmLanguage.json" + } + ] + } +} diff --git a/pasm-syntax/pasm-syntax-0.0.1.vsix b/pasm-syntax/pasm-syntax-0.0.1.vsix Binary files differnew file mode 100644 index 0000000..e94bb8b --- /dev/null +++ b/pasm-syntax/pasm-syntax-0.0.1.vsix diff --git a/pasm-syntax/syntaxes/pasm.tmLanguage.json b/pasm-syntax/syntaxes/pasm.tmLanguage.json new file mode 100644 index 0000000..e0df85e --- /dev/null +++ b/pasm-syntax/syntaxes/pasm.tmLanguage.json @@ -0,0 +1,145 @@ +{ + "name": "PASM", + "scopeName": "source.pasm", + "fileTypes": [ + "pasm" + ], + "patterns": [ + { + "include": "#comment" + }, + { + "include": "#macro" + }, + { + "include": "#instruction" + }, + { + "include": "#register" + }, + { + "include": "#number" + } + ], + "repository": { + "comment": { + "patterns": [ + { + "name": "comment.line.number-sign.pasm", + "match": "#.*$" + } + ] + }, + "macro": { + "patterns": [ + { + "name": "meta.macro.pasm", + "begin": "(\\()", + "beginCaptures": { + "1": { + "name": "punctuation.definition.macro.begin.pasm" + } + }, + "end": "(\\))", + "endCaptures": { + "1": { + "name": "punctuation.definition.macro.end.pasm" + } + }, + "patterns": [ + { + "include": "#instruction" + }, + { + "include": "#register" + }, + { + "include": "#number" + }, + { + "include": "#comment" + } + ] + }, + { + "name": "keyword.other.macro.pasm", + "match": "@\\d+" + } + ] + }, + "instruction": { + "patterns": [ + { + "name": "meta.instruction.ar.pasm", + "captures": { + "1": { + "name": "keyword.instruction.prefix.ar.pasm" + }, + "2": { + "name": "string.quoted.double.pasm" + } + }, + "match": "\\b(ar)([1-8])\\b" + }, + { + "name": "meta.instruction.r.pasm", + "captures": { + "1": { + "name": "keyword.instruction.prefix.r.pasm" + }, + "2": { + "name": "constant.numeric.instruction-number.r.pasm" + }, + "3": { + "name": "keyword.instruction.suffix.a.pasm" + } + }, + "match": "\\b(r)([1-8])(a)\\b" + }, + { + "name": "keyword.instruction.simple.pasm", + "match": "\\b(hlt|con|mem|aca|add|sub|not|clr)\\b" + } + ] + }, + "register": { + "patterns": [ + { + "name": "meta.register.ar.pasm", + "captures": { + "1": { + "name": "variable.other.register.prefix.ar.pasm" + }, + "2": { + "name": "constant.numeric.register-number.ar.pasm" + } + }, + "match": "\\b(ar)([1-8])\\b" + }, + { + "name": "meta.register.r.pasm", + "captures": { + "1": { + "name": "variable.other.register.prefix.r.pasm" + }, + "2": { + "name": "constant.numeric.register-number.r.pasm" + }, + "3": { + "name": "variable.other.register.suffix.a.pasm" + } + }, + "match": "\\b(r)([1-8])(a)\\b" + } + ] + }, + "number": { + "patterns": [ + { + "name": "constant.numeric.decimal.pasm", + "match": "\\b\\d+\\b" + } + ] + } + } +}
\ No newline at end of file Binary files differ@@ -0,0 +1,30 @@ +#include <SDL2/SDL.h> +#include <stdio.h> + +int main() { + if (SDL_Init(SDL_INIT_VIDEO) < 0) { + printf("SDL_Init failed: %s\n", SDL_GetError()); + return 1; + } + SDL_Window *window = SDL_CreateWindow("Test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 256, 256, 0); + if (!window) { + printf("SDL_CreateWindow failed: %s\n", SDL_GetError()); + SDL_Quit(); + return 1; + } + SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); + if (!renderer) { + printf("SDL_CreateRenderer failed: %s\n", SDL_GetError()); + SDL_DestroyWindow(window); + SDL_Quit(); + return 1; + } + SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); + SDL_RenderClear(renderer); + SDL_RenderPresent(renderer); + SDL_Delay(3000); // Wait 3 seconds + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + SDL_Quit(); + return 0; +}
\ No newline at end of file @@ -1,4 +1,5 @@ #define _XOPEN_SOURCE 700 +#include <SDL2/SDL.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -57,6 +58,9 @@ char R[]={ #ifndef __WRAPPER +SDL_Window *window = NULL; +SDL_Renderer *renderer = NULL; + // runs pu until exit code != 2, // that exit code is an interrupt for talking to the emulated hardware int emu() { @@ -64,7 +68,24 @@ int emu() { pu(); int e_code = m[ 0 ]; - if (e_code != 2) return e_code; + // Poll SDL events to handle window close, etc. + SDL_Event event; + while (SDL_PollEvent(&event)) { + if (event.type == SDL_QUIT) { + if (renderer) SDL_DestroyRenderer(renderer); + if (window) SDL_DestroyWindow(window); + SDL_Quit(); + return 0; + } + // Additional event handling can be added here if needed. + } + + if (e_code != 2) { + if (renderer) SDL_DestroyRenderer(renderer); + if (window) SDL_DestroyWindow(window); + SDL_Quit(); + return e_code; + } // handle hardware interrupts int int_code = m[ 1 ]; @@ -83,6 +104,105 @@ int emu() { m[ 2 ] = getchar(); } + // 2: graphics operations via SDL2 + else if (int_code == 2) { + int gfx_op = m[ 2 ]; + switch (gfx_op) { + case 0: // Initialize window (parameters: width in m[3], height in m[4]) + { + int width = m[ 3 ]; + int height = m[ 4 ]; + if (SDL_Init(SDL_INIT_VIDEO) < 0) { + fprintf(stderr, "SDL_Init failed: %s\n", SDL_GetError()); + m[ 0 ] = 1; // Set e_code to indicate error + break; + } + window = SDL_CreateWindow( + "PU VM Graphics", + SDL_WINDOWPOS_CENTERED, + SDL_WINDOWPOS_CENTERED, + width, + height, + 0); + if (!window) { + fprintf(stderr, "SDL_CreateWindow failed: %s\n", SDL_GetError()); + m[ 0 ] = 1; // Set e_code to indicate error + break; + } + renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); + if (!renderer) { + fprintf(stderr, "SDL_CreateRenderer failed: %s\n", SDL_GetError()); + m[ 0 ] = 1; // Set e_code to indicate error + break; + } + + break; + } + case 1: // Set draw color (parameters: r in m[3], g in m[4], b in m[5], a in m[6]) + { + Uint8 r = (Uint8) m[ 3 ]; + Uint8 g = (Uint8) m[ 4 ]; + Uint8 b = (Uint8) m[ 5 ]; + Uint8 a = (Uint8) m[ 6 ]; + SDL_SetRenderDrawColor(renderer, r, g, b, a); + break; + } + case 2: // Clear screen + SDL_RenderClear(renderer); + break; + case 3: // Present (flip buffers) + SDL_RenderPresent(renderer); + break; + case 4: // Draw point (parameters: x in m[3], y in m[4]) + { + int x = m[ 3 ]; + int y = m[ 4 ]; + SDL_RenderDrawPoint(renderer, x, y); + break; + } + case 5: // Draw line (parameters: x1 in m[3], y1 in m[4], x2 in m[5], y2 in m[6]) + { + int x1 = m[ 3 ]; + int y1 = m[ 4 ]; + int x2 = m[ 5 ]; + int y2 = m[ 6 ]; + SDL_RenderDrawLine(renderer, x1, y1, x2, y2); + break; + } + case 6: // Fill rectangle (parameters: x in m[3], y in m[4], w in m[5], h in m[6]) + { + int x = m[ 3 ]; + int y = m[ 4 ]; + int w = m[ 5 ]; + int h = m[ 6 ]; + SDL_Rect rect = { x, y, w, h }; + SDL_RenderFillRect(renderer, &rect); + break; + } + case 7: // Draw rectangle outline (parameters: x in m[3], y in m[4], w in m[5], h in + // m[6]) + { + int x = m[ 3 ]; + int y = m[ 4 ]; + int w = m[ 5 ]; + int h = m[ 6 ]; + SDL_Rect rect = { x, y, w, h }; + SDL_RenderDrawRect(renderer, &rect); + break; + } + case 8: // Quit graphics + if (renderer) SDL_DestroyRenderer(renderer); + if (window) SDL_DestroyWindow(window); + SDL_Quit(); + renderer = NULL; + window = NULL; + break; + default: + // Unknown graphics operation; ignored for simplicity. + break; + } + } + else { // unknown interrupt. what to do? } |
