-
Notifications
You must be signed in to change notification settings - Fork 0
/
crt0.s
114 lines (103 loc) · 1.6 KB
/
crt0.s
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
.module crt0
.globl _main
.globl l__DATA
.globl s__DATA
.globl l__INITIALIZER
.globl s__INITIALIZED
.globl s__INITIALIZER
.area _HEADER (ABS)
.org 0x0100
init::
call gsinit
ld de,#argv
ld hl,#0x0080
ld a,(hl)
or a
jr z,param_count
inc hl
first_param:
ld a,(hl)
cp #0x0d
jr z,last_param
cp #0x20
jr nz,valid_param
inc hl
jr first_param
valid_param:
ex de,hl
ld (hl),e
inc hl
ld (hl),d
inc hl
ex de,hl
next_param:
inc hl
ld a,(hl)
cp #0x0d
jr z,last_param
cp #0x20
jr nz,next_param
xor a
ld (hl),a
inc hl
jr first_param
last_param:
xor a
ld (hl),a
param_count:
ex de,hl
ld de,#argv
or a
sbc hl,de
srl h
rr l
push de
push hl
call _main
pop af
pop af
_exit::
ld c,#0
call 5
argv: ; hold up to 64 parameters
.ds 128
.area _SLOT
.area _HOME
.area _CODE
.area _INITIALIZER
.area _GSINIT
.area _GSFINAL
.area _DATA
.area _INITIALIZED
.area _BSEG
.area _BSS
.area _HEAP
.area _GSINIT
gsinit::
; Default-initialized global variables.
ld bc, #l__DATA
ld a, b
or a, c
jr Z, zeroed_data
ld hl, #s__DATA
ld (hl), #0x00
dec bc
ld a, b
or a, c
jr Z, zeroed_data
ld e, l
ld d, h
inc de
ldir
zeroed_data:
; Explicitly initialized global variables.
ld bc, #l__INITIALIZER
ld a, b
or a, c
jr Z, gsinit_next
ld de, #s__INITIALIZED
ld hl, #s__INITIALIZER
ldir
gsinit_next:
.area _GSFINAL
ret