Verbose ruminations? We doan need no steenkin' documentation! Here's my latest (final?) version incorporating some of the ideas and hopefully a little less esoteric. Time to print 50 lines from 61 seconds down to 34, size from 635 bytes down to 406. Funny to watch it dump itself ;-)
BTW, just to repeat: LOADing from a PC using TEXT runs flawlessly at 9600bd whereas loading from BASIC definitely drops characters. It's actually sorta been fun programming on the 'real' M100; I left a download running on the PC and every time I wanted to backup an interim version just in case, I just pressed F3 and F7 (which I'd programmed with the COM stats). As usual, constructive criticism welcome. 1 DEFINTJ-Z:DIMH$(15):FORI=0TO15:REM V3 10 H$(I)=CHR$(48+I-(7*(I>9))):NEXT:CLS 15 INPUT"From";A:INPUT"to";B:T$=TIME$ 20 FORI=ATOBSTEP8:K=I/4096:PRINTH$(K); 25 L=(I-K*4096):PRINTH$(L\256); 30 PRINTH$((LMOD256)\16)H$(LMOD16)" "; 40 L$="":FORJ=0TO7:X=PEEK(I+J) 50 PRINTH$(X\16);H$(XMOD16)" "; 60 Y$=".":IFX>31ANDX<127THENY$=CHR$(X) 70 L$=L$+Y$:NEXT:PRINTL$:NEXT 80 E$=TIME$:PRINTT$+" to "+E$:END --------- 1 Initialize 10 Load H$( array with 1-F 15 Get range, start timer 20-30 Convert & print every 8th address 40 PEEK 8 bytes 50 Convert & print bytes 60 Replace invalid chars with '.' 70 Assemble and print text 80 Print elapsed time ----- Original Message ----- From: Will Senn To: [email protected] Sent: Friday, October 28, 2022 1:54 PM Subject: Re: [M100] Notoriously S.L.O.W BASIC posted - help speeding it up appreciated 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 To: [email protected] 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 <[email protected]> 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
