投稿

ラベル(Assembler)が付いた投稿を表示しています

N88-BASICでZ80アセンブリ (2回目)

イメージ
2023/5/12(金) N88-BASICでZ80アセンブリ (2回目)   N88-BASIC(PC-8801)互換?XL-BASICのMONで アセンブリを動かして見ます   XLBasic01.exeをダブルクリックして XL-BASICを起動して下さい   mon でモニターに入り a9000 でアセンブリを打って行きます (小文字は大文字に変換されます)   LD A,80H     … Aレジスタに文字コード&h80を入れる LD HL,0F3C8H … HLレジスタにT-VRAM(&hF3C8)を入れる LD B,80      … Bレジスタに文字数(80)を入れる LD (HL),A    … HL番地にAを入れる INC HL       … HL = HL + 1 INC A        … A = A + 1 DJNZ 9007H   … B = B - 1:IF B <> 0 THEN LD (HL),Aへ RET          … RETURN(終了)   相対ジャンプ命令も絶対アドレスで指定して下さい 自動で相対アドレスに変換されます   T-VRAMの先頭から キャラクターコード&h80~ 文字を80文字書込む プログラムです   (XL-BASICはT-VRAMアドレスの変更には 対応していませんので常に&hF3C8~です)   g9000,- で9000hからRETまで実行します (途中のCALL,RETのペアでは止まりません)   tで1命令ずつトレース出来ます t2で2命令ずつ,t-でRETまでトレースします   XLBasic/Doc/ReferenceXL.txtの MONの所にコマンドの説明がありますので 参照して下さい       l9000,+d で9000h~dhバイトの逆アセンブルを表示します   l9000,+d,d でDATA文として逆アセンブルを XLBasic01prn.txtに出力します   LOADすると行番号が付加されます   BASICプログラムからアセンブリを実行するのに 使用して下さい   XL-BASIC付属のアセンブリのサンプル (XLBasic/AZ/z1.bas~z3.bas)は この方法で作成しています     また、TRONの状態

N88-BASICでZ80アセンブリ (1回目)

イメージ
2023/5/3(水) N88-BASICでZ80アセンブリ (1回目)   N88-BASIC(PC-8801)互換?XL-BASICの MONで お手軽に Z80アセンブリを 動かして見ます   (実機のmonと機能が違うので注意して下さい)   XLBasic01.exeをダブルクリックして XL-BASICを起動して下さい   mon でモニターに入り a9000 でアセンブリを打って行きます LD A,1  … Aレジスタに1を入れる LD B,2  … Bレジスタに2を入れる ADD A,B … A = A + B RET     … サブルーチンの終わり   xでレジスターの内容を表示出来ます g9000 で9000から1命令実行 t で続き(PCが示すアドレス)から1命令実行 t- でRET実行まで進みます (途中のCALL,RETのペアでは停止しません)   最終的に Aレジスターに1+2の結果3が入ります   l9000,+6 で9000番地から6バイト逆アセンブルできます   XL-BASICでは CALLされていない(RETでSPが0になる) 状態でRETが実行されると それ以上実行されないようにしてあります   CLEAR ,&H8FFFなどでSPが書き変わった後は 安全処置が働かなくなるので注意して下さい   Ctrl+bまたはBreakキーでMONを終了し BSAVE "ファイル名.bin",&H9000,6 (6はバイト数) でセーブ BLOAD "ファイル名.bin" でロード できます   注意 アセンブリの実行は固まって動かなくなることが ありますので保存(セーブ)を忘れないようにして下さい       BASICのDATA文をつくる   l9000,+6 で9000h~6バイトの逆アセンブルを表示します   l9000,+6,d でDATA文として逆アセンブルを XLBasic01prn.txtに出力します   LOADすると行番号が付加されます   BASICプログラムからアセンブリを実行するのに 使用して下さい   XL-BASIC付属のアセンブリのサンプル (XLBasic/AZ/z1.bas~z3.bas)は この方法で作成しています   XLBasic/Doc/

N88-BASIC、アセンブラ、Cでポインター (6回目)

