forked from MagerValp/ArcadeGameSelector
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathagsil.e
More file actions
136 lines (111 loc) · 3.22 KB
/
agsil.e
File metadata and controls
136 lines (111 loc) · 3.22 KB
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/* AGSIL contains the control classes for background image loading. */
OPT MODULE
OPT EXPORT
OPT PREPROCESS
MODULE 'exec/memory'
MODULE 'exec/ports'
MODULE 'exec/nodes'
MODULE 'dos/dostags'
CONST AGSIL_ERROR = "AGSI"
ENUM AGSIL_ERR_FINDPORT = 1, AGSIL_ERR_CREATEPORT, AGSIL_ERR_START
EXPORT PROC agsil_strerror(num:LONG) IS ListItem([
'FindPort failed',
'CreatePort failed',
'Couldn''t start image loader'
], num - 1)
#define AGSIL_PORTNAME 'agsilport'
ENUM AGSIL_QUIT,
AGSIL_SETRPORT,
AGSIL_SETVPORT,
AGSIL_SETCONF,
AGSIL_SETMAXCOLORS,
AGSIL_LOAD,
AGSIL_GETIMGNUM
OBJECT agsil_msg
msg:mn
action:LONG
arg:LONG
reply:LONG
ENDOBJECT
OBJECT agsil_master
replyport:PTR TO mp
msg:PTR TO agsil_msg
send_quit -> Set to TRUE if we should attempt to send an AGSIL_QUIT
ENDOBJECT -> message in end().
PROC init() OF agsil_master
self.replyport := CreateMsgPort()
IF self.replyport = NIL THEN Throw(AGSIL_ERROR, AGSIL_ERR_CREATEPORT)
self.msg := NewM(SIZEOF agsil_msg, MEMF_PUBLIC OR MEMF_CLEAR)
self.msg.msg.ln.type := NT_MESSAGE
self.msg.msg.length := SIZEOF agsil_msg
self.msg.msg.replyport := self.replyport
self.send_quit := TRUE
ENDPROC
PROC end() OF agsil_master
DEF port:PTR TO mp
IF self.send_quit
self.msg.action := AGSIL_QUIT
self.msg.arg := NIL
Forbid()
port := FindPort(AGSIL_PORTNAME)
IF port THEN PutMsg(port, self.msg)
Permit()
IF port
WaitPort(self.replyport)
GetMsg(self.replyport)
ENDIF
ENDIF
IF self.msg THEN Dispose(self.msg)
IF self.replyport THEN DeleteMsgPort(self.replyport)
ENDPROC
PROC start() OF agsil_master
DEF result
DEF console
console := Open('CON:0/40/640/150/irqimgloader/auto/close/wait', OLDFILE)
result := SystemTagList('AGS:AGS2Helper', [
SYS_ASYNCH, TRUE,
SYS_INPUT, console,
SYS_OUTPUT, NIL,
0])
IF result = -1
Close(console)
Throw(AGSIL_ERROR, AGSIL_ERR_START)
ENDIF
ENDPROC
PROC wait_port() OF agsil_master
DEF count = 0
REPEAT
IF FindPort(AGSIL_PORTNAME)
RETURN
ENDIF
Delay(1)
UNTIL count++ = 250
-> Throw an error if it takes more than 5 seconds for the agsil port to
-> appear.
Throw(AGSIL_ERROR, AGSIL_ERR_START)
ENDPROC
PROC send_cmd(action:LONG, arg:LONG) OF agsil_master
DEF port:PTR TO mp
DEF reply:PTR TO agsil_msg
self.msg.action := action
IF action = AGSIL_QUIT
self.send_quit := FALSE -> QUIT has already been sent, no need for
ENDIF -> end() to do it.
self.msg.arg := arg
Forbid()
port := FindPort(AGSIL_PORTNAME)
IF port THEN PutMsg(port, self.msg)
Permit()
IF port = NIL THEN Throw(AGSIL_ERROR, AGSIL_ERR_FINDPORT)
WaitPort(self.replyport)
IF (reply := GetMsg(self.replyport)) = NIL
self.msg.reply := NIL
ENDIF
ENDPROC self.msg.reply
PROC stop() OF agsil_master IS self.send_cmd(AGSIL_QUIT, NIL)
PROC wait_load(img_num:LONG) OF agsil_master
DEF num
WHILE (num := self.send_cmd(AGSIL_GETIMGNUM, NIL)) <> img_num
Delay(1)
ENDWHILE
ENDPROC