第4次スーパーロボット大戦 BANPRESTO phát hành năm 1995, máy Sufami.
Event
Cấu trúc của cái game này là một đường thẳng, thay vì phân nhánh thành nhiều sub-routine như nhiều game khác. Do là một đường thẳng nên tất cả mọi phân đoạn trong game đều được thể hiện dưới dạng event. Trong đó, các event là một thành phần của main loop.
C0/F546: E230 SEP #$30
C0/F548: A940 LDA #$40
C0/F54A: 0480 TSB $80
C0/F54C: 2480 BIT $80
C0/F54E: 70FC BVS $F54C //đợi nmi
C0/F550: A920 LDA #$20
C0/F552: 0480 TSB $80
C0/F554: 201D83 JSR $831D
C0/F557: E230 SEP #$30
C0/F559: A920 LDA #$20
C0/F55B: 1480 TRB $80
C0/F55D: 24C0 BIT $C0
C0/F55F: 1011 BPL $F572
C0/F561: C230 REP #$30
C0/F563: ADEA03 LDA $03EA
C0/F566: 29C000 AND #$00C0
C0/F569: 0DF003 ORA $03F0
C0/F56C: F004 BEQ $F572
C0/F56E: 2236E281 JSR $81E236
C0/F572: E230 SEP #$30
C0/F574: 2C5910 BIT $1059
C0/F577: 100E BPL $F587
C0/F579: ADED03 LDA $03ED
C0/F57C: 8910 BIT #$10
C0/F57E: F007 BEQ $F587
C0/F580: ADF103 LDA $03F1
C0/F583: 8920 BIT #$20
C0/F585: F0EB BEQ $F572
C0/F587: A581 LDA $81
C0/F589: 8940 BIT #$40
C0/F58B: F004 BEQ $F591
C0/F58D: 228ADF81 JSR $81DF8A
C0/F591: A5AA LDA $AA
C0/F593: F01B BEQ $F5B0
C0/F595: C230 REP #$30
C0/F597: 29FF00 AND #$00FF
C0/F59A: 0A ASL A
C0/F59B: 0A ASL A
C0/F59C: AA TAX
C0/F59D: BD9DFB LDA $FB9D,X
C0/F5A0: 8500 STA $00
C0/F5A2: BD9FFB LDA $FB9F,X
C0/F5A5: 8502 STA $02
C0/F5A7: E230 SEP #$30
C0/F5A9: A502 LDA $02
C0/F5AB: 48 PHA
C0/F5AC: AB PLB
C0/F5AD: DC0000 JMP [$0000] //main loop
C0/F5B0: A000 LDY #$00 //event
C0/F5B2: B792 LDA [$92],Y
C0/F5B4: 85AA STA $AA
C0/F5B6: 64AB STZ $AB
C0/F5B8: C8 INY
C0/F5B9: C230 REP #$30
C0/F5BB: 29FF00 AND #$00FF
C0/F5BE: 0A ASL A
C0/F5BF: 0A ASL A
C0/F5C0: AA TAX
C0/F5C1: BD9DFB LDA $FB9D,X
C0/F5C4: 8500 STA $00
C0/F5C6: BD9FFB LDA $FB9F,X
C0/F5C9: 8502 STA $02
C0/F5CB: 2900FF AND #$FF00
C0/F5CE: F00E BEQ $F5DE
C0/F5D0: E230 SEP #$30
C0/F5D2: B792 LDA [$92],Y
C0/F5D4: 99AB00 STA $00AB,Y
C0/F5D7: C8 INY
C0/F5D8: C603 DEC $03
C0/F5DA: D0F6 BNE $F5D2
C0/F5DC: C230 REP #$30
C0/F5DE: 98 TYA
C0/F5DF: 29FF00 AND #$00FF
C0/F5E2: 18 CLC
C0/F5E3: 6592 ADC $92
C0/F5E5: 8592 STA $92
C0/F5E7: 80BE BRA $F5A7
Các event thường đứng cạnh nhau thành một block nhiều event.
Block event được đọc từ [$92],y rồi ghi vào [$0000] và $AA.
Cấu tạo mỗi block gồm:
T1-(X1-Y1-Z1)
T2-(X2-Y2-Z2)
Trong đó T1, T2, T3,... là số ID của event. Số này sẽ dẫn tới phần code của event, trong đó gồm 24 bit pointer chỉ tới địa chỉ của phần code, 8 bit còn lại là số lượng các tham số cần thiết cho mỗi event. Tham số có thể dao động từ 0x00 tới 0xFF.
4 byte định nghĩa nên ID của event được chứa ở table $80FB9D.
LDA [$92],Y
STA $AA
STZ $AB
INY
REP #$30
AND #$00FF
ASL #2
LDA $FB9D,X
STA $00
LDA $FB9F,X
STA $02
AND #$FF00
BEQ +
SEP #$30
-
LDA [$92],Y
STA $00AB,Y
INY
DEC $03
BNE -
REP #$30
TYA
AND #$00FF
CLC
ADC $92
STA $92
Như vậy, $03 là bộ đếm số lượng tham số cần thiết của event. Các tham số này được ghi vào $AC trở đi. $AA là nơi chứa ID của event, còn $AB là counter của sub event trong main event mang ID đó.
Cấu trúc thực thi sub event:
LDA $AB
ASL
TAX
JMP (subevent_pointer,X)
Chẳng hạn, event ID số 0x13 có chức năng giảm dần độ sáng màn hình cho đến khi force blank với tốc độ được xác định bằng 1 tham số. ID này được xác định trong table ở $80FB9D là 44-82-82-01, tức ID 0x13 này có địa chỉ ở $828244 và gồm 1 tham số theo sau.
Giả sử ở block event ta có
13-05
thì khi CPU xử lý event này, màn hình sẽ giảm dần độ sáng ở mức max về zero, rồi chuyển sang trạng thái force blank với tốc độ cứ mỗi 5 frame thì giảm 1 nấc độ sáng.
event 13
C2/8244: E230 SEP #$30
C2/8246: A5AB LDA $AB
C2/8248: 0A ASL A
C2/8249: AA TAX
C2/824A: 7C4D82 JMP ($824D,X)
$82824D:
dw $8251
dw $8265
C2/8251: AD8003 LDA $0380
C2/8254: 300C BMI $8262
C2/8256: A90C LDA #$0C
C2/8258: 8D8003 STA $0380
C2/825B: A5AC LDA $AC
C2/825D: 85AD STA $AD
C2/825F: DCFEF5 JMP [$F5FE]
C2/8262: DC0AF6 JMP [$F60A]
C2/8265: C6AD DEC $AD
C2/8267: D011 BNE $827A
C2/8269: A5AC LDA $AC
C2/826B: 85AD STA $AD
C2/826D: CE8003 DEC $0380
C2/8270: D008 BNE $827A
C2/8272: A98F LDA #$8F
C2/8274: 8D8003 STA $0380
C2/8277: DC0AF6 JMP [$F60A]
C2/827A: DCFBF5 JMP [$F5FB]
$0380 là Ram chứa giá trị độ sáng. Giá trị từ đây sẽ được ghi vào $2100 trong kỳ NMI.
Tại main event này, tham số tốc độ giảm độ sáng được ghi vào $AC, rồi từ $AC copy sang $AD, sau đó giảm dần $AD đến zero mới bắt đầu giảm 1 nấc độ sáng.
Các pointer [$F5FE], [$F60A], [$F5FB] gồm 24 bit chỉ đến một phần trong main loop.
$F5FB chỉ đến $80F64E: đợi frame mới, với DB = $80.
$F5FE chỉ đến $80F653: đợi frame mới, nhưng tăng $AB (sub event).
$F60A chỉ đến $80F684: đợi frame mới, đọc event tiếp theo.