-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstartup.xas
101 lines (91 loc) · 3.09 KB
/
startup.xas
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
;
; XCC-V Z80
; スタートアップルーチン
;
; "C:\akiz80\LIB\z80\STARTUP\STARTUP.XAS" にあるサンプルそのまま
;
; This code is provided under a CC0 Public Domain License.
; http://creativecommons.org/publicdomain/zero/1.0/
;
; 2024年12月11日 佐藤恭一 kyoutan.jpn.org
GLOBAL _STACK_END
;********************************************************
;* Startup Program for Z80 *
;********************************************************
;-------------------------------+
; Stack (RAM) + スタックセクションの定義
;-------------------------------+
_STACK sect stak
ds 300h ; スタックサイズ
; CP/MのCCPでセットされているスタックは7段(14byte)
_STACK_END:
;-------------------------------+
; init section (ROM) + 初期値格納用のセクションの定義
;-------------------------------+
_INIT_DATA sect comm
;-------------------------------+
; Control data (RAM) + ライブラリ用の変数の定義
;-------------------------------+
D_DATA sect comm
global _errno
_errno dw 0 ;for math lib エラー番号設定領域
; C言語の算術ライブラリで使用する
;=======================================+
; startup routine (ROM) +
;=======================================+
C_start sect code
_start:
ld HL,_STACK_END ;Set Stack Pointer スタックポインタの設定
ld SP,HL
;*** init PORT,TIMER,...etc
; :
; :
;================= clear BSS ==================== 初期値のない変数領域のクリア
extnal _BSS_TOP,_BSS_SIZE
ld A,0
ld DE,_BSS_TOP
ld HL,_BSS_SIZE
ld BC,0
or A
adc HL,BC
jr z,L110$
dec BC
L100$:
ld (DE),A
inc DE
or A
adc HL,BC
jr nz,L100$
L110$:
;================= init DATA ==================== 初期値のある変数の初期値データのコピー
extnal _DATA_TOP,_DATA_SIZE
ld HL,_INIT_DATA
ld DE,_DATA_TOP
ld BC,_DATA_SIZE
ld A,B
or C
jr z,L210$
L200$:
ldi
jp pe,L200$
L210$:
extnal _INIT_CPMSTDIO
call _INIT_CPMSTDIO ; 標準入出力初期化
;*** call main *** main 関数の起動
extnal _CALL_MAIN
call _CALL_MAIN ; コマンドライン引数をセットして main 関数を呼び出す
; 動作確認で文字を出力してみる
; ld C,09H ; CP/M 文字列出力
; ld DE,STR1$ ; 最後に '$' を付けるとローカルラベル
; call 0005H ; BDOS CALL
; extnal _main
; call _main ; main関数実行
; ld C,09H ; CP/M 文字列出力
; ld DE,STR2$
; call 0005H ; BDOS CALL
jp 0 ; CP/M ウォームスタート
;STR1$: db 'call main',0DH,0AH,'$' ; 0DH:CR 0AH:LF
;STR2$: db 0DH,0AH,'end main$'
;300$:
; jr 300$
end _start