1
2ATTR_UNDERLINE = $04
3ATTR_BOLD      = $06
4ATTR_ITALICS   = $0B
5ATTR_OUTLINE   = $0C
6ATTR_RESET     = $92
7
8COLOR_BLACK    = $90
9COLOR_RED      = $1C
10COLOR_GREEN    = $1E
11COLOR_BLUE     = $1F
12
13test:
14	beq test0
15	jsr getbyt
16	txa
17	beq test0
18	cmp #1
19	bne :+
20	jmp test1
21:	cmp #2
22	bne :+
23	jmp test2
24:	cmp #3
25	bne :+
26	jmp test3
27:	jmp fcerr
28
29test0:
30	lda #$80
31	sec
32	jsr screen_set_mode
33	jsr test1_hline
34	jsr test2_vline
35	jsr test3_bresenham
36	jsr test4_set_get_pixels
37	jsr test5_filter_pixels
38	jsr test6_frame
39	jsr test7_rect
40	jsr test8_varlen_hline
41	jsr test9_varlen_vline
42	jsr test10_put_char
43	jsr test11_char_size
44	jsr test12_char_styles
45	jsr test13_move_rect
46	jsr test14_image
47	jsr checksum_framebuffer
48	rts
49
50test1_hline:
51	; horizontal line
52	lda #0
53	jsr GRAPH_set_colors
54	LoadW r0, 1
55	LoadW r1, 2
56	LoadW r2, 318
57	LoadW r3, 2
58	lda #0 ; set
59	jsr GRAPH_draw_line
60
61	; horizontal line - reversed
62	lda #2
63	jsr GRAPH_set_colors
64	LoadW r0, 318
65	LoadW r1, 4
66	LoadW r2, 1
67	LoadW r3, 4
68	lda #0 ; set
69	jmp GRAPH_draw_line
70
71test2_vline:
72	; vertical line
73	lda #3
74	jsr GRAPH_set_colors
75	LoadW r0, 1
76	LoadW r1, 6
77	LoadW r2, 1
78	LoadW r3, 198
79	lda #0 ; set
80	jsr GRAPH_draw_line
81
82	; vertical line - reversed
83	lda #4
84	jsr GRAPH_set_colors
85	LoadW r0, 3
86	LoadW r1, 198
87	LoadW r2, 3
88	LoadW r3, 6
89	lda #0 ; set
90	jmp GRAPH_draw_line
91
92test3_bresenham:
93	; Bresenham line TL->BR
94	lda #5
95	jsr GRAPH_set_colors
96	LoadW r0, 5
97	LoadW r1, 7
98	LoadW r2, 10
99	LoadW r3, 9
100	lda #0 ; set
101	jsr GRAPH_draw_line
102
103	; Bresenham line BL->TR
104	lda #6
105	jsr GRAPH_set_colors
106	LoadW r0, 5
107	LoadW r1, 13
108	LoadW r2, 10
109	LoadW r3, 11
110	lda #0 ; set
111	jsr GRAPH_draw_line
112
113	; Bresenham line BR->TL
114	lda #7
115	jsr GRAPH_set_colors
116	LoadW r0, 10
117	LoadW r1, 17
118	LoadW r2, 5
119	LoadW r3, 15
120	lda #0 ; set
121	jsr GRAPH_draw_line
122
123	; Bresenham line TR->BL
124	lda #8
125	jsr GRAPH_set_colors
126	LoadW r0, 10
127	LoadW r1, 19
128	LoadW r2, 5
129	LoadW r3, 21
130	lda #0 ; set
131	jmp GRAPH_draw_line
132
133test4_set_get_pixels:
134	; set direct pixels
135	LoadW r0, 5
136	LoadW r1, 23
137	jsr FB_cursor_position
138	ldx #0
139:	phx
140	txa
141	jsr FB_set_pixel
142	plx
143	inx
144	bne :-
145
146	; get direct pixels
147	LoadW r0, 5
148	LoadW r1, 23
149	jsr FB_cursor_position
150	LoadB r1H, 1; "OK"
151	ldx #0
152:	phx
153	jsr FB_get_pixel
154	plx
155	sta r0L
156	cpx r0L
157	beq @1
158	stz r1H ; "BAD"
159@1:	inx
160	bne :-
161
162	; print result of comparison
163	lda r1H
164	bne @2
165	LoadW 0, str_BAD
166	bra @3
167@2:	LoadW 0, str_OK
168@3:	lda #9
169	jsr GRAPH_set_colors
170	LoadW r0, 263
171	LoadW r1, 22
172	jmp print_string
173
174test5_filter_pixels:
175	; set direct pixels
176	LoadW r0, 5
177	LoadW r1, 25
178	jsr FB_cursor_position
179	ldx #0
180:	phx
181	txa
182	jsr FB_set_pixel
183	plx
184	inx
185	bne :-
186
187	; filter pixels
188	LoadW r0, 5
189	LoadW r1, 25
190	jsr FB_cursor_position
191	LoadW $70, $49 ; EOR #
192	LoadW $71, $55 ;      $55
193	LoadW $72, $60 ; RTS
194	LoadW r0, 256
195	LoadW r1, $70
196	jsr FB_filter_pixels
197
198	; check filter result using direct read
199	LoadW r0, 5
200	LoadW r1, 25
201	jsr FB_cursor_position
202	LoadB r1H, 1; "OK"
203	ldx #0
204:	phx
205	jsr FB_get_pixel
206	plx
207	eor #$55
208	sta r0L
209	cpx r0L
210	beq @4
211	stz r1H ; "BAD"
212@4:	inx
213	bne :-
214
215	; print result of comparison
216	lda r1H
217	bne @2a
218	LoadW 0, str_BAD
219	bra @3a
220@2a:	LoadW 0, str_OK
221@3a:	lda #10
222	jsr GRAPH_set_colors
223	LoadW r0, 263
224	LoadW r1, 32
225	jmp print_string
226
227test6_frame:
228	; frame frame
229	lda #11
230	jsr GRAPH_set_colors
231	LoadW r0, 100
232	LoadW r1, 20
233	LoadW r2, 10
234	LoadW r3, 10
235	clc
236	jmp GRAPH_draw_rect
237
238test7_rect:
239	; rectangle frame
240	lda #11
241	ldx #5
242	jsr GRAPH_set_colors
243	LoadW r0, 111
244	LoadW r1, 20
245	LoadW r2, 10
246	LoadW r3, 10
247	sec
248	jmp GRAPH_draw_rect
249
250test8_varlen_hline:
251	lda #15
252	jsr GRAPH_set_colors
253	LoadW r0, 5
254	LoadW r1, 41
255	LoadW r2, 5
256	LoadW r3, 41
257:	lda #0 ; set
258	jsr GRAPH_draw_line
259	IncW r1 ; y++
260	IncW r3 ; y++
261	lda r2L
262	clc
263	adc #11
264	sta r2L
265	lda r2H
266	adc #0
267	sta r2H
268	cmp #>318
269	bcc :-
270	lda r2L
271	cmp #<318
272	bcc :-
273	rts
274
275test9_varlen_vline:
276	lda #0
277	jsr GRAPH_set_colors
278	LoadW r0, 5
279	LoadW r1, 71
280	LoadW r2, 5
281	LoadW r3, 71
282:	lda #0 ; set
283	jsr GRAPH_draw_line
284	IncW r0 ; x++
285	IncW r2 ; x++
286	lda r3L
287	clc
288	adc #11
289	sta r3L
290	lda r3H
291	adc #0
292	sta r3H
293	cmp #>198
294	bcc :-
295	lda r3L
296	cmp #<198
297	bcc :-
298	rts
299
300test10_put_char:
301	lda #2
302	jsr GRAPH_set_colors
303
304	LoadW r0, 25
305	LoadW r1, 80
306	LoadW r2, 255
307	LoadW r3, 15
308	jsr GRAPH_set_window
309	clc
310	jsr GRAPH_draw_rect
311
312	AddVW 5, r1 ; add baseline -2
313
314	lda #$20
315:	jsr GRAPH_set_colors
316	pha
317	jsr GRAPH_put_char
318	pla
319	bcc @1
320	pha
321	lda #10 ; LF
322	jsr GRAPH_put_char
323	pla
324	dec
325@1:	inc
326	cmp #$7f
327	bne :-
328	rts
329
330test11_char_size:
331	LoadW r0, 25
332	LoadW r1, 100
333	LoadW r2, 255
334	LoadW r3, 20
335	jsr GRAPH_set_window
336	clc
337	jsr GRAPH_draw_rect
338
339	AddVW 7, r1 ; add baseline
340
341	lda #$20
342:	tax
343	jsr GRAPH_set_colors
344
345	; draw bounding box
346	pha
347	tax
348	PushW r0
349	PushW r1
350	txa
351	ldx #0; mode
352	jsr GRAPH_get_char_size
353	sta 0 ; baseline
354	PopW r1
355	PopW r0
356
357	PushW r1
358	; y -= baseline
359	lda r1L
360	sec
361	sbc 0; baseline
362	sta r1L
363	lda r1H
364	sbc #0
365	sta r1H
366
367	stx r2L
368	stz r2H
369
370	sty r3L
371	stz r3H
372
373	sec
374	jsr GRAPH_draw_rect
375	PopW r1
376
377	lda #0
378	jsr GRAPH_set_colors
379
380	pla
381	pha
382	jsr GRAPH_put_char
383	pla
384	bcc @1
385	pha
386	lda #10 ; LF
387	jsr GRAPH_put_char
388	pla
389	dec
390@1:	inc
391	cmp #$7f
392	beq :+
393	jmp :-
394:	rts
395
396test12_char_styles:
397	lda #0
398	ldx #4
399	jsr GRAPH_set_colors
400
401	LoadW r0, 20
402	LoadW r1, 125
403	LoadW r2, 295
404	LoadW r3, 74
405	jsr GRAPH_set_window
406	clc
407	jsr GRAPH_draw_rect
408
409	AddVW 7, r1 ; add baseline
410
411	ldy #0
412
413@loop:	phy
414	lda #$92 ; attributes off
415	jsr GRAPH_put_char
416	ply
417	phy
418	tya
419	ldx #0
420@2:	lsr
421	bcc @1
422	pha
423	lda style_codes,x
424	phx
425	jsr GRAPH_put_char
426	plx
427	pla
428@1:	inx
429	cpx #5
430	bne @2
431	LoadW 0, test_string
432	jsr print_string
433	ply
434	iny
435	cpy #32
436	bne @loop
437
438	lda #$92 ; attributes off
439	jmp GRAPH_put_char
440
441test_string:
442	.byte "abcABC123", 0
443
444style_codes:
445	.byte $04 ; underline
446	.byte $06 ; bold
447	.byte $0b ; italics
448	.byte $0c ; outline
449	.byte $12 ; reverse
450
451test13_move_rect:
452	LoadW r0, 100
453	LoadW r1, 100
454	LoadW r2, 320-40
455	LoadW r3, 10
456	LoadW r4, 40
457	LoadW r5, 50
458	jsr GRAPH_move_rect
459
460	LoadW r0, 320-40
461	LoadW r1, 10
462	LoadW r2, 320-40
463	LoadW r3, 35
464	LoadW r4, 40
465	LoadW r5, 50
466	jmp GRAPH_move_rect
467
468test14_image:
469	ldx #0
470:	lda logo_image,x
471	sta $0400,x
472	inx
473	bne :-
474
475	LoadW r0, 50
476	LoadW r1, 6
477	LoadW r2, $0400
478	LoadW r3, 16
479	LoadW r4, 16
480
481	ldx #10
482:	phx
483	jsr GRAPH_draw_image
484	AddVW 20, r0
485	plx
486	dex
487	bne :-
488	rts
489
490checksum_framebuffer:
491	lda #$ff
492	sta crclo
493	sta crchi
494
495	ldx #0
496@loop:	LoadW r0, 0
497	stx r1L
498	stz r1H
499	phx
500	jsr FB_cursor_position
501
502	ldx #>320
503	ldy #<320
504@loop2:	phy
505	phx
506	jsr FB_get_pixel
507	jsr crc16_f
508	plx
509	ply
510	dey
511	bne @loop2
512	dex
513	bpl @loop2
514
515	plx
516	inx
517	cpx #200
518	bne @loop
519
520	lda #0
521	tax
522	jsr GRAPH_set_colors
523
524	LoadW r0, 295
525	LoadW r1, 190
526	LoadW r2, 24
527	LoadW r3, 9
528	jsr GRAPH_set_window
529	sec
530	jsr GRAPH_draw_rect
531
532	AddVW 7, r1 ; add baseline
533
534	lda #1
535	jsr GRAPH_set_colors
536
537	lda crchi
538	lsr
539	lsr
540	lsr
541	lsr
542	tax
543	lda hextab,x
544	jsr GRAPH_put_char
545
546	lda crchi
547	and #15
548	tax
549	lda hextab,x
550	jsr GRAPH_put_char
551
552	lda crclo
553	lsr
554	lsr
555	lsr
556	lsr
557	tax
558	lda hextab,x
559	jsr GRAPH_put_char
560
561	lda crclo
562	and #15
563	tax
564	lda hextab,x
565	jsr GRAPH_put_char
566
567	rts
568
569hextab:
570	.byte "0123456789ABCDEF"
571
572; http://www.6502.org/source/integers/crc-more.html
573crclo	=0              ; current value of CRC
574crchi	=1              ; not necessarily contiguous
575
576crc16_f:
577	eor crchi       ; A contained the data
578	sta crchi       ; XOR it into high byte
579	lsr             ; right shift A 4 bits
580	lsr             ; to make top of x^12 term
581	lsr             ; ($1...)
582	lsr
583	tax             ; save it
584	asl             ; then make top of x^5 term
585	eor crclo       ; and XOR that with low byte
586	sta crclo       ; and save
587	txa             ; restore partial term
588	eor crchi       ; and update high byte
589	sta crchi       ; and save
590	asl             ; left shift three
591	asl             ; the rest of the terms
592	asl             ; have feedback from x^12
593	tax             ; save bottom of x^12
594	asl             ; left shift two more
595	asl             ; watch the carry flag
596	eor crchi       ; bottom of x^5 ($..2.)
597	tay             ; save high byte
598	txa             ; fetch temp value
599	rol             ; bottom of x^12, middle of x^5!
600	eor crclo       ; finally update low byte
601	sta crchi       ; then swap high and low bytes
602	sty crclo
603	rts
604
605
606
607print_string:
608	ldy #0
609:	lda (0),y
610	beq :+
611	phy
612	jsr GRAPH_put_char
613
614	bcc @1
615	lda #10 ; LF
616	jsr GRAPH_put_char
617	ply
618	bra :-
619@1:
620	ply
621	iny
622	bne :-
623:	rts
624
625str_OK:
626	.byte "OK", 0
627str_BAD:
628	.byte "BAD", 0
629
630
631; print text, alternating char/word wrap
632; full screen
633test1:
634	lda #$80
635	jsr screen_set_mode
636
637	LoadW r0, 0
638	jsr GRAPH_init
639
640	LoadW r0, 0
641	LoadW r1, 0
642	LoadW r2, 0
643	LoadW r3, 0
644	jsr console_init
645
646	jsr set_pause_text
647
648:	clc ; char wrap
649	jsr print_lots_of_text
650	sec ; word wrap
651	jsr print_lots_of_text
652	bra :-
653
654; print text, alternating char/word wrap
655; window
656test2:
657	lda #$80
658	jsr screen_set_mode
659
660	LoadW r0, 0
661	jsr GRAPH_init
662
663	LoadW r0, 0
664	LoadW r1, 0
665	LoadW r2, 319
666	LoadW r3, 0
667:	lda r1L
668	jsr GRAPH_set_colors
669	jsr GRAPH_draw_line
670	IncW r1
671	IncW r3
672	CmpWI r1, 200
673	bne :-
674
675	lda #0
676	ldx #15
677	ldy #1
678	jsr GRAPH_set_colors
679
680	INSET=20
681	LoadW r0, INSET
682	LoadW r1, INSET
683	LoadW r2, 320-2*INSET
684	LoadW r3, 200-2*INSET
685	jsr console_init
686
687	jsr set_pause_text
688
689:	clc ; char wrap
690	jsr print_lots_of_text
691	sec ; word wrap
692	jsr print_lots_of_text
693	bra :-
694
695set_pause_text:
696	ldx #0
697:	lda pause_text,x
698	sta $0500,x
699	beq :+
700	inx
701	bne :-
702:
703	LoadW r0, $0500
704	jmp console_set_paging_message
705
706pause_text:
707	.byte $92,$9B,$01,$90,$12,"Press any key to continue.",0
708
709tmp = 0
710print_lots_of_text:
711	LoadW tmp, text
712	jmp print_text
713
714print_text:
715	php
716@loop:	lda (tmp)
717	beq @end
718	cmp #CODE_LOGO
719	bne @1
720	jsr draw_logo
721	bra @9
722@1:	cmp #CODE_SMILEY
723	bne @2
724	jsr draw_smiley
725	bra @9
726@2:
727	plp
728	php
729	jsr console_put_char
730
731@9:	inc tmp
732	bne @loop
733	inc tmp+1
734	bra @loop
735@end	plp
736	rts
737
738CODE_LOGO   = $fe
739CODE_SMILEY = $ff
740text:
741	.byte ATTR_RESET,COLOR_BLACK
742	.byte "Space "
743	.byte ATTR_UNDERLINE
744	.byte "is"
745	.byte ATTR_RESET,ATTR_BOLD
746	.byte "big. "
747	.byte ATTR_RESET,ATTR_ITALICS
748	.byte "Really "
749	.byte ATTR_RESET,ATTR_OUTLINE
750	.byte "big. "
751	.byte ATTR_RESET,COLOR_RED
752	.byte "You "
753	.byte ATTR_UNDERLINE
754	.byte "just "
755	.byte ATTR_RESET,ATTR_BOLD
756	.byte "won't "
757	.byte ATTR_RESET,ATTR_ITALICS
758	.byte "believe "
759	.byte ATTR_RESET,ATTR_OUTLINE
760	.byte "how "
761	.byte ATTR_RESET,COLOR_GREEN
762	.byte "vastly, "
763	.byte ATTR_UNDERLINE
764	.byte "hugely,"
765	.byte ATTR_RESET
766	.byte "   "
767	.byte CODE_LOGO
768	.byte ATTR_BOLD
769	.byte "mindbogglingly "
770	.byte ATTR_RESET,ATTR_ITALICS
771	.byte "big "
772	.byte ATTR_RESET,ATTR_OUTLINE
773	.byte "it "
774	.byte ATTR_RESET,COLOR_BLUE
775	.byte "is. "
776	.byte CODE_SMILEY
777	.byte 0
778
779draw_smiley:
780	ldx #smiley_image_end-smiley_image-1
781:	lda smiley_image,x
782	sta $0400,x
783	dex
784	bpl :-
785
786	LoadW r0, $0400
787	LoadW r1, 10
788	LoadW r2, 10
789	jmp console_put_image
790
791draw_logo:
792	ldx #0
793:	lda logo_image,x
794	sta $0400,x
795	inx
796	bne :-
797
798	LoadW r0, $0400
799	LoadW r1, 16
800	LoadW r2, 16
801	jmp console_put_image
802
803; input line, echo it, loop
804test3:
805	lda #$80
806	jsr screen_set_mode
807
808	LoadW r0, 0
809	LoadW r1, 0
810	LoadW r2, 0
811	LoadW r3, 0
812	jsr console_init
813
814:	jsr console_get_char
815	sec
816	jsr console_put_char
817	jmp :-
818
819smiley_image:
820	.byte $1f,$1f,$42,$49,$49,$49,$49,$42,$1f,$1f,$1f,$49,$42,$42,$42,$42
821	.byte $42,$42,$42,$1f,$42,$49,$07,$07,$42,$42,$07,$07,$49,$42,$08,$14
822	.byte $5c,$3f,$46,$46,$3f,$3f,$3d,$08,$57,$12,$13,$13,$4c,$4c,$13,$13
823	.byte $12,$57,$57,$56,$45,$45,$50,$50,$45,$4c,$56,$57,$50,$50,$50,$50
824	.byte $50,$50,$50,$50,$50,$08,$42,$57,$50,$4f,$54,$54,$4f,$50,$57,$42
825	.byte $1f,$49,$57,$57,$57,$57,$57,$57,$49,$1f,$1f,$1f,$42,$08,$56,$56
826	.byte $08,$42,$1f,$1f
827smiley_image_end:
828
829logo_image:
830	.byte $14,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$91
831	.byte $cb,$16,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$ca,$e8
832	.byte $ae,$b1,$af,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$ae,$b0,$af
833	.byte $91,$b8,$b8,$b6,$91,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$b6,$b8,$b8,$91
834	.byte $c9,$b7,$b9,$b9,$b8,$91,$c9,$c9,$c9,$c9,$c9,$b7,$b9,$b9,$b8,$c9
835	.byte $c9,$92,$9d,$9d,$9d,$9c,$ae,$c9,$c9,$b5,$b8,$9d,$9d,$9d,$9b,$c9
836	.byte $c9,$91,$9c,$95,$9d,$9d,$9d,$ae,$c9,$9c,$9d,$9d,$95,$95,$b6,$c9
837	.byte $c9,$c9,$91,$ae,$92,$9b,$9c,$9a,$91,$9c,$9b,$9a,$ae,$b5,$c9,$c9
838	.byte $c9,$c9,$c9,$c9,$c9,$91,$80,$99,$91,$80,$99,$c9,$c9,$c9,$c9,$c9
839	.byte $c9,$c9,$c9,$c9,$5a,$63,$64,$5a,$91,$64,$63,$3e,$91,$c9,$c9,$c9
840	.byte $c9,$c9,$3e,$48,$48,$48,$48,$15,$c9,$47,$48,$48,$48,$46,$c9,$c9
841	.byte $c9,$c9,$47,$49,$49,$48,$14,$c9,$c9,$91,$48,$49,$49,$48,$c9,$c9
842	.byte $c9,$c9,$08,$50,$08,$15,$c9,$c9,$c9,$c9,$14,$47,$50,$50,$14,$c9
843	.byte $c9,$e5,$08,$2c,$e5,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$2b,$2d,$22,$c9
844	.byte $c9,$e5,$2b,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$2a,$2a,$c9
845	.byte $c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9
846