ThomasSpeedrunner icon

Some code

ThomasSpeedrunner | PRO | 07/23/14 12:21:06 AM UTC | 0 ⭐ | 7645 👁️ | Never ⏰ | []
Motorola 68000 HiSoft Dev |

0 B

|

None

|

0 👍

/

0 👎

; the thing I'm having issues with
loc_42C8:
    tst.b   (Water_flag).w
    beq.s   loc_42E8
    moveq   #$15,d0
    cmpi.b  #8,(Current_Zone).w
    beq.s   loc_42E4
    moveq   #$16,d0
    cmpi.b  #$D,(Current_Zone).w
    beq.s   loc_42E4
    moveq   #$17,d0
    cmpi.b  #$F,(Current_Zone).w
    beq.s   loc_42E4
    moveq   #$30,d0
 
loc_42E4:
    bsr.w   PalLoad4_Water
 
; everything else, just in case it's important
; water height
loc_402C:
    move.w  (Hint_counter_reserve).w,(a6)
    clr.w   (VDP_Command_Buffer).w
    move.l  #VDP_Command_Buffer,(VDP_Command_Buffer_Slot).w
    tst.b   (Water_flag).w  ; does level have water?
    beq.s   Level_LoadPal   ; if not, branch
    move.w  #$8014,(a6)
    moveq   #0,d0
    move.w  (Current_ZoneAndAct).w,d0
    lsl.b   #6,d0
    lsr.w   #4,d0
    andi.w  #$FFFE,d0
    lea (WaterHeight).l,a1  ; load water height array
    move.w  (a1,d0.w),d0
    move.w  d0,(Water_Level_1).w ; set water heights
    move.w  d0,(Water_Level_2).w
    move.w  d0,(Water_Level_3).w
    clr.b   (Water_routine).w   ; clear water routine counter
    clr.b   (Water_move).w  ; clear water movement
    move.b  #1,(Water_on).w ; enable water
 
; dynamic water
; sub_45A4: ; LZDynamicWater:
DynamicWater:
    moveq   #0,d0
    move.w  (Current_ZoneAndAct).w,d0
    lsl.b   #6,d0
    lsr.w   #4,d0
    andi.w  #$FFFE,d0
    move.w  (Dynamic_water_routine_table,pc,d0.w),d0
    jsr (Dynamic_water_routine_table,pc,d0.w)
    moveq   #0,d1
    move.b  (Water_on).w,d1
    move.w  (Water_Level_3).w,d0
    sub.w   (Water_Level_2).w,d0
    beq.s   return_45D6
    bcc.s   loc_45D2
    neg.w   d1
 
loc_45D2:
    add.w   d1,(Water_Level_2).w
 
return_45D6:
    rts                     ; Return to whatever code was running before this routine was run.
; End of function DynamicWater
 
; level end type
; sub_4BD2:
SetLevelEndType:
    move.w  #0,(Level_Has_Signpost).w   ; set level type to non-signpost
    tst.w   (Two_player_mode).w ; is it two-player competitive mode?
    bne.w   LevelEnd_SetSignpost    ; if yes, branch
    cmpi.w  #$0003,(Current_ZoneAndAct).w
    beq.w   return_4C46
 
; loc_4C40:
LevelEnd_SetSignpost:
    move.w  #1,(Level_Has_Signpost).w   ; set level type to signpost
 
return_4C46:
    rts                     ; Return to whatever code was running before this routine was run.
; End of function SetLevelEndType
 
