mirror of
https://github.com/pret/pokediamond.git
synced 2026-09-29 03:46:47 -05:00
Merge pull request #70 from red031000/master
OS_terminate_proc and partial OS_interrupt
This commit is contained in:
@@ -155,6 +155,7 @@ SECTIONS {
|
||||
GX_asm.o (.text)
|
||||
OS_irqHandler.o (.text)
|
||||
OS_irqTable.o (.text)
|
||||
OS_interrupt_asm.o (.text)
|
||||
OS_interrupt.o (.text)
|
||||
OS_spinLock.o (.text)
|
||||
OS_printf.o (.text)
|
||||
|
||||
@@ -116,124 +116,3 @@ OSi_EnterTimerCallback: ; 0x020C9EC8
|
||||
_020C9F08: .word OSi_IrqCallbackInfo+0x30
|
||||
_020C9F0C: .word OSi_IrqCallbackInfo+0x38
|
||||
_020C9F10: .word OSi_IrqCallbackInfo+0x34
|
||||
|
||||
arm_func_start OSi_EnterDmaCallback
|
||||
OSi_EnterDmaCallback: ; 0x020C9F14
|
||||
stmdb sp!, {r4-r6,lr}
|
||||
mov r3, #0xc
|
||||
mul r6, r0, r3
|
||||
ldr ip, _020C9F54 ; =OSi_IrqCallbackInfo
|
||||
add r4, r0, #0x8
|
||||
mov r5, #0x1
|
||||
mov r0, r5, lsl r4
|
||||
ldr r3, _020C9F58 ; =0x021D3424
|
||||
str r1, [r12, r6]
|
||||
str r2, [r3, r6]
|
||||
bl OS_EnableIrqMask
|
||||
and r1, r0, r5, lsl r4
|
||||
ldr r0, _020C9F5C ; =0x021D3420
|
||||
str r1, [r0, r6]
|
||||
ldmia sp!, {r4-r6,lr}
|
||||
bx lr
|
||||
.balign 4
|
||||
_020C9F54: .word OSi_IrqCallbackInfo
|
||||
_020C9F58: .word OSi_IrqCallbackInfo + 8
|
||||
_020C9F5C: .word OSi_IrqCallbackInfo + 4
|
||||
|
||||
arm_func_start OS_GetIrqFunction
|
||||
OS_GetIrqFunction: ; 0x020C9F60
|
||||
ldr r2, _020C9FE4 ; =0x027E0000
|
||||
mov r3, #0x0
|
||||
_020C9F68:
|
||||
ands r1, r0, #0x1
|
||||
beq _020C9FC8
|
||||
cmp r3, #0x8
|
||||
blt _020C9F98
|
||||
cmp r3, #0xb
|
||||
bgt _020C9F98
|
||||
sub r1, r3, #0x8
|
||||
mov r0, #0xc
|
||||
mul r2, r1, r0
|
||||
ldr r0, _020C9FE8 ; =OSi_IrqCallbackInfo
|
||||
ldr r0, [r0, r2]
|
||||
bx lr
|
||||
_020C9F98:
|
||||
cmp r3, #0x3
|
||||
blt _020C9FC0
|
||||
cmp r3, #0x6
|
||||
bgt _020C9FC0
|
||||
add r1, r3, #0x1
|
||||
mov r0, #0xc
|
||||
mul r2, r1, r0
|
||||
ldr r0, _020C9FE8 ; =OSi_IrqCallbackInfo
|
||||
ldr r0, [r0, r2]
|
||||
bx lr
|
||||
_020C9FC0:
|
||||
ldr r0, [r2, #0x0]
|
||||
bx lr
|
||||
_020C9FC8:
|
||||
add r3, r3, #0x1
|
||||
cmp r3, #0x16
|
||||
mov r0, r0, lsr #0x1
|
||||
add r2, r2, #0x4
|
||||
blt _020C9F68
|
||||
mov r0, #0x0
|
||||
bx lr
|
||||
.balign 4
|
||||
_020C9FE4: .word 0x027E0000
|
||||
_020C9FE8: .word OSi_IrqCallbackInfo
|
||||
|
||||
arm_func_start OS_SetIrqFunction
|
||||
OS_SetIrqFunction: ; 0x020C9FEC
|
||||
stmdb sp!, {r4-r8,lr}
|
||||
mov r8, #0x0
|
||||
ldr lr, _020CA074 ; =0x027E0000
|
||||
ldr r5, _020CA078 ; =OSi_IrqCallbackInfo
|
||||
mov r6, r8
|
||||
mov r12, r8
|
||||
mov r3, #0x1
|
||||
mov r2, #0xc
|
||||
_020CA00C:
|
||||
ands r4, r0, #0x1
|
||||
beq _020CA05C
|
||||
mov r7, r6
|
||||
cmp r8, #0x8
|
||||
blt _020CA030
|
||||
cmp r8, #0xb
|
||||
suble r4, r8, #0x8
|
||||
mlale r7, r4, r2, r5
|
||||
ble _020CA04C
|
||||
_020CA030:
|
||||
cmp r8, #0x3
|
||||
blt _020CA048
|
||||
cmp r8, #0x6
|
||||
addle r4, r8, #0x1
|
||||
mlale r7, r4, r2, r5
|
||||
ble _020CA04C
|
||||
_020CA048:
|
||||
str r1, [lr, r8, lsl #0x2]
|
||||
_020CA04C:
|
||||
cmp r7, #0x0
|
||||
strne r1, [r7, #0x0]
|
||||
strne r12, [r7, #0x8]
|
||||
strne r3, [r7, #0x4]
|
||||
_020CA05C:
|
||||
add r8, r8, #0x1
|
||||
cmp r8, #0x16
|
||||
mov r0, r0, lsr #0x1
|
||||
blt _020CA00C
|
||||
ldmia sp!, {r4-r8,lr}
|
||||
bx lr
|
||||
.balign 4
|
||||
_020CA074: .word 0x027E0000
|
||||
_020CA078: .word OSi_IrqCallbackInfo
|
||||
|
||||
arm_func_start OS_InitIrqTable
|
||||
OS_InitIrqTable: ; 0x020CA07C
|
||||
ldr r0, _020CA090 ; =0x027E0060
|
||||
mov r1, #0x0
|
||||
str r1, [r0, #0x4]
|
||||
str r1, [r0, #0x0]
|
||||
bx lr
|
||||
.balign 4
|
||||
_020CA090: .word 0x027E0060
|
||||
@@ -1,19 +0,0 @@
|
||||
.include "asm/macros.inc"
|
||||
.include "global.inc"
|
||||
|
||||
.text
|
||||
|
||||
arm_func_start OS_Halt
|
||||
OS_Halt: ; 0x020CD844
|
||||
mov r0, #0x0
|
||||
mcr p15, 0x0, r0, c7, c0, 0x4
|
||||
bx lr
|
||||
|
||||
arm_func_start OS_Terminate
|
||||
OS_Terminate: ; 0x020CD850
|
||||
stmdb sp!, {lr}
|
||||
sub sp, sp, #0x4
|
||||
_020CD858:
|
||||
bl OS_DisableInterrupts
|
||||
bl OS_Halt
|
||||
b _020CD858
|
||||
@@ -16,6 +16,8 @@
|
||||
#include "OS_arena.h"
|
||||
#include "OS_alloc.h"
|
||||
#include "OS_system.h"
|
||||
#include "OS_terminate_proc.h"
|
||||
#include "OS_interrupt.h"
|
||||
#include "OS_reset.h"
|
||||
|
||||
void OS_Init();
|
||||
|
||||
29
arm9/lib/include/OS_interrupt.h
Normal file
29
arm9/lib/include/OS_interrupt.h
Normal file
@@ -0,0 +1,29 @@
|
||||
//
|
||||
// Created by red031000 on 2020-05-07.
|
||||
//
|
||||
|
||||
#ifndef POKEDIAMOND_OS_INTERRUPT_H
|
||||
#define POKEDIAMOND_OS_INTERRUPT_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
typedef void (*OSIrqFunction) (void);
|
||||
|
||||
typedef struct
|
||||
{
|
||||
void (*func) (void *);
|
||||
u32 enable;
|
||||
void* arg;
|
||||
} OSIrqCallbackInfo;
|
||||
|
||||
typedef u32 OSIrqMask;
|
||||
|
||||
extern OSIrqFunction OS_IRQTable[];
|
||||
extern OSIrqCallbackInfo OSi_IrqCallbackInfo[7+1];
|
||||
|
||||
void OS_InitIrqTable();
|
||||
void OS_SetIrqFunction(OSIrqMask intrBit, OSIrqFunction function);
|
||||
OSIrqFunction OS_GetIrqFunction(OSIrqMask intrBit);
|
||||
void OSi_EnterDmaCallback(u32 dmaNo, void (*callback) (void *), void *arg);
|
||||
|
||||
#endif //POKEDIAMOND_OS_INTERRUPT_H
|
||||
11
arm9/lib/include/OS_terminate_proc.h
Normal file
11
arm9/lib/include/OS_terminate_proc.h
Normal file
@@ -0,0 +1,11 @@
|
||||
//
|
||||
// Created by red031000 on 2020-05-07.
|
||||
//
|
||||
|
||||
#ifndef POKEDIAMOND_OS_TERMINATE_PROC_H
|
||||
#define POKEDIAMOND_OS_TERMINATE_PROC_H
|
||||
|
||||
void OS_Terminate();
|
||||
void OS_Halt();
|
||||
|
||||
#endif //POKEDIAMOND_OS_TERMINATE_PROC_H
|
||||
@@ -7,6 +7,14 @@
|
||||
|
||||
typedef struct _OSThread OSThread;
|
||||
|
||||
struct _OSThreadQueue
|
||||
{
|
||||
OSThread *head;
|
||||
OSThread *tail;
|
||||
};
|
||||
|
||||
typedef struct _OSThreadQueue OSThreadQueue;
|
||||
|
||||
typedef struct OSThreadInfo {
|
||||
u16 isNeedRescheduling;
|
||||
u16 irqDepth;
|
||||
@@ -20,4 +28,9 @@ struct _OSThread
|
||||
u8 padding[0x80]; //todo: not the correct size but idfk
|
||||
};
|
||||
|
||||
static inline void OS_InitThreadQueue(OSThreadQueue * queue)
|
||||
{
|
||||
queue->head = queue->tail = NULL;
|
||||
}
|
||||
|
||||
#endif //POKEDIAMOND_OS_THREAD_H
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
|
||||
extern void PXI_Init();
|
||||
extern void OS_InitLock();
|
||||
extern void OS_InitIrqTable();
|
||||
extern void OS_SetIrqStackChecker();
|
||||
extern void OS_InitException();
|
||||
extern void MI_Init();
|
||||
|
||||
79
arm9/lib/src/OS_interrupt.c
Normal file
79
arm9/lib/src/OS_interrupt.c
Normal file
@@ -0,0 +1,79 @@
|
||||
//
|
||||
// Created by red031000 on 2020-05-07.
|
||||
//
|
||||
|
||||
#include "consts.h"
|
||||
#include "function_target.h"
|
||||
#include "OS_interrupt.h"
|
||||
#include "OS_thread.h"
|
||||
|
||||
#pragma optimize_for_size on
|
||||
|
||||
extern OSThreadQueue OSi_IrqThreadQueue;
|
||||
extern OSIrqMask OS_EnableIrqMask(OSIrqMask intr);
|
||||
|
||||
ARM_FUNC void OS_InitIrqTable() {
|
||||
OS_InitThreadQueue(&OSi_IrqThreadQueue);
|
||||
}
|
||||
|
||||
ARM_FUNC void OS_SetIrqFunction(OSIrqMask intrBit, OSIrqFunction function) {
|
||||
s32 i;
|
||||
OSIrqCallbackInfo *info;
|
||||
|
||||
for (i = 0; i < 0x16; i++) {
|
||||
if (intrBit & 1) {
|
||||
info = NULL;
|
||||
|
||||
if (8 <= i && i <= 11) {
|
||||
info = &OSi_IrqCallbackInfo[i - 8];
|
||||
}
|
||||
else if (3 <= i && i <= 6) {
|
||||
info = &OSi_IrqCallbackInfo[i - 3 + 4];
|
||||
}
|
||||
else {
|
||||
OS_IRQTable[i] = function;
|
||||
}
|
||||
|
||||
if (info) {
|
||||
info->func = (void (*)(void *))function;
|
||||
info->arg = 0;
|
||||
info->enable = TRUE;
|
||||
}
|
||||
}
|
||||
intrBit >>= 1;
|
||||
}
|
||||
}
|
||||
|
||||
ARM_FUNC OSIrqFunction OS_GetIrqFunction(OSIrqMask intrBit) {
|
||||
s32 i = 0;
|
||||
OSIrqFunction *funcPtr = &OS_IRQTable[0];
|
||||
|
||||
do {
|
||||
if (intrBit & 1)
|
||||
{
|
||||
if (8 <= i && i <= 11) {
|
||||
i = i - 8;
|
||||
return (void (*)(void))OSi_IrqCallbackInfo[i].func;
|
||||
}
|
||||
else if (3 <= i && i <= 6) {
|
||||
i++;
|
||||
return (void (*)(void))OSi_IrqCallbackInfo[i].func;
|
||||
}
|
||||
|
||||
return *funcPtr;
|
||||
}
|
||||
intrBit >>= 1;
|
||||
funcPtr++;
|
||||
i++;
|
||||
} while (i < 0x16);
|
||||
return 0;
|
||||
}
|
||||
|
||||
ARM_FUNC void OSi_EnterDmaCallback(u32 dmaNo, void (*callback) (void *), void *arg)
|
||||
{
|
||||
OSIrqMask mask = 1UL << (dmaNo + 8);
|
||||
OSi_IrqCallbackInfo[dmaNo].func = callback;
|
||||
OSi_IrqCallbackInfo[dmaNo].arg = arg;
|
||||
|
||||
OSi_IrqCallbackInfo[dmaNo].enable = OS_EnableIrqMask(mask) & mask;
|
||||
}
|
||||
@@ -5,20 +5,20 @@
|
||||
#include "function_target.h"
|
||||
#include "OS_reset.h"
|
||||
#include "MB_mb.h"
|
||||
#include "OS_terminate_proc.h"
|
||||
|
||||
extern u16 OSi_IsInitReset;
|
||||
extern vu16 OSi_IsResetOccurred;
|
||||
extern void PXI_Init();
|
||||
extern u32 PXI_IsCallbackReady(u32 param1, u32 param2);
|
||||
extern void PXI_SetFifoRecvCallback(u32 param1, void* callback);
|
||||
extern void OS_Terminate();
|
||||
extern u32 PXI_SendWordByFifo(u32 param1, u32 data, u32 param2);
|
||||
extern void CARD_LockRom(u16 lockId);
|
||||
extern u32 OS_GetLockID();
|
||||
extern void MI_StopDma(u32 dma);
|
||||
extern void OS_SetIrqMask(u32 mask);
|
||||
extern void OS_ResetRequestIrqMask(u32 mask);
|
||||
extern void OSi_DoResetSystem();
|
||||
extern void OSi_DoResetSystem(); //in itcm, should technically be in this file
|
||||
|
||||
ARM_FUNC void OS_InitReset() {
|
||||
if (OSi_IsInitReset) {
|
||||
|
||||
21
arm9/lib/src/OS_terminate_proc.c
Normal file
21
arm9/lib/src/OS_terminate_proc.c
Normal file
@@ -0,0 +1,21 @@
|
||||
//
|
||||
// Created by red031000 on 2020-05-07.
|
||||
//
|
||||
|
||||
#include "types.h"
|
||||
#include "OS_terminate_proc.h"
|
||||
#include "function_target.h"
|
||||
#include "OS_system.h"
|
||||
|
||||
ARM_FUNC void OS_Terminate() {
|
||||
while (TRUE) {
|
||||
(void)OS_DisableInterrupts();
|
||||
OS_Halt();
|
||||
}
|
||||
}
|
||||
|
||||
ARM_FUNC asm void OS_Halt() {
|
||||
mov r0, #0x0
|
||||
mcr p15, 0x0, r0, c7, c0, 0x4
|
||||
bx lr
|
||||
}
|
||||
Reference in New Issue
Block a user