读书笔记《30天自制操作系统》day04

http://blog.csdn.net/ltbylc/article/details/8309257


1. 调色板的使用,照猫画虎就可以了

2. func.nas

[plain] view plain copy
  1. ; naskfunc  
  2. ; TAB=4  
  3.   
  4. [FORMAT "WCOFF"]                  
  5. [INSTRSET "i486p"]                
  6. [BITS 32]                         
  7. [FILE "naskfunc.nas"]             
  8.   
  9.         GLOBAL  _io_hlt, _io_cli, _io_sti, _io_stihlt  
  10.         GLOBAL  _io_in8,  _io_in16,  _io_in32  
  11.         GLOBAL  _io_out8, _io_out16, _io_out32  
  12.         GLOBAL  _io_load_eflags, _io_store_eflags  
  13.   
  14. [SECTION .text]  
  15.   
  16. _io_hlt:    ; void io_hlt(void);  
  17.         HLT  
  18.         RET  
  19.   
  20. _io_cli:    ; void io_cli(void);  
  21.         CLI  
  22.         RET  
  23.   
  24. _io_sti:    ; void io_sti(void);  
  25.         STI  
  26.         RET  
  27.   
  28. _io_stihlt: ; void io_stihlt(void);  
  29.         STI  
  30.         HLT  
  31.         RET  
  32.   
  33. _io_in8:    ; int io_in8(int port);  
  34.         MOV     EDX,[ESP+4]     ; port  
  35.         MOV     EAX,0  
  36.         IN      AL,DX  
  37.         RET  
  38.   
  39. _io_in16:   ; int io_in16(int port);  
  40.         MOV     EDX,[ESP+4]     ; port  
  41.         MOV     EAX,0  
  42.         IN      AX,DX  
  43.         RET  
  44.   
  45. _io_in32:   ; int io_in32(int port);  
  46.         MOV     EDX,[ESP+4]     ; port  
  47.         IN      EAX,DX  
  48.         RET  
  49.   
  50. _io_out8:   ; void io_out8(int port, int data);  
  51.         MOV     EDX,[ESP+4]     ; port  
  52.         MOV     AL,[ESP+8]      ; data  
  53.         OUT     DX,AL  
  54.         RET  
  55.   
  56. _io_out16:  ; void io_out16(int port, int data);  
  57.         MOV     EDX,[ESP+4]     ; port  
  58.         MOV     EAX,[ESP+8]     ; data  
  59.         OUT     DX,AX  
  60.         RET  
  61.   
  62. _io_out32:  ; void io_out32(int port, int data);  
  63.         MOV     EDX,[ESP+4]     ; port  
  64.         MOV     EAX,[ESP+8]     ; data  
  65.         OUT     DX,EAX  
  66.         RET  
  67.   
  68. _io_load_eflags:    ; int io_load_eflags(void);  
  69.         PUSHFD        
  70.         POP     EAX  
  71.         RET  
  72.   
  73. _io_store_eflags:   ; void io_store_eflags(int eflags);  
  74.         MOV     EAX,[ESP+4]  
  75.         PUSH    EAX  
  76.         POPFD         
  77.         RET  


 