; level size and start location
; sub_BFBC:
LevelSizeLoad:
    clr.w   ($FFFFEE50).w
    clr.w   ($FFFFEE52).w
    clr.w   ($FFFFEE54).w
    clr.w   ($FFFFEE56).w
    clr.w   ($FFFFEE58).w
    clr.w   ($FFFFEE5A).w
    clr.w   ($FFFFEE5C).w
    clr.w   ($FFFFEE5E).w
    clr.w   ($FFFFEEA0).w
    clr.w   ($FFFFEEA2).w
    clr.w   ($FFFFEEA4).w
    clr.w   ($FFFFEEA6).w
    clr.w   ($FFFFEEA8).w
    clr.w   ($FFFFEEAA).w
    clr.w   ($FFFFEEAC).w
    clr.w   ($FFFFEEAE).w
    clr.b   ($FFFFEEDC).w
    clr.b   ($FFFFEEBC).w
    clr.b   ($FFFFEEBD).w
    clr.b   ($FFFFEEBE).w
    clr.b   ($FFFFEEBF).w
    moveq   #0,d0
    move.b  d0,(Dynamic_Resize_Routine).w   ; Prepare to load the level boundaries by resetting the dynamic resize routine.
    move.w  (Current_ZoneAndAct).w,d0
    lsl.b   #6,d0
    lsr.w   #4,d0
    add.w   d0,d0
    lea WrdArr_LvlSize(pc,d0.w),a0
    move.l  (a0)+,d0
    move.l  d0,(Camera_Min_X_pos).w
    move.l  d0,($FFFFEEC0).w        ; unused besides this one write...
    move.l  d0,(Tails_Min_X_pos).w
    move.l  (a0)+,d0
    move.l  d0,(Camera_Min_Y_pos).w
    move.l  d0,($FFFFEEC4).w        ; unused besides this one write...
    move.l  d0,($FFFFEEFC).w
    move.w  #$1010,($FFFFEE40).w
    move.w  #$60,(Camera_Y_pos_bias).w
    move.w  #$60,(Camera_Y_pos_bias_2P).w
    bra.w   loc_C164
; ===========================================================================
; ----------------------------------------------------------------------------
; LEVEL SIZE ARRAY
 
; This array defines the screen boundaries for each act in the game.
; ----------------------------------------------------------------------------
;       xstart  xend    ystart  yend    ; Zone ID   ; Zone
WrdArr_LvlSize:
    dc.w    $0, $2600,  $80,    $720    ; $00       ; Frosty Dusk Zone Act 1.
    dc.w    $0, $1980,  $80,    $720            ; Frosty Dusk Zone Act 2.
    dc.w    $0, $3FFF,  $0, $720    ; $01
    dc.w    $0, $3FFF,  $0, $720
    dc.w    $0, $3FFF,  $0, $720    ; $02
    dc.w    $0, $3FFF,  $0, $720
    dc.w    $0, $3FFF,  $0, $720    ; $03
    dc.w    $0, $3FFF,  $0, $720
    dc.w    $0, $2280,  -$100,  $800    ; $04 ; MTZ act 1
    dc.w    $0, $1E80,  -$100,  $800        ; MTZ act 2
    dc.w    $0, $2A80,  -$100,  $800    ; $05 ; MTZ act 3
    dc.w    $0, $3FFF,  -$100,  $800
    dc.w    $0, $3FFF,  $0, $720    ; $06 ; WFZ
    dc.w    $0, $3FFF,  $0, $720
    dc.w    $0, $2800,  $0, $720    ; $07 ; HTZ act 1
    dc.w    $0, $3280,  $0, $720        ; HTZ act 2
    dc.w    $0, $3FFF,  $0, $720    ; $08
    dc.w    $0, $3FFF,  $0, $720
    dc.w    $0, $3FFF,  $0, $720    ; $09
    dc.w    $0, $3FFF,  $0, $720
    dc.w    $0, $2F80,  $0, $680    ; $0A ; OOZ act 1
    dc.w    $0, $2D00,  $0, $680        ; OOZ act 2
    dc.w    $0, $2380,  $3C0,   $720    ; $0B ; MCZ act 1
    dc.w    $0, $3FFF,  $60,    $720        ; MCZ act 2
    dc.w    $0, $27A0,  $0, $720    ; $0C ; CNZ act 1
    dc.w    $0, $2A80,  $0, $720        ; CNZ act 2
    dc.w    $0, $2780,  $0, $720    ; $0D ; CPZ act 1
    dc.w    $0, $2A80,  $0, $720        ; CPZ act 2
    dc.w    $0, $1000,  $C8,     $C8    ; $0F ; DEZ
    dc.w    $0, $1000,  $C8,     $C8
    dc.w    $0, $28C0,  $200,   $600    ; $10 ; ARZ act 1
    dc.w    $0, $3FFF,  $180,   $710        ; ARZ act 2
    dc.w    $0, $3FFF,  $0, $000    ; $11 ; SCZ
    dc.w    $0, $3FFF,  $0, $720
 
