dポイントプレゼントキャンペーン実施中!

Z80を利用してアセンブラ言語で7セグメントLEDに表示できる簡易電卓をlinuxで作成 したいのですが、全くわかりません。どなたかご教授願えますでしょうか?

A 回答 (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上でプログラムを作成したいということです。
自分が説明不足で申し訳ございません。

補足日時:2011/10/17 05:01
    • good
    • 0
この回答へのお礼

説明不足でわざわざきとうしてくださったのに申し訳ございません。

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
という風に書いてみたものの、コンパイルが一応通りますが
まったく動かないためにどこを修正すればよいか分からず、
(特にメインルーチン)今回の質問にいたったわけでございます。
なのでわざわざ答えてくださってどうもありがとうございます。

お礼日時:2011/10/17 05:25

もうすこし具体的に書かないと何をやりたいのかさっぱりです。


出てくるキーワードから予想して書いてみると、

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
といったところまではわかっているのですが、あとをどう作成してよいかわからなくて・・。
ということで質問させていただいたということです。

補足日時:2011/10/17 04:59
    • good
    • 0
この回答へのお礼

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
全部は乗せられませんでしたが、
以上の形まで作成しましたが、メインルーチンが特にわかりません。
今回どのように修正すればよいか分からず、焦って説明不足のまま
質問をのせてしまいました。申し訳ございません。
ですので、さらに補足を載せていまいましたが、
お礼させてください。ありがとうございました。

お礼日時:2011/10/17 05:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!