static bool WriteCOMGroup( group_entry *group, signed long chop ) /***************************************************************/ /* write the data for group to the loadfile */ /* returns TRUE if the file should be repositioned */ { unsigned long loc; signed long diff; section *sect; bool repos; outfilelist *finfo; repos = FALSE; sect = group->section; CurrSect = sect; finfo = sect->outfile; loc = SUB_ADDR( group->grp_addr, sect->sect_addr ) + sect->u.file_loc; diff = loc - finfo->file_loc; if( diff > 0 ) { PadLoad( diff ); } else if( diff != 0 ) { SeekLoad( loc ); repos = TRUE; } DEBUG((DBG_LOADDOS, "group %a section %d to %l in %s", &group->grp_addr, sect->ovl_num, loc, finfo->fname )); COMAmountWritten = 0; Ring2Lookup( group->leaders, DoCOMGroup, &chop ); loc += COMAmountWritten; if( loc > finfo->file_loc ) { finfo->file_loc = loc; } return( repos ); }
static void writeReg(uint8_t reg, uint8_t data) { uint8_t buf[2]; buf[0] = SUB_ADDR(channel, reg); buf[1] = data; I2CWrite(UART2_ADDR, buf, 2); }
static uint8_t readReg(uint8_t reg) { uint8_t buf[1]; buf[0] = SUB_ADDR(channel, reg); I2CWrite(UART2_ADDR, buf, 1); I2CRead(UART2_ADDR, buf, 1); return buf[0]; }
static void WriteCOMFile( void ) /******************************/ // generate a DOS .COM file. { outfilelist *fnode; group_entry *group; bool repos; unsigned long root_size; signed long chop; if( StartInfo.addr.seg != 0 ) { LnkMsg( ERR+MSG_INV_COM_START_ADDR, NULL ); return; } if( ( StackAddr.seg != 0 ) || ( StackAddr.off != 0 ) ) { LnkMsg( WRN+MSG_STACK_SEG_IGNORED, NULL ); } OrderGroups( CompareDosSegments ); CurrSect = Root; // needed for WriteInfo. fnode = Root->outfile; fnode->file_loc = Root->u.file_loc = 0; Root->sect_addr = Groups->grp_addr; /* write groups */ for( group = Groups; group != NULL; group = group->next_group ) { chop = SUB_ADDR( group->grp_addr, StartInfo.addr ); if( chop > 0 ) { chop = 0; } if( (signed long)group->size + chop > 0 ) { repos = WriteCOMGroup( group, chop ); if( repos ) { SeekLoad( fnode->file_loc ); } } #if 0 if( loc < 0 ) { Root->u.file_loc += (unsigned long)loc; // adjust for missing code } #endif } root_size = fnode->file_loc; if( root_size > (64 * 1024L - 0x200) ) { LnkMsg( ERR+MSG_COM_TOO_LARGE, NULL ); } DBIWrite(); }