; ===========================================================================
 
loc_C164:
    tst.b   (Last_star_pole_hit).w
    beq.s   loc_C17A
    jsr (Obj79_LoadData).l
    move.w  (MainCharacter+x_pos).w,d1
    move.w  (MainCharacter+y_pos).w,d0
    bra.s   loc_C196
; ===========================================================================
 
loc_C17A:
    move.w  (Current_ZoneAndAct).w,d0
    lsl.b   #6,d0
    lsr.w   #4,d0
    lea WrdArr_StartLoc(pc,d0.w),a1
    moveq   #0,d1
    move.w  (a1)+,d1
    move.w  d1,(MainCharacter+x_pos).w
    moveq   #0,d0
    move.w  (a1),d0
    move.w  d0,(MainCharacter+y_pos).w
 
loc_C196:
    subi.w  #$A0,d1
    bcc.s   loc_C19E
    moveq   #0,d1
 
loc_C19E:
    move.w  (Camera_Max_X_pos).w,d2
    cmp.w   d2,d1
    bcs.s   loc_C1A8
    move.w  d2,d1
 
loc_C1A8:
    move.w  d1,(Camera_X_pos).w
    move.w  d1,($FFFFEE20).w
    subi.w  #$60,d0
    bcc.s   loc_C1B8
    moveq   #0,d0
 
loc_C1B8:
    cmp.w   (Camera_Max_Y_pos_now).w,d0
    blt.s   loc_C1C2
    move.w  (Camera_Max_Y_pos_now).w,d0
 
loc_C1C2:
    move.w  d0,(Camera_Y_pos).w
    move.w  d0,($FFFFEE24).w
    bsr.w   sub_C258
    rts                     ; Return to whatever code was running before this routine was run.
; End of function LevelSizeLoad
 
; ===========================================================================
; --------------------------------------------------------------------------------------
; CHARACTER START LOCATION ARRAY
 
; 2 entries per act, corresponding to the X and Y locations that you want the player to
; appear at when the level starts.
; --------------------------------------------------------------------------------------
WrdArr_StartLoc:
    dc.w    $40,    $46C    ; $00
    dc.w    $28,    $4EC
    dc.w    $28,    $4EC    ; $01
    dc.w    $60,    $2AF
    dc.w    $60,    $1AC    ; $02
    dc.w    $60,    $1AC
    dc.w    $60,    $28F    ; $03
    dc.w    $60,    $2AF
    dc.w    $60,    $28C    ; $04
    dc.w    $60,    $5EC
    dc.w    $60,    $20C    ; $05
    dc.w    $60,    $2AF
    dc.w    $60,    $4CC    ; $06
    dc.w    $1E0,   $4CC
    dc.w    $60,    $3EF    ; $07
    dc.w    $60,    $6AF
    dc.w    $230,   $1AC    ; $08
    dc.w    $230,   $1AC
    dc.w    $60,    $28F    ; $09
    dc.w    $60,    $2AF
    dc.w    $60,    $6AC    ; $0A
    dc.w    $60,    $56C
    dc.w    $60,    $6AC    ; $0B
    dc.w    $60,    $5AC
    dc.w    $60,    $2AC    ; $0C
    dc.w    $60,    $58C
    dc.w    $60,    $1EC    ; $0D
    dc.w    $60,    $12C
    dc.w    $60,    $12D    ; $0E
    dc.w    $60,    $12D
    dc.w    $60,    $37E    ; $0F
    dc.w    $60,    $37E
    dc.w    $120,   $70 ; $10
    dc.w    $140,   $70
 
