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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
; =============================================================================
; 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_STDIN RB 1 ; $FF = console, else an open-file fd
DEF PROC_STDOUT RB 1 ; $FF = console, else an open-file fd
DEF PROC_PROG RB 1 ; program id currently running ($FF = none), for ps
DEF PROC_SIZE RB 0
DEF KILL_CODE EQU 137 ; exit status of a killed process (128 + SIGKILL)
DEF STD_CONSOLE EQU $FF
; -----------------------------------------------------------------------------
; 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_PUTC EQU 16 ; write a byte to stdout (E=byte)
DEF SYS_SETIN EQU 17 ; set current stdin fd (B=fd, $FF=console)
DEF SYS_SETOUT EQU 18 ; set current stdout fd (B=fd, $FF=console)
DEF SYS_LOOKUP EQU 19 ; program id for a command name (DE=name -> A=id/$FF)
DEF SYS_PS EQU 20 ; process table entry (B=slot, DE=buf3 -> A=1/0)
DEF SYS_PROGNAME EQU 21 ; program id -> name (B=id, DE=namebuf)
DEF SYS_MAX EQU 22
; SYS_KILL (9) is now implemented (B=pid -> A=0/$FF; pid 1 is immortal)
; (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
DEF PROG_PS EQU 16
DEF PROG_KILL EQU 17
DEF PROG_SPIN EQU 18
ENDC
|