Oh yes, am I ever. A bit overwhelmed, actually. It'll take me a month to
work through all of these suggestions and potential optimizations :). I
suspected there were folks in the world who took BASIC to its edges, but
I had no idea :). The thread on that weird listing a while back should
have been a clue, but I thought it was a one-off. I'm in awe of y'all's
grasp of the finer points and look forward to learning more. I tend to
try to avoid the more esoteric optimizations in favor of clarity, but in
this case, so long as I notate appropriately, I'll get over it! It seems
like folks tend to move their more verbose ruminations out of the BASIC
files and into accompanying .DO files, that about right?
Thanks,
Will
On 10/28/22 2:07 AM, MikeS wrote:
Thanks for that; I'll have to check it out later. Meanwhile, I think
if we're going to use a lookup table at all then I also prefer your
use of an array for H$, but I'd load it a little differently (as John
and I were discussing):
5 DIM H$(15):FOR T=0 TO 15:H$(T)=CHR$(48+T-(7*(T>9))):NEXT
Tsk, tsk; you're cheating by inputting the range in decimal so you
don't have to do a HEX to decimal conversion ;-) I suppose it makes
sense though...
More serious, using integers for the addresses restricts the dump to
<8000H; I had the same problem first time around.
Enjoying the thread... wonder if Will's getting anything out of it ;-)
m
----- Original Message -----
*From:* B 9 <mailto:hacke...@gmail.com>
*To:* m...@bitchin100.com
*Sent:* Thursday, October 27, 2022 11:38 PM
*Subject:* Re: [M100] Notoriously S.L.O.W BASIC posted - help
speeding it up appreciated
On Thu, Oct 27, 2022 at 3:04 PM John R. Hogerhuis
<jho...@pobox.com> wrote:
With hex it's a question though since MOD 16 can be done with
AND 15 which is probably faster than a general integer 16
modulus. There's no bitshift operator so you still need a
integer divide by 16%. Who knows how efficient an integer
divide by 16 is in the interpreter versus 4096 (integer) divides.
That's a good question about efficiency. Integer division by 4096
seems reasonably quick, but it would have been nice if BASIC had
exposed the bit shift operators. (I'm presuming the 8085 had some,
right?)
I'm not sure it'd be any faster than division by 4096, but one
could use the fact that we're using a 2-byte integer for the
address and just look at each byte.
hexit.do
1 TS$=TIME$
5 DIM H$(15):*FOR* T=0*TO* 9:H$(T)=CHR$(48+T):*NEXT* T:*FOR* T=ASC("A")*TO*
ASC("F"): H$(T-55)=CHR$(T):*NEXT*
6 DIM R$(7):*FOR* T=0*TO* 7: R$(T)=" ":*NEXT*
10 DEFINT A-F, P: D=0: P=VARPTR(D)
15 INPUT "Start"; ST%
16 INPUT "End"; EN%
20*FOR* D=ST%*TO* EN%
30*IF* (D MOD 8) = 0*THEN* *PRINT*" ";:*FOR* T=0*TO* 7:*PRINT*
R$(T);:*NEXT*:*PRINT*: S=0:*GOSUB* 400
40*GOSUB* 200
90*NEXT*
100 REM Timing
110 TE$=TIME$
115*PRINT*
120*PRINT* TS$ " to " TE$
199*END*
200 REM Print 2 hexits
201*' *Input: D is address of an 8-bit integer**202*'* Output: None, but 2
hexits are printed followed by a space
210 A=PEEK(D)
220*PRINT *H$(A\16); H$(A MOD 16); " ";
230*IF* A<32*THEN* A=46
240 R$(S)=CHR$(A)
250 S=S+1
260*RETURN*
400 REM Print 4 hexits
401*' *Input: P is address of a 16-bit little endian integer
402*'* Output: None, but 4 hexits are printed followed by a space
410 A=PEEK(P+1): B=PEEK(P)
420*PRINT *H$(A\16); H$(A MOD 16); H$(B\16); H$(B MOD 16); " ";
430*RETURN*
------------------------------------------------------------------------
—b9