DataMuseum.dk

Presents historical artifacts from the history of:

CR80 Hard and Floppy Disks

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about CR80 Hard and Floppy Disks

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦447410b23⟧ TextFile

    Length: 25856 (0x6500)
    Types: TextFile
    Names: »MCBSRC«

Derivation

└─⟦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« 

TextFile

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»