突然だが、私は映画館へ自発的に足を運ぶことは(基本的には)ない。生まれてこの方、自発的に映画館に足を運んだのは、今回で2度目だったりする。
ちなみに最初の1回目はトム・クルーズ主演の「ミッションインポッシブル(1996年)」。その時の劇中のハッカーが望んだ報酬は、金ではなく「686型CPU搭載マシン」だった・・・。
そのような訳で、私の場合は「映画が見たいので映画館に行く」のではなく、「映画館が私を呼んでいるからその映画を見に行く」という感じになっているらしい。
さあ、686型CPUが理解してくれる素敵なプログラムが出来た・・・・・。
.include IOCSCALL.MAC
.include DOSCALL.MACboot:
move.w #18000,d0
@@: move.w #18000,d1
@@: bsr get_ui
dbra d1,@b
dbra d0,@@bDOS _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,d3andi.l #$0000ffff,d1
move.w d1,d0
bsr sigmacmp.l d0,d2
bne @fcmp.l d1,d3
bne @flea.l ok(pc),a1
IOCS _B_PRINTmove.l d2,d0
bsr print08x
move.l d3,d0
bsr print08x
@@:
movem.l (sp)+,d0-d3/a1
rtsok:
.dc.b '友愛数を発見しました。----------- ',$d,$a,0.even
;--------------------------------------------------------------
; 自然数 d0.w の約数の総和を求める。ただし自分自身は加算しない
;--------------------------------------------------------------
; 引数:d0.w 自然数
;--------------------------------------------------------------
; 戻値:d0.l 約数の総和(0で失敗)
;--------------------------------------------------------------
sigma:
movem.l d1-d3,-(sp)
moveq.l #0,d3move.w d0,d1
beq 2fandi.l #$0000ffff,d1
1:
subq.w #1,d1
beq 2fmoveq.l #0,d2
move.w d0,d2divu.w d1,d2
swap.w d2
tst.w d2
bne 1badd.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,mk32s99movem.l (sp)+,d0-d2/a0