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
