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

⟦e7a5362b0⟧ TextFile

    Length: 8192 (0x2000)
    Types: TextFile
    Names: »MCLR«

Derivation

└─⟦5ca485322⟧ Bits:30005483 8" CR80 Floppy CR80FD_0201 ( Backup SL Disk-error 2u )
    └─⟦46ea90735⟧ 
        └─ ⟦this⟧ »JAS.MCLR« 

TextFile

LIST 78.10.23
PROGRAM NAME: MCLR
BEGIN USE BASE
MODULE

MCBASE=       #8FC0                 ;   DEFAULT BASE BY STARTUP;
MCPROG=       #F800                 ;   PROGRAM ALLOCATION;
OC=           1                     ;   DEVICE NUMBER;
BNINRDY=      10                    ;   INPUT READY BIT;
BNOUTRDY=     11                    ;   OUTPUT READY BIT;
BNBRK=        13                    ;   "BREAK" BIT;
                                    ;
BAS:=          8                    ;   BASE;
PROGRAM:=     #A                    ;   PROGRAM;
PSW=          #D                    ;   PSW;
LOCACTION:=   #F                    ;   LOCAL ACTION RETURN;
CAUSE:=       #11                   ;   CAUSE;
                                    ;
CURADR:=      #14                   ;   CURRENT ADDRESS FOR DUMP;
TOP:=         #15                   ;   TOP ADDRESS;
SECTION:=     #16                   ;   DUMP/PATCH SECTION;
REGISTERS=    #40                   ;   REGISTER DUMP NUMBER;
CR=           13                    ;
LF=           10                    ;

USE PROG

MREGS:                              ; MREGS:
        SVP   REGSRET               ;   SAVE PROCESS TO CONTINUE
                                    ;       WITH REGSRET;
        MOVC  0                 R3  ;   0 => RE.ADDR;
MR0:                                ; MR0:
        MOV   0.     X3         R4  ;   0.ADR => REGISTER;
        JMP          S5  HEXOUT     ;   OUTPUT REGISTER;
        ADDC  1                 R3  ;   INCR(RE.ADDR);
        INE          R3  9          ;   IF ADDR <> 9 THEN
        JMP              MR0        ;     GOTO MR0;
        JMP          S5  NEXTLIN    ;   NEW LINE;
        MOV   BAS               R0  ;
        LDN          R0             ;   RELOAD PROCESS;
                                    ;
REGSRET:                            ; REGSRET:
        JMP              0.     X7  ;   RETURN;
;###
;GETADR - GET ADDRESS
;        CALL          EXIT
;
;R0                    DESTROYED
;R1                    DESTROYED
;R2                    0
;R3                    ADDRESS
;R5      LINK          DESTROYED
;R6                    DESTROYED
;R7                    DESTROYED

GETADR:                             ; GETADR:
        MOV          R5         R7  ;   SAVE(LINK);
G1:                                 ; G1:                              
        JMP          S5  HEXIN      ;   GET HEX CHAR;
        JMP              G1         ;   NOT HEX, GOTO G1;
        MOV          R1         R3  ;                                  
        MOVC  3                 R2  ;
G0:                                 ; GO:
        JMP          S5  HEXIN      ;   GET HEX CHAR;
        JMP              0.     X7  ;   RETURN(ERROR);
        SLL          R3  4          ;   VALUE*16=>VALUE;
        ADD          R1         R3  ;   CHAR+VALUE=>VALUE;
        SOB          R2  G0         ;   IF DECR(COUNT)<> 0 THEN
                                    ;      GOTO G0;
        JMP              1.     X7  ;   RETURN;


;HEXIN
;        CALL          EXIT
;
;R0                    DESTROYED
;R1                    HEX CHAR
;R5      LINK          LINK
;R6                    DESTROYED

HEXIN:                              ; HEXIN:
        JMP          S6  INCHAR     ;   GET CHAR;
HEXIN1:                             ; HEXIN1:
        ADDC  -<:::>            R1  ;   CHAR-<:::> => CHAR;
        ILTP         R1  <:A:>-<:::>;   IF CHAR < <:A:>-<:::>
        IGE          R1  0          ;      AND CHAR >= 0 THEN
        JMP              0.     X5  ;      RETURN(ERROR);
HEXIN2:                             ;
        ADDC  <:::>-<:A:>+10    R1  ;   CHAR+<:::>-<:A:>+10 => CHAR;
        ILT          R1  10         ;   IF CHAR<10 THEN
        ADDC  <:A:>-10-<:0:>    R1  ;      CHAR+<:A:>-10-<:0:> =>CHAR;
        SGEP         R1  16         ;   IF CHAR<16 OR
        SLT          R1  0          ;                >=0 THEN
        JMP              1.     X5  ;   RETURN;
        JMP              0.     X5  ;   RETURN(ERROR);


