Ken, Regarding T, interesting way to make a machine code routine in ram. This is quite compact for a short routine, but I think this part is equivalent to encoding the 14 bytes and poking into ALTLCD. Is there something I missed in that? IE you don't care how those 14 bytes show up, nor where they are. Steve
On Sun, Jun 3, 2018 at 12:17 PM, Ken Pettit <[email protected]> wrote: > Hey Guys, > > Okay, BASIC XIP code, as promised. This code was written taking a > "purest' approach where no hidey holes were used, only BASIC allocated > RAM. If hidey holes were to be used, I believe the resulting assembly > could be made smaller. A short relative jump could be made to occupy only > 5 bytes (MVI A,offset + CALL helper_in_hidey_hole). This method does not > preserve A, it uses it as the relative jump distance. To preserve A, it > would need to be PUSH/POPed using the stack. Also, looking at the number > of instructions that have to be executed to make this happen, I'm not sure > the resulting ASM code will be faster than BASIC, but it was a fun > experiment. ;) > > I developed / assembled the ASM code using the VIrutalT assembler and then > manually copied bytes into the BASIC program. There are quite a few > comments in the ASM code. > > Again, the concept: > > 1. INT array T(0-6) is initialized using BASIC assign statements with an > ASM THUNK to perform DAD D operation. > 2. VARPTR(T(0)) is passed to the ML program in H$ string. > 3. The T() array address is store off so the ROM JUMPTHUNK code will jump > there (fixed CALL to jump to variable address). > 4. The Accumulator holds a short jump distance. > 5. Relative branching is done by: > > MVI A, offset > CALL LOCATEME > CALL JUMPTHUNK > XTHL > RET > > If a large ML program is needed in BASIC, one could expand/modify the code > above a bit and poke it into a hidey hole. Then each relative jump would > become: > > MVI A,offset > CALL hidey_hole > > Ken > > On 6/2/18 2:56 PM, John R. Hogerhuis wrote: > >> Very nice. Code? :-) >> >> — John. >> > >
