; DECUS NO.: 11-335 ; REVISED: 10 MARCH 1979 ; TITLE: REVERSE ASSEMBLER FOR RT-11 (RASM) ; VERSION V02.01 ; AUTHORS: S. C. CHOU AND K. F. YEE ; DEPARTMENT OF PHYSICS ; UNIVERSITY OF MALAYA ; KUALA LUMPUR 22-11 ; MALAYSIA ; NOTE: USE WITH RT-11 VERSION 3 MONITORS. ;R0 FOR FILLING OUTPUT BUFFER ;R1 POINTER TO NAME OF INSTRUCTION ;R2 ADDRESS OF INSTRUCTION ;R3 POINTER TO OUTPUT BUFFER ;R4 FOR PRINTING 6 DIGIT NO. ;R5 SCRATCH ;SP STACK POINTER ;PC PROGRAM COUNTER JSW =44 ;JOB STATUS WORD ERRBYT=52 ;ERROR BYTE USERRB=53 ;USER ERROR BYTE RMON =54 ;POINTER TO RESIDENT MONITOR USRLOC=266 ;USR IS 266 BYTES INTO RMON .TITLE RASM.MAC .MCALL .SETTOP,.SRESET,.RCTRLO,.CSIGEN,.CSISPC,.WAIT .MCALL .FETCH,.LOOKUP,.CLOSE,.READW,.WRITE,.PRINT .CSECT .ENABL LC INBUFF: .BLKW 256. ;D256 WORDS FOR INPUT BUFFER ENDBUF=.-2 ;END OF INPUT BUFFER OUTSPC=INBUFF REENTR: BR RESET START: MOV @#RMON,R0 ;DO A .SETTOP MOV USRLOC(R0),R0 ;TO ADDRESS JUST TST -(R0) ;BELOW USR TO ENSURE .SETTOP ;NO USR SWAPPING TST (R0)+ MOV R0,HICORE ;HIGHEST ADDRESS OF PROGRAM IN HICORE BIS #20000,@#JSW ;SETTING REENTER BIT IN JSW RESET: MOV @#42,SP ;INITIALIZE STACK .SRESET ;RELEASE DEVICE HANDLERS .RCTRLO ;MAKE SURE OUTPUT IS ENABLED ;CALL CSI TO TAKE COMMAND FROM TERMINAL .CSISPC #OUTSPC,#DEFEXT,#0,#LINBUF BCC CMLN JMP ILCMD ;SAVE PORTION OF STRING ON RIGHT HAND SIDE OF = CMLN: CLR R3 MOV #LINBUF,R1 CNULL: CMPB (R1),#0 ;CHECK FOR END OF STRING BEQ CLIN CMPB (R1)+,#'= ;CHECK FOR = SIGN BNE CNULL BR CSCS CLIN: MOV #LINBUF,R1 ;STRING HAS NO = SIGN CSCS: MOV #SAVCSI,R2 CMCS: TSTB (R1) BEQ CMCF MOVB (R1)+,(R2)+ ;SAVE STRING INC R3 ;COUNT NO. OF CHARS BR CMCS CMCF: MOVB #'%,(R2)+ MOVB #'@,(R2) .CSIGEN #DEVSPC,#DEFEXT,#LINBUF MOV R0,R2 ;FIRST LOCATION ABOVE DEV. HANDLERS ;IN R2 .WAIT #1 ;CHANNEL 1 SHOULD BE CLOSED BCC ILCM ;IF NOT, ILL CMD .WAIT #2 ;SAME BCC ILCM .WAIT #4 ;SAME BCC ILCM .WAIT #3 ;CHANNEL 3 FOR INPUT FILE BCC WAA TST R3 BEQ WA1 JMP INFNF WA1: JMP RASMV WAA: .WAIT #0 ;CHANNEL 0 FOR OUTPUT BCC CORTST ;TEST FOR AVAILABILITY OF CORE .FETCH R2,#DEVNAM ;FETCH LP BCS NOLP ;NO LP MOV R0,R2 ;ASSIGN CHANNEL 0 TO LP .LOOKUP #AREA1,#0,#DEVNAM,#0 BCS NOLP CORTST: MOV #HICORE,R5 ;TEST FOR AVAILABILITY OF CORE CMP (R5),R2 BLOS NOCORE ;NO CORE ;INITIALIZATION MOV #STBLK,R3 MOV #12,R5 A1: CLR (R3)+ DEC R5 BNE A1 MOV #177000,COUNT ;-1000 IN COUNT MOV #-1,ENDBLK MOV #OTBUF1,SAVER3 ;TEST FOR SWITCH ARGUMENTS ;SWITCHES ;/O:N OUTPUT ONLY BLOCK NUMBER N ;/S:N START OUTPUT WITH NUMBER N ;/E:N END OUTPUT AT BLOCK NUMBER N ;/B OUTPUT OCTAL BYTES ;/X OUTPUT RAD50 CHARACTERS ;/N SUPPRESS ASCII OUTPUT ;/G IGNORE INPUT ERRORS MOV (SP)+,R5 ;NO. OF SWS IN R5 SW1: DEC R5 BMI SW5 ;NO MORE SWS MOV #STBLK,R3 MOV #TOBIG1,R2 ;ADDRESS AFTER SW ARGUMENTS IN R2 CMPB (SP),#117 ;TEST FOR SW O BNE SW2 MOV 2(SP),(R3) ;STARTING BLK. IN STBLK MOVB #105,(SP) ;REPLACE O BY E SW2: CMPB -(R2),(SP) ;TEST FOR OTHER SWS BEQ SW3 TST (R3)+ TSTB -(R2) BNE SW2 SWITCH: .PRINT #SWTCH1 ;ERROR - PRINT ?SWITCH BISB #10,@#USERRB JMP RESET SW3: TST (SP)+ ;IF SWS ARE N, G, X OR B BMI SW4 MOVB -(R2),R0 BMI SWITCH ;BAD SW MOV R0,(R3) BR SW1 SW4: TSTB -(R2) ;IF SW ARE S OR E BPL SWITCH MOV (SP)+,(R3) BMI SWITCH BR SW1 ;TEST FOR NEXT SW SW5: MOV STBLK,SAVSTB TST ENDBLK BMI SW6 CMP ENDBLK,STBLK BMI SWITCH SW6: JMP NXTBLK ILCM: BR ILCMD ;TEST FOR INPUT ERRORS IERROR: TSTB @#ERRBYT BNE IN1 JMP RD IN1: TST INPERR BNE IN2 ;IGNORE INPUT ERRORS INERR: .PRINT #INERR1 ;PRINT ?IN ERR BISB #10,@#USERRB JMP RESET IN2: RTS PC NOLP: .PRINT #NOLP1 ;?LP NOT FND BISB #10,@#USERRB JMP RESET NOCORE: .PRINT #NCORE1 ;?NO CORE BISB #10,@#USERRB JMP RESET ILCMD: .PRINT #ILCMD1 ;?ILL CMD BISB #10,@#USERRB JMP RESET RASMV: .PRINT #RASMV1 ;PRINT RASM VERSION NO. BISB #1,@#USERRB JMP RESET INFNF: .PRINT #INFNF1 ;?NO INPUT FILE BISB #10,@#USERRB JMP RESET ENDFL: .PRINT #ENDFL1 ;?END OF FILE BISB #10,@#USERRB JMP RESET TOBIG: .WAIT #0 .PRINT #TOBIG1 ;?FILE TOO BIG BISB #10,@#USERRB JMP RESET HICORE: .WORD 0 SAVSTB: .WORD 0 STBLK: .WORD 0 ENDBLK: .WORD 0 BYT: .WORD 0 R50: .WORD 0 SUPASC: .WORD 0 INPERR: .WORD 0 OUTCNT: .WORD 0 SAVER3: .WORD 0 BLOCK: .WORD 0 OPERAN: .WORD 0 READ: MOV STBLK,R3 MOV ENDBLK,R2 BMI B1 ;NO END BLK. SUB R3,R2 ;IF ENDBLK>STBLK BR BGE B1 RD: MOV SAVER3,R3 MOV COUNT,R5 CMP R5,#177000 BEQ RD2 RD1: CLRB (R3)+ INC R5 BNE RD1 JSR PC,W1 RD2: .WAIT #0 BCC RD3 JMP OUTERR RD3: .CLOSE #0 .CLOSE #3 CMP STBLK,SAVSTB BNE RD4 JMP ENDFL RD4: JMP RESET ;READ 1 BLK. INTO INPUT BUFFER B1: .READW #AREA,#3,#INBUFF,#256.,R3 RTS PC NXTBLK: JSR PC,READ BCC REVASM JSR PC,IERROR REVASM: CMP STBLK,#177 BLOS REV1 JMP TOBIG REV1: CMP STBLK,SAVSTB BNE REV2 MOV #SAVCSI,R1 JSR PC,PRTNAM REV2: JSR PC,PRBLK ;PRINT BLOCK NUMBER MOV #INBUFF,R2 RESUME: CMP #ENDBUF,R2 BGE PRTADR INC STBLK JMP NXTBLK PRTADR: MOV R2,R4 SUB #INBUFF,R4 JSR PC,ADRESS MOV #' ,R0 JSR PC,WRITE MOV (R2)+,R4 JSR PC,PRINT ;PRINT CODE JSR PC,BYTES JSR PC,ASCII JSR PC,RAD50 JSR PC,TAB ;A TAB MOV R4,#0 SAVE1=.-2 ;SAVE CODE C1: JSR R5,CINSTR ;1ST GROUP FULL WORDS .WORD 0 ;MASK .WORD LIST1 ;ADDRESS OF CODE .WORD 16. ;LENGTH TABLE .WORD TABL1-LIST1-2 ;RELATIVE DIFF BR C5 JMP RESUME C5: JSR R5,CINSTR ;5TH GROUP RTS .WORD 7 .WORD LIST5 .WORD 1 .WORD TABL5-LIST5-2 BR C2 MOV SAVE1,R0 JSR PC,REGLFT+4 JSR PC,CRLF JMP RESUME C2: JSR R5,CINSTR ;2ND GROUP SINGLE OP .WORD 77 .WORD LIST2 .WORD 26. .WORD TABL2-LIST2-2 BR C3 CLR MODE1 JSR PC,MODE ;CHECK 1 MODE JMP RESUME C3: JSR R5,CINSTR ;3RD GROUP BRANCHES .WORD 377 .WORD LIST3 .WORD 15. .WORD TABL3-LIST3-2 BR C3A MOV SAVE1,R1 BIC #177400,R1 ;STRIP BRANCH MOVB R1,R4 ;SIGN EXTENSION MOVB ASL R4 ;MULT BY 2 ADD R2,R4 ;CALCULATE ADDRESS SUB #INBUFF,R4 JSR PC,ADRESS JSR PC,CRLF JMP RESUME C3A: JSR R5,CINSTR ;GROUP 3.5,TRAPS .WORD 377 .WORD LIST3A .WORD 2 .WORD TABL3A-LIST3A-2 BR C4 MOVB SAVE1,R1 ;8 FREE BITS JSR PC,PRBYTE ;ARGUMENT JSR PC,CRLF JMP RESUME C4: JSR R5,CINSTR ;4TH GROUP JSR .WORD 777 .WORD LIST4 .WORD 1 .WORD TABL4-LIST4-2 BR C6 MOV SAVE1,R0 ROR R0 ;ROTATE ROR R0 ;INTO ROR R0 ;POSITION ROR R0 ROR R0 ROR R0 JSR PC,REGLFT+4 ;CALLING REGISTER MOV #',,R0 JSR PC,WRITE CLR MODE1 JSR PC,MODE JMP RESUME C6: JSR R5,CINSTR ;6TH GROUP DOUBLE OP .WORD 7777 .WORD LIST6 .WORD 12. .WORD TABL6-LIST6-2 BR C7 MOV #1,MODE1 MOV #1,OPERAN JSR PC,MODE JMP RESUME C7: MOV #NAME71,R1 ;".WORD " ALL OTHERS JSR PC,PRTNAM MOV SAVE1,R4 JSR PC,PRINT JSR PC,CRLF JMP RESUME ;ROUTINE TO PRINT NAME OF INSTRUCTION PRTNAM: MOVB (R1)+,R0 ;GET CHARACTER CMP #100,R0 ;IS IT A @ BNE PTNAM1 RTS PC PTNAM1: CMPB #045,R0 ;IS IT A % BEQ CRLF1 ;OUTPUT A CR,LF JSR PC,WRITE BR PRTNAM ;NEXT CHAR ;ROUTINE FOR CARRIAGE RETURN AND LINE FEED CRLF1: JSR PC,CRLF BR PRTNAM CRLF: MOVB #15,R0 ;CR JSR PC,WRITE MOVB #12,R0 ;LF JSR PC,WRITE RTS PC TAB: MOV #7,R1 ASPACE: MOV #' ,R0 JSR PC,WRITE DEC R1 BNE ASPACE ;ANOTHER ONE RTS PC ;ROUTINE TO PRINT ADDRESS OF INSTRUCTIONS ADRESS: MOV STBLK,R1 BIC #177600,R1 SWAB R1 ASL R1 ADD R1,R4 JSR PC,PRINT RTS PC ;ROUTINE TO PRINT LOW ORDER BYTE OF R4 ADR2: BIC #177400,R4 CLR R5 ROL R4 ;ROTATE INTO POSITION ROL R4 ROL R4 ROL R4 ROL R4 ROL R4 ROL R4 ROL R4 ROL R5 ;SAVE CARRY BIT JSR PC,NXTDIG JSR PC,NXTDIG JSR PC,NXTDIG RTS PC ;PRINT CODE PRINT: CLR R5 ;OCTAL IN R4 ROL R4 ;BIT 15 IN R4 ROL R4 ;TO BIT 0 ROL R5 ;SAVE C BIT MOVB R4,R0 BICB #376,R0 ;BIT 15 ONLY ADD #'0,R0 ;TO ASCII JSR PC,WRITE JSR PC,NXTDIG JSR PC,NXTDIG JSR PC,NXTDIG JSR PC,NXTDIG JSR PC,NXTDIG RTS PC NXTDIG: ROR R5 ;RESTORE CARRY BIT ROL R4 ROL R4 ROL R4 ROL R5 ;SAVE C BIT MOVB R4,R0 BICB #370,R0 ;MASK JUNK ADD #'0,R0 ;TO ASCII JSR PC,WRITE RTS PC PRBYTE: CLR R5 ;BYTE IN R1 ROL R5 ;SAVE CARRY BIT JSR PC,NXTBYT JSR PC,NXTBYT JSR PC,NXTBYT RTS PC NXTBYT: ROR R5 ;RESTORE CARRY BIT ROLB R1 ROLB R1 ROLB R1 ROL R5 ;SAVE CARRY BIT MOVB R1,R0 BICB #370,R0 ;MASK JUNK ADD #'0,R0 ;TO ASCII JSR PC,WRITE RTS PC ;ROUTINE TO PRINT WORD BY BYTES BYTES: TST BYT BEQ RYT MOV R4,-(SP) MOV #' ,R0 ;A SPACE JSR PC,WRITE JSR PC,ADR2 ;WRITE LOW ORDER BYTE MOV #' ,R0 ;A SPACE JSR PC,WRITE MOV (SP),R4 SWAB R4 JSR PC,ADR2 ;WRITE HIGH ORDER BYTE MOV (SP)+,R4 RYT: RTS PC ;ROUTINE TO PRINT RAD50 CONVERSION RAD50: TST R50 BEQ RAT MOV R4,-(SP) MOV R4,-(SP) MOV #' ,R0 ;A SPACE JSR PC,WRITE MOV #'/,R0 ;PRINT "/" JSR PC,WRITE MOV #RADA,R4 ;R4 POINTS TO POWERS OF 50 RAC: CLR R0 RACOM: CMP (SP),(R4) BCS RAB SUB (R4),(SP) INC R0 BR RACOM RAB: TSTB R0 BEQ RA1 CMPB R0,#000033 BEQ RA3 BGT RA2 ADD #000040,R0 RA1: ADD #000016,R0 RA2: ADD #000011,R0 RA3: ADD #000011,R0 JSR PC,WRITE TST -(R4) BNE RAC MOV #'/,R0 ;PRINT "/" JSR PC,WRITE TST (SP)+ MOV (SP)+,R4 RAT: RTS PC .WORD 000000 .WORD 000001 .WORD 000050 RADA: .WORD 003100 ;SUBROUTINE TO PRINT ASCII CONVERSION ASCII: TST SUPASC BNE AS ;SUPPRESS ASCII MOV R4,-(SP) ;SAVE CONTENTS OF R4 MOV #' ,R0 ;A SPACE JSR PC,WRITE MOV #'*,R0 ;PRINT "*" JSR PC,WRITE BICB #200,R4 ;MASK 8TH BIT JSR PC,ASCBYT ;PRINT 1ST BYTE SWAB R4 BICB #200,R4 JSR PC,ASCBYT ;PRINT 2ND BYTE MOV #'*,R0 ;PRINT "*" JSR PC,WRITE MOV (SP)+,R4 ;POP R4 AS: RTS PC ASCBYT: CMPB R4,#40 ;IF BYTE < 40,PRINT "." BGE AS2 AS1: MOV #'.,R0 JSR PC,WRITE BR AS4 AS2: CMPB R4,#177 ;IF BYTE = 177,PRINT "." BEQ AS1 AS3: MOVB R4,R0 ;OTHERS, PRINT ASCII JSR PC,WRITE ;CONVERSION AS4: RTS PC .WORD OTBUF2 OTBUF1: .BLKW 256. .WORD OTBUF1 OTBUF2: .BLKW 256. OUTERR: .PRINT #OUTER1 ;PRINT ?OUT ERR BISB #10,@#USERRB JMP RESET ;SUBROUTINE FOR FILLING OUTPUT ;BUFFER AND WRITING ON OUTPUT DEVICE WRITE: MOV SAVER3,R3 MOVB R0,(R3)+ INC #0 COUNT=.-2 BNE W2 W1: SUB #1000,R3 .WAIT #0 BCS OUTERR ;WRITE ON TO OUTPUT DEVICE .WRITE #AREAW,#0,R3,#256.,OUTCNT BCS OUTERR INC OUTCNT MOV #177000,COUNT MOV -(R3),R3 W2: MOV R3,SAVER3 RTS PC ;SUBROUTINE TO FIND INSTRUCTIONS ;FORMAT ;JSR R5,CINSTR ;.WORD MASK ;.WORD LIST CODES ;.WORD LIST LENGTH ;.WORD LIST NAME-LIST CODES-2 ;POSSIBLE INSTRUCTION IN R4 CINSTR: BIC (R5)+,R4 ;MASK 1ST ARG MOV (R5)+,%3 ;TABLE LOC MOV (R5)+,R0 ;TABLE LENGTH MOV (R5)+,INDX ;RELATIVE DIFF CHINST: CMP R4,(%3)+ ;CHECK TABLE BNE NOTONE MOV 0(%3),R1 ;INDEX ON R3 INDX=.-2 JSR PC,PRTNAM ;PRINT NAME TST (R5)+ ;BUMP RETURN RTS R5 ;RETURN WITH INSTRUCTION NOTONE: DEC R0 ;END LIST? BNE CHINST RTS R5 ;RETURN, NONE FOUND SAVEMD: .WORD 0 MODE1: .WORD 0 ;COUNTER MODE: CLR SFLAG1 CLR SFLAG2 MODEX: MOV SAVE1,R4 ;RESTORE WORD TST MODE1 ;CHECK FOR # BEQ MODECK ;ONLY ONE ROR R4 ;ROTATE 6 RIGHT ROR R4 ROR R4 ROR R4 ROR R4 ROR R4 MODECK: DEC MODE1 ;RESET FOR NEXT TIME MOV R4,SAVEMD ;SAVE ROTATED R4 BIC #177700,R4 ;MASK JUNK CMP #27,R4 ;IMMEDIATE BEQ EQ27 CMP #37,R4 ;ABSOLUTE BEQ EQ37 CMP #67,R4 ;RELATIVE BEQ EQ67 CMP #77,R4 ;REL DEFFERRED BEQ EQ77 BIC #7,R4 ;MODE ONLY CMP #0,R4 ;REGISTER BEQ EQ0 CMP #10,R4 ;DEFERRED BEQ EQ1 CMP #20,R4 ;AUTO-INC BEQ EQ2 CMP #30,R4 ;AUTO-INC DEF BEQ EQ3 CMP #40,R4 ;AUTO-DEC BEQ EQ4 CMP #50,R4 ;AUTO-DEC DEF BEQ EQ5 CMP #60,R4 ;INDEXED BEQ EQ6 BR EQ7 ;ONLY ONE LEFT EQ27: JMP EQ27A EQ37: JMP EQ37A EQ67: JMP EQ67A EQ77: JMP EQ77A EQ0: JMP EQ0A EQ1: JMP EQ1A EQ2: JMP EQ2A EQ3: JMP EQ3A EQ4: JMP EQ4A EQ5: JMP EQ5A EQ6: JMP EQ6A EQ7: JMP EQ7A EQ0A: JSR PC,REGLFT ;REGISTER MODE JMP HOUSKP EQ1A: JSR PC,REGPAR ;DEFERRED MODE JMP HOUSKP EQ2A: JSR PC,REGPAR ;AUTO-INC MOV #'+,R0 JSR PC,WRITE JMP HOUSKP EQ3A: MOV #'@,R0 ;AUTO-INC DEF JSR PC,WRITE JSR PC,REGPAR MOV #'+,R0 JSR PC,WRITE JMP HOUSKP EQ4A: MOV #'-,R0 ;AUTO-DEC JSR PC,WRITE JSR PC,REGPAR JMP HOUSKP EQ5A: MOV #'@,R0 ;AUTO-DEC DEF JSR PC,WRITE MOV #'-,R0 JSR PC,WRITE JSR PC,REGPAR JMP HOUSKP EQ6A: JSR PC,GDATA ;AN INDEX WORD JSR PC,PRINT ;INDEX JSR PC,REGPAR ;REGISTER JMP HOUSKP EQ7A: MOV #'@,R0 ;INDEX DEF JSR PC,WRITE BR EQ6A ;REST AS IN EQ6A EQ27A: MOV #'#,R0 ;IMMEDIATE JSR PC,WRITE JSR PC,GDATA ;WORD JSR PC,PRINT JMP HOUSKP EQ37A: MOV #'@,R0 ;ABSOLUTE ADDRESS JSR PC,WRITE BR EQ27A EQ67A: JSR PC,GDATA ;RELATIVE ADDRESS ADD R2,R4 ;ACTUAL ADDRESS SUB #INBUFF,R4 JSR PC,ADRESS JMP HOUSKP EQ77A: MOV #'@,R0 ;RELATIVE DEF JSR PC,WRITE BR EQ67A ;REST AS IN EQ67A SFLAG1: .WORD 0 SAV1ST: .WORD 0 SFLAG2: .WORD 0 SAV2ND: .WORD 0 REGLFT: MOV SAVEMD,R0 ;PRINT REGISTER BIC #177770,R0 CMP R0,#6 BEQ REGLF1 CMP R0,#7 BEQ REGLF2 MOV R0,-(SP) MOV #'R,R0 JSR PC,WRITE MOV (SP)+,R0 ADD #'0,R0 JSR PC,WRITE RTS PC REGLF1: MOV #'S,R0 JSR PC,WRITE MOV #'P,R0 JSR PC,WRITE RTS PC REGLF2: MOV #'P,R0 JSR PC,WRITE MOV #'C,R0 JSR PC,WRITE RTS PC REGPAR: MOV #'(,R0 JSR PC,WRITE JSR PC,REGLFT ;WHICH REG? MOV #'),R0 JSR PC,WRITE RTS PC HOUSKP: TST MODE1 ;HOUSEKEEPING BMI NOMOR ;IS THERE MOV #',,R0 ;ANOTHER MODE? JSR PC,WRITE JMP MODEX NOMOR: TST BLOCK BEQ NO1 CMP #2,BLOCK BEQ NO1 JSR PC,CRLF JSR PC,PRBLK BR NO1A NO1: JSR PC,CRLF NO1A: CMP #1,SFLAG1 ;1ST DATA? BNE NO2 JSR PC,TAB MOV SAV1ST,R4 JSR PC,PRINT JSR PC,BYTES JSR PC,ASCII JSR PC,RAD50 JSR PC,CRLF CMP #2,BLOCK BNE NO2 JSR PC,PRBLK NO2: CMP #1,SFLAG2 ;2ND DATA? BNE HOUSRT CMP #2,BLOCK BNE NO3 CMP #1,SFLAG1 BEQ NO3 JSR PC,PRBLK NO3: MOV SAV2ND,R4 JSR PC,TAB JSR PC,PRINT JSR PC,BYTES JSR PC,ASCII JSR PC,RAD50 JSR PC,CRLF HOUSRT: CLR BLOCK CLR OPERAN RTS PC PRBLK: MOV #BLKNUM,R1 ;PRINT BLOCK NUMBER JSR PC,PRTNAM MOV STBLK,R4 JSR PC,ADR2 JSR PC,CRLF RTS PC GDATA: CMP #ENDBUF,R2 BGE GD4 INC STBLK TST OPERAN ;SINGLE OPERAND BNE GD MOV #1,BLOCK BR GD2 GD: TST MODE1 ;DOUBLE OPERAND BMI GD1 MOV #1,BLOCK BR GD2 GD1: MOV #2,BLOCK GD2: JSR PC,READ ;READ IN A BLOCK BCC GD3 JSR PC,IERROR GD3: CMP STBLK,#177 BLOS GD3A JMP TOBIG GD3A: MOV #INBUFF,R2 GD4: MOV (R2)+,R4 ;GET A WORD TST MODE1 ;1 OR 2 WORDS BMI NSAVE MOV R4,SAV1ST ;1ST DATA WORD INC SFLAG1 RTS PC ;1ST RETURN NSAVE: MOV R4,SAV2ND ;2ND DATA INC SFLAG2 RTS PC ;2ND RETURN ;2ND TIME MODE1=0 DOUBLE OP ; =-1 SINGLE OP ;3RD TIME MODE1=-1 DOUBLE OP MUST RETURN LIST1: .WORD 0 ;HALT .WORD 1 ;WAIT .WORD 2 ;RTI .WORD 3 ;BREAK TRAP .WORD 4 ;IOT TRAP .WORD 5 ;RESET .WORD 241 ;CLC .WORD 261 ;SEC .WORD 242 ;CLV .WORD 262 ;SEV .WORD 244 ;CLZ .WORD 264 ;SEZ .WORD 250 ;CLN .WORD 270 ;SEN .WORD 257 ;CCC .WORD 277 ;SCC LIST2: .WORD 5000 ;CLR .WORD 105000 ;CLRB .WORD 5100 ;COM .WORD 105100 ;COMB .WORD 5200 ;INC .WORD 105200 ;INCB .WORD 5300 ;DEC .WORD 105300 ;DECB .WORD 5400 ;NEG .WORD 105400 ;NEGB .WORD 5500 ;ADC .WORD 105500 ;ADCB .WORD 5600 ;SBC .WORD 105600 ;SBCB .WORD 5700 ;TST .WORD 105700 ;TSTB .WORD 6000 ;ROR .WORD 106000 ;RORB .WORD 6100 ;ROL .WORD 106100 ;ROLB .WORD 6200 ;ASR .WORD 106200 ;ASRB .WORD 6300 ;ASL .WORD 106300 ;ASLB .WORD 100 ;JMP .WORD 300 ;SWAB LIST3: .WORD 400 ;BR .WORD 1000 ;BNE .WORD 1400 ;BEQ .WORD 2000 ;BGE .WORD 2400 ;BLT .WORD 3000 ;BGT .WORD 3400 ;BE .WORD 100000 ;BPL .WORD 100400 ;BMI .WORD 101000 ;BHI .WORD 101400 ;BLOS .WORD 102000 ;BVC .WORD 102400 ;BVS .WORD 103000 ;BCC .WORD 103400 ;BCS LIST3A: .WORD 104000 ;EMT TRAP .WORD 104400 ;TRAP LIST4: .WORD 4000 ;JSR LIST5: .WORD 200 ;RTS LIST6: .WORD 10000 ;MOV .WORD 110000 ;MOVB .WORD 020000 ;CMP .WORD 120000 ;CMPB .WORD 030000 ;BIT .WORD 130000 ;BITB .WORD 040000 ;BIC .WORD 140000 ;BICB .WORD 050000 ;BIS .WORD 150000 ;BISB .WORD 060000 ;ADD .WORD 160000 ;SUB TABL1: .WORD NAM01,NAM02,NAM03 .WORD NAM04,NAM05,NAM06 .WORD NAM07,NAM08,NAM09 .WORD NAM10,NAM11,NAM12 .WORD NAM13,NAM14 .WORD NAM16,NAM17 TABL2: .WORD NAM18,NAM19,NAM20 .WORD NAM21,NAM22,NAM23 .WORD NAM24,NAM25,NAM26 .WORD NAM27,NAM28,NAM27A .WORD NAM28A,NAM29 .WORD NAM30,NAM31,NAM32 .WORD NAM33,NAM34,NAM35 .WORD NAM36,NAM37,NAM38 .WORD NAM39,NAM40,NAM41 TABL3: .WORD NAM42,NAM43,NAM44 .WORD NAM45,NAM46,NAM47 .WORD NAM48,NAM49,NAM50 .WORD NAM51,NAM52,NAM53 .WORD NAM54,NAM55,NAM56 TABL3A: .WORD NAM72,NAM73 TABL4: .WORD NAM57 TABL5: .WORD NAM58 TABL6: .WORD NAM59,NAM60,NAM61 .WORD NAM62,NAM63,NAM64 .WORD NAM65,NAM66,NAM67 .WORD NAM68,NAM69,NAM70 NAM01: .ASCII "HALT%@" NAM02: .ASCII "WAIT%@" NAM03: .ASCII "RTI%@" NAM04: .ASCII "BPT%@" NAM05: .ASCII "IOT%@" NAM06: .ASCII "RESET%@" NAM07: .ASCII "CLC%@" NAM08: .ASCII "SEC%@" NAM09: .ASCII "CLV%@" NAM10: .ASCII "SEV%@" NAM11: .ASCII "CLZ%@" NAM12: .ASCII "SEZ%@" NAM13: .ASCII "CLN%@" NAM14: .ASCII "SEN%@" NAM16: .ASCII "CCC%@" NAM17: .ASCII "SCC%@" NAM18: .ASCII "CLR @" NAM19: .ASCII "CLRB @" NAM20: .ASCII "COM @" NAM21: .ASCII "COMB @" NAM22: .ASCII "INC @" NAM23: .ASCII "INCB @" NAM24: .ASCII "DEC @" NAM25: .ASCII "DECB @" NAM26: .ASCII "NEG @" NAM27: .ASCII "NEGB @" NAM28: .ASCII "ADC @" NAM27A: .ASCII "ADCB @" NAM28A: .ASCII "SBC @" NAM29: .ASCII "SBCB @" NAM30: .ASCII "TST @" NAM31: .ASCII "TSTB @" NAM32: .ASCII "ROR @" NAM33: .ASCII "RORB @" NAM34: .ASCII "ROL @" NAM35: .ASCII "ROLB @" NAM36: .ASCII "ASR @" NAM37: .ASCII "ASRB @" NAM38: .ASCII "ASL @" NAM39: .ASCII "ASLB @" NAM40: .ASCII "JMP @" NAM41: .ASCII "SWAB @" NAM42: .ASCII "BR @" NAM43: .ASCII "BNE @" NAM44: .ASCII "BEQ @" NAM45: .ASCII "BGE @" NAM46: .ASCII "BLT @" NAM47: .ASCII "BGT @" NAM48: .ASCII "BLE @" NAM49: .ASCII "BPL @" NAM50: .ASCII "BMI @" NAM51: .ASCII "BHI @" NAM52: .ASCII "BLOS @" NAM53: .ASCII "BVC @" NAM54: .ASCII "BVS @" NAM55: .ASCII "BCC @" NAM56: .ASCII "BCS @" NAM57: .ASCII "JSR @" NAM58: .ASCII "RTS @" NAM59: .ASCII "MOV @" NAM60: .ASCII "MOVB @" NAM61: .ASCII "CMP @" NAM62: .ASCII "CMPB @" NAM63: .ASCII "BIT @" NAM64: .ASCII "BITB @" NAM65: .ASCII "BIC @" NAM66: .ASCII "BICB @" NAM67: .ASCII "BIS @" NAM68: .ASCII "BISB @" NAM69: .ASCII "ADD @" NAM70: .ASCII "SUB @" NAME71: .ASCII ".WORD @" NAM72: .ASCII "EMT @" NAM73: .ASCII "TRAP @" .EVEN .WORD 0 .BYTE 1 .ASCII "G" .BYTE 1 .ASCII "N" .BYTE 1 .ASCII "X" .BYTE 1 .ASCII "B" .BYTE 377 .ASCII "E" .BYTE 377 .ASCII "S" TOBIG1: .ASCIZ "?RASM-F-Input block number exceeds 177 octal" RASMV1: .ASCIZ "RASM V02.01" INERR1: .ASCIZ "?RASM-F-Read error" OUTER1: .ASCIZ "?RASM-F-Write error" NOLP1: .ASCIZ "?RASM-F-No lp" SWTCH1: .ASCIZ "?RASM-F-Illegal option" NCORE1: .ASCIZ "?RASM-F-Insufficient memory" ILCMD1: .ASCIZ "?RASM-F-Illegal command" INFNF1: .ASCIZ "?RASM-F-Input file not found" ENDFL1: .ASCIZ "?RASM-F-End of file detected" BLKNUM: .ASCII "BLOCK NUMBER @" .EVEN DEVNAM: .RAD50 "LP " DEFEXT: .RAD50 "SAV" .RAD50 "REV" .WORD 0,0 SAVCSI: .BLKW 30. ;AREA TO SAVE STRING AREA: .WORD 0,0,0,0,0 AREA1: .WORD 0,0,0,0,0 AREAW: .WORD 0,0,0,0,0 DEVSPC=. LINBUF=DEVSPC .END START