Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 8733 → Rev 8734

/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