void commandH() { int fig = sys_getc(); int num = getCaliValue(); char _work1[10], _work2[512]; char *work1 = _work1, *work2 = _work2; int len; *work2 = 0; sprintf(work1, "%d", num); if (fig != 0) { len = strlen(work1); if (fig > len) { /* 空白でうめる */ len = fig - len; while(len--) { strcat(work2, num2sjis(10)); } } else { work1 += (len - fig); } } while(*work1) { strcat(work2, num2sjis((*work1) - '0')); work1++; } sys_addMsg(work2); DEBUG_COMMAND("H %d,%d:\n",fig,num); }
// Stores command in cmd_buffer and length in cmd_length // Returns cmd_buffer char *read_command(char *cmd_buffer, uint16_t *cmd_length) { char c; *cmd_length = 0; puts(prompt); // our prompt do { c = sys_getc(); if (c == KEY_BACKSPACE) { // clear entered characters if possible if (*cmd_length > 0) { putc(c); cmd_buffer[*cmd_length-1] = 0; *cmd_length = *cmd_length - 1; } } else if (*cmd_length==512) continue; // only allow 512 characters in a command else if (c != KEY_TAB && c != KEY_RETURN && // TODO: autocomplete on TAB c != KEY_UP && c != KEY_DOWN && c != KEY_RIGHT && c != KEY_LEFT) { // TODO: command history using arrows // display the character and store in buffer putc(c); cmd_buffer[*cmd_length] = c; *cmd_length = *cmd_length + 1; } } while (c != KEY_RETURN); putc('\n'); return cmd_buffer; }
void commandLHW() { // CDのデータをHDDへ登録/削除する int p1 = sys_getc(); int no = getCaliValue(); // X版では全てをHDDに置くのでサポートしない sysVar[0] = 255; DEBUG_COMMAND("LHW %d,%d:\n",p1,no); }
void commandLL() { int type = sys_getc(); int link_no = getCaliValue(); int *var, _var = 0; int num, i; dridata *dfile = ald_getdata(DRIFILE_DATA, link_no - 1); WORD *data; if (dfile == NULL) { getCaliValue(); getCaliValue(); sysVar[0] = 255; return; } data = (WORD *)dfile->data; switch(type) { case 0: /* T2 */ var = getCaliVariable(); num = getCaliValue(); DEBUG_COMMAND("LL %d,%d,%d,%d:\n",type, link_no, _var, num); if (dfile->size < num * sizeof(WORD)) { WARNING("data shortage (req = %d, result = %d)\n", num, dfile->size/ sizeof(WORD)); /* sysVar[0] = 254; 大嘘*/ /* return; */ num = dfile->size / sizeof(WORD); } for (i = 0; i < num; i++) { #ifdef WORDS_BIGENDIAN *var = swap16(*data); var++; data++; #else *var = *data; var++; data++; #endif } break; case 1: _var = getCaliValue(); num = getCaliValue(); DEBUG_COMMAND_YET("LL1 not yet %d, %d\n", _var, num); sysVar[0] = 255; goto out; break; default: WARNING("Unknown LL command %d\n", type); goto out; } sysVar[0] = 0; out: ald_freedata(dfile); }
/*** Return the keyboard scan code and SHIFT/CAPSLOCK status ***/ void _0x94_getc(void) { char key; enable_interrupts(); // okay to have other interrupts while waiting for key entry key = sys_getc(); disable_interrupts(); // returned in EDX register current_process->cpu.edx = (uint32_t)key; }
void commandSX() { int device = sys_getc(); int sw = sys_getc(); switch(sw) { case 1: { /* フェード */ int time = getCaliValue(); int volume = getCaliValue(); int stop = getCaliValue(); mus_mixer_fadeout_start(device, time, volume, stop); DEBUG_COMMAND("SX %d,%d,%d,%d,%d:\n", device, sw, time, volume, stop); break; } case 2: { /* フェード終了確認 */ int *var = getCaliVariable(); boolean st; st = mus_mixer_fadeout_get_state(device); *var = (st ? 0 : 1); DEBUG_COMMAND("SX %d,%d:\n", device, sw); break; } case 3: { /* フェード強制終了 */ mus_mixer_fadeout_stop(device); DEBUG_COMMAND("SX %d,%d:\n", device, sw); break; } case 4: { /* ボリューム取得 */ int *var = getCaliVariable(); *var = mus_mixer_get_level(device); DEBUG_COMMAND("SX %d,%d:\n", device, sw); break; } default: SYSERROR("Unknown SX command\n"); } }
void commandSI() { /* 指定した音源の接続状態を var に取得 */ int type = sys_getc(); int *var = getCaliVariable(); if (type == 0) { /* MIDI */ *var = mus_midi_get_state() == TRUE ? 1 : 0; } else if (type == 1) { /* PCM */ *var = mus_pcm_get_state() == TRUE ? 1 : 0; } else if (type == 2) { /* CD */ *var = mus_cdrom_get_state() == TRUE ? 1 : 0; } DEBUG_COMMAND("SI %d,%d:\n",type,*var); }
void commandHH(void) { int fig = sys_getc(); int num = getCaliValue(); char s[256]; if( fig ) { char *ss="%%%dd"; char sss[256]; sprintf(sss,ss,fig); sprintf(s,sss,num); } else { sprintf(s,"%d",num); } sys_addMsg(s); DEBUG_COMMAND("HH %d,%d:\n",fig,num); }
void commandLE() { int type = sys_getc(); char *filename = sys_getString(':'); int *var, _var = 0; int num; switch(type) { case 0: /* T2 */ var = getCaliVariable(); num = getCaliValue(); sysVar[0] = save_load_var_with_file(filename, var, num); break; case 1: /* 456 */ _var = getCaliValue(); num = getCaliValue(); sysVar[0] = save_load_str_with_file(filename, _var, num); break; default: WARNING("Unknown LE command %d\n", type); return; } DEBUG_COMMAND("LE %d,%s,%d,%d:\n",type, filename, _var, num); }
void commandQE() { int type = sys_getc(); char *filename = sys_getString(':'); int *var, _var = 0, cnt; switch(type) { case 0: var = getCaliVariable(); cnt = getCaliValue(); sysVar[0] = save_save_var_with_file(filename, var, cnt); break; case 1: _var = getCaliValue(); cnt = getCaliValue(); sysVar[0] = save_save_str_with_file(filename, _var, cnt); break; default: WARNING("Unknown QE command %d\n", type); return; } WARN_SAVEERR("QE", sysVar[0]); DEBUG_COMMAND("QE %d,%s,%d,%d:\n", type, filename, _var, cnt); }
void commandSG() { /* MIDI演奏 */ static int loopcnt = 0; int sw = sys_getc(); int num, fnum, *var; midiplaystate st; switch(sw) { case 0: /* 演奏中のMIDIを停止する */ num = getCaliValue(); mus_midi_stop(); DEBUG_COMMAND("SG0 %d:\n", num); break; case 1: /* MIDIを演奏する */ num = getCaliValue(); if (num == 0) { mus_midi_stop(); } else { mus_midi_stop(); mus_midi_start(num, loopcnt); } DEBUG_COMMAND("SG1 %d:\n", num); break; case 2: /* MIDI演奏位置を1/100秒単位で取得する */ var = getCaliVariable(); mus_midi_get_playposition(&st); *var = st.loc_ms / 10; DEBUG_COMMAND("SG2 %p:\n", var); break; case 3: num = getCaliValue(); if (num == 0) { /* 演奏中のMIDIを一時停止する */ mus_midi_pause(); } else { /* 一時停止中のMIDIの一時停止を解除する */ mus_midi_unpause(); } DEBUG_COMMAND("SG3 %d:\n", num); break; case 4: num = getCaliValue(); /* 次のSG1コマンドでのMIDI演奏の繰り返し回数指定 */ loopcnt = num; DEBUG_COMMAND("SG4 %d:\n", num); break; case 5: fnum = getCaliValue() & 0x7f; num = getCaliValue(); mus_midi_set_flag(0, fnum, num); DEBUG_COMMAND("SG5 %d,%d:\n", fnum, num); break; case 6: fnum = getCaliValue() & 0x7f; num = getCaliValue(); mus_midi_set_flag(1, fnum, num); DEBUG_COMMAND("SG6 %d,%d:\n", fnum, num); break; case 7: fnum = getCaliValue() & 0x7f; var = getCaliVariable(); *var = mus_midi_get_flag(0, fnum); DEBUG_COMMAND("SG7 %d,%d:\n", fnum, *var); break; case 8: { fnum = getCaliValue() & 0x7f; var = getCaliVariable(); *var = mus_midi_get_flag(1, fnum); DEBUG_COMMAND("SG8 %d,%p:\n", fnum, var); break; } default: SYSERROR("Unknown SG command %d\n", sw); break; } }
int main (int argc, char **argv) { printf ("Welcome to the user process! (Ctrl - Z to exit)\n\n"); unsigned int i; unsigned int addr = 0; unsigned int val; char c; printf ("Specify a virtual address to read from or write to.\n"); printf("Enter the address: "); while (1) { i = sys_getc(); if (i == 0) continue; else if (i == 0x1a) { // exit when Ctrl-Z is entered printf("\nExiting from the user process.\n"); break; } else if (i == 0x0a || i == 0x0d) { // output new line printf("\n"); printf("Address entered: %u\n", addr); printf("Specify the action: r for read, w for write.\n"); while (1) { c = sys_getc(); if (c == 0) continue; printf("%c\n", c); if (c == 'r') { val = *((unsigned int*)addr); printf("The value at virtual address %u is %d.\n", addr, val); break; } else if (c == 'w') { printf("Enter the value you want to write to the address.\n"); printf("Value to write (from 0 to 9): "); while(1) { val = sys_getc(); if (val == 0 || val < '0' || val > '9') continue; printf("%c\n", val); *((unsigned int*)addr) = val - '0'; printf("Successfully wrote the value to the virtual address. You can double check it with the read command.\n"); break; } break; } else { printf("\nInvalid action.\n"); printf("Specify the action: r for read, w for write.\n"); } } addr = 0; printf ("\nSpecify a virtual address to read from or write to.\n"); printf("Enter the address: "); continue; } else if (i < '0' || i > '9') continue; else if (addr >= 0xffffffff / 10) { printf("\nAddress out of range.\n"); addr = 0; printf("Enter the address: "); continue; } addr = addr * 10 + i - '0'; printf("%c", i); } return 0; }