// $Id: step2-program.txt,v 1.1 2006/11/13 13:43:52 noritan Exp $ /************************************************************** * memory[] : a memory area used by commands. **************************************************************/ byte memory[16]; /************************************************************** * digit : a digit number to be shown. **************************************************************/ byte digit = 0; /************************************************************** * Show a digit of LEDs. **************************************************************/ void showLED(void) { switch (digit) { case 1: // (A) Process digit-1 Dig2_SetVal(); // (A1) Turn digit-2 off. // (A2) Set segements for digit-1. SegHi_PutVal(~(memory[0] >> 2)); SegLo_PutVal(~(memory[0] & 0x03)); Dig1_ClrVal(); // (A3) Turn digit-1 on. digit = 2; // (A4) Process digit-2 next. break; // (B) End of digit-1 processing. case 2: // (C) Process digit-2 Dig1_SetVal(); // (C1) Turn digit-1 off. // (C2) Set segments for digit-2. SegHi_PutVal(~(memory[1] >> 2)); SegLo_PutVal(~(memory[1] & 0x03)); Dig2_ClrVal(); // (C3) Turn digit-2 on. digit = 1; // (C4) Process digit-1 next. break; // (D) End of digit-2 process. default: // (E) Otherwise should not occur. digit = 1; // (F) Process digit-1 next. } } /************************************************************** * Show a digit if RTI occurs. **************************************************************/ void showIfRTI(void) { if (SRTISC_RTIF) { // (A) Check if RTI occurs. SRTISC_RTIACK = 1; // (B) Clear RTIF. showLED(); // (C) Show a digit of LED. } } /************************************************************** * Get a character from AS1. **************************************************************/ char getc(void) { AS1_TComData c; while (AS1_RecvChar(&c) != ERR_OK) ; return (char)c; } /************************************************************** * Put a character to AS1. **************************************************************/ void putc(const char c) { while (AS1_SendChar((AS1_TComData)c) != ERR_OK) ; } /************************************************************** * Convert a HEXADECIMAL character to a byte. * Returns 255 if an invalid character provided. **************************************************************/ byte hex2byte(const char c) { if (c >= '0' && c <='9') { return c - '0' + 0; } if (c >= 'A' && c <= 'F') { return c - 'A' + 10; } return 255; } /************************************************************** * Check if a character is a HEXADECIMAL character. * Return TRUE if the character is a HEXADECIMAL character. **************************************************************/ bool isHex(const char c) { return (hex2byte(c) != 255); } /************************************************************** * Convert a byte data to a HEXADECIMAL character. * Returns '*' if an invalid byte data which is larger than * 15 provided. **************************************************************/ char byte2hex(const byte d) { if (d <= 9) { return '0' + (d - 0); } if (d <= 15) { return 'A' + (d - 10); } return '*'; } /************************************************************** * ch : a last received character from SCI. **************************************************************/ char ch; /************************************************************** * Get a character from AS1 and returns an echo. **************************************************************/ char getput(void) { ch = getc(); putc(ch); return ch; } /************************************************************** * Returns a word data constructed from characters * received by AS1. Any characters can be a terminator * except HEXADECIMAL characters. **************************************************************/ word getWord(void) { word d = 0; while (isHex(getput())) { // (A) Repeat for HEX characters. d = (d << 4)| hex2byte(ch); // (B) Convert to a word. } return d; // (C) Returns a converted word. } /************************************************************** * Put a word as a HEXADECIMAL value in a specified number * of characters. **************************************************************/ void putWord(const word data, const byte w) { byte i; // Loop counter byte pos; // Position of a digit. byte digit; // Value of a digit. for (i = w; i-- > 0; ) { // (A) loop for i = (w-1)..0 pos = i * 4; // (B) Get the digit's position. digit = (data >> pos) & 0xF; // (C) Get the digit's value. putc(byte2hex(digit)); // (D) Put a HEX character. } } /************************************************************** * interpret a line. * Returns to invoking routine if any error occurs. **************************************************************/ void interpret(void) { word addr; // Address pointer. word data; // Work area for a data. putc('\r'); // (A) Put CR/LF putc('\n'); putc('*'); // (B) Put a prompt. switch (getput()) { // (C) Get a command character. case 'R': // (D) "Read" command. addr = getWord(); // (D1) Get address to be read. if (ch != '\r') return; // (D2) Error for an invalid terminator. putc('\n'); // (D3) Put LF following CR. addr &= 0x0F; // (D4) Limit the address. data = memory[addr]; // (D5) Get a data from memory. putWord(addr, 1); // (D6) Put address. putc(':'); // (D7) Put a separator. putWord(data, 2); // (D8) Put data. return; // (E) Command completed. case 'W': // (F) "Write" command. addr = getWord(); // (F1) Get address to be written. if (ch != ':') return; // (F2) Error for an invalid separator. data = getWord(); // (F3) Get data to be written. if (ch != '\r') return; // (F4) Error for an invalid terminator. putc('\n'); // (F5) Put LF following CR. addr &= 0x0F; // (F6) Limit bit width of address. data &= 0xFF; // (F7) Limit bit width of data. memory[addr] = (byte)data; // (F8) Write a data into memory. putWord(addr, 1); // (F9) Put address for confirmation. putc(':'); // (FA) Put a separator. putWord(data, 2); // (FB) Put data for confirmation. return; // (G) Command completed. case 'D': // (H) "Dump command. getput(); // (H1) Get a terminator cahracter. if (ch != '\r') return; // (H2) Error for an invalid terminator. putc('\n'); // (H3) Put LF following CR. for (addr = 0; addr < sizeof(memory); addr++) { // (H4) Scan all address. putc(':'); // (H5) Put a separator. putWord(memory[addr], 2); // (H6) Put a data at the address. } return; // (J) Command completed. } }