CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

MPSCテストプログラム

uPD72001のシリアル送信部分をチェックします

まず大量にあるレジスタの設定。ここではキャラクタベースの調歩同期通信という
MPSCの機能のほんの一部しか使わないわけです。

ソースを入力してMASMアセンブル

			.386
				
 = 000C		COM_B	equ	0ch
 = 0008		PORT_B	equ	08h
 = 0020		DIO	equ	20h
				
 0000		code	segment
		assume	cs:code,ds:code,es:code,ss:code
				
 0000		org	0000h
				
				
 0000  B0 05	SIOINI:    MOV AL,05H	;18h
 0002  E6 0C		OUT COM_B,AL 	;チャンネルBのリセット [CR0B]
 0004  90			NOP ;WAIT
 0005  90			NOP
				
		;****** 割込みモードの設定 [CR2B]
 0006  B0 40		MOV AL,040H 	;02h ポインタ=2
 0008  E6 0C		OUT COM_B,AL
 000A  B0 00		MOV AL,000H 	;00h ノンベクタ,固定ベクタ,TypeA-1
 000C  E6 0C		OUT COM_B,AL 	;TxA>RxB,Both_INT
				
		;****** 調歩同期モードの設定 [CR4B]
 000E  B0 80		MOV AL,080H 	;04h ポインタ=4
 0010  E6 0C		OUT COM_B,AL
 0012  B0 88		MOV AL,088H 	;44h ×16,ストップBit=1
 0014  E6 0C		OUT COM_B,AL 	;パリティー無し
			
		;****** E/S割込みの設定 [CR11B]
 0016  B0 64		MOV AL,064H 	;0bh ポインタ=11
 0018  E6 0C		OUT COM_B,AL
 001A  B0 00		MOV AL,000H 	;00h 全てのE/S割込み禁止
 001C  E6 0C		OUT COM_B,AL
				
		;****** 受信ボーレート設定 [CR12B]
 001E  B0 84		MOV AL,084H 	;0ch ポインタ=12
 0020  E6 0C		OUT COM_B,AL
 0022  B0 20		MOV AL,020H 	;01h RxBRG時定数の設定
 0024  E6 0C		OUT COM_B,AL
 0026  B0 01		MOV AL,001H 	;10h 9600BPS時=16(010H)
 0028  E6 0C		OUT COM_B,AL 	;Lowバイトをセット
 002A  B0 00		MOV AL,000H	;00h
 002C  E6 0C		OUT COM_B,AL 	;Highバイトをセット
 002E  E4 0C		IN AL,COM_B	;ダミーリード
			
		;****** 送信ボーレート設定 [CR12B]
 0030  B0 84		MOV AL,084H 	;0ch ポインタ=12
 0032  E6 0C		OUT COM_B,AL
 0034  B0 40		MOV AL,040H 	;02h TxBRG時定数の設定
 0036  E6 0C		OUT COM_B,AL

 0038  B0 01		MOV AL,001H 	;10h 9600BPS時=16(010H)
 003A  E6 0C		OUT COM_B,AL 	;Lowバイトをセット
 003C  B0 00		MOV AL,000H	;00h
 003E  E6 0C		OUT COM_B,AL 	;Highバイトをセット
 0040  E4 0C		IN AL,COM_B 	;ダミーリード
				
		;****** 送受信用クロック源の選択 [CR15B]
 0042  B0 E4		MOV AL,0e4H 	;0fh ポインタ=15
 0044  E6 0C		OUT COM_B,AL
 0046  B0 C9		MOV AL,0c9H 	;56h BRG Clockを選択
 0048  E6 0C		OUT COM_B,AL
				
		;****** ボーレートイネーブル、テストモードの選択 [CR14B]
 004A  B0 C4		MOV AL,0c4H 	;0eh ポインタ=14
 004C  E6 0C		OUT COM_B,AL
 004E  B0 E0		MOV AL,0e0H 	;07h BRG源にSystem Clockを選択
 0050  E6 0C		OUT COM_B,AL 	;Rx,Tx BRGイネーブル
				
		;****** 受信制御レジスタの設定 [CR3B]
 0052  B0 60		MOV AL,060H 	;03h ポインタ=3
 0054  E6 0C		OUT COM_B,AL
 0056  B0 38		MOV AL,038H 	;c1h 8Bitキャラクタ,Auto_Enable禁止
 0058  E6 0C		OUT COM_B,AL 	;受信Enable
				
		;****** 送信制御レジスタの設定 [CR5B]
 005A  B0 A0		MOV AL,0a0H 	;05h ポインタ=5
 005C  E6 0C		OUT COM_B,AL
 005E  B0 5E		MOV AL,5eH 	;0eah 8Bitキャラクタ,DTR=RTS=0
 0060  E6 0C		OUT COM_B,AL 	;送信Enable
				
		;****** 送受信割込みのイネーブル [CR1B]
 0062  B0 20		MOV AL,020H 	;01h ポインタ=1
 0064  E6 0C		OUT COM_B,AL
 0066  B0 41		MOV AL,041H 	;12h All RxINT-1 Enable
 0068  E6 0C		OUT COM_B,AL 	;TxINT Enable
				
				
		;******	LOOP *****************************
 006A  B0 00	WAIT0:	MOV AL,00H 	;00h ポインタ=0
 006C  E6 0C		OUT COM_B,AL
 006E  E4 0C		IN AL,COM_B	;SR0
 0070  24 80		AND AL,80H	           ;04h 送信バッファエンプティチェック
 0072  74 F6		JZ WAIT0
 0074  8A C3		MOV AL,BL
 0076  E6 08		OUT PORT_B,AL	;送信バッファセット
 0078  E6 20		OUT DIO,AL	           ;パラレルLED出力
 007A  FE C3		INC BL
 007C  EB EC		JMP WAIT0
					
 007E			code	ends
			end

出力されたリストファイルからコード部分を抜き出して4列に並び替え。
この1列を1個のROMに焼きます

//ROM0データ:
B0 90 E6 E6 E6 E6 E6 E6 E6 E6 E6 E6 B0 B0 B0 B0
E4 E6 E6 E6 E6 E6 E6 E6 E6 E6 E6 E6 24 8A E6 EB

//ROM1データ:
05 90 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 84 40 01 00
0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 80 C3 20 EC

//ROM2データ:
E6 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 E4 E6 E6 E6 E6
B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 E4 74 E6 FE 00

//ROM3データ:
0C 40 00 80 88 64 00 84 20 01 00 0C 0C 0C 0C 0C
E4 C9 C4 E0 60 38 A0 5E 20 41 00 0C F6 08 C3 00