mirror of
https://github.com/pret/pokediamond.git
synced 2026-09-12 02:56:42 -05:00
partial OS_interrupt
This commit is contained in:
@@ -144,6 +144,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)
|
||||
|
||||
@@ -139,101 +139,3 @@ OSi_EnterDmaCallback: ; 0x020C9F14
|
||||
_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
|
||||
@@ -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();
|
||||
|
||||
28
arm9/lib/include/OS_interrupt.h
Normal file
28
arm9/lib/include/OS_interrupt.h
Normal file
@@ -0,0 +1,28 @@
|
||||
//
|
||||
// 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);
|
||||
|
||||
#endif //POKEDIAMOND_OS_INTERRUPT_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();
|
||||
|
||||
69
arm9/lib/src/OS_interrupt.c
Normal file
69
arm9/lib/src/OS_interrupt.c
Normal file
@@ -0,0 +1,69 @@
|
||||
//
|
||||
// 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;
|
||||
|
||||
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;
|
||||
}
|
||||
@@ -18,7 +18,7 @@ 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) {
|
||||
|
||||
Reference in New Issue
Block a user