Example program for the Cidco MailStation Z80 computer
at main 157 lines 4.5 kB view raw
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