forked from KolibriOS/kolibrios
CHIP8: a little bit speed up graphics, update readme + small fixes
git-svn-id: svn://kolibrios.org@8734 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
43795ab11a
commit
1c00c160a2
@ -18,6 +18,9 @@ include 'constants.inc'
|
|||||||
; application's entry point
|
; application's entry point
|
||||||
align 4
|
align 4
|
||||||
start:
|
start:
|
||||||
|
mcall 68, 11
|
||||||
|
mcall 68, 12, IMGBUF_SIZE
|
||||||
|
mov dword [imgbuf_ptr], eax
|
||||||
|
|
||||||
stdcall chip8_init ; initialize
|
stdcall chip8_init ; initialize
|
||||||
|
|
||||||
@ -46,7 +49,7 @@ start:
|
|||||||
; mov byte [gfx + 64*2 + 3], 1
|
; mov byte [gfx + 64*2 + 3], 1
|
||||||
|
|
||||||
.event_loop:
|
.event_loop:
|
||||||
mcall 23, CLOCK_RATE ; wait for event with CLOCK_RATE timeout
|
mcall 23, CLOCK_RATE ; wait for event with CLOCK_RATE timeout
|
||||||
;DEBUGF DBG_INFO, "evenp loop iter i\n"
|
;DEBUGF DBG_INFO, "evenp loop iter i\n"
|
||||||
|
|
||||||
cmp eax, 1
|
cmp eax, 1
|
||||||
|
@ -16,7 +16,15 @@ KEY_SIZE = 16
|
|||||||
GFX_ROWS = 32
|
GFX_ROWS = 32
|
||||||
GFX_COLS = 64
|
GFX_COLS = 64
|
||||||
GFX_SIZE = GFX_ROWS * GFX_COLS
|
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
|
CLOCK_RATE = 1 ; in 10^-2 seconds
|
||||||
|
|
||||||
|
|
||||||
|
@ -45,6 +45,8 @@
|
|||||||
sys_colors system_colors
|
sys_colors system_colors
|
||||||
main_window_title db 'CHIP-8 Emulator',0
|
main_window_title db 'CHIP-8 Emulator',0
|
||||||
|
|
||||||
|
imgbuf_ptr dd ? ; pointer to in-memory image buffer
|
||||||
|
|
||||||
;=========================================
|
;=========================================
|
||||||
align 16
|
align 16
|
||||||
_i_end:
|
_i_end:
|
||||||
|
@ -16,7 +16,7 @@ proc chip8_init stdcall
|
|||||||
stdcall _memset, key, 0, KEY_SIZE
|
stdcall _memset, key, 0, KEY_SIZE
|
||||||
;DEBUGF DBG_INFO, "ESP = %x\n", esp
|
;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
|
xor ecx, ecx
|
||||||
@@:
|
@@:
|
||||||
|
@ -37,31 +37,88 @@ proc draw_screen stdcall
|
|||||||
div ecx ; eax = row index, edx = col index
|
div ecx ; eax = row index, edx = col index
|
||||||
mov dword [row_ind], eax
|
mov dword [row_ind], eax
|
||||||
mov dword [col_ind], edx
|
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
|
cmp byte [esi + gfx], 0 ; check if cell is 0 or not 0
|
||||||
jne @f
|
jne @f
|
||||||
mov dword [color], 0x80000000 ; black
|
mov dword [color], COLOR_BACK ; black
|
||||||
@@:
|
@@:
|
||||||
mov ebx, dword [col_ind]
|
mov ebx, dword [col_ind]
|
||||||
imul ebx, GFX_PIX_SIZE
|
imul ebx, GFX_PIX_SIZE ; now ebx - x coord of rect
|
||||||
;add ebx, WINDOW_BORDER
|
|
||||||
shl ebx, 16
|
|
||||||
add ebx, GFX_PIX_SIZE
|
|
||||||
|
|
||||||
mov ecx, dword [row_ind]
|
mov ecx, dword [row_ind]
|
||||||
imul ecx, GFX_PIX_SIZE
|
imul ecx, GFX_PIX_SIZE ; now ecx - y coord of rect
|
||||||
;add ecx, WINDOW_BORDER
|
|
||||||
shl ecx, 16
|
|
||||||
add ecx, GFX_PIX_SIZE
|
|
||||||
|
|
||||||
mov eax, 13
|
|
||||||
mov edx, dword [color]
|
mov edx, dword [color]
|
||||||
int 0x40
|
stdcall imgbuf_draw_rect, ebx, ecx, edx
|
||||||
|
|
||||||
inc esi
|
inc esi
|
||||||
jmp .loop1
|
jmp .loop1
|
||||||
|
|
||||||
.loop1_end:
|
.loop1_end:
|
||||||
|
stdcall imgbuf_send_to_window
|
||||||
popad
|
popad
|
||||||
ret
|
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
|
||||||
|
@ -1,12 +1,46 @@
|
|||||||
CHIP-8 Emulator for KolibriOS.
|
CHIP8 - Chip-8 systems emulator, written specially for KolibriOS in pure FASM from scratch.
|
||||||
Author: rgimad
|
Author: rgimad (rustem.gimadutdinov@gmail.com)
|
||||||
Year: 2021
|
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:
|
Type for example:
|
||||||
|
|
||||||
chip8 roms/ibm.ch8
|
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
|
||||||
|
Loading…
Reference in New Issue
Block a user