COP8 "C" COMPILER B2.99b 15-May-2000 PAGE 1 /* COP8C Code Development System Sample Application for National Semiconductor: Flash Device This code may be adapted for any purpose when used with the COP8C Code Development System. No warranty is implied or given as to their usability for any purpose. (c) Copyright 2000 Byte Craft Limited 421 King St.N., Waterloo, ON, Canada, N2J 4E4 VOICE: 1 (519) 888 6911 FAX : 1 (519) 746 6751 email: support@bytecraft.com REVISION HISTORY V1.00 AL 06/00 Initial version */ #pragma option f0 /* no page breaks in listing file */ #pragma option CALLMAP /* add call map to listing file */ /* This sample application plays a .wav audio file on a speaker using the COP8's high speed PWM. The wave data is obtained using a hex dump utility and an awk script $ hexdump -x beat.wav > beak.dump $ awk -f wave.awk beat.dump > beat.c #### wave.awk #### BEGIN { star_count = 0 } BEGIN {print "#asm"} BEGIN {print "beat_wave_table"} BEGIN {byte_count=0} BEGIN {start_skip_count=0} { if (star_count==0) { ++start_skip_count } } { # add three '*'s to the dump to mark # where you want to start playing # add one more '*' to mark the end if ($1 == "*") { ++star_count } } { if ( (star_count == 3) || (start_skip_count > 64) ) { for (i=2;i<=NF;i++) { print " db 0x" substr($i,1,2) print " db 0x" substr($i,3,2) ++byte_count ++byte_count } } } END { print "#endasm"} END { print "#define BEAT_WAVE_TABLE_SIZE " byte_count } #### wave.awk #### The .WAV file used must be 8khz 8bit mono. The sound is synthesized by applying a new 8bit sample voltage every 125us (8khz). Timer 2 is configured to generate an interrupt every 125us. calculations: The sample voltage needs to be changed at a rate of 8khz. 1/8khz = 125us At 10Mhz every cycly requires 1us. 125us/1us = 125 = 0x007d Inside the timer 2 interrupt, timer 3 is set up to generate a PWM voltage on the speaker corresponding the the current wave sample. The PWM generates a 40khz carrier frequency. The sample determines the duty cycle. calculations: The square wave period is 0x100 cycles. At 10Mhz in high speed mode every cycle is 100ns. This gives a 100ns * 0x100 = 25.6us ~= 40khz carrier frequency. If the sample is 0x40. Time on is 0x40*100ns. Time off is (0x100-0x40)*100ns. */ #include "cop8.h" /* Device Header File */ #pragma option +l #include #ifndef __LCD_H 000C #define __LCD_H /* * COP8C Code Development System * library routines for the Hitachi HD44780 * LCD controller * LCD.H * This code may be adapted for any purpose * when used with the COP8C Code Development * System. No warranty is implied or given * as to their usability for any purpose. * * (c) Copyright 2000 Byte Craft Limited * 421 King St.N., Waterloo, ON, Canada, N2J 4E4 * VOICE: 1 (519) 888 6911 * FAX : 1 (519) 746 6751 * email: support@bytecraft.com * * REVISION HISTORY * V0.90b AL 20/01/2000 Initial Version. */ /* * These LCD routines require symbols defined * specifying the microcontroller ports to * use for data and control lines * * symbols required * * ~~~~~~~~~~~~~~~~ * * LCD_DATA port to use for LCD data lines * * LCRRS_PORT port/pin to use for LCD register select * LCD_RS_PIN * * LCD_RW_PORT port/pin to use for LCD read/write * LCD_RW_PIN * * LCD_E_PORT port/pin to use for LCD enable * LCD_E_PIN * ***/ void lcd_init(void); void lcd_putch(char ch); char lcd_getch(void); void lcd_gotoXY(int8 x,int8 y); void lcd_set_address(int8 address); void lcd_send_control(char control); void lcd_busy_check(void); 000D #define lcd_clrscr() lcd_send_control(LCDCLR) 000E #define set_lcd_line1() lcd_set_address(LCDLine1) 000F #define set_lcd_line2() lcd_set_address(LCDLine2) /* LCD Software Commands (Constants) */ 0080 #define LCDLine1 0x80 /* Line 1 starting address */ 00C0 #define LCDLine2 0xC0 /* Line 2 starting address */ 0001 #define LCDCLR 0x01 /* Clear Display, cursor home */ 0002 #define LCDHome 0x02 /* Cursor home, DDRAM unchanged */ 0006 #define LCDInc 0x06 /* Cursor increment mode */ 0004 #define LCDDec 0x04 /* Cursor decrement mode */ 000C #define LCDOn 0x0C /* Display On */ 0008 #define LCDOff 0x08 /* Display Off */ 000E #define CursOn 0x0E /* Display On and Cursor On */ 000C #define CursOff 0x0C /* Display On and Cursor Off */ 000F #define CursBlink 0x0F /* Display On and Cursor Blinking */ 0018 #define LCDLeft 0x18 /* Shift Display Left */ 001C #define LCDRight 0x1C /* Shift Display Right */ 0010 #define CursLeft 0x10 /* Move Cursor Left */ 0014 #define CursRight 0x14 /* Move Cursor Right */ 0038 #define LCDFunction5X10 0x38 /* Function register Init */ 003C #define LCDFunction 0x3C /* Function register Init, 5X10 dots */ 0040 #define LCDCGRAM 0x40 /* CGRAM starting address */ 0000 #define COMMAND_MODE 0 /* LCDRS=COMMAND_MODE */ 0001 #define CHAR_MODE 1 /* LCDRS=CHAR_MODE */ 0001 #define READ 1 /* LCDRW=READ */ 0000 #define WRITE 0 /* LCDRW=WRITE */ 0001 #define ENABLE 1 /* LCDE=ENABLE */ 0000 #define DISABLE 0 /* LCDE=DISABLE */ 0001 #define LCD_BUSY 1 0010 #define BUSY_BIT LCD_DATA.7 /* bit 7 in LCD_DATA */ #endif /* __LCD_H */ #include #ifndef __STRING_H 0011 #define __STRING_H /* * COP8C Code Development System * string library * STRING.H * This code may be adapted for any purpose * when used with the COP8C Code Development * System. No warranty is implied or given * as to their usability for any purpose. * * (c) Copyright 1998 Byte Craft Limited * 421 King St.N., Waterloo, ON, Canada, N2J 4E4 * VOICE: 1 (519) 888 6911 * FAX : 1 (519) 746 6751 * email: support@bytecraft.com * * REVISION HISTORY * V0.90b AL 20/01/2000 Initial Version. */ 0000 #define NULL 0 #ifndef size_t 0012 typedef unsigned char size_t; #endif /* size_t */ 001B #define ESC 27 002C #define COMMA 44 unsigned int8 strlen(char far * str); void strcat(char far * dest,char far * src); void strcpy(char far * dest,char far * src); void * strchr(const void far * str,int8 c); int8 strcmp(unsigned char far * str1,unsigned char far * str2); void strset(char far * str,char ch); void strupr(char far * str); void strlwr(char far * str); void * memchr(const void far * s,int8 c,size_t n); int8 memcmp(unsigned char far * str1,unsigned char far * str2,size_t n); void memcpy(char far * dest,const char far * src,size_t n); void memset(char far *dest,char value,unsigned char memsize); #endif /* __STRING_H */ #include #ifndef __STDIO_H 001C #define __STDIO_H /* * COP8C Code Development System * standard input/output library * STDIO.H * This code may be adapted for any purpose * when used with the COP8C Code Development * System. No warranty is implied or given * as to their usability for any purpose. * * (c) Copyright 2000 Byte Craft Limited * 421 King St.N., Waterloo, ON, Canada, N2J 4E4 * VOICE: 1 (519) 888 6911 * FAX : 1 (519) 746 6751 * email: support@bytecraft.com * * REVISION HISTORY * V0.90b AL 20/01/2000 Initial Version. * ***/ /* * The standard input and output library * routines call external functions * getch() and putch() * * These functions must be define in another module * * Optionally the user can define the symbol * ALLOW_BACKSPACE to have gets() process the * backspace character * ***/ 0000 #define NULL 0 #ifdef MAKEOBJECT extern void gets(char * str,int8 size); extern void puts(char far * str); #else /* MAKEOBJECT */ void gets(char * str,int8 size); void puts(char far * str); #endif /* MAKEOBJECT */ #endif /* __STDIO_H */ #include #ifndef __STDLIB_H 001E #define __STDLIB_H /* * COP8C Code Development System * standard library * STDLIB.H * This code may be adapted for any purpose * when used with the COP8C Code Development * System. No warranty is implied or given * as to their usability for any purpose. * * (c) Copyright 2000 Byte Craft Limited * 421 King St.N., Waterloo, ON, Canada, N2J 4E4 * VOICE: 1 (519) 888 6911 * FAX : 1 (519) 746 6751 * email: support@bytecraft.com * * REVISION HISTORY * V0.90b AL 20/01/2000 Initial Version. */ #include #ifndef __STRING_H #define __STRING_H /* * COP8C Code Development System * string library * STRING.H * This code may be adapted for any purpose * when used with the COP8C Code Development * System. No warranty is implied or given * as to their usability for any purpose. * * (c) Copyright 1998 Byte Craft Limited * 421 King St.N., Waterloo, ON, Canada, N2J 4E4 * VOICE: 1 (519) 888 6911 * FAX : 1 (519) 746 6751 * email: support@bytecraft.com * * REVISION HISTORY * V0.90b AL 20/01/2000 Initial Version. */ #define NULL 0 #ifndef size_t typedef unsigned char size_t; #endif /* size_t */ #define ESC 27 #define COMMA 44 unsigned int8 strlen(char far * str); void strcat(char far * dest,char far * src); void strcpy(char far * dest,char far * src); void * strchr(const void far * str,int8 c); int8 strcmp(unsigned char far * str1,unsigned char far * str2); void strset(char far * str,char ch); void strupr(char far * str); void strlwr(char far * str); void * memchr(const void far * s,int8 c,size_t n); int8 memcmp(unsigned char far * str1,unsigned char far * str2,size_t n); void memcpy(char far * dest,const char far * src,size_t n); void memset(char far *dest,char value,unsigned char memsize); #endif /* __STRING_H */ 001F #define srand(SEED) Rand_16=SEED 0020 #define randomize() Rand_16=TIMER_LSB void ui8toa(unsigned int8 value,char * str,unsigned int8 radix); void ui16toa(unsigned int16 value,char * str,unsigned int8 radix); void i8toa(int8 value,char * str,unsigned int8 radix); void i16toa(int16 value,char * str,unsigned int8 radix); unsigned int8 ahtoi8(char * str); unsigned int16 ahtoi16(char * str); int8 atoi8(char * str); int16 atoi16(char * str); int16 labs(int16 l); int8 abs(int8 i); /* unsigned int16 Rand_16; */ int16 rand(void); unsigned int16 pow(unsigned int8 base,unsigned int8 exponent); void qsort(void * base,size_t nelem,size_t size); #endif /* __STDLIB_H */ #include #ifndef STARTUP_H 0026 #define STARTUP_H //#include #endif /* STARTUP_H */ #include #ifndef __PORT_H 0027 #define __PORT_H #pragma option +l #endif /* __PORT_H */ #include #ifndef __Flash_op_h 0029 #define __Flash_op_h /* COP8C Code Development System Header file for National Semiconductor: flash.h This code may be adapted for any purpose when used with the COP8C Code Development System. No warranty is implied or given as to their usability for any purpose. (c) Copyright 2000 Byte Craft Limited 421 King St.N., Waterloo, ON, Canada, N2J 4E4 VOICE: 1 (519) 888 6911 FAX : 1 (519) 746 6751 email: support@bytecraft.com REVISION HISTORY V1.00 WB 01/00 Initial version V1.00a WB 01/00 Added declaration for ISPAD as unsigned long V1.00b WB 01/00 Added "has 888F" for support for JSRB V1.00b WB 01/00 Defined all of the locations referenced by BootROM functions in this file. Prefaced each definition with _ISPxxxx Corrected the data return in readbf. */ 0000 registera _ISP_ACreg; 00FF char _ISP_Sreg @ 0xff; 00FC char _ISP_Xreg @ 0xfc; #pragma has 888F; 00A9 char _ISPADHI @ 0xa9 ; 00A8 char _ISPADLO @ 0xa8 ; 00AB char _ISPWR @ 0xab ; 00AA char _ISPRD @ 0xaa ; 00E2 char _ISPKEY @ 0xe2 ; 00F1 char _ISPBYTECOUNTLO @ 0xf1 ; 00A8 unsigned long _ISPAD @ &_ISPADLO; /* BootROM handling utilities */ 002A #define JSRB(bootloc) #asm ( db 0x61,bootloc); 002B #define ispkey _ISPKEY = 0x98 002C #define ispad(loc) _ISPAD = (unsigned long)(loc); 002D #define XSload(loc) _ISP_Sreg = (loc >> 8); _ISP_Xreg = loc&0xff; /* BootROM function definitions */ 002E #define page_erase(loc) ispad(loc); ispkey; JSRB(0x17) 002F #define mass_erase() _ISP_ACreg = 0x55; ispkey; JSRB(0x1a) 0030 #define readbf(loc) ispad(loc); ispkey; JSRB(0x11); _ISP_ACreg = _ISPRD #define block_readf(from,cnt,to) ispad(from); _ISPBYTECOUNTLO = cnt; XSload(to);\ 0031 ispkey; JSRB(0x26) 0032 #define cwritebf(loc,value) ispad(loc); _ISPWR = value; ispkey; JSRB(0x14) #define block_writef(from,cnt,to) ispad(to); _ISPBYTECOUNTLO = cnt;\ 0033 XSload(from); ispkey; JSRB(0x23) 0034 #define exit() JSRB(0x62) #endif /* __Flash_op_h */ /* library function aliases */ 0035 #define getch() uart_getch() 0036 #define putch(CHAR) lcd_putch(CHAR) 0037 #define itoa(VAL,DEST,RADIX) ui8toa(VAL,DEST,RADIX) /* unsigned 8 bit integer */ 0038 #define uart_clrscr() uart_putch('\f'); #define lcd_clrscr() lcd_send_control(LCDCLR) 0039 #define clrscr() lcd_clrscr() /* startup initialization */ 0008 #define CNTRL_STARTUP_DATA 0x08 /* init microwire */ 0000 #define PORTA_STARTUP_DATA 0b00000000 /* DEFAULT DATA */ 0000 #define PORTA_STARTUP_CONF IIIIIIII /* ALL WEEK PULL-UP INP */ 0000 #define PORTB_STARTUP_DATA 0b00000000 /* DEFAULT DATA */ 001F #define PORTB_STARTUP_CONF IIIOOOOO /* SET TO LOW (OP AS VOLTAGE FOLLOWER) */ 002B #define PORTC_STARTUP_DATA 0b00101011 /* DEFAULT DATA */ 0052 #define PORTC_STARTUP_CONF IOIOIIOI /* ROTARY ENCODER INP WKP,ANALOG POWER OUTPUT ON */ 0000 #define PORTD_STARTUP_DATA 0b00000000 /* DEFAULT DATA ALL LOW */ 00C0 #define PORTE_STARTUP_DATA 0b11000000 /* DEFAULT DATA */ 00CC #define PORTE_STARTUP_CONF OOIIOOII /* SCL AND SDA OUTPUT LOW ALL OTHER HZ INP */ 0003 #define PORTF_STARTUP_DATA 0b00000011 /* DEFAULT DATA */ 000C #define PORTF_STARTUP_CONF IIIIOOII /* PB INP WP, RADIO/IRDA SD LOW (OFF) */ 0005 #define PORTG_STARTUP_DATA 0b00000101 003D #define PORTG_STARTUP_CONF IIOOOOIO /* DEFAULT DATA */ 0028 #define PORTL_STARTUP_DATA 0b00101000 /* DEFAULT DATA */ 0057 #define PORTL_STARTUP_CONF IOIOIOOO /* LOW SPEED OSC MUST BE HZ TO WORK */ 003A #define LIGHT_SWITCH_PORT PORTLP 0007 #define LIGHT_SWITCH_PIN 7 #include "beat.c" /* beat wave table */ #pragma option +l 22BE #define BEAT_WAVE_TABLE_SIZE 8894 #include "greeting.c" /* greeting wave table */ #pragma option +l 3290 #define GREETING_WAVE_TABLE_SIZE 12944 enum wave_table_enum { BEAT_WAVE , GREETING_WAVE }; 7F00 9D FC LD A,X const long wave_tables[] = { beat_wave_table , greeting_wave_table }; 7F02 A4 LAID 7F03 8E RET 7F04 00 02 BE 24 7F0C BE 22 90 32 const long wave_table_sizes[] = { BEAT_WAVE_TABLE_SIZE, GREETING_WAVE_TABLE_SIZE }; 0008 0000 bit sound_enabled; /* PWM reload value to get 8k interrupts * per second */ 007D #define TIMER_RELOAD_8khz_LO 0x7D 0000 #define TIMER_RELOAD_8khz_HI 0x00 00F1 unsigned long register sample_index; 01E8 #define TICKS_PER_SECOND 488 00F3 unsigned long register tick_counter; const char id_clock[] = "ZBCL 56789012345"; 7F14 5A 42 43 4C 20 35 36 37 38 39 7F1E 30 31 32 33 34 35 00 0009 0011 char new_id_clock[sizeof(id_clock)]; 001A char clock_hours; 001B char clock_minutes; 001C char clock_seconds; 001D 001E 001F 0020 char id1,id2,id3,id4; /* ID bytes */ /* hardware UART ring buffer */ 0100 0014 char uart_receive_buffer[20]; 0021 char far * uart_receive_pointer_in; 0023 char far * uart_receive_pointer_out; 0000 #define BUTTON1_PIN 0 0001 #define BUTTON2_PIN 1 003B #define BUTTON1_PORT PORTFP 003C #define BUTTON2_PORT PORTFP 0001 #define BUTTON1 1 0002 #define BUTTON2 2 0003 #define BOTH_BUTTONS 3 0001 #define CANCEL_BUTTON BUTTON1 0002 #define OK_BUTTON BUTTON2 /* host commands */ 0001 #define HOST_SET_TIME 0x01 0003 #define HOST_GET_ADC 0x03 0005 #define HOST_PLAY_AUDIO 0x05 000D #define HOST_SET_ID 0x0d 000B #define HOST_SEND_ID 0x0b 0080 #define ENTER_MENU 0x80 0040 #define EXIT_MENU 0x40 00F5 int register menu_selection; 00F6 int register item_selection; 0008 0001 bit refresh_display; 0008 0002 bit do_click; 0004 #define MAIN_MENU_SIZE 4 0010 #define ADC_MENU_SIZE 16 0003 #define AUDIO_MENU_SIZE 3 0003 #define TIME_MENU_SIZE 3 0003 #define ABOUT_MENU_SIZE 3 7F25 03 0F 02 02 02 const int menu_sizes[] = { MAIN_MENU_SIZE-1, ADC_MENU_SIZE-1, AUDIO_MENU_SIZE-1, TIME_MENU_SIZE-1, ABOUT_MENU_SIZE-1 }; enum menu_function_index { show_adc_index, play_wave_loop_index, play_wave_index, toggle_sound_index, show_time_index, store_time_index, set_time_index, show_compile_time_index, show_compile_date_index, show_ROM_id_index, not_handled_index }; enum MENUS { MAIN_MENU=0, ADC_MENU, AUDIO_MENU, TIME_MENU, ABOUT_MENU, NUMBER_OF_MENUES }; 0025 0005 char current_menu_item[NUMBER_OF_MENUES]; enum ITEMS { SELECT_ADC_MENU=0, SELECT_AUDIO_MENU, SELECT_TIME_MENU, SELECT_ABOUT_MENU, VIEW_CHANNEL_0=0, VIEW_CHANNEL_1, VIEW_CHANNEL_2, VIEW_CHANNEL_3, VIEW_CHANNEL_4, VIEW_CHANNEL_5, VIEW_CHANNEL_6, VIEW_CHANNEL_7, VIEW_CHANNEL_8, VIEW_CHANNEL_9, VIEW_CHANNEL_10, VIEW_CHANNEL_11, VIEW_CHANNEL_12, VIEW_CHANNEL_13, VIEW_CHANNEL_14, VIEW_CHANNEL_15, PLAY_BEAT=0, PLAY_GREETING, TOGGLE_AUDIO, SHOW_TIME=0, STORE_TIME, SET_TIME, COMPILE_TIME=0, COMPILE_DATE, SHOW_ROM_ID }; const char far * menu_strings[] = { "Main Menu", 7F2A 4D 61 69 6E 20 4D 65 6E 75 00 "View ADC", 7F34 56 69 65 77 20 41 44 43 00 "Audio", 7F3D 41 75 64 69 6F 00 "Time", 7F43 54 69 6D 65 00 "About", 7F48 41 62 6F 75 74 00 7F34 "View ADC", "Channel 0", 7F4E 43 68 61 6E 6E 65 6C 20 30 00 "Channel 1", 7F58 43 68 61 6E 6E 65 6C 20 31 00 "Channel 2", 7F62 43 68 61 6E 6E 65 6C 20 32 00 "Channel 3", 7F6C 43 68 61 6E 6E 65 6C 20 33 00 "Channel 4", 7F76 43 68 61 6E 6E 65 6C 20 34 00 "Channel 5", 7F80 43 68 61 6E 6E 65 6C 20 35 00 "Channel 6", 7F8A 43 68 61 6E 6E 65 6C 20 36 00 "Channel 7", 7F94 43 68 61 6E 6E 65 6C 20 37 00 "Channel 8", 7F9E 43 68 61 6E 6E 65 6C 20 38 00 "Channel 9", 7FA8 43 68 61 6E 6E 65 6C 20 39 00 "Channel 10", 7FB2 43 68 61 6E 6E 65 6C 20 31 30 7FBC 00 "Channel 11", 7FBD 43 68 61 6E 6E 65 6C 20 31 31 7FC7 00 "Channel 12", 7FC8 43 68 61 6E 6E 65 6C 20 31 32 7FD2 00 "Channel 13", 7FD3 43 68 61 6E 6E 65 6C 20 31 33 7FDD 00 "Channel 14", 7FDE 43 68 61 6E 6E 65 6C 20 31 34 7FE8 00 "Channel 15", 7FE9 43 68 61 6E 6E 65 6C 20 31 35 7FF3 00 7F3D "Audio", 7E00 9D FC LD A,X "Play a Beat", 7E02 A4 LAID 7E03 8E RET 7E04 50 6C 61 79 20 61 20 42 65 61 7E0E 74 00 "Play Greeting", 7E10 50 6C 61 79 20 47 72 65 65 74 7E1A 69 6E 67 00 "Toggle Sound", 7E1E 54 6F 67 67 6C 65 20 53 6F 75 7E28 6E 64 00 7F43 "Time", "Show Time", 7FF4 53 68 6F 77 20 54 69 6D 65 00 "Store Time", 7E2B 53 74 6F 72 65 20 54 69 6D 65 7E35 00 "Set Time", 7E36 53 65 74 20 54 69 6D 65 00 7F48 "About", "Compile Time", 7E3F 43 6F 6D 70 69 6C 65 20 54 69 7E49 6D 65 00 "Compile Date", 7E4C 43 6F 6D 70 69 6C 65 20 44 61 7E56 74 65 00 "ID" 7E59 49 44 00 7E5C 2A 7F 34 7F 3D 7F 43 7F 48 7F }; 7E66 34 7F 4E 7F 58 7F 62 7F 6C 7F 7E70 76 7F 80 7F 8A 7F 94 7F 9E 7F 7E7A A8 7F B2 7F BD 7F C8 7F D3 7F 7E84 DE 7F E9 7F 3D 7F 04 7E 10 7E 7E8E 1E 7E 43 7F F4 7F 2B 7E 36 7E 7E98 48 7F 3F 7E 4C 7E 59 7E const char ok_menu_selection_table[] = { /* MENU, ITEM, FUNCTION HANDLER, */ MAIN_MENU, SELECT_ADC_MENU, ENTER_MENU| ADC_MENU, MAIN_MENU, SELECT_AUDIO_MENU, ENTER_MENU| AUDIO_MENU, MAIN_MENU, SELECT_TIME_MENU, ENTER_MENU| TIME_MENU, MAIN_MENU, SELECT_ABOUT_MENU, ENTER_MENU| ABOUT_MENU, ADC_MENU, VIEW_CHANNEL_0, show_adc_index, ADC_MENU, VIEW_CHANNEL_1, show_adc_index, ADC_MENU, VIEW_CHANNEL_2, show_adc_index, ADC_MENU, VIEW_CHANNEL_3, show_adc_index, ADC_MENU, VIEW_CHANNEL_3, show_adc_index, ADC_MENU, VIEW_CHANNEL_4, show_adc_index, ADC_MENU, VIEW_CHANNEL_5, show_adc_index, ADC_MENU, VIEW_CHANNEL_6, show_adc_index, ADC_MENU, VIEW_CHANNEL_7, show_adc_index, ADC_MENU, VIEW_CHANNEL_8, show_adc_index, ADC_MENU, VIEW_CHANNEL_9, show_adc_index, ADC_MENU, VIEW_CHANNEL_10, show_adc_index, ADC_MENU, VIEW_CHANNEL_11, show_adc_index, ADC_MENU, VIEW_CHANNEL_12, show_adc_index, ADC_MENU, VIEW_CHANNEL_13, show_adc_index, ADC_MENU, VIEW_CHANNEL_14, show_adc_index, ADC_MENU, VIEW_CHANNEL_15, show_adc_index, AUDIO_MENU, PLAY_BEAT, play_wave_loop_index, AUDIO_MENU, PLAY_GREETING, play_wave_index, AUDIO_MENU, TOGGLE_AUDIO, toggle_sound_index, TIME_MENU, SHOW_TIME, show_time_index, TIME_MENU, STORE_TIME, store_time_index, TIME_MENU, SET_TIME, set_time_index, ABOUT_MENU, COMPILE_TIME, show_compile_time_index, ABOUT_MENU, COMPILE_DATE, show_compile_date_index, ABOUT_MENU, SHOW_ROM_ID, show_ROM_id_index 7EA0 00 00 81 00 01 82 00 02 83 }; 7EA9 00 03 84 01 00 00 01 01 00 7EB2 01 02 00 01 03 00 01 03 00 7EBB 01 04 00 01 05 00 01 06 00 7EC4 01 07 00 01 08 00 01 09 00 7ECD 01 0A 00 01 0B 00 01 0C 00 7ED6 01 0D 00 01 0E 00 01 0F 00 7EDF 02 00 01 02 01 02 02 02 03 7EE8 03 00 04 03 01 05 03 02 06 7EF1 04 00 07 04 01 08 04 02 09 const char cancel_menu_selection_table[] = { /* MENU, ITEM, FUNCTION HANDLER, */ MAIN_MENU, SELECT_ADC_MENU, not_handled_index, MAIN_MENU, SELECT_AUDIO_MENU, not_handled_index, MAIN_MENU, SELECT_TIME_MENU, not_handled_index, MAIN_MENU, SELECT_ABOUT_MENU, not_handled_index, ADC_MENU, VIEW_CHANNEL_0, EXIT_MENU| MAIN_MENU, ADC_MENU, VIEW_CHANNEL_1, EXIT_MENU| MAIN_MENU, ADC_MENU, VIEW_CHANNEL_2, EXIT_MENU| MAIN_MENU, ADC_MENU, VIEW_CHANNEL_3, EXIT_MENU| MAIN_MENU, ADC_MENU, VIEW_CHANNEL_4, EXIT_MENU| MAIN_MENU, ADC_MENU, VIEW_CHANNEL_5, EXIT_MENU| MAIN_MENU, ADC_MENU, VIEW_CHANNEL_6, EXIT_MENU| MAIN_MENU, ADC_MENU, VIEW_CHANNEL_7, EXIT_MENU| MAIN_MENU, ADC_MENU, VIEW_CHANNEL_8, EXIT_MENU| MAIN_MENU, ADC_MENU, VIEW_CHANNEL_9, EXIT_MENU| MAIN_MENU, ADC_MENU, VIEW_CHANNEL_10, EXIT_MENU| MAIN_MENU, ADC_MENU, VIEW_CHANNEL_11, EXIT_MENU| MAIN_MENU, ADC_MENU, VIEW_CHANNEL_12, EXIT_MENU| MAIN_MENU, ADC_MENU, VIEW_CHANNEL_13, EXIT_MENU| MAIN_MENU, ADC_MENU, VIEW_CHANNEL_14, EXIT_MENU| MAIN_MENU, ADC_MENU, VIEW_CHANNEL_15, EXIT_MENU| MAIN_MENU, AUDIO_MENU, PLAY_BEAT, EXIT_MENU| MAIN_MENU, AUDIO_MENU, PLAY_GREETING, EXIT_MENU| MAIN_MENU, AUDIO_MENU, TOGGLE_AUDIO, EXIT_MENU| MAIN_MENU, TIME_MENU, SHOW_TIME, EXIT_MENU| MAIN_MENU, TIME_MENU, STORE_TIME, EXIT_MENU| MAIN_MENU, TIME_MENU, SET_TIME, EXIT_MENU| MAIN_MENU, ABOUT_MENU, COMPILE_TIME, EXIT_MENU| MAIN_MENU, ABOUT_MENU, COMPILE_DATE, EXIT_MENU| MAIN_MENU, ABOUT_MENU, SHOW_ROM_ID, EXIT_MENU| MAIN_MENU 7D00 9D FC LD A,X }; 7D02 A4 LAID 7D03 8E RET 7D04 00 00 0A 00 01 0A 00 02 0A 7D0D 00 03 0A 01 00 40 01 01 40 7D16 01 02 40 01 03 40 01 04 40 7D1F 01 05 40 01 06 40 01 07 40 7D28 01 08 40 01 09 40 01 0A 40 7D31 01 0B 40 01 0C 40 01 0D 40 7D3A 01 0E 40 01 0F 40 02 00 40 7D43 02 01 40 02 02 40 03 00 40 7D4C 03 01 40 03 02 40 04 00 40 7D55 04 01 40 04 02 40 0200 0080 char str[128]; /* temporary string buffer */ /* This interrupt handling routine samples the dial position * and updates a tick counter for the real time clock */ 01F8 57 4E void __TIMERT0(void) 574E { 00F7 int register dial_position; /* position reading of dial */ 00F8 int register dial_previous; /* previous position reading */ SaveContext(); 574E 67 PUSHA 574F 9D FE LD A,B 5751 67 PUSHA 5752 9D EF LD A,0EF 5754 67 PUSHA 5755 9D FF LD A,S 5757 67 PUSHA 5758 9D FC LD A,X 575A 67 PUSHA 7EFA 00 01 09 08 const char dial_position_states[] = { 0x0,0x1,0x9,0x8 }; 575B 9F E8 LD B,#0E8 ICNTRL.T0PND=0; 575D 6D RBIT 05,[B] 575E 9D DA LD A,0DA dial_position=PORTCP&0b1001; /* read dial */ 5760 95 09 AND A,#009 if( dial_position_states[dial_previous&3]!=dial_position) 5762 9C F7 X A,0F7 { 5764 9D F8 LD A,0F8 5766 95 03 AND A,#003 5768 94 FA ADD A,#0FA 576A AD 7E 02 JSRL 07E02 576D BD F7 82 IFEQ A,0F7 5770 27 BA JMP 057BA if(dial_position_states[(dial_previous+1)&3]==dial_position) 5772 9D F8 LD A,0F8 { 5774 8A INCA 5775 95 03 AND A,#003 5777 94 FA ADD A,#0FA 5779 AD 7E 02 JSRL 07E02 577C BD F7 B9 IFNE A,0F7 577F 16 JP 05796 if(item_selection>0) 5780 9D F6 LD A,0F6 { 5782 92 00 IFEQ A,#000 5784 0A JP 0578F 5785 93 7F IFGT A,#07F 5787 07 JP 0578F 5788 C6 DRSZ 0F6 item_selection--; 5789 B8 NOP 578A DF 00 LD S,#000 refresh_display=1; 578C 57 LD B,#08 578D 79 SBIT 01,[B] 578E 7A SBIT 02,[B] do_click=1; } dial_previous++; 578F 9F F8 LD B,#0F8 5791 A6 X A,[B] 5792 8A INCA 5793 A6 X A,[B] } else 5794 27 BA JMP 057BA { if(item_selectionTICKS_PER_SECOND) 58B1 9D 74 LD A,0774 { 58B3 A1 SC 58B4 91 E8 SUBC A,#0E8 58B6 DF 00 LD S,#000 58B8 5D LD B,#02 58B9 A6 X A,[B] 58BA DF 07 LD S,#007 58BC 9D 75 LD A,0775 58BE 91 01 SUBC A,#001 58C0 DF 00 LD S,#000 58C2 87 OR A,[B] 58C3 88 IFC 58C4 92 00 IFEQ A,#000 58C6 19 JP 058E0 58C7 BD EF 68 RBIT 00,0EF PSW.GIE=0; 58CA A1 SC tick_counter-=TICKS_PER_SECOND; 58CB 9D F3 LD A,0F3 58CD 91 E8 SUBC A,#0E8 58CF 9C F3 X A,0F3 58D1 9D F4 LD A,0F4 58D3 91 01 SUBC A,#001 58D5 9C F4 X A,0F4 PSW.GIE=1; 58D7 BD EF 78 SBIT 00,0EF 58DA 9F 1C LD B,#01C clock_seconds++; 58DC A6 X A,[B] 58DD 8A INCA 58DE A6 X A,[B] } else 58DF 8E RET if(clock_seconds>=60) 58E0 98 3C LD A,#03C { 58E2 9F 1C LD B,#01C 58E4 83 IFGT A,[B] 58E5 08 JP 058EE 58E6 AE LD A,[B] clock_seconds-=60; 58E7 94 C4 ADD A,#0C4 58E9 A3 X A,[B-] ++clock_minutes; 58EA A6 X A,[B] 58EB 8A INCA 58EC A6 X A,[B] } else 58ED 8E RET if(clock_minutes>=60) 58EE 98 3C LD A,#03C { 58F0 9F 1B LD B,#01B 58F2 83 IFGT A,[B] 58F3 08 JP 058FC 58F4 AE LD A,[B] clock_minutes-=60; 58F5 94 C4 ADD A,#0C4 58F7 A3 X A,[B-] ++clock_hours; 58F8 A6 X A,[B] 58F9 8A INCA 58FA A6 X A,[B] } else 58FB 8E RET if(clock_hours>=24) 58FC 98 18 LD A,#018 clock_hours-=24; 58FE 9F 1A LD B,#01A 5900 83 IFGT A,[B] 5901 8E RET 5902 AE LD A,[B] 5903 94 E8 ADD A,#0E8 5905 A6 X A,[B] 5906 5906 8E RET } void uart_putch(char ch) 077C { 5907 DF 07 LD S,#007 while(ENU.TBMT==0); /* wait while transmission in progress */ 5909 9C 7C X A,077C 590B 9F BA LD B,#0BA 590D 70 IFBIT 00,[B] 590E 01 JP 05910 590F FB JP 0590B 5910 DF 07 LD S,#007 TBUF=ch; 5912 9D 7C LD A,077C 5914 9C B8 X A,0B8 } 5916 8E RET char kbhit(void) { /* check for chacter in buffer */ if(uart_receive_pointer_in!=uart_receive_pointer_out) 5917 DF 00 LD S,#000 return(1); 5919 9D 21 LD A,0021 591B 9F 23 LD B,#023 591D B9 IFNE A,[B] 591E 06 JP 05925 591F CE DRSZ B 5920 AE LD A,[B] 5921 BD 24 82 IFEQ A,0024 5924 03 JP 05928 5925 98 01 LD A,#001 5927 8E RET else 5928 64 CLRA return(0); 5929 8E RET } char uart_getch(void) { 077C char ch; 592A DF 00 LD S,#000 while(uart_receive_pointer_in==uart_receive_pointer_out); /* wait for a character */ 592C 9D 21 LD A,0021 592E 9F 23 LD B,#023 5930 B9 IFNE A,[B] 5931 07 JP 05939 5932 CE DRSZ B 5933 AE LD A,[B] 5934 BD 24 B9 IFNE A,0024 5937 01 JP 05939 5938 F1 JP 0592A 5939 9D 23 LD A,0023 ch=*uart_receive_pointer_out; /* get character from buffer */ 593B 9C FC X A,X 593D 9D 24 LD A,0024 593F AD 7C 18 JSRL 07C18 /* remove character from buffer */ if( uart_receive_pointer_out == (uart_receive_buffer+sizeof(uart_receive_buffer)-1) ) 5942 DF 07 LD S,#007 uart_receive_pointer_out=uart_receive_buffer; 5944 9C 7C X A,077C 5946 DF 00 LD S,#000 5948 9D 23 LD A,0023 594A 99 13 IFNE A,#013 594C 0C JP 05959 594D 9D 24 LD A,0024 594F 99 01 IFNE A,#001 5951 07 JP 05959 5952 9F 23 LD B,#023 5954 9A 00 LD [B+],#000 else 5956 9B 01 LD [B-],#001 5958 0A JP 05963 5959 9F 23 LD B,#023 uart_receive_pointer_out++; 595B A0 RC 595C AE LD A,[B] 595D 90 01 ADC A,#001 595F A2 X A,[B+] 5960 64 CLRA 5961 80 ADC A,[B] 5962 A6 X A,[B] return(ch) 5963 DF 07 LD S,#007 } 5965 9D 7C LD A,077C 5967 8E RET /* read_button's