;SUBROUTINE CONVERTS 3 RT/11 16 BIT WORDS INTO ;4 OS/8 12 BIT WORDS .GLOBL SWAP SWAP: TST (R5)+ MOV (R5)+,R3 MOV (R5)+,R4 MOV (R3)+,T1 SWAB T1 MOV T1,ST1 CLC ROR ST1 ASR ST1 ASR ST1 ASR ST1 MOV ST1,(R4)+ MOV (R3)+,T2 SWAB T2 MOVB T2,ST2 SWAB T2 BIC #177400,T2 SWAB T1 BIC #170377,T1 BIS T1,T2 MOV T2,(R4)+ SWAB ST2 MOV (R3)+,T3 MOV T3,T4 BIC #177417,T3 BIS T3,ST2 CLC ROR ST2 ASR ST2 ASR ST2 ASR ST2 MOV ST2,(R4)+ SWAB T4 BIC #170000,T4 MOV T4,(R4)+ RTS PC T1: .WORD 0 T2: .WORD 0 T3: .WORD 0 T4: .WORD 0 ST1: .WORD 0 ST2: .WORD 0 .END ; CONVERT 12 BIT NEG NUMBER TO 16 BIT NEG NUMBER .GLOBL NUMB NUMB: TST (R5)+ MOV @(R5)+,T ;NUMBER IN T BIS #170000,T ;SET TOP 4 BITS MOV T,R0 RTS PC T: .WORD 0 .END .GLOBL IBIT ; SUBROUTINE CONVERTS 256 12 BIT WORDS IN BUFF TO 256 ; 16 BIT WORDS IN TEMP WITH 16 WORDS=MASK EVERY OTHER ; 48 16 BIT WORDS IBIT: TST (R5)+ MOV (R5)+,INDEX+2 ;POINTS TO BUFF MOV (R5)+,R2 ;POINTS TO TEMP MOV @(R5)+,MASK ;MASK CLR R3 CLR N CLR COUNT ; PUT FIRST WORD FROM TEMP INTO AWORD START: JSR PC,INDEX MOV R1,AWORD TST (R3)+ ;INC SUBSCRIPT ASL AWORD ASL AWORD ASL AWORD ASL AWORD ;AWORD=(12 BITS,0000) JSR PC,INDEX MOV R1,BWORD TST (R3)+ MOV BWORD,X ;SAVE BWORD SWAB BWORD ;GET REQUIRED 4 BITS IN M.S.B BIC #177760,BWORD ;CLEAR ALL BITS EXCEPT L.S.4.BITS BIS AWORD,BWORD ;FIRST OUTPUT WORD 16 BITS SWAB BWORD ;? MOV BWORD,(R2)+ ;OUTPUT TO TEMP SWAB X ;PUT BYTE WE WANT IN M.S.BYTE BIC #377,X ;CLEAR BOTTOM BYTE JSR PC,INDEX MOV R1,AWORD TST (R3)+ ASL AWORD ASL AWORD ASL AWORD ASL AWORD ;AWORD=(12 BITS,0000) MOV AWORD,T ;SAVE AWORD SWAB AWORD ;AWORD=(4,0000,8BITS) BIC #177400,AWORD ;CLEAR TOP WORD BIS X,AWORD ;.OR. BYTES TOGETHER SWAB AWORD MOV AWORD,(R2)+ JSR PC,INDEX MOV R1,AWORD TST (R3)+ SWAB T ;T=(4 BITS,0000,8 BITS) BIC #007777,T ;T=(4BITS,00000000000) BIS T,AWORD ;.OR. THEM TOGETHER SWAB AWORD MOV AWORD,(R2)+ ; ;HAVE NOW CHANGED FIRST 4 12 BITS INTO 3 16 BIT WORDS ADD #1,N ;INC COUNT CMP #20,N BNE AGAIN ; NOW SET THE NEXT "20 16 BIT WORDS CLR M CLEAR: MOV MASK,(R2)+ ;SET WORD TO MASK ADD #1,M CMP #20,M BNE CLEAR ;DO NEXT WORD CLR N INC COUNT CMP #4,COUNT BNE AGAIN RTS PC INDEX: MOV 0(R3),R1 RTS PC AGAIN: JMP START AWORD: .WORD 0 BWORD: .WORD 0 COUNT: .WORD 0 X: .WORD 0 T: .WORD 0 N: .WORD 0 M: .WORD 0 MASK: .WORD 0 .END ; SUBROUTINE CONVERTS 192 RT/11 16 BIT WORDS INTO ; 256 OS/8 12 BIT WORDS HELD IN L.S 12 BITS OF ; OUTPUT ARRAY .GLOBL CNVERT CNVERT: TST (R5)+ MOV (R5)+,R4 ; MOV (R5)+,R3 ; CLR C START: CLR O1 ; CLR O2 ; CLR O3 ; CLR O4 ; MOV (R4)+,T BIS #100200,T ;SET PARITY BITS MOVB T,O1 SWAB T MOVB T,O2 ; MOV (R4)+,T ; BIS #100200,T ;SET PARITY BITS SWAB T MOVB T,O3 ; MOV T,T2 ; BIC #170377,T BIS T,O2 ; BIC #7777,T2 ; CLC ROR T2 ; ASR T2 ; ASR T2 ; ASR T2 ; BIS T2,O1 ; MOV (R4)+,T ; BIS #100200,T ;SET PARITY BITS MOVB T,O4 ; MOV T,T2 ; BIC #170377,T ; BIS T,O4 ; BIC #7777,T2 ; CLC ROR T2 ASR T2 ; ASR T2 ; ASR T2 ; BIS T2,O3 ; MOV O1,(R3)+ ; MOV O2,(R3)+ ; MOV O3,(R3)+ ; MOV O4,(R3)+ ; INC C CMP #64.,C ; BNE AGAIN2 ; RTS PC AGAIN2: JMP START ; T: .WORD 0 C: .WORD 0 O1: .WORD 0 O2: .WORD 0 O3: .WORD 0 O4: .WORD 0 T2: .WORD 0 .END ; SUBROUTINE READS 256 RT/11 16 BIT WORDS AND ; CONVERTS TO 256 12 BIT WORDS IN OS/8 FORMAT ; IGNORES LAST 16(OCTAL)WORDS AT END OF EACH ; SEGMENT,WHICH ONLY FILL IN THE SPACE .GLOBL IC IC: TST (R5)+ MOV (R5)+,INDEX+2 MOV (R5)+,R4 CLR R3 CLR N CLR COUNT START: CLR ST2 JSR PC,INDEX MOV R2,T1 TST (R3)+ SWAB T1 MOV T1,ST1 CLC ROR ST1 ASR ST1 ASR ST1 ASR ST1 MOV ST1,(R4)+ JSR PC,INDEX MOV R2,T2 TST (R3)+ SWAB T2 MOVB T2,ST2 SWAB T2 BIC #177400,T2 SWAB T1 BIC #170377,T1 BIS T1,T2 MOV T2,(R4)+ SWAB ST2 JSR PC,INDEX MOV R2,T3 MOV T3,T4 TST (R3)+ BIC #177417,T3 BIS T3,ST2 CLC ROR ST2 ASR ST2 ASR ST2 ASR ST2 MOV ST2,(R4)+ SWAB T4 BIC #170000,T4 MOV T4,(R4)+ INC N CMP #20,N BNE AGAIN CLR N ADD #40,R3 INC COUNT CMP #4,COUNT BNE AGAIN RTS PC INDEX: MOV 0(R3),R2 RTS PC AGAIN: JMP START T1: .WORD 0 T2: .WORD 0 T3: .WORD 0 T4: .WORD 0 ST1: .WORD 0 ST2: .WORD 0 COUNT: .WORD 0 L: .WORD 0 N: .WORD 0 .END .GLOBL IGETD ;SUBROUTINE TO CONVERT DATE WORD OF DIRECTORY TO 3 WORDS ;EACH CONTAINING ONE NUMBER ONLY DAY,MONTH(1,12),YEAR IGETD: TST (R5)+ ;REMOVE NUMBER OF ARGUMENTS MOV @(R5)+,R1 ;DATE WORD MOV (R5)+,R2 ;ADDRESS OF OUTPUT ARRAY MOV R1,STORED ;STORE DATE WORD BIC #177740,R1 ;CLEAR WORD EXCEPT FOR YEAR ADD #110,R1 ;ADD ON OFFSET TO CORRECT DATE MOV R1,-(SP) ;STACK CORRECT YEAR MOV STORED,R1 ;GET DATE WORD ASR R1 ASR R1 SWAB R1 ; BIC #177740,R1 ;CLEAR ALL BUT THE MONTH BITS MOV R1,-(SP) ;STACK MONTH MOV STORED,R1 ;GET DATE WORD AGAIN ASL R1 ASL R1 ASL R1 BIC #160377,R1 ;CLEAR ALL BUT SIGNIFICANT BITS SWAB R1 ;DAY IN LEAST SIG BYTE OF R1 MOV R1,(R2)+ ;OUTPUT DAY MOV (SP)+,(R2)+ ;OUTPUT MONTH MOV (SP)+,(R2)+ ;OUTPUT YEAR RTS PC STORED: .WORD 0 .END ;SUBROUTINE TO CONVERT THE DATE WORD FROM AN OS/8 DIRECTORY ;TO 3 INTEGERS WHICH REPRESENT DAY,MONTH,YEAR.YEAR =70/77 .GLOBL IGETD8 IGETD8: TST (R5)+ ;CLEAR NUMBER OF ARGUMENTS MOV @(R5)+,R1 ;DATE WORD MOV (R5)+,R2 ;OUTPUT ARRAY MOV R1,R3 ;SAVE DATE WORD BIC #177770,R1 ; ADD #70.,R1 ; MOV R1,-(SP) ;STACK YEAR MOV R3,R1 ; SWAB R1 ; BIC #177760,R1 ;CLEAR ALL BUT MONTH BITS MOV R1,-(SP) ; ASR R3 ASR R3 ASR R3 BIC #177740,R3 MOV R3,(R2)+ MOV (SP)+,(R2)+ MOV (SP)+,(R2)+ RTS PC .END ; SUBROUTINE CONVERTS 16 BIT NEGATIVE NUMBER TO 12 ; BIT NEGATIVE NUMBER .GLOBL IACON IACON: TST (R5)+ MOV @(R5)+,TEMPP ;NUMBER IN TEMP STORAGE BIC #170000,TEMPP ;CLEAR TOP 4 BITS BIS #4000,TEMPP ;SET 12TH BIT MOV TEMPP,R0 RTS PC TEMPP: .WORD 0 .END .GLOBL IAPACK IAPACK: TST (R5)+ MOVB @(R5)+,ABYTE ;1ST CHAR IN ABYTE INC R5 ;INCREMENT REG MOVB @(R5)+,BBYTE ;2ND CHAR IN BBYTE INC R5 ;INC REG ;PACK TWO CHARS INTO BWORD IN PACKED ASCII ;CLEAR 7TH AND 8TH BITS OF OF BOTH BYTES BICB #300,ABYTE ;CLEAR REQUIRED BITS BICB #300,BBYTE ; " " " ; PUT TWO CHARS IN BWORD CLR AWORD ;CLEAR TWO WORDS CLR BWORD ; MOVB ABYTE,AWORD ;PUT 1ST CHAR IN A WORD CMP AWORD,#40 ;IS CHAR A SPACE BEQ SPACE ;YES SET TO NULL NO: SWAB AWORD ;PUT CHAR IN M.S.BYTE CLC ;CLEAR CARRY ROR AWORD ;MOVE CHAR TWO BITS RIGHT ASR AWORD ;REST OF WORD =0 MOVB BBYTE,BWORD ;2ND CHAR IN BWORD CMP BWORD,#40 ;CHAR A SPACE BEQ NULL ;YES SET NULL NEXT: BIS AWORD,BWORD ;.OR. CHARS TOGETHER MOV BWORD,R0 RTS PC SPACE: CLR AWORD ;SET TO NULL JMP NO NULL: CLR BWORD JMP NEXT ; AWORD: .WORD 0 BWORD: .WORD 0 ABYTE: .BYTE 0 BBYTE: .BYTE 0 .END .GLOBL ICON ICON: TST (R5)+ MOV @(R5)+,TEM ;PUT ARG IN TEMP STORAGE MOVB TEM,STORE ;PUT LOWER BYTE IN STORE BICB #300,STORE ;REMOVE 8TH BIT CMPB #32,STORE ;IS CHAR A SPACE OR NULL BLT NOADD ;YES REPRESENTS CHAR ALREADY TSTB STORE ; BEQ SPACE ;BRANCH IF ZERO BISB #100,STORE ;SET 7TH BIT ;CHAR IN STORE IS NOW IN ASCII FORMAT NOADD: ASL TEM ASL TEM ; SWAB TEM ;NEXT CHAR IN L.S.BITS BIC #177700,TEM ; CMP #32,TEM ;A SPACE ? BLT YES ; TST TEM BEQ NULL ;A SPACE! BIS #100,TEM ;SET 7TH BIT YES: SWAB TEM MOVB STORE,AWORD ; BIS AWORD,TEM MOV TEM,R0 RTS PC SPACE: MOVB #40,STORE ;SET TO SPACE JMP NOADD NULL: MOVB #40,TEM JMP YES TEM: .WORD 0 AWORD: .WORD 0 STORE: .BYTE 0 .END ; THIS SUBROUTINE TAKES AN INPUT BYTE ARRAY LENGTH 12 CONTAINING ; A FILE NAME IN THE FORM DEV NAMEOF EXT AND CONVERTS IT TO THE ; FORM DEV:NAMEOF.EXT IN AN ARRAY OF SIZE 14.IF THE FILE-SPEC ; IN THE INPUT ARRAY DOES NOT CONTAIN THE FULL 12 LETTERS THE ; FILE-SPEC WILL BE SQUASHED UP INTO THE START OF THE OUTPUT ARRAY. .GLOBL FILECN FILECN: TST (R5)+ ;CLR NUMBER OF ARGUMENTS MOV (R5)+,R1 ;ADDRESS OF INPUT STRING MOV (R5)+,R2 ;ADDRESS OF OUTPUT STRING MOV #2,CNT ;ARRAY SUBSCRIPT FOR OUTPUT ARRAY MOVB (R1)+,(R2)+ ;MOVE 1ST CHAR INTO OUTPUT ARRAY DEV: CMPB #40,(R1) ;END OF DEVICE NAME? BEQ NCHR ;YES MOVB (R1)+,(R2)+ ;MOV CHAR INTO OUTPUT ARRAY DEC CNT ;DECREMENT COUNT TST CNT ;AT END OF DEVICE NAME BEQ LABEL JMP DEV NCHR: DEC CNT INC R1 TST CNT BEQ LABEL JMP NCHR LABEL: MOVB #':,(R2)+ ;INSERT COLON INTO OUTPUT ARRAY MOV #5,CNT ;RESET COUNT TO MAX LENGTH OF NAME CMPB #40,(R1) ;1ST LETTER OF NAME A BLANK? BEQ RETURN ;IF YES NO NAME THEREFORE RETURN MOVB (R1)+,(R2)+ ;MOV CHAR TO OUTPUT ARRAY NAME: CMPB #40,(R1) ;ANY NULL BYTES LEFT IN NAME SECTION BEQ XTEST ;NO! MOVB (R1)+,(R2)+ DEC CNT ;DECREMENT COUNT TST CNT ;AT END OF DEVICE NAME BEQ EXT ;LOOK AT NEXT CHAR OF DEVICE NAME JMP NAME ;TEST NEXT BYTE XTEST: DEC CNT INC R1 TST CNT ;END OF FILE NAME? BEQ EXT JMP XTEST ;LOOK AT NEXT CHAR EXT: MOVB #'.,(R2)+ ;INSERT FULL STOP CMPB #40,(R1) ;NEXT CHAR A NULL? BEQ RETURN MOVB (R1)+,(R2)+ MOV #2,CNT LAB4: CMPB #40,(R1) ;NEXT BYTE OF EXTENSION A NULL BEQ RETURN MOVB (R1)+,(R2)+ ;MOV CHAR INTO OUTPUT ARRAY DEC CNT TST CNT BNE LAB4 ;GET NEXT CHAR RETURN: RTS PC CNT: .WORD 0 .END ; SUBROUTINE CONVERTS 256 16 BIT WORDS(ONLY L.S 12 BITS ; ARE SIGNIFICANT)INTO 192 RT/11 16 BIT WORDS .GLOBL ACNVRT ACNVRT: TST (R5)+ MOV (R5)+,R4 ;INPUT POINTER MOV (R5)+,R3 ;OUTPUT ARRAY CLR N ; START6: CLR TEMP ; MOV (R4)+,T ; MOVB T,TEMP ;TEMP=CHAR 1 SWAB T ; BIC #177760,T ; ASL T ; ASL T ; ASL T ; ASL T ; MOV (R4)+,A ; MOVB A,B ; SWAB A ; BIC #177760,A ; BIS A,T ; CLR A ; MOVB B,A ; SWAB TEMP ; BIS TEMP,A ; BIC #100200,A ; SWAB A MOV A,(R3)+ ; SWAB T ; MOV (R4)+,TEMP ; MOV TEMP,X ; BIC #177400,TEMP ; BIS TEMP,T ; BIC #100200,T ; SWAB T ; MOV T,(R3)+ ; MOV (R4)+,T ; SWAB X ; SWAB T ; BIC #177400,X ; ASL X ASL X ; ASL X ; ASL X ; BIS X,T ; BIC #100200,T ;CLEAR PARITY BITS SWAB T MOV T,(R3)+ ; INC N ;INC COUNTER CMP #64.,N BGT BACK RTS PC BACK: JMP START6 T: .WORD 0 A: .WORD 0 X: .WORD 0 N: .WORD 0 TEMP: .WORD 0 B: .BYTE 0 .END