Ken, a comment. DADTHUNK code could expand from 14 bytes to 24 bytes, as you point out, to shorten the calls in the program ML. --> at this point, maybe a DATA approach for T(i) would be more dense than assigning each T(i), with a read loop.
How do we embed programs larger than 255 bytes? If I understand this, we have single programs contained in single strings. It seems like it would be hard to have a large program segmented into multiple strings. any thoughts? Steve On Mon, Jun 4, 2018 at 7:27 AM, Stephen Adolph <[email protected]> wrote: > 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. >>> >> >> >
