DataMuseum.dkPresents historical artifacts from the history of: CR80 Hard and Floppy Disks |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CR80 Hard and Floppy Disks Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 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»