source: thomson/code/C/libthomson/thomson.h@ 9b520c5

main
Last change on this file since 9b520c5 was 9b520c5, checked in by Adrien Destugues <pulkomandy@…>, 11 years ago

Start to cleanup libthomson for easier reuse in upcoming projects

git-svn-id: svn://localhost/thomson@33 85ae3b6b-dc8f-4344-a89d-598714f2e4e5

  • Property mode set to 100644
File size: 5.7 KB
Line 
1// Libthomson - C wrapper for Thomson MO/TO monitor and hardware
2// Copyright 2012-2013, Adrien Destugues <pulkomandy@pulkomandy.tk>
3//
4// This file is distributed under the terms of the MIT licence.
5
6// You need the GCC-6809 compiler based on lwtools to use this file.
7// http://www.boxofdoom.net/2011/09/22/how-to-compile-gcc-for-the-6809-processor-gcc6809/
8
9#pragma once
10
11// 5 : MO5 / 8: TO8
12#ifndef PLATFORM
13 #error "make TARGET=TO8 or make TARGET=MO5"
14#endif
15
16///////////////////////////////////////
17// THOMSON.H
18///////////////////////////////////////
19
20/* MONITOR ZERO-PAGE */
21struct Monitor {
22 unsigned char TERMIN[0x18];
23 unsigned char STATUS;
24 unsigned char TABPT;
25 unsigned char RANG;
26 unsigned char COLN;
27 unsigned char TOPTAB;
28 unsigned char TOPRAN;
29 unsigned char BOTTAB;
30 unsigned char BOTRAN;
31 unsigned int SCRPT;
32 unsigned int STADR;
33 unsigned int ENDDR;
34 unsigned int BLOCZ;
35 unsigned char FORME;
36 unsigned char ATRANG;
37 unsigned char COLOUR;
38 unsigned char PAGFLG;
39 unsigned char SCROLS;
40 unsigned char CURSFL;
41 unsigned char COPCHR;
42 unsigned char EFCMPT;
43 unsigned char ITCMPT;
44 unsigned int PLOTX;
45 unsigned int PLOTY;
46 unsigned char CHDRAW;
47 unsigned char KEY;
48 unsigned char CMPKB;
49 unsigned char _unused1;
50 unsigned char TEMPO;
51 unsigned char _unused2;
52 unsigned char DUREE;
53 unsigned char WAVE;
54 unsigned int OCTAVE;
55 unsigned char K7DATA;
56 unsigned char K7LENG;
57 unsigned char PROPC;
58 unsigned char PRSTA;
59 unsigned int TEMP;
60 unsigned int SAVEST;
61 unsigned char DKOPC;
62 unsigned char DKDRV;
63 unsigned int DKTRK;
64 unsigned char DKSEC;
65 unsigned char DKNUM;
66 unsigned char DKSTA;
67 unsigned int DKBUF;
68 unsigned char DKTRACK[8];
69 unsigned char SEQUCE;
70 unsigned char US1;
71 unsigned char ACCENT;
72 unsigned char SS2GET;
73 unsigned char SS3GET;
74 unsigned int SWIPT;
75 unsigned char _unused3;
76 unsigned int TIMEPT;
77 unsigned char SEMIRQ;
78 unsigned int IRQPT;
79 unsigned char _unused4;
80 unsigned int FIRQPT;
81 unsigned char _unused5;
82 unsigned int SIMUL;
83 unsigned char _unused6;
84 unsigned int CHRPTR;
85 unsigned char _unused7;
86 unsigned int USERAF;
87 unsigned char _unused8;
88 unsigned int GENPTR;
89 unsigned char _unused9;
90 unsigned char LATCLV;
91 unsigned char GRCODE;
92 unsigned char DECALG;
93 unsigned char _unusedA[6];
94 unsigned char DEFDST;
95 unsigned char DKFLG;
96};
97
98_Static_assert(sizeof(Monitor) == 0x80, "Problem with struct packing, Monitor Zero-Page has wrong size.");
99
100
101void printhex(unsigned char i);
102extern unsigned char mark[];
103
104/* HARDWARE */
105#define FDC_STATUS (*(volatile unsigned char*)(FDCBASE))
106
107////////////////////////////////////////
108// MO5.H
109////////////////////////////////////////
110
111#if PLATFORM == 5
112/*****************************************************************************
113 * MOx CODE
114 ****************************************************************************/
115 volatile Monitor* monitor = (volatile Monitor*)0x2000;
116 #define FDCBASE 0xA7D0
117
118 /* MONITOR ENTRY POINTS */
119
120 static inline void MENU() {
121 asm(" SWI \n"
122 " FCB 0"
123 );
124 }
125
126 static inline void PUTC(unsigned char car) {
127 asm(" swi \n"
128 " fcb 2"
129 ::"B" (car)
130 );
131 }
132
133 static inline void FRM0() {
134 asm(" SWI \n"
135 " FCB 4"
136 );
137 }
138
139 static inline void FRM1() {
140 asm(" SWI \n"
141 " FCB 6"
142 );
143 }
144
145 static inline void BEEP() {
146 asm(" SWI \n"
147 " FCB 8"
148 );
149 }
150
151 // TODO GETC and KTST return values in B,A and Z-flag. How to get these
152 // back in C ?
153
154 static inline void DRAW(int x, int y) {
155 asm(" SWI \n"
156 " FCB 0xE"
157 :: "X" (x), "Y" (y)
158 );
159 }
160
161 static inline void PLOT(int x, int y) {
162 asm(" SWI \n"
163 " FCB 0x10"
164 :: "X" (x), "Y" (y)
165 );
166 }
167
168 static inline void CHPL(int x, int y) {
169 asm(" SWI \n"
170 " FCB 0x12"
171 :: "X" (x), "Y" (y)
172 );
173 }
174
175 // TODO GETP returns in B, LPIN in flag C, GETL flag C and regs XY
176 // GETS and JOYS in A
177
178 enum Note {
179 DO = 0,
180 DOs = 1,
181 RE = 2,
182 REs = 3,
183 MI = 4,
184 FA = 5,
185 FAs = 6,
186 SO = 7,
187 SOs = 8,
188 LA = 9,
189 LAs = 9,
190 SI = 10,
191 UT = 11,
192 // TODO what happens with other values ?
193 };
194
195 static inline void NOTE(enum Note note)
196 {
197 asm(" SWI \n"
198 " FCB 0x1E"
199 :: "B" (note)
200 );
201 }
202
203
204 /* FLOPPY DRIVE MONITOR ROM */
205 // NOTE DKOPC was split into several commands to make it easier to use from
206 // C code.
207 static inline void write(unsigned char track, unsigned char sector, unsigned char* buffer) {
208 DKTRK = (unsigned char)track;
209 DKSEC = (unsigned char)sector;
210 DKOPC = 8;
211 DKBUF = (unsigned int)buffer;
212
213 asm(" swi \n"
214 " fcb 0x26"
215 );
216 }
217
218static inline void read(unsigned char track, unsigned char sector, unsigned char* output)
219{
220 for(;;)
221 {
222 DKTRK = (unsigned char)track;
223 DKSEC = (unsigned char)sector;
224 DKOPC = 2;
225 DKBUF = (unsigned int)output;
226
227 asm(" swi \n"
228 " fcb 0x26"
229 );
230
231 if (DKSTA == 0x44 || DKSTA == 0) return; // Sector read ok!
232 printhex(DKSTA);
233 }
234}
235
236 static inline void BOOT() {
237 asm(" SWI \n"
238 " FCB 0x28"
239 );
240 }
241
242#else
243/*****************************************************************************
244 * TOx CODE
245 ****************************************************************************/
246 /* MONITOR ENTRY POINTS */
247 #define mon_putc(car) { \
248 asm("JSR \t0xE803 \t; TO8 PUTC\n"\
249 ::"B" ((unsigned char) (car))\
250 ); \
251 }
252
253 volatile Monitor* monitor = (volatile Monitor*)0x6000;
254
255#define write(track, sector, buffer) {\
256 DKTRK = (unsigned char)track;\
257 DKSEC = (unsigned char)sector;\
258 DKOPC = 8;\
259 DKBUF = (unsigned int)buffer;\
260\
261 asm("JSR \t 0xE004 \t; TO8 DKCONT\n"\
262 ); \
263 }
264
265 /* FLOPPY DRIVE MONITOR ROM */
266inline void read(unsigned char track, unsigned char sector,
267 unsigned char* output)
268{
269 for(;;)
270 {
271 DKTRK = (unsigned char)track;
272 DKSEC = (unsigned char)sector;
273 DKOPC = 2;
274 DKBUF = (unsigned int)output;
275
276 asm("JSR \t 0xE004 \t \n"); \
277
278 if (DKSTA == 0x44 || DKSTA == 0) return; // Sector read ok!
279 printhex(DKSTA);
280 }
281}
282#endif
283
Note: See TracBrowser for help on using the repository browser.