-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy path3-levelmain.asm
86 lines (76 loc) · 1.86 KB
/
3-levelmain.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
; vi: syntax=asm68k
;{ 6/proc308 9/proc325 10/proc334
; 11/proc340 12/proc345 13/proc355
; 14/proc359 17/proc372 19/proc385
; 20/proc386 21/proc387 22/proc389
; 23/proc390 24/proc391 25/proc394 }
;:29be 3/proc169()
;Main game loop (for current level)
;Turns on/off irqs
;Traverses obj list, calling each func
;Deletes any expired objs (->cb == NULL)
; no args
levelmain:
movem.l d0-d7/a0-a4/a6, -(sp)
;only HUD actually uses QuickDraw
jsr 1/set_hudport(a5)
;set up video/sound irqs
sf vidirq(a5)
jsr 1/enable_irqs(a5)
sf new_rm(a5)
clr.w vidwaitc(a5)
;main loop
qhead tst.b scrolling(a5)
beq.s .qhead2
jsr 18/proc374(a5)
;get first obj in queue
qhead2 lea qobj(a5), a3
movea.l (a3), a4
;A3/previous, A4/curr (obj_t *)
;delete if expired/NULL fn ptr
queuelp movea.l _CB(a4), a2
cmpa.w #NULL, a2
beq .delobj
;A6/(dc_t *) obj fields
lea _DATA(a4), a6
;call A2/obj func
qfunc movem.l a3-a4, -(sp)
jsr (a2)
movem.l (sp)+, a3-a4
;to next obj in queue
qnext movea.l a4, a3
movea.l _NEXT(a4), a4
;[.delobj] jumps here
qnext2 cmpa.w #NULL, a4
bne .queuelp
;end of list, delay til vblank?
qvirq jsr 3/wait_vidirq(pc)
; -> next loop, while @room
tst.b new_rm(a5)
beq .qhead
;exited room, delete whole q
;for(o=qobj;o;o=o->next)
movea.l qobj(a5), a3
qfreelp cmpa.w #NULL, a3
beq.s .endlev
movea.l _NEXT(a3), a4
movea.l a3, a0
;== free(obj_t *)
_DisposPtr
freenex movea.l a4, a3
bra .qfreelp
;delete expired obj (+ relink)
delobj move.l _NEXT(a4), _NEXT(a3)
movea.l a3, a2
movea.l a4, a3
movea.l _NEXT(a4), a4
movea.l a3, a0
_DisposPtr
movea.l a2, a3
bra .qnext2
;purge snd data, disable irqs
endlev jsr 1/purge_sftr(a5)
jsr 1/disable_irqs(a5)
clr.l qobj(a5)
movem.l (sp)+, d0-d7/a0-a4/a6
rts