misc/060tsys/t18xclib.s
;----------------------------------------------------------------
;
; XCのライブラリのハイメモリ対策
;
;----------------------------------------------------------------
.include t01dos.equ
.include t02const.equ
.cpu 68060
;「$00FFFFFE」→「$3FFFFFFE」
;「$00FFFFFF」→「$3FFFFFFF」
;「move.b #$FE,~」→「ori.b #$C0,~」
;「cmpi.b #$FE,~;beq ~」→「cmpi.b #$C0,~;bcc ~」
;「cmpi.b #$FE,~;bne ~」→「cmpi.b #$C0,~;bcs ~」
MARKER equ .notb.(LOGICAL_MASK>>24) ;$C0
;----------------------------------------------------------------
;ロードしたプログラムがXCのライブラリを使用していたらパッチをあてる
; キャッシュを考慮していないので、後でプッシュと無効化を行うこと
;<a0.l:メモリ管理ポインタ
;<a1.l:末尾+1
;<a4.l:実行開始アドレス
patchXclib::
movem.l d0-d3/a2-a3,-(sp)
;実行開始位置の手前128バイト以内に'XCコンパイラ'の文字列があるか
lea.l (-128,a4),a3
moveq.l #'X',d1
moveq.l #128-1,d2
@@: cmp.b (a3)+,d1
dbeq d2,@b
bne patchXclibEnd ;XCのライブラリではなさそう
cmpi.w #'Cコ',(a3) ;奇数アドレスの可能性がある
bne @b
cmpi.l #'ンパイ',(2,a3) ;奇数アドレスの可能性がある
bne @b
cmpi.b #'ラ',(6,a3)
bne @b
;実行開始位置の直後から512バイト以内で_SETBLOCKまでの5個の$00FFFFFEを$3FFFFFFEに変更
movea.l a4,a3
move.w #512/2-1,d2
1: cmp.w #_SETBLOCK,(a3)
beq 3f
cmpi.l #$00FFFFFE,(a3)
bne 2f
move.b #LOGICAL_MASK>>24,(a3) ;$00FFFFFE→$3FFFFFFE
2: addq.l #2,a3
dbra d2,1b
3:
;MALLOCPの位置を確認する
;<a3.l:_SETBLOCKの位置
lea.l (22,a3),a3
cmpi.w #$23C8,(a3)+ ;move.l a0,MALLOCP
bne patchXclibEnd ;改造されているのかも
move.l (a3),d3 ;MALLOCP
;malloc(),free(),realloc()を修正する
;<d3.l:MALLOCP
;<a0.l:メモリ管理テーブル
lea.l (pProgram,a0),a3 ;プログラムの先頭
move.l (pBssTop,a0),d2 ;bssの先頭
sub.l a3,d2 ;プログラムのバイト数
lsr.l #1,d2 ;ワード数
subq.l #1,d2
swap.w d2
6: swap.w d2
5: cmp.l (a3),d3 ;MALLOCPを検索する
bne 2f
move.l (-4,a3),d0
;
cmp.w #$2279,d0 ;movea.l MALLOCP,a1
bne 3f
;movea.l MALLOCP,a1
cmpi.l #$157C_00FE,(-38,a3) ;move.b #$FE,(4,a2)
bne 4f
cmpi.w #$0004,(-34,a3) ;
bne 4f
;move.b #$FE,(4,a2)
;.ds.w 15
;movea.l MALLOCP,a1
;XC1のrealloc()の1番目のパッチ
move.l #$002A_0000+MARKER,(-38,a3) ;move→ori,$FE→MARKER
4: cmpi.l #$0C28_00FE,(-10,a3) ;cmpi.b #$FE,(4,a0)
bne 4f
cmpi.w #$0004,(-6,a3) ;
bne 4f
cmpi.b #$66,(-4,a3) ;bne
bne 4f
;cmpi.b #$FE,(4,a0)
;bne.s
;movea.l MALLOCP,a1
;XC1,XC2のrealloc()の2番目のパッチ
move.b #MARKER,(-7,a3) ;$FE→MARKER
move.b #$65,(-4,a3) ;bne→bcs
bra 2f
4:
3: cmp.w #$23CA,d0 ;move.l a2,MALLOCP
bne 3f
;move.l a2,MALLOCP
cmpi.l #$0C28_00FE,(14,a3) ;cmpi.b #$FE,(4,a0)
bne 4f
cmpi.w #$0004,(18,a3) ;
bne 4f
cmpi.b #$66,(20,a3) ;bne
bne 4f
;move.l a2,MALLOCP
;.ds.w 5
;cmpi.b #$FE,(4,a0)
;bne
;XC1のmalloc()の2番目のパッチ
move.b #MARKER,(17,a3) ;$FE→MARKER
move.b #$65,(20,a3) ;bne→bcs
bra 2f
4: cmpi.l #$0C28_00FE,(12,a3) ;cmpi.b #$FE,(4,a0)
bne 4f
cmpi.w #$0004,(16,a3) ;
bne 4f
cmpi.b #$67,(18,a3) ;beq
bne 4f
;move.l a2,MALLOCP
;.ds.w 4
;cmpi.b #$FE,(4,a0)
;beq
;XC1,XC2のrealloc()の3番目のパッチ
move.b #MARKER,(15,a3) ;$FE→MARKER
move.b #$64,(18,a3) ;beq→bcc
4: cmpi.l #$C2BC_00FF,(50,a3) ;and.l #$00FFFFFF,d1
bne 2f
cmpi.w #$FFFF,(54,a3) ;
bne 2f
;move.l a2,MALLOCP
;.ds.w 23
;and.l #$00FFFFFF,d1
;XC1,XC2のrealloc()の4番目のパッチ
move.b #LOGICAL_MASK>>24,(52,a3) ;$00FFFFFFを$3FFFFFFFに変更
bra 2f
3: cmp.l #$23EA_0000,d0 ;move.l (0.w,a2),MALLOCP
bne 3f
;move.l (0.w,a2),MALLOCP
cmpi.l #$0C28_00FE,(14,a3) ;cmpi.b #$FE,(4,a0)
bne 4f
cmpi.w #$0004,(18,a3) ;
bne 4f
cmpi.b #$66,(20,a3) ;bne
bne 4f
;move.l (0.w,a2),MALLOCP
;.ds.w 5
;cmpi.b #$FE,(4,a0)
;bne
;XC2のmalloc()の2番目のパッチ
move.b #MARKER,(17,a3) ;$FE→MARKER
move.b #$65,(20,a3) ;bne→bcs
bra 2f
4:
3: cmp.w #$2479,d0 ;movea.l MALLOCP,a2
bne 3f
;movea.l MALLOCP,a2
cmpi.l #$0C2A_00FE,(4,a3) ;cmpi.b #$FE,(4,a2)
bne 4f
cmpi.w #$0004,(8,a3) ;
bne 4f
cmpi.b #$67,(10,a3) ;beq
bne 4f
;movea.l MALLOCP,a2
;cmpi.b #$FE,(4,a2)
;beq
;XC1,XC2のmalloc()の1番目のパッチ
move.b #MARKER,(7,a3) ;$FE→MARKER
move.b #$64,(10,a3) ;beq→bcc
bra 2f
4:
3: cmp.w #$2879,d0 ;movea.l MALLOCP,a4
bne 3f
;movea.l MALLOCP,a4
cmpi.l #$16BC_00FE,(-6,a3) ;move.b #$FE,(a3)
bne 4f
;move.b #$FE,(a3)
;movea.l MALLOCP,a4
;XC2のrealloc()の1番目のパッチ
move.l #$0013_0000+MARKER,(-6,a3) ;move→ori,$FE→MARKER
bra 2f
4:
3: cmp.w #$43F9,d0 ;lea.l MALLOCP,a1
bne 3f
;lea.l MALLOCP,a1
cmpi.l #$157C_00FE,(-8,a3) ;move.b #$FE,(4,a2)
bne 4f
cmpi.w #$0004,(-4,a3) ;
bne 4f
;move.b #$FE,(4,a2)
;lea.l MALLOCP,a1
;XC1,XC2のfree()のパッチ
move.l #$002A_0000+MARKER,(-8,a3) ;move→or,$FE→MARKER
bra 2f
4:
3:
2: addq.l #2,a3
dbra d2,5b
swap.w d2
dbra d2,6b
patchXclibEnd:
movem.l (sp)+,d0-d3/a2-a3
rts