東大版Palo Alto Tiny BASICをamd64環境に移植してみようと思います。基本方針としては、オリジナル版の仕様を再現することに主眼をおき、C言語で書き直すとか、整数16ビットを拡張するなどはおこなわないつもりです。プログラムのデータ構造やサブルーチン構成も変更しないつもりですが、i8080とamd64の違いでやむを得ない場合は、変更します。
またオリジナル版は、SDK-80のシリアルポートにASR-33が接続された環境を想定していると思われます。amd64環境としては、WSL2のUbuntuとかFreeBSD/amd64などを考えていて、少なくともOSの管理下で動作するようにします。まずは入出力ルーチンを移植してみようと思います。
オリジナル版の出力ルーチンは、次のようになっています。
PUT: PUSH PSW ;PUT CHARACTER IN A REG
LDA OMASK
ORA A
JNZ TTYO0
POP PSW
RET
TTYO0: IN OFLG
ANI OMSK
JZ TTYO0
POP PSW
OUT OTTY
CPI 0DH
RNZ
MVI A,0AH
CALL PUT
MVI A,0DH
RET
Geminiの助けを借りながら、オリジナルと同じ動きになるような出力ルーチンを書いてみました。動作確認のため「Hello World」を出力させてみましたが、うまくいっているようです。
# as put.s -o put.o
# ld put.o -o put
# ./put
.intel_syntax noprefix
.global _start
CR = 0x0D
LF = 0x0A
SYS_WRITE = 1
STDOUT = 1
_start: lea rbx,[rip+msg]
loop: mov al,[rbx]
cmp al,0
je done
call put
inc rbx
jmp loop
done:
# プログラム終了 (sys_exit = 60)
mov rax, 60 # システムコール番号 (sys_exit)
xor rdi, rdi # 第1引数: 終了ステータスコード (0)
syscall # Linuxカーネル呼び出し
put: cmp byte ptr [rip+omask],0
jne ttyo0
ret
ttyo0: cmp al,CR
jne ttyo1
call ttyo1
push rax
mov al,LF
call ttyo1
pop rax
ret
ttyo1: push rax
mov rax,SYS_WRITE
mov rdi,STDOUT
lea rsi,[rsp]
mov rdx,1
syscall
pop rax
ret
.data
omask: .byte 1 # 出力フラグ(0: 出力抑制 / 0以外: 出力許可)
.section .rodata
msg: .asciz "Hello World\r"
0 件のコメント:
コメントを投稿