3 facename: "-Misc-Fixed-Medium-R-SemiCondensed--13-120-75-75-C-60-ISO8859-1"
4 w x h: 6x13 (padded to 8x16)
10 default char: 0 (0x00)
12 Public domain font. Share and enjoy.
15 /* Font character bitmap data. */
16 static unsigned char fixed_font
[] = {
17 /* Character 0 (0x00): width 6 */
35 /* Character 1 (0x01): width 6 */
53 /* Character 2 (0x02): width 6 */
71 /* Character 3 (0x03): width 6 */
89 /* Character 4 (0x04): width 6 */
107 /* Character 5 (0x05): width 6 */
125 /* Character 6 (0x06): width 6 */
143 /* Character 7 (0x07): width 6 */
161 /* Character 8 (0x08): width 6 */
179 /* Character 9 (0x09): width 6 */
197 /* Character 10 (0x0a): width 6 */
215 /* Character 11 (0x0b): width 6 */
233 /* Character 12 (0x0c): width 6 */
251 /* Character 13 (0x0d): width 6 */
269 /* Character 14 (0x0e): width 6 */
287 /* Character 15 (0x0f): width 6 */
305 /* Character 16 (0x10): width 6 */
323 /* Character 17 (0x11): width 6 */
341 /* Character 18 (0x12): width 6 */
359 /* Character 19 (0x13): width 6 */
377 /* Character 20 (0x14): width 6 */
395 /* Character 21 (0x15): width 6 */
413 /* Character 22 (0x16): width 6 */
431 /* Character 23 (0x17): width 6 */
449 /* Character 24 (0x18): width 6 */
467 /* Character 25 (0x19): width 6 */
485 /* Character 26 (0x1a): width 6 */
503 /* Character 27 (0x1b): width 6 */
521 /* Character 28 (0x1c): width 6 */
539 /* Character 29 (0x1d): width 6 */
557 /* Character 30 (0x1e): width 6 */
575 /* Character 31 (0x1f): width 6 */
593 /* Character 32 (0x20): width 6 */
611 /* Character 33 (0x21): width 6 */
629 /* Character 34 (0x22): width 6 */
647 /* Character 35 (0x23): width 6 */
665 /* Character 36 (0x24): width 6 */
683 /* Character 37 (0x25): width 6 */
701 /* Character 38 (0x26): width 6 */
719 /* Character 39 (0x27): width 6 */
737 /* Character 40 (0x28): width 6 */
755 /* Character 41 (0x29): width 6 */
773 /* Character 42 (0x2a): width 6 */
791 /* Character 43 (0x2b): width 6 */
809 /* Character 44 (0x2c): width 6 */
827 /* Character 45 (0x2d): width 6 */
845 /* Character 46 (0x2e): width 6 */
863 /* Character 47 (0x2f): width 6 */
881 /* Character 48 (0x30): width 6 */
899 /* Character 49 (0x31): width 6 */
917 /* Character 50 (0x32): width 6 */
935 /* Character 51 (0x33): width 6 */
953 /* Character 52 (0x34): width 6 */
971 /* Character 53 (0x35): width 6 */
989 /* Character 54 (0x36): width 6 */
1007 /* Character 55 (0x37): width 6 */
1025 /* Character 56 (0x38): width 6 */
1043 /* Character 57 (0x39): width 6 */
1061 /* Character 58 (0x3a): width 6 */
1079 /* Character 59 (0x3b): width 6 */
1097 /* Character 60 (0x3c): width 6 */
1115 /* Character 61 (0x3d): width 6 */
1133 /* Character 62 (0x3e): width 6 */
1151 /* Character 63 (0x3f): width 6 */
1169 /* Character 64 (0x40): width 6 */
1187 /* Character 65 (0x41): width 6 */
1205 /* Character 66 (0x42): width 6 */
1223 /* Character 67 (0x43): width 6 */
1241 /* Character 68 (0x44): width 6 */
1259 /* Character 69 (0x45): width 6 */
1277 /* Character 70 (0x46): width 6 */
1295 /* Character 71 (0x47): width 6 */
1313 /* Character 72 (0x48): width 6 */
1331 /* Character 73 (0x49): width 6 */
1349 /* Character 74 (0x4a): width 6 */
1367 /* Character 75 (0x4b): width 6 */
1385 /* Character 76 (0x4c): width 6 */
1403 /* Character 77 (0x4d): width 6 */
1421 /* Character 78 (0x4e): width 6 */
1439 /* Character 79 (0x4f): width 6 */
1457 /* Character 80 (0x50): width 6 */
1475 /* Character 81 (0x51): width 6 */
1493 /* Character 82 (0x52): width 6 */
1511 /* Character 83 (0x53): width 6 */
1529 /* Character 84 (0x54): width 6 */
1547 /* Character 85 (0x55): width 6 */
1565 /* Character 86 (0x56): width 6 */
1583 /* Character 87 (0x57): width 6 */
1601 /* Character 88 (0x58): width 6 */
1619 /* Character 89 (0x59): width 6 */
1637 /* Character 90 (0x5a): width 6 */
1655 /* Character 91 (0x5b): width 6 */
1673 /* Character 92 (0x5c): width 6 */
1691 /* Character 93 (0x5d): width 6 */
1709 /* Character 94 (0x5e): width 6 */
1727 /* Character 95 (0x5f): width 6 */
1745 /* Character 96 (0x60): width 6 */
1763 /* Character 97 (0x61): width 6 */
1781 /* Character 98 (0x62): width 6 */
1799 /* Character 99 (0x63): width 6 */
1817 /* Character 100 (0x64): width 6 */
1835 /* Character 101 (0x65): width 6 */
1853 /* Character 102 (0x66): width 6 */
1871 /* Character 103 (0x67): width 6 */
1889 /* Character 104 (0x68): width 6 */
1907 /* Character 105 (0x69): width 6 */
1925 /* Character 106 (0x6a): width 6 */
1943 /* Character 107 (0x6b): width 6 */
1961 /* Character 108 (0x6c): width 6 */
1979 /* Character 109 (0x6d): width 6 */
1997 /* Character 110 (0x6e): width 6 */
2015 /* Character 111 (0x6f): width 6 */
2033 /* Character 112 (0x70): width 6 */
2051 /* Character 113 (0x71): width 6 */
2069 /* Character 114 (0x72): width 6 */
2087 /* Character 115 (0x73): width 6 */
2105 /* Character 116 (0x74): width 6 */
2123 /* Character 117 (0x75): width 6 */
2141 /* Character 118 (0x76): width 6 */
2159 /* Character 119 (0x77): width 6 */
2177 /* Character 120 (0x78): width 6 */
2195 /* Character 121 (0x79): width 6 */
2213 /* Character 122 (0x7a): width 6 */
2231 /* Character 123 (0x7b): width 6 */
2249 /* Character 124 (0x7c): width 6 */
2267 /* Character 125 (0x7d): width 6 */
2285 /* Character 126 (0x7e): width 6 */
2303 /* Character 127 (0x7f): width 6 */
2321 /* Character 128 (0x80): width 6 */
2339 /* Character 129 (0x81): width 6 */
2357 /* Character 130 (0x82): width 6 */
2375 /* Character 131 (0x83): width 6 */
2393 /* Character 132 (0x84): width 6 */
2411 /* Character 133 (0x85): width 6 */
2429 /* Character 134 (0x86): width 6 */
2447 /* Character 135 (0x87): width 6 */
2465 /* Character 136 (0x88): width 6 */
2483 /* Character 137 (0x89): width 6 */
2501 /* Character 138 (0x8a): width 6 */
2519 /* Character 139 (0x8b): width 6 */
2537 /* Character 140 (0x8c): width 6 */
2555 /* Character 141 (0x8d): width 6 */
2573 /* Character 142 (0x8e): width 6 */
2591 /* Character 143 (0x8f): width 6 */
2609 /* Character 144 (0x90): width 6 */
2627 /* Character 145 (0x91): width 6 */
2645 /* Character 146 (0x92): width 6 */
2663 /* Character 147 (0x93): width 6 */
2681 /* Character 148 (0x94): width 6 */
2699 /* Character 149 (0x95): width 6 */
2717 /* Character 150 (0x96): width 6 */
2735 /* Character 151 (0x97): width 6 */
2753 /* Character 152 (0x98): width 6 */
2771 /* Character 153 (0x99): width 6 */
2789 /* Character 154 (0x9a): width 6 */
2807 /* Character 155 (0x9b): width 6 */
2825 /* Character 156 (0x9c): width 6 */
2843 /* Character 157 (0x9d): width 6 */
2861 /* Character 158 (0x9e): width 6 */
2879 /* Character 159 (0x9f): width 6 */
2897 /* Character 160 (0xa0): width 6 */
2915 /* Character 161 (0xa1): width 6 */
2933 /* Character 162 (0xa2): width 6 */
2951 /* Character 163 (0xa3): width 6 */
2969 /* Character 164 (0xa4): width 6 */
2987 /* Character 165 (0xa5): width 6 */
3005 /* Character 166 (0xa6): width 6 */
3023 /* Character 167 (0xa7): width 6 */
3041 /* Character 168 (0xa8): width 6 */
3059 /* Character 169 (0xa9): width 6 */
3077 /* Character 170 (0xaa): width 6 */
3095 /* Character 171 (0xab): width 6 */
3113 /* Character 172 (0xac): width 6 */
3131 /* Character 173 (0xad): width 6 */
3149 /* Character 174 (0xae): width 6 */
3167 /* Character 175 (0xaf): width 6 */
3185 /* Character 176 (0xb0): width 6 */
3203 /* Character 177 (0xb1): width 6 */
3221 /* Character 178 (0xb2): width 6 */
3239 /* Character 179 (0xb3): width 6 */
3257 /* Character 180 (0xb4): width 6 */
3275 /* Character 181 (0xb5): width 6 */
3293 /* Character 182 (0xb6): width 6 */
3311 /* Character 183 (0xb7): width 6 */
3329 /* Character 184 (0xb8): width 6 */
3347 /* Character 185 (0xb9): width 6 */
3365 /* Character 186 (0xba): width 6 */
3383 /* Character 187 (0xbb): width 6 */
3401 /* Character 188 (0xbc): width 6 */
3419 /* Character 189 (0xbd): width 6 */
3437 /* Character 190 (0xbe): width 6 */
3455 /* Character 191 (0xbf): width 6 */
3473 /* Character 192 (0xc0): width 6 */
3491 /* Character 193 (0xc1): width 6 */
3509 /* Character 194 (0xc2): width 6 */
3527 /* Character 195 (0xc3): width 6 */
3545 /* Character 196 (0xc4): width 6 */
3563 /* Character 197 (0xc5): width 6 */
3581 /* Character 198 (0xc6): width 6 */
3599 /* Character 199 (0xc7): width 6 */
3617 /* Character 200 (0xc8): width 6 */
3635 /* Character 201 (0xc9): width 6 */
3653 /* Character 202 (0xca): width 6 */
3671 /* Character 203 (0xcb): width 6 */
3689 /* Character 204 (0xcc): width 6 */
3707 /* Character 205 (0xcd): width 6 */
3725 /* Character 206 (0xce): width 6 */
3743 /* Character 207 (0xcf): width 6 */
3761 /* Character 208 (0xd0): width 6 */
3779 /* Character 209 (0xd1): width 6 */
3797 /* Character 210 (0xd2): width 6 */
3815 /* Character 211 (0xd3): width 6 */
3833 /* Character 212 (0xd4): width 6 */
3851 /* Character 213 (0xd5): width 6 */
3869 /* Character 214 (0xd6): width 6 */
3887 /* Character 215 (0xd7): width 6 */
3905 /* Character 216 (0xd8): width 6 */
3923 /* Character 217 (0xd9): width 6 */
3941 /* Character 218 (0xda): width 6 */
3959 /* Character 219 (0xdb): width 6 */
3977 /* Character 220 (0xdc): width 6 */
3995 /* Character 221 (0xdd): width 6 */
4013 /* Character 222 (0xde): width 6 */
4031 /* Character 223 (0xdf): width 6 */
4049 /* Character 224 (0xe0): width 6 */
4067 /* Character 225 (0xe1): width 6 */
4085 /* Character 226 (0xe2): width 6 */
4103 /* Character 227 (0xe3): width 6 */
4121 /* Character 228 (0xe4): width 6 */
4139 /* Character 229 (0xe5): width 6 */
4157 /* Character 230 (0xe6): width 6 */
4175 /* Character 231 (0xe7): width 6 */
4193 /* Character 232 (0xe8): width 6 */
4211 /* Character 233 (0xe9): width 6 */
4229 /* Character 234 (0xea): width 6 */
4247 /* Character 235 (0xeb): width 6 */
4265 /* Character 236 (0xec): width 6 */
4283 /* Character 237 (0xed): width 6 */
4301 /* Character 238 (0xee): width 6 */
4319 /* Character 239 (0xef): width 6 */
4337 /* Character 240 (0xf0): width 6 */
4355 /* Character 241 (0xf1): width 6 */
4373 /* Character 242 (0xf2): width 6 */
4391 /* Character 243 (0xf3): width 6 */
4409 /* Character 244 (0xf4): width 6 */
4427 /* Character 245 (0xf5): width 6 */
4445 /* Character 246 (0xf6): width 6 */
4463 /* Character 247 (0xf7): width 6 */
4481 /* Character 248 (0xf8): width 6 */
4499 /* Character 249 (0xf9): width 6 */
4517 /* Character 250 (0xfa): width 6 */
4535 /* Character 251 (0xfb): width 6 */
4553 /* Character 252 (0xfc): width 6 */
4571 /* Character 253 (0xfd): width 6 */
4589 /* Character 254 (0xfe): width 6 */
4607 /* Character 255 (0xff): width 6 */
4627 // As long as we stay in the first segment, we won't have to deal with the crazy segments.
4628 static unsigned char *fb
= (unsigned char *) (128 * 1024);
4629 static unsigned long x
= 0;
4630 static unsigned long y
= 0;
4631 static unsigned long cursor_is_on
= 0;
4633 #define IOSPACE ((volatile int *) 0x1000000000000ULL)
4635 static void serialout(int ch
)
4642 static inline long unsigned now(void) {
4645 asm volatile("GET %0,rC" : "=r" (rC
));
4650 #define get_switches() (~IOSPACE[5])
4656 void wait(long unsigned ms
) {
4657 long unsigned start
= now();
4658 long cycles
= 25000 * ms
;
4660 while (now() - start
< cycles
)
4664 void cursor_flip(void) {
4665 unsigned char *d
= fb
+ (6*x
) / 8 + 13 * W
* y
;
4666 unsigned sh
= (x
* 6) & 7;
4667 unsigned mask
= ~ (((1 << 6) - 1) >> sh
);
4670 for (k
= 0; k
< 13; d
+= W
, ++k
) *d
^= 0xFC >> sh
;
4673 d
= fb
+ (6*x
) / 8 + 13 * W
* y
+ 1;
4675 mask
= ~ (((1 << 6) - 1) << sh
);
4677 for (k
= 0; k
< 13; d
+= W
, ++k
) *d
^= 0xFC << sh
;
4682 void cursor_off(void) { if (cursor_is_on
) cursor_flip(); }
4683 void cursor_on(void) { if (!cursor_is_on
) cursor_flip(); }
4686 * Ways to speed this up:
4688 * 0. Use tetra access to the frame buffer to reduce how often we need to
4689 * handle to overlapping case. (Octa access are twice as expensive as tetra
4690 * thus unlikely a win).
4692 * 1. Move the begining of the framebuffer rather than copying it. If
4693 * used with a mask such that the framebuffer loops around, we'd never have to
4694 * copy, otherwise we'd have to copy whenever we loop around.
4696 * 2. Enhance the SRAM controller with smarts [such at some top address
4697 * bits pick mode]. Modes we need here are read-modify-write modes,
4699 * *dest_addr = (*dest_addr & mask_register) | ((wrdata << shift) >> 32)
4701 * (It's not hard to imagine a lot of useful *d = COMBINE(*d, *s) operations)
4703 * However, shifters in the SRAM controller are expensive and the
4704 * whole approach increasingly looses relevance as the number of
4705 * bits pr pixel goes up. (The core actually could play tricks at
4706 * the byte level by exploring the byte enables, hmm).
4709 static void putchar(unsigned char ch
)
4711 long long unsigned i
;
4716 unsigned char *d
= fb
+ (6*x
) / 8 + 13 * W
* y
;
4717 unsigned char *s
= fixed_font
+ 16*(unsigned char)ch
;
4718 unsigned sh
= (x
* 6) & 7;
4719 unsigned mask
= ~ (((1 << 6) - 1) >> sh
);
4720 unsigned char *s_stop
= s
+ 13;
4722 for (; s
!= s_stop
; d
+= W
, ++s
) {
4723 *d
= (*s
>> sh
) | (*d
& mask
);
4725 // printf("%x\n", p[i]);
4728 d
= fb
+ (6*x
) / 8 + 13 * W
* y
+ 1;
4729 s
= fixed_font
+ 16*(unsigned char)ch
;
4731 mask
= ~ (((1 << 6) - 1) << sh
);
4733 for (; s
!= s_stop
; d
+= W
, ++s
) {
4734 *d
= (*s
<< sh
) | (*d
& mask
);
4736 // printf("%x\n", p[i]);
4742 if (x
== (640/6) || ch
== '\n') {
4745 if (y
== (480/13)) {
4747 for (i
= 0; i
< (640 / 64) * 13*(480/13 - 1); ++i
)
4748 ((long *)fb
)[i
] = ((long *)fb
)[i
+ 13 * (640 / 64)];
4749 for (; i
< (640 / 64) * 480; ++i
)
4750 ((long *)fb
)[i
] = 0;
4757 static void puts(unsigned char *s
)
4763 void puthex(int d
, unsigned long v
)
4765 if (d
> 1) puthex(d
- 1, v
>> 4);
4766 putchar("0123456789abcdef"[v
& 15]);
4770 putint_helper(unsigned long d
, unsigned long radix
)
4773 unsigned long radix10
= radix
* 10;
4776 d
= putint_helper(d
, radix10
);
4778 for (k
= 0; k
< 10 && d
>= radix
; ++k
)
4787 putchar('-'), d
= -d
;
4788 putint_helper(d
, 1);
4791 #define set_fbaddr0(x) IOSPACE[21] = (int) (unsigned long) (x)
4794 unsigned long *p
= (unsigned long *)fb
;
4795 unsigned long *end
= p
+ 4800;
4798 x
= y
= cursor_is_on
= 0;
4800 for (; p
!= end
; p
+= 10)
4801 p
[9] = p
[8] = p
[7] = p
[6] = p
[5] = p
[4] = p
[3] = p
[2] = p
[1] = p
[0] = 0;
4806 void gotoxy(unsigned long _x
, unsigned long _y
)
4832 // for (i = 0; i < 640 * 480 / 32; ++i)
4833 // ((int *)fb)[i] = 0;
4834 puts(" Hello MMIX World! ");
4836 for (i
= 0; i
< 10; ++i
) {
4845 puts("\nOk, let's cube numbers:");
4846 for (i
= 0; i
< 100; ++i
) {
4855 puts(" // 71. Install operand fields.\n"
4856 " if (0 /* resuming && rop != RESUME_AGAIN */) begin\n"
4857 " /* 126. Install special operands when resuming an interrupted\n"
4860 " if (f & X_is_source_bit) begin\n"
4861 " // 74. Set b from register X\n"
4862 " b = regfile_rddata_a;\n"
4863 " if(V)$display(\"%05d ** regfile a -> b = #%1x\", $time, b);\n"
4865 " // XXX if (info[op].third_operand) <set b from special register 79>;\n"
4866 " if (f & Z_is_immed_bit) begin\n"
4867 " z = zz; //$display(\"%05d ** z = zz\", $time);\n"
4868 " end else if (f & Z_is_source_bit) begin\n");
4869 puts("\nTODO: figure out why libc doesn't run correctly...");
4871 puts("\n\n *** The End *** \n\n");
4876 for (i
= 0; i
< 256; ++i
)
4879 while ((get_switches() & SW3
) == 0);