[新連載開始]W65C02マイコンボードの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
私としてはW65C02をさわるのは全く初めてです。何から何まで未経験です。さてどうなりますでしょうか。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第51回]
●CMP,CPX,CPY●BASICプログラムです
CMPはアキュムレータとメモリまたは即値との大小を比較してその結果をフラグに反映させます。
演算の結果によってNフラグ、Zフラグ、Cフラグがセット、リセットされます。
フラグはA(アキュムレータ)−M(メモリ、即値)の計算の結果と同じですがアキュムレータ、メモリの値は変わりません。
N(Negative)は結果が負のときにセットされ0または正のときリセットされます。
Z(Zero)は結果が0のときにセットされます。
CフラグはSBC命令と同じになります。
A>=MのときC=1、A<MのときC=0になります。
CMPには以下の命令があります。
| ニーモニック | マシン語コード | アセンブラ書式 | バイト数 | クロック数 |
| CMP a | CD | CMP $1234 | 3 | 4 |
| CMP a,x | DD | CMP $1234,x | 3 | 4 |
| CMP a,y | D9 | CMP $1234,y | 3 | 4 |
| CMP # | C9 | CMP #$12 | 2 | 2 |
| CMP zp | C5 | CMP $12 | 2 | 3 |
| CMP (zp,x) | C1 | CMP ($12,x) | 2 | 6 |
| CMP (zp) | D2 | CMP ($12) | 2 | 5 |
| CMP zp,x | D5 | CMP $12,x | 2 | 4 |
| CMP (zp),y | D1 | CMP ($12),y | 2 | 5 |
| ニーモニック | マシン語コード | アセンブラ書式 | バイト数 | クロック数 |
| CPX a | EC | CPX $1234 | 3 | 4 |
| CPX # | E0 | CPX #$12 | 2 | 2 |
| CPX zp | E4 | CPX $12 | 2 | 3 |
| ニーモニック | マシン語コード | アセンブラ書式 | バイト数 | クロック数 |
| CPY a | CC | CPY $1234 | 3 | 4 |
| CPY # | C0 | CPY #$12 | 2 | 2 |
| CPY zp | C4 | CPY $12 | 2 | 3 |
10 picout PORTB,$FE:'reset=0 20 clk=0 30 for a=0 to 5 40 picout PORTE,1 50 picout PORTE,5 60 clk=clk+1 70 c=picin(PORTC):adrsh=and(c,$c0):sy=and(c,$01) 80 pa=picin(PORTA):adrsl=and(pa,$3f):adrs=adrsh+adrsl 90 d=picin(PORTD) 100 print clk,hex$(adrs),hex$(d),hex$(picin(PORTC)),"sync=";sy 110 next a 120 picout PORTB,$FF:'reset=1 130 print "start" 140 for a=0 to 40 150 picout PORTE,1 160 picout PORTE,5 170 clk=clk+1 180 c=picin(PORTC):adrsh=and(c,$c0):sy=and(c,$01) 190 pa=picin(PORTA):adrsl=and(pa,$3f):adrs=adrsh+adrsl 200 d=picin(PORTD) 210 print clk,hex$(adrs),hex$(d),hex$(picin(PORTC)),"sync=";sy 220 if sy=0 goto 240 230 if d=$DB goto 250 240 next a 250 stop |