Advertisement
iocoder

printf.c

Dec 1st, 2013
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.45 KB | None | 0 0
  1.  
  2. __asm__(".code16gcc");
  3.  
  4. unsigned char *vga = (unsigned char *) 0xB8000;
  5. char attrib = 0x0F;
  6.  
  7. unsigned int getX() {
  8.  
  9.     unsigned short pos;
  10.  
  11.     // Get cursor position
  12.     __asm__("mov $0x03, %%ah \n\
  13.          mov $0x00, %%bh \n\
  14.          int $0x10":"=d"(pos):);
  15.  
  16.     // Set x & y:
  17.     int x = (pos>>0) & 0xFF; // column (DL)
  18.     int y = (pos>>8) & 0xFF; // row    (DH)
  19.  
  20.     // return X
  21.     return x;
  22.  
  23. }
  24.  
  25. unsigned int getY() {
  26.  
  27.     unsigned short pos;
  28.  
  29.     // Get cursor position
  30.     __asm__("mov $0x03, %%ah \n\
  31.          mov $0x00, %%bh \n\
  32.          int $0x10":"=d"(pos):);
  33.  
  34.     // Set x & y:
  35.     int x = (pos>>0) & 0xFF; // column (DL)
  36.     int y = (pos>>8) & 0xFF; // row    (DH)
  37.  
  38.     // return Y
  39.     return y;
  40.  
  41. }
  42.  
  43. void cursor(int x, int y) {
  44.  
  45.     unsigned short pos = 0;
  46.  
  47.     // Get x & y:
  48.     pos |= x<<0;  // column (DL)
  49.     pos |= y<<8;  // row    (DH)
  50.  
  51.     // Set cursor position
  52.     __asm__("mov $0x02, %%ah \n\
  53.          mov $0x00, %%bh \n\
  54.          int $0x10"::"d"(pos));
  55.  
  56. }
  57.  
  58. void cls() {
  59.     int i = 0;
  60.     while(i < 80*25*2) {
  61.         vga[i++] = ' ';
  62.         vga[i++] = attrib;
  63.     }
  64.     cursor(0, 0);
  65. }
  66.  
  67. void scroll() {
  68.     unsigned int i;
  69.     for (i=0; i< 80 * 24 * 2; i++)
  70.         vga[i] = vga[i + 80 * 2];
  71.  
  72.     // clean last row:
  73.     for (; i < 80 * 25 * 2; i+=2)
  74.         vga[i] = ' ';
  75. }
  76.  
  77. void putc(unsigned char chr) {
  78.  
  79.     int new_x, new_y;
  80.  
  81.     if (chr == '\n') {
  82.         do putc(' '); while(getX());
  83.         return;
  84.     }
  85.  
  86.     int x = getX();
  87.     int y = getY();
  88.  
  89.     vga[(y*80 + x)*2 + 0] = chr;
  90.     vga[(y*80 + x)*2 + 1] = attrib;
  91.  
  92.     if (x != 79) {
  93.         new_x = x+1;
  94.         new_y = y;
  95.     } else {
  96.         new_x = 0;
  97.         if (y != 24) {
  98.             new_y = y+1;
  99.         } else {
  100.             scroll();
  101.             new_y = y;
  102.         }
  103.     }
  104.  
  105.     cursor(new_x, new_y);
  106. }
  107.  
  108. void printDec(unsigned int value) {
  109.     unsigned int n = value / 10;
  110.     int r = value % 10;
  111.     if (value >= 10) printDec(n);
  112.     putc(r+'0');
  113. }
  114.  
  115. void printHex(unsigned int value) {
  116.     int i;
  117.     for(i = 7; i >= 0; i--)
  118.         putc("0123456789ABCDEF"[(value>> (i*4)) & 0x0F]);
  119. }
  120.  
  121. void printf(char *format, ...) {
  122.  
  123.     unsigned int arg_id = 0, i;
  124.     int *addr = (int *) &format;
  125.  
  126.     for (i = 0; format[i] != 0; i++)
  127.         if (format[i] == '%')
  128.             switch (format[++i]) {
  129.                 case 'c':
  130.                     putc(addr[++arg_id]);
  131.                     break;
  132.  
  133.                 case 'd':
  134.                     printDec(addr[++arg_id]);
  135.                     break;
  136.  
  137.                 case 'x':
  138.                     printHex(addr[++arg_id]);
  139.                     break;
  140.  
  141.                 case 's':
  142.                     printf((char *) addr[++arg_id]);
  143.                     break;
  144.  
  145.                 default:
  146.                     break;
  147.             }
  148.         else
  149.             putc(format[i]);
  150.  
  151. }
  152.  
  153. void video_mode(unsigned char mode) {
  154.     __asm__("int $0x10"::"a"(mode));
  155. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement