2024-12-09 02:41:13 +00:00
|
|
|
# Py502
|
2024-12-09 03:08:26 +00:00
|
|
|
a Python CPU emulator with a custom instruction set, and an ASM compiler
|
2024-12-09 03:11:01 +00:00
|
|
|
## What Doin'?
|
|
|
|
|
|
|
|
I am currently working on a C compiler for this custom CPU architecture.
|
|
|
|
I am also going to add characters to my ASM compiler so you can do stuff like
|
|
|
|
```asm
|
|
|
|
message:
|
|
|
|
.asciiz db "Hello, World!", 0x00 ; null terminated
|
|
|
|
```
|
|
|
|
|
|
|
|
|
2024-12-09 03:13:10 +00:00
|
|
|
## Problem??
|
|
|
|
|
|
|
|
|
|
|
|
I've included a broken ASM program, try to fix it with the error messages from the compiler, and let me know where i can improve the messages
|
|
|
|
|
|
|
|
|
|
|
|
```asm
|
|
|
|
|
|
|
|
main:
|
|
|
|
ldw a, 0xFF ; load 255 to A register, Unused
|
|
|
|
str a, 0x0F ; will cause an error because its writing to program memory
|
|
|
|
; You will have to make the address bigger than the program
|
|
|
|
int 0x00 ; interupt to print a register to terminal as a char (debug)
|
|
|
|
|
|
|
|
ldw a, 0 ; will be the graphics mode
|
|
|
|
str a, 0xF0 ; copy A register to memory address
|
|
|
|
|
|
|
|
ldw a, 800 ; screen width
|
|
|
|
str a, 0xF1 ; copy A register to memory address
|
|
|
|
|
|
|
|
ldw a, 600 ; screen height
|
|
|
|
str a, 0xF2 ; copy A register to memory address
|
|
|
|
jsr _init_graphics_mode
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
init_graphics_mode:
|
|
|
|
push a
|
|
|
|
push b
|
|
|
|
push c
|
|
|
|
|
|
|
|
ldw g, 0xFF ; This is never used
|
|
|
|
|
|
|
|
ldr a, 0xF0 ; copy data from memory address to register 'A'
|
|
|
|
ldr b, 0xF1 ; copy data from memory address to register 'B'
|
|
|
|
ldr c, 0xF2 ; copy data from memory address to register 'C'
|
|
|
|
|
|
|
|
int 0x70 ; all interupts in 0x70 - 0x7F are for graphics,
|
|
|
|
; only 0x70 to 0x72 are implemented
|
|
|
|
|
|
|
|
pop b
|
|
|
|
pop a
|
|
|
|
|
|
|
|
ret
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## Interupts
|
|
|
|
|
|
|
|
|
|
|
|
0x00 -> print register a as char
|
|
|
|
0x01 -> print register a as int
|
|
|
|
0xFF -> Halt
|
|
|
|
0xFE -> Error Interupt
|
|
|
|
0xF6 -> put keycode of currently pressed key in A register
|
|
|
|
and but a value (bool)(0 or 1) into b register to
|
|
|
|
indicate whether it is the first time this key has been
|
|
|
|
pressed.
|
|
|
|
0x70 -> Init graphics,
|
|
|
|
(A) mode
|
|
|
|
(B) X resolution
|
|
|
|
(C) Y Resulution
|
|
|
|
0x71 -> Set Pixel, (bitmap mode)
|
|
|
|
(A) Color (0x000000 to 0xFFFFFF)
|
|
|
|
(B) x position
|
|
|
|
(C) y position
|
|
|
|
0x72 -> Set Char, (Text Mode)
|
|
|
|
(A) Character Code
|
|
|
|
(B) Cursor Position
|
|
|
|
(C) Color (0x000000 to 0xFFFFFF)
|
|
|
|
|
|
|
|
! ALLL FILESYSTEM DRIVE NUMBER ARE LOCAL FILES !
|
|
|
|
drive( drive number (0 to 9)).bin
|
|
|
|
"drive8.bin"
|
|
|
|
drive number -> ( 0 to 9 )
|
|
|
|
sector number -> ( 0 to 15 )
|
|
|
|
byte offset -> ( 0 to 254 )
|
|
|
|
|
|
|
|
0x80 -> read byte from disk
|
|
|
|
(A) drive number
|
|
|
|
(B) sector number
|
|
|
|
(C) byte offset
|
|
|
|
moves output to A register
|
|
|
|
0x81 -> write byte from disk
|
|
|
|
(A) drive number
|
|
|
|
(B) sector number
|
|
|
|
(C) byte offset
|
|
|
|
(D) byte to write
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-12-09 03:11:01 +00:00
|
|
|
## Example error messages for the ASM Compiler
|
2024-12-09 03:08:26 +00:00
|
|
|
![image](https://github.com/user-attachments/assets/f50d5d51-dfb8-46a8-b3e3-c762d033c2f1)
|
|
|
|
![image](https://github.com/user-attachments/assets/fd7f2477-a4c6-46c3-afb9-9d47c5daa159)
|