Files
Digital-Research-Source-Code/CONTRIBUTIONS/z80em86/support/mvecde.pas
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

175 lines
4.3 KiB
ObjectPascal

(*************************************************************************)
(* *)
(* Functions common to most support programs *)
(* (c) Copyright S.J.Kay *)
(* *)
(*************************************************************************)
procedure BiosX (Fn, Ax : byte; BCx, DEx, HLx : integer);
begin
inline
(
$3A/Fn/ { ld a,(Fn) }
$4F/ { ld c,a }
$87/ { add a,a }
$81/ { add a,c }
$06/$00/ { ld b,0 }
$4F/ { ld c,a }
$2A/$01/$00/ { ld hl,(0001h) }
$09/ { add hl,bc }
$22/* + 17/ { ld (zzzz),hl }
$3A/Ax/ { ld a,(Ax) }
$ED/$4B/BCx/ { ld bc,(BCx) }
$ED/$5B/DEx/ { ld de,(DEx) }
$2A/HLx/ { ld hl,(HLx) }
$CD/$00/$00 { call zzzz }
)
end;
procedure GetBIOSdata (AdrSor, AdrDst, Amount : integer);
begin
BiosX(28, 0, $0100, 0, 0); { set xmove banks, bank #0 to bank #1 }
BiosX(24, 0, Amount, AdrSor, AdrDst) { move memory }
end;
function GetBIOSword (AdrSor : integer) : integer;
const
WrdDst : integer = 0;
begin
GetBIOSdata(AdrSor, addr(WrdDst), 2);
GetBIOSword := WrdDst
end;
function GetBIOSbyte (AdrSor : integer) : byte;
const
BytDst : byte = 0;
begin
GetBIOSdata(AdrSor, addr(BytDst), 1);
GetBIOSbyte := BytDst
end;
procedure PutBIOSdata (AdrSor, AdrDst, Amount : integer);
begin
BiosX(28, 0, $0001, 0, 0); { set xmove banks, bank #1 to bank #0 }
BiosX(24, 0, Amount, AdrSor, AdrDst) { move memory }
end;
procedure PutBIOSword (AdrDst, WrdPut : integer);
const
WrdSor : integer = 0;
begin
WrdSor := WrdPut;
PutBIOSdata(addr(WrdSor), AdrDst, 2)
end;
procedure PutBIOSbyte (AdrDst : integer; BytPut : byte);
const
BytSor : byte = 0;
begin
BytSor := BytPut;
PutBIOSdata(addr(BytSor), AdrDst, 1)
end;
type
registers = record
case boolean of
true : (AL, AH, BL, BH, CL, CH, DL, DH : byte);
false : (AX, BX, CX, DX,
BP, SI, DI, DS, ES, FLAGS : integer)
end;
procedure ProcZ80 (Fn, Ax : byte; BCx, DEx, HLx : integer);
begin
inline
(
$3A/Fn/ { ld a,(Fn) }
$32/* + 17/ { ld (FNCNMB),a }
$3A/Ax/ { ld a,(Ax) }
$ED/$4B/BCx/ { ld bc,(BCx) }
$ED/$5B/DEx/ { ld de,(DEx) }
$2A/HLx/ { ld hl,(HLx) }
$D3/$FF { out (FNCNMB),a }
)
end;
function FuncZ80 (Fn, Ax : byte; BCx, DEx, HLx : integer) : byte;
const
BytVal : byte = 0;
begin
inline
(
$3A/Fn/ { ld a,(Fn) }
$32/* + 17/ { ld (FNCNMB),a }
$3A/Ax/ { ld a,(Ax) }
$ED/$4B/BCx/ { ld bc,(BCx) }
$ED/$5B/DEx/ { ld de,(DEx) }
$2A/HLx/ { ld hl,(HLx) }
$D3/$FF/ { out (FNCNMB),a }
$32/BytVal { ld (BYTVAL),a }
);
FuncZ80 := BytVal
end;
function GetByt (Seg, Off : integer) : byte;
begin
GetByt := FuncZ80($B0, 0, 0, Seg, Off)
end;
procedure SetByt (Seg, Off : integer ; BytPut : byte);
begin
ProcZ80($B1, BytPut, 0, Seg, Off)
end;
function GetWrd (Seg, Off : integer) : integer;
begin
GetWrd := FuncZ80($B0, 0, 0, Seg, Off) +
FuncZ80($B0, 0, 0, Seg, Off + 1) shl 8
end;
procedure SetWrd (Seg, Off, WrdPut : integer);
begin
ProcZ80($B1, lo(WrdPut), 0, Seg, Off);
ProcZ80($B1, hi(WrdPut), 0, Seg, Off + 1)
end;
procedure Intr (Int : byte; var R : registers);
begin
ProcZ80($A1, Int, $AA55, $55AA, addr(R))
end;
procedure Msdos (var R : registers);
begin
Intr($21, R)
end;
function Seg (var Dummy) : integer;
const
SegAdr : integer = 0;
begin
ProcZ80($A0, 0, 0, 0, addr(SegAdr));
Seg := SegAdr
end;
function Ofs (var VarTyp) : integer;
begin
Ofs := addr(VarTyp)
end;