《30天自制操作系统》day04——C语言与画面显示的练习

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

void io_hlt(void);
void io_cli(void);
void io_out8(int port, int data);
int io_load_eflags(void);
void io_store_eflags(int eflags);

/* ���͓�����[�X�t�@�C���ɏ����Ă����Ă��A��`����O�Ɏg���̂Ȃ�A
    ����ς�錾���Ă����Ȃ��Ƃ����Ȃ��B */

void init_palette(void);
void set_palette(int start, int end, unsigned char *rgb);

void HariMain(void)
{
    int i; /* �ϐ��錾�Bi�Ƃ����ϐ��́A32�r�b�g�̐����^ */
    char *p; /* p�Ƃ����ϐ��́ABYTE [...]�p�̔Ԓn */

    init_palette(); /* �p���b�g��ݒ� */

    p = (char *) 0xa0000; /* �Ԓn���� */

    for (i = 0; i <= 0xffff; i++) {
        p[i] = i & 0x0f;
    }

    for (;;) {
        io_hlt();
    }
}

void init_palette(void)
{
    static unsigned char table_rgb[16 * 3] = {
        0x00, 0x00, 0x00,    /*  0:�� */
        0xff, 0x00, 0x00,    /*  1:���邢�� */
        0x00, 0xff, 0x00,    /*  2:���邢�� */
        0xff, 0xff, 0x00,    /*  3:���邢���F */
        0x00, 0x00, 0xff,    /*  4:���邢�� */
        0xff, 0x00, 0xff,    /*  5:���邢�� */
        0x00, 0xff, 0xff,    /*  6:���邢���F */
        0xff, 0xff, 0xff,    /*  7:�� */
        0xc6, 0xc6, 0xc6,    /*  8:���邢�D�F */
        0x84, 0x00, 0x00,    /*  9:���� */
        0x00, 0x84, 0x00,    /* 10:���� */
        0x84, 0x84, 0x00,    /* 11:�����F */
        0x00, 0x00, 0x84,    /* 12:���� */
        0x84, 0x00, 0x84,    /* 13:���� */
        0x00, 0x84, 0x84,    /* 14:�����F */
        0x84, 0x84, 0x84    /* 15:���D�F */
    };
    set_palette(0, 15, table_rgb);
    return;

    /* static char ���߂́A�f�[�^�ɂ����g���Ȃ�����DB���ߑ��� */
}

void set_palette(int start, int end, unsigned char *rgb)
{
    int i, eflags;
    eflags = io_load_eflags();    /* ���荞�݋��ƒt���O�̒l���L�^���� */
    io_cli();                     /* ���ƒt���O��0�ɂ��Ċ��荞�݋֎~�ɂ��� */
    io_out8(0x03c8, start);
    for (i = start; i <= end; i++) {
        io_out8(0x03c9, rgb[0] / 4);
        io_out8(0x03c9, rgb[1] / 4);
        io_out8(0x03c9, rgb[2] / 4);
        rgb += 3;
    }
    io_store_eflags(eflags);    /* ���荞�݋��ƒt���O�����ɖ߂� */
    return;
}

 

 

; naskfunc
; TAB=4

[FORMAT "WCOFF"]                ; オブジェクトファイルを作るモード    
[INSTRSET "i486p"]                ; 486の命令まで使いたいという記述
[BITS 32]                        ; 32ビットモード用の機械語を作らせる
[FILE "naskfunc.nas"]            ; ソースファイル名情報

        GLOBAL    _io_hlt, _io_cli, _io_sti, _io_stihlt
        GLOBAL    _io_in8,  _io_in16,  _io_in32
        GLOBAL    _io_out8, _io_out16, _io_out32
        GLOBAL    _io_load_eflags, _io_store_eflags

[SECTION .text]

_io_hlt:    ; void io_hlt(void);
        HLT
        RET

_io_cli:    ; void io_cli(void);
        CLI
        RET

_io_sti:    ; void io_sti(void);
        STI
        RET

_io_stihlt:    ; void io_stihlt(void);
        STI
        HLT
        RET

_io_in8:    ; int io_in8(int port);
        MOV        EDX,[ESP+4]        ; port
        MOV        EAX,0
        IN        AL,DX
        RET

_io_in16:    ; int io_in16(int port);
        MOV        EDX,[ESP+4]        ; port
        MOV        EAX,0
        IN        AX,DX
        RET

_io_in32:    ; int io_in32(int port);
        MOV        EDX,[ESP+4]        ; port
        IN        EAX,DX
        RET

_io_out8:    ; void io_out8(int port, int data);
        MOV        EDX,[ESP+4]        ; port
        MOV        AL,[ESP+8]        ; data
        OUT        DX,AL
        RET

_io_out16:    ; void io_out16(int port, int data);
        MOV        EDX,[ESP+4]        ; port
        MOV        EAX,[ESP+8]        ; data
        OUT        DX,AX
        RET

_io_out32:    ; void io_out32(int port, int data);
        MOV        EDX,[ESP+4]        ; port
        MOV        EAX,[ESP+8]        ; data
        OUT        DX,EAX
        RET

_io_load_eflags:    ; int io_load_eflags(void);
        PUSHFD        ; PUSH EFLAGS という意味
        POP        EAX
        RET

_io_store_eflags:    ; void io_store_eflags(int eflags);
        MOV        EAX,[ESP+4]
        PUSH    EAX
        POPFD        ; POP EFLAGS という意味
        RET

 

原文地址:https://www.cnblogs.com/JasonPeng1/p/12167236.html