;###
;HEXOUT
;       CALL         EXIT
;
;R0                  DESTROYED
;R1                  DESTROYED
;R2                  DESTROYED
;R4     BIN VALUE    DESTROYED
;R5     LINK         LINK
;R6                  DESTROYED

HEXOUT:                             ; HEXOUT:
        MOVC  8#40              R1  ;   ASCII(SP) => CHAR;
        JMP          S6  OUTCHAR    ;   OUTPUT CHAR;
        MOVC  4                 R2  ;   4 => COUNT;
H2:     SLC          R4  4          ; H2:
        MOV          R4         R1  ;
        XTR          R1 4           ;   HEX(3:4) => VALUE;
        ILT          R1  10         ;   IF VALUE < 10 THEN
        ADDC <:0:>-<:A:>+10     R1  ;      VALUE+<:0:>-<:A:>+10 =>VALUE
        ADDC       <:A:>-10     R1  ;   VALUE+<:A:>-10 => CHAR;
        JMP          S6  OUTCHAR    ;   OUTPUT CHAR;
        SOB          R2  H2         ;   IF DECR(COUNT)<>0 THEN
                                    ;      GOTO H2;
        JMP              0.     X5  ;   RETURN;


;NEXTLIN
;       CALL         EXIT
;
;R0                  DESTROYED
;R1                  DESTROYED
;R2                  DESTROYED
;R5     LINK         LINK
;R6                  DESTROYED

NEXTLIN:                            ; NEXTLIN:
        MOVC  CR                R1  ;   ASCII(CR) => CHAR;
        JMP          S6  OUTCHAR    ;   OUTPUT CHAR;
        MOVC  5                 R2  ;
        MODC  LF                    ;   LF   ORELSE
N1:     MOVC  0                 R1  ;   0 =>CHAR;
        JMP          S6  OUTCHAR    ;   OUTPUT 6 FILLERS;
        SOB          R2  N1         ;
        JMP              0.     X5  ;   RETURN;
;###
INCHAR:                             ; INCHAR:
        MOVC  OC                R0  ;   OC=>DEVICE;
        SIO          R0         R0  ;   WAIT FOR INPUT READY;
        IBZ          R0  BNINRDY    ;
        JMP              INCHAR     ;
        IBN          R0  BNBRK      ;   IF <BREAK> THEN
        JMP              START      ;      GOTO START;
        MOVC  OC                R0  ;   OC=>DEVICE;
        RIO          R1         R0  ;   READ(CHAR,DEVICE);
        XTR          R1  7          ;
                                    ;
OUTCHAR:                            ; OUTCHAR:
        MOVC  OC                R0  ;
        SIO          R0         R0  ;                                  
        IBZ          R0  BNOUTRDY   ;
        JMP              OUTCHAR    ;
        MOVC  OC                R0  ;   OC=>DEVICE;
        WIO          R1         R0  ;   WRITE(CHAR,DEVICE);
        JMP              0.     X6  ;   RETURN;
;###
ERROR:                              ; ERROR:
        MOVC  <:?:>             R1  ;
        JMP          S6  OUTCHAR    ;   OUTPUT <:?:>;
                                    ;
START:                              ; START:
        MOV   BAS               R4  ;   GET BASE;
        MOV   SECTION           R3  ;
STR0:                               ; STR0:
        MOVC  OC                R0  ;
        MOVC  3                 R1  ;
        CIO          R1         R0  ;   ENABLE TERMINAL IF;
        JMP          S5  NEXTLIN    ;
        MOVC  <:>:>             R1  ;
        JMP          S6  OUTCHAR    ;   OUTPUT >;
STR1:                               ; STR1:
        JMP          S6  INCHAR     ;   GET COMMAND;
        ADDC  -27               R1  ;
        IEQ          R1  27-27      ;   ESC - MONITOR CONTROL;
        JMP              BOOT       ;
        IEQ          R1  <: :>-27   ;   SPACE - GOTO STR1;
        JMP              STR1       ;
        ADDC  27-<:L:>          R1  ;
        IEQ          R1  <:B:>-<:L:>;   B - ENTER NEW BASE;
        JMP              ENTERBASE  ;
        IEQ          R1  <:X:>-<:L:>;   X - RUN PROGRAM;
        JMP              RUNPROG    ;
        SVP              STR2       ;   SAVE PROCESS;
        MOVC  LOCACT            R0  ;   INSERT LOCAL ACTION ADDRESS;
        MOV          R0  LOCACTION  ;
        MOV          R3  SECTION    ;   INSERT SECTION;
        IEQ          R1  <:R:>-<:L:>;   R - INSERT REGISTER DUMP;
        JMP              INSERTREGS ;
        IEQ          R1  <:D:>-<:L:>;   D - MEMORY DUMP;
        JMP              MEMDUMP    ;
        IEQ          R1  <:C:>-<:L:>;   C - CONTINUE MEMORY DUMP;
        JMP              CMEMDUMP   ;
        IEQ          R1  <:P:>-<:L:>;   P - LOAD DATA;
        JMP              LOADDATA   ;
        IEQ          R1  <:S:>-<:L:>;   S - NEW SECTION;
        JMP              NEWSECTION ;
        JMP              ERROR      ;   UNKNOWN COMMAND. GOTO ERROR;
                                    ;