イメージ
2023/1/31(火) N88-BASIC、アセンブラ、Cでポインター (6回目)   C言語にポインターが存在する意味が   文字列中のアルファベットの小文字を 大文字に変換するプログラムを作ることで   何となく分かるようにするシリーズです     今回はアセンブラ(8086系)の プログラムの紹介です   前回のポインターを使用したCからの変換です   プログラムと解説はコメント(/* … */)を見て下さい   blg~.zip中のptr006asm.cです   #include   <stdio.h>       /* printf等使用の為 */ void  main( void )        /* mainから実行     */ {   c har * p;         /* p = a (aは&a[0]) */    char   a[256];       /* 255文字+終端'\0' */     printf( "? " );   gets_s(a, 256);      /* 文字列入力      */   printf( "%s\n" , a);    /* 文字列表示       */     p = a;        /* mov ebx,aがerrorの為 */    __asm           /* 次の{}内がアセンブラ */   {     mov ebx,p;   ; ebxレジスタ(32bit) = p   L1:     mov al,[ebx]  ; alレジスタ(8bit) = *ebx     test al,al   ; al & al (0のチェック)     je L3      ; if  (al == 0 ) goto  L3     cmp al, 'a'     ; if  (al < 'a' ) goto  L2     jl L2     cmp al, 'z'     ; if  (al > 'z' ) goto  L2     jg L2     sub al, 'a' - 'A'   ;

N88-BASIC、アセンブラ、Cでポインター (5回目)

イメージ
2023/1/25(水) N88-BASIC、アセンブラ、Cでポインター (5回目)   C言語にポインターが存在する意味が   文字列中のアルファベットの小文字を 大文字に変換するプログラムを作ることで   何となく分かるようにするシリーズです     今回はC(言語)で ポインターを使ったプログラムの紹介です プログラムと解説はコメント(/* … */)を見て下さい BASICのアドレス(POKE,PEEK,VARPTRなど) を使ったプログラムや アセンブラを理解していれば より簡単に理解できると思います blg~.zip中のptr005.cです   #include   <stdio.h>       /* printf等使用の為 */ void  main( void )        /* mainから実行     */ {   c har * p;         /* p = a (aは&a[0]) */    char   a[256];       /* 255文字+終端'\0' */     printf( "? " );   gets_s(a, 256);      /* 文字列入力      */   printf( "%s\n" , a);    /* 文字列表示       */    for  (p = a; *p; p++)   /* *p != '\0'繰返し */   {      if  ( 'a'  <= *p && *p <= 'z' )     {       *p -= 'a'  - 'A' ;     }   }   printf( "%s\n" , a);    /* 文字列表示        */    gets_s(a, 256);      /* キー入力待ち     */ }   gets_s(a, 256); がエラーとなる場合は(多少動作は異なりますが) scanf_s("%s", a, 256); を使用して下さい   ポインターの説明 c har * p; のpがポインター(アド

N88-BASIC、アセンブラ、Cでポインター (4回目)

イメージ
2023/1/21(土) N88-BASIC、アセンブラ、Cでポインター (4回目)   C言語にポインターが存在する意味が   文字列中のアルファベットの小文字を 大文字に変換するプログラムを作ることで   何となく分かるようにするシリーズです     今回はC(言語)で 普通に作ったプログラムの紹介です プログラムと解説はコメント(/* … */)を見て下さい   blg~.zip中のptr004.cです   #include   <stdio.h>       /* printf等使用の為 */ void  main( void )        /* mainから実行     */ {    char  a[256];       /* 255文字+終端'\0' */    int   i;          /* 変数の定義       */     printf( "? " );   gets_s(a, 256);      /* 文字列入力      */   printf( "%s\n" , a);    /* 文字列表示       */    for  (i = 0; a[i]; i++)  /* a[i]!='\0'繰返し */   {      if  ( 'a'  <= a[i] && a[i] <= 'z' )     {      a[i] -= 'a'  - 'A' ;     }   }   printf( "%s\n" , a);    /* 文字列表示        */   gets_s(a, 256);      /* キー入力待ち     */ }   gets_s(a, 256); aに入力した文字列を最大256文字まで入れる Cの文字列は文字の配列変数に入れます 最後は'\0'が入りますので上記256文字は 255文字までの文字列という意味です これがエラーとなる場合は(多少動作は異なりますが) scanf_s("%s", a, 256); を使用して下さい   printf( "

N88-BASIC、アセンブラ、Cでポインター (3回目)

