blob: 67d65384b2406a688acb167a5c8c9a48233dee93 [file] [log] [blame]
adamdunkels08631742003-04-08 19:42:29 +00001/*
2 * Copyright (c) 2003, Adam Dunkels.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following
12 * disclaimer in the documentation and/or other materials provided
13 * with the distribution.
adamdunkelsfb24dff2004-09-12 14:07:30 +000014 * 3. The name of the author may not be used to endorse or promote
adamdunkels08631742003-04-08 19:42:29 +000015 * products derived from this software without specific prior
16 * written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
19 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
22 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
24 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 *
30 * This file is part of the Contiki VNC client
31 *
adamdunkelsfb24dff2004-09-12 14:07:30 +000032 * $Id: vnc-draw.c,v 1.3 2004/09/12 14:07:31 adamdunkels Exp $
adamdunkels08631742003-04-08 19:42:29 +000033 *
34 */
35
36
37
38#include "vnc-draw.h"
39#include "vnc-draw-asm.h"
40
41#include "vnc-conf.h"
42
43
44static unsigned char conv[256];
45
46static unsigned char oratab[8] =
47 { 0x80, 0x40, 0x20, 0x10,
48 0x08, 0x04, 0x02, 0x01 };
49static unsigned char andtab[8] =
50 { 0x7f, 0xbf, 0xdf, 0xef,
51 0xf7, 0xfb, 0xfd, 0xfe };
52
53static u8_t *bitmapptrtab[VNC_CONF_VIEWPORT_HEIGHT];
54
55static unsigned short viewport_x,
56 viewport_y, viewport_w, viewport_h;
57
58u8_t vnc_draw_bitmap[(VNC_CONF_VIEWPORT_WIDTH / 8) *
59 VNC_CONF_VIEWPORT_HEIGHT];
60
61
62
63u16_t vnc_draw_x;
64u16_t vnc_draw_y;
65u8_t *vnc_draw_dataptr;
66u8_t *vnc_draw_bitmapptr;
67u16_t vnc_draw_datalen;
68
69/*-----------------------------------------------------------------------------------*/
70void
71vnc_draw_pixel(u16_t x, u8_t y, u8_t c)
72{
73 u8_t o, a;
74
75 vnc_draw_bitmapptr = bitmapptrtab[y] + (x & 0x1f8);
76
77 if(c) {
78 o = oratab[x & 7];
79 *vnc_draw_bitmapptr = *vnc_draw_bitmapptr | o;
80 } else {
81 a = andtab[x & 7];
82 *vnc_draw_bitmapptr = *vnc_draw_bitmapptr & a;
83 }
84}
85/*-----------------------------------------------------------------------------------*/
86void
87vnc_draw_pixelline(u16_t x, u16_t y, u8_t *data, u16_t datalen)
88{
89 u8_t o, a;
90 register u8_t *bitmapptr;
91
92 vnc_draw_x = x - viewport_x;
93 vnc_draw_y = y - viewport_y;
94
95 /* if(vnc_draw_y & 1) {
96 return;
97 } else {
98 vnc_draw_y /= 2;
99 }*/
100
101
102
103 if(vnc_draw_y >= VNC_CONF_VIEWPORT_HEIGHT ||
104 vnc_draw_x >= VNC_CONF_VIEWPORT_WIDTH) {
105 return;
106 }
107
108 vnc_draw_datalen = datalen;
109
110 if(vnc_draw_datalen + vnc_draw_x >= VNC_CONF_VIEWPORT_WIDTH) {
111 vnc_draw_datalen = VNC_CONF_VIEWPORT_WIDTH - vnc_draw_x;
112 if(vnc_draw_datalen == 0) {
113 return;
114 }
115 }
116
117 vnc_draw_dataptr = data;
118
119 /* vnc_draw_bitmapptr = bitmaptab[vnc_draw_y] +
120 (vnc_draw_x & 0x1f8);*/
121
122 for(; vnc_draw_datalen > 0; --vnc_draw_datalen) {
123 /* vnc_draw_pixel(vnc_draw_x, vnc_draw_y,
124 conv[*vnc_draw_dataptr]);*/
125
126 bitmapptr = bitmapptrtab[vnc_draw_y] + (vnc_draw_x & 0x1f8);
127
128 if(conv[*vnc_draw_dataptr]) {
129 o = oratab[vnc_draw_x & 7];
130 *bitmapptr = *bitmapptr | o;
131 } else {
132 a = andtab[vnc_draw_x & 7];
133 *bitmapptr = *bitmapptr & a;
134 }
135 ++vnc_draw_dataptr;
136 ++vnc_draw_x;
137 }
138}
139/*-----------------------------------------------------------------------------------*/
140void
141vnc_draw_init(void)
142{
143 unsigned int tmp;
144 unsigned int i;
145 unsigned short ptr;
146
147
148 /* Create color conversion table. */
149 for(i = 0; i < 256; ++i) {
150 if(((i & 0xc0) > 0xc0) ||
151 ((i & 0x38) > 0x18) ||
152 ((i & 0x07) > 0x03)) {
153 conv[i] = 0;
154 } else {
155 conv[i] = 1;
156 }
157 }
158
159 memset(vnc_draw_bitmap, 0, sizeof(vnc_draw_bitmap));
160
161 for(i = 0; i < VNC_CONF_VIEWPORT_HEIGHT; ++i) {
162 bitmapptrtab[i] = (u8_t *)((u16_t)vnc_draw_bitmap +
163 ((i & 0xfff8)/8) * VNC_CONF_VIEWPORT_WIDTH +
164 (i & 7));
165 }
166
167 viewport_x = 0;
168 viewport_y = 0;
169
170 viewport_w = VNC_CONF_VIEWPORT_WIDTH;
171 viewport_h = VNC_CONF_VIEWPORT_HEIGHT;
172
173 return;
174}
175/*-----------------------------------------------------------------------------------*/
176u16_t
177vnc_draw_viewport_x(void)
178{
179 return viewport_x;
180}
181/*-----------------------------------------------------------------------------------*/
182u16_t
183vnc_draw_viewport_y(void)
184{
185 return viewport_y;
186}
187/*-----------------------------------------------------------------------------------*/
188u16_t
189vnc_draw_viewport_w(void)
190{
191 return viewport_w;
192}
193/*-----------------------------------------------------------------------------------*/
194u16_t
195vnc_draw_viewport_h(void)
196{
197 return viewport_h;
198}
199/*-----------------------------------------------------------------------------------*/
200#if 0
201signed short
202c64_mouse_x(void)
203{
204 return 0;
205}
206/*-----------------------------------------------------------------------------------*/
207signed short
208c64_mouse_y(void)
209{
210 return 0;
211}
212/*-----------------------------------------------------------------------------------*/
213u8_t
214c64_mouse_buttons(void)
215{
216 return firebutton;
217}
218/*-----------------------------------------------------------------------------------*/
219void
220c64_set_mouse_x(unsigned short x)
221{
222 joyx = x;
223}
224/*-----------------------------------------------------------------------------------*/
225void
226c64_set_mouse_y(unsigned short y)
227{
228 joyy = y;
229}
230/*-----------------------------------------------------------------------------------*/
231void
232c64_set_viewport_x(unsigned short x)
233{
234 viewport_x = x;
235}
236/*-----------------------------------------------------------------------------------*/
237void
238c64_set_viewport_y(unsigned short y)
239{
240 viewport_y = y;
241}
242/*-----------------------------------------------------------------------------------*/
243
244#endif /* 0 */
245#if 0
oliverschmidta8240ea2004-07-18 13:19:47 +0000246#pragma optimize(push, off)
adamdunkels08631742003-04-08 19:42:29 +0000247void
248c64_scroll_up(unsigned char c)
249{
250 asm("lda $f7");
251 asm("pha");
252 asm("lda $f8");
253 asm("pha");
254 asm("lda $f9");
255 asm("pha");
256 asm("lda $fa");
257 asm("pha");
258 asm("lda $fb");
259 asm("pha");
260 asm("lda $fc");
261 asm("pha");
262 asm("lda $fd");
263 asm("pha");
264 asm("lda $fe");
265 asm("pha");
266
267 asm("lda $01");
268 asm("pha");
269 asm("lda #$35");
270 asm("sta $01");
271
272 asm("lda #$80");
273 asm("sta $f7");
274 asm("lda #$a2");
275 asm("sta $f8");
276 asm("lda #$00");
277 asm("sta $f9");
278 asm("lda #$a0");
279 asm("sta $fa");
280
281 asm("lda #$80");
282 asm("sta $fb");
283 asm("lda #$e2");
284 asm("sta $fc");
285 asm("lda #$00");
286 asm("sta $fd");
287 asm("lda #$e0");
288 asm("sta $fe");
289
290 asm("ldy #0");
291 asm("loop:");
292 asm("lda ($f7),y");
293 asm("sta ($f9),y");
294 asm("lda ($fb),y");
295 asm("sta ($fd),y");
296 asm("iny");
297 asm("bne loop");
298
299 asm("inc $f8");
300 asm("inc $fa");
301 asm("inc $fc");
302 asm("inc $fe");
303
304 asm("lda $fc");
305 asm("cmp #$00");
306 asm("bne loop");
307
308 asm("ldy #0");
309 asm("lda #0");
310 asm("sta $fe00,y");
311 asm("sta $be00,y");
312 asm("sta $fcc0,y");
313 asm("sta $bcc0,y");
314 asm("iny");
315 asm("bne *-13");
316 asm("sta $ff00,y");
317 asm("sta $bf00,y");
318 asm("sta $fdc0,y");
319 asm("sta $bdc0,y");
320 asm("iny");
321 asm("cpy #$40");
322 asm("bne *-15");
323
324
325 asm("pla");
326 asm("sta $01");
327 asm("pla");
328 asm("sta $fe");
329 asm("pla");
330 asm("sta $fd");
331 asm("pla");
332 asm("sta $fc");
333 asm("pla");
334 asm("sta $fb");
335 asm("pla");
336 asm("sta $fa");
337 asm("pla");
338 asm("sta $f9");
339 asm("pla");
340 asm("sta $f8");
341 asm("pla");
342 asm("sta $f7");
343}
oliverschmidta8240ea2004-07-18 13:19:47 +0000344#pragma optimize(pop)
adamdunkels08631742003-04-08 19:42:29 +0000345/*-----------------------------------------------------------------------------------*/
oliverschmidta8240ea2004-07-18 13:19:47 +0000346#pragma optimize(push, off)
adamdunkels08631742003-04-08 19:42:29 +0000347void
348c64_scroll_down(unsigned char c)
349{
350 asm("lda $f7");
351 asm("pha");
352 asm("lda $f8");
353 asm("pha");
354 asm("lda $f9");
355 asm("pha");
356 asm("lda $fa");
357 asm("pha");
358 asm("lda $fb");
359 asm("pha");
360 asm("lda $fc");
361 asm("pha");
362 asm("lda $fd");
363 asm("pha");
364 asm("lda $fe");
365 asm("pha");
366
367
368 asm("lda $01");
369 asm("pha");
370 asm("lda #$35");
371 asm("sta $01");
372
373 asm("lda #$c0");
374 asm("sta $fb");
375 asm("lda #$fb");
376 asm("sta $fc");
377 asm("lda #$40");
378 asm("sta $fd");
379 asm("lda #$fe");
380 asm("sta $fe");
381
382 asm("lda #$c0");
383 asm("sta $f7");
384 asm("lda #$bb");
385 asm("sta $f8");
386 asm("lda #$40");
387 asm("sta $f9");
388 asm("lda #$be");
389 asm("sta $fa");
390
391
392 asm("ldy #0");
393 asm("loop:");
394 asm("lda ($fb),y");
395 asm("sta ($fd),y");
396 asm("lda ($f7),y");
397 asm("sta ($f9),y");
398 asm("iny");
399 asm("bne loop");
400
401 asm("dec $f8");
402 asm("dec $fa");
403 asm("dec $fc");
404 asm("dec $fe");
405
406
407 asm("lda $fe");
408 asm("cmp #$df");
409 asm("bne loop");
410
411 asm("ldy #0");
412 asm("lda #0");
413 asm("sta $e000,y");
414 asm("sta $a000,y");
415 asm("sta $e140,y");
416 asm("sta $a140,y");
417 asm("iny");
418 asm("bne *-13");
419 asm("sta $e100,y");
420 asm("sta $a100,y");
421 asm("sta $e240,y");
422 asm("sta $a240,y");
423 asm("iny");
424 asm("cpy #$40");
425 asm("bne *-15");
426
427 asm("pla");
428 asm("sta $01");
429 asm("pla");
430 asm("sta $fe");
431 asm("pla");
432 asm("sta $fd");
433 asm("pla");
434 asm("sta $fc");
435 asm("pla");
436 asm("sta $fb");
437 asm("pla");
438 asm("sta $fa");
439 asm("pla");
440 asm("sta $f9");
441 asm("pla");
442 asm("sta $f8");
443 asm("pla");
444 asm("sta $f7");
445}
oliverschmidta8240ea2004-07-18 13:19:47 +0000446#pragma optimize(pop)
adamdunkels08631742003-04-08 19:42:29 +0000447/*-----------------------------------------------------------------------------------*/
oliverschmidta8240ea2004-07-18 13:19:47 +0000448#pragma optimize(push, off)
adamdunkels08631742003-04-08 19:42:29 +0000449void
450c64_scroll_right(unsigned char c)
451{
452 asm("lda $f7");
453 asm("pha");
454 asm("lda $f8");
455 asm("pha");
456 asm("lda $f9");
457 asm("pha");
458 asm("lda $fa");
459 asm("pha");
460 asm("lda $fb");
461 asm("pha");
462 asm("lda $fc");
463 asm("pha");
464 asm("lda $fd");
465 asm("pha");
466 asm("lda $fe");
467 asm("pha");
468
469
470 asm("lda $01");
471 asm("pha");
472 asm("lda #$35");
473 asm("sta $01");
474
475 asm("lda #$00");
476 asm("sta $f7");
477 asm("lda #$a0");
478 asm("sta $f8");
479 asm("lda #$10");
480 asm("sta $f9");
481 asm("lda #$a0");
482 asm("sta $fa");
483
484 asm("lda #$00");
485 asm("sta $fb");
486 asm("lda #$e0");
487 asm("sta $fc");
488 asm("lda #$10");
489 asm("sta $fd");
490 asm("lda #$e0");
491 asm("sta $fe");
492
493 asm("ldx #0");
494
495 asm("loop3:");
496
497 asm("ldy #$ff");
498 asm("loop:");
499 asm("lda ($f7),y");
500 asm("sta ($f9),y");
501 asm("lda ($fb),y");
502 asm("sta ($fd),y");
503 asm("dey");
504 asm("cpy #$ff");
505 asm("bne loop");
506
507 asm("inc $f8");
508 asm("inc $fa");
509 asm("inc $fc");
510 asm("inc $fe");
511
512 asm("ldy #$30");
513 asm("loop2:");
514 asm("lda ($f7),y");
515 asm("sta ($f9),y");
516 asm("lda ($fb),y");
517 asm("sta ($fd),y");
518 asm("dey");
519 asm("cpy #$ff");
520 asm("bne loop2");
521
522 asm("lda $f7");
523 asm("clc");
524 asm("adc #$40");
525 asm("sta $f7");
526 asm("sta $fb");
527 asm("bcc :+");
528 asm("inc $f8");
529 asm("inc $fc");
530 asm(":");
531
532 asm("lda $f9");
533 asm("clc");
534 asm("adc #$40");
535 asm("sta $f9");
536 asm("sta $fd");
537 asm("bcc :+");
538 asm("inc $fa");
539 asm("inc $fe");
540 asm(":");
541
542
543
544 asm("inx");
545 asm("cpx #24");
546 asm("bne loop3");
547
548 asm("pla");
549 asm("sta $01");
550 asm("pla");
551 asm("sta $fe");
552 asm("pla");
553 asm("sta $fd");
554 asm("pla");
555 asm("sta $fc");
556 asm("pla");
557 asm("sta $fb");
558 asm("pla");
559 asm("sta $fa");
560 asm("pla");
561 asm("sta $f9");
562 asm("pla");
563 asm("sta $f8");
564 asm("pla");
565 asm("sta $f7");
566}
oliverschmidta8240ea2004-07-18 13:19:47 +0000567#pragma optimize(pop)
adamdunkels08631742003-04-08 19:42:29 +0000568/*-----------------------------------------------------------------------------------*/
oliverschmidta8240ea2004-07-18 13:19:47 +0000569#pragma optimize(push, off)
adamdunkels08631742003-04-08 19:42:29 +0000570void
571c64_scroll_left(unsigned char c)
572{
573 asm("lda $f7");
574 asm("pha");
575 asm("lda $f8");
576 asm("pha");
577 asm("lda $f9");
578 asm("pha");
579 asm("lda $fa");
580 asm("pha");
581 asm("lda $fb");
582 asm("pha");
583 asm("lda $fc");
584 asm("pha");
585 asm("lda $fd");
586 asm("pha");
587 asm("lda $fe");
588 asm("pha");
589
590
591 asm("lda $01");
592 asm("pha");
593 asm("lda #$35");
594 asm("sta $01");
595
596 asm("lda #$10");
597 asm("sta $f7");
598 asm("lda #$a0");
599 asm("sta $f8");
600 asm("lda #$00");
601 asm("sta $f9");
602 asm("lda #$a0");
603 asm("sta $fa");
604
605 asm("lda #$10");
606 asm("sta $fb");
607 asm("lda #$e0");
608 asm("sta $fc");
609 asm("lda #$00");
610 asm("sta $fd");
611 asm("lda #$e0");
612 asm("sta $fe");
613
614 asm("ldx #0");
615 asm("loop3:");
616 asm("ldy #0");
617 asm("loop:");
618 asm("lda ($f7),y");
619 asm("sta ($f9),y");
620 asm("lda ($fb),y");
621 asm("sta ($fd),y");
622 asm("iny");
623 asm("bne loop");
624
625 asm("inc $f8");
626 asm("inc $fa");
627 asm("inc $fc");
628 asm("inc $fe");
629
630 asm("ldy #0");
631 asm("loop2:");
632 asm("lda ($f7),y");
633 asm("sta ($f9),y");
634 asm("lda ($fb),y");
635 asm("sta ($fd),y");
636 asm("iny");
637 asm("cpy #$30");
638 asm("bne loop2");
639
640 asm("lda $f7");
641 asm("clc");
642 asm("adc #$40");
643 asm("sta $f7");
644 asm("sta $fb");
645 asm("bcc :+");
646 asm("inc $f8");
647 asm("inc $fc");
648 asm(":");
649
650 asm("lda $f9");
651 asm("clc");
652 asm("adc #$40");
653 asm("sta $f9");
654 asm("sta $fd");
655 asm("bcc :+");
656 asm("inc $fa");
657 asm("inc $fe");
658 asm(":");
659
660
661 asm("inx");
662 asm("cpx #24");
663 asm("bne loop3");
664
665 asm("pla");
666 asm("sta $01");
667 asm("pla");
668 asm("sta $fe");
669 asm("pla");
670 asm("sta $fd");
671 asm("pla");
672 asm("sta $fc");
673 asm("pla");
674 asm("sta $fb");
675 asm("pla");
676 asm("sta $fa");
677 asm("pla");
678 asm("sta $f9");
679 asm("pla");
680 asm("sta $f8");
681 asm("pla");
682 asm("sta $f7");
683}
oliverschmidta8240ea2004-07-18 13:19:47 +0000684#pragma optimize(pop)
adamdunkels08631742003-04-08 19:42:29 +0000685/*-----------------------------------------------------------------------------------*/
686
687
688
689#endif /* 0 */