mirror of
https://github.com/Wiimpathy/HatariWii.git
synced 2024-11-26 03:24:18 +01:00
75 lines
1.5 KiB
ArmAsm
75 lines
1.5 KiB
ArmAsm
|
/*
|
||
|
* nf_asm.s - GCC NatFeats ASM detection code
|
||
|
*
|
||
|
* Copyright (c) 2014 by Eero Tamminen
|
||
|
*
|
||
|
* Mostly based on code from EmuTOS,
|
||
|
* Copyright (c) 2001-2013 by the EmuTOS development team
|
||
|
*
|
||
|
* This file is distributed under the GPL, version 2 or at your
|
||
|
* option any later version.
|
||
|
*
|
||
|
* TODO: test this
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* public interface
|
||
|
*/
|
||
|
.globl _nf_id
|
||
|
.globl _nf_call
|
||
|
.globl _detect_nf
|
||
|
|
||
|
/* illegal exception vector */
|
||
|
.equ vec_illegal, 0x10
|
||
|
|
||
|
/*
|
||
|
* code
|
||
|
*/
|
||
|
.text
|
||
|
|
||
|
/*
|
||
|
* NatFeats test
|
||
|
*
|
||
|
* Needs to be called from Supervisor mode,
|
||
|
* otherwise exception handler change bombs
|
||
|
*/
|
||
|
_detect_nf:
|
||
|
clr.l d0 /* assume no NatFeats available */
|
||
|
move.l sp,a1
|
||
|
move.l vec_illegal,a0
|
||
|
move.l #fail_nf,vec_illegal
|
||
|
pea nf_version_name
|
||
|
sub.l #4,sp
|
||
|
#ifdef __mcoldfire__
|
||
|
#error Conflict with instruction mvs.b d0,d1
|
||
|
#else
|
||
|
.dc.w 0x7300 /* Jump to NATFEAT_ID */
|
||
|
#endif
|
||
|
tst.l d0
|
||
|
beq.s fail_nf
|
||
|
moveq #1,d0 /* NatFeats detected */
|
||
|
|
||
|
fail_nf:
|
||
|
move.l a1,sp
|
||
|
move.l a0,vec_illegal
|
||
|
|
||
|
rts
|
||
|
|
||
|
nf_version_name:
|
||
|
.ascii "NF_VERSION\0"
|
||
|
.even
|
||
|
|
||
|
/*
|
||
|
* map native features to NF ID
|
||
|
*/
|
||
|
_nf_id:
|
||
|
.dc.w 0x7300 /* Conflict with ColdFire instruction mvs.b d0,d1 */
|
||
|
rts
|
||
|
|
||
|
/*
|
||
|
* call native feature by its ID
|
||
|
*/
|
||
|
_nf_call:
|
||
|
.dc.w 0x7301 /* Conflict with ColdFire instruction mvs.b d1,d1 */
|
||
|
rts
|