On Monday 04 February 2008 07:21, Dave Dunfield wrote:
I don't think he was talking about pushing data on
the stack,
I thought he was refering to putting the system service request
number inline with the code.
Yup...
This is exactly what I do on both my DMF (8080) and
CUBIX (6809)
OS's.
I use an 'SSR' macro which looks something like (DMF/8080):
SSR MACRO
RST 2
DB \1
END
It's fairly easy to fetch this:
SSRENT: STA savea ; Save accumulator
XTHL ; HL = calling address
MOV A,M ; Get service request number
INX H ; Skip for return
XTHL ; Restore HL & new return address
; Now you have the SSR number in A
; most likely you would use it to index into a handler
; table sith something like: (untested)
PUSH H ; Save application HL
MOV L,A ; L = SSR number
MVI H,0 ; Zero high
DAD H ; x2 for two byte entries
PUSH B ; Save BC
LXI B,JMPTAB ; Point to jump table
DAD B ; Offset to table
POP B ; Restore B
MOV A,M ; Get low address
INX H ; Advance to high
MOV H,M ; Get high address
MOV L,A ; Set low address
XTHL ; Restore HL, dest on stack
LDA savea ; Restore A
RET ; Jump to caller
'JMPTAB' would contain a series of 2-byte addresses of
the individual SSR handlers.
Only I called mine "OPTAB". And the register usage was slightly different,
but that's pretty darn close to what I was doing. :-)
In practice it's usually a bit more complex ...
iirc
in my SSR entry I save most of the registers (so that
the handlers don't have to) and switch to my own stack
(but it's been a very long time so I may be mistaken).
Yup I had some entry points just do as little as what was necessary and
others save *all* registers so we could do things like display them if we
wanted to or whatever, and that included switching to the monitor's stack as
well.
In the application code, you can then do things like:
MVI A,'?' ; Get prompt
SSR 3 ; Output to console (two byte OS call)
Just so, which strikes me as a whole lot more efficient than having to use a
3-byte CALL instruction after loading a function code into one register (and
maybe needing to save that beforehand) and maybe the same with some other
registers as well. It was the days when every byte counted, right? :-)
--
Member of the toughest, meanest, deadliest, most unrelenting -- and
ablest -- form of life in this section of space, ?a critter that can
be killed but can't be tamed. ?--Robert A. Heinlein, "The Puppet Masters"
-
Information is more dangerous than cannon to a society ruled by lies. --James
M Dakin