Bug in SETQ for fast Block move
Hi,
After spending xx (!) hours first because of the "poor" documentation and then because of very strange results I have now been able to strip down the issue:
**SETQ in combination with WRLONG gives wrong results for upper cog registers starting from $1F9=PTRB. **
This should be made clear in the documentation!
I also have doubts, if SETQ works with RDLONG for PTRB?
In Taqoz PTRA is used as instruction pointer and PTRB is used as parameter stack pointer pointing into LUT.
The routine storeSetq uses setq and setq2 for fast block moves, while storeConv uses conventional loops. Both are executed from HUB ram.
The test first uses 2 times storeConv to store to different buffers and compare them. Then first storeSetq and then storeConv and compare again.
TAQOZ# test --- 2* conventional: $0000_0000 $0006_C000 $0006_D010 \ OK buffer address $0000_0011 $0000_0228 $0000_0000 \ OK register R1 $0000_0023 $0006_C000 $0006_D010 \ OK TOS LUT: $0000_0242 $0000_B94E $0000_B954 \ OK return address setq and conventional: $0000_0000 $0006_C000 $0006_D010 \ OK buffer address $0000_0010 $0000_0400 $0000_0010 \ OK register R0 $0000_0012 $0000_0000 $0000_01EE \ OK register R2 $0000_0023 $0006_C000 $0006_D010 \ OK TOS $0000_01F8 $0000_B86A $0000_B89A \ OK??? calling wordcode address $0000_01F9 $0000_0000 $0000_0001 \ NOK Forth stack pointer should be same $0000_01FA $AF9C_F31B $0000_0000 \ NOK DIRA $0000_01FE $0000_01F8 $FFFF_FFF0 \ NOK INA $0000_01FF $7952_BE52 $7FFF_FFFF \ NOK INB LUT: $0000_0242 $0000_B978 $0000_B97E \ OK return address TAQOZ# --- ok
Code:
!polls \ clear multitasking pub *Tests* PRINT" P2 Test" ; org@ := oriorg $6C000 := userdata userdata org \ scr $36e5 ! \ use video memory $33600 for buffer, normally $60000 7 cogstop \ vga 1028 longs aBuffer aBuffer 1028 4* erase 1028 longs bBuffer bBuffer 1028 4* erase $5_0000 := diffBuffer \ on boundary for dump \ 1028 longs diffBuffer diffBuffer 1028 4* erase 0 := cog0 \ TAQOZ %red %pen code storeSetq ( buffer ) push cog0 mov cog0,a setq #511 ' write all cog RAM wrlong 0,cog0 mov cog0,a add cog0,##2048 setq2 #511 ' 512-1 write all LUT from 0 3,645ns @200MHz ##### wrlong 0,cog0 pop cog0 ret end code storeConv ( buffer ) push cog0 mov cog0,a mov r0,#0 ' store all cog ######################## mov r2,##512 ' FOR: ' store cog altd r0,#0 wrlong 0,cog0 add r0,#1 add cog0,#4 NEXT: r2 mov cog0,a add cog0,##2048 mov r2,##512 ' FOR: ' store cog rdlut r1,r0 wrlong r1,cog0 add r0,#1 add cog0,#4 NEXT: r2 pop cog0 ret end %white %pen : dumpDiff crlf 1028 for aBuffer i 4* + @ dup >a bBuffer i 4* + @ dup >b - if crlf i .l ." " a> .l ." " b> .l then next ; : test \ crlf ." Buffers just cleared: " \ dumpDiff crlf ." 2* conventional: " aBuffer storeConv drop bBuffer storeConv drop dumpDiff crlf ." setq and conventional: " aBuffer storeSetq drop bBuffer storeConv drop dumpDiff ; test