{{ Propeller 2_Logic_Analyzer - (800 x 600 VGA video output) Target: Silicon Rev A Version 0.1 By Ozpropdev 13th November 2018 'VGA pin assignments P0 Hsync P1 Blue P2 Green P3 Red P4 Vsync }} con xtal = 12_000_000 mlt = 80 '80 Mhz system clock dv = 12 clk = 1 << 24 | (dv-1) << 18 | (mlt-1) << 8 sys_clk = xtal / dv * mlt sysclk = float(sys_clk) 'Serial comms baudrate = 1_000_000 rx_pin = 63 tx_pin = 62 clocksperbit = float(sys_clk) / float(baudrate) nco = round(clocksperbit * 65536.0) & $FFFFFC00 '================================================ 'buttons P123-A9 pb3 = 57,pb2 = 56,pb1 = 55,pb0 = 54 base_pin = 8 sample_bytes = 2 de2=1,tall=0 _bmask = (sample_bytes << 3) - 1 '================================================ no_encoders = 1 quad1 = 24 '16 'pan control sw1 = 28 '20 quad2 = 26 '18 'zoom control sw2 = 29 '21 db_time = sys_clk / 100 num_modes = 6 'screen metrics w = 800 h = 600 k = (w/8) * (h/16) top = 60 left = 160 '200 trace_width = 800 - left -16 spacing = 48 th = 32 spacing_c = 24 '32 th_c =16 max_zoom = 11 'number of entries in zoom table - 1 'flags #0,rotated,small,f1,compact,lzb,zoom_change,pan_change,grab available 'color palette names #0,black,blue,green,cyan,red,magenta,brown,gray dark_gray,bright_blue,bright_green,bright_cyan bright_red,bright_magenta,Yellow,white 'video constants intensity = 80 '0..128 fclk = sysclk fpix = 50_000_000.0 fset = (fpix / fclk * 2.0) * float($4000_0000) vsync = 4 '==================================================================== DAT org hubset ##clk | %1111_01_00 'enable crystal+PLL, stay in 20MHz+ mode waitx ##20_000_000/100 'wait ~10ms for crystal+PLL to stabilize hubset ##clk | %1111_01_11 'now switch to PLL running at 80MHz loc pa,#@la_main 'launch logic analyzer cog coginit #16,pa loc pa,#@capture_cog 'launch capture cog coginit #16,pa ' ' Setup ' video_main loc ptrb,#\palette 'copy color palette to lut ram setq2 #16-1 rdlong 0,ptrb rdfast ##w*h/128,##@video_buffer 'set rdfast to wrap on bitmap setxfrq ##round(fset) 'set transfer frequency to 25MHz 'the next 4 lines may be commented out to bypass level scaling setcy ##intensity << 24 'r set colorspace for rgb setci ##intensity << 16 'g setcq ##intensity << 08 'b setcmod #%01_0_000_0 'enable colorspace conversion mov x,#de2 wz if_nz jmp #no_atn wait4atn getct x testb x,#24 wc drvc #39 { getrnd wc drvc #io0 getrnd wc drvc #io1 getrnd wc drvc #io2 drvnot #io3 } pollatn wc if_nc jmp #wait4atn ' waitatn 'A9 smart pin hack *** no_atn dirh #vsync 'make vsync pin output wrpin dacmode_s,#0 'enable dac modes in pins 0..3 wrpin dacmode_c,#1 wrpin dacmode_c,#2 wrpin dacmode_c,#3 setnib dira,#$f,#0 mov ijmp1,#field setint1 #10 xcont #511,#0 idle getct oz testb oz,#25 wc testb oz,#24 andc testb oz,#22 andc drvc #47 testbn oz,#25 wc testb oz,#24 andc testb oz,#22 andc drvc #46 jmp #idle oz long 0 ' ' ' Field loop ' field mov x,#37 '15 'top blanks call #blank mov x,##600 'h 'set visible lines line call #hsync 'do horizontal sync xzero m_rf,#0 'visible line resi1 djnz x,#line 'another line? mov x,#23 '14 'bottom blanks call #blank outnot #vsync 'sync on mov x,#6 'sync blanks call #blank outnot #vsync 'sync off jmp #field 'loop ' ' ' Subroutines ' blank call #hsync 'blank lines xcont m_vi,#0 resi1 djnz x,#blank ret hsync xcont m_bs,#0 'horizontal sync resi1 xcont m_sn,#1 resi1 xcont m_bv,#0 resi1 ret ' ' ' Initialized data ' 'dacmode long %0000_0000_000_1010000000000_0_1_00000_0 dacmode_s long %0000_0000_000_1011000000000_01_00000_0 'hsync is 123-ohm, 3.3V dacmode_c long %0000_0000_000_1011100000000_01_00000_0 'R/G/B are 75-ohm, 2.0V m_bs long $CF000000+56 '24 'before sync m_sn long $CF000000+120 '136 'sync 'm_bs long $CF000000+32 'before sync 'm_sn long $CF000000+123 'sync m_bv long $CF000000+64 '160 'before visible m_vi long $CF000000+w 'visible m_rf long $6F000000+w '4bit RFLONG LUT x long 0 'res 1 y long 0 'res 1 '==================================================================== orgh $400 org la_main jmp #la_start { ****************************** * Basic graphics functions * ****************************** } 'Clear screen (fills with current color) cls mov temp,color setnib temp,color,#1 movbyts temp,#0 wrfast #0,##@video_buffer rep @.cls,##w*h/8 wflong temp .cls 'Set pixel @ x1,y1 with current color set_pixel cmp x1,##w-1 wcz 'boundary check if_a ret cmp y1,##h-1 wcz if_a ret testb x1,#31 wc if_c ret testb y1,#31 wc if_c ret mov .t2,y1 ' mul .t2,##w / 2 '2 pixels per byte '######## mul .t2,#w / 2 '2 pixels per byte '######## ' qmul y1,##w / 2 '2 pixels per byte '######## getrnd .temp mov ptra,x1 shr ptra,#1 add ptra,##@video_buffer testb x1,#0 wc ' getqx .temp '##### ' add ptra,.temp '##### add ptra,.t2 '##### rdbyte .temp,ptra if_nc setnib .temp,color,#0 if_c setnib .temp,color,#1 wrbyte .temp,ptra .loop ret wcz .temp long 0 .t2 long 0 'plot line from x1,y1 to x2,y2 in current color plot_line mov x1_bak,x1 mov y1_bak,y1 mov x1,x2 mov y1,y2 call #set_pixel mov y1,y1_bak mov x1,x1_bak mov x_inc,#1 mov y_inc,#1 mov pa,x2 sub pa,x1 wc negc x_inc abs width,pa 'get width mov pb,y2 sub pb,y1 wc negc y_inc abs height,pb 'get height cmp width,height wcz if_b jmp #pl2 'x > y and width,##$ffff wz if_z mov width,#1 qmul height,_1000 mov temp2,#0 mov x1_bak,x1 mov y1_bak,y1 getqx temp qdiv temp,width getqx temp .pl1 ror dashdot,#1 testbn dashdot,#0 wz if_nz call #set_pixel add x1,x_inc add temp2,temp cmp temp2,_1000 wcz if_a add y1,y_inc if_a sub temp2,_1000 djnz width,#.pl1 mov y1,y1_bak mov x1,x1_bak ret wcz 'y > x pl2 and height,##$ffff wz if_z mov height,#1 qmul width,_1000 mov temp2,#0 mov x1_bak,x1 mov y1_bak,y1 getqx temp qdiv temp,height getqx temp .pl2a ror dashdot,#1 testbn dashdot,#0 wz if_nz call #set_pixel add y1,y_inc add temp2,temp cmp temp2,_1000 wcz if_a add x1,x_inc if_a sub temp2,_1000 djnz height,#.pl2a mov y1,y1_bak mov x1,x1_bak ret wcz x1_bak long 0 y1_bak long 0 'plot circle centred at x1,y1 using radius,start_angle,sweep, resolution ' plot_circle qfrac start_angle,#360 getqx angle qfrac resolution,##3600 '10 = 1 deg getqx temp mov cc,sweep mul cc,#10 qdiv cc,resolution getqx cc .loop qrotate radius,angle push x1 push y1 getqx x9 getqy y9 add x1,x9 add y1,y9 call #set_pixel pop y1 pop x1 add angle,temp djnz cc,#.loop ret 'draw box top left corner x1,y1 to bottom right x2,y2 in current color plot_box mov x1a,x1 mov y1a,y1 mov x2a,x2 mov y2a,y2 mov y2,y1 'top call #plot_line mov x1,x1a mov y1,y2a mov x2,x2a mov y2,y2a call #plot_line 'bottom mov x1,x1a mov y1,y1a mov x2,x1 mov y2,y2a call #plot_line 'left mov x1,x2a mov y1,y1a mov x2,x1 mov y2,y2a call #plot_line 'right mov x1,x1a mov y1,y1a mov x2,x2a mov y2,y2a ret 'fill box from top left x1,y1 to bottom right x2,y2 in current color fill_box mov x1a,x1 .loop call #set_pixel add x1,#1 cmp x1,x2 wcz if_a mov x1,x1a if_a add y1,#1 cmp y1,y2 wcz if_a ret jmp #.loop 'plot character @ x1,y1 using forecolor,backcolor 'if bit #0 of "flags" is set , text will be rotated left plot_char testb flags,#small wc if_c mov font_h,#16 if_nc mov font_h,#32 loc ptrb,#@font cmp ascii,#"z" wcz if_a jmp #ucase cmp ascii,#"a" wcz if_ae sub ascii,#32 'make upper case ucase sub ascii,#$20 and ascii,#$3f '''' testbn ascii,#0 wz bitl ascii,#0 shl ascii,#6 add ptrb,ascii mov count2,font_h .loop2 rdlong bits,ptrb++ testb flags,#small wc ' if_c rdlong bits2,ptrb++ ' if_c or bits,bits2 if_c add ptrb,#4 '***** if_nz shr bits,#1 mov count,#16 .loop testb bits,#0 wc if_c mov color,forecolor if_nc mov color,backcolor call #set_pixel shr bits,#2 testb flags,#rotated wc if_nc add x1,#1 if_c sub y1,#1 djnz count,#.loop testb flags,#rotated wc if_nc sub x1,#16 if_nc add y1,#1 if_c add y1,#16 if_c add x1,#1 djnz count2,#.loop2 testb flags,#rotated wc if_nc sub y1,font_h if_nc add x1,#16 if_c sub x1,font_h if_c sub y1,#16 ret wcz font_h long 0 flags long 0 ascii long 0 count2 long 0 forecolor long white backcolor long 0 bits long 0 bits2 long 0 'plot zero terminated string @ptrb to x1,y1 plot_string rdbyte ascii,ptrb wz if_z ret wcz push ptrb call #plot_char pop ptrb add ptrb,#1 jmp #plot_string 'plot value as hex string @ x1,y1 'entry at plot_hex_d assumes digits set by user plot_hex mov digits,#8 plot_hex_d mov temp3,digits subr temp3,#8 shl temp3,#2 rol value,temp3 .loop getnib ascii,value,#7 cmp ascii,#9 wcz if_be add ascii,#"0" if_a add ascii,#"A"-10 call #plot_char rol value,#4 djnz digits,#.loop ret digits long 0 value long 0 'plot signed/unsigned decimal string @ x1,y1 plot_dec_s testb value,#31 wc if_nc mov ascii,#"+" if_c mov ascii,#"-" call #plot_char negc value plot_dec mov r1,##1_000_000_000 mov r3,#0 rep @.sd2,#10 qdiv value,r1 getqx temp getqy value rolnib r4,r3,#7 rolnib r3,temp,#0 qdiv r1,#10 getqx r1 .sd2 mov digits,#2 mov value,r4 call #plot_hex_d mov value,r3 call #plot_hex ret r1 long 0 r2 long 0 r3 long 0 r4 long 0 'Assorted working registers x1a long 0 y1a long 0 x2a long 0 y2a long 0 resolution long 0 start_angle long 0 sweep long 0 x9 long 0 y9 long 0 cc long 0 angle long 0 radius long 0 temp3 long 0 _1000 long 1_000 width long 0 height long 0 x_inc long 0 y_inc long 0 count long 0 temp long 0 temp2 long 0 x1 long 0 y1 long 0 x2 long 0 y2 long 0 color long 0 dashdot long -1 last_quad1 long 0 last_quad2 long 0 offset long 0 pan_adj long 1 st_time long 0 end_time long 0 ch long 0 sel_ch long 0 y1_bak2 long 0 button long 0 old long 0 owner long 0 'qenc long %0000_0001_000_0000000000000_00_10000_0 qenc long %0000_0001_000_0000000000000_00_01011_0 '==================================================================== cls_channel mov cc_x1,x1 mov cc_y1,y1 mov pb,#black setnib pb,pb,#1 movbyts pb,#0 loc pa,#@video_buffer testb flags,#compact wc if_nc sub y1,#th-1 if_c sub y1,#th_c-1 qmul y1,##w/2 shr x1,#1 add pa,x1 getqx y1 add pa,y1 testb flags,#compact wc if_nc mov lx,#th if_c mov lx,#th_c .loop wrfast pb,pa rep @.loop2,#trace_width/8 wflong pb .loop2 add pa,##w/2 '512 djnz lx,#.loop mov y2,cc_y1 mov y1,y2 sub y1,#32 mov color_bak,color call #grid_entry mov color,color_bak mov x1,cc_x1 mov y1,cc_y1 ret color_bak long 0 ctx long 0 lx long 0 cc_x1 long 0 cc_y1 long 0 zoom_value long 0 thx long 0 zmx long 0 dtx long 0 zoom long 1 visible long 0 e_pan long 0 e_zoom long 0 highest long 0 mode long 0 divx long 0 bps long 0 frame long 0 '==================================================================== plot_channel testb flags,#compact wc if_nc mov thx,#th-1 if_c mov thx,#th_c-1 push ptra loc ptrb,#@samples ' mov x1,offset add ptrb,offset 'x1 mov x1,#left mov y1_bak2,y1 call #cls_channel mov dashdot,##-1 mov old,#0 mov count,#0 .loop2 'rdlong dtx,ptrb++ '32 bit sample 'rdword dtx,ptrb++ '16 bit sample 'rdbyte dtx,ptrb++ '8 bit sample bmask temp,#_bmask rdlong dtx,ptrb and dtx,temp add ptrb,#sample_bytes mov zmx,zoom .zx2 mov y1,y1_bak2 mov x2,x1 mov y2,y1 sub y2,thx testb dtx,ch wc testbn old,#0 wz rcl old,#1 if_01 call #set_pixel 'low if_10 sub y1,thx 'high if_10 call #set_pixel 'high if_z_eq_c call #plot_line 'transition add x1,#1 add count,#1 cmp count,##trace_width wcz if_e pop ptra if_e ret djnz zmx,#.zx2 jmp #.loop2 zap loc ptrb,#@samples rep @.loop,##sample_length ' wrlong #0,ptrb++ '32 bit sample ' wrword #0,ptrb++ '16 bit sample wrbyte #0,ptrb++ '8 bit sample .loop ret '********************************************************************* read_encoders mov pa,e_pan sar pa,#2 cmp pa,last_quad1 wcz if_e jmp #re_2 'no change, check zoom mov pb,pa sub pa,last_quad1 mov last_quad1,pb adj_pan call #calc_pan testb pa,#31 wc or offset,#0 wz if_nc_and_z jmp #re_2 mov pa,pan_adj negc pa sub offset,pa fges offset,#0 'mins offset,#0 bith flags,#f1 bith flags,#pan_change ret 'zoom rotary encoder re_2 rdpin e_zoom,#quad2 'get zoom mov pa,e_zoom sar pa,#2 cmp pa,last_quad2 wcz if_e ret 'no change mov pb,pa sub pa,last_quad2 mov last_quad2,pb testb pa,#31 wc or zoom_value,#0 wz if_nc_and_z ret cmp zoom_value,#max_zoom wz if_c_and_z ret sub zoom_value,pa fges zoom_value,#0 'mins zoom_value,#0 fles zoom_value,#max_zoom 'maxs zoom_value,#max_zoom 'adjust offset value to centre plot in new zoom value zoom_adj mov pa,visible shr pa,#1 shl pa,#2 add offset,pa call #calc_zoom call #calc_pan mov pa,visible shr pa,#1 shl pa,#2 sub offset,pa fges offset,#0 'mins offset,#0 bith flags,#f1 bith flags,#zoom_change ret calc_zoom fges zoom_value,#0 'mins zoom_value,#0 fles zoom_value,#max_zoom 'max zoom_value,#max_zoom loc pa,#@zoom_table mov zoom,zoom_value shl zoom,#2 add pa,zoom rdlong zoom,pa ret calc_pan qdiv ##trace_width,zoom getqx visible qdiv visible,#16 '8 getqx pan_adj shl pan_adj,#2 ret '********************************************************************* {{ Format of data sent to PC @ baud rate 64 bytes of palette information (16 colors) 384k bytes of screen pixel data 16 end of image markers ($2A) }} screen_grab loc ptrb,#@grabcon 'start 2nd comm channel wrlong #1,ptrb wrpin #%1_11110_0,#tx_pin wxpin ##nco | 7,#tx_pin dirh #tx_pin loopk loc ptrb,#@palette mov pb,##64+(w/2*h) ' mov pb,##64+16+(w/2*h/2) .loop2 rdbyte pa,ptrb++ .tx_byte rdpin status,#tx_pin wc if_c jmp #.tx_byte wypin pa,#tx_pin djnz pb,#.loop2 mov pb,#16 .tx_byte2 rdpin status,#tx_pin wc if_c jmp #.tx_byte2 wypin #42,#tx_pin djnz pb,#.tx_byte2 ret status long 0 sel_pulse long 0 pulse_count long 0 hi_count long 0 low_count long 0 num_channels long 0 command long 0 rxb long 0 rx_in long 0 rx_out long 0 'activity long 0 rx_isr ' incmod activity,#15 wz ' if_z add activity,#1 ' or dirb,#$ff ' mov outb,activity rdpin rxb,#rx_pin shr rxb,#24 wrlut rxb,rx_in incmod rx_in,#15 reti1 timestamp long 0 tall_traces long 0 '********************************************************************* orgh title byte "P2X8C4M64P-A Logic Analyzer 0.1 - ozpropdev 2018",0 _zoom byte "nS/div Zoom x",0 mode_list long @mode0,@mode1,@mode2,@mode3,@mode4,@mode5,@mode6 mode0 long @m0_pb3,@m0_pb2,@m0_pb1,@m0_pb0 m0_pb3 byte " RUN ",0 m0_pb2 byte " ",0 m0_pb0 byte " MODE ",0 mode1 long @m1_pb3,@m1_pb2,@m1_pb1,@m1_pb0 m1_pb3 byte " RUN ",0 m1_pb2 byte " ZOOM-",0 m1_pb1 byte " ZOOM+",0 m1_pb0 byte " MODE ",0 mode2 long @m2_pb3,@m2_pb2,@m2_pb1,@m2_pb0 m2_pb3 byte " RUN ",0 m2_pb2 byte " PAN0 ",0 m2_pb1 byte " ZOOM0",0 m2_pb0 byte " MODE ",0 mode3 long @m3_pb3,@m3_pb2,@m3_pb1,@m3_pb0 m3_pb3 byte " RUN ",0 m3_pb2 byte " GRAB ",0 m3_pb1 byte " INFO ",0 m3_pb0 byte " MODE ",0 mode4 long @m4_pb3,@m4_pb2,@m4_pb1,@m4_pb0 m4_pb3 byte " N/A ",0 m4_pb2 byte " ",0 m4_pb0 byte " MODE ",0 mode5 long @m5_pb3,@m5_pb2,@m5_pb1,@m5_pb0 m5_pb3 byte " N/A ",0 m5_pb2 byte " CH ^ ",0 m5_pb1 byte " CH v ",0 m5_pb0 byte " MODE ",0 mode6 long @m6_pb3,@m6_pb2,@m6_pb1,@m6_pb0 m6_pb3 byte " N/A ",0 m6_pb2 byte " P - ",0 m6_pb1 byte " P + ",0 m6_pb0 byte " MODE ",0 con { ******************************************************************** Logic Ananlyzer main code ******************************************************************** } _pan_left = "<" << 8 | "p" _pan_right = "p" << 8 | ">" _zoom_m = "z" << 8 | "-" _zoom_p = "z" << 8 | "+" _zoom_r = "z" << 8 | "0" _run = "R" << 8 | "n" _fine_left = "<" << 8 | "f" _fine_right = "f" << 8 | ">" _ch_up = "c" << 8 | "^" _ch_down = "c" << 8 | "v" _info = "i" << 8 | "?" _pulse_prev = "<" << 8 | "P" _pulse_next = "P" << 8 | ">" _pan_r = "p" << 8 | "0" 'Hub exec code dat orgh la_start call #zap call #get_ch_count bith flags,#compact 'set to compact traces mov x1,#no_encoders wz if_nz jmp #no_enc wrpin qenc,#quad1 wxpin #0,#quad1 dirh #quad1 wrpin qenc,#quad2 wxpin #0,#quad2 dirh #quad2 no_enc wrpin #%11111_0,#rx_pin wxpin ##nco | 7,#rx_pin dirh #rx_pin mov ijmp1,#rx_isr setse1 #%01_000000 | rx_pin setint1 #4 'SE1 event restart mov color,#black mov backcolor,#black call #cls mov x1,#0 mov y1,#0 mov x2,##w-1 mov y2,##h-1 mov color,#white ' call #plot_box loc ptrb,#@title mov x1,#0 mov y1,#0 mov forecolor,#bright_green bith flags,#small call #plot_string loc ptrb,#@user_title mov x1,#0 mov y1,#20 '32 mov forecolor,#yellow call #plot_string call #calc_zoom call #calc_pan bith flags,#small ' call #show_buttons call #show_ch_labels call #grid bith flags,#small call #zoom_text refresh bith flags,#small call #show_div call #show_zoom mov dashdot,##-1 bitl flags,#f1 wcz if_c call #analyze_channel if_c call #plot_results bitl flags,#grab wcz if_c call #screen_grab '*** Main program loop *********************************************** main cmp rx_in,rx_out wz if_e jmp #check_enc 'main2 'refresh rdlut pa,rx_out incmod rx_out,#15 bith flags,#grab rolbyte command,pa,#0 getword command,command,#0 cmp command,##_pan_left wz if_e bith flags,#f1 if_e jmp #pb2_0 cmp command,##_pan_right wz if_e bith flags,#f1 if_e jmp #pb1_0 cmp command,##_pan_r wz if_e bith flags,#f1 if_e jmp #pb2_2 cmp command,##_zoom_p wz if_e jmp #pb1_1 cmp command,##_zoom_m wz if_e jmp #pb2_1 cmp command,##_zoom_r wz if_e jmp #pb1_2 cmp command,##_run wz if_e jmp #run cmp command,##_fine_left wz if_e jmp #pb2_4 cmp command,##_fine_right wz if_e jmp #pb1_4 cmp command,##_info wz if_e jmp #pb1_3 cmp command,##_ch_up wz if_e jmp #pb2_5 cmp command,##_ch_down wz if_e jmp #pb1_5 cmp command,##_pulse_prev wz if_e jmp #pb2_6 cmp command,##_pulse_next wz if_e jmp #pb1_6 bitl flags,#grab jmp #main 'zoom.pan rotary encoder check check_enc bitl flags,#zoom_change bitl flags,#pan_change call #read_encoders testb flags,#zoom_change wc if_c jmp #refresh testb flags,#pan_change wc if_c jmp #refresh 'check buttons main2 call #key_scan cmp button,#0 wz if_z jmp #main cmp button,#pb3 wcz 'run if_e mov offset,#0 if_e mov zoom_value,#0 if_e call #zoom_adj if_e jmp #run 'check pushbutton pb2 cmp button,#pb2 wcz if_ne jmp #chk_pb1 jmprel mode jmp #pb2_0 ' if_ne jmp #chk_pb0 jmprel mode jmp #pb1_0 'PAN> jmp #pb1_1 'ZOOM+ jmp #pb1_2 'ZOOM0 jmp #pb1_3 'INFO jmp #pb1_4 'FINE> jmp #pb1_5 'CH v jmp #pb1_6 'P + pb1_0 or offset,offset wz if_z jmp #main call #calc_pan sub offset,pan_adj fges offset,#0 'mins offset,#0 call #plot_results jmp #refresh 'main pb1_1 cmp zoom_value,#max_zoom wz if_z jmp #main add zoom_value,#1 call #zoom_adj jmp #refresh pb1_2 mov zoom_value,#0 call #zoom_adj jmp #refresh pb1_3 mov ch,sel_ch call #analyze_channel jmp #refresh pb1_4 or offset,offset wz if_z jmp #main sub offset,#4 fges offset,#0 'mins offset,#0 call #plot_results testb flags,#grab wc if_c jmp #refresh jmp #main pb1_5 incmod sel_ch,num_channels mov sel_pulse,#0 call #analyze_channel jmp #refresh pb1_6 mov pa,pulse_count wz sub pa,#1 if_nz incmod sel_pulse,pa if_z mov sel_pulse,#0 call #analyze_channel jmp #refresh 'check pushbutton pb0 chk_pb0 cmp button,#pb0 wcz 'mode if_e incmod mode,#num_modes ' if_e call #show_buttons testb flags,#grab wc if_c jmp #refresh 'check encoder pushbuttons cmp button,#sw1 wcz 'pan reset if_e mov offset,#0 if_e call #calc_pan if_e bith flags,#f1 if_e jmp #refresh cmp button,#sw2 wcz 'zoom reset if_e mov zoom_value,#0 if_e call #zoom_adj if_e jmp #refresh jmp #main 'run test code and wait for capture run add frame,#1 call #zap 'clear sample buffer loc pa,#@test_code coginit #16,pa 'launch test code waitx ##20_000_000 'wait for cog to start loc pa,#@capcon .run2 rdlong pb,pa wz 'wait for capture finish if_nz jmp #.run2 bith flags,#grab 'screen grab results bith flags,#f1 'update traces call #analyze_channel jmp #refresh '********************************************************************* key_scan loc ptrb,#@key_list .loop rdbyte button,ptrb++ wz 'get pin number if_z ret testpn button wz if_nz jmp #.loop 'not pressed waitx ##db_time 'debounce .loop2 testpn button wz if_z jmp #.loop2 'wait release waitx ##db_time 'debounce release ret '********************************************************************* plot_results testb flags,#compact wc if_nc mov y1,#top+th if_c mov y1,#top+th_c mov x1,#left mov y1a,y1 loc ptra,#@trace_list .loop mov y1,y1a rdlong ptrb,ptra++ wz if_z jmp #.ch_done rdlong ch,ptra++ sub ch,#base_pin rdlong color,ptra++ call #plot_channel testb flags,#compact wc if_nc add y1a,#spacing if_c add y1a,#spacing_c jmp #.loop .ch_done ret '********************************************************************* key_list byte pb3,pb2,pb1,pb0,sw1,sw2,0 '********************************************************************* show_buttons bith flags,#small mov forecolor,#white mov backcolor,#blue mov x1,#0 mov x1a,x1 mov y1,##570 '700 loc ptra,#@mode_list mov pa,mode shl pa,#2 add ptra,pa rdlong ptra,ptra mov pa,#4 .loop mov x1,x1a rdlong ptrb,ptra++ push ptra call #plot_string pop ptra add x1a,#120 djnz pa,#.loop ret '********************************************************************* show_ch_labels mov forecolor,#black mov y1,#top mov y1a,y1 loc ptra,#@trace_list .loop rdlong ptrb,ptra wz if_z bitl flags,#small if_z ret add ptra,#8 rdlong backcolor,ptra++ mov x1,#0 mov y1,y1a push ptra mov tall_traces,#tall wz bitz flags,#compact testb flags,#compact wc bitc flags,#small call #plot_string pop ptra testb flags,#compact wc if_nc add y1a,#spacing if_c add y1a,#spacing_c jmp #.loop '********************************************************************* grid mov y1,#top mov y2,##top + spacing * 13 grid_entry mov ctx,#11 mov x1,#left mov x2,#left mov color,#gray mov dashdot,##$f0f0f0f0 .loop call #plot_line add x1,#80 add x2,#80 djnz ctx,#.loop ret '********************************************************************* show_div mov x1,##520 mov y1,##570 '700 qdiv ##1000,zoom getqx value mov forecolor,#black mov backcolor,#green call #dec_lzb_4 ret show_zoom mov x1,##650 '810 mov y1,##570 '700 mov value,zoom mov forecolor,#black mov backcolor,#green mov digits,#3 mov divx,#100 call #dec_lzb_x ret zoom_text mov x1,##520 '600 mov y1,##550 '700 mov backcolor,#black mov forecolor,#green loc ptrb,#@_zoom call #plot_string ret '===================================================================== {{ Capture cog Streams INA (32 bits) to hub. }} con sample_length = 8192 / sample_bytes dat orgh org capture_cog loc ptra,#@capcon capture_loop rdlong pa,ptra wz 'wait for start command if_z jmp #capture_loop setxfrq ##$8000_0000 'sysclk sample rate wrfast #0,##@samples mov xcfg2,#sample_bytes encod xcfg2 add xcfg2,#%1101 mov cfg,xcfg setnib cfg,xcfg2,#7 mov xcfg2,#base_pin shr xcfg2,#3 setnib cfg,xcfg2,#5 mov rep_count,##sample_length shr rep_count,#15 wz if_z jmp #single_pass mov cfgm,cfg setword cfgm,##$8000,#0 rep @multi_pass,rep_count xinit cfgm,cfg2 multi_pass single_pass xinit cfg,cfg2 'start capture waitxfi 'wait for completion wrlong #0,ptra 'capture done jmp #capture_loop xcfg long %0000_0000_0001_0000 << 16 | sample_length xcfg2 long 0 cfg long 0 cfg2 long 3 rep_count long 0 cfgm long 0 '===================================================================== orgh dec_lzb_8 mov digits,#8 mov divx,##10000000 jmp #dec_lzb_x dec_lzb_4 mov digits,#4 mov divx,##1000 dec_lzb_x bitl flags,#lzb or value,#0 wz if_nz jmp #.loop sub digits,#1 .loop2 mov ascii,#" " call #plot_char djnz digits,#.loop2 mov ascii,#"0" call #plot_char ret .loop qdiv value,divx qdiv divx,#10 getqx ascii wz getqy value testb flags,#lzb wc add ascii,#"0" if_nc_and_z mov ascii,#" " if_nz bith flags,#lzb getqx divx call #plot_char djnz digits,#.loop ret '******************************************************************* analyze_channel loc ptrb,#@pulse_data 'clear pulse data rep @.clear,#64 wrlong #0,ptrb++ .clear loc ptrb,#@trace_list mov pa,sel_ch mul pa,#12 add ptrb,pa rdlong owner,ptrb rdlong ch,ptrb[1] rdlong forecolor,ptrb[2] mov backcolor,#black mov pulse_count,#0 mov low_count,#0 mov hi_count,#0 loc ptra,#@pulse_data loc ptrb,#@samples add ptrb,offset mov count,#0 .loop 'rdlong pa,ptrb++ '32 bit sample 'rdword pa,ptrb++ '16 bit sample 'rdbyte pa,ptrb++ '8 bit sample bmask temp,_bmask rdlong pa,ptrb and pa,temp add ptrb,#sample_bytes testb pa,ch wc 'current state or count,#0 wz 'pulse already high? if_c_and_z add pulse_count,#1 if_c_and_z bith pb,#0 if_c_and_z add ptra,#12 '4 rcl pb,#1 testbn pb,#1 wz 'last state mov timestamp,offset 'timestamp shr timestamp,#2 add timestamp,count if_11 incmod pulse_count,#127 'rise if_11 wrlong low_count,ptra++ if_11 add ptra,#4 if_11 wrlong timestamp,ptra++ if_11 mov hi_count,#1 if_10 add hi_count,#1 if_01 add low_count,#1 if_00 wrlong hi_count,ptra++ 'fall if_00 mov low_count,#1 add count,zoom cmp count,##trace_width wcz if_b jmp #.loop wrlong low_count,ptra bith flags,#small mov x1,#8 mov y1,##450 '580 mov ptrb,owner call #plot_string mov x1,#0 mov y1,##470 '600 loc ptrb,#@header call #plot_string mov x1,#0 mov y1,##490 '620 add x1,#16 mov value,sel_pulse add value,#1 call #dec_lzb_4 add x1,#16 mov value,pulse_count call #dec_lzb_4 loc ptra,#@pulse_data+8 '4 mov status,sel_pulse shl status,#4 '3 add ptra,status rdlong timestamp,ptra rdlong hi_count,ptra[1] rdlong low_count,ptra[2] add x1,#16 mov value,hi_count call #dec_lzb_4 add x1,#16 mov value,low_count call #dec_lzb_4 add x1,#16 mov value,low_count add value,hi_count call #dec_lzb_4 add x1,#16 qmul hi_count,#100 mov pa,low_count add pa,hi_count getqx count qdiv count,pa getqx value call #dec_lzb_4 add x1,#16 mov value,low_count add value,hi_count qdiv ##sys_clk,value getqx value call #dec_lzb_8 add x1,#16 mov value,timestamp call #dec_lzb_8 '2nd row mov x1,#112 mov y1,##510 '640 qmul hi_count,#125 getqx value call #dec_lzb_8 sub x1,#48 mov y1,##530 '660 qmul low_count,#125 getqx value call #dec_lzb_8 sub x1,#48 mov y1,##510 '640 mov value,hi_count add value,low_count qmul value,#125 getqx value call #dec_lzb_8 mov x1,##648 qmul timestamp,#125 getqx value call #dec_lzb_8 bitl flags,#small ret wcz hex8 push ptra mov count,#8 .loop2 getnib ascii,status,#7 cmp ascii,#9 wcz if_a add ascii,#"A"-10 if_be add ascii,#"0" push count call #plot_char pop count rol status,#4 djnz count,#.loop2 pop ptra ret get_ch_count mov num_channels,#0 loc pa,#@trace_list .loop rdlong pb,pa wz if_z sub num_channels,#1 if_z ret incmod num_channels,#15 wz if_z ret add pa,#4*3 jmp #.loop header byte " P# NUMP HIGH LOW TOT DUTY FREQ T/STAMP",0 pulse_data long 0[2] long 0[128*4] '******************************************************************* view_pulse_data mov y1,#300 mov timestamp,#12 loc ptra,#@pulse_data add ptra,#8 .loop mov x1,#0 rdlong value,ptra++ push ptra call #dec_lzb_8 pop ptra rdlong value,ptra++ push ptra call #dec_lzb_8 pop ptra rdlong value,ptra++ push ptra call #dec_lzb_8 pop ptra rdlong value,ptra++ push ptra call #dec_lzb_8 pop ptra add y1,#20 djnz timestamp,#.loop ret '******************************************************************* orgh s_time long 0 e_time long 0 capcon long 0 capcon1 long 0 grabcon long 0 zval long $1234 qval long 0 zoom_table long 1 long 2 long 3 long 4 long 5 long 6 long 8 long 10 long 12 long 16 long 20 long 24 'max_zoom = 11 {{ ==================================================================== T E S T C O D E Demonstration of pulse,transition,nco and nco duty smartpin modes ==================================================================== }} con 'smartpin modes _pulse = %1_00100_0 _trans = %1_00101_0 _nco = %1_00110_0 _duty = %1_00111_0 _sync_tx = %1_11100_0 _sync_rx = %0_11101_0 'Test I/O definitions #base_pin p8 p9 p10 p11 p12 p13 p14 p15 p16 p17 p18 p19 p20 p21 p22 p23 dat orgh user_title byte "ADC BITSTREAM 1x PINA MODE @80 MHZ ",0 org test_code loc ptrb,#@capcon wrlong #1,ptrb 'start capture waitx #40-2 'wait a bit,padding 'configure adc mode for 15 pins mov pin,#base_pin .loop ' wrpin ##%100000_0000000_00_00000_0,pin 'ADC,GIO 1x,Fast,Fast ' wrpin ##%100011_0000000_00_00000_0,pin 'ADC,PinA 1x,Fast,Fast wrpin ##%100001_0000000_00_00000_0,pin 'ADC,VIO 1x,Fast,Fast incmod pin,#base_pin+15 wz if_nz jmp #.loop waitx ##sys_clk / 5 'wait 1/5 sec cogatn #1 'plot results shutdown mov pin,#base_pin .loop wrpin #0,pin 'ADC,VIO 1x,Fast,Fast incmod pin,#23 wz if_nz jmp #.loop cogid pa cogstop pa pin long 0 '********************************************************************* orgh {{ Format of trace list (3 longs per trace) first long = pointer to zero terminated label string second long = bit number (0-31) P0-P31 third long = trace color (0 - 15) }} trace_list long @_p8,p8,red long @_p9,p9,green long @_p10,p10,blue long @_p11,p11,white long @_p12,p12,yellow long @_p13,p13,magenta long @_p14,p14,cyan long @_p15,p15,brown long @_p16,p16,bright_green long @_p17,p17,bright_red long @_p18,p18,bright_blue long @_p19,p19,bright_magenta long @_p20,p20,gray long @_p21,p21,dark_gray long @_p22,p22,bright_cyan long @_p23,p23,white long 0 'trace list end 'zero terminated label strings (max length 10 characters) _p8 byte "ADC-8 ",0 _p9 byte "ADC-9 ",0 _p10 byte "ADC-10 ",0 _p11 byte "ADC-11 ",0 _p12 byte "ADC-12 ",0 _p13 byte "ADC-13 ",0 _p14 byte "ADC-14 ",0 _p15 byte "ADC-15 ",0 _p16 byte "ADC-16 ",0 _p17 byte "ADC-17 ",0 _p18 byte "ADC-18 ",0 _p19 byte "ADC-19 ",0 _p20 byte "ADC-20 ",0 _p21 byte "ADC-21 ",0 _p22 byte "ADC-22 ",0 _p23 byte "ADC-23 ",0 '==================================================================== 'Color palette and Video buffer orgh '24 but color format = rr_gg_bb_00 palette long $ffffff00 long 0[15] { long 0 'black long $0000aa00 'blue long $00aa0000 'green long $00aaaa00 'cyan long $aa000000 'red long $aa00aa00 'magenta long $aa550000 'brown long $aaaaaa00 'gray long $55555500 'dark gray long $5555ff00 'bright blue long $55ff5500 'bright green long $55ffff00 'bright cyan long $ff555500 'bright red long $ff55ff00 'bright magenta long $ffff5500 'Yellow long $ffffff00 'white } video_buffer byte $aa[w * h / 2] byte 42[16] 'end of buffer markers font file "ozfont.dat" samples