CPUと対話する感じのことをしたかったので、PICでアセンブリを書きました。
asmを書いたのはこれが初めてです。1から16まで足し上げた結果をPORTCに出力するコードです。実機での動作を(テスターで)確認できました。実にプリミティブ。
普通に書いたコードをベースに、さらに変なインクルードレスプログラミングをしてみました。コンピュータと触れ合えた気がします。まだ脳ではPIC16F1命令セットの実行はできませんが。
ORG 0を入れたり、ANSELをクリアしないと出力されなかったり、16F1ではバンク切り替えに新しいMOVLB命令を使う(1命令でバンク切り替えできる)などといった知見がまったくなかったので手探りでしたが、とても勉強になりました。実はMOVLBも直接使う必要がなくて、BANKSEL PORTCのように疑似命令を使うとその品種で当該レジスタのあるバンクに切り替えてくれます。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
__CONFIG 0x8007, 0xFFA4 | |
ORG 0 | |
RAMTOP | |
MOVLB 0x1 | |
MOVLW b'00010010' | |
MOVWF 0x99 | |
CLRF 0x8E | |
MOVLB 0x3 | |
CLRF 0x18E | |
MOVLB 0x0 | |
CLRF 0xE | |
CLRF 0x20 | |
CLRW | |
CALC | |
INCF 0x20 | |
ADDWF 0x20, 0 | |
MOVWF 0xE | |
BTFSS 0x20, 4 | |
GOTO CALC | |
LAST | |
GOTO LAST | |
END |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "p16f1579.inc" | |
; CONFIG1 | |
; __config 0xFFA4 | |
__CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOREN_ON & _CLKOUTEN_OFF | |
; CONFIG2 | |
; __config 0xDEFF | |
__CONFIG _CONFIG2, _WRT_OFF & _PPS1WAY_ON & _PLLEN_OFF & _STVREN_ON & _BORV_LO & _LPBOREN_OFF & _LVP_OFF | |
ORG 0 | |
RAMTOP | |
MOVLB 0x1 | |
MOVLW b'00010010' | |
MOVWF OSCCON | |
CLRF TRISC | |
MOVLB 0x3 | |
CLRF ANSELC | |
MOVLB 0x0 | |
CLRF PORTC | |
CLRF 0x20 | |
CLRW | |
CALC | |
INCF 0x20 | |
ADDWF 0x20, 0 | |
MOVWF PORTC | |
BTFSS 0x20, 4 | |
GOTO CALC | |
LAST | |
GOTO LAST | |
END |
アセンブルされて書き込まれたメモリ上のデータです。なお、1命令が14bitなので、たぶんそのままではバイナリエディタでうまく見られません。バイナリエディタでのうまい見方を知りたいです。
たった16命令でプログラムが完結するなんですごい。もうちょっと実用的なプログラムを書いてみたいですが、実用性ならCで書けばいい話なんですよね。しかし、せめて電卓的なものくらいは作ってみたいなぁ