1
Программирование / Ребенок изучает asm [SMD]
« : 06 Апрель 2026, 07:30:39 »
Вот тут у нас - первичный лонч Double Point:
А тут - обработчик кадрового прерывания:
Дизассемблят Double Point я решил взять за основу limited access-source'ного движка бонусной активности для разных хоумбрюшных игр на Neo-Geo. Такой перенос повторяющихся действий с обработчика прерываний на основной код достаточно грамотен?
Предваряя возникающие вопросы, спешу предупредить, что в последней цитате из кода сохранившие свою числовую форму переменные считайте, называются так условно (про то, что work RAM у Neo-Geo и железа Double Point назначен на разные области адресуемого пространства, я таки прекрасно в курсах), LocalFrameCounter должна прирасти в BonusGameLoop или одной из её дочерних подпрограмм (примерно как системный счётчик кадров в оригинальной Double Point), а код с jsr $dfd8.l по clr.l -(A7) пропал потому, что у Double Point он отвечал за считывание аппаратных (в то время как у Neo-Geo за сугубо игровые настройки отвечают программные, да и вообще сложность и пр. у бонусной игры должны плясать от аналогичных параметров материнской игры) DIPов и переход, в зависимости от включенных, в один из нескольких разных сервисных режимов (коих у мини-игры, понятно-дело, быть не может). Сообразуясь с той же логикой, под нож пущены и предварительная чистка ОЗУ.
Код: [Выделить]
000106: 46FC 2700 move #$2700, SR
00010A: 4FF9 0008 4000 lea $84000.l, A7
000110: 41F9 0008 0000 lea $80000.l, A0
000116: 303C 0FFF move.w #$fff, D0
00011A: 20FC 0000 0000 move.l #$0, (A0)+
000120: 51C8 FFF8 dbra D0, $11a
000124: 41F9 0003 F800 lea $3f800.l, A0
00012A: 43F9 0008 0000 lea $80000.l, A1
000130: 3E3C 01FF move.w #$1ff, D7
000134: 22D8 move.l (A0)+, (A1)+
000136: 51CF FFFC dbra D7, $134
00013A: 4EB9 0001 489A jsr $1489a.l
000140: 60FE bra $140
<...>
01489A: 303C 48E7 movem.l D2-D3/A2-A5, -(A7)
01489E: 207C 0000 B97C move.l #$b97c, A0
0148A4: 2408 move.l A0, D2
0148A6: 263C 0008 24EC move.l #$824ec, D3
0148AC: 4EB9 0000 B1C2 jsr $b1c2.l
0148B2: 4241 clr.w D1
0148B4: 207C 0008 24C6 movea.l #$824c6, A0
0148BA: 227C 0000 062A movea.l #$62a, A1
0148C0: 247C 0008 24B2 movea.l #$824b2, A2
0148C6: 267C 0000 063E movea.l #$63e, A3
0148CC: 287C 0008 24DA movea.l #$824da, A4
0148D2: 203C 0000 0652 move.l #$652, D0
0148D8: 20D9 move.l (A1)+, (A0)+
0148DA: 24DB move.l (A3)+, (A2)+
0148DC: 2A40 movea.l D0, A5
0148DE: 38D5 move.w (A5), (A4)+
0148E0: 5241 addq.w #1, D1
0148E2: 5480 addq.l #2, D0
0148E4: 0C41 0005 cmpi.w #$5, D1
0148E8: 65EE bcs $148d8
0148EA: 4EB9 0000 BA14 jsr $ba14.l
0148F0: 4240 clr.w D0
0148F2: 33C0 0008 24EA move.w D0, $824ea.l
0148F8: 33C0 0008 2498 move.w D0, $82498.l
0148FE: 33C0 0008 24F6 move.w D0, $824f6.l
014904: 4EB9 0000 DFD8 jsr $dfd8.l
01490A: 2443 movea.l D3, A2
01490C: 082A 0007 0001 btst #$7, ($1,A2)
014912: 6706 beq $1491a
014914: 4878 0003 pea $3.w
014918: 6022 bra $1493c
01491A: 2043 movea.l D3, A0
01491C: 0828 0004 0001 btst #$4, ($1,A0)
014922: 6706 beq $1492a
014924: 4878 0004 pea $4.w
014928: 6012 bra $1493c
01492A: 2043 movea.l D3, A0
01492C: 0828 0005 0001 btst #$5, ($1,A0)
014932: 6706 beq $1493a
014934: 4878 0005 pea $5.w
014938: 6002 bra $1493c
01493A: 42A7 clr.l -(A7)
01493C: 4EB9 0000 B97C jsr $b97c.l
014942: 588F addq.l #4, A7
014944: 4EB9 0000 0174 jsr $174.l
01494A: 60FE bra $1494aА тут - обработчик кадрового прерывания:
Код: [Выделить]
000142: 48E7 FFFE movem.l D0-D7/A0-A6, -(A7)
000146: 3039 0008 1E96 move.w $81e96.l, D0
00014C: 0C40 0000 cmpi.w #$0, D0
000150: 6700 0010 beq $162
000154: 4EB8 0180 jsr $180.w
000158: 4E71 nop
00015A: 33FC 0000 0008 1E96 move.w #$0, $81e96.l
000162: 4EB8 01C2 jsr $1c2.w
000166: 4E71 nop
000168: 4EB9 0001 4EB6 jsr $14eb6.l
00016E: 4CDF 7FFF movem.l (A7)+, D0-D7/A0-A6
000172: 4E73 rteДизассемблят Double Point я решил взять за основу limited access-source'ного движка бонусной активности для разных хоумбрюшных игр на Neo-Geo. Такой перенос повторяющихся действий с обработчика прерываний на основной код достаточно грамотен?
Код: [Выделить]
;movem.l D2-D3/A2-A5, -(A7)
;move.l #LocalModeSelect, D2
jsr cls_local
moveq #4, D1
movea.l #TemporaryLocalPlayerNames, A0
movea.l #LocalPlayerNames, A1
movea.l #TemporaryLocalHiScore, A2
movea.l #LocalHiScore, A3
movea.l #TemporaryLocalAvatars, A4
movea.l #LocalAvatars, A5
LocalHiScoreInit:
move.l (A1)+, (A0)+
move.l (A3)+, (A2)+
move.w (A5)+, (A4)+
dbra D1, LocalHiScoreInit
;jsr LocalSoundInit
clr.w $824ea.l
clr.w $82498.l
clr.w $824f6.l
clr.l -(A7)
jsr LocalModeSelect
addq.l #4, A7
VBlankReturnCheck:
cmp BIOS_FRAME_COUNTER, LocalFrameCounter
beq VBlankReturnCheck
movem.l D0-D7/A0-A6, -(A7)
move.w LocalPalChange, D0
cmpi.w #0, D0
beq LocalNewFrame
jsr LocalLoadPal
move.w #0, LocalPalChange
LocalNewFrame:
jsr LocalPlaySound
jsr BonusGameLoop
movem.l (A7)+, D0-D7/A0-A6
bra VBlankReturnCheckПредваряя возникающие вопросы, спешу предупредить, что в последней цитате из кода сохранившие свою числовую форму переменные считайте, называются так условно (про то, что work RAM у Neo-Geo и железа Double Point назначен на разные области адресуемого пространства, я таки прекрасно в курсах), LocalFrameCounter должна прирасти в BonusGameLoop или одной из её дочерних подпрограмм (примерно как системный счётчик кадров в оригинальной Double Point), а код с jsr $dfd8.l по clr.l -(A7) пропал потому, что у Double Point он отвечал за считывание аппаратных (в то время как у Neo-Geo за сугубо игровые настройки отвечают программные, да и вообще сложность и пр. у бонусной игры должны плясать от аналогичных параметров материнской игры) DIPов и переход, в зависимости от включенных, в один из нескольких разных сервисных режимов (коих у мини-игры, понятно-дело, быть не может). Сообразуясь с той же логикой, под нож пущены и предварительная чистка ОЗУ.
