Fuzix-Compiler-Kitの6800用コンパイラ(5)(ベーシックマスター開発 その37)
ベーシックマスター用の最低限の定義をでっち上げて、エミュレーターでテストプログラムが動くようになりました。
表示プログラムのソースコード・解説は下記を参照してください。上記の例ではベーシックマスターの画面サイズ(横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); }
ディスカッション
コメント一覧
まだ、コメントがありません