BASIC compiler/interpreter for PIC32MX/MZ-80K
Revision | 21afea9c32263a7ca53f5f4efedde721c3456d6e (tree) |
---|---|
Zeit | 2019-05-04 07:42:36 |
Autor | Katsumi <kmorimatsu@sour...> |
Commiter | Katsumi |
Revise KEYS interrupt. Reset all interruption flags before running.
@@ -206,6 +206,8 @@ KEYS([x]) | ||
206 | 206 | KEYRIGHT: 8 |
207 | 207 | KEYSTART: 16 |
208 | 208 | KEYFIRE: 32 |
209 | + Type Zでこの機能を使うと、INKEY割り込みやREADKEY()等のキーボードを利 | |
210 | + 用した機能が使えなくなる事に注意。Type Mでは、その限りではない。 | |
209 | 211 | LEN(x$) |
210 | 212 | 文字列の長さを返す。 |
211 | 213 | MUSIC() |
@@ -566,7 +568,9 @@ INTERRUPT xxx,yyy[,z1[,z2 ... ]] | ||
566 | 568 | DRAWCOUNT |
567 | 569 | 1/60秒毎の割り込み。 |
568 | 570 | KEYS |
569 | - ボタンの押下状態が変化した時。 | |
571 | + ボタンの押下状態が変化した時。Type Zでこの機能を使うと、INKEY割り込 | |
572 | + みやREADKEY()、INKEY()等のキーボードを利用した機能が使えなくなる事に | |
573 | + 注意。Type Mでは、その限りではない。 | |
570 | 574 | INKEY |
571 | 575 | キーボード押下時。READKEY()関数と組み合わせて使う。 |
572 | 576 | MUSIC |
@@ -60,6 +60,7 @@ void init_timer(){ | ||
60 | 60 | // Disable interrupt |
61 | 61 | IEC0bits.CS1IE=0; |
62 | 62 | IFS0bits.CS1IF=0; |
63 | + g_interrupt_flags=0; | |
63 | 64 | for(i=0;i<NUM_INTERRUPT_TYPES;i++) g_int_vector[i]=0; |
64 | 65 | // CS0 interrupt every 1/60 sec (triggered by Timer2) |
65 | 66 | IPC0bits.CS0IP=3; |
@@ -74,7 +75,7 @@ void init_timer(){ | ||
74 | 75 | asm volatile("mtc0 $t0,$12,0"); |
75 | 76 | asm volatile("ei"); |
76 | 77 | // The other initialization(s) |
77 | - g_keys_interrupt=-1; | |
78 | + g_keys_interrupt=-2; | |
78 | 79 | } |
79 | 80 | |
80 | 81 | void stop_timer(){ |
@@ -345,18 +346,21 @@ void CS0Handler(void){ | ||
345 | 346 | // Raise DRAWCOUNT interrupt flag |
346 | 347 | raise_interrupt_flag(INTERRUPT_DRAWCOUNT); |
347 | 348 | // Check buttons |
348 | - if (inPS2MODE()) { | |
349 | + if (g_int_vector[INTERRUPT_KEYS]) { | |
349 | 350 | keys=readbuttons(); |
350 | - ps2mode(); | |
351 | - } else { | |
352 | - keys=readbuttons(); | |
353 | - } | |
354 | - keys=keys & (KEYUP|KEYDOWN|KEYLEFT|KEYRIGHT|KEYSTART|KEYFIRE); | |
355 | - if (0<=g_keys_interrupt && g_keys_interrupt!=keys) { | |
356 | - // Raise KEYS interrupt flag | |
357 | - raise_interrupt_flag(INTERRUPT_KEYS); | |
351 | + keys&=(KEYSTART | KEYFIRE | KEYUP | KEYDOWN | KEYLEFT | KEYRIGHT); | |
352 | + if (g_keys_interrupt<-1) { | |
353 | + g_keys_interrupt++; | |
354 | + } else if (g_keys_interrupt<0) { | |
355 | + g_keys_interrupt=keys; | |
356 | + } else { | |
357 | + if (g_keys_interrupt!=keys) { | |
358 | + // Raise KEYS interrupt flag | |
359 | + raise_interrupt_flag(INTERRUPT_KEYS); | |
360 | + } | |
361 | + g_keys_interrupt=keys; | |
362 | + } | |
358 | 363 | } |
359 | - g_keys_interrupt=keys; | |
360 | 364 | // Check PS/2 keyboard input |
361 | 365 | if (g_int_vector[INTERRUPT_INKEY]) { |
362 | 366 | if (keycodeExists()) raise_interrupt_flag(INTERRUPT_INKEY); |
@@ -206,6 +206,8 @@ KEYS([x]) | ||
206 | 206 | KEYRIGHT: 8 |
207 | 207 | KEYSTART: 16 |
208 | 208 | KEYFIRE: 32 |
209 | + Type Zでこの機能を使うと、INKEY割り込みやREADKEY()等のキーボードを利 | |
210 | + 用した機能が使えなくなる事に注意。Type Mでは、その限りではない。 | |
209 | 211 | LEN(x$) |
210 | 212 | 文字列の長さを返す。 |
211 | 213 | MUSIC() |
@@ -566,7 +568,9 @@ INTERRUPT xxx,yyy[,z1[,z2 ... ]] | ||
566 | 568 | DRAWCOUNT |
567 | 569 | 1/60秒毎の割り込み。 |
568 | 570 | KEYS |
569 | - ボタンの押下状態が変化した時。 | |
571 | + ボタンの押下状態が変化した時。Type Zでこの機能を使うと、INKEY割り込 | |
572 | + みやREADKEY()、INKEY()等のキーボードを利用した機能が使えなくなる事に | |
573 | + 注意。Type Mでは、その限りではない。 | |
570 | 574 | INKEY |
571 | 575 | キーボード押下時。READKEY()関数と組み合わせて使う。 |
572 | 576 | MUSIC |
@@ -60,6 +60,7 @@ void init_timer(){ | ||
60 | 60 | // Disable interrupt |
61 | 61 | IEC0bits.CS1IE=0; |
62 | 62 | IFS0bits.CS1IF=0; |
63 | + g_interrupt_flags=0; | |
63 | 64 | for(i=0;i<NUM_INTERRUPT_TYPES;i++) g_int_vector[i]=0; |
64 | 65 | // CS0 interrupt every 1/60 sec (triggered by Timer2) |
65 | 66 | IPC0bits.CS0IP=3; |
@@ -74,7 +75,7 @@ void init_timer(){ | ||
74 | 75 | asm volatile("mtc0 $t0,$12,0"); |
75 | 76 | asm volatile("ei"); |
76 | 77 | // The other initialization(s) |
77 | - g_keys_interrupt=-1; | |
78 | + g_keys_interrupt=-2; | |
78 | 79 | } |
79 | 80 | |
80 | 81 | void stop_timer(){ |
@@ -345,18 +346,21 @@ void CS0Handler(void){ | ||
345 | 346 | // Raise DRAWCOUNT interrupt flag |
346 | 347 | raise_interrupt_flag(INTERRUPT_DRAWCOUNT); |
347 | 348 | // Check buttons |
348 | - if (inPS2MODE()) { | |
349 | + if (g_int_vector[INTERRUPT_KEYS]) { | |
349 | 350 | keys=readbuttons(); |
350 | - ps2mode(); | |
351 | - } else { | |
352 | - keys=readbuttons(); | |
353 | - } | |
354 | - keys=keys & (KEYUP|KEYDOWN|KEYLEFT|KEYRIGHT|KEYSTART|KEYFIRE); | |
355 | - if (0<=g_keys_interrupt && g_keys_interrupt!=keys) { | |
356 | - // Raise KEYS interrupt flag | |
357 | - raise_interrupt_flag(INTERRUPT_KEYS); | |
351 | + keys&=(KEYSTART | KEYFIRE | KEYUP | KEYDOWN | KEYLEFT | KEYRIGHT); | |
352 | + if (g_keys_interrupt<-1) { | |
353 | + g_keys_interrupt++; | |
354 | + } else if (g_keys_interrupt<0) { | |
355 | + g_keys_interrupt=keys; | |
356 | + } else { | |
357 | + if (g_keys_interrupt!=keys) { | |
358 | + // Raise KEYS interrupt flag | |
359 | + raise_interrupt_flag(INTERRUPT_KEYS); | |
360 | + } | |
361 | + g_keys_interrupt=keys; | |
362 | + } | |
358 | 363 | } |
359 | - g_keys_interrupt=keys; | |
360 | 364 | // Check PS/2 keyboard input |
361 | 365 | if (g_int_vector[INTERRUPT_INKEY]) { |
362 | 366 | if (keycodeExists()) raise_interrupt_flag(INTERRUPT_INKEY); |
@@ -206,6 +206,8 @@ KEYS([x]) | ||
206 | 206 | KEYRIGHT: 8 |
207 | 207 | KEYSTART: 16 |
208 | 208 | KEYFIRE: 32 |
209 | + Type Zでこの機能を使うと、INKEY割り込みやREADKEY()等のキーボードを利 | |
210 | + 用した機能が使えなくなる事に注意。Type Mでは、その限りではない。 | |
209 | 211 | LEN(x$) |
210 | 212 | 文字列の長さを返す。 |
211 | 213 | MUSIC() |
@@ -566,7 +568,9 @@ INTERRUPT xxx,yyy[,z1[,z2 ... ]] | ||
566 | 568 | DRAWCOUNT |
567 | 569 | 1/60秒毎の割り込み。 |
568 | 570 | KEYS |
569 | - ボタンの押下状態が変化した時。 | |
571 | + ボタンの押下状態が変化した時。Type Zでこの機能を使うと、INKEY割り込 | |
572 | + みやREADKEY()、INKEY()等のキーボードを利用した機能が使えなくなる事に | |
573 | + 注意。Type Mでは、その限りではない。 | |
570 | 574 | INKEY |
571 | 575 | キーボード押下時。READKEY()関数と組み合わせて使う。 |
572 | 576 | MUSIC |
@@ -60,6 +60,7 @@ void init_timer(){ | ||
60 | 60 | // Disable interrupt |
61 | 61 | IEC0bits.CS1IE=0; |
62 | 62 | IFS0bits.CS1IF=0; |
63 | + g_interrupt_flags=0; | |
63 | 64 | for(i=0;i<NUM_INTERRUPT_TYPES;i++) g_int_vector[i]=0; |
64 | 65 | // CS0 interrupt every 1/60 sec (triggered by Timer2) |
65 | 66 | IPC0bits.CS0IP=3; |
@@ -74,7 +75,7 @@ void init_timer(){ | ||
74 | 75 | asm volatile("mtc0 $t0,$12,0"); |
75 | 76 | asm volatile("ei"); |
76 | 77 | // The other initialization(s) |
77 | - g_keys_interrupt=-1; | |
78 | + g_keys_interrupt=-2; | |
78 | 79 | } |
79 | 80 | |
80 | 81 | void stop_timer(){ |
@@ -345,18 +346,21 @@ void CS0Handler(void){ | ||
345 | 346 | // Raise DRAWCOUNT interrupt flag |
346 | 347 | raise_interrupt_flag(INTERRUPT_DRAWCOUNT); |
347 | 348 | // Check buttons |
348 | - if (inPS2MODE()) { | |
349 | + if (g_int_vector[INTERRUPT_KEYS]) { | |
349 | 350 | keys=readbuttons(); |
350 | - ps2mode(); | |
351 | - } else { | |
352 | - keys=readbuttons(); | |
353 | - } | |
354 | - keys=keys & (KEYUP|KEYDOWN|KEYLEFT|KEYRIGHT|KEYSTART|KEYFIRE); | |
355 | - if (0<=g_keys_interrupt && g_keys_interrupt!=keys) { | |
356 | - // Raise KEYS interrupt flag | |
357 | - raise_interrupt_flag(INTERRUPT_KEYS); | |
351 | + keys&=(KEYSTART | KEYFIRE | KEYUP | KEYDOWN | KEYLEFT | KEYRIGHT); | |
352 | + if (g_keys_interrupt<-1) { | |
353 | + g_keys_interrupt++; | |
354 | + } else if (g_keys_interrupt<0) { | |
355 | + g_keys_interrupt=keys; | |
356 | + } else { | |
357 | + if (g_keys_interrupt!=keys) { | |
358 | + // Raise KEYS interrupt flag | |
359 | + raise_interrupt_flag(INTERRUPT_KEYS); | |
360 | + } | |
361 | + g_keys_interrupt=keys; | |
362 | + } | |
358 | 363 | } |
359 | - g_keys_interrupt=keys; | |
360 | 364 | // Check PS/2 keyboard input |
361 | 365 | if (g_int_vector[INTERRUPT_INKEY]) { |
362 | 366 | if (keycodeExists()) raise_interrupt_flag(INTERRUPT_INKEY); |