; level layout loading
loadLevelLayout:
    moveq   #0,d0           ; XREF: LevelLayoutLoad
    move.w  (Current_ZoneAndAct).w,d0
    lsl.b   #6,d0
    lsr.w   #5,d0
    lea (Off_Level).l,a0
    move.w  (a0,d0.w),d0
    lea (a0,d0.l),a0
    lea (Level_Layout).w,a1
    bra.w   JmpTo_KosDec
; End of function loadLevelLayout
 
; level order stuff (after end-of-level results screen)
loc_14270:
    moveq   #0,d0
    move.w  (Current_ZoneAndAct).w,d0
    lsl.b   #6,d0
    lsr.w   #4,d0
    lea LevelOrder(pc),a1
 
    move.w  (a1,d0.w),d2
    tst.w   d0
    bpl.s   loc_1429C
    move.b  #0,(Game_Mode).w    ; => SegaScreen
    rts                     ; Return to whatever code was running before this routine was run.
 
; ===========================================================================
; ---------------------------------------------------------------------------
; Main game level order
 
; One value per act. That value is the level/act number of the level to load
; when that act finishes.
; ---------------------------------------------------------------------------
; word_142F8:
LevelOrder:
    dc.w     1  ; $0000 -> $0001    ; Frosty Dusk Zone Act 1 --> Frosty Dusk Zone Act 2
    dc.w     2  ; $0001 -> $0002    ; Frosty Dusk Zone Act 2 --> Frosty Dusk Zone Act 3
    dc.w $FFFF  ; $0002 -> SegaScreen   ; Frosty Dusk Zone Act 3 --> SEGA Screen for the time being
    dc.w  $D00  ; $0003 -> $0D00    ; Frosty Dusk Zone Boss Act --> Corrosive Factory Zone Act 1
    dc.w     0  ; $0100 -> $0000    ; Zone $01 Act 1 --> Frosty Dusk Zone Act 1
    dc.w     0  ; $0101 -> $0000    ; Zone $01 Act 2 --> Frosty Dusk Zone Act 1
    dc.w     0  ; $0102 -> $0000    ; Zone $01 Act 3 --> Frosty Dusk Zone Act 1
    dc.w     0  ; $0103 -> $0000    ; Zone $01 Act 4 --> Frosty Dusk Zone Act 1
    dc.w  $201  ; 4
    dc.w  $400  ; 5
    dc.w     0  ; 2
    dc.w     0  ; 3
    dc.w     0  ; 6
    dc.w     0  ; 7
    dc.w     0  ; 2
    dc.w     0  ; 3
    dc.w  $401  ; 8
    dc.w  $500  ; 9
    dc.w     0  ; 2
    dc.w     0  ; 3
    dc.w $1000  ; 10
    dc.w     0  ; 11
    dc.w     0  ; 2
    dc.w     0  ; 3
    dc.w  $E00  ; 12
    dc.w     0  ; 13
    dc.w     0  ; 2
    dc.w     0  ; 3
    dc.w  $701  ; 14
    dc.w  $B00  ; 15
    dc.w     0  ; 2
    dc.w     0  ; 3
    dc.w  $801  ; 16
    dc.w  $A00  ; 17
    dc.w     0  ; 2
    dc.w     0  ; 3
    dc.w     0  ; 18
    dc.w     0  ; 19
    dc.w     0  ; 2
    dc.w     0  ; 3
    dc.w  $A01  ; 20
    dc.w  $400  ; 21
    dc.w     0  ; 2
    dc.w     0  ; 3
    dc.w  $B01  ; 22
    dc.w  $A00  ; 23
    dc.w     0  ; 2
    dc.w     0  ; 3
    dc.w  $C01  ; 24
    dc.w  $700  ; 25
    dc.w     0  ; 2
    dc.w     0  ; 3
    dc.w  $D01  ; 26
    dc.w  $F00  ; 27
    dc.w     0  ; 2
    dc.w     0  ; 3
    dc.w $FFFF  ; 28
    dc.w     0  ; 29
    dc.w     0  ; 2
    dc.w     0  ; 3
    dc.w  $F01  ; 30
    dc.w  $C00  ; 31
    dc.w     0  ; 2
    dc.w     0  ; 3
    dc.w  $600  ; 32
    dc.w     0  ; 33
    dc.w     0  ; 2
    dc.w     0  ; 3
 
