MODULE Control; (* by fred brooks logictek san diego ca PD software *) IMPORT GEMVDIbase, GEMAESbase, AESMenus, AESForms, AESObjects, AESEvents, AESResources ; FROM AESGraphics IMPORT GrafMouse; FROM AESObjects IMPORT ObjectDraw; FROM MYLIB IMPORT InitResource,Terminate, DeselectObject, dTree,MenuTree,x,y,w,h,InitWindow,CloseWindow; FROM SYSTEM IMPORT ADR,ADDRESS,CODE,TSIZE; FROM Strings IMPORT String, Concat; FROM XBIOS IMPORT SuperExec; FROM BIOS IMPORT DriveSet; FROM GEMDOS IMPORT ExecMode,Exec,Open,Close,Read,Write,Create; FROM Streams IMPORT StreamKinds; FROM M2Conversions IMPORT ConvertToCardinal; TYPE SequenceNr = [0..1]; control = RECORD magic : LONGCARD; USER : CARDINAL; REMOTEUSER : CARDINAL; reset : BOOLEAN; networkactive : BOOLEAN; remotedrive : CARDINAL; drivemap : DriveSet; nextframetosend : ARRAY [0..15] OF SequenceNr; frameexpected : ARRAY [0..15] OF SequenceNr; sendreset : BOOLEAN; END; consave = RECORD magic : LONGCARD; USER : CARDINAL; REMOTEUSER : CARDINAL; reset : BOOLEAN; networkactive : BOOLEAN; END; CONST resourcefilename = "ANETMIDI.RSC" ; RTS = 04E75H ; CONST ABOUT = 1 ; ABOUTOK = 1 ; MENU = 0 ; DESK = 3 ; MODE = 5 ; FILE = 4 ; USERID = 6 ; OPTIONS = 7 ; SEQ = 8 ; ABOUTNET = 11 ; QUIT = 21 ; LOAD = 20 ; INT = 23 ; MODE2 = 25 ; MODE1 = 24 ; REBOOTOK = 27 ; USERID1 = 29 ; USERID2 = 30 ; USERID3 = 31 ; USERID5 = 33 ; USERID4 = 32 ; USERID6 = 34 ; USERID7 = 35 ; USERID9 = 37 ; USERID8 = 36 ; USERID10 = 38 ; USERID11 = 39 ; USERID13 = 41 ; USERID12 = 40 ; USERID14 = 42 ; USERID15 = 43 ; USERID16 = 44 ; DRVA = 46 ; DRVB = 47 ; DRVD = 49 ; DRVC = 48 ; DRVE = 50 ; DRVF = 51 ; SEQUP = 53 ; S00 = 54 ; S10 = 55 ; S11 = 57 ; S01 = 56 ; VAR status : INTEGER; resourcename,nulls,on,off,netdrv : ARRAY [0..16] OF CHAR ; tempchar : ARRAY [0..2] OF CHAR; char : CHAR; result,handle : INTEGER ; done,OK : BOOLEAN; Cptr [0210H] : ADDRESS; Dptr [0214H] : DriveSet; Mptr [0218H] ,count : LONGCARD; C : POINTER TO control; CSAVE : POINTER TO consave; drvnr,i,usernumber,e : CARDINAL; idnumber : ARRAY [0..15] OF String; PROCEDURE DoAboutDialog ; BEGIN AESResources.ResourceGetAddr(GEMAESbase.RTree,ABOUT,dTree) ; AESForms.FormCenter(dTree,x,y,w,h) ; AESForms.FormDialogue(GEMAESbase.FormStart,0,0,0,0,x,y,w,h) ; AESForms.FormDialogue(GEMAESbase.FormGrow,0,0,0,0,x,y,w,h) ; ObjectDraw(dTree,0,10,x,y,w,h) ; result := AESForms.FormDo(dTree,-1) ; DeselectObject(ABOUT,ABOUTOK) ; AESForms.FormDialogue(GEMAESbase.FormShrink,0,0,0,0,x,y,w,h) ; AESForms.FormDialogue(GEMAESbase.FormFinish,0,0,0,0,x,y,w,h) ; END DoAboutDialog ; (* ------------------------------------------------------------------- *) PROCEDURE Events ; (* Handle resource events *) VAR pipeBuff : ARRAY [0..9] OF INTEGER ; PROCEDURE SelectMenu( Menu, Item : INTEGER ) ; BEGIN CASE Menu OF DESK : IF Item = ABOUTNET THEN DoAboutDialog ; END ; | FILE : CASE Item OF LOAD : C^.networkactive:=(NOT C^.networkactive); | QUIT : done := TRUE ; | ELSE END ; IF C^.networkactive THEN AESMenus.MenuText(MenuTree,LOAD,ADR(on)); ELSE AESMenus.MenuText(MenuTree,LOAD,ADR(off)); END; | MODE : CASE Item OF INT : Create("ANETMIDI.INT",0,handle); count:=TSIZE(consave); Write(handle,count,CSAVE); OK:=Close(handle); | REBOOTOK : CODE(03F3CH,0020H,04E41H, 042B9H,0,0420H,042B9H,0,043AH, 02079H,0,4,04ED0H) ; | ELSE END ; | USERID : CASE Item OF USERID1 : i:=0 ; | USERID2 : i:=1 ; | USERID3 : i:=2 ; | USERID4 : i:=3 ; | USERID5 : i:=4 ; | USERID6 : i:=5 ; | USERID7 : i:=6 ; | USERID8 : i:=7 ; | USERID9 : i:=8 ; | USERID10 : i:=9 ; | USERID11 : i:=10 ; | USERID12 : i:=11 ; | USERID13 : i:=12 ; | USERID14 : i:=13 ; | USERID15 : i:=14 ; | USERID16 : i:=15 ; | ELSE END ; AESMenus.MenuItemCheck(MenuTree,29+C^.REMOTEUSER,0); FOR e:=0 TO 30 DO IF (idnumber[0][e]=0C) OR (idnumber[0][e]= "=") THEN idnumber[0][e]:=0C; END; END; ConvertToCardinal(idnumber[0],OK,usernumber); IF OK THEN C^.USER := usernumber; (* set local id *) END; FOR e:=0 TO 30 DO IF (idnumber[i][e]=0C) OR (idnumber[i][e]= "=") THEN idnumber[i][e]:=0C; END; END; ConvertToCardinal(idnumber[i],OK,usernumber); IF OK THEN C^.REMOTEUSER := usernumber; (* set remote id *) END; AESMenus.MenuItemCheck(MenuTree,29+C^.REMOTEUSER,1); | SEQ : CASE Item OF SEQUP : C^.sendreset:= TRUE ; | ELSE END ; | ELSE END ; (* put header back normal*) AESMenus.MenuItemCheck(MenuTree,S00,0); AESMenus.MenuItemCheck(MenuTree,S10,0); AESMenus.MenuItemCheck(MenuTree,S01,0); AESMenus.MenuItemCheck(MenuTree,S11,0); IF (C^.nextframetosend[C^.REMOTEUSER]=0) AND (C^.frameexpected[C^.REMOTEUSER]=0) THEN AESMenus.MenuItemCheck(MenuTree,S00,1); END; IF (C^.nextframetosend[C^.REMOTEUSER]=1) AND (C^.frameexpected[C^.REMOTEUSER]=0) THEN AESMenus.MenuItemCheck(MenuTree,S10,1); END; IF (C^.nextframetosend[C^.REMOTEUSER]=0) AND (C^.frameexpected[C^.REMOTEUSER]=1) THEN AESMenus.MenuItemCheck(MenuTree,S01,1); END; IF (C^.nextframetosend[C^.REMOTEUSER]=1) AND (C^.frameexpected[C^.REMOTEUSER]=1) THEN AESMenus.MenuItemCheck(MenuTree,S11,1); END; AESMenus.MenuTitleNormal(MenuTree,Menu,1) ; END SelectMenu ; BEGIN GrafMouse(GEMAESbase.Arrow,NIL) ; (* put pointing mouse *) done := FALSE ; REPEAT AESEvents.EventMessage(ADR(pipeBuff)) ; CASE pipeBuff[0] OF (* message type *) GEMAESbase.MenuSelected : SelectMenu(pipeBuff[3],pipeBuff[4]) ; | GEMAESbase.WindowClosed : done := TRUE ; | ELSE END ; UNTIL done ; END Events ; (*$P- *) (* set vector to control record *) PROCEDURE getcontrol; BEGIN C := Cptr; CSAVE := Cptr; CODE(RTS); END getcontrol; BEGIN nulls:=" "; on :=" ON "; off:=" OFF "; SuperExec(PROC(getcontrol)); IF C^.magic#3141592653 THEN Exec(loadExecute,"ANETMIDI.PRG",nulls,nulls,result); IF result<0 THEN HALT END; SuperExec(PROC(getcontrol)); END; Open("ANETMIDI.INT",0,handle); IF handle>0 THEN (* if there is, load in init file *) count:=TSIZE(consave); Read(handle,count,CSAVE); OK:=Close(handle); END; Open("ANETMIDI.ID",0,handle); IF handle>0 THEN (* if there is, load in user file *) count:=1; FOR i:=0 TO 15 DO LOOP Read(handle,count,ADR(char)); IF (char=12C) THEN EXIT END; IF (char=12C) OR (char=15C) THEN char:=0C END; tempchar[0]:=char; Concat(idnumber[i],tempchar,idnumber[i]); END; END; OK:=Close(handle); ELSE result:=AESForms.FormAlert(1,"[3][You must have a ANETMIDI.ID|in this directory!][DARN]"); HALT; END; resourcename:=resourcefilename ; IF InitResource(resourcename,MENU) THEN FOR e:=29 TO 44 DO AESMenus.MenuText(MenuTree,e,ADR(idnumber[e-29])); END; AESMenus.MenuItemCheck(MenuTree,29+C^.REMOTEUSER,1); netdrv:=" DRV A = F"; drvnr:=2; WHILE drvnr IN C^.drivemap DO INC(drvnr); END; (* while *) INC(drvnr); netdrv[6]:="A"; netdrv[10]:=CHAR(041H+drvnr); AESMenus.MenuText(MenuTree,DRVA,ADR(netdrv)); netdrv[6]:="B"; netdrv[10]:=CHAR(041H+drvnr+1); AESMenus.MenuText(MenuTree,DRVB,ADR(netdrv)); netdrv[6]:="C"; netdrv[10]:=CHAR(041H+drvnr+2); AESMenus.MenuText(MenuTree,DRVC,ADR(netdrv)); netdrv[6]:="D"; netdrv[10]:=CHAR(041H+drvnr+3); AESMenus.MenuText(MenuTree,DRVD,ADR(netdrv)); netdrv[6]:="E"; netdrv[10]:=CHAR(041H+drvnr+4); AESMenus.MenuText(MenuTree,DRVE,ADR(netdrv)); netdrv[6]:="F"; netdrv[10]:=CHAR(041H+drvnr+5); AESMenus.MenuText(MenuTree,DRVF,ADR(netdrv)); CASE C^.remotedrive OF (* PLACE CHECK IN REMOTE MENU *) 0 : AESMenus.MenuItemCheck(MenuTree,DRVA,1); | 1 : AESMenus.MenuItemCheck(MenuTree,DRVB,1); | 2 : AESMenus.MenuItemCheck(MenuTree,DRVC,1); | 3 : AESMenus.MenuItemCheck(MenuTree,DRVD,1); | 4 : AESMenus.MenuItemCheck(MenuTree,DRVE,1); | 5 : AESMenus.MenuItemCheck(MenuTree,DRVF,1); | ELSE END; IF C^.networkactive THEN AESMenus.MenuText(MenuTree,LOAD,ADR(on)); ELSE AESMenus.MenuText(MenuTree,LOAD,ADR(off)); END; (* AESMenus.MenuItemCheck(MenuTree,S00,0); AESMenus.MenuItemCheck(MenuTree,S10,0); AESMenus.MenuItemCheck(MenuTree,S01,0); AESMenus.MenuItemCheck(MenuTree,S11,0); *) IF (C^.nextframetosend[C^.REMOTEUSER]=0) AND (C^.frameexpected[C^.REMOTEUSER]=0) THEN AESMenus.MenuItemCheck(MenuTree,S00,1); END; IF (C^.nextframetosend[C^.REMOTEUSER]=1) AND (C^.frameexpected[C^.REMOTEUSER]=0) THEN AESMenus.MenuItemCheck(MenuTree,S10,1); END; IF (C^.nextframetosend[C^.REMOTEUSER]=0) AND (C^.frameexpected[C^.REMOTEUSER]=1) THEN AESMenus.MenuItemCheck(MenuTree,S01,1); END; IF (C^.nextframetosend[C^.REMOTEUSER]=1) AND (C^.frameexpected[C^.REMOTEUSER]=1) THEN AESMenus.MenuItemCheck(MenuTree,S11,1); END; Events ; END; Terminate ; END Control.