Fuzix-Compiler-Kitの6800用コンパイラ(5)(ベーシックマスター開発 その37)

2024/11/06BASICMASTER, 昔のパソコン

ベーシックマスター用の最低限の定義をでっち上げて、エミュレーターでテストプログラムが動くようになりました。


表示プログラムのソースコード・解説は下記を参照してください。上記の例ではベーシックマスターの画面サイズ(横32列・縦24行)に合わせて、表示を調整してあります。

起動用ルーチン

Fuzix-Compiler-Kit の testcrt0_6800.s を差し替えます。support6800/dp.s にもzero pageの設定があるので、同様に修正します。


$ cat ../testcrt0_basicmaster.s
.setcpu 6800
	.zp
		.org	$00e0
	.export hireg
	.export zero
	.export	one
;
hireg:	.word	0
zero:	.word	0	; overlaps 1
one:	.word	0
;
		.org	$00e6
	.export tmp
	.export tmp1
	.export tmp2
	.export tmp3
	.export tmp4
	.export tmp5
;
tmp:	.word	0
tmp1:	.word	0
tmp2:	.word	0
tmp3:	.word	0
tmp4:	.word	0
tmp5:	.word	0
savesp:	.word	0


	.code ; (at 0x4000)
start:
	sts	@savesp
	lds #$8FFF
	clrb
	clra
	stab @zero+1
	staa @zero
	incb
	stab @one+1
	staa @one
	psha	; dummy argc
	pshb
	psha	; dummy argv
	pshb
	jsr	_main
	; return and exit (value is in XA)
	lds	@savesp
	rts

	.export _printchar
	.export _putch
_putch:
_printchar:
	tsx
	ldaa 3,x
	jsr	$F015
	ldx 0,x
	ins
	ins
	ins
	ins
	jmp 0,x


コンパイルと実行

コンパイルは下記の手順。実行開始アドレスは $4000 にしてあります。変更する場合は、testcrt0_basicmaster.s と、下記のld6800のオプションを修正。


fcc -O3 -m6800 -c 9001-8queen.c
ld6800 -v -b -s -C0x4000 -Z0 -m 9001-8queen.map -o $b ../testcrt0_basicmaster.o 9001-8queen.o /opt/fcc/lib/6800/lib6800.a  /opt/fcc/lib/6800/libc.a
./bmcut 9001-8queen 9001-8queen.bin
objcopy -I binary -O ihex --adjust-vma=0x4000 9001-8queen.bin 9001-8queen.hex
objcopy -I binary -O srec --adjust-vma=0x4000 9001-8queen.bin 9001-8queen.mot


bmcutは先頭$4000バイトを削るプログラムです。ld6800が、0ページからプログラム先頭までを連続して出力するので、そこを削っています。


#include	<stdio.h>
#include	<stdlib.h>
#include	<sys/types.h>
#include	<sys/stat.h>
#include	<fcntl.h>
#include	<unistd.h>

int
main(int argc, char **argv)
{
	if(argc<2) {
		fprintf(stderr,"usage: %s fuzix-binary bm-binary.bin\n",argv[0]);
		exit(1);
	}
	char	*filename = argv[1];
	int		fd = open(filename,O_RDONLY);
	if(fd<0){
		perror(NULL);
		fprintf(stderr,"can't open %s\n",filename);
		exit(1);
	}
	struct	stat	stbuf;
	if(fstat(fd,&stbuf)<0) {
		perror("can't stat");
		exit(1);
	}
	long filesize = stbuf.st_size;
	unsigned char	*buffer;
	if((buffer=(unsigned char *)malloc(filesize+1))==NULL){
		perror("can't malloc");
		exit(1);
	}
	read(fd,buffer,filesize);
	buffer[filesize]=0;
	close(fd);

	char	*filename2 = argv[2];
	int		fd2 = open(filename2,O_RDWR|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP);
	if(fd2<0){
		perror(NULL);
		fprintf(stderr,"can't open %s\n",filename2);
		exit(1);
	}
	write(fd2,buffer+0x4000,filesize-0x4000);
	close(fd2);
	
	exit(0);
}