| ??? 08/05/05 14:47 Modified: 08/05/05 16:31 Read: times |
#98870 - Tester/Counter Responding to: ???'s previous message |
I have prepared a "tester", which compares a result from shifting an arbitrary input value with a reference routine, and, more importantly, counts the instruction cycles of the "tested" shift routine, finds their minimum and maximum and adds them up to a sum (which then divided by 31 gives the average duration).
;----------- testing program for the shift code competition ----------------
;------------------------------- by wek ------------------------------------
DSEG AT 30h
MaxTime: ds 2 ;worst case duration
MaxAcc: ds 1 ;value of acc (=shift count) for worst case
MinTime: ds 2 ;best case duration
MinAcc: ds 1 ;value of acc (=shift count) for best case
TotTime: ds 2 ;total duration (TotTime/31=average duration)
Result: ds 4 ;temporary store of reference result
CSEG
Tester:
;initialize the time measurement variables
mov MaxTime+0,#0
mov MaxTime+1,#0
mov MinTime+0,#0FFh
mov MinTime+1,#0FFh
mov TotTime+0,#0
mov TotTime+1,#0
mov tmod,#1 ;set timer0 to 16 bit counter
mov a,#1Fh
TesterLoop: ;for acc:=1f downto 1 do this loop
push acc
mov r4,#0ABh ;this is the test vector
mov r5,#0CDh
mov r6,#056h
mov r7,#078h
;first, do the reference calculation
lcall ShiftTrivial
mov Result+0,r4 ;...and store the result for future comparison
mov Result+1,r5
mov Result+2,r6
mov Result+3,r7
pop acc
push acc ;restore accumulator (=shift count)
mov r4,#0ABh
mov r5,#0CDh
mov r6,#056h
mov r7,#078h ;and use the same test vector
mov th0,#0 ;reset timer0 - we are going to measure the
mov tl0,#0 ; duration of the shift routine
setb tr0 ;start timer0
lcall Shift ;and call the tested routine
clr tr0 ;stop timer0
mov a,r4 ;now test the result against the reference
cjne a,Result+0,Error
mov a,r5
cjne a,Result+1,Error
mov a,r6
cjne a,Result+2,Error
mov a,r7
cjne a,Result+3,Error
clr c ;get measured time into r2:r3
mov a,tl0
subb a,#3 ;correction for setb tr0 and call
mov r3,a
mov a,th0
subb a,#0
mov r2,a
mov a,TotTime+1 ;add the measured time to total time
add a,r3
mov TotTime+1,a
mov a,TotTime+0
addc a,r2
mov TotTime+0,a
mov a,r2 ;if measured time is higher than MaxTime then update MaxTime
cjne a,MaxTime+0,TesterX1
mov a,r3
cjne a,MaxTime+1,TesterX1
TesterX1:
jc TesterX2
mov MaxTime+0,r2
mov MaxTime+1,r3
pop MaxAcc
push MaxAcc
TesterX2:
mov a,r2 ;if measured time is lower than MinTime then update MinTime
cjne a,MinTime+0,TesterX11
mov a,r3
cjne a,MinTime+1,TesterX11
TesterX11:
jnc TesterX12
mov MinTime+0,r2
mov MinTime+1,r3
pop MinAcc
push MinAcc
TesterX12:
pop acc ;restore acc - end of loop
djnz acc,TesterLoop
;end of test, stay looping forever
;in a non-simulated environment, the timing results could
; been sent out e.g. via UART for inspection
Stop:
sjmp Stop
;in case of failed test, loops here forever
;again in a non-simulated environment, something could be
; sent out (e.g. "ERROR" :-)
Error:
sjmp Error
;--------------------- the reference shift routine -----------------------
;--- input: r4:r5:r6:r7 - the operand
; acc - number of shifts (any number)
;--- output: r4:r5:r6:r7 - the result
;--- destroys: b
;
;Performance (cycles including ret):
; WorstCase - 470
; BestCase - 20
; Average - 245
; Code Length - 21 bytes
ShiftTrivial:
jz ShiftTRet
mov b,a
ShiftTLoop:
clr c
mov a,r4
rrc a
mov r4,a
mov a,r5
rrc a
mov r5,a
mov a,r6
rrc a
mov r6,a
mov a,r7
rrc a
mov r7,a
djnz b,ShiftTLoop
ShiftTRet:
ret ;a*15+5 cycles (incl. ret)
Shift:
;-------- insert your shift routine here ---------
Enjoy! Jan Waclawek |
| Topic | Author | Date |
| Code Challenge operational | 01/01/70 00:00 | |
| Questions for current challenge ? | 01/01/70 00:00 | |
| Instruction Cycles? | 01/01/70 00:00 | |
| best case/worst case | 01/01/70 00:00 | |
| how about 30 instructions | 01/01/70 00:00 | |
| 30 instructions? | 01/01/70 00:00 | |
| i did count inside loops | 01/01/70 00:00 | |
| Changed last night | 01/01/70 00:00 | |
| Tester/Counter | 01/01/70 00:00 | |
| Wow! | 01/01/70 00:00 | |
| The 3 better solutions | 01/01/70 00:00 | |
| Definition of BEST | 01/01/70 00:00 | |
| Definition of best | 01/01/70 00:00 | |
Good idea | 01/01/70 00:00 | |
| pre tags? | 01/01/70 00:00 | |
| Yes | 01/01/70 00:00 | |
| A highlight please | 01/01/70 00:00 |



