fpc/rtl/gba/gbabios.inc
florian 5575a837db * gba patch from Francesco Lombardi
git-svn-id: trunk@3716 -
2006-05-28 14:48:24 +00:00

180 lines
5.0 KiB
PHP

{
This file is part of the Free Component Library (FCL)
Copyright (c) 1999-2002 by the Free Pascal development team
BIOS functions unit for Gameboy Advance
Copyright (c) 2006 by Francesco Lombardi
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*****************************************************************************}
{*****************************************************************************
GBA Bios Functions
*****************************************************************************}
(*
GBA Bios Functions
------------------
Following infos come from GBATEK, Gameboy Advance Technical Info, that you can
find here: http://nocash.emubase.de/gbatek.htm
GBA Bios includes some useful optimized functions which can be accessed by
SWI. Parameters can be passed to function by r0,r1,r2 and r3 registers; results
are stored in r0,r1 and r3. Unused 'out registers' generally return garbage;
other registers are unchanged.
In ARM mode SWI register are called by:
SWI n * 0x010000
In THUMB mode:
SWI n
SWI Hex Function
--- --- --------
0 00h SoftReset
1 01h RegisterRamReset
2 02h Halt
3 03h Stop
4 04h IntrWait
5 05h VBlankIntrWait
6 06h Div
7 07h DivArm
8 08h Sqrt
9 09h ArcTan
10 0Ah ArcTan2
11 0Bh CpuSet
12 0Ch CpuFastSet
13 0Dh -Undoc- ("GetBiosChecksum")
14 0Eh BgAffineSet
15 0Fh ObjAffineSet
16 10h BitUnPack
17 11h LZ77UnCompWram
18 12h LZ77UnCompVram
19 13h HuffUnComp
20 14h RLUnCompWram
21 15h RLUnCompVram
22 16h Diff8bitUnFilterWram
23 17h Diff8bitUnFilterVram
24 18h Diff16bitUnFilter
25 19h SoundBias
26 1Ah SoundDriverInit
27 1Bh SoundDriverMode
28 1Ch SoundDriverMain
29 1Dh SoundDriverVSync
30 1Eh SoundChannelClear
31 1Fh MidiKey2Freq
32-36 20h-24h -Undoc- (Sound Related ???)
37 25h MultiBoot
38 26h -Undoc- ("HardReset")
39 27h -Undoc- ("CustomHalt")
40 28h SoundDriverVSyncOff
41 29h SoundDriverVSyncOn
42 2Ah -Undoc- ("GetJumpList" for Sound ???)
43-255 2Bh-FFh -Not used-
Values passed to SWI aren't range-checked, so calling 43-255 will lock-up GBA.
*)
(*
Following defines are intended for future use, when fpc hopefully will handle
both arm and thumb code. I have provided ARM and THUMB funcs, that can be
activated by defines:
{$define __THUMB__}
{$define __ARM__}
At this time I'll force ARM definition in "system.pp"
*)
(* Generic system call !!Does Not Work!!
{$ifdef __THUMB__}
procedure SystemCall(Number: integer); assembler; inline;
asm
SWI r0
end;
{$else}
procedure SystemCall(n: integer); assembler; inline;
asm
MOV R0, R0, LSL #0x10
SWI R0
end;
{$endif}
*)
{$ifdef __THUMB__}
(*=========================
SWI6 Div
Signed Division, r0/r1.
r0 signed 32bit Number
r1 signed 32bit Denom
Return:
r0 Number DIV Denom
=========================*)
function fpc_div_longint(n,z: longint):longint; [public, alias: 'FPC_DIV_LONGINT']; compilerproc; assembler; inline;
asm
swi 6
end;
(*=====================*)
(*=========================
SWI6 DivMod
Signed Division, r0/r1.
r0 signed 32bit Number
r1 signed 32bit Denom
Return:
r1 Number MOD Denom
=========================*)
function fpc_mod_longint(n,z: longint):longint; [public, alias: 'FPC_MOD_LONGINT']; compilerproc; assembler; inline;
asm
swi 6
mov r0, r1
end;
(*=========================*)
{$endif}
{$ifdef __ARM__}
(*=========================
SWI7 DivArm
Signed Division, r1/r0.
r1 signed 32bit Number
r0 signed 32bit Denom
Return:
r0 Number DIV Denom
=========================*)
function fpc_div_longint(n,z: longint):longint; [public, alias: 'FPC_DIV_LONGINT']; compilerproc; assembler; inline;
asm
swi #0x070000
end;
(*=========================*)
(*=========================
SWI7 DivModArm
Signed Division, r1/r0.
r1 signed 32bit Number
r0 signed 32bit Denom
Return:
r1 Number MOD Denom
=========================*)
function fpc_mod_longint(n,z: longint):longint; [public, alias: 'FPC_MOD_LONGINT']; compilerproc; assembler; inline;
asm
swi #0x070000
mov r0, r1
end;
(*=========================*)
{$endif}