#include #include "types.h" #include "console.h" #include "screen.h" #define OFFSCREEN_SIZE (SCREEN_WIDTH*SCREEN_HEIGHT*(has_colors?2:1/2)) #define NLINES (2*MAX_LGN) #define BUFSIZE (NLINES*(MAX_COL+1)) BOOL myuart_ready(void) { volatile unsigned *line_status_reg = IO(0x90020014,0x90020018); return is_classic ? *line_status_reg & 0b1 : !(*line_status_reg & 0b10000); //return is_classic ? *line_status_reg & 0b1 : !(*line_status_reg & 0b10); } char myuart_getchar(void) { volatile unsigned *recv_buffer_reg = (unsigned*)0x90020000; while(!uart_ready()) idle(); return *recv_buffer_reg; } void* incalloc(void* ptr, uint32_t* pcount, uint32_t esize) { uint32_t count=*pcount, newcount=3*count; uint32_t newptr=NULL; while(!newptr && newcount>count) { newcount=count+(newcount-count)/2; newptr=realloc(ptr,newcount*esize); } *pcount=newcount; return newptr?newptr:ptr; } void main(int argc, char** argv) { uint8_t* buffer=malloc(BUFSIZE); uint32_t bufsize=BUFSIZE,ibuf=0; uint32_t* index_lines; uint16_t startline=0, curline, i,j, oldline; uint8_t fullrefresh=0; uint32_t usedlines=1, oldusedlines=1, maxlines; uint16_t* backscreen = (uint16_t*) malloc(OFFSCREEN_SIZE); uint16_t* offscreen = (uint16_t*) malloc(OFFSCREEN_SIZE); uint16_t* tscreen, backoffscreen=offscreen; extern unsigned char sscreen[SCREEN_WIDTH*SCREEN_HEIGHT*2]; char c; initScreen(); startScreen(); setCurColorRGB(0xFF,0xFF,0xFF); setMode(RETC_MODE); for(j=0;j>2)|((col&0b11111100000)>>5>>2<<5)|((col&0b1111100000000000)>>11>>2<<11); sscreen[(j*SCREEN_WIDTH+i)*2]=col; sscreen[(j*SCREEN_WIDTH+i)*2+1]=col>>8; } setConsoleWidth(MAX_COL-1); setMode(TRNS_MODE|RETC_MODE); memcpy(backscreen,sscreen,OFFSCREEN_SIZE); drwBufVert(backscreen,SCREEN_WIDTH-1,0,SCREEN_HEIGHT-1,0); drwBufVert(backscreen,SCREEN_WIDTH-5,0,SCREEN_HEIGHT-1,0); drwBufHoriz(backscreen,0,SCREEN_WIDTH-5+1,SCREEN_WIDTH-2,0); drwBufHoriz(backscreen,SCREEN_HEIGHT-1,SCREEN_WIDTH-5+1,SCREEN_WIDTH-2,0); for(i=1;i<=3;i++) drwBufVert(fullrefresh?offscreen:getScreen(),SCREEN_WIDTH-i,1,SCREEN_HEIGHT-1,1); memcpy(getScreen(),backscreen,OFFSCREEN_SIZE); index_lines=malloc(NLINES*sizeof(uint32_t)); maxlines=NLINES; index_lines[0]=0; while(!isKeyPressed(KEY_NSPIRE_ESC)) { oldusedlines=usedlines; if(myuart_ready()) { c=myuart_getchar(); if(c) { oldline=getLine(); dispc(c); if(getLine()!=oldline) { usedlines++; index_lines=incalloc(index_lines,&maxlines,sizeof(uint32_t)); index_lines[usedlines-1]=ibuf; } if(ibuf>=bufsize-1) buffer=incalloc(buffer,&bufsize,1); buffer[ibuf]=c; ibuf++; } } else { if(startline>0 && isKeyPressed(KEY_NSPIRE_UP)) { startline--; fullrefresh=1; } if(startline+MAX_LGN=MAX_LGN && (fullrefresh || usedlines!=oldusedlines)) { uint8_t scrollheight=(SCREEN_HEIGHT-4)*MAX_LGN/usedlines; uint8_t scrollpos=2+startline*(SCREEN_HEIGHT-4-scrollheight)/(usedlines-MAX_LGN); drwBufVert(fullrefresh?offscreen:getScreen(),SCREEN_WIDTH-3,scrollpos,scrollpos+scrollheight-1,0); if(!fullrefresh) drwBufVert(getScreen(),SCREEN_WIDTH-3,scrollpos+scrollheight,SCREEN_HEIGHT-1,1); } if(fullrefresh) { buffer[ibuf]=0; dispBuf(offscreen,buffer+index_lines[startline]); memcpy(getScreen(),offscreen,OFFSCREEN_SIZE); fullrefresh=0; } } free(index_lines); free(backscreen); stopScreen(); free(offscreen); if(argc>=1) { char* txtbuf[256]; for(i=strlen(argv[0])-1;i>0;i--) if(argv[0][i]=='/') break; strcpy(argv[0]+i+1,"nDock.txt.tns"); sprintf(txtbuf,"Save log to %s ?",argv[0]); while(isKeyPressed(KEY_NSPIRE_ESC)); uint8_t result=show_msgbox_3b("Save ?", txtbuf, "Append", "Overwrite", "Cancel"); if(result!=3) { FILE* ho; if(result==1) ho = fopen(argv[0],"a"); else ho = fopen(argv[0],"w"); if(ho) { fwrite(buffer,1,ibuf,ho); fclose(ho); } } } free(buffer); }