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