This file is indexed.

/usr/share/z88dk/include/spectrum.h is in z88dk-data 1.8.ds1-10.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
/*
 * Headerfile for Spectrum specific stuff
 *
 * $Id: spectrum.h,v 1.26 2008/02/12 14:43:57 stefano Exp $
 */

#ifndef __SPECTRUM_H__
#define __SPECTRUM_H__

#include <sys/types.h>

/////////////
// CONSTANTS
/////////////

// Attributes

#define BLACK          0x00
#define BLUE           0x01
#define RED            0x02
#define MAGENTA        0x03
#define GREEN          0x04
#define CYAN           0x05
#define YELLOW         0x06
#define WHITE          0x07

#define INK_BLACK      0x00
#define INK_BLUE       0x01
#define INK_RED        0x02
#define INK_MAGENTA    0x03
#define INK_GREEN      0x04
#define INK_CYAN       0x05
#define INK_YELLOW     0x06
#define INK_WHITE      0x07

#define PAPER_BLACK    0x00
#define PAPER_BLUE     0x08
#define PAPER_RED      0x10
#define PAPER_MAGENTA  0x18
#define PAPER_GREEN    0x20
#define PAPER_CYAN     0x28
#define PAPER_YELLOW   0x30
#define PAPER_WHITE    0x38

#define BRIGHT         0x40
#define FLASH          0x80

// Basic Tokens

#define TK_RND         165
#define TK_INKEYS      166
#define TK_PI          167
#define TK_FN          168
#define TK_POINT       169
#define TK_SCREENS     170
#define TK_ATTR        171
#define TK_AT          172
#define TK_TAB         173
#define TK_VALS        174
#define TK_CODE        175
#define TK_VAL         176
#define TK_LEN         177
#define TK_SIN         178
#define TK_COS         179
#define TK_TAN         180
#define TK_ASN         181
#define TK_ACS         182
#define TK_ATN         183
#define TK_LN          184
#define TK_EXP         185
#define TK_INT         186
#define TK_SQR         187
#define TK_SGN         188
#define TK_ABS         189
#define TK_PEEK        190
#define TK_IN          191
#define TK_USR         192
#define TK_STRS        193
#define TK_CHRS        194
#define TK_NOT         195
#define TK_BIN         196
#define TK_OR          197
#define TK_AND         198
#define TK_LEQ         199
#define TK_GEQ         200
#define TK_NEQ         201
#define TK_LINE        202
#define TK_THEN        203
#define TK_TO          204
#define TK_STEP        205
#define TK_DEF_FN      206
#define TK_CAT         207
#define TK_FORMAT      208
#define TK_MOVE        209
#define TK_ERASE       210
#define TK_OPEN        211
#define TK_CLOSE       212
#define TK_MERGE       213
#define TK_VERIFY      214
#define TK_BEEP        215
#define TK_CIRCLE      216
#define TK_INK         217
#define TK_PAPER       218
#define TK_FLASH       219
#define TK_BRIGHT      220
#define TK_INVERSE     221
#define TK_OVER        222
#define TK_OUT         223
#define TK_LPRINT      224
#define TK_LLIST       225
#define TK_STOP        226
#define TK_READ        227
#define TK_DATA        228
#define TK_RESTORE     229
#define TK_NEW         230
#define TK_BORDER      231
#define TK_CONTINUE    232
#define TK_CONT        232
#define TK_DIM         233
#define TK_REM         234
#define TK_FOR         235
#define TK_GO_TO       236
#define TK_GO_SUB      237
#define TK_INPUT       238
#define TK_LOAD        239
#define TK_LIST        240
#define TK_LET         241
#define TK_PAUSE       242
#define TK_NEXT        243
#define TK_POKE        244
#define TK_PRINT       245
#define TK_PLOT        246
#define TK_RUN         247
#define TK_SAVE        248
#define TK_RANDOMIZE   249
#define TK_RAND        249
#define TK_IF          250
#define TK_CLS         251
#define TK_DRAW        252
#define TK_CLEAR       253
#define TK_RETURN      254
#define TK_COPY        255


///////////////////////////////////////////
// DIAGNOSTICS AND HARDWARE IDENTIFICATION
///////////////////////////////////////////

