// XKBD.SR Initiallize keyboard handler for Bravo // Last modified November 3, 1979 2:53 PM by Taft get "BRAVO1.DF"; get "CHAR.DF"; get "DOC.DF"; get "SELECT.DF"; get "rn1.df" get "com.df" // Incoming Procedures external [ DisableInterrupts EnableInterrupts CreateKeyboard swat; array; movestack; loadcore; move; hplay puts; gets; flushfn; confirm; stnum; stappend; deleted; inserta; updatedisplay; inserttx; getint; setsel; SetRegionW SetRegionA SetRegionSys ClearBuf InsertBuf augmentomseq; deactivateomseq; blinkscreen; bravoFinish; GetFromRB RBempty GetCharReplay; ComReplay; ]; // Incoming Statics external [ vrlwsys linkCursorToMouse Saved335 begofopsys diskBitTable diskBTsize lastSN LASTSN1 LASTSN2 BITTABLE stackroot ozone tsread tscorrect fnts tstoflush tsmacro mpfnof ccommand tsbreak tsstop tsquick sbstate rgmaccp sbtermesc vcp selaux; vfhpsp; OsBuffer; ] // Outgoing Procedures external [ initkbd // boot getchar endofkeystream bravochar; tsflush; resetts; tsmode; setreplay; tsmakegood; PutItem; putsonts; ]; // Outgoing Statics external [ SavedFinish SavedKeyProcess cominstream SavedParityProcess ]; // Local Statics static [ SavedFinish SavedKeyProcess cominstream SavedParityProcess ]; manifest [ AdrAdrFinish=#353 //Holds address of finish code bootCommand=#100000 // arg of StartIO to boot KeyProcess=12 interruptVector = #500 keystreaml = 50; ParityProcess = 1; ] let initkbd() be [ // cominstream = table [ // 0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0; // 0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0; // 0;0;0;0;0;0;0;0;0;0; // ] ; // SavedKeyProcess = @(interruptVector+KeyProcess) // SavedFinish=@AdrAdrFinish //Save finish code // SavedParityProcess = @(interruptVector+ParityProcess); // @(interruptVector+ParityProcess) = PARTY; // @AdrAdrFinish=bravoFinish //On finish, try recovery let stackspace = table [ 0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0; 0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0; 0;0;0;0;0;0;0;0;0;0; 0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0; 0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0; 0;0;0;0;0;0;0;0;0;0 ] CreateKeyboard(KeyProcess, stackspace,100) linkCursorToMouse = true ] //and boot() be // [ // let StartIO = table [ #61004 ; #1401 ] ; // StartIO(bootCommand) // swat("boot failed, please push manual boot button. ") // ] and getchar() = GetFromRB() and endofkeystream() = RBempty() // B R A V O C H A R // and bravochar( ) = valof [ let tchar = nil; test tsread ifso [ let tchar = GetCharReplay() resultis tchar ] ifnot [ tchar = getchar( ); if tscorrect then [ if (tchar eq chesc) then [ tscorrect = false; tsread = true; ] resultis tchar; ] puts(fnts,tchar); if tchar eq chat then puts(fnts,chat); tsmakegood(); if tstoflush eq 0 then tsflush( ); tstoflush = tstoflush-1; resultis tchar; ] ] // T S F L U S H // and tsflush( ) be [ flushfn(fnts); tstoflush = 20; ] // R E S E T T S // and resetts( ) be [ (mpfnof ! fnts) >> OF.pos = (mpfnof ! fnts) >> OF.pos-2; ] // T S M O D E // and tsmode() be [ ccommand = ccommand+1; if ccommand eq tsbreak then tsstop = true; if tsread & not tsmacro & (tsstop % not endofkeystream()) then ComReplay(); ] // S E T R E P L A Y // and setreplay() be [ tsread = true; tsquick = true; tsstop = false; tsbreak = -1; ] // T S M A K E G O O D // and tsmakegood() be [ let tpage = ((mpfnof ! fnts) >> OF.pos) << PCD.p; puts(fnts,chat); puts(fnts,$E); if ((mpfnof ! fnts) >> OF.pos) << PCD.p ne tpage then tsflush(); (mpfnof ! fnts) >> OF.pos = (mpfnof ! fnts) >> OF.pos-2; ] // P U T I T E M // // and PutItem(i) = valof // [ let newIn = OsBuffer>>OsBUF.In+1; // if newIn eq OsBuffer>> OsBUF.Last then newIn = OsBuffer>>OsBUF.First // if newIn eq OsBuffer>> OsBUF.Out then resultis 0 // @(OsBuffer>>OsBUF.In) = i // OsBuffer>>OsBUF.In = newIn // resultis -1; // ] // P U T S O N T S // and putsonts(char) be [ puts(fnts,char) tsmakegood() tsflush() ]