Blame
|
1 | # Machine Library |
||||||
| 2 | ||||||||
| 3 | I've created a library targeting the hardware specific aspects of programming the Sbc-3. I believe that it should work with the other boards from [Mega Micros](https://mega-micros.co.uk/index.htm), but since I don't have access to anything but the Sbc-3, can't confirm that. |
|||||||
| 4 | ||||||||
|
5 | ::: info |
||||||
|
6 | Note. if compiling for the 68000, you'll need to change the target cpu in `src/stdenv.mk` and `src/lib/Makefile` by changing the **CPU** macro. |
||||||
|
7 | ::: |
||||||
|
8 | To use the library, just include the following in your C sourcecode: |
||||||
| 9 | ```c |
|||||||
| 10 | #include <machine.h> |
|||||||
| 11 | ``` |
|||||||
|
12 | |||||||
| 13 | ## Serial I/O |
|||||||
|
14 | ```C |
||||||
| 15 | int _char_available(void); |
|||||||
| 16 | char _getchar(void); |
|||||||
| 17 | void _putchar(char c); |
|||||||
| 18 | ``` |
|||||||
|
19 | ::: info |
||||||
| 20 | Note. The xr68681 is clocked at 7.3728MHz, meaning you'll get double the baud rate listed in the data sheet as the datasheet assumes ha;f that rate. It will also affect the internal counter when it's clocked by the external clock. |
|||||||
| 21 | ::: |
|||||||
| 22 | ||||||||
|
23 | |||||||
|
24 | ## LED Control |
||||||
| 25 | There's a block of 10 leds (LD7 on the SBC3-b3), and six of them can be used for anything you like. Led1 is furthest from the cpu: |
|||||||
|
26 | |||||||
|
27 | | LED # | Used for | |
||||||
| 28 | |:------|:---------| |
|||||||
| 29 | | 1 | Indicates that the board is being powered via an external 5v supply. | |
|||||||
| 30 | | 2 | Indicated that the board is being powered via the ATX power connector. | |
|||||||
| 31 | | 3 | Connected to the ~RTS pin on the duart channel B. | |
|||||||
| 32 | | 4 | Connected to the ~RTS pin on the duart channel A. | |
|||||||
| 33 | | 5 | Available to user. | |
|||||||
| 34 | | 6 | Available to user. | |
|||||||
| 35 | | 7 | Available to user. | |
|||||||
| 36 | | 8 | Available to user. | |
|||||||
| 37 | | 9 | Available to user. | |
|||||||
| 38 | | 10 | Available to user. | |
|||||||
|
39 | |||||||
| 40 | Two functions are provided, one to turn on a led, and another to turn it off. |
|||||||
| 41 | ||||||||
| 42 | ```C |
|||||||
| 43 | void set_led(int lednum); |
|||||||
| 44 | void clear_led(int lednum); |
|||||||
| 45 | ``` |
|||||||
| 46 | Where `lednum` is an integer in the range of 5 through to 10, as per the table above. Any other value will be silently ignored. |
|||||||
|
47 | |||||||
|
48 | ## PI/T |
||||||
| 49 | ||||||||
| 50 | ```C |
|||||||
| 51 | void _pit_reset(void); |
|||||||
| 52 | unsigned int _pit_get_counter(void); |
|||||||
| 53 | unsigned int _pit_set_counter(unsigned int); |
|||||||
|
54 | void pit_set_a(uint8_t val); |
||||||
| 55 | void pit_set_bits_a(uint8_t bits); |
|||||||
| 56 | void pit_clear_bits_a(uint8_t bits); |
|||||||
| 57 | void pit_set_b(uint8_t val); |
|||||||
| 58 | void pit_set_bits_b(uint8_t bits); |
|||||||
| 59 | void pit_clear_bits_b(uint8_t bits); |
|||||||
|
60 | ``` |
||||||
| 61 | ||||||||
|
62 | ::: info |
||||||
| 63 | Note. The PI/T is clocked at 10.0MHz |
|||||||
| 64 | ::: |
|||||||
|
65 | ## Compact Flash |
||||||
| 66 | ||||||||
| 67 | ```C |
|||||||
| 68 | void _cf_wait_busy(void); |
|||||||
| 69 | void _cf_wait_data(void); |
|||||||
| 70 | void cf_init(void); |
|||||||
|
71 | int cf_identify(uint8_t drive_num, cf_info_t *info); |
||||||
|
72 | int cf_read(uint8_t drive_num, uint32_t sector, uint8_t *buffer); |
||||||
| 73 | ``` |
|||||||
|
74 | |||||||
| 75 | ## Vectors and Interrupts |
|||||||
| 76 | ||||||||
| 77 | ```C |
|||||||
|
78 | unsigned int *_get_vectors_base(void); |
||||||
|
79 | unsigned int get_isr_handler(int vector_number); |
||||||
| 80 | unsigned int set_isr_handler(int vector_number, void isr(void)); |
|||||||
|
81 | ``` |
||||||
|
82 | |||||||
|
83 | `_get_vectors_base()` return the contents of the `ivr` register on the 68030 or 0 on the 68000. |
||||||
|
84 | |||||||
|
85 | `get_isr_handler` returns the address of the handler currently configured to handle the exception specified by `vector_number`. |
||||||
|
86 | |||||||
|
87 | `set_isr_handler()` sets a handler for the exception specified by `vector_number`. It returns the address of the handler that it replaced, or `0xffffffff` if the `vector_number` is out of range. |
||||||
|
88 | |||||||
|
89 | ## `$I^2c$` Bus |
||||||
|
90 | |||||||
| 91 | ```C |
|||||||
| 92 | ``` |
|||||||
|
93 | |||||||
| 94 | ## Safe Memory Access |
|||||||
| 95 | ||||||||
| 96 | ```C |
|||||||
| 97 | int peek(uint8_t *addr); |
|||||||
| 98 | int poke(uint8_t *addr, uint8_t val); |
|||||||
| 99 | ``` |
|||||||
| 100 | `peek()` attempts to read a byte from memory, returning the value read, or -1 if the read failed due to a Bus Error. Similarly, `poke()` attempts to write a byte to memory, returning -1 on a Bus Error. |
|||||||