extern int  __LIB__ zx_128mode(void);            // true or false
extern int  __LIB__ zx_floatingbus(void);        // true or false
extern int  __LIB__ zx_issue3(void);             // true or false
extern int  __LIB__ zx_type(void);		 // 0:48K - 1: 128K - 2: TS2068
extern int  __LIB__ zx_model(void);
extern int  __LIB__ zx_basic_length(void);
extern int  __LIB__ zx_var_length(void);
extern int  __LIB__ zx_printer(void);
extern int  __LIB__ zx_soundchip(void);
extern int  __LIB__ zx_timexsound(void);
extern int  __LIB__ zx_fullerstick(void);
extern int  __LIB__ zx_kempstonmouse(void);
extern int  __LIB__ zx_kempston(void);
extern int  __LIB__ zx_iss_stick(void);
extern int  __LIB__ zx_mb02(void);
extern int  __LIB__ zx_multiface(void);
extern int  __LIB__ zx_disciple(void);
extern int  __LIB__ zx_plus3fdc(void);
extern int  __LIB__ zx_extsys(void);
extern int  __LIB__ zx_basemem(void);
extern int  __LIB__ zx_break(void);


///////////////////////////////
// INTERFACE FOR CALLING BASIC
///////////////////////////////

extern int  __LIB__ __FASTCALL__ zx_syntax(char *statement);
extern int  __LIB__ __FASTCALL__ zx_goto(int line);
extern int  __LIB__              zx_getstr(char variable, char *value);
extern void __LIB__              zx_setstr(char variable, char *value);
extern int  __LIB__ __FASTCALL__ zx_getint(char *variable);
extern void __LIB__              zx_setint(char *variable, int value);

extern int  __LIB__ __CALLEE__   zx_getstr_callee(char variable, char *value);
extern void __LIB__ __CALLEE__   zx_setstr_callee(char variable, char *value);
extern void __LIB__ __CALLEE__   zx_setint_callee(char *variable, int value);

#define zx_getstr(a,b)           zx_getstr_callee(a,b)
#define zx_setstr(a,b)           zx_setstr_callee(a,b)
#define zx_setint(a,b)           zx_setint_callee(a,b)


////////////
// TAPE I/O
////////////

struct zxtapehdr {             // standard tape header
   unsigned char type;
   char          name[10];
   size_t        length;
   size_t        address;
   size_t        offset;
};

extern int  __LIB__            tape_save(char *name, size_t loadstart,void *start, size_t len);
extern int  __LIB__            tape_save_block(void *addr, size_t len, unsigned char type);
extern int  __LIB__            tape_load_block(void *addr, size_t len, unsigned char type);

extern int  __LIB__ __CALLEE__ tape_save_block_callee(void *addr, size_t len, unsigned char type);
extern int  __LIB__ __CALLEE__ tape_load_block_callee(void *addr, size_t len, unsigned char type);

#define tape_save_block(a,b,c) tape_save_block_callee(a,b,c)
#define tape_load_block(a,b,c) tape_load_block_callee(a,b,c)


///////////////////////////////////
// DISK AND OTHER MASS STORAGE I/O
///////////////////////////////////

// +3 Disk

#ifdef PLUS3                   // if it's a +3 we want the dodos routine
#pragma output NEEDplus3dodos

extern int  __LIB__ findhand(void);
extern void __LIB__ freehand(int);

#endif

// RESIDOS

#ifdef RESIDOS                 // if it's residos then we want dodos routines
#pragma output NEEDresidos

extern int  __LIB__ findhand(void);
extern void __LIB__ freehand(int);

#endif


/////////////////////////////////////////////////////////////////
// INPUT DEVICES: KEYBOARD, JOYSTICK AND MICE (SEE ALSO INPUT.H)
/////////////////////////////////////////////////////////////////

// Joystick Functions

extern unsigned int  __LIB__ in_JoyFuller(void);
extern unsigned int  __LIB__ in_JoyKempston(void);
extern unsigned int  __LIB__ in_JoySinclair1(void);
extern unsigned int  __LIB__ in_JoySinclair2(void);
extern unsigned int  __LIB__ in_JoyTimex1(void);
extern unsigned int  __LIB__ in_JoyTimex2(void);

