# HG changeset patch # User heinrichsweikamp # Date 1289758422 -3600 # Node ID 77f1556457b1df41bd112f193bf558d04cab3a2e # Parent 6beb680a6130a0a523b2ca76499b3f764df8026e added missing source file diff -r 6beb680a6130 -r 77f1556457b1 code_part1/OSTC_code_c_part2/p3_wordprocessor.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/code_part1/OSTC_code_c_part2/p3_wordprocessor.c Sun Nov 14 19:13:42 2010 +0100 @@ -0,0 +1,492 @@ +/* + * OSTC - diving computer code + * =========================== + * PART 3 : word processor + * + * p3_wordprocessor.c for OSTC Mk.2 + * Created on: 17.09.2009 + * Author: christian.w @ heinrichsweikamp.com + * + * #include "ostc28.drx.txt" + * #include "ostc28.tbl.txt" + * #include "ostc48.tbl.txt" + * #include "ostc48.drx.txt" + * #include "ostc90.drx.txt" + * #include "ostc90.tbl.txt" + */ + +// Copyright (C) 2009 HeinrichsWeikamp GbR + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + + +// ***************************** +// ** I N T R O D U C T I O N ** +// ***************************** +// +// OSTC +// +// code: +// +// summary: +// display routines +// for the OSTC experimental project +// written by Christian Weikamp +// last revision __________ +// comments added _________ +// +// additional files: +// #include "ostc28.drx.txt" +// #include "ostc28.tbl.txt" +// #include "ostc48.tbl.txt" +// #include "ostc48.drx.txt" +// #include "ostc90.drx.txt" +// #include "ostc90.tbl.txt" +// assembler code (PART 1) for working OSTC experimental plattform +// C code (PART 2) for working OSTC experimental plattform +// +// history: +// + + +// ********************* +// ** I N C L U D E S ** +// ********************* + #include + +// ******************************** +// ** C O N F I G U R A T I O N ** +// ** for simulation without asm ** +// ******************************** + #pragma config OSC = IRCIO67 + #pragma config FCMEN = OFF + #pragma config IESO = OFF + #pragma config PWRT = ON + #pragma config BOREN = OFF + #pragma config WDT = OFF + #pragma config WDTPS = 128 + #pragma config MCLRE = ON + #pragma config LPT1OSC = OFF + #pragma config PBADEN = OFF + #pragma config DEBUG = OFF + #pragma config XINST = OFF + #pragma config LVP = OFF + #pragma config STVREN = OFF + +// **************************** +// ** D E F I N E S ** +// ** missing in p18f4685.h ** +// **************************** + +#define WP_FONT_SMALL_HEIGHT 24 +#define WP_FONT_MEDIUM_HEIGHT 32 +#define WP_FONT_LARGE_HEIGHT 58 +#define oled_rw PORTA,2,0 +#define oled_rs PORTE,0,0 + +// *********************** +// ** V A R I A B L E S ** +// *********************** + +#pragma udata bank0a=0x060 +// input +volatile unsigned char wp_stringstore[26]; +volatile unsigned char wp_color1; +volatile unsigned char wp_color2; +volatile unsigned char wp_top; +volatile unsigned char wp_leftx2; +volatile unsigned char wp_font; +volatile unsigned char wp_invert; +// internal +volatile unsigned char wp_temp_U8; +volatile unsigned char wp_txtptr; +volatile unsigned char wp_char; +volatile unsigned char wp_command; +volatile unsigned int wp_data_16bit; +volatile unsigned char wp_data_8bit_one; +volatile unsigned char wp_data_8bit_two; +volatile unsigned int wp_start; +volatile unsigned int wp_end; +volatile unsigned int wp_i; +volatile unsigned char wp_black; +volatile unsigned char wp_debug_U8; + + +// ************************* +// ** P R O T O T Y P E S ** +// ************************* +void main(void); + +void main_calc_wordprocessor(void); + +void wp_write_command(void); +void wp_write_data(void); +void wp_write_black(void); +void wp_write_color(void); +void wp_set_window(void); +void wp_set_char_font_small(void); +void wp_set_char_font_medium(void); +void wp_set_char_font_large(void); +void wordprocessor(void); + +// ******************************* +// ** start ** +// ** necessary for compilation ** +// ******************************* +#pragma romdata der_code = 0x0000 +#pragma code der_start = 0x0000 +void der_start(void) +{ +_asm + goto main +_endasm +} + +// *********************************** +// ** main code for simulation / ** +// ** tests without assembler code ** +// ** is NOT a part of the OSTC ** +// *********************************** +#pragma code main = 0x9000 +void main(void) +{ + wp_top = 10; + wp_leftx2 = 10; + wp_color1 = 255; + wp_color2 = 255; + wp_font = 0; + wp_invert = 0; + wp_stringstore[0] = ' '; + wp_stringstore[1] = '!'; + wp_stringstore[2] = '"'; + wp_stringstore[3] = ':'; + wp_stringstore[4] = 0; + wordprocessor(); +} + +// ****************************************************** +// ****************************************************** +// ** THE FOLLOWING CODE HAS TO BE COPPIED TO THE OSTC ** +// ****************************************************** +// ****************************************************** +// *************** +// *************** +// ** THE FONTS ** +// *************** +// *************** +// all new for bigscreen +#pragma romdata font_data_large = 0x09A00 +rom const rom unsigned int wp_large_data[] = +{ +#include "ostc90.drx.txt" // length 0x59A +}; +#pragma romdata font_table_large = 0x09FA0 +rom const rom unsigned int wp_large_table[] = +{ +#include "ostc90.tbl.txt" // length 0x18 +}; +#pragma romdata font_table_medium = 0x0A000 +rom const rom unsigned int wp_medium_table[] = +{ +#include "ostc48.tbl.txt" // length 0x22 +}; +#pragma romdata font_data_medium = 0x0A024 +rom const rom unsigned int wp_medium_data[] = +{ +#include "ostc48.drx.txt" // length 0x374 // geht bis einschl. 0xA398 +}; +#pragma romdata font_table_small = 0x0A39A +rom const rom unsigned int wp_small_table[] = +{ +#include "ostc28.tbl.txt" // length 0xE8 +}; +#pragma romdata font_data_small = 0x0A488 +rom const rom unsigned int wp_small_data[] = +{ +#include "ostc28.drx.txt" +}; + +// ********************** +// ********************** +// ** THE JUMP-IN CODE ** +// ** for the asm code ** +// ********************** +// ********************** +#pragma code main_wordprocessor = 0x0B468 +void main_wordprocessor(void) +{ + wordprocessor(); +} + +// ********************* +// ********************* +// ** THE SUBROUTINES ** +// ********************* +// ********************* + +#pragma code subroutines2 = 0x0B470 // can be adapted to fit the romdata tables ahead + +// ------------ +// write new // +// ------------ + +void wp_write_command(void) +{ +_asm + bcf oled_rs + movff wp_command,PORTD + bcf oled_rw + bsf oled_rw +_endasm +} + +void wp_write_data(void) +{ + wp_data_8bit_one = wp_data_16bit >> 8; + wp_data_8bit_two = wp_data_16bit; +_asm + bsf oled_rs + movff wp_data_8bit_one,PORTD + bcf oled_rw + bsf oled_rw + movff wp_data_8bit_two,PORTD + bcf oled_rw + bsf oled_rw +_endasm +} + +void wp_write_black(void) +{ +_asm + movff wp_black,PORTD + bcf oled_rw + bsf oled_rw + bcf oled_rw + bsf oled_rw +_endasm +} + +void wp_write_color(void) +{ +_asm + movff wp_color1,PORTD + bcf oled_rw + bsf oled_rw + movff wp_color2,PORTD + bcf oled_rw + bsf oled_rw +_endasm +} + +void wp_set_window(void) +{ + // x axis start ( 0 - 319) + wp_command = 0x35; + wp_write_command(); + wp_data_16bit = ((unsigned int)wp_leftx2) << 1; + wp_write_data(); + // x axis end ( 0 - 319) + wp_command = 0x36; + wp_write_command(); + wp_data_16bit = 319; + wp_write_data(); + // y axis start + end ( 0 - 239 ) + wp_command = 0x37; + wp_write_command(); + // the bottom part + wp_data_16bit = wp_top; + if(wp_font == 2) + wp_data_16bit += WP_FONT_LARGE_HEIGHT; + else if(wp_font == 1) + wp_data_16bit += WP_FONT_MEDIUM_HEIGHT; + else + wp_data_16bit += WP_FONT_SMALL_HEIGHT; + wp_data_16bit--; + if(wp_data_16bit > 239) + wp_data_16bit = 239; + // the top part + wp_data_16bit |= ((unsigned int)wp_top) << 8; + // all together in one 16bit transfer + wp_write_data(); + // start + wp_command = 0x20; + wp_write_command(); + wp_data_16bit = wp_top; + wp_write_data(); + wp_command = 0x21; + wp_write_command(); + wp_data_16bit = ((unsigned int)wp_leftx2) << 1; + wp_write_data(); +} + +void wp_set_char_font_small(void) +{ + if(wp_char == ' ') + wp_char = '¶'; + if (wp_char > 0x7E) // skip space between ~ and ¡ + wp_char -= 34; + if((wp_char < '!') || (wp_char > 0xA3)) // font has 34 chars after ~ // ¾ + 4 chars limit to end of battery at the moment + wp_char = 0x82; // ¤ + wp_start = wp_small_table[wp_char - '!']; + wp_end = wp_small_table[1 + wp_char - '!']; +} + +void wp_set_char_font_medium(void) +{ + // space is 3E + if (wp_char == 0x27) // 0x27 == ' + wp_char = 0x3B; + if (wp_char == '"') + wp_char = 0x3C; + if (wp_char == 'm') + wp_char = 0x3D; + if (wp_char == ' ') + wp_char = 0x3E; + if((wp_char < '.') || (wp_char > 0x3E)) + wp_char = 0x3E; + wp_start = wp_medium_table[wp_char - '.']; + wp_end = wp_medium_table[1 + wp_char - '.']; +} +void wp_set_char_font_large(void) +{ + // space is / = 0x2F + if (wp_char == ' ') + wp_char = 0x2F; + if((wp_char < '.') || (wp_char > '9')) + wp_char = 0x2F; + wp_start = wp_large_table[wp_char - '.']; + wp_end = wp_large_table[1 + wp_char - '.']; +} +void wordprocessor(void) +{ +#define TOPLIMIT 230 +#define LEFTLIMIT 155 + + if(wp_top > TOPLIMIT) + wp_top = TOPLIMIT; + if(wp_leftx2 > LEFTLIMIT) + wp_leftx2 = LEFTLIMIT; + + wp_set_window(); + // access to GRAM + wp_command = 0x22; + wp_write_command(); + _asm + bsf oled_rs + _endasm + wp_txtptr = 0; + wp_char = wp_stringstore[wp_txtptr]; +/* +_asm + lfsr 0x2,0x60 + movff 0xfde,wp_char +_endasm +*/ + if(!wp_char) + { + wp_char = ':'; + wp_txtptr = 25; + } + _asm + clrf TBLPTRU, ACCESS + _endasm + while((wp_char) && (wp_txtptr < 26)) + { + if(wp_font == 2) + wp_set_char_font_large(); + else if(wp_font == 1) + wp_set_char_font_medium(); + else + wp_set_char_font_small(); + wp_black = 0; + for(wp_i = wp_start; wp_i> 8; + if((wp_temp_U8 & 128)) + { + wp_temp_U8 -= 127; + if(wp_invert) + { + while(wp_temp_U8 > 0) + { + wp_temp_U8--; + wp_write_color(); + } + } + else + { + _asm + movff wp_black,PORTD + _endasm + while(wp_temp_U8 > 0) + { + wp_temp_U8--; + _asm + bcf oled_rw + bsf oled_rw + bcf oled_rw + bsf oled_rw + _endasm + } + } + } + else + { + wp_temp_U8++; + if(wp_invert) + { + _asm + movff wp_black,PORTD + _endasm + while(wp_temp_U8 > 0) + { + wp_temp_U8--; + _asm + bcf oled_rw + bsf oled_rw + bcf oled_rw + bsf oled_rw + _endasm + } + } + else + { + while(wp_temp_U8 > 0) + { + wp_temp_U8--; + wp_write_color(); + } + } + } + } +/* +_asm + movff 0xfde,wp_char +_endasm +*/ + wp_txtptr++; + wp_char = wp_stringstore[wp_txtptr]; + } + wp_command = 0x00; + wp_write_command(); +}