diff --git a/Common/EmulatorTypes.pas b/Common/EmulatorTypes.pas index c9305c0..fb3ea5d 100644 --- a/Common/EmulatorTypes.pas +++ b/Common/EmulatorTypes.pas @@ -347,7 +347,7 @@ const $f8, $f9, $7a, $5e, $4c, $7e, $6e, $6f, $7c, $c1, $c2, $c3, $c4, $c5, $c6, $c7, $c8, $c9, $d1, $d2, $d3, $d4, $d5, $d6, - $d7, $d8, $d9, $e2, $e3, $e4, $e5, $d6, + $d7, $d8, $d9, $e2, $e3, $e4, $e5, $e6, $e7, $e8, $e9, $4a, $e0, $5a, $5f, $6d, $79, $81, $82, $83, $84, $85, $86, $87, $88, $89, $91, $92, $93, $94, $95, $96, diff --git a/U494/Source/MOS.pjt b/U494/Source/MOS.pjt index 88c1a1b..2da494c 100644 --- a/U494/Source/MOS.pjt +++ b/U494/Source/MOS.pjt @@ -28,13 +28,13 @@ SysSetCwd='C:\Development\Emulators\U9030\Source' SrchSetFlags=0x4418600b FileSortMode=0x0 StateWindowFrame=12,0,959,1087,0x63097f08 -_StateWindow=26,26,478,561,0x00100010,'C:\Development\Emulators\U9030\Source\BemFstatus.asm',208,31,212,4,20,12,46,26,126,176,8,4294967295,4294967295,1,10,'',12,255,48,72,10,467,0,0,721,252,249,169,34,400,0,212,214,210,220,721,721,720,729,217,80,0,223,224,14,124,1,208,1,6 -_StateBuffer='C:\Development\Emulators\U9030\Source\BemFstatus.asm',0x0400048a,169,34,25,'10 16 40 50 60 72','',0x1,'',1,72,1 -_StateHistory=FILELIST,'C:\Development\Emulators\U9030\Source\SaveCopin.jcl','C:\Development\Emulators\U9030\Source\BemSimulator.jcl','C:\Development\Emulators\U9030\Source\BemVtoc.asm','C:\Development\Emulators\U9030\Source\BemHlp.asm','C:\Development\Emulators\U9030\Source\BemLib.asm','C:\Development\Emulators\U9030\Source\BemSimulator.asm','C:\Development\Emulators\U9030\Source\BemFstatus.asm','C:\Development\Emulators\U9030\Source\LibTest.asm','C:\Development\Emulators\U9030\Source\SaveBemDsects.jcl' -_StateHistory=SEARCH,'4(R14)','NOT','EOJ','=h22','dx','LBH$SIZE','LINTMPLT','LINTPLT','LINSTRT','X\'25\'' +_StateWindow=104,104,478,561,0x00100010,'C:\Development\Emulators\U9030\Source\icam3.asc',208,31,212,4,20,12,46,26,126,176,8,4294967295,4294967295,1,10,'',12,255,48,72,10,467,0,0,721,252,249,2,29,400,0,212,214,210,220,721,721,720,729,217,80,0,223,224,14,1,1,208,1,6 +_StateBuffer='C:\Development\Emulators\U9030\Source\icam3.asc',0x0400048a,2,29,25,'6 12 17 22 27 32 37 41','',0x1,'',1,72,1 +_StateHistory=FILELIST,'C:\Development\Emulators\U9030\Source\SaveBemDsects.jcl','C:\Development\Emulators\U9030\Source\BadCmd.asm','C:\Development\Emulators\U9030\Source\BemDelete.asm','C:\Development\Emulators\U9030\Source\BemSimulator.asm','C:\Development\Emulators\U9030\Source\BemDisplay.asm','C:\Development\Emulators\U9030\Source\BemFstatus.asm','C:\Development\Emulators\U9030\LNS.notrace.cfg','C:\Development\Emulators\U9030\Source\icam3.asc','C:\Development\Emulators\U9030\Source\icam.asc' +_StateHistory=SEARCH,'ALIASES','JTIMASK','PCNTKN','PC3','DOHALT','EOJMSG','INIT','RETURN','INVCMD','PC$' _StateHistory=REPLACE,'.' _StateHistory=XSYMBOL,'OUTPUT','ERROR','INPUT','FILE' -_StateHistory=EDITFILE,'C:\Development\Emulators\U9030\Source\BemSimulator.jcl','C:\Development\Emulators\U9030\Source\BemVtoc.asm','C:\Development\Emulators\U9030\Source\BemHlp.asm','C:\Development\Emulators\U9030\Source\BemLib.asm','C:\Development\Emulators\U9030\Source\SaveBemDsects.jcl','C:\Development\Emulators\U9030\Source\LibTest.asm','C:\Development\Emulators\U9030\Source\BemSimulator.asm','C:\Development\Emulators\U9030\Source\BemFstatus.asm','C:\Development\Emulators\U9030\Source\LibTest.asm','C:\Development\Emulators\U9030\Source\SaveBemDsects.jcl' +_StateHistory=EDITFILE,'C:\Development\Emulators\U9030\Source\BadCmd.asm','C:\Development\Emulators\U9030\Source\BemDelete.asm','C:\Development\Emulators\U9030\Source\BemSimulator.asm','C:\Development\Emulators\U9030\Source\BemDisplay.asm','C:\Development\Emulators\U9030\Source\BemFstatus.asm','C:\Development\Emulators\U9030\Source\icam.asc','C:\Development\Emulators\U9030\Source\icam3.asc','C:\Development\Emulators\U9030\LNS.notrace.cfg','C:\Development\Emulators\U9030\Source\icam3.asc','C:\Development\Emulators\U9030\Source\icam.asc' _StateHistory=DIRECTORY,'c:\tmp\$Y$MAC','C:\tmp\$Y$SRC','C:\TMP','C:\tmp','C:\tmp\$Y$GEN','C:\TMP\$Y$MAC','C:\tmp\$Y$MAC' _StateHistory=GOTOMARK,'2','1','2','1','2','1','2','1','2','1' diff --git a/U9030/Cpu.pas b/U9030/Cpu.pas index 6e9437b..39e9475 100644 --- a/U9030/Cpu.pas +++ b/U9030/Cpu.pas @@ -1436,6 +1436,9 @@ var n: AnsiString; isSym: Boolean; begin + i := match and $f00; + if ((i <> 0) and (i <> $100) and (i <> $300)) then + raise ESpecificationException.Create('Unsupported DIAG option'); if (match = $100) then begin // This shit makes no sense to me. I have implemented this based on what I @@ -1560,7 +1563,7 @@ var psw.CondCode := 0; FRegisters[PSW.RegisterSet, r] := switchList - FRelocateReg; FRegisters[PSW.RegisterSet, r + 1] := TWord(tcb - FRelocateReg); - Break; + Exit; end; end else if (skipUntil = tcb) then skipUntil := 0; diff --git a/U9030/Docs/U9030.odt b/U9030/Docs/U9030.odt index 9d5c7b8..ced3ba1 100644 Binary files a/U9030/Docs/U9030.odt and b/U9030/Docs/U9030.odt differ diff --git a/U9030/Docs/U9030.pdf b/U9030/Docs/U9030.pdf index 38b599a..84b5360 100644 Binary files a/U9030/Docs/U9030.pdf and b/U9030/Docs/U9030.pdf differ diff --git a/U9030/Setup/U9030.iss b/U9030/Setup/U9030.iss index ba6d643..d9ee11f 100644 --- a/U9030/Setup/U9030.iss +++ b/U9030/Setup/U9030.iss @@ -2,7 +2,7 @@ ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! #define MyAppName "Univac 90/30 Emulator" -#define MyAppVerName "Univac 90/30 Emulator Univac 90/30 Emulator1.0" +#define MyAppVerName "Univac 90/30 Emulator 1.0" #define MyAppPublisher "LNS Software Systems" #define MyAppExeName "U9030.exe" @@ -39,7 +39,8 @@ Source: ..\Win32\Debug\U200TN.exe; DestDir: {app}; Flags: ignoreversion Source: ..\Win32\Debug\U9030Print.exe; DestDir: {app}; Flags: ignoreversion Source: ..\Disks\SDIVSB.8418; DestDir: {commonappdata}\Univac 9030 Emulator\Data; Permissions: users-full Source: ..\Disks\VSBRES.8418; DestDir: {commonappdata}\Univac 9030 Emulator\Data; Permissions: users-full -Source: ..\Disks\REL042.8418; DestDir: {commonappdata}\Univac 9030 Emulator\Data; Permissions: users-full +Source: ..\Disks\LNSREL.8418; DestDir: {commonappdata}\Univac 9030 Emulator\Data; Permissions: users-full; DestName: REL042.8418 +Source: ..\Disks\LNS001.8418; DestDir: {commonappdata}\Univac 9030 Emulator\Data; Permissions: users-full Source: C:\Development\Emulators\U9030\REL042.cfg.release; DestDir: {app}; DestName: REL042.cfg Source: C:\Development\Emulators\U9030\VSB.cfg.release; DestDir: {app}; DestName: VSB.cfg Source: ..\Manuals\Univac_90_30_System_Brochure_Mar74.pdf; DestDir: {app}\Manuals @@ -76,16 +77,17 @@ Source: ..\Source\supgen.asc; DestDir: {app}\Source Source: ..\Source\PrepLns001.jcl; DestDir: {app}\Source; DestName: Prep18.jcl [Icons] -Name: {group}\Univac 9030 Emulator; Filename: {app}\U9030.exe; Parameters: -c REL042.cfg; IconIndex: 0 -Name: {commondesktop}\Univac 9030 Emulator; Filename: {app}\U9030.exe; Tasks: desktopicon; Parameters: -c REL042.cfg; IconIndex: 0 +Name: {group}\Univac 9030 Emulator (IMS - BEM); Filename: {app}\U9030.exe; Parameters: -c REL042.cfg; IconIndex: 0 +Name: {commondesktop}\Univac 9030 Emulator (IMS - BEM); Filename: {app}\U9030.exe; Tasks: desktopicon; Parameters: -c REL042.cfg; IconIndex: 0 Name: {group}\U8418 Utilities; Filename: {app}\U8418Util.exe; IconIndex: 0 Name: {group}\U9030 Disassembler; Filename: {app}\U9030DisAsm.exe; IconIndex: 0 Name: {group}\U9030 Console; Filename: {app}\U9030Console.exe; IconIndex: 0 Name: {group}\Dump Restore; Filename: {app}\DmpRst.exe; IconIndex: 0 Name: {group}\Univac 9030 Emulator (VSB); Filename: {app}\U9030.exe; Parameters: -c VSB.cfg; IconIndex: 0 -Name: {group}\Emulator Documentatiopn; Filename: {app}\Docs\U9030.pdf +Name: {group}\Emulator Documentation; Filename: {app}\Docs\U9030.pdf Name: {group}\U9030 Print; Filename: {app}\U9030Print.exe; IconIndex: 0 -Name: {group}\U200 Emulator; Filename: {app}\U200TN.exe; IconIndex: 0 +Name: {group}\U200 Emulator (IMS); Filename: {app}\U200TN.exe; Parameters: -p 9036 +Name: {group}\U200 Emulator (BEM); Filename: {app}\U200TN.exe; Parameters: -p 9034 [Run] Filename: {app}\{#MyAppExeName}; Description: {cm:LaunchProgram,{#MyAppName}}; Flags: nowait postinstall skipifsilent; Parameters: -c REL042.cfg diff --git a/U9030/Source/BadCmd.asm b/U9030/Source/BadCmd.asm new file mode 100644 index 0000000..5b0c896 --- /dev/null +++ b/U9030/Source/BadCmd.asm @@ -0,0 +1,87 @@ + TITLE 'SEND ''BAD COMMAND'' ERRORS FOR BOYD''S BEM SIMULATOR' +BADCMD START +*********************************************************************** +* * +* A SIMPLE PROGRAM FOR BOYD'S BEM SIMULATOR TO SEND AN UNKNOWN COMMAND* +* ERROR TO THE USER'S TERMINAL. * +* * +*********************************************************************** +* + PRINT NOGEN + ZM#DPIB + ZM#DIMH +ZA#IMSG DS CL2048 + ZM#DOMH +ZA#OMSG DS CL2048 OUTPUT MSG BFR. +BADCMD CSECT + RGEQU +* + STM R14,R12,12(R13) +************ +* R2 = COVER +* R3 = PIB +* R4 = IMA +* R5 = WORK AREA +* R6 = OMA +* R7 = CDA +* R14 = RETURN ADDRESS +************ + BALR R2,0 SET COVER + USING *,R2 + USING ZA#DPIB,R3 + USING ZA#IMH,R4 + USING ZA#OMH,R6 +* + L R3,0(R1) COVER THE PARAMETERS + L R4,4(R1) + L R5,8(R1) + L R6,12(R1) + L R7,16(R1) +* + CLI ZA#IMSG,C'L' SEND 'PLS LOGON'? + BE SNDLOGON YES + MVC ZA#OMSG(UNKCMDL),UNKCMD NO, SEND 'UNK COMMAND' + LA R11,UNKCMDL + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION + B DONE +* +SNDLOGON MVC ZA#OMSG(LOGONL),LOGON MOVE MSG TO OMA + LA R11,LOGONL + STH R11,ZA#OTL + MVI ZA#PSIND,C'N' SET NORMAL TERMINATION + B DONE +* +DONE LM R14,R12,12(R13) + BR R14 +* +UNKCMD ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,22 LINE 22 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'UNKNOWN COMMAND' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +UNKCMDL EQU *-UNKCMD +* +LOGON ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,22 LINE 22 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'PLEASE LOGON' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +LOGONL EQU *-LOGON +* + END +// FIN \ No newline at end of file diff --git a/U9030/Source/BemBuild.jcl b/U9030/Source/BemBuild.jcl new file mode 100644 index 0000000..91a155d --- /dev/null +++ b/U9030/Source/BemBuild.jcl @@ -0,0 +1,180 @@ +// JOB BEMBUILD,,10000,10000 +// DVC 20 // LFD PRNTR +// DVCVOL LNS001 +// LBL LNSLOD // LFD LOD +// DVCVOL LNS001 +// LBL LNSOBJ // LFD OBJ +//BADCMD ASM IN=(LNS001,LNSSRC), X +//1 LIN=(LNS001,LNSMAC), X +//2 OUT=(LNS001,LNSOBJ), X +//3 LST=(NC) +// WORK1 +// EXEC LNKEDT +// PARAM OUT=LOD +/$ + LOADM BADCMD + INCLUDE BADCMD,OBJ +/* +// NOP +// NOP +//BEMDEL ASM IN=(LNS001,LNSSRC), X +//1 LIN=(LNS001,LNSMAC), X +//2 OUT=(LNS001,LNSOBJ), X +//3 LST=(NC) +// WORK1 +// EXEC LNKEDT +// PARAM OUT=LOD +/$ + LOADM BEMDEL + INCLUDE BEMDEL,OBJ +/* +// NOP +// NOP +//BEMDSP ASM IN=(LNS001,LNSSRC), X +//1 LIN=(LNS001,LNSMAC), X +//2 OUT=(LNS001,LNSOBJ), X +//3 LST=(NC) +// WORK1 +// EXEC LNKEDT +// PARAM OUT=LOD +/$ + LOADM BEMDSP + INCLUDE BEMDSP,OBJ +/* +// NOP +// NOP +//BEMFST ASM IN=(LNS001,LNSSRC), X +//1 LIN=(LNS001,LNSMAC), X +//2 OUT=(LNS001,LNSOBJ), X +//3 LST=(NC) +// WORK1 +// EXEC LNKEDT +// PARAM OUT=LOD +/$ + LOADM BEMFST + INCLUDE BEMFST,OBJ +/* +// NOP +// NOP +//BEMHLP ASM IN=(LNS001,LNSSRC), X +//1 LIN=(LNS001,LNSMAC), X +//2 OUT=(LNS001,LNSOBJ), X +//3 LST=(NC) +// WORK1 +// EXEC LNKEDT +// PARAM OUT=LOD +/$ + LOADM BEMHLP + INCLUDE BEMHLP,OBJ +/* +// NOP +// NOP +//BEMLGF ASM IN=(LNS001,LNSSRC), X +//1 LIN=(LNS001,LNSMAC), X +//2 OUT=(LNS001,LNSOBJ), X +//3 LST=(NC) +// WORK1 +// EXEC LNKEDT +// PARAM OUT=LOD +/$ + LOADM BEMLGF + INCLUDE BEMLGF,OBJ +/* +// NOP +// NOP +//BEMLGN ASM IN=(LNS001,LNSSRC), X +//1 LIN=(LNS001,LNSMAC), X +//2 OUT=(LNS001,LNSOBJ), X +//3 LST=(NC) +// WORK1 +// EXEC LNKEDT +// PARAM OUT=LOD +/$ + LOADM BEMLGN + INCLUDE BEMLGN,OBJ +/* +// NOP +// NOP +//BEMPRT ASM IN=(LNS001,LNSSRC), X +//1 LIN=(LNS001,LNSMAC), X +//2 OUT=(LNS001,LNSOBJ), X +//3 LST=(NC) +// WORK1 +// EXEC LNKEDT +// PARAM OUT=LOD +/$ + LOADM BEMPRT + INCLUDE BEMPRT,OBJ +/* +// NOP +// NOP +//BEMRDY ASM IN=(LNS001,LNSSRC), X +//1 LIN=(LNS001,LNSMAC), X +//2 OUT=(LNS001,LNSOBJ), X +//3 LST=(NC) +// WORK1 +// EXEC LNKEDT +// PARAM OUT=LOD +/$ + LOADM BEMRDY + INCLUDE BEMRDY,OBJ +/* +// NOP +// NOP +//BEMSTA ASM IN=(LNS001,LNSSRC), X +//1 LIN=(LNS001,LNSMAC), X +//2 OUT=(LNS001,LNSOBJ), X +//3 LST=(NC) +// WORK1 +// EXEC LNKEDT +// PARAM OUT=LOD +/$ + LOADM BEMSTA + INCLUDE BEMSTA,OBJ +/* +// NOP +// NOP +//BEMVTC ASM IN=(LNS001,LNSSRC), X +//1 LIN=(LNS001,LNSMAC), X +//2 OUT=(LNS001,LNSOBJ), X +//3 LST=(NC) +// WORK1 +// EXEC LNKEDT +// PARAM OUT=LOD +/$ + LOADM BEMVTC + INCLUDE BEMVTC,OBJ +/* +// NOP +// NOP +//BEMPRNTR ASM IN=(LNS001,LNSSRC), X +//1 LIN=(LNS001,LNSMAC), X +//2 OUT=(LNS001,LNSOBJ), X +//3 LST=(NC) +// NOP +// NOP +//BEMLIB ASM IN=(LNS001,LNSSRC), X +//1 LIN=(LNS001,LNSMAC), X +//2 OUT=(LNS001,LNSOBJ), X +//3 LST=(NC) +// NOP +// NOP +//BEMSIM ASM IN=(LNS001,LNSSRC), X +//1 LIN=(LNS001,LNSMAC), X +//2 OUT=(LNS001,LNSOBJ), X +//3 LST=(NC) +// NOP +// NOP +// WORK1 +// EXEC LNKEDT +// PARAM OUT=LOD +// PARAM NOAUTO +/$ + LOADM BEMSIM + INCLUDE BEMSIM,OBJ + INCLUDE BEMLIB,OBJ + INCLUDE BEMPRNTR,OBJ + INCLUDE PR$IOE,$Y$OBJ +/* +/& +// FIN \ No newline at end of file diff --git a/U9030/Source/BemDelete.asm b/U9030/Source/BemDelete.asm new file mode 100644 index 0000000..2bf63de --- /dev/null +++ b/U9030/Source/BemDelete.asm @@ -0,0 +1,336 @@ + TITLE '/DELETE COMMAND FOR BOYD''S BEM SIMULATOR' +BEMDEL START +*********************************************************************** +* * +* AN IMPLEMENTATION OF THE /DELETE COMMAND FOR BOYD'S BEM SIMULATOR. * +* * +*********************************************************************** +* + PRINT NOGEN + SUPEQU REGS=YES + SA$DSECT + ZM#DPIB + ZM#DIMH +ZA#IMSG DS CL2048 +BEMDEL CSECT + BEMDSCTS +* + SAVE (14,12),COVER=2 +************ +* R2 = COVER +* R3 = PIB +* R4 = IMA +* R5 = WORK AREA +* R6 = OMA +* R7 = CDA +* R14 = RETURN ADDRESS +************ + USING LOWMEM,R0 + USING ZA#DPIB,R3 + USING ZA#IMH,R4 + USING WORKAREA,R5 + USING ZA#OMH,R6 + USING CDA,R7 + USING LIBFIL,R8 + USING SA$DSECT,R13 +* + L R3,0(R1) COVER THE PARAMETERS + L R4,4(R1) + L R5,8(R1) + L R6,12(R1) + L R7,16(R1) + LA R8,LIBPKT COVER LIB RTNS PARAM PKT + ST R13,SAVAREA+4 + LA R13,SAVAREA + BAL R14,INIT INIT. LIB. PARAM PACKET +* +* PARSE COMMAND LINE +* + LH R0,ZA#ITL SET UP GETOKEN PARAMS + LA R1,ZA#IMSG + L R15,LM$GTKN + LA R11,ELENAME BURN '/DELETE' + BALR R14,R15 + LA R11,ELENAME GET THE ELEMENT NAME + BALR R14,R15 + LA R11,FNAME GET THE FILE NAME + BALR R14,R15 + LA R11,VSN GET VOLUME ID + BALR R14,R15 + LA R11,ELETYP GET ELEMENT TYPE + BALR R14,R15 +* +* VALIDATE PARAMS. +* + CLI ELENAME,C' ' ELEMENT NAME BLANK? + BE NOELE YES, OOPS! + CLI FNAME,C' ' FILE NAME BLANK? + BE NOFIL YES, OOPS! + CLI ELETYP,C' ' ELEMENT TYPE BLANK? + BNE CHKTYP NO, CONTINUE + MVC ELETYP,VSN COPY VOLUME ID TO ELE TYPE +CHKTYP CLI ELETYP,C' ' ELEMENT TYPE STILL BLANK? + BE BADTYP YES, OOPS + CLI ELETYP,C'O' OBJECT ELEMENT? + BNE CHKLOD NO, CONTINUE + MVI LIBTYP,LET$OBJ YES, ALL GOOD + B CHKELE +CHKLOD CLI ELETYP,C'L' LOAD ELEMENT? + BNE CHKGRP NO, CONTINUE + MVI LIBTYP,LET$PHSE YES, ALL GOOD + B CHKELE +CHKGRP CLI ELETYP,C'G' GROUP HEADER? + BNE CHKSRC NO, CONTINUE + MVI LIBTYP,LET$BGRP YES,ALL GOOD + B CHKELE +CHKSRC CLI ELETYP,C'S' SOURCE ELEMENT? + BNE CHKPROC NO, CONTINUE + MVI LIBTYP,LET$SRC YES, ALL GOOD + B CHKELE +CHKPROC CLI ELETYP,C'P' PROC ELEMENT? + BNE CHKMAC NO, CONTINUE + MVI LIBTYP,LET$PROC YES, ALL GOOD + B CHKELE +CHKMAC CLI ELETYP,C'M' MACRO ELEMENT? + BNE BADTYP NO, OOPS! + MVI LIBTYP,LET$PROC YES, ALL GOOD +* +* SEE IF ELEMENT/FILE IS VALID +* +CHKELE MVC LF$NAME,FNAME SET UP PARAM PKT + MVC LF$ELE,ELENAME + MVC LF$ETYP,LIBTYP + LA R1,LIBPKT POINT TO PARAMS. + L R15,LM$LOPN TRY TO OPEN FILE + BALR R14,R15 + LTR R0,R0 SUCCESS? + BNZ BADFIL NO + L R15,LM$LDEL TRY TO DELETE IT + BALR R14,R15 + LTR R0,R0 ERROR CODE = 0? + BNZ BADELE NO, OOPS! + LTR R1,R1 ELEMENT FOUND? + BZ BADELE NO, OOPS + CLI ELETYP,C'G' DELETING A GROUP? + BNE DDONE NO, WE'RE DONE + MVI LF$ETYP,LET$EGRP YES, DELETE END OF GROUP MARKER + L R15,LM$LDEL TRY TO DELETE IT + BALR R14,R15 + LTR R0,R0 ERROR CODE = 0? + BNZ BADELE NO, OOPS! + LTR R1,R1 ELEMENT FOUND? + BZ BADELE NO, OOPS +* +DDONE MVC ZA#OMSG(EOJMSGL),EOJMSG MOVE MSG TO OMA + LA R11,EOJMSGL SET MSG LENGTH + STH R11,ZA#OTL + MVC OELENAM,ELENAME MOVE ELEMENT NAME TO OMA + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION +* +DONE L R15,LM$LCLS CLOSE THE LIBRARY + BALR R14,R15 + L R13,SA$BLNK RESTORE R13 + RETURN (14,12) RESTORE REGS & RETURN TO MON. +************ +* +* INITIALIZE PARAMETER PACKET IN WORK AREA +* R14 = RETURN ADDRESS +* +************ +INIT LA R11,DIRBFR SET PTR TO DIR BUFFER + ST R11,LF$DBFR + LA R11,DTABFR SET PTR TO DATA BUFFER + ST R11,LF$EBFR + BR R14 +************ +* +* SEND FILE NAME MISSING ERROR +* +************ +NOFIL MVC ZA#OMSG(FILMSNGL),FILMSNG MOVE MSG TO OMA + LA R11,FILMSNGL SET MSG LENGTH + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION + B DONE +************ +* +* SEND INVALID FILE NAME ERROR +* +************ +BADFIL MVC ZA#OMSG(INVFILL),INVFIL MOVE MSG TO OMA + LA R11,INVFILL SET MSG LENGTH + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION + B DONE +************ +* +* SEND ELEMENT NAME MISSING ERROR +* +************ +NOELE MVC ZA#OMSG(ELEMSNGL),ELEMSNG MOVE MSG TO OMA + LA R11,ELEMSNGL SET MSG LENGTH + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION + B DONE +************ +* +* SEND INVALID ELEMENT NAME ERROR +* +************ +BADELE MVC ZA#OMSG(INVELEL),INVELE MOVE MSG TO OMA + LA R11,INVELEL SET MSG LENGTH + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION + B DONE +************ +* +* SEND INVALID ELEMENT TYPE ERROR +* +************ +BADTYP MVC ZA#OMSG(TYPERRL),TYPERR MOVE MSG TO OMA + LA R11,TYPERRL SET MSG LENGTH + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION + B DONE +************ +* +* SEND LIBRARY I/O ERROR +* +************ +BADLIB MVC ZA#OMSG(LIBERRL),LIBERR MOVE MSG TO OMA + LA R11,LIBERRL SET MSG LENGTH + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION + B DONE +************ +FILMSNG ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'FILE NAME MISSING' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +FILMSNGL EQU *-FILMSNG +************ +INVFIL ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'FILE NAME NOT FOUND' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +INVFILL EQU *-INVFIL +************ +ELEMSNG ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'ELEMENT NAME MISSING' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +ELEMSNGL EQU *-ELEMSNG +************ +INVELE ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'ELEMENT NAME / TYPE NOT FOUND' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +INVELEL EQU *-INVELE +************ +TYPERR ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'ELEMENT TYPE MUST BE SPECIFIED (S/P/M/O/L/G)' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +TYPERRL EQU *-TYPERR +************ +LIBERR ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'ERROR WHILE READING SOURCE ELEMENT' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +LIBERRL EQU *-LIBERR +************ +EOJMSG ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE +ELENAM EQU *-EOJMSG + DC C' DELETED' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +EOJMSGL EQU *-EOJMSG +************ + ZM#DOMH +ZA#OMSG DS CL2048 OUTPUT MSG BFR. +OELENAM EQU ZA#OMSG+ELENAM,8 +************ +WORKAREA DSECT +DTEMP DS D DOUBLE WORD ALIGNED TEMP VAR. +CTEMP DS CL8 +ELENAME DS CL8 SOURCE ELEMENT NAME +FNAME DS CL8 LIBRARY FILE NAME +VSN DS CL8 VOLUME ID (NOT USED) +ELETYP DS CL8 ELEMENT TYPE (S/P) +LIBTYP DS XL1 LIBRARY FRIENDLY ELE TYPE +SAVAREA DS 18F + DS 0F +LIBPKT DS XL(LF$LNGTH) LIBRARY ROUTINES PARAM PACKET +DIRBFR DS XL256 LIBRARY DIR. PARTITION BFR +DTABFR DS XL256 LIBRARY DATA PARTITION BFR +************ +CDA DSECT +DUMMY DS XL1 +* +BEMDEL CSECT +* + END +// FIN \ No newline at end of file diff --git a/U9030/Source/BemDisplay.asm b/U9030/Source/BemDisplay.asm new file mode 100644 index 0000000..409742d --- /dev/null +++ b/U9030/Source/BemDisplay.asm @@ -0,0 +1,390 @@ + TITLE '/DISPLAY COMMAND FOR BOYD''S BEM SIMULATOR' +BEMDSP START +*********************************************************************** +* * +* AN IMPLEMENTATION OF THE /DISPLAY COMMAND FOR BOYD'S BEM SIMULATOR. * +* * +*********************************************************************** +* + PRINT NOGEN + SUPEQU REGS=YES, X + TCB=YES, X + PRE=YES, X + SIB=YES, X + IO=NO, X + TRN=NO +PUBDSECT DSECT + PUBEQU +BEMDSP CSECT + ZM#DPIB + ZM#DIMH +ZA#IMSG DS CL2048 +BEMDSP CSECT + BEMDSCTS +* + STM R14,R12,12(R13) +************ +* R2 = COVER +* R3 = PIB +* R4 = IMA +* R5 = WORK AREA +* R6 = OMA +* R7 = CDA +* R14 = RETURN ADDRESS +************ + BALR R2,0 SET COVER + USING *,R2 + USING LOWMEM,R0 + USING ZA#DPIB,R3 + USING ZA#IMH,R4 + USING WORKAREA,R5 + USING ZA#OMH,R6 +* + L R3,0(R1) COVER THE PARAMETERS + L R4,4(R1) + L R5,8(R1) + L R6,12(R1) + L R7,16(R1) +* +* GET THE JOB'S TCB TO GET THE JOB NUMBER +* + USING JT$TCB,R7 + LA R1,TCBBFR + GETINF TCB,(1),L'TCBBFR,0 + LA R7,TCBBFR + XR R11,R11 GET THE JOB KEY + IC R11,JT$KEY + SRL R11,4 SHIFT RIGHT TO GET JOB # + STC R11,JOBNUM SAVE IT FOR LATER + DROP R7 +* +* GET JOB PREAMBLE TO GET ABSOLUTE BASE ADDRESS OF THIS PROGRAM AND +* ITS JOB NUMBER +* + USING JP$PRE,R7 + LA R1,PREBFR + GETINF PRE,(1),L'PREBFR,0 + LA R7,PREBFR + MVC BASEADR,JP$JSB SAVE BASE ADDR OF PGM FOR LATER + MVI BASEADR,0 CLEAR MSB + DROP R7 +* +* GET SYSTEM INFORMATION BLOCK (SIB) TO GET ADDRESS OF SWITCH LIST +* AND PUBS AND OTHER STUFF +* + USING SB$SIB,R7 + LA R1,SIBBFR + GETINF SIB,(1),L'SIBBFR,0 + LA R7,SIBBFR + LH R11,SB$SLA GET SWITCH LIST ADDR. + LA R11,16(R11) BUMP PAST SUPER TCBS + S R11,BASEADR MAKE NEGATIVE OFFSET INTO SUPER + ST R11,SWADDR + L R11,SB$PBA GET 1ST PUB ADDR. + LA R11,0(R11) CLEAR MSB + S R11,BASEADR MAKE NEGATIVE OFFSET INTO SUPER + ST R11,PUBADDR + MVC NUMPUBS,SB$PBC+2 GET # NUM OF PUBS + MVI NUMPRI,0 GET # OF USER PRIORITIES + MVC NUMPRI+1(1),SB$NOPRI + LH R11,SB$MLO GET ADDR 1ST MEMORY BLOCK + SLL R11,8 + S R11,BASEADR MAKE NEGATIVE OFFSET INTO SUPER + ST R11,MEMLOW + LH R11,SB$MHI GET ADDR LAST MEMORY BLOCK + SLL R11,8 + S R11,BASEADR MAKE NEGATIVE OFFSET INTO SUPER + ST R11,MEMHI + DROP R7 +* +* DECODE THE INPUT MESSAGE +* + LH R0,ZA#ITL SET UP GETOKEN PARAMS + LA R1,ZA#IMSG + L R15,LM$GTKN + LA R11,DTYPE BURN '/DISPLAY' + BALR R14,R15 + LA R11,DTYPE GET TYPE OF STATUS + BALR R14,R15 +* +* CHECK STATUS TYPE AND BRANCH TO APPROPRIATE ROUTINE +* + CLI DTYPE,C'J' JOBS? + BE SENDJOB YES + CLI DTYPE,C'V' VOLUMES? + BE SENDVOL YES +* +* SEND 'INVALID OPTION' ERROR +* + MVC ZA#OMSG(BADOPTL),BADOPT MOVE ERROR TO OMA + LA R11,BADOPTL SET MSG LENGTH + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION + B DONE +* +* SEND JOBS INFO +* + USING JT$TCB,R7 + USING JP$PRE,R9 +SENDJOB MVC ZA#OMSG(JOBHDRL),JOBHDR MOVE JOBS HEADER TO OMA + LA R11,JOBHDRL SET MSG LENGTH + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION +* +SJLOOP1 L R7,SWADDR GET ADDR OF 1ST TCB IN CHAIN + L R7,0(R7) + LA R7,0(R7) CLEAR MSB + ST R7,FSTTCB SAVE IT +SJLOOP2 LTR R7,R7 TCB ADDR = ZERO? + BZ SJBUMP YES, TRY NEXT CHAIN + S R7,BASEADR MAKE NEGATIVE OFFSET INTO SUPER + L R11,JT$ECB IS ECB PTR = ZERO? + LA R11,0(R11) + LTR R11,R11 + BNZ SJNEXT YES, NOT PRIMARY TCB +* +* DISPLAY ONE LINE FOR CURRENT JOB +* + L R9,JT$PRE GET JOB PREAMBLE ADDR. + LA R9,0(R9) CLEAR MSB + S R9,BASEADR MAKE NEGATIVE OFFSET INTO SUPER + LA R12,ZA#OMSG GET ADDR OF OUTPUT MSG + AH R12,ZA#OTL ADD CRNT OFFSET INTO OMA + MVC 0(JOBDTLL,R12),JOBDTL MOVE JOB DETAIL TEMPLATE TO OMA + AI ZA#OTL,JOBDTLL BUMP MSG LENGTH +* + MVC JNAME(8,R12),JP$NAM COPY JOB NAME TO OMA + MVC JEXEC(8,R12),JP$ROOT COPY EXEC MODULE TO OMA + L R11,JP$JOB GET MEM. SIZE + CVD R11,DTEMP CVT TO PACKED + MVC CTEMP(L'SIZMASK),SIZMASK MAKE PRINTABLE + ED CTEMP(L'SIZMASK),DTEMP+4 + OI CTEMP+7,X'F0' + MVC JSIZE(6,R12),CTEMP+2 COPY TO OMA + XR R11,R11 GET JOB STEP # + IC R11,JP$JSN + CVD R11,DTEMP + MVC CTEMP(L'STEPMASK),STEPMASK MAKE PRINTABLE + ED CTEMP(L'STEPMASK),DTEMP+6 + OI CTEMP+3,X'F0' + MVC JSTEP(3,R12),CTEMP+1 COPY TO OMA + XR R11,R11 GET JOB # + IC R11,JT$KEY + SRL R11,4 + CVD R11,DTEMP + MVC CTEMP(L'JIDMASK),JIDMASK MAKE PRINTABLE + ED CTEMP(L'JIDMASK),DTEMP+5 + OI CTEMP+5,X'F0' + MVC JNUM(5,R12),CTEMP+1 COPY TO OMA + L R11,JP$AJT GET ACCUM. CPU TIME + XR R10,R10 DIVIDE BY 100 + D R10,=F'100' + CVD R11,DTEMP CONVERT QUOTIENT TO PACKED + MVC CTEMP(L'JTIMASK),JTIMASK MAKE PRINTABLE + ED CTEMP(L'JTIMASK),DTEMP+4 + OI CTEMP+8,X'F0' + MVC JTIME(8,R12),CTEMP+1 +* +SJNEXT L R7,JT$LNK GET PTR TO NEXT TCB + LA R7,0(R7) CLEAR MSB + C R7,FSTTCB NEXT = FIRST? + BE SJBUMP YES, END OF CHAIN, TRY NEXT + B SJLOOP2 +* +SJBUMP AI NUMPRI,-1 DECR. # PRIORITIES + BNP SJMEM <= ZERO, WE'RE DONE WITH JOBS + L R11,SWADDR BUMP TO NEXT TCB CHAIN + LA R11,4(R11) + ST R11,SWADDR SAVE IT + B SJLOOP1 & LOOP +* +* FOLLOW THE MEMORY BLOCK CHAIN TO CALC. FREE MEMORY. BLOCK HEADERS +* ARE THE SAME FORMAT AS THE JOB PREAMBLE. +* +SJMEM XR R12,R12 CLR. TTL MEMORY + L R9,MEMLOW GET PTR TO 1ST BLOCK +SMLOOP TM JP$SIZ,X'80' IS THIS A FREE BLOCK? + BZ SMNEXT NO + A R12,JP$SIZ ADD BLOCK SIZE TO TTL + LA R12,0(R12) CLEAR MSB +SMNEXT LH R9,JP$MHI GET NEXT BLOCK + LTR R9,R9 ZERO? + BZ SMSHOW YES, END OF LIST + SLL R9,8 + S R9,BASEADR MAKE NEGATIVE OFFSET INTO SUPER + B SMLOOP & LOOP +* +SMSHOW LR R11,R12 SAVE TTL MEMORY + LA R12,ZA#OMSG GET ADDR OF OUTPUT MSG + AH R12,ZA#OTL ADD CRNT OFFSET INTO OMA + MVC 0(JOBFREL,R12),JOBFRE MOVE FREE MEM. TEMPLATE TO OMA + AI ZA#OTL,JOBFREL BUMP MSG LENGTH + CVD R11,DTEMP CVT FREE MEM TO PACKED + MVC CTEMP(L'SIZMASK),SIZMASK MAKE PRINTABLE + ED CTEMP(L'SIZMASK),DTEMP+4 + OI CTEMP+7,X'F0' + MVC JSIZE(6,R12),CTEMP+2 COPY TO OMA + B DONE WE'RE DONE, RETURN TO TASK MGR + DROP R7,R9 +* +* SEND VOLUME INFO +* + USING IP$PUB,R7 +SENDVOL MVC ZA#OMSG(VOLHDRL),VOLHDR MOVE VOLUMES HEADER TO OMA + LA R11,VOLHDRL SET MSG LENGTH + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION +* + LA R11,1 CALC. BIT TO CHECK FOR ASGNMNT + IC R12,JOBNUM + SLL R11,0(R12) + STC R11,JOBNUM +* + LA R7,PUBBFR COVER PUBS + L R11,PUBADDR POINT TO 1ST PUB +SVLOOP MVC IP$PUB(IP$LNGTH),0(R11) COPY PUB TO OUR BFR + CLI IP$TYP,X'20' IS IT FOR A DISK? + BNE SVNEXT NO, TRY NEXT + LH R12,IP$TRL GET PTR TO PUB TRAILER + S R12,BASEADR MAKE NEGATIVE OFFSET INTO SUPER + MVC IP$PUBT(IP$LENT),0(R12) COPY TO OUR BUFFER + LA R12,ZA#OMSG GET CRNT OFFSET INTO OMA + AH R12,ZA#OTL + AI ZA#OTL,8 BUMP MSG LENGTH + MVI 0(R12),C' ' CLEAR 8 BYTES + MVC 1(7,R12),0(R12) + MVC 1(6,R12),IP$VSN COPY VOL ID TO OMA + IC R10,JOBNUM ASSIGNED TO THIS JOB? + EX R10,SVTM + BZ SVNEXT NO + MVI 0(R12),C'*' YES, PREFIX VSN WITH '*' +SVNEXT LA R11,IP$LNGTH(R11) BUMP TO NEXT PUB + AI NUMPUBS,-1 DECR. PUB COUNT + BP SVLOOP > 0, TRY AGAIN +* + LA R12,ZA#OMSG GET CRNT OFFSET INTO OMA + AH R12,ZA#OTL + MVC 0(VOLTLRL,R12),VOLTLR COPY MSG TRAILER TO OMA + AI ZA#OTL,VOLTLRL BUMP MSG LENGTH + B DONE +* +DONE LM R14,R12,12(R13) RESTORE REGISTERS + BR R14 RETURN TO MONITOR +* +SVTM TM IP$ALC,0 +* +* JOBS INFO HEADER +* +JOBHDR ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C' JOB NAME SIZE TIME STEP EXEC JOB NO' +JOBHDRL EQU *-JOBHDR +* +JOBDTL ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE + DC C' ' +JNAME EQU *-JOBDTL + DC C'XXXXXXXX ' +JSIZE EQU *-JOBDTL + DC C'XXXXXX ' +JTIME EQU *-JOBDTL + DC C'XXXXXX.X ' +JSTEP EQU *-JOBDTL + DC C'XXX ' +JEXEC EQU *-JOBDTL + DC C'XXXXXXXX ' +JNUM EQU *-JOBDTL + DC C'XXXXX' +JOBDTLL EQU *-JOBDTL +* +JOBFRE ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE + DC C'UNUSED MEMORY ' +JFREE EQU *-JOBFRE + DC C'XXXXXX' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +JOBFREL EQU *-JOBFRE +* +VOLHDR ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE +VOLHDRL EQU *-VOLHDR +* +VOLTLR ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +VOLTLRL EQU *-VOLTLR +* +BADOPT ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'INVALID OPTION. VALID OPTIONS ARE: JOBS, VOLUMES' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +BADOPTL EQU *-BADOPT +* +SIZMASK DC X'4020202020202120' +STEPMASK DC X'40202120' +JIDMASK DC X'402020202120' +JTIMASK DC X'402020202021204B20' +* + ZM#DOMH +ZA#OMSG DS CL2048 OUTPUT MSG BFR. +* +WORKAREA DSECT +DTEMP DS D DOUBLE WORD ALIGNED TEMP VAR. +BASEADR DS A BASE ADDR. OF BEMSIM JOB +SWADDR DS A ADDR. OF SWITCH LIST +PUBADDR DS A ADDR OF PUB +NUMPUBS DS H # OF PUBS +NUMPRI DS H # OF USER PRIORITIES +FSTTCB DS A ADDR OF 1ST TCB IN CHAIN +MEMLOW DS A ADDR OF 1ST MEMORY BLOCK +MEMHI DS A ADDR OF LAST MEMORY BLOCK +DTYPE DS CL8 DISPLAY TYPE (JOBS/VOLUMES) +CTEMP DS CL10 +JOBNUM DS XL1 +* +PUBNUM DS H CURRENT PUB # + DS 0D +PREBFR DS XL(JP$LNGTH) JOB PREAMBLE BUFFER + DS 0D +SIBBFR DS XL(SB$LNGTH) SYS. INFO. BLOCK BUFFER + DS 0D +PUBBFR DS XL(IP$LNGTH) PUB BUFFER +PTRLBFR DS XL(IP$LENT) PUB TRAILER BFR +* +TCBBFR DS XL(JT$LNGTH) +* +BEMDSP CSECT +* + END +// FIN \ No newline at end of file diff --git a/U9030/Source/BemFstatus.asm b/U9030/Source/BemFstatus.asm new file mode 100644 index 0000000..362635e --- /dev/null +++ b/U9030/Source/BemFstatus.asm @@ -0,0 +1,429 @@ + TITLE '/FSTATUS COMMAND FOR BOYD''S BEM SIMULATOR' +BEMFST START +*********************************************************************** +* * +* AN IMPLEMENTATION OF THE /FSTATUS COMMAND FOR BOYD'S BEM SIMULATOR. * +* * +*********************************************************************** +* + PRINT NOGEN + SUPEQU REGS=YES + ZM#DPIB + ZM#DIMH +ZA#IMSG DS CL2048 +BEMFST CSECT + BEMDSCTS +* + STM R14,R12,12(R13) +************ +* R2 = COVER +* R3 = PIB +* R4 = IMA +* R5 = WORK AREA +* R6 = OMA +* R7 = CDA +* R14 = RETURN ADDRESS +************ + BALR R2,0 SET COVER + USING *,R2 + USING LOWMEM,R0 + USING ZA#DPIB,R3 + USING ZA#IMH,R4 + USING WORKAREA,R5 + USING ZA#OMH,R6 + USING CDA,R7 + USING LIBFIL,R8 +* + L R3,0(R1) COVER THE PARAMETERS + L R4,4(R1) + L R5,8(R1) + L R6,12(R1) + L R7,16(R1) + LA R8,LIBPKT COVER LIB RTNS PARAM PKT + LA R11,SAVAREA SET UP NEW SAVE AREA + ST R13,4(R11) + LR R13,R11 +* + CLI FSTPASS,X'00' IS THIS THE FIRST PASS? + BNE PASS2 NO + B PASS1 +* +DONE L R15,LM$LCLS CLOSE THE LIBRARY + BALR R14,R15 + L R13,4(R13) RESTORE REGISTERS + LM R14,R12,12(R13) + BR R14 +* +* FIRST PASS, DECODE THE INPUT MESSAGE +* + USING L$DIRENT,R1 +PASS1 BAL R14,INIT INITIALIZE PARAM PKT + MVC LINCNT,=H'22' INITIALIZE THE LINE COUNTER +* + LH R0,ZA#ITL SET UP GETOKEN PARAMS + LA R1,ZA#IMSG + L R15,LM$GTKN + LA R11,FNAME BURN '/FSTATUS' + BALR R14,R15 + LA R11,FNAME GET THE FILE NAME + BALR R14,R15 + LA R11,VSN GET VOLUME ID + BALR R14,R15 + LA R11,OPTN GET LONG OPTION + BALR R14,R15 + CLI OPTN,C' ' OPTION PRESENT + BNE P11 YES + MVC OPTN,VSN NO, COPY VOLUME TO OPTION +P11 CLI FNAME,C' ' FILE NAME PRESENT? + BE BADFIL NO +* + MVC LF$NAME,FNAME COPY FILE NAME TO PARAM PKT + LA R1,LIBPKT TRY TO OPEN THE LIBRARY + L R15,LM$LOPN + BALR R14,R15 + LTR R0,R0 SUCCESS? + BNE OPENERR NO +* + BAL R14,INITLINE INIT OMA WITH LINE TEMPLATE + L R15,LM$LDFST GET 1ST DIRECTORY ENTRY + BALR R14,R15 +P1LOOP LTR R0,R0 SUCCESS? + BNZ READERR NO + LTR R1,R1 NO ENTRY FOUND? + BZ P1EOJ YES + CLI LDE$TYPE,LET$EOF END OF FILE? + BE P1EOJ YES + CLI LDE$TYPE,LET$OBJ OBJECT MODULE? + BNE P1L1 NO + MVI 0(R11),C'O' + B P1CONT +P1L1 CLI LDE$TYPE,LET$PHSE LOAD MODULE? + BNE P1L2 NO + MVI 0(R11),C'L' + B P1CONT +P1L2 CLI LDE$TYPE,LET$PROC PROC MODULE? + BNE P1L3 NO + MVI 0(R11),C'P' + B P1CONT +P1L3 CLI LDE$TYPE,LET$SRC SOURCE MODULE? + BNE P1NEXT NO, NOT INTERESTING TYPE, SKIP + MVI 0(R11),C'S' +P1CONT MVI 1(R11),C'-' MOVE SEPARATOR TO OMA + MVC 2(8,R11),LDE$NAME MOVE MODULE NAME TO OAM + CLI OPTN,C'L' LONG LIST REQUESTED? + BE P1LONG YES + LA R11,11(R11) BUMP INDEX + BCT R12,P1NEXT DECR. COUNT & GET NEXT DIR ENTRY + B P1DONE COUNT EXHAUSTED, WE DONE +* +P1NEXT LA R1,LIBPKT POINT TO PARAM PKT + L R15,LM$LDNXT & GET NEXT DIR ENTRY + BALR R14,R15 + B P1LOOP +* +P1DONE AI LINCNT,-1 DECR. LINE COUNTER + BP P1DCONT > ZERO, CONTINUE + LH R11,ZA#OTL CALC OFFSET INTO OMA + LA R11,ZA#OMSG(R11) + MVC 0(MOREMSGL,R11),MOREMSG MOVE 'MORE?' TO OMA + AI ZA#OTL,MOREMSGL BUMP MSG LENGTH + MVI ZA#PSIND,ZA#PSNE SET EXTERNAL SUCCESSION + MVC ZA#PSID,=C'BEMFST' TO OURSELVES + MVI FSTPASS,X'02' SET TO CHECK 'MORE' RESPONSE + B DONE & RETURN TO MONITOR +* +P1DCONT MVI ZA#PSIND,ZA#PSNE SET EXTERNAL SUCCESSION + MVC ZA#PSID,=C'BEMFST' TO OURSELVES + MVI ZA#OAUX,ZA#OCO SET FOR CONTINUOUS OUTPUT + MVI FSTPASS,X'01' SET TO SHOW NEXT LINE + B DONE & RETURN TO MONITOR + DROP R1 +* +P1EOJ CH R12,=H'7' IS LINE EMPTY? + BL EOJ NO + XC ZA#OTL,ZA#OTL YES, SET MSG LENGTH TO ZERO + +EOJ LH R11,ZA#OTL CALC OFFSET INTO OMA + LA R11,ZA#OMSG(R11) + MVC 0(EOJMSGL,R11),EOJMSG APPEND BLANK LINE TO END OF OMA + AI ZA#OTL,EOJMSGL BUMP MSG LENGTH + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION + B DONE +* + USING L$SRCHDR,R1 +P1LONG ST R1,LF$DIRP COPY DIR. ENTRY ADDR TO PKT. + LA R1,LIBPKT POINT TO PARAM. PKT. + L R15,LM$LMHDR GO READ THE MODULE HEADER + BALR R14,R15 + LTR R0,R0 SUCCESS? + BNZ READERR NO + MVC ODCMNT,LSH$CMNT COPY COMMENTS TO OMA + BAL R14,FIXCMNT FIX NON-PRINTABLE CHARACTERS + UNPK CTEMP,LSH$DATE(4) UNPACK DATE TO TEMP + MVC ODDAT(2),CTEMP+1 MOVE DATE TO OMA + MVC ODDAT+3(2),CTEMP+3 + MVC ODDAT+6(2),CTEMP+5 + UNPK CTEMP(6),LSH$TIME(3) UNPACK TIME TO TEMP + MVC ODTIM(2),CTEMP+1 MOVE TIME TO OMA + MVC ODTIM+3(2),CTEMP+3 + B P1DONE + DROP R1 +* +PASS2 CLI FSTPASS,X'01' DISPLAY NEXT LINE? + BE P2NEXT YES +* + LH R0,ZA#ITL SET UP GETOKEN PARAMS + LA R1,ZA#IMSG + L R15,LM$GTKN + LA R11,YN GET RESPONSE TO MORE? + BALR R14,R15 + CLI YN,C'N' RESPONSE = 'N' + BE EOJ YES, QUIT + MVC LINCNT,=H'22' NO, INIT LINE COUNT & CONTINUE +* +P2NEXT LA R1,LIBPKT TRY TO OPEN THE LIBRARY + L R15,LM$LOPN + BALR R14,R15 + LTR R0,R0 SUCCESS? + BNE OPENERR NO + BAL R14,INITLINE INIT OMA WITH LINE TEMPLATE + B P1NEXT GO GET NEXT DIR. ENTRY +************ +* +* INITIALIZE PARAMETER PACKET IN CDA +* R14 = RETURN ADDRESS +* +************ +INIT LA R11,DIRBFR SET PTR TO DIR BUFFER + ST R11,LF$DBFR + LA R11,DTABFR SET PTR TO DATA BUFFER + ST R11,LF$EBFR + BR R14 +************ +* +* INITIALIZE THE OMA WITH THE LINE TEMPLATE AND SET UP INDEX (R11) +* AND LOOP COUNT (R12). +* R14 = RETURN ADDRESS +* +************ +INITLINE CLI OPTN,C'L' LONG LIST REQUESTED? + BE ILONG YES + MVC ZA#OMSG(SMRYLINL),SMRYLIN COPY SUMMARY TEMPLATE TO OMA + LA R11,SMRYLINL SET TEXT LENGTH + STH R11,ZA#OTL + MVI OLSTRT,C' ' CLEAR LINE DATA TO SPACES + MVC OLSTRT+1(L'OLSTRT-1),OLSTRT + LA R11,OLSTRT INIT. BFR PTR + LA R12,7 INIT. LOOP COUNT + BR R14 +* +ILONG MVC ZA#OMSG(DETLINL),DETLIN COPY DETAIL TEMPLATE TO OMA + LA R11,DETLINL SET TEXT LENGTH + STH R11,ZA#OTL + LA R11,ODTYP INIT. BFR PTR + LA R12,7 INIT LOOP COUNT. + BR R14 +************ +* +* SEND FILE NAME ID NOT SPECIFIED ERROR +* +************ +BADFIL MVC ZA#OMSG(NOFILL),NOFIL MOVE MSG TO OMA + LA R11,NOFILL SET MSG LENGTH + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION + B DONE +************ +* +* COULD NOT OPEN THE LIBARY +* R0 = ERROR CODE +* +************ +OPENERR MVC ZA#OMSG(OEMSGL),OEMSG COPY ERR MSG TEMPLATE TO OMA + LA R11,OEMSGL SET TEXT LENGTH + STH R11,ZA#OTL + MVC OFNAM,FNAME COPY FILE NAME TO ERROR MSG + LA R1,OCODE CVT ERROR CODE TO HEX + BAL R14,ER2HEX + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION + B DONE & RETURN TO TASKMGR +************ +* +* COULD NOT READ THE LIBARY +* R0 = ERROR CODE +* +************ +READERR MVC ZA#OMSG(REMSGL),REMSG COPY ERR MSG TEMPLATE TO OMA + LA R11,REMSGL SET TEXT LENGTH + STH R11,ZA#OTL + MVC OFNAM1,FNAME COPY FILE NAME TO ERROR MSG + LA R1,OCODE1 CVT ERROR CODE TO HEX + BAL R14,ER2HEX + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION + B DONE & RETURN TO TASKMGR +************ +* +* CONVERT AN ERROR CODE TO A 2 DIGIT HEX NUMBER. +* R0 = ERROR CODE +* R1 = PTR TO RESULT BUFFER +* R14 = RETURN ADDRESS +* +************ +ER2HEX STC R0,DTEMP SEPARATE HEX DIGITS INTO CTEMP + UNPK CTEMP(3),DTEMP(2) + TR CTEMP(2),TRHEXB XLATE TO HEX + MVC 0(2,R1),CTEMP MOVE TO RESULT BUFFER + BR R14 RETURN +************ +* +* MAKE COMMENT PRINTABLE (IN CASE OF CORRUPT SOURCE MODULE HEADER) +* +************ +FIXCMNT LA R11,ODCMNT POINT TO COMMENTS + LA R12,L'ODCMNT SET LOOP COUNT +FCLOOP CLI 0(R11),C' ' CHAR < SPACE? + BNL FC1 NO, OK + MVI 0(R11),C' ' SUBSTITUTE SPACE +FC1 CLI 0(R11),C'9' CHAR > 9? + BNH FC2 NO, OK + MVI 0(R11),C' ' SUBSTITUTE SPACE +FC2 LA R11,1(R11) BUMP PTR. + BCT R12,FCLOOP DECR. COUNT & LOOP + BR R14 RETURN TO CALLER +************ +NOFIL ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'THE FILE NAME MUST BE SPECIFIED. /FSTATUS FILE-NAME' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +NOFILL EQU *-NOFIL +************ +OEMSG ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'COULD NOT OPEN ' +OEFNAM EQU *-OEMSG + DC C'XXXXXXXX. ERROR DM' +OECODE EQU *-OEMSG + DC C'XX.' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +OEMSGL EQU *-OEMSG +************ +REMSG ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'COULD NOT READ ' +REFNAM EQU *-REMSG + DC C'XXXXXXXX. ERROR DM' +RECODE EQU *-REMSG + DC C'XX.' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +REMSGL EQU *-REMSG +************ +SMRYLIN ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE +SMRYSTRT EQU *-SMRYLIN + DC 7C'X-XXXXXXXX ' +SMRYLINL EQU *-SMRYLIN +************ +DETLIN ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE +DETTYP EQU *-DETLIN + DC C'X-' +DETNAM EQU *-DETLIN + DC C'XXXXXXXX ' +DETCMNT EQU *-DETLIN + DC C'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ' +DETDAT EQU *-DETLIN + DC C'XX/XX/XX ' +DETTIM EQU *-DETLIN + DC C'XX:XX' +DETLINL EQU *-DETLIN +************ +EOJMSG ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +EOJMSGL EQU *-EOJMSG +************ +MOREMSG ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE + DC C'MORE (Y/N)? ' + DC XL1'1E' SOE +MOREMSGL EQU *-MOREMSG +* +TRHEX DC C'0123456789ABCDEF' +TRHEXB EQU TRHEX-X'F0' +************ + ZM#DOMH +ZA#OMSG DS CL2048 OUTPUT MSG BFR. +OFNAM EQU ZA#OMSG+OEFNAM,8 +OCODE EQU ZA#OMSG+OECODE,2 +OFNAM1 EQU ZA#OMSG+REFNAM,8 +OCODE1 EQU ZA#OMSG+RECODE,2 +OLSTRT EQU ZA#OMSG+SMRYSTRT,77 +ODTYP EQU ZA#OMSG+DETTYP,1 +ODNAM EQU ZA#OMSG+DETNAM,8 +ODCMNT EQU ZA#OMSG+DETCMNT,30 +ODDAT EQU ZA#OMSG+DETDAT,8 +ODTIM EQU ZA#OMSG+DETTIM,5 +************ +WORKAREA DSECT +DTEMP DS D DOUBLE WORD ALIGNED TEMP VAR. +CTEMP DS CL8 +FNAME DS CL8 LIBRARY FILE NAME +VSN DS CL8 VOLUME ID (NOT USED) +YN DS CL8 +SAVAREA DS 18F +************ +CDA DSECT +LINCNT DS H SCREEN LINE COUNTER +FSTPASS DS X FIRST PASS FLAG (0 = FIRST PASS) +OPTN DS CL8 OPTIONS (LONG) + DS 0D +LIBPKT DS XL(LF$LNGTH) LIBRARY ROUTINES PARAM PACKET +DIRBFR DS XL256 LIBRARY DIR. PARTITION BFR +DTABFR DS XL256 LIBRARY DATA PARTITION BFR +* +BEMFST CSECT +* + END +// FIN \ No newline at end of file diff --git a/U9030/Source/BemHlp.asm b/U9030/Source/BemHlp.asm new file mode 100644 index 0000000..bac42b1 --- /dev/null +++ b/U9030/Source/BemHlp.asm @@ -0,0 +1,81 @@ + TITLE '/HELP COMMAND FOR BOYD''S BEM SIMULATOR' +BEMHLP START +*********************************************************************** +* * +* AN IMPLEMENTATION OF THE /HELP COMMAND FOR BOYD'S BEM SIMULATOR. * +* * +*********************************************************************** +* + PRINT NOGEN + ZM#DPIB + ZM#DIMH + ZM#DOMH +ZA#OMSG DS CL2048 OUTPUT MSG BFR. +BEMHLP CSECT + RGEQU +* + STM R14,R12,12(R13) +************ +* R2 = COVER +* R3 = PIB +* R4 = IMA +* R5 = WORK AREA +* R6 = OMA +* R7 = CDA +* R14 = RETURN ADDRESS +************ + BALR R2,0 SET COVER + USING *,R2 + USING ZA#DPIB,R3 + USING ZA#IMH,R4 + USING ZA#OMH,R6 +* + L R3,0(R1) COVER THE PARAMETERS + L R4,4(R1) + L R5,8(R1) + L R6,12(R1) + L R7,16(R1) +* + MVC ZA#OMSG(CMDHELPL),CMDHELP SET UP OMA WITH MESSAGE + LA R11,CMDHELPL + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION +* + LM R14,R12,12(R13) + BR R14 +* +CMDHELP ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'ALL SYSTEM COMMANDS MUST BE PRECEDED BY A SLASH.' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE + DC C'VALID COMMANDS ARE:' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE + DC C'LOGON, LOGOFF, HELP, STATUS, DISPLAY, VTOC, FSTATUS' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE + DC C'PRINT, DELETE' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +CMDHELPL EQU *-CMDHELP +* + END +// FIN \ No newline at end of file diff --git a/U9030/Source/BemLib.asm b/U9030/Source/BemLib.asm new file mode 100644 index 0000000..1517a2c --- /dev/null +++ b/U9030/Source/BemLib.asm @@ -0,0 +1,623 @@ + TITLE 'LIBRARY INTERFACE ROUTINES FOR BOYD''S BEM SIMULATOR' +BEMLIB START +*********************************************************************** +* * +* LIBRARY I/O ROUTINES FOR BOYD'S BEM SIMULATOR * +* * +*********************************************************************** + PRINT NOGEN + SUPEQU REGS=YES + SA$DSECT + DTFDM + BEMDSCTS + ENTRY L$OPEN,L$CLOSE,L$DFIRST,L$DNEXT,L$EHDR + ENTRY L$DFIND,L$EFIRST,L$ENEXT,L$DELETE +* + USING DM$DSCT,R3 + USING LIBFIL,R5 + USING SA$DSECT,R13 +* +************ +* +* OPEN A LIBRARY FILE. +* R0 = RETURNS ERROR CODE +* R1 = PTR TO PARAMTER PACKET +* R2 = COVER +* R5 = PARAM. PACKET COVER +* R14 = RETURN ADDR. +* R15 = ENTRY POINT ADDR. +* +************ + DS 0H +L$OPEN SAVE (14,12),COVER=2 + LR R5,R1 COVER PARAM. PACKET + BAL R14,L$LOCK ACQUIRE SGL THREAD LOCK + LA R3,L$DTF COVER THE DTF + MVC DC$NME,LF$NAME MDFY DTF WITH FILE NAME + LA R11,L$OPNERR SET ERROR ADDRESS + ST R11,DC$ERCD + OPEN L$DTF OPEN THE FILE + XC SA$R0,SA$R0 ERROR CODE = 0 + RETURN (14,12) + DROP R2 +************ +* +* CLOSE A LIBRARY FILE +* R14 = RETURN ADDR. +* R15 = ENTRY POINT ADDR. +* +************ +L$CLOSE SAVE (14,12),COVER=2 + CLI L$TS,X'FF' IS FILE OPEN? + BNE LC$DONE NO, IGNORE REQUEST +LC$OK LA R3,L$DTF + XR R11,R11 CLEAR ERROR ADDRESS + ST R11,DC$ERCD + CLOSE L$DTF + MVI L$TS,0 RELEASE THE LOCK +LC$DONE XC SA$R0,SA$R0 CLEAR ERROR CODE + RETURN (14,12) + DROP R2 +************ +* +* GET THE FIRST DIRECTORY ENTRY FOR THE CURRENT LIBRARY +* R0 = RETURNS ERROR CODE +* R1 = ON ENTRY PTR TO PARAMETER PACKET. ON EXIT, RETURNS PTR +* TO DIRECTORY ENTRY +* R2 = COVER +* R5 = PARAMETER PACKET COVER +* R14 = RETURN ADDRESS +* R15 = ENTRY POINT ADDR. +* +************ +L$DFIRST SAVE (14,12),COVER=2 + BAL R14,L$CKLOCK CHECK FILE HAS BEEN OPENED + ST R13,LDF$SAVE+4 SAVE SA BACK LINK + LA R13,LDF$SAVE POINT TO OUR SAVE AREA + LR R5,R1 COVER PARAMETER PACKET + LA R11,1 SET NEXT BLOCK ID TO 1 + ST R11,LF$DBLK + L R15,=A(L$DGET) READ BLOCK 1 + BALR R14,R15 + XR R1,R1 CLEAR DIR. ENTRY PTR + LTR R0,R0 I/O SUCCESS? + BNZ LDF$DONE NO, QUIT + LA R11,LBH$SIZE SET INITIAL BLK OFFSET + STH R11,LF$DOFST + L R1,LF$DBFR CALC PTR. TO DIR. ENTRY + AR R1,R11 + XR R0,R0 ERROR CODE = 0 +LDF$DONE L R13,SA$BLNK COVER CALLER SAVE AREA + ST R0,SA$R0 RETURN ERROR CODE + ST R1,SA$R1 RETURN PTR TO DIR. ENTRY + RETURN (14,12) +* +LDF$SAVE DS 18F + DROP R2 +************ +* +* GET THE NEXT DIRECTORY ENTRY FOR THE CURRENT LIBRARY +* +* R0 = RETURNS ERROR CODE +* R1 = ON ENTRY PTR TO PARAMETER PACKET. ON EXIT, RETURNS PTR +* TO DIRECTORY ENTRY +* R2 = COVER +* R5 = PARAMETER PACKET COVER +* R14 = RETURN ADDRESS +* R15 = ENTRY POINT ADDR. +* +************ +L$DNEXT SAVE (14,12),COVER=2 + BAL R14,L$CKLOCK CHECK FILE HAS BEEN OPENED + ST R13,LDN$SAVE+4 SAVE SA BACK LINK + LA R13,LDN$SAVE POINT TO OUT SAVE AREA + LR R5,R1 COVER PARAMETER PACKET + LH R11,LF$DOFST GET OFFSET TO LAST DIR ENTRY + LA R11,LDE$SIZE(R11) BUMP TO NEXT + CH R11,LF$DLEN END OF BLOCK? + BL LDN$BOK NO + L R11,LF$DBLK YES, BUMP BLOCK # + LA R11,1(R11) + ST R11,LF$DBLK + L R15,=A(L$DGET) READ NEXT BLOCK + BALR R14,R15 + XR R1,R1 CLEAR DIR. ENTRY PTR. + LTR R0,R0 I/O SUCCESS? + BNZ LDN$DONE NO, QUIT + LA R11,LBH$SIZE SET OFFSET TO 1ST ENTRY +LDN$BOK STH R11,LF$DOFST SAVE NEW OFFSET + L R1,LF$DBFR CALC PTR TO DIR. ENTRY + AR R1,R11 + XR R0,R0 ERROR CODE = 0 +LDN$DONE L R13,SA$BLNK COVER CALLER SAVE AREA + ST R0,SA$R0 RETURN ERROR CODE + ST R1,SA$R1 RETURN PTR TO DIR. ENTRY + RETURN (14,12) +* +LDN$SAVE DS 18F + DROP R2 +************ +* +* FIND AN ENTRY IN THE DIRECTORY +* R0 = RETURNS ERROR CODE +* R1 = PTR TO PARAMETER PACKET / RETURNS PTR TO DIR. ENTRY +* ZERO IF NOT FOUND +* R2 = COVER +* R5 = PARAMETER PACKET COVER +* R14 = RETURN ADDRESS +* R15 = ENTRY POINT ADDRESS +************ + USING L$DIRENT,R1 +L$DFIND SAVE (14,12),COVER=2 + BAL R14,L$CKLOCK CHECK FILE HAS BEEN OPENED + ST R13,LFN$SAVE+4 SAVE SA BACK LINK + LA R13,LFN$SAVE POINT TO OUT SAVE AREA + LR R5,R1 COVER PARAMETER PACKET + L R15,=A(L$DFIRST) GET 1ST DIRECTORY ENTRY + BALR R14,R15 + LTR R0,R0 SUCCESS? + BNZ LFN$NFND NO, QUIT +LFN$LOOP CLI LDE$TYPE,LET$EOF END OF FILE? + BE LFN$NFND YES + CLC LDE$NAME,LF$ELE NAME MATCH? + BNE LFN$NEXT NO + CLC LDE$TYPE,LF$ETYP ELE. TYPE MATCH? + BE LFN$FND YES +LFN$NEXT LR R1,R5 POINT TO PARAM PACKET + L R15,=A(L$DNEXT) GET NEXT DIRECTORY ENTRY + BALR R14,R15 + LTR R0,R0 SUCCESS? + BZ LFN$LOOP YES +* +LFN$NFND XR R1,R1 +LFN$FND L R13,SA$BLNK RESTORE R13 + ST R0,SA$R0 RETURN ERROR CODE + ST R1,SA$R1 RETURN PTR TO DIR ENTRY + RETURN (14,12) +* +LFN$SAVE DS 18F + DROP R1 +************ +* +* DELETE THE ELEMENT SPECIFIED IN THE PARAMETER PACKET. +* +* R0 = RETURNS ERROR CODE +* R1 = PTR TO PARAMETER PACKET. RETURNS ZERO IF NOT FOUND. +* ONE OTHERWISE. +* R2 = COVER +* R14 = RETURN ADDRESS +* R15 = ENTRY POINT ADDRESS +************ + USING L$DIRENT,R1 +L$DELETE SAVE (14,12),COVER=2 + BAL R14,L$CKLOCK CHECK FILE HAS BEEN OPENED + ST R13,LD$SAVE+4 SAVE SA BACK LINK + LA R13,LD$SAVE POINT TO OUT SAVE AREA + LR R5,R1 SAVE PTR TO PARAM PACKET. + L R15,=A(L$DFIND) FIND ELE TO BE DELETED + BALR R14,R15 + LTR R0,R0 SUCCESS? + BNZ LD$NFND NO + LTR R1,R1 ELEMENT FOUND? + BZ LD$NFND NO + MVI LDE$TYPE,LET$NULL SHOW ELEMENT DELETED + LR R1,R5 RESTORE PTR TO PARAM PACKET + L R15,=A(L$DPUT) REWRITE DIRECTORY BLOCK + BALR R14,R15 + LA R1,1 SHOW RECORD FOUND + B LD$FND +* +LD$NFND XR R1,R1 SHOW NOT FOUND +LD$FND L R13,SA$BLNK RESTORE R13 + ST R0,SA$R0 RETURN ERROR CODE + ST R1,SA$R1 RETURN FOUND/NOT FOUND + RETURN (14,12) & RETURN TO CALLER +* +LD$SAVE DS 18F + DROP R1 +************ +* +* READ THE ELEMENT HEADER BELONGING TO THE DIRECTORY ENTRY GIVEN +* BY LF$DIRP. +* R0 = RETURNS ERROR CODE +* R1 = PTR TO PARAMETER PACKET / RETURNS PTR TO MODULE HEADER +* R2 = COVER ADDRESS +* R4 = DIRECTORY ENTRY COVER +* R5 = PARAMETER PACKET COVEVER +* R14 = RETURN ADDRESS +* R15 = ENTRY POINT +* +************ + USING L$DIRENT,R4 +L$EHDR SAVE (14,12),COVER=2 + BAL R14,L$CKLOCK CHECK FILE HAS BEEN OPENED + ST R13,LEH$SAVE+4 SET SA BACK LINK + LA R13,LEH$SAVE POINT TO OUR SAVE AREA + LR R5,R1 COVER PARAMETER PACKET + L R4,LF$DIRP COVER DIRECTORY ENTRY + XC LF$EBLK,LF$EBLK CLEAR BLOCK # IN PKT + MVC LF$EBLK+1(3),LDE$BLK GET BLOCK # TO READ + XC LF$EOFST,LF$EOFST GET OFFSET TO HEADER + MVC LF$EOFST+1,LDE$REC + L R15,=A(L$EGET) READ THE BLOCK + BALR R14,R15 + XR R1,R1 CLEAR MODULE HEADER PTR + LTR R0,R0 I/O SUCCESS? + BNZ LEH$DONE NO, QUIT + L R1,LF$EBFR CALC. PTR TO MODULE HEADER + AH R1,LF$EOFST +* +LEH$DONE L R13,SA$BLNK COVER CALLER SAVE AREA + ST R0,SA$R0 RETURN ERROR CODE + ST R1,SA$R1 RETURN PTR TO DIR. ENTRY + RETURN (14,12) +* +LEH$SAVE DS 18F + DROP R2,R4 +************ +* +* GET THE FIRST RECORD OF AN ELEMENT +* +* R0 = RETURNS ERROR CODE +* R1 = PTR TO PARAMETER PACKET +* R2 = COVER ADDRESS +* R4 = DIRECTORY ENTRY COVER +* R5 = PARAMETER PACKET COVEVER +* R6 = SOURCE MODULE HEADER COVER +* R14 = RETURN ADDRESS +* R15 = ENTRY POINT ADDR. +* +************ + USING L$DIRENT,R4 + USING L$MODHDR,R6 +L$EFIRST SAVE (14,12),COVER=2 + BAL R14,L$CKLOCK CHECK FILE HAS BEEN OPENED + ST R13,LEN$SAVE+4 SET SA BACK LINK + LA R13,LEN$SAVE POINT TO OUR SAVE AREA + LR R5,R1 COVER PARAM PACKET + L R4,LF$DIRP COVER DIRECTORY ENTRY +* + XC LF$EBLK,LF$EBLK SET 1ST DATA BLOCK # + MVC LF$EBLK+1(3),LDE$BLK + L R15,=A(L$EGET) READ THE BLOCK + BALR R14,R15 + LTR R0,R0 SUCCESS? + BNZ LEN$DONE +* +* BUMP PAST MODULE HEADER +* + XR R6,R6 GET OFFSET TO MODULE HEADER + IC R6,LDE$REC + STH R6,LF$EOFST SAVE IT + A R6,LF$EBFR POINT TO MODULE HDR IN BUFFER + XR R11,R11 GET MODULDE HDR LENGTH + IC R11,LMH$LEN + LA R11,2(R11) CALC. OFFSET TO 1ST DATA RECORD + AH R11,LF$EOFST + STH R11,LF$EOFST SAVE IT. + B L$ENEXT1 GO GET DATA RECORD + DROP R2,R4,R6 +************ +* +* GET THE NEXT RECORD OF AN ELEMENT +* R0 = RETURNS ERROR CODE +* R1 = PTR TO PARAMETER PACKET +* R2 = COVER ADDRESS +* R4 = PTR. TO USER'S LINE BFR +* R5 = PARAMETER PACKET COVEVER +* R7 = SOURCE MODULE HEADER COVER +* R14 = RETURN ADDRESS +* R15 = ENTRY POINT ADRESS +* +************ + USING L$MODHDR,R7 +L$ENEXT SAVE (14,12),COVER=2 + BAL R14,L$CKLOCK CHECK FILE HAS BEEN OPENED + ST R13,LEN$SAVE+4 SET SA BACK LINK + LA R13,LEN$SAVE POINT TO OUR SAVE AREA + LR R5,R1 COVER PARAM PACKET +* +L$ENEXT1 BALR R2,0 + USING *,R2 +* + L R4,LF$SBFR GET USER'S SOURCE BFR ADDR. + MVI 0(R4),C' ' CLEAR THE USER'S BUFFER + MVC 1(255,R4),0(R4) + LH R11,LF$EOFST GET OFFSET TO RECORD + CH R11,LF$ELEN END OF BLOCK? + BL LEN$OK NO + L R11,LF$EBLK BUMP BLOCK # + LA R11,1(R11) + ST R11,LF$EBLK + L R15,=A(L$EGET) READ THE BLOCK + BALR R14,R15 + LTR R0,R0 SUCCESS? + BNZ LEN$DONE NO + LA R11,LBH$SIZE SET INITIAL OFFSET +* +LEN$OK LR R7,R11 CALC. ADDR OF RECORD + A R7,LF$EBFR + XR R10,R10 GET LENGTH OF RECORD + IC R10,LMH$LEN + STH R10,LEN$LEN SAVE IT FOR LATER + AR R10,R11 CALC. OFFSET TO NEXT RECORD + LA R10,2(R10) + STH R10,LF$EOFST SAVE IT + CLI LMH$TYPE,X'24' TRUNCATED? + BE LEN$TRNC YES + CLI LMH$TYPE,X'25' COMPRESSED + BE LEN$COMP YES + B LEN$EOF IF NOT ONE OF ABOVE, END OF ELE. +* +LEN$TRNC LH R10,LEN$LEN GET LENGTH OF DATA + AH R10,=H'-1' MAKE ZERO RELATIVE + EX R10,LEN$MVC MOVE DATA TO USER BUFFER + XR R0,R0 SHOW NOT END OF FILE + B LEN$DONE +* +LEN$COMP LH R10,LEN$LEN +LEN$LOOP LTR R10,R10 END OF RECORD + BNP LEN$EOR YES + XR R11,R11 GET # BLANKS + IC R11,3(R7) + AR R4,R11 BUMP USER BFR PTR. + IC R11,2(R7) GET DATA LENGTH + EX R11,LEN$MVC1 MOVE DATA TO USER BUFFER + LA R4,1(R11,R4) BUMP USER DATA BFR PTR + LA R11,3(R11) BUMP LENGTH TO INCLUDE HDR. + AR R7,R11 BUMP DATA BUFFER PTR. + SR R10,R11 DECR. RECORD LENGTH + B LEN$LOOP & LOOP +* +LEN$EOR XR R0,R0 SHOW NOT END OF FILE + B LEN$DONE +* +LEN$EOF LA R0,1 SHOW END OF FILE +* +LEN$DONE L R13,LEN$SAVE+4 RESTORE CALLER'S R13 + ST R0,SA$R0 RETURN R1 + RETURN (14,12) +* +LEN$SAVE DS 18F +LEN$LEN DS H +LEN$MVC MVC 0(0,R4),2(R7) +LEN$MVC1 MVC 0(0,R4),4(R7) + DROP R2,R7 +************ +* +* READ THE DIRECTORY BLOCK WHOSE BLOCK NUMBER IS GIVEN BY LF$DBLK +* R0 = RETURNS ERROR CODE +* R2 = COVER ADDRESS +* R3 = DTF COVER +* R4 = LIBRARY BLOCK HEADER COVER +* R5 = PARAMETER PACKET ADDRESS (SET BY CALLER) +* R6 = PCA COVER +* R14 = RETURN ADDRESS +* R15 = ENTRY POINT +* +************ + USING L$BLKHDR,R4 + USING PCA,R6 +L$DGET SAVE (14,12),COVER=2,SA=L$SAVE +* + LA R3,L$DTF COVER THE DTF + LA R6,L$DIRPCA COVER DIRECTORY PCA + L R4,LF$DBFR COVER THE I/O BUFFER + LA R11,L$GETERR SET ERROR ADDRESS + ST R11,DC$ERCD + L R11,LF$DBLK SET THE BLOCK # TO READ + ST R11,PC$PCAID + ST R4,PC$A1F SET I/O BFR ADDRESS + MVI PC$IOCNT,1 SET TO READ 1 BLOCK + GET L$DTF,L$DIRPCA READ THE BLOCK + XC FTEMP,FTEMP CONFIRM THAT BLOCK JUST READ IS + MVC FTEMP+1(3),LBH$NUM THE ONE WE ASKED FOR + C R11,FTEMP + BNE L$BADBLK OOPS! + XR R11,R11 GET BLOCK SIZE + IC R11,LBH$LEN + LA R11,LBH$SIZE(R11) ADD HEADER SIZE TO GET ACTUAL + STH R11,LF$DLEN SAVE IT +* + L R13,SA$BLNK RESTORE R13 + XC SA$R0,SA$R0 CLEAR ERROR CODE + RETURN (14,12) RESTORE REGS & RETURN + DROP R2,R4,R6 +************ +* +* WRITE THE DIRECTORY BLOCK WHOSE BLOCK NUMBER IS GIVEN BY LF$DBLK +* R0 = RETURNS ERROR CODE +* R2 = COVER ADDRESS +* R3 = DTF COVER +* R4 = LIBRARY BLOCK HEADER COVER +* R5 = PARAMETER PACKET ADDRESS (SET BY CALLER) +* R6 = PCA COVER +* R14 = RETURN ADDRESS +* R15 = ENTRY POINT +* +************ + USING L$BLKHDR,R4 + USING PCA,R6 +L$DPUT SAVE (14,12),COVER=2,SA=L$SAVE +* + LA R3,L$DTF COVER THE DTF + LA R6,L$DIRPCA COVER DIRECTORY PCA + L R4,LF$DBFR COVER THE I/O BUFFER + LA R11,L$GETERR SET ERROR ADDRESS + ST R11,DC$ERCD + L R11,LF$DBLK SET THE BLOCK # TO READ + ST R11,PC$PCAID + ST R4,PC$A1F SET I/O BFR ADDRESS + MVI PC$IOCNT,1 SET TO READ 1 BLOCK + PUT L$DTF,L$DIRPCA WRITE THE BLOCK +* + L R13,SA$BLNK RESTORE R13 + XC SA$R0,SA$R0 CLEAR ERROR CODE + RETURN (14,12) RESTORE REGS & RETURN + DROP R2,R4,R6 +************ +* +* READ THE DATA (ELEMENT) BLOCK WHOSE BLOCK NUMBER IS GIVEN BY LF$EBLK +* R0 = RETURNS ERROR CODE +* R2 = COVER ADDRESS +* R3 = DTF COVER +* R4 = LIBRARY BLOCK HEADER COVER +* R5 = PARAMETER PACKET ADDRESS (SET BY CALLER) +* R6 = PCA COVER +* R14 = RETURN ADDRESS +* R15 = ENTRY POINT +* +************ + USING L$BLKHDR,R4 + USING PCA,R6 +L$EGET SAVE (14,12),COVER=2,SA=L$SAVE +* + LA R3,L$DTF COVER THE DTF + LA R6,L$DTAPCA COVER DATA PCA + L R4,LF$EBFR COVER THE I/O BUFFER + LA R11,L$GETERR SET ERROR ADDRESS + ST R11,DC$ERCD + L R11,LF$EBLK SET THE BLOCK # TO READ + ST R11,PC$PCAID + ST R4,PC$A1F SET I/O BFR ADDRESS + MVI PC$IOCNT,1 SET TO READ 1 BLOCK + GET L$DTF,L$DTAPCA READ THE BLOCK + XC FTEMP,FTEMP CONFIRM THAT BLOCK JUST READ IS + MVC FTEMP+1(3),LBH$NUM THE ONE WE ASKED FOR + C R11,FTEMP + BNE L$BADBLK OOPS! + XR R11,R11 GET BLOCK SIZE + IC R11,LBH$LEN + LA R11,LBH$SIZE(R11) ADD HEADER SIZE TO GET ACTUAL + STH R11,LF$ELEN SAVE IT +* + L R13,SA$BLNK RESTORE CALLER'S R13 + XC SA$R0,SA$R0 CLEAR ERROR CODE + RETURN (14,12) RESTORE REGS & RETURN + DROP R2,R4,R6 +************ +* +* ACQUIRE THE LIBRARY I/O LOCK +* +* R11 = COVER +* R14 = RETURN ADDRESS +* +************ +L$LOCK BALR R11,0 + USING *,R11 +L$LOOP TS L$TS TRY TO SET THE LOCK + BZ LL$OK SUCCESS + SETIME 10,WAIT,M FAIL, WAIT A BIT + B L$LOOP & TRY AGAIN +LL$OK BR R14 + DROP R11 +************ +* +* CHECK THAT THE LIBRARY LOCK IS SET. IF LOCK IS NOT SET, SET +* THE ERROR CODE IN R0 AND RETURN TO THE ORIGINAL CALLER. +* +* R0 = RETURNS ERROR CODE +* R11 = COVER +* R14 = RETURN ADDRESS +* +************ +L$CKLOCK BALR R11,0 + USING *,R11 + CLI L$TS,X'FF' IS FILE OPEN? + BE LCL$LOK YES, CONTINUE + LA R0,X'13' SET 'FILE NOT OPEN' ERR CODE + ST R0,SA$R0 + XC SA$R1,SA$R1 CLEAR PTR TO DIR. ENTRY + RETURN (14,12) RETURN TO CALLER +* +LCL$LOK BR R14 + DROP R11 +************ +* +* ERROR OCCURRED WHEN ATTEMPTING TO OPEN THE LIBRARY +* +************ +L$OPNERR BALR R2,0 + USING *,R2 + LA R1,OP$ERCD GET ERROR CODE TO ERR MSG + BAL R14,L$ER2HEX + ST R0,SA$R0 RETURN R0 + OPR OP$ERR,L'OP$ERR SHOW MSG TO OPERATOR + RETURN (14,12) +************ +* +* ERROR OCCURRED WHEN ATTEMPTING TO READ THE LIBRARY +* +************ +L$GETERR BALR R2,0 + USING *,R2 + LA R1,GT$ERCD GET ERROR CODE TO ERR MSG + BAL R14,L$ER2HEX + L R13,SA$BLNK RESTORE R13 + ST R0,SA$R0 RETURN R0 + OPR GT$ERR,L'GT$ERR SHOW MSG TO OPERATOR + RETURN (14,12) +************ +* +* CONVERT THE CURRENT ERROR CODE (DC$ERCD) TO A 2 DIGIT HEX NUMBER. +* ALSO PUTS DC$ERCD INTO R0 FOR RETURN TO CALLER. +* R1 = PTR TO RESULT BUFFER +* R11 = COVER +* R14 = RETURN ADDRESS +* +************ + DS 0H +L$ER2HEX BALR R11,0 + USING *,R11 + UNPK EH$TEMP,DC$ERCD(2) SEPARATE HEX DIGITS INTO EHTEMP + TR EH$TEMP(2),TRHEXB XLATE TO HEX + MVC 0(2,R1),EH$TEMP MOVE TO RESULT BUFFER + XR R0,R0 GET ERR CODE TO R0 + IC R0,DC$ERCD + BR R14 RETURN +************ + DS 0H +L$ERROR BALR R2,0 + USING *,R2 + OPR OOPS,L'OOPS + EOJ +* +L$BADBLK BALR R2,0 + USING *,R2 + OPR BADBLK,L'BADBLK + CANCEL 99 +* +L$DTF DTFPF PCA1=L$DIRPCA, X + PCA2=L$DTAPCA, X + PCA3=L$BLKPCA, X + ERROR=L$ERROR, X + WAIT=YES +* +L$DIRPCA PCA BLKSIZE=256, X + IOAREA1=DUMMY, X + LACE=18 +* +L$DTAPCA PCA BLKSIZE=256, X + IOAREA1=DUMMY, X + LACE=18 +* +L$BLKPCA PCA BLKSIZE=256, X + IOAREA1=DUMMY, X + LACE=18 +* +DUMMY EQU * DUMMY I/O AREA +L$SAVE DS 18F +L$TS DS XL1 LOCK TO MAKE LIB IO SGL THREAD +OP$ERR DC C'OPEN ERROR DM ' +OP$ERCD EQU OP$ERR+13,2 +GT$ERR DC C'READ ERROR DM ' +GT$ERCD EQU GT$ERR+13,2 +EH$TEMP DS CL3 +TRHEX DC C'0123456789ABCDEF' +TRHEXB EQU TRHEX-X'F0' +OOPS DC C'OOPS!' +BADBLK DC C'WRONG BLOCK NUMBER' +FTEMP DS F +* + END +// FIN \ No newline at end of file diff --git a/U9030/Source/BemLogoff.asm b/U9030/Source/BemLogoff.asm new file mode 100644 index 0000000..c3c3a86 --- /dev/null +++ b/U9030/Source/BemLogoff.asm @@ -0,0 +1,81 @@ + TITLE '/LOGOFF COMMAND FOR BOYD''S BEM SIMULATOR' +BEMLGF START +*********************************************************************** +* * +* AN IMPLEMENTATION OF THE /LOGOFF COMMAND FOR BOYD'S BEM SIMULATOR. * +* * +*********************************************************************** +* + PRINT NOGEN + ZM#DPIB + ZM#DIMH +ZA#IMSG DS CL2048 + ZM#DOMH +ZA#OMSG DS CL2048 OUTPUT MSG BFR. +BRMLGF CSECT + RGEQU + BEMDSCTS +* + STM R14,R12,12(R13) +************ +* R2 = COVER +* R3 = PIB +* R4 = IMA +* R5 = WORK AREA +* R6 = OMA +* R7 = CDA +* R10 = TERM TABLE +* R14 = RETURN ADDRESS +************ + BALR R2,0 SET COVER + USING *,R2 + USING LOWMEM,R0 + USING ZA#DPIB,R3 + USING ZA#IMH,R4 + USING ZA#OMH,R6 + USING TERMTBL,R10 +* + L R3,0(R1) COVER THE PARAMETERS + L R4,4(R1) + L R5,8(R1) + L R6,12(R1) + L R7,16(R1) +* +* CLEAR THE PTR. TO THE LOGGED ON USER IN THE TERMINAL TABLE +* + L R1,ZA#ISTID FIND TERMINAL TABLE + L R15,LM$FTNAM + BALR R14,R15 + LTR R10,R1 DID WE FIND IT? + BZ DONE NO, WTF??? + XC TT$USER,TT$USER +* +* SEND USER LOGGED OFF MESSAGE +* + MVC ZA#OMSG(LOGOFOKL),LOGOFOK SET UP OMA WITH MESSAGE + LA R11,LOGOFOKL + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION + XC TT$USER,TT$USER CLEAR PTR TO USER TABLE + NI TT$FLAGS,X'FF'--TT$LOGON CLEAR LOGGED ON FLAG +* +DONE LM R14,R12,12(R13) RESTORE REGISTERS + BR R14 RETURN TO MONITOR +* +LOGOFOK ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'USER SUCCESSFULLY LOGGED OFF' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +LOGOFOKL EQU *-LOGOFOK +* + END +// FIN \ No newline at end of file diff --git a/U9030/Source/BemLogon.asm b/U9030/Source/BemLogon.asm new file mode 100644 index 0000000..3a48e86 --- /dev/null +++ b/U9030/Source/BemLogon.asm @@ -0,0 +1,190 @@ + TITLE '/LOGON COMMAND FOR BOYD''S BEM SIMULATOR' +BEMLGN START +*********************************************************************** +* * +* AN IMPLEMENTATION OF THE /LOGON COMMAND FOR BOYD'S BEM SIMULATOR. * +* * +*********************************************************************** +* + PRINT NOGEN + ZM#DPIB + ZM#DIMH +ZA#IMSG DS CL2048 + ZM#DOMH +ZA#OMSG DS CL2048 OUTPUT MSG BFR. +BEMLGN CSECT + RGEQU + BEMDSCTS +* + STM R14,R12,12(R13) +************ +* R2 = COVER +* R3 = PIB +* R4 = IMA +* R5 = WORK AREA +* R6 = OMA +* R7 = CDA +* R9 = USER TABLE +* R10 = TERM TABLE +* R14 = RETURN ADDRESS +************ + BALR R2,0 SET COVER + USING *,R2 + USING LOWMEM,R0 + USING ZA#DPIB,R3 + USING ZA#IMH,R4 + USING WORKAREA,R5 + USING ZA#OMH,R6 + USING USERTBL,R9 + USING TERMTBL,R10 +* + L R3,0(R1) COVER THE PARAMETERS + L R4,4(R1) + L R5,8(R1) + L R6,12(R1) + L R7,16(R1) +* +* SEE IF USER IS ALREADY LOGGED ON +* + L R1,ZA#ISTID FIND TERMINAL TABLE + L R15,LM$FTNAM + BALR R14,R15 + LTR R10,R1 DID WE FIND IT? + BZ BADTRM NO, WTF??? + CLC TT$USER,LM$ZERO IS THERE ALREADY A USER? + BNE LOGGEDON YES +* +* DECODE THE INPUT MESSAGE +* + LH R0,ZA#ITL SET UP GETOKEN PARAMS + LA R1,ZA#IMSG + L R15,LM$GTKN + LA R11,USERID BURN '/LOGON' + BALR R14,R15 + LA R11,USERID GET USER ID + BALR R14,R15 + LA R11,ACCTID GET ACCT. ID. + BALR R14,R15 + LA R11,PASSWD GET PASSWORD + BALR R14,R15 +* +* SEE IF WE CAN FIND THE USER IN THE USER TABLE +* + L R9,LM$UFRST POINT TO 1ST USER TABLE +LOOP CLC UT$ID,USERID CHECK USER ID + BNE NEXT NOT VALID + CLC UT$ACCT,ACCTID CHECK ACCT. ID + BNE NEXT NOT VALID + CLC UT$PWD,PASSWD CHECK PASSWORD + BE SUCCESS A MATCH!! +NEXT L R9,UT$NEXT POINT TO NEXT USER TABLE + LTR R9,R9 END OF TABLE? + BNZ LOOP NO, KEEP TRYING +* +* SEND BAD USER ID MESSAGE +* + MVC ZA#OMSG(BADUSERL),BADUSER SET UP OMA WITH MESSAGE + LA R11,BADUSERL + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION + B DONE +* +* SEND LOGON SUCCESS MESSAGE +* +SUCCESS MVC ZA#OMSG(LOGONOKL),LOGONOK SET UP OMA WITH MESSAGE + LA R11,LOGONOKL + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION + ST R9,TT$USER SAVE PTR TO USER TBL + OI TT$FLAGS,TT$LOGON SET LOGGED ON FLAG + GETIME S SAVE LOGGED ON TIME + ST R0,TT$LGNDT + ST R1,TT$LGNTM + B DONE +* +* SEND ALREADY LOGGED ON MESSAGE +* +LOGGEDON MVC ZA#OMSG(ALRDYONL),ALRDYON SET UP OMA WITH MESSAGE + LA R11,ALRDYONL + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION + B DONE +* +* SEND UNKNOWN TERMINAL MESSAGE +* +BADTRM MVC ZA#OMSG(UNKTERML),UNKTERM SET UP OMA WITH MESSAGE + LA R11,UNKTERML + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION + B DONE +* +DONE LM R14,R12,12(R13) RESTORE REGISTERS + BR R14 RETURN TO MONITOR +* +BADUSER ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'INVALID ID, ACCOUNT, PASSWORD FOR LOGON' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +BADUSERL EQU *-BADUSER +* +LOGONOK ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'USER SUCCESSFULLY LOGGED ON' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +LOGONOKL EQU *-LOGONOK +* +ALRDYON ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'TERMINAL ALREADY LOGGED ON, PROCEED' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +ALRDYONL EQU *-ALRDYON +* +UNKTERM ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'TERMINAL NOT CONFIGURED' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +UNKTERML EQU *-UNKTERM +* +WORKAREA DSECT +USERID DS CL4 +ACCTID DS CL4 +PASSWD DS CL4 +* + END +// FIN \ No newline at end of file diff --git a/U9030/Source/BemPrint.asm b/U9030/Source/BemPrint.asm new file mode 100644 index 0000000..d6c3b12 --- /dev/null +++ b/U9030/Source/BemPrint.asm @@ -0,0 +1,367 @@ + TITLE '/PRINT COMMAND FOR BOYD''S BEM SIMULATOR' +BEMPRT START +*********************************************************************** +* * +* AN IMPLEMENTATION OF THE /PRINT COMMAND FOR BOYD'S BEM SIMULATOR. * +* * +*********************************************************************** +* + PRINT NOGEN + SUPEQU REGS=YES + SA$DSECT + ZM#DPIB + ZM#DIMH +ZA#IMSG DS CL2048 +BEMPRT CSECT + BEMDSCTS +* + SAVE (14,12),COVER=2 +************ +* R2 = COVER +* R3 = PIB +* R4 = IMA +* R5 = WORK AREA +* R6 = OMA +* R7 = CDA +* R14 = RETURN ADDRESS +************ + USING LOWMEM,R0 + USING ZA#DPIB,R3 + USING ZA#IMH,R4 + USING WORKAREA,R5 + USING ZA#OMH,R6 + USING CDA,R7 + USING LIBFIL,R8 + USING SA$DSECT,R13 +* + L R3,0(R1) COVER THE PARAMETERS + L R4,4(R1) + L R5,8(R1) + L R6,12(R1) + L R7,16(R1) + LA R8,LIBPKT COVER LIB RTNS PARAM PKT + ST R13,SAVAREA+4 + LA R13,SAVAREA + BAL R14,INIT INIT. LIB. PARAM PACKET +* +* PARSE COMMAND LINE +* + LH R0,ZA#ITL SET UP GETOKEN PARAMS + LA R1,ZA#IMSG + L R15,LM$GTKN + LA R11,ELENAME BURN '/PRINT' + BALR R14,R15 + LA R11,ELENAME GET THE ELEMENT NAME + BALR R14,R15 + LA R11,FNAME GET THE FILE NAME + BALR R14,R15 + LA R11,VSN GET VOLUME ID + BALR R14,R15 + LA R11,ELETYP GET ELEMENT TYPE + BALR R14,R15 +* +* VALIDATE PARAMS. +* + CLI ELENAME,C' ' ELEMENT NAME BLANK? + BE NOELE YES, OOPS! + CLI FNAME,C' ' FILE NAME BLANK? + BE NOFIL YES, OOPS! + CLI ELETYP,C' ' ELEMENT TYPE BLANK? + BNE CHKTYP NO, CONTINUE + MVC ELETYP,VSN COPY VOLUME ID TO ELE TYPE +CHKTYP CLI ELETYP,C' ' ELEMENT TYPE STILL BLANK? + BE BADTYP YES, OOPS + CLI ELETYP,C'S' SOURCE ELEMENT? + BNE CHKPROC NO, CONTINUE + MVI LIBTYP,LET$SRC YES, ALL GOOD + B CHKELE +CHKPROC CLI ELETYP,C'P' PROC ELEMENT? + BNE CHKMAC NO, CONTINUE + MVI LIBTYP,LET$PROC YES, ALL GOOD + B CHKELE +CHKMAC CLI ELETYP,C'M' MACRO ELEMENT? + BNE BADTYP NO, OOPS + MVI LIBTYP,LET$PROC YES,ALL GOOD +* +* SEE IF ELEMENT/FILE IS VALID +* +CHKELE MVC LF$NAME,FNAME SET UP PARAM PKT + MVC LF$ELE,ELENAME + MVC LF$ETYP,LIBTYP + LA R1,LIBPKT POINT TO PARAMS. + L R15,LM$LOPN TRY TO OPEN FILE + BALR R14,R15 + LTR R0,R0 SUCCESS? + BNZ BADFIL NO + L R15,LM$LFIND SEE IF IT EXISTS IN FILE + BALR R14,R15 + LTR R0,R0 ERROR CODE = 0? + BNZ BADELE NO, OOPS! + LTR R1,R1 ELEMENT FOUND? + BZ BADELE NO, OOPS + ST R1,LF$DIRP SAVE PTR TO DIR. ENTRY +* + L R15,LM$POPEN OPEN THE PRINTER + BALR R14,R15 + LTR R0,R0 SUCCESS? + BNZ BADPRT NO +* +* PRINT THE ELEMENT +* + LA R1,LIBPKT POINT TO PARAMETERS + L R15,LM$LEFST GET 1ST SOURCE LINE + BALR R14,R15 +PLOOP LTR R0,R0 EOF? + BNZ PDONE YES + LA R0,SRCBFR POINT TO SOURCE BUFFER + L R15,LM$PWRIT WRITE LINE TO PRINTER + BALR R14,R15 + LTR R0,R0 SUCCESS? + BNZ BADPRT NO + LA R1,LIBPKT POINT TO PARAMETERS + L R15,LM$LENXT GET NEXT SOURCE LINE + BALR R14,R15 + B PLOOP +* +PDONE L R15,LM$PCLSE CLOSE THE PRINTER + BALR R14,R15 +* + + MVC ZA#OMSG(EOJMSGL),EOJMSG MOVE MSG TO OMA + LA R11,EOJMSGL SET MSG LENGTH + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION +* +DONE L R15,LM$LCLS CLOSE THE LIBRARY + BALR R14,R15 + L R13,SA$BLNK RESTORE R13 + RETURN (14,12) RESTORE REGS & RETURN TO MON. +************ +* +* INITIALIZE PARAMETER PACKET IN WORK AREA +* R14 = RETURN ADDRESS +* +************ +INIT LA R11,DIRBFR SET PTR TO DIR BUFFER + ST R11,LF$DBFR + LA R11,DTABFR SET PTR TO DATA BUFFER + ST R11,LF$EBFR + LA R11,SRCBFR SET PTR TO SRC LINE BUFFER + ST R11,LF$SBFR + BR R14 +************ +* +* SEND FILE NAME MISSING ERROR +* +************ +NOFIL MVC ZA#OMSG(FILMSNGL),FILMSNG MOVE MSG TO OMA + LA R11,FILMSNGL SET MSG LENGTH + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION + B DONE +************ +* +* SEND INVALID FILE NAME ERROR +* +************ +BADFIL MVC ZA#OMSG(INVFILL),INVFIL MOVE MSG TO OMA + LA R11,INVFILL SET MSG LENGTH + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION + B DONE +************ +* +* SEND ELEMENT NAME MISSING ERROR +* +************ +NOELE MVC ZA#OMSG(ELEMSNGL),ELEMSNG MOVE MSG TO OMA + LA R11,ELEMSNGL SET MSG LENGTH + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION + B DONE +************ +* +* SEND INVALID ELEMENT NAME ERROR +* +************ +BADELE MVC ZA#OMSG(INVELEL),INVELE MOVE MSG TO OMA + LA R11,INVELEL SET MSG LENGTH + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION + B DONE +************ +* +* SEND INVALID ELEMENT TYPE ERROR +* +************ +BADTYP MVC ZA#OMSG(TYPERRL),TYPERR MOVE MSG TO OMA + LA R11,TYPERRL SET MSG LENGTH + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION + B DONE +************ +* +* SEND PRINTER ERROR +* +************ +BADPRT MVC ZA#OMSG(PRTERRL),PRTERR MOVE MSG TO OMA + LA R11,PRTERRL SET MSG LENGTH + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION + B DONE +************ +* +* SEND LIBRARY I/O ERROR +* +************ +BADLIB MVC ZA#OMSG(LIBERRL),LIBERR MOVE MSG TO OMA + LA R11,LIBERRL SET MSG LENGTH + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION + B DONE +************ +FILMSNG ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'FILE NAME MISSING' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +FILMSNGL EQU *-FILMSNG +************ +INVFIL ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'FILE NAME NOT FOUND' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +INVFILL EQU *-INVFIL +************ +ELEMSNG ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'ELEMENT NAME MISSING' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +ELEMSNGL EQU *-ELEMSNG +************ +INVELE ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'ELEMENT NAME / TYPE NOT FOUND' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +INVELEL EQU *-INVELE +************ +TYPERR ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'ELEMENT TYPE MUST BE SPECIFIED (S/P/M)' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +TYPERRL EQU *-TYPERR +************ +PRTERR ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'PRINTER ERROR' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +PRTERRL EQU *-PRTERR +************ +LIBERR ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'ERROR WHILE READING SOURCE ELEMENT' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +LIBERRL EQU *-LIBERR +************ +EOJMSG ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'PRINT COMPLETE' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +EOJMSGL EQU *-EOJMSG +************ + ZM#DOMH +ZA#OMSG DS CL2048 OUTPUT MSG BFR. +************ +WORKAREA DSECT +DTEMP DS D DOUBLE WORD ALIGNED TEMP VAR. +CTEMP DS CL8 +ELENAME DS CL8 SOURCE ELEMENT NAME +FNAME DS CL8 LIBRARY FILE NAME +VSN DS CL8 VOLUME ID (NOT USED) +ELETYP DS CL8 ELEMENT TYPE (S/P) +LIBTYP DS XL1 LIBRARY FRIENDLY ELE TYPE +SAVAREA DS 18F + DS 0F +LIBPKT DS XL(LF$LNGTH) LIBRARY ROUTINES PARAM PACKET +DIRBFR DS XL256 LIBRARY DIR. PARTITION BFR +DTABFR DS XL256 LIBRARY DATA PARTITION BFR +SRCBFR DS CL256 SOURCE LINE BUFFER +************ +CDA DSECT +DUMMY DS XL1 +* +BEMPRT CSECT +* + END +// FIN \ No newline at end of file diff --git a/U9030/Source/BemPrinter.asm b/U9030/Source/BemPrinter.asm new file mode 100644 index 0000000..9da95cc --- /dev/null +++ b/U9030/Source/BemPrinter.asm @@ -0,0 +1,128 @@ + TITLE 'PRINTER SUPPORT FOR BOYD''S BEM SIMULATOR' +BEMPRNTR START +*********************************************************************** +* * +* PRINTER SUPPORT FOR BEM SIMULATOR * +* * +*********************************************************************** + PRINT NOGEN + SUPEQU REGS=YES + SA$DSECT + BEMDSCTS +* + USING LOWMEM,R0 + USING SA$DSECT,R13 + ENTRY P$OPEN,P$BRKPT,P$CLOSE,P$PUT +************ +* +* OPEN A NEW PRINTER FILE. +* R2 = COVER +* R14 = RETURN ADDRESS +* R15 = ENTRY PT. +* +************ +P$OPEN SAVE (14,12),COVER=2 + BAL R14,P$LOCK ACQUIRE THE SINGLE THREAD LOCK + CLI POPEN,X'FF' IS IT ALREADY OPEN? + BE PO$DONE YES, WE'RE DONE + OPEN PRNTR OPEN THE PRINTER + MVI POPEN,X'FF' SHOW FILE OPEN +PO$DONE XC SA$R0,SA$R0 CLEAR ERROR CODE + RETURN (14,12) RETURN TO CALLER +************ +* +* ACQUIRE THE SINGLE THREAD LOCK +* +************ +P$LOCK TS PLOCK TRY TO ACQUIRE THE LOCK + BZ PL$OK WE GOT IT + SETIME 10,WAIT,M BUSY, WAIT A BIT + B P$LOCK & LOOP +PL$OK BR R14 RETURN TO CALLER + DROP R2 +************ +* +* BREAKPOINT THE PRINT FILE +* R2 = COVER +* R14 = RETURN ADDRESS +* R15 = ENTRY PT. +* +************ +P$BRKPT SAVE (14,12),COVER=2 + CLI PLOCK,X'FF' IS PRINTER OURS? + BNE PC$SKIP NO, SKIP REQUEST + BRKPT PRNTR BREAKPOINT THE FILE + MVI PLOCK,X'00' RELEASE THE LOCK +PC$SKIP RETURN (14,12) + DROP R2 +************ +* +* CLOSE THE PRINTER. ONLY CALLED AT EOJ +* R2 = COVER +* R14 = RETURN ADDRESS +* R15 = ENTRY PT. +* +************ +P$CLOSE SAVE (14,12),COVER=2 + CLOSE PRNTR + MVI POPEN,X'00' + MVI PLOCK,X'00' + RETURN (14,12) + DROP 2 +************ +* +* WRITE A LINE TO THE PRINTER FILE +* R0 = ADDRESS OF PRINT LINE BUFFER (132 CHARS). RETURNS ERROR +* CODE. +* R2 = COVER +* R14 = RETURN ADDRESS +* R15 = ENTRY PT. +* +************ +P$PUT SAVE (14,12),COVER=2 + CLI PLOCK,X'FF' IS PRINTER OURS? + BE PP$OK YES, CONTINUE + LA R0,X'02' SET 'INVALID MACRO SEQ' ERROR + ST R0,SA$R0 + RETURN (14,12) & RETURN TO CALLER +* +PP$OK ST R13,PP$SAVE+4 SAVE SA BACK LINK + LA R13,PP$SAVE POINT TO OUR SAVE AREA + PUT PRNTR,(0) WRITE THE PRINT LINE + L R13,SA$BLNK RESTORE R13 + XC SA$R0,SA$R0 CLEAR ERROR CODE + RETURN (14,12) & RETURN TO CALLER +* +PP$SAVE DS 18F + DROP R2 +************ +* +* ERROR HANDLER +* R2 = COVER +* +************ +PRTERR BALR R2,0 + USING *,R2 + CLC SA$BLNK(4),LM$ZERO SA BACK LINE = ZERO? + BE PE$OK YES, CONTINUE + L R13,SA$BLNK RESTORE R13 FROM BACK LINK +PE$OK XR R0,R0 ERROR CODE TO R0 + IC R0,PRNTRC + ST R0,SA$R0 RETURN ERROR CODE + RETURN (14,12) RETURN TO CALLER + DROP R2 +************ +PLOCK DC X'00' +POPEN DC X'00' + DS 0H +PRTBFR DS CL132 +* +PRNTR DTFPR BLKSIZE=132, X + ERROR=PRTERR, X + IOAREA1=PRTBFR, X + PRAD=1, X + PRINTOV=SKIP, X + WORKA=YES +* + END +// FIN \ No newline at end of file diff --git a/U9030/Source/BemRdy.asm b/U9030/Source/BemRdy.asm new file mode 100644 index 0000000..410a5d0 --- /dev/null +++ b/U9030/Source/BemRdy.asm @@ -0,0 +1,59 @@ + TITLE 'SEND ''BEM READY'' MESSAGE FOR BOYD''S BEM SIMULATOR' +BEMRDY START +*********************************************************************** +* * +* A SIMPLE PROGRAM TO SEND TO 'BEM READY' MESSAGE TO THE USER'S * +* TERMINAL. * +* * +*********************************************************************** +* + PRINT NOGEN + ZM#DPIB + ZM#DIMH + ZM#DOMH +ZA#OMSG DS CL2048 OUTPUT MSG BFR. +BEMRDY CSECT + RGEQU +* + STM R14,R12,12(R13) +************ +* R2 = COVER +* R3 = PIB +* R4 = IMA +* R5 = WORK AREA +* R6 = OMA +* R7 = CDA +* R14 = RETURN ADDRESS +************ + BALR R2,0 SET COVER + USING *,R2 + USING ZA#DPIB,R3 + USING ZA#IMH,R4 + USING ZA#OMH,R6 +* + L R3,0(R1) COVER THE PARAMETERS + L R4,4(R1) + L R5,8(R1) + L R6,12(R1) + L R7,16(R1) +* + MVC ZA#OMSG(RDYL),RDY SET UP OMA WITH MESSAGE + LA R11,RDYL + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION +* + LM R14,R12,12(R13) + BR R14 +* +RDY ZO#COORD 1,1 CURSOR HOME + DC XL1'27' ERASE PROTECTED DISPLAY + DC CL1'M' + ZO#COORD 1,22 LINE 22 COLUMN 1 + DC XL1'1E' SOE + DC C'BOYD''S BEM SIMULATOR READY' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +RDYL EQU *-RDY +* + END +// FIN \ No newline at end of file diff --git a/U9030/Source/BemSimulator.asm b/U9030/Source/BemSimulator.asm new file mode 100644 index 0000000..48143ff --- /dev/null +++ b/U9030/Source/BemSimulator.asm @@ -0,0 +1,1370 @@ + TITLE 'MAIN PROGRAM FOR BOYD''S BEM SIMULATOR' +*********************************************************************** +* * +* A BEM SIMULATOR. * +* * +* SINCE BEM RELIED ON UNDOCUMENTED SUPERVISOR CALLS TO IMPLEMENT SOME * +* OF ITS FEATURES THIS SIMULATOR WILL BE LACKING THINGS LIKE THE * +* ABILITY TO START JOBS, ETC. * +* * +*********************************************************************** +* +BEMSIM START + PRINT NOGEN + SUPEQU REGS=YES, X + TCB=NO, X + PRE=YES, X + SIB=NO, X + IO=NO, X + TRN=NO + TQ#X ALL ICAM PACKETS + DTFDM + ZM#DPIB + ZM#DIMH +ZA#IMSG DS CL2032 INPUT MSG BFR. + ZM#DOMH +ZA#OMSG DS CL2032 OUTPUT MSG BFR. +BEMSIM CSECT + BEMDSCTS + EJECT + EXTRN L$OPEN,L$CLOSE,L$DFIRST,L$DNEXT,L$DFIND,L$EHDR + EXTRN L$EFIRST,L$ENEXT,P$OPEN,P$BRKPT,P$CLOSE,P$PUT + EXTRN L$DELETE,BS$INIT,BS$CLOSE +*********************************************************************** +* * +* LOW MEMORY * +* * +* COMMONLY USED VARIABLES ARE STORED HERE AT A WELL KNOWN ADDRESS * +* (ZERO). THAT MEANS THAT THIS OBJECT MODULE MUST BE THE FIRST ONE * +* INCLUDED IN LNKEDT. * +* * +*********************************************************************** + DC 8XL1'00' LOW MEMORY TEST PATTERN + DC 8XL1'FF' IF THIS CHANGES WE GOT PROBLEMS + DC F'0' TTL FREE MEMORY AT BEM START + DC A(0) START OF FREE MEMORY + DC A(0) END OF FREE MEMORY + DC H'0' # OF TERMINALS + DC H'0' UNUSED + DC A(0) FIRST TERM. TABLE + DC A(0) LAST TERM. TABLE + DC A(0) LAST TERM. SERVICED + DC A(PRGMS) FIRST PGM. TABLE + DC A(PRGMSL) LAST PGM. TABLE + DC F'0' MAX. PGM SIZE + DC A(0) FIRST USER TABLE + DC A(0) LAST USER TABLE + DC A(ALIASES) FIRST ALIAS TABLE + DC A(ALIASESL) LAST ALIAS TABLE + DC A(MAIN+2) MAIN PGM COVER + DC A(CLRMEM) CLEAR MEMORY ENTRY PT. + DC A(CPYMEM) COPY MEMORY ENTRY PT. + DC A(GETOKEN) GET TOKEN ENTRY PT. + DC A(FNDTNAM) FIND TERM. NAME ENTRY PT. + DC A(0) MCT INPUT BUFFER + DC A(0) MCT OUTPUT BUFFER + DC A(L$OPEN) LIBRARY OPEN ENTRY PT. + DC A(L$CLOSE) LIBRARY CLOSE ENTRY PT. + DC A(L$DFIRST) LIBRARY DIR 1ST ENTRY PT. + DC A(L$DNEXT) LIBRARY DIR NEXT ENTRY PT. + DC A(L$DFIND) LIBRARY FIND ELEMENT + DC A(L$EHDR) LIBRARY GET MODULE HDR ENTRY PT. + DC A(L$EFIRST) LIBRARY GET ELE 1ST LINE + DC A(L$ENEXT) LIBRARY GET ELE NEXT LINE + DC A(P$OPEN) OPEN A PRINT FILE + DC A(P$BRKPT) CLOSE A PRINT FILE + DC A(P$PUT) WRITE A PRINT LINE + DC A(L$DELETE) LIBRARY DELETE AN ELEMENT + DS 18F REGISTER SAVE AREA + EJECT +*********************************************************************** +* * +* MAIN ENTRY POINT * +* * +* IT IS ASSUMED THAT THE FOLLOWING REGISTER WILL ALWAYS BE INTACT. * +* MESS WITH IT AT YOUR OWN RISK. * +* * +* R2 = COVER REGISTER * +* R1 = MCTI COVER * +* R11 = VOLATILE WORK REGISTER * +* R12 = VOLATILE WORK REGISTER * +* R13 = REGISTER SAVE AREA * +* * +*********************************************************************** + DS 0H +MAIN BALR R2,0 INIT COVER + USING *,R2 + USING LOWMEM,R0 + USING TN#MCTDS,R1 + LA R13,SAVAREA POINT TO REGISTER SAVE AREA +* + BAL R14,INIT PERFORM PROGRAM INTIALIZATION +* +* ATTACH TO OPCOM ISLAND CODE ROUTINE +* + STXIT OC,OPCOM,OCSAVE,OCMSG,L'OCMSG +* +* START RECEIVING MESSAGES +* +MRECV LA R1,MCTI COVER INPUT MCT PACKET + L R11,LM$IBFR POINT TO INPUT BFR + LA R11,16(R11) BUMP PAST IMA + ST R11,TN#MCBFA + LA R11,2048 SET BFR LENGTH + STH R11,TN#MCBAL + XC TN#MCCHC,TN#MCCHC CLEAR INPUT CHAR COUNT + XC TN#MCCKB,TN#MCCKB CLEAR BFR CNTRL BYTE + LA R11,1 SET LINE & TERM IDS TO 1 + STH R11,TN#MCLID + STH R11,TN#MCTIN + MCPCALL (1) START BALL ROLLING +* +MYIELD CYIELD +* +* IF WE WAKE UP HERE IT MEANS THAT WE NEED TO DO SOMETHING FOR THE +* WORKER TASK. RIGHT NOW, THE ONLY SOMETHING WE MIGHT NEED TO DO +* IS SEND PENDING OUTPUT OR PERFORM SHUTDOWN PROCESSING. +* + CLI EOJFLG,X'FF' EOF REQUESTED? + BE FIN YES + MCPCALL MCTO + B MYIELD +* +FIN BAL R14,TERMN8 PERFORM PROGRAM SHUTDOWN + EOJ +************ +* +* MCT OUTPUT COMPLETION HANDLER +* +* R3 = MCT PACKET COVER +* +************ + USING TN#MCTDS,R3 + USING TERMTBL,R1 +OCMPL L R2,LM$MAIN RE-ESTABLISH COVER + LR R3,R1 COVER MCT PACKET + L R1,TN#MCLID GET LINE / TERM NUMBERS + LA R15,FNDTNUM FIND OUR TERM TABLE + BALR R14,R15 + LTR R1,R1 TABLE FOUND? + BZ OCDONE NO, SKIP THE REST + TM TT$FLAGS,TT$WAITO CONTINUOUS OUTPUT IN PROGRESS? + BZ OCDONE NO + MVI TT$DLVCD,0 SHOW SUCCESSFUL OUTPUT DELIVERY + OI TT$FLAGS,TT$ODELV SET OUTPUT DELV. NOTIFICATION + NI TT$FLAGS,X'FF'--TT$WAIT CLEAR TERM WAITING FLAGS + AI M$ICNT,1 BUMP PENDING INPUT COUNT + AWAKE TM$ECB WAIT UP TASK MANAGER +* +OCDONE MVI M$OBUSY,0 CLEAR OUTPUT BUSY FLAG + B MYIELD + DROP R1,R3 +************ +* +* MCT INPUT COMPLETION HANDLER +* +* R3 = MCT PACKET COVER +* R4 = SAT PCA COVER +* R5 = I/O BUFFER (IMA) COVER +* R6 = TERM TABLE COVER +* +************ + USING TN#MCTDS,R3 + USING PCA,R4 + USING ZA#IMH,R5 + USING TERMTBL,R6 +ICMPL L R2,LM$MAIN RE-ESTABLISH COVER + LA R13,SAVAREA POINT TO REGISTER SAVE AREA + LR R3,R1 COVER MCT PACKET +* +* CHECK FOR ERRORS +* + CLI TN#MCST1,0 STATUS = 0? + BE ISTOK YES, OK??? + TM TN#MCST1,X'80' BUFFER COMPLETION STATUS? + BO ISTOK YES, OK + OPR ICERR,L'ICERR TELL OPR OF ERROR + XR R0,R0 GET STATUS CODE TO R0 + IC R0,TN#MCST1 + CANCEL (0) TAKE A DUMP +* +ISTOK L R1,TN#MCLID GET LINE / TERM NUMBERS + LA R15,FNDTNUM FIND OUR TERM TABLE + BALR R14,R15 + LTR R6,R1 TABLE FOUND? + BZ ICDONE NO, SKIP THE REST + TM TT$FLAGS,TT$IPEND ALREADY INPUT PENDING? + BO ICDONE YES, DROP THIS MESSAGE +* +* WRITE INPUT MSG TO DISC BUFFER FOR TERMINAL +* +IFLWAIT TS SCR1LOCK ACQUIRE FILE LOCK + BZ IFLOK SUCCESS + SETIME 10,WAIT,M FAIL, WAIT A BIT + B IFLWAIT & LOOP +* +IFLOK LA R4,SCR1P1 COVER I/O BUFFER PARTITION + L R5,LM$IBFR COVER INPUT BFR (IMA) + MVI 0(R5),0 CLEAR IMA PORTION OF INPUT BFR + MVC 1(15,R5),0(R5) + MVC ZA#ISTID,TT$NAME COPY TERM NAME TO IMA + LH R11,TN#MCCHC COPY MSG LENGTH TO IMA + STH R11,ZA#ITL + ST R5,PC$A1F SET PCA I/O BUFFER ADDRESS + MVI PC$IOCNT,1 SET TO WRITE 1 BLOCK + LH R11,TT$TNUM GET TERM BFR BLOCK # + ST R11,PC$PCAID + PUT $SCR1,SCR1P1 + MVI SCR1LOCK,0 RELEASE FILE LOCK +* + NI TT$FLAGS,X'FF'--TT$WAIT CLEAR TERM WAITING FLAGS + OI TT$FLAGS,TT$IPEND SET INPUT PENDING FLAG + AI M$ICNT,1 BUMP PENDING INPUT COUNT + AWAKE TM$ECB WAKE UP THE WORKER TASK +* +ICDONE B MRECV + DROP R3,R4,R5,R6 +************ +* +* PROGRAM INITIALIZATION +* +* R2 = COVER +* R3 = TERM. TABLE +* R12 = JOB PREAMBLE COVER +* R14 = RETURN ADDR. +* +************ + USING JP$PRE,R12 + USING TERMTBL,R3 +INIT ST R14,SAVR14 SAVE RETURN ADDR. +* +* DETERMINE START AND END OF FREE MEMORY REGION +* + GETINF PRE,PREBFR,JP$LNGTH,0 + L R12,=A(PREBFR) COVER PREAMBLE INFO + L R11,JP$JSE SAVE END OF PGM ADDR + DALGN R11 BUMP TO NEXT DBL WORD + ST R11,LM$FSTRT AS FREE MEM START + L R11,JP$JOB SAVE END OF MEMORY ADDR + ST R11,LM$FEND AS FREE MEM END + S R11,LM$FSTRT CALC. TTL FREE + ST R11,LM$FTTL +* + OPEN $SCR1 OPEN THE BFR/CDA FILE + L R15,=A(BS$INIT) OPEN & INIT THE SCRATCH FILE + BALR R14,R15 +* +* INITIALIZE TASK MANAGER BY ALLOCATION ACTIVIATION RECORD BUFFERS +* AND STARTING WORKER SUB TASK. +* + LA R1,2048+16 2048+16 BYTE IMA + BAL R8,GETMEM + ST R1,TM$IMA + LA R1,2048+16 2048+16 BYTE OMA + BAL R8,GETMEM + ST R1,TM$OMA + LH R1,=H'4096' 4096 BYTE WORK AREA + BAL R8,GETMEM + ST R1,TM$WA + LH R1,=H'4096' 4096 BYTE CDA + BAL R8,GETMEM + ST R1,TM$CDA + LA R1,ZA#PLEN PROG INFO BLOCK + BAL R8,GETMEM + ST R1,TM$PIB +* ALLOCATE ICAM BUFFERS + LA R1,2048+16 2048+16 BYTE MCT INPUT BFR + BAL R8,GETMEM + ST R1,LM$IBFR + LA R1,2048 2048 BYTE MCT OUTPUT BFR + BAL R8,GETMEM + ST R1,LM$OBFR +* + ATTACH TM$ECB,TASKMGR START THE SUB TASK +* + BAL R14,CONFIG READ CONFIG FROM CTL STREAM +* + BAL R14,PGMINFO GET THE SIZE OF ALL PRGMS. + L R11,LM$FEND CALC. SIZE OF REMAINING FREE MEM + S R11,LM$FSTRT + C R11,LM$PMAX ENOUGH TO LOAD LARGEST PGM? + BNL IMEMOK YES + OPR INSUFMEM,L'INSUFMEM NO, TELL OPERATOR + CANCEL 102 ABORT +* +* SET UP BEMRDY TO RUN ON ALL TERMINALS +* +IMEMOK L R3,LM$TFRST SET UP 1ST TERM TO RUN +BRLOOP L R11,=A(BEMRDY) BEMRDY PRGM. + ST R11,TT$NXTPG + MVI TT$FLAGS,0 + L R3,TT$NEXT GET PTR TO NEXT TERM + LTR R3,R3 = ZERO? + BNZ BRLOOP NO, LOOP + AWAKE TM$ECB WAKE UP THE TASK MGR. + + L R14,SAVR14 RESTORE RETURN ADDR. + BR R14 RETURN + DROP R12 +************ +* +* TERMINATION PROCESSING +* R2 = COVER +* R14 = RETURN ADDR. +* +************ +TERMN8 ST R14,SAVR14 SAVE RETURN ADDR. + STXIT OC DETACH OPCOM ISLAND CODE + DETACH TM$ECB,TERMN81 STOP THE SUB TASK +TERMN81 CLOSE $SCR1 CLOSE THE BFR/CDA FILE + L R15,=A(BS$CLOSE) CLOSE THE SCRATCH FILE + BALR R14,R15 + L R15,=A(P$CLOSE) CLOSE THE PRINTER FILE + BALR R14,R15 +NREL NETREL EDT CLOSE THE NETWORK +* + L R14,SAVR14 RESTORE RETURN ADDR. + BR R14 +************ +* +* READ CONFIGURATION PARAMETERS FROM THE CONTROL STREAM. EACH PARAMETER +* OCCUPIES 1 RECORD. +* +* R2 = COVER +* R14 = RETURN ADDR. +* +* NETWORK-NAME +* TERM-NAME1 +* TERM-NAME2 +* ... +* TERM-NAMEN +* USER ID1,ACCT1,PWD1 +* USER ID2,ACCT2,PWD2 +* ... +* USER IDN,ACCTN,PWDN +* +* WHEN THE NETWORK ID IS READ, ATTEMPT TO OPEN THE NETWORK. AS EACH +* TERMINAL ID IS READ, VALIDATE IT AND CREATE A TERMINAL TABLE ENTRY +* USING INFO FROM THE CCA TABLES. +* +************ + USING TERMTBL,R3 + USING TC#CCOTP,R4 + USING USERTBL,R5 +CONFIG ST R14,CSAVR14 SAVE RETURN ADDRESS +CONFIG1 GETCS CSBFR GET A CONTROL STREAM RECORD + LTR R0,R0 END OF STREAM? + BZ CEOS YES + CLI CSBFR,C'/' SKIP /$, /* AND // PARAM + BE CONFIG1 + CLI CSBFR,C'*' SKIP COMMENTS + BE CONFIG1 +CSWTCH NOP CTERM DO TERMS AFTER 1ST RECORD +* +* PROCESS NETWORK ID RECORD +* + MVC NREQ+12(4),CSBFR MOVE NET NAME TO NETREQ PACKET + MVC NREL+12(4),CSBFR MOVE NET NAME TO NETREL PACKET + MVI CSWTCH+1,X'F0' MAKE NOP A BRANCH +* +* OPEN THE NETWORK +* + MVI M$FUNC,M$NETREQ SET CRNT FUNCTION CODE +NREQ NETREQ EDT,ERRET=NETERR + CH R0,LM$ZERO ALL OK? + BNE NETERR NO, OOPS! + B CONFIG1 LOOP +* +* LOOK UP INFO FOR EACH TERMINAL AND BUILD OUR TERMINAL TABLE +* +CTERM CLC CSBFR(5),=C'USER ' USER DEFINITION? + BE CUSER YES + MVC TNAME,CSBFR COPY TERM. NAME TO CCACPY PKT + LH R11,=H'-1' SET END OF LIST FLAG + ST R11,TNAME+4 + MVI M$FUNC,M$CCACPY SET CRNT FUNCTION CODE + CCACPY TNAME,TNAMEL, X + CCAINFO,CCAINFOL GET TERM. INFO + AI LM$TCNT,1 BUMP # OF TERMINALS + LA R1,TT$LNGTH ALLOC. MEM FOR TERM. TABLE + BAL R8,GETMEM + L R3,LM$TFRST IS THIS THE FIRST ENTRY? + LTR R3,R3 + BNZ CTTERM1 NO + ST R1,LM$TFRST YES, SAVE CRNT AS FIRST +CTTERM1 L R3,LM$TLAST GET PTR TO LAST TERM TBL + LTR R3,R3 IS THIS THE FIRST ENTRY? + BZ CTTERM2 YES + ST R1,TT$NEXT NO, SAVE LINK TO NEXT ENTRY +CTTERM2 ST R1,LM$TLAST SAVE CRNT AS LAST TERM TBL. + LR R3,R1 COVER CRNT TERM TBL. + L R4,=A(CCAINFO) COVER CCAINFO PKT. + MVC TT$NAME,TC#CTRM SAVE TERMINAL NAME + MVC TT$LINE,TC#CLLN LINE # + MVC TT$ID,TC#CTIDX TERM # + MVC TT$TNUM,LM$TCNT BFR FILE REC # + MVI TT$FLAGS,TT$WAITI FLAG BYTE (WAIT FOR INPUT) +* +* CREATE A CDA RECORD FOR THIS TERM +* + USING PCA,R11 + L R11,=A(SCR1P2) COVER PCA FOR CDA PARTITION + XC PC$PCAID,PC$PCAID SET REC # TO TT$TNUM + MVC PC$PCAID+2,TT$TNUM + MVC PC$A1F,TM$CDA SET I/O BFR TO CDA + MVI PC$IOCNT,1 SET 1 RECORD TO WRITE + PUT $SCR1,SCR1P2 WRITE THE CDA RECORD + B CONFIG1 & LOOP + DROP R11 +* +* SAVE A USER DEFINITION +* +CUSER LA R0,L'CSBFR INIT. GETOKEN PARAMS + LA R1,CSBFR + L R15,LM$GTKN + LA R11,USERID BURN 'USER' + BALR R14,R15 + LA R11,USERID GET USER ID + BALR R14,R15 + LA R11,ACCTID GET ACCOUNT ID + BALR R14,R15 + LA R11,PASSWD GET PASSWORD + BALR R14,R15 + LA R1,UT$LNGTH ALLOC MEM FOR USER TABLE + BAL R8,GETMEM + L R5,LM$UFRST IS THIS THE FIRST ENTRY? + LTR R5,R5 + BNZ CUSER1 NO + ST R1,LM$UFRST YES, SAVE CRNT AS FIRST +CUSER1 L R5,LM$ULAST GET PTR TO LAST USER TBL + LTR R5,R5 IS THIS THE FIRST ENTRY? + BZ CUSER2 YES + ST R1,UT$NEXT NO, SAVE LINK TO NEXT ENTRY +CUSER2 ST R1,LM$ULAST SAVE CRNT AS LAST TERM TBL. + LR R5,R1 COVER CRNT USER TABLE + MVC UT$ID,USERID SAVE USER ID + MVC UT$ACCT,ACCTID ACCOUNT ID + MVC UT$PWD,PASSWD PASSWORD + B CONFIG1 & LOOP +* +* CCACPY FAILED, SO ASSUME AN INVALID TERMINAL ID +* +CTERR MVC BADTRM(4),TNAME TERM ID TO ERR MSG + OPR BADTRM,L'BADTRM + B CONFIG1 TRY AGAIN +* +CEOS L R14,CSAVR14 RESTOR RETURN ADDRESS + BR R14 RETURN +CSAVR14 DS F + DROP R3,R4,R5 +************ +* +* GET SIZE OF ALL CONFIGURED PROGRAMS +* +* R3 = PROGRAM TABLE COVER +* R4 = PHASE HEADER COVER +* R14 = RETURN ADDRESS +* +************ + USING PGMTBL,R3 + USING PHASEHDR,R4 +PGMINFO LA R4,PINFO POINT TO PHASE HDR BFR + L R3,LM$PFRST GET 1ST PGM TBL ENTRY +PILOOP LTR R3,R3 END OF TBL? + BZ PIDONE YES + LA R1,PT$MNAME POINT TO MODULE NAME + LOADI (1),PINFO,L'PINFO,PIBADPGM + MVC PT$SIZE,PH$PLNTH SAVE THE PHASE LENGTH + L R11,PT$SIZE IS SIZE > THAN MAX SO FAR? + C R11,LM$PMAX + BNH PINEXT NO + ST R11,LM$PMAX YES, SAVE IT +PINEXT L R3,PT$NEXT POINT TO NEXT ENTRY + B PILOOP & LOOP + +PIDONE BR R14 +* +PIBADPGM MVC BADPGM(8),PT$MNAME PGM NAME TO MSG + OPR BADPGM,L'BADPGM TELL OPERATOR + B PINEXT DO NEXT PGM + DROP R3,R4 +************ +* +* ALLOCATE A BLOCK OF MEMORY & CLEAR IT TO ZEROS +* +* R1 = BLOCK SIZE ON ENTRY +* R1 = PTR. TO BLOCK ON EXIT +* R8 = RETURN ADDR +* +************ +GETMEM ST R8,GMSAVE SAVE RETURN ADDR. + DALGN R1 BUMP SIZE TO NEXT DBL WORD + L R11,LM$FSTRT GET PTR. TO BLOCK START + LR R12,R11 SAVE IT FOR A BIT + LA R11,0(R1,R11) BUMP FREE MEMORY START ADDRESS + ST R11,LM$FSTRT SAVE IT + C R11,LM$FEND PAST END OF MEMORY? + BH GMOOM YES, ABORT WITH OUT OF MEM ERROR + LR R0,R1 CLEAR BLOCK TO ZERO + LR R1,R12 + L R15,LM$CLRM + BALR R8,R15 + LR R1,R12 RETURN BLOCK PTR TO CALLER + L R8,GMSAVE RESTORE RETURN ADDR. + BR R8 +* +GMOOM OPR NOMEM,L'NOMEM + CANCEL 100 +* +GMSAVE DS F +************ +* +* FIND A TERMINAL TABLE USING THE LINE AND TERMINAL NUMBERS +* R1 = LINE / TERM # TO FIND ON ENTRY +* R1 = TERM TABLE ADDRESS (ZERO IF NO FIND) ON EXIT +* R11 = TERM TABLE +* R14 = RETURN ADDRESS +* R15 = ENTRY PT. +* +************ + USING *,R15 + USING TERMTBL,R11 +FNDTNUM L R11,LM$TFRST POINT TO 1ST TERM TABLE +FTLOOP C R1,TT$IDF IS THIS THE ONE WE WANT? + BE FTOK YES + L R11,TT$NEXT GET NEXT TERM TABLE + LTR R11,R11 END OF TABLE? + BNZ FTLOOP NO, TRY AGAIN + XR R11,R11 SHOW NO FIND + +FTOK LR R1,R11 RETURN TERM TABLE ADDRESS + BR R14 & RETURN + DROP R11,R15 +************ +* +* FIND A TERMINAL TABLE USING THE TERMINAL NAME +* R1 = TERMINAL NAME TO FIND ON ENTRY +* R1 = TERM TABLE ADDRESS (ZERO IF NO FIND) ON EXIT +* R11 = TERM TABLE +* R14 = RETURN ADDRESS +* R15 = ENTRY PT. +* +************ + USING *,R15 + USING TERMTBL,R11 +FNDTNAM L R11,LM$TFRST POINT TO 1ST TERM TABLE +FNLOOP C R1,TT$NAME IS THIS THE ONE WE WANT? + BE FNOK YES + L R11,TT$NEXT GET NEXT TERM TABLE + LTR R11,R11 END OF TABLE? + BNZ FNLOOP NO, TRY AGAIN + XR R11,R11 SHOW NO FIND + +FNOK LR R1,R11 RETURN TERM TABLE ADDRESS + BR R14 & RETURN + DROP R11,R15 +************ +* +* NETWORK ERROR HANDLER +* R0 = ERROR CODE +* +************ +NETERR L R2,LM$MAIN RE-ESTABISH COVER + N R0,=F'65535' ISOLATE ERROR CODE + CLI M$FUNC,M$CCACPY IS CRNT FUNC CCACPY? + BE CTERR YES, INVALID TERMINAL ID + LR R11,R0 SAVE ERROR CODE + XR R1,R1 GET NETWORK FUNC CODE + IC R1,M$FUNC + SLL R1,5 MULT. BY 32 + A R1,=A(NERR1ST) ADD TO 1ST MSG ADDR. + OPR (1),32 + LR R0,R11 RESTORE ERROR CODE + CANCEL (0) +************ +* +* BUFFER / CDA FILE ERROR HANDLER +* +************ + USING DM$DSCT,R1 +SCR1ERR L R2,LM$MAIN RE-ESTABLISH COVER + OPR SCRIOERR,L'SCRIOERR TELL OPERATOR + LA R1,$SCR1 COVER THE DTF + XR R0,R0 GET THE ERROR CODE + IC R0,DC$ERCD + CANCEL (0) + DROP R1 +* +INSUFMEM DC C'INSUFFICIENT MEMORY TO LOAD LARGEST PROGRAM' +SCRIOERR DC C'I/O ERROR ON WORK1' +BADTRM DC C' INVALID TERMINAL ID' +BADPGM DC C' INVALID PROGRAM NAME' +NOMEM DC C'OUT OF MEMORY' +ICERR DC C'ERROR DETECTED DURING INPUT COMPLETION' +* +* NETWORK ERROR MESSAGES. THIS MUST BE KEPT IN THIS ORDER. +* +NQERR DC CL32'NETWORK REQUEST ERROR' +CCERR DC CL32'CCACPY ERROR' +NSERR DC CL32'SEND ERROR' +NRERR DC CL32'RECEIVE ERROR' +NERR1ST EQU NQERR +* +EOJFLG DC XL1'00' END OF JOB FLAG +SAVR14 DS F RETURN ADDR SAVE AREA +SAVAREA DS 18F REGISTER SAVE AREA +USERID DS CL4 CONFIG USER ID +ACCTID DS CL4 CONFIG ACCOUNT ID +PASSWD DS CL4 CONFIG PASSWORD +************ +* +* THE FOLLOWING DEFINES A BUNCH OF TEMPORARY BUFFERS THAT ARE USED +* AND RE-USED DURING INTIALIZATION. DO NOT DEFINE ANY CONSTANTS HERE +* AS THEY WILL LIKELY BE SMASHED. +* +************ + DS 0D +PREBFR DS XL(JP$LNGTH) JOB PREAMBLE BUFFER +* + ORG PREBFR RE-USE THIS BFR AFTER INIT. +CSBFR DS CL80 +TNAME DS 2F TERMINAL NAME PKT FOR CCACPY +TNAMEL EQU *-TNAME +CCAINFO DS 10F TERM INFO RETURNED HERE. +CCAINFOL EQU *-CCAINFO +* + ORG PREBFR RE-USE THIS BFR AFTER INIT. +PINFO DS XL70 PGM PHASE HDR INFO + ORG PREBFR+JP$LNGTH +* + LTORG +* + EJECT +************ +* +* TASK MANAGER +* R2 = COVER +* R3 = TERM. TABLE +* R4 = PRGM. TABLE +* R5 = PIB +* R6 = DISK BUFFER FILE PCA +* +************ + USING TERMTBL,R3 + USING PGMTBL,R4 + USING ZA#DPIB,R5 + USING PCA,R6 +* +TASKMGR BALR R2,0 ESTABLISH NEW COVER + USING *,R2 +* + LA R13,TM$SAVE POINT TO SAVE AREA +TMYIELD CLI M$ICNT,0 ANY PENDING INPUT? + BH TM0 YES, DON'T YIELD YET + TYIELD WAIT FOR SOMETHING TO HAPPEN + +* +* WHEN WE WAKE UP HERE WE SCAN THE TERMINAL TABLE LOOKING FOR +* SOMETHING DO DO. WE START THE SEARCH WITH THE TERMINAL AFTER THE LAST +* TERMINAL SERVICED. THE FIRST TERMINAL THAT WE FIND WITH NO WAIT FLAGS +* SET GETS SCHEDULED AND ITS ENTRY IS SAVED AS THE LAST SERVICED. +* +TM0 L R3,LM$TLSVC GET LAST TERM SERVICED + LTR R3,R3 = ZERO? + BZ TM1 YES + L R3,TT$NEXT NO, GET NEXT TERM. + LTR R3,R3 = ZERO? + BZ TM1 YES + B TM2 +TM1 L R3,LM$TFRST START WITH FIRST TERM. +TM2 ST R3,TM$SAVE SAVE STARTING POINT +* +TMSCAN TM TT$FLAGS,TT$WAIT ANY WAITING FLAGS SET? + BZ TMINIT NO, INIT. ACTIVATION RECORD +TMNEXT L R3,TT$NEXT YES, GET NEXT TERM. TBL ENTRY + LTR R3,R3 = ZERO? + BNZ TM3 NO + L R3,LM$TFRST YES, WRAP TO FIRST +TM3 C R3,TM$SAVE EQUAL TO STARTING POINT? + BE TMYIELD YES, WE'RE DONE + B TMSCAN NO, LOOP +* +TMINIT ST R3,LM$TLSVC SAVE CRNT AS LAST SERVICED +* +* INITIALIZE ACTIVIATION RECORD +* + L R15,LM$CLRM GET CLRMEM ENTRY PT. + LA R0,ZA#PLEN INIT PIB + L R1,TM$PIB + BALR R8,R15 + L R5,TM$PIB COVER THE PIB + LA R11,24 STD MSG LINES + STH R11,ZA#PMNL + LA R11,80 STD LINE LENGTH + STH R11,ZA#PMLL + LH R11,=H'4096' WORK AREA SIZE + STH R11,ZA#PWA + STH R11,ZA#PCDIN CDA INPUT LENGTH + STH R11,ZA#PCDO CDA OUTPUT LENGTH +* + LA R0,2064 INIT IMA + L R1,TM$IMA + BALR R8,R15 + L R1,TM$IMA + USING ZA#IMH,R1 + MVC ZA#ISTID,TT$NAME +* + LA R0,2064 INIT OMA + L R1,TM$OMA + BALR R8,R15 + L R1,TM$OMA + USING ZA#OMH,R1 + MVC ZA#ODTID,TT$NAME +* + LH R0,=H'4096' WORK AREA + L R1,TM$WA + BALR R8,R15 +* + LH R0,=H'4096' CDA + L R1,TM$CDA + BALR R8,R15 + DROP R1 +* +* READ CDA FROM DISK IF THERE IS A SUCCESSOR PROGRAM +* + CLC TT$NXTPG,LM$ZERO NEXT PGM ADDR = ZERO? + BE TMNOCDA YES, NO NEED TO LOAD CDA +TMLWAIT2 TS SCR1LOCK ACQUIRE FILE LOCK + BZ TMLOK2 SUCCESS + SETIME 10,WAIT,M FAIL, WAIT A BIT + B TMLWAIT2 & LOOP +* +TMLOK2 LA R6,SCR1P2 COVER CDA PARTITION + L R11,TM$CDA POINT TO IMA + ST R11,PC$A1F SET PCA I/O BUFFER ADDRESS + MVI PC$IOCNT,1 SET TO WRITE 1 BLOCK + LH R11,TT$TNUM GET TERM BFR BLOCK # + ST R11,PC$PCAID + GET $SCR1,SCR1P2 + MVI SCR1LOCK,0 RELEASE FILE LOCK +* +* IF CONTINUOUS OUTPUT ACTIVE, COPY CONT. OTPT. CODE TO IMA +* + USING ZA#IMH,R11 + L R11,TM$IMA COVER IMA + TM TT$FLAGS,TT$ODELV OTPT DELIVERY NOTIFY SET? + BZ TMNOCDA NO + MVC ZA#ITL+4(4),TT$CONT COPY CONT OTPT CODE TO IMA + MVC ZA#ITL+5(1),TT$DLVCD COPY DELV. NOTIFY CODE TO IMA + NI TT$FLAGS,X'FF'--TT$ODELV CLEAR OTPT DELIVERY NOTIFY FLAG + AI M$ICNT,-1 DECR. PENDING INPUT COUNT + DROP R11 +* +* READ ANY PENDING INPUT FROM DISK BUFFER +* +TMNOCDA TM TT$FLAGS,TT$IPEND INPUT PENDING? + BZ TMEXEC NO, GO EXECUTE THE PROGRAM +TMLWAIT TS SCR1LOCK YES, ACQUIRE FILE LOCK + BZ TMLOK SUCCESS + SETIME 10,WAIT,M FAIL, WAIT A BIT + B TMLWAIT & LOOP +* +TMLOK LA R6,SCR1P1 COVER I/O BUFFER PARTITION + L R11,TM$IMA POINT TO IMA + ST R11,PC$A1F SET PCA I/O BUFFER ADDRESS + MVI PC$IOCNT,1 SET TO WRITE 1 BLOCK + LH R11,TT$TNUM GET TERM BFR BLOCK # + ST R11,PC$PCAID + GET $SCR1,SCR1P1 + MVI SCR1LOCK,0 RELEASE FILE LOCK + NI TT$FLAGS,X'FF'--TT$IPEND CLEAR INPUT PENDING FLAG + AI M$ICNT,-1 DECR. PENDING INPUT COUNT +* +* GET FIRST TOKEN FROM INPUT +* + USING ZA#IMH,R1 + L R1,TM$IMA COVER IMA + LH R0,ZA#ITL GET MSG. LENGTH + LA R1,ZA#IMSG POINT TO INPUT MSG. + LA R11,TM$TOKEN POINT TO TOKEN BFR + L R15,LM$GTKN GO GET THE FIRST TOKEN + BALR R14,R15 + DROP R1 +* +* EXECUTE THE APPROPRIATE PROGRAM +* +TMEXEC L R4,TT$NXTPG GET PTR TO PGM TO EXECUTE + LTR R4,R4 = ZERO? + BNZ TMEXEC2 NO, EXEC THIS PRGM. +* +* LOOK UP PRGM FOR COMMAND CODE GIVEN IN THE IMA +* + USING ALIASTBL,R11 + L R11,LM$AFRST POINT TO 1ST ALIAS +TMFALIAS C R11,LM$ALAST END OF TABLE? + BH TMBADPGM YES, COMMAND CODE NOT FOUND + CLC AT$ALIAS,TM$TOKEN ALIAS = INPUT COMMAND? + BE TMEXEC1 YES, SUCCESS + LA R11,AT$LNGTH(R11) BUMP TO NEXT ALIAS + B TMFALIAS & LOOP +TMEXEC1 L R4,AT$PGM GET PTR. TO PROGRAM TABLE + DROP R11 +* +* LOAD PROGRAM INTO FREE MEM IF NEEDED & EXECUTE IT +* +TMEXEC2 TM PT$FLAGS,PT$LOGON LOGON REQUIRED? + BZ TMEXEC3 NO, OK + TM TT$FLAGS,TT$LOGON USER LOGGED ON? + BZ TMLOGON NO, SEND ERROR +TMEXEC3 ST R4,TT$LSTPG SAVE THIS PGM AS LAST EXECUTED + C R4,TM$RESPG PRGM ALREADY IN MEMORY? + BNE TMLOAD NO + L R1,PT$NTRYA YES, GET ENTRY PT. ADDR. + B TMSTART GO START PRGM. +TMLOAD LA R1,PT$MNAME POINT TO PGM NAME + L R0,LM$FSTRT POINT TO PGM LOAD AREA + LOADR (1),(0),TMLERR LOAD THE PGM INTO FREE MEM. + ST R4,TM$RESPG SHOW THIS PRGM LOADED + ST R1,TM$TEMP SAVE ENTRY PT. ADDR + MVC PT$NTRY,TM$TEMP+1 +* +* EXECUTE THE PROGRAM +* +TMSTART LR R15,R1 ENTRY PT TO R15 + LA R1,TM$PIB POINT TO ARG. LIST + BALR R14,R15 +* +* NORMAL TERMINATION CLEANUP +* + CLI ZA#PSIND,ZA#PSNN TERM. IND = 'N'? + BNE TM5 NO + XC TT$NXTPG,TT$NXTPG CLEAR TERM'S NEXT PGM PTR. + B TMDONE +* +* EXTERNAL SUCCESSION +* +TM5 CLI ZA#PSIND,ZA#PSNE TERM. IND = 'E'? + BNE TM6 NO + USING PGMTBL,R11 + L R11,LM$PFRST POINT TO 1ST PGM TABLE +TMFPGM LTR R11,R11 ADDR = ZERO? + BE TMBADSUC YES, END OF LIST + CLC ZA#PSID,PT$MNAME MATCH SUCCESSOR ID? + BE TMGOTPGM YES + L R11,PT$NEXT GET ADDR OF NEXT PGM TABLE + B TMFPGM +* +TMGOTPGM ST R11,TT$NXTPG SET SUCCESSOR AS NXT PGM TO EXEC + B TMSAVCDA GO SAVE THE CDA +* +TMBADSUC MVC TM$BDSC(6),ZA#PSID MOVE SUCCESSOR ID TO ERR MSG + OPR TM$BDSC,L'TM$BDSC + XC TT$NXTPG,TT$NXTPG CLEAR NEXT PGM TO EXECUTE + B TMDONE + DROP R11 +* +* SAVE CDA TO DISK +* +TMSAVCDA TS SCR1LOCK YES, ACQUIRE FILE LOCK + BZ TMLOK1 SUCCESS + SETIME 10,WAIT,M FAIL, WAIT A BIT + B TMSAVCDA & LOOP +* +TMLOK1 LA R6,SCR1P2 COVER CDA PARTITION + L R11,TM$CDA POINT TO CDA + ST R11,PC$A1F SET PCA I/O BUFFER ADDRESS + MVI PC$IOCNT,1 SET TO WRITE 1 BLOCK + LH R11,TT$TNUM GET TERM BFR BLOCK # + ST R11,PC$PCAID + PUT $SCR1,SCR1P2 + MVI SCR1LOCK,0 RELEASE FILE LOCK +* +* CONTINUOUS OUTPUT +* + USING ZA#OMH,R11 + L R11,TM$OMA COVER THE OMA + CLI ZA#OAUX,ZA#OCO CONTINUOUS OUTPUT REQUESTED? + BNE TMDONE NO, WE'RE DONE + MVC TT$CONT,ZA#CONT SAVE CONT. OUTPUT CODE + OI TT$FLAGS,TT$WAITO SET WAIT FOR OUTPUT FLAG + B TMDONE + DROP R11 +* +TM6 EQU * +* +* +* SEND OUTPUT TO TERMINAL +* +TMDONE LR R0,R3 POINT TO TERM. TABLE + L R1,TM$OMA POINT TO OUTPUT MSG AREA + BAL R14,SEND SEND IT + OI TT$FLAGS,TT$WAITI SET TERMINAL WAIT FLAG + B TMNEXT PGM DONE, CHECK FOR MORE TO DO +* +* MODULE LOAD ERROR HANDLER +* +TMLERR MVC LOADERR(8),PT$MNAME PGM NAME TO ERR MSG + OPR LOADERR,L'LOADERR TELL OPERATOR ABOUT BOO-BOO + MVI TT$FLAGS,TT$WAITI SET TERM WAIT FOR INPUT FLAG + B TMNEXT CHECK FOR MORE TO DO +* +TMBADPGM L R4,=A(UNKCMD) POINT TO UNK CMD ERROR PRGM + B TMEXEC3 & EXECUTE IT +* +TMLOGON L R4,=A(UNKCMD) POINT TO UNK CMD ERROR PGM + USING ZA#IMH,R1 COVER IMA + L R1,TM$IMA + MVI ZA#IMSG,C'L' SET FLG TO SEND 'PLS LOGON' + B TMEXEC3 + DROP R1 +* + DROP R2,R3,R4,R5,R6 +************ +* +* TASK MANAGER FIELDS +* +************ +LOADERR DC C' LOAD ERROR' +TM$ECB ECB +TM$SAVE DC 18F'0' REGISTER SAVE AREA +TM$RESPG DS A PTR. TO RESIDENT PGM TABLE +TM$TOKEN DS CL8 TOKEN FROM INPUT MSG. +TM$TEMP DS F +TM$BDSC DS C' INVALID SUCCESSOR ID' +* +* WORKER PROGRAM ACTIVATION RECORD. THESE FIELDS MUST ALWAYS BE IN +* THIS ORDER. +* +TM$PIB DS A PRGM INFO BLOCK +TM$IMA DS A 2048 BYTE INPUT MSG AREA +TM$WA DS A 4096 BYTE WORK AREA +TM$OMA DS A 2048 BYTE OUTPUT MSG AREA +TM$CDA DS A 4096 BYTE CONT. DATA AREA + EJECT +************ +* +* SEND A MESSAGE TO A TERMINAL +* R0 = PTR. TO TERM. TABLE +* R1 = PTR. TO OMA +* R2 = COVER +* R3 = TERM. TABLE +* R4 = OMA +* R5 = MCT PACKET +* R14 = RETURN ADDRESS +* +************ +SEND STM R14,R12,12(R13) SAVE REGISTERS + BALR R2,0 SET NEW COVER + USING *,R2 + USING TERMTBL,R3 + USING ZA#OMH,R4 + USING TN#MCTDS,R5 + LR R3,R0 COVER TERM TBL + LR R4,R1 COVER OMA + LA R5,MCTO COVER OUTPUT MCT PACKET + L R6,LM$OBFR COVER ICAM OUTPUT BUFFER +* +SLOCK TS M$OBUSY SET THE OUTPUT BUSY FLAG + BZ SNOTBUSY SUCCESS! + SETIME 10,WAIT,M FAILED, WAIT 10 MS AND TRY AGAIN + B SLOCK +* +SNOTBUSY LH R0,ZA#OTL COPY MSG TO ICAM BUFFER + LA R1,ZA#OMSG + L R11,LM$OBFR + L R15,LM$CPYM + BALR R8,R15 +* + MVI M$FUNC,M$SEND SET CRNT FUNCTION CODE + LH R11,TT$LINE SET THE LINE # + STH R11,TN#MCLID + LH R11,TT$ID SET TERM. # + STH R11,TN#MCTIN + L R11,LM$OBFR POINT TO MSG BFR. + ST R11,TN#MCBFA + LH R11,ZA#OTL SET THE TEXT LENGTH + STH R11,TN#MCBAL + MVI TN#MCCKB,TN#MCEM1++TN#MCLBW SET LAST BUFFER FLAGS + CAWAKE WAKE UP THE MAIN TASK. +* + LM R14,R12,12(R13) RESTORE REGISTERS + BR R14 RETURN + DROP R2,R3,R4,R5 +************ +* +* MCT PACKETS & FLAGS +* +************ +MCTO MCTPKT OCMPL,SEND,IRL, X + BUFFERA=0, X + BAL=0, X + ID=(1,1), X + ENDBUF=1 +MCTI MCTPKT ICMPL,RECEIVE,IRL, X + BUFFERA=0, X + BAL=0, X + ID=(1,1), X + ENDBUF=1 +* +M$OBUSY DC XL1'0' MCT OUTPUT BUSY FLAG +M$ICNT DC H'0' PENDING INPUT COUNT +M$FUNC DS XL1 CURRENT NETWORK FUNCTION CODE +M$NETREQ EQU 0 +M$CCACPY EQU 1 +M$SEND EQU 2 +M$RECV EQU 3 +************ +* +* DTF FOR THE BUFFER FILE. YOU NEED TO INCLUDE // WORK1 IN YOUR +* JOB CONTROL FOR THIS. +* +* THIS FILE HAS 2 PARTITIONS. PCA1 IS USED TO BUFFER INPUT MESSAGES. +* PCA2 IS USED TO HOLD THE CONTINUITY DATA FOR THE VARIOUS +* TRANSACTIONS. +* +************ +$SCR1 DTFPF PCA1=SCR1P1, X + PCA2=SCR1P2, X + ERROR=SCR1ERR, X + WAIT=YES +* I/O BUFFER PARTITION +SCR1P1 PCA BLKSIZE=2048, X + IOAREA1=SCR1IOA, X + LACE=1, X + SIZE=50 +* CDA PARTITION +SCR1P2 PCA BLKSIZE=4096, X + IOAREA1=SCR1IOA, X + LACE=1, X + SIZE=50 +SCR1IOA EQU * DUMMY I/O BUFFER +SCR1LOCK DC XL1'0' +************ +* +* WELL KNOWN PROGRAM TABLE ENTRIES +* +************ +BEMRDY DC A(UNKCMD) NEXT ENTRY + DC XL8'FFFFFFFFFFFFFFFF' NO TRANS CODE FOR THIS + DC CL8'BEMRDY00' 'BEM READY' MSG TO ALL TERMS + DC F'0' LOAD MODULE SIZE + DC XL1'0' FLAG BYTE + DS XL3'0' ENTRY PT. ADDRESS +UNKCMD DC A(BEMHLP) NEXT ENTRY + DC XL8'FFFFFFFFFFFFFFFF' NO TRANS CODE FOR THIS + DC CL8'BADCMD00' 'UNKNOWN COMMAND' ERROR + DC F'0' LOAD MODULE SIZE + DC XL1'0' FLAG BYTE + DS XL3'0' ENTRY PT. ADDRESS +BEMHLP DC A(BEMLGN) NEXT ENTRY + DC CL8'/HELP' TRANS CODE + DC CL8'BEMHLP00' + DC F'0' LOAD MODULE SIZE + DC XL1'0' FLAG BYTE + DS XL3'0' ENTRY PT. ADDRESS +BEMLGN DC A(BEMLGF) NEXT ENTRY + DC CL8'/LOGON' TRANS CODE + DC CL8'BEMLGN00' + DC F'0' LOAD MODULE SIZE + DC XL1'0' FLAG BYTE + DS XL3'0' ENTRY PT. ADDRESS +BEMLGF DC A(BEMSTA) NEXT ENTRY + DC CL8'/LOGOFF' TRANS CODE + DC CL8'BEMLGF00' + DC F'0' LOAD MODULE SIZE + DC YL1(PT$LOGON) LOGON REQUIRED FLAG + DS XL3'0' ENTRY PT. ADDRESS +BEMSTA DC A(BEMDSP) NEXT ENTRY + DC CL8'/STATUS' TRANS CODE + DC CL8'BEMSTA00' + DC F'0' LOAD MODULE SIZE + DC YL1(PT$LOGON) LOGON REQUIRED FLAG + DS XL3'0' ENTRY PT. ADDRESS +BEMDSP DC A(BEMVTC) NEXT ENTRY + DC CL8'/DISPLAY' TRANS CODE + DC CL8'BEMDSP00' + DC F'0' LOAD MODULE SIZE + DC YL1(PT$LOGON) LOGON REQUIRED FLAG + DS XL3'0' ENTRY PT. ADDRESS +BEMVTC DC A(BEMFST) NEXT ENTRY + DC CL8'/VTOC' TRANS CODE + DC CL8'BEMVTC00' + DC F'0' LOAD MODULE SIZE + DC YL1(PT$LOGON) LOGON REQUIRED FLAG + DS XL3'0' ENTRY PT. ADDRESS +BEMFST DC A(BEMPRT) NEXT ENTRY + DC CL8'/FSTATUS' TRANS CODE + DC CL8'BEMFST00' + DC F'0' LOAD MODULE SIZE + DC YL1(PT$LOGON) LOGON REQUIRED FLAG + DS XL3'0' ENTRY PT. ADDRESS +BEMPRT DC A(BEMDEL) NEXT ENTRY + DC CL8'/PRINT' TRANS CODE + DC CL8'BEMPRT00' + DC F'0' LOAD MODULE SIZE + DC YL1(PT$LOGON) LOGON REQUIRED FLAG + DS XL3'0' ENTRY PT. ADDRESS +BEMDEL DC A(BEMEDT) NEXT ENTRY + DC CL8'/DELETE' TRANS CODE + DC CL8'BEMDEL00' + DC F'0' LOAD MODULE SIZE + DC YL1(PT$LOGON) LOGON REQUIRED FLAG + DS XL3'0' ENTRY PT. ADDRESS +BEMEDT DC A(0) NO NEXT ENTRY + DC CL8'/EDT' TRANS CODE + DC CL8'BEMEDT00' + DC F'0' LOAD MODULE SIZE + DC YL1(PT$LOGON) LOGON REQUIRED FLAG + DS XL3'0' ENTRY PT. ADDRESS +PRGMSL EQU BEMEDT LAST ENTRY +PRGMS EQU BEMRDY +************ +* +* PROGRAM ALIASES +* +************ + DS 0F +ALIASES DC CL8'/HELP' + DC A(BEMHLP) + DC CL8'/HEL' + DC A(BEMHLP) + DC CL8'/HE' + DC A(BEMHLP) + DC CL8'/H' + DC A(BEMHLP) + DC CL8'/LOGON' + DC A(BEMLGN) + DC CL8'/LOGOFF' + DC A(BEMLGF) + DC CL8'/LOGOF' + DC A(BEMLGF) + DC CL8'/LOGO' + DC A(BEMLGF) + DC CL8'/LOG' + DC A(BEMLGF) + DC CL8'/LO' + DC A(BEMLGF) + DC CL8'/L' + DC A(BEMLGF) + DC CL8'/STATUS' + DC A(BEMSTA) + DC CL8'/STATU' + DC A(BEMSTA) + DC CL8'/STAT' + DC A(BEMSTA) + DC CL8'/STA' + DC A(BEMSTA) + DC CL8'/ST' + DC A(BEMSTA) + DC CL8'/S' + DC A(BEMSTA) + DC CL8'/DISPLAY' + DC A(BEMDSP) + DC CL8'/DISPLA' + DC A(BEMDSP) + DC CL8'/DISPL' + DC A(BEMDSP) + DC CL8'/DISP' + DC A(BEMDSP) + DC CL8'/DIS' + DC A(BEMDSP) + DC CL8'/DI' + DC A(BEMDSP) + DC CL8'/VTOC' + DC A(BEMVTC) + DC CL8'/VTO' + DC A(BEMVTC) + DC CL8'/VT' + DC A(BEMVTC) + DC CL8'/V' + DC A(BEMVTC) + DC CL8'/FSTATUS' + DC A(BEMFST) + DC CL8'/FSTATU' + DC A(BEMFST) + DC CL8'/FSTAT' + DC A(BEMFST) + DC CL8'/FSTA' + DC A(BEMFST) + DC CL8'/FST' + DC A(BEMFST) + DC CL8'/FS' + DC A(BEMFST) + DC CL8'/F' + DC A(BEMFST) + DC CL8'/PRINT' + DC A(BEMPRT) + DC CL8'/PRIN' + DC A(BEMPRT) + DC CL8'/PRI' + DC A(BEMPRT) + DC CL8'/PR' + DC A(BEMPRT) + DC CL8'/P' + DC A(BEMPRT) + DC CL8'/DELETE' + DC A(BEMDEL) + DC CL8'/DELET' + DC A(BEMDEL) + DC CL8'/DELE' + DC A(BEMDEL) + DC CL8'/DEL' + DC A(BEMDEL) + DC CL8'/DE' + DC A(BEMDEL) + DC CL8'/EDT' + DC A(BEMEDT) + DC CL8'/ED' + DC A(BEMEDT) + DC CL8'/E' + DC A(BEMEDT) +ALIASESL EQU *-AT$LNGTH PTR TO LAST ALIAS TABLE ENTRY +************ +* +* CLEAR A BLOCK OF MEMORY TO ZERO +* +* R0 = BLOCK LENGTH +* R1 = BLOCK ADDRESS +* R8 = RETURN ADDRESS +* R11 = WORK REGISTER +* R15 = ENTRY PT. +* +************ + USING *,R15 +CLRMEM LTR R0,R0 LEN = 0? + BZ CMDONE YES + MVI 0(R1),0 CLEAR 1ST BYTE TO ZERO + CH R0,=H'256' LEN > 256? + BNH CMLAST NO, CLEAR # BYTES GIVEN IN R0 + LA R11,254 CLEAR REMAINING 255 BYTES + EX R11,CMMVC + SH R0,=H'256' DECR. LENGTH + LA R1,256(R1) BUMP ADDRESS + B CLRMEM & LOOP +CMLAST SH R0,=H'2' CLEAR REMAINING R0-1 BYTES + LR R11,R0 + EX R11,CMMVC +CMDONE BR R8 RETURN +* +CMMVC MVC 1(0,R1),0(R1) + DROP R15 +************ +* +* COPY A BLOCK OF MEMORY +* +* R0 = BLOCK LENGH +* R1 = SOURCE +* R8 = RETURN ADDRESS +* R11 = DESTINATION +* R12 = WORK REGISTER +* R15 = ENTRY PT. +************ + USING *,R15 +CPYMEM LTR R0,R0 LEN = 0? + BZ PMDONE YES + CH R0,=H'256' LEN > 256? + BNH PMLAST NO, MOVE # BYTES GIVEN IN R0 + LA R12,255 MOVE 256 BYTES + EX R12,PMMVC + LA R1,256(R1) BUMP BLOCK PTRS + LA R11,256(R11) + SH R0,=H'256' DECR. LEN + B CPYMEM & LOOP +PMLAST SH R0,=H'1' MAKE LEN ZERO RELATIVE + LR R12,R0 + EX R12,PMMVC +PMDONE BR R8 +* +PMMVC MVC 0(0,R11),0(R1) + DROP R15 +************ +* +* GET THE NEXT TOKEN FROM AN INPUT STRING. WHEN CALLED FOR THE FIRST +* TIME FOR A GIVEN STRING, R1 MUST POINT TO THE START OF THE STRING AND +* R0 MUST CONTAIN THE LENGTH. R1 AND R0 WILL BE UPDATED AND MUST +* BE PASSED UNCHANGED TO ANY SUBSEQUENT CALLS FOR THE SAME STRING. +* +* R0 = STRING LENGTH +* R1 = STRING ADDRESS +* R11 = TOKEN ADDRESS (8 BYTES) +* R12 = TOKEN LENGTH +* R14 = RETURN ADDRESS +* R15 = ENTRY ADDRESS +* +************ + USING *,R15 +GETOKEN MVI 0(R11),C' ' INIT. TOKEN + MVC 1(7,R11),0(R11) + LA R12,8 INIT. TOKEN LENGTH +* +GTLOOP1 LTR R0,R0 END OF STRING? + BNPR R14 YES, RETURN +* +* SKIP LEADING DICE CODES, START OF ENTRY, COMMAS, SPACES. +* + CLI 0(R1),X'10' DICE? + BNE GT1 NO + LA R1,4(R1) YES, BUMP PAST DICE CODE + AH R0,=H'-4' DECR. STRING SIZE + B GTLOOP1 & LOOP +GT1 CLI 0(R1),X'1E' START-OF-ENTRY + BE GTBUMP1 YES, SKIP + CLI 0(R1),0 NULL? + BE GTBUMP1 + CLI 0(R1),C',' COMMA? + BE GTBUMP1 YES, SKIP + CLI 0(R1),C' ' SPACE? + BNE GT2 NO, START OF TOKEN +GTBUMP1 LA R1,1(R1) BUMP STRING ADDRESS + AH R0,=H'-1' DECR. STRING LENGTH + B GTLOOP1 +* +* COPY INPUT TO TOKEN UNTIL COMMA OR SPACE OR END OF STRING +* ENCOUNTERED +* +GT2 LTR R12,R12 TOKEN FULL? + BNP GT3 YES, SKIP THIS CHAR + MVC 0(1,R11),0(R1) COPY CHAR. TO TOKEN + LA R11,1(R11) BUMP TOKEN ADDRESS + AH R12,=H'-1' DECR. TOKEN LENGTH +GT3 LA R1,1(R1) BUMP STRING ADDRESS + AH R0,=H'-1' DECR. STRING LENGTH + BNPR R14 END OF STRING, RETURN + CLI 0(R1),0 NULL? + BER R14 YES, RETURN + CLI 0(R1),C',' COMMA? + BER R14 YES, RETURN + CLI 0(R1),C' ' SPACE? + BER R14 YES, RETURN + B GT2 STILL VALID CHAR, LOOP + DROP R15 +* +************ +* +* OPERATOR COMMUNICATION (OPCOM) ISLAND CODE +* +************ +OPCOM BALR R2,0 + USING *,R2 +* + CLC OCMSG(3),=C'EOJ' EOJ REQUESTED? + BE OCEOJ YES + CLC OCMSG(8),=C'SHUTDOWN' + BE OCEOJ YES + EXIT OC +* +OCEOJ OPR OCOPR,L'OCOPR + L R11,=A(EOJFLG) SET EOJ FLAG + MVI 0(R11),X'FF' + CAWAKE WAKE UP MAIN THREAD + EXIT OC +* +OCSAVE DS 18F +OCMSG DS CL60 +OCOPR DC C'SHUTDOWN IN PROGRESS' + DROP R2 +* + LTORG +* + END MAIN +// FIN \ No newline at end of file diff --git a/U9030/Source/BemSimulator.jcl b/U9030/Source/BemSimulator.jcl new file mode 100644 index 0000000..9a7d404 --- /dev/null +++ b/U9030/Source/BemSimulator.jcl @@ -0,0 +1,28 @@ +// JOB BEMSIM,,8000,8000,2 +// DVC 20 // LFD PRNTR +// OPTION JOBDUMP +// DVCVOL REL042 +// LBL $Y$SRC // LFD $Y$SRC +// DVCVOL REL042 +// LBL $Y$MAC // LFD $Y$MAC +// DVCVOL LNS001 +// LBL LNSSRC // LFD SRC +// DVCVOL LNS001 +// LBL LNSMAC // LFD MAC +// DVCVOL LNS001 +// LBL LNSLOD // LFD LOD +// WORK1 +// WORK2 +// EXEC BEMSIM,LOD +/$ +* NETWORK NAME +EDT +* ALLOWED TERMINALS +T001 +T002 +* USERS +USER GUES,0,GUES +USER SBOY,0,SBOY +/* +/& +// FIN \ No newline at end of file diff --git a/U9030/Source/BemStatus.asm b/U9030/Source/BemStatus.asm new file mode 100644 index 0000000..9c9315a --- /dev/null +++ b/U9030/Source/BemStatus.asm @@ -0,0 +1,306 @@ + TITLE '/STATUS COMMAND FOR BOYD''S BEM SIMULATOR' +BEMSTA START +*********************************************************************** +* * +* AN IMPLEMENTATION OF THE /STATUS COMMAND FOR BOYD'S BEM SIMULATOR. * +* * +*********************************************************************** +* + PRINT NOGEN + ZM#DPIB + ZM#DIMH +ZA#IMSG DS CL2048 +BEMSTA CSECT + RGEQU + BEMDSCTS +* + STM R14,R12,12(R13) +************ +* R2 = COVER +* R3 = PIB +* R4 = IMA +* R5 = WORK AREA +* R6 = OMA +* R7 = CDA +* R9 = TERMTBL +* R14 = RETURN ADDRESS +************ + BALR R2,0 SET COVER + USING *,R2 + USING LOWMEM,R0 + USING ZA#DPIB,R3 + USING ZA#IMH,R4 + USING WORKAREA,R5 + USING ZA#OMH,R6 + USING TERMTBL,R9 +* + L R3,0(R1) COVER THE PARAMETERS + L R4,4(R1) + L R5,8(R1) + L R6,12(R1) + L R7,16(R1) +* +* DECODE THE INPUT MESSAGE +* + LH R0,ZA#ITL SET UP GETOKEN PARAMS + LA R1,ZA#IMSG + L R15,LM$GTKN + LA R11,STYPE BURN '/STATUS' + BALR R14,R15 + LA R11,STYPE GET TYPE OF STATUS + BALR R14,R15 +* +* CHECK STATUS TYPE AND BRANCH TO APPROPRIATE ROUTINE +* + CLI STYPE,C'R' RESOURCE? + BE SENDRES YES + CLI STYPE,C'T' TERMINALS? + BE SENDTERM YES +* +* SEND CURRENT USER STATUS +* + MVC ZA#OMSG(USERMSGL),USERMSG SET UP OMA WITH MSG TEMPLATE + LA R11,USERMSGL + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION +* + USING USERTBL,R10 + L R1,ZA#ISTID FIND TERM TABLE FOR INPUT TERM + L R15,LM$FTNAM + BALR R14,R15 + LTR R9,R1 TERM TABLE FOUND? + BZ SU1 NO, WTF? + MVC OUTERM,TT$NAME COPY TERM NAME TO OMA + L R10,TT$USER GET PTR TO LOGGED ON USER TBL + LTR R10,R10 ZERO? + BZ SU1 YES, WTF? + MVC OUUSER,UT$ID COPY USER NAME TO OMA + MVC CTEMP,TMMASK FORMAT LOGGED ON TIME + ED CTEMP,TT$LGNTM + MVC OULGNTM,CTEMP+2 COPY HH:MM TO OMA +SU1 GETIME S GET CURRENT DATE/TIME + ST R0,DTEMP FORMAT DATE + MVC CTEMP,DTMASK + ED CTEMP,DTEMP + MVC OUDATE,CTEMP+2 MOVE DATE TO OMA + ST R1,DTEMP FORMAT TIME + MVC CTEMP,TMMASK + ED CTEMP,DTEMP + MVC OUTIME,CTEMP+2 + B DONE + DROP R10 +* +* SEND RESOURCE STATUS +* +SENDRES EQU * +* +* COUNT # OF LOGGED ON TERMINALS +* + XR R12,R12 CLEAR TERMINAL COUNT + L R9,LM$TFRST POINT TO 1ST TERM TABLE +SRLOOP LTR R9,R9 END OF TABLE? + BZ SRCONT YES, CONTINUE + TM TT$FLAGS,TT$LOGON TERM LOGGED ON? + BZ SRNEXT NO, TRY NEXT TERM. + LA R12,1(R12) YES, BUMP TERMINAL COUNT +SRNEXT L R9,TT$NEXT GET PTR TO NEXT TERM TABLE + B SRLOOP & LOOP +* +SRCONT MVC ZA#OMSG(RESMSGL),RESMSG SET UP OMA WITH MSG TEMPLATE + LA R11,RESMSGL + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION +* + CVD R12,DTEMP CVT # TERMS TO PACKED + ED OTERMS,DTEMP+6 UNPACK TO OMA + L R11,LM$FEND GET TTL MEMORY FOR JOB + CVD R11,DTEMP CVT TO PACKED + ED OMAXMEM,DTEMP+4 UNPACK TO OMA + S R11,LM$FSTRT CALC. FREE MEM LEFT + CVD R11,DTEMP CVT TO PACKED + ED OFREEMEM,DTEMP+4 UNPACK TO OMA + L R11,LM$FTTL GET TTOL FREE MEMORY AT BEM STRT + CVD R11,DTEMP CVT TO PACKED + ED OAVALMEM,DTEMP+4 UNPACK TO MOA + B DONE +* +* SEND TERMINALS STATUS +* +SENDTERM MVC ZA#OMSG(TERMHDRL),TERMHDR MOVE MSG HDR TO OMA + LA R12,TERMHDRL GET OFFSET TO NEXT LINE IN OMA + L R9,LM$TFRST POINT TO 1ST TERM TABLE +STLOOP LTR R9,R9 END OF TABLE? + BZ STDONE YES + CH R12,=H'1920' END OF MSG + BH STDONE YES, QUIT + TM TT$FLAGS,TT$LOGON TERMINAL LOGGED ON? + BZ STNEXT NO, TRY NEXT TERMINAL + LA R11,ZA#OMSG(R12) MOVE LINE TEMPLATE TO OMA + MVC 0(TERMLNEL,R11),TERMLNE + MVC TTERM(4,R11),TT$NAME MOVE TERMINAL NAME TO OMA + USING PGMTBL,R10 + L R10,TT$LSTPG PROGRAM NAME + LTR R10,R10 + BZ STNOP + MVC TCMD(7,R11),PT$CODE+1 + USING USERTBL,R10 +STNOP L R10,TT$USER USER NAME + LTR R10,R10 + BZ STNOU + MVC TUSER(4,R11),UT$ID +STNOU LA R12,TERMLNEL(R12) BUMP OMA OFFSET +STNEXT L R9,TT$NEXT GET PTR TO NEXT TERM TBL + B STLOOP & LOOP + +STDONE LA R11,ZA#OMSG(R12) MOVE TERM TRAILER TO OMA + MVC 0(TERMTLRL,R11),TERMTLR + LA R12,TERMTLRL(R12) BUMP MSG LENGTH + STH R12,ZA#OTL SAVE TTL MSG LENGTH + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION + B DONE +* +DONE LM R14,R12,12(R13) RESTORE REGISTERS + BR R14 RETURN TO MONITOR +* +* RESOURCE STATUS TEMPLATE +* +RESMSG ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'TASKS TERMS ----------MEMORY----------' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE + DC C' MAX AVAIL FREE' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE + DC C' 1 ' +TERMS EQU *-RESMSG + DC XL4'40202021' + DC C' ' +MAXMEM EQU *-RESMSG + DC XL8'4020202020202021' +AVAILMEM EQU *-RESMSG + DC XL8'4020202020202021' +FREEMEM EQU *-RESMSG + DC XL8'4020202020202021' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +RESMSGL EQU *-RESMSG +* +* TERMINAL STATUS TEMPLATES +* +TERMHDR ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'TERMINAL COMMAND SCRATCH SPACE USER' +TERMHDRL EQU *-TERMHDR +* +TERMLNE ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE + DC C' ' +TTERM EQU *-TERMLNE + DC C' ' + DC C' ' +TCMD EQU *-TERMLNE + DC C' ' +TUSER EQU *-TERMLNE + DC C' ' +TERMLNEL EQU *-TERMLNE +* +TERMTLR ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +TERMTLRL EQU *-TERMTLR +* +* CURRENT USER STATUS TEMPLATE +* +USERMSG ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'TERMINAL USER LOGON DATE CUR-TIME' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE + DC C' ' +UTERM EQU *-USERMSG + DC C' ' + DC C' ' +UUSER EQU *-USERMSG + DC C' ' + DC C' ' +ULGNTM EQU *-USERMSG + DC C' ' + DC C' ' +UDATE EQU *-USERMSG + DC C' ' + DC C' ' +UTIME EQU *-USERMSG + DC C' ' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +USERMSGL EQU *-USERMSG +* +TMMASK DC C' ' + DC X'202120' + DC C':' + DC X'2020' + DC C':' + DC X'2020' +DTMASK DC C' ' + DC X'202120' + DC C'/' + DC X'2020' + DC C'/' + DC X'2020' + ZM#DOMH +ZA#OMSG DS CL2048 OUTPUT MSG BFR. +OTERMS EQU ZA#OMSG+TERMS,4 +OMAXMEM EQU ZA#OMSG+MAXMEM,8 +OAVALMEM EQU ZA#OMSG+AVAILMEM,8 +OFREEMEM EQU ZA#OMSG+FREEMEM,8 +OUTERM EQU ZA#OMSG+UTERM,4 +OUUSER EQU ZA#OMSG+UUSER,4 +OULGNTM EQU ZA#OMSG+ULGNTM,5 +OUDATE EQU ZA#OMSG+UDATE,8 +OUTIME EQU ZA#OMSG+UTIME,8 +* +WORKAREA DSECT +STYPE DS CL8 +DTEMP DS D +CTEMP DS CL10 +* +BEMSTA CSECT +* + END +// FIN \ No newline at end of file diff --git a/U9030/Source/BemVtoc.asm b/U9030/Source/BemVtoc.asm new file mode 100644 index 0000000..df05715 --- /dev/null +++ b/U9030/Source/BemVtoc.asm @@ -0,0 +1,687 @@ + TITLE '/VTOC COMMAND FOR BOYD''S BEM SIMULATOR' +BEMVTC START +*********************************************************************** +* * +* AN IMPLEMENTATION OF THE /VTOC COMMAND FOR BOYD'S BEM SIMULATOR. * +* * +*********************************************************************** +* + PRINT NOGEN + SUPEQU + VTOC FCB=YES, X + VOL1=YES, X + F1=YES, X + F2=YES, X + F3=YES, X + F4=YES +PUBDSECT DSECT + PUBEQU +BEMVTC CSECT + ZM#DPIB + ZM#DIMH +ZA#IMSG DS CL2048 +BEMVTC CSECT + BEMDSCTS +* + STM R14,R12,12(R13) +************ +* R2 = COVER +* R3 = PIB +* R4 = IMA +* R5 = WORK AREA +* R6 = OMA +* R7 = CDA +* R14 = RETURN ADDRESS +************ + BALR R2,0 SET COVER + USING *,R2 + USING LOWMEM,R0 + USING ZA#DPIB,R3 + USING ZA#IMH,R4 + USING WORKAREA,R5 + USING ZA#OMH,R6 + USING CDA,R7 +* + L R3,0(R1) COVER THE PARAMETERS + L R4,4(R1) + L R5,8(R1) + L R6,12(R1) + L R7,16(R1) + LA R11,SAVAREA SET UP NEW SAVE AREA + ST R13,4(R11) + LR R13,R11 +* + CLI FSTPASS,X'00' IS THIS THE FIRST PASS? + BNE PASS2 NO +* +* FIRST PASS, DECODE THE INPUT MESSAGE +* + LH R0,ZA#ITL SET UP GETOKEN PARAMS + LA R1,ZA#IMSG + L R15,LM$GTKN + LA R11,VSN BURN '/VTOC' + BALR R14,R15 + LA R11,VSN GET VOLUME ID + BALR R14,R15 + CLI VSN,C' ' VOLUME ID PRESENT? + BE BADVOL NO + BAL R14,INIT INIIIALIZE THE I/O STRUCTURES + MVC LINCNT,=H'22' INIT. LINE COUNTER + B FSTF1 GO FETCH THE FIRST FMT1 RECORD +* +* COME HERE FOR ALL BUT FIRST PASS +* +PASS2 CLI FSTPASS,X'01' SHOULD WE SHOW NEXT LINE? + BE P2NEXT YES, CONTINUE +* + LH R0,ZA#ITL SET UP GETOKEN PARAMS + LA R1,ZA#IMSG + L R15,LM$GTKN + LA R11,YN GET RESPONSE TO MORE? + BALR R14,R15 + CLI YN,C'N' RESPONSE = 'N' + BE EOJ YES, QUIT + MVC LINCNT,=H'22' NO, INIT LINE COUNT & CONTINUE + +P2NEXT BAL R14,INIT INITIALIZE THE I/O STRUCTURES + B NXTF1 GO FETCH THE NEXT FMT1 RECORD +* +* ALL SET, LET'S READ THE VTOC. +* +FSTF1 MVC ZA#OMSG(HDRL),HDR MOVE HEADER TO OMA + LA R11,HDRL SET THE MSG LENGTH + STH R11,ZA#OTL +* + BAL R14,RDV1 READ THE VOLUME LABEL + BAL R14,RDF4 READ THE FMT4 RECORD + BAL R14,FRSTF1 READ THE NEXT FMT1 RECORD +CHKOK LTR R1,R1 FMT1 RECORD FOUND? + BZ EOJ NO, QUIT +* + USING DL$F1,R9 + LA R9,VBFR COVER FMT1 RECORD + MVC F2ADDR,DL$CP1 SAVE FMT2 ADDR FOR LATER + LH R12,ZA#OTL GET CRNT OFFSET INTO OMA + LA R12,ZA#OMSG(R12) + MVC 0(FILMSGL,R12),FILMSG COPY FILE NAME TEMPLATE TO OMA + AI ZA#OTL,FILMSGL BUMP MSG LENGTH + MVC FNAME(20,R12),DL$KEY1 COPY FILE NAME TO OMA + MVC FTYPE(4,R12),TUNK COPY FILE TYPE TO OMA + CLI DL$FT1,X'20' + BNE P21 + MVC FTYPE(4,R12),TSAM +P21 CLI DL$FT1,X'40' + BNE P22 + MVC FTYPE(4,R12),TDA +P22 CLI DL$FT1,X'60' + BNE P23 + MVC FTYPE(4,R12),TNI +P23 CLI DL$FT1,X'80' + BNE P24 + MVC FTYPE(4,R12),TISAM +P24 CLI DL$FT1,X'90' + BNE P25 + MVC FTYPE(4,R12),TIRAM +P25 CLI DL$FT1,X'02' + BNE P26 + MVC FTYPE(4,R12),TSAT +P26 XR R11,R11 GET # EXTENTS + IC R11,DL$XC1 + STH R11,NUMEXT SAVE FOR LATER + CVD R11,DTEMP CONVERT TO PACKED + MVC FEXTENTS(4,R12),XCMASK COPY # OF EXTENTS TO OMA + ED FEXTENTS(4,R12),DTEMP+6 + BAL R14,CALCEXT GO CALC # CYLINDERS IN ALL EXTS + CVD R0,DTEMP CONVERT TO PACKED + MVC FCYL(4,R12),CYLMASK COPY TO OMA + ED FCYL(4,R12),DTEMP+6 +* + AI LINCNT,-1 DECR. LINE COUNTER + BP P2CONT > ZERO? THEN CONTINUE + LH R11,ZA#OTL CALC OFFSET INTO OMA + LA R11,ZA#OMSG(R11) + MVC 0(MOREMSGL,R11),MOREMSG MOVE 'MORE?' TO OMA + AI ZA#OTL,MOREMSGL BUMP MSG LENGTH + MVI ZA#PSIND,ZA#PSNE SET EXTERNAL SUCCESSION + MVC ZA#PSID,=C'BEMVTC' TO OURSELVES + MVI FSTPASS,X'02' SET TO CHECK 'MORE' RESPONSE + B DONE & RETURN TO MONITOR +* +P2CONT MVI ZA#OAUX,ZA#OCO SET UP CONTINUOUS OUTPUT + MVI ZA#PSIND,ZA#PSNE SET UP EXT SUCCESSION + MVC ZA#PSID,=C'BEMVTC' TO MYSELF + MVI FSTPASS,X'01' SET TO SHOW NEXT LINE + B DONE + DROP R9 +* +NXTF1 BAL R14,NEXTF1 + B CHKOK +* +* EOJ. SEND BLANK LINE +* +EOJ MVC ZA#OMSG(EOJMSGL),EOJMSG MOVE MSG TO OMA + LA R11,EOJMSGL SET MSG LENGTH + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION +* +DONE L R13,4(R13) RESTORE REGISTERS + LM R14,R12,12(R13) + BR R14 +************ +* +* INITIALIZE THE I/O STRUCTURES +* +************ +INIT STM R14,R12,12(R13) +* +* INITIALIZE THE CCB +* + USING IC$CCB,R12 + LA R12,VCCB + SETBIT BC$TRAFF,VCCB SET TRAFFIC (I/O COMPLETE) FLAG + LA R11,VBCW SET BCW ADDRESS + ST R11,IC$CCW + LA R11,VFCB+14 SET PIOCB (FCB) ADDRESS + ST R11,IC$PIO + DROP R12 +* +* FIND THE PUB FOR THE GIVEN VOLUME AND POPULATE THE FCB +* + LA R1,VSN POINT TO VOLUME ID + BAL R14,FNDPUB GO FIND PUB + LTR R1,R1 WAS IT FOUND? + BZ UNKVOL NO + USING DF$FCB,R12 + LA R12,VFCB + MVC DF$FNM,VSN SET UP VOLUME ID + STH R1,DF$PUB SET UP ABS. PUB ADDR. + LA R11,16 SET FCB LENGTH (MINIMUM) + STH R11,DF$CBL +* + LM R14,R12,12(R13) + BR R14 +************ +* +* READ THE VOL1 LABEL. THIS IS ALWAYS AT CYL 0, HEAD 0, REC 3 ON THE +* DISK +* +************ + USING IB$BCW,R1 +RDV1 LA R1,VBCW + LA R11,VBFR SET BFR ADDRESS + ST R11,IB$DATA + MVI IB$COM,X'02' COMMAND = READ + LA R11,1 SET RECORD COUNT + STH R11,IB$COUNT + XC IB$HEAD,IB$HEAD HEAD = 0 + XC IB$CYL,IB$CYL CYL = 0 + OI IB$CYL,X'80' RECALIBRATE ON + MVI IB$RECRD,3 REC = 3 + LA R1,VCCB + EXCP (1) START I/O + WAIT (1),RDV1E WAIT FOR IT + USING DL$VL,R1 + LA R1,VBFR COVER VOL1 LBL + MVC F4ADDR,DL$VTC SAVE FMT4 RECORD ADDRESS + BR R14 RETURN + DROP R1 +************ +* +* READ THE FMT2 RECORD. THE LOCATION OF THIS RECORD IS FOUND IN THE +* FMT1 RECORD +* +************ + USING IB$BCW,R1 +RDF2 LA R1,VBCW + LA R11,VBFR SET BFR ADDRESS + ST R11,IB$DATA + MVI IB$COM,X'02' COMMAND = READ + LA R11,1 SET RECORD COUNT + STH R11,IB$COUNT + MVC IB$HEAD,F2ADDR+3 MOVE HEAD + MVC IB$CYL,F2ADDR CYL + MVC IB$RECRD,F2ADDR+4 & RECORD TO BCW + LA R1,VCCB + EXCP (1) START I/O + WAIT (1),RDF2E WAIT FOR IT + USING DL$SATF2,R1 + LA R1,VBFR COVER FMT2 RECORD + MVC F3ADDR,DL$SCID2 SAVE FMT3 RECORD ADDRESS + BR R14 + DROP R1 +************ +* +* READ THE FMT3 RECORD. THE LOCATION OF THIS RECORD IS FOUND IN THE +* FMT2 RECORD +* +************ + USING IB$BCW,R1 +RDF3 LA R1,VBCW + LA R11,VBFR SET BFR ADDRESS + ST R11,IB$DATA + MVI IB$COM,X'02' COMMAND = READ + LA R11,1 SET RECORD COUNT + STH R11,IB$COUNT + MVC IB$HEAD,F3ADDR+3 MOVE HEAD + MVC IB$CYL,F3ADDR CYL + MVC IB$RECRD,F3ADDR+4 & RECORD TO BCW + LA R1,VCCB + EXCP (1) START I/O + WAIT (1),RDF3E WAIT FOR IT + USING DL$F3,R1 + LA R1,VBFR COVER FMT2 RECORD + MVC F3ADDR,DL$CP3 SAVE NEXT FMT3 RECORD ADDRESS + BR R14 + DROP R1 +************ +* +* READ THE FMT4 RECORD. THE LOCATION OF THIS RECORD IS FOUND IN THE +* VOL1 RECORD +* +************ + USING IB$BCW,R1 +RDF4 LA R1,VBCW + LA R11,VBFR SET BFR ADDRESS + ST R11,IB$DATA + MVI IB$COM,X'02' COMMAND = READ + LA R11,1 SET RECORD COUNT + STH R11,IB$COUNT + MVC IB$HEAD,F4ADDR+3 MOVE HEAD + MVC IB$CYL,F4ADDR CYL + MVC IB$RECRD,F4ADDR+4 & RECORD TO BCW + LA R1,VCCB + EXCP (1) START I/O + WAIT (1),RDF4E WAIT FOR IT + USING DL$F4,R1 + LA R1,VBFR COVER FMT4 RECORD + MVC VTSTRT(4),DL$VX4+2 SAVE VTOC START ADDRESS + MVI VTSTRT+4,1 SET STARTING RECORD # = 1 + MVC VTEND(4),DL$VX4+6 SAVE VTOC END ADDRESS + MVI VTEND+4,40 SET ENDING RECORD # = 40 + BR R14 + DROP R1 +************ +* +* FIND THE FIRST FMT1 RECORD IN THE VTOC. ON EXIT, R1 = 0 IF +* NO FMT1 FOUND. +* +************ + USING IB$BCW,R8 + USING DL$F1,R9 +FRSTF1 LA R8,VBCW + LA R9,VBFR + MVC IB$HEAD,VTSTRT+3 VTOC START HEAD + MVC IB$CYL,VTSTRT CYL + MVC IB$RECRD,VTSTRT+4 RECORD + B NF1READ GO READ THIS RECORD + DROP R8,R9 +************ +* +* FIND THE NEXT FMT1 RECORD IN THE VTOC. ON EXIT, R1 = 0 IF NO +* FMT1 FOUND. +* +************ + USING IB$BCW,R8 + USING DL$F1,R9 +NEXTF1 LA R8,VBCW + LA R9,VBFR +NF1LOOP MVC IB$HEAD,VTSTRT+3 SET HEAD IN BCW + MVC IB$CYL,VTSTRT CYL + XR R11,R11 BUMP RECORD # + IC R11,VTSTRT+4 + LA R11,1(R11) + STC R11,IB$RECRD + STC R11,VTSTRT+4 + CH R11,=H'40' END OF TRACK? + BNH NF1READ NO + MVI IB$RECRD,1 YES, RESET RECORD # TO 1 + MVI VTSTRT+4,1 + IC R11,VTSTRT+3 BUMP HEAD + LA R11,1(R11) + STC R11,IB$HEAD + STC R11,VTSTRT+3 + CH R11,VTEND+2 END OF CYL? + BNH NF1READ NO + MVI IB$HEAD,0 YES, RESET HEAD # TO ZERO + MVI VTSTRT+3,0 + LH R11,VTSTRT BUMP CYLINDER + LA R11,1(R11) + STH R11,IB$CYL + STH R11,VTSTRT + CH R11,VTEND END OF VTOC? + BH NF1NOFND NO +NF1READ LA R11,VBFR SET BFR ADDRESS + ST R11,IB$DATA + MVI IB$COM,X'02' COMMAND = READ + LA R11,1 SET RECORD COUNT + STH R11,IB$COUNT + LA R1,VCCB + EXCP (1) + WAIT (1),NEXTF1E + CLI DL$ID1,C'1' IS IT FMT1? + BNE NF1LOOP NO, TRY AGAIN + LA R1,1 SHOW SUCCESS + BR R14 & RETURN +* +NF1NOFND XR R1,R1 SHOW NOT FOUND + BR R14 & RETURN + DROP R8,R9 +************ +* +* CALCULATE THE NUMBER OF CYLINDERS ASSIGNED TO THE CURRENT FILE +* ON EXIT, R0 CONTAINS TTL # CYLINDERS ASSIGNED +* +************ +CALCEXT STM R14,R12,12(R13) SAVE REGISTERS +* +* CALC. FOR EXTENTS IN FMT1 RECORD WHICH IS CURRENTLY IN VBFR +* + USING DL$F1,R1 + LA R1,VBFR + LA R1,DL$XT1 POINT TO 1ST OF 3 EXTENTS + DROP R1 + XR R0,R0 CLEAR CYLINDER COUNT + LA R12,3 SET LOOP COUNT +CELOOP1 CLI 0(R1),0 EXTENT VALID? + BE CEBUMP1 NO + MVC ELOW(2),2(R1) GET EXTENT LOWER CYLINDER + MVC EHIGH(2),6(R1) GET EXTENT UPPER CYLINDER + LH R11,EHIGH CALC # CYLINDERS + SH R11,ELOW + LA R11,1(R11) + AR R0,R11 ADD TO TOTAL +CEBUMP1 LA R1,10(R1) BUMP EXTENT TABLE ADDRESS + BCT R12,CELOOP1 +* +* CALC. FOR EXTENTS GIVEN IN FMT3 RECORD +* + LH R11,NUMEXT # EXTENTS > 3? + CH R11,=H'3' + BNH CEDONE NO, WE'RE DONE + BAL R14,RDF2 READ THE FMT2 RECORD +CENXTF3 CLC F3ADDR,LM$ZERO FMT3 ADDR = 0? + BE CEDONE YES, WE'RE DONE + BAL R14,RDF3 READ THE FMT3 RECORD +* +* DO EXTENTS 4-7 +* + USING DL$F3,R1 + LA R1,VBFR COVER FMT3 + LA R1,DL$XT3 GET ADDR OF EXTENT 4 + DROP R1 + LA R12,4 INIT. LOOP COUNT +CELOOP2 CLI 0(R1),0 EXTENT VALID? + BE CEBUMP2 NO + MVC ELOW(2),2(R1) GET EXTENT LOWER CYLINDER + MVC EHIGH(2),6(R1) GET EXTENT UPPER CYLINDER + LH R11,EHIGH CALC # CYLINDERS + SH R11,ELOW + LA R11,1(R11) + AR R0,R11 ADD TO TOTAL +CEBUMP2 LA R1,10(R1) BUMP EXTENT TABLE ADDRESS + BCT R12,CELOOP2 +* +* DO EXTENTS 8-16 +* + LA R1,1(R1) BUMP PAST FORMAT ID + LA R12,9 INIT LOOP COUNT +CELOOP3 CLI 0(R1),0 EXTENT VALID? + BE CEBUMP3 NO + MVC ELOW(2),2(R1) GET EXTENT LOWER CYLINDER + MVC EHIGH(2),6(R1) GET EXTENT UPPER CYLINDER + LH R11,EHIGH CALC # CYLINDERS + SH R11,ELOW + LA R11,1(R11) + AR R0,R11 ADD TO TOTAL +CEBUMP3 LA R1,10(R1) BUMP EXTENT TABLE ADDRESS + BCT R12,CELOOP3 + B CENXTF3 CHECK NEXT FMT3 IN CHAIN +* +CEDONE ST R0,20(R13) RETURN R0 + LM R14,R12,12(R13) RESTORE REGISTERS + BR R14 & RETURN +************ +* +* ERROR READING VOL1 LABEL +* +************ + USING IC$CCB,R1 +RDV1E LA R1,VCCB + LH R0,IC$SF GET DEV / CHAN STATUS TO R0 + CANCEL (0) ABORT WITH STATUS +*********** +* +* ERROR READING FMT2 LABEL +* +************ + USING IC$CCB,R1 +RDF2E LA R1,VCCB + LH R0,IC$SF GET DEV / CHAN STATUS TO R0 + CANCEL (0) ABORT WITH STATUS +*********** +* +* ERROR READING FMT3 LABEL +* +************ + USING IC$CCB,R1 +RDF3E LA R1,VCCB + LH R0,IC$SF GET DEV / CHAN STATUS TO R0 + CANCEL (0) ABORT WITH STATUS +*********** +* +* ERROR READING FMT4 LABEL +* +************ + USING IC$CCB,R1 +RDF4E LA R1,VCCB + LH R0,IC$SF GET DEV / CHAN STATUS TO R0 + CANCEL (0) ABORT WITH STATUS +*********** +* +* ERROR READING FMT1 LABEL +* +************ + USING IC$CCB,R1 +NEXTF1E LA R1,VCCB + LH R0,IC$SF GET DEV / CHAN STATUS TO R0 + CANCEL (0) ABORT WITH STATUS +************ +* +* SEND VOLUME ID NOT SPECIFIED ERROR +* +************ +BADVOL MVC ZA#OMSG(NOVOLL),NOVOL MOVE MSG TO OMA + LA R11,NOVOLL SET MSG LENGTH + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION + B DONE +************ +* +* SEND UNKNOWN VOLUME ID ERROR +* +************ +UNKVOL MVC ZA#OMSG(ILLVOLL),ILLVOL MOVE MSG TO OMA + LA R11,ILLVOLL SET MSG LENGTH + STH R11,ZA#OTL + MVI ZA#PSIND,ZA#PSNN SET NORMAL TERMINATION + B DONE +************ +* +* FIND THE PUB FOR THE VOLUME POINTED TO BY R1. R1 WILL HAVE THE +* ABSOLUTE ADDRESS OF THE PUB ON EXIT. ZERO IF NOT FOUND. +* +************ + USING SB$SIB,R10 + USING JP$PRE,R8 + USING IP$PUB,R9 +FNDPUB LR R11,R1 SAVE R1 FOR LATER +* +* GET ABSOLUTE BASE ADDR OF BEMSIM FROM THE PREAMBLE +* + LA R8,PREBFR + LR R1,R8 + GETINF PRE,(1),L'PREBFR,0 GET PREAMBLE INFO + MVC BASEADR,JP$JSB SAVE BASE ADDR OF JOB FOR LATER +* +* GET PTR TO 1ST PUB & NUMBER OF PUBS FROM THE SIB +* + LA R10,SIBBFR + LR R1,R10 + GETINF SIB,(1),L'SIBBFR,0 GET SIB INFO + MVC NUMPUBS,SB$PBC+2 SAVE # OF PUBS + L R1,SB$PBA POINT TO 1ST PUB + S R1,BASEADR MAKE NEGATIVE OFFSET INTO SUPER +* +* LOOP THROUGH THE PUB TABLE LOOKING FOR A MATCH +* + LA R9,PUBBFR COVER PUBBFR +FPLOOP MVC PUBBFR(IP$LNGTH),0(R1) COPY PUB TO MY BUFFER + CLI IP$TYP,X'20' IS IT DISK? + BNE FPNEXT NO, TRY NEXT PUB + LH R12,IP$TRL GET TRAILER ADDRESS + S R12,BASEADR MAKE NEGATIVE OFFSET INTO SUPER + MVC IP$PUBT(IP$LENT),0(R12) COPY TRAILER TO MY BUFFER + CLC IP$VSN,0(R11) VOLUME ID A MATCH? + BNE FPNEXT NO, TRY NEXT PUB + A R1,BASEADR MAKE PUB ADDR ABSOLUTE + BR R14 RETURN +* +FPNEXT LA R1,IP$LNGTH(R1) BUMP PUB PTR + AI NUMPUBS,-1 DECR. PUB COUNT + BP FPLOOP > ZERO, THEN LOOP +* + XR R1,R1 SHOW NOT FOUND + BR R14 RETURN + DROP R8,R9,R10 +************ +TSAM DC CL4'SAM' +TDA DC CL4'D.A.' +TNI DC CL4'N.I.' +TISAM DC CL4'ISAM' +TIRAM DC CL4'IRAM' +TSAT DC CL4'SAT' +TUNK DC CL4'UNKN' +XCMASK DC XL4'40202120' +CYLMASK DC XL4'40202120' +************ +NOVOL ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'THE VOLUME ID MUST BE SPECIFIED. /VTOC VOL-ID' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +NOVOLL EQU *-NOVOL +************ +ILLVOL ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'UNKNOWN VOLUME ID' + ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE +ILLVOLL EQU *-ILLVOL +************ +HDR ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE + DC C'FILENAME CYL EXTENTS TYPE' +HDRL EQU *-HDR +************ +FILMSG ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE +FNAME EQU *-FILMSG + DC C'XXXXXXXXXXXXXXXXXXXX' +FCYL EQU *-FILMSG + DC C' XXX ' +FEXTENTS EQU *-FILMSG + DC C' XXX ' +FTYPE EQU *-FILMSG + DC C'XXXX' +FILMSGL EQU *-FILMSG +************ +EOJMSG ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'27' ERASE PROTECTED + DC CL1'M' + DC XL1'1E' SOE +EOJMSGL EQU *-EOJMSG +************ +MOREMSG ZO#COORD 1,1 CURSOR HOME + DC XL1'27' DELETE LINE + DC CL1'k' + ZO#COORD 1,23 LINE 23 COLUMN 1 + DC XL1'1E' SOE + DC C'MORE (Y/N)? ' + DC XL1'1E' SOE +MOREMSGL EQU *-MOREMSG +************ + ZM#DOMH +ZA#OMSG DS CL2048 OUTPUT MSG BFR. +************ +WORKAREA DSECT +DTEMP DS D DOUBLE WORD ALIGNED TEMP VAR. +ELOW DS H EXTENT LOWER CYL +EHIGH DS H EXTENT UPPER CYL +BASEADR DS A BASE ADDR. OF BEMSIM JOB +NUMPUBS DS H # OF PUBS +NUMEXT DS H # OF EXTENTS +CTEMP DS CL10 +YN DS CL1 + DS 0D +PREBFR DS XL(JP$LNGTH) JOB PREAMBLE BUFFER + DS 0D +SIBBFR DS XL(SB$LNGTH) SYS. INFO. BLOCK BUFFER + DS 0D +PUBBFR DS XL(IP$LNGTH) PUB BUFFER +PTRLBFR DS XL(IP$LENT) PUB TRAILER BFR + DS 0D +VBCW DS XL(IB$LNGTH) DISK BCW + DS 0H +VBFR DS XL256 DISK I/O BUFFER + DS 0D +VCCB DS XL(IC$LNGTH) DISK CCB + DS 0D +VFCB DS XL(256) DISK FCB +F4ADDR DS CL5 FMT4 RECORD ADDRESS (CCHHR) +F2ADDR DS CL5 FMT2 RECORD ADDRESS (CCHHR) +F3ADDR DS CL5 FMT2 RECORD ADDRESS (CCHHR) +SAVAREA DS 18F +************ +CDA DSECT +FSTPASS DS XL1 FIRST PASS FLAG (0 = FIRST PASS) + DS XL1 +LINCNT DS H SCREEN LINE COUNTER +VSN DS CL8 VOLUME ID + DS 0H +VTSTRT DS XL5 VTOC START ADDRESS (CCHHR) + DS 0H +VTEND DS XL5 VTOC END ADDRESS (CCHHR) +* +BEMVTC CSECT +* + END +// FIN \ No newline at end of file diff --git a/U9030/Source/DdiTst.asm b/U9030/Source/DdiTst.asm new file mode 100644 index 0000000..3af54e6 --- /dev/null +++ b/U9030/Source/DdiTst.asm @@ -0,0 +1,201 @@ +DDITST START +* +* An attempt to write an ICAM Direct Data Interface (DDI) +* Communications User Program (CUP). +* + PRINT GEN + SUPEQU REGS=YES,TCB=NO,PRE=YES,SIB=NO,IO=NO,TRN=NO + TQ#X ALL ICAM PACKETS +* + BALR R2,0 + USING *,R2 +************ +* +* GET INFO FROM THE JOB PREAMBLE SO THAT CAN KNOW HOW MUCH MEMORY +* WE HAVE TO PLAY WITH. +* +************ + GETINF PRE,PREWA,JP$LNGTH,0 +************ +* +* OPEN THE NETWORK +* +************ + LA R11,NQEMSG POINT TO APPROPRIATE ERR MSG + ST R11,EMSGADR + XR R0,R0 + NETREQ EDT,ERRET=NETERR OPEN THE NETWORK + LTR R0,R0 SUCCESS? + BNZ NETERR NO + OPR NQOK,L'NQOK YES, TELL OPERATOR +************ +* +* GET DEVICE INFO FOR KNOWN TERMINALS +* +************ + LA R11,CCEMSG POINT TO APPROPRIATE ERR MSG + ST R11,EMSGADR + CCACPY TNAMES,TNAMESL,CCAINFO,CCAINFOL +* CANCEL 1 TAKE A DUMP +************ +* +* SEND 'DDITST READY' MESSAGE TO A TERIMAL. CURRENTLY, THIS SENDS +* ONE MESSAGE AND WAITS FOR THE OUTPUT COMPLETION ROUTINE TO ADJUST +* THE MCTPKT TO THE NEXT TERMINAL ID BEFORE SENDING ANOTHER. I SUSPECT +* THAT, ALTHOUGH THIS WORKS FOR THIS TEST, I WILL NEED A MCTPKT FOR +* EACH TERMINAL IF THINGS LIKE BUFFER TOGGLING ARE TO WORK PROPERLY. +* THAT WOULD ALSO ALLOW ME TO SEND MESSAGES TO MULTIPLE TERMINALS +* CONCURRENTLY AND LET ICAM SORT OUT THE DELIVERY TIMING. +* +************ + USING TN#MCTDS,R1 +SNRDY LA R1,MCTO COVER OUTPUT MCT PACKET + LA R11,SNEMSG POINT TO APPROPRIATE ERROR MSG + ST R11,EMSGADR + LA R11,RDYMSG POINT TO MESSAGE + ST R11,TN#MCBFA + LA R11,L'RDYMSG SET MSG LENGTH + STH R11,TN#MCBAL + MVI TN#MCCKB,TN#MCEM1++TN#MCLBW SET LAST BUFFER FLAGS + MCPCALL (1) SEND IT + OPR CALLDONE,L'CALLDONE WE SHOULD NEVER COME HERE + CANCEL 1 TAKE A DUMP +************ +* +* ECHO MOST RECENTLY RECEIVED INPUT BACK TO ORIGINATING TERMINAL +* +************ + USING TN#MCTDS,R1 +ECHO MVI BFRI,C' ' CLEAR DICE CODE FROM INPUT + MVC BFRI+1(3),BFRI + LA R1,MCTI COVER INPUT MCT PACKET + LH R11,TN#MCCHC GET MSG LENGTH + LH R12,TN#MCTIN GET SRC TERMINAL ID + LA R1,MCTO COVER OUTPUT MCT PACKET + STH R11,TN#MCBAL SET MSG LENGTH + STH R12,TN#MCTIN SET TERMINAL ID + LA R11,BFRI SET TO SEND FROM INPUT BFR + ST R11,TN#MCBFA + MVI TN#MCCKB,TN#MCEM1++TN#MCLBW SET LAST BUFFER FLAGS + MCPCALL (1) SEND IT + OPR CALLDONE,L'CALLDONE WE SHOULD NEVER COME HERE + CANCEL 1 TAKE A DUMP +************ +* +* REQUEST INPUT FROM LINE 1 +* +************ + USING TN#MCTDS,R1 +INPUT LA R1,MCTI COVER INPUT MCT PACKET + LA R11,RCEMSG POINT TO APPROPRIATE ERROR MSG + ST R11,EMSGADR + LA R11,BFRI POINT TO BUFFER + ST R11,TN#MCBFA + LA R11,L'BFRI SET BUFFER LENGTH + STH R11,TN#MCBAL + XC TN#MCCHC,TN#MCCHC CLEAR RECV'D CHAR COUNT + LA R11,1 SET TERM. ID TO 1 + STH R11,TN#MCTIN + XC TN#MCCKB,TN#MCCKB CLEAR BFR CTRL BYTE + MCPCALL (1) GET THE INPUT + OPR CALLDONE,L'CALLDONE WE SHOULD NEVER COME HERE + CANCEL 3 TAKE A DUMP +************ +* +* RELEASE THE NETWORK +* +************ + NETREL EDT +* + EOJ +*********** +* +* NETWORK REQUEST ERROR HANDLER +* R0 = ERROR CODE +* +*********** +NETERR LR R11,R0 + LA R1,EMSGADR + LA R0,20 + OPR (1),(0) + LR R0,R11 + CANCEL (0) +*********** +* +* INPUT COMPLETION ROUTINE +* R1 = PTR TO MCTPKT +* +* THIS NEEDS TO BE ABLE TO HANDLE ERRORS, RETRIES, ETC. +* +*********** + USING TN#MCTDS,R1 +ICMPL LR R11,R1 SAVE MCTPKT PTR + OPR IDONE,L'IDONE TELL OPR INPUT COMPLETE + LR R1,R11 RESTORE R1 + B ECHO +*********** +* +* OUTPUT COMPLETION ROUTINE +* R1 = PTR TO MCTPKT +* +* THIS NEEDS TO BE ABLE TO HANDLE ERRORS, RETRIES, ETC. +* +*********** + USING TN#MCTDS,R1 +OCMPL NOP RDYDONE + LR R11,R1 SAVE MCTPKT PTR + OPR ODONE,L'ODONE TELL OPR OUTPUT COMPLETE + LR R1,R11 RESTORE R1 + LH R11,TN#MCTIN GET LAST TERIMINAL ID + LA R11,1(R11) BUMP BY 1 + STH R11,TN#MCTIN UPDATE MCTPKT + CH R11,MAXTERMS > MAX. CONFIGURED TERMINALS? + BNH SNRDY NO, SEND RDY MSG TO NEXT TERM. +* + MVI OCMPL+1,X'FF' MAKE NOP A BRANCH +RDYDONE B INPUT +************ +* +* CONFIGURATION VALES +* +************ +MAXTERMS DC H'2' +************ +EMSGADR DS A +NQOK DC C'NETREQ OK' +NQEMSG DC CL20'NETWORK ERROR' +CCEMSG DC CL20'CCACPY ERROR' +SNEMSG DC CL20'SEND ERROR' +RCEMSG DC CL20'RECEIVE ERROR' +CALLDONE DC C'BACK FROM MCPCALL' +ODONE DC C'OUTPUT COMPLETE' +IDONE DC C'INPUT COMPLETE' +RDYMSG DC C'DDITST READY' + DS 0F +* LIST OF KNOWN TERMINALS PASSED TO CCACPY TO GET DVC INFO. +TNAMES DC CL4'T001' + DC CL4'T002' + DC F'-1' +TNAMESL EQU *-TNAMES +CCAINFO DS 25F ENOUGH ROOM FOR 4 TERMINALS +CCAINFOL EQU *-CCAINFO +* MCT PACKET FOR OUTPUT +MCTO MCTPKT OCMPL,SEND, X + BUFFERA=BFRO, X + BAL=L'BFRO, X + ID=(1,1), X + ENDBUF=1 +* MCT PACKET FOR INPUT +MCTI MCTPKT ICMPL,RECEIVE, X + BUFFERA=BFRI, X + BAL=L'BFRI, X + ID=(1,1), X + ENDBUF=1 +* WORK AREA FOR JOB PREAMBLE + DS 0D +PREWA DS (JP$LNGTH)XL1 +BFRI DS CL2048 +BFRO EQU BFRI +* + END +// FIN \ No newline at end of file diff --git a/U9030/Source/DdiTst.jcl b/U9030/Source/DdiTst.jcl new file mode 100644 index 0000000..7ae8c5c --- /dev/null +++ b/U9030/Source/DdiTst.jcl @@ -0,0 +1,8 @@ +// JOB DDITST +// DVC 20 // LFD PRNTR +// OPTION JOBDUMP +// DVCVOL LNS001 +// LBL LNSLOD // LFD LOD +// EXEC DDITST,LOD +/& +// FIN \ No newline at end of file diff --git a/U9030/Source/OS3.asm b/U9030/Source/OS3.asm index 65de796..24f1b9f 100644 --- a/U9030/Source/OS3.asm +++ b/U9030/Source/OS3.asm @@ -962,7 +962,7 @@ 1744: BCR R15,R3 RETURN * 1746: DC X'042E' ADDRESS OF SAVE USER REGS. RTN. - * SUPERVISOR ENTRY POINT AFTER IPL. (IDLE LOOP???) + * SUPERVISOR ENTRY POINT AFTER IPL. SWITCHER!! USING *,R15 USING JT$TCB,R14 USING SB$SIB,0 diff --git a/U9030/Source/SaveBemAsm.jcl b/U9030/Source/SaveBemAsm.jcl new file mode 100644 index 0000000..3f79a12 --- /dev/null +++ b/U9030/Source/SaveBemAsm.jcl @@ -0,0 +1,47 @@ +// JOB LIBS +// DVC 20 // LFD PRNTR +// DVC 50 // VOL REL042 // LBL $Y$JCS // LFD D0 +// EXEC LIBS +/$ + FIL D0=D0 + DEL D0,S,BEMASM + ELE D0,S,BEMASM +// JOB BEMASM,,10000 +// OPTION SCAN,SUB +// DVC 20 // LFD PRNTR +// DVCVOL LNS001 +// LBL LNSMAC // LFD MAC +// DVCVOL LNS001 +// LBL LNSOBJ // LFD OBJ +// DVCVOL LNS001 +// LBL LNSLOD // LFD LOD +// WORK1 +// WORK2 +// EXEC ASM +// PARAM LST=(NC) +// PARAM OUT=OBJ +// PARAM LIN=MAC +/$ +// CR +/* +// SKIP DONE,11111111 +// OPTION SUB +// WORK1 +// EXEC LNKEDT +// PARAM OUT=LOD +// PARAM NOAUTO +/$ + LOADM BEMSIM + INCLUDE BEMSIM,OBJ + INCLUDE BEMLIB,OBJ + INCLUDE BEMPRNTR,OBJ + INCLUDE BEMSCRCH + INCLUDE PR$IOE,$Y$OBJ +/* +//DONE NOP +/& + EOD + COP.D D0,S,BEMASM +/* +/& +// FIN \ No newline at end of file diff --git a/U9030/Source/SaveBemDsects.jcl b/U9030/Source/SaveBemDsects.jcl new file mode 100644 index 0000000..92165ad --- /dev/null +++ b/U9030/Source/SaveBemDsects.jcl @@ -0,0 +1,312 @@ +// JOB LIBS +// DVC 20 // LFD PRNTR +// DVCVOL LNS001 +// LBL LNSMAC // LFD D0 +// EXEC LIBS +/$ + FIL D0=D0 + DEL D0,P,BEMDSCTS + ELE D0,P,BEMDSCTS + PROC &P,1 +BEMDSCTS NAME +************ +* +* LOW MEMORY DESCRIPTION +* +************ +LOWMEM DSECT +LM$TEST DS 16XL1 LOW MEMORY TEST PATTERN +LM$ZERO EQU LM$TEST WORD OF ZEROS +LM$FTTL DS F TTL FREE MEMORY AT BEM START +LM$FSTRT DS A FREE MEMORY START +LM$FEND DS A FREE MEMORY END +LM$TCNT DS H # TERMINALS + DS H UNUSED +LM$TFRST DS A FIRST TERM. TABLE +LM$TLAST DS A LAST TERM. TABLE +LM$TLSVC DS A LAST TERM. SERVICED +LM$PFRST DS A FIRST PGM. TABLE +LM$PLAST DS A LAST PGM. TBLE +LM$PMAX DS F MAX. PGM. SIZE +LM$UFRST DS A FIRST USER TABLE +LM$ULAST DS A LAST USER TABLE +LM$AFRST DS A FIRST ALIAS TABLE +LM$ALAST DS A LAST ALIAS TABLE +LM$MAIN DS A MAIN PGM COVER +LM$CLRM DS A CLRMEM ENTRY POINT +LM$CPYM DS A CPYMEM ENTRY POINT +LM$GTKN DS A GETOKEN ENTRY POINT +LM$FTNAM DS A FIND TERM. NAME ENTRY POINT +LM$IBFR DS A ICAM INPUT BUFFER +LM$OBFR DS A ICAM OUTPUT BUFFER +LM$LOPN DS A LIBRARY OPEN RTN (L$OPEN) +LM$LCLS DS A LIBRARY CLOSE RTN (L$CLOSE) +LM$LDFST DS A LIBRARY DIR 1ST RTN (L$DFIRST) +LM$LDNXT DS A LIBRARY DIR NEXT RTN (L$DNEXT) +LM$LFIND DS A LIBRARY FIND ELEMENT (L$DFIND) +LM$LMHDR DS A LIBRARY GET MODULE HDR (L$EHDR) +LM$LEFST DS A LIBRARY 1ST ELE REC (L$EFIRST) +LM$LENXT DS A LIBRARY 1ST ELE REC (L$ENEXT) +LM$POPEN DS A OPEN A PRINTER FILE (P$OPEN) +LM$PCLSE DS A CLOSE A PRINTER FILE (P$BRKPT) +LM$PWRIT DS A WRITE A PRINT LINE (P$PUT) +LM$LDEL DS A LIBRARY DELETE AN ELE (L$DELETE) +LM$SAVE DS 18F REGISTER SAVE AREA +LM$LNGTH EQU *-LOWMEM +************ +* +* TERMINAL TABLE DESCRIPTION +* +************ +TERMTBL DSECT +TT$NEXT DS A PTR. TO NEXT ENTRY +TT$NAME DS CL4 TERM. NAME +TT$LINE DS H LOGICAL LINE # +TT$ID DS H LOGICAL TERM. # +TT$IDF EQU TT$LINE,4 FULL WORD LINE # / TERM # +TT$TNUM DS H TERM. # (REC # IN BFR FILE) +TT$FLAGS DS XL1 FLAG BYTE +TT$WAITO EQU X'80' WAIT FOR OUTPUT COMPLETION +TT$WAITI EQU X'40' WAIT FOR INPUT +TT$WAIT EQU TT$WAITO++TT$WAITI +TT$IPEND EQU X'20' INPUT PENDING +TT$LOGON EQU X'10' TERMINAL LOGGED ON +TT$ODELV EQU X'08' OUTPUT DELV. NOTIFICATION PEND. +TT$DLVCD DS XL1 CONTINUOUS OUTPUT DELIVERY CODE +TT$NXTPG DS A PTR. TO NEXT PGM TO BE SCHEDULED +TT$USER DS A PTR. TO LOGGED ON USER TABLE +TT$LSTPG DS A PTR. TO LAST PGM EXECUTED +TT$LGNDT DS F LOGON DATE +TT$LGNTM DS F LOGON TIME +TT$CONT DS F CONTINUOUS OUTPUT CODE +TT$LNGTH EQU *-TERMTBL +************ +* +* PROGRAM TABLE DEFINTION +* +************ +PGMTBL DSECT +PT$NEXT DS A LINK TO NEXT PROG TBL ENTRY +PT$CODE DS CL8 COMMAND CODE +PT$MNAME DS CL8 EXECUTABLE MODULE NAME +PT$SIZE DS F LOAD MODULE SIZE +PT$FLAGS DS XL1 FLAG BYTE +PT$DISBL EQU X'80' DISABLED +PT$LOGON EQU X'40' LOGON REQUIRED +PT$NTRY DS XL3 ENTRY PT. ADDRESS +PT$NTRYA EQU PT$FLAGS,4 FULL WORD ENTRY PT. ADDRESS +PT$LNGTH EQU *-PGMTBL +************ +* +* PROGRAM ALIAS TABLE DEFINITION +* +************ +ALIASTBL DSECT +AT$ALIAS DS CL8 ALIAS +AT$PGM DS A PTR. TO PROGRAM TABLE +AT$LNGTH EQU *-ALIASTBL TABLE ENTRY LENGTH +************ +* +* PROGRAM PHASE HEADER +* +************ +PHASEHDR DSECT + DS H +PH$NUM DS XL1 PHASE NUMBER +PH$FLGS DS XL2 FLAGS +PH$LADDR DS XL4 LOAD ADDRESS +PH$PLNTH DS XL4 PHASE LENGTH +PH$NAME DS CL8 PHASE NAME +PH$DATE DS XL3 DATE +PH$TIME DS XL3 TIME +PH$MLNTH DS XL4 MODULE LENGTH +PH$ANAME DS CL8 ALIAS NAME +PH$CMNTS DS CL30 COMMENTS +************ +* +* USER SECURITY TABLE +* +************ +USERTBL DSECT +UT$NEXT DS A LINK TO NEXT USER TABLE ENTRY +UT$ID DS CL4 USER ID +UT$ACCT DS CL4 ACCOUNT ID +UT$PWD DS CL4 PASSWORD +UT$LNGTH EQU *-USERTBL +************ +* +* SAT PARTITION (PCA) DEFINITION +* +************ +PCA DSECT +PC$PCAID DS A CURRENT PCA RELATIVE ADDRESS +PC$PMBA DS A MAX PCA BLOCK ADDRESS +PC$BPT DS A BLOCKS PER TRACK +PC$PID DS CL1 PCA ID +PC$EODID DS AL3 END OF DATA ID +PC$IOCNT DS XL1 I/O COUNT +PC$A1 DS XL3 IOAREA1 ADDRESS +PC$A1F EQU PC$IOCNT,4 FULL WORK I/O AREA1 ADDRESS +PC$PBKS DS H PCA RELATIVE BLOCK SIZE + DS CL1 RESERVED +PC$PSPB DS CL1 SECTORS PER BLOCK +PC$LACE DS H INTERLACE FACTOR +PD$KLE EQU PC$LACE KEY LENGTH +PC$UOS DS H UNIT OF STORE +PC$LADJ DS A INTERLACE ADJUSTMENT FACTOR +PC$PFG1 DS CL1 PCA FLAG BYTE +* BIT 0 FORMAT WRITE +* BIT 1 INTERLACED FILE +* BIT 2 SEQUENTIAL = YES +* BIT 3 WRITE VERIFY +* BIT 4 VERIFY REQUIRED/INITIAL ALLOCATION +* BIT 5 NO EXTENSION PERMITTED +* BIT 6 INTERLACE ADJUST/KEYED DATA +* BIT 7 SIZE SPECIFIED IN TRACKS +PC$EOD DS AL3 END OF DATA ADDRESS +PS$EOFA EQU PC$PFG1,4 +************ +* +* LIBRARY FILE PARAMETER PACKET +* +************ +LIBFIL DSECT +LF$NAME DS CL8 FILE NAME AS GIVEN ON // LFD +LF$ELE DS CL8 ELEMENT NAME +LF$ETYP DS XL1 ELEMENT TYPE + DS XL3 UNUSED +LF$DIRP DS A PTR TO ELEMENT DIR. ENTRY +LF$DBFR DS A DIRECTORY PARTITION I/O BFR +LF$EBFR DS A DATA (ELEMENT) PARTITION I/O BFR +LF$DBLK DS F BLOCK # OF CURRENT DIR. BLOCK +LF$DOFST DS H OFFSET TO CURRENT DIR. ENTRY +LF$DLEN DS H LENGTH OF CURRENT DIR. BLOCK +LF$EBLK DS F BLOCK # OF CURRENT ELE. BLOCK +LF$EOFST DS H OFFSET TO CURRENT ELE. ENTRY +LF$ELEN DS H LENGTH OF CURRENT ELE. BLOCK +LF$SBFR DS A PTR TO 256 CHAR SRC RECORD BFR. +LF$LNGTH EQU *-LIBFIL +* +************ +* +* LIBRARY BLOCK HEADER DEFINITIONS +* +************ +L$BLKHDR DSECT +LBH$NUM DS XL3 +LBH$LEN DS XL1 +LBH$CHK DS XL1 +LBH$SIZE EQU *-L$BLKHDR +************ +* +* LIBRARY DIRECTORY ENTRY +* +************ +L$DIRENT DSECT +LDE$NAME DS CL8 MODULE NAME +LDE$TYPE DS XL1 MODULE TYPE +LDE$BLK DS XL3 DATA PARTITION BLOCK # +LDE$REC DS XL1 OFFSET WITHIN BLOCK +LDE$BKRC EQU LDE$BLK,4 BLOCK & OFFSET COMBINED +LDE$SIZE EQU *-L$DIRENT +************ +* +* LIBRARY MODULE HEADER +* +************ +L$MODHDR DSECT +LMH$LEN DS XL1 +LMH$TYPE DS XL1 +************ +* +* LIBRARY SOURCE / PROC MODULE HEADER +* +************ +L$SRCHDR DSECT +LSH$LEN DS XL1 RECORD LENGTH +LSH$TYPE DS XL1 RECORD TYPE (A3 OR A4) + DS XL1 UNUSED +LSH$FLGS DS XL2 + DS XL9 UNUSED +LSH$NAME DS CL8 MODULE NAME +LSH$DATE DS XL3 DATE +LSH$TIME DS XL2 TIME + DS XL1 UNUSED +LSH$CMNT DS XL30 COMMENTS +LSH$SIZE EQU *-L$SRCHDR +************ +* +* LIBRARY ELEMENT TYPES +* +************ +LET$NULL EQU X'00' +LET$NTRY EQU X'04' +LET$CSCT EQU X'08' +LET$OBJ EQU X'80' +LET$PHSE EQU X'90' +LET$BGRP EQU X'A0' +LET$EOF EQU X'A1' +LET$PNME EQU X'A2' +LET$PROC EQU X'A3' +LET$SRC EQU X'A4' +LET$EGRP EQU X'A8' +LET$BLK EQU X'B0' +* +************ +* +* SCRATCH FILE DSECTS +* +************ +* +************ +* +* THE BITMAP BLOCK. A 1 BIT INDICATES AN ALLOCATED BLOCK. +* +************ +SF$BMAP DSECT +SF$BITS DS 2048XL1 2048 1 BYTE ENTRIES +************ +* +************ +* +* INDEX BLOCK. 1023 HALF WORD ENTRIES CONTAINING THE BLOCK # FOR +* A DATA BLOCK CONTAINING 24 SOURCE LINES. SO, ENTRY ZERO IS FOR +* LINES 0-23, ENTRY 1 IS FOR 24-47, ETC. +* +************ +SF$IDXBK DSECT +SF$INEXT DS H BLOCK # OF NEXT BLK IN CHAIN +SF$INDEX DS 1023H BLOCK #S OF DATA BLOCKS +* +************ +* +* DATA BLOCK. 24 84 BYTE ENTRIES FOR THE SOURCE LINES CONTAINED +* IN THIS BLOCK. DATA BLOCKS FOR INTEGER LINE #S WILL CONTAIN +* 24 ENTRIES. DATA BLOCKS FOR FRACTIONAL LINE #S WILL CONTAIN 10 +* ENTRIES. THERE CAN BE UP TO 4 LEVELS OF OVERFLOW BLOCKS FOR EACH +* INTEGER LINE #. ONE FOR EACH DECIMAL DIGIT OF THE FRACTION. +* +************ +SF$DTABK DSECT +SF$DNEXT DS H BLOCK # OF NEXT BLK IN CHAIN +SF$LINES DS 24XL84 24 SOURCE LINES / BLOCK +* +************ +* +* SOURCE LINE. +* +************ +SF$SRCLN DSECT +SF$DEL DS XL1 NON ZERO = DELETED + DS XL1 UNUSED +SF$OVLF DS H BLOCK # OF LINE INSERTED +* FOLLOWING THIS LINE +SF$SRC DS CL80 THE SOURCE CODE +* +&SYSECT CSECT + END + EOD + COP.D D0,P,BEMDSCTS +/* +/& +// FIN \ No newline at end of file diff --git a/U9030/Source/SaveCopin.jcl b/U9030/Source/SaveCopin.jcl new file mode 100644 index 0000000..5b7d093 --- /dev/null +++ b/U9030/Source/SaveCopin.jcl @@ -0,0 +1,31 @@ +// JOB LIBS +// DVC 20 // LFD PRNTR +// DVC 50 // VOL REL042 // LBL $Y$JCS // LFD D0 +// EXEC LIBS +/$ + FIL D0=D0 + DEL D0,S,LNSCOPIN + ELE D0,S,LNSCOPIN +// JOB LNSCOPIN,,10000 +// OPTION SCAN,SUB +// IF ('&F.X' NE 'X')FOK +//F JSET LNSSRC +//FOK NOP +// DVC 20 // LFD PRNTR +// DVCVOL LNS001 +// LBL &F // LFD D0 +// EXEC LIBS +/$ + FIL D0=D0 + DEL D0,S,&M + ELE D0,S,&M +// CR + EOD + COP.D D0,S,&M +/* +/& + EOD + COP.D D0,S,LNSCOPIN +/* +/& +// FIN \ No newline at end of file diff --git a/U9030/Source/SaveDalgn.jcl b/U9030/Source/SaveDalgn.jcl new file mode 100644 index 0000000..5254478 --- /dev/null +++ b/U9030/Source/SaveDalgn.jcl @@ -0,0 +1,19 @@ +// JOB LIBS +// DVC 20 // LFD PRNTR +// DVC 50 // VOL LNS001 // LBL LNSMAC // LFD D0 +// EXEC LIBS +/$ + FIL D0=D0 + DEL D0,P,DALGN + ELE D0,P,DALGN +&L PROC &P,1 +DALGN NAME +&L SRL &P(1),3 + LA &P(1),1(&P(1)) + SLL &P(1),3 + END + EOD + COP.D D0,P,DALGN +/* +/& +// FIN \ No newline at end of file diff --git a/U9030/Source/SupervisorTest.asm b/U9030/Source/SupervisorTest.asm new file mode 100644 index 0000000..c335eb3 --- /dev/null +++ b/U9030/Source/SupervisorTest.asm @@ -0,0 +1,115 @@ +*********************************************************************** +* * +* A PROGRAM TO TEST ACCESS TO RESTRICTED SUPERVISOR TABLES. AN * +* EXPERIMENT TO SEE IF I CAN FIGURE OUT HOW THE BEM /DISPLAY JOBS * +* AND /DISPLAY VOLUMES COMMANDS WORK. * +* * +*********************************************************************** +* +SUPTST START + PRINT NOGEN + SUPEQU REGS=YES, X + TCB=YES, X + PRE=YES, X + SIB=YES, X + IO=NO, X + TRN=NO +PUBDSECT DSECT + PUBEQU +SUPTST CSECT + PRINT GEN +* + BALR R2,0 + USING *,R2 + USING SB$SIB,R3 + USING JP$PRE,R4 + USING JT$TCB,R5 + USING IP$PUB,R6 +************ +* +* TRY TO SCAN THE SWITCH LIST LOOKING FOR JOBS +* +************ +* +* GET JOB PREAMBLE TO GET ABSOLUTE BASE ADDRESS OF THIS PROGRAM +* + GETINF PRE,PREBFR,L'PREBFR,0 + LA R4,PREBFR +* +* GET THE SYSTEM INFORMATION BLOCK (SIB) +* + GETINF SIB,SIBBFR,L'SIBBFR,0 + LA R3,SIBBFR +* +* CALCULATE A POINTER TO THE FIRST NON-SUPERVISOR TCB CHAIN. THIS WILL +* END UP BEING A NEGATIVE ADDRESS WHICH, WHEN ADDED TO THE CURRENT +* RELOCATION REGISTER (JP$JSB), WILL GIVE US THE ADDRESS IN THE +* SUPERVISOR TO READ. FORTUNATELY, OS/3 DOESN'T SEEM TO SET THE +* READ PROTECTED BIT IN THE STORAGE KEY SO WE CAN GET AWAY WITH THIS. +* + LH R11,SB$SLA GET ABS ADDR OF SWITCH LIST + AH R11,=H'16' SKIP SUPERVISOR TCBS + S R11,JP$JSB SUBTRACT BASE ADDR OF PRGM + MVC BASEADR,JP$JSB SAVE BASE ADDR FOR LATER +* +SWLOOP1 L R5,0(R11) GET ADDR OF 1ST TCB IN LIST + LA R5,0(R5) CLEAR MSB + ST R5,FSTTCB SAVE IT +SWLOOP LTR R5,R5 ZERO? + BZ SWBUMP YES, TRY NEXT CHAIN + S R5,BASEADR MAKE NEGATIVE OFFSET INTO SUPER + L R12,JT$ECB IS ECB PTR ZERO? + LA R12,0(R12) + LTR R12,R12 + BNZ SWNTCB NO, NOT A PRIMARY TCB + L R4,JT$PRE GET PTR TO PREAMBLE + LA R4,0(R4) CLEAR MSB + S R4,BASEADR MAKE NEGATIVE OFFSET INTO SUPER + MVC JOBNAME,JP$NAM + OPR JOBNAME,8 +SWNTCB L R5,JT$LNK GET PRT TO NEXT TCB + LA R5,0(R5) CLEAR MSB + C R5,FSTTCB NEXT = FIRST? + BE SWBUMP YES, END OF CHAIN, TRY NEXT + B SWLOOP NO, LOOP +* +SWBUMP LA R11,4(R11) BUMP TO NEXT TCB CHAIN + TM 0(R11),X'FF' IS 1ST BYTE OF TCB ADDR X'FF'? + BO SWDONE YES, END OF LIST + B SWLOOP1 +* +* DONE JOBS, DISPLAY MOUNTED VOLUMES +* +SWDONE LA R6,PUBBFR COVER PUB + XC PUBNUM,PUBNUM SET PUB # TO ZERO + LH R1,PUBNUM +VLOOP GETINF PUB,PUBBFR,L'PUBBFR,0 GET INFO FOR PUB # GIVEN IN R1 + TM IP$TYP,X'20' IS IT A DISK? + BZ VNEXT NO, TRY NEXT + LH R11,IP$TRL GET ADDR OF PUB TRAILER + LTR R11,R11 ZERO? + BZ VNEXT YES, TRY NEXT + S R11,BASEADR MAKE NEGATIVE OFFSET INTO SUPER + MVC PTRLBFR,0(R11) COPY TRAILER TO MY BUFFER + CLI IP$VSN,0 IS THERE A VOLUME MOUNTED? + BE VNEXT NO, TRY NEXT + LA R1,IP$VSN SUCCESS, SHOW IT TO THE OPERATOR + OPR (1),L'IP$VSN +VNEXT AI PUBNUM,1 BUMP PUB # + LH R1,PUBNUM + C R1,SB$PBC REACHED MAX PUBS? + BNH VLOOP NO +* + EOJ +* +JOBNAME DS CL8 +BASEADR DS A +FSTTCB DS A +PREBFR DS XL(JP$LNGTH) +SIBBFR DS XL(SB$LNGTH) +PUBBFR DS XL(IP$LNGTH) +PTRLBFR DS XL(IP$LENT) +PUBNUM DS H +* + END +// FIN \ No newline at end of file diff --git a/U9030/Source/SupervisorTest.jcl b/U9030/Source/SupervisorTest.jcl new file mode 100644 index 0000000..2de0307 --- /dev/null +++ b/U9030/Source/SupervisorTest.jcl @@ -0,0 +1,8 @@ +// JOB SUPTST,,6000,6000 +// DVC 20 // LFD PRNTR +// OPTION JOBDUMP +// DVCVOL LNS001 +// LBL LNSLOD // LFD LOD +// EXEC SUPTST,LOD +/& +// FIN \ No newline at end of file diff --git a/U9030/Source/VtocTest.asm b/U9030/Source/VtocTest.asm new file mode 100644 index 0000000..386c048 --- /dev/null +++ b/U9030/Source/VtocTest.asm @@ -0,0 +1,250 @@ +VTEST START +* +* AN ATTEMPT TO ACCESS A DISK'S VTOC. AS WRITTEN, THIS WILL ONLY WORK +* FOR IDA DISKS. +* + PRINT NOGEN + SUPEQU + VTOC VOL1=YES, X + F1=YES, X + F4=YES + PRINT GEN +* + BALR R2,0 + USING *,R2 +* +* RDFCB VOLIN,RDFCBE READ THE FILE CONTROL BLOCK +* +* INSTEAD OF READING THE FCB FROM A DEVICE ASSIGNMENT IN THE JOB +* CONTROL, WE CAN JUST MANUALLY FILL IN THE FCB PORTION OF THE +* PIOCB BY SEARCHING THE SUPERVISOR'S PUB TABLE FOR THE DESIRED +* VOLUME NAME. +* + LA R1,=CL6'REL042' FIND PUB FOR VOLUME LNS001 + BAL R14,FNDPUB + LTR R1,R1 SUCCESS? + BZ BADVOL NO, WTF? + STH R1,VOLIN+14 SAVE PTR. TO PUB + MVC VOLIN+8(2),=H'16' SET FCB LENGTH TO 16 (MINIMUM) +* + BAL R14,RDV1 READ THE VOL1 LABEL +* BAL R14,OBV1 OBTAIN THE VOL1 LABEL + BAL R14,RDF4 READ THE FMT4 LABEL + BAL R14,FRSTF1 FIND 1ST FMT1 RECORD IN VTOC + LTR R1,R1 FMT1 FOUND? + BZ DONE NO +LOOP OPR VBFR-1,9 + BAL R14,NEXTF1 GET NEXT FMT1 + LTR R1,R1 FMT1 FOUND? + BZ DONE NO + B LOOP YES, TRY AGAIN +* +DONE EOJ +************ +* +* READ THE VOL1 LABEL. THIS IS ALWAYS AT CYL 0, HEAD 0, REC 3 ON THE +* DISK +* +************ + USING IB$BCW,R1 +RDV1 LA R1,VBCW + XC IB$HEAD,IB$HEAD HEAD = 0 + XC IB$CYL,IB$CYL CYL = 0 + OI IB$CYL,X'80' RECALIBRATE ON + MVI IB$RECRD,3 REC = 3 + EXCP VCCB START I/O + WAIT VCCB,RDV1E WAIT FOR IT + USING DL$VL,R1 + LA R1,VBFR COVER VOL1 LBL + MVC F4ADDR,DL$VTC SAVE FMT4 RECORD ADDRESS + BR R14 RETURN + DROP R1 +************ +* +* READ THE VOL1 LABEL USING THE OBTAIN MACRO +* +************ +OBV1 MVI OBPARAMS+8,X'80' SET FUNC CODE TO 80 (READ VOL1) + OBTAIN OBPARAMS,OBV1E,1,FCBCORE + USING DL$VL,R1 + LA R1,VBFR COVER VOL1 LBL + MVC F4ADDR,DL$VTC SAVE FMT4 RECORD ADDRESS + BR R14 RETURN + DROP R1 +* + DS 0F +OBPARAMS DC CL8'VOLIN' + DC A(VBFR) + DC A(VOLIN) +************ +* +* READ THE FMT4 LABEL. THE LOCATION OF THIS RECORD IS FOUND IN THE +* VOL1 RECORD +* +************ + USING IB$BCW,R1 +RDF4 LA R1,VBCW + MVC IB$HEAD,F4ADDR+3 MOVE HEAD + MVC IB$CYL,F4ADDR CYL + MVC IB$RECRD,F4ADDR+4 & RECORD TO BCW + EXCP VCCB START I/O + WAIT VCCB,RDF4E WAIT FOR IT + USING DL$F4,R1 + LA R1,VBFR COVER FMT4 RECORD + MVC VTSTRT,DL$VX4+2 SAVE VTOC START/END ADDRESSES + MVC VTEND,DL$VX4+6 + BR R14 + DROP R1 +************ +* +* FIND THE FIRST FMT1 RECORD IN THE VTOC. ON EXIT, R1 = 0 IF +* NO FMT1 FOUND. +* +************ + USING IB$BCW,R3 + USING DL$F1,R4 +FRSTF1 LA R3,VBCW + LA R4,VBFR + MVC IB$HEAD,VTSTRT+3 VTOC START HEAD + MVC IB$CYL,VTSTRT CYL + MVI IB$RECRD,1 RECORD 1 + B NF1READ GO READ THIS RECORD + DROP R3 +************ +* +* FIND THE NEXT FMT1 RECORD IN THE VTOC. ON EXIT, R1 = 0 IF NO +* FMT1 FOUND. +* +************ + USING IB$BCW,R3 + USING DL$F1,R4 +NEXTF1 LA R3,VBCW + LA R4,VBFR +NF1LOOP XR R11,R11 NO, BUMP RECORD # + IC R11,IB$RECRD + LA R11,1(R11) + STC R11,IB$RECRD + CH R11,=H'40' END OF TRACK? + BNH NF1READ NO + MVI IB$RECRD,1 YES, RESET RECORD # TO 1 + IC R11,IB$HEAD BUMP TRACK + LA R11,1(R11) + STC R11,IB$HEAD + CH R11,VTEND+2 END OF CYL? + BNH NF1READ NO + MVI IB$HEAD,0 YES, RESET TRACK # TO ZERO + LH R11,IB$CYL BUMP CYLINDER + LA R11,1(R11) + STH R11,IB$CYL + CH R11,VTEND END OF VTOC? + BH NF1NOFND NO +NF1READ EXCP VCCB + WAIT VCCB,NEXTF1E + CLI DL$ID1,C'1' IS IT FMT1? + BNE NF1LOOP NO, TRY AGAIN + LA R1,1 SHOW SUCCESS + BR R14 & RETURN +* +NF1NOFND XR R1,R1 SHOW NOT FOUND + BR R14 & RETURN +************ +* +* FIND THE PUB FOR THE VOLUME POINTED TO BY R1. R1 WILL HAVE THE +* ABSOLUTE ADDRESS OF THE PUB ON EXIT. ZERO IF NOT FOUND. +* +************ + USING SB$SIB,R3 + USING JP$PRE,R5 + USING IP$PUB,R6 +FNDPUB LR R11,R1 SAVE R1 FOR LATER + LA R5,PREBFR + GETINF PRE,PREBFR,L'PREBFR,0 GET PREAMBLE INFO + MVC BASEADR,JP$JSB SAVE BASE ADDR OF JOB FOR LATER +* + LA R3,SIBBFR + GETINF SIB,SIBBFR,L'SIBBFR,0 GET SIB INFO + MVC NUMPUBS,SB$PBC+2 SAVE # OF PUBS + L R4,SB$PBA POINT TO 1ST PUB + S R4,BASEADR MAKE NEGATIVE OFFSET INTO SUPER + LA R6,PUBBFR +* +FPLOOP MVC PUBBFR(IP$LNGTH),0(R4) COPY PUB TO MY BUFFER + CLI IP$TYP,X'20' IS IT DISK? + BNE FPNEXT NO, TRY NEXT PUB + LH R12,IP$TRL GET TRAILER ADDRESS + S R12,BASEADR MAKE NEGATIVE OFFSET INTO SUPER + MVC IP$PUBT(IP$LENT),0(R12) COPY TRAILER TO MY BUFFER + CLC IP$VSN,0(R11) VOLUME ID A MATCH? + BNE FPNEXT NO, TRY NEXT PUB + A R4,BASEADR MAKE ADDR ABSOLUTE + LR R1,R4 RETURN PTR T O PUB + BR R14 +* +FPNEXT LA R4,IP$LNGTH(R4) BUMP PUB PTR + AI NUMPUBS,-1 DECR. PUB COUNT + BP FPLOOP > ZERO, THEN LOOP +* + XR R1,R1 NOT FOUND + BR R14 RETURN + DROP R3,R5,R6 +* +* RDFCB ERROR ROUTINE +* +RDFCBE N R0,=A(X'FF') ISOLATE ERROR CODE + CANCEL (0) ABORT WITH ERROR CODE IN R0 +* +* ERROR READING VOL1 LABEL +* + USING IC$CCB,R1 +RDV1E LA R1,VCCB + LH R0,IC$SF GET DEV / CHAN STATUS TO R0 + CANCEL (0) ABORT WITH STATUS +* +OBV1E CANCEL (0) ABORT WITH STATUS +* +* ERROR READING FMT4 LABEL +* + USING IC$CCB,R1 +RDF4E LA R1,VCCB + LH R0,IC$SF GET DEV / CHAN STATUS TO R0 + CANCEL (0) ABORT WITH STATUS +* +* ERROR READING FMT 1 RECORD +* + USING IC$CCB,R1 +NEXTF1E LA R1,VCCB + LH R0,IC$SF GET DEV / CHAN STATUS TO R0 + CANCEL (0) ABORT WITH STATUS +* +BADVOL OPR VOLERR,L'VOLERR + CANCEL 100 +* +* AN IDA BCW TO READ 1, 256 BYTE RECORD INTO VBFR +* +VBCW BCW X'02', X + VBFR, X + X'00', X + 1 +* + DC CL4' ' +VBFR DS XL256 +* +VOLIN PIOCB MAX +* +VCCB CCB VOLIN,VBCW +* + DS 0D +SIBBFR DS XL(SB$LNGTH) BUFFER TO HOLD SIB INFO +PREBFR DS XL(JP$LNGTH) BUFFER TO HOLD JOB PREAMBLE INFO +PUBBFR DS XL(IP$LNGTH+IP$LENT) BUFFER TO HOLD PUB & TRAILER +BASEADR DS A +NUMPUBS DS H +F4ADDR DS CL5 FMT4 RECORD ADDRESS (CCHHR) + DS 0H +VTSTRT DS XL4 VTOC START ADDRESS (CCHH) +VTEND DS XL4 VTOC END ADDRESS (CCHH) +* +VOLERR DC C'INVALID VOLUME ID' +* + END +// FIN \ No newline at end of file diff --git a/U9030/Source/VtocTest.jcl b/U9030/Source/VtocTest.jcl new file mode 100644 index 0000000..ed9824a --- /dev/null +++ b/U9030/Source/VtocTest.jcl @@ -0,0 +1,7 @@ +// JOB VTOCTEST,,6000 +// DVC 20 // LFD PRNTR +// DVCVOL LNS001 +// LBL LNSLOD // LFD LOD +// EXEC VTEST,LOD +/& +// FIN \ No newline at end of file diff --git a/U9030/Source/icam.asc b/U9030/Source/icam.asc index b54b3bc..f06d56e 100644 --- a/U9030/Source/icam.asc +++ b/U9030/Source/icam.asc @@ -3,41 +3,26 @@ IMS6 CCA TYPE=(TCI),FEATURES=(OPCOM,OUTDELV), X PASSWORD=IMSNET01 BUFFERS 25,100,1,ARP=63 LNETBL LNE2 -LNE1 LINE DEVICE=(UNISCOPE),TYPE=(19200,HALF,SYNC), X - TERMS=2,LBL=256,ID=4 - TERMTB T002 -T001 TERM ADDR=(21,51),FEATURES=(U200,1920),AUX1=(COP,73), X - QUEUES=(H001,M001,L001) -T002 TERM ADDR=(21,52),FEATURES=(U200,1920),AUX1=(COP,73), X - QUEUES=(H002,M002,L002) - QTABLE H002 -L001 QUEUE TYPE=TERM -M001 QUEUE TYPE=TERM -H001 QUEUE TYPE=TERM -L002 QUEUE TYPE=TERM -M002 QUEUE TYPE=TERM -H002 QUEUE TYPE=TERM LNE2 LINE DEVICE=(UNISCOPE),TYPE=(19200,HALF,SYNC), X - TERMS=2,LBL=256,ID=5 - TERMTB T202 -T201 TERM ADDR=(22,51),FEATURES=(U200,1920),AUX1=(COP,73), X - QUEUES=(H201,M201,L201) -T202 TERM ADDR=(22,52),FEATURES=(U200,1920),AUX1=(COP,73), X - QUEUES=(H201,M201,L201) - QTABLE H202 -L201 QUEUE TYPE=TERM -M201 QUEUE TYPE=TERM -H201 QUEUE TYPE=TERM -L202 QUEUE TYPE=TERM -M202 QUEUE TYPE=TERM -H202 QUEUE TYPE=TERM + TERMS=2,LBL=256,ID=6 + TERMTB T022 +T021 TERM ADDR=(22,51),FEATURES=(U200,1920),AUX1=(COP,73), X + QUEUES=(H021,M021,L021) +T022 TERM ADDR=(22,52),FEATURES=(U200,1920),AUX1=(COP,73), X + QUEUES=(H022,M022,L022) + QTABLE H022 +L021 QUEUE TYPE=TERM +M021 QUEUE TYPE=TERM +H021 QUEUE TYPE=TERM +L022 QUEUE TYPE=TERM +M022 QUEUE TYPE=TERM +H022 QUEUE TYPE=TERM PRCSTB PRC1 PRC1 PRCS LOW=MAIN TCIDTF DISCFILE MSGSIZE=1920 ENDCCA MCP MCPNAME=C2 - CACH=(04,IMS6,01) - CACH=(05,IMS6,02) + CACH=(06,IMS6,01) END // FIN \ No newline at end of file diff --git a/U9030/Source/icam3.asc b/U9030/Source/icam3.asc new file mode 100644 index 0000000..656de03 --- /dev/null +++ b/U9030/Source/icam3.asc @@ -0,0 +1,38 @@ +COMMCT +EDT CCA TYPE=(DDI,2),FEATURES=(OPCOM,OUTDELV) + BUFFERS ,,,ARP=20 + LNETBL LNE1 +LNE1 LINE DEVICE=(UNISCOPE),TYPE=(19200,HALF,SYNC), X + TERMS=2,LBL=256,ID=4 + TERMTB T002 +T001 TERM ADDR=(21,51),FEATURES=(U200,1920),AUX1=(COP,73) +T002 TERM ADDR=(21,52),FEATURES=(U200,1920),AUX1=(COP,73) + ENDCCA +IMS6 CCA TYPE=(TCI),FEATURES=(OPCOM,OUTDELV), X + PASSWORD=IMSNET01 + BUFFERS 25,100,1,ARP=63 + LNETBL LNE2 +LNE2 LINE DEVICE=(UNISCOPE),TYPE=(19200,HALF,SYNC), X + TERMS=2,LBL=256,ID=6 + TERMTB T022 +T021 TERM ADDR=(22,51),FEATURES=(U200,1920),AUX1=(COP,73), X + QUEUES=(H021,M021,L021) +T022 TERM ADDR=(22,52),FEATURES=(U200,1920),AUX1=(COP,73), X + QUEUES=(H022,M022,L022) + QTABLE H022 +L021 QUEUE TYPE=TERM +M021 QUEUE TYPE=TERM +H021 QUEUE TYPE=TERM +L022 QUEUE TYPE=TERM +M022 QUEUE TYPE=TERM +H022 QUEUE TYPE=TERM + PRCSTB PRC1 +PRC1 PRCS LOW=MAIN +TCIDTF DISCFILE MSGSIZE=1920 + ENDCCA + MCP + MCPNAME=C3 + CACH=(04,EDT,01) + CACH=(06,IMS6,01) +END +// FIN \ No newline at end of file