aboutsummaryrefslogtreecommitdiffstats
path: root/include/gbos.inc
blob: 7c3f325fb76c52087953f656172d580cadf2caf8 (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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
; =============================================================================
; 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_GETB    EQU 12   ; read a byte from an open file  (B=fd -> A, CF=EOF)
DEF SYS_PUTB    EQU 13   ; append a byte to an open file  (B=fd, E=byte)
DEF SYS_LIST    EQU 14   ; list a directory slot          (B=slot, DE=namebuf)
DEF SYS_REMOVE  EQU 15   ; delete a file                  (DE=name)
DEF SYS_MAX     EQU 16
; (SYS_OPEN=4 / SYS_CLOSE=5 are now implemented by the filesystem)

; -----------------------------------------------------------------------------
; RAM filesystem (lives in WRAMX $D000-$DFFF, 4 KiB; fixed in DMG mode).
; 8 files x 512 bytes: name[8] (first byte 0 = free) + len[2] + data[502].
; -----------------------------------------------------------------------------
DEF FS_BASE      EQU $D000
DEF FS_MAX_FILES EQU 8
DEF FS_FILE_SIZE EQU 512
DEF FS_NAME      EQU 0
DEF FS_LEN       EQU 8
DEF FS_DATA      EQU 10
DEF FS_MAX_DATA  EQU 502

; open-file table (kernel WRAM0): inuse, slot, mode, pos(2)
DEF OF_MAX   EQU 4
DEF OF_INUSE EQU 0
DEF OF_SLOT  EQU 1
DEF OF_MODE  EQU 2
DEF OF_POS   EQU 3
DEF OF_SIZE  EQU 5

; -----------------------------------------------------------------------------
; 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
DEF PROG_CHELLO EQU 3   ; C programs (compiled with SDCC), see c/
DEF PROG_ECHO   EQU 4
DEF PROG_TRUE   EQU 5
DEF PROG_FALSE  EQU 6
DEF PROG_UNAME  EQU 7
DEF PROG_PID    EQU 8
DEF PROG_CAT    EQU 9
DEF PROG_WC     EQU 10
DEF PROG_HEAD   EQU 11
DEF PROG_ARGS   EQU 12
DEF PROG_LS     EQU 13
DEF PROG_SAVE   EQU 14
DEF PROG_RM     EQU 15

    ENDC