From df479e6336f205dd92c863f4d222ec0170df4c97 Mon Sep 17 00:00:00 2001 From: Julian Barathieu Date: Sat, 18 May 2019 19:09:46 +0200 Subject: [PATCH] beep and commands --- kaleid/extras/argv.c | 8 +++++--- kaleid/kernel/io/spkr.c | 43 ++++++++++++++++++++------------------- kaleid/kernel/sh/shcmds.c | 33 ++++++++++++++++++++++-------- kaleid/kernel/sh/shell.c | 2 +- 4 files changed, 53 insertions(+), 33 deletions(-) diff --git a/kaleid/extras/argv.c b/kaleid/extras/argv.c index 1227a03..6f58753 100644 --- a/kaleid/extras/argv.c +++ b/kaleid/extras/argv.c @@ -25,6 +25,8 @@ #include #include +#include + // // Computes argument count, the least N such // that argv[N] == NULL @@ -75,7 +77,7 @@ error_t KalCmdLineToArgVecEx(const char *cmdLine, char **argv, bool doEscaping) { - int argc; + int argc = 0; char quotes = 0; bool started = false; bool escaping = false; @@ -92,7 +94,7 @@ error_t KalCmdLineToArgVecEx(const char *cmdLine, // Macro'd to avoid copypasting code #define NULLTERM_AND_SAVE \ *buffer = 0; \ - argv[++argc] = buffer++ + 1; \ + argv[++argc] = ++buffer; \ written += sizeof(char *) + 1; \ // Is character a blank character? @@ -106,7 +108,7 @@ error_t KalCmdLineToArgVecEx(const char *cmdLine, // Go through the command line - for (argc = 0; *cmdLine; cmdLine++) { + for (; *cmdLine; cmdLine++) { // Make sure we don't go beyond ARG_MAX bytes if (written >= ARG_MAX - (1 + sizeof(char *))) { diff --git a/kaleid/kernel/io/spkr.c b/kaleid/kernel/io/spkr.c index 7221b66..92f0957 100644 --- a/kaleid/kernel/io/spkr.c +++ b/kaleid/kernel/io/spkr.c @@ -27,13 +27,13 @@ void IoStartSpeaker(int freq) { - char temp; - int pitf = 1193180 / freq; + uchar temp; + uint pitf = 1193180 / freq; ulong flags = KePauseIRQs(); IoWriteByteOnPort(0x43, 0xB6); - IoWriteByteOnPort(0x42, (char)pitf); - IoWriteByteOnPort(0x42, (char)(pitf >> 8)); + IoWriteByteOnPort(0x42, (uchar)pitf); + IoWriteByteOnPort(0x42, (uchar)(pitf >> 8)); temp = IoReadByteFromPort(0x61); if (temp != (temp | 3)) { @@ -44,14 +44,9 @@ void IoStartSpeaker(int freq) void IoQuietSpeaker(void) { + ulong flags = KePauseIRQs(); IoWriteByteOnPort(0x61, IoReadByteFromPort(0x61) & 0xFC); -} - -void IoDoBeep(void) -{ - IoStartSpeaker(1000); - KeDelayExecution(100); - IoQuietSpeaker(); + KeRestoreIRQs(flags); } void IoDoTone(uint tone, uint time) @@ -61,28 +56,34 @@ void IoDoTone(uint tone, uint time) IoQuietSpeaker(); } +void IoDoBeep(void) +{ + IoDoTone(1000, 100); +} + void IoDoStarWars(void) { + size_t i; + struct Note { uint tone; uint time; }; - struct Note Score[40] = { {440, 200}, {110, 200}, {440, 200}, {110, 200}, - {440, 200}, {110, 200}, {349, 140}, {87, 100}, - {523, 60}, {87, 100}, {440, 200}, {110, 200}, - {349, 140}, {87, 100}, {523, 60}, {87, 100}, + struct Note score[] = { {440, 200}, {110, 200}, {440, 200}, {110, 200}, + {440, 200}, {110, 200}, {349, 140}, {87, 100}, + {523, 60}, {87, 100}, {440, 200}, {110, 200}, + {349, 140}, {87, 100}, {523, 60}, {87, 100}, {440, 200}, {110, 200}, {440, 200}, {110, 200}, {659, 200}, {110, 200}, {659, 200}, {110, 200}, {659, 200}, {87, 200}, {698, 140}, {87, 100}, - {523, 60}, {87, 100}, {415, 200}, {87, 200}, - {349, 140}, {87, 100}, {523, 60}, {87, 100}, + {523, 60}, {87, 100}, {415, 200}, {87, 200}, + {349, 140}, {87, 100}, {523, 60}, {87, 100}, {440, 200}, {110, 200}, {110, 200}, {110, 200} - } ; + }; - for (int i=0; i<40 ; i++) { - IoDoTone(Score[i].tone, Score[i].time); - KePauseCPU(); + for (i = 0; i < sizeof(score)/sizeof(struct Note); i++) { + IoDoTone(score[i].tone, score[i].time); } } diff --git a/kaleid/kernel/sh/shcmds.c b/kaleid/kernel/sh/shcmds.c index feb2125..d4cff47 100644 --- a/kaleid/kernel/sh/shcmds.c +++ b/kaleid/kernel/sh/shcmds.c @@ -26,12 +26,7 @@ error_t CmdBeep(int argc, char **argv, char *cmdline) { - if (rand() % 64 == 0 || (argc > 1 && !strcmp(argv[1], "starwars"))) { - IoDoStarWars(); - } - - else IoDoBeep(); - + IoDoBeep(); return EOK; } @@ -240,6 +235,19 @@ error_t CmdPF(int argc, char **argv, char *cmdline) return EOK; } +error_t CmdArgs(int argc, char **argv, char *cmdline) +{ + int i; + + KernLog("cmdline: '%s'\nargc: %d\n", cmdline, argc); + + for (i = 0; i < argc; i++) { + KernLog("argv[%d]: '%s'\n", i, argv[i]); + } + + return EOK; +} + void MmInitPaging(void); error_t CmdReloadPage(int argc, char **argv, char *cmdline) @@ -249,6 +257,13 @@ error_t CmdReloadPage(int argc, char **argv, char *cmdline) } extern void KeStartShell(void); + +error_t CmdShell(int argc, char **argv, char *cmdline) +{ + KeStartShell(); + return EOK; +} + error_t CmdStackOverflow(int argc, char **argv, char *cmdline) { CmdStackOverflow(0, 0, 0); @@ -259,20 +274,22 @@ error_t CmdStackOverflow(int argc, char **argv, char *cmdline) Command_t cmdtable[] = { + { "args", CmdArgs, "Print command line" }, { "beep", CmdBeep, "Make a beep" }, { "cls", CmdClear, "Clears standard output" }, { "date", CmdDate, "Print date" }, { "die", CmdDie, "Die painfully" }, { "exit", CmdQuit, "Initiate shutdown" }, { "help", CmdHelp, "Show this message" }, - { "rpag", CmdReloadPage, "Reload the pages directory" }, + { "rpag", CmdReloadPage, "Reload the pages directory" }, { "march", CmdStarWars, "Play the Imperial March"}, { "mmap", CmdMemMap, "Show memory map" }, { "musage", CmdMemUsage, "Show memory statistics" }, { "pfault", CmdPF, "Provoke a PF. Usage : pfault
" }, { "pstest", CmdPsTest, "Scheduler test routine" }, { "quit", CmdQuit, "Alias for 'exit'" }, - { "so", CmdStackOverflow, "Provoke a stack overflow" }, + { "shell", CmdShell, "Start a new shell (nested)", }, + { "stkov", CmdStackOverflow, "Provoke a stack overflow" }, { "time", CmdTime, "Print time" }, { NULL, NULL, NULL } }; diff --git a/kaleid/kernel/sh/shell.c b/kaleid/kernel/sh/shell.c index 4d931a9..840b3be 100644 --- a/kaleid/kernel/sh/shell.c +++ b/kaleid/kernel/sh/shell.c @@ -96,7 +96,7 @@ void KeStartShell(void) break; case KEY_BEL: - if (rand() % 64 == 0) { + if (rand() % 16 == 0) { IoDoStarWars(); } else IoDoBeep();