DataMuseum.dkPresents historical artifacts from the history of: CR80 Hard and Floppy Disks |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CR80 Hard and Floppy Disks Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 25856 (0x6500) Types: TextFile Names: »MCBSRC«
└─⟦cf01ad7db⟧ Bits:30005181 8" CR80 Floppy CR80FD_0178 ( CR/D/1056 ICL/110 MASTER CLEAR + BOOTSTRAP COPY OF CR/D/0615 HKV 195111 HP1 ) └─⟦03c2450a7⟧ └─ ⟦this⟧ »MCB.MCBSRC«
LIST BEGIN MODULE MCBLOC USE BASE AREASWITCH=1 MCBLOC:=#FE00 DISP:= 0 ATEST:= 0 ;-----------------------------------------------------------------------00117000 ; DATA BASE DEFINITIONS 00117200 ;-----------------------------------------------------------------------00117400 MC0: MCCTO ; REGISTER 0, PRESET TO LOCAL INTERRUPT ADDRES00117500 MC1: 1 ; - 1 00117600 MC2: 1 ; - 2 0011770 MC3: 0 ; - 3 0011780 MC4: 1 ; - 4 00117900 MC5: 1 ; - 5 00118000 MC6: -1 ; - 6 00118100 MC7: FDLINK ; - 7, REGS 1 THRU 7 CONTAIN PRESET DAT0011820 ; FOR DISKETTE DATA AREA. 00118300 MCBAS: ATEST ; DATA BASE REGISTER 00118400 ; NOTE: 00118500 ; THE PROCESS IS DISPLACED: WHEN THE PROCESS I00118600 ; TO BE LOADED IT IS REFERENCED AS #FFE0. WHEN00118700 ; IT HAS BEEN LOADED IT IS REFERENCED AS #000000118800 MCMBAS: ATEST ; MODIFY REGISTER 00118900 MCPROG: PR ; PROGRAM BASE REGISTER 0011900 MCPC: PC ; PROGRAM LOCATION COUNTER 00119100 MCTIM: 0 ; TIMER REGISTER 00119200 MCPSW: #E000 ; PROCESS STATUS WORD; PRESET TO DISABLE ALL 00119300 ; INTERRUPTS (IO, CPU AND TIMER). 00119400 MCLNK: 0 ; PROCESS LINK 00119500 -1 -1, REPEAT 7; BASE AREA FOR THE PROCESS WHICH DOES NOT ; PERFORM LOADING AND INITIALISATION 32, 32, PR, PC1, 0, #A000 LOC= 14 MCEM ; EMERGENCY ADDRESS 00119700 MCLINT: MCEM ; LOCAL INTERRUPT ACTION ADDRESS MCINTR: 0 ; LOCAL INTERRUPT RETURN ADDRESS MCINTC: 0 ; LOCAL INTERRUPT CAUSE ; CAUSE CODES: PAER=2 ; PARITY ERROR TOER=3 ; TIME OUT 0,0 MCSEM: 0 ; MCB SEMAPHORE FOR CONTROLLING SINGLE ACCESS ; TO BOOTING MCLD: 0 ; LOADING DISKETTE DRIVE. POSSIBLE VALUES 00120300 ;0 ; DISKETTE DRIVE 0 00120400 ;1 ; DISKETTE DRIVE 1 00120500 DRVSTA: 0,0 ; DRIVE STATUS FOR TWO DRIVES: DRINIT:= 0 ; INITIALISED DRNRDY:= 1 ; NOT READY DRFAULT:= 2 ; FAULT DRNOBM:= 3 ; NO BOOT MODULE ON THIS DRIVE DRVOK:= 4 ; DRIVE OK, BOOT MODULE OK CDSTA: 0 ; STATUS MCPADI: 0 ; PROGRAM ADDRESS, INITIAL VALUE 00120600 MCPPGI: 0 ; PROGRAM MEMORY SECTION (PAGE), INITIAL VALUE00120700 MCIBS: 0 ; INITIALIZATION PROCESS BASE 0012080 MCCNTI: 0 ; PROGRAM LENGTH, INITIAL VALUE 00120900 MCCHECK: 0 ; CHECKWORD 00121000 MCDMM: 0 ; DUMMY 00121100 MCPAD: 0 ; PROGRAM ADDRESS, CURRENT VALUE 0012120 MCPPG: 0 ; PROGRAM MEMORY SECTION (PAGE), CURRENT VALUE00121300 MCDUM: 0 ; DUMMY 00121400 MCCNT: 0 ; PROGRAM LENGTH, CURRENT VALUE 00121500 ;----------------------------------------------------------------------- ; ; CONSTANTS RELATED TO OC ; ;----------------------------------------------------------------------- MCOCAD= 1 ; IO ADDRESS OF OC OCORD= 11 ; OUTPUT READY FLAG OCENAB= 3 ; ENABLE OC COMMAND ;-----------------------------------------------------------------------00125100 ; DISKETTE DATA 00125300 ;-----------------------------------------------------------------------00125500 BENTRY: ; BOOT ENTRY 00125600 1 ; AREA SIZE 00125700 1 ; SEGMENTS 00125800 0 ; HIBLOCKS 00125900 1 ; BLOCKING 00126000 0<8+1 ; AREA 00126100 AX=LOC 0012620 LOC=0 00126300 EAREAS=10 00126400 BEAREE: 0 ; BEAREASIZE 00126500 BESEGS: 0 ; BESEGMENTS 00126600 BEHIBK: 0 ; BEHIBLOCK 00126700 BEBLOG: 0 ; BEBLOCKING 00126800 BEAREA: 0 00126900 REPEAT(EAREAS - 1) ; BEAREA 00127000 BEFIRT: 0 ; FIRST ADDRESS 00127100 BEPAGE: 0 ; MEMORY SECTION (PAGE) 00127200 BEBASS: 0 ; BASE ADDRESS 00127300 BECOUT: 0 ; WORD COUNT 00127400 BECHECK: 0 ; CHECKSUM OF DISK FILE 00127500 CHECKM: 0 ; CHECK SUM OF BOOT ENTRY 00127600 BENTRYH: 0 ; ENTRY LENGTH 00127700 LOC=AX 00127800 TRACK: -1 00127900 FDLINK: 0 00128000 BLOCKNR: 0 00128100 INITCTRL: 0 0012820 STACK: 0, REPEAT 30 00128300 ESTACK: 0 00128400 BLKBUF: REPEAT BENTRYLENGTH 0012850 MEMBUF: REPEAT 64 00128600 ;-----------------------------------------------------------------------00128700 ; CONSTANTS AND DEFINITIONS RELATED TO DISKETTE 00128900 ;-----------------------------------------------------------------------00129100 FD=2 ; DISKETTE IO ADDRESS 00129200 FSEEK= 2#0100<11 0012930 FREST= 2#1000<11 00129400 FREAD= 2#0010<11 00129500 FRESET= #80 00129600 ;-----------------------------------------------------------------------0013590 ; END OF DATA AREA 00136100 ;-----------------------------------------------------------------------00136300 USE PROG 00136400 ;-----------------------------------------------------------------------00136900 ; START OF PROGRAM AREA 0013710 ; MCSOCS ; SENSE OC STATUS AND RETURN WHEN READY FOR OUTPUT ; ; REGISTERS CALL EXIT ; R0 DESTROYED ; R1 DESTROYED ; R4 LINK DESTROYED ; ;----------------------------------------------------------------------- MCSOCS: ; BEGIN MCSOCS MOVC MCOCAD R0 ; MOVC OCENAB R1 ; CIO R1 R0 ; ENABLE OC SIO R0 R0 ; READ STATUS(OC) IBZ R0 OCORD ; IF NOT READY FOR OUTPUT THEN JMP MCSOCS ; CALL MCSOCS JMP X4 ; RETURN ; END ;----------------------------------------------------------------------- ; ; MCWROC ; SUBROUTINE WRITE OUTPUT TO OC ; REGISTERS CALL EXIT ; R0 - DESTROYED ; R4 LINK LINK ; R7 STACK STACK ; ;----------------------------------------------------------------------- MCWROC: ; BEGIN MOVC MCOCAD R0 ; OC=>DEVICE WIO X7 R0 ; 0.STACK=>DEVICE JMP X4 ; END ;----------------------------------------------------------------------- ; ; MCOTCH ; SUBROUTINE OUTPUT CHARACTER TO OC - MCOTCH ; ; REGISTERS CALL EXIT ; R0 CHARACTER CHARACTER ; R5 LINK LINK ; R7 STACK STACK ; ;----------------------------------------------------------------------- MCOTCH: STC 5 ; SAVE REGS 0-5 MCOTCH1: ; WAIT READY FOR OUTPUT JMP S4 MCSOCS ; READ STATUS OF OC IF JMP S4 MCWROC ; WRITE CHARACTER TO OC UNS 5 ; RESTORE REGS 0-5 JMP X5 ; RETURN ;----------------------------------------------------------------------- ; MCOTHXC ; SUBROUTINE OUTPUT ONE HEXADECIMAL CHARACTER - MCOTHXC 00163000 ; MCOTHXC TAKES THE 4 LEAST SIGNIFICANT BITS OF R0 AND CONVERTS THE ; BINARY VALUE TO THE CORRESPONDING HEXADECIMAL CHARACTER (0 THRU F). ; MCOTHXC OUTPUTS THE CHARACTER. RETURN IS MADE TO LINK+0. ; ; REGISTERS CALL EXIT ; R0 BINARY BINARY ; R5 LINK LINK ; R7 STACK STACK ;----------------------------------------------------------------------- MCOTHXC: STC 5 ; SAVE REGS 0-5 XTR R0 4 ; GET 4 BIT BINARY VALUE ILO R0 10 ; CONVERT IT TO A HEXADECIMAL ADDC <:0:>-<:A:>+10 R0 ; CHARACTER ADDC <:A:>-10 R0 ; JMP S5 MCOTCH ; OUTPUT CHARACTER UNS 5 ; RESTORE REGS 0-5 JMP X5 ; RETURN ;----------------------------------------------------------------------- ; ; MCOTHXW ; SUBROUTINE OUTPUT ONE HEXADECIMAL WORD - MCOTHXW ; MCOTHXW CONVERTS A 16 BIT BINARY VALUE TO 4 HEXADECIMAL CHARACTERS ; AND WRITE THOSE IN SEQUENCE (MOST SIGNIFICANT FIRST). ; REGISTERS CALL EXIT ; R0 16 BIT BINARY 16 BIT BINARY ; R5 LINK LINK ; ;----------------------------------------------------------------------- MCOTHXW: STC 5 ; SAVE REGS 0-5 MOVC 4 R1 ; PRESET LOOP COUNT MCOTHXL: ; LOOP START: SLC R0 4 ; GET NEXT 4 BIT BINARY VALUE JMP S5 MCOTHXC ; CONVERT AND OUTPUT SOB R1 MCOTHXL ; IF NOT DONE GO TO LOOP START UNS 5 ; RESTORE REGS 0-5 JMP X5 ; RETURN ;----------------------------------------------------------------------- ; MCWRST ; WRITE STRING ; FIRST LOCATION AFTER CALL MUST CONTAIN A WORD COUNT. SUBSEQUENT LOCATI ; ONS MUST CONTAIN THE CORRESPONDING STRING. ; ; REGISTERS CALL EXIT ; R5 LINK DESTROYED ; R7 STACK STACK ; ;----------------------------------------------------------------------- MCWRST: ; BEGIN WRITE STC 5 ; MVP 0. X5 R3 ; N:=0.LINK MC0100: ; REPEAT MOV 5. X7 R5 ; RESTORE LINK MVP 1. X5 R0 ; CHAR:=LOWERBYTE(1.LINK) JMP S5 MCOTCH ; WRITE(CHAR) SWP R0 ; CHAR:=UPPERBYTE(1.LINK) JMP S5 MCOTCH ; WRITE(CHAR) INC 5. X7 ; LINK:=LINK+1 SOB R3 MC0100 ; N:=N-1 ; UNTIL N=0 UNS 5 ; JMP 1. X5 ; RETURN ; END ;----------------------------------------------------------------------- ; MCNL ; WRITE NEW LINE ; ;----------------------------------------------------------------------- MCNL: ; BEGIN STC 5 ; JMP S5 MCWRST ; WRITE( MCNL1: NL1L, <:<13><10>:>,0,0,0 ; 'CR LF NULL NULL NULL NULL NULL NL1L=LOC-MCNL1-1 ; NULL') UNS 5 ; JMP X5 ; RETURN ; END ;-----------------------------------------------------------------------00139900 ; SUBROUTINE READ PROGRAM WORD - MCRDP 00140100 ; MCRDP READS A PROGRAM WORD FROM THE CURRENT PROGRAM LOCATION DEFINED 00140200 ; BY: 00140300 ; CURRENT PROGRAM ADDRESS 00140400 ; CURRENT PAGE SELECTOR 00140500 ; AND INCREMENTS 00140600 ; CURRENT PROGRAM ADDRESS 00140700 ; IF CURRENT PROGRAM ADDRESS PASSES A MEMORY SECTION BOUNDARY, CURRENT 00140800 ; PAGE SELECTOR IS ALSO UPDATED. 0014090 ; INPUT 00141200 ; MCPAD 00141300 ; MCPPG 00141400 ; OUTPUT 00141500 ; MCPAD 00141600 ; MCPPG 00141700 ; REGISTER CALL EXIT 00142400 ; R0 - PROGRAM WORD 00142500 ; R1 - DESTROYED 00142600 ; R2 - DESTROYED 00142700 ; R3 - DESTROYED 00142800 ; R4 LINK LINK 00142900 ; R6 - DESTROYED 00143000 ; 00143100 ;----------------------------------------------------------------------- LOASEL=0 STOSEL=1 MCRDP: MODC LOASEL-STOSEL ; DEFINE LOAD/STORE SELECTOR 00144200 ;-----------------------------------------------------------------------0014320 ; SUBROUTINE STORE ASSEMBLED PROGRAM WORD - MCSTO 00143600 ; MCSTO IS SIMILAR TO MCRDP EXCEPT THAT IT STORES INSTEAD OF READS A 00143700 ; PROGRAM WORD. 00143800 ; REFER TO MCRDP. 00143900 ;-----------------------------------------------------------------------00144100 MCSTO: MOVC STOSEL R6 ; 00144300 MOV MCPAD R1 ; GET CURRENT PROGRAM ADDRESS 0014440 MOVC MCPPG R2 ; GET CURRENT PROGRAM PAGE 00144500 SVS R3 ; SAVE PSW 00144600 IOR R3 X2 ; DEFINE INTERRUPT MASK 0014470 LDS X2 ; SWITCH TO CURRENT PROGRAM PAGE 00144800 IEQ R6 LOASEL ; IF ACTION IS TO LOAD THEN 00144900 MOV X1 R0 ; GET PROGRAM WORD 00145000 IEQ R6 STOSEL ; IF ACTION IS TO STORE THEN 00145100 MOV R0 X1 ; STORE PROGRAM WORD 00145200 LDS R3 ; RESTORE PSW 00145300 ADDC 1 R1 ; INCREMENT CURRENT PROGRAM ADDRESS00145400 MOV R1 MCPAD ; 00145500 JON R1 MCSTOR ; IF THE PROGRAM ADDRESS DOES NOT 00145600 ; CROSS A MEMORY SECTION BOUNDARY 00145700 ; THEN RETURN ELSE 00145800 MOV X2 R3 ; 00145900 ADDC 1*4 R3 ; INCREMENT CURRENT PAGE SELECTOR00146000 MODC 3*4 ; 00146100 PUT R3 X2 ; 0014620 MCSTOR: JMP X4 ; RETURN 00146300 ;-----------------------------------------------------------------------00218900 ; MCCTO 00219100 ; CLEAR UP AFTER TIME OUT. 00219200 ; MCCTO IS ENTERED WHEN A LOCAL INTERRUPT IS GENERATED IN THE CP. 0021930 ; (TIME OUT, ILLEGAL INSTRUCTION, OR PARITY ERROR ON MEMORY). 00219400 ; MCTTO RESETS THE PSW AND PERFORMS RECOVERY BY EXECUTION OF ; JMP X4 ;-----------------------------------------------------------------------00221500 MCCTO: 0022160 MOV R7 MC7 ; SAVE R7 MOVC #E000 R7 ; RESTORE PSW LDS R7 ; 00222000 MOV MC7 R7 ; RESTORE R7 JMP X4 ; RETURN 0022260 ;-----------------------------------------------------------------------0022450 ; INITIALISE THE MCB 002248 ; MCINI IS ENTERED WHEN THE PROMMED MCB PROCESS IS LOADED, I.E. AT 00224900 ; START AND RESTART. 002250 ; MCINI UPDATES THE PROCESS DESCRIPTOR OF THE ACTIVE MCB PROCESS. 00225100 ; THIS IS NECESSARY BECAUSE THE PROMMED MCB PROCESS DESCRIPTOR IS 002252 ; DISPLACED ( BASE CONTENT NOT EQUAL TO BASE ADDRESS). 0022530 ; MCINI INITIALISES 00225400 ; THE BENTRY FILE (FROM PROMMED REGISTERS) 00225500 ; THE STACK BY PRESETTING THE STACK POINTER 0022560 ; THE COMMAND DEVICE STATUS WORD CDSTA (=OCSTA=MPSTA) 00225700 ; REGISTERS ENTRY EXIT 0022710 ; R6 - ADDRESS OF CDSTA 0022720 ; R7 - ESTACK 00227300 ;-----------------------------------------------------------------------00228500 MCINI: ; BEGIN MCINI SVP MCINI2 ; UPDATE REGISTER SAVE AREA MOV R0 MCLINT ; UPDATE LOCAL INTERRUPT ACTION MOVC 0 R0 ; 0022883 MOV R0 MCINTC ; CLEAR MCINTC MOV R0 MCSEM ; CLEAR MCSEM MOVC MCLD R7 ; CLEAR WORK AREA MOVC MCLD+1 R6 ; MOV R0 X7 ; 0022884 MCCLLP: 00228850 ILOP R6 ESTACK+1 ; 0022886 MOVM X7 X6 ; 0022887 JMP MCCLLP ; 00228880 LDN R0 ; 00228884 MCINI2: 0022888 MCGATE: ; MOVC 200 R0 ; MCWAIT: ; SOB R0 MCWAIT ; WAIT 200 MICROSECS MOVC MCSEM R0 ; RESS X0 0 ; RESERVE(MCSEM,0) JMP & MCWAITCPU ; (LOST: WAIT FOR CPU INTERRUPT, ; WON: CONTINUE) MOVC ESTACK R7 ; INITIALISE STACK 00228900 JMP S5 MCNL ; WRITENL JMP S5 MCWRST ; WRITE( MCST1: ST1L, <:INITIALISING CPU= :>; 'INITIALISING CPU= ' ST1L=LOC-MCST1-1 ; ) SVS R0 ; SWP R0 ; NMB:= CPU NUMBER XTR R0 3 ; JMP S5 MCOTHXC ; WRITE(NMB) JMP S5 MCNL ; MOVC CDSTA R6 ; CLR X6 ; CDSTA:=0 JMP MCSETP ; GO TO CHECK/SET PARITY MCWAITCPU: ; WAIT FOR CPU INTERRUPT: MOVC #FFF0 R0 ; LOAD PROCESS WHICH DOES NOT LDN R0 ; PERFORM LOADING AND INITIALISAT MCWAITCPUX: JMP MCWAITCPUX ; ;----------------------------------------------------------------------- ; ; MCSETP ; SUBROUTINE CHECK AND RESET PARITY ; MCSETP INSPECTS ALL RAM LOCATIONS. IF A PARITY ERROR IS FOUND THEN THE ; CORRESPONDING LOCATION IS CLEARED AND THE PARITY ERROR IS INDICATED ; IN CDSTA. ; ; INPUT ; MCPAD, MCPPG ; OUTPUT ; MCPAD, MCPPG, CDSTA ; ; REGISTERS CALL EXIT ; ALL BUT R7 - DESTROYED ; R7 STACK STACK ; ; CALLS ; MCRDP, MCSTO, MCSTOP ; CALLED BY ; MCTSCM ; ;----------------------------------------------------------------------- MCSETP: ; CHECK/RESET PARITY MOVC 0 R6 ; MOV R6 MCPPG ; START ADDRESS:=0 MOV R6 MCPAD ; MOVC MCINTC R5 ; MCPACH: ; FOR I=0 STEP 1 UNTIL 256K-1 DO MOVC 0 R0 ; BEGIN MOV R0 X5 ; MCINTC:=0 JMP S4 MCRDP ; READ CURRENT LOCATION JON X5 MCPER ; IF TIME OUT OR PARITY ERROR MCPACH1: ; MOVC MCPAD R6 ; JON X6 MCPACH ; THEN ERROR MOVC MCPAD R6 ; MOV MCPPG R0 ; XTR R0 4 ; SRL R0 2 ; JON R0 MCPACH ; END MOVC ESTACK R7 ; RESTORE STACK JMP MCSETPEND ; GO TO END OF PARITY CHECK/SET MCPER: ; ERROR: MOVC CDSTA R6 ; BEGIN IEQP X5 PAER ; IF PARITY ERROR THEN MOV X5 X6 ; SAVE ERROR CODE JMP S4 MCSTO ; CLEAR LOCATION INE X5 TOER ; ELSE IF TIME OUT THEN JMP MCPACH1 ; ADVANCE LOCATION TO NEXT 4K MOVC MCPAD R6 ; END MOV X6 R0 ; XTR R0 12 ; SUB R0 X6 ; MOVC 4096 R0 ; ADD R0 X6 ; JON X6 MCPACH1 ; MOVC MCPPG R6 ; MOV X6 R3 ; ADDC 1*4 R3 ; MODC 3*4 ; PUT R3 X6 ; JMP MCPACH1 ; MCSETPEND: ; END OF PARITY CHECK/SET: JMP S5 MCWRST ; WRITE( MCST2: ST2L, <:MEMORY PARITY :> ; 'MEMORY PARITY ' ST2L=LOC-MCST2-1 ; ) MOV CDSTA R0 ; IF PARITY ERROR THEN JOZ R0 MC0200 ; JMP S5 MCWRST ; WRITE( MCST3: ST3L, <:ERROR:> ; 'ERROR' ST3L=LOC-MCST3-1 ; ) JMP MC0210 ; ELSE MC0200: JMP S5 MCWRST ; WRITE( MCST4: ST4L, <:OK:> ; 'OK' ST4L=LOC-MCST4-1 MC0210: ; ) JMP S5 MCNL ; WRITENL MOVC 0 R0 ; DISK:=0 ;-----------------------------------------------------------------------00273900 ; 00274000 ; LOAD FROM DISKETTE: 00274100 ; LOAD BOOTSTRAP BLOCK AND CHECK IT. 00274200 ; IF OK, THEN LOAD FILE DESCRIBED BY THE BOOTSTRAP BLOCK; 00274300 ; 00274400 ;----------------------------------------------------------------------- ; 00274600 MCFDLD: ; MCFDLD: 00274700 XTR R0 1 00274800 MOV R0 MCLD 00274900 MOVC -32 R7 ; INITIALISE BENTRY FILE UNS 7 ; STC 6 ; MOD MCLD ; 00275000 MOVC FSEEK R2 ; SEEK TRACK 0 OF LOAD DEVICE; 00275100 JMP S6 CONTROL ; 00275200 MOVC 0 R3 ; 0=>BLOCKNR; 00275300 MOV R3 INITCTRL ; 0=>0.INITCONTROL; 00275400 MOV R3 MCPPG ; 0=>CURRENT PAGE SELECTOR 00275500 MOVC BLKBUF R4 ; 00275600 MOV R4 MCPAD ; RE.BLKBUF=>0.WORDADDRESS; 00275700 MOVC BENTRY R5 ; BENTRY=> RE.ENTRY; 00275800 JMP S6 BLOCKIO ; BLOCKIO; 00275900 JMP S6 WAITTR ; WAITTRANSFER; 00276000 JMP S6 RESTORE ; STORE DATA; 00276100 MOVC 0 R6 ; 00276200 MOV R6 INITCTRL ; 0=>0.INITCONTROL; 00276300 MOVC BLKBUF R5 ; RE.ENTRY; 00276400 MOVL BEFIRT.X5 R01 ; FIRST ADDRESS,PAGE=> 00276500 MOVL R01 MCPAD. X6 ; PROGRAM ADDRESS,PAGE/CURRENT,00276600 MOVL R01 MCPADI.X6 ; PROGRAM ADDRESS,PAGE/INITIAL;00276700 MOVL BEBASS.X5 R01 ; BASEADDRESS,WORDCOUNT 00276800 MOVL R01 MCIBS. X6 ; => INIATOR PROCESS, 00276900 ; PROGRAM LENGTH/INITIAL;00277000 MOV BECHEK.X5 R0 ; BECHECK.ENTRY=> 00277100 MOV R0 MCCHECK ; 0.MCCHECK; 00277200 MOVC BENTRYLENGTH-1 R3 ; BENTRYLENGTH-1=>COUNT; 00277300 MOVC 0 R4 ; 0=>CHECKSUM; 00277400 L20: ; CALCULATE: 00277500 ADD 0. X5 R4 ; 0.ENTRY+CHECKSUM=>CHECKSUM; 00277600 ADDC 1 R5 ; INCR(RE.ENTRY); 00277700 SOB R3 L20 ; IF DECR(COUNT)<>0 THEN 00277800 ; GOTO CALCULATE; 00277900 MOV 0. X5 R5 ; 0.ENTRY=>CHECKSUM; 00278000 INE R4 R5 ; IF CHECKSUM<>SUM THEN 00278100 JMP ENTRYERROR ; GOTO ENTRYERROR; 00278200 MOVC BLKBUF R5 ; 00278300 L21: ; NEXTBLOCK: 00278400 MOV R3 BLOCKNR ; BLOCKNR=>BLOCKNR; 00278500 JMP S6 BLOCKIO ; BLOCKIO; 00278600 MOV BLOCKNR R3 ; 0.BLOCKNR=>BLOCKNR INEP R3 BEHIBK.X5 ; IF BLOCKNR=BEHIBLOCK.ENTRY THEN 00278800 ADDC 1 R3 ; INCR(BLOCKNR); 00278900 JMP L21 ; GOTO NEXTBLOCK; 00279000 JMP S6 WAITTR ; WAITTRANSFER; 00279100 JMP S6 RESTORE ; STORE LAST DATA; 00279200 JMP BOOTOK ; GO TO BOOT OK DISKERR: ; DISKERROR: IBZ R2 11 ; IF DRIVE FAULT THEN JMP DEVICEERR ; GO TO DEVICEERROR MODC DRNRDY-DRFAULT ; DEVICEERR: ; DEVICEERROR: MODC DRFAULT-DRNOBM ; ENTRYERR: ; ENTRYERROR: MODC DRNOBM-DRVOK ; BOOTOK: ; BOOT OK: MOVC DRVOK R1 ; MOD MCLD ; MOV DRVSTA R0 ; INE R0 R1 ; IF DRIVE STATUS CHANGE THEN JMP PRINTSTA ; GO TO PRINT STATUS MOV MCLD R0 ; ELSE ADDC 1 R0 ; DRIVE:=DRIVE+1 JMP MCFDLD ; GO TO MCFDLD PRINTSTA: ; PRINT STATUS: MOD MCLD ; MOV R1 DRVSTA ; SAVE NEW DRIVE STATUS MOVC ESTACK R7 ; INITIALISE STACK JMP S5 MCWRST ; WRITE( MCST5: ST5L, <:DRIVE= :> ; 'DRIVE= ' ST5L=LOC-MCST5-1 ; ) MOV MCLD R0 ; JMP S5 MCOTHXC ; WRITE(MCLD) IEQ R1 DRNRDY ; GO TO CASE DRVSTA.MCLD OF ( JMP PRINT1 ; DRNRDY: PRINT1 IEQ R1 DRFAULT ; JMP PRINT2 ; DRFAULT: PRINT2 IEQ R1 DRNOBM ; JMP PRINT3 ; DRNOBM: PRINT3 JMP MCPCHK ; DRVOK: MCPCHK PRINT1: JMP S5 MCWRST ; WRITE( MCST6: ST6L, <:, NOT READY:> ; ' NOT READY' ST6L=LOC-MCST6-1 ; ) JMP MC0300 ; GO TO MC0300 PRINT2: JMP S5 MCWRST ; WRITE( MCST7: ST7L, <:, FAULT:> ; ' FAULT' ST7L=LOC-MCST7-1 ; ) JMP MC0300 ; GO TO MC0300 PRINT3: JMP S5 MCWRST ; WRITE( MCST8: ST8L, <:, NO BOOT MODULE:> ; ' NO BOOT MODULE' ST8L=LOC-MCST8-1 ; ) MC0300: ; MC0300: JMP S5 MCNL ; WRITENL MOV MCLD R0 ; ADDC 1 R0 ; DISK:=DISK+1 JMP MCFDLD ; GO TO MCFDLD 00280400 ;-----------------------------------------------------------------------00280500 ; SUBROUTINE BLOCKIO: 00280600 ; LOAD A DATABLOCK FROM DISKETTE, SPECIFIED BY 00280700 ; BLOCKNR AND ENTRY. 00280800 ; 00280900 ; CALL EXIT 00281000 ;R0 DESTROYED 00281100 ;R1 DESTROYED 00281200 ;R2 DESTROYED 00281300 ;R3 BLOCKNR DESTROYED 00281400 ;R4 DESTROYED 00281500 ;R5 RE.ENTRY RE.ENTRY 00281600 ;R6 LINK DESTROYED 00281700 ;R7 DESTROYED 00281800 ;-----------------------------------------------------------------------00281900 00282000 BLOCKIO: ; BLOCKIO: 00282100 MOV R6 FDLINK ; LINK=>0.DKLINK 00282200 MOV R5 R6 ; RE.ENTRY=>RE.ADDR; 00282300 MOV BEBLOG.X5 R1 ; EBLOCKING.ENTRY=>BLOCKING; 00282400 JOZ R1 ENTRYERR ; IF BLOCKING=0 THEN 00282500 ; GOTO ENTRYERR; 00282600 MOVC EAREAS R2 ; EAREAS=>COUNT; 00282700 L1: ; AREA: 00282800 ILT R3 R1 ; IF BLOCKNR<BLOCKING THEN 00282900 JMP L2 ; GOTO ADDRESS; 00283000 SUB R1 R3 ; BLOCKNR-BLOCKING=>BLOCKNR; 00283100 ADDC 1 R6 ; INCR(ADDR); 00283200 SOB R2 L1 ; IF DECR(COUNT)<>0 THEN 00283300 ; GOTO AREA; 00283400 JMP ENTRYERROR ; GOTO ENTRYERR 00283500 L2: ; ADDRESS: 00283600 MOV BEAREA.X6 R0 ; BEAREA.ADDR=>AREAADDRESS; 00283700 IEQ R0 -1 ; IF AREAADDRESS=-1 THEN 00283800 JMP ENTRYERR ; GOTO ENTRYERR; 00283900 MOVC #FF00 R2 ; AREAADRESS(15:8) 00284000 AND R0 R2 ; =>256*TRACK; 00284100 XTR R0 8 ; AREAADRESS(7:8)=>SECTOR; 00284200 JOZ R3 L5 ; IF BLOCKNR=0 THEN 00284300 ; GOTO MAKEADDRESS; 00284400 MOV BESEGS.X5 R7 ; BESEGMENTS.ENTRY=>SEGMENTS; 00284500 L3: ; BLKADDR: 00284600 ADD R7 R0 ; SECTOR+SEGMENTS=>SECTOR; 00284700 SOB R3 L3 ; IF DECR(BLOCKNR)<>0 THEN ; GOTO BLKADDR; L4: ; SEGTST: ILT R0 27 ; IF SECTOR<27 THEN JMP L5 ; GOTO MAKEADDRESS; ADDC -26 R0 ; SECTOR-26=>SECTOR; ADDC 256 R2 ; TRACK+1=>TRACK; JMP L4 ; GOTO SEGTST; L5: ; MAKEADDRESS: ADD R2 R0 ; 256*TRACK(15:8)+SECTOR=>ADDR; MOV BESEGS.X5 R1 ; ESEGMENTS.ENTRY=>SEGCOUNT; SEEKTRK: ; SEEKTRK: MOV R0 R2 ; SRL R2 7 ; TRACK//128*3 MOV R2 R3 ; ADD R2 R3 ; ADD R2 R3 ; =>OFFSET; L6: ; DISPCALC: IGEP R3 26 ; IF OFFSET>=26 THEN ADDC -26 R3 ; OFFSET-26=>OFFSET; JMP L6 ; GOTO DISPCALC; MOV R0 R2 ; ADDR(15:8)=> SRL R2 8 ; TRACK; MOV TRACK R6 ; 0.TRACK=>OLDTRACK; IEQ R2 R6 ; IF TRACK=OLDTRACK THEN JMP BLOCKOP ; GOTO BLOCKOP; MOV R2 TRACK ; TRACK=>0.TRACK; JMP S6 WAITTRFER ; WAITTRANSFER; MOV TRACK R2 ; 0.TRACK=>TRACK; ADDC FSEEK R2 ; FSEEK+TRACK=>DATA; JMP S6 CONTROL ; SEEK TRACK; BLOCKOP: ; BLOCKOP: JMP S6 WAITTRFER ; WAITTRANSFER; MOV R0 R2 ; SECTOR(7:8)=> XTR R2 8 ; SEGMENT; ADD R3 R2 ; DISPL+SEGMENT=>SEGMENT; IGE R2 27 ; IF SEGMENT>=27 THEN ADDC -26 R2 ; SEGMENT-26=>SEGMENT; ADD R2 R2 ; SEGMENT+SEGMENT=>SEGMENT; IGE R2 27 ; IF SEGMENT>=27 THEN ADDC -27 R2 ; SEGMENT-27=>SEGMENT; ADDC FREAD R2 ; FREAD+SEGMENT=>DATA; JMP S6 CONTROL ; MOV INITCTRL R4 ; INE R4 0 ; IF 0.INITCTRL<>0 THEN JMP S6 RESTORE ; STORE DATA; MOV R6 INITCTRL ; RE.INITCTRL=>0.INITCTRL; ; NEXTSEGMENT: ADDC -1 R1 ; DECR(SEGCOUNT); IEQ R1 0 ; IF SEGCOUNT=0 THEN JMPI FDLINK ; RETURN; ADDC 256 -26 R0 ; INCR(TRACK); ; SEGMENT-26=>SEGMENT; IBZP R0 7 ; IF SEGMENT=0 THEN ADDC 1 R0 ; INCR(SEGMENT); JMP SEEKTRK ; GOTO SEEKTRK; ADDC -256 +27 R0 ; DECR(TRACK); ; SEGMENT+27=>SEGMENT; JMP BLOCKOP ; GOTO BLOCKOP; ;---------------------------------------------------------------------- ; ; SUBROUTINE CONTROL: ; INITIATE DISK TRANSFER. ; ;----------------------------------------------------------------------- CONTROL: ; CONTROL: MOV MCLD R7 ; 0.MCLD=>DRIVE; SLL R7 8 ; ADD R7 R2 ; DRIVE<8+DATA=>DATA; CONTROL1: ; CONTROL1: MOVC FD R7 ; FD=>DEVICE; CIO R2 R7 ; CONTROL(DATA,DEVICE); JMP 0. X6 ; RETURN; ;----------------------------------------------------------------------- ; ; SUBROUTINE WAITTRANSFER. ; WAIT FOR DISK GOING NOT BUSY, THEN READ DATA INTO ; MEMORY BUFFER. ; TEST AUTOSTATUS. IF AUTOSTATUS<>0 THEN GOTO TESTCHANGE. ; ;---------------------------------------------------------------------- WAITTRANSFER: ; WAITTRANSFER: MOVC FD R7 ; FD=>DEVICE; MOVC 60 R4 ; 60=>COUNT; SOB R4 LOC ; WAIT(LOC,COUNT); C1: ; TESTBUSY: MOD8 #80 ; SIO X4 R7 ; SENSE(XSTATUS,DEVICE); IBN X4 6 ; IF XSTATUS(BUSY:1)<>0 THEN JMP C1 ; GOTO TESTBUSY; MOVC 64 R4 ; 64=>COUNT; MOVC MEMBUF R2 ; RE.MEMBUF; C2: ; READDATA: RIO X2 R7 ; READ(0.BLKBUF,DEVICE); ADDC 1 R2 ; INCR(RE.BLKBUF); SOB R4 C2 ; IF DECR(COUNT)<>0 THEN ; GOTO READDATA; SIO R2 R7 ; SENSE(STATUS,DEVICE); IBN R2 0 ; IF STATUS(0:1)=1 THEN ADDC -1 R2 ; 0=>STATUS(0:1); JON R2 TESTCHANGE ; IF STATUS<>0 THEN ; GOTO TESTCHANGE; JMP 0. X6 ; RETURN; TESTCHANGE: ; TESTCHANGE: IBZ R2 7 ; IF STATUS(DISKCHANGE:1)=0 THEN JMP DISKERR ; GOTO DISKERR; IBN X4 1 ; IF XSTATUS(1:1)=1 THEN MODC 1<8 ; FREST+1<(=>DATA ORELSE MOVC FREST R2 ; FREST=>DATA; JMP S6 CONTROL1 ; JMP S6 WAITTRFER ; WAITTRANSFER; JMP SEEKTRK ; GOTO SEEKTRACK; ;----------------------------------------------------------------------- ; SUBROUTINE RESTORE. ; ; STORE DATA FROM MEMORY BUFFER CORRECTLY. ; ; REGISTERS: ; CALL EXIT ; R6 LINK LINK ; R7 DESTROYED ; ;----------------------------------------------------------------------- RESTORE: ; RESTORE: MOVC ESTACK R7 ; STC 6 ; SAVE R0-R6; MOVC MEMBUF R5 ; RE.MEMBUF; MOVC 64 R7 ; 64=>COUNT; ST0: ; GETDATA: MOV 0. X5 R0 ; 0.MEMBUF=>WORD; ADDC 1 R5 ; INCR(RE.MEMBUF); JMP S4 MCSTO ; STORE WORD SOB R7 ST0 ; IF DECR(COUNT)<>0 THEN ; GOTO GETDATA; MOVC ESTACK-7 R7 ; UNS 6 ; UNSAVE R0-R6; JMP 0. X6 ; RETURN; ;-----------------------------------------------------------------------00261300 ; MCPCHK 00261500 ; CHECK LOADED PROGRAM 00261600 ; MCPCHK IS ENTERED WHEN A BOOT TRANSFER IS COMPLETED. 002617 ; MCPCHK CALCULATES A CHECK SUM BY ADDING THE CONTENTS OF ALL 00261800 ; THE PROGRAM LOCATIONS DEFINED BY MCPADI, MCPPGI AND MCCNTI. 0026190 ; THE CHECK SUM IS COMPARED TO MCCHECK, AND THE RESULT INDICATED AS 0026200 ; A COMPLETION CODE IN CDSTA. 002621 0 ; MCPCHK EXITS TO MCSTOP. 00262200 ; INPUT 002624 ; MCCNTI 00262500 ; MCPADI 00262600 ; MCPPGI 00262700 ; MCCHECK 00262800 ; OUTPUT 0026290 ; MCCNT 0026300 ; MCPAD 00263100 ; MCPPG 002632 ; CDSTA ;-----------------------------------------------------------------------00264200 MCPCHK: 0026430 MOVC 0 R5 ; CLEAR CHECKSUM 0026440 MOV MCCNTI R7 ; PRESET LOOP COUNT 00264500 MOVL MCPADI.X5 R01 ; PRESET PROGRAM START ADDRESS 0026460 MOVL R01 MCPAD. X5 ; AND MEMORY SECTION 0026470 IEQ R7 0 ; IF PROGRAM LENGTH IS ZERO THEN JMP MCOK ; GO TO PROGRAM OK MCCHKL: ; CHECK LOOP: 0026500 JMP S4 MCRDP ; GET PROGRAM WORD 0026510 ADD R0 R5 ; UPDATE CHECK SUM 00265200 SOB R7 MCCHKL ; IF NOT DONE GO TO CHECK LOOP 002653 MOV MCCHECK R0 ; IF CHECK SUM <>CHECK WORD THEN 00 IEQ R0 R5 ; JMP MC0400 ; MOVC ESTACK R7 ; INITIALISE STACK JMP S5 MCWRST ; WRITE( MCST9: ST9L, <: CHECKSUM ERROR:> ; ' CHECKSUM ERROR' ST9L=LOC-MCST9-1 ; ) JMP MC0300 ; GO TO MC0300 ; ELSE MCOK: ; PROGRAM OK: MC0400: MOVC ESTACK R7 ; INITIALISE STACK JMP S5 MCWRST ; WRITE( MCSTA: STAL, <: OK, PROCESS= :> ; ' OK, PROCESS =' STAL=LOC-MCSTA-1 ; ) MOV MCIBS R0 ; JMP S5 MCOTHXW ; WRITE(MCIBS) JMP S5 MCNL ; WRITENL MOV MCIBS R0 ; LDN R0 ; LOAD(MCIBS) ; ;----------------------------------------------------------------------- ; ; MCEMERGENCY ; EMERGENCY INTERRUPTS ARE RECEIVED HERE. ; THE BASE OF THE CALLING PROCESS IS STORED IN ABS LOCATION 5 AND THE ; PROCESS #F000 IS LOADED. ; ;----------------------------------------------------------------------- MCEMERGENCY: ; BEGIN MOVC #E000 R0 ; MOV MCBAS R1 ; GET OWN BASE LDS R0 ; SWITCH TO SECTION 0 MODN R1 ; MOV R1 5 ; SAVE BASE IN LOC 5 MOVC #F000 R0 ; LDN R0 ; LOAD PROCESS(#F000) ; END ; FILL SPACE BETWEEN PROGRAM AND DATA WITH #FFFF AX=LOC IF LOC LT 480+DISP -1, REPEAT(479+DISP-AX) FI PR:= MCBLOC PC= PR+MCINI PC1:= PR + MCWAITCPUX MCEM:= PR+MCEMERGENCY ; ; END «eof»