TITL 'BASIC LINE EDITOR' IDT 'EDIT' * * CREATED: 12 MARCH 1981 * DEF EDIT,EDIT1,LSTL,LDP5,LDPY DEF SAVY,LDSTRT DEF LCN1,LCN2,LCN3,LCN4 DEF LNXT,LDEF DEF RNGOTO,RNGSUB,RNTRAP,RNRSTR DEF RNON,RNINP,RNERR,RNREM,RNELSE,RNIF * REF PROGM,RENUMS,EDTMP,UNIT,AUDIO,AUDIO2 REF RENCMP,NINE REF B20,B01,STRTC,RUNP1 REF BUS,EORBUS,DDM,DLC,EBP REF CKEX,CVDB20 REF CVDIFZ,CVDIZ,EDER REF FNS,GSC,GSS,LNUM REF FOR2,JMPR0 REF FPAC,SLT,SLN REF GETC,LINE2 REF PLC,MODE,NVD,NVS,PLF,EFLG REF PUTB,RUNP,SIZE REF SSP,UFT,VDT,VNT REF TYPB,TYPE,TYPC,DCNT,GOS2,CRLF,HOUT REF ASR0,CLEARS JG 02/3/82 DXOP EVFIX,11 DXOP OUTFP,12 DXOP OUTINT,13 * ERROR EQU >2F80 ERROR2 EQU ERROR+>20 PAGE * * CONTINUE COMMAND * CONT SETO @MODE(9) SET TO RUN BL @TYPC OUT CRLF MOV @SLN(9),R1 GET LINE # B @GOS2 PAGE * * LOAD * * = 0 OR BLANK THEN 733 DIGITAL CASSETTES * = 1 BUBBLE MEMORY TERMINAL * = 2 EIA AUDIO CASSETTES * ELSE EPROM ADDRESS * * PROGRAM LOAD FLAG (PLF) = -1 WHEN LOAD COMPLETE * ELSE REFLECTS DEVICE BEING USED * LDPY CLR @PLF(9) LOADING IN OPERATION BL @CKEX CHECK FOR EXPRESSION JMP LDP5 NONE EVFIX R2 GET DEVICE TYPE/ADDRESS CI R2,2 EPROM? JLE LDP01 N - * * PROGRAM STORED IN EPROM * LDSTRT INCT R2 ;MOVE OVER RUN ID MOV *R2+,@SLT(9) ;GET SLT DISPLACEMENT MOV *R2+,@VNT(9) ;GET VNT DISPLACEMENT MOV @EORBUS(9),R1 ;GET OLD BUS MOV R1,@VDT(9) MOV R1,@NVD(9) A *R2+,@NVD(9) ;ADD VARIABLE SPACE MOV R2,@BUS(9) ;GET NEW BUS A R2,@SLT(9) ;GET ABS ADDR OF SLT A R2,@VNT(9) ;GET ABS ADDR OF VNT AI R2,-8 ;POINT TO RUN/NORUN FLAG SETO @PLF(R9) LOAD FINISHED C @STRTC,*R2 ;AUTO RUN REQUESTED? JNE LDP0 ;NO - MANUAL START B @RUNP1 YES - FORCE RUN LDP0 B @CRLF * * PROGRAM STORED ON AUDIO CASSETTE * LDP0A MOV @UNIT(R9),@AUDIO SAVE UNIT FLAG MOV @D2,@UNIT(R9) PORT A=OFF, PORT B=ON * * AUDIO2 IS USED BY EDER ROUTINE (GETLINE) TO * INDICATE THAT AN ERROR HAS OCCURRED WHILE READING * THE TAPE. PRINTING IS INHIBITED FOR AUDIO * CASSETTE ERRORS. * SETO @AUDIO2 'CLEAR' ERROR INDICATOR JMP LDP1 * * PROGRAM STORED ON TAPE * LDP01 A R2,@PLF(R9) SET DEVICE TYPE DEC R2 JLT LDP5 733 JGT LDP0A AUDIO LI R1,PLYBON BUBBLE - REWIND TAPE/KILL KEYBORD BL @TYPE * * 733 AND BUBBLE TERMINAL - ISSUE BLOCK FORWARD * BLKFWD MUST IMMEDIATELY PRECEDE BUBFWD * LDP5 MOV @PLF(R9),R3 GET DEVICE TYPE LI R1,@BLKFWD DEC R3 JLT LDP5A ASR 733 JNE LDP1 AUDIO CASSETTES C *R1+,*R1+ BUBBLE TERMINAL LDP5A BL @TYPE OUTPUT BLOCK FORWARD LDP1 MOV *R9,R7 GET BUFFER ADR * * HAVE TO CHECK FOR ESCAPE CHARACTER HERE * LDP2 BL @GETC GET CHARACTER JMP LDP2 NOTHING JMP LDP2A CHARACTER JMP LDP4 ESCAPE LDP2A BL @PUTB STORE IT JMP LDP3 CR JMP LDP2 CONTROL CHARACTER JMP LDP2 CHARACTER * * WHEN LINE COMPLETE SEND IT THROUGH THE EDITOR * LDP3 BL @EDIT EDIT LINE JMP LDP5 * * IF BUBBLE TERMINAL THEN REWIND CASSETTE, RE-ENABLE * THE KEYBOARD AND SWITCH OFF PLAYBACK MODE * LDP4 MOV @PLF(R9),R3 EOF/ESC - GET DEVICE TYPE DEC R3 JGT LDP4B AUDIO JNE LDP4A 733 LI R1,PLYBOF BUBBLE - REWIND/PLAYBACK OFF BL @TYPE LDP4A B @CRLF DONE * * AUDIO CASSETTE * LDP4B MOV @AUDIO,@UNIT(R9) RESTORE ORIGINAL UNIT INC @AUDIO2 ANY ERRORS DURING LOAD OPERATION? JEQ LDP4A N CLR @EFLG(R9) Y - FATAL ERROR DATA ERROR2,44 OUTPUT ERROR MSG PAGE * EDIT INPUT STRING * * R6 = SUBSCRIPT STACK PTR * R7 = INPUT BYTE PTR * R8 = OUTPUT BYTE PTR * R9 = SYSTEM PTRS * R10 = RETURN ADR * R12 = BEGINNING OF COMMAND PTR * R14 = SAVE FOR LINE COUNTER * * PROBLEM WITH THE RENUMBER COMMAND NOT BEING ABLE * TO CORRECTLY ACCESS STATEMENT NUMBERS FOR VALUES * 1 TO 9 AS THESE ARE COMPRESSED AS >64 TO >6C. * THE SECONDARY ENTRY POINT (EDIT1) HAS BEEN DEFINED * FOR THE RENUMBER COMMAND - RENCMP IS SET TO THE * REQUIRED VALUE IN THAT ROUTINE. THIS ALLOWS THE * VALUES 1 TO 9 TO BE STORED AS >6D >0001 TO >6D >0009. * THE RENUMBER ROUTINE FORCES THE EDITOR TO UNCOMPRESS * THE PROGRAM BEFORE RENUMBERING STARTS; ON COMPLETION * THE PROGRAM IS THEN COMPRESSED. * EDIT MOV @NINE,@RENCMP COMPRESSED FLAG=9 (FULL) EDIT1 MOV R11,R10 SAVE RETURN MOV R6,@EDTMP SAVE LINE COUNT FOR EDER ROUTINE CLR @EFLG(R9) DISABLE ERROR COMMAND MOV *R9,R7 ;GET I/O PTR LI R6,SSP ;GET SUBSCRIPT STACK PTR SETO *R6 ;MARK SUBSCRIPT STACK LI R8,EBP ;GET EDIT BUFFER PTR MOV @VNT(9),R5 ;SET UP RESERVED WORDS CLR *R5+ ;CLEAR DUMMY VARIABLES CLR *R5+ CLR *R5+ LI R0,>11D2 MOV R0,*R5 * * GET LINE NUMBER * BLWP @CVDIZ ;CONVERT LINE NUMBER JMP EDER3 ;OVERFLOW CLR R1 ;NO NUMBER MOV R1,@LNUM(9) ;STORE LINE NUMBER JLT EDER3 JEQ $+4 ;LINE # DEC R7 ;Y, BACKUP OVER DELIMITER MOV R0,R0 ;DONE? JNE ED3 ;N B @EMV0 ;Y, DELETE LINE * *DECODE COMMAND WORD * ED3 BL @EDGLS ;GET FIRST LETTER JMP EDSCI ;LET OR "; MOV R7,R3 ;MARK MOV R1,R0 BL @EDGL ;GET SECOND LETTER JMP EDLET A R1,R0 * *CHECK FOR TWO LETTER COMMANDS HERE * CI R0,>1920 ;IF? JEQ EDIF ;Y CI R0,>39E0 ;ON? JEQ EDON ;Y BL @EDGL ;N, GET 3RD LETTER JMP EDLET ;LET A R1,R0 PAGE *SEARCH COMMAND LIST * LI R4,EDSCL ;Y, GET COMMAND LIST PTR * ED5 MOV *R4+,R1 ;GET FIRST COMMAND SRL R1,1 ;MOVE 2ND WORD INDICATOR INTO CARRY C R0,R1 ;FOUND? JEQ ED6 ;MAYBE CI R4,EDCLE ;N, MORE COMMANDS? JL ED5 ;Y * EDLET MOV R3,R7 ;RESTORE R7 * EDLETA MOVB @LETB,*R8+ ;INSERT >6 (IMPLIED LET) JMP ED13 * ED6 MOV R0,R2 ;SAVE IN CASE NOT FOUND MOV R7,R15 MOV @EDCS(4),R0 ;GET SECOND WORD JNC ED9 ;FOUND * ED7 MOV R0,R5 ANDI R5,>3E ;MASK CHARACTER JEQ ED9 ;FOUND BL @EDGL ;GET LETTER JMP ED8 ;PROBLEM SRL R1,9 ;POSITION C R5,R1 ;LETTER SAME? JEQ ED7 ;Y * ED8 MOV R2,R0 ;PROBLEM, CONTINUE TO LOOK MOV R15,R7 JMP ED5 * EDER3 BL @EDER ;INVALID LINE NUMBER TEXT '03' * EDIF LI R4,IFB ;IF ENTRY JMP ED10 * EDON LI R4,ONB ;ON ENTRY JMP ED10 * EDSCI CB *R7+,@B3B ;";? JNE EDLETA ;N LI R4,PTRB ;"; ENTRY JMP ED10 PAGE *COMMAND TYPE DONE *CHECK FOR GOTO OR GOSUB * ED9 LI R1,EDCL AI R4,-EDCL (NOT ALLOWED) S R1,R4 SYSTEM COMMAND? JGT ED10 N - CONTINUE TRANSLATION B *R0 Y - EXECUTE COMMAND * ED10 SLA R4,7 ;POSITION BYTE MOVB R4,*R8+ ;STORE IN STREAM CI R4,>300 ;CHECK SPECIAL TYPES JLT ED12 ;GOTO,GOSUB JEQ ED3 ;ELSE CI R4,>400 ;REM? JNE ED14 ;N B @EDREM ;Y * ED11 MOVB @B3F,*R8+ ;STORE , * ED12 BLWP @CVDIZ ;GET INTEGER NOP JMP EDER3 MOVB R1,*R8+ ;STORE INTEGER SWPB R1 MOVB R1,*R8+ CI R0,>2C00 ;",? JEQ ED11 ;Y * ED13 DEC R7 ;FALL THRU TO ED20 * ED14 MOV R8,R12 ;MARK PAGE *PROCESS RESET OF LIST * ED20 BLWP @CVDIFZ ;LOOK FOR NUMBER JMP ED23 ;OVERFLOW, FP JMP ED30 ;NO NUMBER JMP ED20H ;HEX CI R1,-1 ;<-1? JLT ED21 ;Y * * FOLLOWING LINE MODIFIED TO ALLOW THE RENUM * COMMAND TO WORK WITH STATEMENT #S 1 TO 9 * C R1,@RENCMP FULL COMPRESSION? JGT ED21 ;Y AI R1,>63 ;N - GET CODE (62-6C) JMP ED22 ;INSERT * ED20H MOVB @B6E,*R8+ ;MARK AS HEX JMP ED21A * ED21 MOVB @B6D,*R8+ ;2 BYTE INTEGER, INSERT >6D ED21A MOVB R1,*R8+ ED22 SWPB R1 MOVB R1,*R8+ JMP ED24 ;LOOK FOR OPERATOR * ED23 MOVB @B6F,*R8+ ;FP #, INSERT >6F LI R3,6 LI R4,FPAC ;GET FPAC ADR * MOVB *R4+,*R8+ ;MOVE IN NUMBER DEC R3 ;DONE? JNE $-4 ;N * ED24 DEC R7 ;Y, BACKUP OVER DELIMITER * *VARIABLE OR KEY WORD *GET 3 CHARACTERS - EXIT TO EDOP IF NON-LETTER * ED30 BL @EDGWO ;CHECK FOR WORD OPERATER BL @EDGLS ;PROCESS COMMAND LIST JMP EDOP ;NOT LETTER, OPERATOR MOV R1,R0 BL @EDGL ;GET NEXT LETTER JMP EDV1 ;NOT LETTER, 1 CHARACTER VARIABLE A R1,R0 ;ADD NEW LETTER CI R0,>38C0 ;'FN'? JNE ED31 ;N B @EDFN ;Y, FUNCTION * ED31 BL @EDGL ;N, GET 3RD LETTER JMP EDV2 ;NOT LETTER, 2 LETTER VARIABLE A R1,R0 PAGE *LOOK FOR 3 LETTER KEY WORDS * LI R4,EDIL ;GET LIST PTR * ED32 MOV *R4+,R1 ;GET CHARACTERS SRL R1,1 ;REMOVE TERMINATOR C R0,R1 ;SAME? JNE ED34 ;N LI R11,EDIL AI R4,>1A*2 S R11,R4 SRL R4,1 ;SYSTEM FUNCTION * ED33 SWPB R4 ;POSITION MOVB R4,*R8+ ;INSERT JMP ED20 * ED34 CI R4,EDILE ;N, LIST DONE? JL ED32 ;N JMP ED35 * *1 CHARACTER VARIABLE * EDV1 MOV R0,R3 ;LOOK FOR # BL @CVDB20 ;CHECK FOR DIGIT JMP EDV1A ;N DEC R7 ;Y, BACKUP BLWP @CVDIZ ;CONVERT JMP EDER4 ;FP #, ILLEGAL VARIABLE NAME JMP EDV1B ;NO NUMBER CZC @CFF80,R1 ;TOO LARGE? JNE EDER4 ;Y, ILLEGAL NAME A R1,R3 ;COMBINE ORI R3,>0380 ;INDICATE AS NUMBER C380 EQU $-2 * EDV1A DEC R7 ;BACKUP OVER DELIMITER * EDV1B MOV R3,R0 ;RESTORE R0 PAGE *2 OR 3 CHARACTER VARIABLE * EDV2 EQU $ ED35 BL @EDGP ;LOOK FOR DIMENSION JMP ED35A ;Y, DIMENSIONED DEC R7 ;BACKUP JMP ED36 * ED35A NEG R0 ;SET DIMENSION INCT R6 ;STACK -1 SETO *R6 * *SAVE VARIABLE NAME * ED36 LI R4,>FF00+>70 ;-# OF VARIABLES MOV @VNT(9),R5 ;GET VARIABLE TABLE ADR * ED37 C R5,@VDT(9) ;DONE? JHE ED38 ;Y, MAKE NEW VARIABLE C R0,*R5+ ;VARIABLE SAME? JEQ ED39 ;Y, FOUND INC R4 ;STILL ROOM? JNE ED37 ;Y DATA ERROR+5 ;N, TOO MANY VARIABLES * EDER4 BL @EDER ;ILLEGAL VARIABLE NAME TEXT '04' * ERR10 DATA ERROR+10 ;STORAGE OVERFLOW PAGE *DEFINE NEW VARIABLE * ED38 MOV @NVD(9),R2 ;GET END OF TABLE C *R2+,*R2+ ;ADD 4 C R2,@NVS(9) ;ROOM FOR NEW VARIABLE? JHE ERR10 ;N MOV R2,@NVD(9) ;Y, UPDATE NVD * ED38A AI R2,-4 ;MOVE POINTERS UP 2 BYTES MOV *R2+,*R2 C R2,R5 ;DONE? JH ED38A ;N MOV R0,*R5 ;Y, STORE NEW NAME INCT @VDT(9) ;UPDATE VDT * ED39 MOV R0,R0 ;DIMENSIONED? JLT ED33 ;Y SWPB R4 ;N, INSERT VARIABLE CODE MOVB R4,*R8+ * * TRANSLATE CHARACTER INTO CODE * EDOP CLR R0 ;GET OPERATER MOVB *R7+,R0 ;GET BYTE JEQ ED90 ;DONE MOV R0,R1 SWPB R1 CI R0,>4100 ;<"A? JL EDOP1 ;Y CI R0,>5B00 ;>"Z? JL ED49 ;N, LETTER, TRY WORD OPERATER AI R1,-26 ;SKIP ALPHABET CI R0,>5E00 ;>"^? JH EDER6 ;Y, INVALID CHARACTER * EDOP1 MOVB @EDSL->21(1),R1 ;GET CODE JEQ EDER6 ;INVALID CHARACTER MOVB R1,*R8 ;STORE BYTE BL @JMPR0 ;SWITCHBOARD ON SPECIAL CHARACTERS EDOPTB BYTE EDOP-EDOPTB/2,>20 SP BYTE ED50-EDOPTB/2,>28 "( BYTE ED50-EDOPTB/2,>5B "[ BYTE ED51-EDOPTB/2,>29 ") BYTE ED51-EDOPTB/2,>5D "] BYTE ED42-EDOPTB/2,>22 "" BYTE ED42-EDOPTB/2,>27 "' BYTE ED47-EDOPTB/2,>3A ": BYTE ED54-EDOPTB/2,>21 "! BYTE ED43-EDOPTB/2,>3D "= BYTE ED45-EDOPTB/2,>3E "> DATA 0 ED40 INC R8 ;MOVE OVER CODE ED41 B @ED20 ;CONTINUE PARSE * ED42 INC R8 ;PROCESS " OR ' MOVB *R7+,*R8 ;GET NEXT BYTE JEQ EDER2 ;PROBLEM CB R0,*R8 ;CLOSE? JNE ED42 ;N SB *R8,*R8+ ;Y, TERMINATE WITH NULL JMP ED41 * ED43 DEC R8 ;PROCESS "= CB *R8,@B57 ;>=? JEQ ED44 ;Y CB *R8,@B59 ;<=? JEQ ED44 ;Y CB *R8+,@B56 ;==? JNE ED40 SB @B01,@-1(8) ;Y, MAKE == JMP ED41 * ED44 AB @B01,*R8+ ;MODIFY CODE JMP ED41 ;GOTO ED20 * ED45 CB @-1(8),@B59 ;PROCESS "> JNE ED40 AB @B02,@-1(8) ;MAKE <> JMP ED41 * ED46 INC R7 ;PROCESS :,THEN ED47 CB *R7,@B20 ;SPACE JEQ ED46 ;Y, IGNOR CB *R7,@B3A ;ANOTHER COLON? JEQ ED46 ;Y INC R8 ;N, PROCESS NEW COMMAND B @ED3 * EDER6 BL @EDER ;ILLEGAL CHARACTER TEXT '06' * *LOOK FOR WORD OPERATER * ED49 DEC R7 BL @EDGWO BL @EDER ;EXPECTING OPERATER TEXT '07' PAGE *( OR [ ENTRY * ED50 C R8,R12 ;COMMAND BYTE? JH ED50A ;N CB @-1(8),@BCPB ;MEM,CRB,CRF,BIT? JL ED50B ;N, LEAVE ( ED50A MOVB @-1(R8),R1 LAST CHAR STORED STRING TERMINATOR (0)? JEQ ED50B Y CB R1,@B38 N - FUNCTION ARGUMENTS? JHE ED50B ;N, LEAVE ( INCT R6 ;Y, MAKE [ CLR *R6 ;INSERT -1 INTO STACK SB @B02,*R8 ;*R8=>4A * ED50B DEC *R6 ;INCREMENT TOP ITEM ON STACK JMP ED40 ;LEAVE * *) OR ] ENTRY * ED51 INC *R6 ;NEED ]? JLT ED52 ;N, LEAVE >4D DECT R6 ;Y, DECREMENT STACK CI R6,SSP ;UNMATCHED? JL EDER2 ;Y SB @B02,*R8 ;N, INSERT ] CODE (>4B) * ED52 INC R8 ;LEAVE CODE ED52A JMP EDOP ;LOOK FOR OPERATER JG 12/1/82 PAGE *PROCESS REMARKS * ED54 INC R8 ;PROCESS TAIL REMARK * EDREM MOVB *R7+,*R8+ ;MOVE REMARK JNE EDREM * *END PARSE, CHECK FINAL ERRORS * ED90 CI R6,SSP ;SUBSCRIPT ERROR? JNE EDER2 ;Y INC *R6 ;PAREN ERROR? JNE EDER2 ;Y SB *R8,*R8+ ;N, MARK OUTPUT SB *R8,*R8 ;DOUBLE NULL SETO R0 ;SET TO INSERT MOV @LNUM(9),R1 ;GET LINE NUMBER JNE EMV0 ;INSERT OR CHANGE MOV *R9,R7 ;NO LINE NUMBER AI R7,30 ;MOVE INTO IOB MOV R7,R0 ;MARK LI R3,EBP ;**NOTE** ALL PTRS ON WRD BOUNDARIES * MOV *R3+,*R7+ ;MOVE C R3,R8 ;DONE? JL $-4 ;N * MOV R0,R8 ;SET R8 CB *R8,@B02 ;CHECK TYPE, GOTO/GOSUB? JG 15/1/82 JH ED91 ;N SETO @MODE(9) ;Y, SET TO RUN MODE CLR @PLC(R9) INDICATE FROM KEYBOARD MODE JG 15/1/82 BL @TYPC ;OUT CRLF * ED91 B @LINE2 * EDER2 BL @EDER ;UNMATCHED PARENTHESIS TEXT '02' PAGE *PROCESS FN- * EDFN BL @EDGLS ;GET LETTER JMP EDER8 ;NO LETTER SRL R1,2 ;POSITION MOVB R1,*R8+ ;INSERT INLINE MOV R8,R3 ;CHECK PREVIOUS BYTE DECT R3 ;LOOK FOR OPERATOR CI R3,EBP ;BEGINNING OF BUFFER? JNE ED52A ;N, DISREGUARD JG 12/1/82 CB *R3,@DEFXB ;'DEF'? JNE ED52A ;N, CONTINUE JG 12/1/82 BL @EDGP ;Y, LOOK FOR ( OR [ JMP EDFN0 ;"( OR "[, OK DEC R7 ;NEITHER, LOOK FOR "= JMP EDFN3 * EDFN0 LI R3,3 ;Y, ALLOW 3 DUMMY VARIABLES MOV @VNT(9),R4 ;GET STORAGE ADR * EDFN1 BL @EDGLS ;GET DUMMY VARIABLE JMP EDER9 ;PROBLEM MOVB R1,*R8+ ;INSERT IN CODE MOV R1,*R4+ ;STORE CODE BL @EDGP ;GET NEXT BYTE JMP EDER9 DEC R3 ;ROOM FOR MORE? JEQ EDFN2 ;N, SEE IF ") CI R1,>2C00 ;Y, DELIMITER ",? JEQ EDFN1 ;Y, LOOP * EDFN2 CI R1,>2900 ;N, CLOSING PAREN? JEQ EDFN3 ;Y, LOOK FOR "= CI R1,>5D00 ;N, "]? JNE EDER2 ;N, PROBLEM EDFN3 CB @B3D,*R7 ;Y, "=? JEQ ED52A ;Y JG 12/1/82 CB @B20,*R7+ ;SPACE? JEQ EDFN3 ;Y, TRY AGAIN BL @EDER ;MISSING ASSIGNMENT TEXT '36' * EDER8 BL @EDER ;ILLEGAL FUNCTION NAME TEXT '08' * EDER9 BL @EDER ;ILLEGAL FUNCTION ARGUMENT TEXT '09' PAGE *FINISH EDIT PROCESS * BL @EMV * * IN R0 = 0 FOR DELETE, <>0 FOR CHANGE OR INSERT * R1 = LINE NUMBER * EMV MOV R11,R10 ;SAVE RETURN EMV0 MOV R1,R1 ;DELETE 0? JEQ EMVR ;Y, ACTION COMPLETE LI R2,EBP S R2,R8 ;GET # OF BYTES INC R8 ;GET # OF WORDS (NEXT HIGHEST) SRA R8,1 MOV R8,R2 ;GET # OF BYTES SLA R2,1 MOV @SLT(9),R6 ;GET START OF STATEMENT TABLE MOV R6,R7 S @BUS(9),R7 ;R7=POINT OF QUESTION IN PSEUDO SOURCE * *UPON EXIT OF EMV1, R7 DISPLACES INTO PSEUDO SOURCE * AND R6 POINTS INTO SLT * EMV1 MOV *R6,R4 ;DONE? JEQ EMV2 ;Y C R1,*R6 ;N, FOUND? JEQ EMV5 ;Y, CHANGE OR DELETE JGT EMV2 ;Y, NEW LINE INCT R6 MOV *R6+,R7 ;GET NEW POINT OF QUESTION JMP EMV1 * ERR13 MOV R1,R3 COPY UNFOUND STMT # (ERRECOVY) JG 12/1/82 DATA ERROR+13 ;NO SUCH LINE NUMBER * EMV2 MOV R0,R0 ;NEW #, DELETE? JEQ ERR13 ;Y, PROBLEM * *INSERT NEW LINE ENTRY * MOV R6,R3 ;GET SOURCE BL @EMVA ;ADJUST DATA 4 ;INSERT 4 BYTES IN SLT MOV R1,*R6+ ;INSERT NEW LINE # MOV R7,*R6 ;INSERT DISPLACEMENT * EMV3 LI R4,EBP ;MOVE IN SOURCE LINE MOV *R6,R6 ;GET ADR A @BUS(9),R6 ;MAKE DISPLACEMENT, POINTER MOV R6,R7 ;MOVE IN STRING * MOV *R4+,*R7+ ;MOVE DEC R8 ;DONE? JNE $-4 ;N PAGE *ADJUST GOSUB * * IN R2 = PBC ADJUSTMENT * R3 = PLC ADJUSTMENT * R6 = START * R7 = END * EMV4 MOV @GSC(9),R4 ;GET GOSUB STACK PTR * EMV4A C R4,@GSS(9) ;DONE? JLE EMV4E ;Y AI R4,-4 ;N, BACKUP C R6,*R4 ;LESS THAN INSERTED LINE? JH EMV4A ;Y C R7,*R4 ;GREATER THAN? JLE EMV4C ;Y MOV R4,R5 ;N, DELETE ENTRY * EMV4B MOV @4(5),*R5+ ;DELETE ENTRY C R5,@GSC(9) ;DONE? JL EMV4B A @CM4,@GSC(9) ;BACKUP PTR JMP EMV4A * EMV4C A R2,*R4 ;Y, ADJUST PBC A R3,@2(4) ;ADJUST PLC JMP EMV4A * *ADJUST FOR/NEXT STACK * EMV4E MOV @FNS(9),R4 ;DO FOR/NEXT STACK * EMV4F MOV *R4,R0 ;DONE? JEQ EMV4J ;Y MOV R4,R5 ;N AI R5,14 C R6,*R5 ;LESS THAN INSERTED LINE? JH EMV4I ;Y C R7,*R5 ;>=? JLE EMV4H ;Y BL @FOR2 ;DELETE ENTRY JMP EMV4F ;LOOK AGAIN * EMV4H A R2,*R5+ ;Y, ADJUST PBC A R3,*R5 ;ADJUST PLC EMV4I AI R4,18 ;MOVE TO NEXT JMP EMV4F PAGE *ADJUST DATA POINTERS * EMV4J MOV R9,R4 ;GET DELIMITER PTR AI R4,DDM ;DISPLACE C R6,*R4 ;CHECK DATA PTRS JH EMV4L ;OK C R7,*R4 ;DELETED OR CHANGED? JLE EMV4K ;N, INSERTED CLR *R4 ;Y, SET TO LOOK FURTHER JMP EMV4KA * EMV4K MOV *R4,R0 ;DEFINED? JEQ EMV4L ;N, DON'T WORRY ABOUT IT A R2,*R4 ;Y, ADJUST PBC * EMV4KA A R3,@DLC(9) ;ADJUST PLC * *ADJUST FUNCTION DEFINITION STACK * EMV4L MOV @UFT(9),R4 ;GET POINTER * EMV4M MOV *R4,R0 ;DEFINED? JEQ EMV4O ;N C R6,*R4 ;LESS THAN CHANGED LINE? JH EMV4O ;Y C R7,*R4 JLE EMV4N ;N CLR *R4 ;UNDEFINE JMP EMV4O * EMV4N A R2,*R4 ;ADJUST PBC EMV4O C *R4+,*R4+ ;MOVE TO NEXT C R4,@GSS(9) ;DONE? JL EMV4M ;N * EMVR B *R10 ;RETURN PAGE *DELETE OR CHANGE LINE * EMV5 MOV @2(6),R11 ;GET BOL S R7,R11 ;GET -LINE LENGTH MOV R0,R0 ;DELETE LINE? JNE EMV6 ;N * *DELETE LINE * MOV R11,R2 ;Y MOV R6,R3 AI R3,4 ;GET SLT SOURCE BL @EMVA ;ADJUST CM4 DATA -4 ;DELETE 4 BYTES FROM SLT JMP EMV4 * *CHANGE LINE * EMV6 A R11,R2 ;GET DELTA CHANGE MOV @NVD(9),R0 ;CHECK STORAGE A R2,R0 C R0,@NVS(9) ;ROOM? JHE EMVE10 ;N LI R13,EMV6A ;GET RETURN ADR JMP EMVA1 * EMV6A DATA 0 ;LEAVE PLC ALONE INCT R6 ;MOVE TO LINE ADR JMP EMV3 * EMVE10 DATA ERROR+10 ;STORAGE OVERFLOW PAGE *ALTER SOURCE CODE * BL @EMVA * DATA (SLT ADJUSTMENT) * R3=SLT SOURCE PTR * EMVA MOV R11,R13 ;SAVE RETURN MOV @NVD(9),R4 ;GET THRU POINTER (END OF VARIABLE DEFS) MOV R3,R5 ;GET DESTINATION A *R13,R5 ; (4=INSERT,-4=DELETE,0=CHANGE) MOV R4,R0 ;CHECK FOR SIZE A *R13,R0 A R2,R0 ;ADD LINE C R0,@NVS(9) JHE EMVE10 ;OVERFLOW A *R13,@VNT(9) ;ADJUST POINTERS A *R13,@VDT(9) A *R13,@NVD(9) BL @MOVE ;DO FIRST MOVE * EMVA1 MOV R7,R3 ;MAKE HOLE IN PSEUDO SOURCE A @BUS(9),R3 ;MAKE DISPLACEMENT INTO POINTER MOV @NVD(9),R4 ;THRU MOV R3,R5 A R2,R5 ;DESTINATION A R2,R6 A R2,@SLT(9) ;ADJUST POINTERS A R2,@VNT(9) A R2,@VDT(9) A R2,@NVD(9) BL @MOVE ;DO SECOND MOVE * *ADJUST SLT * MOV R6,R3 ;GET POINTER * EMVA2 C R3,@SLT(9) ;DONE? JLE EMVA3 ;Y DECT R3 ;N A R2,*R3 ;ADJUST PTR DECT R3 JMP EMVA2 * EMVA3 MOV *R13+,R3 ;GET PLC ADJUSTMENT B *R13 ;RETURN PAGE *MOVE * BL @MOVE * * IN R3 = SOURCE * R4 = SOURCE END * R5 = DESTINATION * MOVE C R3,R5 ;THERE? JEQ MOVE4 ;Y JL MOVE2 ;N, SD, DONE? JH MOVE4 ;Y MOV *R3+,*R5+ ;MOVE DATA JMP MOVE1 * MOVE2 MOV R4,R0 ;S"Z? JHE EDGL1 ;Y CLR R1 ;LETTER MOVB *R7+,R1 SLA R1,2 ;REMOVE UPPER BITS SRL R0,5 ;ADJUST R0 INCT R11 EDGL1 RT * MOVE4 EQU EDGL1 * *GET WORD OPERATER * EDGWO MOV R11,R5 BL @EDGLS ;GET LETTER B *R5 ;NO LETTER, RETURN DEC R7 ;OK, PROCESS LI R4,EDGWOL ;GET WORD OPERATER LIST * EDGWO1 MOV R7,R3 ;MARK * EDGWO2 MOVB *R4+,R1 ;GET CHARACTER, FOUND? JEQ EDGWO4 ;Y CB *R3+,R1 ;N, SAVE LETTER? JEQ EDGWO2 ;Y MOVB *R4+,R1 ;N, MOVE TO NEXT JNE $-2 INC R4 ;MOVE OVER CODE MOVB *R4,R1 ;DONE? JNE EDGWO1 ;N, KEEP TRYING B *R5 ;Y, RETURN * EDGWO4 MOVB *R4,*R8 ;RESERVED WORD, GET CODE MOV R3,R7 ;UPDATE R7 CB *R8,@B3B ;THEN? JEQ EDGWO5 ;Y, PROCESS : B @ED40 ;N, INSERT OPERATER * EDGWO5 B @ED47 PAGE *GET CHARACTER * * BL @EDGP * "( OR "[ * OTHER * EDGP CLR R1 MOVB *R7+,R1 ;GET CHARACTER CI R1,>2000 ;SP? JEQ EDGP ;Y CI R1,>2800 ;"(? JEQ EDGP1 ;Y CI R1,>5B00 ;"[? JEQ EDGP1 ;Y INCT R11 ;N, RETURN 2(11) EDGP1 RT PAGE * * COMMAND LIST * * SYMBOLS STORED AS: * 3333 3222 2211 111S * WHERE S=0 3 LETTERS * S=1 4-6 LETTERS * * 0 1 2 3 4 5 6 7 * 0 @ A B C D E F G * 1 H I J K L M N O * 2 P Q R S T U V W * 3 X Y Z * EDSCL DATA >7564 RUN DATA >D266,>9A58 SIZ,LIS DATA >73C6 CON DATA >7CA0 PRO(GRAM) DATA >7164 REN(UMBER) DATA >2B06 CLE(AR) JG 02/3/82 * EDCL DATA >A3CF GOTO* RNGOTO EQU ($-EDCL)/2 RENUMBER OPCODE DATA >9BCF GOSUB* RNGSUB EQU ($-EDCL)/2 RENUMBER OPCODE DATA >9B0B ELSE* RNELSE EQU ($-EDCL)/2 RENUMBER OPCODE DATA >6964 REM* RNREM EQU ($-EDCL)/2 RENUMBER OPCODE DATA >93CC FOR* DATA 0 (LET*) DATA >A049 DATA NXTX DATA >C15D NEXT DATA >948B ERROR RNERR EQU ($-EDCL)/2 RENUMBER OPCODE PRTX DATA >4CA1 PRINT DATA >6047 CALL DATA >0BD9 LOAD DATA >8393 INPUT RNINP EQU ($-EDCL)/2 RENUMBER OPCODE DATA >0965 READ DATA >9965 RESTOR RNRSTR EQU ($-EDCL)/2 RENUMBER OPCODE DATA >A165 RETURN DATA >7D27 STOP DATA >4BAB UNIT DATA >6A69 TIME DATA >B067 SAVE DATA >9845 BASE DATA >1CCB ESCAPE DATA >2BDD NOESC DATA >7065 RANDOM DATA >0B53 IMASK DATA >A493 IRTN DATA >0CA9 TRAP RNTRAP EQU ($-EDCL)/2 RENUMBER OPCODE DATA >A845 BAUD DATA >0B8B ENABLE DATA >83E0 POP DATA >6A48 DIM DATA >A158 LET ONX DATA >73C0 ON RNON EQU ($-EDCL)/2 RENUMBER OPCODE IFX DATA >3240 IF RNIF EQU ($-EDCL)/2 RENUMBER OPCODE DEFX DATA >3148 DEF DATA >B95C NEW DATA >238A END BCP EQU $-EDCL/2+1 ****** INSERTS BEFORE HERE DATA >A244 BIT (SEE ED50) DATA >1486 CRB DATA >3486 CRF DATA >695A MEM DATA >25DA MWD EDCLE EQU $ * IFB EQU IFX-EDCL+2 ONB EQU ONX-EDCL+2 PTRB EQU PRTX-EDCL+2 PAGE * * SECOND HALF OF PRIMITIVE TABLE * DATA RUNP DATA SIZE,LST DATA CONT DATA PROGM DATA RENUMS DATA CLEARS JG 02/3/82 * EDCS EQU $-EDCL-2 DATA >001E,>00AA GOTO,GOSUB B0A EQU $+1 DATA >000A ELSE* BCPB BYTE BCP,0 REM* CFF80 DATA >FF80 FOR* DATA >0000 (LET)* B02 EQU $+1 DATA >0002 DATA DATA >0028 NEXT DATA >049E ERROR DATA >051C PRINT DATA >0018 CALL DATA >0008 LOAD DATA >052A INPUT DATA >0008 READ DATA >93E8 RESTOR DATA >74AA RETURN DATA >0020 STOP DATA >0028 UNIT DATA >000A TIME DATA >000A SAVE DATA >000A BASE DATA >2C02 ESCAPE DATA >00E6 NOESC DATA >6BC8 RANDOM DATA >02E6 IMASK DATA >001C IRTN DATA >0020 TRAP DATA >0008 BAUD DATA >2B04 ENABLE * PAGE * * SYSTEM FUNCTION TABLE * EDIL DATA >9882 ABS DATA >9102 ADR DATA >1CC2 ASC DATA >7502 ATN DATA >9BC6 COS DATA >860A EXP DATA >8392 INP DATA >3BD8 LOG DATA >CADC NKY DATA >7266 SIN DATA >9466 SQR DATA >9E66 SYS DATA >1A68 TIC * * ASSIGNABLE FUNCTIONS * DATA >A244 BIT DATA >1486 CRB DATA >3486 CRF DATA >695A MEM DATA >25DA MWD 2 MAY 1979 HJC * * CHARACTER FUNCTIONS * DATA >7158 LEN DATA >40DA MCH DATA >44A6 SRH EDILE EQU $ * * TRANSLATION TABLE INDEXED BY ASCII CODE. * NULLS ARE ILLEGAL. * EDSL DATA >4744,>3E43 ! " # $ DATA >4248,>454C % & ' ( DATA >4D5F,>5D3F ) * + , DATA >5C00,>5E00 - . / 0 DATA >0000,>0000 1 2 3 4 DATA >0000,>0000 5 6 7 8 DATA >003C,>4059 9 : ; < B56 DATA >5657,>413D = > ? @ DATA >4C46,>4D60 [ \ ] ^ * B59 EQU EDSL+27 B57 EQU EDSL+29 B46 EQU EDSL+33 PAGE EDGWOL EQU $ WORD OPERATORS LSTO TEXT 'TO' BYTE 0,>38 LSTB TEXT 'TAB' BYTE 0,>39 LSST TEXT 'STEP' BYTE 0,>3A LSTH TEXT 'THEN' BYTE 0,>3B LSOR TEXT 'OR' BYTE 0,>4E LSLOR TEXT 'LOR' BYTE 0,>4F LSAN TEXT 'AND' BYTE 0,>50 LSLAN TEXT 'LAND' BYTE 0,>51 LSNT TEXT 'NOT' BYTE 0,>52 LSLNT TEXT 'LNOT' BYTE 0,>53 LSLXO TEXT 'LXOR' BYTE 0,>54,0 PAGE * * LIST TRANSLATION TABLE INDEXED BY PSEUDO CODE. * "_ ARE UNDEFINED. * EDLC EQU $ B3A BYTE >3A : B40 BYTE >40 @ BYTE >23 # B2C BYTE >2C , B3B BYTE >3B ; B3F BYTE >3F ? BYTE >25 % BYTE >24 $ BYTE >22 " BYTE >27 ' BYTE >5C \ BYTE >21 ! BYTE >26 & B03 BYTE >03 _ (UNUSED) B5B BYTE >5B [ B5D BYTE >5D ] BYTE >28 ( BYTE >29 ) B1B BYTE >1B OR (UNUSED) B6D BYTE >6D LOR (UNUSED) B4E BYTE >4E AND (UNUSED) B6F BYTE >6F LAND (UNUSED) B38 BYTE >38 NOT (UNUSED) DEFXB BYTE DEFX-EDCL/2+1 LNOT (UNUSED) NXTXB BYTE NXTX-EDCL/2+1 LXOR (UNUSED) BYTE >3D == B3D BYTE >3D = BYTE >3E > BYTE >3E >= BYTE >3C < BYTE >3C <= BYTE >3C <> BYTE >2D - BYTE >2B + BYTE >2F / BYTE >2A * BYTE >5E ^ EVEN PAGE LCN1 EQU EDLC->3C LCN2 EQU EDCL-2 LCN3 EQU EDIL->36 LCN4 EQU EDCS+2 LNXT EQU NXTX-EDCL+2 LDEF EQU DEFX-EDCL+2 * ERR46 DATA ERROR2,46 * * SAVE * * = 0 OR BLANK - 733 DIGITAL CASSETTES * = 1 - BUBBLE MEMORY TERMINAL * = 2 - EIA AUDIO CASSETTES * * PROGRAM LOAD FLAG (PLF) REFLECTS DEVICE TYPE * OR -1 (LISTING) * SAVY CLR @PLF(R9) SET DEFAULT DEVICE TYPE LI R1,RCDON REF DC2 STRING BL @CKEX LOOK FOR EXPRESSION JMP SAV1 NONE EVFIX R2 CI R2,2 TOO LARGE? D2 EQU $-2 JH ERR46 Y - ERROR A R2,@PLF(R9) STORE DEVICE TYPE DEC R2 JGT SAV3 AUDIO JEQ SAV2 BUBBLE SAV1 C *R1+,*R1+ 733 - ONLY NEED DC2 CHARACTER SAV2 BL @TYPE OUTPUT TAPE START COMMANDS JMP LST0A SAV3 MOV @UNIT(R9),@AUDIO SAVE UNIT FLAG MOV @D2,@UNIT(R9) PORT A=OFF, PORT B=ON JMP LST0A PAGE * * LIST COMMAND * LST BL @TYPC ;OUT CRLF LST0A MOV @LNUM(9),R1 ;GET INITIAL START MOV @VNT(9),R8 ;GET TABLE ADR DECT R8 ;BACKUP LST0 C R8,@SLT(9) ;DONE? JLE LST2 ;Y AI R8,-4 ;MOVE TO NEXT ENTRY C R1,*R8 ;SAME? JGT LST0 SETO @DCNT(9) ;RESET INDENT COUNTER LST1 C R8,@SLT(9) ;DONE? JL LST2 ;Y MOV *R8+,R1 ;N, GET LINE NUMBER MOV *R9,R7 ;GET BUFFER ADR BL @LSTL ;LIST LINE AI R8,-6 ;PREPARE FOR NEXT LINE MOVB @B0D,*R7+ ;OUT CRLF MOVB @B0A,*R7+ SB *R7,*R7 * * IF SAVING PROGRAM AND RUNNING AT 1200 BUAD (ASR733, BUBBLE * MEMORY TERMINAL - AUDIO????) THEN * REMOVE THE 3 CHARACTER DELAY: PRETEND TO BE RUNNING AT * 300 BAUD - NEED PROPER CRLF DELAY * MOV @ASR0(R9),R3 SAVE BAUD RATE JG 02/3/82 MOV @PLF(R9),R0 JG 02/3/82 INC R0 SAVE OPERATION? JG 15/3/82 JEQ LST1A N - LIST JG 02/3/82 MOV R3,R3 Y - 1200 BAUD? JG 02/3/82 JNE LST1A N JG 02/3/82 SETO @ASR0(R9) Y - PRETEND TO BE 300 BAUD JG 02/3/82 LST1A BL @TYPB ;OUTPUT LINE JG 02/3/82 MOV R3,@ASR0(R9) RESTORE ORIGINAL BAUD RATE JG 02/3/82 BL @GETC ;CHECK FOR ESC JMP LST1 ;NOTHING JMP LST1 ;CHARACTER * * LIST/SAVE COMPLETE. IF SAVE NEED TO ADD 'ESCAPE' * CHARACTER AND DC4 TO TAPE. * LST2 MOV @PLF(R9),R3 EOF/ESCAPE - LIST? JLT LST4 Y - LI R1,RCDOF N - REF STOP TAPE COMMAND STRING DEC R3 JNE LST2A AUDIO OR 733 C *R1+,*R1+ BUBBLE - NEED TO RE-ENABLE PRINTER LST2A BL @TYPE DEC R3 JNE LST4 BUBBLE OR 733 MOV @AUDIO,@UNIT(R9) RESTORE ORIGINAL UNIT FLAG LST4 B @CRLF DONE PAGE *LIST GOTO'S AND GOSUB'S * LSTG1 MOVB @B2C,*R7+ ;OUT ", * LSTG MOVB *R3+,R1 ;GET LINE NUMBER SWPB R1 MOVB *R3+,R1 SWPB R1 OUTINT R1 ;CONVERT CB *R3+,@B3F ;CHECK NEXT BYTE FOR ", JEQ LSTG1 ;Y, ANOTHER GOTO, OR GOSUB DEC R3 ;N, PROCESS JMP LSTLX PAGE *LIST LINE * BL @LSTL * * IN R1 = LINE # * R7 = IOB * *R8 = PBC * PRESERVE R6,R8 * R15 = SP * LSTL MOV R11,R10 ;SAVE RETURN MOV *R8,R3 ;GET PBC A @BUS(9),R3 ;MAKE DISPLACEMENT INTO POINTER LI R15,>2000 ;GET SPACE MOVB R15,*R7+ ;OUT SPACE OUTINT R1 ;CONVERT LINE NUMBER MOV @DCNT(9),R2 ;GET INDENT COUNT CB *R3,@B03 ;ELSE? JNE LSTL1 ;N DECT R2 ;Y, INDENT 2 MORE SPACES * LSTL1 MOVB R15,*R7+ ;OUT SPACE INC R2 ;MORE? JLT LSTL1 ;Y CB *R3,@NXTXB ;NEXT? JNE LSTL2 ;N DEC R7 ;Y, INDENT 1 LESS * LSTL2 MOVB R15,*R7+ ;OUT SPACE * LSTL3 CLR R0 MOVB *R3+,R0 ;GET TYPE CI R0,>0600 ;IMPLIED LET? LETB EQU $-2 JEQ LSTL4 ;Y BL @LWRD ;LIST COMMAND TYPE DATA LCN2 ;EDCL-2 MOVB R15,*R7+ ;OUT SPACE CI R0,BCP*2 ;BIT,CRB,CRF,MEM? JL LSTL4 ;N DEC R7 ;Y, ELIMINATE SPACE * LSTL4 MOV R0,R14 ;SAVE TYPE CI R0,>3*2 ;CHECK TYPE JLT LSTG ;GOTO OR GOSUB JEQ LSTL3 ;ELSE CI R0,>5*2 JLT LSTRM ;LT - REMARK STATEMENT JGT LSTL5 ;GT - CONTINUE LOOKING DEC @DCNT(9) ;FOR, DECREMENT COUNTER * LSTL5 CI R0,LNXT ;NEXT? JNE LSTL6 ;N INC @DCNT(9) ;Y, INCREMENT COUNTER JLT LSTL6 ;COUNTER OK SETO @DCNT(9) ;RESET COUNTER LSTL6 MOV R0,R14 ;SAVE TYPE PAGE LSTLX MOVB *R3+,R0 ;GET CODE JEQ LSTLE ;DONE CB R0,@B1B ;USER FUNCTION? JL LSTFNP ;Y CB R0,@B38 ;SYSTEM FUNCTION? JL LSTSF ;Y SRL R0,8 ;READY R0,R4 MOV R0,R4 CI R0,>3C ;TO, TAB, STEP, THEN? JL LSTTT ;Y CI R0,>4E ;< OR? JL LSTLX0 ;Y CI R0,>54 ;> LXOR? JLE LSTTI ;N * LSTLX0 CI R0,>62 ;CHARACTER? JL LSTCR ;Y CI R0,>6F ;CONSTANT? JL LSTCN ;Y, INTEGERS JEQ LSTCNF ;Y, FLOATING POINT * MOV @VNT(9),R5 ;N, VARIABLE SLA R0,1 ;X 2 A R0,R5 ;INDEX & GET VARIABLE CLR R2 MOV @-2*>70(5),R5 JGT LSTVN ;DIMENSIONED? NEG R5 ;Y B4A EQU $+3 LI R2,>4A ;OUT [ * LSTVN COC @C380,R5 ;LETTER + NUMBER? JNE LSTVN1 ;N BL @LWRDO ;Y, OUT CHARACTER SRL R1,2 MOV R5,R1 ;OUT # ANDI R1,>7F ;MASK OUTINT R1 ;CONVERT JMP LSTVN2 * LSTVN1 SLA R5,1 ;REGULAR VARIABLE LI R13,LSTVN2 B @LWRD2 ;LIST * LSTVN2 MOV R2,R4 ;"[ NEEDED? JNE LSTCR1 ;Y JMP LSTLX * LSTLE SB *R7,*R7 ;PUT NULL ON END B *R10 PAGE LSTCR MOVB @LCN1(4),*R7+ ;EDLC->3C SWPB R0 BL @JMPR0 ;LOOK FOR CODES LSTCRT BYTE LSTCR0-LSTCRT/2,>44 " BYTE LSTCR0-LSTCRT/2,>45 ' BYTE LSTTR-LSTCRT/2,>47 ! DATA 0 BL @LSTCR2 ;LOOK FOR DOUBLES * == >= <= <> :: DATA >3D55,>3D58,>3D5A,>3E5B,>3A3C,>0000 * *TAIL REMARK * LSTTR DEC R7 ;BACKUP OVER ! MOVB R15,*R7+ ;OUT SPACE MOVB R15,*R7+ MOVB @LCN1(4),*R7+ JMP LSTRM1 * *REMARK ENTRY * LSTRM DEC R7 ;REM, MOVE BACK 1 CHAR * LSTRM1 MOVB *R3+,*R7+ ;MOVE INTO LINE JNE $-2 DEC R7 ;BACKUP B *R10 ;RETURN PAGE * LSTCR2 MOVB *R11+,*R7 ;MOVE CHARACTER INTO LINE JEQ LSTLX ;NOT FOUND CB R0,*R11+ ;FOUND? JNE LSTCR2 ;N, KEEP LOOKING CB *R7+,@B3A ;":? JNE LSTLX ;N LSTL2P B @LSTL2 * LSTFNP JMP LSTFN LSTCR0 MOVB *R3+,*R7+ ;MOVE IN CHARACTER STRING JNE $-2 ;LOOP UNTIL NULL DEC R7 ;BACKUP OVER NULL * LSTCR1 MOVB @LCN1(4),*R7+ ;EDLC->3C JMP LSTLX * LSTSF BL @LWRD ;LIST SYSTEM FUNCTION DATA LCN3 ;EDIL->36 LSTSF1 CB *R3,@B4A ;[? JEQ LSTLX ;Y, NO SPACE LSTSP MOVB R15,*R7+ ;OUT SPACE LSTLXP JMP LSTLX * LSTTI AI R4,->12 ;MOVE BACK BY THEN * LSTTT MOVB R15,*R7+ ;OUT SPACE A R4,R4 ;DOUBLE INDEX MOV @LSTTL->70(4),R5 38*2 * LSTT1 MOVB *R5+,*R7+ ;MOVE LETTER MOVB *R5,R0 ;CHECK END JNE LSTT1 ;LOOP CI R4,>3B*2 ;THEN? JEQ LSTL2P ;Y JMP LSTSP ;OUT SPACE PAGE LSTCN CI R0,>6D ;-1 THRU 9? JHE LSTCN1 ;N AI R0,->63 ;Y MOV R0,R1 JMP LSTCN2 ;CONVERT * LSTCN1 MOVB *R3+,R1 ;INTEGER SWPB R1 MOVB *R3+,R1 SWPB R1 B6E EQU $+3 CI R0,>6E ;HEX? JEQ LSTCN3 ;Y * LSTCN2 OUTINT R1 ;N, CONVERT JMP LSTLXP * LSTCN3 BL @HOUT ;OUT HEX JMP LSTLXP * LSTCNF OUTFP *R3 ;OUTPUT FP # AI R3,6 ;INCREMENT OVER NUMBER JMP LSTLXP * *USER FUNCTION ENTRY * LSTFN MOVB @B46,*R7+ ;OUT "F MOVB @B4E,*R7+ ;OUT "N AI R0,>4000 MOVB R0,*R7+ ;OUT LETTER CI R14,LDEF ;DEF? JNE LSTSF1 ;N, CHECK FOR ( MOV @VNT(R9),R14 GET TABLE ADDR & CLEAR 'LDEF' CB *R3,@B56 ;Y, ARGUMENTS? JEQ LSTLXP ;N MOVB @B5B,*R7+ ;Y, OUT "[ * LSTFD1 MOVB *R3+,*R14 ;SAVE DUMMY NAME MOV *R14+,R1 SRA R1,2 BL @LWRDO1 ;MAKE LETTER & STORE CB *R3,@B56 ;=? JEQ LSTFD2 ;Y MOVB @B2C,*R7+ ;N, OUT ", JMP LSTFD1 ;LOOP AGAIN * LSTFD2 MOVB @B5D,*R7+ ;OUT "] JMP LSTLXP * LSTTL DATA LSTO,LSTB DATA LSST,LSTH DATA LSOR,LSLOR DATA LSAN,LSLAN DATA LSNT,LSLNT DATA LSLXO PAGE *LIST WORD * BL @LWRD * ADR * LWRD MOV *R11+,R4 ;GET ADR OF WORD MOV R11,R13 ;SAVE RETURN SRA R0,7 ;SWAP AND X 2 A R0,R4 ;INDEX * LWRD1 MOV *R4,R5 ;GET WORD LWRD2 BL @LWRDO ;OUT FIRST CHARACTER SLA R1,7 BL @LWRDO ;OUT 2ND OR 5TH CHARACTER SLA R1,2 BL @LWRDO ;OUT 3RD OR 6TH CHARACTER SRL R1,3 AI R4,@LCN4 ;MOVE TO NEXT HALF (EDCS+2) SRL R5,1 ;ANOTHER HALF? JOC LWRD1 ;Y B *R13 ;N, RETURN * LWRDO MOV R5,R1 ;LOAD TEMP X *R11+ ;EXECUTE SHIFT ANDI R1,>1F00 ;MASK JEQ LWRDO2 ;RETURN * LWRDO1 AI R1,>4000 ;ADD LETTER BITS MOVB R1,*R7+ ;MOVE OUT LWRDO2 RT ;RETURN * * DON'T INSERT BETWEEN BLKFWD AND BUBFWD * BLKFWD BYTE >10,>37,>0,>0 <7> BYTE >1B,>32,>0 <2> RCDOF BYTE >1B B0D BYTE >0D,>14,>0 BYTE >1B,>1B,>1B,>35 <5> BYTE >1B,>38,>14,>0 <8> RCDON BYTE >1B,>35,>1B,>39 <5><9> BYTE >12,>0 PLYBON BYTE >1B,>34,>1B,>3A,>0 <4><:> PLYBOF BYTE >1B,>34,>1B,>3B <4><;> BYTE >13,>0 EVEN END