рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рд╕реЗрдЧрд╛ рдореЗрдЧрд╛ рдбреНрд░рд╛рдЗрд╡ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕рд┐рджреНрдз рдЧреЗрдо рд╕реЛрдирд┐рдХ рд╣реЗрдЬ рд╣реЙрдЧ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдЙрдкрдХрд░рдг рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд╕рд╛рде рд╣реА рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдпрд╛, рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, рд╣реИрдХрд┐рдВрдЧред рдЗрд╕ рдЦреЗрд▓ рдореЗрдВ рд▓рдЧрднрдЧ рд╕реМ рд╣реИрдХ рд╣реИрдВ , рдЬрд┐рдирдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпреЛрдЧреНрдп рдХрд╛рд░реНрдп (рдЬреИрд╕реЗ рдкрд╛рдирд╛ рдбреЗрд░ рд╣реЗрдЬрд╣реЛрдЧ рдпрд╛ рд╕реЛрдирд┐рдХ рд░реАрдорд╛рд╕реНрдЯрд░реНрдб ), рдФрд░ рдЕрдЬреАрдм рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдбрд░рд╛рд╡рдирд╛ (рдЬреИрд╕реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдзреНрд╡рдирд┐ рд░реЛрдо рд╣реИрдХ )ред рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП, рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЕрд╕реЗрдВрдмрд▓рд░ рднрд╛рд╖рд╛ рдореЗрдВ рдХреИрд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реИ рдореЛрдЯреЛрд░реЛрд▓рд╛ 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
nop
.foo:
SubRoutine:
nop
rts
bsr SubRoutine
68K CCR
(Condition Code Register). cmp
, tst
btst
() , beq
, bne
, bge
, ble
.
cmp
тАУ .tst
тАУ .btst
тАУ .beq
/bne
тАУ , / .bge
/ble
тАУ , / .
:
cmp.w #32,d0
bge.s .foo
btst #0,d0
bne.s .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
move.w #$C,(v_sonspeedacc).w
move.w #$80,(v_sonspeeddec).w
, 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.
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:
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:
cmp.b #6,obSubtype(a0)
beq DeleteObject
addq.b #2,obRoutine(a0)
move.b #$E,obHeight(a0)
, ROM' , . GitHub. , - , .
:
, . Sonic the Hedgehog 3 тАУ .
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:
tst.b (v_shield).w
beq.s .animate
.dist_from_sonic:
move.w (v_player+obX).w,d0
sub.w obX(a0),d0
move.w (v_player+obY).w,d1
sub.w obY(a0),d1
.check_magnetised:
btst #0,obStatus(a0)
bne.s .attract
.check_near_x:
cmp.w #64,d0
bge.s .animate
cmp.w #-64,d0
ble.s .animate
.check_near_y:
cmp.w #64,d1
bge.s .animate
cmp.w #-64,d1
ble.s .animate
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:
move.w #48,d4
move.w obVelX(a0),d3
eor.w d0, d3
btst #$F,d3
beq.s .x_towards
move.w #192,d4
.x_towards:
cmp.w #0,d0
bge.s .attract_x
neg d4
.attract_x:
add.w d4,obVelX(a0)
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!
GitHub , .
. (SonED2, Chaos), , . / Motorola 68K EASy68K, , Sega.
, , . , - , , .