/programs/emulator/chip8/chip8.asm |
---|
18,6 → 18,9 |
; application's entry point |
align 4 |
start: |
mcall 68, 11 |
mcall 68, 12, IMGBUF_SIZE |
mov dword [imgbuf_ptr], eax |
stdcall chip8_init ; initialize |
/programs/emulator/chip8/constants.inc |
---|
16,7 → 16,15 |
GFX_ROWS = 32 |
GFX_COLS = 64 |
GFX_SIZE = GFX_ROWS * GFX_COLS |
GFX_PIX_SIZE = 10 |
GFX_PIX_SIZE = 10 ; gfx cell size in pixels |
COLOR_BACK = 0x000000 |
COLOR_CELL = 0xade8f4 ;0xFFFFFF |
IMGBUF_WIDTH = GFX_COLS * GFX_PIX_SIZE ; width in pixels |
IMGBUF_HEIGHT = GFX_ROWS * GFX_PIX_SIZE ; height in pixels |
IMGBUF_SIZE = IMGBUF_WIDTH * IMGBUF_HEIGHT * 3 + 16 ; size in bytes for in-memory image buffer |
CLOCK_RATE = 1 ; in 10^-2 seconds |
/programs/emulator/chip8/data.inc |
---|
45,6 → 45,8 |
sys_colors system_colors |
main_window_title db 'CHIP-8 Emulator',0 |
imgbuf_ptr dd ? ; pointer to in-memory image buffer |
;========================================= |
align 16 |
_i_end: |
/programs/emulator/chip8/emu.inc |
---|
16,7 → 16,7 |
stdcall _memset, key, 0, KEY_SIZE |
;DEBUGF DBG_INFO, "ESP = %x\n", esp |
mcall 66, 1 ; set scancode keyboard mode |
mcall 66, 1, 0 ; set ASCII keyboard mode |
xor ecx, ecx |
@@: |
/programs/emulator/chip8/gui.inc |
---|
37,31 → 37,88 |
div ecx ; eax = row index, edx = col index |
mov dword [row_ind], eax |
mov dword [col_ind], edx |
mov dword [color], 0x80FFFFFF ; white |
mov dword [color], COLOR_CELL ; white |
cmp byte [esi + gfx], 0 ; check if cell is 0 or not 0 |
jne @f |
mov dword [color], 0x80000000 ; black |
mov dword [color], COLOR_BACK ; black |
@@: |
mov ebx, dword [col_ind] |
imul ebx, GFX_PIX_SIZE |
;add ebx, WINDOW_BORDER |
shl ebx, 16 |
add ebx, GFX_PIX_SIZE |
imul ebx, GFX_PIX_SIZE ; now ebx - x coord of rect |
mov ecx, dword [row_ind] |
imul ecx, GFX_PIX_SIZE |
;add ecx, WINDOW_BORDER |
shl ecx, 16 |
add ecx, GFX_PIX_SIZE |
mov eax, 13 |
imul ecx, GFX_PIX_SIZE ; now ecx - y coord of rect |
mov edx, dword [color] |
int 0x40 |
stdcall imgbuf_draw_rect, ebx, ecx, edx |
inc esi |
jmp .loop1 |
.loop1_end: |
stdcall imgbuf_send_to_window |
popad |
ret |
endp |
endp |
; copy imgbuf contents to the emulator window |
align 4 |
proc imgbuf_send_to_window stdcall |
DEBUGF DBG_INFO, "sending to window...\n" |
push eax ebx ecx edx |
mov eax, 7 |
mov ebx, dword [imgbuf_ptr] |
mov ecx, IMGBUF_WIDTH |
shl ecx, 16 |
add ecx, IMGBUF_HEIGHT |
xor edx, edx |
int 0x40 |
pop edx ecx ebx eax |
ret |
endp |
; in internal buffer draw rect filled with given color at position (rect_x, rect_y) within window |
align 4 |
proc imgbuf_draw_rect stdcall, rect_x: dword, rect_y: dword, rect_color: dword |
DEBUGF DBG_INFO, "imgbuf_draw_rect(%u, %u, %x)\n", [rect_x], [rect_y], [rect_color] |
push eax ebx ecx edx esi edi ebp |
mov ebx, dword [rect_y] |
imul ebx, IMGBUF_WIDTH |
add ebx, dword [rect_x] ; now ebx - index of first pixel of rect |
mov edi, dword [imgbuf_ptr] |
mov ebp, dword [rect_color] |
xor ecx, ecx |
.for_i: |
cmp ecx, GFX_PIX_SIZE |
jae .ret |
xor edx, edx |
.for_j: |
cmp edx, GFX_PIX_SIZE |
jae .for_j_end |
mov esi, edx |
add edx, ebx |
mov eax, ecx |
imul eax, IMGBUF_WIDTH |
add edx, eax ; now edx is index of edx'th pixel of ecx'th row of rect |
lea edx, [edx*3] |
add edx, edi |
mov dword [edx], ebp ; put color to pixel |
mov edx, esi |
inc edx |
jmp .for_j |
.for_j_end: |
inc ecx |
jmp .for_i |
.ret: |
pop ebp edi esi edx ecx ebx eax |
ret |
endp |
/programs/emulator/chip8/readme.txt |
---|
1,12 → 1,46 |
CHIP-8 Emulator for KolibriOS. |
Author: rgimad |
Year: 2021 |
CHIP8 - Chip-8 systems emulator, written specially for KolibriOS in pure FASM from scratch. |
Author: rgimad (rustem.gimadutdinov@gmail.com) |
License: GNU GPL v2 |
How to use: |
== Usage == |
Open shell in emulator directory (in Eolite Ctrl+G opens shell). |
Open shell in current directory (in Eolite Ctrl+G). |
Type for example: |
chip8 roms/ibm.ch8 |
P.S. ROMs from https://github.com/dmatlack/chip8/tree/master/roms |
== Keys == |
CHIP8 emulator can process 16 keys, they are: 0-9, a, b, c, d, e, f |
== ROMs == |
Emulator goes with some ROMs: games, demos, programs, etc. |
Some of them you can see below: |
=== TETRIS (roms/tetris1.ch8) === |
How to play: |
4 key is left rotate |
5 - left move |
6 - right move |
After every 5 lines, the speed increases slightly and peaks at 45 lines. |
=== SPACE INVADERS (roms/invaders1.ch8) === |
Very famous game |
=== MAZE (roms/maze_alt.ch8) === |
A random maze generator |
=== RND (roms/rnd.ch8) === |
Generates and prints out a random number. Press any key to generate one more. |
=== IBM (roms/ibm.ch8) === |
Prints out the IBM logo |
=== CHIP8 (roms/chip8.ch8) === |
Prints out the CHIP8 logo |
More ROMs you can find here: https://github.com/dmatlack/chip8/tree/master/roms |