• 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

修訂21afea9c32263a7ca53f5f4efedde721c3456d6e (tree)
時間2019-05-04 07:42:36
作者Katsumi <kmorimatsu@sour...>
CommiterKatsumi

Log Message

Revise KEYS interrupt. Reset all interruption flags before running.

Change Summary

差異

--- a/mips/megalopa/help.txt
+++ b/mips/megalopa/help.txt
@@ -206,6 +206,8 @@ KEYS([x])
206206 KEYRIGHT: 8
207207 KEYSTART: 16
208208 KEYFIRE: 32
209+ Type Zでこの機能を使うと、INKEY割り込みやREADKEY()等のキーボードを利
210+ 用した機能が使えなくなる事に注意。Type Mでは、その限りではない。
209211 LEN(x$)
210212 文字列の長さを返す。
211213 MUSIC()
@@ -566,7 +568,9 @@ INTERRUPT xxx,yyy[,z1[,z2 ... ]]
566568 DRAWCOUNT
567569 1/60秒毎の割り込み。
568570 KEYS
569- ボタンの押下状態が変化した時。
571+ ボタンの押下状態が変化した時。Type Zでこの機能を使うと、INKEY割り込
572+ みやREADKEY()、INKEY()等のキーボードを利用した機能が使えなくなる事に
573+ 注意。Type Mでは、その限りではない。
570574 INKEY
571575 キーボード押下時。READKEY()関数と組み合わせて使う。
572576 MUSIC
--- a/mips/megalopa/timer.c
+++ b/mips/megalopa/timer.c
@@ -60,6 +60,7 @@ void init_timer(){
6060 // Disable interrupt
6161 IEC0bits.CS1IE=0;
6262 IFS0bits.CS1IF=0;
63+ g_interrupt_flags=0;
6364 for(i=0;i<NUM_INTERRUPT_TYPES;i++) g_int_vector[i]=0;
6465 // CS0 interrupt every 1/60 sec (triggered by Timer2)
6566 IPC0bits.CS0IP=3;
@@ -74,7 +75,7 @@ void init_timer(){
7475 asm volatile("mtc0 $t0,$12,0");
7576 asm volatile("ei");
7677 // The other initialization(s)
77- g_keys_interrupt=-1;
78+ g_keys_interrupt=-2;
7879 }
7980
8081 void stop_timer(){
@@ -345,18 +346,21 @@ void CS0Handler(void){
345346 // Raise DRAWCOUNT interrupt flag
346347 raise_interrupt_flag(INTERRUPT_DRAWCOUNT);
347348 // Check buttons
348- if (inPS2MODE()) {
349+ if (g_int_vector[INTERRUPT_KEYS]) {
349350 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+ }
358363 }
359- g_keys_interrupt=keys;
360364 // Check PS/2 keyboard input
361365 if (g_int_vector[INTERRUPT_INKEY]) {
362366 if (keycodeExists()) raise_interrupt_flag(INTERRUPT_INKEY);
--- a/mips/protozoea/help.txt
+++ b/mips/protozoea/help.txt
@@ -206,6 +206,8 @@ KEYS([x])
206206 KEYRIGHT: 8
207207 KEYSTART: 16
208208 KEYFIRE: 32
209+ Type Zでこの機能を使うと、INKEY割り込みやREADKEY()等のキーボードを利
210+ 用した機能が使えなくなる事に注意。Type Mでは、その限りではない。
209211 LEN(x$)
210212 文字列の長さを返す。
211213 MUSIC()
@@ -566,7 +568,9 @@ INTERRUPT xxx,yyy[,z1[,z2 ... ]]
566568 DRAWCOUNT
567569 1/60秒毎の割り込み。
568570 KEYS
569- ボタンの押下状態が変化した時。
571+ ボタンの押下状態が変化した時。Type Zでこの機能を使うと、INKEY割り込
572+ みやREADKEY()、INKEY()等のキーボードを利用した機能が使えなくなる事に
573+ 注意。Type Mでは、その限りではない。
570574 INKEY
571575 キーボード押下時。READKEY()関数と組み合わせて使う。
572576 MUSIC
--- a/mips/protozoea/timer.c
+++ b/mips/protozoea/timer.c
@@ -60,6 +60,7 @@ void init_timer(){
6060 // Disable interrupt
6161 IEC0bits.CS1IE=0;
6262 IFS0bits.CS1IF=0;
63+ g_interrupt_flags=0;
6364 for(i=0;i<NUM_INTERRUPT_TYPES;i++) g_int_vector[i]=0;
6465 // CS0 interrupt every 1/60 sec (triggered by Timer2)
6566 IPC0bits.CS0IP=3;
@@ -74,7 +75,7 @@ void init_timer(){
7475 asm volatile("mtc0 $t0,$12,0");
7576 asm volatile("ei");
7677 // The other initialization(s)
77- g_keys_interrupt=-1;
78+ g_keys_interrupt=-2;
7879 }
7980
8081 void stop_timer(){
@@ -345,18 +346,21 @@ void CS0Handler(void){
345346 // Raise DRAWCOUNT interrupt flag
346347 raise_interrupt_flag(INTERRUPT_DRAWCOUNT);
347348 // Check buttons
348- if (inPS2MODE()) {
349+ if (g_int_vector[INTERRUPT_KEYS]) {
349350 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+ }
358363 }
359- g_keys_interrupt=keys;
360364 // Check PS/2 keyboard input
361365 if (g_int_vector[INTERRUPT_INKEY]) {
362366 if (keycodeExists()) raise_interrupt_flag(INTERRUPT_INKEY);
--- a/mips/zoea/help.txt
+++ b/mips/zoea/help.txt
@@ -206,6 +206,8 @@ KEYS([x])
206206 KEYRIGHT: 8
207207 KEYSTART: 16
208208 KEYFIRE: 32
209+ Type Zでこの機能を使うと、INKEY割り込みやREADKEY()等のキーボードを利
210+ 用した機能が使えなくなる事に注意。Type Mでは、その限りではない。
209211 LEN(x$)
210212 文字列の長さを返す。
211213 MUSIC()
@@ -566,7 +568,9 @@ INTERRUPT xxx,yyy[,z1[,z2 ... ]]
566568 DRAWCOUNT
567569 1/60秒毎の割り込み。
568570 KEYS
569- ボタンの押下状態が変化した時。
571+ ボタンの押下状態が変化した時。Type Zでこの機能を使うと、INKEY割り込
572+ みやREADKEY()、INKEY()等のキーボードを利用した機能が使えなくなる事に
573+ 注意。Type Mでは、その限りではない。
570574 INKEY
571575 キーボード押下時。READKEY()関数と組み合わせて使う。
572576 MUSIC
--- a/mips/zoea/timer.c
+++ b/mips/zoea/timer.c
@@ -60,6 +60,7 @@ void init_timer(){
6060 // Disable interrupt
6161 IEC0bits.CS1IE=0;
6262 IFS0bits.CS1IF=0;
63+ g_interrupt_flags=0;
6364 for(i=0;i<NUM_INTERRUPT_TYPES;i++) g_int_vector[i]=0;
6465 // CS0 interrupt every 1/60 sec (triggered by Timer2)
6566 IPC0bits.CS0IP=3;
@@ -74,7 +75,7 @@ void init_timer(){
7475 asm volatile("mtc0 $t0,$12,0");
7576 asm volatile("ei");
7677 // The other initialization(s)
77- g_keys_interrupt=-1;
78+ g_keys_interrupt=-2;
7879 }
7980
8081 void stop_timer(){
@@ -345,18 +346,21 @@ void CS0Handler(void){
345346 // Raise DRAWCOUNT interrupt flag
346347 raise_interrupt_flag(INTERRUPT_DRAWCOUNT);
347348 // Check buttons
348- if (inPS2MODE()) {
349+ if (g_int_vector[INTERRUPT_KEYS]) {
349350 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+ }
358363 }
359- g_keys_interrupt=keys;
360364 // Check PS/2 keyboard input
361365 if (g_int_vector[INTERRUPT_INKEY]) {
362366 if (keycodeExists()) raise_interrupt_flag(INTERRUPT_INKEY);