何とか庵日誌

本名荒井が毒にも薬にもならないことを書きつづるところ

スコア周り改良中

昨日アップした「DOWNDOWN2」のスコア処理が気に入らず、すこし改良しました。
スコアはスクロールした行数の一の位~千の位を、それぞれ1バイトのメモリに格納する方式でカウントしてます。
本当は16進数を10進数に変換して表示したいところなんですが、かんたんにすぐ作れる方法としてこんな方法をとりました(泣)。
最初に作ったソースはこんなかんじ。


;--- カウンター

CHPUT: EQU 00A2H
POSIT: EQU 00C6H

DIGIT: EQU 0A003H
DIGITS: EQU 0A000H
SZAHYO: EQU 1400H

ORG 9000H

;--- ショキセッテイ

XOR A
LD HL,DIGIT
LD B,4
LOOP1: LD (HL),A
DEC HL
DJNZ LOOP1

;--- 1 ノ クライ カウント

ICHI: LD HL,DIGIT
LD A,(DIGIT)
INC A
CP 0AH
JR Z,JU
LD (HL),A
JR PUTD

;--- 10 ノ クライ カウント

JU: XOR A
LD (HL),A
DEC HL

LD A,(HL)
INC A
CP 0AH
JR Z,HYAKU
LD (HL),A
JR PUTD

;--- 100 ノ クライ カウント

HYAKU: XOR A
LD (HL),A
DEC HL

LD A,(HL)
INC A
CP 0AH
JR Z,SEN
LD (HL),A
JR PUTD

;--- 1000 ノ クライ カウント

SEN: XOR A
LD (HL),A
DEC HL

LD A,(HL)
INC A
CP 0AH
JR Z,SENEND
LD (HL),A
JR PUTD

SENEND: RET

;--- スウジ ヲ ヒョウジ スル

PUTD: LD HL,SZAHYO
CALL POSIT
LD B,4
LD HL,DIGITS
LOOP2: LD A,(HL)
ADD A,30H
CALL CHPUT
INC HL
DJNZ LOOP2
JR ICHI

END

;BASIC デハ コウダッタ

;10 DEFINT A-Z
;20 CT=&H0:DIMD(4)
;30 CT=CT+&H1:D(1)=CT
;40 IF CT>9 THEN D(2)=D(2)+1:D(1)=0:CT=0
;50 IF D(2)>9 THEN D(3)=D(3)+1:D(2)=0:D(1)=0:CT=0
;60 IF D(3)>9 THEN D(3)=9:END
;70 LOCATE 0,0:PRINT CT;D(3);D(2);D(1)
;80 GOTO 30



ご覧のとおり、カウントの繰り上がり処理で一桁ごとに同じ処理を3回くり返してます。
それだと冗長なのでちょっと改良したのがコレです。



;--- カウンター 2

CHPUT: EQU 00A2H
POSIT: EQU 00C6H

DIGIT: EQU 0A003H
DIGITS: EQU 0A000H
SZAHYO: EQU 1400H

ORG 9000H

;--- ショキセッテイ

XOR A
LD HL,DIGIT
LD B,4
LOOP1: LD (HL),A
DEC HL
DJNZ LOOP1

;--- カウント

COUNT: LD B,4

LD HL,DIGIT
LD A,(HL)
INC A
LD (HL),A
COUNT2: CP 0AH
JR Z,CARRY
DJNZ COUNT2
JR PUTD

;--- クリアガリ

CARRY: XOR A
LD (HL),A
DEC HL
LD A,(HL)
INC A
LD (HL),A
PUSH AF
LD A,(DIGITS)
CP 0AH
RET Z
POP AF
JR COUNT2


;--- スウジ ヲ ヒョウジ スル

PUTD: LD HL,SZAHYO
CALL POSIT
LD B,4
LD HL,DIGITS
LOOP2: LD A,(HL)
ADD A,30H
CALL CHPUT
INC HL
DJNZ LOOP2
JR COUNT

END

; BASIC ニ スルト コウナル

;10 DEFINT A-Z
;20 DIM D(4):FOR I=1 TO 4:D(I)=0:NEXT
;30 D(4)=D(4)+1
;40 FOR I=4 TO 1 STEP -1
;50 IF D(I)>9 THEN D(I-1)=D(I-1)+1:D(I)=0
;60 IF D(1)>9 THEN END
;70 NEXT
;80 LOCATE 0,0:PRINT D(1);D(2);D(3);D(4)
;90 GOTO 30



実質85行から63行に圧縮成功、20ほど命令を省くことができました。バイト数にして約20。
速度は改良前の方が0.3秒ほど高速*1でしたが、20バイトほど容量が浮くのは十分魅力的です。どうせウェイト咬まして遅くする予定だし!(おい)。
今度は各処理をサブルーチン化して、全体の見通しを良くしようかと企んでます。

*1:うちのA1GT標準モードで測定しました。