|
|
DataMuseum.dkPresents historical artifacts from the history of: Philips Data Systems |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Philips Data Systems Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 81074 (0x13cb2)
Notes: pts_type(SC)
Names: »SYSLOD.SC«
└─⟦173d42e04⟧ Bits:30009663 Philips computer tape "600105"
└─⟦this⟧ »TOSSWORK/SYSLOD.SC«
└─⟦48601905a⟧ Bits:30009668 Philips computer tape "600121"
└─⟦this⟧ »M:DE10/SYSLOD.SC«
└─⟦d2a299635⟧ Bits:30009698 Philips computer tape "600415"
└─⟦this⟧ »M:DE10/SYSLOD.SC«
IDENT SYSLOD REL 10.0 80-03-15 870105041000 PRR 10.0 80-03-14 =3,CONDITIONAL ASSEMBLY FOR SYSLOD TEST PRR 10.0 80-01-18 =2,S:GTAB LIMITED TO ONE SECTOR PRR 10.0 79-12-20 =1,SEGBLK/PAGBLK NOT GEN. FOR CORE RES. SEGM. ENTRY SYSLOD ENTRY SYSBAS ENTRY NUMSEG ENTRY PRGLG1 *************************** * * * ENTRIES AND EXTERNALS * * * *************************** EXTRN CONVRT EXTRN LDALEN EXTRN SCTADA EXTRN SCTANO EXTRN SCTBUG EXTRN SCTEFA EXTRN SCTLAC EXTRN SCTLAP EXTRN SCTMMC EXTRN SCTMMP EXTRN SCTMSZ EXTRN SCTNOP EXTRN SCTNPE EXTRN SCTOPT EXTRN SCTIPL EXTRN SCTPSZ EXTRN SCTSFA EXTRN SCTSWB EJECT EXTRN SAVE01 EXTRN SAVE02 EXTRN SAVE03 EXTRN SAVE04 EXTRN SAVE05 EXTRN SAVE06 EXTRN SAVE07 EXTRN SAVE08 EXTRN SAVE09 EXTRN SAVE10 EXTRN SAVE11 EXTRN SAVE12 EXTRN SAVE13 EXTRN SAVE18 EXTRN SAVE20 EXTRN SAVE22 EXTRN SAVE25 EXTRN SAVE26 EXTRN SAVE27 EXTRN SAVE28 EXTRN SAVE29 EXTRN APPTYP EXTRN REL EXTRN ERROR EXTRN MMDDIV EXTRN M:REL EXTRN TABBE EXTRN MMEND EXTRN CMPADR EXTRN MOVE EXTRN TTB:MT DISPLACEMENT TO MMU TABLE IN TTAB EXTRN TTB:CB EJECT ******************************* * CONFIGURATION FILE (CONFIG) * ******************************* * TASK DEFINITION BLOCK: TDBBT EQU 0 1A BLOCK TYPE TDBNT EQU TDBBT+1 2N NUMBER OF TASKS TDBID EQU TDBNT+2 6A TASK ID SAVE09 VALUE TDBMC EQU TDBID+6 6A MATCHING TASK CLASS TDBTL EQU TDBMC+6 6A TASK LEVEL TDBNC EQU TDBTL+6 2N NUMBER OF TERMINAL DEVICE CLASSES * TDBFST EQU TDBNC+2 SAVE05 TERM DEF TDC EQU 7 TERMINAL DEVICE CLASS TLC EQU 6 LINE CONNECTION TDBREC EQU TDC+TLC TDB-RECORD LENGTH * SDC EQU 7 SPECIAL DEVICE CLASS-RECORD * * COMMON DEVICE DEF. BLOCK: CDBBT EQU 0 1A BLOCK TYPE CDBNC EQU CDBBT+1 2N NUMBER OF SPEC. DEV. CLASSES SDCFST EQU CDBNC+2 SAVE05 SDC-RECORD * * * USER WORK BLOCK TYPE DEF. BLOCK UDBBT EQU 0 1A BLOCK TYPE UDBNU EQU UDBBT+1 3A NUMBER OF UWB TYPES * UDBFST EQU UDBNU+3 SAVE05 UDB-RECORD NAMUWB EQU 3 NAME OF UWB NUMUBL EQU 3 NUMBER OF BLOCKS UDBREC EQU NAMUWB+NUMUBL UDB RECORD-LENGTH **************** * SOP-HANDLING * **************** SOP EQU /2E DEVICE ADDRESS LMP1 EQU /400 LAMP 1 CODE LMP2 EQU /200 LMP3 EQU /100 LMP4 EQU /80 LMP5 EQU /40 LMP6 EQU /20 LMP7 EQU /10 LMP8 EQU 8 LMP9 EQU 4 LMP10 EQU 2 LMP11 EQU 1 EJECT ********************* * OTHER CONSTANTS * ********************* NUMSEG EQU 10 DISPL. TO NUMBER OF SEGMENTS IN S:GTAB COMLG EQU 4 LENGTH OF COMMON PART PAGSIZ EQU /1000 PHYSICAL PAGE SIZE CBLEN EQU 256 CASSETTE BUFFER LENGTH BLKLEN EQU 6 SEGMENT BLOCK LENGTH PAGLG EQU 8 PAGE LENGTH IN S:GTAB PRGLG1 EQU 2 NCHTID EQU 5 NBR OF CHAR. IN TID RECORD SWPFEL EQU 14 FILE EXTENT LENGTH EJECT *********************** * CASSETTE HANDLING * *********************** CHCR EQU /E DEVICE ADDRESS FOR CASSETTE LOCK EQU /2 LOCK CASSETTE SBOT EQU 8 SEARCH BEGINNING OF TAPE STMF EQU /C SEARCH TAPEMARK FORWARD * * DISC/FLEXIBLE DISC HANDLING * BUFLEN EQU 256 LENGTH OF READ BUFFER DKBA3 EQU 514 BUFFER LENGTH VERSION A3 RECLEN EQU 9 CONFIGURATION FILE RECORD LENGTH FDCU EQU /09 FLEXIBLE DISC CU ADDRESS FDIOP EQU FDCU+FDCU MUX ADDRESS MUXCC EQU /8080 1:ST MUX WORD MXCCD3 EQU /80C1 BYTE2=NUMBER OF WORDS QBLFAC EQU 6 BLOCKING FACTOR * * DATA AREA DEFINITION * SYSBAS EQU * SAVCON DATA BUFLEN MXBUF DATA 0 DISC/FLEXIBLE DISC BUFFER ADDRESS SAVMEM DATA 0 SAVE AREA CYLNBR DATA /FFFF CYLINDER NUMBER SECNBR DATA 0 PHYSICAL SECTOR NUMBER DEVTAB DATA /1909,/1101,/0828 SWPTAB DATA '$S','WA','P ',' ' EJECT ***************************************************************** * CALL-FORMAT, PERFORMS: CFR A14,A13 * * DATA [REL-ADDRESS] * * * ***************************************************************** CALL FORM 16=/F697,16 EJECT ************************** * CONDITIONAL ASSEMBLY * ************************** CASS EQU 1 1-PROGRAM LOAD DEVICE = CASSETTE DISC EQU 1 1-PROGRAM LOAD DEVICE = DISC FLDISC EQU 1 1-PROGRAM LOAD DEVICE = =FLEXIBLE DISC MFDISC EQU 1 1-PROGRAM LOAD DEVICE = MINI FIXED DISC CFTEST EQU 1 1-TEST THE CONFIGURATION FILE CFTCAS EQU CFTEST+CASS CFTFLD EQU CFTEST+FLDISC LODTST EQU 0 1-BUGGER START AFTER MONITOR LOADING =3 EJECT ****************************************************** * * * APPLICATION LOAD PART OF SYSLOD * * =============================== * * * * ENTRY: A1 - FORMAT AND DEVICE TYPE * * A2 - PROGRAM LOAD DEVICE * * A3 - APPLICATION NUMBER * * A7 - APPLICATION DISC ADDRESS BIT 16-31 * * A8 - APPLICATION DISC ADDRESS BIT 0-15 * * A9 - SAVE09 OF FREE AREA * * A13 - MONITOR SAVE09 ADDRESS * * * * EXIT: * * * * SUBROUTINES: CASSIN,SOPIN,CHCRIO,LODCOM * * LODSEG,REBUF,MOVBUF,RDBLK, * * CONLOD,CONEX,MOVREV * * * ****************************************************** SYSLOD EQU * * * SAVE REGISTERS * ST A1,SCTSFA+2 SAVE FORMAT AND DEVICE TYPE ST A2,SCTIPL SAVE PROGRAM LOAD DEVICE ST A3,SCTANO APPLICATION NUMBER ST A8,SCTADA SAVE APPLICATION DISC ADDRESS BIT 0-15 ST A7,SCTADA+2 SAVE APPLICATION DISC ADDRESS BIT 16-31 ST A9,SCTSFA SAVE SAVE09 OF FREE AREA IFT LODTST=1 =3 LDKL A14,SYSBAS =3 LDR A13,P =3 ADKL A13,10 =3 LD A1,SCTBUG =3 ABR(NZ) A1 =3 XIF =3 EJECT * * INDICATE SYSLOD RUNS * LDKL A1,LMP1 OTR A1,0,SOP * * INIT POINTER TO SUBROUTINE HANDLER (A13), STACK BASE (A14) * AND ADDRESS TO GETPSW-ROUTINE * LDR A8,P RETURN ADDRESS LDKL A3,REL+2 RELOCATION ROUTINE CFR A8,A3 LDKL A5,/5555 LOAD TEST PATTERN LDK A6,64 INIT PAGE COUNTER LD A1,SCTOPT GET OPTION WORD ANK A1,1 MMU IN SYSTEM? RF(Z) AP:100 NO! EJECT * * EXECUTION PATH FOR SYSTEMS WITH MMU OPTION EXCLUSIVELY * SLL A6,2 UPPER SAVE20=256 KB LDK A1,0 MMU ENTRY POINTER AP:010 EQU * LD A2,TABBE GET PAGE ADDRESS SUKL A2,/400 DECREMENT PHYSICAL PAGE ADDRESS ST A2,TABBE STORE IT BACK TL TABBE LOAD MMU REGISTERS ES A5,PAGSIZ-2,A1 STORE TEST PATTERN EL A2,PAGSIZ-2,A1 GET MEMORY CONTENT CWR A2,A5 COMPARE WITH TEST PATTERN RF(E) AP:200 SUK A6,4 DECREMENT NUMBER OF PAGES RB AP:010 * * END OF EXECUTION PATH FOR SYSTEMS WITH MMU OPTION EXCLUSIVELY * EJECT AP:100 EQU * * * EXECUTION PATH FOR SYSTEMS WITHOUT MMU OPTION EXCLUSIVELY * LDKL A1,PAGSIZ-2 SAVE09 AT /FFFE AP:110 EQU * SUKL A1,PAGSIZ NEXT PHYSICAL PAGE LDR* A2,A1 SAVE OLD MEMORY CONTENT STR A5,A1 STORE TEST PATTERN CWR* A5,A1 CHECK IF MEMORY RF(E) AP:120 MEMORY END FOUND SUK A6,4 DECREMENT NUMBER OF PHYSICAL PAGES RB AP:110 AP:120 EQU * STR A2,A1 RESTORE OLD MEMORY CONTENT * * END OF EXECUTION PATH FOR SYSTEMS WITHOUT MMU OPTION EXCLUSIVELY * EJECT * * COMMON EXECUTION PATH * AP:200 EQU * ST A6,SCTMSZ SAVE NUMBER OF PHYSICAL PAGES SRL A6,6 NUMBER OF 64KB-PARTITIONS =2 ST A6,SCTEFA+2 STORE =2 LDKL A6,/FFFE HIGHEST ADDRESS IN PARTITION =2 ST A6,SCTEFA STORE =2 * * GET DISC ADDRESS OF APPLICATION VTOC RECORD * LD A11,SCTADA+2 LDKL A12,SCTADA * * INIT POINTER TO READ BUFFER. INIT DEVICE ADDRESS FOR READ-ROUTINE LD A9,SCTSFA POINTER TO READ BUFFER LDR A3,A9 SAVE ADKL A3,BUFLEN COMPUTE START OF FREE AREA ST A3,SCTSFA STORE IN SYSTAB LD A2,SCTIPL GET PROGRAM LOAD DEVICE LDR A1,A2 SAVE * * CHECK PROGRAM LOAD MEDIUM * ANK A2,/C0 CHECK IF CASSETTE RF(P) AP:210 YES! ST A9,MXBUF FLEXIBLE DISC/DISC BUFFER ADDRESS LDR A2,A1 GET PROGRAM LOAD DEVICE SRL A2,4 BIT15 INDICATE UNIT 1 OR 2 LC A3,SCTSFA+3 GET DEVICE TYPE ANK A3,/FF RF(NP) FDTERR SUK A3,3 RF(N) AP:230 DISC RF(Z) AP:225 MINI FIXED DISC SUK A3,5 RF(Z) AP:220 FLEXIBLE DISC FDTERR LDKL A1,LMP10 INDICATE FORMAT/DEVICE TYPE ERROR CALL ERROR AP:210 EQU * IFT CASS=1 * * PROGRAM LOAD DEVICE = CASSETTE * LDKL A1,RDBLK GET SUBROUTINE ADDRESS LDR A10,A1 SAVE =2 ST A1,READ STORE IN PROGRAM LOAD SUBROUTINE AP:215 EQU * CF A14,RDBLK READ ONE CASSETTE BLOCK LDR A1,A1 TAPE MARK? RF(Z) AP:235 NO! CF A14,CASSIN INIT APPLICATION CASSETTE RB AP:215 XIF IFF CASS=1 LDKL A1,LMP9 CALL ERROR ILLEGAL MONITOR OPTION XIF EJECT AP:220 EQU * IFT FLDISC=1 * * PROGRAM LOAD DEVICE = FLEXIBLE DISC * * * MODIFY SCTIPL: /F8 - DRIVE 1, /F9 - DRIVE 2 * ORK A2,/F8 ST A2,SCTIPL * * INIT FLEXIBLE DISC * CF A14,FDINIT =2 =2 =2 =2 RF AP:232 =2 XIF IFF FLDISC=1 LDKL A1,LMP9 CALL ERROR ILLEGAL MONITOR OPTION XIF EJECT AP:225 EQU * IFT MFDISC=1 * * PROGRAM LOAD DEVICE = MINI FIXED DISC * * MODIFY SCTIPL:/F4-DRIVE 1,/F5-DRIVE 2 * ORK A2,/F4 ST A2,SCTIPL * * INIT MINI FIXED DISC * CF A14,MDINIT =2 =2 =2 =2 RF AP:232 =2 XIF IFF MFDISC=1 LDKL A1,LMP9 CALL ERROR ILLEGAL MONITOR OPTION XIF EJECT AP:230 EQU * IFT DISC=1 * * PROGRAM LOAD DEVICE = DISC * * * MODIFY SCTIPL: /F0 - CARTRIDGE DISC, /F1 - FIX DISC * SRL A2,1 XRK A2,1 ORK A2,/F0 ST A2,SCTIPL * * INITIALIZE DISC COMMANDS * CF A14,DUINIT AP:232 EQU * =2 LD A10,READ GET SUBROUTINE ADDRESS =2 CFR A14,A10 READ FIRST SECTOR =2 XIF IFF DISC=1 LDKL A1,LMP9 CALL ERROR XIF EJECT AP:235 EQU * * * COMMON EXECUTION PATH * * * SAVE INFORMATION ABOUT THE LOAD MODULE * LDR* A6,A9 GET SAVE09 ADDRESS (UNSEGMENTED APPL.) ST A6,SAVE09,A13 SAVE LD A6,COMLG,A9 GET LENGTH OF COMMON PART ST A6,SAVE04,A13 SAVE LD A2,SCTOPT GET OPTION WORD LD A3,PRGLG1+8,A9 GET PROGRAM TYPE ST A3,APPTYP,A13 SAVE APPLICATION TYPE CWK A3,'CR' CREDIT APPLICATION? RF(E) AP2340 YES CWK A3,'BA' BASIC APPLICATION RF(E) AP2340 YES CWK A3,'CO' COBOL APPLICATION? RF(E) AP2340 YES * * ASSEMBLER APPLICATION * ORKL A2,/8000 INDICATE ASSEMBLER APPLICATION ST A2,SCTOPT IN OPTION WORD RF AP2350 AP2340 LD A3,PAGLG+8,A9 PHYSICAL PAGE SIZE ST A3,SCTPSZ SAVE AP2350 LD A5,SCTMSZ GET NUMBER OF PHYSICAL PAGES SRC A2,1 MMU IN SYSTEM? RF(NN) AP:240 NO! EJECT * * EXECUTION PATH FOR SYSTEMS WITH MMU OPTION * LD A3,SCTPSZ GET PAGE SIZE LDR A1,A3 SAVE ANKL A1,/03FF EVEN 1K-MULTIPLE? RF(Z) AP:236 YES! LDK A1,LMP8 CALL ERROR INDICATE PAGE SIZE ERROR AP:236 EQU * SRL A3,2 LOGICAL PAGE SIZE SLL A5,8 MAP IT ON MMU ANKL A5,/FC00 PAGE ADDRESS IN 6 LEFTMOST BITS LDR A1,A5 SAVE * * CHECK IF ASSEMBLER APPLICATION * SLC A2,1 ASSEMBLER APPLICATION ABL(N) AP:330 YES AP:237 LD A2,NUMSEG+8,A9 NUMBER OF SEGMENTS AP:238 ABL(Z) AP:330 NO SEGMENTS! RF AP:245 * * END OF EXECUTION PATH EXCLUSIVELY FOR SYSTEMS WITH MMU OPTION * EJECT AP:240 EQU * * * EXECUTION PATH EXCLUSIVELY FOR SYSTEMS WITHOUT MMU OPTION * SLL A5,10 HIGHEST PHYSICAL AND LOGICAL MEMORY ADDRESS LDR A1,A5 SAVE * * CHECK IF ASSEMBLER APPLICATION * SLC A2,1 ASSEMBLER APPLICATION? RF(N) AP:275 YES LD A2,NUMSEG+8,A9 NUMBER OF SEGMENTS RF(Z) AP:275 NO SEGMENTS! EJECT AP:245 EQU * * * COMMON EXECUTION PATH * ST A1,SAVE06,A13 SAVE A1 =2 ST A2,SAVE29,A13 SAVE NUMBER OF SEGMENTS LD A4,SCTOPT GET OPTION WORD ANK A4,2 DISC PAGING? RF(Z) AP:260 NO! LD A4,SCTIPL GET PROGRAM LOAD DEVICE SUK A4,/F0 CHECK IF CASSETTE RF(N) AP:260 CASSETTE - LOAD ALL SEGMENTS! * * COMPUTE NUMBER OF CORE RESIDENT PAGES * CM SAVE05,A13 RESET COUNTER LDR A6,A9 START OF APPLICATION ADK A6,14 START OF SEGMENT BLOCKS AP:250 EQU * ST A2,SAVE01,A13 SAVE REMAINING NBR OF SEGM. =2 ADK A6,6 NEXT SEGMENT BLOCK ST A9,SAVE03,A13 SAVE A9 =2 ST A11,SAVE13,A13 SAVE A11 =2 LDR A11,A6 GET POINTER IN S:GTAB =2 ADKL A9,BUFLEN-16 END OF READ BUFFER =2 CALL CMPADR POINTER OUTSIDE BUFFER? =2 RF(L) AP:252 NO! =2 SUR A6,A9 DISPLACEMENT IN NEXT SECTOR =2 SUKL A9,BUFLEN-16 START OF BUFFER =2 ADR A6,A9 NEXT SEGMENT BLOCK =2 LD A11,SAVE13,A13 GET LAST SECTOR NUMBER =2 ST A3,SAVE07,A13 SAVE A3 =2 ST A5,SAVE08,A13 SAVE A5 =2 CFR A14,A10 READ NEXT SECTOR/BLOCK =2 LD A3,SAVE07,A13 RESTORE A3 =2 LD A5,SAVE08,A13 RESTORE A5 =2 ST A11,SAVE13,A13 SAVE CURRENT SECTOR NUMBER =2 AP:252 LD A11,SAVE13,A13 GET NEXT SECTOR NUMBER =2 LD A9,SAVE03,A13 START OF BUFFER =2 LCR A4,A6 GET SEGMENT TYPE CCK A4,'RR' CORE RESIDENT SEGMENT? RF(NE) AP:255 NO! IM SAVE05,A13 INCREMENT RESIDENT SEGMENT COUNTER AP:255 EQU * LD A2,SAVE01,A13 GET REMAINING NBR OF SEGM. =2 SUK A2,1 MOORE SEGMENTS? RB(NZ) AP:250 YES! LD A11,SCTADA+2 GET APPLICATION START ADDRESS =2 ST A3,SAVE03,A13 SAVE A3 =2 ST A5,SAVE08,A13 SAVE A5 =2 CFR A14,A10 READ FIRST SECTOR =2 LD A3,SAVE03,A13 RESTORE A3 =2 LD A5,SAVE08,A13 RESTORE A5 =2 LD A2,SAVE05,A13 NUMBER OF RESIDENT SEGMENTS RF(Z) AP:270 NO RESIDENT SEGMENTS! AP:260 EQU * ST A2,SCTNOP SAVE NUMBER OF PAGES LDR A4,A9 SAVE A9 LDR A8,A11 SAVE A11 * =2 * CHECK MEMORY OVERFLOW =2 * LD A7,SCTEFA+2 GET PARTITION NUMBER =2 AP:262 LD A11,SCTPSZ GET PAGE SIZE =2 LD A9,SCTEFA GET END OF FREE AREA =2 CALL CMPADR ENOUGTH SPACE IN THIS PARTITION? =2 =2 RF(NG) AP:265 YES! =2 SUK A7,1 DECREMENT =2 RF(NP) AP:280 MEMORY OVERFLOW! =2 ST A7,SCTEFA+2 UPDATE PARTITION NUMBER =2 AP:265 SUR A9,A11 COMPUTE END OF FREE AREA =2 ST A9,SCTEFA STORE =2 CWK A7,1 FIRST MEMORY PARTITION? =2 RF(G) AP:266 NO! =2 LD A11,SCTSFA GET START OF FREE AREA =2 CALL CMPADR COMPARE ADDRESSSES =2 RF(NL) AP:280 MEMORY OVERFLOW! =2 AP:266 EQU * =2 SUR A5,A3 DECREMENT PHYSICAL MEMORY ADDRESS SUK A2,1 DECREMENT NUMBER OF PAGES RB(P) AP:262 LDR A9,A4 RESTORE A9 LDR A11,A8 RESTORE A11 ST A5,SAVE22,A13 SAVE PHYS.ADDRESS TO FIRST SEGMENT AP:270 EQU * LD A1,SAVE06,A13 RESTORE A1 =2 LD A2,SCTOPT GET OPTION WORD ANK A2,1 MMU IN SYSTEM? RF(NZ) AP:292 YES! * * END OF COMMON EXECUTION PATH * EJECT * * EXECUTION PATH EXCLUSIVELY FOR SYSTEMS WITHOUT MMU OPTION * ST A5,SAVE08,A13 AP:275 EQU * LD A10,COMLG,A9 GET LENGTH OF COMMON PART ADKL A10,3 RESERV ONE EXTRA WORD ANKL A10,/FFFE LDR A4,A9 SAVE A9 LDR A8,A11 SAVE A11 LDR A11,A5 AP:285 EQU * SUKL A11,2 SUKL A10,2 RF(Z) AP:290 LD A9,SCTSFA GET START OF FREE AREA CALL CMPADR A11 COMPARED TO A9 RB(G) AP:285 AP:280 LDKL A1,LMP3 CALL ERROR MEMORY OVERFLOW! AP:290 EQU * LDR A12,A11 RELOCATION BASE LDR A9,A4 RESTORE A9 LDR A11,A8 RESTORE A11 LDR A8,A12 A8 - APPLICATION LOAD - ADDRESS ST A8,SAVE07,A13 SAVE APPLLICATION LOAD-ADDRESS ST A8,SAVE01,A13 SAVE APPLICATION LOAD-ADDRESS LD A10,COMLG,A9 GET LENGTH OF COMMON PART ABL AP:355 EJECT AP:292 EQU * * * EXECUTION PATH FOR SYSTEMS WITH MMU OPTION * LDR A4,A5 SAVE ANKL A5,/FC00 GET 6 LEFTMOST BITS LDR A6,A5 SAVE SUR A4,A5 COMPUTE PHYSICAL DISPLACEMENT EJECT * * STORE ADDRES(ES) TO PHYSICAL PAGE(S) HOLDING * THE FIRST LOGICAL PAGE * LDKL A7,MMEND GET END OF MMU TABLE LDKL A8,16 INIT MMU ENTRY POINTER AP:295 EQU * SUK A7,2 DECREMENT MMU ENTRY ADDRESS SUKL A8,1 DECREMENT MMU ENTRY POINTER SUKL A3,/400 DECREMENT PHYSICAL PAGE ADDRESS RB(P) AP:295 RF(Z) AP:300 EVEN 4K-BYTES PAGES LD A3,SCTPSZ GET PAGE SIZE CWK A3,/400 PAGE SIZE=1K? RF(E) AP:300 YES * * RESERV ONE EXTRA MMU ENTRY WHEN PAGE SIZE * IS NOT AN EVEN MULTIPLE OF 4K * SUK A7,2 SUKL A8,1 AP:300 EQU * LD A3,SCTNOP ANY CORE RESIDENT SEGMENTS? RF(NZ) AP:302 YES! LDR A5,A1 GET ADDRESS TO END OF MEMORY LDK A4,0 RESET PAGE SIZE RF AP:310 AP:302 LDR A3,A7 SAVE MMU ENTRY ADDRESS TO LOGICAL PAGE AP:305 EQU * STR A6,A3 STORE ADDRESS TO PHYSICAL PAGE ADK A3,2 INCREMENT MMU ENTRY ADDRESS CWK A3,MMEND END OF MMU TABLE? RF(E) AP:310 YES! ADKL A6,/400 INCREMENT PHYSICAL PAGE ADDRESS RB AP:305 AP:310 EQU * LDR A4,A4 ANY PHYSICAL DISPLACEMENT? RF(NZ) AP:315 YES! SUKL A5,/400 NEXT PHYSICAL PAGE ADDRESS * AP:315 EQU * SLL A4,2 PHYSICAL DISPLACEMENT AP:325 EQU * * * SAVE LOGICAL ADDRESS OF SAVE05 SEGMENT * LDR A2,A8 GET MMU ENTRY SLL A2,12 MOVE TO 4 LEFTMOST BITS ANKL A2,/F000 MMU ENTRY TO LOGICAL PAGE ST A2,SCTLAP SAVE ADR A2,A4 ADD DISPLACEMENT ST A2,SAVE08,A13 SAVE LDR A2,A8 GET MMU ENTRY FOR FIRST PAGE ADR A2,A2 BYTE DISPLACEMENT ADKL A2,TTB:MT COMPUTE DISPL. TO FIRST PAGE ENTRY ST A2,SCTMMP SAVE IN SYSTAB * * COMPUTE NUMBER OF PAGE ENTRIES * LDKL A2,16 SUR A2,A8 ST A2,SCTNPE RF AP:335 AP:330 EQU * * * THIS ENTRY IS ENTERED IF MMU OPTION IN SYSTEM BUT * THE APPLICATION LOADED WAS UNSEGMENTED (CORE RESIDENT) * SUKL A5,/400 INIT POINTER TO LAST PAGE LDKL A4,PAGSIZ PHYSICAL PAGE SIZE LDKL A7,MMEND END OF MMU TABLE LDKL A8,16 MMU ENTRY POINTER EJECT AP:335 EQU * LDR A4,A4 ANY DISPLACEMENT? RF(NZ) AP:337 LDKL A4,PAGSIZ AP:337 EQU * * * COMPUTE APPLICATION SAVE09 ADDRESS * * A1 - LAST PHYSICAL PAGE NUMBER * A4 - DISPLACEMENT IN PAGE * A5 - PHYSICAL PAGE ADDRESS * A7 - MMU ENTRY ADDRESS * A8 - CURRENT MMU ENTRY * LD A2,COMLG,A9 COMLG OF CORE RESIDENT PART ADK A2,3 RESERV ONE EXTRA WORD ANKL A2,/FFFE MAKE EVEN LENGTH RF AP:344 AP:340 EQU * * RESERV ENTRIES IN MMU TABLE FOR PHYSICAL PAGE ADDRESSES TO COMMON PA * SUR A2,A4 AREA LEFT IN CURRENT PAGE LDKL A4,PAGSIZ PHYSICAL PAGE SIZE SUKL A8,1 DECREMENT MMU ENTRY POINTER RF(NN) AP:342 AP:341 EQU * LDKL A1,LMP7 INDICATE TABBE OVERFLOW! CALL ERROR AP:342 EQU * =2 SUK A7,2 DECREMENT MMU ENTRY ADDRESS STR A5,A7 STORE PAGE ADDRESS IN MMU SUKL A5,/400 NEXT PAGE AP:344 EQU * TNM A2,A4 PROGRAM LENGTH > 32 KB? RF(NN) AP:345 NO! CWR A4,A2 RF AP:348 AP:345 EQU * CWR A2,A4 AP:348 EQU * RB(G) AP:340 AP:350 EQU * LDR A2,A2 RF(Z) AP:351 SUKL A8,1 RB(N) AP:341 TABBE OVERFLOW! SUK A7,2 NEXT TABBE ENTRY STR A5,A7 STORE PAGE ADDRESS AP:351 EQU * SUR A4,A2 MODIFY DISPLACEMENT LDR A2,A8 GET MMU ENTRY ADR A8,A8 BYTE DISPLACEMENT ADKL A8,TTB:MT COMPUTE DISPL. TO APPL. START ENTRY ST A8,SCTMMC SAVE IN SYSTAB SLL A2,12 MOVE TO 4 LEFTMOST BITS LDR A8,A2 ADR A8,A4 COMPUTE LOGICAL ADDRESS ST A8,SAVE07,A13 SAVE IN TEMPORARY AREA LDR* A1,A7 GET ADDRESS TO PHYSICAL PAGE ANKL A1,/C000 GREATER THAN 64K? RF(Z) AP:353 NO! LDKL A1,0 UPPER LIMIT 64 KB RF AP:354 AP:353 EQU * LDR* A1,A7 GET PHYSICAL ADDRESS SLL A1,2 ADR A1,A4 ADD DISPLACEMENT LD A2,SCTSFA GET START OF FREE AREA TNM A1,A2 ON SAME SIDE OF 32K-LIMIT RF(NN) AP3532 YES! CWR A2,A1 RF AP3534 AP3532 CWR A1,A2 AP3534 RF(G) AP:354 LDKL A1,LMP3 CALL ERROR MEMORY OVERFLOW AP:354 EQU * ST A1,SAVE01,A13 SAVE LD A10,COMLG,A9 LOAD COMLG OF COMMON PART TL TABBE LOAD MMU REGISTERS * * READ AND RELOCATE CORE RESIDENT PART OF APPLICATION * * A8 - APPLICATION LOAD ADDRESS * A10 - LENGTH OF CORE RESIDENT PART * AP:355 EQU * LDKL A1,/FFFF END OF FREE AREA =2 ST A1,SCTEFA STORE =2 =2 ST A8,SCTLAC CF A14,LODCOM LOAD CORE RESIDENT PART LD A8,SAVE08,A13 GET LOGICAL ADDRESS TO FIRST PAGE * * CHECK IF ASSEMBLER APPLICATION * LD A1,SCTOPT GET OPTION WORD ABL(N) CONLOD ASSEMBLER APPLICATION LD A2,SAVE29,A13 GET NUMBER OF SEGMENTS CM SAVE06,A13 CLEAR SEGMENT COUNTER =2 ABL(Z) CONLOD NO SEGMENTS IN APPLICATION ANK A1,1 MMU IN SYSTEM? RF(Z) AP:360 NO! TS MMDDIV,A13 SAVE MMU REGISTER CONTENTS AP:360 EQU * * * READ AND RELOCATE THE SEGMENTS * * A8 - LOGICAL ADDRESS OF SAVE05 SEGMENT * A10 - SEGMENT LENGTH * LD A2,SCTLAC GET LOGICAL ADDRESS TO APPLICATION ADKL A2,BLKLEN+BLKLEN LD A1,SAVE06,A13 GET SEGMENT COUNTER AP:365 EQU * RF(Z) AP:370 ADK A2,BLKLEN NEXT BLOCK SUK A1,1 DECREMENT BLOCK COUNTER RB AP:365 AP:370 EQU * * * CHECK IF DISC PAGING * LD A1,SCTOPT GET OPTION WORD ANK A1,2 DISC PAGING? RF(Z) AP:376 NO! * * CHECK IF CORE RESIDENT SEGMENT * CALL GETCON GET SEGMENT TYPE * LDR A12,A1 GET MOST SIGNIFICANT PART =REL 11 * ANKL A12,/FF OF DISC ADDRESS =REL 11 SRL A1,8 SEGMENT TYPE TO RIGHT BYTE =1 CCK A1,'RR' CORE RESIDENT SEGMENT? RF(E) AP:376 YES: LOAD THIS SEGMENT! * * BYPASS THIS SEGMENT AND CHECK NEXT * LD A1,SAVE06,A13 GET SEGMENT COUNTER LD A2,SAVE29,A13 GET TOTAL NUMBER OF SEGMENTS ADK A1,1 INCREMENT CWR A1,A2 LAST SEGMENT? ABL(E) CONLOD YES! ST A1,SAVE06,A13 SAVE CURRENT SEGMENT NUMBER RB AP:360 AP:375 LDKL A1,LMP2 DISC I/O ERROR CALL ERROR EJECT AP:376 EQU * ADK A2,2 DISC SECTOR ADDRESS CALL GETCON GET DISC SECTOR ADDRESS LDR A11,A1 SAVE AD A11,SCTADA+2 ADD LEAST SIGN. PART OF A.D.A.? * RF(O) AP:377 OVERFLOW =REL 11 * RF AP:378 NOT OVERFLOW =REL 11 *AP:377 ADKL A12,1 INCR. M. S. P. OF DISC ADDRESS =REL 11 * ANKL A11,/7FFF RESET OVERFLOW =REL 11 *AP:378 AD A12,SCTADA ADD M. S. P. OF A. D. A. =REL 11 * CWK A12,255 OVERFLOW? =REL 11 * RB(G) AP:375 YES: ILLEGAL DISC ADDRESS! =REL 11 ADK A2,2 SEGMENT LENGTH CALL GETCON GET SEGMENT LENGTH LDR A10,A1 SAVE ADKL A10,1 ANKL A10,/FFFE MAKE EVEN LENGTH ST A8,SAVE07,A13 CF A14,LODSEG LOAD SEGMENT LD A1,SAVE06,A13 GET SEGMENT COUNTER LD A2,SAVE29,A13 GET TOTAL NUMBER OF SEGMENTS ADK A1,1 INCREMENT SEGMENT COUNTER CWR A1,A2 ALL SEGMENTS LOADED? RF(E) CONLOD YES! ST A1,SAVE06,A13 STORE SEGMENT COUNTER LD A4,SCTPSZ GET PAGE LENGTH LD A1,SCTOPT GET OPTION WORD ANK A1,1 MMU IN SYSTEM? RF(NZ) AP:379 YES! ADR A8,A4 COMPUTE ADDRESS TO NEXT PAGE RB AP:360 EJECT AP:379 EQU * LDR A1,A4 SAVE ANKL A4,/0C00 GET MODULO 4K DISCRIMINANT RF(Z) AP:380 NO DISCRIMINANT! ADR A1,A8 COMPUTE LOGICAL ADDRESS TO NEXT PAGE LDR A4,A1 SAVE ANKL A4,/0C00 GET MODULO 4K DISCRIMINANT ANKL A1,/F000 LOGICAL ADDRESS TO NEXT PAGE ANKL A8,/F000 LOGICAL ADDRESS TO CURRENT PAGE SUR A1,A8 COMPUTE PHYSICAL INCREMENT AP:380 EQU * LD A8,SCTLAP GET LOGICAL PAGE ADDRESSE ANKL A8,/F000 SKIP DISPLACEMENT LDR A2,A8 SAVE ADR A8,A4 COMPUTE LOGICAL ADDRESS TO NEXT PAGE SRL A2,12 MOVE TO 4 RIGHTMOST BITS ADR A2,A2 2*MMU ENTRY ADR A2,A13 ADKL A2,MMDDIV MMU ENTRY ADDRESS LDR A3,A13 ADKL A3,MMDDIV+32 SRL A1,2 MAP PHYSICAL ADDRESS ON MMU AP:385 EQU * ADRS A1,A2 LOGICAL ADDRESS TO NEXT PAGE ADK A2,2 NEXT MMU ENTRY CWR A2,A3 RB(NE) AP:385 TL MMDDIV,A13 LOAD MMU REGISTERS RB AP:360 EJECT ********************************************************** * * * LOAD CONFIGURATION PART OF SYSLOD * * ================================= * * * * ENTRY: A9 - BUFFER ADDRESS * * * * EXIT: * * * * SUBROUTINES: CASSIN,RDBLK,MOVBUF * * * ********************************************************** CONLOD EQU * LD A1,SCTIPL GET PROGRAM LOAD DEVICE SUK A1,/F0 CHECK DEVICE TYPE RF(NN) CONRAD NOT CASSETTE IFT CFTEST+CASS=2 * * PROGRAM LOAD DEVICE = CASSETTE * CON:30 EQU * LDKL A1,CON:40-2 SUKL A1,COR:48 ADKL A1,/5700 ST A1,COR:48 MODIFY INSTRUCTION LDKL A1,/0100 ST A1,COR:38 MODIFY LDR A1,A9 START OF BUFFER ADKL A1,BUFLEN END OF BUFFER ST A1,SAVE08,A13 SAVE END OF BUFFER ST A1,SAVE03,A13 SAVE CF A14,RDBLK READ ONE BLOCK CF A14,RDBLK READ NEXT BLOCK LDR A8,A9 LDR A4,A8 GET START OF BUFFER LDR A1,A1 TAPEMARK? RF(Z) TST:10 NO! CF A14,CASSIN INIT CONFIGURATION CASSETTE CALL CON:40 RF TST:10 CONEX EQU * * * UNLOAD CASSETTE IF NO APPLICATION DATA ON SAME CASSETTE * CF A14,RDBLK READ NEXT BLOCK LDR A1,A1 APPLICATION DATA? RF(NZ) CON:80 NO! LDK A1,/D CF A14,CHCRIO SEARCH TAPEMARK REVERSE CF A14,RDBLK BYPASS TAPEMARK RF CON:90 CON:80 EQU * LDK A1,/F CF A14,CHCRIO UNLOAD CASSETTE CON:90 EQU * ABL CONMOV XIF IFT CFTEST=1 EJECT CONRAD EQU * * * LOAD CONFIGURATION DATA FROM DISC/FLEXIBLE DISC * CF A14,GETFIL GET CONFIGURATION FILE LDR A1,A9 GET START OF BUFFER ADKL A1,BUFLEN-6 END OF BUFFER ST A1,SAVE08,A13 SAVE END OF BUFFER LDR A1,A9 GET START OF BUFFER AD A1,SAVCON START OF SAVE BUFFER ST A1,SAVE03,A13 SAVE =2 LDKL A10,0 RESET RECORD COUNTER * * READ ONE SECTOR FROM RANDOM ACCESS DEVICE * CALL READC READ SECTOR * * TEST THE SYNTAX OF THE CONFIGURATION FILE * TST:10 CALL T CALL CONRD CALL NN CALL CONRD CALL TID CALL TEST CALL AA CALL CONRD CALL TCL CALL TEST CALL AA CALL CONRD CALL LEV CALL TEST CALL NN1 TST:20 CALL CONRD CALL NN1 CALL CONRD TST:30 LD A5,SAVE13,A13 GET NUMBER OF TERMINAL DEV. CLASSES CWK A5,/3030 ZERO? RF(E) TST:40 YES! CALL SUKASC CALL TDCT CALL TEST CALL NN CALL CONRD CALL LC CALL TEST CALL NNL CALL CONRD RB TST:30 TST:40 EQU * CALL NN1 CALL CONRD TST:50 EQU * LD A5,SAVE13,A13 GET NUMBER OF SPECIAL DEV. CLASSES CWK A5,/3030 ZERO? RF(E) TST:60 YES! CALL SUKASC CALL SDCS CALL TEST CALL NN CALL CONRD RB TST:50 TST:60 EQU * LCR A5,A4 GET CHARACTER TST:70 CCK A5,'TT' BLOCK TYPE T? RB(E) TST:10 YES! LDKL A3,/570C ST A3,TST:70 MODIFY INSTRUCTION TO RF CCK A5,'CC' BLOCK TYPE C ? RF(NE) TST:80 NO! LDKL A3,'CC' ST A3,T:10 MODIFY INSTRUCTION CALL T RB TST:20 TST:80 EQU * ADK A4,1 INCREMENT BUFFER POINTER LCR A5,A4 GET CHARACTER CCK A5,';;' END OF RECORD ABL(NE) CONERR NO! TST:85 EQU * CALL CONRD RB TST:85 COR:50 EQU * LDK A3,'S' SC A3,GET:25+1 MODIFY INSTRUCTION SC A3,GET:60+1 MODIFY INSTRUCTION CF A14,GETFIL * * UNLOCK FLEXIBLE DISC * LD A1,SCTIPL GET LOAD DEVICE SUK A1,/F8 CHECK TYPE RF(N) COR:60 NOT FLEXIBLE DISC XIF IFT CFTEST+FLDISC=2 LD A1,SCTOPT GET OPTION WORD ANK A1,2 DISC PAGING? RF(NZ) COR:60 YES; DON'T UNLOCK LDK A1,/C UNLOCK ORDER EX FRD:10 EXECUTE COMMAND RB(NA) *-4 LOOP UNTIL ACCEPTED EX FRD:40 SENSE STATUS RB(NA) *-4 LOOP UNTIL ACCEPTED XIF IFT CFTEST=1 COR:60 EQU * EJECT CONMOV EQU * * * MOVE CONFIGURATION DATA TO END OF SYSTEM AREA * LDR A1,A9 GET START OF BUFFER AD A1,SAVCON COMPUTE END OF BUFFER CMOV10 LD A3,SAVE03,A13 GET END OF CONFIGURATION DATA LD A2,SAVE01,A13 GET END OF SYSTEM AREA CM -2,A2 MAKE SURE CONFIGURATION FILE SUK A2,1 IS FOLLOWED BY X'00' SUR A3,A1 LENGTH OF CONFIGURATION DATA SUR A2,A3 TO-ADDRESS * ANKL A2,/FFFE MAKE EVEN ADDRESS CALL MOVE ST A2,SAVE01,A13 SAVE START OF CONFIGURATION DATA LDR A1,A9 GET START OF FREE AREA LDR A12,A2 END OF FREE AREA SUR A12,A1 SUBTRACT MONITOR END ST A12,M:REL,A13 SAVE RELOCATION CONSTANT LD A2,SAVE01,A13 GET START OF CONFF * * MOVE SYSLDA+SYSLDM+DWT-PROTOTYPES TO END OF FREE AREA * MOPRO SUK A1,2 SUK A2,2 LDR* A4,A1 STR A4,A2 CWR A1,A13 RB(NE) MOPRO LDR A1,A2 SAVE NEW LOCATION OF SYSLDA AD A2,LDALEN,A2 BYPASS SYSLDA ABR A2 CONTINUE EXECUTION IN SYSLDM EJECT *************************************************************** * SUROUTINES USED TO TEST THE SYNTAX OF THE CONFIGURATION FILE *************************************************************** EJECT CONRD EQU * * * COMPUTE NUMBER OF CHARACTERS IN THIS RECORD * LD A1,SAVE03,A13 GET CURRENT POINTER IN BUFFER LDR A2,A1 SAVE LDK A3,0 RESET CHARACTER COUNTER LDR A4,A8 START OF RECORD COR:30 EQU * LCR A5,A4 GET CHARACTER CCK A5,';;' END OF RECORD? RF(E) COR:40 YES! COR:35 EQU * CWK A3,RECLEN MAXIMUM SIZE ACHIEVED? COR:38 EQU *-2 RF(E) COR:40 YES! CW A1,SAVE01,A13 MEMORY OVERFLOW? RF(E) MEMOFL YES! ADK A1,1 INCREMENT BUFFER POINTER ADK A3,1 INCREMENT CHARACTER COUNTER ADK A4,1 INCREMENT RECORD POINTER RB COR:30 LOOP COR:40 EQU * LC A5,1,A4 GET NEXT CHARACTER CCK A5,';;' TWO SEMICOLONS? RF(NE) COR:45 NO! CWK A3,NCHTID CHECK IF END OF RECORD RB(E) COR:35 NO: SEMICOLON CHARACTER IN RECORD COR:45 EQU * ST A1,SAVE03,A13 SAVE CURRENT DESTINATION LDR A1,A8 START OF RECORD CALL MOVE COR:48 EQU * ADKL A10,1 INCREMENT RECORD COUNTER CW A10,SAVE20,A13 LAST RECORD RB(E) COR:50 YES! ADKL A8,RECLEN+1 INCREMENT RECORD POINTER CW A8,SAVE08,A13 END OF BUFFER RF(NE) COR:10 NO! CALL READC READ SECTOR COR:10 LDR A4,A8 START OF RECORD RTN A14 XIF IFT CFTEST+CASS=2 CON:40 EQU * CF A14,RDBLK READ NEXT BLOCK LDR A1,A1 TAPEMARK? ABL(NZ) CONEX YES! LDR A8,A9 LDR A4,A8 GET START OF BUFFER RTN A14 XIF IFT CFTEST=1 MEMOFL EQU * LDKL A1,LMP3 INDICATE MEMORY OVERFLOW CALL ERROR EJECT READC EQU * CF A14,READS READ SECTOR READS EQU *-2 LDR A8,A9 LDR A4,A8 GET START OF BUFFER RTN A14 T EQU * LCR A5,A4 GET CHARACTER CCK A5,'TT' BLOCK TYPE T? T:10 EQU *-2 RF(NE) CONERR ADK A4,1 INCREMENT BUFFER POINTER LCR A5,A4 GET NEXT CHARACTER CCK A5,';;' END OF RECORD? RF(NE) CONERR NO! RTN A14 EJECT NNL EQU * LDK A2,1 LDK A3,3 RF NN:10 NN EQU * LDK A2,0 LDK A3,3 RF NN:10 NN1 EQU * LDK A3,4 NN:10 EQU * LCR A5,A4 GET CHARACTER ADK A4,1 INCREMENT BUFFER POINTER CCK A5,/3939 NUMERIC CHARACTER > 9? RF(G) CONERR YES! SUK A3,1 RF(Z) NN:20 CCK A5,/3030 NUMERIC CHARACTER < 0? RF(L) CONERR YES! RF(Z) NN:15 LDKL A1,/3030 RF NN:16 NN:15 LDKL A1,/3131 NN:16 ST A1,NN:20+2 MODIFY SUK A3,1 RF(Z) NN:30 SLL A5,8 RB NN:10 NN:20 EQU * CCK A5,/3131 NUMERIC CHARACTER < 1? RF(L) CONERR YES! SUK A2,1 RF(NZ) NN:50 LCR A5,A4 GET NEXT CHARACTER CCK A5,'LL' LINE L? RF(E) NN:40 YES! CCK A5,'RR' LINE R? RF(E) NN:40 YES! CCK A5,'AA' LINE A? RF(E) NN:40 YES! CCK A5,'SS' LINE S? RF(E) NN:40 YES! RF CONERR NN:40 EQU * ADK A4,1 INCREMENT BUFFER POINTER RF NN:50 NN:30 EQU * ST A5,SAVE13,A13 STORE NUMBER OF CLASSES NN:50 LCR A5,A4 GET CHARACTER CCK A5,';;' END OF RECORD? RF(NE) CONERR NO! RTN A14 EJECT AA EQU * LDK A3,2 AA:10 EQU * LCR A5,A4 GET CHARACTER CCK A5,/3030 ALPHA-NUMERIC CHARACTER <30? RF(L) CONERR YES! CCK A5,/3939 ALPHA-NUMERIC CHARACTER > 39? RF(NG) AA:20 NO! CCK A5,/4141 ALPHA-NUMERIC CHARACTER < 41? RF(L) CONERR CCK A5,/5A5A ALPHA-NUMERIC CHARACTER > 5A? RF(G) CONERR AA:20 EQU * ADK A4,1 INCREMENT BUFFER POINTER SUK A3,1 RB(NZ) AA:10 LCR A5,A4 GET NEXT CHARACTER CCK A5,';;' END OF RECORD? RF(NE) CONERR NO! RTN A14 EJECT TID EQU * LDKL A2,SEQ1 SELECT SEQUENCE LDK A3,4 GET NUMBER OF CHARACTERS RTN A14 TCL EQU * LDKL A2,SEQ2 SELECT SEQUENCE LDK A3,4 GET NUMBER OF CHARACTERS RTN A14 LEV EQU * LDKL A2,SEQ3 SELECT SEQUENCE LDK A3,4 GET NUMBER OF CHARACTERS RTN A14 EJECT TDCT EQU * LDKL A2,SEQ4 SELECT SEQUENCE LDK A3,5 GET NUMBER OF CHARACTERS RTN A14 LC EQU * LDKL A2,SEQ5 SELECT SEQUENCE LDK A3,3 GET NUMBER OF CHARACTERS RTN A14 SDCS EQU * LDKL A2,SEQ6 SELECT SEQUENCE LDK A3,5 GET NUMBER OF CHARACTERS RTN A14 EJECT TEST EQU * LCR A5,A4 GET CHARACTER CCR A5,A2 RF(NE) CONERR ADK A4,1 INCREMENT BUFFER POINTER ADK A2,1 INCREMENT SEQUENCE POINTER SUK A3,1 MORE CHARACTERS IN THE SEQUENCE? RB(NZ) TEST YES! RTN A14 EJECT SUKASC EQU * CCK A5,/3030 NUMBER OF NUMERIC CHARACTERS<10? RF(NE) SUK:10 YES! SUK A5,/F6 N0! SUK:10 SUK A5,1 ST A5,SAVE13,A13 STORE NUMBER OF CLASSES RTN A14 CONERR EQU * LDKL A1,LMP4 INDICATE FORMAT ERROR CALL ERROR EJECT * * ************************************************** * * * SEQUENCES * * * ************************************************** * * * * SEQ1 EQU * TID= DATA 'TI' DATA 'D=' SEQ2 EQU * TCL= DATA 'TC' DATA 'L=' SEQ3 EQU * LEV= DATA 'LE' DATA 'V=' SEQ4 EQU * TDC=T DATA 'TD' DATA 'C=' DATA 'T0' SEQ5 EQU * LC= DATA 'LC' DATA '=0' SEQ6 EQU * SDC=S DATA 'SD' DATA 'C=' DATA 'S0' XIF IFT CFTCAS+CASS=2 * * PROGRAM LOAD DEVICE = CASSETTE * CON:30 EQU * LDR A1,A9 START OF BUFFER ADKL A1,BUFLEN END OF BUFFER ST A1,SAVE08,A13 SAVE END OF BUFFER ST A1,SAVE03,A13 SAVE CF A14,RDBLK READ ONE BLOCK CF A14,RDBLK READ NEXT BLOCK LDR A1,A1 TAPEMARK? RF(Z) CON:50 NO! CF A14,CASSIN INIT CONFIGURATION CASSETTE CON:40 EQU * CF A14,RDBLK READ NEXT BLOCK LDR A1,A1 TAPEMARK? RF(NZ) CONEX YES! CON:50 EQU * * * COMPUTE NUMBER OF CHARACTERS IN THIS BLOCK * LD A1,SAVE03,A13 GET CURRENT POINTER IN BUFFER LDR A2,A1 SAVE LDK A3,0 RESET CHARACTER COUNTER LDR A4,A9 GET SAVE09 OF BUFFER CON:60 EQU * LCR A5,A4 GET CHARACTER IN BUFFER CCK A5,';;' CHECK IF SPACE RF(E) CON:70 NO MOORE CHARACTERS CON:65 EQU * CWK A3,CBLEN END OF BUFFER? RF(E) CON:75 YES! CW A1,SAVE01,A13 MEMORY OVERFLOW? RF(E) MEMOFL YES! ADK A1,1 INCREMENT DESTINATION POINTER ADK A3,1 INCREMENT CHARACTER COUNTER ADK A4,1 INCREMENT BUFFER POINTER RB CON:60 CON:70 EQU * LC A5,1,A4 GET NEXT CHARACTER CCK A5,';;' TWO SEMI-COLONS? RF(NE) CON:75 NO! CWK A3,NCHTID CHECK IF END OF RECORD RB(E) CON:65 NO: SEMI-COLON CHARACTER IN RECORD CON:75 EQU * ST A1,SAVE03,A13 SAVE CURRENT DESTINATION LDR A1,A9 GET SAVE09 OF BUFFER CALL MOVE RB CON:40 CONEX EQU * * * UNLOAD CASSETTE IF NO APPLICATION DATA ON SAME CASSETTE * CF A14,RDBLK READ NEXT BLOCK LDR A1,A1 APPLICATION DATA? RF(NZ) CON:80 NO! LDK A1,/D CF A14,CHCRIO SEARCH TAPEMARK REVERSE CF A14,RDBLK BYPASS TAPEMARK RF CON:90 CON:80 EQU * LDK A1,/F CF A14,CHCRIO UNLOAD CASSETTE CON:90 EQU * ABL CONMOV XIF IFF CFTEST=1 MEMOFL EQU * LDKL A1,LMP3 INDICATE MEMORY OVERFLOW CALL ERROR EJECT CONRAD EQU * * * LOAD CONFIGURATION DATA FROM DISC/FLEXIBLE DISC * CF A14,GETFIL GET CONFIGURATION FILE LDR A1,A9 GET START OF BUFFER ADKL A1,BUFLEN-6 END OF BUFFER ST A1,SAVE08,A13 SAVE END OF BUFFER LDR A1,A9 GET START OF BUFFER AD A1,SAVCON START OF SAVE BUFFER ST A1,SAVE03,A13 SAVE =2 LDKL A10,0 RESET RECORD COUNTER COR:10 EQU * * * READ ONE SECTOR FROM RANDOM ACCESS DEVICE * CF A14,READS READ SECTOR READS EQU *-2 LDR A8,A9 GET START OF BUFFER COR:20 EQU * * * COMPUTE NUMBER OF CHARACTERS IN THIS RECORD * LD A1,SAVE03,A13 GET CURRENT POINTER IN BUFFER LDR A2,A1 SAVE LDK A3,0 RESET CHARACTER COUNTER LDR A4,A8 START OF RECORD COR:30 EQU * LCR A5,A4 GET CHARACTER CCK A5,';;' END OF RECORD? RF(E) COR:40 YES! COR:35 EQU * CWK A3,RECLEN MAXIMUM SIZE ACHIEVED? RF(E) COR:40 YES! CW A1,SAVE01,A13 MEMORY OVERFLOW? RB(E) MEMOFL YES! ADK A1,1 INCREMENT BUFFER POINTER ADK A3,1 INCREMENT CHARACTER COUNTER ADK A4,1 INCREMENT RECORD POINTER RB COR:30 LOOP COR:40 EQU * LC A5,1,A4 GET NEXT CHARACTER CCK A5,';;' TWO SEMICOLONS? RF(NE) COR:45 NO! CWK A3,NCHTID CHECK IF END OF RECORD RB(E) COR:35 NO: SEMICOLON CHARACTER IN RECORD COR:45 EQU * ST A1,SAVE03,A13 SAVE CURRENT DESTINATION LDR A1,A8 START OF RECORD CALL MOVE ADKL A10,1 INCREMENT RECORD COUNTER CW A10,SAVE20,A13 LAST RECORD RF(E) COR:50 YES! ADKL A8,RECLEN+1 INCREMENT RECORD POINTER CW A8,SAVE08,A13 END OF BUFFER RB(E) COR:10 NEXT SECTOR RB COR:20 NEXT RECORD COR:50 EQU * LDK A3,'S' SC A3,GET:25+1 MODIFY INSTRUCTION SC A3,GET:60+1 MODIFY INSTRUCTION CF A14,GETFIL * * UNLOCK FLEXIBLE DISC * LD A1,SCTIPL GET LOAD DEVICE SUK A1,/F8 CHECK TYPE RF(N) COR:60 NOT FLEXIBLE DISC XIF IFT CFTFLD+FLDISC=2 LD A1,SCTOPT GET OPTION WORD ANK A1,2 DISC PAGING? RF(NZ) COR:60 YES; DON'T UNLOCK LDK A1,/C UNLOCK ORDER EX FRD:10 EXECUTE COMMAND RB(NA) *-4 LOOP UNTIL ACCEPTED EX FRD:40 SENSE STATUS RB(NA) *-4 LOOP UNTIL ACCEPTED XIF IFF CFTEST=1 COR:60 EQU * EJECT CONMOV EQU * * * MOVE CONFIGURATION DATA TO END OF SYSTEM AREA * LDR A1,A9 GET START OF BUFFER AD A1,SAVCON COMPUTE END OF BUFFER CMOV10 LD A3,SAVE03,A13 GET END OF CONFIGURATION DATA LD A2,SAVE01,A13 GET END OF SYSTEM AREA CM -2,A2 MAKE SURE CONFIGURATION FILE SUK A2,1 IS FOLLOWED BY X'00' SUR A3,A1 LENGTH OF CONFIGURATION DATA SUR A2,A3 TO-ADDRESS * ANKL A2,/FFFE MAKE EVEN ADDRESS CALL MOVE ST A2,SAVE01,A13 SAVE START OF CONFIGURATION DATA LDR A1,A9 GET START OF FREE AREA LDR A12,A2 END OF FREE AREA SUR A12,A1 SUBTRACT MONITOR END ST A12,M:REL,A13 SAVE RELOCATION CONSTANT LD A2,SAVE01,A13 GET START OF CONFF * * MOVE SYSLDA+SYSLDM+DWT-PROTOTYPES TO END OF FREE AREA * MOPRO SUK A1,2 SUK A2,2 LDR* A4,A1 STR A4,A2 CWR A1,A13 RB(NE) MOPRO LDR A1,A2 SAVE NEW LOCATION OF SYSLDA AD A2,LDALEN,A2 BYPASS SYSLDA ABR A2 CONTINUE EXECUTION IN SYSLDM XIF EJECT ************************************************************************ * SUBROUTINES USED IN THE APPLICATION AND CONFIGURATION LOADING PHASE O ************************************************************************ ******************************* * SOPIN - READ SOP SWITCHES * * ========================= * * * * ENTRY: * * * * EXIT: A1 - SOP INPUT * * BIT 6 - SWITCH 1 * * BIT 15 - SWITCH 10 * * * * WORK REGISTERS: A1 * * * * SUBROUTINES: * * * ******************************* SOPIN EQU * CIO A1,1,SOP INR A1,0,SOP RB(NA) *-2 RTN A14 IFT CASS=1 EJECT ******************************************************* * CASSIN - CASSETTE INITIATING ROUTINE * * ==================================== * * * * REFERENCED IN: SYSLOD -LOADING PART- * * * * ENTRY: * * * * EXIT: * * * * WORK REGISTERS: A1,A3 * * * * SUBROUTINES: SOPIN,CHCRIO * * * ******************************************************* CASSIN EQU * LDK A1,/F CF A14,CHCRIO UNLOAD CASSETTE LDKL A3,LMP1+LMP2 INDICATE EXPECTED SWITCHES OTR A3,0,SOP CAS:10 EQU * CF A14,SOPIN READ SOP ANKL A1,/0300 ALLOWED SWITCHES? RB(Z) CAS:10 NO! LDKL A3,LMP1 SWITCH ON LOAD LAMP OTR A3,0,SOP SRL A1,8 RIGHT ALIGN ANK A1,1 SELECT UNIT CF A14,CHCRIO SELECT UNIT LDK A1,LOCK CF A14,CHCRIO LOCK CASSETTE ANK A3,1 CASSETTE OPERABLE? RB(NZ) CAS:10 NO! LDK A1,SBOT CF A14,CHCRIO SEARCH BEGINNING OF TAPE LDK A1,STMF CF A14,CHCRIO SEARCH TAPEMARK FORWARD RTN A14 EJECT ********************************************* * CHCRIO - CASSETTE I/O EXECUTING ROUTINE * * ======================================= * * * * REFERENCED IN: CASSIN,SYSLOD * * * * ENTRY: A1 - I/O INSTRUCTION COMMAND * * * * EXIT: * * * * WORK REGISTERS: A1,A3 * * * * SUBROUTINES: * * * ********************************************* CHCRIO EQU * CIO A1,1,CHCR SST A3,CHCR RB(NA) CHCRIO RTN A14 EJECT ************************************************** * * * RDBLK - READ ONE CASSETTE BLOCK * * =============================== * * * * REFERENCED IN: SYSLOD * * * * ENTRY: A9 - CASSETTE BUFFER POINTER * * * * EXIT: A2 - NUMBER OF CHARACTERS IN BLOCK * * * * WORK REGISTERS: A1,A2,A3,A4,A5 * * * * SUBROUTINES: * ************************************************** RDBLK EQU * LDK A5,0 RDB:10 EQU * LDR A3,A9 SAVE09 OF BUFFER LDK A2,0 RESET CHARACTER COUNTER LDR A4,A3 SAVE SAVE09 OF BUFFER ADKL A3,CBLEN END OF BUFFER LDK A1,/A CIO A1,1,CHCR READ BLOCK RF(NA) RDERR3 RDB:20 EQU * INR A1,0,CHCR RF(NA) RDB:30 CWR A4,A3 END OF BUFFER? RF(E) RDERR YES! SCR A1,A4 STORE CHARACTER ADK A2,1 INCREMENT CHARACTER COUNTER ADK A4,1 INCREMENT BUFFER POINTER RDB:30 EQU * SST A1,CHCR RB(NA) RDB:20 ANKL A1,/FCFF CHECK STATUS LDR A4,A1 SAVE STATUS RF(Z) RDBEX OK SLC A4,3 CHECK IF TAPEMARK RF(N) RDBEX OK IF TAPEMARK RDERR EQU * * * READ ERROR HAS OCCURRED: MAKE ANOTHER ATTEMPT TO READ * THE SAME BLOCK IF NOT 3 ATTEMPTS ALREADY HAS BEEN MADE * ADK A5,1 NEXT ATTEMPT CWK A5,3 THIRD ATTEMPT? RF(E) RDERR3 YES - GIVE UP! LDK A1,/E REVERSE ONE BLOCK CIO A1,1,CHCR EXECUTE ORDER RB(NA) *-2 LOOP UNTIL ACCEPTED RB RDB:10 RDERR3 EQU * LDKL A1,LMP2 CALL ERROR RDBEX EQU * RTN A14 XIF IFT DISC=1 EJECT *********************************** * * * DUINIT - INITIALIZE DISC UNIT * * ============================= * * * * REFERENCED IN: SYSLOD,GETFIL * * * * ENTRY: A1 - DEVICE ADDRESS * * * * EXIT: * * * * WORK REGISTERS: A2,A3 * * * * SUBROUTINES: * * * *********************************** DUINIT EQU * LC A2,SCTSFA+2 GET FORMAT ANK A2,/FF SUK A2,2 SELECT FORMAT RF(Z) DUI:20 FORMAT A2 SUK A2,1 RF(Z) DUI:30 FORMAT A3 ABL FDTERR FORMAT ERROR DUI:20 LDKL A2,RDSEC2 GET SUBROUTINE ADDRESS EJECT * * INIT DISC COMMANDS VERSION A2 * ADS A1,SEEK20 ADS A1,SEEK21 ADS A1,READ21 ADS A1,READ22 RF DUI:40 DUI:30 LDKL A2,RDSEC3 GET SUBROUTINE ADDRESS * * INIT DISC COMMANDS VERSION A3 * LDKL A3,DKBA3 BUFFER LENGTH VERSION A3 ST A3,SAVCON ADS A1,SEEK30 ADS A1,SEEK31 ADS A1,READ30 ADS A1,READ31 * * INIT SUBROUTINE ADDRESSES * DUI:40 EQU * =2 ST A2,READ READ PROGRAM ST A2,READS READ CONFIGURATION DATA ST A2,READVL READ VOLUME LABEL ST A2,READCF READ CONFIGURATION DATA RTN A14 EJECT *********************************************** * * * RDSEC - READ ONE SECTOR FROM DISC * * ================================= * * * * REFERENCED IN: SYSLOD * * * * ENTRY: A9 = BUFFER ADDRESS * * * A11 - SECTOR NUMBER * * * * EXIT: * * * * WORK REGISTERS: A1,A2,A3,A4,A7 * * * SUBROUTINES: ERROR * * * *********************************************** * EJECT * * READ DISC SECTOR VERSION A2 * RDSEC2 EQU * LDK A2,0 LDR A1,A11 GET LOGICAL SECTOR NUMBER DIV200 EQU * ADR A2,A1 SRL A1,5 RB(NZ) DIV200 MORE IN SERIE TO ADD LDR A1,A2 ANKL A1,/FFE0 SRL A2,5 SUR A1,A2 SUR A1,A11 ADK A1,31 RF(P) DIV210 NO CORRECTION OF RESULT ADK A2,1 DIV210 EQU * LDR A2,A2 A2:=CYL NBR = LOG SEC NBR / 31 RF(Z) DIV220 CYLINDER 0 ADK A2,1 DIV220 EQU * ADR A2,A11 A2:=PHYS. SEC NBR BEFORE INTERLACING * LDR A1,A2 SRL A1,5 CW A1,CYLNBR RF(E) INT200 SAME CYLINDER NUMBER ST A1,CYLNBR SLL A1,3 ORK A1,2 SET BIT 14 EJECT * * SEEK CYLINDER * SEEK20 CIO A1,1,0 RB(NA) SEEK20 * SEEK21 SST A1,0 RB(NA) SEEK21 * * INTERLACING * INT200 EQU * LDR A1,A2 ADR A2,A2 ADR A2,A1 INTERLACING FACTOR 3 ANK A2,/1F LD A1,CYLNBR GET CYLINDER NUMBER ANK A1,1 RF(Z) INT210 EVEN CYLINDER ADK A2,8 INT210 EQU * ANK A2,/1F SLL A2,2 PHYSICAL SECTOR AND ORDER CODE ST A2,SECNBR EJECT * * READ SECTOR * LDR A1,A9 BUFFER ADDRESS READ20 LDKL A4,MUXCC NUMBER OF WORDS WERIO2 WER A4,/10 WRITE NUMBER OF WORDS WER A1,/11 WRITE BUFFER ADDRESS READ21 CIO A2,1,0 READ SECTOR RB(NA) READ21 LOOP UNTIL ACCEPTED READ22 SST A2,0 STATUS RB(NA) READ22 LOOP UNTIL ACCEPTED ANK A2,/1F STATUS RB(NZ) RDSEC2 LOOP UNTIL CORRECT READ ADKL A11,1 INCREMENT SECTOR COUNTER RTN A14 EJECT * * READ DISC SECTOR VERSION A3 * RDSEC3 EQU * LDK A2,0 LDR A1,A11 GET LOGICAL SECTOR NUMBER LDKL A7,/1000 LDKL A4,/3000 DIV300 EQU * SUR A1,A4 RF(N) DIV310 ADR A2,A7 RB DIV300 DIV310 EQU * ADR A1,A4 ADJUST DIVIDEND SRL A4,4 SRL A7,4 RB(NZ) DIV300 ADR A2,A2 * SUK A1,1 ST A1,SAVMEM RF(NP) CASE10 ,XXXX , , OR , XX,XX , ADK A2,1 , , XXXX, CASE10 EQU * LDR A4,A2 SRL A4,5 CW A4,CYLNBR RF(E) INT300 ST A4,CYLNBR STORE NEW CYLINDER NUMBER SLL A4,3 ORK A4,2 SET BIT 14 EJECT * * SEEK CYLINDER * SEEK30 CIO A4,1,0 RB(NA) SEEK30 * SEEK31 SST A4,0 GET STATUS RB(NA) SEEK31 * * INTERLACING * INT300 EQU * LDR A3,A2 ADR A2,A2 ADR A2,A3 INTERLACING FACTOR 3 ANK A2,/1F LD A4,CYLNBR GET CYLINDER NUMBER ANK A4,1 RF(Z) INT310 EVEN CYLINDER NUMBER ADK A2,8 SKEW FACTOR 180 DEG. * INT310 EQU * ANK A2,/1F SLL A2,2 INTERLACED SECTOR NUMBER ST A2,SECNBR STORE PHYSICAL SECTOR NUMBER EJECT * * READ SECTOR * LDR A7,A9 BUFFER ADDRESS READ34 LDKL A4,MXCCD3 NUMBER OF WORDS WERIO3 WER A4,/10 WRITE NUMBER OF WORDS WER A7,/11 WRITE BUFFER ADDRESS * READ30 CIO A2,1,0 READ SECTOR RB(NA) READ30 LOOP UNTIL ACCEPTED * READ31 SST A2,0 GET STATUS RB(NA) READ31 LOOP UNTIL ACCEPTED ANK A2,/1F STATUS RB(NZ) RDSEC3 LOOP UNTIL CORRECT READ LDR A2,A9 BUFFER ADDRESS LDR A1,A1 RF(N) RETURN ,XXXX , , RF(P) READ33 , , XXXX, ADKL A2,256 SOURCE POINTER LDK A4,64 NUMBER OF WORDS TO MOVE READ32 EQU * , XX,XX , LDR* A1,A2 STR A1,A7 ADK A2,2 ADK A7,2 SUK A4,1 RB(NZ) READ32 CONTINUE MOVING LD A1,SAVMEM RF(P) RETURN LD A2,SECNBR PHYSICAL SECTOR NUMBER ADK A2,/C NEW SECTOR TO READ ANK A2,/7C SUK A1,1 RB READ34 EJECT READ33 EQU * ADK A2,128 SOURCE POINTER LDK A4,128 NUMBER OF WORDS TO MOVE RB READ32 RETURN ADKL A11,1 INCREMENT SECTOR NUMBER RTN A14 XIF IFT MFDISC=1 EJECT ******************************************************** * * * MDINIT - INITIALIZE MINI FIXED DISC UNIT * * ======================================= * * * * REFERENCED IN: SYSLOD,GETFIL * * * * ENTRY: A1 = DEVICE ADDRESS * * * * EXIT: * * * * WORK REGISTERS: * * * * SUBROUTINES: ERROR * * * ******************************************************** MDINIT EQU * * * INIT MINI FIXED DISC COMMANDS * MDI:00 ADS A1,SEEKM1 ADS A1,SEEKM2 ADS A1,READM2 ADS A1,READM3 EJECT * LDKL A2,MRDSEC GET SUBROUTINE ADDRESS ST A2,READ ST A2,READS ST A2,READVL ST A2,READCF RTN A14 EJECT ****************************************************** * * * MRDSEC - READ ONE SECTOR FROM MINI FIXED DISC * * ============================================= * * * * REFERENCED IN: SYSLOD * * * * ENTRY: A9 = BUFFER ADDRESS * * A11 = SECTOR NUMBER * * * * EXIT: * * * * WORK REGISTERS: * * * * SUBROUTINES: * * * ***************************************************** MRDSEC EQU * LDK A1,0 PREPARE FOR DIVISION LDR A2,A11 GET LOGICAL SECTOR NUMBER DVK 104 DIVIDE BY 104 SLL A2,2 ORK A2,3 SET BIT 14 AND 15 * * A1=SECTOR NUMBER ON CYLINDER * A2=CYLINDER NUMBER * ST A1,SECNBR STORE SECTOR NUMBER CW A2,CYLNBR RF(E) INTM10 SAME CYLINDER NUMBER ST A2,CYLNBR STORE CYLINDER NUMBER EJECT * * SEEK CYLINDER * SEEKM1 CIO A2,1,0 SEEK COMMAND RB(NA) SEEKM1 LOOP UNTIL ACCEPTED * SEEKM2 SST A2,0 GET STATUS RB(NA) SEEKM2 WAIT UNTIL ACCEPTED * * INTERLACING * INTM10 EQU * CWK A1,52 RF(L) INTM20 SECTOR 0-51 SUK A1,52 SECTOR 52-103 INTM20 EQU * LDR A2,A1 SLL A2,2 A2:=4*SECTOR NUMBER LDK A1,0 PREPARE FOR DIVISION DVK 52 ADR A1,A2 A1:=INTERLACED SECTOR NUMBER * * A1:=INTERLACED SECTOR NUMBER * LD A2,CYLNBR GET CYLINDER NUMBER SRC A2,3 RF(NN) INTM30 EVEN CYLINDER NUMBER SUK A1,26 SKEW FACTOR 26 RF(NN) INTM30 ADK A1,52 INTM30 EQU * SLL A1,2 LD A2,SECNBR GET SECTOR NUMBER BEFORE INTERLACING CWK A2,52 RF(L) INTM40 HEAD NUMBER 0 ORKL A1,/4000 HEAD NUMBER 1 INTM40 EQU * * * READ SECTOR * READM1 EQU * LDKL A4,MUXCC NUMBER OF WORDS LDR A7,A9 BUFFER ADDRESS * WERIOM WER A4,8 WRITE NUMBER OF WORDS WER A7,9 WRITE BUFFER ADDRESS * READM2 CIO A1,1,0 READ SECTOR RB(NA) READM2 LOOP UNTIL ACCEPTED * READM3 SST A1,0 GET STATUS RB(NA) READM3 LOOP UNTIL ACCEPTED ANK A1,/1F STATUS RB(NZ) MRDSEC LOOP UNTIL CORRECT READ ADKL A11,1 INCREMENT SECTOR NUMBER RTN A14 XIF IFT FLDISC=1 EJECT ************************************************ * * * FDINIT - INITIALIZE FLEXIBLE DISC * * ================================= * * * * REFERENCED IN: SYSLOD,GETFIL * * * * ENTRY: A1 - DEVICE ADDRESS * * * * EXIT: * * * * WORK REGISTERS: * * * * SUBROUTINES: * * * ************************************************ FDINIT EQU * LDKL A2,FRDSEC GET SUBROUTINE ADDRESS ST A2,READ STORE ST A2,READS ST A2,READVL ST A2,READCF * * INIT FLEXIBLE DISC COMMANDS * ORS A1,FRD:10 MODIFY READ SECTOR ORDER ANK A1,8 PROGRAMMED CHANNEL RF(NZ) FDI:10 YES! LDKL A1,FRD:40-2 NOT PROGRAMMED CHANNEL SUKL A1,FRD:20 ADKL A1,/5700 ST A1,FRD:20 MODIFY INR INSTRUCTION FDI:10 EQU * LDK A1,/14 LOCK ORDER EX FRD:10 EXECUTE ORDER RB(NA) *-4 LOOP UNTIL ACCEPTED SST A1,FDCU SENSE STATUS RB(NA) *-2 ANK A1,1 FLEXIBLE DISC OPERABLE? RB(NZ) FDI:10 NO! RTN A14 EJECT *********************************************************** * * * FRDSEC - READ SECTOR FROM FLEXIBLE DISC * * ======================================= * * * * REFERENCED IN: SYSLOD * * * * ENTRY: A9 - BUFFER ADDRESS * * A11 - SECTOR NUMBER * * * * EXIT: * * * * WORK REGISTERS: A1,A2,A3 * * * * SUBROUTINES: ERROR * * * *********************************************************** FRDSEC EQU * LDR A1,A11 GET SECTOR NUMBER SLL A1,4 ORKL A1,/4000 LDKL A2,MUXCC LOAD 1:ST MUX WORD LD A3,MXBUF LOAD 2:ND MUX WORD WER A2,FDIOP WRITE 1:ST MUX WORD WER A3,FDIOP+1 WRITE 2:ND MUX WORD LDR A2,A3 BUFFER START ADDRESS AD A2,SAVCON BUFFER END ADDRESS FRD:10 CIO A1,1,FDCU START READ RB(NA) FRD:10 LOOP UNTIL ACCEPTED FRD:20 INR A1,0,FDCU GET CHAR - MODIFIED IF MUX RF(NA) FRD:40 LOOP UNTIL ACCEPTED STR A1,A3 STORE CHARACTER ADK A3,2 INCREMENT BUFFER POINTER CWR A3,A2 RB(NE) FRD:20 * FRD:25 CIO A1,0,FDCU STOP READ RB FRD:20 FRD:40 SST A1,FDCU SENSE STATUS RB(NA) FRD:20 LOOP UNTIL ACCEPTED ANKL A1,/4E15 FATAL ERROR? RF(NZ) FRD:50 YES! ADKL A11,1 INCREMENT SECTOR ADDRESS RF(NN) FRD:45 LDKL A11,0 RESET LEAST SIGN. PART OF D.A. ADKL A12,1 INCREMENT MOST SIGNIFICANT PART OF D.A. RF(O) FRD:50 DISC ADDRESS ERROR! FRD:45 EQU * RTN A14 FRD:50 LDKL A1,LMP2 CALL ERROR XIF EJECT *************************************************** * * * GETFIL - GET CONFIGURATION FILE * * =============================== * * * * REFERENCED IN: SYSLOD * * * * ENTRY: A9 - BUFFER ADDRESS * * * * EXIT: A11 - SECTOR ADDRESS TO CONF. FILE * * * * WORK REGISTERS: A1,A2,A3,A4,A5,A6,A7,A8,A10 * * * * SUBROUTINES: READVL,READCF * * * *************************************************** GETFIL EQU * LDKL A11,0 VOLUME LABEL CF A14,READVL GET VOLUME LABEL READVL EQU *-2 LD A10,10,A9 GET VTOC BASE LDR A11,A10 SAVE AD A10,6,A9 LAST VTOC SECTOR LD A8,12,A9 GET VTOC RECORD LENGTH ADKL A11,1 FIRST FILE SECTOR IN VTOC GET:10 EQU * CF A14,READCF READ SECTOR READCF EQU *-2 LDK A7,QBLFAC BLOCKING FACTOR LDR A6,A9 GET START OF BUFFER GET:20 EQU * LDK A5,/20 LOAD SPACE CCR A5,A6 UNUSED FILE? RF(E) GET:50 YES! LDR A4,A6 START OF RECORD LDK A5,'S' STANDARD FILE CHARACTER CC A5,27,A6 STANDARD FILE? RF(NE) GET:50 NO! LDK A5,'$' LEADING CHAR IN CONF. FILE CCR A5,A4 CONFIGURATION FILE? RF(NE) GET:50 NO! GET:25 LDK A3,'C' THIS INSTRUCTION IS MODIFIED CCK A3,'CC' LOOKING FOR CONF. FILE? RF(NE) GET:85 NO! ADK A4,5 SIXTH CHARACTER LDK A5,':' CHARACTER TO PRECEED NUMBER GET:30 CCR A5,A4 CONFIGURATION FILE? RF(E) GET:40 YES! SUK A4,1 TRY NEXT CHARACTER CWR A4,A6 FIRST IN NAME? RF(E) GET:50 YES! RB GET:30 GET:40 EQU * * * CHECK APPLICATION NUMBER * LC A5,1,A4 GET LEFT DIGIT SLL A5,8 SHIFT TO LEFT BYTE LC A5,2,A4 GET RIGHT DIGIT CALL CONVRT CONVERT TO BINARY CW A1,SCTANO SAME AS APPLICATION NUMBER RF(NE) GET:50 * * CONFIGURATION FILE FOUND * LD A1,22,A6 LAST RECORD NUMBER ST A1,SAVE20,A13 SAVE LD A11,18,A6 SECTOR ADDRESS RTN A14 GET:50 EQU * ADR A6,A8 NEXT VTOC RECORD ADK A6,1 BYPASS STATUS CHARACTER SUK A7,1 MOORE RECORDS IN THIS SECTOR? RB(P) GET:20 YES! CWR A11,A10 LAST VTOC SECTOR? RB(NE) GET:10 NO! GET:60 LDK A3,'C' THIS INSTRUCTION IS MODIFIED CCK A3,'CC' LOOKING FOR CONF. FILE? RF(NE) GET:99 NO! * * CONFIGURATION FILE NOT FOUND - READ SOP AND SELECT * LOAD MEDIUM FOR CONFIGURATION FILE * LDK A2,/78 OTR A2,0,SOP SWITCH ON SOP LAMPS GET:70 EQU * CF A14,SOPIN ANKL A1,/003C ALLOWED SWITCH RB(Z) GET:70 NO! LDKL A2,LMP1 OTR A2,0,SOP SWITCH ON LOAD LAMP SRN A1,A2 LD A1,DEVTAB,A2 GET DEVICE ADDRESS CWK A2,5 DISC? RF(G) GET:80 YES! IFT FLDISC=1 CF A14,FDINIT INIT FLEXIBLE DISC RB GETFIL XIF IFF FLDISC=1 LDKL A1,LMP9 CALL ERROR ILLEGAL MONITOR OPTION XIF GET:80 EQU * IFT DISC=1 CF A14,DUINIT INIT DISC RB GETFIL XIF IFF DISC=1 LDKL A1,LMP9 CALL ERROR ILLEGAL MONITOR OPTION XIF GET:85 EQU * CCK A3,'SS' LOOKING FOR $SWAPP? RF(NE) GET:99 NO! LDK A5,0 RESET CHARACTER COUNTER GET:90 LCR A1,A4 GET CHAR IN FILENAME CC A1,SWPTAB,A5 CHECK IF PRESCIBED CHAR. RB(NE) GET:50 NO! ADK A4,1 NEXT CHARACTER ADK A5,1 INCREMENT CHARACTER COUNTER CWK A5,8 ALL CHARACTERS CHECKED? RB(NE) GET:90 NO! * * SWAPPABLE WORK BLOCK FILE FOUND - SAVE DISC ADDRESS * TO FILE AND TO NEXT SECTOR AFTER FILE * IM SCTSWB INDICATE SWB-FILE FOUND LD A1,18,A6 GET BIT 16-31 OF D.A. LD A2,16,A6 GET BIT 0-15 OF D.A. ST A1,SAVE25,A13 SAVE ST A2,SAVE26,A13 SAVE LD A3,SWPFEL,A6 GET BIT 16-31 OF LENGTH LD A4,SWPFEL-2,A6 GET BIT 0-15 OF LENGTH ADR A4,A2 ADD MOST SIGNIFICANT PART ADR A3,A1 ADD LEAST SIGNIFICANT PART RF(O) GET:92 OVERFLOW - ADD CARRY RF GET:98 GET:92 ADK A4,1 ADD CARRY ANKL A3,/7FFF RESET OVERFLOW GET:98 ST A3,SAVE27,A13 SAVE BIT 16-31 OF D.A. ST A4,SAVE28,A13 SAVE BIT 0-15 OF D.A. GET:99 RTN A14 EJECT ***************************************************** * * * LODCOM - LOAD CORE RESIDENT PART OF APPLICATION * * =============================================== * * * * LODSEG - LOAD ONE SEGMENT * * ========================= * * * * ENTRY: A8 - RELOCATION BASE * * A10 - EFFECTIVE LENGTH * * * * EXIT: * * * * WORK REGISTERS: A1,A2,A3,A4,A7 * * * * SUBROUTINES: MOVE,READ * * * ***************************************************** LODCOM EQU * LDR A3,A9 GET SAVE09 OF BUFFER LDR A2,A3 SAVE LDKL A7,240 NUMBER OF CODE WORDS LOD:10 EQU *-2 LDR A10,A10 APP >32 KB? RF(NN) LOD:20 NO! SUR A10,A7 DEC. LENGTH RF LOD:50 LOD:20 EQU * SUR A10,A7 CHECK IF IN END OF OF SEGMENT RF(NN) LOD:50 NO YET! CWK A7,256 128 WORDS/SECTOR? RF(NE) LOD:30 NO! ADR A7,A10 COMPUTE NUMBER OF CODE WORDS LDKL A10,0 INDICATE END OF SEGMENT RF LOD:52 LOD:30 EQU * ADR A7,A10 JUST MOVE SIGNIFICANT CHARACTERS! LDKL A10,0 INDICATE END OF SEGMENT LOD:50 EQU * CWK A7,256 128 WORDS/SECTOR? RF(E) LOD:52 YES! ADR A2,A7 START OF RELOCATION BITS CF A14,REBUF RELOCATE LOD:52 EQU * LDR A1,A9 START OF CODE PART LD A4,SAVE12,A13 FIRST SECTOR/BLOCK? RF(NZ) LOD:55 NO! IM SAVE12,A13 INDICATE NOT FIRST SECTOR/BLOCK ADK A1,8 SKIP 4 WORDS IN FIRST SECTOR/BLOCK SUK A7,8 DECREMENT NUMBER OF CHAR. TO MOVE LD A3,COMLG,A9 GET LENGTH SUK A3,240 LENGTH=240? RF(Z) LOD:54 YES! ADKL A10,0 SINGLE SECTOR/BLOCK APPLICATION? RF(Z) LOD:55 YES! LOD:54 ADKL A10,8 LOD:55 EQU * LDR A3,A7 NUMBER OF CHARACTERS TO MOVE LD A2,SAVE07,A13 GET TO-ADDRESS ADS A3,SAVE07,A13 UPDATE MEMORY ADDRESS LD A4,SCTOPT GET OPTION WORD ANK A4,1 MMU IN SYSTEM? RF(Z) LOD:60 NO! MVSU A3 MOVE TABLE FROM SYSTEM RF LOD:65 LOD:60 EQU * CALL MOVE LOD:65 EQU * LDR A10,A10 END OF SEGMENT? RF(NZ) LOD:70 RTN A14 EXIT LODSEG EQU * LDKL A1,256 NUMBER OF WORDS/SECTOR ST A1,LOD:10 MODIFY INSTRUCTION LOD:70 EQU * CF A14,READ READ EQU *-2 RB LODCOM EJECT ************************************************* * * * REBUF - RELOCATE BUFFER ROUTINE * * =============================== * * * * REFERENCED IN: LODCOM/LODSEG * * * * ENTRY: A3 - SAVE09 OF BUFFER * * A2 - SAVE09 OF RELOCATION TABLE * * * * EXIT: * * * * WORK REGISTERS: A1,A4,A5,A6 * * * * SUBROUTINES: * * * ************************************************* REBUF EQU * LDR A4,A2 GET SAVE09 OPF RELOCATION TABLE SUK A4,2 REB:10 EQU * ADK A4,2 NEXT RELOCATION WORD LDK A6,16 NUMBER OF RELOCATION BITS LDR* A1,A4 GET RELOCATION WORD REB:20 EQU * RF(NN) REB:30 DON'T RELOCATE THIS WORD! LDR* A5,A3 GET CODE WORD ADR A5,A8 RELOCATE STR A5,A3 STORE IT BACK REB:30 EQU * ADK A3,2 NEXT CODE WORD CWR A3,A2 END OF CODE WORD PART? RF(E) EXREL YES! SUK A6,1 MOORE RELOCATION BITS? RB(Z) REB:10 NO! SLL A1,1 NEXT RELOCATION BIT RB REB:20 EXREL EQU * RTN A14 EJECT ***************************************** * GETCON - GET CONTENT IN MEMORY WORD * ***************************************** * * REFERENCED IN: SEGGEN * * ENTRY: A2 - MEMORY ADDRESS * MMUOPT - MMU OPTION SWITCH (X) * * EXIT: A1 - CONTENT OF MEMORY ADDRESS * * WORK REGISTER: * * SUBROUTINES: * GETCON EQU * LD A1,SCTOPT GET OPTION WORD ANK A1,1 MMU OPTION RF(Z) GCON10 NO MMU ELR A1,A2 RF GCON20 GCON10 EQU * LDR* A1,A2 GCON20 EQU * RTN A14 RETURN END SYSLOD