|
|
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 - metrics - 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»