#!/usr/local/bin/tcc -run #include #include typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned long uint32_t; typedef signed char int8_t; typedef signed short int16_t; typedef signed long int32_t; #define N_DBG_MAX 256 char bb_dbg_buf[N_DBG_MAX]; int cw_dbg_cnt, cw_dbg_pnt, bw_dbg_rdptr; uint16_t s_get_logsize ( uint16_t cnt ) { uint16_t size; uint16_t i; size = 0; for ( i = 0; i < 2; i++, cnt++ ) { cnt %= N_DBG_MAX; size |= ( ( uint16_t ) bb_dbg_buf[cnt] << ( i * 8 ) ); } return size; } uint16_t s_get_termlog ( uint16_t no, uint16_t *rdpnt ) { uint16_t pnt; uint16_t size; uint16_t ret; pnt = cw_dbg_pnt; do { if ( pnt == bw_dbg_rdptr && no > 0 ) { //先頭まで到達したけどまだ読もうとしている ret = 0; break; } if ( pnt < 2 ) { pnt = N_DBG_MAX - ( 2 - pnt ); } else { pnt -= 2; } size = s_get_logsize ( pnt ); if ( ( size == 0 )) { ret = 0; break; } else { ret = size; } if ( pnt < size ) { pnt = N_DBG_MAX - ( size - pnt ); } else { pnt -= size; } *rdpnt = pnt; } while ( no-- > 0 ); return ret; } void s_dbg_pnt_chk ( void ) { uint16_t size; uint8_t ret; uint32_t time; uint16_t i; ret = 0; time = 0; for ( i = 0; i < sizeof ( time ); i++ ) { bb_dbg_buf[cw_dbg_cnt] = ( ( uint8_t * ) &time ) [sizeof ( time ) - i]; bb_dbg_buf[cw_dbg_cnt] = 0; cw_dbg_cnt++; cw_dbg_cnt %= N_DBG_MAX; } if ( cw_dbg_cnt > cw_dbg_pnt ) { size = cw_dbg_cnt - cw_dbg_pnt; } else { size = N_DBG_MAX - cw_dbg_pnt + cw_dbg_cnt; } for ( i = 0; i < sizeof ( size ); i++ ) { bb_dbg_buf[cw_dbg_cnt] = ( ( uint8_t * ) &size ) [i]; cw_dbg_cnt++; cw_dbg_cnt %= N_DBG_MAX; } ret = 1; if ( ret == 1 ) { cw_dbg_pnt = cw_dbg_cnt; } else { cw_dbg_cnt = cw_dbg_pnt; } } void setdbgbuf(char *str) { int len = strlen(str); for(int i = 0; i < len; i++) { int size = (N_DBG_MAX + cw_dbg_cnt - bw_dbg_rdptr) % N_DBG_MAX; if (N_DBG_MAX - size <= 6 + 1) { // 6は時間と長さの分 uint16_t ptr; for(int j = 0; ; j++) { size = s_get_termlog(j, &ptr); printf("ptr%d = %d\n", j, ptr); if (ptr == bw_dbg_rdptr) { bw_dbg_rdptr = (bw_dbg_rdptr + size + 2) % N_DBG_MAX; break; } } } bb_dbg_buf[cw_dbg_cnt++] = str[i]; cw_dbg_cnt %= N_DBG_MAX; } bb_dbg_buf[cw_dbg_cnt++] = 0; cw_dbg_cnt %= N_DBG_MAX; bb_dbg_buf[cw_dbg_cnt++] = 0; cw_dbg_cnt %= N_DBG_MAX; bb_dbg_buf[cw_dbg_cnt++] = 0; cw_dbg_cnt %= N_DBG_MAX; bb_dbg_buf[cw_dbg_cnt++] = 0; cw_dbg_cnt %= N_DBG_MAX; len += 4; bb_dbg_buf[cw_dbg_cnt++] = len & 0xff; cw_dbg_cnt %= N_DBG_MAX; bb_dbg_buf[cw_dbg_cnt++] = len >> 8; cw_dbg_cnt %= N_DBG_MAX; cw_dbg_pnt = cw_dbg_pnt; } void main(void) { cw_dbg_cnt = 0; bw_dbg_rdptr = 0; for (int i = 0; i < N_DBG_MAX / (3 + 6)+1; i++) { setdbgbuf("ABC"); } printf("%d\n", bw_dbg_rdptr); }