// AMX Mouse
//
// To use you must declare the following global variables
// uint in_AMXcoordX, in_AMXcoordY, in_AMXdeltaX, in_AMXdeltaY;

extern void __LIB__             in_MouseAMXInit(uchar xvector, uchar yvector);
extern void __LIB__             in_MouseAMX(uchar *buttons, uint *xcoord, uint *ycoord);
extern void __LIB__             in_MouseAMXSetPos(uint xcoord, uint ycoord);

extern void __LIB__ __CALLEE__  in_MouseAMXInit_callee(uchar xvector, uchar yvector);
extern void __LIB__ __CALLEE__  in_MouseAMX_callee(uchar *buttons, uint *xcoord, uint *ycoord);
extern void __LIB__ __CALLEE__  in_MouseAMXSetPos_callee(uint xcoord, uint ycoord);

#define in_MouseAMXInit(a,b)    in_MouseAMXInit_callee(a,b)
#define in_MouseAMX(a,b,c)      in_MouseAMX_callee(a,b,c)
#define in_MouseAMXSetPos(a,b)  in_MouseAMXSetPos_callee(a,b)

// Kempston Mouse
//
// To use you must declare the following global variables
// uchar in_KempcoordX, in_KempcoordY, in_KemprawX, in_KemprawY;

extern void __LIB__             in_MouseKempInit(void);
extern void __LIB__             in_MouseKemp(uchar *buttons, uint *xcoord, uint *ycoord);
extern void __LIB__             in_MouseKempSetPos(uint xcoord, uint ycoord);

extern void __LIB__ __CALLEE__  in_MouseKemp_callee(uchar *buttons, uint *xcoord, uint *ycoord);
extern void __LIB__ __CALLEE__  in_MouseKempSetPos_callee(uint xcoord, uint ycoord);

#define in_MouseKemp(a,b,c)     in_MouseKemp_callee(a,b,c)
#define in_MouseKempSetPos(a,b) in_MouseKempSetPos_callee(a,b)


//////////////////////////
// DISPLAY FILE FUNCTIONS
//////////////////////////

extern void  __LIB__ __FASTCALL__ zx_border(uchar colour);
extern uint  __LIB__              zx_attr(uchar row, uchar col);
extern uint  __LIB__              zx_screenstr(uchar row, uchar col);

extern uint  __LIB__ __CALLEE__   zx_attr_callee(uchar row, uchar col);
extern uint  __LIB__ __CALLEE__   zx_screenstr_callee(uchar row, uchar col);

#define zx_attr(a,b)              zx_attr_callee(a,b)
#define zx_screenstr(a,b)         zx_screenstr_callee(a,b)

// In the following, screen address refers to a pixel address within the display file while
// attribute address refers to the attributes area.
//
// Function names are constructed from the following atoms:
//
// saddr = screen address
// aaddr = attribute address
// 
// px    = pixel x coordinate (0..255)
// py    = pixel y coordinate (0..191)
// pxy   = pixel (x,y) coordinate
//
// cx    = character x coordinate (0..31)
// cy    = character y coordinate (0..23)
// cyx   = character (y,x) coordinate - ordering borrowed from Sinclair Basic
//
// So for example:
//
// zx_saddr2cy(saddr) will return the character y coordinate corresponding to the given screen address
// zx_saddr2aaddr(saddr) will return the attribute address corresponding to the given screen address
// zx_pxy2aaddr(px,py) will return the attribute address corresponding to the given (x,y) pixel coordinate
//
// Some functions will return with carry flag set if coordinates or addresses move out of
// bounds.  In these cases the special z88dk keywords iferror() and ifnerror() can be used
// to test the carry flag and determine if invalid results are returned.  Check with the
// wiki documentation or the asm source files to see which functions support this.  If
// comments in the asm source file do not mention this it is not supported.

// DISPLAY PIXEL ADDRESS MANIPULATORS

extern uchar __LIB__              *zx_cyx2saddr(uchar row, uchar col);
extern uchar __LIB__ __FASTCALL__ *zx_cy2saddr(uchar row);           // cx assumed 0

extern uchar __LIB__              *zx_pxy2saddr(uchar xcoord, uchar ycoord, uchar *mask);
extern uchar __LIB__ __FASTCALL__ *zx_py2saddr(uchar ycoord);        // px assumed 0

