рд╕реЗрдЧрд╛ рдХреЗ рд▓рд┐рдП рд╣реИрдХрд┐рдВрдЧ рдХреНрд▓рд╛рд╕рд┐рдХ рд╕реЛрдирд┐рдХ рд╣реЗрдЬрд╣реЛрдЧ

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рд╕реЗрдЧрд╛ рдореЗрдЧрд╛ рдбреНрд░рд╛рдЗрд╡ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕рд┐рджреНрдз рдЧреЗрдо рд╕реЛрдирд┐рдХ рд╣реЗрдЬ рд╣реЙрдЧ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдЙрдкрдХрд░рдг рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд╕рд╛рде рд╣реА рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдпрд╛, рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, рд╣реИрдХрд┐рдВрдЧред рдЗрд╕ рдЦреЗрд▓ рдореЗрдВ рд▓рдЧрднрдЧ рд╕реМ рд╣реИрдХ рд╣реИрдВ , рдЬрд┐рдирдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпреЛрдЧреНрдп рдХрд╛рд░реНрдп (рдЬреИрд╕реЗ рдкрд╛рдирд╛ рдбреЗрд░ рд╣реЗрдЬрд╣реЛрдЧ рдпрд╛ рд╕реЛрдирд┐рдХ рд░реАрдорд╛рд╕реНрдЯрд░реНрдб ), рдФрд░ рдЕрдЬреАрдм рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдбрд░рд╛рд╡рдирд╛ (рдЬреИрд╕реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдзреНрд╡рдирд┐ рд░реЛрдо рд╣реИрдХ )ред рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП, рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЕрд╕реЗрдВрдмрд▓рд░ рднрд╛рд╖рд╛ рдореЗрдВ рдХреИрд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реИ рдореЛрдЯреЛрд░реЛрд▓рд╛ 68K (рдЖрдорддреМрд░ рдкрд░ рдЙрди рд╕рдордп рдХреЗ рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рдЧреЗрдо рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдереЗ), рдЦреЗрд▓ рдХреЗ рдЕрд╕рдВрддреБрд╖реНрдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЗрд╕рдХреЗ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдЗрдВрдЬрди рдХреНрдпрд╛ рд╣реИред


рд╕реЛрдирд┐рдХ рд╣реИрдХ