3. bootpack.c

  1. void io_hlt(void);  
  2. void io_cli(void);  
  3. void io_out8(int port, int data);  
  4. int io_load_eflags(void);  
  5. void io_store_eflags(int eflags);  
  6.   
  7. void init_palette(void);  
  8. void set_palette(int start, int end, unsigned char *rgb);  
  9. void boxfill8(unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1);  
  10.   
  11. #define COL8_000000     0  
  12. #define COL8_FF0000     1  
  13. #define COL8_00FF00     2  
  14. #define COL8_FFFF00     3  
  15. #define COL8_0000FF     4  
  16. #define COL8_FF00FF     5  
  17. #define COL8_00FFFF     6  
  18. #define COL8_FFFFFF     7  
  19. #define COL8_C6C6C6     8  
  20. #define COL8_840000     9  
  21. #define COL8_008400     10  
  22. #define COL8_848400     11  
  23. #define COL8_000084     12  
  24. #define COL8_840084     13  
  25. #define COL8_008484     14  
  26. #define COL8_848484     15  
  27.   
  28. void HariMain(void)  
  29. {  
  30.     char *vram;  
  31.     int xsize, ysize;  
  32.   
  33.     init_palette();  
  34.     vram = (char *) 0xa0000;  
  35.     xsize = 320;  
  36.     ysize = 200;  
  37.   
  38.     boxfill8(vram, xsize, COL8_008484,  0,         0,          xsize -  1, ysize - 29);  
  39.     boxfill8(vram, xsize, COL8_C6C6C6,  0,         ysize - 28, xsize -  1, ysize - 28);  
  40.     boxfill8(vram, xsize, COL8_FFFFFF,  0,         ysize - 27, xsize -  1, ysize - 27);  
  41.     boxfill8(vram, xsize, COL8_C6C6C6,  0,         ysize - 26, xsize -  1, ysize -  1);  
  42.   
  43.     boxfill8(vram, xsize, COL8_FFFFFF,  3,         ysize - 24, 59,         ysize - 24);  
  44.     boxfill8(vram, xsize, COL8_FFFFFF,  2,         ysize - 24,  2,         ysize -  4);  
  45.     boxfill8(vram, xsize, COL8_848484,  3,         ysize -  4, 59,         ysize -  4);  
  46.     boxfill8(vram, xsize, COL8_848484, 59,         ysize - 23, 59,         ysize -  5);  
  47.     boxfill8(vram, xsize, COL8_000000,  2,         ysize -  3, 59,         ysize -  3);  
  48.     boxfill8(vram, xsize, COL8_000000, 60,         ysize - 24, 60,         ysize -  3);  
  49.   
  50.     boxfill8(vram, xsize, COL8_848484, xsize - 47, ysize - 24, xsize -  4, ysize - 24);  
  51.     boxfill8(vram, xsize, COL8_848484, xsize - 47, ysize - 23, xsize - 47, ysize -  4);  
  52.     boxfill8(vram, xsize, COL8_FFFFFF, xsize - 47, ysize -  3, xsize -  4, ysize -  3);  
  53.     boxfill8(vram, xsize, COL8_FFFFFF, xsize -  3, ysize - 24, xsize -  3, ysize -  3);  
  54.   
  55.     for (;;) {  
  56.         io_hlt();  
  57.     }  
  58. }  
  59.   
  60. void init_palette(void)  
  61. {  
  62.     static unsigned char table_rgb[16 * 3] = {  
  63.         0x00, 0x00, 0x00,     
  64.         0xff, 0x00, 0x00,     
  65.         0x00, 0xff, 0x00,     
  66.         0xff, 0xff, 0x00,     
  67.         0x00, 0x00, 0xff,     
  68.         0xff, 0x00, 0xff,     
  69.         0x00, 0xff, 0xff,     
  70.         0xff, 0xff, 0xff,     
  71.         0xc6, 0xc6, 0xc6,     
  72.         0x84, 0x00, 0x00,     
  73.         0x00, 0x84, 0x00,     
  74.         0x84, 0x84, 0x00,     
  75.         0x00, 0x00, 0x84,     
  76.         0x84, 0x00, 0x84,     
  77.         0x00, 0x84, 0x84,     
  78.         0x84, 0x84, 0x84      
  79.     };  
  80.     set_palette(0, 15, table_rgb);  
  81.     return;  
  82.   
  83. }  
  84.   
  85. void set_palette(int start, int end, unsigned char *rgb)  
  86. {  
  87.     int i, eflags;  
  88.     eflags = io_load_eflags();    
  89.     io_cli();                     
  90.     io_out8(0x03c8, start);  
  91.     for (i = start; i <= end; i++) {  
  92.         io_out8(0x03c9, rgb[0] / 4);  
  93.         io_out8(0x03c9, rgb[1] / 4);  
  94.         io_out8(0x03c9, rgb[2] / 4);  
  95.         rgb += 3;  
  96.     }  
  97.     io_store_eflags(eflags);      
  98.     return;  
  99. }  
  100.   
  101. void boxfill8(unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1)  
  102. {  
  103.     int x, y;  
  104.     for (y = y0; y <= y1; y++) {  
  105.         for (x = x0; x <= x1; x++)  
  106.             vram[y * xsize + x] = c;  
  107.     }  
  108.     return;  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值