Example program for the Cidco MailStation Z80 computer
1/*
2 * MailStation example program
3 * Copyright (c) 2019-2021 joshua stein <jcs@jcs.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#ifndef _INCL_MAILSTATION
19#define _INCL_MAILSTATION
20
21#include "meta_keys.h"
22
23/* define some ports - see 0x1b2b */
24__sfr __at(0x01) portkeyboard;
25__sfr __at(0x02) port2;
26__sfr __at(0x05) slot4000page;
27__sfr __at(0x06) slot4000device;
28__sfr __at(0x07) slot8000page;
29__sfr __at(0x08) slot8000device;
30__sfr __at(0x09) portpowerstatus;
31__sfr __at(0x0d) portcpuclockrate;
32__sfr __at(0x10) rtcseconds;
33__sfr __at(0x11) rtc10seconds;
34__sfr __at(0x12) rtcminutes;
35__sfr __at(0x13) rtc10minutes;
36__sfr __at(0x14) rtchours;
37__sfr __at(0x15) rtc10hours;
38__sfr __at(0x16) rtcdayofweek;
39__sfr __at(0x17) rtcdays;
40__sfr __at(0x18) rtc10days;
41__sfr __at(0x19) rtcmonths;
42__sfr __at(0x1a) rtc10months;
43__sfr __at(0x1b) rtcyears;
44__sfr __at(0x1c) rtc10years;
45__sfr __at(0x28) port28;
46
47/* defined according to whether we're running from RAM or flash */
48#ifdef LOC_RAM
49#define RUN_ADDR 0x8000
50#define RUN_DEVICE 0x8
51#define RUN_PAGE 0x7
52#define SLOT_ADDR 0x4000
53#define SLOT_DEVICE 0x6
54#define SLOT_PAGE 0x5
55#elif defined(LOC_FLASH)
56#define RUN_ADDR 0x4000
57#define RUN_DEVICE 0x6
58#define RUN_PAGE 0x5
59#define SLOT_ADDR 0x8000
60#define SLOT_DEVICE 0x8
61#define SLOT_PAGE 0x7
62#else
63#error "no LOC_RAM or LOC_FLASH defined"
64#endif
65
66/* devices to load into slot4000device or slot8000device */
67#define DEVICE_RAM 0x01
68#define DEVICE_LCD_LEFT 0x02
69#define DEVICE_DATAFLASH 0x03
70#define DEVICE_LCD_RIGHT 0x04
71#define DEVICE_MODEM 0x05
72
73/* LCD parameters (2 screens) */
74#define LCD_WIDTH (160 * 2) // 320
75#define LCD_HEIGHT 128
76#define LCD_COL_GROUPS 20
77#define LCD_COL_GROUP_WIDTH 8
78
79#define FONT_WIDTH 5
80#define FONT_HEIGHT 8
81
82/* columns of characters */
83#define LCD_COLS (LCD_WIDTH / FONT_WIDTH) // 64
84#define LCD_ROWS (LCD_HEIGHT / FONT_HEIGHT) // 16
85#define TEXT_COLS LCD_COLS // 64
86#define TEXT_ROWS (LCD_ROWS - 1) // 15
87
88#define ATTR_CURSOR (1 << 0)
89#define ATTR_REVERSE (1 << 1)
90#define ATTR_BOLD (1 << 2)
91#define ATTR_UNDERLINE (1 << 3)
92
93/* for printf */
94#define BYTE_TO_BINARY_PATTERN "%c%c%c%c%c%c%c%c"
95#define BYTE_TO_BINARY(byte) \
96 (byte & 0x80 ? '1' : '0'), \
97 (byte & 0x40 ? '1' : '0'), \
98 (byte & 0x20 ? '1' : '0'), \
99 (byte & 0x10 ? '1' : '0'), \
100 (byte & 0x08 ? '1' : '0'), \
101 (byte & 0x04 ? '1' : '0'), \
102 (byte & 0x02 ? '1' : '0'), \
103 (byte & 0x01 ? '1' : '0')
104
105
106/* for debugging access from asm */
107extern unsigned char debug0;
108extern unsigned char debug1;
109extern unsigned char debug2;
110extern unsigned char debug3;
111extern unsigned char debug4;
112
113
114/* crt0.s */
115extern void exit(void);
116extern void powerdown(void);
117extern void new_mail(unsigned char on);
118extern void reboot(void);
119extern void delay(unsigned int millis);
120extern void blink(unsigned int millis);
121extern unsigned char read_port(unsigned char port);
122
123
124/* putchar.s */
125extern unsigned char cursorx;
126extern unsigned char cursory;
127extern unsigned char putchar_sgr;
128extern unsigned char putchar_quick;
129extern unsigned char *font_addr;
130extern void screen_init(void);
131extern void lcd_cas(unsigned char col);
132extern void lcd_sleep(void);
133extern void lcd_wake(void);
134extern void uncursor(void);
135extern void recursor(void);
136extern void clear_screen(void);
137extern void clear_screen_bufs(void);
138extern void redraw_screen(void);
139extern void scroll_lcd_half(void);
140extern void clear_lcd_half(void);
141extern void stamp_char(unsigned char row, unsigned char col);
142extern void putchar_attr(unsigned char row, unsigned char col, unsigned char c,
143 unsigned char attr);
144
145
146/* getchar.s */
147extern unsigned char getscancode(unsigned char *charbuffer);
148extern int getkey(void);
149extern int peekkey(void);
150
151
152/* wifi.s */
153void wifi_init(void);
154extern int wifi_write(char);
155extern int wifi_read(void);
156
157#endif