рд╕реЗрдЧрд╛ рдХреЗ рд▓рд┐рдП рд░реЙрдо рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдбрд┐рд╕реНрд╕реИрд╕ рдХрдорд░реНрд╢рд┐рдпрд▓ рдбрд┐рд╕реИрдореНрдмрд▓рд░ рдФрд░ рдЖрдИрдбреАрдП рдкреНрд░реЛ рдбрд┐рдмрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдлрд┐рд░ рдбрд┐рдмрдЧрд░ (рдФрд░ рд╕рд░рд▓рддрд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдЪреНрдЪреЗ рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд, рд╕рдВрд░рдЪрд┐рдд рдФрд░ рдХрдВрдШреА рдХрд░рдиреЗ рдХреА рдПрдХ рд╢реНрд░рдорд╕рд╛рдзреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рд╕реЗрдЧрд╛ рдореЗрдЧрд╛ рдбреНрд░рд╛рдЗрд╡ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреА рддрдХрдиреАрдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЧреЗрдо рдХреА рдЕрдЪреНрдЫреА рд╕рдордЭ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, GitHub рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Sonic the Hedgehog рд╕реАрд░реАрдЬрд╝ рдореЗрдВ рд╕рднреА рдЦреЗрд▓реЛрдВ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдЕрд╕рдВрддреБрд╖реНрдЯ рдФрд░ рдЯреИрдЧ рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдХрд┐ Sonic Retro рдХреЗ рд╕рдорд░реНрдерди рд╕реЗ рдЙрддреНрд╕рд╛рд╣реА рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рд╣реИрдВ ред рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдмрд╣реБрдд рдкрд╣рд▓реЗ рдЧреЗрдо рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЪрд┐рд╣реНрдирд┐рдд рдФрд░ рд╕рдВрд░рдЪрд┐рдд рд╣реИред рдХреЛрдб рдХрд╛ рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА sonicretro / s1disasm рдореЗрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рд▓реЗрдЦ рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рдЦрд┐рд▓реМрдиреЗ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╡рд┐рд╕рд░реНрдЬрди рд╕рд┐рджреНрдзрд╛рдВрдд рд╕реЗ рд╢реБрд░реВ рд╣реЛрдЧрд╛ред




Sega Mega Drive ( Sega Genesis) 32- Motorola MC68000 ( Motorola 68K) Zilog Z80 ( Z80 ). (RAM) тАУ 64K. ( ) тАУ 320x224 .


Motorola 68K . , . Motorola 68K Apple Macintosh.


Mega Drive Yamaha YM7101 80 . ; Sega Mega Drive " Sega Mega Drive: Video Display Processor".


AS. 82 . : ResearchGate Intel Core i7 338 .


32- : D0тАУD7. . A0тАУA7. - . A7 SP.


. .l (long) 32- . .w (word) .b (byte) 16- 8- .


Motorola 68K.



move тАУ .


:


  • move.l #48, d4 тАУ 48 d4.
  • move.w d5, d6 тАУ 16 d5 d6.
  • move.w #$12FF, obStatus(a0) тАУ 12FF , obStatus , a0.

, #. #$.


:


  • move.l #5, (a0) тАУ 5 , a0.
  • move.l (a1), d2 тАУ , a1, d2.

(a*).



  • add тАУ .
  • sub тАУ  .
  • mulu тАУ ; muls тАУ .
  • divu тАУ ; divs тАУ .

:


  • add.b #$08, d0 тАУ 08 d0.
  • sub.w (v_screenposx).w, d1 тАУ d1 v_screenposx ( 16- ).
  • mulu.w #10, d0 тАУ  d0 10 ( d0 ).
  • divs.w #$68, d2 тАУ  d2 68 ( d2 ).


  • jmp, bra тАУ .
  • jsr, bsr тАУ , rts тАУ ( call ret x86).

:


jmp .foo  ;     .foo
nop       ;    (nop)   
.foo:     ;  .foo

SubRoutine:  ;   SubRoutine
nop
rts          ;   

bsr SubRoutine  ;   SubRoutine


68K CCR (Condition Code Register). cmp, tst btst () , beq, bne, bge, ble .


  • cmp тАУ  .
  • tst тАУ .
  • btst тАУ .
  • beq/bne тАУ , / .
  • bge/ble тАУ , / .

:


cmp.w   #32,d0  ;  d0  32
bge.s   .foo    ;  d0 > 32,    .foo

btst    #0,d0  ;   ()  d0  
bne.s   .foo   ;     ,    .foo

Motorola 68K ( ) , .



s1disasm Python-, . Sonic the Hedgehog "Kosinski compression", ( ).


, , git- AS (git checkout AS) :


./build.py

ROM- s1built.bin. Sega Mega Drive. macOS, , OpenEmu.



тАУ sonic.asm. : Zilog Z80 (WaitForZ80), (VDPSetupGame) . GameInit MainGameLoop, .


, Variables.asm. RAM, .


v_gamemode. :


  • 00 тАУ  "Sega",
  • 01 тАУ  ,
  • 08 тАУ ,
  • 0C тАУ ,
  • 10 тАУ special stage,
  • 14 тАУ "Continue",
  • 18 тАУ ,
  • 1C тАУ ,
  • 8C тАУ .

move.b #id_Sega,(v_gamemode).w GameInit v_gamemode , . id_Sega id_Title ./build.py, , "Sega" , .


v_gamemode , . , id_Title GM_Title, id_Level тАУ GM_Level.



, Variables.asm . v_sonspeedmax, v_sonspeedacc v_sonspeeddec.


, Sonic_Main, : , , :


move.w  #$600,(v_sonspeedmax).w  ; Sonic's top speed
move.w  #$C,(v_sonspeedacc).w    ; Sonic's acceleration
move.w  #$80,(v_sonspeeddec).w   ; Sonic's deceleration

, 256. , 0xC / 256 = 0.046875, тАУ 0x80 / 256 = 0.5 ( ).



Mega Drive Sega 315тАС5313 (Video Display Processor, VDP). VDP , vdp_data_port vdp_control_port. VDPSetupGame, VDPSetupArray. , , . , GM_Level. VDP Sega Retro.


Low Color ( Mode Register 1 ):



Video Display Processor тАУ background ( B) foreground ( A), , . 8x8 . ; тАУ 4x4 . , 32x32 .


(LoadTilesAsYouMove, DrawChunks) (BuildSprites) , :



, LoadTilesAsYouMove . Sonic the Hedgehog 64x32 512x256 .


foreground- Green Hill Zone, GIF-, 5 :

, , . , . , 3D- . Sonic the Hedgehog.


Marble Zone, GIF-, 1 :


8192 RAM . v_objspace. , . : , , , , , . DisplaySprite.


рд╕реЛрдирд┐рдХ рдЦреЗрд▓ рд╡рд╕реНрддреБрдУрдВ


64 . , , Constants.asm. a0. , :


  • ObX(a0), ObY(a0) тАУ  .
  • ObVelX(a0), ObVelX(a1) тАУ 1/256 .
  • obHeight(a0), obWidth(a0) тАУ .
  • obSubtype(a0) тАУ (: ).
  • obStatus(a0) тАУ .
  • obRoutine(a0) тАУ .

, X , Y, .


ExecuteObjects . , . Object Pointers.asm. _incObj.


, (, , , "" ). , , obRoutine.


SpeedToPos. , .


: no-ring challenge


, : no-ring challenge. . , ( ).


"" тАУ Ring_Main (bra) :


Ring_Main:  ; Routine 0
    bra.w   Ring_Delete ;      

    lea (v_objstate).w,a2
    moveq   #0,d0
    move.b  obRespawnNo(a0),d0
    ; ...

. "" 26 Monitor.asm. obSubtype 1 . , 6. cmp beq , :


Mon_Main:   ; Routine 0
    cmp.b   #6,obSubtype(a0)  ;   ?
    beq     DeleteObject      ;  ,  

    addq.b  #2,obRoutine(a0)
    move.b  #$E,obHeight(a0)
    ; ...

, ROM' , . GitHub. , - , .


:


, . Sonic the Hedgehog 3 тАУ .


GIF-, , 1 :

Sonic the Hedgehog 3


, , Sonic Retro. , , , 64 , . . 0.1875 , . , 0.75.


, , , , , "" .



"", 25 & 37 Rings.asm. :


Ring_Index:
ptr_Ring_Main:      dc.w Ring_Main-Ring_Index
ptr_Ring_Animate:   dc.w Ring_Animate-Ring_Index
ptr_Ring_Collect:   dc.w Ring_Collect-Ring_Index
ptr_Ring_Sparkle:   dc.w Ring_Sparkle-Ring_Index
ptr_Ring_Delete:    dc.w Ring_Delete-Ring_Index

: Main тАУ ; Animate тАУ ; Collect тАУ  ; Sparkle тАУ ; Delete тАУ . , , ptr_Ring_Animate.


obStatus. , . obStatus ( ) . bset, , тАУ btst.


Ring_Animate , , , 64 :


Ring_Animate: ; Routine 2
    tst.b   (v_shield).w  ;    ?
    beq.s   .animate      ;  , 

.dist_from_sonic:
    ;    
    move.w  (v_player+obX).w,d0  ;     X  d0
    sub.w   obX(a0),d0           ; d0 =   X
    move.w  (v_player+obY).w,d1  ;     Y  d1
    sub.w   obY(a0),d1           ; d1 =   Y

.check_magnetised:
    ; ,        
    btst    #0,obStatus(a0)  ;   obStatus  0?
    bne.s   .attract         ;   =>  ,   .attract

.check_near_x:
    ;    ,  
    cmp.w   #64,d0    ;   X > 64?
    bge.s   .animate  ;  , 
    cmp.w   #-64,d0   ;   X < -64?
    ble.s   .animate  ;  , 

.check_near_y:
    cmp.w   #64,d1    ;   Y > 64?
    bge.s   .animate  ;  , 
    cmp.w   #-64,d1   ;   Y < -64?
    ble.s   .animate  ;  , 

    ;    64x64,   
    bset    #0,obStatus(a0)

.attract:
    ;      

.animate:
    ; ...

, , . :


if sign(obVelX) == sign(distX):

, ( Motorola 68K) , 0 , 1 тАУ . "" тАУ XOR (eor Motorola 68K).


, ( ) , (0.1875 0.75) 256 ( 48 192 ).


:


.attract:
    ;     X
    move.w #48,d4          ;   d4  48
    move.w  obVelX(a0),d3  ;     X  d3
    eor.w   d0, d3         ;      
    btst    #$F,d3         ;  15-   1 ( )...
    beq.s   .x_towards     ;   x_towards
    move.w #192,d4         ;   ,   d4  192

.x_towards:
    ;    ,    (neg)   (d4)
    cmp.w   #0,d0
    bge.s   .attract_x
    neg d4

.attract_x:
    ;     X    X
    add.w   d4,obVelX(a0)

    ;      Y:
    move.w #48,d4
    move.w  obVelY(a0),d3
    eor.w   d1,d3
    btst    #$F,d3
    beq.s   .y_towards
    move.w #192,d4

.y_towards:
    cmp.w   #0,d1
    bge.s   .attract_y
    neg d4

.attract_y:
    add.w   d4,obVelY(a0)

.animate:
    ; ...

, , SpeedToPos:


.animate:
    jsr (SpeedToPos).l

ROM , тАФ тАФ Sonic 3 Sonic 1!


GIF- , 3.5 :

GitHub , .



. (SonED2, Chaos), , . / Motorola 68K EASy68K, , Sega.


, , . , - , , .




All Articles