AVRA Ver. 1.2.3 vga_static.asm Fri Sep 19 14:50:53 2008 ; vga_static.asm - generate an static VGA picture ; author Neil Franklin, last modification 2008.09.19 ; need fuses, fast external quarz osc, max stable startup ; FF: 7:BODLVL=1, 6:BOD=1 (disable), 54:SUT=11, 3210:CKSEL=1111 (ext resonator) ; D9: 7:OCDEN=1 (dis), 6:JTAGEN=1 (dis), 5:SPIEN=0 (en), 4:CKOPT=1 ; 3:EESAVE=1 (not preserve), 21:BOOTSZ=00, 0:BOOTRST=1 ; PORTC is connected to an VGA HD15 adapter, 3*2bit DACs and 2 TTLs ; bit0+1 blue DAC, bit2+3 green DAC, bit4+5 red DAC ; bit6 hsync TTL, bit7 vsync TTL .include "m32def.inc" .list .cseg .org $0000 C:000000 940c 002b jmp RESET C:000002 940c 002a jmp RETI C:000004 940c 002a jmp RETI C:000006 940c 002a jmp RETI C:000008 940c 002a jmp RETI C:00000a 940c 002a jmp RETI C:00000c 940c 002a jmp RETI C:00000e 940c 002a jmp RETI C:000010 940c 002a jmp RETI C:000012 940c 002a jmp RETI C:000014 940c 002a jmp RETI C:000016 940c 002a jmp RETI C:000018 940c 002a jmp RETI C:00001a 940c 002a jmp RETI C:00001c 940c 002a jmp RETI C:00001e 940c 002a jmp RETI C:000020 940c 002a jmp RETI C:000022 940c 002a jmp RETI C:000024 940c 002a jmp RETI C:000026 940c 002a jmp RETI C:000028 940c 002a jmp RETI ; get interrupts ready, despite not used RETI: C:00002a 9518 reti ; get stack ready, despite not used RESET: C:00002b e56f ldi TL,low(MAXRAM) C:00002c e078 ldi TH,high(MAXRAM) C:00002d bf6d out SPL,TL C:00002e bf7e out SPH,TH C:00002f 9478 sei ; constants for out PORTC,colour COLOURS: .def BLK = R8 C:000030 e060 ldi TL,0x00 C:000031 2e86 mov BLK,TL .def BLU = R9 C:000032 e063 ldi TL,0x03 C:000033 2e96 mov BLU,TL .def GRN = R10 C:000034 e06c ldi TL,0x0C C:000035 2ea6 mov GRN,TL .def CYN = R11 C:000036 e06f ldi TL,0x0F C:000037 2eb6 mov CYN,TL .def RED = R12 C:000038 e360 ldi TL,0x30 C:000039 2ec6 mov RED,TL .def MAG = R13 C:00003a e363 ldi TL,0x33 C:00003b 2ed6 mov MAG,TL .def YEL = R14 C:00003c e36c ldi TL,0x3C C:00003d 2ee6 mov YEL,TL .def WHT = R15 C:00003e e36f ldi TL,0x3F C:00003f 2ef6 mov WHT,TL ; constants for out PORTC,sync SYNC: .def HOR = R5 C:000040 e460 ldi TL,0x40 C:000041 2e56 mov HOR,TL .def VER = R6 C:000042 e860 ldi TL,0x80 C:000043 2e66 mov VER,TL .def VHR = R7 C:000044 ec60 ldi TL,0xC0 C:000045 2e76 mov VHR,TL ; get PortC ready DDR: C:000046 ef6f ldi TL,0xFF C:000047 bb64 out DDRC,TL ; no picture at the moment INIT: C:000048 ba85 out PORTC,BLK ; loop infinitely through drawing frames LOOP: C:000049 940e 0057 call FRAME ; 4 + (449*600+583) clocks, 13 to spare C:00004b 0000 nop ; 10 clocks C:00004c 0000 nop C:00004d 0000 nop C:00004e 0000 nop C:00004f 0000 nop C:000050 0000 nop C:000051 0000 nop C:000052 0000 nop C:000053 0000 nop C:000054 0000 nop C:000055 940c 0049 jmp LOOP ; 3 clocks ; draw frame, in 12+25 + (25*16=)400 + 12 = 449 lines ; + 4+575 + 4 = 583 clocks (of 450 lines of 600 clocks) ; start with retrace pulse, as first deviation from all zero ; end with 1st cycle of last blank before next pulse, rest f callers control FRAME: FRPULSE: ; must be 12 lines C:000057 e07c ldi TH,12 ; 1clock FRPLOOP: C:000058 940e 00ae call VRLINE ; 4 + 575 = 579 clocks, 21 to spare C:00005a e063 ldi TL,3 ; 1 clock C:00005b 940e 01b4 call WAIT ; 4 + (3 * 3 + 3) = 16 clocks C:00005d 0000 nop ; 1 clock C:00005e 957a dec TH ; 1 clock C:00005f f7c1 brne FRPLOOP ; 2 clocks when taken, 1 when not FRBLANK: ; must be 25 lines C:000060 e179 ldi TH,25 ; 1clock FRBLOOP: C:000061 940e 00b8 call BLLINE ; 4 + 575 = 579 clocks, 21 to spare C:000063 e063 ldi TL,3 ; 1 clock C:000064 940e 01b4 call WAIT ; 4 + (3 * 3 + 2) = 16 clocks C:000066 0000 nop ; 1 clock C:000067 957a dec TH ; 1 clock C:000068 f7c1 brne FRBLOOP ; 2 clocks when taken, 1 when not FRDRAW: ; must be 400 pixel lines FRSOLID: ; 5*16=80 solid block C:000069 e570 ldi TH,80 ; 1clock FRSLOOP: C:00006a 940e 00c2 call PXLINE ; 4 + 575 = 579 clocks, 21 to spare C:00006c e063 ldi TL,3 ; 1 clock C:00006d 940e 01b4 call WAIT ; 4 + (3 * 3 + 3) = 16 clocks C:00006f 0000 nop ; 1 clock C:000070 957a dec TH ; 1 clock C:000071 f7c1 brne FRSLOOP ; 2 clocks when taken, 1 when not ; remaining 400-80=320 pixel lines FRSTRIPE: ; 5*16=80 striped block C:000072 e278 ldi TH,40 ; 1clock FRSTLOOP: C:000073 940e 00c2 call PXLINE ; 4 + 575 = 579 clocks, 21 to spare C:000075 e064 ldi TL,4 ; 1 clock C:000076 940e 01b4 call WAIT ; 4 + (4 * 3 + 3) = 19 clocks C:000078 0000 nop ; 1 clock C:000079 940e 00b8 call BLLINE ; 4 + 575 = 579 clocks, 21 to spare C:00007b e063 ldi TL,3 ; 1 clock C:00007c 940e 01b4 call WAIT ; 4 + (3 * 3 + 3) = 16 clocks C:00007e 0000 nop ; 1 clock C:00007f 957a dec TH ; 1 clock C:000080 f791 brne FRSTLOOP ; 2 clocks when taken, 1 when not ; remaining 320-80=240 pixel lines FRBLACK: ; 5*16=80 black block, same as solid block C:000081 e570 ldi TH,80 ; 1clock FRHLOOP: C:000082 940e 00b8 call BLLINE C:000084 e063 ldi TL,3 C:000085 940e 01b4 call WAIT C:000087 0000 nop C:000088 957a dec TH C:000089 f7c1 brne FRHLOOP ; remaining 240-80=160 pixel lines FRSTRIPE2: ; 5*16=80 striped block C:00008a e278 ldi TH,40 FRST2LOOP: C:00008b 940e 0192 call SHLINE C:00008d e064 ldi TL,4 C:00008e 940e 01b4 call WAIT C:000090 0000 nop C:000091 940e 00b8 call BLLINE C:000093 e063 ldi TL,3 C:000094 940e 01b4 call WAIT C:000096 0000 nop C:000097 957a dec TH C:000098 f791 brne FRST2LOOP ; remaining 160-80=80 pixel lines FRSOLID2: ; 5*16=80 solid block C:000099 e570 ldi TH,80 FRS2LOOP: C:00009a 940e 0192 call SHLINE C:00009c e063 ldi TL,3 C:00009d 940e 01b4 call WAIT C:00009f 0000 nop C:0000a0 957a dec TH C:0000a1 f7c1 brne FRS2LOOP ; remaining 80-80=0 pixel lines, all pixel lines used up FREND: ; must be 12 of 13 lines C:0000a2 e07c ldi TH,12 ; 1clock FRELOOP: C:0000a3 940e 00b8 call BLLINE ; 4 + 575 = 579 clocks, 21 to spare C:0000a5 e063 ldi TL,3 ; 1 clock C:0000a6 940e 01b4 call WAIT ; 4 + (3 * 3 + 3) = 16 clocks C:0000a8 0000 nop ; 1 clock C:0000a9 957a dec TH ; 1 clock C:0000aa f7c1 brne FRELOOP ; 2 clocks when taken, 1 when not ; 13th line, last one, no wait, give rest of time to caller C:0000ab 940e 00b8 call BLLINE ; 4 + 579 = 579 clocks, 21 to spare C:0000ad 9508 ret ; 4 clocks ; draw vertical retrace line ; start with horizontal retrace pulse, as first deviation from all zero ; end with 1st cycle of blank before next pulse, rest for callers control ; uses 30+60 + 480 + 1 + 4 = 575 clocks (of 600 in line) VRLINE: VRPULSE: ; must be 30 clocks, V = 1, H = 1, color = BLK C:0000ae ba75 out PORTC,VHR ; 1 clock C:0000af e067 ldi TL,7 ; 1 clock C:0000b0 940e 01b4 call WAIT ; 4 + (7 * 3 + 3) = 28 clocks VRBLANK: ; must be 60+480 = 540 clocks, V = 1, H = 0, color = BLK C:0000b2 ba65 out PORTC,VER ; 1 clock C:0000b3 eb61 ldi TL,177 ; 1 clock C:0000b4 940e 01b4 call WAIT ; 4 + (177 * 3 + 3) = 538 clocks VREND: C:0000b6 ba65 out PORTC,VER ; 1 clock, no signal effect, just for regular timing ; no waiting, give rest of time to caller C:0000b7 9508 ret ; 4 clocks ; draw blank line ; same as VRLINE but without vertical retrace signal active ; uses 30+60 + 480 + 1 + 4 = 575 clocks (of 600 in line) BLLINE: BLPULSE: ; must be 30 clocks, V = 0, H = 1, color = BLK C:0000b8 ba55 out PORTC,HOR ; 1 clock C:0000b9 e067 ldi TL,7 ; 1 clock C:0000ba 940e 01b4 call WAIT ; 4 + (7 * 3 + 3) = 28 clocks BLBLANK: ; must be 60+480 = 540 clocks, V = 0, H = 0, color = BLK C:0000bc ba85 out PORTC,BLK ; 1 clock C:0000bd eb61 ldi TL,177 ; 1 clock C:0000be 940e 01b4 call WAIT ; 4 + (177 * 3 + 3) = 538 clocks BLEND: C:0000c0 ba85 out PORTC,BLK ; 1 clock, no signal effect, just for regular timing ; no waiting, give rest of time to caller C:0000c1 9508 ret ; 4 clocks ; draw pixel line ; start with horizontal retrace pulse, as first deviation from all zero ; end with 1st cycle of blank before next pulse, rest for callers control ; uses 30+60 + 480 + 1 + 4 = 575 clocks (of 600 in line) PXLINE: PXPULSE: ; must be 30 clocks, V = 0, H = 1, color = BLK C:0000c2 ba55 out PORTC,HOR ; 1 clock C:0000c3 e067 ldi TL,7 ; 1 clock C:0000c4 940e 01b4 call WAIT ; 4 + (7 * 3 + 3) = 28 clocks PXBLANK: ; must be 60 clocks, V = 0, H = 0, color = BLK C:0000c6 ba85 out PORTC,BLK ; 1 clock C:0000c7 e161 ldi TL,17 ; 1 clock C:0000c8 940e 01b4 call WAIT ; 4 + (17 * 3 + 3) = 58 clocks PXDRAW: ; must be 480 pixel clocks, V = 0, H = 0, color = pixel PXWB: ; 6 widening white/black stripes C:0000ca baf5 out PORTC,WHT ; 2*1 = 2 C:0000cb ba85 out PORTC,BLK C:0000cc baf5 out PORTC,WHT ; + 2*2 = 6 C:0000cd 0000 nop C:0000ce ba85 out PORTC,BLK C:0000cf 0000 nop C:0000d0 baf5 out PORTC,WHT ; + 2*4 = 14 C:0000d1 0000 nop C:0000d2 0000 nop C:0000d3 0000 nop C:0000d4 ba85 out PORTC,BLK C:0000d5 0000 nop C:0000d6 0000 nop C:0000d7 0000 nop C:0000d8 baf5 out PORTC,WHT ; + 2*8 = 30 C:0000d9 0000 nop C:0000da 0000 nop C:0000db 0000 nop C:0000dc 0000 nop C:0000dd 0000 nop C:0000de 0000 nop C:0000df 0000 nop C:0000e0 ba85 out PORTC,BLK C:0000e1 0000 nop C:0000e2 0000 nop C:0000e3 0000 nop C:0000e4 0000 nop C:0000e5 0000 nop C:0000e6 0000 nop C:0000e7 0000 nop ; + 2*16=62 C:0000e8 baf5 out PORTC,WHT ; 1 clock C:0000e9 e062 ldi TL,2 ; 1 clock C:0000ea 940e 01b4 call WAIT ; 4 + (2 * 3 + 3) = 13 clocks C:0000ec 0000 nop ; 1 clock C:0000ed ba85 out PORTC,BLK C:0000ee e062 ldi TL,2 C:0000ef 940e 01b4 call WAIT C:0000f1 0000 nop ; + 2*32=126 C:0000f2 baf5 out PORTC,WHT ; 1 clock C:0000f3 e067 ldi TL,7 ; 1 clock C:0000f4 940e 01b4 call WAIT ; 4 + (7 * 3 + 3) = 28 clocks C:0000f6 0000 nop ; 2 clocks C:0000f7 0000 nop C:0000f8 ba85 out PORTC,BLK C:0000f9 e067 ldi TL,7 C:0000fa 940e 01b4 call WAIT C:0000fc 0000 nop C:0000fd 0000 nop ; remaining 480-126=354 pixel clocks PWRAINBOW: ; 4 widening white/black stripes C:0000fe bac5 out PORTC,RED ; 7*1 = 7 C:0000ff bae5 out PORTC,YEL C:000100 baa5 out PORTC,GRN C:000101 bab5 out PORTC,CYN C:000102 ba95 out PORTC,BLU C:000103 bad5 out PORTC,MAG C:000104 ba85 out PORTC,BLK C:000105 bac5 out PORTC,RED ; + 7*2 = 21 C:000106 0000 nop C:000107 bae5 out PORTC,YEL C:000108 0000 nop C:000109 baa5 out PORTC,GRN C:00010a 0000 nop C:00010b bab5 out PORTC,CYN C:00010c 0000 nop C:00010d ba95 out PORTC,BLU C:00010e 0000 nop C:00010f bad5 out PORTC,MAG C:000110 0000 nop C:000111 ba85 out PORTC,BLK C:000112 0000 nop C:000113 bac5 out PORTC,RED ; + 7*4 = 49 C:000114 0000 nop C:000115 0000 nop C:000116 0000 nop C:000117 bae5 out PORTC,YEL C:000118 0000 nop C:000119 0000 nop C:00011a 0000 nop C:00011b baa5 out PORTC,GRN C:00011c 0000 nop C:00011d 0000 nop C:00011e 0000 nop C:00011f bab5 out PORTC,CYN C:000120 0000 nop C:000121 0000 nop C:000122 0000 nop C:000123 ba95 out PORTC,BLU C:000124 0000 nop C:000125 0000 nop C:000126 0000 nop C:000127 bad5 out PORTC,MAG C:000128 0000 nop C:000129 0000 nop C:00012a 0000 nop C:00012b ba85 out PORTC,BLK C:00012c 0000 nop C:00012d 0000 nop C:00012e 0000 nop C:00012f bac5 out PORTC,RED ; + 7*8 = 105 C:000130 0000 nop C:000131 0000 nop C:000132 0000 nop C:000133 0000 nop C:000134 0000 nop C:000135 0000 nop C:000136 0000 nop C:000137 bae5 out PORTC,YEL C:000138 0000 nop C:000139 0000 nop C:00013a 0000 nop C:00013b 0000 nop C:00013c 0000 nop C:00013d 0000 nop C:00013e 0000 nop C:00013f baa5 out PORTC,GRN C:000140 0000 nop C:000141 0000 nop C:000142 0000 nop C:000143 0000 nop C:000144 0000 nop C:000145 0000 nop C:000146 0000 nop C:000147 bab5 out PORTC,CYN C:000148 0000 nop C:000149 0000 nop C:00014a 0000 nop C:00014b 0000 nop C:00014c 0000 nop C:00014d 0000 nop C:00014e 0000 nop C:00014f ba95 out PORTC,BLU C:000150 0000 nop C:000151 0000 nop C:000152 0000 nop C:000153 0000 nop C:000154 0000 nop C:000155 0000 nop C:000156 0000 nop C:000157 bad5 out PORTC,MAG C:000158 0000 nop C:000159 0000 nop C:00015a 0000 nop C:00015b 0000 nop C:00015c 0000 nop C:00015d 0000 nop C:00015e 0000 nop C:00015f ba85 out PORTC,BLK C:000160 0000 nop C:000161 0000 nop C:000162 0000 nop C:000163 0000 nop C:000164 0000 nop C:000165 0000 nop C:000166 0000 nop ; remaining 354-105=249 pixel clocks PXSEPAR: ; white/black separator 9 clocks C:000167 baf5 out PORTC,WHT ; 9*1 clocks C:000168 ba85 out PORTC,BLK C:000169 baf5 out PORTC,WHT C:00016a ba85 out PORTC,BLK C:00016b baf5 out PORTC,WHT C:00016c ba85 out PORTC,BLK C:00016d baf5 out PORTC,WHT C:00016e ba85 out PORTC,BLK C:00016f baf5 out PORTC,WHT ; remaining 249-9=240 pixel clocks PXRGB: ; all 8 RGB colours, each 240/8=30 clocks C:000170 ba85 out PORTC,BLK ; 1 clock C:000171 e067 ldi TL,7 ; 1 clock C:000172 940e 01b4 call WAIT ; 4 + (7 * 3 + 3) = 28 clocks C:000174 ba95 out PORTC,BLU C:000175 e067 ldi TL,7 C:000176 940e 01b4 call WAIT C:000178 baa5 out PORTC,GRN C:000179 e067 ldi TL,7 C:00017a 940e 01b4 call WAIT C:00017c bab5 out PORTC,CYN C:00017d e067 ldi TL,7 C:00017e 940e 01b4 call WAIT C:000180 bac5 out PORTC,RED C:000181 e067 ldi TL,7 C:000182 940e 01b4 call WAIT C:000184 bad5 out PORTC,MAG C:000185 e067 ldi TL,7 C:000186 940e 01b4 call WAIT C:000188 bae5 out PORTC,YEL C:000189 e067 ldi TL,7 C:00018a 940e 01b4 call WAIT C:00018c baf5 out PORTC,WHT C:00018d e067 ldi TL,7 C:00018e 940e 01b4 call WAIT ; remaining 240-240=0 pixel clocks, all pixel clocks used up PXEND: C:000190 ba85 out PORTC,BLK ; 1 clock, start the blank before the next pulse ; no waiting, give rest of time to caller C:000191 9508 ret ; 4 clocks ; draw shades line ; start with horizontal retrace pulse, as first deviation from all zero ; end with 1st cycle of blank before next pulse, rest for callers control ; uses 30+60 + 480 + 1 + 4 = 575 clocks (of 600 in line) SHLINE: SHPULSE: ; must be 30 clocks, V = 0, H = 1, color = BLK C:000192 ba55 out PORTC,HOR ; 1 clock C:000193 e067 ldi TL,7 ; 1 clock C:000194 940e 01b4 call WAIT ; 4 + (7 * 3 + 3) = 28 clocks SHBLANK: ; must be 60 clocks, V = 0, H = 0, color = BLK C:000196 ba85 out PORTC,BLK ; 1 clock C:000197 e161 ldi TL,17 ; 1 clock C:000198 940e 01b4 call WAIT ; 4 + (17 * 3 + 3) = 58 clocks SHDRAW: ; must be 480 pixel clocks, V = 0, H = 0, color = pixel SHWB: ; 16 3+3clock wide white/black stripes C:00019a baf5 out PORTC,WHT ; 1 clock C:00019b 0000 nop ; 1 clock C:00019c e06f ldi TL,15 ; 1 clock SHWLOOP: C:00019d ba85 out PORTC,BLK ; 1 clock C:00019e 0000 nop ; 1 clock C:00019f 956a dec TL ; 1 clock, precomputed C:0001a0 baf5 out PORTC,WHT ; 1 clock C:0001a1 f7d9 brne SHWLOOP ; 2 clocks when taken, 1 when not C:0001a2 0000 nop ; 1 clock C:0001a3 ba85 out PORTC,BLK ; 1 clock C:0001a4 e080 ldi AL,0x00 ; 1 clock before out, for RRGGBB, black to white direction C:0001a5 e36f ldi TL,0x3F ; 1 clock before out, pixel count ; remaining 480-96=384 pixel clocks SHRRGGBB: ; all 64 RRGGBB colours, each 384/64=6 clocks SHRLOOP: ; colours 0x00..0x3E C:0001a6 bb85 out PORTC,AL ; 1 clock C:0001a7 9583 inc AL ; 1 clock C:0001a8 0000 nop ; 1 clock C:0001a9 956a dec TL ; 1 clock C:0001aa f7d9 brne SHRLOOP ; 2 clocks when taken, 1 when not C:0001ab 0000 nop ; 1 clock C:0001ac bb85 out PORTC,AL ; 1 clock, (last) colour 0x3F C:0001ad 0000 nop ; 5 clocks C:0001ae 0000 nop C:0001af 0000 nop C:0001b0 0000 nop C:0001b1 0000 nop ; remaining 384-384=0 pixel clocks, all pixel clocks used up SHEND: C:0001b2 ba85 out PORTC,BLK ; 1 clock, start the blank before the next pulse ; no waiting, give rest of time to caller C:0001b3 9508 ret ; 4 clocks ; wait a while doing nothing, spinloop ; uses TL*3-1+4 = TL*3+3 clocks, for TL=[1..255,0] (where 0=256) ; min 1*3-1+4=11 clocks for TL=1, max 256*3-1+4=776 clocks for TL=0 WAIT: WLOOP: C:0001b4 956a dec TL ; 1 clock C:0001b5 f7f1 brne WLOOP ; 2 clocks when taken, 1 when not C:0001b6 9508 ret ; 4 clocks Segment usage: Code : 439 words (878 bytes) Data : 0 bytes EEPROM : 0 bytes Assembly completed with no errors.