Root/
Source at commit 1335 created 12 years 10 months ago. By azimutz, Old ati.c changes: - auto switch framebuffer according to OS version (pre/post 10.6.8) - add AtiConfig key, plus verbose messages - small "clean up" | |
---|---|
1 | /*␊ |
2 | * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.␊ |
3 | *␊ |
4 | * @APPLE_LICENSE_HEADER_START@␊ |
5 | * ␊ |
6 | * The contents of this file constitute Original Code as defined in and␊ |
7 | * are subject to the Apple Public Source License Version 1.1 (the␊ |
8 | * "License"). You may not use this file except in compliance with the␊ |
9 | * License. Please obtain a copy of the License at␊ |
10 | * http://www.apple.com/publicsource and read it before using this file.␊ |
11 | * ␊ |
12 | * This Original Code and all software distributed under the License are␊ |
13 | * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER␊ |
14 | * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,␊ |
15 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,␊ |
16 | * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the␊ |
17 | * License for the specific language governing rights and limitations␊ |
18 | * under the License.␊ |
19 | * ␊ |
20 | * @APPLE_LICENSE_HEADER_END@␊ |
21 | */␊ |
22 | /*␊ |
23 | * sl_words.c - Forth and C code for the sl_words package.␊ |
24 | *␊ |
25 | * Copyright (c) 1998-2002 Apple Computer, Inc.␊ |
26 | *␊ |
27 | * DRI: Josh de Cesare␊ |
28 | */␊ |
29 | #include <string.h>␊ |
30 | #include <sl.h>␊ |
31 | ␊ |
32 | #if SL_DEBUG␊ |
33 | void InitDebugWords(void);␊ |
34 | #endif␊ |
35 | ␊ |
36 | extern const char gMacParts[];␊ |
37 | extern const char *gControl2Source[];␊ |
38 | ␊ |
39 | CICell SLWordsIH = 0;␊ |
40 | ␊ |
41 | long InitSLWords(void)␊ |
42 | {␊ |
43 | long result, cnt;␊ |
44 | ␊ |
45 | result = Interpret(0, 1,␊ |
46 | " hex"␊ |
47 | " unselect-dev"␊ |
48 | ␊ |
49 | // Create the slWords pseudo-device␊ |
50 | " \" /packages\" find-device"␊ |
51 | " new-device"␊ |
52 | " \" sl_words\" device-name"␊ |
53 | ␊ |
54 | " : open true ;"␊ |
55 | " : close ;"␊ |
56 | ␊ |
57 | // Define all sl words here.␊ |
58 | ␊ |
59 | // init the outputLevel␊ |
60 | " 0 value outputLevel"␊ |
61 | ␊ |
62 | // slw_set_output_level ( level -- )␊ |
63 | " : slw_set_output_level"␊ |
64 | " dup 0= if 0 stdout ! then"␊ |
65 | " to outputLevel"␊ |
66 | " ;"␊ |
67 | ␊ |
68 | // slw_emit ( ch -- )␊ |
69 | " : slw_emit 2 outputLevel <= if emit else drop then ;"␊ |
70 | ␊ |
71 | // slw_cr ( -- )␊ |
72 | " : slw_cr 2 outputLevel <= if cr then ;"␊ |
73 | ␊ |
74 | // Static init stuff for keyboard␊ |
75 | " 0 value keyboardIH"␊ |
76 | " 20 buffer: keyMap"␊ |
77 | ␊ |
78 | // slw_init_keymap ( keyboardIH -- keyMap )␊ |
79 | " : slw_init_keymap"␊ |
80 | " to keyboardIH"␊ |
81 | " keyMap dup 20 0 fill"␊ |
82 | " ;"␊ |
83 | ␊ |
84 | // slw_update_keymap␊ |
85 | " : slw_update_keymap { ; dpth }"␊ |
86 | " depth -> dpth"␊ |
87 | " keyboardIH if"␊ |
88 | " \" get-key-map\" keyboardIH $call-method"␊ |
89 | " depth dpth - 1 = if 20 then"␊ |
90 | " 4 / 0 do"␊ |
91 | " dup i 4 * + l@ keyMap i 4 * + tuck l@ or swap l!"␊ |
92 | " loop drop"␊ |
93 | " then"␊ |
94 | " ;"␊ |
95 | ␊ |
96 | // Set up the spin cursor stuff.␊ |
97 | " 0 value screenIH"␊ |
98 | " 0 value cursorAddr"␊ |
99 | " 0 value cursorX"␊ |
100 | " 0 value cursorY"␊ |
101 | " 0 value cursorW"␊ |
102 | " 0 value cursorH"␊ |
103 | " 0 value cursorFrames"␊ |
104 | " 0 value cursorPixelSize"␊ |
105 | " 0 value cursorStage"␊ |
106 | " 0 value cursorTime"␊ |
107 | " 0 value cursorDelay"␊ |
108 | ␊ |
109 | // slw_spin ( -- )␊ |
110 | " : slw_spin"␊ |
111 | " screenIH 0<> cursorAddr 0<> and if"␊ |
112 | " get-msecs dup cursorTime - cursorDelay >= if"␊ |
113 | " to cursorTime"␊ |
114 | " slw_update_keymap"␊ |
115 | " cursorStage 1+ cursorFrames mod dup to cursorStage"␊ |
116 | " cursorW cursorH * cursorPixelSize * * cursorAddr +"␊ |
117 | " cursorX cursorY cursorW cursorH"␊ |
118 | " \" draw-rectangle\" screenIH $call-method"␊ |
119 | " else"␊ |
120 | " drop"␊ |
121 | " then"␊ |
122 | " then"␊ |
123 | " ;"␊ |
124 | ␊ |
125 | // slw_spin_init ( screenIH cursorAddr cursorX cursorY cursorW cursorH--)␊ |
126 | " : slw_spin_init"␊ |
127 | " dup FFFF and to cursorH 10 >> drop"␊ |
128 | " dup FFFF and to cursorW 10 >> to cursorPixelSize"␊ |
129 | " dup FFFF and to cursorY 10 >> d# 1000 swap / to cursorDelay"␊ |
130 | " dup FFFF and to cursorX 10 >> to cursorFrames"␊ |
131 | " to cursorAddr to screenIH"␊ |
132 | " ['] slw_spin to spin" ␊ |
133 | " ;"␊ |
134 | ␊ |
135 | // slw_pwd ( phandle addr len -- act )␊ |
136 | " : slw_pwd"␊ |
137 | " ['] pwd 138 - execute"␊ |
138 | " ;"␊ |
139 | ␊ |
140 | // slw_sum ( adr len -- sum )␊ |
141 | " : slw_sum { adr len }"␊ |
142 | " len 0 tuck do"␊ |
143 | " dup 1 and if 10000 or then"␊ |
144 | " 1 >> adr i + c@ + ffff and"␊ |
145 | " loop"␊ |
146 | " ;"␊ |
147 | ␊ |
148 | " device-end"␊ |
149 | ␊ |
150 | " 0 0 \" sl_words\" $open-package"␊ |
151 | ␊ |
152 | , &SLWordsIH);␊ |
153 | ␊ |
154 | if (result != kCINoError) return result;␊ |
155 | if (SLWordsIH == 0) return kCIError;␊ |
156 | ␊ |
157 | if (gOFVersion < kOFVersion3x) {␊ |
158 | result = Interpret(1, 0,␊ |
159 | " dev /packages/obp-tftp"␊ |
160 | " ['] load C + l!"␊ |
161 | , kLoadSize);␊ |
162 | if (result != kCINoError) return result;␊ |
163 | }␊ |
164 | ␊ |
165 | if (gOFVersion < kOFVersion3x) {␊ |
166 | result = Interpret(1, 0,␊ |
167 | " dev /packages/mac-parts"␊ |
168 | " \" lame\" device-name"␊ |
169 | " dev /packages"␊ |
170 | " 1 byte-load"␊ |
171 | " device-end"␊ |
172 | , (long)gMacParts);␊ |
173 | if (result != kCINoError) return result;␊ |
174 | }␊ |
175 | ␊ |
176 | if (gOFVersion < kOFVersion2x) {␊ |
177 | for(cnt = 0; gControl2Source[cnt] != '\0'; cnt++) {␊ |
178 | result = Interpret(0, 0, gControl2Source[cnt]);␊ |
179 | if (result == kCIError) return kCIError;␊ |
180 | if (result == kCICatch) return kCINoError;␊ |
181 | }␊ |
182 | }␊ |
183 | ␊ |
184 | #if SL_DEBUG␊ |
185 | InitDebugWords();␊ |
186 | #endif␊ |
187 | ␊ |
188 | return kCINoError;␊ |
189 | }␊ |
190 | ␊ |
191 | #if SL_DEBUG␊ |
192 | void InitDebugWords(void)␊ |
193 | {␊ |
194 | Interpret(0, 0,␊ |
195 | // .sc ( -- )␊ |
196 | " : .sc ?state-valid ci-regs 4+ l@ l@ dup 0= \" Bad Stack\" (abort\")"␊ |
197 | " cr .\" Stack Trace\""␊ |
198 | " begin dup while dup 8 + l@ cr u. l@ repeat drop ;"␊ |
199 | );␊ |
200 | }␊ |
201 | #endif␊ |
202 | ␊ |
203 | void SetOutputLevel(long level)␊ |
204 | {␊ |
205 | CallMethod(1, 0, SLWordsIH, "slw_set_output_level", level);␊ |
206 | }␊ |
207 | ␊ |
208 | ␊ |
209 | char *InitKeyMap(CICell keyboardIH)␊ |
210 | {␊ |
211 | long ret;␊ |
212 | char *keyMap;␊ |
213 | ␊ |
214 | ret = CallMethod(1, 1, SLWordsIH, "slw_init_keymap",␊ |
215 | ␉␉ keyboardIH, (CICell *)&keyMap);␊ |
216 | if (ret != kCINoError) return NULL;␊ |
217 | ␊ |
218 | return keyMap;␊ |
219 | }␊ |
220 | ␊ |
221 | void UpdateKeyMap(void)␊ |
222 | {␊ |
223 | CallMethod(0, 0, SLWordsIH, "slw_update_keymap");␊ |
224 | }␊ |
225 | ␊ |
226 | ␊ |
227 | void SpinInit(CICell screenIH, char *cursorAddr,␊ |
228 | ␉ long cursorX, long cursorY,␊ |
229 | ␉ long cursorW, long cursorH,␊ |
230 | ␉ long frames, long fps,␊ |
231 | ␉ long pixelSize, long spare)␊ |
232 | {␊ |
233 | CallMethod(6, 0, SLWordsIH, "slw_spin_init",␊ |
234 | ␉ screenIH, (long)cursorAddr,␊ |
235 | ␉ cursorX | (frames << 16),␊ |
236 | ␉ cursorY | (fps << 16),␊ |
237 | ␉ cursorW | (pixelSize << 16),␊ |
238 | ␉ cursorH | (spare << 16));␊ |
239 | }␊ |
240 | ␊ |
241 | void Spin(void)␊ |
242 | {␊ |
243 | CallMethod(0, 0, SLWordsIH, "slw_spin");␊ |
244 | }␊ |
245 | ␊ |
246 | ␊ |
247 | long GetPackageProperty(CICell phandle, char *propName,␊ |
248 | ␉␉␉char **propAddr, long *propLen)␊ |
249 | {␊ |
250 | long ret, nameLen = strlen(propName);␊ |
251 | ␊ |
252 | ret = Interpret(3, 2, "get-package-property if 0 0 then",␊ |
253 | ␉␉ (CICell)propName, nameLen, phandle,␊ |
254 | ␉␉ (CICell *)propAddr, (CICell *)propLen);␊ |
255 | if ((ret != kCINoError) || (*propAddr == NULL)) return -1;␊ |
256 | ␊ |
257 | return 0;␊ |
258 | }␊ |
259 |