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: 49664 (0xc200) Types: TextFile Names: »RAMTST«
└─⟦70c9bac02⟧ Bits:30005090 8" CR80 Floppy CR80FD_0046 ( CR/D/1098 CR80 Test oc add =8 JAS Tilhører Holger Bay Version 790720 ) └─⟦324330f72⟧ └─ ⟦this⟧ »FH.RAMTST«
LIST ;---------------------------------------------------------------------- ; ; TEST PROGRAMME FOR 32, 16 AND 4 K RAM BOARD ; ;---------------------------------------------------------------------- BEGIN USE BASE MODULE PMASK= TRUE BS1= #EFD0 ; PROGRAM DEFAULT PROCESS START; PRG1= #F800 ; PROGRAM START; ; ; DEVICE DEFINITIONS; OC= 8 ; OPERATORS CONSOLE; RAMTM= 7 ; RAM TEST MODULE; ; ; OC STATUS BITS; BINP= 10 ; BOUT= 11 ; BPERR= 13 ; ; TEST MODULE REGISTERS; COT= 0 ; COUNT; ADR= 1 ; ADDRESS; CNT= 2 ; CONTROL; ; SAVELOCATIONS: BAS:= #0008 ; PROGRAM:= #000A ; LOCACTION:= #000F ; LOCRETURN:= #0010 ; CAUSE:= #0011 ; DEVPR:= #0012 ; CURADR:= #0014 ; TOP:= #0015 ; SAVE0:= #0016 ; SAVE1:= #0017 ; SAVE2:= #0018 ; SAVE3:= #0019 ; SAVE4:= #001A ; SAVE5:= #001B ; SAVE6:= #001C ; SAVE7:= #001D ; SAVE8:= #001E ; TESTNR:= #001F ; TESTOFF:= #0020 ; SIZE:= #0021 ; SIZE2:= #0022 ; SIZE3:= #0023 ; SIZE4:= #0024 ; SAVE9:= #0025 ; SAVE10:= #0026 ; SAVEWR:= #0027 ; SAVE11:= #0028 ; SAVE12:= #0029 ; SAVE13:= #002A ; TADR:= #002B ; SAVE14:= #002C ; DEVICE:= #002D ; SAVE15:= #002E ; ; MONITOR CALLS: REGISTERS= #0040 ; ;### USE PROG TESTS: ; RAM TESTS: ; TEST04: ; TEST ROUTINES, 4K: MCPT2 ; TEST1 ; TEST2 ; TEST3 ; TEST4 ; MSW04 ; TEST6 ; TEST7 ; TEST8 ; TEST9 ; TESTCH ; TEST2 ; TEST3 ; TEST4 ; MSW04 ; TEST6 ; TEST7 ; TEST8 ; TEST9 ; TESTEND1 ; TESTEND2 ; ; TEST16: ; TEST ROUTINES, 16K: MCPT2 ; TEST1 ; TEST2 ; TEST3 ; TEST4 ; MSW16 ; TEST6 ; TEST7 ; TEST8 ; TEST9 ; TESTCH ; TEST2 ; TEST3 ; TEST4 ; MSW16 ; TEST6 ; TEST7 ; TEST8 ; TEST9 ; TESTEND1 ; TESTEND2 ; ;### TEST32: ; TEST ROUTINES, 32K: MCPT2 ; TEST1 ; TEST2 ; TEST3 ; TEST4 ; MSW32 ; TEST6 ; TEST7 ; TEST8 ; TEST9 ; TESTEND1 ; TESTEND2 ; ;### ; PROCEDURE REFERENCES: IGETADR: GETADR ; IHEXIN: HEXIN ; IHEXIN1: HEXIN1 ; IHEXOUT: HEXOUT ; INEXTLIN: NEXTLIN ; IINCHAR: INCHAR ; IOUTCHAR: OUTCHAR ; IOUTTXNL: OUTTXNL ; IOUTTEXT: OUTTEXT ; ICHECKB: CHECKB ; IADRFAULT: ADRFAULT ; IDATFAULT: DATFAULT ; IPAGFAULT: PAGFAULT ; IMSWSET: MSWSET ; ICLEAR: CLEAR ; IALOAD: ALOAD ; ICHECK: CHECK ; ICHECKX: CHECKX ; ISTARTW: STARTW ; ISTARTR: STARTR ; IREADTM: READTM ; IWRWR: WRWR ; IWRRE: WRRE ; IREWR: REWR ; IRERE: RERE ; IINPAR: INPAR ; IPAGTST: PAGTST ; ; LABEL REFERENCES: ISTART: ; IINCOMMAND: INCOMMAND ; IERROR: ERROR ; ; CONSTANT REFERENCES: RE00C: #E00C ; RE000: #E000 ; RAAAA: #AAAA ; R8000: #8000 ; R5555: #5555 ; R4000: #4000 ; R2000: #2000 ; R1234: #1234 ; R12AB: #12AB ; RCDAB: #CDAB ; R1000: #1000 ; R2048: 2048 ; R1024: 1024 ; R015C: #015C ; ; PROGPOINTER: BPRG1 ; BOOTPOINTER: BBOOT ; BASEPOINTER: BS1 ; ;### LOCNT: ; LOCAL ACTION, SPEC FOR TIMOUT: MOV R0 SAVE7 ; MOV RE000 R0 ; LDS R0 ; MOV CAUSE R0 ; IF 0.CAUSE = 3 INEP R0 3 ; THEN MOV SAVE7 R0 ; JMP LOCNP ; RETURN(LOCRETURN+1); MOV LOCRETURN R0 ; ADDC 2 R0 ; MOV R0 LOCRETURN ; MOV SAVE7 R0 ; JMPI LOCRETURN ; ELSE GOTO NO PAR. ACTION; ; LOCMVM: ; LOCAL ACTION FOR MOVM, NO PAR.: MOV R0 SAVE7 ; MOV RE000 R0 ; LDS R0 ; MOV CAUSE R0 ; IEQ R0 2 ; IF 0.CAUSE = 2 THEN JMP LCNX ; RETURN MOV SAVE7 R0 ; ELSE CONTINUE; ; LOCMVMP: ; LOCAL ACTION FOR MOVM, PAR.: SUB BAS R6 ; MAKE ADDR REL.; ; CONTINUE; ; LOCACP: ; PAR. LOCAL ACTION: MOV R0 SAVE7 ; MOV RE000 R0 ; LDS R0 ; MOV R6 SAVE8 ; MOV CAUSE R0 ; INE R0 2 ; IF CAUSE <> PAR.ERR. THEN JMP LCNP1 ; GOTO LOCAL ACTION NO PAR.ERR. JMP S4 OUTTXNL ; WRITE(TEXT); <:PARITY ERR AT ADD<0>:> ; JMP LCNP3 ; GOTO WRITEADR; ;### LOCNP: ; LOCAL ACTION, NO PARITY ERR STOP: MOV R0 SAVE7 ; SAVE(R0); MOV RE000 R0 ; LDS R0 ; MOV CAUSE R0 ; IF 0.CAUSE = 2 THEN INE R0 2 ; BEGIN JMP LCNP1 ; RESTORE(R0); LCNX: ; RETURN: MOV LOCRETURN R0 ; ADDC 1 R0 ; MOV R0 LOCRETURN ; RETURN(LOCRETURN); MOV SAVE7 R0 ; JMPI LOCRETURN ; LCNP1: ; END; INE R0 3 ; IF 0.CAUSE = 3 THEN JMP LCNP2 ; BEGIN MOV R6 SAVE8 ; SAVE(ADR); JMP S4 OUTTXNL ; WRITE(TEXT); <:TIMEOUT AT ADD<0>:> ; LCNP3: ; WRITEADR: MOV SAVE8 R4 ; RESTORE(ADDR); MOV BAS R3 ; ADD R3 R4 ; MAKE ADDR REL; JMP S5 HEXOUT ; WRITE(ADDR); JMPI IINCOMMAND ; GOTO INCOMMAND; LCNP2: ; END; JMP S4 OUTTXNL ; WRITE(TEXT); <:PROGRAM ERR AT ADD<0>:> ; MOV LOCRETURN R4 ; JMP S5 HEXOUT ; WRITE(LOCRETURN); JMPI IINCOMMAND ; GOTO INCOMMAND; ;### LOCALL: ; SURVIVE ALL: MOV R0 SAVE7 ; SAVE(R0); MOV RE000 R0 ; LDS R0 ; CLEAR LOCAL ACTION BIT; MOV CAUSE R0 ; IF TIMEOUT OR PAR. ERR. THEN IHS R0 2 ; GOTO RETURN; JMP LCNX ; JMP LCNP2 ; GOTO PROGRAM ERR.; ; LOCSP: ; NO PAR. ACTION FOR DUMP: MOV R0 SAVE7 ; SAVE(R0); MOV RE000 R0 ; LDS R0 ; CLEAR LOCAL ACTION BIT; MOV CAUSE R0 ; IEQ R0 2 ; IF CAUSE = 2 THEN JMP LCNX ; GOTO RETURN ; ELSE CONTINUE; ; ; LOCACT: ; NORMAL LOCAL ACTION: JMP S4 OUTTXNL ; WRITE(TEXT); <:LOCAL ACTION, CAUSE<0>:> ; MOV CAUSE R4 ; JMP S5 HEXOUT ; WRITE(CAUSE); MOV BAS R0 ; LDN R0 ; RESTART; ; EMERGENCY: ; EMERGENCY ACTION: JMP S4 OUTTXNL ; WRITE(TEXT); <:EMERGENCY ACTION<0>:> ; MOVC BPRG1 R0 ; LDN R0 ; LOAD RAM TEST PROGRAM; ; 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; ; ; ; ;### ;---------------------------------------------------------------------- ; ; S U B R O U T I N E S ; ;---------------------------------------------------------------------- ;GETADR - GET ADDRESS ; CALL EXIT ; ;R0 DESTROYED ;R1 DESTROYED ;R2 0 ;R3 ADDRESS ;R5 LINK DESTROYED ;R6 DESTROYED ;R7 LINK 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 BIN VALUE ;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 ;R5 LINK LINK ;R6 DESTROYED NEXTLIN: ; NEXTLIN: MOVC 8#15 R1 ; ASCII(CR) => CHAR; JMP S6 OUTCHAR ; OUTPUT CHAR; MOVC 8#12 R1 ; ASCII(LF) => CHAR; JMP S6 OUTCHAR ; OUTPUT CHAR; MOVC 0 R1 ; JMP S6 OUTCHAR ; OUTPUT 4 FILLERS; JMP S6 OUTCHAR ; JMP S6 OUTCHAR ; JMP S6 OUTCHAR ; JMP 0. X5 ; RETURN; ;### ;INCHAR INPUT A CHAR; ; CALL EXIT ; ;R0 DESTROYED ;R1 CHAR ;R6 LINK LINK INCHAR: ; INCHAR: MOVC OC R0 ; OC=>DEVICE; SIO R0 R0 ; WAIT FOR INPUT READY; IBZ R0 BINP ; JMP INCHAR ; IBN R0 BPERR ; IF <BREAK> THEN JMPI ISTART ; GOTO START; MOVC OC R0 ; OC=>DEVICE; RIO R1 R0 ; READ(CHAR,DEVICE); XTR R1 7 ; CONTINUE WITH OUTCHAR; ; ; ;OUTCHAR OUTPUT A CHAR; ; CALL EXIT ; ;R0 DESTROYED ;R1 CHAR CHAR ;R6 LINK LINK OUTCHAR: ; OUTCHAR: MOVC OC R0 ; SIO R0 R0 ; IBZ R0 BOUT ; JMP OUTCHAR ; MOVC OC R0 ; OC=>DEVICE; WIO R1 R0 ; WRITE(CHAR,DEVICE); JMP 0. X6 ; RETURN; ;### ;OUTTEXT OUTPUT A TEXTSTRING; ; CALL EXIT ; ;R0 DESTROYED ;R1 DESTROYED ;R4 ADDR ADDR(UPDATED) (RETURN) ;R5 DESTROYED ;R6 DESTROYED OUTTXNL: ; OUTTEXT WITH NEWLINE: JMP S5 NEXTLIN ; NEWLINE; OUTTEXT: ; NEWCHAR: MVP 0. X4 R1 ; 0.ADDR => CHAR; XTR R1 7 ; CHAR(6:7) => CHAR; JOZ R1 OUTTEXT1 ; IF CHAR=0 THEN GOTO RET; JMP S6 OUTCHAR ; OUTCHAR; MVP 0. X4 R1 ; 0.ADDR(15:8) => SWP R1 ; CHAR; XTR R1 7 ; CHAR(6:7) => CHAR; JOZ R1 OUTTEXT1 ; IF CHAR=0THEN GOTO RET; JMP S6 OUTCHAR ; OUTCHAR; ADDC 1 R4 ; ADDR+1 => ADDR; JMP OUTTEXT ; GOTO NEWCHAR; OUTTEXT1: ; RET: JMP 1. X4 ; RETURN; ;CHECKB - CHECK FOR STOP FROM TERMINAL ; CALL EXIT ; ;R4 DESTROYED ;R5 DESTROYED ;R6 LINK LINK CHECKB: ; CHECK FOR STOP: MOVC OC R4 ; SIO R5 R4 ; SENSE OC; IBZ R5 BPERR ; IF INPUT NOT READY THEN JMP 2. X6 ; RETURN(NOT STOP); MOVC 3 R5 ; CIO R5 R4 ; ENABLE INTERFACE; JMP 0. X6 ; RETURN(STOP); ;### ;DATFAULT ; CALL EXIT ; ;R2 COUNT COUNT ;R3 ACT1 ACT1 ;R4 ACT2 ACT2 ;R5 LINK LINK ;R6 ADDR ADDR ;R7 DESTROYED DATFAULT: ; DATAFAULT: MOVC SAVE0+7 R7 ; STC 7 ; STACK REGISTERS; JMP S4 OUTTXNL ; WRITE(TEXT); <:DATA FAULT AT ADR<0>:> ; MOVC BAS R3 ; MOV SAVE6 R4 ; 0.SAVER6+ ADD X3 R4 ; 0.BAS => ADDR; JMP S5 HEXOUT ; WRITE(ADDR); JMP S4 OUTTEXT ; WRITE(TEXT) <: FAULT WORDS<0>:> ; MOV SAVE3 R4 ; JMP S5 HEXOUT ; WRITE(R3); MOV SAVE4 R4 ; JMP S5 HEXOUT ; WRITE(R4); JMP S6 CHECKB ; CHECK FOR STOP; MOVC 1 R2 ; STOP: MOV R2 2. X7 ; 2 => 0.SAVER2; UNS 6 ; NOT STOP: UNSTACK REGISTERS; ; END; JMP 0. X5 ; RETURN; ;PAGFAULT ; CALL EXIT ; ;R1 TPAGE TPAGE ;R4 PAGE PAGE ;R5 LINK LINK ;R7 DESTROYED PAGFAULT: ; PAGEFAULT: MOVC SAVE0+7 R7 ; STC 7 ; STACK REGISTERS; JMP S4 OUTTXNL ; WRITE(TEXT); <:PAGE FAULT AT<0>:> ; MOV SAVE1 R4 ; MOV R4 R3 ; IEQ R3 1 ; MOVC 2 R4 ; IEQ R3 2 ; MOVC 1 R4 ; JMP S5 HEXOUT ; WRITE(TPAGE); MOV SAVE4 R4 ; PAGE => ADDR; JMP ADRF1 ; GOTO WRITEADDR; ;### ;ADRFAULT ; CALL EXIT ; ;R1 COUNT COUNT ;R5 LINK LINK ;R6 ADDR ADDR ;R7 DESTROYED ADRFAULT: ; ADDRESSFAULT: MOVC SAVE0+7 R7 ; STC 7 ; STACK REGISTERS; JMP S4 OUTTXNL ; WRITE(TEXT); <:ADR FAULT AT ADR<0>:> ; MOVC BAS R3 ; MOV SAVE6 R4 ; 0.SAVER6+ ADD X3 R4 ; 0.BAS => ADDR; ADRF1: ; WRITEADDR: JMP S5 HEXOUT ; WRITE(ADDR); JMP S6 CHECKB ; CHECK FOR STOP; MOVC 1 R1 ; STOP: MOV R1 1. X7 ; 1 => 0.SAVER1; UNS 6 ; NOT STOP: UNSTACK REGISTERS; ; END; JMP 0. X5 ; RETURN; ; ; ;MSWSET ; CALL EXIT ; ;R0,R1 DESTROYED ;R2 MSW MSW ;R3,R4 DESTROYED ;R5 LINK LINK ;R6,R7 DESTROYED MSWSET: ; MODULE SWITCH SET: MOV R5 R7 ; SAVE(LINK); MSWSET1: ; SET SWITCH: JMP S4 OUTTXNL ; WRITE(TEXT); <:SET MSW: <0>:> ; MOVC 7 R3 ; FOR BIT:=7 UNTIL 1 DO MS1: ; BEGIN MOVC <:0:> R1 ; <:0:> => CHAR; MODN R3 ; MODC 7 ; IBN R2 0 ; IF MSW(7-BIT:1)=1 THEN ADDC <:1:>-<:0:> R1 ; <:1:> => CHAR; JMP S6 OUTCHAR ; OUTCHAR; SOB R3 MS1 ; END; MOVC <: :> R1 ; JMP S6 OUTCHAR ; WRITE(<: :>); JMP S6 INCHAR ; INCHAR; INE R1 <:N:> ; IF CHAR <> CR THEN JMP MSWSET1 ; GOTO SET SWITCH; JMP 0. X7 ; RETURN; ;### ;ALOAD - LOAD ADDRESS INTO ADDRESS ; CALL EXIT ; ;R1 DESTROYED ;R2 0 ;R5 LINK LINK ;R6 DESTROYED ALOAD: ; LOAD ADDRESS INTO ADDRESS: MOV BAS R6 ; NEG R6 ; SET ADDR; MOVC 0 R1 ; 0 = W; MOV SIZE R2 ; FOR I:=1 UNTIL SIZE DO ALOAD1: ; BEGIN MOV R1 X6 ; W => 0.ADDR; ADDC 1 R1 ; W+1 => W; ADDC 1 R6 ; ADDR+1 => ADDR; SOB R2 ALOAD1 ; END; JMP 0. X5 ; RETURN; ;CHECK - CHECK FOR ADDRESS IN ADDRESS ; CALL EXIT ; ;R2 0 ;R3 DESTROYED ;R4 DESTROYED ;R5 LINK DESTROYED ;R6 DESTROYED ;R7 DESTROYED CHECK: ; CHECK FOR ADDRESS: MOV R5 SAVE9 ; SAVE(LINK); MOV BAS R6 ; NEG R6 ; SET ADDR; MOVC 0 R4 ; 0 => EXPW; MOV SIZE R2 ; FOR I:=1 UNTIL SIZE DO CHECK1: ; BEGIN MOV X6 R3 ; 0.ADDR => W; INE R3 R4 ; IF W <> EXPW THEN JMP S5 DATFAULT ; DATAFAULT; ADDC 1 R4 ; EXPW+1 => EXPW; ADDC 1 R6 ; ADDR+1 => ADDR; SOB R2 CHECK1 ; END; JMPI SAVE9 ; RETURN; ;### ;CLEAR - SET RAM TO ALL ZEROES ; CALL EXIT ; ;R2 0 ;R3 0 ;R5 LINK LINK ;R6 DESTROYED CLEAR: ; CLEAR RAM: MOVC 0 R2 ; 0 => W; CLEARX: ; SET VALUE: MOV BAS R6 ; NEG R6 ; SET ADDR; MOV SIZE R3 ; FOR I:=1 UNTIL SIZE DO CLEAR1: ; BEGIN MOV R2 X6 ; W => 0.ADDR; ADDC 1 R6 ; ADDR+1 => ADDR; SOB R3 CLEAR1 ; END; JMP 0. X5 ; RETURN; ;STARTW - START TEST MODULE, WRITE ; CALL EXIT ; ;R0 MODE MODE (MODE = PAUSE AND PAGE) ;R1 DESTROYED ;R5 LINK LINK ;R6 DESTROYED ;R7 DESTROYED STARTW: ; START TEST MODULE, WRITE: MODC -128 ; SELECT WRITE; ;STARTR - START TEST MODULE, READ ; CALL EXIT ; ;R0 MODE MODE (MODE = PAUSE AND PAGE) ;R1 DESTROYED ;R5 LINK LINK ;R6 DESTROYED ;R7 DESTROYED STARTR: ; START TEST MODULE READ: MOVC 128 R7 ; SELECT READ; MOVC 0 R1 ; O => ADDR; MOVC ADR<6+RAMTM R6 ; WIO R1 R6 ; LOAD *ADDR*; MOV SIZE R1 ; 0.SIZE ADDC -1 R1 ; -1 => MOVC COT<6+RAMTM R6 ; *COUNT*; WIO R1 R6 ; ADD R0 R7 ; MOVC CNT<6+RAMTM R6 ; LOAD *CONTROL*; WIO R7 R6 ; JMP 0. X5 ; RETURN; ;### ;CHECKX - CHECK WITH HEADING ; CALL EXIT ; ;R0 DESTROYED ;R1 DESTROYED ;R2 0 ;R3 DESTROYED ;R4 DESTROYED ;R5 LINK LINK ;R6 DESTROYED ;R7 DESTROYED CHECKX: ; CHECK WITH HEADING: MOV BAS R6 ; NEG R6 ; SET ADDR; MOVC 0 R4 ; 0 => EXPW; MOV SIZE R2 ; FOR I:=1 UNTIL SIZE DO CHKX1: ; BEGIN MOV X6 R3 ; 0.ADDR => W; IEQ R3 R4 ; IF W <> EXPW THEN JMP CHKX2 ; BEGIN MOV R5 R3 ; SAVE(LINK); JMP S6 HEAD ; HEADING; MOV R3 R5 ; RESTORE(LINK); JMP CHECK ; GOTO CHECK; CHKX2: ; END; ADDC 1 R4 ; EXPW+1 => EXPW; ADDC 1 R6 ; ADDR+1 => ADDR; SOB R2 CHKX1 ; END; JMP 0. X5 ; RETURN; ;READTM - READ ERRORS FROM TEST MODULE ; CALL EXIT ;R5 LINK LINK ;R7 DESTROYED READTM: ; READ TEST MODULE: MOVC SAVE0+7 R7 ; STC 7 ; STACK REGISTERS; MOVC RAMTM R6 ; RIO R3 R6 ; *STATUS* => ERR; IBZ R3 14 ; IF ERR VALID THEN JMP READTM1 ; BEGIN JMP S6 HEAD ; HEADING; READTM2: ; WHILE ERR VALID AND JMP S6 CHECKB ; NOT STOP FROM OC DO JMP READTM3 ; BEGIN NOP ; JMP S4 OUTTXNL ; WRITE(TEXT); <:RST ERR<0>:> ; READTM3: ; MOV R3 R4 ; JMP S5 HEXOUT ; WRITE(ERR); MOVC RAMTM R6 ; RIO R3 R6 ; *STATUS* => ERR; SBZ R3 14 ; JMP READTM2 ; END; READTM1: ; END; MOVC SAVE0 R7 ; UNS 6 ; UNSTACK REGISTERS; JMP 0. X5 ; RETURN; ;### ;HEAD - HEADING FOR DOUBLE ACCESS TEST ; CALL EXIT ; ;R0 DESTROYED ;R1 DESTROYED ;R2 DESTROYED ;R4 DESTROYED ;R5 DESTROYED ;R6 LINK DESTROYED ;R7 LINK HEAD: ; HEADING: MOV R6 R7 ; SAVE(LINK); JMP S4 OUTTXNL ; WRITE(TEXT); <:PAUSE,BLOCK=<0>:> ; MOV SAVE10 R4 ; JMP S5 HEXOUT ; WRITE(PAGE,PAUSE); MOV SAVEWR R2 ; IGE R2 2 ; IF 0.SAVEWR < 2 THEN JMP HEAD1 ; BEGIN JMP S4 OUTTEXT ; WRITE(TEXT1); <: WR<0>:> ; END JMP HEAD2 ; ELSE HEAD1: ; BEGIN JMP S4 OUTTEXT ; WRITE(TEXT1A); <: RE<0>:> ; HEAD2: ; END; IBN R2 0 ; IF 0.SAVEWR IS EVEN THEN JMP HEAD3 ; BEGIN JMP S4 OUTTEXT ; WRITE(TEXT2); <:/WR<0>:> ; END JMP HEAD4 ; ELSE HEAD3: ; BEGIN JMP S4 OUTTEXT ; WRITE(TEXT2A); <:/RE<0>:> ; HEAD4: ; END; JMP 0. X7 ; RETURN; ;### ;INPAR - INPUT A PARAMETER ; CALL EXIT ; ;R0 DESTROYED ;R1 DESTROYED ;R5 LINK LINK ;R6 DESTROYED INPAR: ; INPARAMETER: JMPI S6 IINCHAR ; INCHAR; ADDC -<: :> R1 ; IF CHAR = <: :> THEN JOZ R1 INPAR ; GOTO INPARAMETER; ADDC -<:L:>+<: :> R1 ; IEQ R1 <:W:>-<:L:>; IF CHAR = <:W:> THEN JMP 1. X5 ; RETURN(W); IEQ R1 <:R:>-<:L:>; IF CHAR = <:R:> THEN JMP 0. X5 ; RETURN(R); JMPI IERROR ; GOTO ERROR; ;### ;WRWR TEST ; CALL EXIT ; ;R0-R5 DESTROYED ;R6 LINK DESTROYED ;R7 DESTROYED WRWR: ; WRITEWRITE: MOV R6 SAVE11 ; SAVE(LINK); MOVC 0 R0 ; 0 => MOV R0 SAVEWR ; 0.SAVEWR; MOV SAVE10 R0 ; RESTORE(MODE); JMPI S5 ISTARTW ; START TEST MODULE WRITE; JMPI S5 IALOAD ; FOR I:=1,2 DO JMPI S5 IALOAD ; LOAD ADDRESS INTO ADDRESS; MOVC RAMTM R6 ; RIO R1 R6 ; STOP TEST MODULE; JMPI S5 ICHECKX ; CHECK FOR ADDRESS; JMPI SAVE11 ; RETURN; ;WRRE TEST ; CALL EXIT ; ;R0-R5 DESTROYED ;R6 LINK DESTROYED ;R7 DESTROYED WRRE: ; WRITEREAD: MOV R6 SAVE11 ; SAVE(LINK); JMPI S5 ICLEAR ; CLEAR RAM; MOVC 1 R0 ; 1 => MOV R0 SAVEWR ; 0.SAVEWR; MOV SAVE10 R0 ; RESTORE(MODE); JMPI S5 ISTARTW ; START TEST MODULE WRITE; MOVC 2 R1 ; FOR I:=1 UNTIL 2 DO WRRE1: ; BEGIN MOV BAS R6 ; NEG R6 ; SET ADDR; MOV SIZE R2 ; FOR J:=1 UNTIL SIZE DO WRRE2: ; BEGIN MOV X6 R3 ; 0.ADDR => W; ADDC 1 R6 ; ADDR+1 => ADDR; SOB R2 WRRE2 ; END; SOB R1 WRRE1 ; END; MOVC RAMTM R6 ; RIO R1 R6 ; STOP TEST MODULE; JMPI S5 ICHECKX ; CHECK FOR ADDRESS; JMPI SAVE11 ; RETURN; ;### ;REWR TEST ; CALL EXIT ; ;R0-R5 DESTROYED ;R6 LINK DESTROYED ;R7 DESTROYED REWR: ; READWRITE: MOV R6 SAVE11 ; SAVE(LINK); JMPI S5 ICLEAR ; CLEAR RAM; MOVC 2 R0 ; 2 => MOV R0 SAVEWR ; 0.SAVEWR; MOV SAVE10 R0 ; RESTORE(MODE); JMPI S5 IALOAD ; LOAD ADDRESS; JMPI S5 ISTARTR ; START TEST MODULE READ; JMPI S5 IALOAD ; FOR I:=1,2 DO JMPI S5 IALOAD ; LOAD ADDRESS; JMPI S5 IREADTM ; READ ERRORS FROM TESTM.; JMPI S5 ICHECKX ; CHECK FOR ADDRESS; JMPI SAVE11 ; RETURN; ;RERE TEST ; CALL EXIT ;R0-R5 DESTROYED ;R6 LINK DESTROYED ;R7 DESTROYED RERE: ; READREAD: MOV R6 SAVE11 ; SAVE(LINK); JMPI S5 ICLEAR ; CLEAR RAM; MOVC 3 R0 ; 3 => MOV R0 SAVEWR ; 0.SAVEWR; MOV SAVE10 R0 ; RESTORE(MODE); JMPI S5 IALOAD ; LOAD ADDRESS; JMPI S5 ISTARTR ; START TESTMODULE READ; JMPI S5 ICHECKX ; FOR I:=1,2 DO JMPI S5 ICHECKX ; CHECK FOR ADDRESS; JMPI S5 IREADTM ; READ ERRORS FROM TESTM.; JMPI SAVE11 ; RETURN; ;### ;PAGTST - TEST OF PAGESWITCH; ; CALL EXIT ; ;R0-R5 DESTROYED ;R6 LINK DESTROYED ;R7 DESTROYED PAGTST: ; PAGETEST: MOV R6 SAVE12 ; SAVE(LINK); MOV BAS R6 ; NEG R6 ; RESET ADDR; MOVC 0 R3 ; 0 => PAGE; PGT1: ; NEWPAGE: MOV R3 R2 ; PAGE => MSW; IEQ R3 1 ; IF PAGE = 1 THEN MOVC 2 R2 ; 2 => MSW; IEQ R3 2 ; IF PAGE = 2 THEN MOVC 1 R2 ; 1 => MSW; MOV R2 R4 ; MSW => CPAGE; SLL R2 5 ; MSW*32 => MSW; MOV SAVE13 R0 ; 0.FIRSTBIT+MSW ADD R0 R2 ; => MSW; MOV RE000 R0 ; LDS R0 ; MOVC SAVE0+7 R7 ; STC 6 ; STACK REGISTERS; JMPI S5 IMSWSET ; SET MODULE SWITCH; MOVC SAVE0 R7 ; UNS 6 ; UNSTACK REGISTERS; MOVC 0 R1 ; FOR TPAGE:=0 UNTIL 3 DO PGT2: ; BEGIN MOV R1 R2 ; TPAGE => PPAGE; MOV RE000 R0 ; #E000+PPAGE SLL R2 2 ; *4 ADD R2 R0 ; LDS R0 ; => PSW; IEQ R1 R3 ; IF PAGE = TPAGE THEN JMP PGT3 ; GOTO SP; MOV X6 R0 ; 0.ADDR => W; JMP PGT4 ; IF NOT TIMEOUT PAGEFAULT; JMP PGT5 ; GOTO OK; PGT3: ; SP: MOV X6 R0 ; 0.ADDR => W; JMP PGT5 ; IF NOT TIMEOUT GOTO OK; PGT4: MOV RE000 R0 ; LDS R0 ; JMPI S5 IPAGFAULT ; PAGEFAULT; PGT5: ; OK: ADDC 1 R1 ; ILT R1 4 ; JMP PGT2 ; END; ADDC 1 R3 ; PAGE+1 => PAGE; ILT R3 4 ; IF PAGE <= 3 THEN JMP PGT1 ; GOTO NEWPAGE; MOV RE000 R0 ; LDS R0 ; SET PAGE TO ZERO; JMPI SAVE12 ; RETURN; ;### ;---------------------------------------------------------------------- ; ; F U N C T I O N S ; ;---------------------------------------------------------------------- INSERTREGISS: ; INSERT REGISTER DUMP: MOV PROGRAM R0 ; PROGRAM.CUR ADDC MREGS R0 ; +RE.PROCEDURE MODN BAS ; MOV R0 REGISS ; =>REGISTERS(ABS); JMP START ; GOTO START; ;---------------------------------------------------------------------- LOADDATA: ; LOADDATA: JMPI S5 IGETADR ; GETADDRESS; JMP ERROR ; IF ERROR THEN GOTO ERROR; SUB R4 R3 ; LD0: ; LD0: JMPI S6 IINCHAR ; 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; JMPI S5 IHEXIN1 ; CONVERT TO HEX; JMP LD0 ; NO HEX CHAR: GOTO LD0; MOV R1 R2 ; MOVC 3 R4 ; 3 => COUNT; LD1: ; LD1: JMPI S5 IHEXIN ; 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 R2 0. X3 ; SAVE WORD; ADDC 1 R3 ; INCR(RE.ADDRESS); JMP LD0 ; GOTO NEW DATA(LD0); ;---------------------------------------------------------------------- FILL: ; FILL RAM WITH VALUE: JMPI S5 IGETADR ; GET VALUE; JMP ERROR ; ERROR: GOTO ERROR; MOVC LOCNP R0 ; NO PARITY ACTION => MOV R0 LOCACTION ; 0.LOCAL ACTION; MOV R3 R2 ; VALUE => FILLVALUE; JMP S5 CLEARX ; FILL WITH FILLVALUE; JMP INCOMMAND ; GOTO INCOMMAND; ;---------------------------------------------------------------------- ADRFILL: ; FILL RAM WITH ADDRESS: MOVC LOCACP R0 ; MOV R0 LOCACTION ; SET LOCAL ACTION; JMPI S5 IALOAD ; FILL WITH ADDRESS; JMP NEWCOM ; GOTO NEWCOMMAND; ;### ;---------------------------------------------------------------------- MLIST: ; DUMP, NO PAR. CHECK: MOVC LOCSP R0 ; NO PAR ACTION => MOV R0 LOCACTION ; 0.LOCAL ACTION; ;---------------------------------------------------------------------- MEMDUMP: ; MEMDUMP: JMPI S5 IGETADR ; GET START ADDRESS; JMP ERROR ; IF ERROR; MOV R3 CURADR ; ADDRESS => 0.CURADR; JMPI S6 IINCHAR ; INCHAR; MOVC #FFFF R3 ; #FFFF=>TOP; SNEP R1 <: :> ; IF CHAR="SP" THEN JMPI S5 IGETADR ; GET TOP ADDRESS; JMP START ; ERROR: GOTO START; MOV R3 TOP ; TOP=>0.TOP; ; ;...................................................................... ; CMEMDUMP: ; CONTINUE MEMDUMP: JMPI S5 INEXTLIN ; NEW LINE; MOV CURADR R4 ; 0.0.CURADR => RE.ADR; JMPI S5 IHEXOUT ; OUTPUT RE.WORD; MOVC <:L:> R1 ; JMPI S6 IOUTCHAR ; L1: ; NEXT: MOV CURADR R3 ; 0.CURADR => RE.WORD; MOV R3 R4 ; MODN BAS ; MOV 0. X4 R4 ; 0.CURADR => WORD; JMPI S5 IHEXOUT ; OUTPUT WORD; ADDC 1 R3 ; INCR(RE.WORD); MOV R3 CURADR ; RE.WORD => 0.CURADR; MOV TOP R4 ; 0.TOP=>TOP; ILO R4 R3 ; IF TOP<CURADR THEN JMP START ; GOTO START; MOVC OC R0 ; OC=>DEVICE; SIO R1 R0 ; SENSE(STATUS,DEVICE); IBN R1 BPERR ; IF STATUS[BREAK] THEN JMP START ; GOTO START; XTR R3 3 ; IF RE.WORD(2:3)<>0 INE R3 0 ; THEN JMP L1 ; GOTO NEXT; JMP CMEMDUMP ; GOTO CONTINUE MEMDUMP; ;---------------------------------------------------------------------- ADRCHECK: ; CHECK FOR ADDRESS: MOVC LOCACP R0 ; MOV R0 LOCACTION ; SET LOCAL ACTION; JMPI S5 ICHECK ; CHECK FOR ADDRESS; JMP NEWCOM ; GOTO NEWCOMMAND; ;### ;---------------------------------------------------------------------- ENTERBASE: ; ENTER NEW BASE: JMPI S5 IGETADR ; GET BASE ADDRESS; JMP ERROR ; ERROR: GOTO ERROR; MOV R3 R5 ; SUB R4 R5 ; CHANGE TO BASE REL; MOV PROGPOINTER R6 ; GET PROGRAM POINTER; 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); ;---------------------------------------------------------------------- RUNPROG: ; RUNPROG: JMPI S5 IGETADR ; GET PROCESS ADDRESS; JMP ERROR ; ERROR: GOTO ERROR; LDN R3 ; START PROCESS; ;---------------------------------------------------------------------- BOOT: ; ENTER BOOT LOADER: MOV BOOTPOINTER R0 ; RE.BOOTBASE(ABS); LDN R0 ; LOAD BOOT LOADER; ;---------------------------------------------------------------------- TIMEOUT: ; TIMOUT TEST: MOVC LOCALL R0 ; SURVIVE ALL => MOV R0 LOCACTION ; 0.LOCAL ACTION; JMPI S5 IGETADR ; GET ADDRESS; JMP ERROR ; ERROR: GOTO ERROR; SUB R4 R3 ; ADDRESS - 0.BASE MOV R3 R4 ; => ADDRESS; JMP S5 INPAR ; INPARAMETER; JMP TIMEOUT4 ; R: GOTO SELECT READ; ; W: CONTINUE; JMPI S5 IGETADR ; GET VALUE; JMP ERROR ; ERROR: GOTO ERROR; MODC 1 ; SELECT WRITE; TIMEO4: MOVC 0 R2 ; SELECT READ: MOV R4 R1 ; ADDRESS => ADDR; TIMEOUT1: ; NEWREAD: JON R2 TIMEOUT2 ; IF READ THEN MOV X1 R3 ; 0.ADDR => W; JMP TIMEOUT3 ; ELSE TIMEOUT2: ; MOV R3 X1 ; VALUE => 0.ADDR; NOP ; TIMEOUT3: ; JMPI S6 ICHECKB ; CHECK FOR STOP FROM OC; JMP NEWCOM ; STOP: GOTO NEWCOMMAND; NOP ; JMP TIMEOUT1 ; NOT STOP: GOTO NEWREAD; JMP NEWCOM ; GOTO NEWCOMMAND; ;### ;---------------------------------------------------------------------- SEARCH: ; SEARCH FOR VALUE DIFF: JMPI S5 IGETADR ; GET NORM VALUE; JMP ERROR ; ERROR: GOTO ERROR; MOVC LOCACP R0 ; PAR LOC ACTION => MOV R0 LOCACTION ; 0.LOCAL ACTION; MOV BAS R6 ; NEG R6 ; SET ADDR; MOV R3 R4 ; MOV SIZE R2 ; FOR I:=1 UNTIL SIZE DO SEARCH1: ; BEGIN MOV X6 R3 ; 0.ADDR => VALUE; INE R3 R4 ; IF VALUE <> NORM VALUE THEN JMPI S5 IDATFAULT ; DATAFAULT; ADDC 1 R6 ; ADDR+1 => ADDR; SOB R2 SEARCH1 ; END; JMP NEWCOM ; GOTO NEWCOMMAND; ;---------------------------------------------------------------------- FIND: ; FIND VALUE: JMPI S5 IGETADR ; GET VALUE; JMP ERROR ; ERROR: GOTO ERROR; MOVC LOCNP R0 ; NO PAR. ACTION => MOV R0 LOCACTION ; 0.LOCAL ACTION; MOV BAS R6 ; NEG R6 ; SET ADDR; MOV SIZE R2 ; FOR I:=1 UNTIL SIZE DO FIND1: ; BEGIN MOV X6 R4 ; 0.ADDR => VAL; INE R3 R4 ; IF VAL = VALUE THEN JMP FIND2 ; BEGIN MOVC SAVE0+7 R7 ; STC 6 ; STACK REGISTERS; JMPI S4 IOUTTXNL ; WRITE(TEXT); <:VALUE FOUND AT ADR<0>:> ; MOV SAVE6 R4 ; MOV BAS R3 ; ADD R3 R4 ; MAKE ADDR ABS; JMPI S5 IHEXOUT ; WRITE(ADDR); JMPI S6 ICHECKB ; CHECK FOR STOP; MOVC 1 R2 ; STOP: MOV R2 2. X7 ; 1 => 0.SAVER2; UNS 6 ; NOT STOP: UNSTACK REGISTERS; FIND2: ; END; ADDC 1 R6 ; ADDR+1 => ADDR; SOB R2 FIND1 ; END; JMP NEWCOM ; GOTO NEWCOMMAND; ;### ;---------------------------------------------------------------------- ; ; T E S T S ; ;---------------------------------------------------------------------- TEST1: ; READ MODULE TEST: JMPI S4 IOUTTXNL ; WRITE(TEXT); <:TIMING TEST<0>:> ; MOVC 2#0000001 R2 ; 2#0000001 => MSW; JMPI S5 IMSWSET ; SET MODULESWITCH; MOVC LOCNP R0 ; NO PARITY CHECK => MOV R0 LOCACTION ; 0.LOCAL ACTION; JMPI S5 ICLEAR ; CLEAR RAM; MOV TADR R6 ; 0.TESTADR MOVC BAS R5 ; -0.BAS SUB X5 R6 ; => ADRABS; TEST1A: ; READ: MOV X6 R0 ; 0.ADRABS => W; MOVC OC R1 ; SIO R1 R1 ; SENSE TERMINAL; IBZ R1 BPERR ; IF NOT "BREAK" THEN JMP TEST1A ; GOTO READ; JMP NEWCOM ; GOTO INCOMMAND; ;### ;---------------------------------------------------------------------- TEST2: ; ADDRESS CHECK: JMPI S4 IOUTTXNL ; WRITE(TEXT); <:ADDRESS CHECK<0>:> ; MOVC LOCNP R0 ; MOV R0 LOCACTION ; NO PAR CHECK => 0.LOCAL ACTION; JMPI S5 ICLEAR ; CLEAR RAM; MOV BAS R6 ; NEG R6 ; SET ADDR; MOV SIZE R1 ; MOVC 0 R0 ; 0 => DATA; TEST2A: ; FOR I:=1 UNTIL SIZE DO ; BEGIN MOV X6 R2 ; 0.ADDR => W INE R2 0 ; IF W <> 0 THEN JMPI S5 IADRFAULT ; ADDRESSFAULT; MOV R0 X6 ; DATA => 0.ADDR; MOV X6 R2 ; 0.ADDR => W; INE R2 R0 ; IF W <> DATA THEN JMPI S5 IADRFAULT ; ADDRESSFAULT; ADDC 1 R6 ; ADDR+1 => ADDR; ADDC 1 R0 ; DATA+1 => DATA; SOB R1 TEST2A ; END; JMPI S5 ICHECK ; CHECK FOR ADDRESS IN ADDRESS; MOVC LOCNT R0 ; MOV R0 LOCACTION ; SPEC TIMEOUT => 0.LOCAL ACTION; MOV RE000 R1 ; MOV SIZE R6 ; SUB R6 R1 ; MOV BAS R5 ; SUB R5 R6 ; TEST2B: ; FOR I:=SIZE UNTIL #E000 DO ; BEGIN MOV X6 R2 ; 0.ADDR => W; JMPI S5 IADRFAULT ; IF NOT TIMEOUT ADDRESSFAULT; ADDC 1 R6 ; ADDR+1 => ADDR; SOB R1 TEST2B ; END; JMP NEWCOM ; GOTO NEWCOMMAND; ;### ;---------------------------------------------------------------------- TEST3: ; DATATEST: JMPI S4 IOUTTXNL ; WRITE(TEXT); <:CHECKERBOARD TEST<0>:> ; MOVC LOCNP R0 ; NO PAR. ACTION => MOV R0 LOCACTION ; 0.LOCAL ACTION; MOV R5555 R0 ; MOV RAAAA R1 ; MOV BAS R6 ; NEG R6 ; SET ADDR; MOV R6 R7 ; MOVC 8 R2 ; FOR I:=1 UNTIL 8 DO TEST3A: ; BEGIN MOVL R01 0. X7 ; SET CHECKERBOARD IN ADDC 2 R7 ; 0,1.ADDR; SOB R2 TEST3A ; END; MOVC LOCMVM R3 ; NO PAR. ACTION FOR MOVM => MOV R3 LOCACTION ; 0.LOCAL ACTION; MOV SIZE R2 ; SRL R2 4 ; ADDC -1 R2 ; FOR I:=1 UNTIL SIZE/16-1 DO TEST3C: ; BEGIN MOVM X6 X7 ; MOV 16 WORDS; SOB R2 TEST3C ; END; MOV BAS R6 ; NEG R6 ; SET ADDR; MOVC LOCACP R7 ; NORM LOC ACTION => MOV R7 LOCACTION ; 0.LOCAL ACTION; MOV SIZE2 R2 ; TEST3B: ; DO FOR ALL EVEN ADDRESSES ; BEGIN MOVL 0. X6 R34 ; GET W0,W1; IEQ R0 R3 ; IF W0,W1 IS NOT INE R1 R4 ; CHECKERBOARD THEN JMPI S5 IDATFAULT ; DATAFAULT; ADDC 2 R6 ; SOB R2 TEST3B ; END; JMP NEWCOM ; GOTO NEWCOMMAND; ;### ;---------------------------------------------------------------------- TEST4: ; REFRESH TEST: JMPI S4 IOUTTXNL ; WRITE(TEXT): <:REFRESH TEST<0>:> ; MOVC LOCACP R0 ; NORM LOC ACTION => MOV R0 LOCACTION ; 0.LOCAL ACTION; MOVC 0 R0 ; TEST4A: MOVC 10 R1 ; WAIT APP. 1 SEC; TEST4B: SOB R1 TEST4B ; SOB R0 TEST4A ; MOV BAS R6 ; NEG R6 ; SET ADDR; MOV R5555 R0 ; MOV RAAAA R1 ; MOV SIZE2 R2 ; TEST4C: ; DO FOR ALL EVEN ADDRESSES ; BEGIN MOVL 0. X6 R34 ; 0.ADDR => W0,W1; IEQ R0 R3 ; IF W0,W1 IS NOT INE R1 R4 ; CHECKERBOARD THEN JMPI S5 IDATFAULT ; DATAFAULT; ADDC 2 R6 ; ADDR+2 => ADDR; SOB R2 TEST4C ; END; JMP NEWCOM ; GOTO NEWCOMMAND; ;### ;---------------------------------------------------------------------- MSW04: ; MODULE SWITCH TEST, 4K: JMPI S4 IOUTTXNL ; WRITE(TEXT); <:MSW TEST<0>:> ; MOVC LOCNT R0 ; SPEC TIMEOUT => MOV R0 LOCACTION ; 0.LOCAL ACTION; MOVC 0 R2 ; MOVC 14 R3 ; FOR 4KMODULE:=0 UNTIL 13 DO MSW04A: ; BEGIN MOV BAS R6 ; NEG R6 ; SET START ADR; MOVC SAVE0+7 R7 ; STC 6 ; STACK REGISTERS; JMPI S5 IMSWSET ; SET MODULE SWITCH; MOVC SAVE0 R7 ; UNS 6 ; UNSTACK REGISTERS; MOV R2 R4 ; MODULE SLL R4 11 ; *1024 => ADR1; ADD R6 R4 ; MAKE ADR1 ABS; MOVC 14 R1 ; FOR M:=0 UNTIL 13 DO MSW04B: ; BEGIN INE R6 R4 ; IF ADR1=ADDR THEN JMP MSW04C ; BEGIN MOV X6 R0 ; 0.ADDR => W; JMP MSW04D ; IF TIMEOUT THEN JMPI S5 IADRFAULT ; ADDRESSFAULT; JMP MSW04D ; END MSW04C: ; ELSE BEGIN MOV X6 R0 ; 0.ADDR => W; JMPI S5 IADRFAULT ; IF NOT TIMEOUT THEN ; ADDRESSFAULT; MSW04D: ; END; MOV R1000 R0 ; ADD R0 R6 ; ADDR+#1000 => ADDR; SOB R1 MSW04B ; END; ADDC 2 R2 ; MSW+2 => MSW; SOB R3 MSW04A ; END; MOVC 0 R2 ; 0 => MOV R2 SAVE13 ; 0.FIRSTBIT; JMPI S6 IPAGTST ; PAGETEST; JMP NEWCOM ; GOTO NEWCOMMAND; ;### ;---------------------------------------------------------------------- MSW16: ; MODULE SWITCH TEST, 16K: JMPI S4 IOUTTXNL ; WRITE(TEXT); <:MSW TEST<0>:> ; MOVC LOCNT R0 ; SPEC TIMEOUT => MOV R0 LOCACTION ; 0.LOCAL ACTION; MOVC 0 R2 ; MOVC 4 R3 ; FOR MODULE:=0 UNTIL 3 DO MSW16A: ; BEGIN MOV BAS R6 ; NEG R6 ; SET START ADR; MOVC SAVE0+7 R7 ; STC 6 ; STACK REGISTERS; JMPI S5 IMSWSET ; SET MODULE SWITCH; MOVC SAVE0 R7 ; UNS 6 ; UNSTACK REGISTERS; MOV R2 R4 ; MODULE SLL R4 11 ; *1024 => ADR1; ADD R6 R4 ; MAKE ADR1 ABS; MOVC 4 R1 ; FOR M:=0 UNTIL 3 DO MSW16B: ; BEGIN IEQ R6 R4 ; IF ADR1<>ADDR THEN JMP MSW16C ; BEGIN MOV X6 R0 ; 0.ADDR => W; JMP MSW16D ; IF TIMEOUT THEN JMPI S5 IADRFAULT ; ADDRESSFAULT; JMP MSW16D ; END MSW16C: ; ELSE BEGIN MOV X6 R0 ; 0.ADDR => W; JMPI S5 IADRFAULT ; IF NOT TIMEOUT THEN ; ADDRESSFAULT; MSW16D: ; END; MOV R1000 R0 ; ADD R0 R6 ; ADDR+#1000 => ADDR; SOB R1 MSW16B ; END; ADDC 2 R2 ; MSW+2 => MSW; SOB R3 MSW16A ; END; ;### MOVC 0 R2 ; MOVC 3 R3 ; FOR 16KMODULE:=0 UNTIL 2 DO MS16A: ; BEGIN MOV BAS R6 ; NEG R6 ; SET START ADR; MOVC SAVE0+7 R7 ; STC 6 ; STACK REGISTERS; ADDC 1 R2 ; MSW+1 => MSW; JMPI S5 IMSWSET ; SET MODULE SWITCH; MOVC SAVE0 R7 ; UNS 6 ; UNSTACK REGISTERS; MOV R2 R4 ; MODULE SLL R4 11 ; *1024 => ADR1; ADD R6 R4 ; MAKE ADR1 ABS; MOVC 3 R1 ; FOR M:=0 UNTIL 2 DO MS16B: ; BEGIN INE R6 R4 ; IF ADR1=ADDR THEN JMP MS16C ; BEGIN MOV X6 R0 ; 0.ADDR => W; JMP MS16D ; IF TIMEOUT THEN JMPI S5 IADRFAULT ; ADDRESSFAULT; JMP MS16D ; END MS16C: ; ELSE BEGIN MOV X6 R0 ; 0.ADDR => W; JMPI S5 IADRFAULT ; IF NOT TIMEOUT THEN ; ADDRESSFAULT; MS16D: ; END; MOV R4000 R0 ; ADD R0 R6 ; ADDR+#4000 => ADDR; SOB R1 MS16B ; END; ADDC 8 R2 ; MSW+8 => MSW; SOB R3 MS16A ; END; MOVC 2#00001 R2 ; 2#00001 => MOV R2 SAVE13 ; 0.FIRSTBIT; JMPI S6 IPAGTST ; PAGETEST; JMP NEWCOM ; GOTO NEWCOMMAND; ;### ;---------------------------------------------------------------------- MSW32: ; MODULE SWITCH TEST, 32K: JMPI S4 IOUTTXNL ; WRITE(TEXT); <:MSW TEST<0>:> ; MOVC LOCNT R0 ; SPEC TIMEOUT => MOV R0 LOCACTION ; 0.LOCAL ACTION; MOVC 0 R2 ; MOVC 8 R3 ; FOR MODULE:=0 UNTIL 7 DO MSW32A: ; BEGIN MOV BAS R6 ; NEG R6 ; SET START ADR; MOVC SAVE0+7 R7 ; STC 6 ; STACK REGISTERS; JMPI S5 IMSWSET ; SET MODULE SWITCH; MOVC SAVE0 R7 ; UNS 6 ; UNSTACK REGISTERS; MOV R2 R4 ; MODULE SLL R4 11 ; *1024 => ADR1; ADD R6 R4 ; MAKE ADR1 ABS; MOVC 8 R1 ; FOR M:=0 UNTIL 7 DO MSW32B: ; BEGIN IEQ R6 R4 ; IF ADR1<>ADDR THEN JMP MSW32C ; BEGIN MOV X6 R0 ; 0.ADDR => W; JMP MSW32D ; IF TIMEOUT THEN JMPI S5 IADRFAULT ; ADDRESSFAULT; JMP MSW32D ; END MSW32C: ; ELSE BEGIN MOV X6 R0 ; 0.ADDR => W; JMPI S5 IADRFAULT ; IF NOT TIMEOUT THEN ; ADDRESSFAULT; MSW32D: ; END; MOV R1000 R0 ; ADD R0 R6 ; ADDR+#1000 => ADDR; SOB R1 MSW32B ; END; ADDC 2 R2 ; MSW+2 => MSW; SOB R3 MSW32A ; END; MOVC 2#00001 R2 ; 2#00001 => MOV R2 SAVE13 ; 0.FIRSTBIT; JMPI S6 IPAGTST ; PAGETEST; ;### MOVC 2#1110001 R2 ; 2#1110001 => MSW; JMPI S5 IMSWSET ; SET MODULE SWITCH; MOV R8000 R4 ; MOV BAS R6 ; SUB R6 R4 ; SET ADDR1; NEG R6 ; SET ADDR; MOVC 16 R1 ; FOR I:=1 UNTIL 16 DO MSW32I: ; BEGIN MOV RE00C R0 ; LDS R0 ; 3 => PAGE(PSW); ILO R1 9 ; IF ADDR < ADDR THEN JMP MSW32J ; BEGIN MOV X6 R0 ; 0.ADDR => W; JMP MSW32L ; IF NOT TIMEOUT ADRFAULT; JMP MSW32K ; END ELSE MSW32J: ; BEGIN MOV X6 R0 ; 0.ADDR => W; JMP MSW32K ; IF TIMEOUT THEN MSW32L: ; MOV RE000 R0 ; LDS R0 ; JMPI S5 IADRFAULT ; ADRFAULT; MSW32K: ; END; MOV R1000 R0 ; ADDR + #1000 ADD R0 R6 ; => ADDR; SOB R1 MSW32I ; END; MOV RE000 R0 ; LDS R0 ; SET TO PAGE ZERO; JMP NEWCOM ; GOTO NEWCOMMAND; ;### ;---------------------------------------------------------------------- TEST6: ; SPEED TEST: JMPI S4 IOUTTXNL ; WRITE(TEXT); <:SPEED TEST<0>:> ; MOVC 2#0000001 R2 ; 2#0000001 => MSW; JMPI S5 IMSWSET ; SET MODULE SWITCH; MOVC LOCMVMP R0 ; PAR.CHECK FOR MOVM => MOV R0 LOCACTION ; 0.LOCAL ACTION; MOV SIZE3 R0 ; FOR I:=1 UNTIL 32M/SIZE DO TEST6A: ; BEGIN MOV BAS R6 ; MOV SIZE2 R7 ; SUB R6 R7 ; SET ADDR1; NEG R6 ; SET ADDR; MOV SIZE4 R1 ; FOR J:=1 UNTIL SIZE/512 DO TEST6B: ; BEGIN MOVM X6 X7 ; MOV 16 WORDS; MOVM X6 X7 ; MOV 16 WORDS; MOVM X6 X7 ; MOV 16 WORDS; MOVM X6 X7 ; MOV 16 WORDS; MOVM X6 X7 ; MOV 16 WORDS; MOVM X6 X7 ; MOV 16 WORDS; MOVM X6 X7 ; MOV 16 WORDS; MOVM X6 X7 ; MOV 16 WORDS; MOVM X6 X7 ; MOV 16 WORDS; MOVM X6 X7 ; MOV 16 WORDS; MOVM X6 X7 ; MOV 16 WORDS; MOVM X6 X7 ; MOV 16 WORDS; MOVM X6 X7 ; MOV 16 WORDS; MOVM X6 X7 ; MOV 16 WORDS; MOVM X6 X7 ; MOV 16 WORDS; MOVM X6 X7 ; MOV 16 WORDS; SOB R1 TEST6B ; END; SOB R0 TEST6A ; END; MOVC 7 R1 ; JMPI S6 IOUTCHAR ; OUTPUT BELL; JMP NEWCOM ; GOTO NEWCOMMAND; ;### ;---------------------------------------------------------------------- TEST7: ; FAST ADDR INVERT TEST: JMPI S4 IOUTTXNL ; WRITE(TEXT); <:FAST ADDR INVERT TEST<0>:>; MOVC LOCACP R0 ; MOV R0 LOCACTION ; JMPI S5 IALOAD ; SET ADDR IN ADDR; MOV BAS R6 ; MOV SIZE R7 ; ADDC -1 R7 ; SUB R6 R7 ; SET ADDR1; NEG R6 ; SET ADDR; MOV SIZE2 R1 ; TEST7A: ; FOR I:=1 UNTIL SIZE/2 DO ; BEGIN MOV X6 R4 ; 0.ADDR => W; MOV X6 X7 ; 0.ADDR => 0.ADDR1; XCH R6 R7 ; MOV X6 R3 ; 0.ADDR1 => W1; XCH R6 R7 ; INE R4 R3 ; IF W <> W1 THEN JMPI S5 IADRFAULT ; ADDRESSFAULT; ADDC 1 R6 ; ADDR+1 => ADDR; ADDC -1 R7 ; ADDR1-1 => ADDR1; SOB R1 TEST7A ; END; JMP NEWCOM ; GOTO NEWCOMMAND; ;### ;---------------------------------------------------------------------- TEST8: ; BIT EXERCISE: JMPI S4 IOUTTXNL ; WRITE(TEXT); <:BIT EXERCISE<0>:> ; MOVC LOCACP R0 ; MOV R0 LOCACTION ; MOVC 0 R0 ; FOR BIT:=0 UNTIL 15 DO TEST8A: ; BEGIN MOV BAS R6 ; NEG R6 ; SET ADDR; MOV SIZE R2 ; FOR I:=1 UNTIL SIZE DO TEST8B: ; BEGIN MOVC 0 R4 ; 0 => W; SETS R4 R0 ; 1 => W(BIT:1); MOV R4 X6 ; W => 0.ADDR; MOV X6 R3 ; 0.ADDR => W1; INE R3 R4 ; IF W <> W1 THEN JMPI S5 IDATFAULT ; DATAFAULT; ADDC 1 R6 ; ADDR+1 => ADDR; SOB R2 TEST8B ; END; ADDC 1 R0 ; IBZ R0 4 ; JMP TEST8A ; END; JMP NEWCOM ; GOTO NEWCOMMAND; ;### ;---------------------------------------------------------------------- TEST9: ; BYTE ADDRESSSING TEST: JMPI S4 IOUTTXNL ; WRITE(TEXT); <:BYTE TEST<0>:> ; MOVC LOCACP R0 ; MOV R0 LOCACTION ; MOV BAS R6 ; NEG R6 ; SET ADDR; MOV R1234 R0 ; #1234 => WORD; MOVC 0 R1 ; 0 => BYTEADDR; MOV SIZE R2 ; FOR I:=1 UNTIL SIZE DO TEST9A: ; BEGIN MOV R0 X6 ; WORD => 0.ADDR; MOVC #AB R3 ; #AB => BYTE; MOV R1 R5 ; MODN BAS ; MOVB R3 0. X5 ; BYTE => 0.BYTEADDR(ABS); MOV R12AB R4 ; #12AB => EXPW; MOV 0. X6 R3 ; 0.ADDR => W; INE R4 R3 ; IF EXPW <> W THEN JMPI S5 IDATFAULT ; DATAFAULT; MOVC #CD R3 ; #CD => BYTE; MOV R1 R5 ; MODN BAS ; MOVB R3 1. X5 ; BYTE => 1.BYTEADDR(ABS); MOV RCDAB R4 ; #CDAB => EXPW; MOV 0. X6 R3 ; 0.ADDR => W; INE R4 R3 ; IF EXPW <> W THEN JMPI S5 IDATFAULT ; DATAFAULT; MOV R1 R5 ; MODN BAS ; MOVB 0. X5 R3 ; 0.BYTEADDR(ABS) => W; MOVC #AB R4 ; #AB => EXPW; INE R4 R3 ; IF EXPW <> W THEN JMPI S5 IDATFAULT ; DATAFAULT; MOV R1 R5 ; MODN BAS ; MOVB 1. X5 R3 ; 1.BYTEADDR(ABS) => W; MOVC #CD R4 ; #CD => EXPW; INE R4 R3 ; IF EXPW <> W THEN JMPI S5 IDATFAULT ; DATAFAULT; ADDC 1 R6 ; ADDR+1 => ADDR; ADDC 2 R1 ; BYTEADDR+2 => BYTEADDR; SOB R2 TEST9A ; END; JMP NEWCOM ; GOTO NEWCOMMAND; ;### ;---------------------------------------------------------------------- TESTD: ; TEST DOUBLE ACCESS: MOV SIZE R2 ; IBN R2 15 ; IF 0.SIZE >= 32 K THEN JMP ERROR ; GOTO ERROR; JMPI S4 IOUTTXNL ; WRITE(TEXT); <:DOUBLE ACCESS TEST<0>:> ; JMPI S4 IOUTTXNL ; WRITE(TEXT); <:RST: SUBBUS, CPU: MAINBUS<0>:> MOVC LOCACP R0 ; MOV R0 LOCACTION ; IBZ R2 14 ; IF 0.SIZE < 16 K THEN MODC #10 ; 16 => MODE ELSE MOVC 0 R0 ; 0 => MODE; TESTD1: ; NEWMODE: MOV R0 SAVE10 ; SAVE(MODE); JMPI S6 IWRWR ; TEST WRITEWRITE; JMPI S6 IWRRE ; TEST WRITEREAD; JMPI S6 IREWR ; TEST READWRITE; JMPI S6 IRERE ; TEST READ READ; MOV SAVE10 R0 ; RESTORE(MODE); ADDC 2 R0 ; MODE+2 => MODE; IBZ R0 7 ; IF MODE < 128 THEN JMP TESTD1 ; GOTO NEWMODE; JMP NEWCOM ; GOTO NEWCOMMAND; ;### ;---------------------------------------------------------------------- PAGEMODE: ; PAGEMODE TEST: MOV SIZE R1 ; IF 0.SIZE = 16 K IBZ R1 14 ; THEN JMP ERROR ; GOTO ERROR; JMPI S4 IOUTTXNL ; WRITE(TEXT); <:BLOCKMODE TEST<0>:> ; MOVC LOCACP R0 ; MOV R0 LOCACTION ; MOVC 1 R0 ; 1 => MOV R0 SAVE10 ; 0.MODE; JMPI S6 IWRWR ; TEST WRITEWRITE; JMPI S6 IWRRE ; TEST WRITEREAD; JMPI S6 IREWR ; TEST READWRITE; JMPI S6 IRERE ; TEST READREAD; JMP NEWCOM ; GOTO NEWCOMMAND; ;---------------------------------------------------------------------- BLOCKTIME: ; BLOCKMODE TIMING TEST: MOV SIZE R1 ; IF 0.SIZE IBZ R1 14 ; <> 16 K THEN JMP ERROR ; GOTO ERROR; JMPI S4 IOUTTXNL ; WRITE(TEXT); <:BLOCKMODE TIMING TEST<0>:>; MOVC LOCACP R0 ; MOV R0 LOCACTION ; MOVC 1 R0 ; BLOCKMODE => MOV R0 SAVE10 ; 0.MODE; JMPI S5 ISTARTW ; START RST WRITE; BLKT0: ; TEST: JMPI S6 ICHECKB ; IF BREAK FROM OC THEN JMP BLKT1 ; GOTO STOP NOP ; JMP BLKT0 ; GOTO TEST; JMPI S5 IREADTM ; READ ERRORS FROM RST; JMP NEWCOM ; GOTO NEWCOMMAND; ;### ;---------------------------------------------------------------------- PARTDOUBLE: ; PART OF DOUBLE ACCESS TEST: MOV SIZE R0 ; IF 0.SIZE IBN R0 15 ; >= 32 K THEN JMP ERROR ; GOTO ERROR; MOVC LOCACP R0 ; MOV R0 LOCACTION ; JMPI S5 IINPAR ; INPARAMETER; MODC 2 ; R: TEST MODULE READ; MOVC 0 R4 ; W: TEST MODULE WRITE; JMPI S5 IINPAR ; INPARAMETER; ADDC 1 R4 ; R: CPU READ; ; W: CPU WRITE; JMPI S5 IGETADR ; GET PAGE,PAUSE; JMP ERROR ; ERROR: GOTO ERROR; XTR R3 7 ; MOV R3 SAVE10 ; SAVE(MODE); JMP S6 PD1 ; SET RETURN ADDRESS; JMP NEWCOM ; GOTO NEWCOMMAND; PD1: ; SELECT TEST: MOD R4 ; JMP LOC+1 ; JMPI IWRWR ; JMPI IWRRE ; JMPI IREWR ; JMPI IRERE ; ;### ;---------------------------------------------------------------------- TESTCH: ; CHANGE ACCESS: JMPI S4 IOUTTXNL ; WRITE(TEXT); <:CHANGE BUS ACCESS: <0>:> ; JMPI S6 IINCHAR ; INCHAR; ADDC -<:N:> R1 ; IF CHAR <> <:N:> JON R1 TESTCH ; THEN GOTO CHANGE ACCESS; JMP ON ; GOTO NEW TEST; ; ; TESTEND1: ; TESTEND: JMPI S4 IOUTTXNL ; WRITE(TEXT); <:RAM TEST END<0>:> ; JMP INCOMMAND ; GOTO INCOMMAND; ; ; TESTEND2: ; TEST END CATCH: MOVC TESTNR R6 ; TESTNO => ADDR; DEC 0. X6 ; 0.ADDR-1 => 0.ADDR; JMP INCOMMAND ; GOTO INCOMMAND; ; ; ON: ; NEW TEST: MOVC TESTNR R6 ; INC 0. X6 ; 0.TESTNO+1 => 0.TESTNO; REP: ; SAME TEST: MOD TESTNR ; MOD TESTOFF ; JMPI TESTS ; GOTO TEST(TESTNO,SIZE); ;### ;---------------------------------------------------------------------- ; ; I / O C O M M A N D S ; ;---------------------------------------------------------------------- ;DEVSET - SET DEVICE AND COMMAND ; CALL EXIT ; ;R0-R1 DESTROYED ;R2 DEVICE AND COMMAND ;R3 DEVICE ;R4 LINK LINK ;R5-R7 DESTROYED DEVSET: ; SET DEVICECOMMAND; JMPI S5 IGETADR ; GET COMMAND; JMP ERR1 ; ERR1: GOTO ERROR; SLL R3 6 ; COMMAND < 6 MOV DEVICE R2 ; + 0.DEVICE ADD R3 R2 ; => DEVICE AND COMMAND; JMP 0. X4 ; RETURN; ;INTTABLE - INITIATE INTERRUPT TABLE ; CALL EXIT ; ;R0-R2 DESTROYED ;R3 IBASE IBASE ;R4-R5 DESTROYED ;R6 LINK LINK INTTABLE: ; SET INTERRUPT TABLE: MOV R015C R0 ; #015C(JMP LOC) => INTADR; MOV BAS R4 ; MOV R0 R5 ; INTADR - SUB R4 R5 ; 0.BASE => RELADR; NEG R4 ; MOVC 0 R1 ; 0 => PROCWORD; MOVC 64 R2 ; FOR I:=1 UNTIL 64 DO INTTABLE1: ; BEGIN MOV R1 0. X4 ; PROCWORD => 0.(I-1-0.BASE); MOV R3 0. X5 ; IBASE => 0.RELADR; INCD R4 R5 ; RELADR+1 => RELADR; SOB R2 INTTABLE1 ; END; ADDC -64 R4 ; - 0.BASE => RELADR; MOV R0 0. X4 ; JMP LOC => 0.RELADR; MOV R0 1. X4 ; JMP LOC => 1.RELADR; MOV R0 2. X4 ; JMP LOC => 2.RELADR; MOV R0 3. X4 ; JMP LOC => 3.RELADR; JMP 0. X6 ; RETURN; ;---------------------------------------------------------------------- ;### ;---------------------------------------------------------------------- DEV: ; ENTER DEVICE NO: JMPI S5 IGETADR ; GET DEVICE NO; JMP ERR1 ; ERROR: GOTO ERR1; XTR R3 6 ; DEVICE NO (5:6) => MOV R3 DEVICE ; 0.DEVICE; JMP IO ; GOTO IOCOMMANDS; ;---------------------------------------------------------------------- SENSE: ; SENSE DEVICE: JMP S4 DEVSET ; SET DEVICECOMMAND; SIO R4 R2 ; GET CONTENT; JMPI S5 IHEXOUT ; WRITE(CONTENT); JMP IO ; GOTO IOCOMMANDS; ;---------------------------------------------------------------------- READ: ; READ DEVICE: JMP S4 DEVSET ; SET DEVICECOMMAND; RIO R4 R2 ; GET CONTENT; JMPI S5 IHEXOUT ; WRITE(CONTENT); JMP IO ; GOTO IOCOMMANDS; ;---------------------------------------------------------------------- CONTROL: ; CONTROL DEVICE: JMP S4 DEVSET ; SET DEVICECOMMAND; MOV R2 R4 ; SAVE (DEVICECOMMAND); JMPI S5 IGETADR ; GET WORD; JMP ERR1 ; ERROR: GOTO ERR1; CIO R3 R4 ; WORD => *DEVICECOMMAND*; JMP IO ; GOTO IOCOMMANDS; ;---------------------------------------------------------------------- WRITE: ; WRITE DEVICE: JMP S4 DEVSET ; SET DEVICECOMMAND; MOV R2 R4 ; SAVE(DEVICECOMMAND); JMPI S5 IGETADR ; GET WORD; JMP ERR1 ; ERROR: GOTO ERR1; WIO R3 R4 ; WORD => *DEVICECOMMAND*; JMP IO ; GOTO IOCOMMANDS; ;### ;---------------------------------------------------------------------- CONTSENSE1: ; CONTINUOUS SENSE, NO OUTPUT: MODC 1 ; CONTREAD1: ; CONTINUOUS READ, NO OUTPUT: MODC 1 ; CONTSENSE: ; CONTINUOUS SENSE: MODC 1 ; CONTREAD: ; CONTINUOUS READ: MOVC 0 R0 ; MOV R0 SAVE15 ; JMP S4 DEVSET ; SET DEVICECOMMAND; MOV R2 R3 ; CTR1: ; WHILE NOT "BREAK" DO ; BEGIN MOV SAVE15 R0 ; IF READ IBZ R0 0 ; THEN RIO R4 R3 ; READ DEVICE IBN R0 0 ; ELSE SIO R4 R3 ; SENSE DEVICE; IBZP R0 1 ; IF OUTPUT THEN ; BEGIN JMPI S5 INEXTLIN ; NEWLINE; JMPI S5 IHEXOUT ; WRITE(WORD); ; END; MOVC OC R0 ; SIO R0 R0 ; SENSE OC; IBZ R0 BPERR ; JMP CTR1 ; END; JMP IO ; GOTO IOCOMMANDS; ;---------------------------------------------------------------------- CONTCONTROL: ; CONTINUOUS CONTROL: MODC 1 ; CONTWRITE: ; CONTINUOUS WRITE: MOVC 0 R0 ; MOV R0 SAVE15 ; JMP S4 DEVSET ; SET DEVICECOMMAND; MOV R2 R4 ; JMPI S5 IGETADR ; GET WORD; JMP ERR1 ; ERROR: GOTO ERR1; MOV SAVE15 R1 ; CTW1: ; WHILE NOT "BREAK" DO ; BEGIN IBZ R1 0 ; IF WRITE THEN WIO R3 R4 ; WRITE(WORD,DEVICE) IBN R1 0 ; ELSE CIO R3 R4 ; CONTROL(WORD,DEVICE); MOVC OC R0 ; SIO R0 R0 ; SENSE OC; IBZ R0 BPERR ; JMP CTW1 ; END; JMP IO ; GOTO IOCOMMANDS; ;### ;---------------------------------------------------------------------- ALLINT: ; GET ALL INTERRUPTS: MOD BAS ; DEVINT: ; GET INTERRUPT FROM DEVICE: MOVC 0 R3 ; INT3: ; WAIT: JMP S6 INTTABLE ; SET INTERRUPT TABLE; MOV BAS R0 ; MOV R015C R5 ; SUB R0 R5 ; MOV R0 OC. X5 ; RESERVE INTERRUPT FROM OC; MOD DEVICE ; MOV R0 0. X5 ; RESERVE INTERRUPT FROM DEVICE; SVP INT0 ; MOVC 0 R0 ; LDN R0 ; START INTERRUPT WAIT PROCESS; INT0: ; REENTRY FROM INTERRUPT: MOV DEVPR R2 ; JOZ R2 INT3 ; IF INTERRUPT = TIMER THEN ; GOTO WAIT; SRL R2 2 ; INE R2 OC ; IF DEVICE = OC THEN JMP INT1 ; BEGIN SIO R0 R2 ; SENSE OC; IBZ R0 BPERR ; IF NOT "BREAK" THEN JMP INT3 ; GOTO WAIT; SVP INT2 ; SAVE PROCESS FOR LOC. ACTION; JMP IO ; GOTO IOCOMMANDS; INT2: JMP START ; INT1: ; END; JMPI S4 IOUTTXNL ; WRITE (TEXT); <:DEV<0>:> ; MOV R2 R4 ; JMPI S5 IHEXOUT ; WRITE(DEVICE); JMPI S4 IOUTTEXT ; WRITE(TEXT); <: P <0>:> ; MOV DEVPR R1 ; XTR R1 2 ; ADDC <:0:> R1 ; JMPI S6 IOUTCHAR ; WRITE(PRIORITY); JMP INT3 ; GOTO WAIT; ;### ;---------------------------------------------------------------------- IO: ; IOCOMMANDS: JMPI S4 IOUTTXNL ; WRITE(TEXT); <:. <0>:> ; IO1: ; COMM: JMPI S6 IINCHAR ; INCHAR; ADDC -<: :> R1 ; JOZ R1 IO1 ; IF CHAR = <: :> THEN GOTO COMM; SVP IO2 ; SAVE PROCESS FOR LOC. ACTION; JMP IO3 ; IO2: JMP IO ; IO3: ; ADDC -<:L:>+<: :> R1 ; IEQ R1 <:D:>-<:L:>; D - SET DEVICE NO; JMP DEV ; IEQ R1 <:S:>-<:L:>; S - SENSE DEVICE; JMP SENSE ; IEQ R1 <:C:>-<:L:>; C - CONTROL DEVICE; JMP CONTROL ; IEQ R1 <:R:>-<:L:>; R - READ DEVICE; JMP READ ; IEQ R1 <:W:>-<:L:>; W - WRITE DEVICE; JMP WRITE ; IEQ R1 <:E:>-<:L:>; E - CONTINUOUS READ; JMP CONTREAD ; IEQ R1 <:F:>-<:L:>; F - CONTINUOUS SENSE; JMP CONTSENSE ; IEQ R1 <:H:>-<:L:>; H - CONT. READ, NO OUTPUT; JMP CONTREAD1 ; IEQ R1 <:I:>-<:L:>; I - CONT SENSE, NO OUTPUT; JMP CONTSENSE1 ; IEQ R1 <:L:>-<:L:>; L - CONTINUOUS WRITE; JMP CONTWRITE ; IEQ R1 <:M:>-<:L:>; M - CONTINUOUS CONTROL; JMP CONTCONTROL; IEQ R1 <:A:>-<:L:>; A - WAIT FOR ALL INTERRUPTS; JMP ALLINT ; IEQ R1 <:G:>-<:L:>; G - WAIT FOR DEVICE INTERR. JMP DEVINT ; IEQ R1 <:X:>-<:L:>; X - RETURN TO TESTS; JMP START ; ; ERR1: ; ERR1: MOVC <:?:> R1 ; JMPI S6 IOUTCHAR ; WRITE(<:?:>; JMP IO ; GOTO IOCOMMANDS; ;### ;---------------------------------------------------------------------- ; ; C O M M A N D D E C O D I N G ; ;---------------------------------------------------------------------- NEWCOM: ; NEWCOMMAND: JMPI S4 IOUTTXNL ; WRITE(TEXT); <:TEST END<0>:> ; INCOMMAND: ; INCOMMAND: START: ; START: MOV BAS R4 ; GET BASE; INIT: ; INIT: MOVC OC R0 ; MOVC 3 R1 ; CIO R1 R0 ; ENABLE TERMINAL IF; JMPI S5 INEXTLIN ; NEWLINE; MOVC <:::> R1 ; JMPI S6 IOUTCHAR ; MOVC <: :> R1 ; JMPI S6 IOUTCHAR ; OUTPUT (<:: :>); ;### STR1: ; STR1: JMPI S6 IINCHAR ; 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; JMP STR3 ; STR2: JMP INIT ; STR3: MOVC LOCACT R0 ; INSERT LOCAL ACTION ADDRESS; MOV R0 LOCACTION ; IEQ R1 <:R:>-<:L:>; R - INSERT REGISTER DUMP; JMP INSERTREGS ; IEQ R1 <:D:>-<:L:>; D - MEMORY DUMP; JMP MEMDUMP ; IEQ R1 <:L:>-<:L:>; L - MEMORY DUMP, NO PAR. CHECK; JMP MLIST ; IEQ R1 <:C:>-<:L:>; C - CONTINUE MEMORY DUMP; JMP CMEMDUMP ; IEQ R1 <:P:>-<:L:>; P - LOAD DATA; JMP LOADDATA ; IEQ R1 <:F:>-<:L:>; F - FILL RAM; JMP FILL ; IEQ R1 <:E:>-<:L:>; E - FILL RAM WITH ADDRESS; JMP ADRFILL ; IEQ R1 <:U:>-<:L:>; U - CHECK FOR ADDRESS; JMP ADRCHECK ; IEQ R1 <:S:>-<:L:>; S - SEARCH FOR DATA; JMP SEARCH ; IEQ R1 <:G:>-<:L:>; G - FIND DATA; JMP FIND ; IEQ R1 <:N:>-<:L:>; N - NEW TEST; JMP ON ; IEQ R1 <:V:>-<:L:>; V - SAME TEST AGAIN; JMP REP ; IEQ R1 <:Z:>-<:L:>; Z - START FROM TEST1; JMP MCPT1 ; IEQ R1 <:A:>-<:L:>; A - TEST DOUBLE ACCESS; JMP TESTD ; IEQ R1 <:M:>-<:L:>; M - BLOCKMODE TEST; JMP PAGEMODE ; IEQ R1 <:K:>-<:L:>; K - BLOCKMODE TIMING TEST; JMP BLOCKTIME ; IEQ R1 <:T:>-<:L:>; T - TIMEOUT TEST; JMP TIMEOUT ; IEQ R1 <:O:>-<:L:>; O - PART OF DOUBLE ACCESS; JMP PARTDOUBLE ; IEQ R1 <:I:>-<:L:>; I - I/O COMMANDS; JMP IO ; ; ERROR: ; ERROR: MOVC <:?:> R1 ; JMPI S6 IOUTCHAR ; OUTPUT <:?:>; JMP START ; GOTO START; ;### MCPT: ; AFTER MASTERCLEAR: MOVC OC R0 ; MOVC 3 R1 ; CIO R1 R0 ; ENABLE INTERFACE; SIO R1 R0 ; SENSE INTERFACE; IBZ R1 BPERR ; IF NOT "BREAK" THEN JMP MCPT ; GOTO AFTER MASTERCLEAR; MCPT1: ; READY: JMPI S4 IOUTTXNL ; WRITE(TEXT); <:RAM TEST START, SIZE: <0>:> JMPI S5 IGETADR ; GET SIZE; JMP MCPTER ; ERROR: GOTO MCERR; SLC R3 4 ; IEQ R3 8 ; JMP T32 ; IEQ R3 4 ; JMP T16 ; IEQ R3 1 ; JMP T04 ; MCPTER: ; MCERR: JMPI S4 IOUTTXNL ; WRITE(TEXT); <:ILLEGAL<0>:> ; JMP MCPT1 ; T32: ; 32K RAM TEST: MOVC #FF R2 ; #FF => TAD; MOVC TEST32-TESTS R1 ; SET TEST; MOV R1024 R0 ; SET COUNT; JMP TX ; GOTO INIT TEST; T16: ; 16K RAM TEST: MOVC #7F R2 ; #7F => TAD; MOVC TEST16-TESTS R1 ; SET TEST; MOV R2048 R0 ; SET COUNT; JMP TX ; GOTO INIT TEST; T04: ; 4K RAM TEST: MOVC #3F R2 ; #3F => TAD; MOVC TEST04-TESTS R1 ; SET TEST MOV R2000 R0 ; SET COUNT; TX: ; INIT TEST: SLC R3 12 ; MOV R3 SIZE ; SET SIZE; SRL R3 1 ; MOV R3 SIZE2 ; SET HALF SIZE; MOV R0 SIZE3 ; SET 0.COUNT; SWP R3 ; MOV R3 SIZE4 ; MOV R2 TADR ; TAD => 0.TESTADR; MOV R1 TESTOFF ; SET TEST; MCPT2: ; START OF TEST: JMPI S4 IOUTTXNL ; WRITE(TEXT); <:RAM TEST READY<0>:> ; MOVC 0 R0 ; 0 => MOV R0 TESTNR ; 0.TEST NO; MOV BASEPOINTER R4 ; SET BASE IN R4; JMP INIT ; GOTO INIT; ;### IF LOC LT (#FFD0 - PRG1) THEN #FFFF,REPEAT #FFD0-PRG1-LOC ELSE MESSAGE LOC FI PBASE: 0, 0, 0, 0, BS1, 0, 0, 0 BS1, BS1, PRG1, INITP, 0, #E000, 0, LOCACT MCPOINT: 0, 0, 0, BS1, 0, 0, 0, 0 BS1, BS1, PRG1, MCL, 0, #E000, 0, LOCACT BOOTBASE: #0118, #0001, #0001, #0000, #0001, #0001, #FFFF, #002A #0000, #0000, #F590, #F6B5, #0000, #E000, EMACT, #FFFF EMACT:= EMERGENCY+PRG1 BPRG1:= PRG1+PBASE BBOOT:= PRG1+BOOTBASE USE BASE INITP:= INIT+PRG1 MCL:= MCPT+PRG1 END ;### «eof»