• 《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

     

  • 相关阅读:
    Selenium + WebDriver 各浏览器驱动下载地址
    selenium之 文件上传所有方法整理总结【转】
    FakeUserAgentError('Maximum amount of retries reached') 彻底解决办法
    git关联远程仓库
    通过chrome console 快速获取网页连接
    【转】Selenium
    【转】fiddler抓包HTTPS请求
    【转】Wireshark和Fiddler分析Android中的TLS协议包数据(附带案例样本)
    php 通过 create user 和grant 命令无法创建数据库用户和授权的解决办法
    差等生也是需要交卷的
  • 原文地址:https://www.cnblogs.com/JasonPeng1/p/12167236.html
Copyright © 2020-2023  润新知