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: 13056 (0x3300) Types: TextFile Names: »MFSCTT«
└─⟦5ca485322⟧ Bits:30005483 8" CR80 Floppy CR80FD_0201 ( Backup SL Disk-error 2u ) └─⟦46ea90735⟧ └─ ⟦this⟧ »JAS.MFSCTT«
LIST ;---------------------------------------------------------------------- ; ; FRAME SYNCHRONIZER TEST PROGRAM UNDER SYSTEM ONE ; ;---------------------------------------------------------------------- BEGIN USE BASE MODULE NOLIST $S8MXGL $S8MNAX LIST PMASK= TRUE XPD:= UTILITYLENGTH NOLIST $S8MXP1 LIST OUTCHAR1=OUTCHAR INCHAR1=INCHAR BEGIN EXTERNAL OUTCHAR1, INCHAR1, OUTNL, SETDELAY, WAITEVENT, SETINTERRUPT EXTERNAL INITDEVICE, SENDANSWER, CURIN, CUROUT, INTERRUPT EXTERNAL RESUMEEVENT, OUTEND, REGISTERS, DEVPR, OUTTEXTP EXTERNAL DEVICE, LOCACTION, CAUSE, ENDPROGRAM, WAITINTERRUPT, WAIT ENTRY FIRST FRAMESYNC= TRUE BS1= #1000 ;DEVICE DEFINITIONS OC= 1 IF FRAMESYNC FSCDEV= 7 FI BAS:= 8 MODE: 0 CURADR: 0 TOP: 0 STACK: 0 LOCA: LOCAC SAVE0: 0 IF FRAMESYNC BUFFSC: 0 BFCFSC: 0 CONT1: 0 FI USE PROG IGETADR: GETADR IINCHAR: INCHAR IHEXOUT: HEXOUT ILOADREG: LOADREG IGETREG: GETREG ;GETADR - GET ADDRESS ; CALL EXIT ; ;R0 DESTROYED ;R1 DESTROYED ;R2 0 ;R3 ADDRESS ;R5 LINK DESTROYED ;R6 DESTROYED ;R7 DESTROYED GETADR: ; GETADR: MOV R5 STACK ; LINK=>0.STACK; MOVC 0 R3 ; 0=>VALUE; G1: ; G1: JMP S6 INCHAR ; GET CHAR; JMP S5 HEXIN1 ; TEST IF HEX CHAR; JMP G1 ; NOT HEX, GOTO G1; MOV R1 R3 ; MOVC 3 R2 ; 3=>COUNT; G0: ; G0: JMP S5 HEXIN ; GET HEX CHAR; JMPI STACK ; RETURN(ERROR); SLL R3 4 ; VALUE*16=>VALUE; ADD R1 R3 ; CHAR+VALUE=>VALUE; SOB R2 G0 ; IF DECR(COUNT)<> 0 THEN ; GOTO G0 ; MOV STACK R5 ; 0.STACK=>LINK; JMP 1. X5 ; RETURN; ;HEXIN ; CALL EXIT ; ;R0 DESTROYED ;R1 HEX CHAR ;R5 LINK LINK ;R6 DESTROYED ;R7 DESTROYED HEXIN: ; HEXIN: JMP S6 INCHAR ; GET CHAR; HEXIN1: ; HEXIN1: IGE R1 <:A:> ; IF CHAR < <A> JMP HEXIN2 ; AND IGE R1 <:::> ; CHAR >= <:> 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 ELSE JMP 0. X5 ; RETURN(ERROR); ;HEXOUT ; CALL EXIT ;R1 DESTROYED ;R2 DESTROYED ;R4 BIN VALUE DESTROYED ;R5 LINK LINK ;R6 DESTROYED ;R7 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 ;R7 DESTROYED NEXTLIN: ; NEXTLIN: XCH R6 R4 ; XCH R1 R3 ; MOV CUROUT-C R4 ; MON OUTNL ; XCH R6 R4 ; XCH R1 R3 ; JMP 0. X5 ; ;SPACE OUTPUT A SPACE; ; CALL EXIT ; ;R0 DESTROYED ;R1 DESTROYED ;R6 LINK DESTROYED ;R7 DESTROYED SPACE: ; SPACE: MOVC <: :> R1 ; JMP OUTCHAR ; OUTPUT(<SP>); INCHAR: ; INCHAR: XCH R4 R0 ; XCH R1 R3 ; MOV CURIN-C R4 ; MON INCHAR1 ; XCH R1 R3 ; XCH R0 R4 ; JMP 0. X6 ; OUTCHAR: ; OUTCHAR: XCH R4 R0 ; XCH R1 R3 ; MOV CUROUT-C R4 ; MON OUTCHAR1 ; XCH R1 R3 ; XCH R0 R4 ; JMP 0. X6 ; ; ;GETREG ; CALL EXIT ;R0 DESTROYED ;R1 DESTROYED ;R3 VALUE ;R4 REG. NO. REG. NO ;R6 LINK LINK GETREG: ; GETREG: MOV R4 R0 ; REG. NO. => RGN; SLL R0 6 ; RGN*64 => RGN; ADD DEVICE-C R0 ; RGN+DEVICE => RGN; MOV MODE R1 ; 0.MODE => M; IBNP R1 1 ; IF M(1:1) = 1 THEN SIO R3 R0 ; SENSE (VALUE,RGN) JMP GETREG1 ; ELSE RIO R3 R0 ; READ (VALUE,RGN); GETREG1:IBN R1 0 ; IF M(0:1) = 1 THEN INV R3 ; INVERT (VALUE); JMP 0. X6 ; RETURN; ; ;LOADREG ; CALL EXIT ;R0 DESTROYED ;R1 DESTROYED ;R3 VALUE VALUE ;R4 REG. NO REG. NO ;R6 LINK LINK LOADREG: ; LOADREG: MOV R4 R0 ; REG. NO => RGN; SLL R0 6 ; RGN*64 => RGN; ADD DEVICE-C R0 ; RGN+0.DEVICE => RGN; MOV MODE R1 ; 0.MODE => M; IBN R1 0 ; IF M(0:1) = 1 THEN INV R3 ; INVERT (VALUE); IBNP R1 1 ; IF M(1:1) = 1 THEN CIO R3 R0 ; CONTROL(VALUE,RGN) JMP LOADR1 ; ELSE WIO R3 R0 ; WRITE(VALUE,RGN); LOADR1: IBN R1 0 ; IF M(1:0) = 1 THEN INV R3 ; INVERT(VALUE); JMP 0. X6 ; RETURN; ; ; ; FIRST: ; INIT INTERRUPTS: MOV LOCACN-C R0 ; MOV LOCA R1 ; MOV R1 LOCACN-C ; MOV R0 LOCA ; F1: ; DEVICE NO: JMP S6 INCHAR ; INCHAR; INE R1 10 ; IF CHAR <> NL THEN JMP F1 ; GOTO DEVICE NO; JMP S5 NEXTLIN ; NEWLINE; JMP S6 F1TEXT ; <:ENTER DEVICE NO:<0>:> F1TEXT: MOV CUROUT-C R4 ; MON OUTTEXTP ; WRITE (<:ENTER DEVICE NO::>); MOVC <: :> R3 ; MON OUTEND ; WRITE (<: :>); JMP S5 GETADR ; GET ADDRESS; JMP F1 ; ERROR: GOTO DEVICE NO; IGE R3 64 ; IF DEVICE NO > 63 THEN JMP F1 ; GOTO DEVICE NO; MOV R3 DEVICE-C ; ADDRESS => 0.DEVICE; SLL R3 2 ; MOV R3 R0 ; MOV R0 DEVPR-C ; MON INITDEVICE ; START: ; START: JMP S5 NEXTLIN ; NEW LINE; MOVC <:>:> R3 ; MOV CUROUT-C R4 ; MON OUTEND ; STR1: ; STR1: JMP S6 INCHAR ; GET COMMAND; ; IF FRAMESYNC IEQ R1 <:O:> ; O - SEND DATA JMP SENDDATA ; FI IEQ R1 <:X:> ; X - EXIT MON ENDPROGRAM ; IEQ R1 <:D:> ; D - MEMDUMP; JMP MEMDUMP ; IEQ R1 <:C:> ; C - CONTINUE MEMDUMP; JMP CMEMDUMP ; IEQ R1 <:P:> ; P - LOAD DATA; JMP LOADDATA ; IEQ R1 <:Q:> ; Q - INSERT SAVE-LOAD PATCH; JMP PATCH ; IF FRAMESYNC IEQ R1 <:A:> ; A - DEFINE DATA JMP FSCDATADF ; IEQ R1 <:G:> ; G - DUMP REGISTER IN FSC JMP FSCREGDMP ; IEQ R1 <:L:> ; L - LOAD REGISTER IN FSC JMP FSCREGLOD ; IEQ R1 <:W:> ; W - WAIT INTERRUPT JMP WAITFSTT ; IEQ R1 <:E:> ; E - REPETITIVE LOAD JMP CONTLOAD ; IEQ R1 <:F:> ; F - REPETITIVE SENSE JMP CONTDUMP ; IEQ R1 <:T:> ; T - MEASURE INTERRUPT TIME JMP INTTIME ; IEQ R1 <:I:> ; I - INVERTED DEVICE COMM. JMP INVERT ; IEQ R1 <:N:> ; N - NONINVERTED DEVICE COMM. JMP NONINVERT ; IEQ R1 <:R:> ; R - READ-WRITE DEVICE COMM. JMP READWRITE ; IEQ R1 <:S:> ; S - SENSE-CONTROL DEVICE COMM. JMP SENSECNTRL ; FI ; IEQ R1 <: :> ; IF CHAR = <SP> THEN JMP STR1 ; GOTO STR1; IEQ R1 10 ; IF CHAR = NL THEN JMP STR1 ; GOTO STR1; ERROR: ; ERROR: MOVC <:?:> R1 ; JMP S6 OUTCHAR ; OUTPUT ?; JMP START ; GOTO START; ; ; IF FRAMESYNC ; ; SENDDATA: ; SEND DATA-AREA TO FSC: MOV BUFFSC R2 ; MOV BFCFSC R3 ; GET AREASIZE ; MOVC 7<6 R0 ; ADD DEVICE-C R0 ; IEQ R2 0 ; IF STARTADR = 0 THEN JMP ERROR ; GOTO ERR; ; SENDD0: ; ADDRESS := STARTADDRESS ; MOV X2 R1 ; FOR I := 1 UNTIL AREASIZE DO INV R1 ; SWP R1 ; BEGIN CIO R1 R0 ; WRITE (FSC,HIGHBYTE(ADR)) ; SWP R1 ; CIO R1 R0 ; WRITE (FSC,LOWBYTE(ADR)) ; ADDC 1 R2 ; INCR (ADR) ; SOB R3 SENDD0 ; END ; ; JMP START ; FI ; LOADDATA: ; LOADDATA: JMP S5 GETADR ; GETADDRESS; JMP ERROR ; IF ERROR THEN GOTO ERROR; SUB BAS 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 ; CONVET 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 R2 0. X3 ; SAVE WORD; ADDC 1 R3 ; INCR(RE.ADDRESS); JMP LD0 ; GOTO NEW DATA(LD0); ; ; MEMDUMP: ; MEMDUMP: JMP S5 GETADR ; GET START ADDRESS; JMP ERROR ; IF ERROR THEN GOTO ERROR; MOV R3 CURADR ; MOVC #FFFF R3 ; MOV R3 TOP ; ADDRESS => 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 R3 ; 0.CURADR => RE.WORD; MOV TOP R4 ; 0.TOP => TOPADDRESS; ILO R4 R3 ; IF TOPADDRESS <CURADR THEN JMP START ; GOTO START; MOVC 0 R0 ; MON SETDELAY ; MON WAITEVENT ; JMP ON ; JMP MDANSW ; MON SENDANSWER ; JMP START ; MDANSW: ; MON RESUMEEVENT ; JMP START ; ON: ; MOV R3 R4 ; MODN BAS ; MOV 0. X4 R4 ; 0.CURADR => WORD; JMP S5 HEXOUT ; OUTPUT WORD; ADDC 1 R3 ; INCR(RE.WORD); MOV R3 CURADR ; RE.WORD => 0.CURADR; XTR R3 3 ; IF RE.WORD(2:3)<>0 INE R3 0 ; THEN JMP L1 ; GOTO NEXT; JMP CMEMDUMP ; GOTO CONTINUE MEMDUMP; ; PATCH: ; PATCH: JMPI S5 IGETADR ; GET ADDRESS; JMP ERROR ; IF ERROR THEN GOTO ERROR; SUB BAS R3 ; MOVC #20BE R0 ; SVP MOV R0 0. X3 ; MOV BAS R0 ; SWP R0 ; XTR R0 8 ; SWP R0 ; ADDC #56 R0 ; MOV R0 1. X3 ; MOVC #0048 R0 ; MOV R0 2. X3 ; MOVC #40BC R0 ; LDN R0 MOV R0 3. X3 ; JMP START ; GOTO START; IF FRAMESYNC ; ; FSCREGLOAD: ; LOAD REGISTER IN FSC: JMPI S5 IGETADR ; GET REGISTERNUMBER; JMP FSCRED ; MOV R3 R4 ; REG := REGNUMBER; JMP S6 INCHAR ; IF NEXTCHAR <> <SP> INE R1 <: :> ; THEN JMP ERROR ; GOTO ERROR ; JMPI S5 IGETADR ; GET REGISTERCONTENT ; JMP ERROR ; IF ERROR THEN GOTO ERROR ; JMP S6 LOADREG ; LOADREGISTER; JMP START ; GOTO START ; ; ; FSCREGDUMP: ; DUMP REGISTER IN FSC: JMPI S5 IGETADR ; GET REGISTER NUMBER ; JMP FSCREGDMP ; MOV R3 R4 ; REGISTERNUMBER => REGN; JMP S6 GETREG ; GETREGISTER; JMP S6 SPACE ; WRITE(<SP>) ; MOV R3 R4 ; VALUE => BINVALUE; JMPI S5 IHEXOUT ; WRITE (CONTENT) ; JMP START ; ; ; FSCDATADEF: ; DEFINE DATA TO FSC: JMPI S5 IGETADR ; GET STARTADR ; JMP ERROR ; IF ERROR THEN GOTO ERROR; JMPI S6 IINCHAR ; CHECK INE R1 <: :> ; SPACE JMP ERROR ; SEPARATOR ; MOV R3 R4 ; SAVEST := STARTADR ; JMPI S5 IGETADR ; GET AREASIZE ; JMP ERROR ; IF ERROR THEN GOTO ERROR ; IEQ R3 0 ; IF AREASIZE = 0 THEN JMP ERROR ; GOTO ERROR; SUB BAS R4 ; ADJUST STARTADR TO RELATIVE; MOV R4 BUFFSC ; SAVE (STARTADR) ; MOV R3 BFCFSC ; SAVE (AREASIZE) ; JMP START ; ; ; ; WAITFT: ; WAITINTERRUPT: MOV INTERRUPT-C R1 ; MOVC 0 R0 ; 0 => DELAY; MON WAITINTERRUPT ; WAITINTERRUPT; JMP TIME ; TIMEOUT: GOTO NOINT; JMP S6 WAITTX ; INTERRUPT: CONTINUE; <:DEVICE <0>:> ; <: PRIORITY <0>:> ; WAITTX: MOV CUROUT-C R4 ; MON OUTTEXTP ; WRITE (<:DEVICE :>); MOV DEVICE-C R4 ; MOV R6 R3 ; JMPI S5 IHEXOUT ; WRITE ( DEVICE ); MOV R3 R6 ; MOV CUROUT-C R4 ; MON OUTTEXTP ; WRITE (<: PRIORITY :>); MOV DEVPR-C R3 ; XTR R3 2 ; ADDC <:0:> R3 ; MON OUTCHAR1 ; WRITE ( PRIORITY ); MON OUTNL ; WRITE ( <10> ); MON WAIT ; WAIT (SHARE); JMP WAITFT ; GOTO WAITINTERRUPT; ; TIME: ; NOINT: MOVC 0 R0 ; MON SETDELAY ; 0 => DELAY; MON WAITEVENT ; WAITEVENT; JMP WAITFT ; TIMEOUT: GOTO WAITINTERRUPT; JMP MDANSW ; ANSWER: RESUME AND GOTO START; WAIMES: MON SENDANSWER ; MESSAGE: ANSWER AND GOTO START; JMP START ; ; ; ; CONTLOAD: ; REPETITIVE LOAD: JMPI S5 IGETADR ; GET REG NUMBER; JMP CONTLOAD ; MOV R3 R4 ; REG := REGNUMBER; JMPI S6 IINCHAR ; CHECK INE R1 <: :> ; SPACE JMP ERROR ; SEPARATOR; JMPI S5 IGETADR ; GET REG CONT1; JMP ERROR ; MOV R3 CONT1 ; SAVECONT1 := REG CONT1; JMPI S6 IINCHAR ; CHECK INE R1 <: :> ; SPACE JMP ERROR ; SEPARATOR; JMPI S5 IGETADR ; JMP ERROR ; MOVC #FFFF R5 ; MOV R3 R2 ; SAVE REG CONT2; CLLOOP: ; LOADAGAIN: MOV CONT1 R3 ; REG CONT1 => VALUE; JMPI S6 ILOADREG ; LOADREGISTER; MOV R2 R3 ; REG CONT2 => VALUE; JMPI S6 ILOADREG ; LOADREGISTER; SOB R5 CLLOOP ; MOVC 0 R0 ; MON SETDELAY ; MON WAITEVENT ; JMP TIMEOUT ; JMP MDANSW ; MON SENDANSWER ; JMP START ; TIMEOUT: ; MOVC #FFFF R5 ; JMP CLLOOP ; ; ; ; CONTDUMP: ; REPETITIVE SENSE: JMPI S5 IGETADR ; GET REG NUMBER; JMP CONTDUMP ; MOV R3 R4 ; REG NUMBER => REGN; MOVC #FFFF R5 ; CDLOOP: ; DUMPAGAIN: JMPI S6 IGETREG ; GETREGISTER; SOB R5 CDLOOP ; MOVC 0 R0 ; MON SETDELAY ; MON WAITEVENT ; JMP CDTIMEOUT ; JMP MDANSW ; MON SENDANSWER ; JMP START ; CDTIMEOUT: ; MOVC #FFFF R5 ; JMP CDLOOP ; ; ; ; ; INTTIME: ; MEASURE INTERRUPT TIME: JMPI S5 IGETADR ; GET NO OF INTERRUPTS; JMP ERROR ; WINT: ; NEW INTERRUPT: MOVC 255 R0 ; 2.55 SEC => DELAY; MOV INTERRUPT-C R1 ; MON WAITINTERRUPT ; WAITINTERRUPT; JMP INTSLOW ; TIMEOUT: GOTO SLOW; SOB R3 WINT ; INTERRUPT: IF DECR(COUNT)>0 THEN ; GOTO NEW INTERRUPT JMP START ; ELSE GOTO START; INTSLOW: ; SLOW: JMP S6 INTTXT ; <:TOO SLOW INTERRUPT RATE<0>:> INTTXT: MOV CUROUT-C R4 ; MON OUTTEXTP ; JMP START ; ; ; ; INVERT: ; SET INVERTED DEVICE COMM.: MOVC MODE R0 ; MODE => ADR; MOVC #FFFF R1 ; #FFFF => BITS; MODC #0001 ; #0001 => MASK; PUT R1 X0 ; PUT BITS MASKED INTO 0.ADR; JMP START ; GOTO START; ; ; NONINVERT: ; SET NONINVERTED DEVICE COMM.: MOVC MODE R0 ; MODE => ADR; MOVC 0 R1 ; 0 => BITS; MODC #0001 ; #0001 => MASK; PUT R1 X0 ; PUT BITS MASKED INTO 0.ADR; JMP START ; GOTO START ; ; READWRITE: ; SET READWRITE DEVICE COMM.: MOVC MODE R0 ; MODE => ADR; MOVC 0 R1 ; 0 => BITS; MODC #0002 ; #0002 => MASK; PUT R1 X0 ; PUT BITS MASKED INTO 0.ADR; JMP START ; GOTO START; ; ; SENSECONTROL: ; SET SENSECONTROL DEVICE COMM.: MOVC MODE R0 ; MODE => ADR; MOVC #FFFF R1 ; #FFFF => BITS; MODC #0002 ; #0002 => MASK; PUT R1 X0 ; PUT BITS MASKED INTO 0.ADR; JMP START ; GOTO START; FI LOCAC: ; MOV R0 SAVE0 ; MOV CAUSE-C R0 ; IEQP R0 0 ; MOV SAVE0 R0 ; JMPI LOCA ; JMP S6 LOCTXT ; <:<10>CAUSE:<0>:> LOCTXT: ; MOV CUROUT-C R4 ; MON OUTTEXTP ; MOV R0 R4 ; JMPI S5 IHEXOUT ; MOVC 0 R0 ; LDS R0 ; MOV SAVE0 R0 ; JMP START ; NOP ; USE BASE END XPRPC= FIRST XREFS=2 XBUFS=2 NOLIST $S8MXP2 LIST END «eof»