全体表示

[ リスト | 詳細 ]

記事検索
検索

イメージ 1

//sample17_2.c
//ダイレクトアドレッシング
//ある番地の値をダイレクトにレジスタAに
// mov a,sadder16
#include "watch01.h"
#include "trgBIOS.h"
void main(){

#asm
  mov a,!0f000h  ;(データーの前は)#ではない
  
  ;上の例では、f000番地の値がAレジスタに入る
  
  call !?L_watch01
#endasm
}


この命令は Z80では

一旦、HLレジスタにメモリアドレスを入れておいて
HLレジスタの示すアドレスの値をレジスタAに入れる
動作をする

だから Z80の場合

LD HL,0F000H
LD A,(HL)

と書く

また、i86系では
MOV DS,MEM16とあらわす
それに、値のときは 頭に #をつけるのに
この場合は !をつける

そういう訳で、ちょっと戸惑う命令だと思う
 

まあ、このメモリダイレクトアクセスは
Aレジスタしかできないようだけど

使い慣れれば、便利だとは思います。。。

あ、もちろんZ80のように
一旦HLレジスタを介してのメモリアクセスも
当然出来ます。

それから、Z80で使う
(HL)やら IX+d指標レジスタという書き方と
C言語のポインタのイメージってつくづく似ていると
思うのは、僕だけかなーー

MOV命令の基本01

//sample17_1.c
#include "watch01.h"
#include "trgBIOS.h"
void main(){

#asm
  mov h,#03h
  movw ax,#0123h
  call !?L_watch01
#endasm
}

イメージ 1

結果は
axに0123が
hに3が
それぞれ入ってます

mov は 1バイト転送命令
movw は2バイト転送命令 といわれています。。。

78kアセンブラでは、値をレジスタに転送する時
#マークをつけることになってます。。。
このあたりが、普通のアセンブラとは
ちょっとちがって、はじめは、戸惑います

ちなみに
call !?L_watch01
というのは、自作のレジスタを観るルーチンです



ちょっと悩みがあるんです
先日から、100%アセンブラで
分割コンパイルの本格運用のために
EXTRN と PUBLIC を ためしたり
INCLUDE を ためしたりしているのですが
ちっとも、成功しません。
統合環境では、かえってむつかしいのかな??

trgBIOSのDUMPルーチンについて

ソフトの勉強のためにメモリがすぐにダンプできると
良いと思って、BIOSにあるダンプルーチンがつかえないかなーーと
思ってるんです。。。

トランジスタ技術8月号の付録についているCDの中で
sourceホルダーの中に

BIOScore.cというCのファイルがあるんですが
これがおそらく、トラ技BIOSではないかと思います

そこで、このCソースをコンパイルして
BIOScore.prnというファイルの中をのぞいてみると

DUMPルーチンの実態が以下のように
なってることがわかります。

そこで、C言語のインラインアセンブラから
いきなり、このDUMPルーチンの番地を
直接コール( 1D52番地)してやると

メモリが最後までダーーーーとダンプされます


ダンプ開始番地とか、範囲とかを渡す引数が
あるはずなんですが、、、、

AXレジスタや
HLレジスタにいろいろいれてみたんですが
どうもだめでした、、、



2208 1D52                _dump:
2209                     $DGL    1,287
2210 1D52  B7                    push
2211 1D53                ??bf_dump:
2212                     ; line   410 :     U8 uc;
2213                     ; line   411 :     U8 count = 0;
2214                     $DGL    0,3
2215 1D53  A700                  mov     h,#00H   ;[INF] 2, 4
2216                     ; line   412 : 
2217                     ; line   413 :     while(arg2)
2218                     $DGL    0,5
2219 1D55                ?L0167:
2220 1D55 R021600              movw   ax,!_arg     ;[INF] 3,10/12
2221 1D58  6168                  or      a,x       ;[INF] 2, 4
2222 1D5A  BD03                  bnz     $$+       ;[INF] 2, 6
2223 1D5C  9B041E                br      !?L0168   ;[INF] 3, 6
2224                     ; line   414 :     {
2225 1D5F                ??bb00_dump:
2226 ; line   415 :         if(svUSB_getrecvcount() != 0) break;
2227                     $DGL    0,7
2228 1D5F RC1            callt   [?svUSB_getrecvcount];[INF] 1, 6
2229 1D60  C2                    movw    ax,bc 

以下、略

2SC1815を使ってスイッチングさせて

豆電球を点滅させました。

トランジスタの資料にある
足のベース、コレクタ、エミッタの図って
下からみるのね♪

はじめ、逆にさしちゃったよ♪

しかし、ブレッドボードってつくづく便利だね ♪


配線図
イメージ 1
↑図面で書き忘れちゃったけど、トランジスタの
真ん中の足がコレクタ
下がエミッタです


//list2_2.c
#pragma sfr

void main(){

  
 PM6.1 = 0;
 while(1){
  short i,ii;
  for(ii=0;ii<3;ii++){
    for(i=0;i<30000;i++){}
  }
  P6.1  ^= 0x01;
 }
}



2SC1815を使ってスイッチングさせて

豆電球を点滅させました。

トランジスタの資料にある
足のベース、コレクタ、エミッタの図って
下からみるのね♪

はじめ、逆にさしちゃったよ♪

しかし、ブレッドボードってつくづく便利だね ♪


配線図
イメージ 1
↑図面で書き忘れちゃったけど、トランジスタの
真ん中の足がコレクタ
下がエミッタです


//list2_2.c
#pragma sfr

void main(){

  
 PM6.1 = 0;
 while(1){
  short i,ii;
  for(ii=0;ii<3;ii++){
    for(i=0;i<30000;i++){}
  }
  P6.1  ^= 0x01;
 }
}



.


プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事