[comp.lang.pascal] Looking for a V30 wizzard!

vereijken@rulcri.leidenuniv.nl (Jan Joris Vereijken) (04/05/91)

Hi :-)
 
Is there someone out there who has hands-on experience with kicking a V20/V30
CPU into 8080-emulation mode? I don't mean running a fancy piece of code that
does trick for you, no I mean doing it yourself, by writing it yourself in
assembly.
 
Beware, it gets hairy now!
 
I hooked the $F1 interrupt to point to a piece of 8080-code that does this:
 
   ADD HL,BC { Add BC to HL }
   RETEM     { Return from emulation }
 
I called it using:
 
   BRKEM $F1 { enter emulation mode }
 
Unnecessary to say my machine hung :-(
 
When I replaced the above code with:
 
   ADD BX,CX { Add CX to BX }
   IRET      { Return from interrupt }
 
Using:
 
   INT $F1
 
Everthing ran like a charm!!! So hooking the INT $F1 went fine, and my
assembler function Add8080 works fine - the parameterpassing and stuff
that is. Try the above replacement to see it for yourself.
 
Darn :-(
 
Anybody got a clue???
 
My program is appended to this mail (Turbo Pascal 6.0). Oh, a few things: YES
I did read NEC's V30 datasheet a dozen times up and down, and YES it felt sure
I understood it all, and YES I *do* have a V30 in my machine, I installed it
myself :-)
 
Please, let somebody say what goes wrong - I feel so stupid :-( Quite sure that
I understand the whole thing perfectly, but the code just won't run...
 
Thanks in advance!
 
- Jan Joris -
 
vereijken@rulcri.LeidenUniv.NL
 
-------------------------------------------------------------------------------
 
PROGRAM Use8080;
 
(* Put a V20/V30 into 8080 emulation mode, an do some arithmetic *)
 
{$A-} { No word alignment! It would screw up our 8080 instructions... }
 
USES
 
  Dos;
 
PROCEDURE Init8080; ASSEMBLER;
 
  { Set up INT $F1 to handle 8080 code. }
 
  ASM
 
    MOV AX,0
    MOV ES,AX       { $0000 = segment of interrupt vector table }
 
    { Now hook interrupt $F1, located at ES:[$03C4] }
 
    MOV AX, OFFSET @8080code
    MOV WORD PTR ES:[$03C4],AX
    MOV AX, SEG @8080code
    MOV WORD PTR ES:[$03C6],AX
    JMP @Done
 
    @8080code:    { We are in 8080 mode now! }
 
      DB $09      { ADD HL,BC to make the addition }
      DB $ED,$ED  { RETEM, return from emulation }
 
    @Done:
 
  END;
 
FUNCTION Add8080(a, b : WORD) : WORD; ASSEMBLER;
 
  { Add two words in 8080 mode... }
 
  ASM
 
    MOV BX,a        { Store a in BX, this will be HL in 8080 mode. }
    MOV CX,b        { Store a in CX, this will be BC in 8080 mode. }
    DB  $0F,$FF,$F1 { BRKEM $F1, enter 8080 emulation mode... }
    MOV AX,BX       { Result was in HL, or BX, make it the functionvalue. }
 
  END;
 
BEGIN
 
  Init8080;
  WriteLn('123 + 456 = ', Add8080(123,456));
 
END.

wilker@gauss.math.purdue.edu (Clarence Wilkerson) (04/05/91)

In the simtel2- archives under msdos.emulators is an archive
I wrote about 5 years ago when the V20-30 came out. It is
a CP/M emulator all in Turbo Pascal except for a couple of line
of assembler on the 8088 end. I believe the name is
V20BOOT. In it I enter 8080 mode, execute 8080 code for awhile,
then call Turbo routines to execute bdos and bios functions,
and finally leave 8080 mode and return to 8088 mode.
Clarence Wilkerson