gui.inc
rgimad_chip8_kolibri/gui.inc
; draw main window
align 4
proc draw_main_window stdcall
        DEBUGF  DBG_INFO, "draw_main_window() start\n"
        mcall   12, 1       ; notify about draw beginning
        mcall   48, 3, sys_colors, sizeof.system_colors
        
        mov     edx, [sys_colors.work]         ; background color
        or      edx, 0x74000000                ; window type
        ; DEBUGF  DBG_INFO, "mainwindow w, h  = %u, %u", GFX_COLS*GFX_PIX_SIZE + 8, GFX_ROWS*GFX_PIX_SIZE + 28
        mcall   0, <50, GFX_COLS*GFX_PIX_SIZE + 9>, <50, GFX_ROWS*GFX_PIX_SIZE + 28>, , , main_window_title ; 

        stdcall draw_screen

        mcall   12, 2                  ; notify about draw ending
        DEBUGF  DBG_INFO, "draw_main_window() end\n"
        ret
endp

; draw screen
align 4
proc draw_screen stdcall
        pushad
        locals
            row_ind dd ?
            col_ind dd ?
            color   dd ?
        endl

        xor     esi, esi
.loop1:
        cmp     esi, GFX_SIZE
        jae     .loop1_end
        xor     edx, edx
        mov     eax, esi
        mov     ecx, GFX_COLS
        div     ecx ; eax = row index, edx = col index
        mov     dword [row_ind], eax
        mov     dword [col_ind], edx
        mov     dword [color], COLOR_CELL ; white
        cmp     byte [esi + gfx], 0 ; check if cell is 0 or not 0
        jne     @f
        mov     dword [color], COLOR_BACK ;  black
    @@:
        mov     ebx, dword [col_ind]
        imul    ebx, GFX_PIX_SIZE ; now ebx - x coord of rect
        mov     ecx, dword [row_ind]
        imul    ecx, GFX_PIX_SIZE ; now ecx - y coord of rect
        mov     edx, dword [color]
        stdcall imgbuf_draw_rect, ebx, ecx, edx

        inc     esi
        jmp     .loop1

.loop1_end:
        stdcall imgbuf_send_to_window 
        popad
        ret
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
