Вывод на экран работает не полностью

Недавно начал писать ос на асемблере и си, уже сделал графику, но она выводи изображение не полностью: qemu

Но я заметил что если в си коде писать uint16_t вместо uint32_t и в асемблере всемто dd 32, dd 16, то пикселей становится не как раньше 16383, а 32767

boot.asm:

bits 32                            ; 32 bin
section .text                      ;
                                   ; Multiboot spec
    align 4                        ;
    dd 0x1BADB002                  ; MAGIC
    dd 7                           ; FLAGS
    dd - (0x1BADB002 + 7)          ; CHECKSUM (MAGIC + FLAGS)
    dd 0                           ; HEADER_ADDR
    dd 0                           ; LOAD_ADDR
    dd 0                           ; LOAD_END_ADDR
    dd 0                           ; BSS_END_ADDR
    dd 0                           ; ENTRY_ADDR
    dd 0                           ; MODE_TYPE
    dd 320                         ; WIDTH
    dd 200                         ; HEIGHT
    dd 32                          ; DEPTH
                                   ;
global _start                      ;
extern kmain                       ; Function kmain from C-code
                                   ;
_start:                            ;
    cli                            ;
    mov esp, stack_space           ; Set stack
    call kmain                     ; Call main function
    hlt                            ; Stop system
                                   ;
section .bbs                       ;
resb 8192                          ; 8 Kb
stack_space:                       ;
                                   ;

kernel.c:

#include <stdint.h>
#include <unistd.h>

uint32_t *vidptr = (uint32_t *)0xA0000;
int WIDTH = 320;
int HEIGHT = 200;

void set_pixel(int x, int y, uint32_t color) {
    vidptr[y * WIDTH + x] = color;
}

void fill_screen(uint32_t color) {
    for (int y = 0; y < HEIGHT; ++y) {
        for (int x = 0; x < WIDTH; ++x) {
            set_pixel(x, y, color);
        }
    }
}

void kmain(void) {
    fill_screen(0xFF9900);
    // vidptr[16383] = 0xFFFFFF;
    // vidptr[32767] = 0xFFFFFF;

    while (1) {}
}

Ответы (0 шт):