Skip to content

Instantly share code, notes, and snippets.

@kg68k
Created February 11, 2022 14:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kg68k/eb7074083f3de897cb2be9f92fb48603 to your computer and use it in GitHub Desktop.
Save kg68k/eb7074083f3de897cb2be9f92fb48603 to your computer and use it in GitHub Desktop.
COMMAND.XだけでSRAMの全体をゼロクリア
.title COMMAND.XだけでSRAMの全体をゼロクリア
;https://twitter.com/kamadox/status/1490317638958223364
;逆アセンブルして注釈を追加
.include iocscall.mac
.cpu 68000
.text
L000000:
eor d4,d4 ;d4.w=0
;スーパーバイザモードに切り換える
movea d4,a1 ;a1.l=0
moveq #.low..not._B_SUPER,d0
not d0 ;d0.b=$81=_B_SUPER
trap #15 ;IOCSコール
movea.l d0,a4 ;以前のssp
lea (a4),a1 ;ユーザーモードに戻すときのために保存
;rtsをDOS _EXIT($ff00)に書き換える(命令キャッシュ消去は後で行う)
pea (L00006c,pc,d4.w)
movea.l (sp)+,a4
st (a4)+ ;$ff
sf (a4)+ ;$00
movea.l (L00006e,pc,d4.w),a2
movea.l (L000072,pc,d4.w),a3
bra L000078
L000022:
bra L00004a
L000024:
bra L00006c
L000026:
.dc.b $30,$31
L000028:
;SRAMアドレスを求める
movea.l a2,a4 ;$55a45555
adda.l a2,a2 ;a2.l=$ab48aaaa
adda.l a4,a2 ;a2.l=$00ecffff
addq #1,a2 ;a2.l=$00ed0000
;SRAM書き込み許可
movea.l a3,a4 ;$3361c669
adda.l a3,a3 ;a3.l=$66c38cd2
adda.l a3,a3 ;a3.l=$cd8719a4
adda.l a4,a3 ;a3.l=$00e8e00d SystemPort#7
subq #1,a3 ;a3.l=$00e8e00c
move #$3131,(a3) ;上位バイトはダミー
;SRAM容量の(word数-1)を求める
move (L000076,pc,d4.w),d0 ;$b555
move (L000076,pc,d4.w),d1
add d0,d0 ;d0.w=$6aaa
add d1,d0 ;d0.w=$1fff=16*1024/2-1
;SRAMをクリアする
L00004a:
clr (a2)+
subq #1,d0
bcc L000022 ;bcc L00004a だとオペコードが有効な文字に
;ならないため、わざと遠くに迂回する
;SRAM書き込み禁止
move #$3232,(a3) ;上位バイトはダミー
;ユーザーモードに戻す
moveq #.low..not._B_SUPER,d0
not d0 ;d0.b=$81=_B_SUPER
trap #15 ;IOCSコール
;スケーリングファクタを使用してMPU判別
; 68000/68010ならSFは無視されるので L000026-1+1 ($30) が参照される
; 68020以降なら L000026-1+1*2 ($31) が参照される
clr d3
addq #1,d3
.cpu 68020
and.b (L000026-1,pc,d3.w*2),d3
beq L000024 ;68010以下
;68020以上ならキャッシュを消去する
clr d1
addq #3,d1 ;d1.w=3 ... キャッシュ消去
IOCS _SYS_STAT
.cpu 68000
;プログラム終了
L00006c:
rts ;DOS _EXITに書き換えられる
L00006e:
.dc.l $55a45555 ;($1_00ed0000-1)/3
L000072:
.dc.l $3361c669 ;$1_00e8e00d/5
L000076:
.dc.w $b555 ;($2_0000+16*1024/2-1)/3
L000078:
bra L000028
L00007a:
.dc.b $0d,$0a ;echoコマンドで出力された改行なので使用されない
L00007c:
.end L000000
.title COMMAND.XだけでSRAMの全体をゼロクリア
;https://twitter.com/kamadox/status/1490317638958223364
;逆アセンブルのみ(disに-rオプションを指定してオペコードを出力)
.include iocscall.mac
.cpu 68000
.text
L000000:
eor d4,d4 ;$b944
movea d4,a1 ;$3244
moveq #$7e,d0 ;'~' ;$707e
not d0 ;$4640
trap #15 ;$4e4f
movea.l d0,a4 ;$2840
lea (a4),a1 ;$43d4
pea (L00006c,pc,d4.w) ;$487b,$405c
movea.l (sp)+,a4 ;$285f
st (a4)+ ;$50dc
sf (a4)+ ;$51dc
movea.l (L00006e,pc,d4.w),a2 ;$247b,$4054
movea.l (L000072,pc,d4.w),a3 ;$267b,$4054
bra L000078 ;$6056
L000022:
bra L00004a ;$6026
L000024:
bra L00006c ;$6046
L000026:
.dc.b $30,$31
L000028:
movea.l a2,a4 ;$284a
adda.l a2,a2 ;$d5ca
adda.l a4,a2 ;$d5cc
addq #1,a2 ;$524a
movea.l a3,a4 ;$284b
adda.l a3,a3 ;$d7cb
adda.l a3,a3 ;$d7cb
adda.l a4,a3 ;$d7cc
subq #1,a3 ;$534b
move #$3131,(a3) ;'11' ;$36bc,$3131
move (L000076,pc,d4.w),d0 ;$303b,$4036
move (L000076,pc,d4.w),d1 ;$323b,$4032
add d0,d0 ;$d040
add d1,d0 ;$d041
L00004a:
clr (a2)+ ;$425a
subq #1,d0 ;$5340
bcc L000022 ;$64d2
move #$3232,(a3) ;'22' ;$36bc,$3232
moveq #$7e,d0 ;'~' ;$707e
not d0 ;$4640
trap #15 ;$4e4f
clr d3 ;$4243
addq #1,d3 ;$5243
.cpu 68020
and.b (L000024+1,pc,d3.w*2),d3 ;$c63b,$32c5
beq L000024 ;$67c0
clr d1 ;$4241
addq #3,d1 ;$5641
IOCS _SYS_STAT ;$70ac,$4e4f
L00006c:
rts ;$4e75
L00006e:
.dc.l $55a45555
L000072:
.dc.l $3361c669
L000076:
.dc.w $b555
L000078:
bra L000028 ;$60ae
L00007a:
.dc.b $0d,$0a
L00007c:
.end L000000
@kg68k
Copy link
Author

kg68k commented Feb 11, 2022

https://twitter.com/kamadox/status/1490317638958223364
鎌田さんの「COMMAND.XだけでSRAMの全体をゼロクリア」のネタバレです。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment