HardOffで110円で手に入れたUP12でPC-8001とWindows 7がつながったのに気をよくて、XMODEMのシーケンスを試してみました。
XMODEMはコンピュータ間でシリアル通信を使いファイルの送受信をおこなうプロトコルで、1977年にWard Christensenにより8BitのCP/M上で開発されたようです。日本ではパソコン通信とともに80年代に入ってから普及しました。XMODEMが元祖で、いろいろな派生系が存在します。
Windows 7でターミナルはRLoginを使っているのですがRLoginにもXMODEMのサポートがありました。
Z80のアセンブラで受信のプログラムを書いてみました。シーケンスの確認で中身は無いです。
UARTRD EQU 20H
UARTRC EQU 21H
RTSHIG EQU 00010111B
RTSLOW EQU 00110111B
SOH EQU 01H
STX EQU 02H
EOT EQU 04H
ACK EQU 06H
NAK EQU 15H
CAN EQU 18H
PUT MACRO C
LD A, C
RST 18H
ENDM
ORG 6000H
START:
CALL INIT8251
L2:
LD A, NAK
CALL CHAR_OUT
CALL CHAR_IN
CP EOT
JP Z, L1
LD C, 131
L3:
CALL CHAR_IN
DEC C
JP NZ, L3
LD A, ACK
CALL CHAR_OUT
PUT '.'
JP L2
L1:
LD A, ACK
CALL CHAR_OUT
JP 05C66H
INIT8251:
XOR A
OUT (UARTRC), A
OUT (UARTRC), A
OUT (UARTRC), A
LD A, 01000000B
OUT (UARTRC), A
LD A, 01001110B
OUT (UARTRC), A
LD A, RTSLOW
OUT (UARTRC), A
;
; PC-8001の8251を外部RS232Cヘ
;
LD A, (0EA66h) ; ワークエリアから I/O 30hへ出力する情報を取得
AND A, 0CFh
OR A, 20h ; BS2 = ON
OUT (30h), A ; CMTから外部RS232Cへ切り替え
;
RET
;
; 8251から1文字入力
;
CHAR_IN:
IN A, (UARTRC)
AND A, 02h
JP Z, CHAR_IN
IN A, (UARTRD)
RET
;
; 8251へ1文字出力
;
CHAR_OUT:
PUSH AF
CHAR_OUT1:
IN A, (UARTRC)
AND A, 01h
JP Z, CHAR_OUT1
POP AF
OUT (UARTRD), A
RET
8Bit時代に作られたプロトコルなので、8Bitのアセンブラにしっくりきますね。
RLoginをcom 300 ビット/秒で接続してXMODEMアップロード状態にして、このプログラムを実行すると処理が行われ、終了します。
こちらのページを参考にしました。
ちなみに内蔵の8251はカセットインターフェースとの兼用で、割り込みを使っていません。拡張ユニット(PC-8011)の方の8251は割り込みを使っているようです。そのためか、外付けの8251の方はBASICでサポートがありますが、内蔵のほうはありません。
ボーレートはデフォルト300ですが、筐体の中のジャンパーで、4800まで変更可能です。