// GKPROC.SR	Initiallize keyboard handler for GYPSY

get "BRAVO.DF";

// Incoming Procedures

external [
	DisableInterrupts
	EnableInterrupts
	CreateKeyboard
	swat;
	array;
	movestack;
	loadcore;
	move;
	hplay
	];

// Incoming Statics

external
	[
	linkCursorToMouse
	Saved335
	begofopsys
	diskBitTable
	diskBTsize
	lastSN
	LASTSN1
	LASTSN2
	BITTABLE
	stackroot
	ozone
	]

// Outgoing Procedures

external [
	initkbd
	boot
	getchar
	endofkeystream
	];

// Outgoing Statics

external [
	SavedFinish
	SavedKeyProcess
	cominstream
	];

// Local Statics

static [
	SavedFinish
	SavedKeyProcess
	cominstream
	]; 

manifest [
	AdrAdrFinish=#353 //Holds address of finish code
	bootCommand=#100000 // arg of StartIO to boot
	KeyProcess=12
	interruptVector = #500
	keystreaml = 50;
	]

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+1) 
SavedFinish=@AdrAdrFinish //Save finish code
@AdrAdrFinish=boot+4 //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 ] 

// ** begin GYPSY addition
let repeatable = table [ // see GKBD.SR for RKE explanation
//	0; 1; #2; 0; 0	// LF key
//	2; 1; #2; 0; 0	// DEL key
	0; 0; #1; 0; 0	// BS key
	1; 0; #1; 0; 0	// top blank key
	] // also must mark "rept" in table of GKBD.SR
let lrepeatable = 10 ; // **
// ** END GYPSY ADDITION

CreateKeyboard(KeyProcess, stackspace,100, cominstream,keystreaml,
			repeatable,lrepeatable) // **
linkCursorToMouse = true
]

and boot() be
	[
	let StartIO = table [ #61004 ; #1401 ] ;
	StartIO(bootCommand)
	swat("boot failed, please push manual boot button.  ")
	]

and getchar() = valof
	[
	let proc = cominstream >> STREAM.gets
	resultis proc(cominstream)
	]


and endofkeystream() = valof
	[
	let proc = cominstream >> STREAM.endof
	resultis proc(cominstream)
	]