diff --git a/emulator.pas b/emulator.pas index 6c728ab..1abaa0c 100644 --- a/emulator.pas +++ b/emulator.pas @@ -31,7 +31,7 @@ const {$endif} var - Hlt, ASCII, Verbose: boolean; //Halt, ASCII, and verbose flags + Hlt, Verbose: boolean; //Halt, ASCII, and verbose flags Op, Regs: 0 .. $f; //Opcode X, Y: 0 .. 3; //Register arguments Addr, IP, RP: word; //Immediate or address argument and instruction and return pointers @@ -87,42 +87,22 @@ begin wait; {$endif} //Read a keypress - repeat Ch := ReadKey; - //Check for non-ASCII keys - if Ch = ansichar (0) then begin - //Non-ASCII - if keypressed then begin - Scan := ReadKey; - //The delete key inserts the delete character - if Scan = ansichar ($53) then begin - Ch := ansichar ($7f); - ASCII := true; - end - //Unused function keys insert a null - else ASCII := true; - end - //Null - else ASCII := true; - end - //Other ASCII - else ASCII := true; - until ASCII = true; - //Bodge for the home and end keys - if Ch = ansichar ($37) then begin + //Handle non-character keys + if Ch = ansichar (0) then begin if keypressed then begin Scan := ReadKey; - Scan := ReadKey; - Scan := ReadKey; - Ch := ansichar (0); + //The delete key inserts the delete character + if Scan = ansichar ($53) then Ch := ansichar ($7f); end; end - else if Ch = ansichar ($38) then begin + //Bodge for the CRT unit not working perfectly in Linux + else if Ch <= ansichar ($7f) then begin if keypressed then begin - Scan := ReadKey; - Scan := ReadKey; - Scan := ReadKey; Ch := ansichar (0); + repeat + scan := ReadKey; + until keypressed = false; end; end; //Process the keypress @@ -342,7 +322,7 @@ begin while Hlt = false do begin //Print the CPU state to StdErr - if Verbose = true then writeln (StdErr, 'IR: ', IntToHex (Op, 1), IntToHex (Regs, 1), IntToHex (Addr, 4), '; IP: ', IntToHex (IP, 4), ', RP: ', IntToHex (RP, 4), '; R0: ', IntToHex (R[0], 2), ', R1: ', IntToHex (R[1], 2), ', R2: ', IntToHex (R[2], 2), ', R3: ', IntToHex (R[3], 2), ansichar ($d)); + if Verbose = true then writeln (StdErr, 'IR: ', IntToHex (Op, 1), IntToHex (Regs, 1), IntToHex (Addr, 4), '; IP: ', IntToHex (IP, 4), ', RP: ', IntToHex (RP, 4), '; R0: ', IntToHex (R[0], 2), ', R1: ', IntToHex (R[1], 2), ', R2: ', IntToHex (R[2], 2), ', R3: ', IntToHex (R[3], 2), ansichar ($d)); //Fetch the instruction and increment the instruction pointer //Fetch the opcode and register arguments diff --git a/readme.md b/readme.md index fc818d5..2d5bb12 100644 --- a/readme.md +++ b/readme.md @@ -100,10 +100,10 @@ of RAM respectively instead and the speed limitations can be removed with the argument -dfast. Input and output are handled by an emulated glass teletype terminal with -local echo. Note that of the control characters only bell, backspace, -line feed, and carriage return are used by the terminal, and the -backspace and delete keys are tied to their respective characters and -non-character keys to null. +local echo. Of the control characters only bell, backspace, line feed, +and carriage return are used by the terminal. The backspace and delete +characters are tied to their respective keys, and non-character keys +input null. In Linux the emulator can be compiled with support for a character printer and an emulated punched tape reader and punch with the arguments