1 {
2     This file is part of the Free Pascal run time library.
3     Copyright (c) 2004 Karoly Balogh for Genesi S.a.r.l. <www.genesi.lu>
4 
5     Hardware definitions unit for MorphOS/PowerPC
6 
7     MorphOS port was done on a free Pegasos II/G4 machine
8     provided by Genesi S.a.r.l. <www.genesi.lu>
9 
10     See the file COPYING.FPC, included in this distribution,
11     for details about the copyright.
12 
13     This program is distributed in the hope that it will be useful,
14     but WITHOUT ANY WARRANTY; without even the implied warranty of
15     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
16 
17  **********************************************************************}
18 
19 {$PACKRECORDS 2}
20 unit hardware;
21 
22 interface
23 
24 uses exec;
25 
26 
27 
28 { * adkcon bit defines
29   * Copyright (c) 2002 The MorphOS Development Team, All Rights Reserved.
30   * }
31 
32 const
33   ADKB_SETCLR   = 15;
34   ADKB_PRECOMP1 = 14;
35   ADKB_PRECOMP0 = 13;
36   ADKB_MFMPREC  = 12;
37   ADKB_UARTBRK  = 11;
38   ADKB_WORDSYNC = 10;
39   ADKB_MSBSYNC  = 9;
40   ADKB_FAST     = 8;
41   ADKB_USE3PN   = 7;
42   ADKB_USE2P3   = 6;
43   ADKB_USE1P2   = 5;
44   ADKB_USE0P1   = 4;
45   ADKB_USE3VN   = 3;
46   ADKB_USE2V3   = 2;
47   ADKB_USE1V2   = 1;
48   ADKB_USE0V1   = 0;
49 
50 const
51   ADKF_SETCLR   = (1 Shl ADKB_SETCLR);
52   ADKF_PRECOMP1 = (1 Shl ADKB_PRECOMP1);
53   ADKF_PRECOMP0 = (1 Shl ADKB_PRECOMP0);
54   ADKF_MFMPREC  = (1 Shl ADKB_MFMPREC);
55   ADKF_UARTBRK  = (1 Shl ADKB_UARTBRK);
56   ADKF_WORDSYNC = (1 Shl ADKB_WORDSYNC);
57   ADKF_MSBSYNC  = (1 Shl ADKB_MSBSYNC);
58   ADKF_FAST     = (1 Shl ADKB_FAST);
59   ADKF_USE3PN   = (1 Shl ADKB_USE3PN);
60   ADKF_USE2P3   = (1 Shl ADKB_USE2P3);
61   ADKF_USE1P2   = (1 Shl ADKB_USE1P2);
62   ADKF_USE0P1   = (1 Shl ADKB_USE0P1);
63   ADKF_USE3VN   = (1 Shl ADKB_USE3VN);
64   ADKF_USE2V3   = (1 Shl ADKB_USE2V3);
65   ADKF_USE1V2   = (1 Shl ADKB_USE1V2);
66   ADKF_USE0V1   = (1 Shl ADKB_USE0V1);
67 
68 const
69   ADKF_PRE000NS = 0;
70   ADKF_PRE140NS = (ADKF_PRECOMP0);
71   ADKF_PRE280NS = (ADKF_PRECOMP1);
72   ADKF_PRE560NS = (ADKF_PRECOMP0 or ADKF_PRECOMP1);
73 
74 
75 
76 { * blitter defines
77   * Copyright (c) 2002 The MorphOS Development Team, All Rights Reserved.
78   * }
79 
80 const
81   HSIZEBITS = 6;
82   VSIZEBITS = (16 - HSIZEBITS);
83   HSIZEMASK = $3F;
84   VSIZEMASK = $3FF;
85 
86 {$IFNDEF NO_BIG_BLITS}
87   MINBYTESPERROW = 128;
88   MAXBYTESPERROW = 4096;
89 {$ELSE}
90   MAXBYTESPERROW = 128;
91 {$ENDIF}
92 
93 const
94   ABC    = $80;
95   ABNC   = $40;
96   ANBC   = $20;
97   ANBNC  = $10;
98   NABC   = $8;
99   NABNC  = $4;
100   NANBC  = $2;
101   NANBNC = $1;
102 
103 const
104   A_OR_B  = (ABC or ANBC or NABC or ABNC or ANBNC or NABNC);
105   A_OR_C  = (ABC or NABC or ABNC or ANBC or NANBC or ANBNC);
106   A_XOR_C = (NABC or ABNC or NANBC or ANBNC);
107   A_TO_D  = (ABC or ANBC or ABNC or ANBNC);
108 
109 const
110   BC0B_DEST = 8;
111   BC0B_SRCC = 9;
112   BC0B_SRCB = 10;
113   BC0B_SRCA = 11;
114   BC0F_DEST = (1 Shl BC0B_DEST);
115   BC0F_SRCC = (1 Shl BC0B_SRCC);
116   BC0F_SRCB = (1 Shl BC0B_SRCB);
117   BC0F_SRCA = (1 Shl BC0B_SRCA);
118 
119   BC1F_DESC = 2;
120 
121   DEST = BC0F_DEST;
122   SRCC = BC0F_SRCC;
123   SRCB = BC0F_SRCB;
124   SRCA = BC0F_SRCA;
125 
126   ASHIFTSHIFT = 12;
127   BSHIFTSHIFT = 12;
128 
129 const
130   LINEMODE     = $1;
131   FILL_OR      = $8;
132   FILL_XOR     = $10;
133   FILL_CARRYIN = $4;
134   ONEDOT       = $2;
135   OVFLAG       = $20;
136   SIGNFLAG     = $40;
137   BLITREVERSE  = $2;
138 
139   SUD = $10;
140   SUL = $8;
141   AUL = $4;
142 
143   OCTANT8 = 24;
144   OCTANT7 = 4;
145   OCTANT6 = 12;
146   OCTANT5 = 28;
147   OCTANT4 = 20;
148   OCTANT3 = 8;
149   OCTANT2 = 0;
150   OCTANT1 = 16;
151 
152 type
153   Pbltnode = ^Tbltnode;
154   Tbltnode = record
155     n        : Pbltnode;
Pointernull156     _function: Pointer;
157     stat     : Byte;
158     blitsize : SmallInt;
159     beamsync : SmallInt;
160     cleanup  : Pointer;
161   end;
162 
163 const
164   CLEANUP = $40;
165   CLEANME = CLEANUP;
166 
167 
168 
169 { * byteswap routines
170   * Copyright (c) 2002 The MorphOS Development Team, All Rights Reserved.
171   * }
172 {$WARNING Byteswap macros not yet converted!}
173 
174 
175 
176 { * cia registers and bits
177   * Copyright (c) 2002 The MorphOS Development Team, All Rights Reserved.
178   * }
179 
180 
181 type
182   PCIA = ^TCIA;
183   TCIA = record
184     ciapra   : Byte;
185     pad0     : Array[0..254] of Byte;
186     ciaprb   : Byte;
187     pad1     : array[0..254] of Byte;
188     ciaddra  : Byte;
189     pad2     : array[0..254] of Byte;
190     ciaddrb  : Byte;
191     pad3     : array[0..254] of Byte;
192     ciatalo  : Byte;
193     pad4     : array[0..254] of Byte;
194     ciatahi  : Byte;
195     pad5     : array[0..254] of Byte;
196     ciatblo  : Byte;
197     pad6     : array[0..254] of Byte;
198     ciatbhi  : Byte;
199     pad7     : array[0..254] of Byte;
200     ciatodlow: Byte;
201     pad8     : array[0..254] of Byte;
202     ciatodmid: Byte;
203     pad9     : array[0..254] of Byte;
204     ciatodhi : Byte;
205     pad10    : array[0..254] of Byte;
206     unusedreg: Byte;
207     pad11    : array[0..254] of Byte;
208     ciasdr   : Byte;
209     pad12    : array[0..254] of Byte;
210     ciaicr   : Byte;
211     pad13    : array[0..254] of Byte;
212     ciacra   : Byte;
213     pad14    : array[0..254] of Byte;
214     ciacrb   : Byte;
215   end;
216 
217 const
218   CIAICRB_TA     = 0;
219   CIAICRB_TB     = 1;
220   CIAICRB_ALRM   = 2;
221   CIAICRB_SP     = 3;
222   CIAICRB_FLG    = 4;
223   CIAICRB_IR     = 7;
224   CIAICRB_SETCLR = 7;
225 
226   CIAICRF_TA     = (1 Shl CIAICRB_TA);
227   CIAICRF_TB     = (1 Shl CIAICRB_TB);
228   CIAICRF_ALRM   = (1 Shl CIAICRB_ALRM);
229   CIAICRF_SP     = (1 Shl CIAICRB_SP);
230   CIAICRF_FLG    = (1 Shl CIAICRB_FLG);
231   CIAICRF_IR     = (1 Shl CIAICRB_IR);
232   CIAICRF_SETCLR = (1 Shl CIAICRB_SETCLR);
233 
234 const
235   CIACRAB_START   = 0;
236   CIACRAB_PBON    = 1;
237   CIACRAB_OUTMODE = 2;
238   CIACRAB_RUNMODE = 3;
239   CIACRAB_LOAD    = 4;
240   CIACRAB_INMODE  = 5;
241   CIACRAB_SPMODE  = 6;
242   CIACRAB_TODIN   = 7;
243 
244   CIACRAF_START   = (1 Shl CIACRAB_START);
245   CIACRAF_PBON    = (1 Shl CIACRAB_PBON);
246   CIACRAF_OUTMODE = (1 Shl CIACRAB_OUTMODE);
247   CIACRAF_RUNMODE = (1 Shl CIACRAB_RUNMODE);
248   CIACRAF_LOAD    = (1 Shl CIACRAB_LOAD);
249   CIACRAF_INMODE  = (1 Shl CIACRAB_INMODE);
250   CIACRAF_SPMODE  = (1 Shl CIACRAB_SPMODE);
251   CIACRAF_TODIN   = (1 Shl CIACRAB_TODIN);
252 
253 const
254   CIACRBB_START   = 0;
255   CIACRBB_PBON    = 1;
256   CIACRBB_OUTMODE = 2;
257   CIACRBB_RUNMODE = 3;
258   CIACRBB_LOAD    = 4;
259   CIACRBB_INMODE0 = 5;
260   CIACRBB_INMODE1 = 6;
261   CIACRBB_ALARM   = 7;
262 
263   CIACRBF_START   = (1 Shl CIACRBB_START);
264   CIACRBF_PBON    = (1 Shl CIACRBB_PBON);
265   CIACRBF_OUTMODE = (1 Shl CIACRBB_OUTMODE);
266   CIACRBF_RUNMODE = (1 Shl CIACRBB_RUNMODE);
267   CIACRBF_LOAD    = (1 Shl CIACRBB_LOAD);
268   CIACRBF_INMODE0 = (1 Shl CIACRBB_INMODE0);
269   CIACRBF_INMODE1 = (1 Shl CIACRBB_INMODE1);
270   CIACRBF_ALARM   = (1 Shl CIACRBB_ALARM);
271 
272 const
273   CIACRBF_IN_PHI2   = 0;
274   CIACRBF_IN_CNT    = (CIACRBF_INMODE0);
275   CIACRBF_IN_TA     = (CIACRBF_INMODE1);
276   CIACRBF_IN_CNT_TA = (CIACRBF_INMODE0 or CIACRBF_INMODE1);
277 
278 const
279   CIAB_GAMEPORT1 = (7);
280   CIAB_GAMEPORT0 = (6);
281   CIAB_DSKRDY    = (5);
282   CIAB_DSKTRACK0 = (4);
283   CIAB_DSKPROT   = (3);
284   CIAB_DSKCHANGE = (2);
285   CIAB_LED       = (1);
286   CIAB_OVERLAY   = (0);
287 
288   CIAF_GAMEPORT1 = (1 Shl CIAB_GAMEPORT1);
289   CIAF_GAMEPORT0 = (1 Shl CIAB_GAMEPORT0);
290   CIAF_DSKRDY    = (1 Shl CIAB_DSKRDY);
291   CIAF_DSKTRACK0 = (1 Shl CIAB_DSKTRACK0);
292   CIAF_DSKPROT   = (1 Shl CIAB_DSKPROT);
293   CIAF_DSKCHANGE = (1 Shl CIAB_DSKCHANGE);
294   CIAF_LED       = (1 Shl CIAB_LED);
295   CIAF_OVERLAY   = (1 Shl CIAB_OVERLAY);
296 
297 const
298   CIAB_COMDTR    = (7);
299   CIAB_COMRTS    = (6);
300   CIAB_COMCD     = (5);
301   CIAB_COMCTS    = (4);
302   CIAB_COMDSR    = (3);
303   CIAB_PRTRSEL   = (2);
304   CIAB_PRTRPOUT  = (1);
305   CIAB_PRTRBUSY  = (0);
306 
307   CIAF_COMDTR    = (1 Shl CIAB_COMDTR);
308   CIAF_COMRTS    = (1 Shl CIAB_COMRTS);
309   CIAF_COMCD     = (1 Shl CIAB_COMCD);
310   CIAF_COMCTS    = (1 Shl CIAB_COMCTS);
311   CIAF_COMDSR    = (1 Shl CIAB_COMDSR);
312   CIAF_PRTRSEL   = (1 Shl CIAB_PRTRSEL);
313   CIAF_PRTRPOUT  = (1 Shl CIAB_PRTRPOUT);
314   CIAF_PRTRBUSY  = (1 Shl CIAB_PRTRBUSY);
315 
316 const
317   CIAB_DSKMOTOR  = (7);
318   CIAB_DSKSEL3   = (6);
319   CIAB_DSKSEL2   = (5);
320   CIAB_DSKSEL1   = (4);
321   CIAB_DSKSEL0   = (3);
322   CIAB_DSKSIDE   = (2);
323   CIAB_DSKDIREC  = (1);
324   CIAB_DSKSTEP   = (0);
325 
326   CIAF_DSKMOTOR  = (1 Shl CIAB_DSKMOTOR);
327   CIAF_DSKSEL3   = (1 Shl CIAB_DSKSEL3);
328   CIAF_DSKSEL2   = (1 Shl CIAB_DSKSEL2);
329   CIAF_DSKSEL1   = (1 Shl CIAB_DSKSEL1);
330   CIAF_DSKSEL0   = (1 Shl CIAB_DSKSEL0);
331   CIAF_DSKSIDE   = (1 Shl CIAB_DSKSIDE);
332   CIAF_DSKDIREC  = (1 Shl CIAB_DSKDIREC);
333   CIAF_DSKSTEP   = (1 Shl CIAB_DSKSTEP);
334 
335 
336 
337 { * custom-chip registers and bits
338   * Copyright (c) 2002 The MorphOS Development Team, All Rights Reserved.
339   * }
340 
341 type
342   PAudChannel = ^TAudChannel;
343   TAudChannel = record
344     ac_ptr: Pointer;
345     ac_len: Word;
346     ac_per: Word;
347     ac_vol: Word;
348     ac_dat: Word;
349     ac_pad: array[0..1] of Word;
350   end;
351 
352   PSpriteDef = ^TSpriteDef;
353   TSpriteDef = record
354     pos  : Word;
355     ctl  : Word;
356     dataa: Word;
357     datab: Word;
358   end;
359 
360   PCustom = ^TCustom;
361   TCustom = record
362     bltddat : Word;
363     dmaconr : Word;
364     vposr   : Word;
365     vhposr  : Word;
366     dskdatr : Word;
367     joy0dat : Word;
368     joy1dat : Word;
369     clxdat  : Word;
370     adkconr : Word;
371     pot0dat : Word;
372     pot1dat : Word;
373     potinp  : Word;
374     serdatr : Word;
375     dskbytr : Word;
376     intenar : Word;
377     intreqr : Word;
378     dskpt   : Pointer;
379     dsklen  : Word;
380     dskdat  : Word;
381     refptr  : Word;
382     vposw   : Word;
383     vhposw  : Word;
384     copcon  : Word;
385     serdat  : Word;
386     serper  : Word;
387     potgo   : Word;
388     joytest : Word;
389     strequ  : Word;
390     strvbl  : Word;
391     strhor  : Word;
392     strlong : Word;
393     bltcon0 : Word;
394     bltcon1 : Word;
395     bltafwm : Word;
396     bltalwm : Word;
397     bltcpt  : Pointer;
398     bltbpt  : Pointer;
399     bltapt  : Pointer;
400     bltdpt  : Pointer;
401     bltsize : Word;
402     pad2d   : Byte;
403     bltcon0l: Byte;
404     bltsizv : Word;
405     bltsizh : Word;
406     bltcmod : Word;
407     bltbmod : Word;
408     bltamod : Word;
409     bltdmod : Word;
410     pad34   : array[0..3] of Word;
411     bltcdat : Word;
412     bltbdat : Word;
413     bltadat : Word;
414     pad3b   : array[0..2] of Word;
415     deniseid: Word;
416     dsksync : Word;
417     cop1lc  : Longint;
418     cop2lc  : Longint;
419     copjmp1 : Word;
420     copjmp2 : Word;
421     copins  : Word;
422     diwstrt : Word;
423     diwstop : Word;
424     ddfstrt : Word;
425     ddfstop : Word;
426     dmacon  : Word;
427     clxcon  : Word;
428     intena  : Word;
429     intreq  : Word;
430     adkcon  : Word;
431     aud     : array[0..3] of TAudChannel;
432     bplpt   : array[0..7] of Pointer;
433     bplcon0 : Word;
434     bplcon1 : Word;
435     bplcon2 : Word;
436     bplcon3 : Word;
437     bpl1mod : Word;
438     bpl2mod : Word;
439     bplcon4 : Word;
440     clxcon2 : Word;
441     bpldat  : array[0..7] of Word;
442     sprpt   : array[0..7] of Pointer;
443     spr     : array[0..7] of TSpriteDef;
444     color   : array[0..31] of Word;
445     htotal  : Word;
446     hsstop  : Word;
447     hbstrt  : Word;
448     hbstop  : Word;
449     vtotal  : Word;
450     vsstop  : Word;
451     vbstrt  : Word;
452     vbstop  : Word;
453     sprhstrt: Word;
454     sprhstop: Word;
455     bplhstrt: Word;
456     bplhstop: Word;
457     hhposw  : Word;
458     hhposr  : Word;
459     beamcon0: Word;
460     hsstrt  : Word;
461     vsstrt  : Word;
462     hcenter : Word;
463     diwhigh : Word;
464     padf3   : array[0..10] of Word;
465     fmode   : Word;
466   end;
467 
468 
469 const
470   VARVBLANK   = $1000;
471   LOLDIS      = $0800;
472   CSCBLANKEN  = $0400;
473   VARVSYNC    = $0200;
474   VARHSYNC    = $0100;
475   VARBEAM     = $0080;
476   DISPLAYDUAL = $0040;
477   DISPLAYPAL  = $0020;
478   VARCSYNC    = $0010;
479   CSBLANK     = $0008;
480   CSYNCTRUE   = $0004;
481   VSYNCTRUE   = $0002;
482   HSYNCTRUE   = $0001;
483 
484   USE_BPLCON3 = 1;
485 
486   BPLCON2_ZDCTEN    = (1 Shl 10);
487   BPLCON2_ZDBPEN    = (1 Shl 11);
488   BPLCON2_ZDBPSEL0  = (1 Shl 12);
489   BPLCON2_ZDBPSEL1  = (1 Shl 13);
490   BPLCON2_ZDBPSEL2  = (1 Shl 14);
491 
492   BPLCON3_EXTBLNKEN = (1 Shl 0);
493   BPLCON3_EXTBLKZD  = (1 Shl 1);
494   BPLCON3_ZDCLKEN   = (1 Shl 2);
495   BPLCON3_BRDNTRAN  = (1 Shl 4);
496   BPLCON3_BRDNBLNK  = (1 Shl 5);
497 
498 
499 
500 { * dma bits
501   * Copyright (c) 2002 The MorphOS Development Team, All Rights Reserved.
502   * }
503 
504 const
505   DMAB_AUD0     = 0;
506   DMAB_AUD1     = 1;
507   DMAB_AUD2     = 2;
508   DMAB_AUD3     = 3;
509   DMAB_DISK     = 4;
510   DMAB_SPRITE   = 5;
511   DMAB_BLITTER  = 6;
512   DMAB_COPPER   = 7;
513   DMAB_RASTER   = 8;
514   DMAB_MASTER   = 9;
515   DMAB_BLITHOG  = 10;
516   DMAB_BLTNZERO = 13;
517   DMAB_BLTDONE  = 14;
518   DMAB_SETCLR   = 15;
519 
520   DMAF_AUD0     = (1 Shl DMAB_AUD0);
521   DMAF_AUD1     = (1 Shl DMAB_AUD1);
522   DMAF_AUD2     = (1 Shl DMAB_AUD2);
523   DMAF_AUD3     = (1 Shl DMAB_AUD3);
524   DMAF_DISK     = (1 Shl DMAB_DISK);
525   DMAF_SPRITE   = (1 Shl DMAB_SPRITE);
526   DMAF_BLITTER  = (1 Shl DMAB_BLITTER);
527   DMAF_COPPER   = (1 Shl DMAB_COPPER);
528   DMAF_RASTER   = (1 Shl DMAB_RASTER);
529   DMAF_MASTER   = (1 Shl DMAB_MASTER);
530   DMAF_BLITHOG  = (1 Shl DMAB_BLITHOG);
531   DMAF_BLTNZERO = (1 Shl DMAB_BLTNZERO);
532   DMAF_BLTDONE  = (1 Shl DMAB_BLTDONE);
533   DMAF_SETCLR   = (1 Shl DMAB_SETCLR);
534 
535 const
536   DMAF_AUDIO    = (DMAF_AUD0 or DMAF_AUD1 or DMAF_AUD2 or DMAF_AUD3);
537   DMAF_ALL      = (DMAF_AUD0 or DMAF_AUD1 or DMAF_AUD2 or DMAF_AUD3 or DMAF_DISK or DMAF_SPRITE or DMAF_BLITTER or DMAF_COPPER or DMAF_RASTER);
538 
539 
540 
541 { * interrupt bits
542   * Copyright (c) 2002 The MorphOS Development Team, All Rights Reserved.
543   * }
544 
545 const
546   INTB_SETCLR  = (15);
547   INTB_INTEN   = (14);
548   INTB_EXTER   = (13);
549   INTB_DSKSYNC = (12);
550   INTB_RBF     = (11);
551   INTB_AUD3    = (10);
552   INTB_AUD2    = (9);
553   INTB_AUD1    = (8);
554   INTB_AUD0    = (7);
555   INTB_BLIT    = (6);
556   INTB_VERTB   = (5);
557   INTB_COPER   = (4);
558   INTB_PORTS   = (3);
559   INTB_SOFTINT = (2);
560   INTB_DSKBLK  = (1);
561   INTB_TBE     = (0);
562 
563   INTF_SETCLR  = (1 Shl INTB_SETCLR);
564   INTF_INTEN   = (1 Shl INTB_INTEN);
565   INTF_EXTER   = (1 Shl INTB_EXTER);
566   INTF_DSKSYNC = (1 Shl INTB_DSKSYNC);
567   INTF_RBF     = (1 Shl INTB_RBF);
568   INTF_AUD3    = (1 Shl INTB_AUD3);
569   INTF_AUD2    = (1 Shl INTB_AUD2);
570   INTF_AUD1    = (1 Shl INTB_AUD1);
571   INTF_AUD0    = (1 Shl INTB_AUD0);
572   INTF_BLIT    = (1 Shl INTB_BLIT);
573   INTF_VERTB   = (1 Shl INTB_VERTB);
574   INTF_COPER   = (1 Shl INTB_COPER);
575   INTF_PORTS   = (1 Shl INTB_PORTS);
576   INTF_SOFTINT = (1 Shl INTB_SOFTINT);
577   INTF_DSKBLK  = (1 Shl INTB_DSKBLK);
578   INTF_TBE     = (1 Shl INTB_TBE);
579 
580 implementation
581 
582 end.
583