// YX structure is set with y,x,string,length, and start position of text // Fix from Klaus, dr Tiger static GOOD_OR_BAD OW_Hprintyx(struct yx * YX, struct parsedname * pn) { BYTE translated_data[2 + 2 * (YX->length-YX->text_start)]; size_t original_index ; size_t translate_index = 0; int Valid_YX = ( YX->x <= LCD_LINE_END && YX->y <= LCD_LAST_ROW && YX->x >= LCD_LINE_START && YX->y >= LCD_FIRST_ROW ) ; int Continue_YX = ( YX->y == LCD_SAME_LOCATION_VALUE || YX->x == LCD_SAME_LOCATION_VALUE ) ; if ( Valid_YX ) { BYTE chip_command ; switch (YX->y) { // row value case 1: chip_command = LCD_COMMAND_SET_DDRAM_ADDRESS; break; case 2: chip_command = LCD_COMMAND_SET_DDRAM_ADDRESS + LCD_SECOND_ROW_ADDRESS; break; case 3: chip_command = LCD_COMMAND_SET_DDRAM_ADDRESS + LCD_LINE_END; break; case 4: chip_command = (LCD_COMMAND_SET_DDRAM_ADDRESS + LCD_SECOND_ROW_ADDRESS) + LCD_LINE_END; break; default: LEVEL_DEBUG("Unrecognized row %d",YX->y) ; return gbBAD ; } chip_command += YX->x - 1; // add column (0 index) // Initial location (2 half bytes) translated_data[translate_index++] = NIBBLE_ONE(chip_command); translated_data[translate_index++] = NIBBLE_TWO(chip_command); } else if ( !Continue_YX ) { LEVEL_DEBUG("Bad screen coordinates y=%d x=%d",YX->y,YX->x); return gbBAD; } //printf("Hscreen test<%*s>\n",(int)size,buf) ; for ( original_index = YX->text_start ; original_index < YX->length ; ++original_index ) { if (YX->string[original_index]) { translated_data[translate_index++] = NIBBLE_ONE(YX->string[original_index]) | LCD_DATA_FLAG; translated_data[translate_index++] = NIBBLE_TWO(YX->string[original_index]) | LCD_DATA_FLAG; } else { //null byte becomes space translated_data[translate_index++] = NIBBLE_ONE(' ') | LCD_DATA_FLAG; translated_data[translate_index++] = NIBBLE_TWO(' ') | LCD_DATA_FLAG; } } LEVEL_DEBUG("Print the message"); return OW_w_pios(translated_data, translate_index, pn) ; }
/* Redefine a character */ static GOOD_OR_BAD OW_redefchar(ASCII * pattern, struct parsedname * pn) { int i ; int j = 0; int char_num = pn->extension * 8 + 0x40 ; int datalength = 2 * (LCD_REDEFCHAR_LENGTH+1) ; // nibbles for data plus index BYTE data[ datalength ] ; RETURN_BAD_IF_BAD( OW_Hinit(pn) ) ; i = j = 0; // Start with char num data[j++] = (char_num & 0xF0); data[j++] = (char_num << 4) & 0xF0; // Add pattern for ( i = 0 ; i < LCD_REDEFCHAR_LENGTH ; ++i ) { data[j++] = NIBBLE_ONE(pattern[i]) | LCD_DATA_FLAG; data[j++] = NIBBLE_TWO(pattern[i]) | LCD_DATA_FLAG; } return OW_w_pios(data, datalength, pn) ; }