Afternoon all. I'm puzzled again. I'm writing an article on the use of the maths packags in QDOSMSQ for our esteemed QL Toady magazine and I've hit a small problem that, for the life of me, I can't figure out.
I was explaining the SAVE and LOAD op codes for RI_EXEC and RI_EXECB where the top of stack floating point value is saved to a variables area at (A6,A1.L) or a new TOS is created by loading back from said area. The op codes for save are even in the range $32 to $FF and the load op codes are odd in the same range. Save with $32 and load the same value back with $33, save with $34 and load with $35 and so on. I was trying to explain where exactly the 6 bytes of the FP number are loaded from and saved to, so I decided to have a look at the code in the SMSQE 3.1.2 source, and I found the qa_op and qa_mop routines, tracing through these I basically found the following (in file smsq\qa\op.asm) : 6 bytes are saved and loaded to and from the address given by (A6.L + A4.L + D0.W) where D0.W is simply the op code in the range £32 to $FF with bit zero cleared (ie even). Now I had assumed that I could save one FP using code $32 and another using op code $34 and so on, but the source appears to indicate that I will overwrite part of my $32 saved FP with part of my $34 saved FP. Not only this, but I'm effectively wasting the $32 bytes at the start of my buffer at (A6,A4.L) because the lowest op code I can use is $32 and that writes to my (buffer address + $32) to (buffer address + $37). My next save would be to (buffer address + $34) to (buffer address + $39) - and so on. Is this a bug in SMSQE or am I missing something serios here. What I was expecting is the load and saves to occur from (D0.W - $32) *6 bytes on from the start of my buffer - this would allow me to save consecutive FP values without corruption. Anyone got any ideas ? Here's the code : ;+++ ; QL Arithmetic: do operation ; ; d0 cr operation code error return ; a1 c u pointer to arithmetic stack ; a4 c p pointer to (top of) variables area ; a6 base address ; status return standard ;--- qr_op add.l a6,a1 add.l a6,a4 bsr.s qa_op sub.l a6,a4 sub.l a6,a1 rts ;+++ ; QL Arithmetic: do operation ; ; d0 cr operation code error return ; a1 c u pointer to arithmetic stack ; a4 c p pointer to (top of) variables area ; a6 base address ; status return standard ;--- qa_op ext.w d0 cmp.w #qa.maxop,d0 ; operation? bhi.s qao_ldst ; ... no add.w d0,d0 add.w qao_tab(pc,d0.w),d0 jmp qao_tab(pc,d0.w) ; ... do it qao_ldst bclr #0,d0 ; load or store beq.s qao_load move.w (a1)+,(a4,d0.w) move.l (a1)+,2(a4,d0.w) ; store bra.s qao_ok qao_load move.l 2(a4,d0.w),-(a1) ; load move.w (a4,d0.w),-(a1) qao_ok moveq #0,d0 rts Cheers, Norman.
_______________________________________________ QL-Users Mailing List http://www.q-v-d.demon.co.uk/smsqe.htm