;DEBUG equ 1 include "SSMac.h" dv.l FileStart dv.l Hunks dv.l OldKeepDebug dv.l RelocPool dv.l BackupA2 dv.l FirstInsert dv.l LastInsert dv.b FlgBufEnd dv.b Advisory start get.l Arg_File,a0 call LoadFile put.l d0,FileStart move.l d0,a2 add.l -(a2),d0 move.l d0,d7 moveq #20,d0 cmp.l (a2)+,d0 bhi.s InvalidNE1 lea (a2,d0.l),a3 cmp.l #HUNK_HEADER,(a2)+ bne.s InvalidNE1 tst.l (a2)+ bne.s InvalidNE1 move.l (a2)+,d2 beq Invalid tst.l (a2)+ bne.s InvalidNE1 move.l (a2)+,d0 addq.l #1,d0 cmp.l d0,d2 bne.s InvalidNE1 dtl ,a6 bsr.s CheckWordLimit swap d0 put.l d0,Hunks lsl.l #3,d0 call ss,TrackAllocPub move.l d0,a4 move.l d2,d0 moveq #0,d4 bsr CopyLongs moveq #0,d3 MainHunkLoop ifd DEBUG push d4 push d3 push a2 dtl ,a0 move.l sp,a1 call ss,Printf lea 12(sp),sp endc cmp.l a2,d7 beq.s FileEnd move.l (a2)+,d0 push d0 ifd DEBUG dtl.l ,a0 move.l sp,a1 call Printf move.l (sp),d0 endc bclr.l #HUNKB_ADVISORY,d0 snev Advisory sub.w #HUNK_NAME,d0 bcs.s BadHunk cmp.w #HUNK_RELRELOC32-HUNK_NAME+1,d0 bcc.s BadHunk lsl.l #1,d0 move.w HunkTable(pc,d0.w),d1 swap d0 lsl.w #2,d0 InvalidNE1 bne Invalid pop d0 jsr HunkTable(pc,d1.w) bra.s MainHunkLoop CheckWordLimit swap d0 tst.w d0 beq Return5 push a0 dtl ,a0 bra ErrorSSA1 BadHunk tstv.b Advisory beq Invalid tst.l d4 bne.s AdviSkip move.l d0,(a3)+ AdviSkip bsr GetLong FileEnd tstv.l Arg_NoEnd beq.s PatchNoEnd addq #4,a3 PatchNoEnd geta Arg_To,a0 move.l (a0),d0 bne.s ArgToSpecified move.l -4(a0),d0 move.l d0,(a0) ArgToSpecified move.l d0,a0 moveq #OPEN_NEW,d0 call ss,TrackOpen move.l d1,d2 get.l FileStart,a2 move.l -4(a2),d4 get.l FirstInsert,d3 moveq #0,d5 FlushLoop tst.l d3 beq.s FlushNoInsertX move.l d3,a1 move.l (a1)+,d1 ;Next move.l (a1)+,d0 ;Point sub.l a2,d0 bne.s FlushNoInsert move.l d1,d3 move.l (a1)+,d0 ;Length bra.s FlushSkip hunk macro ;HUNK_#?[,] ifne _hunk-\1 fail Mismatched hunk numbers! endc ifeq NARG-1 dc.w BadHunk-HunkTable else dc.w hunk_\2-HunkTable endc _hunk set _hunk+1 endm _hunk set 1000 HunkTable hunk HUNK_NAME,skipcnt ;1000 hunk HUNK_CODE,main ;1001 hunk HUNK_DATA,main ;1002 hunk HUNK_BSS,bss ;1003 hunk HUNK_RELOC32,rel32 ;1004 hunk HUNK_RELOC16 ;1005 hunk HUNK_RELOC8 ;1006 hunk HUNK_EXT ;1007 hunk HUNK_SYMBOL,symbol ;1008 hunk HUNK_DEBUG,skipcnt ;1009 hunk HUNK_END,end ;1010 hunk HUNK_HEADER ;1011 hunk 1012 ;???? hunk HUNK_OVERLAY ;1013 hunk HUNK_BREAK ;1014 hunk HUNK_DREL32,rel16 ;1015 hunk HUNK_DREL16 ;1016 hunk HUNK_DREL8 ;1017 hunk HUNK_LIB ;1018 hunk HUNK_INDEX ;1019 hunk HUNK_RELOC32SHORT,rel16 ;1020 hunk HUNK_RELRELOC32,rrel16 ;1021 ifne _hunk-HUNK_RELRELOC32-1 fail Invalid number of hunks! endc FlushNoInsertX move.l a3,d0 sub.l a2,d0 FlushNoInsert move.l a2,a1 add.l d0,a2 FlushSkip move.l d2,a0 add.l d0,d5 call ss,ChkWrite cmp.l a2,a3 bne.s FlushLoop tstv.l Arg_Quiet bne.s Return5 move.l d5,d0 moveq #100,d1 get.l utilitybase,a0 jsr _LVOUMult32(a0) move.l d4,d1 jsr _LVOUDivMod32(a0) pop d1 move.w d0,-(sp) get.l Arg_To,d3 get.l Arg_File,d2 mpush d1-d5 lea 4(sp),a1 dtl.l <%s =',62,' %s: %lu =',62,' %lu (%u%%)>,a0 jump Printf hunk_rel16 moveq #-31,d2 bra.s HunkReloc RelocRead16 moveq #0,d0 move.w (a2)+,d0 Return5 rts hunk_rel32 moveq #2,d2 HunkReloc tst.l d3 beq.s InvalidEQ1 RelocLoop bsr.s RelocRead beq.s RelocReturn move.l d0,d1 bsr.s RelocRead vcmp.l Hunks,d0 bcc Invalid lsl.l #2,d0 lea (a4,d0.l),a0 move.l d1,d0 tst.l d4 bne.s RelocScan lsl.l #2,d0 move.l (a0),a1 add.l d0,(a0) tst.l d2 bmi.s RelocCopy16 move.l a2,a0 add.l d0,a2 call exec,CopyMemQuick bra.s RelocLoop RelocCopy16 subq.l #1,d1 RC16Loop clr.w (a1)+ move.w (a2)+,(a1)+ dbra d1,RC16Loop bra.s RelocLoop RelocScan add.l d1,(a0) rol.l d2,d0 bsr SkipBytes bra.s RelocLoop RelocRead cmp.l a2,d7 beq InvalidEnd tst.l d2 bmi.s RelocRead16 move.l (a2)+,d0 rts RelocReturnRR cmp.l a3,d7 beq.s InvalidEQ1 clr.w (a3) move.l a3,d0 addq.l #3,d0 and.w #~3,d0 move.l d0,a3 RelocReturn move.l a2,d0 addq.l #3,d0 and.w #~3,d0 move.l d0,a2 rts hunk_rrel16 tst.l d3 InvalidEQ1 beq Invalid moveq #-1,d2 tst.l d4 bne.s RRel16Loop move.l d0,(a3)+ RRel16Loop bsr.s RelocRead tst.l d4 bne.s SkipCpNum16 move.w d0,(a3)+ SkipCpNum16 tst.w d0 beq.s RelocReturnRR addq.l #1,d0 lsl.l #1,d0 bsr.s CopyBytes ;or SkipBytes if d4\ne0 bra.s RRel16Loop hunk_skipcnt bsr.s SymInit moveq #0,d2 bsr.s RelocRead tst.l d6 beq.s SymbolSkip move.l d0,(a3)+ SymbolSkip push d4 move.l d6,d4 subq.l #1,d4 subx.l d4,d4 bsr.s CopyLongs pop d4 Return1 rts SymInit get.l Arg_KeepDebug,d6 beq.s Return6 PutnRet move.l d0,(a3)+ Return6 rts hunk_symbol moveq #0,d2 bsr.s SymInit SkipSymbol bsr.s RelocRead tst.l d6 beq.s KeepNull move.l d0,(a3)+ KeepNull tst.l d0 beq.s Return1 addq.l #1,d0 bsr.s SymbolSkip bra.s SkipSymbol CopyLongs lsl.l #2,d0 CopyBytes tst.l d4 bne SkipBytes move.l d7,d1 sub.l a2,d1 cmp.l d0,d1 bcs InvalidEnd move.l a2,a0 move.l a3,a1 add.l d0,a2 add.l d0,a3 cmp.l a0,a1 beq.s Return1 cmp.l a3,a0 bcc.s JumpCopyMem lsr.l #2,d0 bcc.s CopyQuad move.w (a0)+,(a1)+ CopyQuad move.w d0,d1 swap d0 bra.s MyCopyInto MyCopyLoop move.l (a0)+,(a1)+ MyCopyInto dbra d1,MyCopyLoop dbra d0,MyCopyLoop rts JumpCopyMem jump exec,CopyMem hunk_end tst.l d3 beq Invalid HunkEndJump tst.l d4 beq.s Pass1Done ifd DEBUG dtl ,a0 call ss,PutsNL endc moveq #64,d0 lsl.l #4,d0 moveq #96,d1 lsl.l #3,d1 moveq #0,d2 call ss,TrackPool put.l d0,RelocPool push d3 move.l d0,d3 get.l Hunks,d2 move.l d2,d0 lsl.l #2,d0 lea (a4,d0.l),a2 push a4 bra.s AllocRelocInto AllocRelocLoop move.l (a4),d0 lsl.l #2,d0 move.l d0,(a2)+ beq.s NoAllocReloc move.l d3,a0 call PoolAlloc NoAllocReloc move.l d0,(a4)+ AllocRelocInto dbra d2,AllocRelocLoop pop a4 pop d3 move.l d4,a2 moveq #0,d4 vmovev.l OldKeepDebug,Arg_KeepDebug rts Pass1Done ifd DEBUG push d0 dtl ,a0 call ss,PutsNL pop d0 endc put.l a2,BackupA2 mpush d0/d7/a4 get.l Hunks,d6 move.l d6,d3 lsl.l #2,d6 move.l (v),a6 lea (a4,d6.l),a2 ;A2=RelLengths, A4=RelEnds moveq #0,d4 ;define to 16 if at least 1 32bit moveq #0,d5 ;saved bytes by 16bit header tstv.l Arg_Reloc32 bne.s Only32Fake get.l RelocPool,a0 move.l d6,d0 call PoolAlloc push a3 move.l d0,a3 add.l d6,a3 push a3 bra.s NormalPtrsInto NormalPtrsLoop move.l (a2)+,d0 sub.l d0,(a4) move.l d0,d7 move.l (a4)+,a0 beq.s EmptyHunk move.l a0,d2 lsr.l #2,d0 call SortLongs moveq #0,d0 move.l d2,a0 move.l d7,d1 EdgeLoop move.l d0,d2 add.l d1,d2 lsr.l #1,d2 and.w #~3,d2 cmp.l d0,d2 beq.s EdgeFound tst.w (a0,d2.l) bne.s EdgeDown move.l d2,d0 move.l d1,d2 EdgeDown move.l d2,d1 bra.s EdgeLoop Only32Fake subq.l #1,d3 Only32Loop move.l (a4),a0 move.l (a2)+,d0 sub.l d0,a0 move.l a0,(a4)+ lsr.l #2,d0 call SortLongs dbra d3,Only32Loop bra.s FromFaked32 EdgeFound tst.w (a0,d0.l) bne.s EdgeFix addq.l #4,d0 EdgeFix add.l d0,d5 addq.l #8,d5 EmptyHunk move.l d0,-(a3) ;real # of 16bit relocs beq.s NormalPtrsInto moveq #16,d4 subq.l #8,d0 bhi.s MoreThatTwo sub.l d0,d5 subq.l #8,d5 subq.l #8,d5 clr.l (a3) MoreThatTwo sub.l d4,d5 NormalPtrsInto dbra d3,NormalPtrsLoop ;A2=TotalEnd, A4=RelLengths mpop a0/a3 FromFaked32 move.l d6,d3 lsr.l #2,d3 subq.l #1,d3 sub.l d6,a2 sub.l d6,a2 ;A2=RelStarts, A4=RelLengths sub.l d4,d5 bmi.s Hunks32 beq.s Hunks32 tst.l d4 beq.s Hunks32 mpush d3/a0/a2/a4 moveq #8,d0 H16SizeLoop move.l -(a0),d1 beq.s H16SizeSkip lsr.l #1,d1 addq.l #4,d1 add.l d1,d0 H16SizeSkip dbra d3,H16SizeLoop and.w #~3,d0 bsr ReserveReloc movem.l 4(sp),d3/a0/a2/a4 move.l #HUNK_DREL32,(a3)+ dtl ,a6 H16Loop move.l -(a0),d0 sub.l d0,(a4)+ lsr.l #2,d0 move.l (a2),a1 beq.s H16SkipAll move.w d0,(a3)+ subq.w #1,d0 move.w 6(sp),(a3) ;Desthunk sub.w d3,(a3)+ H16InLoop addq #2,a1 move.w (a1)+,(a3)+ dbra d0,H16InLoop bsr CheckWordLimit ;# of relocs>65535 ?!? H16SkipAll move.l a1,(a2)+ dbra d3,H16Loop clr.w (a3)+ move.w a3,d0 ror.w #2,d0 bcc.s H16Aligned clr.w (a3)+ H16Aligned pop a3 mpop d3/a0/a2/a4 Hunks32 moveq #0,d0 move.l d3,d2 push a4 H32SizeLoop move.l (a4)+,d1 beq.s H32SizeInto addq.l #8,d1 add.l d1,d0 H32SizeInto dbra d2,H32SizeLoop pop a4 tst.l d0 beq.s HunksDone addq.l #8,d0 bsr.s ReserveReloc move.l #HUNK_RELOC32,(a3)+ move.l d3,d2 moveq #0,d5 ;Current DestHunk H32Loop move.l (a2)+,a0 move.l (a4)+,d0 beq.s H32Skip move.l d0,d1 lsr.l #2,d1 move.l d1,(a3)+ move.l d5,(a3)+ move.l a3,a1 add.l d0,a3 call exec,CopyMemQuick H32Skip addq.l #1,d5 dbra d2,H32Loop clr.l (a3)+ pop a3 HunksDone get.l RelocPool,a0 call ss,FreeObject get.l BackupA2,a2 moveq #0,d3 moveq #0,d4 pop (a3) tstv.l Arg_NoEnd bne.s IsNoEnd addq #4,a3 IsNoEnd mpop d7/a4 Return4 rts ReserveReloc add.l a3,d0 vcmp.l BackupA2,d0 bls.s ReserveReturn sub.l a3,d0 push d0 addq.l #8,d0 addq.l #4,d0 call ss,TrackAllocPub geta FirstInsert,a0 get.l LastInsert,d1 beq.s NoLastInsert move.l d1,a0 NoLastInsert move.l d0,(a0) put.l d0,LastInsert move.l d0,a1 clr.l (a1)+ ;^NextInsert move.l a3,(a1)+ ;^InsertPoint pop (a1)+ ;^InsertLength move.l a3,d0 move.l a1,a3 ReserveReturn move.l (sp),a0 move.l d0,(sp) jmp (a0) hunk_main bsr.s HunkMainInit push a3 bsr.s GetLong move.l d0,d2 bsr CopyLongs move.w d2,d0 swap d2 move.l a3,d1 cmp.l d0,d0 ;ZF=1 bra.s SqueezeInto GetLong cmp.l a2,d7 beq.s Invalid move.l (a2)+,d0 tst.l d4 bne.s Return2 move.l d0,(a3)+ Return2 rts HunkMainInit tst.l d3 beq.s WereFree push d0 move.l #HUNK_END,d0 bsr HunkEndJump pop d0 tst.l d3 bne.s HMI_Skip WereFree tst.l d4 beq PutnRet HMI_Skip addq #4,sp rts SqueezeLoop tst.l -(a3) SqueezeInto dbne d0,SqueezeLoop dbne d2,SqueezeLoop beq.s TotalSqueeze addq #4,a3 TotalSqueeze sub.l a3,d1 lsr.l #2,d1 pop a0 sub.l d1,(a0) JumpFromBSS get.l Hunks,d0 move.l a4,a0 bra.s ClrHunkTabInto hunk_bss bsr.s HunkMainInit bsr.s GetLong bra.s JumpFromBSS ClrHunkTabLoop clr.l (a0)+ ClrHunkTabInto dbra d0,ClrHunkTabLoop move.l a2,d4 vmovev.l Arg_KeepDebug,OldKeepDebug clrv.l Arg_KeepDebug moveq #-1,d3 Return3 rts SkipBytes add.l d0,a2 cmp.l a2,d7 bcc.s Return3 InvalidEnd move.l d7,a2 Invalid vsub.l FileStart,a2 push a2 dtl ,a0 vpush Arg_File ErrorSSA1 move.l sp,a1 jump ss,ExitError ifd DEBUG EXIT jump ss,ExitCleanup endc tags template dv.l Arg_File dv.l Arg_To dv.l Arg_KeepDebug dv.l Arg_Reloc32 dv.l Arg_NoEnd dv.l Arg_Quiet finish end ShortRel dvitype /bin.new.exp/dvitype RELOC32 ShortRel gftodvi /bin.new.exp/gftodvi RELOC32 ShortRel gftopk /bin.new.exp/gftopk RELOC32 ShortRel gftype /bin.new.exp/gftype RELOC32 ShortRel inimf /bin.new.exp/inimf RELOC32 ShortRel initex /bin.new.exp/initex RELOC32 ShortRel mft /bin.new.exp/mft RELOC32 ShortRel pltotf /bin.new.exp/pltotf RELOC32 ShortRel tftopl /bin.new.exp/tftopl RELOC32 ShortRel vftovp /bin.new.exp/vftovp RELOC32 ShortRel virmf /bin.new.exp/virmf RELOC32 ShortRel virtex /bin.new.exp/virtex RELOC32 ShortRel vptovf /bin.new.exp/vptovf RELOC32 ShortRel MakeInfo /bin.new.exp/MakeInfo RELOC32 ShortRel tr2tex /bin.new.exp/tr2tex RELOC32 ShortRel dvi2tty /bin.new.exp/dvi2tty RELOC32 ShortRel disdvi /bin.new.exp/disdvi RELOC32 ShortRel DVIprint /bin.new.exp/DVIprint RELOC32 ShortRel flib /bin.new.exp/flib RELOC32 ShortRel PToFront /bin.new.exp/PToFront RELOC32 ShortRel TeXindex /bin.new.exp/TeXindex RELOC32 ShortRel ShowDVI /bin.new.exp/ShowDVI RELOC32 ShortRel SpecialHost /bin.new.exp/SpecialHost RELOC32 ShortRel bm2font /bin.new.exp/bm2font RELOC32 A2=000EEE44, D3=00000000, D4=00000000 - Got HUNK_CODE A2=00102524, D3=FFFFFFFF, D4=00102524 - Got HUNK_DREL32 A2=00102E08, D3=FFFFFFFF, D4=00102524 - Got HUNK_RELOC32 A2=00102E1C, D3=FFFFFFFF, D4=00102524 - Got HUNK_DATA A2=00102524, D3=FFFFFFFF, D4=00000000 - Got HUNK_DREL32 A2=00102E08, D3=FFFFFFFF, D4=00000000 - Got HUNK_RELOC32 A2=00102E1C, D3=FFFFFFFF, D4=00000000 - Got HUNK_DATA A2=00103308, D3=FFFFFFFF, D4=00103308 - Got HUNK_RELOC32 A2=00103320, D3=FFFFFFFF, D4=00103308 - Got HUNK_BSS A2=00103308, D3=FFFFFFFF, D4=00000000 - Got HUNK_RELOC32 A2=00103320, D3=FFFFFFFF, D4=00000000 - Got HUNK_BSS A2=00103328, D3=FFFFFFFF, D4=00103328 - Got HUNK_END A2=00103328, D3=FFFFFFFF, D4=00000000 - Got HUNK_END A2=0010332C, D3=00000000, D4=00000000 - bm2font => :t/shortrel.res: 83208 => 80888 (97%)