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: INC HL
B003: LD E,(HL)    ;    E = PEEK(HL+1)
B004: INC HL
B005: LD D,(HL)    ;    D = PEEK(HL+2)
B006: EX DE,HL     ;    SWAP HL,DE
  ここまでで、B:A$の文字数、HL:A$のアドレスが入る
 
B007: LD A,(HL)    ;*L2:A = PEEK(HL)
B008: CP 061H      ;    IF A < 'a'
B00A: JR C,0B013H  ;               THEN *L1
B00C: CP 07AH      ;    IF A > 'z'
B00E: JR NC,0B013H ;               THEN *L1
B010: SUB 020H     ;    A = A - ('a' - 'A')
B012: LD (HL),A    ;    POKE HL,A
B013: INC HL       ;*L1:HL = HL + 1
B014: DJNZ 0B007H  ;    B = B - 1:IF B THEN *L2
B016: RET          ;    RETURN
 
動作は右のコメントにBASIC風で書いていますので
前回のプログラムのPC8801(XL)の部分が分かれば
分かるのではないかと思っています
 
前回のアドレス関係(VARPTR,POKE,PEEK)を使った
BASICプログラムはアセンブラと良く似ています
 
このアドレスを入れてメモリーをアクセスする
HLレジスターのようなものをC言語では
ポインターと呼んでいます
 
アセンブラは、XL-BASICで
mon
h]ab000
B000:… ex de,hl

で入力し
h]lb000,+17,d
でマシン語とアセンブラをDATA文形式で
Lbasic01prn.txtに出力したものに
コメントを足したものです
  
VL,NL,XL-BASICとblg~.zip(ptr003.bas)は
以下のリンクからダウンロードできます

https://ulprojectmail.blogspot.com
Readme.txtを読んで遊んで下さい














このブログの人気の投稿

NEWS

N88-BASICでゲーム (1回目)