STR2:                               ; RELOAD:
        JMP              STR0       ;   GOTO STR0;
;###
INSERTREGISTERS:                    ; INSERT REGISTER DUMP:
        MOV   PROGRAM           R0  ;   PROGRAM.CUR
        ADDC  MREGS             R0  ;       +RE.PROCEDURE
        MODN  BAS                   ;
        MOV          R0  REGISTERS  ;         =>REGISTERS(ABS);
        JMP              START      ;   GOTO START;

                                    ;                                  
RUNPROG:                            ; RUNPROG:
        JMP          S5  GETADR     ;   GETADDRESS;
        JMP              ERROR      ;   IF ERROR THEN GOTO ERROR;
        LDN          R3             ;
                                    ;
LOADDATA:                           ; LOADDATA:
        JMP          S5  GETADR     ;   GETADDRESS;
        JMP              ERROR      ;   IF ERROR THEN GOTO ERROR;
        SUB          R4         R3  ;
LD0:                                ; LD0:
        JMP          S6  INCHAR     ;   GET CHARACTER;
        IEQP         R1  <:L:>      ;   L - DECR(RE.ADDRESS);
        ADDC -1                 R3  ;
        JMP              LD0        ;   GOTO LD0;
        IEQ          R1  <:S:>      ;   S - STOP INPUT;
        JMP              START      ;   GOTO START;
        JMP          S5  HEXIN1     ;   CONVERT TO HEX;
        JMP              LD0        ;   NO HEX CHAR: GOTO LD0;
        MOV          R1         R2  ;
        MOVC  3                 R4  ;   3 => COUNT;
LD1:                                ; LD1:
        JMP          S5  HEXIN      ;   GET HEX CHAR;
        JMP              ERROR      ;   IF ERROR THEN GOTO ERROR;
        SLL          R2  4          ;   HEX*16 => HEX;
        ADD          R1         R2  ;   CHAR+HEX => HEX;
        SOB          R4  LD1        ;   IF DECR(COUNT) <> 0 THEN
                                    ;   GOTO LD1;
        MOV   SECTION           R0  ;   GET SECTION;
        LDS          R0             ;   ENTER SECTION;
        MOV          R2  0.     X3  ;   SAVE WORD;
        MOV   PSWPOINTER        R0  ;   GET SECTION 0;
        LDS          R0             ;   ENTER SECTION;
        ADDC  1                 R3  ;   INCR(RE.ADDRESS);
        JMP              LD0        ;   GOTO NEW DATA(LD0);
;###
MEMDUMP:                            ; MEMDUMP:
        JMP          S5  GETADR     ;   GET START ADDRESS;
        JMP              ERROR      ;   IF ERROR;
        MOV          R3  CURADR     ;   ADDRESS => 0.CURADR;
        JMP          S6  INCHAR     ;   INCHAR;
        MOVC  #FFFF             R3  ;   #FFFF=>TOP;
        SNEP         R1  <: :>      ;   IF CHAR= SP THEN
        JMP          S5  GETADR     ;     GET TOP ADDRESS;
        JMP              START      ;       ERROR: GOTO START;
        MOV          R3  TOP        ;   TOP=>0.TOP;
                                    ;
CMEMDUMP:                           ; CONTINUE MEMDUMP:
        JMP          S5  NEXTLIN    ;   NEW LINE;
        MOV   CURADR            R4  ;   0.0.CURADR => RE.ADR;
        JMP          S5  HEXOUT     ;   OUTPUT RE.WORD;
        MOVC  <:L:>             R1  ;
        JMP          S6  OUTCHAR    ;
