オリジナル
SDCCのZ80用のcrt0.sには、Z80-COREでの使用時に障害となるいくつかの記述が見て取れます。
SDCCで作成されたコードは、それ単体でROMに書き込んで実行することを想定しているためだと思われます。
- ゼロページのリセットコードを含み、RST8-RST38までのエントリが設定されている。
- プログラムの初期化ルーチンが0100Hから配置されている。
- スタックがメモリの最高位FFFFHに設定される。
これらの設定は、Z80-COREのモニタの占有域と重複しているため、この設定でコンパイルされたプログラムは、Z80-COREのモニタ下で稼働させることができません。
そこで、上記の問題を取り除いたZ80-COREへの対応版のcrt0.sを新たに作成する必要があります。
;--------------------------------------------------------------------------
; crt0.s - Generic crt0.s for a Z80
;
; Copyright (C) 2000, Michael Hope
;
; This library is free software; you can redistribute it and/or modify it
; under the terms of the GNU General Public License as published by the
; Free Software Foundation; either version 2, or (at your option) any
; later version.
;
; This library is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this library; see the file COPYING. If not, write to the
; Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
; MA 02110-1301, USA.
;
; As a special exception, if you link this library with other files,
; some of which are compiled with SDCC, to produce an executable,
; this library does not by itself cause the resulting executable to
; be covered by the GNU General Public License. This exception does
; not however invalidate any other reasons why the executable file
; might be covered by the GNU General Public License.
;--------------------------------------------------------------------------
.module crt0
.globl _main
.area _HEADER (ABS)
; .area _HEADER
.org 0x4000
init::
;; Set stack pointer directly above top of memory.
; ld sp,#0xff00
;; Initialise global variables
call gsinit
call _main
jp _exit
;; Ordering of segments for the linker.
.area _HOME
.area _CODE
.area _INITIALIZER
.area _GSINIT
.area _GSFINAL
.area _DATA
.area _INITIALIZED
.area _BSEG
.area _BSS
.area _HEAP
.area _CODE
_exit::
;; Exit - special code to the emulator
ld a,#0
rst 0x08
1$:
halt
jr 1$
.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
.area _CABS(ABS)
.org 0xffd0
.dw init
コンパイル
SDCC -g ...