|
|
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: 8192 (0x2000)
Types: TextFile
Names: »MCLR«
└─⟦5ca485322⟧ Bits:30005483 8" CR80 Floppy CR80FD_0201 ( Backup SL Disk-error 2u )
└─⟦46ea90735⟧
└─⟦this⟧ »JAS.MCLR«
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»