'***************** '* HDMI Spiral * '***************** CON hdmi_base = 48 'must be a multiple of 8 _clkfreq = 330_000_000 'system clock frequency must be 250 MHz for HDMI fast = 1 '0 for small code (7.8 fps), 1 for fast code (36.6 fps) bitmap = $400 'HDMI bitmap (300 KB) DAT org asmclk coginit #1,##@pgm_hdmi 'launch HDMI coginit #0,##@pgm_bmap 'launch bitmap cog '********************************* '* HDMI 800 x 480 x 8bpp rgbi8 * '********************************* DAT org pgm_hdmi setcmod #$100 'enable HDMI mode drvl #7<<6 + hdmi_base 'enable HDMI pins wrpin ##%001001<<8,#7<<6 + hdmi_base 'set 1k-ohm drive on HDMI pins setxfrq ##$0CCCCCCC+1 'set streamer freq to 1/10th clk (25 MHz) rdfast ##800*480/64,##bitmap 'set rdfast to wrap on bitmap ' Field loop field mov hsync0,sync_000 'vsync off mov hsync1,sync_001 callpa #10,#blank 'top blanks mov i,#480 'set visible lines line call #hsync 'do horizontal sync xcont m_rf,#0 'do visible line djnz i,#line 'another line? callpa #33,#blank 'bottom blanks mov hsync0,sync_222 'vsync on mov hsync1,sync_223 callpa #2,#blank 'vertical sync blanks jmp #field 'loop ' Subroutines blank call #hsync 'blank lines xcont m_vi,hsync0 _ret_ djnz pa,#blank hsync xcont m_bs,hsync0 'horizontal sync xzero m_sn,hsync1 _ret_ xcont m_bv,hsync0 ' Data sync_000 long %1101010100_1101010100_1101010100_10 ' sync_001 long %1101010100_1101010100_0010101011_10 ' hsync sync_222 long %0101010100_0101010100_0101010100_10 'vsync sync_223 long %0101010100_0101010100_1010101011_10 'vsync + hsync m_bs long $70810000 + hdmi_base<<17 + 16 'before sync m_sn long $70810000 + hdmi_base<<17 + 96 'sync m_bv long $70810000 + hdmi_base<<17 + 48 'before visible m_vi long $70810000 + hdmi_base<<17 + 800 'visible m_rf long $B0830000 + hdmi_base<<17 + 800 'visible rfbyte rgbi8 i res 1 hsync0 res 1 hsync1 res 1 '************************************** '* Make spirals in 800 x 480 bitmap * '************************************** org pgm_bmap wrfast ##800*480/64,##bitmap 'set wrfast to wrap on bitmap modc fast * %1111 wc 'fast or slow code? if_nc jmp #.pixel ' Fast code (36.6 fps) 4.7x the speed of slow code .lut mov .px,.z 'make lookup table for fast translation test .px,#$20 wc 'convert 6 LSBs to 5-bit up/down ramp if_c xor .px,#$3F and .px,#$1F mov .py,.z shr .py,#1 'apply 3 MSBs to RGB bits and .py,#$E0 or .px,.py wrlut .px,.z incmod .z,#$1FF wc if_nc jmp #.lut .pixels qvector .x,.y '0 in do overlapped QVECTOR ops for 16 pixels add .x,#1 '1 in qvector .x,.y add .x,#1 '2 in qvector .x,.y add .x,#1 '3 in qvector .x,.y add .x,#1 '4 in qvector .x,.y add .x,#1 '5 in qvector .x,.y add .x,#1 '6 in qvector .x,.y add .x,#1 '7 in qvector .x,.y getqx .px+0 '0 out getqy .py+0 add .x,#1 '8 in qvector .x,.y getqx .px+1 '1 out getqy .py+1 add .x,#1 '9 in qvector .x,.y getqx .px+2 '2 out getqy .py+2 add .x,#1 '10 in qvector .x,.y getqx .px+3 '3 out getqy .py+3 add .x,#1 '11 in qvector .x,.y getqx .px+4 '4 out getqy .py+4 add .x,#1 '12 in qvector .x,.y getqx .px+5 '5 out getqy .py+5 add .x,#1 '13 in qvector .x,.y getqx .px+6 '6 out getqy .py+6 add .x,#1 '14 in qvector .x,.y getqx .px+7 '7 out getqy .py+7 add .x,#1 '15 in qvector .x,.y getqx .px+8 '8 out getqy .py+8 shr .py+0,#32-9 'get 9 MSBs of theta (stuff code between GETQx ops) add .py+0,.px+0 'add rho to twist it getqx .px+9 '9 out getqy .py+9 shr .py+1,#32-9 add .py+1,.px+1 getqx .px+10 '10 out getqy .py+10 shr .py+2,#32-9 add .py+2,.px+2 getqx .px+11 '11 out getqy .py+11 shr .py+3,#32-9 add .py+3,.px+3 getqx .px+12 '12 out getqy .py+12 shr .py+4,#32-9 add .py+4,.px+4 getqx .px+13 '13 out getqy .py+13 shr .py+5,#32-9 add .py+5,.px+5 getqx .px+14 '14 out getqy .py+14 shr .py+6,#32-9 add .py+6,.px+6 getqx .px+15 '15 out getqy .py+15 add .py+0,.z 'add z to slowly spin it rdlut .py+0,.py+0 'lookup rgbi8 color wfbyte .py+0 'write rgbi8 pixel to bitmap add .py+1,.z rdlut .py+1,.py+1 wfbyte .py+1 add .py+2,.z rdlut .py+2,.py+2 wfbyte .py+2 add .py+3,.z rdlut .py+3,.py+3 wfbyte .py+3 add .py+4,.z rdlut .py+4,.py+4 wfbyte .py+4 add .py+5,.z rdlut .py+5,.py+5 wfbyte .py+5 add .py+6,.z rdlut .py+6,.py+6 wfbyte .py+6 shr .py+7,#32-9 add .py+7,.px+7 add .py+7,.z rdlut .py+7,.py+7 wfbyte .py+7 shr .py+8,#32-9 add .py+8,.px+8 add .py+8,.z rdlut .py+8,.py+8 wfbyte .py+8 shr .py+9,#32-9 add .py+9,.px+9 add .py+9,.z rdlut .py+9,.py+9 wfbyte .py+9 shr .py+10,#32-9 add .py+10,.px+10 add .py+10,.z rdlut .py+10,.py+10 wfbyte .py+10 shr .py+11,#32-9 add .py+11,.px+11 add .py+11,.z rdlut .py+11,.py+11 wfbyte .py+11 shr .py+12,#32-9 add .py+12,.px+12 add .py+12,.z rdlut .py+12,.py+12 wfbyte .py+12 shr .py+13,#32-9 add .py+13,.px+13 add .py+13,.z rdlut .py+13,.py+13 wfbyte .py+13 shr .py+14,#32-9 add .py+14,.px+14 add .py+14,.z rdlut .py+14,.py+14 wfbyte .py+14 shr .py+15,#32-9 add .py+15,.px+15 add .py+15,.z rdlut .py+15,.py+15 wfbyte .py+15 incmod .x,#800/2-1 wc 'check if x at limit if_c neg .x,#800/2 if_c incmod .y,#480/2-1 wc 'step y if_c neg .y,#480/2 if_c sub .z,#1 'step z if_c drvnot #56 'toggle P56 for speed check jmp #.pixels ' Slow code (7.8 fps) .pixel qvector .x,.y 'convert (x,y) to polar (rho,theta) getqx .px getqy .py shr .py,#32-9 'get 9 MSBs of theta add .py,.px 'add rho to twist it add .py,.z 'add z to slowly spin it mov .px,.py 'convert 6 LSBs to 5-bit up/down ramp test .px,#$20 wc if_c xor .px,#$3F and .px,#$1F shr .py,#1 'apply 3 MSBs to RGB bits and .py,#$E0 or .px,.py wfbyte .px 'write rgbi8 pixel to bitmap incmod .x,#800/2-1 wc 'step x if_c neg .x,#800/2 if_c incmod .y,#480/2-1 wc 'step y if_c neg .y,#480/2 if_c sub .z,#1 'step z if_c drvnot #56 'toggle P56 for speed check jmp #.pixel ' Data .x long -800/2 .y long -480/2 .z long 0 .px res 16 .py res 16