1 |
/* |
2 |
* ROlib.h - Defines Classes, variables and OS interface calls for Acorn |
3 |
* RISC OS computers |
4 |
* |
5 |
* (C) 1997 Andreas Dehmel |
6 |
* |
7 |
* Frodo (C) 1994-1997,2002-2005 Christian Bauer |
8 |
* |
9 |
* This program is free software; you can redistribute it and/or modify |
10 |
* it under the terms of the GNU General Public License as published by |
11 |
* the Free Software Foundation; either version 2 of the License, or |
12 |
* (at your option) any later version. |
13 |
* |
14 |
* This program is distributed in the hope that it will be useful, |
15 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
16 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
17 |
* GNU General Public License for more details. |
18 |
* |
19 |
* You should have received a copy of the GNU General Public License |
20 |
* along with this program; if not, write to the Free Software |
21 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
22 |
*/ |
23 |
|
24 |
#ifndef RO_CUSTOM_LIB |
25 |
#define RO_CUSTOM_LIB |
26 |
|
27 |
#include <kernel.h> |
28 |
|
29 |
|
30 |
#define TASKNAME "Frodo" |
31 |
#define TASK_WORD 0x4b534154 |
32 |
|
33 |
/* Scrap-file for 1541fs directory function */ |
34 |
#define RO_TEMPFILE "<Wimp$ScrapDir>.FrodoDIR" |
35 |
|
36 |
|
37 |
|
38 |
/* Icon Flags */ |
39 |
#define IFlg_Text 1 |
40 |
#define IFlg_Sprite 2 |
41 |
#define IFlg_Border 4 |
42 |
#define IFlg_HCenter 8 |
43 |
#define IFlg_VCenter 16 |
44 |
#define IFlg_Filled 32 |
45 |
#define IFlg_AntiA 64 |
46 |
#define IFlg_AutoRdrw 128 |
47 |
#define IFlg_Indir 256 |
48 |
#define IFlg_RAdjust 512 |
49 |
#define IFlg_Slct (1<<21) |
50 |
#define IFlg_Grey (1<<22) |
51 |
|
52 |
/* Menu Flags */ |
53 |
#define MFlg_Tick 1 |
54 |
#define MFlg_Dotted 2 |
55 |
#define MFlg_Writable 4 |
56 |
#define MFlg_Warning 8 |
57 |
#define MFlg_LastItem 128 |
58 |
|
59 |
/* Joystick stuff */ |
60 |
#define JoyDir_Thresh 32 |
61 |
#define JoyButton1 (1<<16) |
62 |
#define JoyButton2 (1<<17) |
63 |
|
64 |
|
65 |
|
66 |
/* Size of WIMP data types */ |
67 |
#define RO_WINDOW_WORDS 23 |
68 |
#define RO_WINDOW_BYTES 92 |
69 |
#define RO_ICON_WORDS 8 |
70 |
#define RO_ICON_BYTES 32 |
71 |
#define RO_MHEAD_WORDS 7 |
72 |
#define RO_MHEAD_BYTES 28 |
73 |
#define RO_MITEM_WORDS 6 |
74 |
#define RO_MITEM_BYTES 24 |
75 |
|
76 |
|
77 |
|
78 |
|
79 |
/* Structures for directory scanning (mainly 1541fs) */ |
80 |
/* May hold entire pathname, so DON'T REDUCE!!! */ |
81 |
#define FILENAME_MAX_CHARS 256 /* must be >= NAMEBUF_LENGTH (256) */ |
82 |
|
83 |
typedef struct { |
84 |
unsigned int load, exec, length, attrib, otype; |
85 |
char name[FILENAME_MAX_CHARS]; |
86 |
} dir_full_info; |
87 |
|
88 |
typedef struct { |
89 |
int readno, offset, buffsize; |
90 |
char *match; |
91 |
} dir_env; |
92 |
|
93 |
|
94 |
|
95 |
/* WIMP structures: */ |
96 |
typedef struct { |
97 |
int *tit, *val; |
98 |
int len; |
99 |
} WIdatI; |
100 |
|
101 |
/* data type for window / icon data */ |
102 |
typedef union { |
103 |
char strg[12]; |
104 |
WIdatI ind; |
105 |
} WIdata; |
106 |
|
107 |
|
108 |
/* Window descriptor - 23 words = 92 bytes */ |
109 |
typedef struct { |
110 |
int Handle; |
111 |
int vminx,vminy,vmaxx,vmaxy; |
112 |
int scrollx,scrolly; |
113 |
int stackpos; |
114 |
unsigned int wflags; |
115 |
char col_tfg, col_tbg, col_wfg, col_wbg; /* title/work_area fore/background colour */ |
116 |
char col_sbo, col_sbi, col_tsl, reserved;/* scroll bar inner/outer, title if input focus */ |
117 |
int wminx, wminy, wmaxx, wmaxy; |
118 |
unsigned int tflags, waflags; |
119 |
int SpriteAreaPtr; |
120 |
short min_width, min_height; |
121 |
WIdata dat; |
122 |
int icon_no; |
123 |
} RO_Window; |
124 |
|
125 |
|
126 |
/* Icon descriptor */ |
127 |
typedef struct { |
128 |
int minx, miny, maxx, maxy; |
129 |
int iflags; |
130 |
WIdata dat; |
131 |
} RO_Icon; |
132 |
|
133 |
|
134 |
typedef struct { |
135 |
int WindowHandle; |
136 |
int minx, miny, maxx, maxy; |
137 |
int iflags; |
138 |
WIdata dat; |
139 |
} RO_IconDesc; |
140 |
|
141 |
|
142 |
typedef struct { |
143 |
char title[12]; |
144 |
char col_tfg, col_tbg, col_wfg, col_wbg; |
145 |
int width, height, vgap; |
146 |
} RO_MenuHead; |
147 |
|
148 |
|
149 |
typedef struct { |
150 |
unsigned int mflags; |
151 |
RO_MenuHead *submenu; |
152 |
unsigned int iflags; |
153 |
WIdata dat; |
154 |
} RO_MenuItem; |
155 |
|
156 |
|
157 |
/* Caret descriptor */ |
158 |
typedef struct { |
159 |
int WHandle; |
160 |
int IHandle; |
161 |
int offx, offy; |
162 |
int height, index; |
163 |
} RO_Caret; |
164 |
|
165 |
|
166 |
|
167 |
/* Joystick key descriptor */ |
168 |
typedef struct { |
169 |
unsigned char up, down, left, right, fire; |
170 |
} Joy_Keys; |
171 |
|
172 |
|
173 |
|
174 |
|
175 |
/* Declare classes that are needed in the following new classes */ |
176 |
class C64Display; |
177 |
class C64; |
178 |
|
179 |
|
180 |
|
181 |
/* Very simple class to read the resolution and eigen values */ |
182 |
class RORes |
183 |
{ |
184 |
public: |
185 |
RORes(void); |
186 |
~RORes(void); |
187 |
|
188 |
int resx,resy,eigx,eigy; |
189 |
}; |
190 |
|
191 |
|
192 |
/* Handle current screenmode */ |
193 |
class ROScreen |
194 |
{ |
195 |
private: |
196 |
_kernel_oserror ModeError; |
197 |
|
198 |
public: |
199 |
ROScreen(void); |
200 |
~ROScreen(void); |
201 |
int ReadMode(void); |
202 |
|
203 |
int resx, resy, ldbpp, eigx, eigy, ladd; |
204 |
char *scrbase; |
205 |
}; |
206 |
|
207 |
|
208 |
class Icon |
209 |
{ |
210 |
private: |
211 |
RO_IconDesc icon; |
212 |
|
213 |
public: |
214 |
Icon(int IconHandle, const RO_IconDesc *IDesc); |
215 |
~Icon(void); |
216 |
void setstate(unsigned int eor, unsigned int clear); |
217 |
void getstate(void); |
218 |
|
219 |
int IHandle; |
220 |
}; |
221 |
|
222 |
|
223 |
class Window |
224 |
{ |
225 |
private: |
226 |
RO_Window *wind; |
227 |
bool isopen; |
228 |
|
229 |
public: |
230 |
Window(const int *WDesc, const char *Title); |
231 |
~Window(void); |
232 |
int MyHandle(void); |
233 |
void GetWorkArea(int *Dest); |
234 |
void RedrawAWindow(int *Block, uint8 *Bitmap, C64Display *Disp); |
235 |
RO_Window *Descriptor(void); |
236 |
RO_Icon *GetIcon(unsigned int number); |
237 |
void SetIconState(unsigned int number, unsigned int eor, unsigned int clear); |
238 |
void GetIconState(unsigned int number, int *Block); |
239 |
void WriteIconText(unsigned int number, const char *text); |
240 |
void WriteIconTextU(unsigned int number, const char *text); // update instead of force redrw |
241 |
void WriteIconNumber(unsigned int number, int value); |
242 |
void WriteIconNumberU(unsigned int number, int value); |
243 |
char *ReadIconText(unsigned int number); |
244 |
int ReadIconNumber(unsigned int number); |
245 |
void ForceIconRedraw(unsigned int number); |
246 |
void UpdateIcon(unsigned int number); |
247 |
void WriteTitle(const char *title); |
248 |
char *ReadTitle(void); |
249 |
void UpdateTitle(void); |
250 |
bool HaveInput(void); |
251 |
bool OpenStatus(void); |
252 |
bool OpenStatus(int *Block); |
253 |
void open(void); |
254 |
void open(int *Block); |
255 |
void close(void); |
256 |
void forceredraw(int minx, int miny, int maxx, int maxy); |
257 |
void update(uint8 *Bitmap, C64Display *Disp); |
258 |
void update(int *Block, uint8 *Bitmap, C64Display *Disp); |
259 |
void redraw(int *Block, uint8 *Bitmap, C64Display *Disp); |
260 |
void extent(int minx, int miny, int maxx, int maxy); |
261 |
void getstate(void); |
262 |
void getstate(int *dest); // read window definition to external block |
263 |
}; |
264 |
|
265 |
|
266 |
class WIMP |
267 |
{ |
268 |
private: |
269 |
_kernel_oserror WimpError; |
270 |
int Block[64], AuxBlock[64]; // two WIMP blocks for convenience |
271 |
int Mask; |
272 |
int DragType, CMOS_DragType; |
273 |
bool UseScrap; // Scrap file used (data transfer protocol!) |
274 |
bool EmuPaused; |
275 |
int UseNULL; // Number of clients that need NULL events |
276 |
int RAMsize, RAMtransfered, RAMpartner; // for RAM transfer |
277 |
int LastMenu, LastClick, LastDrag, MenuType, LastIcon, SaveType; |
278 |
int *SpriteArea; |
279 |
RO_Caret LastCaret; |
280 |
int EmuZoom; |
281 |
Joy_Keys NewJoyKeys[2]; |
282 |
C64 *the_c64; |
283 |
|
284 |
public: |
285 |
WIMP(C64 *my_c64); |
286 |
~WIMP(void); |
287 |
|
288 |
// On startup |
289 |
bool LoadATemplate(char *Name, Window **Which); |
290 |
|
291 |
// To make window and pane work as a team |
292 |
void OpenEmuWindow(void); |
293 |
void OpenEmuWindow(int *Block); // open at pos |
294 |
void CloseEmuWindow(void); |
295 |
void UpdateEmuWindow(void); // update window and pane |
296 |
void ThePrefsToWindow(void); // write ThePrefs into the window |
297 |
void WindowToThePrefs(void); // update ThePrefs from window |
298 |
void SysConfToWindow(void); |
299 |
void WindowToSysConf(void); |
300 |
void PollSysConfWindow(void); // low-level koyboard scan |
301 |
void DragIconSprite(Window *host, unsigned int number); |
302 |
int CalculateVolume(int *Block); |
303 |
int CheckFilename(char *name); |
304 |
void SnapshotSaved(bool OK); |
305 |
void IssueSnapshotRequest(void); |
306 |
void SetLEDIcons(bool FloppyEmulation); |
307 |
void SetEmuWindowSize(void); |
308 |
void ToggleEmuWindowSize(void); |
309 |
int ReadEmuWindowSize(void); |
310 |
void NewDriveImage(int DrNum, int *MsgBlock, bool SetNow); |
311 |
void SetSpeedLimiter(bool LimitSpeed); |
312 |
|
313 |
// Standard WIMP functions |
314 |
void Poll(bool Paused); |
315 |
void Redraw(void); |
316 |
void OpenWindow(void); |
317 |
void CloseWindow(void); |
318 |
void MouseClick(void); |
319 |
void UserDrag(void); |
320 |
void KeyPressed(void); |
321 |
void MenuSelection(void); |
322 |
void UserMessage(void); |
323 |
void UserMessageAck(void); |
324 |
|
325 |
// WIMP's Windows and Icons |
326 |
Icon *IBicon; |
327 |
Window *EmuWindow, *EmuPane, *PrefsWindow, *ConfigWindow, *InfoWindow, *SoundWindow, *SaveBox; |
328 |
char SnapFile[256], RAMFile[256]; |
329 |
}; |
330 |
|
331 |
|
332 |
|
333 |
/* system-specific Variables */ |
334 |
|
335 |
extern RO_IconDesc IBarIcon; |
336 |
extern unsigned int TaskHandle; |
337 |
extern int WimpMessages[]; |
338 |
|
339 |
|
340 |
/* Functions available via ROlib (not RISC OS Lib, mind you) |
341 |
All SWIs are called in the X-Form! */ |
342 |
|
343 |
extern "C" |
344 |
{ |
345 |
|
346 |
/* WIMP FUNCTIONS */ |
347 |
|
348 |
/* returns handle or 0 if error */ |
349 |
extern int Wimp_Initialise(int Version, int tw, const char *TaskName, const int *Messages); |
350 |
|
351 |
extern _kernel_oserror *Wimp_CloseDown(int Handle, int tw); |
352 |
|
353 |
/* returns handle or 0 if error */ |
354 |
extern int Wimp_CreateWindow(const int *Window); |
355 |
|
356 |
extern int Wimp_CreateIcon(int Priority, const RO_IconDesc *Icon); |
357 |
|
358 |
extern _kernel_oserror *Wimp_DeleteWindow(const int *Window); |
359 |
|
360 |
extern _kernel_oserror *Wimp_DeleteIcon(int *Block); |
361 |
|
362 |
extern _kernel_oserror *Wimp_OpenWindow(const int *Window); |
363 |
|
364 |
extern _kernel_oserror *Wimp_CloseWindow(const int *Window); |
365 |
|
366 |
extern int Wimp_Poll(unsigned int Mask, int *Block, int *PollWord); |
367 |
|
368 |
/* returns 0 if no more to do or error */ |
369 |
extern int Wimp_RedrawWindow(int *Block); |
370 |
|
371 |
extern int Wimp_UpdateWindow(int *Block); |
372 |
|
373 |
extern int Wimp_GetRectangle(int *Block); |
374 |
|
375 |
extern _kernel_oserror *Wimp_GetWindowState(int *Block); |
376 |
|
377 |
extern _kernel_oserror *Wimp_GetWindowInfo(int *Block); |
378 |
|
379 |
extern _kernel_oserror *Wimp_SetIconState(int *Block); |
380 |
|
381 |
extern _kernel_oserror *Wimp_GetIconState(int *Block); |
382 |
|
383 |
extern _kernel_oserror *Wimp_GetPointerInfo(int *Block); |
384 |
|
385 |
extern _kernel_oserror *Wimp_DragBox(int *Block); |
386 |
|
387 |
extern _kernel_oserror *Wimp_ForceRedraw(int Handle, int minx, int miny, int maxx, int maxy); |
388 |
|
389 |
extern _kernel_oserror *Wimp_SetCaretPosition(int WHandle, int IHandle, int xoff, int yoff, int height, int index); |
390 |
|
391 |
extern _kernel_oserror *Wimp_GetCaretPosition(RO_Caret *Caret); |
392 |
|
393 |
extern _kernel_oserror *Wimp_CreateMenu(const int *Menu, int cx, int cy); |
394 |
|
395 |
extern _kernel_oserror *Wimp_SetExtent(int Handle, int *Block); |
396 |
|
397 |
extern _kernel_oserror *Wimp_OpenTemplate(char *Name); |
398 |
|
399 |
extern _kernel_oserror *Wimp_CloseTemplate(void); |
400 |
|
401 |
extern _kernel_oserror *Wimp_LoadTemplate(char **Template, char **Indirect, char *IndirLimit, char *Fonts, char *Name, int *Position); |
402 |
|
403 |
extern _kernel_oserror *Wimp_ProcessKey(int Key); |
404 |
|
405 |
extern int Wimp_StartTask(char *command); |
406 |
|
407 |
extern _kernel_oserror *Wimp_ReportError(const _kernel_oserror *Error, unsigned int Flags, const char *AppName); |
408 |
|
409 |
extern _kernel_oserror *Wimp_GetWindowOutline(int *Block); |
410 |
|
411 |
extern int Wimp_PollIdle(unsigned int Mask, int *Block, int MinTime, int *PollWord); |
412 |
|
413 |
extern _kernel_oserror *Wimp_PlotIcon(int *Block); |
414 |
|
415 |
extern _kernel_oserror *Wimp_SendMessage(int Event, int *Block, int THandle, int IHandle); |
416 |
|
417 |
extern _kernel_oserror *Wimp_CreateSubMenu(int *MenuBlock, int cx, int xy); |
418 |
|
419 |
extern _kernel_oserror *Wimp_SpriteOp(int, int, int, int, int, int, int, int); |
420 |
|
421 |
extern _kernel_oserror *Wimp_BaseOfSprites(int *ROM, int *RAM); |
422 |
|
423 |
extern _kernel_oserror *Wimp_CommandWindow(int Action); |
424 |
|
425 |
extern _kernel_oserror *Wimp_TransferBlock(int SHandle, char *SBuff, int DHandle, char *DBuff, int BuffSize); |
426 |
|
427 |
extern _kernel_oserror *Wimp_SpriteInfo(char *name, int *width, int *height, int *mode); |
428 |
|
429 |
extern _kernel_oserror *DragASprite_Start(unsigned int Flags, int SpriteArea, char *SpriteName, int *Box, int *BBox); |
430 |
|
431 |
extern _kernel_oserror *DragASprite_Stop(void); |
432 |
|
433 |
extern _kernel_oserror *ColourTrans_SelectTable(int SMode, int SPal, int DMode, int DPal, char **Buffer, unsigned int Flags, int *TransWork, int *TransFunc); |
434 |
|
435 |
extern _kernel_oserror *ColourTrans_SetFontColours(int Handle, int BPal, int FPal, int Offset); |
436 |
|
437 |
extern _kernel_oserror *ColourTrans_SetColour(int GCOL, unsigned int Flags, int Action); |
438 |
|
439 |
extern _kernel_oserror *ColourTrans_SetGCOL(int Palette, unsigned int Flags, int Action); |
440 |
|
441 |
|
442 |
|
443 |
/* OS FUNCTIONS */ |
444 |
|
445 |
extern int OS_ReadModeVariable(int mode, int var); |
446 |
|
447 |
extern int OS_ReadDynamicArea(int area); |
448 |
|
449 |
extern int ScanKeys(int keys); |
450 |
|
451 |
extern int ReadKeyboardStatus(void); |
452 |
|
453 |
extern int ReadDragType(void); |
454 |
|
455 |
extern int SetMousePointer(int NewShape); |
456 |
|
457 |
|
458 |
/* Generic sprite op call */ |
459 |
extern _kernel_oserror *OS_SpriteOp(int, int, int, int, int, int, int, int); |
460 |
|
461 |
extern _kernel_oserror *OS_Plot(int Command, int x, int y); |
462 |
|
463 |
extern _kernel_oserror *MouseBoundingBox(char Box[8]); |
464 |
|
465 |
extern int OS_ReadMonotonicTime(void); |
466 |
|
467 |
extern _kernel_oserror *OS_ReadC(char *Code); |
468 |
|
469 |
/* returns length of characters read; if length negative ==> terminated by escape */ |
470 |
extern int OS_ReadLine(char *Buffer, int BuffSize, int minasc, int maxasc, int Echo); |
471 |
|
472 |
/* true ==> escape */ |
473 |
extern bool OS_ReadEscapeState(void); |
474 |
|
475 |
/* File related calls */ |
476 |
|
477 |
/* Returns object type */ |
478 |
extern int ReadCatalogueInfo(char *Name, int Result[4]); |
479 |
|
480 |
/* Read the next name in the directory */ |
481 |
extern _kernel_oserror *ReadDirName(const char *dirname, char *buffer, dir_env *env); |
482 |
|
483 |
/* Read the next entry (name, length, type,...) in the directory */ |
484 |
extern _kernel_oserror *ReadDirNameInfo(const char *dirname,dir_full_info *buffer,dir_env *env); |
485 |
|
486 |
extern _kernel_oserror *DeleteFile(char *name); |
487 |
|
488 |
extern _kernel_oserror *OS_FlushBuffer(int BuffNum); |
489 |
|
490 |
/* These functions are more secure than using sprintf because they allow buffersize */ |
491 |
/* Return value is a pointer to the terminating null */ |
492 |
extern char *ConvertInteger1(int value, char *buffer, int buffsize); |
493 |
extern char *ConvertInteger2(int value, char *buffer, int buffsize); |
494 |
extern char *ConvertInteger3(int value, char *buffer, int buffsize); |
495 |
extern char *ConvertInteger4(int value, char *buffer, int buffsize); |
496 |
|
497 |
|
498 |
/* Misc */ |
499 |
|
500 |
extern unsigned int ModeColourNumber(unsigned int pal_entry); |
501 |
|
502 |
/* Returns -1 if error in joystick module, -2 if SWI unknown, joystate otherwise */ |
503 |
extern int Joystick_Read(int joyno); |
504 |
|
505 |
|
506 |
/* Sound stuff */ |
507 |
|
508 |
#define DRState_Active 1 |
509 |
#define DRState_NeedData 2 |
510 |
#define DRState_Overflow 4 |
511 |
|
512 |
/* Sound calls */ |
513 |
|
514 |
extern int Sound_Volume(int volume); |
515 |
|
516 |
/* Digital Renderer SWI calls */ |
517 |
extern _kernel_oserror *DigitalRenderer_Activate(int Channels, int Length, int SamPeriod); |
518 |
|
519 |
extern _kernel_oserror *DigitalRenderer_Deactivate(void); |
520 |
|
521 |
extern _kernel_oserror *DigitalRenderer_Pause(void); |
522 |
|
523 |
extern _kernel_oserror *DigitalRenderer_Resume(void); |
524 |
|
525 |
extern _kernel_oserror *DigitalRenderer_GetTables(uint8 **LinToLog, uint8 **LogScale); |
526 |
|
527 |
extern int DigitalRenderer_ReadState(void); |
528 |
|
529 |
extern _kernel_oserror *DigitalRenderer_NewSample(uint8 *Sample); |
530 |
|
531 |
} |
532 |
|
533 |
#endif |