;TOG-11 V.02 ;TC11 DECTAPE FORMATTER ;MODIFIED FOR RT-11 BY DAVID OFSEVIT ;FORMAT DECTAPES ON UNIT 7 IN STANDARD FORMAT OF ;578(10) BLOCKS WITH 256(10) 18 BIT WORDS PER BLOCK .MCALL .REGDEF,.EXIT .REGDEF ;REGISTER DEFINITIONS XX=HALT PS=177776 ;PROCESSOR STATUS P7=340 B7=200 B15=100000 .MACRO AND A,B BIC #-A-1,B ;MASK A APPLIED TO B .ENDM START: RESET ;CLEAR THE WORLD MOV #P7,PS ;LOCKOUT P1 BY RAISING CPU PRIORITY MOV #101101,R0 ;REVERSE END ZONE=55 MOV #-4096.,R4 ;COUNTER FOR REZ MOV #3413,@TCCM ;GO LP1: JSR PC,FLAG ;WAIT FOR READY OR ERROR MOV R0,@TCDT ;LOAD MARK TRACK INC R4 ;DONE ALL? BNE LP1 ;LOOP IF NOT FINISHED MOV #-199.,R4 ;COUNTER FOR IBS MOV #10101,R0 ;INTERBLOCK SYNC=25 LP2: JSR PC,FLAG ;WAIT FOR FLAG MOV R0,@TCDT ;LOAD MARK CODE INC R4 ;DONE ALL? BNE LP2 ;IF NOT, KEEP LOADING MOV #-578.,R3 ;COUNTER FOR NUMBER OF BLOCKS LP3: JSR PC,FRMBLK ;WRITE CODES FOR ONE BLOCK INC R3 ;DONE ALL? BNE LP3 ;IF NOT, WRITE ANOTHER BLOCK MOV #-199.,R4 ;COUNTER FOR IBS MOV #10101,R0 ;INTERBLOCK SYNC=25 LP4: JSR PC,FLAG ;WAIT FOR FLAG MOV R0,@TCDT ;LOAD MARK CODE INC R4 ;DONE ALL? BNE LP4 ;IF NOT, KEEP WRITING IBS MOV #-4096.,R4 ;COUNTER FOR FEZ MOV #10010,R0 ;FORWARD END ZONE=22 LP5: JSR PC,FLAG ;WAIT FOR FLAG MOV R0,@TCDT ;LOAD MARK CODE INC R4 ;DONE ALL? BNE LP5 ;IF NOT, KEEP WRITING FEZ JSR PC,FLAG ;WAIT FOR LAST FLAG CLR @TCCM ;STOP TAPE. MARK + TIMING TRACKS ARE HLT1: XX ;WRITTEN. RESET WRTM SWITCH AND JMP WRTBNO ;SET WALL SWITCH, THEN CONTINUE. FRMBLK: MOV #-266.,R4 ;COUNTER FOR 1 BLOCK'S WORTH OF MKTRACK MOV #BLKMRK,R0 ;POINTER TO MARK CODE TABLE LP6: JSR PC,FLAG ;WAIT FOR FLAG MOV (R0),@TCDT ;FETCH MARK CODE ADD #2,R0 ;ADVANCE POINTER INC R4 ;DONE ALL? BNE LP6 ;IF NOT, FETCH ANOTHER CODE RTS PC ;IF SO, EXIT WRTBNO: JSR PC,COBLKG ;GENERATE TABLE OF CMPOBV BLK NUMBERS MOV #-3,R0 ;THREE BLOCKS MOV #7402,@TCCM ;SEARCH REVERSE WLP1: INCB @TCCM ;GO JSR PC,FLAG ;WAIT FOR BLOCK NUMBER INC R0 ;FOUND THREE? BNE WLP1 ;IF NOT, KEEP SEARCHING MOV #76677,R0 ;COMPLEMENT OBVERSE OF 1011 (LAST BLOCK#) MOV #3417,@TCCM ;WRITEALL FORWARD JSR PC,FLAG ;WAIT TO SYNC UP FOR WRITING WLP2: BISB #3,@TCST ;SET XDA BITS FOR 0 REVERSE MOV R0,@TCDT ;WRITE LAST BLOCK # FROM HERE TO END ZONE JSR PC,FLAG1 ;SKIP NEXT INSTRUCTION IF END ZONE IS SENSED BR WLP2 ;KEEP WRITING 1011 MOV #1101,FBLK ;INITIALIZE PARAMETERS FOR LAST BLOCK, MOV #BYST,R5 ;XDA BIT TABLE AND MOV #RBN,R3 ;TABLE OF REVERSE BLOCK NUMBERS MOV #7417,@TCCM ;WRITEALL REVERSE WALUP: DEC FBLK ;DECREMENT BLOCK NUMBER CMP #-2,FBLK ;LAST BLOCK WRITTEN? BEQ CHECK ;YES-CHECK DATA AND BLOCK NUMBERS MOV #-1,R4 ;-1 REVERSE =0 FWD MOV #-260.,TOG1 ;NUMBER OF WORDS WLP3: JSR PC,FLAG ;WAIT FOR SYNC FLAG TO WRITE BISB #3,@TCST ;1 KBV=0 FWD MOV R4,@TCDT ;LOAD DATA WORD INC TOG1 ;WRITE IT 260 TIMES BNE WLP3 ;KEEP WRITING UNTIL FINISHED JSR PC,FLAG ;WAIT FOR FLAG BEFORE WRITING FWD BLK# MOVB (R5)+,@TCST ;FETCH RELEVANT XDA BITS MOV (R3),@TCDT ;FETCH RELEVANT CMP,OBV,BLK# ADD #2,R3 ;ADVANCE TABLE POINTER CMP R5,#BYST+10 ;SEE IF XDA BIT TABLE IS EXHAUSTED BNE .+6 ;IF NOT, PROCEED MOV #BYST,R5 ;IF SO, REINITIALIZE POINTER MOV #WALBF,R4 ;SETUP POINTER FOR LAST FIVE WORDS MOV #-2,TOG1 ;COUNT OF TWO WLP4: JSR PC,FLAG ;WAIT FOR REQUEST FLAG BISB #3,@TCST ;SET XDA 17 & 16 MOV (R4)+,@TCDT ;FETCH DATA WORD INC TOG1 ;ADVANCE COUNT BNE WLP4 ;KEEP WRITING UNTIL FINISHED JSR PC,FLAG ;WAIT BICB #3,@TCST ;CLEAR XDA 17 AND 16 FOR REVERSE BLK# MOV (R4)+,@TCDT ;REVERSE BLOCK NUMBER MOV #-2,TOG1 ;COUNT OF TWO WLP5: JSR PC,FLAG ;WAIT FOR FLAG BISB #3,@TCST ;SET XDA 17 AND 16 MOV (R4)+,@TCDT ;FETCH DATA WORD INC TOG1 ;ADVANCE COUNT BNE WLP5 ;KEEP WRITING UNTIL FINISHED BR WALUP ;FINISHED-DO NEXT BLOCK CHECK: JSR PC,FLAG ;TAPE IS FORMATTED,CHECK DATA MOV #7403,@TCCM ;REWIND INTO END ZONE CHKL1: JSR PC,FLAG1 ;SKIP NEXT INSTRUCTION IF EZ BR CHECK+4 ;KEEP REWINDING CLR @TCCM ;STOP TAPE CLR TOG2 ;START WITH BLOCK#0 CHKL2: MOV #3403,@TCCM ;SEARCH FWD JSR PC,FLAG ;WAIT FOR FLAG CMP TOG2,@TCDT ;IS FWD BLOCK NUMBER CORRECT? BEQ DATCHK ;YES = CHECK DATA MOV @TCDT,R0 ;NO = PUT INCORRECT BLK# IN R0 FOR DISPLAY CLR @TCCM ;STOP TAPE AND EHLT2: XX ;HALT WITH BAD FWD BLK # IN LIGHTS, CONTINUE MOV TOG2,R0 ;TO FIND CORRECT BLOCK # EHLT3: XX ;HALT WITH CORRECT FWD BLK# IN LIGHTS MOV #7403,@TCCM ;TRY AGAIN DATCHK: MOV #-257.,TOG1 ;CHECK REV,CHKSUM AND DATA MOV #3407,@TCCM ;READ ALL DCHKL1: JSR PC,FLAG ;WAIT FOR WORD TST @TCDT ;IT SHOULD = 0 BEQ DATOK ;IF SO, PROCEED CLR @TCCM ;IF NOT, STOP TAPE MOV TOG2,R0 ;FETCH BLK# AND EHLT4: XX ;HALT WITH BLK#IN LIGHTS, CONTINUE MOV #257.,R0 ;TO FIND DATA WORD POSITION ADD TOG1,R0 ;DETERMINE WHICH WORD IS WRONG EHLT5: XX ;HALT WITH #OF WORD IN LIGHTS. 0=REV. CHKSUM MOV @TCDT,R0 ;CONTINUE TO FETCH BAD WORD EHLT6: XX ;HALT WITH BAD DATA IN LIGHTS. CONTINUE MOV #7403,@TCCM ;TO TRY AGAIN BR CHKL1 ;RESTART CHECK DATOK: INC TOG1 ;CHECK ALL DATA IN BLOCK BNE DCHKL1 ;KEEP CHECKING UNTIL DONE INC TOG2 ;SETUP FOR NEXT BLOCK CMP #1102,TOG2 ;HAVE ALL BLOCKS BEEN CHECKED? BNE CHKL2 ;IF NOT KEEP CHECKING RCHK: MOV #3403,@TCCM ;YES-FIND FWD EZ JSR PC,FLAG1 ;SKIP ON EZ EHLT7: XX ;1101 SHOULD BE LAST BLOCK#. RESTART MOV #1101,TOG2 ;FIRST REVERSE BLK=1101 RERCV: MOV #7400,@TCCM ;SET TAPE TO REVERSE MOV #DATBUF,R0 ;INITIALIZE DATA BUFFER POINTER ZLUP: CLR (R0) ;ZERO DATA WORD ADD #2,R0 ;ADVANCE POINTER CMP R0,#DATBUF+512. ;IS BUFFER FILLED? BNE ZLUP ;IF NOT KEEP CLEARING CHKL3: MOV #7403,@TCCM ;SEARCH REVERSE AND JSR PC,FLAG ;WAIT FOR FLAG CMP TOG2,@TCDT ;IS REVERSE BLOCK# CORRECT? BEQ WRTDTA ;YES-WRITE DATA MOV @TCDT,R0 ;NO-PUT INCORRECT BLK# IN R0 FOR DISPLAY CLR @TCCM ;STOP TAPE AND EHLT10: XX ;HALT WITH BAD REV. BLK# IN LIGHTS. CONTINUE MOV TOG2,R0 ;TO FIND CORRECT BLK# EHLT11: XX ;HALT WITH CORRECT REV. BLK# IN LIGHTS. CONTINUE MOV #3403,@TCCM ;TO TRY PASS AGAIN JSR PC,FLAG1 ;FIND FWD EZ AND BR EHLT11+2 ;RESTART REVERSE BR RERCV ;CHECK PASS WRTDTA: MOV #-400,@TCWC ;WC FOR 1 BLOCK OF DATA MOV #DATBUF,@TCBA ;CA INITIALIZATION MOV #7415,@TCCM ;WRITE DATA TO MAKE PARITY OK JSR PC,FLAG ;WAIT FOR COMPLETION OR ERROR DEC TOG2 ;DECREMENT BLOCK# BPL CHKL3 ;IF BELOW 0 FINISH VP. OTHERWISE KEEP CHECKING FINIS: MOV #7403,@TCCM ;FIND REVERSE EZ JSR PC,FLAG1 ;SKIP ON EZ XX ;0 SHOULD HAVE BEEN LAST BLOCK# IN REVERSE CLR @TCCM ;STOP TAPE AND .EXIT ;HALT. PROGRAM IS FINISHED. MOUNT NEW JMP START ;TAPE. SET WRTM SWITCH AND CONTINUE FLAG1: BIT #B15+B7,@TCCM ;TEST ERROR AND READY BITS BEQ FLAG1 ;WAIT FOR EITHER FLAG BMI .+4 ;IF ERROR-CHECK FURTHER RTS PC ;IF READY-EXIT TST @TCST ;IS ERROR END ZONE? BMI .+6 ;YES-SKIP JMP FLAG ;NO-GO TO REGULAR STATUS ERROR HALT ADD #2,(SP) ;INCREMENT EXIT POINTER TO SKIP ON RETURN RTS PC ;EXIT COBLKG: MOV #1101,R0 ;COMPLEMENT OBVERSE BLOCKS 1101=0 MOV #RBN,R1 ;BUFFER POINTER INITIALIZATION CBLK1: MOV R0,R2 ;FETCH WORD TO BE PROCESSED COM R2 ;COMPLEMENT IT MOV #-3,TOG1 ;COUNT OF 3 MOV R2,R3 ;MOV WORD INTO WORK AREA ROR R2 ;SHIFT NEXT 3 BITS INTO POSITION ROR R2 ;FOR MANIPULATION ROR R2 ;ON NEXT PASS AND 1,R3 MOV R3,-(SP) ;STACK IT CBLK2: MOV R2,R3 ;MOVE BYTE(3) INTO WORK AREA ROR R2 ;SHIFT ROR R2 ;NEXT 3 BITS ROR R2 ;INTO POSITION AND 7,R3 MOV R3,-(SP) ;STACK BYTE INC TOG1 ;DONE ALL? BNE CBLK2 ;NO CLR R3 ;YES-CLEAR WORK AREA ADD 6(SP),R3 ;ADD AND JSR R5,RTHL ;SHIFT BYTES IN REVERSE ORDER ADD 4(SP),R3 ;NEXT BYTE JSR R5,RTHL ;SHIFT ADD 2(SP),R3 ;NEXT BYTE JSR R5,RTHL ;SHIFT ADD (SP),R3 ;LAST BYTE FROM STACK JSR R5,RTHL ;SHIFT JSR R5,RTHL ;SHIFT ADD #77,R3 ;=00 FWD MOV R3,(R1) ;STORE CMP,ORV,BLK# IN TABLE ADD #10,SP ;ADVANCE STACK ADD #2,R1 ;ADVANCE TABLE POINTER DEC R0 ;DECREMENT BLK# BPL CBLK1 ;LOOP UNTIL IT PASSES 0 RTS PC ;THEN EXIT RTHL: CLC ;THREE BIT LEFT SHIFT. CLEAR CARRY ROL R3 ;SHIFT 1 ROL R3 ; 2 ROL R3 ; 3 RTS R5 ;THEN EXIT WALBF: .WORD -1 ;-1 REVERSE =0 FORWARD .WORD -1 FBLK: .WORD 1101 ;BLOCK NUMBER GOES HERE .WORD -1 .WORD -1 BYST: .BYTE 3 ;TABLE OF XDA 17 & 16 FOR CMP,OBV,BLK# .BYTE 3 .BYTE 0 .BYTE 0 .BYTE 1 .BYTE 1 .BYTE 2 .BYTE 2 FLAG: BIT #B15+B7,@TCCM ;TEST ERROR AND READY BITS BEQ FLAG ;KEEP CHECKING IF BOTH DOWN BMI .+4 ;SKIP TO ERROR IF B15=1 RTS PC ;EXIT ON READY FLAG MOV @TCST,R0 ;MOVE STATUS TO R0 FOR DISPLAY EHLT1: XX ;STATUS ERROR HALT. STATUS IS IN REGISTER BR EHLT1 ;LIGHTS FIX PROBLEM AND RESTART PROGRAM BLKMRK: .WORD 010101 ;INTERBLOCK SYNC=25 .WORD 010110 ;FORWARD BLOCK MARK=26 .WORD 011010 ;REVERSE GUARD=32 .WORD 001000 ;LOCK=10 .WORD 001000 ;REVERSE PARITY=10 .WORD 001000 ;REVERSE FINAL=10 .WORD 001000 ;REVERSE PRE-FINAL=10 .REPT 374 .WORD 111000 ;MARK DATA=70 .ENDR .WORD 111011 ;PRE-FINAL=73 .WORD 111011 ;FINAL=73 .WORD 111011 ;PARITY=73 .WORD 111011 ;REVERSE LOCK=73 .WORD 101001 ;GUARD=51 .WORD 100101 ;REVERSE BLOCK MARK=45 .WORD 010101 ;INTERBLOCK SYNC=25 TOG2: XX TOG1: XX TCCM: 177342 TCST: 177340 TCDT: 177350 TCBA: 177346 TCWC: 177344 RBN: .=.+2204 DATBUF: .=.+1000 .END START ;THAT'S ALL, FOLKS!