7 #include <native/task.h>
8 #include <native/timer.h>
9 #include <native/intr.h>
15 #define BANNERWIDTH 10000
19 RT_TASK intrtask
, drawtask
;
23 unsigned char data
[BANNERWIDTH
];
25 char inputmsg
[MSGMAX
];
26 unsigned int pointer
= 0;
29 void add_tick(RTIME
*t
, RTIME tnew
)
33 for(i
=TICKS
-1; i
>0; i
--){
38 t
[TICKS
] = (t
[TICKS
]+t
[0])/TICKS
;
43 RTIME time
= *(RTIME
*)arg
;
44 RTIME step
= time
/(2*MAXX
+2);
48 rt_task_sleep(step
*2);
49 for(i
=0; i
<MAXX
; i
++){
50 outb(data
[i
+pointer
], 0x378);
57 pointer
= pointer
> msglen
? 0 : pointer
+1;
62 //Register as interrupt handler
64 rt_intr_create(&intr
, NULL
, LPT1IRQ
, 0);
66 //Initialize and declare the timer variables
67 RTIME tick
= rt_timer_read();
71 tock
= rt_timer_read();
72 add_tick(ticks
, tock
-tick
);
74 // Tocks waiting period
75 if(tocks
[TICKS
] < ticks
[TICKS
]){
76 // sleep until the arm is most left
77 rt_task_sleep(tocks
[TICKS
]/2);
78 rt_task_create(&drawtask
, NULL
, 0, 50, 0);
79 period
= ticks
[TICKS
]+tocks
[TICKS
];
80 rt_task_start(&drawtask
, &taskd
, &period
);
82 rt_intr_wait(&intr
, TM_INFINITE
);
85 tick
= rt_timer_read();
86 add_tick(tocks
, tick
-tock
);
88 if(ticks
[TICKS
] < tocks
[TICKS
]){
89 // sleep until the arm is most left
90 rt_task_sleep(ticks
[TICKS
]/2);
91 rt_task_create(&drawtask
, NULL
, 0, 50, 0);
92 period
= ticks
[TICKS
]+tocks
[TICKS
];
93 rt_task_start(&drawtask
, &taskd
, &period
);
95 rt_intr_wait(&intr
, TM_INFINITE
);
99 void make_message(char *msg
)
102 for(i
=0; i
<BANNERWIDTH
; i
++){
107 while(i
<BANNERWIDTH
&& s
< strlen(msg
)){
109 // Yes, we hardcoded all letters, digits and some symbols...
113 data
[i
++] = 0x1e; data
[i
++] = 0x5; data
[i
++] = 0x1e; break;
116 data
[i
++] = 0x1f; data
[i
++] = 0x15; data
[i
++] = 0xe; break;
119 data
[i
++] = 0xe; data
[i
++] = 0x11; break;
122 data
[i
++] = 0x1f; data
[i
++] = 0x11; data
[i
++] = 0xe; break;
125 data
[i
++] = 0x1f; data
[i
++] = 0x15; break;
128 data
[i
++] = 0x1f; data
[i
++] = 0x05; break;
131 data
[i
++] = 0xe; data
[i
++] = 0x11, data
[i
++] = 0x1d; break;
134 data
[i
++] = 0x1f; data
[i
++] = 0x4, data
[i
++] = 0x1f; break;
137 data
[i
++] = 0x1f; break;
140 data
[i
++] = 0x10; data
[i
++] = 0x1f; break;
143 data
[i
++] = 0x1f; data
[i
++] = 0x04; data
[i
++] = 0x1b; break;
146 data
[i
++] = 0x1f; data
[i
++] = 0x10; break;
149 data
[i
++] = 0x1f; data
[i
++] = 0x2; data
[i
++] = 0x7; data
[i
++] = 0x2; data
[i
++] = 0x1f; break;
152 data
[i
++] = 0x1f; data
[i
++] = 0x2; data
[i
++] = 0x4; data
[i
++] = 0x1f; break;
155 data
[i
++] = 0xe; data
[i
++] = 0x11; data
[i
++] = 0xe; break;
158 data
[i
++] = 0x1f; data
[i
++] = 0x5; data
[i
++] = 0x2; break;
161 data
[i
++] = 0xe; data
[i
++] = 0x11; data
[i
++] = 0x19; data
[i
++] = 0x1e; break;
164 data
[i
++] = 0x1f; data
[i
++] = 0x5; data
[i
++] = 0x1a; break;
167 data
[i
++] = 0x12; data
[i
++] = 0x15; data
[i
++] = 0xd; break;
170 data
[i
++] = 0x1; data
[i
++] = 0x1f; data
[i
++] = 0x1; break;
173 data
[i
++] = 0x1f; data
[i
++] = 0x10; data
[i
++] = 0x1f; break;
176 data
[i
++] = 0xf; data
[i
++] = 0x10; data
[i
++] = 0xf; break;
179 data
[i
++] = 0xf; data
[i
++] = 0x10; data
[i
++] = 0xc; data
[i
++] = 0x10; data
[i
++] = 0xf; break;
182 data
[i
++] = 0x11; data
[i
++] = 0xe; data
[i
++] = 0x11; break;
185 data
[i
++] = 0x17; data
[i
++] = 0x14; data
[i
++] = 0xf; break;
188 data
[i
++] = 0x19; data
[i
++] = 0x15; data
[i
++] = 0x13; break;
190 data
[i
++] = 0xe; data
[i
++] = 0x11; data
[i
++] = 0xe; break;
192 data
[i
++] = 0x12; data
[i
++] = 0x1f; data
[i
++] = 0x10; break;
194 data
[i
++] = 0x12; data
[i
++] = 0x19; data
[i
++] = 0x16; break;
196 data
[i
++] = 0x15; data
[i
++] = 0xa; break;
198 data
[i
++] = 0x7; data
[i
++] = 0x4; data
[i
++] = 0x1f; break;
200 data
[i
++] = 0x17; data
[i
++] = 0x15; data
[i
++] = 0x9; break;
202 data
[i
++] = 0xe; data
[i
++] = 0x15; data
[i
++] = 0x9; break;
204 data
[i
++] = 0x1; data
[i
++] = 0x1f; break;
206 data
[i
++] = 0x1f; data
[i
++] = 0x15; data
[i
++] = 0x1f; break;
208 data
[i
++] = 0x12; data
[i
++] = 0x15; data
[i
++] = 0x1e; break;
210 data
[i
++] = 0x10; break;
212 data
[i
++] = 0x10; data
[i
++] = 0x8; break;
215 data
[i
++] = 0x1; break;
217 data
[i
++] = 0xa; break;
219 data
[i
++] = 0xe; data
[i
++] = 0x11; break;
221 data
[i
++] = 0x11; data
[i
++] = 0xe; break;
223 data
[i
++] = 0x4; data
[i
++] = 0x4; break;
228 data
[i
++] = 0x17; break;
239 int main(int argc
, char* argv
[])
241 rt_print_auto_init(1);
242 mlockall(MCL_CURRENT
| MCL_FUTURE
);
245 for(i
=0; i
<BANNERWIDTH
; i
++){
251 outb(inb(0x37A) | 0x10, 0x37A);
253 make_message("abcdefghijklmnopqrstuvwxyz1234567890,.\"()");
255 rt_task_create(&intrtask
, NULL
, 0, 50, 0);
256 rt_task_start(&intrtask
, &taski
, 0);
258 printf("CRTL+C to exit\n");
259 printf("legal chars: abcdefghijklmnopqrstuvwxyz1234567890,.\"()\n");
261 printf("Type your message(max %d chars): ", MSGMAX
);
262 scanf("%[^\n]", inputmsg
);
264 make_message(inputmsg
);