aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Moon Flower <moon@coffin.ir> 2025-08-09 15:53:03 +0330
committerGravatar Moon Flower <moon@coffin.ir> 2025-08-09 15:53:03 +0330
commite08942e676cebe3e113c55f05e93ad73c541a306 (patch)
treec2d95b29bc63b79a7b812604142939d992c93e69
parentmacros!! (diff)
vscode theme extension
-rw-r--r--code.pasm20
-rw-r--r--pasm-syntax/package.json26
-rw-r--r--pasm-syntax/pasm-syntax-0.0.1.vsixbin0 -> 2163 bytes
-rw-r--r--pasm-syntax/syntaxes/pasm.tmLanguage.json145
-rwxr-xr-xpenusbin0 -> 16424 bytes
-rw-r--r--penus.c30
-rw-r--r--pu.c122
7 files changed, 341 insertions, 2 deletions
diff --git a/code.pasm b/code.pasm
index e07d45b..94f37c5 100644
--- a/code.pasm
+++ b/code.pasm
@@ -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
new file mode 100644
index 0000000..e94bb8b
--- /dev/null
+++ b/pasm-syntax/pasm-syntax-0.0.1.vsix
Binary files differ
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
diff --git a/penus b/penus
new file mode 100755
index 0000000..a986fe2
--- /dev/null
+++ b/penus
Binary files differ
diff --git a/penus.c b/penus.c
new file mode 100644
index 0000000..ae9f866
--- /dev/null
+++ b/penus.c
@@ -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
diff --git a/pu.c b/pu.c
index 8e19f10..3de2576 100644
--- a/pu.c
+++ b/pu.c
@@ -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?
}