
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
Linuxに限定しているのでしょうか?
Windowsベースなら下記のものが適当かと思います。
コンパイラ及びアセンブラが付属しているし、7セグも8ケタ分搭載されています。
http://www.alles.or.jp/~thisida/index.htm
※「ND80ZIII」が良いかと。
秋月通商等にもZ80のキットはありますがPIOのポートが少ないので別途8255あたりを2個ほど追加する必要があります。
※7セグを高速に切り替える等の制御を行うならなら16ビットの出力があれば足りますが。
↑ 上記の意味が判らない様であれば上記の基板をお勧めします。
質問者様の回路設計・プログラミングのレベルが不明なので無難な選択をしてます。
どうしてもLinux上で開発が行いたいのであれば基板はこのままでフリーのアセンブラ等を利用すればよいかと思います。
この回答への補足
回答NO.1のnotnotさんのおっしゃるとおりでLINUX上でプログラムを作成したいということです。
自分が説明不足で申し訳ございません。
説明不足でわざわざきとうしてくださったのに申し訳ございません。
No1のnotnotさんのお礼の続きです
SUB_XY:PUSHAF
PUSHBC
PUSHHL
LDBC,(YL)
LDHL,(XL)
ANDA
SBCHL,BC
LD(XL),HL
LDA,(XH)
CP28H
JPP,OVERFLOW
POPAF
POPBC
POPHL
RET
MUL_XY:PUSHAF
PUSHBC
PUSHDE
PUSHHL
LDDE,(XL)
LDBC,(YL)
LDHL,000H
LDA,00FH
SLAC
RLB
JPC,MUL_2
MUL_1:SLAL
RLH
JPC,OVERFLOW
DECA
JPZ,MUL_3
SLAC
RLB
JPC,MUL_2
JPMUL_1
MUL_2:ADDHL,DE
JPMUL_1
MUL_3:SLAC
RLB
JPC,MUL_4
LD(XL),HL
POPAF
POPBC
POPDE
POPHL
RET
MUL_4:ADDHL,DE
LD(XL),HL
POPAF
POPBC
POPDE
POPHL
RET
DIV_XY:PUSHAF
PUSHBC
PUSHDE
PUSHHL
LDA,(YL)
CP000H
JPNZ,DIV_0
LDA,(YH)
CP000H
JPNZ,DIV_0
JPOVERFLOW
DIV_0:LDBC,0000H
LDA,10H
DIV_1:LDHL,(YL)
SRAH
RRL
RRB
RRC
LD(YL),HL
DECH
INCH
JPNZ,DIV_2
DECL
INCL
JPNZ,DIV_2
LDHL,(XL)
ANDA
SBCHL,BC
JPC,DIV_2
LD(XL),HL
SCF
RLE
RLD
DECA
JPZ,DIV_E
JPDIV_1
DIV_2:ANDA
RLE
RLD
DECA
JPZ,DIV_E
JPDIV_1
DIV_E:LDA,(XL)
LD(YL),A
LDA,(XH)
LD(YH),A
LD(XL),DE
POPAF
POPBC
POPDE
POPHL
RET
DEC2BIN:
PUSHAF
PUSHBC
PUSHDE
PUSHHL
LDA,000H
LD(ZL),A
LD(ZH),A
LDA,(LED_1)
LD(XL),A
LDA,000H
LD(XH),A
LDBC,03E8H
LD(YL),BC
CALLMUL_XY
CALLADD_Z
LDA,(LED_2)
LD(XL),A
LDA,000H
LD(XH),A
LDBC,0064H
LD(YL),BC
CALLMUL_XY
CALLADD_Z
LDA,(LED_3)
LD(XL),A
LDA,000H
LD(XH),A
LDBC,000AH
LD(YL),BC
CALLMUL_XY
CALLADD_Z
LDA,(LED_4)
LD(XL),A
LDA,000H
LD(XH),A
CALLADD_Z
LDHL,(ZL)
LD(XL),HL
POPAF
POPBC
POPDE
POPHL
RET
BIN2DEC:
PUSHAF
PUSHBC
PUSHDE
PUSHHL
LDBC,03E8H
LD(YL),BC
CALLDIV_XY
LDA,(XH)
CP001H
JPP,OVERFLOW
LDA,(XL)
CP00AH
JPP,OVERFLOW
LD(LED_1),A
LDA,(YL)
LD(XL),A
LDA,(YH)
LD(XH),A
LDBC,0064H
LD(YL),BC
CALLDIV_XY
LDA,(XH)
CP001H
JPP,OVERFLOW
LDA,(XL)
CP00AH
JPP,OVERFLOW
LD(LED_2),A
LDA,(YL)
LD(XL),A
LDA,(YH)
LD(XH),A
LDBC,000AH
LD(YL),BC
CALLDIV_XY
LDA,(XH)
CP001H
JPP,OVERFLOW
LDA,(XL)
CP00AH
JPP,OVERFLOW
LD(LED_3),A
LDA,(YL)
LD(LED_4),A
POPAF
POPBC
POPDE
POPHL
RET
LED_CLR:
PUSHAF
LDA,000H
LD(LED_1),A
LD(LED_2),A
LD(LED_3),A
LD(LED_4),A
POPAF
RET
OVERFLOW:
LDA,0FFH
LD(LED_1),A
LD(LED_2),A
LD(LED_3),A
LD(LED_4),A
CALLKEY_IN
CP00AH
JPZ,INIT
JPOVERFLOW
END
という風に書いてみたものの、コンパイルが一応通りますが
まったく動かないためにどこを修正すればよいか分からず、
(特にメインルーチン)今回の質問にいたったわけでございます。
なのでわざわざ答えてくださってどうもありがとうございます。
No.1
- 回答日時:
もうすこし具体的に書かないと何をやりたいのかさっぱりです。
出てくるキーワードから予想して書いてみると、
Z80と7segLEDとキーを搭載したワンボードマイコンか何かがあって、そのプログラムをLinuxで開発したい
ということであれば、質問は、「Linux上で動くZ80クロスアセンブラの入手先を教えてください」ということでしょうか?
この回答への補足
自分が説明不足で申し訳ございません。
notnotさんのおっしゃるとおりでLINUX上でプログラムを作成したいということです。
4個のLEDに数値を順次表示させるプログラム
PIO_ADEQU01CHPIO_ADと01CHは等しいとする
PIO_ACEQU01DHPIO_ACと01DHは等しいとする
ORG0000H以下のプログラムを0000H番地以降に格納する
LDA,0CFH数値0CFHをAレジスタへ呼び出す
OUT(PIO_AC),AAレジスタの値をPIO_ACに出力する
LDA,000H数値000HをAレジスタへ呼び出す
OUT(PIO_AC),AAレジスタの値をPIO_ACに出力する
LDA,007H数値007HをAレジスタへ呼び出す
OUT(PIO_AC),AAレジスタの値をPIO_ACに出力する
LOOP:LDA,003H数値003HをAレジスタへ呼び出す
OUT(PIO_AD),AAレジスタの値をPIO_ADに出力する
LDHL,8000H 8000HをHLレジスタへ呼び出す
LDDE,8000H 8000HをHLレジスタへ呼び出す
LDBC,0200H 0200HをHLレジスタへ呼び出す
LDIRレジスタHL、DB、BCの内容は破壊される
LDA,014H数値014HをAレジスタへ呼び出す
OUT(PIO_AD),AAレジスタの値をPIO_ADに出力する
LDHL,8000H 8000HをHLレジスタへ呼び出す
LDDE,8000H 8000HをDEレジスタへ呼び出す
LDBC,0200H 0200HをBCレジスタへ呼び出す
LDIRレジスタHL、DB、BCの内容は破壊される
LDA,025H数値025HをAレジスタへ呼び出す
OUT(PIO_AD),AAレジスタの値をPIO_ADに出力する
LDHL,8000H 8000HをHLレジスタへ呼び出す
LDDE,8000H 8000HをDEレジスタへ呼び出す
LDBC,0200H 0200HをBCレジスタへ呼び出す
LDIRレジスタHL、DB、BCの内容は破壊される
LDA,036H数値036HをAレジスタへ呼び出す
OUT(PIO_AD),AAレジスタの値をPIO_ADに出力する
LDHL,8000H 8000HをHLレジスタへ呼び出す
LDDE,8000H 8000HをDEレジスタへ呼び出す
LDBC,0200H0200HをBCレジスタへ呼び出す
LDIRレジスタHL、DB、BCの内容は破壊される
JPLOOPLOOPに戻る
HALTプログラム停止
END
キー入力プログラムの作成
16 個のキーの状態を知るには、4 回の試行が必要なことがわかる。
・(PB5 , PB4) = (0,0)と設定して、PB0~PB3 をチェック。
・(PB5 , PB4) = (0,1)と設定して、PB0~PB3 をチェック。
・(PB5 , PB4) = (1,0)と設定して、PB0~PB3 をチェック。
・(PB5 , PB4) = (1,1)と設定して、PB0~PB3 をチェック。
PB0~PB5 の情報により、どのキーが押されたのか判別できる
1.まず最初にPIOポートの初期化を行う
8行目~13行目: PIO Bポートの初期化を行なっている。
15行目~20行目: PIO Aポートの初期化を行なっている。
2.次に(PB5,PB4)のセットを行う
22行目:数値000Hが格納されたAレジスタに数値010Hを足す。これにより、(PB5,PB4)を(0,0)から(0,1)にセットされる。
23行目~24行目: Aレジスタに格納された数値010Hと030Hを論理積にかける。結果は010Hとなるので、この値をAレジスタに格納し、PIO_BDに出力する。
25行目~28行目:
SRLはレジスタの値を1/2倍する命令であるが、この処理によってメモリの内容を1bit右へシフトすることができる。ここではその処理を4回行なっているため、Aレジスタに格納されていた010Hは001Hとなる。
29行目~30行目:Aレジスタに格納された数値001Hと003Hを論理積にかける。結果は001Hとなるので、この値をAレジスタに格納し、またLD命令によりBレジスタに呼び出す。この値が(PB5,PB4)の設定値となる。
3.セットを行なった後、PB3~PB0の読み込みを行う
31行目: PIO_BDの入力ポートの内容を取り出し、Aレジスタに格納する。
32行目~40行目:一番右側のビット(PB0)から順に0であるか1であるかをチェックしていく。0であるビットが見つかり次第、SET1~4のうち指定された場所へジャンプする。PB0~PB3まで全て1だった場合はLOOP(18行目)まで戻って再度(PB5,PB4)をセットし直す。
4.PB0~PB5の情報をキーNo.に変換する
42行目~43行目:ここは1順目でSET1にジャンプした場合の処理である。26行目において格納したBレジスタの値(001H)を取り出してAレジスタに格納し、数値00CHと足し合わせ、演算結果00DHをAレジスタに格納する。
44行目~45行目:この値がPIO_ADに出力され、プログラム終了となる。SET2, SET3, SET4へジャンプした場合も同様に処理をする。
1: PIO_BDEQU01EH
2: PIO_BCEQU01FH
3: PIO_ADEQU01CH
4: PIO_ACEQU01DH
5:
6: ORG0000H
7:
8: LDA,0CFH
9: OUT(PIO_BC),A
10: LDA,00FH
11: OUT(PIO_BC),A
12: LDA,007H
13: OUT(PIO_BC),A
14:
15:LDA,0CFH
16: OUT(PIO_AC),A
17: LDA,000H
18:OUT(PIO_AC),A
19:LDA,007H
20: OUT(PIO_AC),A
21:
22: LOOP:ADDA,010H
23: AND030H
24: OUT(PIO_BD),A
25: SRLA
26: SRLA
27: SRLA
28: SRLA
29: AND003H
30: LDB,A
31: INA,(PIO_BD)
32: BIT0,A
33: JPZ,SET1
34: BIT1,A
35: JPZ,SET2
36: BIT2,A
37: JPZ,SET3
38: BIT3,A
39: JPZ,SET4
40: JPLOOP
41:
42: SET1:LDA,B
43: ADDA,00CH
44: OUT(PIO_AD),A
45: HALT
46: SET2:LDA,B
47: ADDA,008H
48: OUT(PIO_AD),A
49: HALT
50: SET3:LDA,B
51: ADDA,004H
52: OUT(PIO_AD),A
53: HALT
54: SET4:LDA,B
55: ADDA,000H
56: OUT(PIO_AD),A
57: HALT
といったところまではわかっているのですが、あとをどう作成してよいかわからなくて・・。
ということで質問させていただいたということです。
RAMEQU8000H
ROMEQU0000H
PIO_ADEQU01CH
PIO_ACEQU01DH
PIO_BDEQU01EH
PIO_BCEQU01FH
ORGRAM
LED_1:BLOCK1
LED_2:BLOCK1
LED_3:BLOCK1
LED_4:BLOCK1
MODE:BLOCK1
XL:BLOCK1
XH:BLOCK1
YL:BLOCK1
YH:BLOCK1
ZL:BLOCK1
ZH:BLOCK1
BUF_L:BLOCK1
BUF_H:BLOCK1
ORGROM
DI
INIT:LDSP,RAM+0FFFH
CALLPIO_INIT
JPMAIN
ORG0066H
RETN
ORG0070H
MAIN:CALLLED_OUT
IN_1ST:CALLNUM_IN
CP00AH
JPZ,MAIN
CP00BH
JPZ,IN_1ST
LDB,A
CALLDEC2BIN
LDHL,(XL)
LD(BUF_L),HL
CALLLED_CLR
IN_2ND:CALLNUM_IN
CP00AH
JPZ,MAIN
CP00CH
JPP,IN_2ND
CALLDEC2BIN
LDDE,(XL)
LD(YL),DE
LDHL,(BUF_L)
LD(XL),HL
LDA,B
CAL:CP0CH
JPZ,CAL_A
CP0DH
JPZ,CAL_S
CP0EH
JPZ,CAL_M
CALLDIV_XY
CALLBIN2DEC
JPCAL_E
CAL_A:CALLADD_XY
CALLBIN2DEC
JPCAL_E
CAL_S:CALLSUB_XY
CALLBIN2DEC
JPCAL_E
CAL_M:CALLMUL_XY
CALLBIN2DEC
JPCAL_E
CAL_E:CALLKEY_IN
CP0AH
JPZ,INIT
JPCAL_E
PIO_INIT:
PUSHAF
LDA,0CFH
OUT(PIO_AC),A
LDA,000H
OUT(PIO_AC),A
LDA,007H
OUT(PIO_AC),A
LDA,0CFH
OUT(PIO_BC),A
LDA,00FH
OUT(PIO_BC),A
LDA,007H
OUT(PIO_BC),A
LDA,000H
LD(LED_1),A
LD(LED_2),A
LD(LED_3),A
LD(LED_4),A
POPAF
RET
KEY_IN:PUSHBC
LDA,000H
OUT(PIO_BD),A
LOOP:CALLLED_OUT
INA,(PIO_BD)
BIT4,A
JPNZ,LOOP2
INA,(PIO_BD)
BIT5,A
JPNZ,PB11
JPPB01
LOOP2:INA,(PIO_BD)
BIT5,A
JPNZ,PB00
JPPB10
PB00:LDA,000H
OUT(PIO_BD),A
JPCHECK
PB01:LDA,010H
OUT(PIO_BD),A
JPCHECK
PB10:LDA,020H
OUT(PIO_BD),A
JPCHECK
PB11:LDA,030H
OUT(PIO_BD),A
JPCHECK
CHECK:INA,(PIO_BD)
BIT0,A
JPZ,PB0
JPCHECK2
CHECK2:INA,(PIO_BD)
BIT1,A
JPZ,PB1
JPCHECK3
CHECK3:INA,(PIO_BD)
BIT2,A
JPZ,PB2
JPCHECK4
CHECK4:INA,(PIO_BD)
BIT3,A
JPZ,PB3
JPLOOP
PB0:INA,(PIO_BD)
BIT4,A
JPNZ,PB0B
INA,(PIO_BD)
BIT5,A
JPNZ,KEY14
JPKEY12
PB0B:INA,(PIO_BD)
BIT5,A
JPNZ,KEY15
JPKEY13
PB1:INA,(PIO_BD)
BIT4,A
JPNZ,PB1B
INA,(PIO_BD)
BIT5,A
JPNZ,KEY10
JPKEY8
PB1B:INA,(PIO_BD)
BIT5,A
JPNZ,KEY11
JPKEY9
PB2:INA,(PIO_BD)
BIT4,A
JPNZ,PB2B
INA,(PIO_BD)
BIT5,A
JPNZ,KEY6
JPKEY4
PB2B:INA,(PIO_BD)
BIT5,A
JPNZ,KEY7
JPKEY5
PB3:INA,(PIO_BD)
BIT4,A
JPNZ,PB3B
INA,(PIO_BD)
BIT5,A
JPNZ,KEY2
JPKEY0
PB3B:INA,(PIO_BD)
BIT5,A
JPNZ,KEY3
JPKEY1
KEY0:LDB,000H
JPSTAY3
KEY1:LDB,001H
JPSTAY3
KEY2:LDB,002H
JPSTAY3
KEY3:LDB,003H
JPSTAY3
KEY4:LDB,004H
JPSTAY2
KEY5:LDB,005H
JPSTAY2
KEY6:LDB,006H
JPSTAY2
KEY7:LDB,007H
JPSTAY2
KEY8:LDB,008H
JPSTAY1
KEY9:LDB,009H
JPSTAY1
KEY10:LDB,00AH
JPSTAY1
KEY11:LDB,00BH
JPSTAY1
KEY12:LDB,00CH
JPSTAY0
KEY13:LDB,00DH
JPSTAY0
KEY14:LDB,00EH
JPSTAY0
KEY15:LDB,00FH
JPSTAY0
STAY0:CALLLED_OUT
INA,(PIO_BD)
BIT0,A
JPZ,STAY0
LDA,B
POPBC
RET
STAY1:CALLLED_OUT
INA,(PIO_BD)
BIT1,A
JPZ,STAY1
LDA,B
POPBC
RET
STAY2:CALLLED_OUT
INA,(PIO_BD)
BIT2,A
JPZ,STAY2
LDA,B
POPBC
RET
STAY3:CALLLED_OUT
INA,(PIO_BD)
BIT3,A
JPZ,STAY3
LDA,B
POPBC
RET
NUM_IN:CALLKEY_IN
CP00AH
JPP,BREAK
CALLL_SHIFT
LD(LED_4),A
JPNUM_IN
BREAK:RET
LED_OUT:
PUSHAF
PUSHHL
PUSHBC
INA,(PIO_AD)
ADDA,010H
AND030H
LDB,A
RRCA
RRCA
RRCA
RRCA
LDHL,LED_1
ADDA,L
LDL,A
LDA,(HL)
ORB
OUT(PIO_AD),A
POPBC
POPHL
POPAF
RET
L_SHIFT:
PUSHAF
PUSHBC
LDA,(LED_2)
LD(LED_1),A
LDA,(LED_3)
LD(LED_2),A
LDA,(LED_4)
LD(LED_3),A
POPBC
POPAF
RET
ADD_Z:PUSHAF
PUSHBC
PUSHHL
LDA,(XL)
LDB,A
LDA,(ZL)
ADDA,B
LD(ZL),A
LDA,(XH)
LDB,A
LDA,(ZH)
ADCA,B
LD(ZH),A
POPAF
POPBC
POPHL
RET
ADD_XY:PUSHAF
PUSHBC
PUSHHL
LDA,(XL)
LDB,A
LDA,(YL)
ADDA,B
LD(XL),A
LDA,(XH)
LDB,A
LDA,(YH)
ADCA,B
LD(XH),A
CP28H
JPP,OVERFLOW
POPAF
POPBC
POPHL
RET
全部は乗せられませんでしたが、
以上の形まで作成しましたが、メインルーチンが特にわかりません。
今回どのように修正すればよいか分からず、焦って説明不足のまま
質問をのせてしまいました。申し訳ございません。
ですので、さらに補足を載せていまいましたが、
お礼させてください。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# アセンブラ指令 3 2023/06/17 14:47
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- その他(プログラミング・Web制作) x86_32のGASの擬似命令 3 2023/06/07 19:55
- Java Javaで冪乗を表示したい 2 2022/06/08 00:08
- 書類選考・エントリーシート ガクチカと自己PRです。感想とアドバイスお願いします。 1 2022/09/20 13:34
- バッテリー・充電器・電池 電卓のボタン電池種類について。 電卓の内部基板上に、ボタン電池を挟んでとめる電池ホルダーが、ハンダ接 4 2022/11/05 17:03
- 英語 英語で「電卓」は何といいますか? 3 2023/04/10 21:24
- 時計・電卓・電子辞書 ソーラー式で電池式の電卓です。 ボタン電池を入れ替えたのですが、こんな表示になります。 どうしたらま 5 2023/06/15 09:40
- バッテリー・充電器・電池 電卓の内部基板上に、ボタン電池を挟んでとめるホルダーが、ハンダ接合で付けられています。 使用したいボ 1 2022/11/05 08:17
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ライン数とステップ数の違いは?
-
アセンブラからC言語に変換する...
-
実行ファイルからソースはみれる?
-
アセンブラ言語がわかりません。
-
[C言語→アセンブリ言語]はどう...
-
アセンブラの配列処理
-
素朴な疑問 (C言語とアセン...
-
アセンブラwordという単位
-
PowerPC用逆アセンブラを知りま...
-
アセンブラエディタ
-
このアセンブラの意味を教えて...
-
PICはアセンブラとC言語のどち...
-
MPLAB IDE v8.92アセンブラにつ...
-
x86系でリアル←→プロテクトモー...
-
メモリアドレスについて
-
素数を求めるプログラム(アセン...
-
アセンブラで割り算
-
アセンブラのリンカのダウンロ...
-
【H8マイコン】HEWで埋め込みア...
-
アセンブラーのプログラムに関して
おすすめ情報