mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 16:34:07 +00:00
175 lines
4.3 KiB
ObjectPascal
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;
|