mirror of
https://github.com/moshix/mvs.git
synced 2026-01-17 00:22:32 +00:00
2342 lines
185 KiB
NASM
2342 lines
185 KiB
NASM
TITLE 'Sample Operating System Version 2.00' 00010002
|
|
*********************************************************************** 00020000
|
|
* * 00030000
|
|
* ***************************************************************** * 00040000
|
|
* * * * 00050000
|
|
* * Sample Operating System * * 00060002
|
|
* * Version 2.00 * * 00067002
|
|
* * Developed at MIT 1973 * * 00074002
|
|
* * * * 00090000
|
|
* ***************************************************************** * 00100000
|
|
* * 00100602
|
|
* Update 2015/10/31 Juergen Winkelmann, e-mail winkelmann@id.ethz.ch * 00101202
|
|
* * 00101802
|
|
* - change storage protection alignments to 4K \ * 00102402
|
|
* - replace SSK/ISK instructions with SSKE/ISKE > 4K support * 00103002
|
|
* - minor changes in storage protection logic / * 00103602
|
|
* - change number of parallel processing streams to 4 * 00104202
|
|
* - change core size to 16M * 00104802
|
|
* - replace table of valid $JOB card core requests with general * 00105402
|
|
* logic rounding up any none full page request entered to next * 00106002
|
|
* full page * 00106602
|
|
* - add IPL card and two card loader for one stop creation of an * 00107202
|
|
* IPLable card deck * 00107802
|
|
* - ignore external interrupts during initialization to avoid * 00108402
|
|
* IPLRTN getting interrupted by the interval timer * 00109002
|
|
* * 00109103
|
|
* Update 2015/11/05 Juergen Winkelmann, e-mail winkelmann@id.ethz.ch * 00109203
|
|
* * 00109303
|
|
* - allow reloading card readers without needing to re-IPL the * 00109403
|
|
* system. This functionality relies on Hercules' card reader * 00109503
|
|
* behavior with the EOF initialization in place. It will not * 00109603
|
|
* work in INTR mode. * 00109703
|
|
* * 00109744
|
|
* Update 2015/11/13 Juergen Winkelmann, e-mail winkelmann@id.ethz.ch * 00109784
|
|
* * 00109824
|
|
* - add UCB to support a console at 009 using the EXCP device * 00109864
|
|
* handler. * 00109904
|
|
* * 00110000
|
|
*********************************************************************** 00120000
|
|
SPACE 3 00130000
|
|
PRINT ON,NODATA,GEN 00140000
|
|
PROGRAM CSECT , sample operating system starts at zero 00150002
|
|
CARDLDR CSECT , two card loader follows at the end 00150102
|
|
*** 00150202
|
|
*** IPL card 00150302
|
|
*** 00150402
|
|
IPLCARD CSECT , IPLable deck must begin with this card 00150502
|
|
PSWD DC F'0',X'00' initial program status word, disabled 00150602
|
|
DC AL3(LOADER) start execution at load address 00150702
|
|
CCW1 DC X'02',AL3(LOADER) read 1st card to load address 00150802
|
|
DC XL4'40000050' chain, read length = 80 00150902
|
|
CCW2 DC X'02',AL3(LOADER+80) read 2nd card to load addr + 80 00151002
|
|
DC XL4'00000050' read length = 80 00151102
|
|
DC C'Sample Operating System Version 2.00' eye catcher 00151202
|
|
DC 16X'00' pad to card length 00151302
|
|
*** 00151402
|
|
*** loader 00151502
|
|
*** 00151602
|
|
* 00151702
|
|
* Initialize 00151802
|
|
* 00151902
|
|
CARDLDR CSECT , two card loader must follow IPL card 00152002
|
|
BALR R12,0 establish .. 00152102
|
|
LA R2,2 .. base .. 00152202
|
|
SR R12,R2 .. register 00152302
|
|
USING CARDLDR,R12 tell assembler 00152402
|
|
LA R11,0 addressability of .. 00152502
|
|
USING PROGRAM,R11 .. sample operating system 00152602
|
|
LA R2,0 I/O .. 00152702
|
|
LA R3,IOINTRPT .. new PSWD 00152802
|
|
STM R2,R3,IONEW store I/O new PSWD 00152902
|
|
SSM ENBLECH0 enable interrupts from channel 0 00153002
|
|
LA R5,CCWCHAIN address of card reader CCW chain 00153102
|
|
ST R5,CAW store address in CAW 00153202
|
|
L R3,NUMCARDS number of cards to read 00153302
|
|
L R4,LOADADDR target address of loaded code 00153402
|
|
* 00153502
|
|
* create CCW chain 00153602
|
|
* 00153702
|
|
NEXTCARD LR R2,R4 load next card here 00153802
|
|
ICM R2,B'1000',READ insert write command 00153902
|
|
ST R2,0(,R5) store CCW 00154002
|
|
LA R2,80 length of card 00154102
|
|
ST R2,4(,R5) store length in CCW, zero all flags 00154202
|
|
OI 4(R5),X'40' indicate command chaining 00154302
|
|
LA R4,80(,R4) increment target address 00154402
|
|
LA R5,8(,R5) point to next CCW 00154502
|
|
BCT R3,NEXTCARD read next card 00154602
|
|
S R5,EIGHT point to previous CCW 00154702
|
|
NI 4(R5),X'BF' clear command chaining flag 00154802
|
|
* 00154902
|
|
* read cards and wait for completion 00155002
|
|
* 00155102
|
|
SIO 12(0) read cards 00155202
|
|
LA R2,*+12 continue here after I/O completion 00155302
|
|
ST R2,CONTINUE store continue address in PSWD skeleton 00155402
|
|
LPSW WAITPSWD wait for I/O completion 00155502
|
|
* 00155602
|
|
* "IPL" the Sample Operating System 00155702
|
|
* 00155802
|
|
LPSW 0 transfer control 00155902
|
|
* 00156002
|
|
* I/O interrupt handler 00156102
|
|
* 00156202
|
|
IOINTRPT EQU * 00156302
|
|
TM CSW+4,X'04' device end received? 00156402
|
|
BNO IOINTRTN -> no, keep waiting 00156502
|
|
NI IOOLD+1,X'FD' -> yes, terminate wait state and .. 00156602
|
|
NI IOOLD,X'7F' .. and disable channel 0 interrupts 00156702
|
|
IOINTRTN LPSW IOOLD return to mainline 00156802
|
|
DROP R11,R12 no longer needed 00156902
|
|
* 00157002
|
|
* Data area 00157102
|
|
* 00157202
|
|
ENBLECH0 DC C'80' mask to enable channel 0 interrupts 00157302
|
|
READ DC X'02' read a card 00157402
|
|
DS 0D align 00157502
|
|
WAITPSWD DC X'80020000' wait with channel 0 interrupts enabled 00157602
|
|
CONTINUE DS F continue here after wait 00157702
|
|
LOADADDR DC F'0' code is to be loaded here 00157802
|
|
NUMCARDS DC F'75' number of cards to read 00157904
|
|
EIGHT DC F'8' CCW length 00158002
|
|
CCWCHAIN DS 0D start of card reader CCW chain 00158102
|
|
*** 00158202
|
|
*** Sample Operating System code begins here 00158302
|
|
*** 00158402
|
|
PROGRAM CSECT , sample OS must follow loader cards 00158502
|
|
SPACE 1 00160000
|
|
CORESIZE EQU 16777216 bytes of core in object machine 00170002
|
|
SPACE 1 00180000
|
|
USING *,0 COMMUNICATIONS AREA 00190000
|
|
SPACE 1 00200000
|
|
IPLPSW DC B'00000000',B'00000000',X'0000',X'00',AL3(IPLRTN) 00210000
|
|
IPLCCW1 DS D . IPL CCW #1 00220000
|
|
IPLCCW2 DS D . IPL CCW #2 00230000
|
|
EXTOLD DS D . EXTERNAL OLD PSW 00240000
|
|
SVCOLD DS D . SVC OLD PSW 00250000
|
|
PGMOLD DS D . PROGRAM INTERRUPT OLD PSW 00260000
|
|
MCHKOLD DS D . MACHINE CHECK OLD PSW 00270000
|
|
IOOLD DS D . I/O INTERRUPT OLD PSW 00280000
|
|
CSW DS D . CHANNEL STATUS WORD 00290000
|
|
CAW DS F . CHANNEL ADDRESS WORD 00300000
|
|
UNUSED0 DS F . 00310000
|
|
TIMER DC F'-1' . TIMER 00320000
|
|
UNUSED1 DC F'0' . 00330000
|
|
EXTNEW DC B'00000000',B'00000000',X'0000',X'00',AL3(EXTHANDL) 00340000
|
|
SVCNEW DC B'00000000',B'00000000',X'0000',X'00',AL3(SVCHANDL) 00350000
|
|
PGMNEW DC B'00000000',B'00000000',X'0000',X'00',AL3(PGMHANDL) 00360000
|
|
MCHKNEW DC B'00000000',B'00000010',X'0000',X'00',AL3(0) 00370000
|
|
IONEW DC B'00000000',B'00000000',X'0000',X'00',AL3(IOINTRPT) <-+ 00380002
|
|
*** | 00382002
|
|
*** IOINTRPT will be replaced with IOHANDL after IPL by IPLRTN -----+ 00384002
|
|
*** 00386002
|
|
ORG *+X'100' SPACE OVER STAND ALONE DUMP AREA 00390000
|
|
FSBPTR DC A(VERYEND) . FSB POINTER 00400000
|
|
FSBSEM DC F'1,0' . FSB SEMAPHORE 00410000
|
|
MEMORY DC F'0,0' . MEMORY SEMAPHORE 00420000
|
|
CAWSEM DC F'1,0' . CAW SEMAPHORE 00430000
|
|
SPACE 1 00440000
|
|
TRAPSAVE DS 16F . STORAGE FOR EXTERNAL INTERRUPTS 00450000
|
|
IOHSAVE DS 16F . STORAGE FOR I/O INTERRUPTS 00460000
|
|
SPACE 1 00470000
|
|
SYSSEMSA DS CL84 . SYSTEM SEMAPHORE SAVE AREA 00480000
|
|
SPACE 1 00490000
|
|
RUNNING DS A . RUNNING 00500000
|
|
NEXTTRY DS A . NEXTTRY 00510000
|
|
NEXTTRYM DS C,0H . NEXTTRY MODIFIED 00520000
|
|
EJECT 00530000
|
|
*********************************************************************** 00540000
|
|
* * 00550000
|
|
* EXTERNAL, PROGRAM, AND SVC INTERRUPT HANDLERS * 00560000
|
|
* * 00570000
|
|
*********************************************************************** 00580000
|
|
SPACE 1 00590000
|
|
EXTHANDL EQU * . EXTERNAL INTERRUPT HANDLER 00600000
|
|
STM 0,15,TRAPSAVE . SAVE REGISTERS 00610000
|
|
BALR 1,0 . ESTABLISH ADDRESSING 00620000
|
|
USING *,1 00630000
|
|
CLI EXTOLD+3,X'80' . SEE IF TIMER TRAP 00640000
|
|
BNE EXTHRET . IF NOT, IGNORE 00650000
|
|
L 15,RUNNING . SET UP REGISTERS FOR TRAFFIC 00660000
|
|
USING PCB,15 . CONTROLLER (XPER) 00670000
|
|
CLI PCBBLOKT,X'FF' . IF BLOCKED, NO PROCESS IS 00680000
|
|
BE EXTHRET . RUNNABLE, SO RETURN 00690000
|
|
LA 14,PCBISA . GET SAVE AREA 00700000
|
|
USING SA,14 00710000
|
|
MVC SAPSW,EXTOLD . AND STORE OLD STUFF INTO IT 00720000
|
|
MVC SAREGS,TRAPSAVE 00730000
|
|
B XPER . THEN GO TO TRAFFIC SCHEDULER 00740000
|
|
DROP 14,15 00750000
|
|
EXTHRET LM 0,15,TRAPSAVE . TO IGNORE AN INTERRUPT, RELOAD 00760000
|
|
LPSW EXTOLD . AND TRANSFER BACK 00770000
|
|
SPACE 1 00780000
|
|
PGMHANDL EQU * . PROGRAM INTERRUPT HANDLER 00790000
|
|
SVC C'?' . IN ANY CASE, AN ERROR 00800000
|
|
EJECT 00810000
|
|
*********************************************************************** 00820000
|
|
* * 00830000
|
|
* SVC INTERRUPT HANDLER * 00840000
|
|
* * 00850000
|
|
* FOR ALL ROUTINES ENTERED BY SVC INTERRUPT, THE * 00860000
|
|
* FOLLOWING REGISTERS CONTAIN THIS INFORMATION: * 00870000
|
|
* * 00880000
|
|
* REGISTER 1 - BASE REGISTER FOR ROUTINE * 00890000
|
|
* REGISTER 2 - POINTER TO ARGUMENT LIST (IF ANY) * 00900000
|
|
* REGISTER 14 - POINTER TO SAVEAREA USED FOR THIS SVC * 00910000
|
|
* REGISTER 15 - POINTER TO PCB PRESENTLY RUNNING * 00920000
|
|
* * 00930000
|
|
*********************************************************************** 00940000
|
|
SPACE 1 00950000
|
|
SVCHANDL EQU * . SVC HANDLER 00960000
|
|
STM 0,15,TRAPSAVE . SAVE REGISTERS 00970000
|
|
BALR 9,0 . ESTABLISH ADDRESSING 00980000
|
|
USING *,9 00990000
|
|
LM 10,14,SVCCONST . INITIALIZE REGISTERS 01000000
|
|
IC 10,SVCOLD+3 . GET SVC CODE 01010000
|
|
IC 10,SVCHTABL(10) . TRANSLATE INTO TABLE OFFSET 01020000
|
|
LA 10,SVCRTN(10) . REG 10 -> THE CORRECT PSW 01030000
|
|
CLI 2(10),X'00' . IS THIS CALL PROTECTED? 01040000
|
|
BE SVCHPROT . THEN SEE IF WE CAN CALL IT 01050000
|
|
SVCOK L 15,RUNNING . GET PCB POINTER 01060000
|
|
USING PCB,15 01070000
|
|
CLI 3(10),X'00' . IS IT A SYSTEM SAVEAREA? 01080000
|
|
BE SYSSEM . DON'T USE REG 14 AS PCB POINTER 01090000
|
|
LR 14,15 . ELSE, SET UP PCB POINTER 01100000
|
|
SYSSEM IC 11,3(10) . GET POINTER TO SAVE AREA OFFSET 01110000
|
|
A 14,SVCSAVE(11) . REG 14 -> SAVE AREA 01120000
|
|
CLI SVCOLD+3,C'.' . ARE WE CALLING XPER? 01130000
|
|
BE SVCXPER . IF SO, DON'T SAVE RETURN STATUS 01140000
|
|
USING SA,14 01150000
|
|
MVC SAPSW,SVCOLD . SAVE PSW 01160000
|
|
MVC SAREGS,TRAPSAVE . SAVE REGISTERS 01170000
|
|
SVCXPER L 1,4(10) . MAKE ADDRESSING EASY WITHIN 01180000
|
|
LPSW 0(10) . ROUTINE, AND GO THERE 01190000
|
|
SVCHPROT L 12,SVCOLD . GET PROTECTION KEY 01200000
|
|
NR 12,13 . IS IT A USER? 01210000
|
|
BZ SVCOK . IF NO, THAT'S FINE 01220000
|
|
LA 10,SVCRTN+136 . ELSE SET UP CALL TO XQUE 01230000
|
|
B SVCOK . 01240000
|
|
DROP 9 01250000
|
|
SVCCONST DC 3F'0',X'00F00000',F'0' 01260000
|
|
SPACE 1 01270000
|
|
SVCHTABL DC 256X'84' . TABLE OF PSW OFFSETS 01280000
|
|
ORG SVCHTABL+C'P' 01290000
|
|
DC AL1(0) 01300000
|
|
ORG SVCHTABL+C'V' 01310000
|
|
DC AL1(8) 01320000
|
|
ORG SVCHTABL+C'!' 01330000
|
|
DC AL1(16) 01340000
|
|
ORG SVCHTABL+C',' 01350000
|
|
DC AL1(24) 01360000
|
|
ORG SVCHTABL+C'B' 01370000
|
|
DC AL1(32) 01380000
|
|
ORG SVCHTABL+C'A' 01390000
|
|
DC AL1(40) 01400000
|
|
ORG SVCHTABL+C'F' 01410000
|
|
DC AL1(48) 01420000
|
|
ORG SVCHTABL+C'I' 01430000
|
|
DC AL1(56) 01440000
|
|
ORG SVCHTABL+C'J' 01450000
|
|
DC AL1(64) 01460000
|
|
ORG SVCHTABL+C'.' 01470000
|
|
DC AL1(72) 01480000
|
|
ORG SVCHTABL+C'R' 01490000
|
|
DC AL1(80) 01500000
|
|
ORG SVCHTABL+C'S' 01510000
|
|
DC AL1(88) 01520000
|
|
ORG SVCHTABL+C'C' 01530000
|
|
DC AL1(96) 01540000
|
|
ORG SVCHTABL+C'N' 01550000
|
|
DC AL1(104) 01560000
|
|
ORG SVCHTABL+C'Y' 01570000
|
|
DC AL1(112) 01580000
|
|
ORG SVCHTABL+C'Z' 01590000
|
|
DC AL1(120) 01600000
|
|
ORG SVCHTABL+C'D' 01610000
|
|
DC AL1(128) 01620000
|
|
ORG SVCHTABL+C'?' 01630000
|
|
DC AL1(136) 01640000
|
|
ORG SVCHTABL+C'H' 01650000
|
|
DC AL1(144) 01660000
|
|
ORG SVCHTABL+C'E' 01670000
|
|
DC AL1(152) 01680000
|
|
ORG SVCHTABL+256 01690000
|
|
SPACE 1 01700000
|
|
SVCRTN DS 0D . THE PSWS 01710000
|
|
* IN THE FOLLOWING PSWS, THE THIRD BYTE INDICATES * 01720000
|
|
* WHETHER THE SVC IS RESTRICTED: * 01730000
|
|
* X'00' -> OPERATING SYSTEM ONLY * 01740000
|
|
* X'FF' -> AVAILABLE TO USER ALSO * 01750000
|
|
* * 01760000
|
|
* THE FOURTH BYTE INDICATES WHICH SAVE AREA TO USE; * 01770000
|
|
* SVCSAVE BELOW SHOWS THE CODE VALUES. * 01780000
|
|
DC B'00000000',B'00000000',X'0000',X'00',AL3(XP) 01790000
|
|
DC B'00000000',B'00000000',X'0000',X'00',AL3(XV) 01800000
|
|
DC B'00000000',B'00000000',X'0004',X'00',AL3(XEXC) 01810000
|
|
DC B'00000000',B'00000000',X'0004',X'00',AL3(XCOM) 01820000
|
|
DC B'00000000',B'00000000',X'0004',X'00',AL3(XB) 01830000
|
|
DC B'11111111',B'00000000',X'000C',X'00',AL3(XA) 01840000
|
|
DC B'11111111',B'00000000',X'000C',X'00',AL3(XF) 01850000
|
|
DC B'00000000',B'00000000',X'0004',X'00',AL3(XI) 01860000
|
|
DC B'00000000',B'00000000',X'0004',X'00',AL3(XJ) 01870000
|
|
DC B'00000000',B'00000000',X'0004',X'00',AL3(XPER) 01880000
|
|
DC B'11111111',B'00000000',X'FF08',X'00',AL3(XR) 01890000
|
|
DC B'11111111',B'00000000',X'FF08',X'00',AL3(XS) 01900000
|
|
DC B'11111111',B'00000000',X'FF08',X'00',AL3(XC) 01910000
|
|
DC B'00000000',B'00000000',X'FF04',X'00',AL3(XN) 01920000
|
|
DC B'00000000',B'00000000',X'FF08',X'00',AL3(XY) 01930000
|
|
DC B'11111111',B'00000000',X'FF08',X'00',AL3(XZ) 01940000
|
|
DC B'11111111',B'00000000',X'FF08',X'00',AL3(XD) 01950000
|
|
DC B'00000000',B'00000000',X'FF04',X'00',AL3(XQUE) 01960000
|
|
DC B'11111111',B'00000000',X'FF08',X'00',AL3(XH) 01970000
|
|
DC B'11111111',B'00000000',X'000C',X'00',AL3(XAUTO) 01980000
|
|
SPACE 1 01990000
|
|
SVCSAVE DS 0F . THE SAVE AREA OFFSETS 02000000
|
|
DC A(SYSSEMSA) . CODE 00 -> SYSSEMSA 02010000
|
|
DC A(PCBISA-PCB) . CODE 04 -> INTERRUPT SAVE AREA 02020000
|
|
DC A(PCBFSA-PCB) . CODE 08 -> FAULT SAVE AREA 02030000
|
|
DC A(PCBMSA-PCB) . CODE 0C -> MEMORY SAVE AREA 02040000
|
|
SPACE 3 02050000
|
|
*********************************************************************** 02060000
|
|
* * 02070000
|
|
* RETURN SEQUENCE FOR REQUEST DRIVEN ROUTINES AND TRAFFIC CONTROLLER * 02080000
|
|
* * 02090000
|
|
*********************************************************************** 02100000
|
|
SPACE 1 02110000
|
|
DS 0D 02120000
|
|
RETURN DC B'00000000',B'00000000',X'0000',X'00',AL3(RETURNR) 02130000
|
|
SPACE 1 02140000
|
|
RETURNR EQU * . RETURN ROUTINE FOR SVC'S AND XPER 02150000
|
|
MVC SVCOLD,SAPSW . SAVE PSW IN A SAFE PLACE 02160000
|
|
LM 0,15,SAREGS . RELOAD REGISTERS 02170000
|
|
LPSW SVCOLD . AND RETURN 02180000
|
|
EJECT 02190000
|
|
*********************************************************************** 02200000
|
|
* * 02210000
|
|
* REQUEST DRIVEN ROUTINES * 02220000
|
|
* * 02230000
|
|
*********************************************************************** 02240000
|
|
SPACE 3 02250000
|
|
*********************************************************************** 02260000
|
|
* * 02270000
|
|
* XP ROUTINE * 02280000
|
|
* * 02290000
|
|
* FUNCTION: TO IMPLEMENT "P" PRIMITIVE FOR SEMAPHORES * 02300000
|
|
* DATABASES: UPON ENTRY, REGISTER 2 CONTAINS ADDRESS SM * 02310000
|
|
* SM DS 0D SEMAPHORE DEFINITION * 02320000
|
|
* SMVAL DS F VALUE * 02330000
|
|
* SMPTR DS A POINTER TO FIRST WAITER * 02340000
|
|
* ROUTINES USED: XPER * 02350000
|
|
* PROCEDURE: SUBTRACT ONE FROM SMVAL; IF NON-NEGATIVE, RETURN. * 02360000
|
|
* IF NEGATIVE, PLACE RUNNING PROCESS AT END OF LIST * 02370000
|
|
* OF PRECESSES WAITING ON SM. BLOCK CALLING PROCESS; * 02380000
|
|
* ENTER TRAFFIC CONTROLLER. * 02390000
|
|
* ERROR CHECKS: NONE * 02400000
|
|
* INTERRUPTS: OFF * 02410000
|
|
* USER ACCESS: NO * 02420000
|
|
* * 02430000
|
|
*********************************************************************** 02440000
|
|
SPACE 1 02450000
|
|
XP EQU * . THE XP ROUTINE 02460000
|
|
USING *,1 02470000
|
|
USING SM,2 . ARGUMENT IS A SEMAPHORE 02480000
|
|
L 3,SMVAL . GET THE VALUE 02490000
|
|
BCTR 3,0 . SUBTRACT ONE 02500000
|
|
ST 3,SMVAL . AND STORE IT BACK 02510000
|
|
LTR 3,3 . SET CONDITION CODE 02520000
|
|
BM XPWAIT . IF IT'S NEGATIVE, MUST WAIT 02530000
|
|
LPSW RETURN . ELSE RETURN NOW 02540000
|
|
XPWAIT LA 4,SMPTR . START GOING DOWN 02550000
|
|
L 5,SMPTR . CHAIN OF POINTERS 02560000
|
|
DROP 15 02570000
|
|
USING PCB,5 02580000
|
|
XPLOOP LTR 5,5 . IF REACHED END 02590000
|
|
BZ XPTHEN . ADD OUR PCB ON. ELSE, 02600000
|
|
LA 4,PCBNSW . INCREMENT POINTERS 02610000
|
|
L 5,PCBNSW 02620000
|
|
B XPLOOP . AND TRY AGAIN 02630000
|
|
DROP 5 02640000
|
|
USING PCB,15 02650000
|
|
XPTHEN MVC 0(4,4),RUNNING . WE'RE AT THE END 02660000
|
|
ST 5,PCBNSW . STORE NULL POINTER 02670000
|
|
MVI PCBBLOKT,X'FF' . AND WE'RE BLOCKED 02680000
|
|
MVC PCBISA,SYSSEMSA . SWITCH SAVE AREAS 02690000
|
|
B XPER . SO RUN SOMEONE ELSE 02700000
|
|
DROP 2 02710000
|
|
EJECT 02720000
|
|
*********************************************************************** 02730000
|
|
* * 02740000
|
|
* XV ROUTINE * 02750000
|
|
* * 02760000
|
|
* FUNCTION: TO IMPLEMENT "V" PRIMITIVE FOR SEMAPHORES * 02770000
|
|
* DATABASES: UPON ENTRY, REGISTER 2 CONTAINS ADDRESS SM * 02780000
|
|
* SM DS 0D SEMAPHORE DEFINITION * 02790000
|
|
* SMVAL DS F VALUE * 02800000
|
|
* SMPTR DS A POINTER TO FIRST WAITER * 02810000
|
|
* ROUTINES USED: NONE * 02820000
|
|
* PROCEDURE: ADD ONE TO SMVAL; IF > ZERO, RETURN. IF ZERO OR * 02830000
|
|
* LESS, REMOVE FIRST PROCESS FROM WAITER CHAIN; * 02840000
|
|
* UNBLOCK IT; IF NEXTTRYM NOT SET, SET IT AND SET * 02850000
|
|
* NEXTTRY TO THAT PROCESS; RETURN; IF NEXTTRYM SET, * 02860000
|
|
* RETURN. * 02870000
|
|
* ERROR CHECKS: NONE * 02880000
|
|
* INTERRUPTS: OFF * 02890000
|
|
* USER ACCESS: NO * 02900000
|
|
* * 02910000
|
|
*********************************************************************** 02920000
|
|
SPACE 1 02930000
|
|
XV EQU * . THE XV ROUTINE 02940000
|
|
USING *,1 02950000
|
|
USING SM,2 . ARGUMENT IS A SEMAPHORE 02960000
|
|
L 3,SMVAL . GET THE VALUE 02970000
|
|
A 3,=F'1' . ADD ONE 02980000
|
|
ST 3,SMVAL . AND STORE IT BACK 02990000
|
|
BNP XVWAKEUP . IF <=0, SOMEONE'S WAITING 03000000
|
|
LPSW RETURN . ELSE RETURN 03010000
|
|
XVWAKEUP L 4,SMPTR . GET THE FIRST OF THE GUYS 03020000
|
|
DROP 15 03030000
|
|
USING PCB,4 03040000
|
|
MVC SMPTR,PCBNSW . REMEMBER THE REST 03050000
|
|
MVI PCBBLOKT,X'00' . WE'RE NO LONGER BLOCKING HIM 03060000
|
|
CLI NEXTTRYM,X'FF' . IS NEXT TRY MODIFIED? 03070000
|
|
BE XVRET . IF SO, WELL OK 03080000
|
|
ST 4,NEXTTRY ELSE MODIFY NEXTTRY 03090000
|
|
MVI NEXTTRYM,X'FF' . AND SAY SO 03100000
|
|
XVRET LPSW RETURN . GET BACK 03110000
|
|
DROP 2,4 03120000
|
|
EJECT 03130000
|
|
*********************************************************************** 03140000
|
|
* * 03150000
|
|
* XPER ROUTINE (TRAFFIC CONTROLLER) * 03160000
|
|
* * 03170000
|
|
* FUNCTION: TO IMPLEMENT MULTIPROGRAMMING * 03180000
|
|
* DATABASES: NONE * 03190000
|
|
* ROUTINES USED: NONE * 03200000
|
|
* PROCEDURE: STARTING WITH NEXTTRY, SEARCH FOR PROCESS ON ALL * 03210000
|
|
* PCB CHAIN NOT BLOCKED OR STOPPED; IF FOUND, USE AS * 03220000
|
|
* NEW RUNNING, FOR 50 MS OF TIME AND RETURN. ELSE, * 03230000
|
|
* ENTER WAIT STATE WITH INTERRUPTS ON, AND TRY TO * 03240000
|
|
* SCHEDULE AGAIN AFTER INTERRUPT; RETURN. * 03250000
|
|
* ERROR CHECKS: NONE * 03260000
|
|
* INTERRUPTS: OFF * 03270000
|
|
* USER ACCESS: NO * 03280000
|
|
* * 03290000
|
|
*********************************************************************** 03300000
|
|
SPACE 1 03310000
|
|
XPER EQU * . ROUTINE XPER: TRAFFIC SCHEDULER 03320000
|
|
SSM IONEW . MASK OFF INTERRUPTS 03330000
|
|
BALR 1,0 03340000
|
|
USING *,1 03350000
|
|
L 10,NEXTTRY . START LOOKING AT NEXTTRY 03360000
|
|
LR 11,10 . REMEMBER WHICH THAT WAS 03370000
|
|
USING PCB,10 03380000
|
|
GWLOOP CLI PCBBLOKT,X'FF' . IF IT'S BLOCKED 03390000
|
|
BE GWINC . IGNORE 03400000
|
|
CLI PCBSTOPT,X'FF' . ELSE, IF IT'S NOT STOPPED 03410000
|
|
BNE GWRUN . WE CAN RUN IT 03420000
|
|
GWINC L 10,PCBNPALL . ELSE, GO TO THE NEXT 03430000
|
|
CR 10,11 . IF WE'VE SEEN ALL, QUIT 03440000
|
|
BNE GWLOOP . ELSE TRY AGAIN 03450000
|
|
LPSW IDLE . SIT AND WAIT 03460000
|
|
DS 0D 03470000
|
|
IDLE DC B'11111110',B'00000010',X'0000',X'00',AL3(XPER) 03480000
|
|
SPACE 1 03490000
|
|
GWRUN MVC NEXTTRY,PCBNPALL . GET A NEW NEXTTRY 03500000
|
|
MVI NEXTTRYM,X'00' . NOT MODIFIED 03510000
|
|
ST 10,RUNNING . GET A NEW RUNNING 03520000
|
|
LA 14,PCBISA 03530000
|
|
MVC TIMER,QUANTUM . INTERRUPT AFTER 50 MS 03540000
|
|
LPSW RETURN . AND GO TO RETURNR 03550000
|
|
QUANTUM DC X'00000F00' . QUANTUM OF TIME 03560000
|
|
DROP 10 03570000
|
|
USING PCB,15 03580000
|
|
EJECT 03590000
|
|
*********************************************************************** 03600000
|
|
* * 03610000
|
|
* XEXC ROUTINE * 03620000
|
|
* * 03630000
|
|
* FUNCTION: TO ENTER SMC SECTION * 03640000
|
|
* DATABASES: NONE * 03650000
|
|
* ROUTINES USED: NONE * 03660000
|
|
* PROCEDURE: INCREMENT SMC BYTE IN PCB BY ONE; RETURN. * 03670000
|
|
* ERROR CHECKS: NONE * 03680000
|
|
* INTERRUPTS: OFF * 03690000
|
|
* USER ACCESS: NO * 03700000
|
|
* * 03710000
|
|
*********************************************************************** 03720000
|
|
SPACE 1 03730000
|
|
XEXC EQU * . ROUTINE XEXC: ENTER SMC SECTION 03740000
|
|
USING *,1 03750000
|
|
SR 8,8 03760000
|
|
IC 8,PCBINSMC 03770000
|
|
LA 8,1(8) . ADD ONE TO SMC BYTE 03780000
|
|
STC 8,PCBINSMC 03790000
|
|
LPSW RETURN . AND LEAVE 03800000
|
|
SPACE 1 03810000
|
|
*********************************************************************** 03820000
|
|
* * 03830000
|
|
* XCOM ROUTINE * 03840000
|
|
* * 03850000
|
|
* FUNCTION: TO LEAVE SMC SECTION * 03860000
|
|
* DATABASES: NONE * 03870000
|
|
* ROUTINES USED: XP, XV * 03880000
|
|
* PROCEDURE: DECREMENT SMC BYTE IN PCB BY ONE; IF NOT ZERO, * 03890000
|
|
* RETURN. ELSE, CHECK FOR STOP WAITING; IF STOP * 03900000
|
|
* WAITING, ALLOW STOP AND BLOCK SELF; RETURN. IF NO * 03910000
|
|
* STOP WAITING, RETURN. * 03920000
|
|
* ERROR CHECKS: NONE * 03930000
|
|
* INTERRUPTS: OFF * 03940000
|
|
* USER ACCESS: NO * 03950000
|
|
* * 03960000
|
|
*********************************************************************** 03970000
|
|
SPACE 1 03980000
|
|
XCOM EQU * . ROUTINE XCOM: LEAVE SMC 03990000
|
|
USING *,1 04000000
|
|
SR 8,8 04010000
|
|
IC 8,PCBINSMC 04020000
|
|
BCTR 8,0 . SUBTRACT ONE FROM IN SMC BYTE 04030000
|
|
STC 8,PCBINSMC 04040000
|
|
LTR 8,8 . IS IT ZERO? 04050000
|
|
BNZ XCOMRET . NO, THEN GET BACK, OTHERWISE 04060000
|
|
CLI PCBSW,X'00' . IS STOP WAITING? 04070000
|
|
BE XCOMRET . IF NOT, RETURN 04080000
|
|
MVI PCBSW,X'00' . STOPS NOT WAITING AFTER THIS 04090000
|
|
LA 2,PCBSRS . WE'LL "V" THE STOPPER, 04100000
|
|
SVC C'V' 04110000
|
|
LA 2,PCBSES . AND "P" THE STOPPEE. 04120000
|
|
SVC C'P' 04130000
|
|
XCOMRET LPSW RETURN . AND HERE (IF EVER) WE RETURN 04140000
|
|
EJECT 04150000
|
|
*********************************************************************** 04160000
|
|
* * 04170000
|
|
* XA ROUTINE * 04180000
|
|
* XAUTO ROUTINE * 04190000
|
|
* * 04200000
|
|
* FUNCTION: TO ALLOCATE MEMORY * 04210000
|
|
* DATABASES: UPON ENTRY, REGISTER 2 CONTAINS ADDRESS XAX: * 04220000
|
|
* XAX DS 0D * 04230000
|
|
* XAXSIZE DS F SIZE OF BLOCK TO BE ALLOCATED * 04240000
|
|
* XAXADDR DS A ADDRESS OF FIRST BYTE OF BLOCK* 04250000
|
|
* XAXALGN DS F ALIGNMENT OF BLOCK * 04260000
|
|
* ROUTINES USED: XEXC, XCOM, XP, XV, XB * 04270000
|
|
* PROCEDURE: LOCK FSB SEMAPHORE; SEARCH FREE STORAGE FOR LARGE * 04280000
|
|
* ENOUGH MEMORY BLOCK; ALIGN BOUNDARY; USE XB TO * 04290000
|
|
* CHAIN ANY LEFTOVER BLOCKS TO FREE STORAGE LIST; * 04300000
|
|
* PLACE ADDRESS OF ALLOCATED BLOCK IN XAXADDR; UNLOCK* 04310000
|
|
* FSB SEMAPHORE; RETURN. IF CAN'T SATISFY REQUEST, * 04320000
|
|
* UNLOCK FSB SEMAPHORE, APPLY XP ROUTINE TO MEMORY * 04330000
|
|
* SEMAPHORE, BLOCKING PROCESS RUNNING UNTIL MEMORY * 04340000
|
|
* FREED; THEN UNBLOCK; TRY TO SATISFY REQUEST AGAIN. * 04350000
|
|
* ERROR CHECKS: NONE * 04360000
|
|
* INTERRUPTS: ON * 04370000
|
|
* USER ACCESS: NO * 04380000
|
|
* * 04390000
|
|
*********************************************************************** 04400000
|
|
SPACE 1 04410000
|
|
XA EQU * . THE XA ROUTINE, TO ALLOCATE 04420000
|
|
USING *,1 04430000
|
|
LA 0,1 . SET REGISTER ZERO TO ONE TO 04440000
|
|
B XACOM . INDICATE C'A' CALL 04450000
|
|
XAUTO EQU * . AUTO STORAGE ENTRY POINT 04460000
|
|
USING *,1 04470000
|
|
SR 0,0 . REG0=0 INDICATES C'E' CALL 04480000
|
|
L 1,=A(XA) . RESET BASE REGISTER PROPERLY 04490000
|
|
USING XA,1 04500000
|
|
XACOM SVC C'!' . ENTER SMC 04510000
|
|
LR 7,2 04520000
|
|
USING XAX,7 . ARGUMENT LIST 04530000
|
|
L 6,XAXSIZE . GET THE SIZE REQUESTED 04540000
|
|
XATOP LA 2,FSBSEM . LOCK THE FSB SEMAPHORE 04550000
|
|
SVC C'P' . 04560000
|
|
LA 5,FSBPTR . START LOOKING DOWN 04570000
|
|
L 4,FSBPTR . THE FREE STORAGE LIST 04580000
|
|
L 8,XAXALGN . WE WOULD HAVE TO START AT WITH 04590000
|
|
BCTR 8,0 . THIS CONSTANT TO FIND ALIGNMENT 04600000
|
|
USING FSB,4 04610000
|
|
XALOOP LTR 4,4 . IF AT THE END 04620000
|
|
BZ XAWAIT . WAIT UNTIL A "FREE" OP 04630000
|
|
LR 13,4 . FIND THE LOCATION 04640000
|
|
BCTR 13,0 . IN THIS BLOCK WITH THIS 04650000
|
|
OR 13,8 . ALIGNMENT 04660000
|
|
LA 13,1(13) . THAT'S IT 04670000
|
|
LR 9,13 . AND NOW GET IN REG 9 04680000
|
|
SR 9,4 . WHAT IS WASTED AT THE FRONT 04690000
|
|
L 3,FSBSIZE . GET SIZE MINUS WASTE AT 04700000
|
|
SR 3,9 . FRONT, LEAVING EFFECTIVE SIZE 04710000
|
|
CR 6,3 . IS IT ENOUGH? 04720000
|
|
BNP XAFOUND . EUREKA! 04730000
|
|
LA 5,FSBNEXT . OH WELL, GET THE NEXT FREE 04740000
|
|
L 4,FSBNEXT . STORAGE BLOCK ON THE CHAIN 04750000
|
|
B XALOOP . BETTER LUCK NEXT TIME 04760000
|
|
XAWAIT SVC C'V' . NEED TO WAIT 04770000
|
|
LA 2,MEMORY . SO WE LET OTHER PEOPLE GET IN 04780000
|
|
SVC C'P' . SO THEY'LL WAKE US UP 04790000
|
|
B XATOP . AND THEN WE'LL TRY AGAIN 04800000
|
|
XAFOUND ST 13,XAXADDR . WE'VE NOW GOT THE ADDRESS 04810000
|
|
MVC 0(4,5),FSBNEXT . UNLINK THE BLOCK OUT 04820000
|
|
L 12,FSBSIZE . GET THE WHOLE BLOCK SIZE 04830000
|
|
LA 2,SATEMP . START MAKING UP ARG LISTS 04840000
|
|
USING XBX,2 . FOR THE XB ROUTINE 04850000
|
|
LR 10,13 . THE STARTING LOCATION 04860000
|
|
SR 10,4 . MINUS THE START OF THE BLOCK 04870000
|
|
BZ XANF . IF NONE WASTED AT THE FRONT, SKIP 04880000
|
|
ST 4,XBXADDR . ELSE FREE, STARTING THERE 04890000
|
|
ST 10,XBXSIZE . UP TO THE BEGINNING OF THE 04900000
|
|
SVC C'B' . ALLOCATION; INSERT IT IN THE CHAIN 04910000
|
|
XANF LR 11,13 . THE STARTING ADDR PLUS THE SIZE 04920000
|
|
AR 11,6 . GIVES THE FIRST UNUSED ADDR 04930000
|
|
SR 12,10 . MINUS THE WASTE AT FRONT, 04940000
|
|
SR 12,6 . MINUS THE PART ALLOCATED. IF 04950000
|
|
BZ XARETURN . NONE LEFT OVER, GOOD 04960000
|
|
ST 11,XBXADDR . ELSE STORE ADDRESS AND 04970000
|
|
ST 12,XBXSIZE . SIZE, AND LINK ONTO 04980000
|
|
SVC C'B' . FREE STORAGE LIST 04990000
|
|
DROP 2 05000000
|
|
XARETURN LA 2,FSBSEM . WE ARE DONE, SO NOW SOMEONE 05010000
|
|
SVC C'V' . ELSE CAN COME IN 05020000
|
|
LTR 0,0 . IS THIS FOR AUTOMATIC STORAGE? 05030000
|
|
BNZ XABACK . IF NOT, RETURN NOW 05040000
|
|
ST 6,PCBASIZE . OTHERWISE STORE SIZE AND 05050000
|
|
ST 13,PCBAADDR . ADDRESS OF AUTOMATIC STORAGE 05060000
|
|
XABACK SVC C',' . LEAVE SMC SECTION 05070000
|
|
LPSW RETURN . GET BACK JOJO 05080000
|
|
DROP 4,7 05090000
|
|
EJECT 05100000
|
|
*********************************************************************** 05110000
|
|
* * 05120000
|
|
* XF ROUTINE * 05130000
|
|
* * 05140000
|
|
* FUNCTION: TO FREE MEMORY * 05150000
|
|
* DATABASES: UPON ENTRY, REGISTER 2 CONTAINS ADDRESS XFX: * 05160000
|
|
* XFX DS 0D * 05170000
|
|
* XFXSIZE DS F SIZE OF BLOCK TO BE FREED * 05180000
|
|
* XFXADDR DS A ADDRESS OF FIRST BYTE OF BLOCK* 05190000
|
|
* ROUTINES USED: XEXC, XP, XV, XB, XCOM * 05200000
|
|
* PROCEDURE: LOCK FSB SEMAPHORE; SEARCH FREE STORAGE LIST TO * 05210000
|
|
* FIND IF ANY FREE BLOCK CONTIGUOUSLY FOLLOWS OR * 05220000
|
|
* PRECEDES BLOCK TO BE FREED; IF THERE IS ANY, * 05230000
|
|
* COMPACT THEM INTO A SINGLE BLOCK OF COMBINED SIZE; * 05240000
|
|
* USE XB TO CHAIN COMPACTED BLOCK ONTO FREE STORAGE * 05250000
|
|
* LIST; WAKEUP ALL PROCESSES WAITING ON MEMORY * 05260000
|
|
* SEMAPHORE; UNLOCK FSB SEMAPHORE; RETURN * 05270000
|
|
* ERROR CHECKS: NONE * 05280000
|
|
* INTERRUPTS: ON * 05290000
|
|
* USER ACCESS: NO * 05300000
|
|
* * 05310000
|
|
*********************************************************************** 05320000
|
|
SPACE 1 05330000
|
|
XF EQU * . THE XF ROUTINE, TO FREE STORAGE 05340000
|
|
USING *,1 05350000
|
|
SVC C'!' . ENTER SMC SECTION 05360000
|
|
LR 7,2 05370000
|
|
USING XFX,7 . THE ARGUMENT LIST 05380000
|
|
L 3,XFXSIZE . GET THE SIZE 05390000
|
|
L 4,XFXADDR . AND THE ADDRESS 05400000
|
|
LR 5,3 . GET THE ADDRESS OF THE END OF THE 05410000
|
|
AR 5,4 . BLOCK TO BE FREED 05420000
|
|
LA 2,FSBSEM . LOCK FSBSEM 05430000
|
|
SVC C'P' 05440000
|
|
LA 8,FSBPTR . START LOOKING DOWN THE FREE 05450000
|
|
L 6,FSBPTR . STORAGE LIST, FOR COMPACTION 05460000
|
|
USING FSB,6 05470000
|
|
XFLOOP LTR 6,6 . ARE WE THROUGH? 05480000
|
|
BZ XFLINK . IF SO, JUST ADD IT ON 05490000
|
|
L 9,FSBNEXT . IF NOT. GET THE NEXT PTR 05500000
|
|
CR 6,5 . IS THIS BLOCK RIGHT AFTER OURS? 05510000
|
|
BNE XFTHEN . IF NOT, OK. BUT IF IT IS, 05520000
|
|
ST 9,0(8) . WE CAN COMPACT, SO UNCHAIN IT 05530000
|
|
A 3,FSBSIZE . AND REMEMBER THE NEW SIZE 05540000
|
|
B XFBACKUP . AND ON TO THE NEXT 05550000
|
|
XFTHEN LR 10,6 . MAYBE IT'S RIGHT BEFORE OURS 05560000
|
|
A 10,FSBSIZE . GET ENDING ADDRESS OF FREE BLOCK 05570000
|
|
CR 10,4 . IS IT RIGHT BEFORE OURS? 05580000
|
|
BNE XFINC . OH FUDGE! NO! 05590000
|
|
ST 9,0(8) . IF SO, UNLINK IT 05600000
|
|
LR 4,6 . GET THE NEW BEGINNING LOCATION 05610000
|
|
A 3,FSBSIZE . AND NEW SIZE OF FREE BLOCK 05620000
|
|
XFBACKUP LR 6,8 . BACK UP ONE FSB 05630000
|
|
XFINC LA 8,FSBNEXT . ON TO THE NEXT FSB 05640000
|
|
L 6,FSBNEXT 05650000
|
|
B XFLOOP . TRY, TRY AGAIN 05660000
|
|
XFLINK LA 2,SATEMP . START TO CALL XB 05670000
|
|
USING XBX,2 05680000
|
|
ST 3,XBXSIZE . STORE SIZE 05690000
|
|
ST 4,XBXADDR . AND ADDRESS 05700000
|
|
SVC C'B' . LINK IT ONTO THE FSB CHAIN 05710000
|
|
USING SM,2 05720000
|
|
LA 2,MEMORY . GET VALUE OF MEMORY SEMAPHORE 05730000
|
|
LA 11,1(0,0) . SUBTRACT FROM ONE, IT'S A HANDLE 05740000
|
|
S 11,SMVAL . ON THE # OF PEOPLE WAITING 05750000
|
|
DROP 2 05760000
|
|
XFVLOOP BCT 11,XFVDO . LOOP IF ANYONE ELSE IS WAITING 05770000
|
|
LA 2,FSBSEM . WE'RE THROUGH, SO 05780000
|
|
SVC C'V' . UNBLOCK FSBSEM 05790000
|
|
SVC C',' . LEAVE SMC 05800000
|
|
LPSW RETURN . RETURN 05810000
|
|
XFVDO SVC C'V' . WAKE SOMEONE UP 05820000
|
|
B XFVLOOP . TRY AGAIN FOR ANOTHER 05830000
|
|
DROP 6,7 05840000
|
|
EJECT 05850000
|
|
*********************************************************************** 05860000
|
|
* * 05870000
|
|
* XB ROUTINE * 05880000
|
|
* * 05890000
|
|
* FUNCTION: TO CHAIN A STORAGE BLOCK ONTO FREE STORAGE LIST * 05900000
|
|
* DATABASES: UPON ENTRY, REGISTER 2 CONTAINS ADDRESS XBX: * 05910000
|
|
* XBX DS 0D * 05920000
|
|
* XBXSIZE DS F SIZE OF BLOCK * 05930000
|
|
* XBXADDR DS A ADDRESS OF FIRST BYTE OF BLOCK* 05940000
|
|
* ROUTINES USED: NONE * 05950000
|
|
* PROCEDURE: SEARCH FREE STORAGE LIST TO FIND WHERE TO INSERT * 05960000
|
|
* FREE BLOCK IN ORDER OF INCREASING SIZE; FORMAT * 05970000
|
|
* BLOCK LIKE AN FSB; INSERT; RETURN. * 05980000
|
|
* ERROR CHECKS: NONE * 05990000
|
|
* INTERRUPTS: OFF * 06000000
|
|
* USER ACCESS: NO * 06010000
|
|
* COMMENTS: SINCE XB ROUTINE ONLY CALLED BY XA AND XF, FSB * 06020000
|
|
* SEMAPHORE IS ALREADY LOCKED. * 06030000
|
|
* * 06040000
|
|
*********************************************************************** 06050000
|
|
SPACE 1 06060000
|
|
XB EQU * 06070000
|
|
USING *,1 06080000
|
|
USING XBX,2 . ARGUMENT LIST 06090000
|
|
L 3,XBXSIZE . GET THE SIZE 06100000
|
|
L 4,XBXADDR . AND THE ADDRESS 06110000
|
|
LA 8,FSBPTR . START LOOKING DOWN THE CHAIN 06120000
|
|
L 6,FSBPTR 06130000
|
|
LTR 6,6 . IF ZERO POINTER, WE ARE AT 06140000
|
|
BZ XBINSERT . END OF CHAIN ALREADY 06150000
|
|
USING FSB,6 06160000
|
|
XBLOOP C 3,FSBSIZE . IF THE SIZE OF OURS IS LESS, 06170000
|
|
BNP XBINSERT . TIME TO INSERT 06180000
|
|
LA 8,FSBNEXT . ELSE GO ON TO THE NEXT 06190000
|
|
L 6,FSBNEXT 06200000
|
|
LTR 6,6 . IF NOT ALREADY THROUGH 06210000
|
|
BNZ XBLOOP . BRANCH BACK 06220000
|
|
XBINSERT ST 4,0(8) . NOW, LINK OURS ON 06230000
|
|
DROP 6 06240000
|
|
USING FSB,4 06250000
|
|
ST 6,FSBNEXT . MAKE OURS POINT TO THE NEXT 06260000
|
|
ST 3,FSBSIZE . WITH THE RIGHT SIZE 06270000
|
|
LPSW RETURN . AND RETURN 06280000
|
|
DROP 2,4 06290000
|
|
EJECT 06300000
|
|
*********************************************************************** 06310000
|
|
* * 06320000
|
|
* XC ROUTINE * 06330000
|
|
* * 06340000
|
|
* FUNCTION: TO CREATE A PROCESS * 06350000
|
|
* DATABASES: UPON ENTRY, REGISTER 2 CONTAINS ADDRESS XCX: * 06360000
|
|
* XCX DS 0D * 06370000
|
|
* XCXNAME DS CL8 NAME OF PROCESS TO BE CREATED * 06380000
|
|
* ROUTINES USED: XEXC, XCOM, XN, XA, XI, XQUE * 06390000
|
|
* PROCEDURE: USE XA TO ALLOCATE NEW PCB; PLACE XCXNAME IN PCB; * 06400000
|
|
* INITIALIZE SEMAPHORES; STOP; BLOCK; OUT OF SMC; * 06410000
|
|
* CALL XI TO LINK PCB ONTO PCB CHAINS; RETURN. * 06420000
|
|
* ERROR CHECKS: IF NAME ALREADY USED IN THIS GROUP, XQUE ENTERED. * 06430000
|
|
* INTERRUPTS: ON * 06440000
|
|
* USER ACCESS: YES * 06450000
|
|
* * 06460000
|
|
*********************************************************************** 06470000
|
|
SPACE 1 06480000
|
|
XC EQU * . THE XC ROUTINE: CREATE A PROCESS 06490000
|
|
USING *,1 06500000
|
|
LR 7,2 06510000
|
|
USING XCX,7 . ARGUMENT LIST 06520000
|
|
LA 2,SATEMP . READY TO MAKE CALLS OUT 06530000
|
|
USING XNX,2 . A XN-LIKE ARGUMENT LIST 06540000
|
|
MVC XNXNAME,XCXNAME . GET THE NAME 06550000
|
|
SVC C'N' . AND CALL TO FIND THE PCB 06560000
|
|
CLC XNXADDR,=A(0) . SEE IF THERE 06570000
|
|
BNE XCERR . IF ALREADY EXISTS, BAD 06580000
|
|
SVC C'!' . ENTER SMC SECTION 06590000
|
|
DROP 2 06600000
|
|
USING XAX,2 . READY TO CALL XA 06610000
|
|
MVC XAXSIZE,=A(LENPCB) . WE KNOW THE SIZE 06620000
|
|
MVC XAXALGN,=F'8' . AND THE ALIGNMENT 06630000
|
|
SVC C'A' . SO CALL 06640000
|
|
L 2,XAXADDR . FIND THE ADDRESS 06650000
|
|
DROP 2,15 06660000
|
|
USING PCB,2 . FILL IN THE PCB 06670000
|
|
MVC PCBNAME,XCXNAME . GIVE IT A NAME 06680000
|
|
MVI PCBSTOPT,X'FF' . IT'S STOPPED 06690000
|
|
MVC PCBBLOKT(PCBISA-PCBBLOKT),TEMPLATE+1 INITIALIZE PCB 06700000
|
|
SVC C'I' . THREAD IT ON 06710000
|
|
SVC C',' . LEAVE SMC SECTION 06720000
|
|
LPSW RETURN . AND RETURN 06730000
|
|
XCERR SVC C'?' . IF ALREADY EXISTS,KERROR 06740000
|
|
DROP 2,7 06750000
|
|
EJECT 06760000
|
|
*********************************************************************** 06770000
|
|
* * 06780000
|
|
* XD ROUTINE * 06790000
|
|
* * 06800000
|
|
* FUNCTION: TO DESTROY A PROCESS * 06810000
|
|
* DATABASES: UPON ENTRY, REGISTER 2 CONTAINS ADDRESS XDX: * 06820000
|
|
* XDX DS 0D * 06830000
|
|
* XDXNAME DS CL8 NAME OF PROCESS TO BE DESTROYED* 06840000
|
|
* ROUTINES USED: XEXC, XJ, XS, XN, XF, XCOM, XQUE * 06850000
|
|
* PROCEDURE: USE XN TO FIND PCB FOR PROCESS TO BE DESTROYED; * 06860000
|
|
* USE XJ TO UNLOCK PCB FROM PROCESS CHAINS; IF ANY * 06870000
|
|
* MESSAGES FOR THIS PROCESS, FREE STORAGE FOR THEM; * 06880000
|
|
* IF THERE IS ANY AUTOMATIC STORAGE, FREE IT; * 06890000
|
|
* FREE STORAGE FOR PCB; RETURN. * 06900000
|
|
* ERROR CHECKS: IF NAME DOESN'T EXIST OR PROCESS NOT STOPPED, * 06910000
|
|
* XQUE ENTERED. * 06920000
|
|
* INTERRUPTS: ON * 06930000
|
|
* USER ACCESS: YES * 06940000
|
|
* * 06950000
|
|
*********************************************************************** 06960000
|
|
SPACE 1 06970000
|
|
XD EQU * . XD ROUTINE: DESTROY A PROCESS 06980000
|
|
USING *,1 06990000
|
|
LR 7,2 07000000
|
|
USING XDX,7 . ARG LIST 07010000
|
|
LA 2,SATEMP . READY TO CALL OUT 07020000
|
|
USING XNX,2 . WILL CALL XN 07030000
|
|
MVC XNXNAME,XDXNAME . GET NAME 07040000
|
|
SVC C'N' . AND CALL 07050000
|
|
L 2,XNXADDR . GET ADDRESS 07060000
|
|
DROP 2 07070000
|
|
LTR 2,2 . IF ADDRESS IS NULL, 07080000
|
|
BZ XDERR . IT'S AN ERROR 07090000
|
|
USING PCB,2 07100000
|
|
CLI PCBSTOPT,X'FF' . IF NOT STOPPED 07110000
|
|
BNE XDERR . IT'S AN ERROR 07120000
|
|
SVC C'!' . ENTER SMC SECTION 07130000
|
|
DROP 2 07140000
|
|
USING PCB,15 07150000
|
|
SVC C'J' . ELSE UNTHREAD THE ENTRY 07160000
|
|
LR 8,2 . REMEMBER THE PCB POINTER 07170000
|
|
LA 2,SATEMP . READY TO CALL OUT AGAIN 07180000
|
|
USING PCB,8 07190000
|
|
DROP 15 07200000
|
|
L 9,PCBFM . GET FIRST MESSAGE 07210000
|
|
XDLOOP LTR 9,9 . ANY MORE MESSAGES? 07220000
|
|
BZ XDCHECK . IF NOT, FINISH UP 07230000
|
|
USING MSG,9 07240000
|
|
L 10,MSGNEXT . ELSE REMEMBER NEXT 07250000
|
|
L 11,MSGSIZE . GET THE SIZE 07260000
|
|
LA 11,15(11) . AND MAKE IT SOME NUMBER 07270000
|
|
N 11,=F'-8' . OF DOUBLEWORDS 07280000
|
|
USING XFX,2 07290000
|
|
ST 9,XFXADDR . FREE THE LOCATION 07300000
|
|
ST 11,XFXSIZE . THE NUMBER OF WORDS 07310000
|
|
SVC C'F' . DO IT 07320000
|
|
LR 9,10 . ON TO THE NEXT 07330000
|
|
B XDLOOP . GET THE NEXT MESSAGE 07340000
|
|
XDCHECK CLC PCBAADDR(4),=A(0) . HAS AUTOMATIC STORAGE BEEN 07350000
|
|
BE XDTHEN . ALLOCATED? IF NOT, GO FINISH UP 07360000
|
|
LA 2,PCBASIZE . SET UP THE ARGUMENT LIST 07370000
|
|
SVC C'F' . FREE IT 07380000
|
|
LA 2,SATEMP . RESET REGISTER 2 07390000
|
|
XDTHEN ST 8,XFXADDR . READY TO FREE THE PCB 07400000
|
|
MVC XFXSIZE,=A(LENPCB) . THE SIZE 07410000
|
|
SVC C'F' . FREE IT 07420000
|
|
SVC C',' . LEAVE SMC 07430000
|
|
LPSW RETURN . AND RETURN 07440000
|
|
XDERR SVC C'?' . IF PROCESS DOES NOT EXIST 07450000
|
|
DROP 2,7,8,9 07460000
|
|
USING PCB,15 07470000
|
|
SPACE 3 07480000
|
|
*********************************************************************** 07490000
|
|
* * 07500000
|
|
* XH ROUTINE * 07510000
|
|
* * 07520000
|
|
* FUNCTION: TO HALT A JOB * 07530000
|
|
* DATABASES: NONE * 07540000
|
|
* ROUTINES USED: XS, XR * 07550000
|
|
* PROCEDURE: SEND MESSAGE TO SUPERVISOR PROCESS FOR THIS JOB * 07560000
|
|
* INDICATING NORMAL TERMINATION; TRIES TO READ * 07570000
|
|
* MESSAGES FOREVER LOOPING; BLOCKS ITSELF, THEREBY * 07580000
|
|
* NEVER RETURNING. * 07590000
|
|
* ERROR CHECKS: NONE * 07600000
|
|
* INTERRUPTS: ON * 07610000
|
|
* USER ACCESS: YES * 07620000
|
|
* COMMENTS: USER NORMALLY USES THIS ROUTINE TO END A JOB. * 07630000
|
|
* * 07640000
|
|
*********************************************************************** 07650000
|
|
SPACE 1 07660000
|
|
XH EQU * . THE XH ROUTINE: HALT A JOB 07670000
|
|
USING *,1 07680000
|
|
LA 2,XHMSG1 . SEND A MESSAGE TO *IBSUP 07690000
|
|
SVC C'S' . SEND IT 07700000
|
|
XHLOOP LA 2,XHMSG2 . READY TO READ A REPLY 07710000
|
|
SVC C'R' . WHICH NEVER COMES 07720000
|
|
B XHLOOP . BUT IF IT DOES WERE READY 07730000
|
|
DS 0F 07740000
|
|
XHMSG1 DC CL8'*IBSUP' . SAY TO *IBSUP 07750000
|
|
DC F'12' . TWELVE CHARACTERS 07760000
|
|
DC C'PROGRAM HALT' . SAYING WERE OK 07770000
|
|
XHMSG2 DS CL8 . WHO SENDS US A MESSAGE 07780000
|
|
DC F'1' . ONE CHARACTER 07790000
|
|
DS CL1,0H . WHICH GOES HERE 07800000
|
|
EJECT 07810000
|
|
*********************************************************************** 07820000
|
|
* * 07830000
|
|
* XI ROUTINE * 07840000
|
|
* * 07850000
|
|
* FUNCTION: TO CHAIN A PCB ONTO PROCESS CHAINS * 07860000
|
|
* DATABASES: UPON ENTRY, REGISTER 2 CONTAINS ADDRESS OF A PCB * 07870000
|
|
* ROUTINES USED: NONE * 07880000
|
|
* PROCEDURE: POINTER USED TO CHAIN PCB INTO ALL PCB CHAIN AND * 07890000
|
|
* THIS GROUP CHAIN RIGHT AFTER RUNNING PCB; RETURN. * 07900000
|
|
* ERROR CHECKS: NONE * 07910000
|
|
* INTERRUPTS: OFF * 07920000
|
|
* USER ACCESS: NO * 07930000
|
|
* * 07940000
|
|
*********************************************************************** 07950000
|
|
SPACE 1 07960000
|
|
XI EQU * . THE XI ROUTINE: THREAD IN A PCB 07970000
|
|
USING *,1 07980000
|
|
L 10,PCBNPALL . GET THE NEXT 'ALL' PCB 07990000
|
|
ST 2,PCBNPALL . STORE THIS PCB RIGNT AFTER MINE 08000000
|
|
DROP 15 08010000
|
|
USING PCB,10 08020000
|
|
ST 2,PCBLPALL . THE NEXT ONE DOWN POINTS BACK 08030000
|
|
DROP 10 08040000
|
|
USING PCB,2 08050000
|
|
ST 15,PCBLPALL . THIS PCB POINTS BACK 08060000
|
|
ST 10,PCBNPALL . AND FORWARD 08070000
|
|
DROP 2 08080000
|
|
USING PCB,15 08090000
|
|
L 10,PCBNPTG . GET NEXT "THIS GROUP" PCB 08100000
|
|
ST 2,PCBNPTG . RUNNING PCB POINTS TO NEW MEMBER 08110000
|
|
DROP 15 . OF PROCESS GROUP 08120000
|
|
USING PCB,10 08130000
|
|
ST 2,PCBLPTG . NEXT PCB DOWN POINTS BACK 08140000
|
|
DROP 10 08150000
|
|
USING PCB,2 08160000
|
|
ST 15,PCBLPTG . AND WE POINT BACKWARD 08170000
|
|
ST 10,PCBNPTG . AND FORWARD 08180000
|
|
DROP 2 08190000
|
|
LPSW RETURN . RETURN 08200000
|
|
USING PCB,15 08210000
|
|
EJECT 08220000
|
|
*********************************************************************** 08230000
|
|
* * 08240000
|
|
* XJ ROUTINE * 08250000
|
|
* * 08260000
|
|
* FUNCTION: TO UNCHAIN A PCB FROM PROCESS CHAINS * 08270000
|
|
* DATABASES: UPON ENTRY, REGISTER 2 CONTAINS ADDRESS OF A PCB * 08280000
|
|
* ROUTINES USED: NONE * 08290000
|
|
* PROCEDURE: POINTERS TO PCB IN ALL PCB CHAIN AND THIS GROUP * 08300000
|
|
* CHAIN MODIFIED WITHOUT FREEING STORAGE; RETURN. * 08310000
|
|
* ERROR CHECKS: NONE * 08320000
|
|
* INTERRUPTS: OFF * 08330000
|
|
* USER ACCESS: NO * 08340000
|
|
* * 08350000
|
|
*********************************************************************** 08360000
|
|
SPACE 1 08370000
|
|
XJ EQU * . THE XJ ROUTINE: UNTHREAD A PCB 08380000
|
|
USING *,1 08390000
|
|
DROP 15 08400000
|
|
USING PCB,2 08410000
|
|
L 11,PCBLPALL . GET PRECEDING PCB 08420000
|
|
L 10,PCBNPALL . AND FOLLOWING ONE IN "ALL" 08430000
|
|
DROP 2 . CHAIN 08440000
|
|
USING PCB,11 08450000
|
|
ST 10,PCBNPALL . LAST POINTS TO NEXT 08460000
|
|
DROP 11 08470000
|
|
USING PCB,10 08480000
|
|
ST 11,PCBLPALL . NEXT POINTS TO LAST 08490000
|
|
DROP 10 08500000
|
|
USING PCB,2 08510000
|
|
L 11,PCBLPTG . REDO FOR THIS GROUP PCB CHAIN 08520000
|
|
L 10,PCBNPTG 08530000
|
|
DROP 2 08540000
|
|
USING PCB,11 08550000
|
|
ST 10,PCBNPTG . LAST POINTS TO NEXT 08560000
|
|
DROP 11 08570000
|
|
USING PCB,10 08580000
|
|
ST 11,PCBLPTG . NEXT POINTS TO LAST 08590000
|
|
DROP 10 08600000
|
|
LPSW RETURN . AND RETURN 08610000
|
|
USING PCB,15 08620000
|
|
EJECT 08630000
|
|
*********************************************************************** 08640000
|
|
* * 08650000
|
|
* XN ROUTINE * 08660000
|
|
* * 08670000
|
|
* FUNCTION: TO FIND THE PCB FOR A PROCESS GIVEN ITS NAME ONLY * 08680000
|
|
* DATABASES: UPON ENTRY, REGISTER 2 CONTAINS ADDRESS XNX * 08690000
|
|
* XNX DS 0D * 08700000
|
|
* XNXNAME DS CL8 NAME OF PROCESS * 08710000
|
|
* XNXADDR DS A ADDRESS OF PCB * 08720000
|
|
* ROUTINES USED: NONE * 08730000
|
|
* PROCEDURE: SEARCH THIS GROUP PCB CHAIN FOR NAME; IF FOUND, * 08740000
|
|
* STORE POINTER IN XNXADDR. IF NOT FOUND, STORE * 08750000
|
|
* ZERO IN XNXADDR; RETURN. * 08760000
|
|
* ERROR CHECKS: NONE * 08770000
|
|
* INTERRUPTS: OFF * 08780000
|
|
* USER ACCESS: YES * 08790000
|
|
* * 08800000
|
|
*********************************************************************** 08810000
|
|
SPACE 1 08820000
|
|
XN EQU * . THE XN ROUTINE: FIND A NAMED PCB 08830000
|
|
USING *,1 08840000
|
|
USING XNX,2 . THE ARG LIST 08850000
|
|
LR 10,15 . FIRST PCB TO LOOK AT IS OURS 08860000
|
|
DROP 15 08870000
|
|
USING PCB,10 08880000
|
|
XNXLOOP L 10,PCBNPTG . LOOK AT NEXT PCB 08890000
|
|
CLC PCBNAME,XNXNAME . HAS IT THE RIGHT NAME? 08900000
|
|
BE XNXFOUND . IF YES, OH JOY. 08910000
|
|
CR 10,15 . IF NOT, ARE WE THROUGH? 08920000
|
|
BNE XNXLOOP . IF NOT, TRY THE NEXT PCB 08930000
|
|
LA 10,0 . ELSE, IT'S NOT HERE 08940000
|
|
XNXFOUND ST 10,XNXADDR . FOUND IT. SAY WHERE. 08950000
|
|
LPSW RETURN . AND RETURN 08960000
|
|
DROP 2,10 08970000
|
|
USING PCB,15 08980000
|
|
EJECT 08990000
|
|
*********************************************************************** 09000000
|
|
* * 09010000
|
|
* XR ROUTINE * 09020000
|
|
* * 09030000
|
|
* FUNCTION: TO READ A MESSAGE * 09040000
|
|
* DATABASES: UPON ENTRY, REGISTER 2 CONTAINS ADDRESS XRX * 09050000
|
|
* XRX DS 0D * 09060000
|
|
* XRXNAME DS CL8 NAME OF SENDER PROCESS * 09070000
|
|
* XRXSIZE DS F SIZE OF MESSAGE TEXT * 09080000
|
|
* XRXTEXT DS C TEXT OF MESSAGE * 09090000
|
|
* ROUTINES USED: XP, XEXC, XN, XCOM, XF * 09100000
|
|
* PROCEDURE: USE XP ON MESSAGE SEMAPHORE RECEIVER TO SEE IF ANY * 09110000
|
|
* MESSAGES WAITING; IF NONE, PROCESS BLOCKED UNTIL * 09120000
|
|
* THERE IS ONE; LOCK MESSAGE CHAIN; REMOVE A MESSAGE * 09130000
|
|
* FROM CHAIN AND UNLOCK IT; MOVE TEXT OF MESSAGE, * 09140000
|
|
* PADDING WITH BLANKS OR TRUNCATING AS NECESSARY; * 09150000
|
|
* INDICATE CORRECT MESSAGE LENGTH AND NAME OF * 09160000
|
|
* MESSAGE SENDER; FREE STORAGE USED TO HOLD MESSAGE, * 09170000
|
|
* AND RETURN. * 09180000
|
|
* ERROR CHECKS: NONE * 09190000
|
|
* INTERRUPTS: ON * 09200000
|
|
* USER ACCESS: YES * 09210000
|
|
* * 09220000
|
|
*********************************************************************** 09230000
|
|
SPACE 1 09240000
|
|
XR EQU * . THE XR ROUTINE: READ A MESSAGE 09250000
|
|
USING *,1 09260000
|
|
LR 7,2 09270000
|
|
USING XRX,7 . ARG LIST 09280000
|
|
LA 2,PCBMSR . SEE IF MESSAGES WAITING 09290000
|
|
SVC C'P' 09300000
|
|
SVC C'!' . ENTER SMC SECTION 09310000
|
|
LA 2,PCBMSC . THEN LOCK THE MESSAGE CHAIN 09320000
|
|
SVC C'P' 09330000
|
|
L 5,PCBFM . GET THE FIRST MESSAGE 09340000
|
|
USING MSG,5 09350000
|
|
MVC PCBFM,MSGNEXT . REMEMBER THE NEXT 09360000
|
|
SVC C'V' . UNLOCK THE MESSAGE CHAIN 09370000
|
|
L 6,XRXSIZE . GET THE BUFFER CAPACITY 09380000
|
|
S 6,=F'2' . MINUS 1, MINUS 1 09390000
|
|
MVI XRXTEXT,C' ' . MOVE IN A BLANK 09400000
|
|
BM XRNOB 09410000
|
|
EX 6,XRFILL . THEN FILL THE REST WITH BLANKS 09420000
|
|
XRNOB LA 6,1(6) . THEN GET PROPER BUFFER COUNT 09430000
|
|
C 6,MSGSIZE . COMPARE WITH MESSAGE LENGTH 09440000
|
|
BL XRTHEN . IF LESS, HANDLE ACCORDINGLY 09450000
|
|
L 6,MSGSIZE . ELSE COUNT FOR MVC IS MESSAGE 09460000
|
|
BCTR 6,0 . SIZE MINUS ONE 09470000
|
|
XRTHEN LTR 6,6 . ANY CHARACTERS TO MOVE? 09480000
|
|
BM XRAFT . IF NOT, DON'T 09490000
|
|
EX 6,XRMOVE . ELSE MOVE THEM 09500000
|
|
XRAFT LA 6,1(6) . THEN GET LENGTH 09510000
|
|
ST 6,XRXSIZE . STORE IT 09520000
|
|
L 10,MSGSENDR . GET SENDER'S PCB 09530000
|
|
DROP 15 09540000
|
|
USING PCB,10 09550000
|
|
MVC XRXNAME,PCBNAME . AND STORE SENDER'S NAME 09560000
|
|
L 6,MSGSIZE . GET SIZE OF MESSAGE TEXT 09570000
|
|
LA 6,LENMSG(6) . ADD SIZE OF MESSAGE BLOCK 09580000
|
|
LA 6,7(6) . AND TRUNCATE 09590000
|
|
N 6,=F'-8' . UP 09600000
|
|
LR 2,5 . SET UP POINTER TO XFX 09610000
|
|
USING XFX,2 09620000
|
|
ST 5,XFXADDR . STORE ADDRESS 09630000
|
|
ST 6,XFXSIZE . STORE SIZE 09640000
|
|
SVC C'F' . AND FREE THE MESSAGE BLOCK 09650000
|
|
SVC C',' . LEAVE SMC 09660000
|
|
LPSW RETURN . AND RETURN 09670000
|
|
XRFILL MVC XRXTEXT+1,XRXTEXT . FILL WITH BLANKS 09680000
|
|
XRMOVE MVC XRXTEXT,MSGTEXT . MOVE TEXT 09690000
|
|
DROP 2,5,7,10 09700000
|
|
USING PCB,15 09710000
|
|
SPACE 3 09720000
|
|
*********************************************************************** 09730000
|
|
* * 09740000
|
|
* XS ROUTINE * 09750000
|
|
* * 09760000
|
|
* FUNCTION: TO SEND A MESSAGE * 09770000
|
|
* DATABASES: UPON ENTRY, REGISTER 2 CONTAINS ADDRESS XSX * 09780000
|
|
* XSX DS 0D * 09790000
|
|
* XSXNAME DS CL8 NAME OF TARGET PROCESS * 09800000
|
|
* XSXSIZE DS F SIZE OF TEXT * 09810000
|
|
* XSXTEXT DS C TEXT OF MESSAGE * 09820000
|
|
* ROUTINES USED: XP, XV, XEXC, XCOM, XA, XQUE * 09830000
|
|
* PROCEDURE: USE XN TO GET POINTER TO PCB OF TARGET PROCESS; * 09840000
|
|
* USE LENGTH OF MESSAGE AND XA TO ALLOCATE BLOCK FOR * 09850000
|
|
* MESSAGE; LOCK MESSAGE CHAIN OF TARGET PROCESS; * 09860000
|
|
* PUT MESSAGE BLOCK AT END OF CHAIN; STORE SENDER * 09870000
|
|
* NAME, SIZE, AND TEXT OF MESSAGE; UNLOCK CHAIN; * 09880000
|
|
* INDICATE MESSAGE CHAIN IS ONE LONGER; RETURN. * 09890000
|
|
* ERROR CHECKS: IF NO PROCESS BY GIVEN NAME, ENTER XQUE. * 09900000
|
|
* INTERRUPTS: ON * 09910000
|
|
* USER ACCESS: YES * 09920000
|
|
* * 09930000
|
|
*********************************************************************** 09940000
|
|
SPACE 1 09950000
|
|
XS EQU * . THE XS ROUTINE: SEND MESSAGES 09960000
|
|
USING *,1 09970000
|
|
LR 7,2 09980000
|
|
USING XSX,7 . ARG LIST 09990000
|
|
LA 2,SATEMP . READY TO CALL OUT 10000000
|
|
USING XNX,2 . ABOUT TO CALL XN 10010000
|
|
MVC XNXNAME,XSXNAME . GIVE NAME OF TARGET PROCESS 10020000
|
|
SVC C'N' . SEE WHERE IT IS 10030000
|
|
L 4,XNXADDR . GET THE POINTER 10040000
|
|
LTR 4,4 . IS THERE INDEED ONE? 10050000
|
|
BZ XSERR . IF NOT, ERROR 10060000
|
|
USING PCB,4 10070000
|
|
DROP 2,15 10080000
|
|
USING XAX,2 . READY TO CALL XA 10090000
|
|
SVC C'!' . ENTERING SMC SECTION 10100000
|
|
L 3,XSXSIZE . GET THE STATED SIZE 10110000
|
|
LA 3,LENMSG(3) . PLUS THE AMOUNT OF OVERHEAD 10120000
|
|
LA 3,7(3) . AND TRUNCATE 10130000
|
|
N 3,=F'-8' . UP 10140000
|
|
ST 3,XAXSIZE . THAT'S THE SIZE OF THE REGION TO 10150000
|
|
MVC XAXALGN,=F'8' . ALLOCATE, ON A DOUBLEWORD BOUND 10160000
|
|
SVC C'A' . SO ALLOCATE ALREADY 10170000
|
|
L 5,XAXADDR . GET THE ADDRESS 10180000
|
|
DROP 2 10190000
|
|
LA 2,PCBMSC . GET THE MESSAGE CHAIN SEMAPHORE 10200000
|
|
SVC C'P' . AND LOCK IT 10210000
|
|
LA 8,PCBFM . THEN START DOWN THE MESSAGE 10220000
|
|
L 9,PCBFM . CHAIN 10230000
|
|
USING MSG,9 10240000
|
|
XSLOOP LTR 9,9 . ARE WE THROUGH? 10250000
|
|
BZ XSADD . IF SO ADD IT ON 10260000
|
|
LA 8,MSGNEXT . IF NOT, ON TO THE NEXT 10270000
|
|
L 9,MSGNEXT 10280000
|
|
B XSLOOP . AND TRY AGAIN 10290000
|
|
XSADD ST 5,0(8) . CHAIN OURS ON THE END 10300000
|
|
DROP 9 10310000
|
|
USING MSG,5 10320000
|
|
MVC MSGNEXT,=A(0) . SET NEXT POINTER NULL 10330000
|
|
ST 15,MSGSENDR . STORE THE SENDER 10340000
|
|
L 6,XSXSIZE . GET THE TEXT LENGTH 10350000
|
|
ST 6,MSGSIZE . AND STORE IT 10360000
|
|
BCTR 6,0 . ONE LESS 10370000
|
|
LTR 6,6 . TEST LENGTH 10380000
|
|
BM XSAFT . IF ZERO, NOTHING TO MOVE 10390000
|
|
EX 6,XSMOVE . ELSE, MOVE IT 10400000
|
|
XSAFT SVC C'V' . UNLOCK THE MESSAGE CHAIN 10410000
|
|
LA 2,PCBMSR . THEN SAY THERE'S 10420000
|
|
SVC C'V' . ONE MORE MESSAGE 10430000
|
|
SVC C',' . LEAVE SMC SECTION 10440000
|
|
LPSW RETURN . AND RETURN 10450000
|
|
XSERR SVC C'?' 10460000
|
|
XSMOVE MVC MSGTEXT,XSXTEXT . THE MOVE FOR THE TEXT 10470000
|
|
DROP 4,5,7 10480000
|
|
USING PCB,15 10490000
|
|
EJECT 10500000
|
|
*********************************************************************** 10510000
|
|
* * 10520000
|
|
* XY ROUTINE * 10530000
|
|
* * 10540000
|
|
* FUNCTION: TO START A PROCESS * 10550000
|
|
* DATABASES: UPON ENTRY, REGISTER 2 CONTAINS ADDRESS XYX * 10560000
|
|
* XYX DS 0D * 10570000
|
|
* XYXNAME DS CL8 NAME OF PROCESS TO BE STARTED * 10580000
|
|
* XYXADDR DS A STARTING ADDRESS OF PROCESS * 10590000
|
|
* ROUTINES USED: XN, XEXC, XCOM, XQUE * 10600000
|
|
* PROCEDURE: USE XN TO GET POINTER TO THE PCB OF PROCESS TO BE * 10610000
|
|
* STARTED; STORE IN PCB INTERRUPT SAVE AREA REGISTERS* 10620000
|
|
* AND PSW WITH STARTING ADDRESS AS SENT FROM STARTING* 10630000
|
|
* PROCESS; STOPPED BIT TURNED OFF; RETURN. * 10640000
|
|
* ERROR CHECKS: IF NO PROCESS BY GIVEN NAME, XQUE ENTERED. * 10650000
|
|
* INTERRUPTS: OFF * 10660000
|
|
* USER ACCESS: YES * 10670000
|
|
* * 10680000
|
|
*********************************************************************** 10690000
|
|
SPACE 1 10700000
|
|
XY EQU * . THE XY ROUTINE: START A PROCESS 10710000
|
|
USING *,1 10720000
|
|
LR 7,2 10730000
|
|
USING XYX,7 . THE ARG LIST 10740000
|
|
LA 2,SATEMP . READY TO CALL OUT 10750000
|
|
USING XNX,2 10760000
|
|
MVC XNXNAME,XYXNAME . GIVE XN A NAME 10770000
|
|
SVC C'N' . CALL XN 10780000
|
|
L 10,XNXADDR . WHERE IS THE PCB? 10790000
|
|
LTR 10,10 . OR IS THERE ONE? 10800000
|
|
BZ XYERR . IF NOT, OH HISS BOO 10810000
|
|
DROP 2,14,15 10820000
|
|
USING PCB,10 10830000
|
|
LA 13,PCBISA . GET INTO THAT PCB'S ISA 10840000
|
|
USING SA,13 10850000
|
|
MVC SAPSW,(SAPSW-SA)(14) . GIVE IT THE CALLER'S PSW 10860000
|
|
MVC SAPSW+5(3),XYXADDR+1 . BUT AT THE REQUESTED ADDRESS 10870000
|
|
MVC SAREGS,(SAREGS-SA)(14) .GIVE IT HIS REGISTERS 10880000
|
|
MVI PCBSTOPT,X'00' . IT'S NO LONGER STOPPED 10890000
|
|
LPSW RETURN . AND RETURN 10900000
|
|
XYERR SVC C'?' . WE DONE BAD 10910000
|
|
DROP 7,10,13 10920000
|
|
USING SA,14 10930000
|
|
USING PCB,15 10940000
|
|
EJECT 10950000
|
|
*********************************************************************** 10960000
|
|
* * 10970000
|
|
* XZ ROUTINE * 10980000
|
|
* * 10990000
|
|
* FUNCTION: TO STOP A PROCESS * 11000000
|
|
* DATABASES: UPON ENTRY, REGISTER 2 CONTAINS ADDRESS XZX * 11010000
|
|
* XZX DS 0D * 11020000
|
|
* XZXNAME DS CL8 NAME OF PROCESS TO BE STOPPED * 11030000
|
|
* ROUTINES USED: XN, XEXC, XCOM, XQUE, XP * 11040000
|
|
* PROCEDURE: CHECK THAT USER PROCESS CAN'T STOP SYSTEM * 11050000
|
|
* PROCESS; USE XN TO GET PCB POINTER; IF IN SMC, SET * 11060000
|
|
* STOP WAITING BIT AND BLOCK SELF UNTIL STOP * 11070000
|
|
* PERFORMED; ELSE SET STOPPED BIT, AND RETURN. * 11080000
|
|
* ERROR CHECKS: IF NO PROCESS BY GIVEN NAME OR USER TRIES TO * 11090000
|
|
* STOP A SYSTEM PROCESS, XQUE ENTERED. * 11100000
|
|
* INTERRUPTS: ON * 11110000
|
|
* USER ACCESS: YES * 11120000
|
|
* * 11130000
|
|
*********************************************************************** 11140000
|
|
SPACE 1 11150000
|
|
XZ EQU * . THE XZ ROUTINE: STOP A PROCESS 11160000
|
|
USING *,1 11170000
|
|
LR 7,2 11180000
|
|
USING XZX,7 . ARG LIST 11190000
|
|
CLI PCBNAME,C'*' . IS STOPPER A * PROCESS 11200000
|
|
BE XZFINE . THAT'S OK 11210000
|
|
CLI XZXNAME,C'*' . IF NOT, IS STOPPEE A * ? 11220000
|
|
BE XZERR . CAN'T DO THAT 11230000
|
|
XZFINE LA 2,SATEMP . READY TO CALL OUT 11240000
|
|
USING XNX,2 . WILL CALL XN 11250000
|
|
MVC XNXNAME,XZXNAME . GIVE IT THE NAME 11260000
|
|
SVC C'N' . AND DO THE CALL 11270000
|
|
L 10,XNXADDR . GET THE PCB'S ADDRESS 11280000
|
|
LTR 10,10 . SEE IF NULL 11290000
|
|
BZ XZERR . IF SO, ERROR 11300000
|
|
SVC C'!' . ENTER SMC 11310000
|
|
DROP 2,15 11320000
|
|
USING PCB,10 11330000
|
|
XZSTOP CLI PCBINSMC,X'00' . SEE IF IN SMC 11340000
|
|
BNE XZINSMC . IF SO, BAD 11350000
|
|
MVI PCBSTOPT,X'FF' . ELSE JUST STOP IT 11360000
|
|
SVC C',' . LEAVE SMC 11370000
|
|
LPSW RETURN . AND RETURN 11380000
|
|
XZINSMC MVI PCBSW,X'FF' . IF IN SMC, SAY STOP WAITING 11390000
|
|
LA 2,PCBSRS . AND STOP OURSELVES AGAINST 11400000
|
|
SVC C'P' . A SEMAPHORE 11410000
|
|
B XZSTOP . THEN WE CAN REALLY STOP IT 11420000
|
|
XZERR SVC C'?' . AN ERROR 11430000
|
|
DROP 10,7 11440000
|
|
USING PCB,15 11450000
|
|
EJECT 11460000
|
|
*********************************************************************** 11470000
|
|
* * 11480000
|
|
* XQUE ROUTINE * 11490000
|
|
* * 11500000
|
|
* FUNCTION: TO SIGNAL ERROR CONDITION * 11510000
|
|
* DATABASES: NONE * 11520000
|
|
* ROUTINES USED: XR, XS * 11530000
|
|
* PROCEDURE: SEND MESSAGE TO SUPERVISOR PROCESS FOR THIS JOB * 11540000
|
|
* INDICATING ABNORMAL TERMINATION; TRY TO READ * 11550000
|
|
* MESSAGES, FOREVER LOOPING; BLOCK ITSELF, THEREBY * 11560000
|
|
* NEVER RETURNING. * 11570000
|
|
* ERROR CHECKS: NONE * 11580000
|
|
* INTERRUPTS: OFF * 11590000
|
|
* USER ACCESS: YES * 11600000
|
|
* * 11610000
|
|
*********************************************************************** 11620000
|
|
SPACE 1 11630000
|
|
XQUE EQU * . THE XQUE ROUTINE: ERROR! 11640000
|
|
USING *,1 11650000
|
|
LA 2,XQUEM1 . SEND AN ERROR MESSAGE TO *IBSUP 11660000
|
|
SVC C'S' 11670000
|
|
XQUELOOP LA 2,XQUEM2 . WAIT FOR REPLY 11680000
|
|
SVC C'R' 11690000
|
|
B XQUELOOP . BUT IGNORE IT 11700000
|
|
DS 0F 11710000
|
|
XQUEM1 DC CL8'*IBSUP' 11720000
|
|
DC F'12' 11730000
|
|
DC CL12'PROGRAM FLOP' 11740000
|
|
XQUEM2 DS CL8 11750000
|
|
DC F'1' 11760000
|
|
DS CL1,0H 11770000
|
|
DROP 14,15 11780000
|
|
EJECT 11790000
|
|
*********************************************************************** 11800000
|
|
* * 11810000
|
|
* INPUT/OUTPUT ROUTINES * 11820000
|
|
* * 11830000
|
|
*********************************************************************** 11840000
|
|
SPACE 1 11850000
|
|
*********************************************************************** 11860000
|
|
* * 11870000
|
|
* SYSTEM SUPPLIED DEVICE HANDLER FOR READERS * 11880000
|
|
* * 11890000
|
|
*********************************************************************** 11900000
|
|
SPACE 1 11910000
|
|
RDRHANDL EQU * . THE READER HANDLER 11920000
|
|
USING UCB,3 . STARTED WITH REG3 -> UCB 11930000
|
|
BALR 1,0 11940000
|
|
USING *,1 . ESTABLISH ADDRESSING 11950000
|
|
LA 2,RDRHSEM . LOCK OURSELVES UNTIL WE SET UP 11960000
|
|
SVC C'P' . AN AUTOMATIC STORAGE AREA 11970000
|
|
LA 2,RDRHAAS . READY TO ALLOCATE 11980000
|
|
USING XAX,2 11990000
|
|
SVC C'E' . ALLOCATE 12000000
|
|
L 12,XAXADDR . GET A PTR 12010000
|
|
DROP 2 12020000
|
|
LA 2,RDRHSEM . AND UNBLOCK OURSELVES 12030000
|
|
SVC C'V' 12040000
|
|
SRL 4,16 . SHIFT KEY 12050000
|
|
SR 10,10 . CLEAR REG 10 12060000
|
|
USING RDRHAS,12 . AUTOMATIC AREA 12070000
|
|
MVI JOBBIT,X'00' . INITIALIZE 12080000
|
|
LA 6,RDRHCCB . GET PTR TO CCB 12090000
|
|
RDRHLOOP LA 2,RDRHMSG . TRY TO READ A MESSAGE 12100000
|
|
USING XRX,2 12110000
|
|
MVC XRXSIZE,=F'8' . WE CAN TAKE 8 CHARS 12120000
|
|
SVC C'R' . READ IT 12130000
|
|
CLC =C'READ',XRXTEXT . IF FIRST WORD IS READ, OK 12140000
|
|
BNE RDRHLOOP . ELSE IGNORE 12150000
|
|
L 5,XRXTEXT+4 . GET 2ND WORD OF TEXT 12160000
|
|
DROP 2 12170000
|
|
LA 2,UCBUS . LOCK THE UCB AND IT'S UNIT 12180000
|
|
SVC C'P' 12190000
|
|
LA 2,RDRHMSG . RESET ADDRESSING POINTER 12200000
|
|
USING XRX,2 12210000
|
|
CLI JOBBIT,X'FF' . HAVE WE JUST READ $JOB CARD? 12220000
|
|
BNE RDRHMORE . IF NO, GO CHECK PROTECTION, ELSE 12230000
|
|
CLI XRXNAME,C'*' . IS JSP CALLING US? 12240000
|
|
BNE RDRHNO . IF NOT, TELL HIM NO. 12250000
|
|
MVC 0(80,5),RDRHTEMP . IF IT IS, GIVE JSP THE $JOB CARD 12260000
|
|
MVI JOBBIT,X'00' . SAY WE DON'T HAVE $JOB WAITING 12270000
|
|
B RDRHSOK . AND SEND MESSAGE BACK 12280000
|
|
DROP 2 12290000
|
|
RDRHMORE CLI RDRHMSG,C'*' . IS SYSTEM CALLING? 12300000
|
|
BE RDRHPOK . THEN PROTECTION OK, ELSE 12310000
|
|
LR 11,5 . GET ADDRESS THAT'S TO HOLD CARD, 12320000
|
|
N 11,PROTCON1 . get the page boundary 12330002
|
|
* ISKE 10,11 . find storage key 12334002
|
|
DC X'B22900AB' Assembler (XF) doesn't support ISKE 12338002
|
|
N 10,PROTCON2 . ignore low order bits 12342002
|
|
CR 10,4 . DOES IT MATCH OURS? 12350000
|
|
BNE RDRHNO . IF NOT, TELL HIM NO 12360000
|
|
LA 11,79(5) . CHECK LAST BYTE ADDR OF CARD 12370000
|
|
N 11,PROTCON1 . get the page boundary 12380002
|
|
* ISKE 10,11 . find storage key 12384002
|
|
DC X'B22900AB' Assembler (XF) doesn't support ISKE 12388002
|
|
N 10,PROTCON2 . ignore low order bits 12392002
|
|
CR 10,4 . DOES IT MATCH OURS? 12400000
|
|
BNE RDRHNO . IF NOT, TELL HIM NO 12410000
|
|
RDRHPOK N 5,CCBCON1 . MAKE ADDRESS INTO 12420000
|
|
ST 5,RDRHCCB . A CCW (OR CCB) 12430000
|
|
OI RDRHCCB,X'02' 12440000
|
|
MVC RDRHCCB+4,=F'80' . WE'LL READ EIGHTY CHARACTERS 12450000
|
|
MVC UCBCSW(4),=A(0) . CLEAR THE LAST CSW THERE 12460000
|
|
MVC UCBCSW+4(4),=A(0) 12470000
|
|
LA 2,CAWSEM . LOCK THE CAW 12480000
|
|
SVC C'P' 12490000
|
|
ST 6,CAW . THAT'S THE CAW 12500000
|
|
L 7,UCBADDR . GET THE UNIT ADDRESS 12510000
|
|
SIO 0(7) . START THE I/O 12520000
|
|
BNZ RDSTATUS . BRANCH IF SIO UNSUCCESSFUL 12530000
|
|
SVC C'V' . THEN UNLOCK THE CAW 12540000
|
|
RDRHWAIT LA 2,UCBWS . NOW WAIT FOR AN INTERRUPT 12550000
|
|
SVC C'P' 12560000
|
|
TM UCBCSW+4,X'85' . CHECK THE STATUS 12570003
|
|
BZ RDRHWAIT . IF NOT FINISHED, WAIT 12580000
|
|
TM UCBCSW+4,X'01' . CHECK FOR EXCEPTION 12590000
|
|
BO RDRHEXC . if yes, ignore this interrupt 12600003
|
|
TM UCBCSW+4,X'80' . if no, check for attention 12602003
|
|
BO RDRHPOK . if yes, try to restart the I/O 12604003
|
|
B RDRHOK . else, all is groovy 12606003
|
|
RDRHEXC NI UCBCSW+4,X'FE' . clear exception .. 12608003
|
|
B RDRHWAIT . .. and continue waiting 12610003
|
|
RDRHNO MVC RDRHM+12(2),=C'NO' . message back is no 12612003
|
|
B RDRHSEND . GET READY TO SEND 12620000
|
|
RDRHOK CLI RDRHMSG,C'*' . IS THE SYSTEM CALLING? 12630000
|
|
BE RDRHSOK . THAT'S FINE. OTHERWISE, 12640000
|
|
CLC =C'$JOB,',0(5) . WAS IT A $JOB CARD? 12650000
|
|
BE ENDADATA . OOPS! WE HIT END OF DATA STREAM 12660000
|
|
RDRHSOK MVC RDRHM+12(2),=C'OK' .GROOVINESS MESSAGE 12670000
|
|
RDRHSEND MVC RDRHM+8(4),=F'2' . SAY THERE ARE 2 CHARACTERS 12680000
|
|
MVC RDRHM+0(8),RDRHMSG+0 . SEND BACK TO SAME GUY 12690000
|
|
LA 2,UCBUS . NOW UNLOCK UCB AND UNIT 12700000
|
|
SVC C'V' 12710000
|
|
LA 2,RDRHM . SET UP MESSAGE 12720000
|
|
SVC C'S' . AND SEND IT 12730000
|
|
B RDRHLOOP 12740000
|
|
ENDADATA MVC RDRHM+12(2),=C'NO' . TELL USER NO MORE CARDS 12750000
|
|
MVC RDRHTEMP(80),0(5) . SAVE THE $JOB CARD 12760000
|
|
MVI 0(5),C' ' . BLANK OUT THE USER'S COPY 12770000
|
|
MVC 1(79,5),0(5) 12780000
|
|
MVI JOBBIT,X'FF' . INDICATE WE HAVE A NEW $JOB CARD 12790000
|
|
B RDRHSEND . AND SEND THE MESSAGE BACK 12800000
|
|
RDSTATUS SVC C'V' . UNLOCK THE CAW 12810000
|
|
LA 2,UCBWS . AND WAIT FOR AN INTERRUPT 12820000
|
|
SVC C'P' 12830000
|
|
B RDRHPOK . AND TRY TO RESTART THE I/O 12840000
|
|
DROP 3,12 12850000
|
|
SPACE 1 12860000
|
|
RDRHSEM DC F'1,0' 12870000
|
|
CCBCON1 DC X'00FFFFFF' MASK 12880000
|
|
PROTCON1 DC X'00FFF000' page alignment 12890002
|
|
PROTCON2 DC X'FFFFFFF0' ignore low order bits 12893002
|
|
RDRHAAS DC A(LENRDRHA) ALLOCATE ARGLIST FOR STORAGE 12900000
|
|
DC F'0' 12910000
|
|
DC F'8' 12920000
|
|
SPACE 3 12930000
|
|
*********************************************************************** 12940000
|
|
* * 12950000
|
|
* SYSTEM SUPPLIED DEVICE HANDLER FOR PRINTERS * 12960000
|
|
* * 12970000
|
|
*********************************************************************** 12980000
|
|
SPACE 1 12990000
|
|
PRTHANDL EQU * . THE PRINTER HANDLER 13000000
|
|
USING UCB,3 . ENTERED WITH REG3 -> THE UCB 13010000
|
|
BALR 1,0 13020000
|
|
USING *,1 . ESTABLISH ADDRESSING 13030000
|
|
LA 2,PRTHSEM . LOCK UNTIL ALLOCATE STORAGE 13040000
|
|
SVC C'P' . 13050000
|
|
LA 2,PRTHAAS . READY TO ALLOCATE 13060000
|
|
USING XAX,2 13070000
|
|
SVC C'E' . ALLOCATE 13080000
|
|
L 12,XAXADDR . GET THE ADDRESS 13090000
|
|
DROP 2 13100000
|
|
LA 2,PRTHSEM . 13110000
|
|
SVC C'V' UNLOCK TO ROUTINE 13120000
|
|
SRL 4,16 . SHIFT KEY 13130000
|
|
SR 10,10 . CLEAR REG 10 13140000
|
|
USING PRTHAS,12 . ADDRESSING IN THE AUTO AREA 13150000
|
|
LA 6,PRTHCCB . MAKE A CAW 13160000
|
|
PRTHLOOP LA 2,PRTHMSG . READY TO READ A MESSAGE 13170000
|
|
USING XRX,2 13180000
|
|
MVC XRXSIZE,=F'8' . WE CAN TAKE 8 CHARACTERS 13190000
|
|
SVC C'R' . READ IT 13200000
|
|
L 5,XRXTEXT+4 . LOAD THE ADDRESS 13210000
|
|
CLC =C'PRIN',XRXTEXT . IS IT A PRIN REQUEST? 13220000
|
|
BE PRTHPRIN 13230000
|
|
CLC =C'STC1',XRXTEXT . OR A SKIP REQUEST? 13240000
|
|
BE PRTHSTC1 13250000
|
|
B PRTHLOOP . IF NEITHER, IGNORE 13260000
|
|
DROP 2 13270000
|
|
PRTHPRIN LA 2,UCBUS 13280000
|
|
SVC C'P' . LOCK THE UCB AND UNIT 13290000
|
|
CLI PRTHMSG,C'*' . IS SYSTEM CALLING? 13300000
|
|
BE PRTHPOK . THEN PROTECTION OK. ELSE 13310000
|
|
LR 11,5 . GET ADDRESS THAT'S TO HOLD MSG, 13320000
|
|
N 11,PROTCON1 . get the page boundary 13330002
|
|
* ISKE 10,11 . find storage key 13334002
|
|
DC X'B22900AB' Assembler (XF) doesn't support ISKE 13338002
|
|
N 10,PROTCON2 . ignore low order bits 13342002
|
|
CR 10,4 . DOES IT MATCH OURS? 13350000
|
|
BNE PRTHNO . IF NOT, TELL HIM NO 13360000
|
|
LA 11,131(5) . CHECK LAST BYTE ADDRESS OF LINE 13370000
|
|
N 11,PROTCON1 . get the page boundary 13380002
|
|
* ISKE 10,11 . find storage key 13384002
|
|
DC X'B22900AB' Assembler (XF) doesn't support ISKE 13388002
|
|
N 10,PROTCON2 . ignore low order bits 13392002
|
|
CR 10,4 . DOES IT MATCH OURS? 13400000
|
|
BNE PRTHNO . IF NOT, TELL HIM NO 13410000
|
|
PRTHPOK N 5,CCBCON1 . MAKE A WRITE REQUEST 13420000
|
|
ST 5,PRTHCCB . FOR THE CCB 13430000
|
|
OI PRTHCCB,X'09' . PRINT COMMAND CODE 13440000
|
|
MVC PRTHCCB+4,=F'132' . WE'LL PRINT 132 CHARACTERS 13450000
|
|
B PRTHCOMM . BRANCH TO COMMON SECTION 13460000
|
|
PRTHSTC1 MVC PRTHCCB(8),=X'8900000020000001' SKIP TO TOP OF PAGE 13470000
|
|
LA 2,UCBUS 13480000
|
|
SVC C'P' . LOCK THE UCB AND UNIT 13490000
|
|
PRTHCOMM LA 2,CAWSEM . LOCK THE CAW 13500000
|
|
SVC C'P' 13510000
|
|
ST 6,CAW . STORE OUR CAW 13520000
|
|
MVC UCBCSW(4),=A(0) . CLEAR THE LAST CSW THERE 13530000
|
|
MVC UCBCSW+4(4),=A(0) 13540000
|
|
L 7,UCBADDR . GET THE ADDRESS 13550000
|
|
SIO 0(7) . START THE I/O 13560000
|
|
BNZ PTSTATUS . BRANCH IF SIO UNSUCCESSFUL 13570000
|
|
SVC C'V' . AND UNLOCK THE CAW 13580000
|
|
PRTHWAIT LA 2,UCBWS . START TO WAIT 13590000
|
|
SVC C'P' 13600000
|
|
TM UCBCSW+4,X'05' . IS THE UNIT READY? 13610000
|
|
BZ PRTHWAIT . IF NOT, ITS STILL ON. WAIT 13620000
|
|
TM UCBCSW+4,X'01' . WAS THERE AN EXCEPTION? 13630000
|
|
BZ PRTHOK . IF NOT, GOOD 13640000
|
|
PRTHNO MVC PRTHM+12(2),=C'NO' .THERE WAS, SO SAY SO 13650000
|
|
B PRTHSEND 13660000
|
|
PRTHOK MVC PRTHM+12(2),=C'OK' .NO ERRORS 13670000
|
|
PRTHSEND MVC PRTHM+8(4),=F'2' . SENDING 2 CHARACTERS 13680000
|
|
MVC PRTHM+0(8),PRTHMSG+0 . SEND TO OUR SENDER 13690000
|
|
LA 2,UCBUS 13700000
|
|
SVC C'V' . UNLOCK THE UCB 13710000
|
|
LA 2,PRTHM 13720000
|
|
SVC C'S' . SEND IT 13730000
|
|
B PRTHLOOP . AND READ ANOTHER MESSAGE 13740000
|
|
PTSTATUS SVC C'V' . UNLOCK THE CAW 13750000
|
|
LA 2,UCBWS . AND WAIT FOR THE INTERRUPT 13760000
|
|
SVC C'P' 13770000
|
|
B PRTHCOMM . AND TRY TO RESTART THE I/O 13780000
|
|
DROP 3,12 13790000
|
|
SPACE 2 13800000
|
|
PRTHSEM DC F'1,0' LOCK 13810000
|
|
PRTHAAS DC A(LENPRTHA) XA ARG LIST FOR AUTO STORAGE 13820000
|
|
DC F'0' 13830000
|
|
DC F'8' 13840000
|
|
EJECT 13850000
|
|
*********************************************************************** 13860000
|
|
* * 13870000
|
|
* SYSTEM ROUTINE FOR USER SUPPLIED DEVICE HANDLER * 13880000
|
|
* * 13890000
|
|
*********************************************************************** 13900000
|
|
SPACE 1 13910000
|
|
EXCPHNDL EQU * . EXCP DEVICE HANDLER 13920000
|
|
USING UCB,3 . WILL HAVE REG3 -> UCB 13930000
|
|
BALR 1,0 13940000
|
|
USING *,1 . ESTABLISH ADDRESSING 13950000
|
|
LA 2,EXCPHSEM . LOCK OURSELVES UNTIL WE HAVE 13960000
|
|
SVC C'P' . SET UP AUTOMATIC STORAGE 13970000
|
|
LA 2,EXCPHAAS . READY TO ALLOCATE 13980000
|
|
USING XAX,2 13990000
|
|
SVC C'E' . ALLOCATE 14000000
|
|
L 12,XAXADDR . GET POINTER TO AUTO STORAGE 14010000
|
|
DROP 2 14020000
|
|
LA 2,EXCPHSEM . AND UNLOCK OURSELVES 14030000
|
|
SVC C'V' UNLOCK TO ROUTINE 14040000
|
|
LR 4,11 14050000
|
|
SLL 4,8 . SHIFT KEY FOR CAW 14060000
|
|
USING EXCPHAS,12 . FOR ADDRESSING AUTO AREA 14070000
|
|
EXCPLOOP LA 2,EXCPHMSG . TRY TO READ A MESSAGE 14080000
|
|
USING XRX,2 14090000
|
|
MVC XRXSIZE,=F'12' . WE'LL TAKE 12 CHARACTERS 14100000
|
|
SVC C'R' 14110000
|
|
CLC =C'EXCP',XRXTEXT . IS IT AN EXCP MESSAGE? 14120000
|
|
BNE EXCPLOOP . IF NOT, IGNORE IT 14130000
|
|
L 5,XRXTEXT+4 . REG 5 CONTAINS CHAN AND DEV 14140000
|
|
L 6,XRXTEXT+8 . REG 6 CONTAINS ADDR OF CCWS 14150000
|
|
DROP 2 14160000
|
|
LA 7,UCBTABLE . GET PTR TO UCB TABLE 14170000
|
|
EXCPCOMP C 5,0(7) . COMPARE UNIT ADDRESS 14180000
|
|
BE EXCPFIND . THAT'S THE UCB WE WANT 14190000
|
|
LA 7,UCBLENG(7) . GET PTR TO NEXT UCB 14200000
|
|
C 7,=A(UCBTBEND) . ARE WE THROUGH WITH TABLE? 14210000
|
|
BNE EXCPCOMP . IF NOT, LOOK SOME MORE 14220000
|
|
SVC C'?' . ELSE ERROR 14230000
|
|
EXCPFIND LR 3,7 . SET REG 3 TO UCB PTR 14240000
|
|
LA 2,UCBUS 14250000
|
|
SVC C'P' . LOCK THE UCB 14260000
|
|
OR 6,4 . OR IN THE USER'S KEY 14270000
|
|
MVC UCBCSW(4),=A(0) . CLEAR THE LAST CSW THERE 14280000
|
|
MVC UCBCSW+4(4),=A(0) 14290000
|
|
LA 2,CAWSEM 14300000
|
|
SVC C'P' . LOCK CAW 14310000
|
|
ST 6,CAW . STORE OUR CAW 14320000
|
|
SIO 0(5) . START THE I/O 14330000
|
|
SVC C'V' . UNLOCK THE CAW 14340000
|
|
EXCPWAIT LA 2,UCBWS . NOW WAIT FOR AN INTERRUPT 14350000
|
|
SVC C'P' 14360000
|
|
MVC EXCPHM+12(8),UCBCSW . GIVE USER HIS CSW 14370000
|
|
MVC EXCPHM+8(4),=F'12' 14380000
|
|
MVC EXCPHM(8),EXCPHMSG 14390000
|
|
LA 2,EXCPHM 14400000
|
|
SVC C'S' . AND SENT THE MESSAGE 14410000
|
|
LA 2,EXCPHMSG . AND WAIT FOR A REPLY 14420000
|
|
USING XRX,2 14430000
|
|
MVC XRXSIZE(4),=F'8' . FROM THE USER 14440000
|
|
SVC C'R' 14450000
|
|
CLC =C'OK',XRXTEXT . AM I DONE? 14460000
|
|
BE EXCPDONE 14470000
|
|
CLC =C'AGAIN',XRXTEXT . DOES HE WANT ANOTHER CSW? 14480000
|
|
BE EXCPWAIT 14490000
|
|
SVC C'?' . WRONG MESSAGE 14500000
|
|
DROP 2 14510000
|
|
EXCPDONE LA 2,UCBUS . UNLOCK UNIT 14520000
|
|
SVC C'V' 14530000
|
|
B EXCPLOOP . AND GET ANOTHER MESSAGE 14540000
|
|
DROP 3,12 14550000
|
|
EXCPHSEM DC F'1,0' 14560000
|
|
EXCPHAAS DC A(LENEXCPA) . ALLOCATION OF AUTO STORAGE 14570000
|
|
DC F'0' 14580000
|
|
DC F'8' 14590000
|
|
SPACE 3 14600000
|
|
LTORG 14610000
|
|
EJECT 14620000
|
|
*********************************************************************** 14630000
|
|
* * 14640000
|
|
* UNIT CONTROL BLOCKS * 14650000
|
|
* * 14660000
|
|
*********************************************************************** 14670000
|
|
SPACE 1 14680000
|
|
UCBTABLE DS 0F . TABLE OF UNIT CONTROL BLOCKS 14690000
|
|
* UCB FOR READER 1 14700000
|
|
UCBRDR1 DC X'00000012' . DEVICE ADDRESS, 14710000
|
|
DC F'1,0' . USER SEMAPHORE, 14720000
|
|
DC F'0,0' . WAIT SEMAPHORE, 14730000
|
|
DC F'0,0' . CHANNEL STATUS WORD 14740000
|
|
DC X'00' 14750000
|
|
DS 0F 14760000
|
|
* UCB FOR PRINTER 1 14770000
|
|
UCBPRT1 DC X'00000010' . DEVICE ADDRESS, 14780000
|
|
DC F'1,0' . USER SEMAPHORE, 14790000
|
|
DC F'0,0' . WAIT SEMAPHORE, 14800000
|
|
DC F'0,0' . CHANNEL STATUS WORD 14810000
|
|
DC X'00' 14820000
|
|
DS 0F 14830000
|
|
* UCB FOR READER 2 14840000
|
|
UCBRDR2 DC X'0000000C' . DEVICE ADDRESS, 14850000
|
|
DC F'1,0' . USER SEMAPHORE, 14860000
|
|
DC F'0,0' . WAIT SEMAPHORE, 14870000
|
|
DC F'0,0' . CHANNEL STATUS WORD 14880000
|
|
DC X'00' 14890000
|
|
DS 0F 14900000
|
|
* UCB FOR PRINTER 2 14910000
|
|
UCBPRT2 DC X'0000000E' . DEVICE ADDRESS, 14920000
|
|
DC F'1,0' . USER SEMAPHORE, 14930000
|
|
DC F'0,0' . WAIT SEMAPHORE, 14940000
|
|
DC F'0,0' . CHANNEL STATUS WORD 14950000
|
|
DC X'00' 14960000
|
|
DS 0F 14970000
|
|
* UCB for READER 3 14970302
|
|
UCBRDR3 DC X'00000112' . device address, 14970602
|
|
DC F'1,0' . user semaphore, 14970902
|
|
DC F'0,0' . wait semaphore, 14971202
|
|
DC F'0,0' . channel status word 14971502
|
|
DC X'00' 14971802
|
|
DS 0F 14972102
|
|
* UCB for PRINTER 3 14972402
|
|
UCBPRT3 DC X'00000110' . device address, 14972702
|
|
DC F'1,0' . user semaphore, 14973002
|
|
DC F'0,0' . wait semaphore, 14973302
|
|
DC F'0,0' . channel status word 14973602
|
|
DC X'00' 14973902
|
|
DS 0F 14974202
|
|
* UCB for READER 4 14974502
|
|
UCBRDR4 DC X'0000010C' . device address, 14974802
|
|
DC F'1,0' . user semaphore, 14975102
|
|
DC F'0,0' . wait semaphore, 14975402
|
|
DC F'0,0' . channel status word 14975702
|
|
DC X'00' 14976002
|
|
DS 0F 14976302
|
|
* UCB for PRINTER 4 14976602
|
|
UCBPRT4 DC X'0000010E' . device address, 14976902
|
|
DC F'1,0' . user semaphore, 14977202
|
|
DC F'0,0' . wait semaphore, 14977502
|
|
DC F'0,0' . channel status word 14977802
|
|
DC X'00' 14978102
|
|
DS 0F 14978402
|
|
* UCB for CONSOLE 1 14978504
|
|
UCBCONS1 DC X'00000009' . device address, 14978604
|
|
DC F'1,0' . user semaphore, 14978704
|
|
DC F'0,0' . wait semaphore, 14978804
|
|
DC F'0,0' . channel status word 14978904
|
|
DC X'00' 14979004
|
|
DS 0F 14979104
|
|
UCBTBEND EQU * 14980000
|
|
EJECT 14990000
|
|
*********************************************************************** 15000000
|
|
* * 15010000
|
|
* I/O INTERRUPT HANDLER * 15020000
|
|
* * 15030000
|
|
*********************************************************************** 15040000
|
|
SPACE 1 15050000
|
|
IOHANDL EQU * . THE I/O INTERRUPT HANDLER 15060000
|
|
STM 0,15,IOHSAVE . SAVE REGISTERS 15070000
|
|
BALR 1,0 15080000
|
|
USING *,1 . ESTABLISH ADRESSING 15090000
|
|
NI IOOLD+1,X'FD' . TURN OFF WAIT BIT 15100000
|
|
L 6,=A(UCBTABLE) . GET POINTER TO UCB TABLE 15110000
|
|
IOCOMP CLC 2(2,6),IOOLD+2 . COMPARE DEVICE AND CHANNEL 15120000
|
|
BE IODEVFND . IF EQUAL, REG 6 INDICATES PTR 15130000
|
|
LA 6,UCBLENG(6) . INCREMENT TO NEXT ENTRY 15140000
|
|
C 6,=A(UCBTBEND) . ARE WE AT END OF TABLE? 15150000
|
|
BNE IOCOMP . IF NOT DONE, TRY NEXT UCB 15160000
|
|
B IOBACK . ELSE, IGNORE IT 15170000
|
|
USING UCB,6 . IT'S A UCB PTR 15180000
|
|
IODEVFND MVC UCBCSW(4),CSW . MOVE IN THE NEW CSW 15190000
|
|
L 7,CSW+4 . GET STATUS BYTE 15200000
|
|
O 7,UCBCSW+4 . OR IN NEW STATUS INFORMATION 15210000
|
|
ST 7,UCBCSW+4 . AND STORE IT BACK 15220000
|
|
MVC UCBCSW+6(2),CSW+6 . MOVE IN BYTE COUNT 15230000
|
|
LA 2,UCBWS 15240000
|
|
CLI UCBFPR,X'00' . IS FAST PROCESSING 15250000
|
|
BE IONOFPR . REQUIRED? IF NOT, RETURN 15260000
|
|
L 15,RUNNING . IF SO, STOP GUY NOW RUNNING 15270000
|
|
USING PCB,15 15280000
|
|
CLI PCBBLOKT,X'FF' . IS ANYONE REALLY RUNNING? 15290000
|
|
BE IOWAIT . IF NOT, START UP SLEEPER 15300000
|
|
LA 13,PCBISA . IF SO, STOP RUNNING PROCESS 15310000
|
|
USING SA,13 15320000
|
|
MVC SAPSW,IOOLD . SAVE PROCESS WHICH WAS 15330000
|
|
MVC SAREGS,IOHSAVE . INTERRUPTED 15340000
|
|
DROP 13,15 15350000
|
|
IOWAIT MVI NEXTTRYM,X'00' . MAKE NEXTTRY NOT MODIFIED 15360000
|
|
SVC C'V' . SO CAN FAST PROCESS SLEEPER 15370000
|
|
SVC C'.' . GO PROCESS IT RIGHT AWAY 15380000
|
|
IONOFPR SVC C'V' . AND WAKE UP THE SLEEPER 15390000
|
|
IOBACK LM 0,15,IOHSAVE . RELOAD OUR REGISTERS 15400000
|
|
LPSW IOOLD . AND STEALTHILY RETURN 15410000
|
|
DROP 1,6 15420000
|
|
EJECT 15430000
|
|
*********************************************************************** 15440000
|
|
* * 15450000
|
|
* IPL ENTERED ROUTINE * 15460000
|
|
* * 15470000
|
|
* FUNCTION: TO INITIALIZE SYSTEM PARAMETERS, SET STORAGE KEYS, * 15480000
|
|
* AND CREATE MULTIPLE JOB STREAMS. * 15490000
|
|
* * 15500000
|
|
*********************************************************************** 15510000
|
|
SPACE 1 15520000
|
|
IPLRTN EQU * . THE IPL-ENTERED ROUTINE 15530000
|
|
BALR 1,0 15540000
|
|
USING *,1 . ESTABLISH ADDRESSING 15550000
|
|
MVC IONEW+5(3),SOSIONEW activate IO handler 15553002
|
|
MVC EXTNEW+5(3),IPLEXNEW ignore external interrupts for now 15556002
|
|
LA 15,IPLPCB . I'M RUNNING 15560000
|
|
ST 15,RUNNING . INITIALIZE 'RUNNING' 15570000
|
|
ST 15,NEXTTRY . INITIALIZE 'NEXTTRY' 15580000
|
|
MVC VERYEND,=A(0,CORESIZE-(VERYEND-PROGRAM)) FREE CORE 15590000
|
|
LA 3,8 . SET ZERO KEY AND FETCH PROTECT 15600000
|
|
L 2,CORESIZ . START PAST THE LAST BLOCK 15610000
|
|
IPLCL S 2,PAGESIZE . get the previous block, page aligned 15620002
|
|
BM IPLTH . IF NEGATIVE, WE'RE THROUGH HERE 15630000
|
|
* SSKE 3,2 . else set the storage key to 15640002
|
|
DC X'B22B0032' Assembler (XF) doesn't support SSKE 15643002
|
|
B IPLCL . ZERO, AND WORK BACKWARDS 15650000
|
|
IPLTH SR 4,4 . INDEX IN TABLES FOR INPUT STREAM 15660000
|
|
L 5,STREAMS . HOW MANY STREAMS? 15670000
|
|
IPLLOOP LA 2,IPLAPCBS . READY TO ALLOCATE A PCB 15680000
|
|
USING XAX,2 15690000
|
|
SVC C'A' . ALLOCATE 15700000
|
|
L 2,XAXADDR . GET THE ADDRESS 15710000
|
|
MVC 0(TYPLEN,2),TYPPCB .MAKE IT LOOK LIKE A PCB 15720000
|
|
SVC C'I' . CHAIN IT ON 15730000
|
|
USING PCB,2 15740000
|
|
ST 2,PCBNPTG . BUT PUT IT IN A GROUP BY ITSELF 15750000
|
|
ST 2,PCBLPTG 15760000
|
|
DROP 2 15770000
|
|
USING PCB,15 15780000
|
|
ST 15,PCBLPTG . LIKEWISE FOR THE IPL PCB 15790000
|
|
ST 15,PCBNPTG 15800000
|
|
DROP 15 15810000
|
|
USING PCB,2 15820000
|
|
LA 8,PCBISA . GET THE NEW PCB'S ISA 15830000
|
|
USING SA,8 15840000
|
|
LA 9,SAREGS . ABOUT TO FIX INIT REGS 15850000
|
|
USING REGS,9 15860000
|
|
LA 10,UCBTAB 15870000
|
|
AR 10,4 15880000
|
|
MVC REG3,0(10) . REG3 -> (RDRUCB,PRTUCB) 15890000
|
|
MVC REG4,KEYTAB-UCBTAB(10) . REG4 = KEY 15900000
|
|
DROP 9 15910000
|
|
LA 4,4(4) . GO TO NEXT JOB STREAM 15920000
|
|
BCT 5,IPLLOOP . DO FOR EACH STREAM 15930000
|
|
MVC EXTNEW+5(3),SOSEXNEW reactivate ext interrupt handler 15935002
|
|
SVC C'.' . THEN ENTER TRAFFIC CONTROLLER 15940000
|
|
SPACE 1 15950000
|
|
STREAMS DC F'4' . NUMBER OF STREAMS 15960002
|
|
SPACE 1 15970000
|
|
UCBTAB EQU * . TABLE OF PTRS TO UCB BLOCKS 15980000
|
|
DC A(UCBLP1) 15990000
|
|
DC A(UCBLP2) 16000000
|
|
DC A(UCBLP3) 16003002
|
|
DC A(UCBLP4) 16006002
|
|
SPACE 1 16010000
|
|
KEYTAB EQU * . TABLE OF PROTECTION KEYS 16020000
|
|
DC X'00100000' storage key for stream 1 region 16030002
|
|
DC X'00200000' storage key for stream 2 region 16034002
|
|
DC X'00300000' storage key for stream 3 region 16038002
|
|
DC X'00400000' storage key for stream 4 region 16042002
|
|
SPACE 1 16050000
|
|
UCBLP1 DC A(UCBRDR1,UCBPRT1) 16060000
|
|
UCBLP2 DC A(UCBRDR2,UCBPRT2) 16070000
|
|
UCBLP3 DC A(UCBRDR3,UCBPRT3) 16073002
|
|
UCBLP4 DC A(UCBRDR4,UCBPRT4) 16076002
|
|
SPACE 1 16080000
|
|
DS 0D 16090000
|
|
IPLPCB DC CL8' ' . IPL ROUTINE PCB 16100000
|
|
DC 4A(IPLPCB) 16110000
|
|
DC X'FF000000' . INITIALIZED FLAGS 16120000
|
|
DC F'1,0' 16130000
|
|
DC 5F'0,0' 16140000
|
|
DC X'0002000000000000' 16150000
|
|
DS CL76 16160000
|
|
DS CL84 16170000
|
|
DS CL84 16180000
|
|
SPACE 1 16190000
|
|
IPLAPCBS DC A(LENPCB) . ALLOC LIST FOR PCB'S 16200000
|
|
DC A(0) 16210000
|
|
DC F'8' 16220000
|
|
CORESIZ DC A(CORESIZE) . BYTES OF CORE IN OBJECT MACHINE 16230000
|
|
SPACE 1 16240000
|
|
DS 0D 16250000
|
|
TYPPCB DC CL8'*IBSUP' . A TEMPLATE *IBSUP PCB 16260000
|
|
DC 4A(0) 16270000
|
|
TEMPLATE DC X'00000000' . INITIALIZED FLAGS 16280000
|
|
DC F'1,0' 16290000
|
|
DC 5F'0,0' 16300000
|
|
DC X'FF00000000',AL3(JSP) 16310000
|
|
TYPLEN EQU *-TYPPCB 16320000
|
|
EXINTRPT LPSW EXTOLD ignore external interrupts 16321002
|
|
DS 0F align 16322002
|
|
DC X'00' filler 16323002
|
|
SOSIONEW DC AL3(IOHANDL) sample OS IO new PSW instruction addr 16324002
|
|
DC X'00' filler 16325002
|
|
SOSEXNEW DC AL3(EXTHANDL) sample OS ext new PSW instruction addr 16326002
|
|
DC X'00' filler 16327002
|
|
IPLEXNEW DC AL3(EXINTRPT) IPLRTN ext new PSW instruction addr 16328002
|
|
EJECT 16330000
|
|
*********************************************************************** 16340000
|
|
* * 16350000
|
|
* JOB STREAM PROCESSOR * 16360000
|
|
* * 16370000
|
|
*********************************************************************** 16380000
|
|
SPACE 1 16390000
|
|
JSP EQU * . THE JOB STREAM PROCESSOR 16400000
|
|
BALR 1,0 . (PROCESS *IBSUP) 16410000
|
|
USING *,1 . ESTABLISH ADDRESSING 16420000
|
|
LA 2,JSPSUSEM . LOCK OURSELVES UNTIL 16430000
|
|
SVC C'P' . WE CAN ALLOCATE STORAGE 16440000
|
|
LA 2,JSPAAS . READY TO ALLOCATE 16450000
|
|
USING XAX,2 16460000
|
|
SVC C'E' . ALLOCATE 16470000
|
|
L 12,XAXADDR . PTR TO AUTO AREA 16480000
|
|
DROP 2 16490000
|
|
USING JSPAS,12 . USE FOR ADDRESSING 16500000
|
|
LA 2,JSPSUSEM . UNLOCK OURSELVES 16510000
|
|
SVC C'V' 16520000
|
|
MVC TREAD+0(8),=CL8'*IN' . INITIALIZE VALUES IN AUTOMATIC 16530000
|
|
MVC TREAD+8(4),=F'8' . STORAGE 16540000
|
|
MVC TREAD+12(4),=C'READ' 16550000
|
|
LA 2,CARD 16560000
|
|
ST 2,ACARD 16570000
|
|
MVC USERL+0(8),=CL8'USERPROG' 16580000
|
|
MVC WRITE(12),SKIP 16590000
|
|
MVC WRITE+12(4),=C'PRIN' 16600000
|
|
LA 5,LINE 16610000
|
|
ST 5,WRITE+16 16620000
|
|
MVC CORE+8(4),PAGESIZE align to page boundary 16630002
|
|
MVC TALK+0(8),=CL8'USERPROG' 16640000
|
|
MVC TALK+8(4),=F'12' 16650000
|
|
MVC ANYBACK+8(4),=F'1' 16660000
|
|
MVC RLDTEMP,=A(0) 16670000
|
|
ST 4,KEY . STORE KEY 16680000
|
|
LR 5,3 . GET PTR TO UCB PTR BLOCK 16690000
|
|
L 3,0(5) . GET READER POINTER 16700000
|
|
LA 2,INSEQ . READY TO CREATE & START *IN 16710000
|
|
SVC C'C' . CREATE 16720000
|
|
SVC C'Y' . START 16730000
|
|
L 3,4(5) . GET PTR TO PRINTER UCB 16740000
|
|
LA 2,OUTSEQ . READY TO CREATE & START *OUT 16750000
|
|
SVC C'C' . CREATE 16760000
|
|
SVC C'Y' . START 16770000
|
|
SPACE 1 16780000
|
|
LOOP LA 2,TREAD . READT TO READ A CARD 16790000
|
|
SVC C'S' . START TO READ 16800000
|
|
MVC RREPLY1,=F'132' . 132 CHARS FOR REPLY 16810000
|
|
LA 2,RREPLY 16820000
|
|
SVC C'R' . LISTEN FOR REPLY 16830000
|
|
CLC REPLY(2),=C'OK' . IS REPLY 'OK'? 16840000
|
|
BNE STOP . IF NOT, STOP 16850000
|
|
CLC =C'$JOB,',CARD . HAVE WE A JOB CARD? 16860000
|
|
BE JOB . GOOD! 16870000
|
|
B LOOP . ELSE LOOP 16880000
|
|
STOP LA 2,JSPNEVER . WAIT FOR A "V" OPERATION 16890000
|
|
SVC C'P' . THAT NEVER COMES 16900000
|
|
SPACE 1 16910000
|
|
JOB MVI LOADED,X'00' . REMEMBER NOT LOADED 16920000
|
|
MVC LINE,=CL8' ' . CLEAR A LINE, PUT IN 16930000
|
|
MVC LINE+8(124),LINE+7 .ALL BLANKS 16940000
|
|
MVC LINE(80),CARD . GET READY TO SEND $JOB CARD 16950000
|
|
LA 2,WRITE . TO PRINTER 16960000
|
|
SVC C'S' . SEND IT 16970000
|
|
LA 2,RREPLY 16980000
|
|
SVC C'R' . AND WAIT FOR REPLY 16990000
|
|
LA 2,USERL . CREATE USERPROG 17000000
|
|
SVC C'C' 17010000
|
|
LA 4,CARD+4 . START TO SCAN CARD 17020000
|
|
BAL 3,SCAN . GET NEXT TOKEN 17030000
|
|
BCTR 5,0 . less one to remove K 17040002
|
|
O 5,COREPKLN . length of packed size for execute 17049002
|
|
EX 5,COREPACK . pack core digits 17058002
|
|
CVB 8,COREPCKD . convert core requested to binary 17067002
|
|
SR 9,9 . is core .. 17076002
|
|
SRDL 8,2 . .. modulo four .. 17085002
|
|
LTR 9,9 . .. equal zero? 17094002
|
|
BZ COREOK . -> yes, use it 17103002
|
|
LA 8,1(,8) . -> no, up one page 17112002
|
|
COREOK SLL 8,12 . core bytes, rounded up to full pages 17121002
|
|
ST 8,CORE . remember core requirement 17130002
|
|
ASGNUNIT BAL 3,SCAN . GET NEXT TOKEN 17150000
|
|
CLI 0(4),C'=' . IS IT AN '='? 17160000
|
|
BNE LOAD . IF NOT, LOAD IN THE OBJECT DECK 17170000
|
|
CLI 0(9),C'*' . HAS USER NAMED IT STARTING 17180000
|
|
BE EXPUNGE . WITH '*'? IF SO, THROW HIM OUT 17190000
|
|
LA 2,SEQ . ELSE CREATE A PROCESS 17200000
|
|
MVC SEQ,=CL8' ' . BLANK OUT THE NAME 17210000
|
|
EX 5,UNAMMOV . THEN MOVE THE RELEVANT 17220000
|
|
SVC C'C' . CHARACTERS AND CREATE 17230000
|
|
LA 2,SEQ . WE'LL START IT IN A MOMENT 17240000
|
|
BAL 3,SCAN . SCAN AGAIN 17250000
|
|
EX 5,CMPIN . IS IT 'IN'? 17260000
|
|
BE ASIN . IF SO, ASSIGN IT AS IN 17270000
|
|
EX 5,CMPOUT . IF IT'S 'OUT' 17280000
|
|
BE ASOUT . ASSIGN IT AS OUT 17290000
|
|
EX 5,CMPEXCP . IS IT 'EXCP'? 17300000
|
|
BE ASEXCP . IF SO, ASSIGN IT AS EXCP 17310000
|
|
B EXPUNGE . ERROR: GO ON TO NEXT JOB 17320000
|
|
UNAMMOV MVC SEQ(0),0(9) . MOVE THE UNIT'S PROCESS NAME 17330000
|
|
CMPIN CLC 0(0,9),=C'IN ' . DOES IT SAY 'IN'? 17340000
|
|
CMPOUT CLC 0(0,9),=C'OUT ' . DOES IT SAY 'OUT'? 17350000
|
|
CMPEXCP CLC 0(0,9),=C'EXCP ' . DOES IT SAY 'EXCP'? 17360000
|
|
SPACE 1 17370000
|
|
ASIN LA 11,=CL8'*IN' . POINT TO NAME OF READER HANDLER 17380000
|
|
SETDIM MVC UNITRTN,=A(DIM) . USE DIM AS THE INTERFACE 17390000
|
|
SVC C'Y' 17400000
|
|
B ASGNUNIT 17410000
|
|
ASOUT LA 11,=CL8'*OUT' . POINT TO NAME OF PRINTER HANDLER 17420000
|
|
B SETDIM 17430000
|
|
ASEXCP MVC UNITRTN,=A(EXCPHNDL) . USE FOR USER SUPPLIED 17440000
|
|
L 11,KEY 17450000
|
|
SVC C'Y' . I/O ROUTINE 17460000
|
|
B ASGNUNIT 17470000
|
|
SPACE 1 17480000
|
|
LOAD LA 2,CORE . READY TO ALLOCATE THE REGION 17490000
|
|
SVC C'A' . AND ALLOCATE IT 17500000
|
|
MVI LOADED,X'FF' . REMEMBER THAT WE'RE LOADED 17510000
|
|
L 9,CORE+4 . GET THE FIRST ADDRESS 17520000
|
|
L 4,KEY . GET THE KEY 17530000
|
|
SRL 4,16 17540000
|
|
O 4,FETCHPRT fetch protected 17545002
|
|
LR 3,9 . GET THE BLOCK FOLLOWING OURS 17550000
|
|
AR 3,8 17560000
|
|
LOADSK S 3,PAGESIZE . get the previous block, page aligned 17570002
|
|
CR 3,9 . HAVE WE PASSED THE START? 17580000
|
|
BL LOADLOOP . IF SO, START LOADING 17590000
|
|
* SSKE 4,3 . else set this block to the key 17600002
|
|
DC X'B22B0043' Assembler (XF) doesn't support SSKE 17603002
|
|
B LOADSK . AND BRANCH BACK 17610000
|
|
LOADLOOP LA 2,TREAD . READ IN OBJECT DECK 17620000
|
|
SVC C'S' . GET A CARD A'READING 17630000
|
|
MVC RREPLY1,=F'132' 17640000
|
|
LA 2,RREPLY 17650000
|
|
SVC C'R' . WAIT FOR ANSWER 17660000
|
|
CLC CARD+1(3),=C'TXT' . IS IT A TXT CARD? 17670000
|
|
BE TXTCARD 17680000
|
|
CLC CARD+1(3),=C'RLD' . IS IT A RLD CARD? 17690000
|
|
BE RLDCARD 17700000
|
|
CLC CARD+1(3),=C'END' . IS IT AN END CARD? 17710000
|
|
BE ENDCARD 17720000
|
|
B LOADLOOP . IF NONE, IGNORE. 17730000
|
|
SPACE 1 17740000
|
|
TXTCARD L 10,CARD+4 . GET THE RELATIVE ADDRESS 17750000
|
|
AR 10,9 . PLUS THE ABSOLUTE ADDRESS 17760000
|
|
LH 11,CARD+10 . GET THE COUNT, 17770000
|
|
BCTR 11,0 . DECREMENTED 17780000
|
|
EX 11,TXTMOV . AND MOVE THE TEXT 17790000
|
|
B LOADLOOP . AND READ ANOTHER CARD! OH WOW! 17800000
|
|
TXTMOV MVC 0(0,10),CARD+16 17810000
|
|
SPACE 1 17820000
|
|
RLDCARD LH 11,CARD+10 . GET THE BYTE COUNT 17830000
|
|
LA 13,CARD+20 . AND AN INDEX INTO THE CARD 17840000
|
|
RLDLOOP L 10,0(13) . GET THE LOCATION TO BE RLD'D 17850000
|
|
AR 10,9 . GET THE ABSOLUTE ADDRESS 17860000
|
|
TM 3(13),X'03' . IS IT A FULLWORD? 17870000
|
|
BNZ NOTALGND . IF NO, HANDLE AS THREE BYTES 17880000
|
|
L 7,0(10) . GET THAT WORD (HAD BETTER BE 17890000
|
|
AR 7,9 . ONE); ADD THE RELOCATION 17900000
|
|
ST 7,0(10) . ADDRESS, AND STORE IT BACK 17910000
|
|
RLDCONT TM 0(13),X'01' . CHECK IF LONG OR SHORT FIELD 17920000
|
|
BNZ SHORT . AND BRANCH ACCORDINGLY 17930000
|
|
LA 4,8 . SKIP EIGHT BYTES 17940000
|
|
B RLDFINI 17950000
|
|
SHORT LA 4,4 . SKIP FOUR BYTES 17960000
|
|
RLDFINI AR 13,4 . INCREMENT THE CARD INDEX 17970000
|
|
SR 11,4 . DECREMENT THE BYTE COUNT 17980000
|
|
BP RLDLOOP . AND TRY AGAIN 17990000
|
|
B LOADLOOP . OR READ ANOTHER CARD 18000000
|
|
NOTALGND MVC RLDTEMP+1(3),0(10) . PUT ADDRESS HERE 18010000
|
|
L 7,RLDTEMP . RELOCATE IT 18020000
|
|
AR 7,9 18030000
|
|
ST 7,RLDTEMP . AND PUT IT BACK TO 18040000
|
|
MVC 0(3,10),RLDTEMP+1 . WHERE IT BELONGS 18050000
|
|
NI RLDTEMP,X'00' . CLEAR OUT TEMPORARY 18060000
|
|
B RLDCONT . AND LOOP BACK 18070000
|
|
SPACE 1 18080000
|
|
ENDCARD LA 2,USERL . FIND THE PCB FOR USERPROG 18090000
|
|
SVC C'N' 18100000
|
|
L 4,USERL+8 . GET THE ADDRESS 18110000
|
|
USING PCB,4 18120000
|
|
MVI PCBBLOKT,X'FF' . TEMPORARILY BLOCK IT 18130000
|
|
ST 9,USERL+8 . STORE THE BEGINNING ADDRESS 18140000
|
|
SVC C'Y' . THEN START IT 18150000
|
|
L 5,KEY . GET THE KEY 18160000
|
|
O 5,PCBISA+0 . THEN OR THIS INTO THE 18170000
|
|
ST 5,PCBISA+0 . FIRST WORD OF THE PCB 18180000
|
|
OI PCBISA+1,X'01' . OR IN A 'PROGRAM STATE' BIT 18190000
|
|
MVI PCBBLOKT,X'00' . AND THEN UNBLOCK IT 18200000
|
|
DROP 4 18210000
|
|
LA 2,TALK . LISTEN TO WHAT IT SAYS 18220000
|
|
SVC C'R' 18230000
|
|
SPACE 1 18240000
|
|
MVC LINE(8),=CL8' ' . IF JOB FINISHED, CLEAR A LINE 18250000
|
|
MVC LINE+8(124),LINE+7 18260000
|
|
MVC LINE(12),TALK+12 . MOVE THE MESSAGE ONTO THE LINE 18270000
|
|
LA 2,WRITE . AND SAY TO WRITE IT 18280000
|
|
SVC C'S' 18290000
|
|
LA 2,ANYBACK 18300000
|
|
SVC C'R' 18310000
|
|
LA 2,SKIP . SKIP TO THE TOP OF THE NEXT PAGE 18320000
|
|
SVC C'S' 18330000
|
|
LA 2,ANYBACK 18340000
|
|
SVC C'R' 18350000
|
|
SPACE 1 18360000
|
|
EXPUNGE L 5,RUNNING . EXPUNGE A JOB: LOOK AT ALL PCBS 18370000
|
|
LA 2,SEQ 18380000
|
|
USING PCB,5 18390000
|
|
EXPLOOP MVC SEQ(8),PCBNAME . GET THE PROCESS NAME 18400000
|
|
L 4,PCBNPTG . GET THE NEXT PTR 18410000
|
|
CLI SEQ+0,C'*' . IS IT A '*' PROCESS? 18420000
|
|
BE EXPNXT . IF SO, SKIP OVER 18430000
|
|
SVC C'Z' . ELSE STOP IT 18440000
|
|
SVC C'D' . AND DESTROY IT 18450000
|
|
EXPNXT LR 5,4 . GO TO THE NEXT PCB 18460000
|
|
C 5,RUNNING . ARE WE THROUGH? 18470000
|
|
BNE EXPLOOP . IF NOT, LOOP AGAIN 18480000
|
|
CLI LOADED,X'00' . WAS CORE ALLOCATED? 18490000
|
|
BE LOOP . IF NOT, GO READ THE NEXT $JOB CARD 18500000
|
|
LA 4,8 . set zero key and fetch protect 18510002
|
|
LR 3,9 . AND A POINTER TO THE NEXT 18520000
|
|
AR 3,8 . BLOCK AFTER OURS 18530000
|
|
LOADCL S 3,PAGESIZE . get the previous block, page aligned 18540002
|
|
CR 3,9 . ARE WE THROUGH? 18550000
|
|
BL LOADD . IF SO, GO FREE CORE 18560000
|
|
* SSKE 4,3 . else clear storage key 18570002
|
|
DC X'B22B0043' Assembler (XF) doesn't support SSKE 18573002
|
|
B LOADCL . AND LOOP BACK 18580000
|
|
LOADD LA 2,CORE 18590000
|
|
SVC C'F' . FREE THE STORAGE 18600000
|
|
B LOOP . READ ANOTHER $JOB CARD 18610000
|
|
SPACE 1 18620000
|
|
SCAN SR 5,5 . START THE TOKEN COUNT AT ZERO 18630000
|
|
SCANLOOP LA 4,1(4) . GO TO NEXT CHARACTER 18640000
|
|
CLI 0(4),C',' . DO WE HAVE A DELIMITER? IF SO, 18650000
|
|
BE TOKSTART 18660000
|
|
CLI 0(4),C'=' . DITTO 18670000
|
|
BE TOKSTART 18680000
|
|
CLI 0(4),C' ' . DITTO 18690000
|
|
BE TOKSTART 18700000
|
|
LA 5,1(5) . AND UP COUNT 18710000
|
|
B SCANLOOP . AND LOOP 18720000
|
|
TOKSTART LR 9,4 . SET REG9 TO START 18730000
|
|
SR 9,5 . OF THIS TOKEN 18740000
|
|
BCTR 5,0 . LESS ONE FOR EXECUTE INSTRUCTION 18750000
|
|
BR 3 18760000
|
|
SPACE 2 18770000
|
|
JSPNEVER DC F'0,0' . A GOOD WAY TO DIE: P(JSPNEVER) 18780000
|
|
SKIP DC CL8'*OUT' . MESSAGE BLOCK FOR A NEW PAGE 18790000
|
|
DC F'8' 18800000
|
|
DC CL4'STC1' 18810000
|
|
INSEQ DC CL8'*IN' . SEQ TO CREATE & START *IN 18820000
|
|
DC A(RDRHANDL) 18830000
|
|
OUTSEQ DC CL8'*OUT' . SEQ TO CREATE & START *OUT 18840000
|
|
DC A(PRTHANDL) 18850000
|
|
COREPACK PACK COREPCKD(1),0(1,9) . executed to pack core size req'd 18860002
|
|
COREPCKD DS D . packed core requirement goes here 18880002
|
|
COREPKLN DC X'00000070' . length of packed size for execute 18900002
|
|
PAGESIZE DC F'4096' . page size for core computation 18920002
|
|
JSPSUSEM DC F'1,0' . SEMAPHORE TO LOCK ROUTINE 18990000
|
|
JSPAAS DC A(LENJSPAS) . ALLOCATE LIST FOR AUTO STORAGE 19000000
|
|
DS A 19010000
|
|
FETCHPRT DC F'8' reused to or in fetch protection 19020002
|
|
EJECT 19030000
|
|
*********************************************************************** 19040000
|
|
* * 19050000
|
|
* DEVICE INTERFACE MODULE * 19060000
|
|
* * 19070000
|
|
* FUNCTION: TO INTERFACE BETWEEN USERPROG AND DEVICE HANDLER * 19080000
|
|
* DATABASES: NONE * 19090000
|
|
* ROUTINES USED: XA, XP, XV, XR, XS * 19100000
|
|
* PROCEDURE: ALLOCATE AUTOMATIC STORAGE; START TO READ MESSAGE * 19110000
|
|
* FROM USER; SEND MESSAGE TO DEVICE HANDLER; * 19120000
|
|
* CONTINUE LOOPING, SENDING MESSAGES FROM USER TO * 19130000
|
|
* DEVICE HANDLER AND BACK. * 19140000
|
|
* ERROR CHECKS: NONE * 19150000
|
|
* INTERRUPTS: ON * 19160000
|
|
* USER ACCESS: YES * 19170000
|
|
* * 19180000
|
|
*********************************************************************** 19190000
|
|
SPACE 1 19200000
|
|
DIM EQU * . THE DEVICE INTERFACE MODULE 19210000
|
|
BALR 1,0 19220000
|
|
USING *,1 . ESTABLISH ADDRESSING 19230000
|
|
LA 2,DIMSEM . LOCK UNTIL GET STORAGE 19240000
|
|
SVC C'P' 19250000
|
|
LA 2,DIMAAS . READY TO ALLOCATE STORAGE 19260000
|
|
USING XAX,2 19270000
|
|
SVC C'E' . DO IT 19280000
|
|
L 12,XAXADDR . GET THE ADDRESS 19290000
|
|
DROP 2 19300000
|
|
LA 2,DIMSEM . UNLOCK OURSELVES 19310000
|
|
SVC C'V' 19320000
|
|
USING DIMAS,12 . USE 12 FOR AUTO STORAGE 19330000
|
|
MVC DIMLMS,0(11) . MOVE NAME OF RECIEVER 19340000
|
|
LA 8,132 . REG 8 = SIZE OF MESSAGE 19350000
|
|
DIMLOOP ST 8,DIMMSG+8 . GET READY TO READ A MESSAGE 19360000
|
|
LA 2,DIMMSG 19370000
|
|
SVC C'R' . READ 19380000
|
|
MVC DIMTEMP,DIMMSG . SAVE SENDER NAME 19390000
|
|
MVC DIMMSG,DIMLMS . SEND IT BACK TO THE LAST GUY 19400000
|
|
SVC C'S' . SEND IT 19410000
|
|
MVC DIMLMS,DIMTEMP . AND REMEMBER WHO TO SEND TO NEXT 19420000
|
|
B DIMLOOP . RELOOP 19430000
|
|
DIMSEM DC F'1,0' . SEMAPHORE FOR ENTRY 19440000
|
|
DIMAAS DC A(DIMLEN) . ALLOCATE SEQ FOR AUTO STORAGE 19450000
|
|
DC A(0) 19460000
|
|
DC F'8' 19470000
|
|
DROP 12 19480000
|
|
EJECT 19490000
|
|
LTORG 19500000
|
|
VERYEND DS 6D . beginning of free storage 19510004
|
|
LOADER DS 0D IPL loader goes here 19521002
|
|
EJECT 19521203
|
|
R0 EQU 0 19521502
|
|
R1 EQU 1 19522002
|
|
R2 EQU 2 19522502
|
|
R3 EQU 3 19523002
|
|
R4 EQU 4 19523502
|
|
R5 EQU 5 19524002
|
|
R6 EQU 6 19524502
|
|
R7 EQU 7 19525002
|
|
R8 EQU 8 19525502
|
|
R9 EQU 9 19526002
|
|
R10 EQU 10 19526502
|
|
R11 EQU 11 19527002
|
|
R12 EQU 12 19527502
|
|
R13 EQU 13 19528002
|
|
R14 EQU 14 19528502
|
|
R15 EQU 15 19529002
|
|
*********************************************************************** 19530000
|
|
* * 19540000
|
|
* DATABASE DEFINITIONS * 19550000
|
|
* * 19560000
|
|
*********************************************************************** 19570000
|
|
SPACE 1 19580000
|
|
PCB DSECT . PROCESS CONTROL BLOCK DEFINITION 19590000
|
|
PCBNAME DS CL8 . NAME 19600000
|
|
PCBNPTG DS F . NEXT POINTER THIS GROUP 19610000
|
|
PCBLPTG DS F . LAST POINTER THIS GROUP 19620000
|
|
PCBNPALL DS F . NEXT POINTER ALL 19630000
|
|
PCBLPALL DS F . LAST POINTER ALL 19640000
|
|
PCBSTOPT DS C . STOPPED 19650000
|
|
PCBBLOKT DS C . BLOCKED 19660000
|
|
PCBINSMC DS C . IN SMC 19670000
|
|
PCBSW DS C . STOP WAITING 19680000
|
|
PCBMSC DS CL8 . MESSAGE SEMAPHORE COMMON 19690000
|
|
PCBMSR DS CL8 . MESSAGE SEMAPHORE RECEIVER 19700000
|
|
PCBFM DS F . FIRST MESSAGE 19710000
|
|
PCBNSW DS F . NEXT SEMAPHORE WAITER 19720000
|
|
PCBSRS DS CL8 . STOPPER SEMAPHORE 19730000
|
|
PCBSES DS CL8 . STOPPEE SEMAPHORE 19740000
|
|
PCBASIZE DS F . AUTOMATIC STORAGE SIZE 19750000
|
|
PCBAADDR DS A . AUTOMATIC STORAGE ADDRESS 19760000
|
|
PCBISA DS CL84 . INTERRUPT SAVE AREA 19770000
|
|
PCBFSA DS CL84 . FAULT SAVE AREA 19780000
|
|
PCBMSA DS CL84 . MEMORY SAVE AREA 19790000
|
|
DS 0D . (ALIGN) 19800000
|
|
LENPCB EQU *-PCB . (LENGTH) 19810000
|
|
SPACE 1 19820000
|
|
SA DSECT . SAVE AREA DEFINITION 19830000
|
|
SAPSW DS D . PROGRAM STATUS WORD 19840000
|
|
SAREGS DS CL64 . REGISTERS 19850000
|
|
SATEMP DS CL12 . TEMPORARIES 19860000
|
|
SPACE 1 19870000
|
|
REGS DSECT . REGISTER DEFINITION 19880000
|
|
REG0 DS F . REGISTER 0 19890000
|
|
REG1 DS F . REGISTER 1 19900000
|
|
REG2 DS F . REGISTER 2 19910000
|
|
REG3 DS F . REGISTER 3 19920000
|
|
REG4 DS F . REGISTER 4 19930000
|
|
REG5 DS F . REGISTER 5 19940000
|
|
REG6 DS F . REGISTER 6 19950000
|
|
REG7 DS F . REGISTER 7 19960000
|
|
REG8 DS F . REGISTER 8 19970000
|
|
REG9 DS F . REGISTER 9 19980000
|
|
REG10 DS F . REGISTER 10 19990000
|
|
REG11 DS F . REGISTER 11 20000000
|
|
REG12 DS F . REGISTER 12 20010000
|
|
REG13 DS F . REGISTER 13 20020000
|
|
REG14 DS F . REGISTER 14 20030000
|
|
REG15 DS F . REGISTER 15 20040000
|
|
SPACE 1 20050000
|
|
FSB DSECT . FREE STORAGE BLOCK DEFINITIONS 20060000
|
|
FSBNEXT DS A . NEXT 20070000
|
|
FSBSIZE DS F . SIZE 20080000
|
|
SPACE 1 20090000
|
|
SM DSECT . SEMAPHORE DEFINITION 20100000
|
|
SMVAL DS F . VALUE 20110000
|
|
SMPTR DS F . PTR 20120000
|
|
SPACE 1 20130000
|
|
MSG DSECT . MESSAGE DEFINITION 20140000
|
|
MSGSENDR DS A . POINTER TO SENDER'S PCB 20150000
|
|
MSGNEXT DS A . NEXT 20160000
|
|
MSGSIZE DS F . SIZE 20170000
|
|
MSGTEXT DS 0C . TEXT 20180000
|
|
LENMSG EQU *-MSG . (LENGTH) 20190000
|
|
SPACE 1 20200000
|
|
XAX DSECT . XA ARGUMENT LIST 20210000
|
|
XAXSIZE DS F . SIZE 20220000
|
|
XAXADDR DS F . ADDRESS 20230000
|
|
XAXALGN DS F . ALIGNMENT 20240000
|
|
SPACE 1 20250000
|
|
XFX DSECT . XF ARGUMENT LIST 20260000
|
|
XFXSIZE DS F . SIZE 20270000
|
|
XFXADDR DS F . ADDRESS 20280000
|
|
SPACE 1 20290000
|
|
XBX DSECT . XB ARGUMENT LIST 20300000
|
|
XBXSIZE DS F . SIZE 20310000
|
|
XBXADDR DS F . ADDRESS 20320000
|
|
SPACE 1 20330000
|
|
XCX DSECT . XC ARGUMENT LIST 20340000
|
|
XCXNAME DS CL8 . NAME 20350000
|
|
SPACE 1 20360000
|
|
XDX DSECT . AD ARGUMENT LIST 20370000
|
|
XDXNAME DS CL8 . NAME 20380000
|
|
SPACE 1 20390000
|
|
XNX DSECT . XN ARGUMENT LIST 20400000
|
|
XNXNAME DS CL8 . NAME 20410000
|
|
XNXADDR DS A . ADDRESS 20420000
|
|
SPACE 1 20430000
|
|
XRX DSECT . XR ARGUMENT LIST 20440000
|
|
XRXNAME DS CL8 . NAME 20450000
|
|
XRXSIZE DS F . SIZE 20460000
|
|
XRXTEXT DS 0C . TEXT 20470000
|
|
SPACE 1 20480000
|
|
XSX DSECT . XS ARGUMENT LIST 20490000
|
|
XSXNAME DS CL8 . NAME 20500000
|
|
XSXSIZE DS F . SIZE 20510000
|
|
XSXTEXT DS 0C . TEXT 20520000
|
|
SPACE 1 20530000
|
|
XYX DSECT . XY ARGUMENT LIST 20540000
|
|
XYXNAME DS CL8 . NAME 20550000
|
|
XYXADDR DS A . ADDR 20560000
|
|
SPACE 1 20570000
|
|
XZX DSECT . XZ ARGUMENT LIST 20580000
|
|
XZXNAME DS CL8 . NAME 20590000
|
|
SPACE 1 20600000
|
|
RDRHAS DSECT . READER HANDLER AUTOMATIC STORAGE 20610000
|
|
RDRHCCB DS 2F . CCB 20620000
|
|
RDRHMSG DS CL8 . MESSAGE BLOCK FOR REQUESTS 20630000
|
|
DS F'8' 20640000
|
|
DS CL8 20650000
|
|
RDRHTEMP DS CL80 . AREA FOR $JOB IN DATA STREAM 20660000
|
|
RDRHM DS CL8 . MESSAGE BLOCK FOR REPLY 20670000
|
|
DS F'2' 20680000
|
|
DS CL2 20690000
|
|
JOBBIT DS 1C 20700000
|
|
DS 0D 20710000
|
|
LENRDRHA EQU *-RDRHAS . (LENGTH) 20720000
|
|
SPACE 1 20730000
|
|
PRTHAS DSECT . PRINTER HANDLER AUTOMATIC STORAGE 20740000
|
|
PRTHCCB DS 2F . CCB 20750000
|
|
PRTHMSG DS CL8 . MESSAGE BLOCK FOR REQUESTS 20760000
|
|
DS F'2' 20770000
|
|
DS CL8 20780000
|
|
PRTHM DS CL8 . MESSAGE BLOCK FOR REPLY 20790000
|
|
DS F'2' 20800000
|
|
DS CL2 20810000
|
|
DS 0D 20820000
|
|
LENPRTHA EQU *-PRTHAS . (LENGTH) 20830000
|
|
SPACE 1 20840000
|
|
EXCPHAS DSECT . EXCP HANDLER AUTOMATIC STORAGE 20850000
|
|
EXCPHMSG DS CL8 . MESSAGE BLOCK FOR REQUESTS 20860000
|
|
DS F'12' 20870000
|
|
DS CL12 20880000
|
|
EXCPHM DS CL8 . MESSAGE BLOCK FOR REPLY 20890000
|
|
DS F'12' 20900000
|
|
DS CL12 20910000
|
|
DS 0D 20920000
|
|
LENEXCPA EQU *-EXCPHAS . (LENGTH) 20930000
|
|
SPACE 1 20940000
|
|
UCB DSECT . UNIT CONTROL BLOCK DEFINITION 20950000
|
|
UCBADDR DS F . ADDRESS 20960000
|
|
UCBUS DS FL8 . USER SEMAPHORE 20970000
|
|
UCBWS DS FL8 . WAITER SEMAPHORE 20980000
|
|
UCBCSW DS FL8 . CHANNEL STATUS WORD 20990000
|
|
UCBFPR DS CL1 . FAST PROCESSING REQUIRED 21000000
|
|
DS 0F 21010000
|
|
UCBLENG EQU *-UCB 21020000
|
|
SPACE 1 21030000
|
|
JSPAS DSECT . JSP AUTOMATIC STORAGE 21040000
|
|
LINE DS CL132 . PRINTED LINE 21050000
|
|
DS 0F 21060000
|
|
CARD DS CL80 . CARD READ 21070000
|
|
DS 0F 21080000
|
|
RREPLY DS CL8 . MESSAGE BLOCK FOR REPLIES 21090000
|
|
RREPLY1 DS F 21100000
|
|
REPLY DS CL132 21110000
|
|
TREAD DS 0F . MESSAGE BLOCK FOR READING 21120000
|
|
DS CL8'*IN' 21130000
|
|
DS F'8' 21140000
|
|
DS CL4'READ' 21150000
|
|
ACARD DS A(0) 21160000
|
|
WRITE DS CL8'*OUT' . MESSAGE BLOCK TO PRINT A LINE 21170000
|
|
DS F'8' 21180000
|
|
DS CL4'PRIN' 21190000
|
|
DS A(LINE) 21200000
|
|
KEY DS F 21210000
|
|
USERL DS CL8'USERPROG' . LIST FOR MANIPULATING USERPROG 21220000
|
|
DS F 21230000
|
|
SEQ DS CL8' ' . COMMON ARG LIST FOR I/O PROCESS 21240000
|
|
UNITRTN DS A 21250000
|
|
CORE DS F . MEMORY ALLOCATED AND FREE 21260000
|
|
DS F . SEQUENCE 21270000
|
|
DS F'4096' align to page boundary 21280002
|
|
RLDTEMP DS F 21290000
|
|
TALK DS CL8'USERPROG' . MESSAGE BLOCK FOR MESSAGE FROM 21300000
|
|
DS F'12' . USERPROG 21310000
|
|
DS CL12 21320000
|
|
ANYBACK DS CL8 . MESSAGE BLOCK FOR IGNORING MESS 21330000
|
|
DS F'1' 21340000
|
|
DS CL1 21350000
|
|
LOADED DS C . IS CORE ALLOCATED 21360000
|
|
DS 0D 21370000
|
|
LENJSPAS EQU *-JSPAS . (LENGTH) 21380000
|
|
SPACE 1 21390000
|
|
DIMAS DSECT . DEVICE INTERFACE MODULE STORAGE 21400000
|
|
DIMMSG DS CL8 . MESSAGE BLOCK 21410000
|
|
DS F'132' 21420000
|
|
DS CL132 21430000
|
|
DIMLMS DS CL8 . LAST MESSAGE SENDER 21440000
|
|
DIMTEMP DS CL8 . TEMPORARY 21450000
|
|
DS 0D 21460000
|
|
DIMLEN EQU *-DIMAS . (LENGTH) 21470000
|
|
END 21480000
|