• R/O
  • HTTP
  • SSH
  • HTTPS

提交

標籤
無標籤

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

BASIC compiler/interpreter for PIC32MX/MZ-80K


Commit MetaInfo

修訂9d8a180b0df55b66a4dadf3f48e446005e9c5ae6 (tree)
時間2019-04-15 04:37:01
作者Katsumi <kmorimatsu@sour...>
CommiterKatsumi

Log Message

Kenken's change for file select by protozoa.

Change Summary

差異

--- a/mips/protozoa/compiler.h
+++ b/mips/protozoa/compiler.h
@@ -280,7 +280,6 @@ char* fput_statement();
280280 char* fputc_statement();
281281 char* fremove_statement();
282282 char* label_statement();
283-char* exec_statement();
284283
285284 char* function(void);
286285 char* str_function(void);
@@ -376,8 +375,6 @@ void stop_timer();
376375 char* usetimer_statement();
377376 char* timer_statement();
378377 char* timer_function();
379-char* coretimer_statement();
380-char* coretimer_function();
381378 char* interrupt_statement();
382379
383380 /* Error messages */
@@ -496,7 +493,6 @@ char* interrupt_statement();
496493 #define INTERRUPT_INKEY 3
497494 #define INTERRUPT_MUSIC 4
498495 #define INTERRUPT_WAVE 5
499-#define INTERRUPT_CORETIMER 6
500496
501497 extern int g_interrupt_flags;
502498 extern int g_int_vector[];
--- a/mips/protozoa/editor.c
+++ b/mips/protozoa/editor.c
@@ -11,10 +11,350 @@
1111 #include "compiler.h"
1212 #include "main.h"
1313
14-unsigned char currentfile[13],tempfile[13]; //編集中のファイル名、一時ファイル名
14+//配列RAM[]内にメモリ動的確保するためのポインタ
15+char *editormallocp;
16+
17+//unsigned char cwdpath[PATHNAMEMAX]; //現在のディレクトリのパス名
18+unsigned char *cwdpath; //実体は配列RAM[]の中に確保する
19+
20+unsigned char tempfile[13]; //編集中のファイル名、一時ファイル名
21+
22+//unsigned char filenames[MAXFILENUM][13]; //ロード時のファイル名一覧バッファ
23+unsigned char (*filenames)[13]; //実体は配列RAM[]の中に確保する
24+
25+unsigned char runfile[13]; //実行ファイル名
26+
27+const unsigned char Message1[]="Hit Any Key\n";
28+const unsigned char Message2[]="File System Error\n";
29+const unsigned char Message3[]="Retry:[Enter] / Quit:[ESC]\n";
30+const unsigned char ROOTDIR[]="\\";
31+
32+unsigned char * editormalloc(int size){
33+//配列RAM[]内にサイズsizeの領域を確保し、先頭アドレスを返す
34+//確保できない場合は、エラー表示し動作停止
35+ unsigned char *p;
36+ if(editormallocp+size>RAM+RAMSIZE){
37+ printstr("Cannot allocate memory");
38+ while(1) asm("wait");
39+ }
40+ p=editormallocp;
41+ editormallocp+=size;
42+ return p;
43+}
1544
1645 void wait60thsec(unsigned short n){
1746 // 60分のn秒ウェイト(ビデオ画面の最下行信号出力終了まで待つ)
1847 n+=drawcount;
1948 while(drawcount!=n) asm(WAIT);
2049 }
50+int filesystemretry(){
51+// SDファイルシステムの再初期化確認と実施
52+// SDファイルへの保存や読み込み時にファイルエラーが発生した場合に呼び出す
53+// 戻り値 0:初期化成功、-1:成功することなくEscapeで抜けた
54+ unsigned short vk;
55+ while(1){
56+ setcursorcolor(COLOR_NORMALTEXT);
57+ printstr((unsigned char *)Message3); //Retry / Quit
58+ while(1){
59+ inputchar(); //1文字入力待ち
60+ vk=vkey & 0xff;
61+ if(vk==VK_RETURN || vk==VK_SEPARATOR) break;
62+ if(vk==VK_ESCAPE || vk==VK_F1) return -1;
63+ }
64+ //ファイルシステム初期化
65+ if(FSInit()!=FALSE) return 0; //成功
66+ //エラーの場合
67+ setcursorcolor(COLOR_ERRORTEXT);
68+ printstr((unsigned char *)Message2);//File System Error
69+ }
70+}
71+void printfilename(unsigned char x,unsigned char y,int f,int num_dir){
72+// x,yの位置にファイル名またはディレクトリ名を表示
73+
74+ if(f==-2){
75+ setcursor(x,y,COLOR_ERRORTEXT);
76+ printchar('<');
77+ printstr("New FILE");
78+ printchar('>');
79+ }
80+ else if(f==-1){
81+ setcursor(x,y,COLOR_ERRORTEXT);
82+ printchar('<');
83+ printstr("New Dir");
84+ printchar('>');
85+ }
86+ else if(f<num_dir){
87+ setcursor(x,y,COLOR_DIR);
88+ printchar('[');
89+ printstr(filenames[f]);
90+ printchar(']');
91+ }
92+ else{
93+ setcursor(x,y,COLOR_NORMALTEXT);
94+ printstr(filenames[f]);
95+ }
96+}
97+int select_dir_file(int filenum,int num_dir, unsigned char* msg){
98+// filenames[]配列に読み込まれたファイルまたはディレクトリを画面表示しキーボードで選択する
99+// filenum:ファイル+ディレクトリ数
100+// num_dir:ディレクトリ数(filenames[]は先頭からnum_dir-1までがディレクトリ)
101+// msg:画面上部に表示するメッセージ
102+// 戻り値
103+// filenames[]の選択されたファイルまたはディレクトリ番号
104+// -1:新規ディレクトリ作成、tempfile[]にディレクトリ名
105+// -2:新規ファイル作成、tempfile[]にファイル名
106+// -3:ESCキーが押された
107+ int top,f;
108+ unsigned char *ps,*pd;
109+ int x,y;
110+ unsigned char vk;
111+ //ファイル一覧を画面に表示
112+ cls();
113+ setcursor(0,0,COLOR_NORMALTEXT);
114+ printstr(msg);
115+ printstr(": ");
116+ setcursorcolor(4);
117+// printstr("Select&[FIRE] / [START]\n");
118+ printstr("Select & [FIRE]\n");
119+ for(f=-2;f<filenum;f++){
120+ x=(f&1)*15+1;
121+ y=(f+2)/2+1;
122+ if(y>=WIDTH_Y-1) break;
123+ printfilename(x,y,f,num_dir);
124+ }
125+ top=-2;//画面一番先頭のファイル番号
126+ f=-2;//現在選択中のファイル番号
127+ while(1){
128+ setcursor((f&1)*15,(f-top)/2+1,5);
129+ printchar(0x1c);// Right Arrow
130+ cursor--;
131+ while(1){
132+ inputchar();
133+ vk=vkey & 0xff;
134+ if(vk) break;
135+ }
136+ printchar(' ');
137+ setcursor(0,WIDTH_Y-1,COLOR_NORMALTEXT);
138+ for(x=0;x<twidth-1;x++) printchar(' '); //最下行のステータス表示を消去
139+ switch(vk){
140+ case VK_UP:
141+ case VK_NUMPAD8:
142+ //上矢印キー
143+ if(f>=0){
144+ f-=2;
145+ if(f<top){
146+ //画面最上部の場合、下にスクロールして最上部にファイル名2つ表示
147+ if(twidth==WIDTH_X1){
148+ setcursor(WIDTH_X1-1,WIDTH_Y-2,COLOR_NORMALTEXT);
149+ while(cursor>=TVRAM+WIDTH_X1*2){
150+ *cursor=*(cursor-WIDTH_X1);
151+ *(cursor+ATTROFFSET1)=*(cursor+ATTROFFSET1-WIDTH_X1);
152+ cursor--;
153+ }
154+ while(cursor>=TVRAM+WIDTH_X1) *cursor--=' ';
155+ }
156+ else{
157+ setcursor(WIDTH_X2-1,WIDTH_Y-2,COLOR_NORMALTEXT);
158+ while(cursor>=TVRAM+WIDTH_X2*2){
159+ *cursor=*(cursor-WIDTH_X2);
160+ *(cursor+ATTROFFSET2)=*(cursor+ATTROFFSET2-WIDTH_X2);
161+ cursor--;
162+ }
163+ while(cursor>=TVRAM+WIDTH_X2) *cursor--=' ';
164+ }
165+ top-=2;
166+ printfilename(1,1,top,num_dir);
167+ printfilename(16,1,top+1,num_dir);
168+ }
169+ }
170+ break;
171+ case VK_DOWN:
172+ case VK_NUMPAD2:
173+ //下矢印キー
174+ if(((f+2)&0xfffe)<filenum){
175+ f+=2;
176+ if(f>=filenum) f--;
177+ if(f-top>=(WIDTH_Y-2)*2){
178+ //画面最下部の場合、上にスクロールして最下部にファイル名1つor2つ表示
179+ setcursor(0,1,COLOR_NORMALTEXT);
180+ if(twidth==WIDTH_X1){
181+ while(cursor<TVRAM+WIDTH_X1*(WIDTH_Y-2)){
182+ *cursor=*(cursor+WIDTH_X1);
183+ *(cursor+ATTROFFSET1)=*(cursor+ATTROFFSET1+WIDTH_X1);
184+ cursor++;
185+ }
186+ while(cursor<TVRAM+WIDTH_X1*(WIDTH_Y-1)) *cursor++=' ';
187+ }
188+ else{
189+ while(cursor<TVRAM+WIDTH_X2*(WIDTH_Y-2)){
190+ *cursor=*(cursor+WIDTH_X2);
191+ *(cursor+ATTROFFSET2)=*(cursor+ATTROFFSET2+WIDTH_X2);
192+ cursor++;
193+ }
194+ while(cursor<TVRAM+WIDTH_X2*(WIDTH_Y-1)) *cursor++=' ';
195+ }
196+ top+=2;
197+ printfilename(1,WIDTH_Y-2,f&0xfffe,num_dir);
198+ if((f|1)<filenum){
199+ printfilename(16,WIDTH_Y-2,f|1,num_dir);
200+ }
201+ }
202+ }
203+ break;
204+ case VK_LEFT:
205+ case VK_NUMPAD4:
206+ //左矢印キー
207+ if(f&1) f--;
208+ break;
209+ case VK_RIGHT:
210+ case VK_NUMPAD6:
211+ //右矢印キー
212+ if((f&1)==0 && f+1<filenum) f++;
213+ break;
214+ case VK_RETURN: //Enterキー
215+ case VK_SEPARATOR: //テンキーのEnter
216+ if(f==-2){
217+ //新規ファイル
218+ }
219+ else if(f==-1){
220+ //新規ディレクトリ
221+ }
222+ else{
223+ //ファイル名またはディレクトリ名をtempfileにコピー
224+ ps=filenames[f];
225+ pd=tempfile;
226+ while(*ps) *pd++=*ps++;
227+ *pd=0;
228+ return f;
229+ }
230+// case VK_ESCAPE:
231+// case VK_F1: // STARTボタン
232+ //ESCキー
233+// return -3;
234+ }
235+ }
236+}
237+int getfilelist(int *p_num_dir){
238+// カレントディレクトリでのディレクトリ、.BAS、.TXT、.INIファイル一覧を読み込む
239+// *p_num_dir:ディレクトリ数を返す
240+// filenames[]:ファイル名およびディレクトリ名一覧
241+// 戻り値 ファイル+ディレクトリ数
242+
243+ unsigned char *ps,*pd;
244+ int filenum;
245+ SearchRec sr;
246+ filenum=0;
247+ //ディレクトリのサーチ
248+ if(FindFirst("*",ATTR_DIRECTORY,&sr)==0){
249+ do{
250+ //filenames[]にディレクトリ名の一覧を読み込み
251+ ps=sr.filename;
252+ pd=filenames[filenum];
253+ while(*ps!=0) *pd++=*ps++;
254+ *pd=0;
255+ filenum++;
256+ }
257+ while(!FindNext(&sr) && filenum<MAXFILENUM);
258+ }
259+ *p_num_dir=filenum;
260+ if(filenum>=MAXFILENUM) return filenum;
261+ //拡張子 BASファイルのサーチ
262+ if(FindFirst("*.BAS",ATTR_READ_ONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_ARCHIVE,&sr)==0){
263+ do{
264+ //filenames[]にファイル名の一覧を読み込み
265+ ps=sr.filename;
266+ pd=filenames[filenum];
267+ while(*ps!=0) *pd++=*ps++;
268+ *pd=0;
269+ filenum++;
270+ }
271+ while(!FindNext(&sr) && filenum<MAXFILENUM);
272+ }
273+ if(filenum>=MAXFILENUM) return filenum;
274+ //拡張子 TXTファイルのサーチ
275+ if(FindFirst("*.TXT",ATTR_READ_ONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_ARCHIVE,&sr)==0){
276+ do{
277+ //filenames[]にファイル名の一覧を読み込み
278+ ps=sr.filename;
279+ pd=filenames[filenum];
280+ while(*ps!=0) *pd++=*ps++;
281+ *pd=0;
282+ filenum++;
283+ }
284+ while(!FindNext(&sr) && filenum<MAXFILENUM);
285+ }
286+ if(filenum>=MAXFILENUM) return filenum;
287+ return filenum;
288+}
289+void fileselect(void){
290+// SDカードからファイルを選択
291+// runfile[]にファイル名を記憶
292+// 対象ファイル拡張子 BASおよびTXT
293+ int filenum,f;
294+ unsigned char *ps,*pd;
295+ int num_dir;//ディレクトリ数
296+
297+ //ファイルの一覧をSDカードから読み出し
298+ cls();
299+ while(1){
300+ filenum=getfilelist(&num_dir); //ディレクトリ、ファイル名一覧を読み込み
301+ if(filenum==0){
302+ setcursorcolor(COLOR_ERRORTEXT);
303+ printstr(".BAS or .TXT File Not Found\n");
304+ printstr((unsigned char *)Message1);// Hit Any Key
305+ inputchar(); //1文字入力待ち
306+ continue;
307+ }
308+ //ファイルの選択
309+ f=select_dir_file(filenum,num_dir,"Load");
310+ if(f<num_dir){
311+ //ディレクトリ変更して、再度ファイル一覧画面へ
312+ FSchdir(tempfile);
313+ continue;
314+ }
315+ ps=filenames[f];
316+ pd=runfile;
317+ while(*ps) *pd++=*ps++;
318+ *pd=0;
319+ return;
320+ }
321+}
322+void run(int test){
323+//KM-BASICコンパイル&実行
324+// test 0:コンパイルと実行、0以外:コンパイルのみで終了
325+ int er2;
326+
327+ cls();
328+ setcursor(0,0,COLOR_NORMALTEXT);
329+// set_width(0);//30文字モードに設定
330+
331+ // Enable Break key
332+ g_disable_break=0;
333+ //KM-BASIC実行
334+ er2=runbasic(runfile,test);
335+
336+ stopPCG();//システムフォントに戻す
337+ setcursorcolor(COLOR_NORMALTEXT);
338+ printchar('\n');
339+ printstr((unsigned char *)Message1);// Hit Any Key
340+ do ps2readkey(); //キーバッファが空になるまで読み出し
341+ while(vkey!=0);
342+ inputchar(); //1文字入力待ち
343+ init_textgraph(); //パレット初期化のため画面初期化
344+ //画面モードを戻す
345+// if(widthmode==WIDTH_X1) set_width(0);
346+// else set_width(1);
347+
348+}
349+void texteditor(void){
350+ editormallocp=RAM;
351+ cwdpath=editormalloc(PATHNAMEMAX);
352+ filenames=(unsigned char (*)[])editormalloc(MAXFILENUM*13);
353+
354+ cwdpath[0]='\\'; //カレントディレクトリをルートに設定
355+ cwdpath[1]=0;
356+ while(1){
357+ fileselect();
358+ run(0);
359+ }
360+}
--- a/mips/protozoa/function.c
+++ b/mips/protozoa/function.c
@@ -391,10 +391,6 @@ char* getdir_function(){
391391 return 0;
392392 }
393393
394-char* exec_function(){
395- return exec_statement();
396-}
397-
398394 char* float_constant(float val){
399395 volatile int i;
400396 ((float*)(&i))[0]=val;
@@ -601,8 +597,6 @@ static const void* int_func_list[]={
601597 "NEW(",new_function,
602598 "SETDIR(",setdir_function,
603599 "TIMER(",timer_function,
604- "EXEC(",exec_function,
605- "CORETIMER(",coretimer_function,
606600 // Additional functions follow
607601 ADDITIONAL_INT_FUNCTIONS
608602 };
--- a/mips/protozoa/interface/keyinput.c
+++ b/mips/protozoa/interface/keyinput.c
@@ -35,7 +35,44 @@ unsigned short readButton(void){
3535 LCD_CS_LO;
3636 return k;
3737 }
38-
38+void keycheck(void){
39+//ボタン状態読み取り
40+//keystatus :現在押されているボタンに対応するビットを1にする
41+//keystatus2:前回押されていなくて、今回押されたボタンに対応するビットを1にする
42+ oldkey=keystatus;
43+ keystatus=readButton();
44+ keystatus2=keystatus & ~oldkey; //ボタンから手を離したかチェック
45+}
3946 unsigned char ps2readkey(){
47+// ボタンで以下のPS/2キーボード用関数を擬似的に利用。戻り値は0
48+
49+// 入力された1つのキーのキーコードをグローバル変数vkeyに格納(押されていなければ0を返す)
50+// 下位8ビット:キーコード
51+// 上位8ビット:シフト状態(押下:1)、上位から<0><CAPSLK><NUMLK><SCRLK><Win><ALT><CTRL><SHIFT>
52+// 英数・記号文字の場合、戻り値としてASCIIコード(それ以外は0を返す)
53+ keycheck();
54+ vkey=0;
55+
56+ if(keystatus2==KEYFIRE) vkey=VK_RETURN;
57+ if(keystatus2==KEYSTART) vkey=VK_F1;
58+ if(keystatus2==KEYDOWN) vkey=VK_DOWN;
59+ if(keystatus2==KEYLEFT) vkey=VK_LEFT;
60+ if(keystatus2==KEYRIGHT) vkey=VK_RIGHT;
61+ if(keystatus2==KEYUP) vkey=VK_UP;
62+
4063 return 0;
41-}
\ No newline at end of file
64+}
65+
66+unsigned char inputchar(void){
67+// キーボードから1キー入力待ち
68+// 戻り値 通常文字の場合ASCIIコード、その他は0、グローバル変数vkeyに仮想キーコード
69+ unsigned char k;
70+ unsigned short d;
71+ d=drawcount;
72+ while(1){
73+ while(d==drawcount) asm("wait"); //60分の1秒ウェイト
74+ d=drawcount;
75+ k=ps2readkey(); //キーバッファから読み込み、k:通常文字入力の場合ASCIIコード
76+ if(vkey) return k;
77+ }
78+}
--- a/mips/protozoa/main.c
+++ b/mips/protozoa/main.c
@@ -251,12 +251,10 @@ int main(void){
251251
252252 wait60thsec(60); //1秒待ち
253253
254-/*
255254 // 実行中HEXファイル名がHEXFILEと一致した場合はエディタ起動
256255 appname=(char*)FILENAME_FLASH_ADDRESS;
257256 s=HEXFILE;
258257 while(*s++==*appname++) if(*s==0) texteditor(); //テキストエディター呼び出し
259-*/
260258
261259 // 実行中HEXファイル名の「.HEX」を「.BAS」に置き換えてBASファイルを実行
262260 appname=(char*)FILENAME_FLASH_ADDRESS;
--- a/mips/protozoa/statement.c
+++ b/mips/protozoa/statement.c
@@ -1741,7 +1741,6 @@ static const void* statement_list[]={
17411741 "TIMER ",timer_statement,
17421742 "INTERRUPT ",interrupt_statement,
17431743 "IDLE",idle_statement,
1744- "CORETIMER",coretimer_statement,
17451744 // List of additional statements follows
17461745 ADDITIONAL_STATEMENTS
17471746 };
--- a/mips/protozoa/timer.c
+++ b/mips/protozoa/timer.c
@@ -33,7 +33,6 @@ static const void* interrupt_list[]={
3333 "INKEY", (void*)INTERRUPT_INKEY,
3434 "MUSIC", (void*)INTERRUPT_MUSIC,
3535 "WAVE", (void*)INTERRUPT_WAVE,
36- "CORETIMER",(void*)INTERRUPT_CORETIMER,
3736 ADDITIONAL_INTERRUPT_FUNCTIONS
3837 };
3938 #define NUM_INTERRUPT_TYPES ((sizeof(interrupt_list)/sizeof(interrupt_list[0]))/2)
@@ -70,7 +69,6 @@ void stop_timer(){
7069 IEC0bits.T1IE=0;
7170 // Disable interrupt
7271 IEC0bits.CS1IE=0;
73- IEC0bits.CTIE=0;
7472 }
7573
7674 /*
@@ -159,40 +157,6 @@ char* timer_function(){
159157 }
160158
161159 /*
162- Coretimer implementaion
163-*/
164-
165-#pragma interrupt CTHandler IPL2SOFT vector 0
166-void CTHandler(void){
167- // Clear CT interrupt flag
168- IFS0bits.CTIF=0;
169- // Raise TIMER interrupt flag
170- raise_interrupt_flag(INTERRUPT_CORETIMER);
171-}
172-
173-char* coretimer_function(){
174- check_obj_space(1);
175- g_object[g_objpos++]=0x40024800; // mfc0 v0,Count
176- return 0;
177-}
178-
179-void lib_coretimer(){
180- // CT interrupt: priority 2
181- IPC0bits.CTIP=2;
182- IPC0bits.CTIS=0;
183- IEC0bits.CTIE=1;
184-}
185-
186-char* coretimer_statement(){
187- char* err;
188- err=get_value();
189- if (err) return err;
190- // 0x40825800: mtc0 v0,Compare
191- call_quicklib_code(lib_coretimer,0x40825800);
192- return 0;
193-}
194-
195-/*
196160 Interrupt interprtation
197161 To cause interruption, use raise_interrupt_flag() macro
198162 For example,