|
|
1.1 root 1: /*
2: * Hatari MIDI port test
3: *
4: * Based on the file midi.c from EmuTOS:
5: * Copyright (C) 2001-2016 Martin Doering
6: *
7: * This file is distributed under the GPL, version 2 or at your
8: * option any later version. See doc/license.txt for details.
9: */
10:
11: #include <tos.h>
12:
13: /* constants for the ACIA registers */
14:
15: /* baudrate selection and reset (Baudrate = clock/factor) */
16: #define ACIA_DIV1 0
17: #define ACIA_DIV16 1
18: #define ACIA_DIV64 2
19: #define ACIA_RESET 3
20:
21: /* character format */
22: #define ACIA_D7E2S (0<<2) /* 7 data, even parity, 2 stop */
23: #define ACIA_D7O2S (1<<2) /* 7 data, odd parity, 2 stop */
24: #define ACIA_D7E1S (2<<2) /* 7 data, even parity, 1 stop */
25: #define ACIA_D7O1S (3<<2) /* 7 data, odd parity, 1 stop */
26: #define ACIA_D8N2S (4<<2) /* 8 data, no parity, 2 stop */
27: #define ACIA_D8N1S (5<<2) /* 8 data, no parity, 1 stop */
28: #define ACIA_D8E1S (6<<2) /* 8 data, even parity, 1 stop */
29: #define ACIA_D8O1S (7<<2) /* 8 data, odd parity, 1 stop */
30:
31: /* transmit control */
32: #define ACIA_RLTID (0<<5) /* RTS low, TxINT disabled */
33: #define ACIA_RLTIE (1<<5) /* RTS low, TxINT enabled */
34: #define ACIA_RHTID (2<<5) /* RTS high, TxINT disabled */
35: #define ACIA_RLTIDSB (3<<5) /* RTS low, TxINT disabled, send break */
36:
37: /* receive control */
38: #define ACIA_RID (0<<7) /* RxINT disabled */
39: #define ACIA_RIE (1<<7) /* RxINT enabled */
40:
41: /* status fields of the ACIA */
42: #define ACIA_RDRF 1 /* Receive Data Register Full */
43: #define ACIA_TDRE (1<<1) /* Transmit Data Register Empty */
44: #define ACIA_DCD (1<<2) /* Data Carrier Detect */
45: #define ACIA_CTS (1<<3) /* Clear To Send */
46: #define ACIA_FE (1<<4) /* Framing Error */
47: #define ACIA_OVRN (1<<5) /* Receiver Overrun */
48: #define ACIA_PE (1<<6) /* Parity Error */
49: #define ACIA_IRQ (1<<7) /* Interrupt Request */
50:
51: struct ACIA
52: {
53: unsigned char ctrl;
54: unsigned char dummy1;
55: unsigned char data;
56: unsigned char dummy2;
57: };
58:
59: #define ACIA_MIDI_BASE (0xfffffc04L)
60: #define midi_acia (*(volatile struct ACIA*)ACIA_MIDI_BASE)
61:
62: /* can we send a byte to the MIDI ACIA ? */
63: long bcostat3(void)
64: {
65: if (midi_acia.ctrl & ACIA_TDRE)
66: {
67: return -1; /* OK */
68: }
69: else
70: {
71: /* Data register not empty */
72: return 0; /* not OK */
73: }
74: }
75:
76: /* send a byte to the MIDI ACIA */
77: long bconout3(char c)
78: {
79: while(!bcostat3())
80: ;
81:
82: midi_acia.data = c;
83: return 1L;
84: }
85:
86: /*==== midi_init - initialize the MIDI acia ==================*/
87: /*
88: * Enable receive interrupts, set the clock for 31.25 kbaud
89: */
90: void midi_init(void)
91: {
92: /* initialize midi ACIA */
93: midi_acia.ctrl = ACIA_RESET; /* master reset */
94:
95: midi_acia.ctrl = ACIA_RIE| /* enable RxINT */
96: ACIA_RLTID| /* RTS low, TxINT disabled */
97: ACIA_DIV16| /* clock/16 */
98: ACIA_D8N1S; /* 8 bit, 1 stop, no parity */
99: }
100:
101: int main(int argc, char *argv[])
102: {
103: char text[] = "The quick brown fox\njumps over the lazy dog\n";
104: int i;
105: void *sp = (void*)Super(0);
106:
107: midi_init();
108:
109: for (i = 0; text[i] != 0; i++)
110: bconout3(text[i]);
111:
112: Super(sp);
113:
114: return 0;
115: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.