extern uint  __LIB__ __FASTCALL__  zx_saddr2cx(void *pixeladdr);
extern uint  __LIB__ __FASTCALL__  zx_saddr2cy(void *pixeladdr);

extern uint  __LIB__               zx_saddr2px(void *pixeladdr, uchar mask);
extern uint  __LIB__ __FASTCALL__  zx_saddr2py(void *pixeladdr);

extern uchar __LIB__ __FASTCALL__ *zx_saddr2aaddr(void *pixeladdr);

extern uchar __LIB__ __FASTCALL__ *zx_saddrcdown(void *pixeladdr);
extern uchar __LIB__ __FASTCALL__ *zx_saddrcleft(void *pixeladdr);
extern uchar __LIB__ __FASTCALL__ *zx_saddrcright(void *pixeladdr);
extern uchar __LIB__ __FASTCALL__ *zx_saddrcup(void *pixeladdr);

extern uchar __LIB__ __FASTCALL__ *zx_saddrpdown(void *pixeladdr);
extern uchar __LIB__              *zx_saddrpleft(void *pixeladdr, uchar *mask);
extern uchar __LIB__              *zx_saddrpright(void *pixeladdr, uchar *mask);
extern uchar __LIB__ __FASTCALL__ *zx_saddrpup(void *pixeladdr);

extern uchar __LIB__ __CALLEE__   *zx_cyx2saddr_callee(uchar row, uchar col);
extern uchar __LIB__ __CALLEE__   *zx_pxy2saddr_callee(uchar xcoord, uchar ycoord, uchar *mask);
extern uint  __LIB__ __CALLEE__    zx_saddr2px_callee(void *pixeladdr, uchar mask);
extern uchar __LIB__ __CALLEE__   *zx_saddrpleft_callee(void *pixeladdr, uchar *mask);
extern uchar __LIB__ __CALLEE__   *zx_saddrpright_callee(void *pixeladdr, uchar *mask);

#define zx_cyx2saddr(a,b)          zx_cyx2saddr_callee(a,b)
#define zx_pxy2saddr(a,b,c)        zx_pxy2saddr_callee(a,b,c)
#define zx_saddr2px(a,b)           zx_saddr2px_callee(a,b)
#define zx_saddrpleft(a,b)         zx_saddrpleft_callee(a,b)
#define zx_saddrpright(a,b)        zx_saddrpright_callee(a,b)

// DISPLAY ATTRIBUTE ADDRESS MANIPULATORS

extern uchar __LIB__              *zx_cyx2aaddr(uchar row, uchar col);
extern uchar __LIB__ __FASTCALL__ *zx_cy2aaddr(uchar row);           // cx assumed 0

extern uchar __LIB__              *zx_pxy2aaddr(uchar xcoord, uchar ycoord);
extern uchar __LIB__ __FASTCALL__ *zx_py2aaddr(uchar ycoord);        // px assumed 0

extern uint  __LIB__ __FASTCALL__  zx_aaddr2cx(void *attraddr);
extern uint  __LIB__ __FASTCALL__  zx_aaddr2cy(void *attraddr);
 
extern uint  __LIB__ __FASTCALL__  zx_aaddr2px(void *attraddr);
extern uint  __LIB__ __FASTCALL__  zx_aaddr2py(void *attraddr);

extern uchar __LIB__ __FASTCALL__ *zx_aaddr2saddr(void *attraddr);

extern uchar __LIB__ __FASTCALL__ *zx_aaddrcdown(void *attraddr);
extern uchar __LIB__ __FASTCALL__ *zx_aaddrcleft(void *attraddr);
extern uchar __LIB__ __FASTCALL__ *zx_aaddrcright(void *attraddr);
extern uchar __LIB__ __FASTCALL__ *zx_aaddrcup(void *attraddr);

extern uchar __LIB__ __CALLEE__   *zx_cyx2aaddr_callee(uchar row, uchar col);
extern uchar __LIB__ __CALLEE__   *zx_pxy2aaddr_callee(uchar xcoord, uchar ycoord);

#define zx_cyx2aaddr(a,b)          zx_cyx2aaddr_callee(a,b)
#define zx_pxy2aaddr(a,b)          zx_pxy2aaddr_callee(a,b)


#endif