EXCEEDの同人ソフト開発日記という名の備忘録

趣味のゲームソフト開発人。プロなのかアマなのかは不明(不定)らしい。

任天堂のソフトはいつも予定通りに出てこないって言われるけど、
ソフト作りっていうのは、そういうもの。
ゲームソフトは、期限までにやれと言われて、徹夜したり死に物狂いでやったからといって、
期待通りのものにはならない。そういうふうにすると、
結局、チームは妥協しなければならなくなる。
妥協させられて、できたものは、粗くなってしまう。
ユーザーは目が肥えていますから、受け付けてもらえない

山内 薄

映画・博士の愛した数式

突然だが、私は映画館へ自発的に足を運ぶことは(基本的には)ない。生まれてこの方、自発的に映画館に足を運んだのは、今回で2度目だったりする。

ちなみに最初の1回目はトム・クルーズ主演の「ミッションインポッシブル(1996年)」。その時の劇中のハッカーが望んだ報酬は、金ではなく「686型CPU搭載マシン」だった・・・。

そのような訳で、私の場合は「映画が見たいので映画館に行く」のではなく、「映画館が私を呼んでいるからその映画を見に行く」という感じになっているらしい。


さあ、686型CPUが理解してくれる素敵なプログラムが出来た・・・・・。




.include IOCSCALL.MAC
.include DOSCALL.MAC

boot:
move.w #18000,d0
@@: move.w #18000,d1
@@: bsr get_ui
dbra d1,@b
dbra d0,@@b

DOS _EXIT


;-----------------------------------------------------------------
; d0.w と d1.w が友愛数の関係であるかどうかを調べ、結果を表示する
;-----------------------------------------------------------------
; 引数:d0.w 自然数
; 引数:d1.w 自然数
;-----------------------------------------------------------------
get_ui:
movem.l d0-d3/a1,-(sp)
moveq.l #0,d2
move.w d0,d2
bsr sigma
move.l d0,d3

andi.l #$0000ffff,d1
move.w d1,d0
bsr sigma

cmp.l d0,d2
bne @f

cmp.l d1,d3
bne @f

lea.l ok(pc),a1
IOCS _B_PRINT

move.l d2,d0
bsr print08x
move.l d3,d0
bsr print08x
@@:
movem.l (sp)+,d0-d3/a1
rts

ok:
.dc.b '友愛数を発見しました。----------- ',$d,$a,0

.even


;--------------------------------------------------------------
; 自然数 d0.w の約数の総和を求める。ただし自分自身は加算しない
;--------------------------------------------------------------
; 引数:d0.w 自然数
;--------------------------------------------------------------
; 戻値:d0.l 約数の総和(0で失敗)
;--------------------------------------------------------------
sigma:
movem.l d1-d3,-(sp)
moveq.l #0,d3

move.w d0,d1
beq 2f

andi.l #$0000ffff,d1
1:
subq.w #1,d1
beq 2f

moveq.l #0,d2
move.w d0,d2

divu.w d1,d2
swap.w d2
tst.w d2
bne 1b

add.l d1,d3
bra 1b
2:
move.l d3,d0
movem.l (sp)+,d1-d3
rts


;--------------------------------------------------
; %08x を表示する
;--------------------------------------------------
; 引数:d0.l 表示したい値
;--------------------------------------------------
print08x:
movem.l d0/a0-a1,-(sp)
lea.l p08xtemp(pc),a0
bsr make32bitstring
lea.l p08xtemp(pc),a1
IOCS _B_PRINT
lea.l p08xcr(pc),a1
IOCS _B_PRINT
movem.l (sp)+,d0/a0-a1
rts
p08xtemp:
.ds.b 8+1
p08xcr:
dc.b $d,$a,0
.even
;--------------------------------------------------
; d0.l の値を文字列としてメモリに展開する
;--------------------------------------------------
; 引数:a0.l 文字列配置先頭アドレス
; 引数:d0.l 数値
;--------------------------------------------------
make32bitstring:

movem.l d0-d2/a0,-(sp)

addq.l #8,a0
clr.b (a0)

moveq.l #8-1,d2
mk32s99:
move.b d0,d1
andi.b #$f,d1
cmpi.b #9,d1
bhi mk32s01
addi.b #'0',d1
bra mk32s00
mk32s01:
subi.b #10,d1
addi.b #'A',d1
mk32s00:
move.b d1,-(a0)
lsr.l #4,d0
dbra d2,mk32s99

movem.l (sp)+,d0-d2/a0

rts