イメージ
2023/1/17(火) N88-BASIC、アセンブラ、Cでポインター (3回目)   C言語にポインターが存在する意味が   文字列中のアルファベットの小文字を 大文字に変換するプログラムを作ることで   何となく分かるようにするシリーズです     今回は N88-BASIC,Z80(XL-BASIC)で アセンブラ (Z80)を使用したプログラムの紹介です USR関数とCALLの2種類とも書いています   アセンブり言語をアセンブラで数値に変換したものが マシン語 (機械語)です 使い方が間違っているかもしれませんが ここではアセンブり言語をアセンブラと書いています   NL-BASIC,VL-BASICはアセンブラに対応していないので XL-BASIC(N88-BASIC(PC-8801)+Z80)のみで動きます   blg~.zip中のptr003.basです   150 CLEAR ,&HAFFF    BASIC使用領域は&HAFFFまで(マシン語は&HB000~) 160 ADDR = &HB000 170 GOSUB *ASSEMBLY   マシン語を ADDR番地から読込む 180 DEF USR0 = ADDR '--- USR0 190 STR0 = ADDR + 1 '--- CALL   マシン語呼び出しアドレスの設定 (USR0,CALL)   260 B$ = USR0(A$) 330 CALL ALPH(A$) それぞれの方法でマシン語を呼出しています A$自身が書変わります 書換えた後の A$の値がB$に入ります (文字列以外のB = USR0(A)などはAは変化しません)   以下、アセンブラの解説です   B$ = USR0(A$)では、DE = VARPTR(A$) CALL STR0(A$)では、HL = VARPTR(A$) の様に、 A$の情報が異なるレジスタに入りますので DEの時はDE,HLを入替えて(EX DE,HL) どちらも HL = VARPTR(A$)の状態で書いています   B000: EX DE,HL     ;*U0:SWAP HL,DE    USR0の時のみ   B001: LD B,(HL)    ;*C0:B = PEEK(HL) B002:

N88-BASIC、アセンブラ、Cでポインター (2回目)

イメージ
2023/1/14(土) N88-BASIC、アセンブラ、Cでポインター (2回目)   C言語にポインターが存在する意味が   文字列中のアルファベットの小文字を 大文字に変換するプログラムを作ることで   何となく分かるようにするシリーズです     今回はN88-BASIC(VL,XL,NL-BASIC)で アドレスを使用したプログラムの紹介です アセンブラでプログラムする足ががりです   PC-88(XL-BASIC),PC-98(NL-BASIC),VL-BASIC でメモリー内容が異なりますので その3パターンに対応しています   blg~.zip中のptr002.basです   200 ON N88 + 1 GOSUB *XL, *NL, *VL 240 FOR I=1 TO N 250   B = PEEK(P) 260   IF ASC("a") <= B AND B <= ASC("z") THEN POKE P, B - C 270   P = P + 1 280 NEXT   プログラムと解説を交互に書きました   200 ON N88 + 1 GOSUB *XL, *NL, *VL   各機種ごとに違う読み方で文字数N,アドレスPを設定 240 FOR I=1 TO N 250   B = PEEK(P)    アドレスPの内容をBに入れる 260   IF ASC("a") <= B AND B <= ASC("z") THEN POKE P, B - C    Bが"a"~"z"なら、アドレスP内にB-C("A"~"Z")を入れる 270   P = P + 1    Pを1増やす 280 NEXT   文字数N分繰返す   PEEK(P)はアドレスPのメモリーを読む POKE P,DはアドレスPのメモリーにDを書く という命令です(Dは0~&HFF) このアドレスを入れる変数Pを C言語ではポインターと呼んでいます 以下 メモリーのアドレス(16進数) (BASICでは16進数は&Hを付けて表す) とその内容を アドレス:内容 0000:

N88-BASIC、アセンブラ、Cでポインター (1回目)

イメージ
2023/1/11(水) N88-BASIC、アセンブラ、Cでポインター (1回目)   C言語にポインターが存在する意味が   文字列中のアルファベットの小文字を 大文字に変換するプログラムを作ることで   何となく分かるようにするシリーズです     今回はN88-BASIC(VL,XL,NL-BASIC)で 普通に作ったプログラムの紹介です   BASICとアセンブラ(Z80)をスルーする方は 4回目(C言語)から見て下さい   blg~.zip中のptr001.basの150行目からです   150 INPUT A$ 160 N = LEN(A$) 170 PRINT A$ 180 C = ASC("a") - ASC("A") 190 FOR I=1 TO N 200   B$ = MID$(A$, I, 1) 210   IF "a" <= B$ AND B$ <= "z" THEN MID$(A$, I) = CHR$(ASC(B$) - C) 220 NEXT 230 PRINT A$   プログラムと解説を交互に書きました   150 INPUT A$   キーボードから入力した文字列を文字変数A$に入れる 160 N = LEN(A$)   NにA$の文字数を入れる 170 PRINT A$   A$の文字列を表示する 180 C = ASC("a") - ASC("A")   文字a,Aのキャラクターコードの差をCに入れる 190 FOR I=1 TO N   IがNを超えていればNEXTの次に移動(Iは1~) 200   B$ = MID$(A$, I, 1)   B$に「A$の1から数えてI番目の文字1文字」を入れる 210   IF "a" <= B$ AND B$ <= "z" THEN MID$(A$, I) = CHR$(ASC(B$) - C)   B$が"a"~"z"なら"A"~"Z"に替えてA$のI番目に入れる 220 NEXT   Iを1増やしてFORに戻る 230