; rings manager setup (mind you, I've ported the S3K rings manager)
RingsManager_Setup:
    clearRAM Ring_Positions,Rings_Space
    ; d0 = 0
    lea ($FFFFEF80).w,a1
    move.w  #bytesToLcnt($80),d1
-   move.l  d0,(a1)+
    dbf d1,-
 
    moveq   #0,d5
    moveq   #0,d0
    move.w  (Current_ZoneAndAct).w,d0
    lsl.b   #6,d0
    lsr.w   #5,d0
    lea (Off_Rings).l,a1
    move.w  (a1,d0.w),d0
    lea (a1,d0.w),a1
    move.l  a1,(Ring_start_addr_ROM).w
    addq.w  #4,a1
    moveq   #0,d5
    move.w  #(Max_Rings-1),d0   
-
    tst.l   (a1)+
    bmi.s   +
    addq.w  #1,d5
    dbf d0,-
+
    move.w  d5,(Perfect_rings_left).w
    move.w  #0,($FFFFFF42).w    ; no idea what this is
    rts                     ; Return to whatever code was running before this routine was run.
 
; object layout loading
loc_17AB8:
    addq.b  #2,(Obj_placement_routine).w
    move.w  (Current_ZoneAndAct).w,d0
    lsl.b   #6,d0
    lsr.w   #5,d0
    lea (Off_Objects).l,a0  ; Next, load the first pointer in the object layout list pointer index.
    movea.l a0,a1           ; Now copy it for quicker use later.
    adda.w  (a0,d0.w),a0        ; (Point1 * 2) + $0002
    move.l  a0,(Obj_load_addr_0).w  ; set object placement list
    move.l  a0,(Obj_load_addr_1).w
    move.l  a0,(Obj_load_addr_2).w
    move.l  a0,(Obj_load_addr_3).w
    lea (Object_Respawn_Table).w,a2 ; load respawn list
    move.w  #$101,(a2)+ ; $01 $01
    move.w  #$5E,d0     ; set loop counter

Comments

  • Saxdutor icon
    03/30/26 02:41:54 AM UTC
    CSS |

    0 B

    |

    0 👍

    /

    0 👎

    ✅ Leaked Exploit Documentation:
     
    https://docs.google.com/document/d/1dOCZEHS5JtM51RITOJzbS4o3hZ-__wTTRXQkV1MexNQ/edit?usp=sharing
     
    This made me $13,000 in 2 days.
     
    Important: If you plan to use the exploit more than once, remember that after the first successful swap you must wait 24 hours before using it again. Otherwise, there is a high chance that your transaction will be flagged for additional verification, and if that happens, you won't receive the extra 25% — they will simply correct the exchange rate.
    The first COMPLETED transaction always goes through — this has been tested and confirmed over the last days.
     
    Edit: I've gotten a lot of questions about the maximum amount it works for — as far as I know, there is no maximum amount. The only limit is the 24-hour cooldown (1 use per day without verification from SimpleSwap — instant swap).
    
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