܆з؎0&U>'&4/n&4"5 M'45 Z& ' 9섍 +P=='ۧ&&c 9ڷۆ==؅&9TOOLKITa ' Y'DECOMPILCMD YBASEREFCMD  YBEDITBIN YDECOMPILTXT YBASEREFTXT) YBEDITTXT m YSMWTXT   Y   DCOMP V1.8 11-10-81 QP 7' 4 5~ 7&~$ Q7L@-%^3NL&P;AM zY&  -%&3 7$ QN'A M' 'F?@ ~ Q@ LL MM&oM9 Q: 8}&9|&\&0 ꦀ'+G'  0 ' o65섣% 5 6 m#' 6'501"m!&09'''w&q$'&b%& 43509& 0Z&9&0 &0x09ā&FoNj4t&5 &cO_4 QN&N#N0 QDV41aDDDA[% IF&I 5m&J& &99GG8oJ&*-ʀߦ 12.- -% -J92.' 0 22&Ɏ:M' &lo 8D'M$(.c91:o3'M$ 330 1'AE; 1*1-00%&'B&#D&F&2b.0 Z&9G%'f`ĀJ&Z&90G.&$0 9ģ&B&D&F9E#+C"!)A 'Ē&9&1 GOTO GOSUB RESUME DIGITS REMLET PRINT INPUT SWAP FOR POKE NEXT READ RETURNIF DIM ON DEF$ ENDSTOPDATA RESTORE OPEN CLOSE CHAIN KILL RENAME GET PUT FIELD LSET RSET EXEC DPOKE RECORD OLD NEW AS USING ERROR LINE THEN ELSE TO STEP FN ABS ATN COS EXP INTLOG RNDSGN SIN SQR TAN POS PEEK USR FREPTRDPEEK SPC TABPIERR ERL ASCLENVALHEXINSTRCVT$%CVT$FDATE$CHR$LEFT$RIGHT$MID$STR$INCH$CVT%$CVTF$NOT AND OR <=>=<><>=^/*+-,;()#: \ vP &H{%{x$ :lu#Vq"76Ln!ŭ+pk o|@E#ggOd6 a?9x ^ˏ' ZoWYQa@pąTPh? WMx2nJ&zFxŬbC#@ k:v@<.9ɿ6_12 /*,  ( C@% " k( $P4@  =pnOѷXeŬGG7ljֿzBwap_A6ν $ oP .BK $5 \|:敔Mw26]J}adPt|-m难Du;ŭ%vXtѷ~ʣ5;B_^γ,KCϱE9'Kݓ߄<UbKԭ-wݪ$$is܈ T\uS"'d NUMERICAL OR FILE ERROR!! QMV1.8 *** DECOMPILER FOR TSC XBASIC *** BUILD A DISK FILE? (Y/N)FILENAME?  AĽ$@-%3 EH @&9?$~0 $0~D.Z&90 3.4@&2b1@& 'a-z._ &9&mY'f0F& 0 ro11ﮤ1'1$$&ﮍ"'O0 m &$! 9F:l!0 %819 ' 99$0l ~j& $ 90e91%x ' & 0d ⦠' '' 䯍P,&QM+G9:,,&0 o$G'9'0O9)'94 0&55O90- ._990-! '''쮍"'''L q'ߍ& 10& 1&9'9m1t' &0[91R'''& ꯍ< 6;).& 0OP1('ށ''& 0н&0'čᡀ'&0&lͦɁ[&0$1T& 'Z  Z&:uo&4% 950V X' M99;A'U1m'''m&0 0 & BASIC Cross-Reference Table for---- LINE# REFERENCED FROM: ----- ----------------------------------------- VARIABLE REFERENCES ---- VAR. FOUND IN LINE # ---- -------------------------------------*** NO REFERENCES FOUND ****** NO VARIABLES FOUND ***REM#,;:.=+-*/ ^()<> ABSANDASCASATNCHAINCHR$CLOSECOSCVT$%CVT$FCVT%$CVTF$DATADATE$DEF\DIGITSDIMDPEEKDPOKEENDERLERRORERREXECEXPFIELDFNFORFREGETHEXIFINCH$INPUTINSTRINTKILLLEFT$LENLETLINELOGLSETMID$NEWNEXTNOTOLDONOPENORPEEKPIPOKEPOSPRINTPTRPUT READRECORDRENAMERESTORERETURNRIGHT$RNDRSETSGNSINSPCSQRSTEPSTOPSTR$SWAPTABTOUSINGUSRVALGOSUBGOTORESUMETHENELSEľ+03&4@1G4 1榠&2bnL ,#CDEHvzRLIDOCPXPE쀌'8''$'&3 3O 3_ 3 0 +Č05+945'~$4  5g+Ju!L&~m\*4tmR* oLD9ʡ'95'4&5 5 0X&Ć 50GOL &9 'u p0,oo:o '֡'B'b}'v'o'h'a'Z':U'x &n (^0lSO1&T}34@&Dn30j( JL4&QZ4Ӎ j&5541'⁀'Y '&& %l ll m*(m&aojj2b 0{jw 母fcma+ĦmV+ &瀧  &Ү404 :4_1a'4m+1!5\& 5;j&ll1D & '04 3 &4 m+Y5m+L&2b}1?04 '_m+0&s0j|5C '\%V_1mӡ/&V'&Z*49>5 1? с &4_%¡'\ &Z  ]'e4_3$j&5M&Z*45 3_ ρ '$%ơ'\ &Z7  401a &2b론&Z&aZS0Oa32b'?Z'1?& 2A1?&o9l84'4dl"5d j ؆\4 5Z&o t '!&'&14&5 0M'_Xoj % 'll{& [0ۦ ' qojG&,SE? ā &oA0/G5A 50ooooo oo #$99040o&54t4&P5m*=  9-21-81 * MOD '\' LINE SEPERATOR * MOD $C0 DEF FNX * MOD $D0 FNX(X) VER BRA VEREND FCC $81,' DCOMP V1.8 11-10-81' VEREND BRA START1 SFCB EQU $C840 WARMS EQU $CD03 GETCHR EQU $CD15 PUTCHR EQU $CD18 INBUFF EQU $CD1B PCRLF EQU $CD24 GET FIL EQU $CD2D SETEXT EQU $CD33 RPTERR EQU $CD3F FMS EQU $D406 PSTR EQU $CD1E FLEX PSTRNG ROUTINE FCB $FF ERRTYP FCB 00 FCB $FF C0VRSV FDB 0 CODE C0 VARIABLE SAVE O0 RMB 7 OPERAND OP RMB 1 OPER POWER R0 RMB 7 RESULT DECCNT RMB  1 DECIMAL CNT PTENPT RMB 2 POWER OF TEN SAVE EXPON RMB 2 DECIMAL EXPONENT DIGCNT RMB 1 DIGIT CNTR XSAVE RMB 2 DDIGIT RMB 1 OUTDEC SAVE ZFLAG RMB 1 OUTDEC ZERO FLAG DSKFLG RMB 1 DISK FLAG DIGSAV RMB 20 DIGIT SAVE AREA COUNT1 RMB 1   DECODE COUNTER BCOUNT RMB 1 BYTE COUNT OF LINE VEND RMB 2 VARIABLE TABLE END PUTCHX TST DSKFLG BEQ PUTCHY PSHS X LDX #WFCB JSR DOFMS PULS X,PC PUTCHY JMP PUTCHR PCRLFX LDA #$D TST DSKFLG BNE PUTCHX JMP PCRLF START1 LDX #LINEIN JSR PSTR CLR DSKFLG CLR COUNT1 LDX #SFCB JSR GETFIL BCS RPTER1 ERROR LDA #8 .BAC EXT JSR SETEXT LDA #1 OPEN READ STA 0,X BSR DOFMS OPEN BSR DOFMS GET START $89 CMPA #$89 BNE CLOSE NOT .BAC LDA #$FF SET BINARY FILE STA 59,X SPACE COMPR FLAG BSR DOFMS STA BCOUNT FIRST BYTE COUNT LDX #ASKDSK JSR PSTR JSR GETCHR CMPA #'Y BNE SCROLL LDX #FILNAM JSR PSTR JSR INBUFF LDX #WFCB JSR GETFIL BCS RPTER1 LDA #3 .BAS DEFAULT JSR SETEXT LDA #2 OPEN WRITE STA 0,X BSR DOFMS INC DSKFLG SCROLL JSR PCRLF LDX #VTABLE STX VEND NLINE BSR GETLIN BSR OUTLIN BSR PCRLFX TST BCOUNT END? BEQ CLOSE BRA NLINE NEXT LINE DOFMS JSR FMS DO FMS CALL BEQ RTS2 RPTER1 JSR RPTERR CLOSE LDX #SFCB LDA #4 STA 0,X JSR FMS CLOSE FILE LDX #WFCB LDA #4 JSR FMS CLOSE FILE JMP WARMS GETLIN LDY #LINEIN GET LINE LDX #SFCB NCHR BSR DOFMS NEXT CHAR IN C COUNT1 SUBA COUNT1 DECODE STA 0,Y+ DEC BCOUNT LDB BCOUNT CMPB #$FF BNE NCHR CLR 0,-Y STA BCOUNT NEW BYTE CNT RTS OUTLIN LDX #LINEIN OUTPUT LINE BSR OUTDC1 LDA #$20 LBSR PUTCHX OUTLN1 BSR ENDLIN LDA 0,X C $881C,$EA14,$545C,$7586,-37 PTENE FDB $D9C7,$DCED,$53C7,$2282,-38 TENK FDB 10000,1000,100,10,1,0 NUMERR FCC 'NUMERICAL OR FILE ERROR!!',7,4 WFCB RMB 320 LINEIN FCC 'V1.8 *** DECOMPILER FOR TSC XBASIC ***',$D,$A,4 ASKDSK FCC 'BUILD A DISK FILE? (Y/N)',4 FILNAM FCC 'FILENAME? ',4 VTABLE EQU LINEIN+256 END VER  TTL BASIC CROSS REFERENCE 22-OCT-81 * * Copyright 1981 by Dick Bartholomew * and * Frank Hogg Laboratory, Inc. * 130 Midtown Plaza * Syracuse, NY 13210 * 315-474-7856 9am to 5pm EST * * CREATE CROSS-REFERENCE TABLE OF CONTROL * TRANSFERS AND LISTS ALL VARIABLES USED * SYNTAX= BASEREF, COLUMN EQU 12 COLUMNS ACROSS PAGE FCB1 EQU $C840 WARMS EQU $CD03 PUTCHR EQU $CD18 PSTRNG EQU $CD1E PCRLF EQU $CD24 GETFIL EQU $CD2D SETEXT EQU $CD33 OUTDEC EQU $CD39 RPTERR EQU $CD3F FMSCLS EQU $D403 FMS EQU $D406 START LBRA BEGIN * * WORK STORAGE BUFFER RMB 144 NAME RMB 80 BUFPTR RMB 2 REFFRM RMB 2 REFFLG RMB 1 COLNUM RMB 1 DECNUM RMB 2 PRENUM RMB 2 TABEND FDB TABLE LARGST FDB 1 LINNUM FDB 0 PASS FCB 0 VARLTR FCC "A" ORG $100 * BEGIN JSR PCRLF LDX #FCB1 JSR GETFIL BCS ERR1 LDA #3 .BAS Ext JSR SETEXT BSR OPEN BSR PTITLE LOOP BSR INLINE INPUT A BASIC LINE LBSR PARSE FIND REFERENCES BRA LOOP OPEN LDX #FCB1 LDA #1 OPEN TO READ STA ,X JSR FMS OPEN FILE BNE ERR1 RTS ERR1 JSR RPTERR DONE JSR PCRLF JMP WARMS PTITLE LEAX TITLE,PCR JSR PSTRNG BSR PNAME JSR PCRLF LEAX TITL2,PCR JMP PSTRNG PNAME LDX #FCB1+4 POINT TO NAME LDB #8 BSR PNAM1 LDA #'. JSR PUTCHR LDB #3 PNAM1 LDA ,X+ JSR PUTCHR DECB BNE PNAM1 RTS * INPUT A BASIC LINE TO BUFFER INLINE LEAX BUFFER,PCR LDA #13 CR LEAU NAME,PCR PSHS U INLIN1 STA ,X+ FILL BUFFER CMPX ,S  BNE INLIN1 LEAS 2,S FIX STACK LEAY BUFFER,PCR LDX #FCB1 INLIN2 JSR FMS GET NEXT CHAR BNE ERR2 CMPA #$20 SPACE? BEQ INLIN2 SKIP SPACES CMPA #'a BLT INLIN4 CMPA #'z BGT INLIN4 ANDA #$5F CONV TO U.C. INLIN4 STA ,Y+  PUT IN BUFFER CMPA #13 CR? BNE INLIN2 RTS ERR2 LDA 1,X CMPA #8 EOF? BNE ERR1 TST PASS,PCR BEQ PTABLE LBRA PRVARS * PRINT THE CROSS-REF TABLE PTABLE LEAX TABLE,PCR CMPX TABEND,PCR ANY REFS? BNE PRTABL LEAX NOREF S,PCR JSR PSTRNG BRA FINISH PRTABL CLR REFFLG,PCR SET LINE# NOT PRINTED LEAY TABLE,PCR PRT1 LDX ,Y CMPX LINNUM,PCR BEQ PRT3 PRT2 LEAY 4,Y CMPY TABEND,PCR BNE PRT1 LDX LINNUM,PCR CPX LARGST,PCR BEQ FINISH LEAX 1,X STX LINNUM,PCR BRA PRTABL PRT3 TST REFFLG,PCR BNE PRT4 JSR PCRLF TFR Y,X SET ADDRESS OF NUM LDB #COLUMN+1 STB COLNUM,PCR JSR OUTDEC BSR OUT2S LDA #': JSR PUTCHR INC REFFLG,PCR PRT4 TFR Y,X LEAX 2,X ADRS OF FROM REF BSR SETPST BCS PRT2 LDB #1 BSR CKCOL BSR OUT1S JSR OUTDEC BRA PRT2 SETPST LDU PRENUM,PCR CMPU ,X BEQ RTS2 LDU ,X STU PRENUM,PCR ANDCC #$FE RTS RTS2 ORCC #1 RTS * FINISH JSR PCRLF LEAX TABCOM,PCR JSR PSTRNG INC PASS,PCR LBRA VAREAD OUT8S BSR OUT4S OUT4S BSR OUT2S OUT2S BSR OUT1S OUT1S LDA #$20 JMP PUTCHR CKCOL DEC COLNUM,PCR BNE CKCOL2 JSR PCRLF BSR OUT8S LDA #COLUMN STA COLNUM,PCR CKCOL2 RTS GTLNUM LEAX BUFFER,PCR STX BUFPTR,PCR POSITION IN BUFFER BSR INPDEC GET LINE # STX REFFRM,PCR SAVE CURRENT LINE # RTS1 RTS PARSE BSR GTLNUM PARS2 LEAY WORDS,PCR PARS3 LDX BUFPTR,PCR LDA ,X CMPA #13 BEQ RTS1 BRA MATCH * BUMP TO NEXT WORD PARS5 LDA ,Y+ BNE PARS5 BRA PARS3 * BUMP TO NEXT POSN IN BUF PARS6 LEAX 1,X STX BUFPTR,PCR BRA PARS2 * X=POSN IN BUFFERR * Y=POSN IN WORD LIST MATCH LDA ,Y+ BEQ MATCH2 MATCH FOUND CMPA #$FF END OF WORDS? BEQ PARS6 NO MATCH FOUND CMPA ,X+ BEQ MATCH CONTINUE THRU WORD BRA PARS5 MATCH2 STX BUFPTR,PCR SAVE POSITION BSR INPDEC GET LINE # BNE PARS2 NO NUM FOUND MATCH3 LDY TABEND,PCR STX ,Y++ CMPX LARGST,PCR BMI MATCH4 STX LARGST,PCR MATCH4 LDX REFFRM,PCR STX ,Y++ STY TABEND,PCR * CHECK FOR ANOTHER REF FOR "ON GOTO/GOSUB" * LDX BUFPTR,PCR LDA ,X CMPA #', BNE PARS2 LEAX 1,X BRA MATCH2 * GET A DECIMAL NUMBER IMBEDDED IN TEXT * IF VALID NUM NOT FOUND, RETURNS 'NOT EQUAL' COND. * AND X=0... INPDEC CLR DECNUM,PCR BSR GETDIG GET 1ST DIGIT BEQ INP2 GET REST LDX #0 LDA #1 RTS INP2 STA DECNUM+1,PCR INP3 BSR NXTDIG BEQ INP3 LEAX -1,X STX BUFPTR,PCR SAVE NEXT POSN LDX DECNUM,PCR CLRA RTS NXTDIG BSR GETDIG BEQ ADDNUM RTS ADDNUM PSHS X,A LDX #9 LDD DECNUM,PCR ADD1 ADDD DECNUM,PCR MULT BY 10 LEAX -1,X BNE ADD1 STD DECNUM,PCR LDD #0 PULS B ADDD DECNUM,PCR ADD NEW DIGIT STD DECNUM,PCR PULS X CLRA RTS GETDIG LDA ,X+ GET CHAR SUBA #'0 BLT GETD1 CMPA #9 BGT GETD1 CLRB VALID DIGIT FOUND RTS GETD1 LDB #$FF NOT A DIGIT RTS * RE-READ FILE & GET ALL VARIABLES VAREAD JSR FMSCLS CLOSE FILE LBSR OPEN OPEN AGAIN LEAX TABLE,PCR STX TABEND,PCR RESET POINTER VARD2 LBSR INLINE GET 1 BASIC LINE LBSR GTLNUM GET LINE # VARD4 LDX BUFPTR,PCR VARD5 LDA ,X CMPA #13 CR? BEQ VARD2 DONE WITH CURRENT LINE BSR TSTREM IS IT REMARK BEQ VARD2 SKIP REST OF LINE LDX BUFPTR,PCR LDA ,X CMPA #34 DOUBLE QUOTE? BEQ SKPQUT CMPA #39 SINGLE QUOTE? BEQ SKPQUT LBSR INPDEC DECIMAL NUMBER? BEQ VARD4 SKIP IT BSR TSTDEL DELIMITER BNE VARD4 SKIP IT BRA TSTKEY KEYWORD? * SKIP BETWEEN QUOTES SKPQUT LEAX 1,X SKPQ2 CMPA ,X+ BNE SKPQ2 BUMP TO NEXT QUOTE STX BUFPTR,PCR SAVE POINTER BRA VARD5 * TEST FOR REMARK TSTREM LEAY REMWRD,PCR TSTRM1 LDA ,Y+ BNE TSTRM2 RTS MATCH FOUND TSTRM2 CMPA ,X+ BEQ TSTRM1 CONTIN THRU WORD RTS NO MATCH * TEST FOR DELIMITER & SKIP IT TSTDEL LDX BUFPTR,PCR LEAY DELTAB,PCR TSTDL2 LDA ,Y+ BEQ TSTDL4 END OF TAB/NO MATCH CMPA ,X BNE TSTDL2 TRY ANOTHER LEAX 1,X STX BUFPTR,PCR TSTDL4 RTS * FIND KEY WORDS & SKIP THEM TSTKEY LEAY KEYWRD,PCR TSTKY2 LDX BUFPTR,PCR TSTKY3 LDA ,Y+ BEQ TSTKY5 MATCH FOUND CMPA #$FF END OF TABLE? BEQ VARSTR NOT A KEY WORD CMPA ,X+ BEQ TSTKY3 CONTINUE * BUMP TO NEXT WORD TSTKY4 L DA ,Y+ BNE TSTKY4 BRA TSTKY2 TSTKY5 STX BUFPTR,PCR SKIP WORD BRA VARD5 * SAVE THE VARIABLE NAME & LINE# VARSTR LDX BUFPTR,PCR LDY TABEND,PCR LDA ,X+ STA ,Y+ STX BUFPTR,PCR STY TABEND,PCR BSR TSTDEL BNE VARST2 BRA  FNDKEY VARST2 LEAX -1,X STX BUFPTR,PCR BUMP BACK TO DELIM VARST3 CLRA LDY TABEND,PCR STA ,Y+ LDX REFFRM,PCR STX ,Y++ STY TABEND,PCR LBRA VARD4 FNDKEY LEAY KEYWRD,PCR FNDK2 LDX BUFPTR,PCR FNDK3 LDA ,Y+ BEQ VARST3 MATCH  FOUND CMPA #$FF END OF TABLE? BEQ VARSTR KEY NOT FOUND CMPA ,X+ BEQ FNDK3 * BUMP TO NEXT KEY FNDK4 LDA ,Y+ BNE FNDK4 BRA FNDK2 NOVARS LEAX NOVFND,PCR JSR PSTRNG LBRA DONE * PRINT VARIABLE TABLE * CHECK 1ST LETTER MATCH  PRVARS LEAX TABLE,PCR CPX TABEND,PCR BEQ NOVARS LDA VARLTR,PCR PRVR2 CMPA ,X+ BEQ PRVR6 FOUND IT * BUMP TO NEXT VAR PRVR4 LDB ,X+ BNE PRVR4 LEAX 2,X SKIP OVER ADDRS CPX TABEND,PCR END? BNE PRVR2 TRY NEXT INC VARL TR,PCR BUMP TO NEXT LTR LDA VARLTR,PCR CMPA #$5B Z+1? BNE PRVARS DO NEXT LTR LBRA DONE TABLE COMPLETED PRVR6 LEAX -1,X STX BUFPTR,PCR JSR PCRLF * SAVE VAR NAME & PRINT IT LEAY NAME,PCR PRVR8 LDA ,X+ STA ,Y+ BNE PRVR8 LDX BUFPTR,PCR LDB #COLUMN+1 STB COLNUM,PCR LDB #7 ALLOW 7 CHARS PRVR10 LDA ,X+ BEQ PRVR12 JSR PUTCHR DECB BRA PRVR10 PRVR12 ANDB #7 LDA #$20 JSR PUTCHR DECB BNE PRVR12 LDA #': JSR PUTCHR * PRINT REF LINE # PRREF LDX BUFPTR,PCR CLR ,X+ DELETE FROM TABLE PRREF2 LDA ,X+ BNE PRREF2 PSHS X BSR SETPS1 BCS PROUT LDB #1 LBSR CKCOL LBSR OUT1S JSR OUTDEC PROUT PULS X LEAX 2,X STX BUFPTR,PCR BRA SERNAM SETPS1 LDU PREN UM,PCR CMPU X BEQ RTS3 LDU X STU PRENUM,PCR ANDCC #$FE RTS RTS3 ORCC #1 RTS * * SEARCH FOR ANOTHER VAR OF SAME NAME SERNAM LDX BUFPTR,PCR SERN1 CPX TABEND,PCR LBEQ PRVARS SERN2 LEAY NAME,PCR TST ,X DELETED? BEQ SERN!6 SERN3 LDA ,X+ BEQ SERN7 END OF VAR FOUND CMPA ,Y+ MATCH? BEQ SERN3 * BUMP TO NEXT VAR SERN4 TST ,X+ BNE SERN4 SERN5 LEAX 2,X SKIP LINE# STX BUFPTR,PCR BRA SERN1 SERN6 LEAX 1,X BRA SERN4 SERN7 CMPA ,Y END OF NAME" ALSO? BNE SERN5 BRA PRREF TITLE FCC 'BASIC Cross-Reference Table for---- ',4 TITL2 FCC 'LINE# REFERENCED FROM:',13,10,0,0 FCC '----- -------------------------------------',4 TABCOM FCC '---- VARIABLE REFERENCES ----',13,10,0,0 FCC #'VAR. FOUND IN LINE #',13,10,0,0 FCC '---- -------------------------------------',4 NOREFS FCC '*** NO REFERENCES FOUND ***',4 NOVFND FCC '*** NO VARIABLES FOUND ***',4 REMWRD FCC 'REM',0 DELTAB FCC '#,;:.=+-*/ ^()<>',13,0 * * TABLE OF KEY WO$RDS KEYWRD FCC 'ABS',0 FCC 'AND',0 FCC 'ASC',0 FCC 'AS',0 FCC 'ATN',0 FCC 'CHAIN',0 FCC 'CHR$',0 FCC 'CLOSE',0 FCC 'COS',0 FCC 'CVT$%',0 FCC 'CVT$F',0 FCC 'CVT%$',0 FCC 'CVTF$',0 FCC 'DATA',0 FCC 'DATE$',0 %FCC 'DEF',0 FCC 'DIGITS',0 FCC 'DIM',0 FCC 'DPEEK',0 FCC 'DPOKE',0 FCC 'END',0 FCC 'ERL',0 FCC 'ERROR',0 FCC 'ERR',0 FCC 'EXEC',0 FCC 'EXP',0 FCC 'FIELD',0 FCC 'FN',0 FCC 'FOR',0 FCC 'FRE',0 FCC 'GET',0 F&CC 'HEX',0 FCC 'IF',0 FCC 'INCH$',0 FCC 'INPUT',0 FCC 'INSTR',0 FCC 'INT',0 FCC 'KILL',0 FCC 'LEFT$',0 FCC 'LEN',0 FCC 'LET',0 FCC 'LINE',0 FCC 'LOG',0 FCC 'LSET',0 FCC 'MID$',0 FCC 'NEW',0 FCC 'NEXT',0 F'CC 'NOT',0 FCC 'OLD',0 FCC 'ON',0 FCC 'OPEN',0 FCC 'OR',0 FCC 'PEEK',0 FCC 'PI',0 FCC 'POKE',0 FCC 'POS',0 FCC 'PRINT',0 FCC 'PTR',0 FCC 'PUT',0 FCC 'READ',0 FCC 'RECORD',0 FCC 'RENAME',0 FCC 'RESTORE',0 (FCC 'RETURN',0 FCC 'RIGHT$',0 FCC 'RND',0 FCC 'RSET',0 FCC 'SGN',0 FCC 'SIN',0 FCC 'SPC',0 FCC 'SQR',0 FCC 'STEP',0 FCC 'STOP',0 FCC 'STR$',0 FCC 'SWAP',0 FCC 'TAB',0 FCC 'TO',0 FCC 'USING',0 FCC 'USR',0 )FCC 'VAL',0 * TABLE OF BASIC Control Transfer Words WORDS FCC 'GOSUB',0 FCC 'GOTO',0 FCC 'RESUME',0 FCC 'THEN',0 FCC 'ELSE',0 FCB $FF * TABLE EQU * * END START  TTL RESIDENT BASIC LINE EDITOR * * 9/07/81: LAST REVISION DATE * * ********************* * *----- WARNING -----* ***************************************************************** * THIS PROGRAM DOES A LOAD AND AUTO-MOVE TO A NEW LOCATION * FOR EXE CUTION. IF ANY CHANGES ARE BEING MADE TO THE SOURCE * CODE, IT IS NECESSARY THAT ALL 'RELATIVE' INSTRUCTIONS BE * USED. NO JMP'S OR JSR'S ALLOWED NOR ABSOLUTE LOAD & STORE * ADDRESSES *****************************************************************  * **************************************************************** * THIS PROGRAM INITIALLY LOADS INTO THE BASIC BUFFER AREA. * AFTER DETERMINING THE FLEX MEMEND ADDRESS, IT MOVES * ITSELF TO THE TOP OF MEMORY MINUS 2K FOR ITSELF. FLEXS' * MEMEND IS T HEN ADJUSTED AND PROGRAM EXECUTION CONTINUES AT * THE NEW ADDRESS. UPON EXITING BASIC WITH THE "FLEX" COMMAND, * THE MEMEND ADDRESS IS RESTORED TO THE ORIGINAL VALUE. * IF EXITING WITH THE "EXIT" COMMAND, MEMEND IS NOT RE-SET ************************* *************************************** * **************************************************************** * CONSIDERING THAT THE SEQUENCE OF COMMAND CODES IN THIS PROGRAM * USE THE ESCAPE CHAR, EITHER THE EDITOR ESCAPE CHARACTER MUST * BE CHANGED TO A NOTHER OR THE FLEX TTYSET PAUSE CHARACTER MUST * BE OTHER THAN THE ESCAPE CHAR. RECOMMEND THE DELETE (7F) CHAR * FOR FLEXS' TTYSET PAUSE. *************************************************************** * * REPLACED VECTORS ARE: (CODE); 7E CD15, 7E CD18 * BD CD24 7E CD03 * * EDIT COMMANDS ARE AS FOLLOWS: * * ENTER EDIT MODE - ESC E * EXIT EDIT MODE W/CHANGE - ESC X * CURSOR RIGHT - R * CURSOR LEFT - L * INSERT CHARACTER - I * DELETE CHARACTER - D * OVERLAY CHARACTER - O * RE-PRINT LINE - P * CHANGE STRING - C * ABORT EDIT MODE - X * * FLEX SUBROUTINE LINKAGES * BCOLDS EQU 0 BASIC COLD START ADDRESS FLEX EQU $CD00 WARMS EQU FLEX+3 OUTCHV EQU FLEX+16 GETCHR EQU FLEX+21 PUTCHR EQU FLEX+24 PCRLF EQU FLEX+36 TTYPAU EQU $CC0A F LEX PAUSE CHARACTER MEMEND EQU $CC2B FLEX MEMORY END LOCATION ESCRET EQU $CC16 ESCAPE RETURN ADDR * CR EQU $D CARRIAGE RETURN CODE LF EQU $A LINE FEED CODE CRLF EQU $0D0A CR/LF COMBINATION ESC EQU $1B ESCAPE CODE BELL EQU 7 RING TERM INAL BELL CODE SPACE EQU $20 SPACE CHARACTER CODE MAXCTL EQU $1F MAX CONTROL CODE MAXASC EQU $7F MAXIMUM ASCII CHAR ALLOWED TO BE ENTERED * MAXSTR EQU 32 MAXIMUM # OF CHARS ALLOWED IN STRING CHANGE MAXLNE EQU 128 MAXIMUM # OF CHARS ALLOWED I N LINE BUFFER * ORG $8000 ONLY NEEDED FOR INITIAL LOAD OF PROGRAM * MAY BE ANY ADDRESS THAT DOES NOT INTERFERE * WITH BASIC ITSELF, WHERE THERE IS AT LEAST * 2K CONTINUOUS MEMORY AVAILABLE * ******************** INITIALIZATION ROUTINE ********** *************** * START LDX MEMEND FIND OUT WHERE TO EXECUTE THIS PROGRAM LEAX -$8FF,X MAKE ROOM FOR THIS PROGRAM TFR X,Y TFR X,U LEAU START1-START,U NEW START ADDRESS PSHS U LEAY PEND-START,Y 'Y' CONTAINS THE END ADDRESS PSHS  Y LEAY START,PCR INITIAL PROGRAM LOAD ADDRESS ST1 LDA ,Y+ TRANSFER PROGRAM UP STA ,X+ CMPX ,S BNE ST1 LEAS 2,S FIX STACK WHEN FINISHED JMP [,S++] RESTART PROGRAM AT NEW ADDRESS * START1 BSR REPVEC REPLACE VECTORS LDA TTYPAU GET TTYSET PAUSE CHARACTER STA PAUSE,PCR SAVE FOR FUTURE USE LDD OUTCHV SAVE OUTCH I/O VECTOR ADDRESS STD SAVVEC,PCR JMP BCOLDS GO TO BASIC COLD START * * THESE CODES ARE XMITTED TO THE TERMINAL * FDB $FFFF HELPFUL TO LOCATE TABLE IN RAM PORT FDB $E004 CONTROL PORT ADDRESS (STATUS REG SIDE) CURGHT FDB $1B43 CURSOR RIGHT CONTROLS CURLFT FDB $1B44 CURSOR LEFT CONTROLS HOMCLR FDB $1B45 HOME CURSOR & CLEAR SCREEN HOME FDB $1B48 HOME CURSOR, NO SCREEN ERASE WRPRND FDB $1B76 ENABLE CURSOR WRAP AROUND AT END OF LINE EXIT FDB $1B7A RESET TERMINAL UPON EXIT CODE * * THESE CODES ARE TYPED BY THE USER * LEADIN FCB ESC LEAD-IN CHAR TO SCREEN CRIGHT FCB 'R CURSOR RIGHT COMMAND FROM KEYBOARD CLEFT FCB 'L CURSOR LEFT COMMAND FROM KEYBOARD INSERT FCB 'I INSERT CHARACTER CODE DELETE FCB 'D DELETE CHARACTER CODE OVRLAY FCB 'O OVERLAY CHARACTERS CODE CHANGE FCB 'C CHANGE STRING CODE PRINT FCB 'P PRINT BUFFER CODE ABORT FCB $18 ABORT EDIT CODE CHKTX FCB 'X UPDATE BASIC CODE TERM FCB 3 ^C TO TERMINATE COMMAND MODES DONE FCB ESC ESCAPE CODE PART OF COMMAND BKSPAC FCB $08 BACKSPACE & DELETE CHAR LNEWTH FCB 80 CHARACTER LINE WIDTH OF TERMINAL EDTMOD FCB 'E ESC E TO ENTER EDIT MODE FDB $FFFF END OF ALTERABLE RAM * * THESE FLAGS ARE UTILIZED TO CONTROL PROGRAM FLOW * SAVVEC FDB 0 CURRENT OUTCH I/O VECTOR ADDRESS PAUSE FCB 0 PAUSE CHAR TO STOPPING LISTING OLDMEM FDB 0 CURRENT MEMORY END LOCATION INEDIT FCB 0 IF MINUS, IN EDIT M ODE LBUFPT FDB 0 ADDRESS INTO EDITOR LINE BUFFER LBFEND FDB 0 LAST CHARACTER IN LINE BUFFER VALID BUFPTR FDB 0 CURRENT LINE CHAR POINTER EOLFLG FCB 0 LINE BEING SAVED FLAG CHRBUF FCB 0 1ST CHAR OF TWO CHAR COMMAND ASCFLG FCB 0 ASCII RECEIVE D EDTFLG FCB 0 GO EDIT UPDATE FCB 0 RE-XMIT LINE TO BASIC ESCFLG FCB 0 SET TILL VALID COMMAND VERIFIED SEPCHR FCB 0 CHANGE COMMAND SEPERATOR CHAR NOPRNT FCB 0 SUPPRESS RE-PRINTING LINE BKFLAG FCB 0 PREVIOUS ERROR FLAG COUNT FCB 0 NUMBER  OF CHARS TYPED IN INSERT MODE CURPOS FCB 0 CHARACTER POSITION ON THE CURRENT LINE ECHO FCB 0 ECHO/NO-ECHO INPUT LNFLG FCB 0 PAUSE AT CR ONLY CHRCNT FCB 0 NUMBER OF CHARS IN BUFFER FCB 1 VERSION * * SEARCH FOR INPUT & OUTPUT VECTORS AND RE PLACE WITH * THE APPROPRIATE VECTORS THRU THIS PROGRAM * REPVEC LDX #0 START FROM BASE PAGE 0 CONT LDD ,X+ CHECK TWO BYTES, ONE BYTE AT A TIME CMPX #$FFF LAST LOCATION TO CHECK BEQ CONT1 CMPD #WARMS CHECK FOR EXIT TO FLEX ADDRESS BEQ  GOTEXT CMPD #GETCHR CHECK FOR FLEX GETCHR VECTOR ADDRESS BEQ GOTINP IF FOUND CMPD #PCRLF FIND FLEX PCRLF VECTOR BEQ GOTCR CMPD #PUTCHR CHECK FOR FLEX PUTCHR VECTOR ADDRESS BNE CONT IF NO LEAU BPUT,PCR ADDRESS TO REPLACE WITH STU -1,X TO ALLOW FOR AUTO INCREMENT BRA CONT GO TILL END OF SEARCH RANGE * GOTEXT LEAU BOUT,PCR ADDRESS TO REPLACE WITH STU -1,X ALLOW FOR AUTO-INCREMENT BRA CONT * GOTINP LEAU BGET,PCR ADDRESS TO REPLACE WITH STU -1,X ALLOW FOR AUTO INCREMENT BRA CONT * GOTCR LEAU BCRLF,PCR ADDRESS TO REPLACE WITH STU -1,X BRA CONT * CONT1 LEAX LBUFER,PCR SET LBUFPT TO BEGINNING OF BUFFER STX LBUFPT,PCR POINT TO BEGINNING OF BUFFER STX LBFEND,PCR POINT END TO BEGINNING TO SHOW EMPTY LDX MEMEND SAVE OLD MEMORY END LOCATION STX OLDMEM,PCR LEAX START-1,PCR CHANGE FLEX MEMEND LOCATION STX MEMEND RTS * ******************** REPLACEMENT PCRLF ROUTINE ******************** * BCRLF PSHS A,B LDD OUTCHV CMPD SAVVEC,PCR PULS A,B BEQ DOFCL JMP PCRLF DOFCL PSHS A SAVE FOR RETURN LDA #-1 STA EOLFLG,PCR TELL CHAR COLLECTOR ROUTINE OF CR/LF LDA #CR LBSR BPUT PRINT IT LDA #LF LBSR OUTCHR PRINT BOTH CR & LF PULS A,PC RESTORE AND RETURN * * EXIT FROM BASIC GOES THRU THIS ROUTINE TO RESTORE MEMEND IN * FLEX, AND RESET TERMINAL. * BOUT LDX OLDMEM,PCR PICK UP OLD MEMEND ADDRESS STX MEMEND LDD EXIT,PCR RE-SET TERMINAL TO POWER UP CONFIG LBSR PUTTWO BDEL LBRN BDEL INCA WAIT TILL TERMINAL CLEARED BNE BDEL JMP WARMS * ****************** REPLACEMENT GETCHR ROUTINE ********************** * BGET TST UPDATE,PCR SEE IF LINE SHOULD BE SENT TO BASIC BPL BGET5 IF NO PSHS B,X,Y,U SAVE ALL LBRA DABRT4 YES, CONTINUE SENDING LINE TO BASIC * BGET5 TST ESCFLG,PCR IF MINUS, INVALID COMMAND ENTERED BPL BGET1 CLR ESCFLG,PCR CLEAR FOR NEXT TIME LDA CHRBUF,PCR GET PREVIOUSLY SAVED CHARACTER RTS CARRY CHAR BACK TO BASIC * BGET1 LBSR  INCHAR USE INTERNAL I/O TO GET EACH CHARACTER CMPA LEADIN,PCR DO WE WANT EDIT MODE? BEQ DOEDIT IF YES BGETOT RTS * DOEDIT STA CHRBUF,PCR SAVE ESCAPE CHAR IF INVALID COMMAND LBSR INCHAR GET SECOND BYTE FROM FLEX CMPA EDTMOD,PCR MUST B!E VALID TO ENTER EDIT MODE BEQ DEDIT1 PASTWO PSHS A,B SAVE B & CURRENT CHAR LDA CHRBUF,PCR GET LAST CHAR SAVED PULS B GET CURRENT CHAR INTO B STB CHRBUF,PCR SWAP WITH PREVIOUS CHAR LDB #-1 STB ESCFLG,PCR SET FOR NEXT GETCHR CALL" PULS B,PC RESTORE ORIGINAL CONTENTS OF B * DEDIT1 LDA #-1 STA INEDIT,PCR INDICATE IN EDIT MODE LBRA INCHAR RETURN WITH VALID CHAR FOR BASIC * ****************************************************************** * * THE FOLLOWING ROUTINE OUT#PUTS SEVERAL FUNCTION CODES TO SET UP * THE PARTICULAR TERMINAL BEING USED. IF THE FUNCTION DOES NOT * EXIST IN YOUR TERMINAL, SIMPLY ENTER ZEROES IN THE FDB TABLE IN * THE BEGINNING OF THE SOURCE. IF MORE FUNCTIONS ARE NEEDED, THE * SOURCE CAN SIMPL$Y BE RE-EDITED WITH ADDITIONS BEING MADE. * DEDIT5 LDD WRPRND,PCR CURSOR WRAP AROUND AT END OF LINE LBSR PUTTWO LDD HOMCLR,PCR CLEAR SCREEN & HOME CURSOR LBSR PUTTWO BSR CNTCHR FIND NUMBER OF CHARS IN BUFFER STA CHRCNT,PCR AND SAVE FOR% FUTURE REFERENCE LEAX LBUFER,PCR PRINT CONTENTS OF LINE BUFFER CMPX LBFEND,PCR SEE IF ANY CODE TO EDIT BNE DEDIT6 LBSR DOABRT INDICATE ABORTED MODE LDA #CR RETURN WITH CARRIAGE RETURN CHARACTER BEXIT PULS B,X,Y,U,PC RESTORE ALL AND & RETURN TO NORMAL BASIC * * DETERMINE HOW MANY CHARS ARE IN LINE BUFFER TO BE EDITED * AND KEEP TRACK THROUGH-OUT PROGRAM * CNTCHR LEAX LBUFER,PCR POINT TO FIRST CHAR CLRA EMPTY CHAR COUNTER CNT1 LDB ,X+ TEST FOR CR'S INCA CMPB #CR BNE  'CNT1 RTS LEAVE WITH TOTAL INCLUDING CR * DEDIT6 LDA ,X+ CMPA #CR BEQ DEDIT3 IF END OF LINE LBSR OUTCHR BRA DEDIT6 * DEDIT3 LBSR OUTCHR SEND CURSOR TO BEGINNING OF LINE DED LEAX LBUFER,PCR POINT INDEX TO FIRST CHARACTER LDD HOME, (PCR LBSR PUTTWO LBSR RNGBEL INDICATE BEGINNING OF BUFFER CLR CURPOS,PCR START WITH CHAR POS 0 DEDIT4 CLR COUNT,PCR LDA #-1 TURN OFF CHAR ECHO STA ECHO,PCR LBSR INCHAR GET COMMAND CHARACTER CLR ECHO,PCR CMPA #CR IF MISTAKEN  )KEY BEQ DEDIT3 * * DO THE COMPARES FOR EACH CONTROL COMMAND CHARACTER TO * DETERMINE WHAT NEEDS TO BE DONE * DEDA CMPA CRIGHT,PCR CURSOR RIGHT BEQ DORGHT DO CURSOR RIGHT CMPA CLEFT,PCR CURSOR LEFT BEQ DOLEFT DO CURSOR LEFT CMPA INSE *RT,PCR INSERT CHARACTER LBEQ DOINS DO INSERT CMPA DELETE,PCR DELETE CHARACTER LBEQ DODEL DO DELETE CMPA OVRLAY,PCR OVERLAY CHARACTERS LBEQ DOOVR DO OVERLAY CMPA CHANGE,PCR CHANGE STRING LBEQ DOCHG DO CHANGE CMPA PRINT,PCR R+E-PRINT LINE LBEQ DOPRT DO PRINT CMPA ABORT,PCR ABORT EDIT MODE LBEQ DABRT1 DO ABORT CMPA DONE,PCR TEST FOR ESCAPE LBEQ CHKX GO CHECK FOR AN X TO EXIT WITH UPDATES BSR RNGBEL INDICATE INVALID COMMAND CODE ENTERED BRA DEDIT4 ,INVALID, GO TRY AGAIN * * MOVE THE CURSOR ONE POSITION TO THE RIGHT & BUMP THE BUFFER POINTER. * IF THE CURSOR IS POINTING TO THE CR AT THE END OF THE LINE, THE * BELL RINGS, AND THE CURSOR REMAINS WHERE IT WAS * DORGHT LDA ,X TEST IF END OF LINE C-MPA #CR BNE C1 INDICATE END OF LINE BSR RNGBEL BRA DEDIT4 * C1 LDD CURGHT,PCR BSR PUTTWO PRINT CHARACTER SEQUENCE FOR TERMINAL LEAX 1,X MOVE POINTER TO NEXT CHARACTER INC CURPOS,PCR UPDATE POSITION COUNTER * * TEST FOR END OF L.INE & DO A CR/LF IF SO * ELSE, LEAVE CURSOR ON SAME LINE * LDA CURPOS,PCR CMPA LNEWTH,PCR IS IT END OF LINE? BNE DEDIT4 LBSR DOCRLF LBRA DEDIT4 * * MOVE THE CURSOR ONE POSITION TO THE LEFT & BUMP THE BUFFER POINTER * IF THE CURSOR IS ON/ THE FIRST POSITION, THE BELL RINGS AND THE * CURSOR REMAINS WHERE IT WAS. * DOLEFT LEAU LBUFER,PCR LOAD ADDR OF BUFFER PSHS U PUT ON STACK TO WORK WITH CMPX ,S++ IS IT EQUAL TO X? BNE D1 IF YES BSR RNGBEL LBRA DEDIT4 * D1 LDD CUR0LFT,PCR PUT OUT CURSOR LEFT CODE TO TERMINAL BSR PUTTWO LEAX -1,X POINT TO PREVIOUS CHARACTER * * KEEP TRACK OF THE POSITION OF THE LAST CHARACTER * IN THE LINE BUFFER TO DETERMINE WHEN 128 CHARACTERS * HAVE BEEN ENTERED * DEC CURPOS,PCR L1DA LNEWTH,PCR GET WIDTH OF SCREEN DECA PSHS A LDA CURPOS,PCR SEE IF CURSOR MUST GO UP A LINE CMPA ,S+ AND FIX STACK AT SAME TIME LBNE DEDIT4 LDD HOME,PCR BSR PUTTWO SET CURSOR TO BEGIN OF LINE LDB LNEWTH,PCR CHAR COUNTER 2DECB ONLY NEED TO SPACE LNEWTH-1 POSITIONS PSHS B DOLT1 LDD CURGHT,PCR BSR PUTTWO SEND CURSOR TO END OF LINE DEC ,S BNE DOLT1 PULS B FIX STACK LBRA DEDIT4 * * PRINT THE TWO CHARACTERS IN THE A & B REGISTERS, A 1ST * PUTTWO LBSR 3OUTCHR TFR B,A LBRA OUTCHR * * RING THE BELL ON THE TERMINAL TO INDICATE AN ERROR CONDITION * RNGBEL LDA #BELL LBRA OUTCHR * * INSERT A CHARACTER INTO THE CURRENT LINE. USER REMAINS IN INSERT * MODE UNTIL THE TERMINATOR COMMAND IS TYPED. AS 4A CHARACTER IS * TYPED, THE REMAINDER OF THE LINE MOVES ONE POSITION TO THE RIGHT. * THE COMMAND MAY ALSO BE TERMINATED WITH A CR. THIS WILL POSITION * THE CURSOR TO THE BEGINNING OF THE LINE AND POINT THE LINE BUFFER * POINTER TO THE FIRST CHARACTER 5IN THE LINE * DOINS PSHS X TEST FOR END OF BUFFER LEAY LBUFER+MAXLNE,PCR CMPY ,S++ BEQ T3 * * IF A MATCH, INDICATES THE BUFFER IS FULL WITH THE * MAXIMUM 128 CHARACTERS * LDA CHRCNT,PCR SEE IF BUFFER IS FULL CMPA #MAXLNE BEQ T3 * 6DOINSA LBSR INCHAR GET CHAR TO INSERT OR TERMINATOR CMPA #CR LBEQ DED CMPA TERM,PCR TERMINATE WITH CURRENT LINE POINTER POSITION BNE B7 T3 BSR RNGBEL INDICATE END OF COMMAND LBRA DEDIT4 * B7 CMPA BKSPAC,PCR IF ERROR BNE B1 7LDA #-1 STA BKFLAG,PCR BRA B3 * B1 LBSR CLASS BCS DOINSA INC COUNT,PCR UPDATE CHAR ENTERED COUNT * B3 BSR DOINSC * * UPDATE THE POSITION OF THE LAST CHARACTER IN THE * BUFFER AND ALSO THE TOTAL NUMBER OF CHARACTERS IN * THE BUFFER *  8INC CURPOS,PCR KEEP TRACK OF CURSOR POSITION INC CHRCNT,PCR UPDATE CHAR TOTAL BRA DOINS * DOINSC TST BKFLAG,PCR BPL B2 TST COUNT,PCR MAKE SURE SOME CHAR HAVE BEEN ENTERED BNE B4 LDD CURGHT,PCR BSR PUTTWO MOVE CURSOR BACK FOR 9WARD IN COUNT ZERO BSR RNGBEL INDICATE ERROR DOINSD CLR BKFLAG,PCR DEC CURPOS,PCR FIX UP COUNTERS DEC CHRCNT,PCR LEAS 2,S REMOVE RETURN ADDRESS BRA DOINS * B4 LEAX -1,X FIX BUFFER POINTER BACK ONE CHAR BSR DODELB DEC COUNT,P :CR UP CHAR COUNTER BRA DOINSD * B2 STX BUFPTR,PCR SAVE POINTER POSITION DOINS2 LDB ,X+ RE-PRINT REST OF LINE STB CHRBUF,PCR SAVE EACH CHAR ONE PASS STA -1,X REPLACE OLD WITH NEW TFR B,A TST NOPRNT,PCR SHALL WE PRINT? BMI A1  ;LBSR OUTCHR RE-PRINT LINE A1 LDA ,X SAVE NEXT CHAR TST NOPRNT,PCR BMI A2 LBSR OUTCHR PRINT CHAR IN 'A' A2 CMPA #CR BNE DOINS7 STB ,X+ STORE LAST CHAR BEFORE CR STA X PUT CR IN BUFFER AT END OF STRING BRA DOINS8 * DOINS7  ,Y UPDATE BUFFER POINTER PULS B INCB CMPB S BNE DOINS3 LBSR DOCRLF BRA DOINS3 * DOINS6 PULS B,Y,PC FIX STACK BEFORE LEAVING * * DELETE A CHARACTER POINTED TO BY THE CURSOR. EACH TIME A 'D' IS * TYPED, THE CHARACTER DISAPPEARS AND T?HE REMAINDER OF THE LINE * MOVES ONE POSITION TO THE LEFT * DODEL BSR DODELB LBRA DEDIT4 * DODELB DEC CHRCNT,PCR UPDATE LINE CHAR TOTAL BNE U2 INC CHRCNT,PCR LBRA RNGBEL IF NO CHARS, RETURN * U2 INC CHRCNT,PCR LEAY LBUFER,PCR NEE@D POINTER TO END OF STRING DODEL1 LDA ,Y+ FIND CR CMPA #CR BNE DODEL1 IF NOT FOUND LDA X GET IF TERMINATOR CMPA #CR LBEQ RNGBEL LEAX 1,X POINT TO NEXT CHARACTER AFTER DEL'D CHAR STX BUFPTR,PCR SAVE POINTER POSITION PSHS Y A PUSH LINE END POINTER LEAU -1,X DODEL2 LDA ,X+ RE-PRINT REST OF LINE CMPA #CR TEST FOR END OF LINE BNE DODEL4 PSHS A LDA #SPACE ERASE LAST CHAR ON SCREEN TST NOPRNT,PCR SHALL WE PRINT? BMI A4 IF NO LBSR OUTCHR A4 PULS A B DODEL4 STA ,U+ PACK LINE BUFFER DOWN ONE CHAR TST NOPRNT,PCR BMI A5 LBSR OUTCHR A5 CMPX ,S ARE WE AT END OF LINE? BNE DODEL2 DODEL9 LEAS 2,S FIX STACK LDD HOME,PCR START CURSOR ON TOP LINE, 1ST POSITION LBSR PUTTWO LDY BUF CPTR,PCR WHERE TO PUT CURSOR LEAY -1,Y BACK UP ONE CHAR LEAX LBUFER,PCR BEGIN ADDRESS OF BUFFER PSHS Y WHERE TO MOVE TO CMPX ,S BEQ A7 DODEL3 LDD CURGHT,PCR SKIP CURSOR OVER LINE TO POINTER LOCATION TST NOPRNT,PCR BMI A6 LBS DR PUTTWO A6 LEAX 1,X INCREMENT LINE POINTER CMPX ,S BNE DODEL3 A7 LDX BUFPTR,PCR PICK UP BUFFER POINTER AGAIN LEAX -1,X POINT TO CORRECT CHAR DEC CHRCNT,PCR PULS U,PC * * CHANGE THE 1ST OCCURANCE OF A STRING UP TO 32 CHARACTERS L EONG * WITH A NEW STRING OF FROM 0 TO 32 CHARACTERS LONG. A ZERO * AMOUNT IN THE NEW STRING WILL CAUSE A DELETION OF THE OLD STRING * THE COMMAND MAY BE ABORTED WITH A ^X. THE FIRST CHARACTER TYPED * AFTER THE COMMAND KEY WILL BE RECOGNIZED AS THE SEP FARATOR CHARACTER * AND MUST BE USED TO SEPARATE THE TWO STRINGS AND THE END OF THE * COMMAND. A CR MAY ALSO BE USED TO TERMINATE THE COMMAND * EX: C/OLD/NEW/ OR C/OLD/NEW(CR) * DOCHG LBSR DOCRLF LEAVE ROOM FOR DATA LBSR DOCRLF  LDA #'C  GLBSR OUTCHR INDICATE CHANGE MODE X1 LBSR INCHAR INPUT SEPARATOR CHAR CMPA #CR LBEQ DOPRT LBSR CLASS BCS X1 STA SEPCHR,PCR SAVE AWHILE E7 CLRB CHAR INPUTTED COUNTER LEAY OLDBUF,PCR STRING TO REPLACE * * READ IN STRING TO BE CHAN HGED * DOCHG1 LBSR INCHAR NOW INPUT STRING TO CHANGE CMPA ABORT,PCR IF WANTS TO END COMMAND BNE T1 LBSR RNGBEL INDICATE TERMINATION LBRA DOPRT * T1 CMPA BKSPAC,PCR IF USER WANTS TO CORRECT ENTRY BNE E1 DECB FIX CHAR COUNT BPL  IE8 PSHS B LDD CURGHT,PCR LBSR PUTTWO LBSR RNGBEL PULS B BRA E7 * E8 LBSR BAKSPC LEAY -1,Y FIX CHAR POINTER BRA DOCHG1 * E1 CMPA #CR TO DO A DELETE STRING BNE E1A PSHS B CLRB LBRA DOCHG3 E1A LBSR CLASS BCS  JDOCHG1 CMPA SEPCHR,PCR INDICATES END OF STRING TO CHANGE BEQ DOCHG2 * INCB UPDATE CHAR COUNTER CMPB #MAXSTR MAXIMUM ALLOWED BNE E1B DECB LDA BKSPAC,PCR ERASE LAST ENTRY LBSR OUTCHR LBSR BAKSPC FIX LINE DISPLAY LBSR RNGBEL K INDICATE ERROR CONDITION BRA DOCHG2 E1B STA ,Y+ PUT STRING IN BUFFER BRA DOCHG1 * DOCHG2 TSTB MUST HAVE SOME COUNT LBEQ DOPRT IF NOT, ABORT COMMAND PSHS B SAVE CHAR COUNT E6 CLRB PREPARE COUNTER AGAIN LEAU NEWBUF,PCR * * READ I LN STRING THAT WILL REPLACE PREVIOUS STRING * DOCHG5 LBSR INCHAR NOW INPUT STRING TO CHANGE TO CMPA ABORT,PCR BNE Y1 LBSR RNGBEL INDICATE TERMINATION PULS B FIX STACK LBRA DOPRT * Y1 CMPA BKSPAC,PCR SEE IF ERROR IN ENTRY BNE E4 M DECB BPL E10 PSHS B LDD CURGHT,PCR LBSR PUTTWO LBSR RNGBEL PULS B BRA E6 * E10 LBSR BAKSPC LEAU -1,U FIX CHAR POINTER BRA DOCHG5 * E4 CMPA #CR BEQ DOCHG3 LBSR CLASS BCS DOCHG5 CMPA SEPCHR,PCR TEST FOR TERMI NNATOR BEQ DOCHG3 * E3 INCB UPDATE CHAR COUNTER CMPB #MAXSTR TEST FOR MAXIMUM BNE E3A DECB LDA BKSPAC,PCR LBSR OUTCHR LBSR BAKSPC FIX LINE DISPLAY LBSR RNGBEL INDICATE ERROR BRA DOCHG3 E3A STA ,U+ BRA DOCHG5 * DOCHG3 OPSHS B SAVE THIS CHAR COUNT TOO LEAX LBUFER,PCR NOW FIND THE FIRST OCCURANCE OF STRING DOCHG7 LEAY OLDBUF,PCR LDB 1,S GET OLD CHAR COUNT DOCHG6 LDA ,X+ SEARCH LINE BUFFER FOR STRING CMPA #CR ARE WE AT END OF BUFFER? BNE DOCHG4 LBS PR RNGBEL IF NO MATCH FOUND LEAS 2,S FIX STACK LBRA DOPRT PRINT CR ON EXIT * DOCHG4 CMPA ,Y+ BNE DOCHG7 IF A MATCH FOR ONE CHAR DECB BNE DOCHG6 LDB 1,S FOUND THE STRING, NOW POINT TO IT DECB COMB LDA #-1 LEAX D,X MOVE QX BACK TO BEGIN OF STRING CLRA LDB S TFR D,Y GET NEW CHAR COUNT INTO 'Y' LDB 1,S GET OLD CHAR COUNT INTO 'B' LEAU NEWBUF,PCR POINT TO STRING TO INSERT IN PLACE OF LEAS 2,S FIX STACK NOW THAT FINISHED WITH COUNTERS CMPY #0 IF ON RLY DELETING A STRING, NO REPLACEMENT BEQ DOCHGA DOCHG8 LDA ,U+ STA ,X+ DECB BEQ DOCHG9 LEAY -1,Y BNE DOCHG8 BRA DOCHGA * * OLD STRING HAS BEEN REPLACED. MAY BE MORE NEW STRING TO INSERT * DOCHG9 LDA #-1 STA NOPRNT,PCR DOCHGZ L SEAY -1,Y BNE DOCHGD DOCHGF CLR NOPRNT,PCR LBRA DOPRT * DOCHGD INC CHRCNT,PCR UPDATE BUFFER CHAR TOTAL LDA CHRCNT,PCR CMPA #MAXLNE SEE IF LIMIT REACHED BEQ DOCHGE LDA ,U+ PSHS Y,U,B SAVE ALL FOR RETURN LBSR DOINSC INSERT R TEST OF NEW STRING INC CURPOS,PCR PULS Y,U,B BRA DOCHGZ DOCHGE DEC CHRCNT,PCR BRA DOCHGF * * IF HERE, NEW STRING HAS BEEN INSERTED, BUT MORE OF OLD STRING * MUST BE DELETED. * DOCHGA LDA #-1 STA NOPRNT,PCR DOCHGY PSHS B SAVE CHAR COUN UTER LBSR DODELB DELETE REST OF OLD LINE PULS B DECB BNE DOCHGY CLR NOPRNT,PCR BRA DOPRT RE-PRINT LINE ON EXIT * * THIS COMMAND OVERLAYS AND REPLACES THE CHARACTER UNDER THE CURSOR * WITH THE CHARACTER NOW TYPED. TERMINATE WITH A CR VOR TERMINATOR * CHARACTER. CR RETURNS TO BEGIN OF LINE, TERMINATOR CHAR TERMINATES * MODE AT CURRENT CURSOR POSITION. * DOOVR LBSR INCHAR PICK UP NEW CHARACTER TO REPLACE WITH CMPA #CR CR INDICATES END OF OVERLAY MODE LBEQ DED CMPA TERM,P WCR OVERLAY CHAR WILL TERMINATE BNE T5 T4 LBSR RNGBEL INDICATE COMMAND FINISHED LBRA DEDIT4 * T5 CMPA BKSPAC,PCR IF ERROR, FIX IT BNE T6 IF NOT PSHS A SAVE BACK-SPACE CHAR AWHILE LDA COUNT,PCR MAKE SURE SOME CHARS' ENTERED BEFOR XE BNE T7 PULS A RESTORE BACK-SPACE CHAR LBSR RNGBEL BRA DOOVR * T7 LBSR BAKSPC DO THE BACKSPACE AND DELETE LEAX -1,X UPDATE BUFFER POINTER LDA CHRBUF,PCR TSTA BEQ T8 STA X RESTORE PREVIOUS CHAR LBSR OUTCHR RE-PRINT R YESTORED CHAR LDA BKSPAC,PCR BACK-UP CURSOR TO ALLOW FOR PRINT LBSR OUTCHR CLR CHRBUF,PCR T8 DEC COUNT,PCR UPDATE KEY HIT COUNTER BRA DOOVR * T6 LBSR CLASS BCS DOOVR LDB X SAVE ORIGINAL CHAR TILL NEXT KEY CMPB #CR BEQ T4 ZSTB CHRBUF,PCR STA ,X+ AND PUT IN BUFFER INC COUNT,PCR UPDATE CHANGES' COUNTER INC CURPOS,PCR UPDATE POSITION COUNTER LDA CURPOS,PCR CMPA LNEWTH,PCR IS IT END OF LINE? BNE DOOVR LBSR DOCRLF BRA DOOVR * * THIS COMMAND REPRI [NTS THE ENTIRE LINE AS IT NOW APPEARS IN * THE BUFFER. * DOPRT LDD HOMCLR,PCR CLEAR THE SCREEN AND HOME CURSOR LBSR PUTTWO LEAX LBUFER,PCR DOPRT1 LDA ,X+ CMPA #CR IS IT EOL? LBEQ DED LBSR OUTCHR BRA DOPRT1 * * THIS COMMAND TESTS \FOR THE END SEQUENCE WHICH WILL XMIT THE * EDITED LINE BACK TO BASIC. * CHKX LDA #$FF TURN OFF CHAR ECHO STA ECHO,PCR LBSR INCHAR GET 2ND COMMAND CHAR CLR ECHO,PCR RE-ENABLE ECHO CMPA CHKTX,PCR TEST FOR EXIT COMMAND LBNE DEDIT4 B ]SR DOABRT CHKOUT LDA #-1 STA UPDATE,PCR INDICATE EXITING WITH CHANGES TO BE MADE DABRT4 LDX LBUFPT,PCR LDA ,X+ GET CHARACTER TO RETURN TO BASIC STX LBUFPT,PCR UPDATE LINE BUFFER POINTER CMPA #CR IS IT END OF LINE? BNE DABRT2 IF NO ^ CLR UPDATE,PCR LEAX LBUFER,PCR RELOAD POINTERS FOR NEXT EDIT SESSION STX LBUFPT,PCR BSR CLRBUF FILL LINE BUFFER WITH NULLS DABRT2 PULS B,X,Y,U,PC * * THIS COMMAND ABORTS THE EDIT FUNCTION WITH NO CHANGES BEING MADE * DABRT1 BSR DOABRT _ BSR CLRBUF DABRT3 LDA #CR RETURN TO BASIC WITH CARRIAGE RETURN CHAR PULS B,X,Y,U,PC * DOABRT LEAX LBUFER,PCR RE-SET ALL PARAMETERS STX LBUFPT,PCR STX LBFEND,PCR CLR ESCFLG,PCR CLR INEDIT,PCR CLR UPDATE,PCR DON'T WANT NEW DATA ` CLR EDTFLG,PCR CLEAR EDIT MODE FLAG CLR EOLFLG,PCR CLR ASCFLG,PCR CLR CHRCNT,PCR INDICATE BUFFER EMPTY LDD HOMCLR,PCR EXIT WITH CLEAN SCREEN LBRA PUTTWO * CLASS CMPA #MAXCTL TEST FOR CONTROL CHARS BLS SETCAR CMPA #MAXASC TE aST FOR BIT 7 HIGH BHS SETCAR CLCAR ANDCC #$FE RTS SETCAR ORCC #1 RTS CARRY SET INDICATES BAD CHAR * CLRBUF LEAX OLDBUF+MAXLNE+65,PCR POINT TO END OF BUFFER PSHS X SAVE ON STACK LEAX OLDBUF,PCR POINT TO BEGINNING OF BUFFER CLRB CLR b ,X+ FILL BUFFER WITH NULLS CMPX ,S BNE CLRB PULS X,PC * ******************** REPLACEMENT PUTCHR ROUTINE ******************** * * THIS ROUTINE ACTS LIKE THE FLEX PUTCHR ROUTINE UNTIL * IT DETECTS THE 'IN EDIT FLAG' (INEDIT) SET. AT THIS POI cNT * ALL CHARACTERS RECEIVED UNTIL A CR ARE STORED IN A BUFFER * CAPABLE OF HOLDING 128 CHARACTERS. UPON THE FINAL CR, THE * ROUTINE JUMPS TO THE EDITING PORTION OF THE PROGRAM. * BPUT PSHS B,X,Y,U DON'T DESTROY ANY REGISTERS PSHS A LDD OUTCH dV TEST FOR 'OPEN "XXX" AS 0' COMMAND CMPD SAVVEC,PCR BNE DOFLEX PULS A TST INEDIT,PCR SHALL WE SAVE THIS LINE? BPL BPUT3 LDX LBUFPT,PCR * * TEST FOR CR RECEIVED, BUT NO ASCII CHARS * TST EOLFLG,PCR BPL BPUT10 * * TEST FOR PREVI eOUS ASCII, NO CR * BPUT12 TST ASCFLG,PCR BPL BPUT10 CLR INEDIT,PCR CLR ASCFLG,PCR CLR EOLFLG,PCR LDB #-1 STB EDTFLG,PCR BRA BPUT1 * * TEST FOR CR IN NOW, BUT ALSO RECEIVED ASCII * BPUT10 CMPA #MAXCTL TEST FOR VALID ASCII BLS  fBPUT3 IF CONTROL CHARS (CR) LDB #-1 STB ASCFLG,PCR CLR EOLFLG,PCR EMPTY CR FLAG FOR NEXT PASS BPUT1 STA ,X+ SAVE EACH LINE AS IT IS ENTERED BPUT2 STX LBUFPT,PCR UPDATE LINE BUFFER POINTER STX LBFEND,PCR BPUT3 BSR OUTCHR PRINT THE C gHARACTER THRU FLEX TST EDTFLG,PCR LBMI DEDIT5 EXIT TO THE EDITOR BPUT4 PULS B,X,Y,U,PC RESTORE AND RETURN DOFLEX PULS A JSR PUTCHR BRA BPUT4 * INCHAR PSHS X,B SAVE FOR LATER LDX PORT,PCR INCHR1 BSR BTESTR BEQ INCHR1 LDA 1,X h GET RECEIVED CHAR ANDA #MAXASC STRIP PARITY IF USED PULS B,X TST ECHO,PCR SHALL WE ECHO THE CHAR? BPL OUTCHR RTS * OUTCHR PSHS B,X LDX PORT,PCR CMPA #CR TEST FOR CARRIAGE RETURN BNE INOUT7 IF NO TST LNFLG,PCR TEST FOR P iAUSE AT EOL BPL INOUT7 IF NO PAUSE INOUT2 BSR BTESTR WAIT FOR ANOTHER CHAR BEQ INOUT2 LDB 1,X ANDB #MAXASC STRIP PARITY CMPB #CR WANT ABORT LIST? BEQ ENDLST CMPB PAUSE,PCR IF NO, CONTINUE LOOPING BNE INOUT2 CLR LNFLG,PCR j BRA INOUT1 * INOUT7 BSR BTESTR TEST FOR KEY PRESSED BEQ INOUT1 LDB 1,X ANDB #MAXASC CMPB PAUSE,PCR TEST FOR PAUSE CHARACTER BNE INOUT1 LDB #-1 STB LNFLG,PCR SET FOR EOL STOP INOUT1 BSR BTESTX WAIT FOR ACIA BEQ INOUT1 kSTA 1,X PRINT CHAR PULS B,X,PC AND RETURN * ENDLST LEAS 5,S FIX STACK FROM BPUT ROUTINE PULS B,X,Y,U RESTORE REGISTERS AND RETURN CLR LNFLG,PCR LEAS 2,S JMP [ESCRET] END LISTING * BTESTR LDB X GET STATUS BIT BITB #1 TEST FO lR RECEIVED RTS * BTESTX LDB X GET STATUS BIT BITB #2 TEST FOR READY TO XMIT RTS * BAKSPC PSHS A,B,X LDX PORT,PCR LOAD ACIA ADDRESS BAKSP1 BSR BTESTX BEQ BAKSP1 LDA #SPACE STA 1,X BAKSP2 BSR BTESTX BEQ BAKSP2 LDA BKSPAC,PmCR WRITE BACK-SPACE CHAR STA 1,X PULS A,B,X,PC RESTORE BACKSPACE CHAR FOR OUTPUT * DOCRLF PSHS A,B,X LDD #CRLF LBSR PUTTWO PULS B,A,X,PC * OLDBUF RMB MAXSTR NEWBUF RMB MAXSTR LBUFER RMB MAXLNE PEND EQU * * END START * * SMARTWATCH DRIVER * *88 9 21 LB * * ( 0.1s 0.01s ) ( s e k u n d e r ) * ( m i n u t e r ) ( 12,0,10/AP,Tim,Timmar ) *( 0,0,OSC,RES,dag ) (D a t u m ) *( M } n a d ) ( ] r ) * OPT NOL LIB CANIO.TXT OPT LIS *89 8 15 LB * ORG $DFF0 SECOND RMB 2 MINHOUR RMB 2 DAYDATE RMB 2 MONYEAR RMB 2 SPTEMP RMB 2 * MEM EQU $7FFF ORG $C000 START JSR XREADCL LDX #MONYEAR+1 LDB #8 SHOW LDA 0,X JSR XP2HEX JSR XPSPACE LEAX -1,X DECB BNE SHOW LDA #$0D JSR XPUTCHR BRA START LDA SECOND+1 ORG $DE00 X READCL JMP READTM XWRITIM JMP WRITIM * READTM EQU * PSHS D,DP,X,Y,U,CC SEI LDX #CODTAB LDA MEM START OPENR LDB #8 LDA 0,X+ OPENR1 STA MEM LSRA DECB BNE OPENR1 CMPX #CODEND BNE OPENR * LDB #$80 RDT0 LDA MEM LSRA RORB BCC RDT0 TFR B,DP L DB #$80 RDT1 LDA MEM LSRA RORB BCC RDT1 TFR DP,A TFR D,X SECONDS * LDB #$80 RDT2 LDA MEM LSRA RORB BCC RDT2 TFR B,DP LDB #$80 RDT3 LDA MEM LSRA RORB BCC RDT3 TFR DP,A TFR D,Y MINHOURS * LDB #$80 RDT4 LDA MEM LSRA RORB BCC RDT4 TFR B,DP LDB #$80 RDT5 LDA MEM LSRA RORB BCC RDT5 TFR DP,A TFR D,U DAYDATE * LDB #$80 RDT6 LDA MEM LSRA RORB BCC RDT6 TFR B,DP LDB #$80 RDT7 LDA MEM LSRA RORB BCC RDT7 TFR DP,A * STX SECOND STY MINHOUR STU DAYDATE STD MONYEAR PULS D,X, Y,U,CC,DP,PC * CODTAB FDB $C53A,$A35C,$C53A,$A35C CODEND EQU * WRITIM EQU * PSHS X,Y,U,D,DP,CC SEI STS SPTEMP LDD SECOND LDU MINHOUR LDY DAYDATE LDX MONYEAR TFR A,DP LDS #CODTAB * OPENW LDA 0,S+ STA MEM LSRA STA MEM LSRA STA MEM LSRA S TA MEM LSRA STA MEM LSRA STA MEM LSRA STA MEM LSRA STA MEM CMPS #CODEND BNE OPENW * EXG DP,B LDA #8 WRT0 STB MEM LSRB DECA BNE WRT0 TFR DP,B LDA #8 WRT1 STB MEM LSRB DECA BNE WRT1 * TFR U,D * TFR B,DP LDB #8 WRT2 STA MEM LSRA  DECB BNE WRT2 TFR DP,A LDB #8 WRT3 STA MEM LSRA DECB BNE WRT3 * TFR Y,D * TFR B,DP LDB #8 WRT4 STA MEM LSRA DECB BNE WRT4 TFR DP,A LDB #8 WRT5 STA MEM LSRA DECB BNE WRT5 * TFR X,D * TFR B,DP LDB #8 WRT6 STA MEM LSRA DECB BNE WRT 6 TFR DP,A LDB #8 WRT7 STA MEM LSRA DECB BNE WRT7 * LDS SPTEMP PULS D,X,Y,U,CC,DP,PC * END                                                                                                                                  !!!!!!!!! ! ! ! ! !!!!!""""""""" " " " " """""######### # # # # #####$$$$$$$$$ $ $ $ $ $$$$$%%%%%%%%% % % % % %%%%%&&&&&&&&& & & & & &&&&&''''''''' ' ' ' ' '''''