blob: f398c12638afb2eee8d4823e2d68f310d5fb5fba (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
; =============================================================================
; gbos.inc - core constants, memory map, PCB layout, syscall numbers
; Target: Game Boy Color, MBC5 + RAM + BATTERY
; =============================================================================
IF !DEF(GBOS_INC)
DEF GBOS_INC EQU 1
; -----------------------------------------------------------------------------
; Hardware registers we touch (subset; full defs would come from hardware.inc)
; -----------------------------------------------------------------------------
DEF rIF EQU $FF0F ; interrupt flags
DEF rIE EQU $FFFF ; interrupt enable
DEF rSVBK EQU $FF70 ; CGB WRAM bank select ($D000-$DFFF): 1..7
DEF rKEY1 EQU $FF4D ; CGB speed switch
DEF rSB EQU $FF01 ; serial data
DEF rSC EQU $FF02 ; serial control
DEF rLCDC EQU $FF40
DEF rSTAT EQU $FF41
DEF rLY EQU $FF44
; -----------------------------------------------------------------------------
; MBC5 mapper register addresses (writes to ROM space hit the mapper)
; -----------------------------------------------------------------------------
DEF MBC5_RAM_ENABLE EQU $0000 ; write $0A to enable cart RAM
DEF MBC5_ROMB_LO EQU $2000 ; ROM bank bits 0..7
DEF MBC5_ROMB_HI EQU $3000 ; ROM bank bit 8
DEF MBC5_RAMB EQU $4000 ; RAM bank bits 0..3 ($A000-$BFFF)
; -----------------------------------------------------------------------------
; Memory map (the gbos plan)
; $0000-$3FFF ROM0 kernel core (fixed, always mapped)
; $4000-$7FFF ROMX current task TEXT (read-only program code)
; $8000-$9FFF VRAM graphics
; $A000-$BFFF SRAM current task DATA/BSS/HEAP/STACK (MBC5 RAM bank)
; $C000-$CFFF WRAM0 kernel globals + kernel stack (never swapped)
; $D000-$DFFF WRAMX per-process u-area (SVBK bank)
; $FF80-$FFFE HRAM bank-switch trampoline + context switch
; -----------------------------------------------------------------------------
DEF TASK_RAM_BASE EQU $A000
DEF TASK_RAM_TOP EQU $C000 ; one past end of the 8 KiB window
DEF TASK_STACK_TOP EQU $BFFF ; task stacks grow down from here
DEF KSTACK_TOP EQU $D000 ; kernel stack top (grows down into WRAM0)
; -----------------------------------------------------------------------------
; Process table
; -----------------------------------------------------------------------------
DEF MAX_PROCS EQU 8
DEF NUM_RAM_BANKS EQU 4 ; MBC5 cart RAM banks available (-r 3 = 32 KiB)
DEF KSTACK_TOP2 EQU $D000 ; kernel stack top reused for syscalls (fork)
DEF INIT_PID EQU 1 ; pid of the init task (orphan reaper)
; process states
DEF PS_FREE EQU 0
DEF PS_READY EQU 1
DEF PS_RUN EQU 2
DEF PS_BLOCKED EQU 3
DEF PS_ZOMBIE EQU 4
; PCB (process control block) field offsets
RSRESET
DEF PROC_STATE RB 1 ; PS_*
DEF PROC_PID RB 1
DEF PROC_SP RW 1 ; saved stack pointer (into task's RAM bank)
DEF PROC_ROMB RW 1 ; text ROM bank (16-bit; MBC5 up to 511)
DEF PROC_RAMB RB 1 ; data/stack cart-RAM bank
DEF PROC_WRAMB RB 1 ; u-area SVBK bank (1..7)
DEF PROC_PARENT RB 1
DEF PROC_EXIT RB 1 ; exit code (valid when PS_ZOMBIE)
DEF PROC_SIZE RB 0
; -----------------------------------------------------------------------------
; Syscall numbers (passed in C; args in DE/HL/B per call, ret in A)
; -----------------------------------------------------------------------------
DEF SYS_EXIT EQU 0
DEF SYS_FORK EQU 1
DEF SYS_READ EQU 2
DEF SYS_WRITE EQU 3
DEF SYS_OPEN EQU 4
DEF SYS_CLOSE EQU 5
DEF SYS_EXEC EQU 6
DEF SYS_WAIT EQU 7
DEF SYS_GETPID EQU 8
DEF SYS_KILL EQU 9
DEF SYS_BRK EQU 10
DEF SYS_YIELD EQU 11
DEF SYS_MAX EQU 12
; -----------------------------------------------------------------------------
; Program table indices (see programs.asm). exec() takes one of these in B.
; -----------------------------------------------------------------------------
DEF PROG_WORKER EQU 0
DEF PROG_SH EQU 1
DEF PROG_HELLO EQU 2
ENDC
|