Re-writing code using counters
Hey guys, I've been trying to re-write some code using the counters to control clock lines. I have been able to 2 out of 3 portions re-written but having trouble with the last one. The original code is as follows:
For reference I'm posting the code I have been able to translate.
pasmhubtoram call #get_values ' get hubaddr,ramaddr,len and set control pins
call #set161
or outa,maskP16P20 ' set control pins high
mov latchvalue,#%11111101 ' group 2, displays all off
call #set373 ' send out to the latch
hubtoram_loop and outa,maskP16P31 '%11111111_11111111_00000000_00000000 clear for output
rdword data_16,hubaddr ' get the word from hub
or outa,data_16 ' send out the byte to P0-P15
andn outa,maskP17 ' set mem write low
add hubaddr,#2 ' increment by 2 bytes = 1 word. Put this here for small delay while writes
or outa,maskP17 ' mem write high
andn outa,maskP20 ' clock 161 low
or outa,maskP20 ' clock 161 high
djnz len,#hubtoram_loop ' loop this many times
or outa,maskP20 ' stop clock
jmp #done ' tristate pins and listen for commands
This transfers data from hub to external sram. It works but the main loop takes 3 hub slots and I suspect using the counters is the key to get it down to 2. Here's my last effort:
'-----------------------------------------------------------------
' setups needed for burst write Thanks to Jazzed (Steve Denson)
'-----------------------------------------------------------------
wr_phsa long $0800_0000 ' phsa offset for adjusting clock start
wr_frqa long $0800_0000
wr_ctra long 4<<26 | 20 ' NCO mode on P20
fastpasmhubtoram call #get_values ' get hubaddr,ramaddr,len and set control pins
sub len, #1
sub ramaddr,#1
call #set161
or outa,maskP16P20 ' set control pins high
mov latchvalue,#%11111101 ' group 2, displays all off
call #set373 ' send out to the latch
'insert burst read here
or outa,maskP20 ' get clock line?
mov phsa, wr_phsa ' init counters phsa
mov frqa, wr_frqa ' setup NCO freq
andn outa,maskP20 ' start counters
rdword data_16,hubaddr ' sync up only
mov ctra, wr_ctra ' enable address counter clk
fasthubtoram_loop and outa,maskP16P31 '%11111111_11111111_00000000_00000000 clear for output A0 A8 B0 B8
rdword data_16,hubaddr ' get the word from hub C0 C8 D0 D8 E0 E8 F0 F8
or outa,data_16 ' send out the byte to P0-P15 00 08 10 18
andn outa,maskP17 ' set mem write low 20 28 30 38
add hubaddr,#2 ' increment by 2 bytes = 1 word. Put this here for small delay while writes 40 48 50 58
or outa,maskP17 ' mem write high 60 68 70 78
djnz len,#fasthubtoram_loop ' loop this many times 80 88 90 98
' A0 A8 B0 B8
or outa,maskP20 ' stop clock
'
mov ctra, #0 ' stop counter
jmp #done ' tristate pins and listen for commands
For reference I'm posting the code I have been able to translate.
pasmramtohub call #get_values ' get hubaddr,ramaddr,len and set control pins
call #set161
or outa,maskP16P20 ' set control pins high
mov latchvalue,#%11111101 ' group 2, displays all off
call #set373 ' send out to the latch
and dira,maskP16P31 '%11111111_11111111_00000000_00000000 inputs
andn outa,maskP16 ' memory /rd low
ramtohub_loop mov data_16,ina ' get the data
wrword data_16,hubaddr ' move data to hub
andn outa,maskP20 ' clock 161 low
or outa,maskP20 ' clock 161 high
add hubaddr,#2 ' increment the hub address
djnz len,#ramtohub_loop
or outa,maskP16 ' memory /rd high
jmp #done ' ' tristate pins and listen for commands
Becomes
'-----------------------------------------------------------------------
' setups needed for burst read from ram Thanks to Jazzed (Steve Denson)
'-----------------------------------------------------------------------
rd_frqa long $1000_0000
rd_ctra long 4<<26 | 20 ' NCO mode on P20
rd_ctrb long $A<<26| 20 ' Edge Accumulate mode on P20
fastpasmramtohub call #get_values ' get hubaddr,ramaddr,len and set control pins
call #set161
or outa,maskP16P20 ' set control pins high
mov latchvalue,#%11111101 ' group 2, displays all off
call #set373 ' send out to the latch
and dira,maskP16P31 ' %11111111_11111111_00000000_00000000 inputs
andn outa,maskP16 ' memory /rd low
mov phsa, #0 ' init counters phsa
mov frqa, rd_frqa ' setup NCO freq
mov phsb, hubaddr ' save hub ptr to phsb
mov frqb, #2 ' setup EDGE freq
'ctra setup for burst read
or outa,maskP20 ' get clock line?
andn outa,maskP20 ' start counters
mov ctrb, rd_ctrb ' set ctr be mode
rdword data_16,phsb ' sync up only
mov ctra, rd_ctra ' enable address counter clk
fastramtohub_loop ' 10MB/s read loop uses phsb for hub pointer
mov data_16,ina ' get first data 1 2 3 4
wrword data_16,phsb ' move data to hub 5 6 7 8 9 A B C
djnz len,#fastramtohub_loop ' D E F 0
or outa,maskP20 ' stop clock
mov ctra, #0 ' stop counter
mov ctrb, #0 ' stop counter
or outa,maskP16 ' memory /rd high
jmp #done
And
pasmramtodisplay call #get_values ' get hubaddr,ramaddr,len (only uses len) and set control pins
call #set161
or outa,maskP16P20 ' set control pins high
mov latchvalue, dirb
call #set373
andn outa,maskP19 ' CS low
and dira,maskP16P31 ' %11111111_11111111_00000000_00000000 so prop pins 0-15 HiZ
andn outa,maskP16 ' ram /rd low
ramtodisplay_loop andn outa,maskP18 ' ILI write low
or outa,maskP18 ' ILI write high
andn outa,maskP20 ' clock 161 low
or outa,maskP20 ' clock 161 high
djnz len,#ramtodisplay_loop
or outa,maskP16 ' mem /rd high
or outa,maskP19 ' CS high
jmp #done
becomes
'--------------------------------------------------------------------------
' setups needed for burst write to display Thanks to Jazzed (Steve Denson)
'--------------------------------------------------------------------------
ds_ctra long 4<<26 | 20 ' NCO mode on P20
ds_frq long $2000_0000 ' phsb accumulates twice per edge
ds_ctrb long 4<<26 | 18 ' NCO mode on P18
fastpasmramtodisplay call #get_values ' get hubaddr,ramaddr,len (only uses len) and set control pins
sub len, #2
add ramaddr, #1
call #set161
or outa,maskP16P20 ' set control pins high
mov latchvalue, dirb
call #set373
and dira,maskP16P31 ' %11111111_11111111_00000000_00000000 so prop pins 0-15 HiZ
andn outa,maskP19 ' CS low
andn outa,maskP16 ' ram /rd low
'ctra setup for burst read
mov phsa, #0 ' init counters phsa P20
mov phsb, #0 ' init to phsb P18
mov frqa, ds_frq ' setup NCO freq P20
mov frqb, ds_frq ' setup NCO freq P18
andn outa,maskP20 ' start counters P20
andn outa,maskP18 ' start counters P18
' P20 Count P18 Write
mov ctrb, ds_ctrb ' enable display clk P18
mov ctra, ds_ctra ' enable address counter clk P20 0 2 4 6 8
fastramtodisplay_loop nop ' 2 4 6 8 10 12 14 0 2 4 6 8
djnz len,#fastramtodisplay_loop ' 10 12 14 0 2 4 6 8
' 2 4 6 8 10 12 14 0
or outa,maskP18 ' stop clock
mov ctrb, #0 ' stop counter 10 12 14 0
mov ctra, #0 ' stop counter 2 4 6 8 10 12 14 0
or outa,maskP20 ' stop clock 2 4 6 8
or outa,maskP19 ' CS high
or outa,maskP16 ' mem /rd high
jmp #done
I think I'm doing things right, hopefully someone can help! 
Comments
pasmhubtoram sub ramaddr,#1 '?????? call #set161and373 ' set up the 161 counter and then change to group 2 'or dira,maskP0P15 ' %00000000_00000000_11111111_11111111 ' data bus outputs ''Pins set as output by Set161 'ctr setup for burst read mov phsa, wr_phsa ' init counters phsa mov frqa, wr_frqa ' setup NCO freq andn outa,maskP20 ' start counters rdword data_16,hubaddr ' sync up only mov ctra, _ctra ' enable address counter clk ' 5MB/s write loop uses ctra for address clock hubtoram_loop and outa,maskP16P31 '%11111111_11111111_00000000_00000000 clear for output rdword data_16,hubaddr ' get the word from hub or outa,data_16 ' send out the byte to P0-P15 andn outa,maskP17 ' set mem write low add hubaddr,#2 ' increment by 2 bytes = 1 word. Put this here for small delay while writes or outa,maskP17 ' mem write high djnz len,#hubtoram_loop ' loop this many times or outa,maskP20 ' stop clock ' mov ctra, #0 ' stop counter jmp #done ' tristate pins and listen for commandspasmramtodisplay sub len, #2 ' offset 1 extra clock at start and 1 at end add ramaddr, #1 ' ???not sure??? call #set161 ' Set start address mov latchvalue, dirb ' restore latchvalue saved at get_values call #set373 ' and set and dira,maskP16P31 ' %11111111_11111111_00000000_00000000 so prop pins 0-15 HiZ andn outa,maskP19 ' CS low andn outa,maskP16 ' ram /rd low 'ctr setup for burst read mov phsa, #0 ' init counters phsa P20 mov phsb, #0 ' init counters phsb P18 mov frqa, ds_frq ' setup NCO freq P20 mov frqb, ds_frq ' setup NCO freq P18 andn outa,maskP20 ' start counters P20 andn outa,maskP18 ' start counters P18 mov ctrb, ds_ctrb ' enable display clk P18 mov ctra, _ctra ' enable address counter clk P20 ' 20MB/s read loop uses ctra for address clock and ctrb for display clock ramtodisplay_loop nop ' idle djnz len,#ramtodisplay_loop ' or outa,maskP18 ' stop clock mov ctrb, #0 ' stop counter mov ctra, #0 ' stop counter or outa,maskP20 ' stop clock or outa,maskP19 ' CS high or outa,maskP16 ' mem /rd high jmp #doneThe ???? are what I'm wondering. The other burst-function seems to be okay? I'm hoping someone can help me figure out WHY these are needed, or how to correct if NOT needed. For clarificationpasmramtohub call #set161and373 ' set up the 161 counter and change to group 2 and dira,maskP16P31 '%11111111_11111111_00000000_00000000 inputs andn outa,maskP16 ' memory /rd low 'ctr setup for burst read mov phsa, #0 ' init counters phsa mov frqa, rd_frqa ' setup NCO freq mov phsb, hubaddr ' save hub ptr to phsb mov frqb, #2 ' setup EDGE freq andn outa,maskP20 ' start counters mov ctrb, rd_ctrb ' set ctr be mode rdword data_16,phsb ' sync up only mov ctra, _ctra ' enable address counter clk ' 10MB/s read loop uses phsb for hub pointer ramtohub_loop mov data_16,ina ' get first data wrword data_16,phsb ' move data to hub djnz len,#ramtohub_loop or outa,maskP20 ' stop clock mov ctra, #0 ' stop counter mov ctrb, #0 ' stop counter or outa,maskP16 ' memory /rd high jmp #doneThis needs no offset adjusts. The "overhead"set373 or outa,maskP22 ' pin 22 high 'or dira,maskP22 ' and now set as an output 'P22 always controlled by cog or dira,#%1_11111111 ' enable pins 0-7 and 8 as outputs 'andn outa,maskP8 ' P8 low and outa,maskP0P8low ' P0-P8 low ''P8 is made low at the same time as P0-P7 or outa,latchvalue ' send out the data or outa,maskP8 ' P8 high, clocks out data 'andn outa,maskP8 ' P8 low ''P8 low not needed andn outa,maskP22 ' pin 22 low set373_ret ret set161 mov latchvalue,#%11111110 ' group 1, displays all off call #set373 ' send out to the latch and outa,maskP0P20low '%11111111_11100000_00000000_00000000 or dira,maskP0P20 '%00000000_00011111_11111111_11111111 or outa,ramaddr ' send out ramaddr or outa,maskP20 ' P20 clock high or outa,maskP19 ' p19 load high andn outa,maskP20 ' clock low andn outa,maskP19 ' load low 'or outa,maskP20 ' clock high ''Not needed since 'or outa,maskP19 ' load high or outa,maskP16P20 ' P16-P20 high in case the next thing is a group change and P16/P17 are low and hence upset the ram chip set161_ret ret set161and373 call #set161 ' pass ramaddr mov latchvalue,#%11111101 ' group 2 call #set373 ' change to group 2 set161and373_ret retThe rest shouldn't matter.... This is supposed to transfer data to and from hub, external SRAM and display. Transfers are in words, p0-15, p16-20 are control. Group1 is address-bus, parallel load, Group2 is data transfer. Counters are 74hc161... Thoughts?