L1:                                 ; NEXT:
        MOV   CURADR            R7  ;   0.CURADR => RE.WORD;
        MOV   SECTION           R0  ;   GET SECTION;
        MOV   BAS               R1  ;   GET CURRENT BASE;
        LDS          R0             ;   ENTER NEW SECTION;
        MODN         R1             ;
        MOV   0.     X7         R4  ;   0.CURADR=>WORD;
        MOV   PSWPOINTER        R0  ;   GET SECTION 0;
        LDS          R0             ;   ENTER SECTION;
        JMP          S5  HEXOUT     ;   OUTPUT WORD;
        ADDC  1                 R7  ;   INCR(RE.WORD);
        MOV          R7  CURADR     ;   RE.WORD => 0.CURADR;
        MOV   TOP               R4  ;   0.TOP=>TOP;
        ILO          R4         R7  ;   IF TOP<CURADR THEN
        JMP              START      ;     GOTO START;
        MOVC  OC                R0  ;   OC=>DEVICE;
        SIO          R1         R0  ;   SENSE(STATUS,DEVICE);
        IBN          R1  BNBRK      ;   IF STATUS[BREAK] THEN
        JMP              START      ;     GOTO START;
        XTR          R7  3          ;   IF RE.WORD(2:3)<>0
        INE          R7  0          ;      THEN
        JMP              L1         ;      GOTO NEXT;
        JMP              CMEMDUMP   ;   GOTO CONTINUE MEMDUMP;

ENTERBASE:                          ; ENTER NEW BASE:
        JMP          S5  GETADR     ;   GET BASE ADDRESS;
        JMP              ERROR      ;     ERROR: GOTO ERROR;
        MOV          R3         R5  ;   
        SUB          R4         R5  ;   CHANGE TO BASE REL;
        MOV   PROGPOINTER       R6  ;   GET PROGRAM POINTER;
        ADDC  PBASE             R6  ;
        SUB          R4         R6  ;   CHANGE TO BASE REL;
        MOVM         X6         X5  ;   MOV PROMBASE TO NEW BASE;
        ADDC -16                R5  ;
        MOV          R3  BAS.   X5  ;   INSERT NEW BASE;
        MOV          R3  BAS+1. X5  ;
        MOV          R3  4.     X5  ;   SETUP R4 IN NEW BASE;
        LDN          R3             ;   LOAD PROCESS(NEW BASE);

;###
BOOT:                               ; ENTER BOOT LOADER:
        MOV   PROGPOINTER       R0  ;
        ADDC  BOOTBASE          R0  ;   RE.BOOTBASE(ABS);
        LDN          R0             ;   LOAD BOOT LOADER;

EMERGENCY:                          ; EMERGENCY ACTION:
        JMP          S5  NEXTLIN    ;   NEW LINE;
        MOVC  5                 R3  ;
        MODC  <:E:>-<:.:>           ;   OUTPUT  "E..."
EMER0:                              ;
        MOVC  <:.:>             R1  ;
        JMP          S6  OUTCHAR    ;
        SOB          R3  EMER0      ;
        MOVC  #FFE0             R0  ;
        LDN          R0             ;   LOAD MASTERCLEAR PROCESS;
                                    ;
                                    ;
LOCACT:                             ; LOCAL ACTION:
        JMP          S5  NEXTLIN    ;
        MOVC  <:C:>             R1  ;  WRITE (<:C::>);
        JMP          S6  OUTCHAR    ;
        MOV   CAUSE             R4  ;
        JMP          S5  HEXOUT     ;   WRITE (CAUSE);
        JMP          S5  NEXTLIN    ;
        MOV   BAS               R0  ;
        LDN                     R0  ;
                                    ;
                                    ;
NEWSECTION:                         ; SPECIFY NEW SECTION:
        JMP          S5  GETADR     ;   GET SECTION;
        JMP              ERROR      ;     ERROR: GOTO ERROR;
        IHS          R3  4          ;   IF SECTION>=4 THEN
        JMP              ERROR      ;     GOTO ERROR;
        SLL          R3  2          ;   SECTION<2 => PAGE BITS;
        ADDC  #E000             R3  ;   PAGE BITS + #E000 =>PSW;
        MOV          R3  SECTION    ;   PSW=>0.SECTION;
        JMP              START      ;   GOTO START;

IF LOC LT #E0 THEN 0,REPEAT #E0-LOC
ELSE MESSAGE LOC   FI
PBASE:  0,    0,      0,    #E000,  MCBASE,0,     0,     0
        MCBASE,MCBASE,MCPROG,INITP, 0,     #E000, 0,     LOCACT
BOOTBASE:
        #0050, #40BC, #0050, #0000, #0000, #0000, #0000, #E000
        #0000, #0000, #0000, LDNR0, #0000, #E000, EMACT, EMACT
; NOTICE: BOOTBASE+1  HOLDS THE INSTRUCTION   "LDN   R0".

LDNR0=        MCPROG+BOOTBASE+1     ;
PROGPOINTER:= PBASE+PROGRAM         ;
PSWPOINTER:=  PBASE+PSW             ;
EMACT=        EMERGENCY+MCPROG      ;

USE BASE
INITP:=       STR0+MCPROG           ;
END;###
«eof»