'> const const CON _clkmode = xtal1 + pll16x _xinfreq = 5000000 '--------------------------------------- '> const2 const2 CON _clkmode = xtal2 + pll8x _xinfreq = 10000000 '--------------------------------------- DAT '> genpop genpop popv movs ipopv,sa nop ipopv mov st,stack sub sa,#1 popv_ret ret '--------------------------------------- '> comvar comvar sa long 0 st long 0 arg1 long 0 arg2 long 0 arg3 long 0 gadr long 0 dadr long 0 regstate long 0 regstate1 long 0 regstate2 long 0 time long 0 dtime long 0 zero long 0 allones long $FFFFFFFF stack res 20 '--------------------------------------- '> init init init mov sa,#stack init_ret ret '--------------------------------------- '> stackcheck stackcheck stackcheck mov arg1,sa sub arg1,#stack wc,wz if_b or outa,#128 if_b or dira,#224 sub arg1,#12 nr,wc,wz if_a or outa,#128 if_a or dira,#224 stackcheck_ret ret '--------------------------------------- '> cogin coginit cogin call #popv mov cogreg,st 'par shl cogreg,#14 call #popv or cogreg,st 'startadr shl cogreg,#4 call #popv or cogreg,st 'cogid coginit cogreg,#2 nr cogin_ret ret cogreg long 0 '---------------------------------------- '> setdir setdir setdir call #popv or dira,st setdir_ret ret '--------------------------------------- '> setdirin setdirin setdirin call #popv mov arg1,st xor arg1,allones and dira,arg1 setdirin_ret ret '--------------------------------------- '> cleardir cleardir cleardir mov dira,#0 cleardir_ret ret '--------------------------------------- '> push push push add sa,#1 movd ipush,sa nop ipush mov stack,xpush push_ret ret xpush long 0 '--------------------------------------- '> pushg pushg pushg add sa,#1 mov gadr,par add gadr,dadr rdlong arg1,gadr movd ipushg,sa nop ipushg mov stack,arg1 pushg_ret ret '------------------------------------------ '> atabs atabs atabs call #popv rdlong arg1,st add sa,#1 movd iatabs,sa nop iatabs mov stack,arg1 atabs_ret ret '------------------------------------------- '> popoff popoff popoff sub sa,#1 popoff_ret ret '-------------------------------------------- '> pop pop pop movd ipop,apop movs ipop,sa nop ipop mov apop,stack sub sa,#1 pop_ret ret apop long 0 '---------------------------------------- '> popg popg popg mov gadr,par add gadr,dadr movs ipopg,sa nop ipopg mov arg1,stack wrlong arg1,gadr sub sa,#1 popg_ret ret '------------------------------------------- '> popzc ? popzc call #popv mov regstate,st nr,wz,wc popzc_ret ret '---------------------------------------- '> popzcs ?s popzcs call #popv mov regstate,st wz,wc popzcs_ret ret '---------------------------------------- '> rrestore ?r rrestore mov arg1,regstate nr,wz,wc rrestore_ret ret '---------------------------------------- '> savereg S savereg mov regstate2,regstate1 mov regstate1,regstate savereg_ret ret '------------------------------------------ '> restorereg R restorereg mov regstate,regstate1 mov regstate1,regstate2 restorereg_ret ret '---------------------------------------- '> dup dup dup movs idup,sa add sa,#1 movd idup,sa nop idup mov stack,stack dup_ret ret '------------------------------------------- '> flip \ flip call #popv mov arg1,st call #popv add sa,#1 movd iflip1,sa add sa,#1 movd iflip2,sa iflip1 mov stack,arg1 iflip2 mov stack,st flip_ret ret '------------------------------------------- '> iszero Z iszero call #popv mov st,st nr,wz if_z mov arg1,#1 if_nz mov arg1,#0 add sa,#1 movd iiszero,sa nop iiszero mov stack,arg1 iszero_ret ret '---------------------------------------- '> ispos G ispos call #popv mov st,st nr,wc,wz if_a mov arg1,#1 if_be mov arg1,#0 add sa,#1 movd iispos,sa nop iispos mov stack,arg1 ispos_ret ret '---------------------------------------- '> raise ' raise add sa,#1 raise_ret ret '----------------------------------------- '> pushel pushel pushel call #popv add apush,st add sa,#1 movd ipushel,sa movs ipushel,apush nop ipushel mov stack,apush pushel_ret ret apush long 0 '---------------------------------------- '> pushelg pushelg pushelg call #popv add sa,#1 mov gadr,par add gadr,dadr mov arg2,st shl arg2,#2 add gadr,arg2 rdlong arg1,gadr movd ipushelg,sa nop ipushelg mov stack,arg1 pushelg_ret ret '------------------------------------------ '> element @ element call #popv mov arg1,st 'incr call #popv mov arg2,st 'baseadress add arg2,arg1 add sa,#1 movs ielement,arg2 movd ielement,sa nop ielement mov stack,arg2 element_ret ret '----------------------------------------- '> popel ->@ popel call #popv mov arg1,st 'base adress call #popv mov arg2,st 'incr call #popv mov arg3,st 'value to store add arg1,arg2 movd ipopel,arg1 nop ipopel mov arg2,arg3 popel_ret ret '------------------------------------------ '> popelg popelg popelg call #popv mov gadr,par add gadr,dadr mov arg2,st shl arg2,#2 add gadr,arg2 movs ipopelg,sa nop ipopelg mov arg1,stack wrlong arg1,gadr sub sa,#1 popelg_ret ret '-------------------------------------------- '> wait wait wait call #popv min st,#120 add st,cnt waitcnt st,#0 wait_ret ret '----------------------------------------- '> waituntill waituntill waituntill call #popv waitcnt st,#0 waituntill_ret ret '----------------------------------------- '> now now now add sa,#1 movd inow,sa nop inow mov stack,cnt now_ret ret '----------------------------------------- '> negate neg negate call #popv neg arg1,st add sa,#1 movd ineg,sa nop ineg mov stack,arg1 negate_ret ret '----------------------------------------- '> complement compl complement call #popv mov arg1,st xor arg1,allones add sa,#1 movd icompl,sa nop icompl mov stack,arg1 complement_ret ret '----------------------------------------- '> abso || abso call #popv abs arg1,st add sa,#1 movd labso,sa nop labso mov stack,arg1 abso_ret ret '----------------------------------------- '> plus + plus call #popv mov arg1,st call #popv add arg1,st add sa,#1 movd iplus,sa nop iplus mov stack,arg1 plus_ret ret '----------------------------------------- '> land & land call #popv mov arg1,st call #popv and arg1,st add sa,#1 movd iland,sa nop iland mov stack,arg1 land_ret ret '----------------------------------------- '> lor or lor call #popv mov arg1,st call #popv or arg1,st add sa,#1 movd ior,sa nop ior mov stack,arg1 lor_ret ret '----------------------------------------- '> lxor xor lxor call #popv mov arg1,st call #popv xor arg1,st add sa,#1 movd ilxor,sa nop ilxor mov stack,arg1 lxor_ret ret '----------------------------------------- '> minus - minus call #popv mov arg1,st call #popv sub st,arg1 add sa,#1 movd iminus,sa nop iminus mov stack,st minus_ret ret '------------------------------------------ '> mult * mult call #popv mov arg1,st call #popv mov arg2,st mov nmul,#32 mov arg3,#0 multloop and arg2,#1 nr,wz,wc if_nz add arg3,arg1 shl arg1,#1 shr arg2,#1 djnz nmul,#multloop add sa,#1 movd imult,sa nop imult mov stack,arg3 mult_ret ret nmul long 0 '------------------------------------------ '> div / div call #popv mov den,st call #popv mov rest,st mov q1,#0 mov q2,#0 mov nbp,#0 mov posres,#1 mov sgn,#0 abs rest,rest wc if_b xor sgn,#1 abs den,den wc if_b xor sgn,#1 divnorm sub rest,b32max nr,wz,wc if_ae jmp #divnstop sub den,b32max nr,wz,wc if_ae jmp #divnstop shl rest,#1 shl den,#1 jmp #divnorm divnstop sub den,rest nr,wz,wc if_b shl den,#1 if_b add nbp,#1 if_b jmp #divnstop if_ae shr den,#1 divloop subs nbp,m32 nr,wz,wc if_b jmp #divend mov arg1,posres nr,wz,wc if_z add rest,den if_nz sub rest,den subs rest,#0 nr,wz,wc if_b mov posres,#0 if_b jmp #divpos mov posres,#1 subs nbp,#0 nr,wz,wc if_a mov arg1,nbp if_a sub arg1,#1 if_a mov arg2,#1 if_a shl arg2,arg1 if_a or q1,arg2 if_be mov arg1,nbp if_be adds arg1,#31 if_be mov arg2,#1 if_be shl arg2,arg1 if_be or q2,arg2 divpos shr den,#1 sub nbp,#1 jmp #divloop divend mov sgn,sgn nr,wz if_nz neg q1,q1 if_nz xor q2,allones add sa,#1 movd idiv1,sa nop idiv1 mov stack,q1 add sa,#1 movd idiv2,sa nop idiv2 mov stack,q2 div_ret ret den long 0 rest long 0 q1 long 0 q2 long 0 nbp long 0 b32max long 1073741823 m32 long -32 posres long 0 sgn long 0 '------------------------------------------ '> div10 /10 div10 call #popv mov arg1,st call #mul102 sar arg2,#10 mov y10,arg2 idiv10a call #mul10 mov r10,st sub r10,arg1 sub r10,#10 nr,wc,wz if_b jmp #idiv10b mov arg1,r10 add arg1,#1 call #mul102 sar arg2,#10 add y10,arg2 mov arg2,y10 jmp #idiv10a idiv10b add sa,#1 movd idiv10c,sa nop idiv10c mov stack,r10 add sa,#1 movd idiv10d,sa nop idiv10d mov stack,y10 div10_ret ret mul102 shl arg1,#1 mov arg2,arg1 shl arg1,#1 add arg2,arg1 shl arg1,#3 add arg2,arg1 shl arg1,#1 add arg2,arg1 mul102_ret ret mul10 shl arg2,#1 mov arg1,arg2 shl arg2,#2 add arg1,arg2 mul10_ret ret y10 long 0 r10 long 0 '--------------------------------------------- '> lshift << lshift call #popv mov arg1,st call #popv shl st,arg1 add sa,#1 movd ilshift,sa nop ilshift mov stack,st lshift_ret ret '------------------------------------------ '> nrshift >>n nrshift call #popv mov arg1,st call #popv shr st,arg1 add sa,#1 movd inrshift,sa nop inrshift mov stack,st nrshift_ret ret '------------------------------------------ '> rshift >> rshift call #popv mov arg1,st call #popv sar st,arg1 add sa,#1 movd irshift,sa nop irshift mov stack,st rshift_ret ret '------------------------------------------ '> llshift <<<< llshift call #popv mov arg1,st mov bsteps,#32 sub bsteps,arg1 call #popv mov arg2,st call #popv mov arg3,st shl arg3,arg1 shr arg2,bsteps or arg3,arg2 add sa,#1 movd illshift,sa nop illshift mov stack,arg3 llshift_ret ret bsteps long 0 '------------------------------------------- '> ibit bit ibit call #popv mov arg1,st 'adress call #popv mov arg2,st 'ibit bitloop sub arg2,#32 nr,wc if_ae sub arg2,#32 if_ae add arg1,#1 if_ae jmp #bitloop movs ibit1,arg1 nop ibit1 mov arg3,arg1 shl arg3,arg2 and arg3,msbmask shr arg3,#31 add sa,#1 movd ibit2,sa nop ibit2 mov stack,arg3 ibit_ret ret msbmask long $80000000 '> initnext initnext '-------------------------------------------------- initnext call #popv mov xmax,st initnext_ret ret xmax long 0 ' ix iy /next/ ->ix ->iy '> next next next call #popv mov arg2,st call #popv mov arg1,st add arg1,#1 sub arg1,xmax nr,wz if_z mov arg1,#0 if_z add arg2,#1 add sa,#1 movd inext1,sa add sa,#1 movd inext2,sa inext1 mov stack,arg2 inext2 mov stack,arg1 next_ret ret '-------------------------------------------------- '> sin sin sin call #popv mov arg1,st shr arg1,#18 and arg1,sinmask or arg1,sintable rdword arg2,arg1 add sa,#1 movd isin,sa nop isin mov stack,arg2 sin_ret ret sintable long $E000 sinmask long $1FFF '------------------------------------------------- '> initlogg initlogg initlogg call #popv mov dtlogg,st call #popv mov nlogg,st shl nlogg,#2 call #popv mov alogg,st add alogg,par mov jlogg,#0 initlogg_ret ret '------------------------------------------------- '> logg logg logg call #popv mov ilogg,alogg add ilogg,jlogg wrlong st,ilogg mov dtlogg,dtlogg nr,wz if_nz mov tlogg,cnt if_nz add tlogg,dtlogg if_nz waitcnt tlogg,#0 add jlogg,#4 sub jlogg,nlogg nr,wz logg_ret ret ilogg long 0 jlogg long 0 alogg long 0 nlogg long 0 tlogg long 0 dtlogg long 0 '------------------------------------------------- '> inpin inpin inpin mov arg1,ina call #popv shr arg1,st and arg1,#1 add sa,#1 movd iinpin,sa nop iinpin mov stack,arg1 inpin_ret ret '------------------------------------------ '> inall ina inall add sa,#1 movd inall1,sa nop inall1 mov stack,ina inall_ret ret '------------------------------------------ '> waitfor0 waitfor0 waitfor0 call #popv mov arg1,#1 shl arg1,st waitpeq zero,arg1 waitfor0_ret ret '------------------------------------------- '> waitfor1 waitfor1 waitfor1 call #popv mov arg1,#1 shl arg1,st waitpne zero,arg1 waitfor1_ret ret '------------------------------------------- '> outpins outpins outpins call #popv mov arg1,st 'mask call #popv 'st = value and st,arg1 or outa,st xor arg1,allones or st,arg1 and outa,st outpins_ret ret '------------------------------------------- '> init_analoga init_analoga init_analoga or dira,clk or dira,ncs or dira,din and dira,zdout or outa,ncs init_analoga_ret ret '------------------------------------------- '> analoga analoga analoga call #popv mov ich,st call #convch add sa,#1 movd ianaloga,sa nop ianaloga mov stack,xanal analoga_ret ret '------- A/D conversion from analog channel ich --------- convch nop mov xanal,#0 mov mode,ich shl mode,#4 or mode,#$8F and outa,zncs and outa,zclk mov nin,#8 :inloop nop and mode,#|<7 nr,wz if_z and outa,zdin if_nz or outa,din ' mov ctime,cnt ' add ctime,dtan ' waitcnt ctime,dtan or outa,clk ' waitcnt ctime,dtan and outa,zclk shl mode,#1 djnz nin,#:inloop and outa,zncs or outa,clk mov ctime,cnt add ctime,dtan mov nout,#16 :outloop nop ' waitcnt ctime,dtan and outa,zclk waitcnt ctime,dtan mov aout,ina shr aout,outpin and aout,#1 shl xanal,#1 or xanal,aout or outa,clk djnz nout,#:outloop or outa,ncs waitcnt ctime,dtan convch_ret ret outpin long 21 dout long |<21 zdout long !|<21 din long |<19 zdin long !|<19 ncs long |<18 zncs long !|<18 clk long |<17 zclk long !|<17 ich long 0 aout long 0 xanal long 0 d long 0 ctime long 0 mode long 0 dtan long 50 nin long 0 nout long 0 '-------------------------------------------- '> set_analogosc set_analogosc set_analogosc nop mov outpin,outpino mov dout,douto mov zdout,zdouto mov din,dino mov zdin,zdino mov ncs,ncso mov zncs,zncso mov clk,clko mov zclk,zclko set_analogosc_ret ret outpino long 19 douto long |<19 zdouto long !|<19 dino long |<18 zdino long !|<18 ncso long |<17 zncso long !|<17 clko long |<16 zclko long !|<16 '------------------------------ '> init_analog init_analog init_analog or dira,clk or dira,ncs or dira,din and dira,zdout or outa,ncs init_analog_ret ret '------------------------------------------- '> init_analogp init_analogp init_analogp call #popv mov clk,#1 shl clk,st mov zclk,clk xor zclk,allones call #popv mov dout,#1 shl dout,st mov zdout,dout xor zdout,allones call #popv mov din,#1 shl din,st mov zdin,din xor zdin,allones call #popv mov ncs,#1 shl ncs,st mov zncs,ncs xor zncs,allones or dira,clk or dira,ncs or dira,din and dira,zdout or outa,ncs init_analogp_ret ret '-------------------------------------------- '> analog analog analog call #popv mov ich,st call #convchm add sa,#1 movd ianalog,sa nop ianalog mov stack,xanal analog_ret ret '------- A/D conversion from analog channel ich --------- convchm nop mov xanal,#0 mov mode,ich shl mode,#2 or mode,#$60 and outa,zncs and outa,zclk mov nin,#6 :inloop nop and mode,#|<6 nr,wz if_z and outa,zdin if_nz or outa,din mov ctime,cnt add ctime,dtan waitcnt ctime,dtan or outa,clk waitcnt ctime,dtan and outa,zclk shl mode,#1 djnz nin,#:inloop and outa,zncs or outa,clk mov nout,#12 :outloop nop waitcnt ctime,dtan and outa,zclk waitcnt ctime,dtan mov aout,ina shr aout,outpin and aout,#1 shl xanal,#1 or xanal,aout or outa,clk djnz nout,#:outloop or outa,ncs waitcnt ctime,dtan convchm_ret ret outpin long 1 dout long |<1 zdout long !|<1 din long |<2 zdin long !|<2 ncs long |<3 zncs long !|<3 clk long |<0 zclk long !|<0 ich long 0 aout long 0 xanal long 0 d long 0 ctime long 0 mode long 0 dtan long 50 nin long 0 nout long 0 '-------------------------------------------- '> init_analog2 init_analog2 init_analog2 nop or dira,clk or dira,ncs or dira,din and dira,zdout1 and dira,zdout2 or outa,ncs init_analog2_ret ret '------------------------------------------- '> analog2 analog2 analog2 call #popv mov ich,stack call #convch add sa,#1 movd ianalog2,sa nop ianalog2 mov stack,xanal1 add sa,#1 movd ianalog3,sa nop ianalog3 mov stack,xanal2 analog2_ret ret '------- A/D conversion from analog channels ich --------- '-------------in both A/D converters --------------------- convch nop mov xanal1,#0 mov xanal2,#0 mov mode,ich shl mode,#4 or mode,#$8F and outa,zncs and outa,zclk mov nin,#8 :inloop nop and mode,#|<7 nr,wz if_z and outa,zdin if_nz or outa,din mov ctime,cnt add ctime,dtan waitcnt ctime,dtan or outa,clk waitcnt ctime,dtan and outa,zclk shl mode,#1 djnz nin,#:inloop and outa,zncs or outa,clk mov nout,#16 :outloop nop waitcnt ctime,dtan and outa,zclk waitcnt ctime,dtan mov aout,ina shr aout,do1pin and aout,#1 shl xanal1,#1 or xanal1,aout mov aout,ina shr aout,do2pin and aout,#1 shl xanal2,#1 or xanal2,aout or outa,clk djnz nout,#:outloop or outa,ncs waitcnt ctime,dtan convch_ret ret do1pin long 19 do2pin long 20 zdout1 long !|<19 zdout2 long !|<20 din long |<18 zdin long !|<18 ncs long |<17 zncs long !|<17 clk long |<16 zclk long !|<16 ich long 0 aout long 0 xanal1 long 0 xanal2 long 0 d long 0 ctime long 0 mode long 0 dtan long 800 nin long 0 nout long 0 '-------------------------------------------- '> send send send call #popv mov sendpulse,st call #popv mov sendpin,st call #popv mov xsend,st mov sendmask,#1 shl sendmask,sendpin mov sendzmask,sendmask xor sendzmask,allones and xsend,#255 shl xsend,#1 or xsend,startbit mov nsend,#10 mov sendtime,cnt add sendtime,sendpulse sendloop and xsend,#1 nr,wz if_z and outa,sendzmask if_nz or outa,sendmask waitcnt sendtime,sendpulse shr xsend,#1 djnz nsend,#sendloop add sendtime,sendspace waitcnt sendtime,#0 send_ret ret sendpulse long 0 sendspace long 330 sendpin long 0 sendmask long 0 sendzmask long 0 sendtime long 0 nsend long 0 xsend long 0 startbit long 512 '------------------------------------------ '> baud baud baud call #popv mov xbaud,st sub xbaud,c9600 nr,wz if_z mov ybaud,baud96 sub xbaud,c19200 nr,wz if_z mov ybaud,baud192 sub xbaud,c38400 nr,wz if_z mov ybaud,baud384 sub xbaud,c115200 nr,wz if_z mov ybaud,baud1152 add sa,#1 movd ibaud2,sa nop ibaud2 mov stack,ybaud baud_ret ret xbaud long 0 ybaud long 0 c9600 long 9600 c19200 long 19200 c38400 long 38400 c115200 long 115200 baud96 long 80_000_000/9600 baud192 long 80_000_000/19200 baud384 long 80_000_000/38300 baud1152 long 80_000_000/115200 '---------------------------------------------------- '> receive receive receive call #popv mov recpulse,st call #popv mov recpin,st mov recmask,#1 shl recmask,recpin mov recdata,#0 recwait0 mov pins,ina and pins,recmask wz if_z jmp #recwait0 recwait1 mov pins,ina and pins,recmask wz if_nz jmp #recwait1 mov recn,#9 mov recdt,recpulse sar recdt,#1 mov rectime,cnt add rectime,recdt recloop waitcnt rectime,recpulse mov pins,ina and pins,recmask shr pins,recpin shl pins,#7 shr recdata,#1 or recdata,pins djnz recn,#recloop add sa,#1 movd irec,sa nop irec mov stack,recdata receive_ret ret pins long 0 recpulse long 0 recpin long 0 recmask long 0 recdata long 0 recdt long 0 rectime long 0 recn long 0 '-------------------------------------------- '> send32 send32 send32 call #popv mov sendpin32,st call #popv mov xsend32,st mov sendmask32,#1 shl sendmask32,sendpin32 mov sendzmask32,sendmask32 xor sendzmask32,allones mov nsend32,#32 mov sendtime32,cnt add sendtime32,sendpulse32 and outa,sendzmask32 waitcnt sendtime32,sendpulse32 send32loop and xsend32,#1 nr,wz if_z and outa,sendzmask32 if_nz or outa,sendmask32 waitcnt sendtime32,sendpulse32 shr xsend32,#1 djnz nsend32,#send32loop or outa,sendmask32 add sendtime32,sendspace32 waitcnt sendtime32,#0 send32_ret ret sendpulse32 long 80 sendspace32 long 300 sendpin32 long 0 sendmask32 long 0 sendzmask32 long 0 sendtime32 long 0 nsend32 long 0 xsend32 long 0 '------------------------------------------ '> receive32 receive32 receive32 call #popv mov recpin32,st mov recmask32,#1 shl recmask32,recpin32 mov recdata32,#0 recwait032 mov pins32,ina and pins32,recmask32 wz if_z jmp #recwait032 recwait132 mov pins32,ina and pins32,recmask32 wz if_nz jmp #recwait132 mov recn32,#33 mov recdt32,recpulse32 sar recdt32,#1 mov rectime32,cnt add rectime32,recdt32 recloop32 waitcnt rectime32,recpulse32 mov pins32,ina and pins32,recmask32 shr pins32,recpin32 shl pins32,#31 shr recdata32,#1 or recdata32,pins32 djnz recn32,#recloop32 add sa,#1 movd irec32,sa nop irec32 mov stack,recdata32 receive32_ret ret pins32 long 0 recpulse32 long 80 recpin32 long 0 recmask32 long 0 recdata32 long 0 recdt32 long 0 rectime32 long 0 recn32 long 0 '-------------------------------------------- '> spiinit spiinit spiinit call #popv mov spicmask,#1 shl spicmask,st mov zspicmask,spicmask xor zspicmask,allones call #popv mov spidmask,#1 shl spidmask,st mov zspidmask,spidmask xor zspidmask,allones spiinit_ret ret '--------------------------------------------- '> spisend spisend spisend call #popv mov arg1,st mov nspi,#9 ispis and outa,zspicmask and arg1,#128 nr,wz if_z and outa,zspidmask if_nz or outa,spidmask ' call #spiwait or outa,spicmask shl arg1,#1 ' call #spiwait djnz nspi,#ispis spisend_ret ret spiwait mov tspi,cnt add tspi,dtspi waitcnt tspi,#0 spiwait_ret ret spicmask long 0 zspicmask long 0 spidmask long 0 zspidmask long 0 nspi long 0 tspi long 0 dtspi long 200 '------------------------------------------ '> iicinit iicinit iicinit call #popv mov clkmask,#1 shl clkmask,st mov zclkmask,clkmask xor zclkmask,allones call #popv mov sdamask,#1 shl sdamask,st mov zsdamask,sdamask xor zsdamask,allones and outa,zclkmask ' Z or dira,clkmask ' 0 and outa,zsdamask '0 and dira,zsdamask 'Z iicinit_ret ret iicwait mov tiic,cnt add tiic,dtiic waitcnt tiic,#0 iicwait_ret ret iicwaitl mov tiic,cnt add tiic,dtiicl waitcnt tiic,#0 iicwaitl_ret ret clkmask long 0 zclkmask long 0 sdamask long 0 zsdamask long 0 tiic long 0 dtiic long 400 dtiicl long 4000 '-------------------------------------- '> iicstart iicstart iicstart or outa,clkmask ' 1 call #iicwait or dira,sdamask '0 call #iicwait and outa,zclkmask ' 0 and dira,zsdamask 'Z iicstart_ret ret '-------------------------------------- '> iicstop iicstop iicstop or dira,sdamask '0 or outa,clkmask ' 1 call #iicwait and dira,zsdamask 'Z call #iicwait and outa,zclkmask ' 0 iicstop_ret ret '-------------------------------------- '> iicack iicack iicack or dira,sdamask '0 call #iicwait or outa,clkmask ' 1 call #iicwait and outa,zclkmask ' 0 and dira,zsdamask 'Z iicack_ret ret '-------------------------------------- '> iicnoack iicnoack iicnoack call #iicwait or outa,clkmask ' 1 call #iicwait and outa,zclkmask ' 0 iicnoack_ret ret '-------------------------------------- '> iicwack iicwack iicwack call #iicwait or outa,clkmask ' 1 call #iicwait and outa,zclkmask ' 0 iicwack_ret ret '-------------------------------------- '> iicwrite iicwrite iicwrite call #popv mov arg1,st mov arg2,#8 iicwrite1 and arg1,#128 nr,wz if_z or dira,sdamask '0 if_nz and dira,zsdamask 'Z call #iicwait or outa,clkmask ' 1 call #iicwait and outa,zclkmask ' 0 shl arg1,#1 djnz arg2,#iicwrite1 and dira,zsdamask 'Z iicwrite_ret ret '--------------------------------------------- '> iicread iicread iicread mov arg1,#0 mov arg2,#8 iicread1 or outa,clkmask ' 1 call #iicwait mov arg3,ina and arg3,sdamask nr,wz,wz shl arg1,#1 if_nz or arg1,#1 and outa,zclkmask ' 0 call #iicwait djnz arg2,#iicread1 add sa,#1 movd iicread2,sa nop iicread2 mov stack,arg1 iicread_ret ret '---------------------------------------------- '> motorinit motorinit motorinit call #popv mov mdatamask,#1 shl mdatamask,st mov mzdatamask,mdatamask xor mzdatamask,allones call #popv mov msynkmask,#1 shl msynkmask,st mov mzsynkmask,msynkmask xor mzsynkmask,allones motorinit_ret ret '--------------------------------------------- '> motorsend motorsend motorsend call #popv mov arg1,st mov arg2,#9 motorsend1 and outa,mzsynkmask and arg1,#1 nr,wz if_z and outa,mzdatamask if_nz or outa,mdatamask shr arg1,#1 or outa,msynkmask djnz arg2,#motorsend1 motorsend_ret ret mdatamask long 0 mzdatamask long 0 msynkmask long 0 mzsynkmask long 0 '---------------------------------------------- '> kbrec kbrec kbrec nop call #reckb add sa,#1 movd ikbr1,sa nop ikbr1 mov stack,arg3 kbrec_ret ret reckb mov arg3,#0 waitpeq zero,datamask mov nsynk,#11 ikbr3 waitpne zero,synkmask waitpeq zero,synkmask mov ppins,ina shr ppins,datapin and ppins,#1 shl ppins,#10 or arg3,ppins shr arg3,#1 djnz nsynk,#ikbr3 and arg3,#$FF reckb_ret ret ppins long 0 nsynk long 0 synkmask long |<11 datamask long |<10 datapin long 10 '---------------------------------------------- '> kbsend kbsend kbsend call #popv mov arg1,st call #sendkb kbsend_ret ret sendkb or dira,synkmaskt and outa,zsynkmaskt mov kbtime,cnt add kbtime,c120us waitcnt kbtime,#0 or dira,datamaskt and outa,zdatamaskt and dira,zsynkmaskt ' or outa,synkmaskt waitpeq zero,synkmaskt waitpne zero,synkmaskt mov nxmit,#10 isendkb1 nop and arg1,#1 nr,wz if_z and outa,zdatamaskt if_nz or outa,datamaskt shr arg1,#1 waitpeq zero,synkmaskt waitpne zero,synkmaskt djnz nxmit,#isendkb1 and dira,zdatamaskt waitpeq zero,datamaskt waitpne zero,datamaskt sendkb_ret ret nxmit long 0 synkmaskt long |<11 zsynkmaskt long !|<11 datamaskt long |<10 zdatamaskt long !|<10 c120us long 9600 kbtime long 0 '------------------------------------------------- '> cmpout cmpout cmpout call #popv mov ncmp,st call #popv mov arg1,st cmpoloop mov tcmp,cnt add tcmp,dtcmp or outa,cmpsmask and arg1,#1 nr,wz if_z and outa,zcmpomask if_nz or outa,cmpomask shr arg1,#1 waitcnt tcmp,dtcmp and outa,zcmpsmask waitcnt tcmp,dtcmp djnz ncmp,#cmploop cmpout_ret ret '----------------------------------------------- '> cmpin cmpin cmpin call #popv mov ncmp,st mov arg1,#0 cmpiloop mov tcmp,cnt add tcmp,dtcmp or outa,cmpsmask waitcnt tcmp,dtcmp and outa,zcmpsmask mov arg2,ina shr arg2,cmpdipin and arg2,#1 or arg1,arg2 shl arg1,#1 djnz ncmp,#cmpiloop add sa,#1 movd icmpi,sa nop icmpi mov stack,arg1 cmpin_ret ret ncmp long 0 tcmp long 0 dtcmp long 80 cmpsmask long |<5 zcmpsmask long !|<5 cmpdipin long 4 cmpomask long |<3 zcmpomask long !|<3 '------------------------------------------------- '> fifoinit fifoinit fifoinit call #popv mov dtime,st or dira,fifomask or outa,initrdmask fifoinit_ret ret fifomask long $000009FF initrdmask long $00000800 '----------------------------------------------- '> fifolog fifolog fifolog sub sa,#1 mov arg2,par add arg2,dadr mov isamp,nsamp mov time,cnt add time,dtime fifoloop mov arg1,ina nop shr arg1,#20 rdlong arg3,arg2 and arg3,#1 or arg1,arg3 and arg1,dmask or outa,wrmask and outa,ndmask or outa,arg1 and outa,nwrmask waitcnt time,dtime djnz isamp,#fifoloop fifolog_ret ret isamp long 0 nsamp long 50000 dmask long $000000FF ndmask long $FFFFFF00 wrmask long $00000100 nwrmask long $FFFFFEFF rdmask long $00000800 '----------------------------------------------- '> fifoalog fifoalog fifoalog sub sa,#1 mov arg2,par add arg2,dadr mov isampa,nsampa mov time,cnt add time,dtime fifoaloop rdlong arg1,arg2 mov arg3,arg1 and arg1,dmaska or outa,wrmaska and outa,ndmaska or outa,arg1 and outa,nwrmaska waitcnt time,dtime mov arg1,arg3 shr arg1,#8 and arg1,dmaska or outa,wrmaska and outa,ndmaska or outa,arg1 and outa,nwrmaska waitcnt time,dtime djnz isampa,#fifoaloop fifoalog_ret ret isampa long 0 nsampa long 60000 dmaska long $000000FF ndmaska long $FFFFFF00 wrmaska long $00000100 nwrmaska long $FFFFFEFF rdmaska long $00000800 '----------------------------------------------- '> thruinit thruinit thruinit call #popv mov arg1,st call #popv mov arg2,st mov inmask,#1 shl inmask,arg2 mov thrumask,#1 shl thrumask,arg1 mov zthrumask,thrumask xor zthrumask,allones or dira,thrumask thruinit_ret ret inmask long 0 thrumask long 0 zthrumask long 0 '------------------------------------ '> thru thru thru and ina,inmask nr,wz if_nz or outa,thrumask if_z and outa,zthrumask jmp #thru thru_ret ret '------------------------------------- '> nil nil