From c8dc99dde5713b68412023822ec8886d34a9c593 Mon Sep 17 00:00:00 2001 From: retrogear Date: Sat, 6 Aug 2016 22:41:27 -0500 Subject: [PATCH] Add files via upload --- ANALYST 4.3.txt | 1983 ++++++++++++++++++++++++++++++++ ANALYST 5.0.txt | 1988 ++++++++++++++++++++++++++++++++ ANALYST 5.2.txt | 1961 ++++++++++++++++++++++++++++++++ ANALYST 5.2E.txt | 2039 +++++++++++++++++++++++++++++++++ ANALYST 64.TXT | 1994 ++++++++++++++++++++++++++++++++ ANALYST DEBUG.txt | 2096 ++++++++++++++++++++++++++++++++++ ANALYST128XP.TXT | 2087 ++++++++++++++++++++++++++++++++++ Analyst128.TXT | 2082 ++++++++++++++++++++++++++++++++++ Analyst128E.TXT | 2095 ++++++++++++++++++++++++++++++++++ Analyst128EX.txt | 2088 ++++++++++++++++++++++++++++++++++ Analyst128xp annotated.txt | 2206 ++++++++++++++++++++++++++++++++++++ 11 files changed, 22619 insertions(+) create mode 100644 ANALYST 4.3.txt create mode 100644 ANALYST 5.0.txt create mode 100644 ANALYST 5.2.txt create mode 100644 ANALYST 5.2E.txt create mode 100644 ANALYST 64.TXT create mode 100644 ANALYST DEBUG.txt create mode 100644 ANALYST128XP.TXT create mode 100644 Analyst128.TXT create mode 100644 Analyst128E.TXT create mode 100644 Analyst128EX.txt create mode 100644 Analyst128xp annotated.txt diff --git a/ANALYST 4.3.txt b/ANALYST 4.3.txt new file mode 100644 index 0000000..fe540d9 --- /dev/null +++ b/ANALYST 4.3.txt @@ -0,0 +1,1983 @@ + LST OFF + SBTL + MSB ON + ORG $6000 + SKP 1 +********************************* +* * +* -< THE ANALYST >- * +* * +* VERSION 4.3 * +* * +* BY * +* * +* LARRY A. GREENE * +* * +********************************* + SKP 1 +*** DESCRIPTION *** + SKP 1 +; THIS PROGRAM OPERATES INDEPENDENT OF ROM BUT HAS COM- +; MANDS SIMILAR TO THE BUILT IN MONITOR. THE TRACE AND +; STEP FUNCTIONS HAVE BEEN GREATLY ENHANCED TO DISPLAY +; STATUS REGISTER FLAGS AND SET A BREAK POINT. THE MINI +; ASSEMBLER HAS BEEN INCLUDED AS WELL AS A HEX SEQUENCE +; FINDER. 65C02 OPCODES ARE ALSO SUPPORTED. ZERO PAGE +; REFS ARE STORED IN A BUFFER WHICH AVOIDS CONFLICT WITH +; THE PROGRAM BEING TRACED. THIS PROGRAM USES THE BOTTOM +; 1/4 OF THE STACK ($100-140). TO USE DOS EXIT WITH +; CTRL-B AND RE-ENTER WITH &. + SKP 1 +*** COMMANDS *** + SKP 1 +; CTRL-A DUMP MEMORY IN ASCII +; CTRL-B ENTER RESIDENT BASIC W/DOS. & TO RETURN +; CTRL-E EXAMINE INTERNAL REGISTERS +; CTRL-F FIND SPECIFIED HEX SEQUENCE DEFINED BY CTRL-L +; G GO EXECUTE IN IMMEDIATE MODE +; H LOAD RANGE FOR HSF AND READY : TO DEFINE +; I CHANGE PC AND/OR INTERNAL A,X,Y,P,S REGISTERS +; J JUMP. EXECUTE JSR INSTRUCTION IN STEP MODE +; CTRL-L CLEAR PRESENT SCREEN AND HOME CURSOR +; L LIST DISASSEMBLED INSTRUCTIONS +; M MOVE BLOCK OF MEMORY +; P SEND OUTPUT TO PRINTER +; R RELOCATE ANALYST TO NEW ADDRESS PAGE +; S ENTER STEP MODE. STEP INSTRUCTION +; T TRACE PROGRAM OR SET TRACE LIMIT +; V VERIFY TWO BLOCKS OF MEMORY +; CTRL-X CANCEL LINE ENTRY +; X SKIP NEXT INSTRUCTION (STEP MODE) +; % PRINT ADDRESS DATA VALUE IN BINARY +; ? DO INTERNAL CHECKSUM OF ANALYST +; @ SWITCH GRAPHICS/TEXT SCREENS +; < RANGE DELIMITER +; . RANGE DELIMITER +; + 16 BIT ADDITION +; - 16 BIT SUBTRACTION +; : STORE VALUE IN MEMORY +; ! ENTER MINI-ASSEMBLER. "#" TO EXIT + SKP 1 +*** OPERATING NOTES *** + SKP 1 +; INPUT LINE LIMITED TO 38 CHARACTERS. BEEPS ON LAST 4. + SKP 1 +; HOME (CTRL-L) ACTS IMMEDIATELY. FOLLOW WITH . + SKP 1 +; FOR STEP TYPE 300S THEN S, O/A, SPC OR J TO STEP +; EACH INSTRUCTION. S OR O/A TO STEP INTO JSR. J FOR +; JUMP. X TO SKIP. T TO ENTER TRACE. @ FOR TEXT. CTRL-C +; TO EXIT. + SKP 1 +; FOR TRACE USE FFFF<2000T WHERE FFFF DENOTES BRKPOINT. +; PC PRINTED AT UPPER LEFT EVERY 256 LINES. OPEN APPLE +; ENTERS SLOW TRACE WITH PC PRINTED EACH LINE. CLOSED +; APPLE EXITS TO STEP MODE. TRACE WILL EXECUTE SUB- +; ROUTINES ABOVE PAGE# LIMIT IN IMMEDIATE MODE IF SET +; BY T:NN. TO TRACE ALL SET T:00 WHICH IS DEFAULT VALUE. +; TRACE ACTIVITY INDICATED BY FLASHING $ OR # FOR JSR +; IMMEDIATE MODE. BREAKPOINT ENTERS STEP MODE AND +; EXECUTES BREAKPOINT INSTRUCTION. + SKP 1 +; FOR JUMP TYPE 'J5' WHERE 5 REPRESENTS # OF PARM BYTES +; FOLLOWING JSR INSTRUCTION. J DEFAULTS TO 0. JUMP +; DURING STEP & TRACE IMMEDIATE HANDLE JSR $BF00 AS +; PRODOS MLI CALL WITH 3 PARM BYTES FOLLOWING. MUST USE +; 'J3' FROM COMMAND LINE. IF SUBROUTINE BEING 'JUMPED' +; CONTAINS A TXS INSTRUCTION, ANALYST WILL LOSE CONTROL! + SKP 1 +; STEP & TRACE BREAK FOR ILLEGAL OPCODES. PRINTS 'ERR' + SKP 1 +; TO CHANGE PC AND/OR INTERNAL REGS TYPE 300I:AA XX +; YY PP SS . PC ENTRY BEFORE I OPTIONAL. + SKP 1 +; FOR HEX SEQUENCE FINDER TYPE H:NN H1 H2... +; 1000<2000 CTRL-F WHERE NN = # OF BYTES. + SKP 1 +; TO DUMP MEMORY IN ASCII USE 1000.2000 CTRL-A . + SKP 1 +; TO PRINT ADDRESS BYTE IN BINARY TYPE 2000% . + SKP 1 +; TO SWITCH SCREENS TYPE @H1,H2,L1,L2,4,8 OR @ FOR TEXT. +; H2,L2 ONLY AVAILABLE IN 40 COL MODE DUE TO HARDWARE. + SKP 1 +; TO RELOCATE TYPE NN00R . WILL RELOCATE TO +; NEAREST PAGE BOUNDARY ONLY. DO NOT SET < $800 OR +; WITHIN ANALYST MAIN PROGRAM AREA! IF MOVED TO RAM +; CARD DO NOT CHANGE CARD R/W STATE! + SKP 1 +; DO NOT USE THE PRINTER WHEN THE ANALYST IS LOCATED +; ON THE RAM CARD. THE PRINTER WILL NOT INITIALIZE. +; ALSO RESET WILL NOT RETURN TO THE ANALYST LOCATED +; ON THE RAM CARD WITH 128K MACHINES. + SKP 1 +; & VECTOR $3F5 IS A WARMSTART RE-ENTRY WHICH CAN BE +; USED TO JMP INTO ANALYST FROM A RUNNING PROGRAM +; WITH ALL REGS PRESERVED. + SKP 1 +*** ROM ZERO PAGE EQUATES *** + SKP 1 +WNDWDTH EQU $21 +MCH EQU $24 +MCV EQU $25 +MCSWL EQU $36 +MCSWH EQU $37 +MKSWL EQU $38 +MKSWH EQU $39 +MPCL EQU $3A +MPCH EQU $3B +MACC EQU $45 +MXREG EQU $46 +MYREG EQU $47 +MSTATUS EQU $48 +MSPNT EQU $49 +RNDL EQU $4E +SPDBYT EQU $F1 APPLESOFT SPEED= + SKP 1 +*** ANALYST EQUATES *** + SKP 1 +STKLMT EQU $40 TOP OF STACK (IMMEDIATE) +ZFLG EQU $EE 2 BYTE ID ($D5 $AA) +A1L EQU $F0 A1L-A5H MUST BE IN ORDER +A1H EQU $F1 FOR MINI-ASSEMBLER +A2L EQU $F2 +A2H EQU $F3 +A3L EQU $F4 +A3H EQU $F5 +A4L EQU $F6 +A4H EQU $F7 +A5L EQU $F8 +A5H EQU $F9 +PCL EQU $FA +PCH EQU $FB +BASL EQU $FC +BASH EQU $FD +BAS2L EQU $FE +BAS2H EQU $FF LABEL MARKS END OF PAGE 0. +STACK EQU $0100 +DOSV EQU $03D0 DOS BASIC WARM ENTRY +BRKV EQU $03F0 BREAK VECTOR +SOFTEV EQU $03F2 RESET VECTOR +AMPERV EQU $03F5 ANALYST WARMSTART RE-ENTRY +MLI EQU $BF00 PRODOS INTERFACE + SKP 1 +*** ROM EQUATES *** + SKP 1 +KBD EQU $C000 +CLR80COL EQU $C000 ENABLE PAGE2 DISPLAY +CLRIOROM EQU $C006 +CLR80ROM EQU $C00A +CLR80VID EQU $C00C +CLRCHAR2 EQU $C00E +KBDSTRB EQU $C010 +RD80VID EQU $C01F BMI IF 80 COL MODE +SPKR EQU $C030 +TXTCLR EQU $C050 +TXTSET EQU $C051 +MIXCLR EQU $C052 +LOWSCR EQU $C054 +HISCR EQU $C055 +LORES EQU $C056 +HIRES EQU $C057 +SETAN0 EQU $C058 +PB0 EQU $C061 OPEN APPLE KEY +PB1 EQU $C062 CLOSED APPLE KEY +SWITCH2 EQU $C082 +SWITCH3 EQU $C083 +PRINIT EQU $C100 PRINTER IN SLOT 1 +PR3 EQU $C300 +MKEYIN EQU $FD1B +MVIDOUT EQU $FDF0 +RESET EQU $FFFC RESET VECTOR IN RAMCARD +IRQ EQU $FFFE BREAK VECTOR IN RAMCARD + SKP 3 +GETSUM JSR INITSUM CREATE CHECKSUM OF MAIN + LDA #$2C WHEN FIRST BRUN +SUMLOC STA GETSUM DISABLE CHECKSUM + SKP 1 +*** STATIC MAIN PROGRAM AREA *** + SKP 1 +START CLD RESET POINTS HERE + LDX #STKLMT SET ANALYST STACK UPPER + TXS LIMIT + LDA ZFLG + CMP #$D5 + BNE NOID + LDA ZFLG+1 + CMP #$AA + BEQ START2 IF ID NOT PRESENT +NOID JSR ZSWAP THEN SWAP 0 PAGE + LDA #$D5 & SET ID --> ZFLG:D5 AA + STA ZFLG + LDA #$AA + STA ZFLG+1 +START2 LDA LORES INIT VIDEO MODE + LDA LOWSCR SET PRIMARY PAGE + LDA TXTSET SET TEXT MODE + JSR INIT40 SET FOR 40 COL DISPLAY + LDA #$00 + STA CLR80ROM DISABLE 80 COL ROM + STA CLRIOROM DISABLE INTERNAL I/O + STA CLRCHAR2 PRIMARY CHAR SET + STA TLIMIT TRACE ALL + STA STATUS CLEAR STATUS + STA ERRFLG CLEAR FLAGS + STA XFLG + STA TFLG + STA JFLG + STA PCL + STA PCH + LDX #$F0 + STX SPNT +CLRSTK STA STACK,X = 0 + INX + BNE CLRSTK + JSR HOME40 + JSR SETRV RESET VECTOR TO 'START' + LDA IRQLOC SET IRQ TO HANDLE + STA IRQ BREAK INSTRUCTIONS + LDA IRQLOC+1 + STA IRQ+1 + LDA BRKLOC + STA BRKV + LDA BRKLOC+1 + STA BRKV+1 + LDX #$00 PRINT TITLE +PRTITLE LDA TITLE,X + BEQ PRADDR + JSR COUT + INX + BNE PRTITLE ALWAYS TAKEN +PRADDR LDA SUMLOC+2 PRINT ORIGIN ADDRESS + JSR PRBYTE OF ANALYST MAIN + LDA SUMLOC+1 + JSR PRBYTE + JSR CROUT + JSR CKMAIN CHECK MAIN FOR RESET + JMP MONZ +SETRV LDA STARTLOC + STA SOFTEV + STA RESET + LDA STARTLOC+1 + STA SOFTEV+1 + STA RESET+1 + EOR #$A5 + STA SOFTEV+2 + STA FUNNY SAVE FOR REFERENCE + RTS +INSDS1 LDX PCL + LDY PCH + JSR PRYX2 + JSR OUTSP + LDX #0 +INSDST LDA (PCL,X) +INSDS2 LDY #$FF DETERMINE LENGTH OF + STY LMNEM INSTRUCTION. OPCODE IN + TAY ACC. STORED IN LENGTH. + LSR A INVALID = 0 + BCC IEVEN 1 BYTE = 0 + ROR A 2 BYTE = 1 + BCS ERR 3 BYTE = 2 + AND #$87 +IEVEN LSR A + TAX + LDA FMT1,X + BCC RTMSKZ + LSR A + LSR A + LSR A + LSR A +RTMSKZ AND #$0F + CMP #$0F + BNE GETFMT +ERR LDY #$FF BAD OPCODE + STY ERRFLG + INY + STY LMNEM + STY RMNEM + STY FORMAT + STY LENGTH +RTS1 RTS +GETFMT TAX + LDA FMT2,X + STA FORMAT + AND #$03 + STA LENGTH + LDA TFLG BYPASS PRINT FORMATTING + BNE RTS1 IN TRACE + TYA + AND #$8F + STA IN+37 TEMP STORAGE + TYA + LDX #31 +GETFMT2 DEX + BMI MNNDX + CMP OPC65C,X MAKE SUBSTITUTION IF + BNE GETFMT2 65C02 OPCODE. + LDA REPL65C,X +MNNDX LDX IN+37 + LDY #$03 + CPX #$8A + BEQ MNNDX3 +MNNDX1 LSR A + BCC MNNDX3 + LSR A +MNNDX2 LSR A + ORA #$20 + DEY + BNE MNNDX2 + INY +MNNDX3 DEY + BNE MNNDX1 + RTS +INSTDSP JSR INSDS1 + PHA +PRNTOP LDA (PCL),Y + JSR PRBYTE + LDX #$01 +PRNTBL JSR PRBLNK + CPY LENGTH + INY + BCC PRNTOP + LDX #$03 + CPY #$03 + BCC PRNTBL + PLA + TAY + LDA LMNEM + BEQ PRMN1 + LDA MNEML,Y + STA LMNEM + LDA MNEMR,Y + STA RMNEM +PRMN1 LDA #$00 + LDY #$05 +PRMN2 ASL RMNEM + ROL LMNEM + ROL A + DEY + BNE PRMN2 + ADC #$BF + JSR COUT + DEX + BNE PRMN1 + JSR OUTSP + LDY LENGTH + LDX #$05 +PRADR1 CPX #$02 + BEQ PRADR5 +PRADR2 ASL FORMAT + BCC PRADR3 + LDA CHAR1,X + JSR COUT + LDA CHAR2,X + BEQ PRADR3 + JSR COUT +PRADR3 DEX + BPL PRADR1 + RTS +PRADR4 DEY + BMI PRADR2 + JSR PRBYTE +PRADR5 LDA FORMAT + CMP #$E8 + LDA (PCL),Y + BCC PRADR4 + JSR PCADJA + TAX + INX + BNE PRNTYX + INY +PRNTYX TYA +PRNTAX JSR PRBYTE + TXA + JMP PRBYTE +PRBL13 LDX #13 + DFB $2C SKIP NEXT INSTRUCTION +PRBL33 LDX #33 +PRBLNK JSR OUTSP PRINT X SPACES + DEX + BNE PRBLNK + RTS +PCADJ SEC UPDATE PC BY LENGTH+1 +PCADJLP LDA LENGTH +PCADJAP JSR PCADJA + STA PCL + STY PCH + RTS +PCADJL LDA LENGTH UPDATE PC BY LENGTH +PCADJA LDY PCH UPDATE PC BY ACC + TAX + BPL PCADJ2 + DEY +PCADJ2 ADC PCL + BCC RTS2 + INY +RTS2 RTS NEW PC IN Y,A +STEP TXA F(S) + BNE SSTEP FIRST TIME + JSR KYWAIT CTRL-C = BREAK + CPY #$CA + BNE STEP2 + LDA JFLG J = SINGLE STEP + BEQ SSTEP IF NO JSR, ELSE + DEC YSAV EXECUTE SUBROUTINE + PLA + PLA + JMP TRCPCS +STEP2 LDA JFLG SPC = SINGLE STEP IF + BNE STEP3 NOT JSR, ELSE IGNORE + CPY #$A0 + BEQ SSTEP +STEP3 CPY #$D3 S OR OPEN APPLE = + BEQ SSTEP SINGLE STEP ALWAYS + TYA + BEQ SSTEPW = 0 FOR OPEN APPLE. + CPY #$D4 T = ENTER TRACE MODE + BNE STEP4 + INC TFLG SET TRACE MODE FLAG + JMP TRACE4 AND ENTER TRACE. +STEP4 CPY #$C0 @ = TEXT MODE + BNE STEP5 + JSR TXT1 +STEP5 CPY #$D8 X = SKIP NEXT INSTRUCTION + BNE STEP + LDA #1 TURN OFF XQT EXECUTION + STA XFLG +SSTEPW LDA #$FF PAUSE TO RELEASE O/A KEY + JSR WAIT +SSTEP JSR A1PC +SSTEPT DEC YSAV TRACE RE-ENTRY TO STEP + LDA #0 + STA CV + STA CH + JSR VTABZ + DEC CV TOP OF SCRN AFTER CROUT + JSR INSTDSP + JSR CLREOL + PLA REMOVE RTS TO NEXTITM + PLA + LDX XFLG + BEQ NOSKIP + DEX + STX XFLG + STX ERRFLG IN CASE SKIPPING ERROR + JSR PCADJ + JMP NXTPC SKIP INSTRUCTION +NOSKIP JMP TSTEP +PRNTPC LDA #0 PRINT PC AT UPPER LEFT + STA CH + LDA PROMPT + JSR COUT + LDA PCH + LDX PCL + JMP PRNTAX +TRACEPC JSR CHKVID CHECK/RESET 40/80 MODE + INC RNDL PRINT PC + BNE TRCPC1 EVERY 256 INSTRUCTIONS + LDA PROMPT FLASHING '$' FOR TRACE + EOR #$04 ACTIVITY. $A4->$A0->$A4 + STA PROMPT + JSR PRNTPC +TRCPC1 LDA JFLG + BEQ TRACE5 + LDA TLIMIT + BEQ TRACE5 FULL TRACE IF TLIMIT=0. + LDA PCH + CMP TLIMIT SEE IF PC > TLIMIT PAGE# + BCC TRACE5 IF SO, EXEC JSR IMMED. + JSR STPRMPT '#' DENOTES JSR IMMED. + JSR PRNTPC PRINT EXEC SUBROUTINE + INC PROMPT '#' -> '$' +TRCPCS LDA PCL SEE IF PC = $BF00 + BNE TRCPCG + LDA PCH + CMP # '$' 1ST TIME ONLY + LDA #$FF FORCE VTAB TO TOP OF SCRN + STA CV WHEN CROUT INC'S CV TO 0 + JSR CROUT (NEEDED FOR 80 COL). +TRACE5 LDX #1 IF PC = A4 THEN ENTER STEP +TRACE5A LDA PCL,X + CMP A4L,X + BNE TRACE6 + DEX + BPL TRACE5A + INX + BEQ TRACES ALWAYS TAKEN +TRACE6 LDY #0 + LDA (PCL),Y GET OPCODE + CMP #$91 CHECK FOR STA (IND),Y + BNE TRACE7 TO SEE IF BLOCK MOVE + INY INTO ANALYST MAIN + LDA (PCL),Y GET OPERAND + TAX + LDA $01,X GET IND ADDR HI-BYTE + CMP SOFTEV+1 SEE IF PAGE# < START + BCC TRACE7 (SOFTEV = START ADDR) + CMP CSUMLOC+2 OR > CHKSUM PAGE# + BCS TRCBRK IF NOT THEN BREAK + LDA #0 FORCE BRANCH +TRCBRK BEQ XBRK +TRACE7 LDX #0 FOR INSDST + LDA PB1 BACK TO STEP MODE IF + BPL TRACE8 CLOSED APPLE PRESSED +TRACES STA KBDSTRB + STX TFLG CLEAR TRACE FLAG + JSR TXT1 + JSR STPRMPT PROMPT BACK TO OLD '#' + LDY YSAV + DEY + LDA #$D3 PUT 'S' INTO INPUT BUFFER + STA IN,Y + JMP SSTEPT RE-ENTER STEP MODE +TRACE8 LDA PB0 SLOW TRACE IF OPEN APPLE + BPL TRACE9 PRESSED + LDA #$FF + STA RNDL FORCE PC PRINTING + PHA + JSR WAIT + PLA + JSR WAIT +TRACE9 JSR INSDST +TSTEP LDA FUNNY SEE IF RESET VECTOR + CMP SOFTEV+2 HAS BEEN CHANGED + BEQ TSTEP2 + JSR SETRV GET BACK RESET CONTROL +TSTEP2 LDA ERRFLG IF BAD OPCODE THEN BRK + BEQ TSTEP3 +XBRK LDY TFLG + BEQ SBRK + DEY + STY TFLG + DEY + STY A4L CLEAR OLD BREAK POINT + STY A4H +GBRK JSR INSTDSP DISP BRK FOR GO & TRACE + JSR RGDSP1 + BEQ BRKMON ALWAYS TAKEN +SBRK JSR CROUT + LDA #5 + STA CV + JSR VTABZ + JSR CLREOL ERASE OLD INSTRUCTION +BRKMON JMP ERRMON +XTSX LDX SPNT + STX XREG +XTXS LDX XREG +UPDSPNT STX SPNT UPDATE SPNT + CPX #STKLMT+1 STACK OVERFLOW IF + BCC XBRK IN ANALYST WORK AREA +UPDPC SEC UPDATE PC + BCS PCINC +TSTEP3 TAX = 0 + STX JFLG DISALLOW F(J) IF NO JSR + LDA (PCL,X) GET OPCODE + BEQ XBRK + LDY LENGTH + CMP #$20 + BEQ XJSR + CMP #$60 + BEQ XRTS + CMP #$BA + BEQ XTSX + CMP #$9A + BEQ XTXS + CMP #$7C + BEQ XJMPATX + CMP #$4C + BEQ XJMP + CMP #$6C + BEQ XJMPAT + CMP #$40 + BEQ XRTI + PHA + CMP #$5A + BCC TSTEP4 + TAX + AND #$1F + CMP #$1A + BEQ STACKOP PHX,PLX,PHY,PLY + TXA +TSTEP4 AND #$9F + CMP #$08 + BNE TSTEP5 +STACKOP JMP STKOPC PHA,PLA,PHP,PLP +TSTEP5 LDX #$08 +XQINIT LDA INITBL-1,X + STA XQT,X + DEX + BNE XQINIT + PLA OPCODE + CMP #$80 + BNE NBRA + ORA #$10 +NBRA AND #$1F + EOR #$14 + CMP #$04 = BRANCH OFFSET + BEQ XQ2 TAKEN IF BRANCH OPCODE +XQ1 LDA (PCL),Y Y = LENGTH +XQ2 STA XQT,Y XQT BCS BRNCH (B0 04) + DEY NOP + BPL XQ1 JMP NBRNCH (CCLR) + JMP XQJ BRNCH JMP BRANCH (CSET) +XRTI CLC + PLA + STA STATUS +XRTS LDX SPNT + INX + LDA STACK,X + STA PCL + INX + LDA STACK,X + STA PCH + STX SPNT +PCINC JSR PCADJLP + CLC + BCC NEWPC +XJMPATX INX + BNE XJMPAT +XJSR STA JFLG OK FOR F(J) + CLC + JSR PCADJL SET Y,A = RTS ADDR + PHA + LDX SPNT + TYA + STA STACK,X + DEX + PLA + STA STACK,X + DEX + STX SPNT + LDY #$02 +XJMP CLC +XJMPAT LDA (PCL),Y + PHA + DEY + LDA (PCL),Y + STA PCL + PLA + STA PCH + BCC NEWPC + DEX + BNE XJMP + LDA XREG + CLC + JSR PCADJAP + LDY #1 + BNE XJMP +NEWPC LDA TFLG + BNE TRACEBY BYPASSES NEXTITM +NXTPC JSR CROUT + JMP REGDSP +TRACEBY JMP TRACEPC +IBREAK STA MACC + PLP FOR IRQ W/CARD ON + STX MXREG + STY MYREG + PHP + PLA + STA MSTATUS + TSX + STX MSPNT + CLD + PLA + STA MPCL + PLA + STA MPCH +BREAK SEC IRQ W/ CARD OFF + LDA MPCL ROM SAVED PC + SBC #2 AFTER DEC BY 2 + STA PCL + LDA MPCH + SBC #0 + STA PCH + LDX #4 +BRKSAVE LDA MACC,X COPY SAVED REGS + STA ACC,X + DEX + BPL BRKSAVE + LDX #$40 RESTORE ANALYST STACK + TXS + JMP GBRK +BRANCH JSR SAVE BRANCH WITH COND. MET + CLC + LDY #$01 + LDA (PCL),Y + JSR PCADJAP + JMP UPDPC +NBRNCH JSR SAVE ALL OTHER OPCODES + JMP UPDPC +INITBL NOP + NOP + JMP NBRNCH + JMP BRANCH +PULL PHP + INX + LDA STACK,X + TAY + LDA STATUS PULL FROM STACK AFFECTS + PHA N & Z FLAGS + PLP + TYA UPDATE N & Z + PHP + PLA + STA STATUS + TYA + PLP + RTS +STKOPC LDX SPNT STACK OPCODES + PLA OPCODE + TAY + AND #$10 + BEQ APCODE + TYA + ASL A + BCS OPCX + ASL A + ASL A + BCS XPLY + LDA YREG XPHY + BCC PUSH +XPLY JSR PULL + STA YREG + BCS UPDSTACK +OPCX ASL A + ASL A + BCS XPLX + LDA XREG XPHX + BCC PUSH +XPLX JSR PULL + STA XREG + BCS UPDSTACK +APCODE TYA + ASL A + ASL A + BMI PULLAP + BCC XPHP + LDA ACC XPHA + BCS PUSH +XPHP LDA STATUS +PUSH STA STACK,X + DEX + BNE UPDSTACK +PULLAP BCC XPLP + JSR PULL XPLA +ACCLOC STA ACC + BCS UPDSTACK +XPLP JSR PULL + STA STATUS +UPDSTACK JMP UPDSPNT +REGDSP JSR PRBL13 F(CTRL-E) + LDX #$07 +PRFLG LDA CHAR3,X PRINT 'NV-BDIZC' + JSR COUT + DEX + BPL PRFLG + JSR PRBL13 +RGDSPB JSR CROUT + LDA #$C1 PRINT ACC AND STATUS + JSR COUT IN BINARY + JSR OUTEQ + LDA ACC + JSR BNDSP + JSR OUTSP + LDA #$D0 + JSR COUT + JSR OUTEQ + LDA STATUS + JSR BNDSP + JSR PRBL13 + JSR RGDSP1 + JSR INSTDSP DISPLAY INSTRUCTION + JSR PRBL13 TO BE EXECUTED NEXT + JMP NEXTITM +RGDSP1 JSR CROUT + LDX #$FC +RDSP1 JSR OUTSP + LDA RTBL-$FC,X + JSR COUT + LDA #$BD + JSR COUT + LDA ACC-$FC,X + JSR PRBYTE + INX + BMI RDSP1 + JSR PRBL13 + LDX SPNT PRINT STACK IN THE FORM + LDY #$01 1NN- XX NN... + JSR PRYX2 + INX + LDY #6 + JSR OUTSP + LDA #$D8 + JSR COUT + JSR COUT +PRSTK JSR OUTSP + LDA STACK,X + JSR PRBYTE + INX + DEY + BNE PRSTK + JMP PRBL13 +BNDSP LDX #$08 INDEX FOR 8 BITS +NEXTBIT ASL A + PHA + BCS BIT1 + LDA #$30 '0' + DFB $2C SKIP NEXT INSTRUCTION +BIT1 LDA #$31 '1' + JSR COUT + PLA + DEX + BNE NEXTBIT + RTS +BINARY JSR PRA1 F(%) + JSR OUTSP + LDA (A1L),Y PRINT A1 IN BINARY. Y=0 + JSR BNDSP + JMP CROUT +BASCALC PHA + LSR A + AND #$03 + ORA #$04 + STA BASH + PLA + AND #$18 + BCC BSCLC2 + ADC #$7F +BSCLC2 STA BASL + ASL A + ASL A + ORA BASL + STA BASL + RTS +BELL LDY #$38 DURATION +BELL2 LDA #$2B FREQUENCY + JSR WAIT + LDA SPKR + DEY + BNE BELL2 + RTS +VIDOUT CMP #$A0 + BCC NOADV INVERSE, CTRL, OR FLASH +STOADV LDY CH + STA (BASL),Y + INC CH + LDA CH + CMP #$28 + BCS CR +RTS3 RTS +NOADV TAY + BPL STOADV INVERSE OR FLASH + CMP #$8D + BEQ CR + CMP #$88 + BNE RTS3 DON'T PRINT CTRL CHARS. + DEC CH BACKSPACE + BPL RTS3 + LDA #$28 + STA CH + DEC CH +UP LDA #$00 + CMP CV + BCS RTS4 + DEC CV +VTAB LDA CV +VTABZ JSR BASCALC + ADC #$00 + STA BASL +RTS4 RTS +HOME40 LDA #$00 + STA CV + LDY #$00 + STY CH +CLEOP1 PHA + JSR VTABZ + JSR CLEOLZ + LDY #$00 + PLA + ADC #$00 + CMP #$18 + BCC CLEOP1 + BCS VTAB +CR LDA #$00 + STA CH + INC CV + LDA CV + CMP #$18 + BCC VTABZ + DEC CV + LDA #$00 + PHA + JSR VTABZ +SCRL1 LDA BASL BASL = CURRENT + STA BAS2L BAS2L = OLD + LDA BASH + STA BAS2H + LDY #$28 + DEY + PLA + ADC #$01 + CMP #$18 + BCS SCRL3 + PHA + JSR VTABZ +SCRL2 LDA (BASL),Y + STA (BAS2L),Y + DEY + BPL SCRL2 + BMI SCRL1 +SCRL3 LDY #$00 + JSR CLEOLZ + BCS VTAB ALWAYS TAKEN +CLREOL LDY CH + LDA FLG8 SEE IF 80 COL VIDEO + BPL CLEOLZ 80 COL ONLY CLEARS NEXT + JMP PRBL33 33 SPACES FOLLOWING +CLEOLZ LDA #$A0 +CLEOL2 STA (BASL),Y + INY + CPY #$28 + BCC CLEOL2 + RTS +LWAIT LDA #$70 LIST SCROLL RATE +WAIT SEC +WAIT2 PHA +WAIT3 SBC #$01 + BNE WAIT3 + PLA + SBC #$01 + BNE WAIT2 + RTS +NXTA4 INC A4L INCREMENT A4 + BNE NXTA1 + INC A4H +NXTA1 LDA A1L + CMP A2L + LDA A1H + SBC A2H + INC A1L + BNE RTS4B + INC A1H +RTS4B RTS CARRY SET IF A1 >= A2 +CTRLC LDY KBD CTRL-C = BREAK TO MONITOR + BPL RTS4B + STY KBDSTRB + CPY #$93 CTRL-S = PAUSE + BNE CTLC +KYWAIT LDY PB0 F(S) ENTRY POINT + BMI KYWT2 + LDY KBD + BPL KYWAIT + STY KBDSTRB + DFB $2C +KYWT2 LDY #0 0 = OPEN APPLE PRESSED +CTLC CPY #$83 + BNE RTS4B + JMP MONZ +RDKEY JMP (KSWL) +KEYIN LDY CH + LDA (BASL),Y + PHA + AND #$3F INVERSE CURSOR + STA (BASL),Y + PLA + BIT KBD + BPL KEYIN + ORA #$80 + STA (BASL),Y + LDA KBD + BIT KBDSTRB + RTS +NOTCR LDA IN,X + JSR COUT + CMP #$88 + BEQ BCKSPC + CMP #$98 + BEQ CANCEL + CPX #34 BEEP ON LAST 4 CHAR. + BCC NOTCR1 + JSR BELL +NOTCR1 INX + CPX #38 38 CHARACTERS ALLOWED + BCC NXTCHAR +CANCEL LDA #$DC + JSR COUT +GETLNZ JSR CROUT + LDA PROMPT + JSR COUT + LDX #$01 +BCKSPC TXA + BEQ GETLNZ + DEX +NXTCHAR JSR RDKEY + CMP #$95 + BEQ NXTCHAR IGNORE '->' + CMP #$FF + BNE NOTDEL + LDA #$88 DELETE KEY = BACKSPACE +NOTDEL CMP #$88 + BNE CAPTST + PHA + JSR COUT BACKSPACE + JSR OUTSP DELETE CHARACTER + PLA BACKSPACE +CAPTST CMP #$E0 + BCC ADDINP + AND #$DF +ADDINP STA IN,X + CMP #$8D + BNE NOTCR + JSR CLREOL +CROUT LDA #$8D + BNE COUT +HOME LDA #$8C + BNE COUT +OUTSP LDA #$A0 + BNE COUT +PRA1 LDY A1H + LDX A1L +PRYX2 JSR CROUT + JSR PRNTYX + LDY #$00 + LDA #$AD + JMP COUT +MOD8CHK LDA A1L + AND #$07 + BNE DATAOUT +XAM JSR PRA1 F(.) A1.A2 +DATAOUT JSR OUTSP + LDA A1H SEE IF ZERO PAGE + BNE XAM2 + LDA A1L + SEC + SBC #ZFLG + BCC XAM2 TAKEN IF A1L < ZFLG + TAX OTHERWISE GET FROM ZBUF + LDA ZBUF,X + DFB $2C SKIP NEXT INSTRUCTION +XAM2 LDA (A1L),Y + JSR PRBYTE + JSR NXTA1 + BCC MOD8CHK CARRY CLEAR IF A1PRINIT SIMULATE PR#1 + LDA #MKEYIN PROPER DOS HOOKS. + STA MKSWH + STY MKSWL + LDA #MVIDOUT + STA MCSWH + STY MCSWL + LDA #40 + STA WNDWDTH + JSR IN40 + STA SETAN0 + STA CLR80COL + STA CLR80VID + JSR HOME40 +STPRMPT LDA #$A3 + STA PROMPT + RTS +IN40 LDX #4 +MOVE40 LDA HOOK40-1,X + STA CSWL-1,X + DEX + BNE MOVE40 + STX FLG8 SET = 0 +RTS7 RTS +CHKVID LDA RD80VID RESET 40/80 COL IF NEEDED + ASL A BIT 7 INTO CARRY + LDA FLG8 + BMI CHK80 + BCC RTS7 + BCS IN80 40 -> 80 +CHK80 BCS RTS7 + BCC IN40 80 -> 40 + SKP 1 +*** 80 COLUMN DRIVER ROUTINE *** + SKP 1 +INIT80 JSR HOME + JSR PR3 + STA CLRCHAR2 + JSR IN80 + BMI STPRMPT RTS VIA STPRMPT +IN80 LDX #3 +MOVE80 LDA MCSWL,X + STA CSWL8,X + LDA HOOK80,X + STA CSWL,X + DEX + BPL MOVE80 + STX FLG8 SET = FF + RTS +COUT80 JSR EXCHV + JSR COUTZ80 + JMP EXCHV +COUTZ80 JMP (CSWL8) +KEYIN80 JSR EXCHV + JSR KEY80 + JMP EXCHV +KEY80 JMP (KSWL8) +EXCHV PHA + TXA + PHA + LDA CH + LDX MCH + STA MCH + STX CH + LDA CV + LDX MCV + STA MCV + STX CV + PLA + TAX + PLA + RTS + SKP 1 +*** SELF-DIAGNOSTIC UTILITY *** + SKP 1 +CKMAIN JSR CMPSUM F(?) + BNE ERRSUM + JSR CROUT + LDA #$CF PRINT 'OK' + JSR COUT + LDA #$CB + JSR COUT + JMP CROUT +ERRSUM JMP PRERR +CMPSUM JSR DOSUM + LDA A3L + CMP CHKSUM + BNE RTS8 + LDA A3H + CMP CHKSUM+1 +RTS8 RTS +DOSUM LDA STARTLOC + STA A1L + LDA STARTLOC+1 + STA A1H + LDA ENDLOC + STA A2L + LDA ENDLOC+1 + STA A2H + LDX #0 + STX A3L + STX A3H +GETBYT CLC + LDA (A1L,X) + ADC A3L + STA A3L + LDA #0 + ADC A3H + STA A3H + JSR NXTA1 + BCC GETBYT + RTS +INITSUM JSR DOSUM CHKSUM OF START-ENDMAIN + LDA A3L + STA CHKSUM + LDA A3H +CSUMLOC STA CHKSUM+1 + RTS + SKP 1 +*** PROGRAM DATA AREA *** + SKP 1 +TITLE ASC "ANALYST 4.3" + DFB $8D TITLE MARKS START OF PDA + ASC "ORG = $" + DFB $00 +FMT2 DFB 0,33,129,130,90,73,89,77 + DFB 145,146,134,74,133,157 +MNEML DFB 28,138 + DFB 28,35,93,139,27,161,157,138 + DFB 29,35,157,139,29,161,28,41 + DFB 25,174,105,168,25,35,36,83 + DFB 27,35,36,83,25,161,173,26 + DFB 165,91,165,172,139,138,174,174 + DFB 168,173,41,138,124,139,21,156 + DFB 109,156,165,105,41,83,132,19 + DFB 52,17,165,105,35,160 +MNEMR DFB 216,98 + DFB 90,72,38,98,148,136,84,68 + DFB 200,84,104,68,232,148,196,180 + DFB 8,132,116,180,40,110,116,244 + DFB 204,74,114,242,164,138,6,170 + DFB 118,162,116,198,116,116,68,104 + DFB 178,50,178,114,34,114,26,26 + DFB 38,38,114,114,136,200,196,202 + DFB 38,72,68,68,162,200 +FMT1 DFB 240,34,0,51,93,130,0,147 + DFB 243,34,0,51,93,136,0,153 + DFB 240,47,0,51,93,143,0,159 + DFB 240,34,0,59,93,136,0,148 + DFB 253,34,0,51,93,200,0,147 + DFB 17,34,0,51,93,200,0,169 + DFB 241,34,0,51,93,143,0,159 + DFB 241,34,0,51,93,143,0,159 + DFB 38,49,135,154 +OPC65C DFB 18,50,82,114 + DFB 146,178,210,242,58,26,137,28 + DFB 20,122,90,156,100,158,116,124 + DFB 60,52 + DFB 76,164,172,180,188,196,204,228 + DFB 236 +REPL65C DFB 17,49,81,113,145,177 + DFB 209,241,194,226,52,164,172,196 + DFB 228,92,92,92,92,124,60,52 + DFB 124,160,160,160,160,192,192 + DFB 224,224 +CHAR1 DFB 172,169,172,163,168,164 +CHAR2 DFB 217,0,216,164,164,0 +CHAR3 ASC "CZIDB-VN" +RTBL ASC "AXYP" +CHRTBL DFB 152,249,3,190,236 + DFB 166,164,6,149,5,187 + DFB 0,147,2,167,198,153 + DFB 186,154,239,233,1,191 + DFB 237,158,235,197 +SUBTBL DW CKMAIN-1 F(?) DO CHCKSUM OF MAIN + DW SETVID-1 F(@) SWITCH SCREENS + DW EXECJSR-1 F(J) EXECUTE JSR + DW REGDSP-1 F(CTRL-E) DISPLAY REGS + DW STEP-1 F(S) STEP + DW SETMODE-1 F(-) 16 BIT SUBTRACTION + DW SETMODE-1 F(+) 16 BIT ADDITION + DW MOVE-1 F(M) MOVE + DW LT-1 F(<) COPY A2 TO A4 & A5 + DW LIST-1 F(L) LIST 22 LINES + DW BASIC-1 F(CTRL-B) DOSWARM VECT. + DW GO-1 F(G) GO + DW SETMODE-1 F(:) STORE + DW SETREG-1 F(I) SET INTERNAL PC/REG + DW SETMODE-1 F(.) XAM + DW CRMON-1 F(CR) HANDLE CR + DW BLANK-1 F( ) HANDLE SPACES + DW ASC-1 F(CTRL-A) DUMP IN ASCII + DW MINI-1 F(!) MINI-ASSEMBLER + DW VFY-1 F(V) VERIFY + DW SETPRNT-1 F(P) TO PRINTER + DW LOAD-1 F(H) LOAD FOR HSF + DW FIND-1 F(CTRL-F) HEX SEQ. FIND + DW TRACE-1 F(T) TRACE OR SET TLIMIT + DW BINARY-1 F(%) VALUE IN BINARY + DW RELOC-1 F(R) RELOCATOR + DW CRMON-1 HANDLE CTRL-L AS CR +HOOK40 DW COUT40 + DW KEYIN +HOOK80 DW COUT80 + DW KEYIN80 +IRQLOC DW IBREAK +BRKLOC DW BREAK +STARTLOC DW START +ENDLOC DW ENDMAIN +ERRMSG DFB $8D MARKS END OF WORDS + ASC 'ERR ' + DFB $8D +ENDMAIN DFB $00 = END OF STATIC PGM AREA + SKP 1 +*** DYNAMIC PROGRAM AREA *** + SKP 1 +CSWL DS 1 ADDR. OF OUTPUT ROUTINE +CSWH DS 1 +KSWL DS 2 ADDR. OF INPUT ROUTINE +CSWL8 DS 2 DON'T CHANGE ORDER +KSWL8 DS 2 OF CSWL-KSWL8 +LMNEM DS 1 +RMNEM DS 1 +LENGTH DS 1 +MODE DS 1 +FORMAT DS 1 +FUNNY DS 1 RESET VECTOR FUNNY BYTE +ERRFLG DS 1 SET FOR BAD OPCODE +XFLG DS 1 1 = SKIP INSTRUCTION +TFLG DS 1 1 = CANCEL COUT FOR TRC +JFLG DS 1 SET TO ALLOW F(J) +FLG8 DS 1 FF = 80 COL, 0 = 40 COL +PROMPT DS 1 +CH DS 1 +CV DS 1 +ACC DFB 0 DON'T CHANGE ORDER +XREG DFB 0 OF ACC TO SPNT +YREG DFB 0 +STATUS DS 1 +SPNT DS 1 +YSAV DS 1 +YSAV1 DS 1 +IN DS 38 KEYIN BUFFER. IN+37 TEMP. +TLIMIT DS 1 PAGE# OF TRACE LIMIT +XQT DS 15 BUFFER FOR F(S,CTRL-F,J) +ZBUF DS $100-ZFLG PAGE ZERO STORAGE BUFFER +CHKSUM DS 2 CHKSUM OF STATIC PROG. diff --git a/ANALYST 5.0.txt b/ANALYST 5.0.txt new file mode 100644 index 0000000..37b12a2 --- /dev/null +++ b/ANALYST 5.0.txt @@ -0,0 +1,1988 @@ + LST OFF + SBTL + MSB ON + ORG $6000 + SKP 1 +********************************* +* * +* -< THE ANALYST >- * +* * +* VERSION 5.0 * +* * +* BY * +* * +* LARRY A. GREENE * +* * +********************************* + SKP 1 +*** DESCRIPTION *** + SKP 1 +; THIS PROGRAM OPERATES INDEPENDENT OF ROM BUT HAS COM- +; MANDS SIMILAR TO THE BUILT IN MONITOR. THE TRACE AND +; STEP FUNCTIONS HAVE BEEN GREATLY ENHANCED TO DISPLAY +; STATUS REGISTER FLAGS AND SET A BREAK POINT. THE MINI +; ASSEMBLER HAS BEEN INCLUDED AS WELL AS A HEX SEQUENCE +; FINDER. 65C02 OPCODES ARE ALSO SUPPORTED. ZERO PAGE +; REFS ARE STORED IN A BUFFER WHICH AVOIDS CONFLICT WITH +; THE PROGRAM BEING TRACED. THIS PROGRAM USES THE BOTTOM +; 1/4 OF THE STACK ($100-140). TO USE DOS EXIT WITH +; CTRL-B AND RE-ENTER WITH &. + SKP 1 +*** COMMANDS *** + SKP 1 +; CTRL-A DUMP MEMORY IN ASCII +; CTRL-B ENTER RESIDENT BASIC W/DOS. & TO RETURN +; CTRL-E EXAMINE INTERNAL REGISTERS +; CTRL-F FIND SPECIFIED HEX SEQUENCE DEFINED BY F(H) +; G GO EXECUTE IN IMMEDIATE MODE +; H LOAD BYTES FOR HSF F(CTRL-F) BY USING H: +; I CHANGE PC AND/OR INTERNAL A,X,Y,P,S REGISTERS +; J JUMP. EXECUTE JSR INSTRUCTION IN STEP MODE +; CTRL-L CLEAR PRESENT SCREEN AND HOME CURSOR +; L LIST DISASSEMBLED INSTRUCTIONS +; M MOVE BLOCK OF MEMORY +; P SEND OUTPUT TO PRINTER +; R RELOCATE ANALYST TO NEW ADDRESS PAGE +; S ENTER STEP MODE. STEP INSTRUCTION +; T TRACE PROGRAM OR SET TRACE LIMIT +; V VERIFY TWO BLOCKS OF MEMORY +; CTRL-X CANCEL LINE ENTRY +; X SKIP NEXT INSTRUCTION IN STEP MODE +; % PRINT ADDRESS DATA VALUE IN BINARY +; ? PRINT ORIGIN ADDRESS & DO INTERNAL CHECKSUM +; @ SWITCH GRAPHICS/TEXT SCREENS +; < RANGE DELIMITER +; . RANGE DELIMITER +; + 16 BIT ADDITION +; - 16 BIT SUBTRACTION +; : STORE VALUE IN MEMORY +; ! ENTER MINI-ASSEMBLER. "#" TO EXIT + SKP 1 +*** OPERATING NOTES *** + SKP 1 +; INPUT LINE LIMITED TO 38 CHARACTERS. BEEPS ON LAST 4. + SKP 1 +; HOME (CTRL-L) ACTS IMMEDIATELY. FOLLOW WITH . + SKP 1 +; FOR STEP TYPE 300S THEN S, OPEN-APPLE, SPACE, OR +; J TO STEP EACH INSTRUCTION. S OR OPEN-APPLE TO STEP +; INTO JSR. J TO EXECUTE SUBROUTINE. X TO SKIP INSTRUC- +; TION. T TO ENTER TRACE. @ FOR TEXT. CTRL-C TO EXIT. + SKP 1 +; FOR TRACE USE FFFF<2000T WHERE FFFF DENOTES BRKPOINT. +; PC PRINTED AT UPPER LEFT EVERY 256 LINES. OPEN APPLE +; ENTERS SLOW TRACE WITH PC PRINTED EACH LINE. CLOSED +; APPLE EXITS TO STEP MODE. TRACE WILL EXECUTE SUB- +; ROUTINES ABOVE PAGE# LIMIT IN IMMEDIATE MODE IF SET +; BY T:NN. TO TRACE ALL SET T:00 WHICH IS DEFAULT VALUE. +; TRACE ACTIVITY INDICATED BY FLASHING $ OR # FOR JSR +; IMMEDIATE MODE. BREAKPOINT ENTERS STEP MODE AND DOES +; EXECUTE BREAKPOINT INSTRUCTION. + SKP 1 +; FOR JUMP TYPE 'J5' WHERE 5 REPRESENTS # OF PARM BYTES +; FOLLOWING JSR INSTRUCTION. J DEFAULTS TO 0. JUMP +; DURING STEP & TRACE IMMEDIATE HANDLE JSR $BF00 AS +; PRODOS MLI CALL WITH 3 PARM BYTES FOLLOWING. MUST USE +; 'J3' FROM COMMAND LINE. IF SUBROUTINE BEING 'JUMPED' +; CONTAINS A TXS INSTRUCTION, ANALYST WILL LOSE CONTROL! + SKP 1 +; STEP & TRACE BREAK FOR ILLEGAL OPCODES. PRINTS 'ERR' + SKP 1 +; TO CHANGE PC AND/OR INTERNAL REGS TYPE 300I:AA XX +; YY PP SS . PC ENTRY BEFORE I OPTIONAL. + SKP 1 +; FOR HEX SEQUENCE FINDER TYPE H:N1 N2 N3... +; 1000<2000 CTRL-F . + SKP 1 +; TO DUMP MEMORY IN ASCII USE 1000.2000 CTRL-A . + SKP 1 +; TO PRINT ADDRESS BYTE IN BINARY TYPE 2000% . + SKP 1 +; TO SWITCH SCREENS TYPE @H1,H2,L1,L2,4,8 OR @ FOR TEXT. +; H2,L2 ONLY AVAILABLE IN 40 COL MODE DUE TO HARDWARE. + SKP 1 +; TO RELOCATE TYPE NN00R . WILL ROUND OFF TO NEAREST +; PAGE BOUNDARY. DO NOT SET < $800! IF < 4K FROM OLD +; ORIGIN, WILL BE IGNORED. IF MOVED TO RAM CARD DO NOT +; CHANGE CARD R/W STATE! + SKP 1 +; DO NOT USE THE PRINTER WHEN THE ANALYST IS LOCATED +; ON THE RAM CARD. THE PRINTER WILL NOT INITIALIZE. +; ALSO RESET WILL NOT RETURN TO THE ANALYST LOCATED +; ON THE RAM CARD WITH 128K MACHINES. + SKP 1 +; & VECTOR $3F5 IS A WARMSTART RE-ENTRY WHICH CAN BE +; USED TO JMP INTO ANALYST FROM A RUNNING PROGRAM +; WITH ALL REGS PRESERVED. + SKP 1 +; THE ANALYST USES $C01F TO DETECT 80 COL MODE. +; THIS METHOD IS INVALID ON OLDER NON-IIE APPLES. + SKP 1 +*** ROM ZERO PAGE EQUATES *** + SKP 1 +WNDWDTH EQU $21 +MCH EQU $24 +MCV EQU $25 +MCSWL EQU $36 +MCSWH EQU $37 +MKSWL EQU $38 +MKSWH EQU $39 +MPCL EQU $3A +MPCH EQU $3B +MACC EQU $45 +MXREG EQU $46 +MYREG EQU $47 +MSTATUS EQU $48 +MSPNT EQU $49 +RNDL EQU $4E +SPDBYT EQU $F1 APPLESOFT SPEED= + SKP 1 +*** ANALYST EQUATES *** + SKP 1 +STKLMT EQU $40 TOP OF STACK (IMMEDIATE) +ZFLG EQU $EE 2 BYTE ID ($D5 $AA) +A1L EQU $F0 A1L-A5H MUST BE IN ORDER +A1H EQU $F1 FOR MINI-ASSEMBLER +A2L EQU $F2 +A2H EQU $F3 +A3L EQU $F4 +A3H EQU $F5 +A4L EQU $F6 +A4H EQU $F7 +A5L EQU $F8 +A5H EQU $F9 +PCL EQU $FA +PCH EQU $FB +BASL EQU $FC +BASH EQU $FD +BAS2L EQU $FE +BAS2H EQU $FF LABEL MARKS END OF PAGE 0. +STACK EQU $0100 +DOSV EQU $03D0 DOS BASIC WARM ENTRY +BRKV EQU $03F0 BREAK VECTOR +SOFTEV EQU $03F2 RESET VECTOR +AMPERV EQU $03F5 ANALYST WARMSTART RE-ENTRY +MLI EQU $BF00 PRODOS INTERFACE + SKP 1 +*** ROM EQUATES *** + SKP 1 +KBD EQU $C000 +CLR80COL EQU $C000 ENABLE PAGE2 DISPLAY +CLRIOROM EQU $C006 +CLR80ROM EQU $C00A +CLR80VID EQU $C00C +CLRCHAR2 EQU $C00E +KBDSTRB EQU $C010 +RD80VID EQU $C01F BMI IF 80 COL MODE +SPKR EQU $C030 +TXTCLR EQU $C050 +TXTSET EQU $C051 +MIXCLR EQU $C052 +LOWSCR EQU $C054 +HISCR EQU $C055 +LORES EQU $C056 +HIRES EQU $C057 +SETAN0 EQU $C058 +PB0 EQU $C061 OPEN APPLE KEY +PB1 EQU $C062 CLOSED APPLE KEY +SWITCH2 EQU $C082 +SWITCH3 EQU $C083 +PRINIT EQU $C100 PRINTER IN SLOT 1 +PR3 EQU $C300 +MKEYIN EQU $FD1B +MVIDOUT EQU $FDF0 +RESET EQU $FFFC RESET VECTOR IN RAMCARD +IRQ EQU $FFFE BREAK VECTOR IN RAMCARD + SKP 3 +GETSUM JSR INITSUM CREATE CHECKSUM OF MAIN + LDA #$2C WHEN FIRST BRUN +SUMLOC STA GETSUM DISABLE CHECKSUM + SKP 1 +*** STATIC MAIN PROGRAM AREA *** + SKP 1 +START CLD RESET POINTS HERE + LDX #STKLMT SET ANALYST STACK UPPER + TXS LIMIT + LDA ZFLG + CMP #$D5 + BNE NOID + LDA ZFLG+1 + CMP #$AA + BEQ START2 IF ID NOT PRESENT +NOID JSR ZSWAP THEN SWAP 0 PAGE + LDA #$D5 & SET ID --> ZFLG:D5 AA + STA ZFLG + LDA #$AA + STA ZFLG+1 +START2 JSR TXT1 PRIMARY TEXT MODE + JSR INIT40 SET FOR 40 COL DISPLAY + LDA #$00 + STA CLR80ROM DISABLE 80 COL ROM + STA CLRIOROM DISABLE INTERNAL I/O + STA CLRCHAR2 PRIMARY CHAR SET + STA TLIMIT TRACE ALL + STA STATUS CLEAR STATUS + STA ERRFLG CLEAR FLAGS + STA XFLG + STA TFLG + STA JFLG + STA PCL + STA PCH + LDX #$F0 + STX SPNT +CLRSTK STA STACK,X = 0 + INX + BNE CLRSTK + JSR SETRV RESET VECTOR TO 'START' + LDA IRQLOC SET IRQ TO HANDLE + STA IRQ BREAK INSTRUCTIONS + LDA IRQLOC+1 + STA IRQ+1 + LDA BRKLOC + STA BRKV + LDA BRKLOC+1 + STA BRKV+1 + JSR PRTITLE + JMP MONZ +SETRV LDA STARTLOC + STA SOFTEV + STA RESET + LDA STARTLOC+1 + STA SOFTEV+1 + STA RESET+1 + EOR #$A5 + STA SOFTEV+2 + STA FUNNY SAVE FOR REFERENCE + RTS +INSDS1 LDX PCL + LDY PCH + JSR PRYX2 + JSR OUTSP + LDX #0 +INSDST LDA (PCL,X) +INSDS2 LDY #$FF DETERMINE LENGTH OF + STY LMNEM INSTRUCTION. OPCODE IN + TAY ACC. STORED IN LENGTH. + LSR A INVALID = 0 + BCC IEVEN 1 BYTE = 0 + ROR A 2 BYTE = 1 + BCS ERR 3 BYTE = 2 + AND #$87 +IEVEN LSR A + TAX + LDA FMT1,X + BCC RTMSKZ + LSR A + LSR A + LSR A + LSR A +RTMSKZ AND #$0F + CMP #$0F + BNE GETFMT +ERR LDY #$FF BAD OPCODE + STY ERRFLG + INY + STY LMNEM + STY RMNEM + STY FORMAT + STY LENGTH +RTS1 RTS +GETFMT TAX + LDA FMT2,X + STA FORMAT + AND #$03 + STA LENGTH + LDA TFLG BYPASS PRINT FORMATTING + BNE RTS1 IN TRACE + TYA + AND #$8F + STA IN+37 TEMP STORAGE + TYA + LDX #31 +GETFMT2 DEX + BMI MNNDX + CMP OPC65C,X MAKE SUBSTITUTION IF + BNE GETFMT2 65C02 OPCODE. + LDA REPL65C,X +MNNDX LDX IN+37 + LDY #$03 + CPX #$8A + BEQ MNNDX3 +MNNDX1 LSR A + BCC MNNDX3 + LSR A +MNNDX2 LSR A + ORA #$20 + DEY + BNE MNNDX2 + INY +MNNDX3 DEY + BNE MNNDX1 + RTS +INSTDSP JSR INSDS1 + PHA +PRNTOP LDA (PCL),Y + JSR PRBYTE + LDX #$01 +PRNTBL JSR PRBLNK + CPY LENGTH + INY + BCC PRNTOP + LDX #$03 + CPY #$03 + BCC PRNTBL + PLA + TAY + LDA LMNEM + BEQ PRMN1 + LDA MNEML,Y + STA LMNEM + LDA MNEMR,Y + STA RMNEM +PRMN1 LDA #$00 + LDY #$05 +PRMN2 ASL RMNEM + ROL LMNEM + ROL A + DEY + BNE PRMN2 + ADC #$BF + JSR COUT + DEX + BNE PRMN1 + JSR OUTSP + LDY LENGTH + LDX #$05 +PRADR1 CPX #$02 + BEQ PRADR5 +PRADR2 ASL FORMAT + BCC PRADR3 + LDA CHAR1,X + JSR COUT + LDA CHAR2,X + BEQ PRADR3 + JSR COUT +PRADR3 DEX + BPL PRADR1 + RTS +PRADR4 DEY + BMI PRADR2 + JSR PRBYTE +PRADR5 LDA FORMAT + CMP #$E8 + LDA (PCL),Y + BCC PRADR4 + JSR PCADJA + TAX + INX + BNE PRNTYX + INY +PRNTYX TYA +PRNTAX JSR PRBYTE + TXA + JMP PRBYTE +PRBL13 LDX #13 + DFB $2C SKIP NEXT INSTRUCTION +PRBL33 LDX #33 +PRBLNK JSR OUTSP PRINT X SPACES + DEX + BNE PRBLNK + RTS +PCADJ SEC UPDATE PC BY LENGTH+1 +PCADJLP LDA LENGTH +PCADJAP JSR PCADJA + STA PCL + STY PCH + RTS +PCADJL LDA LENGTH UPDATE PC BY LENGTH +PCADJA LDY PCH UPDATE PC BY ACC + TAX + BPL PCADJ2 + DEY +PCADJ2 ADC PCL + BCC RTS2 + INY +RTS2 RTS NEW PC IN Y,A +STEP TXA F(S) + BNE SSTEP FIRST TIME + JSR KYWAIT CTRL-C = BREAK + CPY #$CA + BNE STEP2 + LDA JFLG J = SINGLE STEP + BEQ SSTEP IF NO JSR, ELSE + DEC YSAV EXECUTE SUBROUTINE + PLA + PLA + JMP TRCPCS +STEP2 LDA JFLG SPC = SINGLE STEP IF + BNE STEP3 NOT JSR, ELSE IGNORE + CPY #$A0 + BEQ SSTEP +STEP3 CPY #$D3 S OR OPEN APPLE = + BEQ SSTEP SINGLE STEP ALWAYS + TYA + BEQ SSTEPW = 0 FOR OPEN APPLE. + CPY #$D4 T = ENTER TRACE MODE + BNE STEP4 + INC TFLG SET TRACE MODE FLAG + JMP TRACE4 AND ENTER TRACE. +STEP4 CPY #$C0 @ = TEXT MODE + BNE STEP5 + JSR TXT1 +STEP5 CPY #$D8 X = SKIP NEXT INSTRUCTION + BNE STEP + LDA #1 TURN OFF XQT EXECUTION + STA XFLG +SSTEPW LDA #$FF PAUSE TO RELEASE O/A KEY + JSR WAIT +SSTEP JSR A1PC +SSTEPT DEC YSAV TRACE RE-ENTRY TO STEP + LDA #0 + STA CV + STA CH + JSR VTABZ + DEC CV TOP OF SCRN AFTER CROUT + JSR INSTDSP + JSR CLREOL + PLA REMOVE RTS TO NEXTITM + PLA + LDX XFLG + BEQ NOSKIP + DEX + STX XFLG + STX ERRFLG IN CASE SKIPPING ERROR + JSR PCADJ + JMP NXTPC SKIP INSTRUCTION +NOSKIP JMP TSTEP +PRNTPC LDA #0 PRINT PC AT UPPER LEFT + STA CH + LDA PROMPT + JSR COUT + LDA PCH + LDX PCL + JMP PRNTAX +TRACEPC JSR CHKVID CHECK/RESET 40/80 MODE + INC RNDL PRINT PC + BNE TRCPC1 EVERY 256 INSTRUCTIONS + LDA PROMPT FLASHING '$' FOR TRACE + EOR #$04 ACTIVITY. $A4->$A0->$A4 + STA PROMPT + JSR PRNTPC +TRCPC1 LDA JFLG + BEQ TRACE5 + LDA TLIMIT + BEQ TRACE5 FULL TRACE IF TLIMIT=0. + LDA PCH + CMP TLIMIT SEE IF PC > TLIMIT PAGE# + BCC TRACE5 IF SO, EXEC JSR IMMED. + JSR STPRMPT '#' DENOTES JSR IMMED. + JSR PRNTPC PRINT EXEC SUBROUTINE + INC PROMPT '#' -> '$' +TRCPCS LDA PCL SEE IF PC = $BF00 + BNE TRCPCG + LDA PCH + CMP # '$' 1ST TIME ONLY + LDA #$FF FORCE VTAB TO TOP OF SCRN + STA CV WHEN CROUT INC'S CV TO 0 + JSR CROUT (NEEDED FOR 80 COL). +TRACE5 LDX #1 IF PC = A4 THEN ENTER STEP +TRACE5A LDA PCL,X + CMP A4L,X + BNE TRACE6 + DEX + BPL TRACE5A + INX + BEQ TRACES ALWAYS TAKEN +TRACE6 LDY #0 + LDA (PCL),Y GET OPCODE + CMP #$91 CHECK FOR STA (IND),Y + BNE TRACE7 TO SEE IF BLOCK MOVE + INY INTO ANALYST MAIN + LDA (PCL),Y GET OPERAND + TAX + LDA $01,X GET IND ADDR HI-BYTE + CMP SOFTEV+1 SEE IF PAGE# < START + BCC TRACE7 (SOFTEV = START ADDR) + CMP CSUMLOC+2 OR > CHKSUM PAGE# + BCS TRCBRK IF NOT THEN BREAK + LDA #0 FORCE BRANCH +TRCBRK BEQ XBRK +TRACE7 LDX #0 FOR INSDST + LDA PB1 BACK TO STEP MODE IF + BPL TRACE8 CLOSED APPLE PRESSED +TRACES STA KBDSTRB + STX TFLG CLEAR TRACE FLAG + JSR TXT1 + JSR STPRMPT PROMPT BACK TO OLD '#' + LDY YSAV + DEY + LDA #$D3 PUT 'S' INTO INPUT BUFFER + STA IN,Y + JMP SSTEPT RE-ENTER STEP MODE +TRACE8 LDA PB0 SLOW TRACE IF OPEN APPLE + BPL TRACE9 PRESSED + LDA #$FF + STA RNDL FORCE PC PRINTING + PHA + JSR WAIT + PLA + JSR WAIT +TRACE9 JSR INSDST +TSTEP LDA FUNNY SEE IF RESET VECTOR + CMP SOFTEV+2 HAS BEEN CHANGED + BEQ TSTEP2 + JSR SETRV GET BACK RESET CONTROL +TSTEP2 LDA ERRFLG IF BAD OPCODE THEN BRK + BEQ TSTEP3 +XBRK LDY TFLG + BEQ SBRK + DEY + STY TFLG + DEY + STY A4L CLEAR OLD BREAK POINT + STY A4H +GBRK JSR INSTDSP DISP BRK FOR GO & TRACE + JSR RGDSP1 + BEQ BRKMON ALWAYS TAKEN +SBRK JSR CROUT + LDA #5 + STA CV + JSR VTABZ + JSR CLREOL ERASE OLD INSTRUCTION +BRKMON JMP ERRMON +XTSX LDX SPNT + STX XREG +XTXS LDX XREG +UPDSPNT STX SPNT UPDATE SPNT + CPX #STKLMT+1 STACK OVERFLOW IF + BCC XBRK IN ANALYST WORK AREA +UPDPC SEC UPDATE PC + BCS PCINC +TSTEP3 TAX = 0 + STX JFLG DISALLOW F(J) IF NO JSR + LDA (PCL,X) GET OPCODE + BEQ XBRK + LDY LENGTH + CMP #$20 + BEQ XJSR + CMP #$60 + BEQ XRTS + CMP #$BA + BEQ XTSX + CMP #$9A + BEQ XTXS + CMP #$7C + BEQ XJMPATX + CMP #$4C + BEQ XJMP + CMP #$6C + BEQ XJMPAT + CMP #$40 + BEQ XRTI + PHA + CMP #$5A + BCC TSTEP4 + TAX + AND #$1F + CMP #$1A + BEQ STACKOP PHX,PLX,PHY,PLY + TXA +TSTEP4 AND #$9F + CMP #$08 + BNE TSTEP5 +STACKOP JMP STKOPC PHA,PLA,PHP,PLP +TSTEP5 LDX #$08 +XQINIT LDA INITBL-1,X + STA XQT,X + DEX + BNE XQINIT + PLA OPCODE + CMP #$80 + BNE NBRA + ORA #$10 +NBRA AND #$1F + EOR #$14 + CMP #$04 = BRANCH OFFSET + BEQ XQ2 TAKEN IF BRANCH OPCODE +XQ1 LDA (PCL),Y Y = LENGTH +XQ2 STA XQT,Y XQT BCS BRNCH (B0 04) + DEY NOP + BPL XQ1 JMP NBRNCH (CCLR) + JMP XQJ BRNCH JMP BRANCH (CSET) +XRTI CLC + PLA + STA STATUS +XRTS LDX SPNT + INX + LDA STACK,X + STA PCL + INX + LDA STACK,X + STA PCH + STX SPNT +PCINC JSR PCADJLP + CLC + BCC NEWPC +XJMPATX INX + BNE XJMPAT +XJSR STA JFLG OK FOR F(J) + CLC + JSR PCADJL SET Y,A = RTS ADDR + PHA + LDX SPNT + TYA + STA STACK,X + DEX + PLA + STA STACK,X + DEX + STX SPNT + LDY #$02 +XJMP CLC +XJMPAT LDA (PCL),Y + PHA + DEY + LDA (PCL),Y + STA PCL + PLA + STA PCH + BCC NEWPC + DEX + BNE XJMP + LDA XREG + CLC + JSR PCADJAP + LDY #1 + BNE XJMP +NEWPC LDA TFLG + BNE TRACEBY BYPASSES NEXTITM +NXTPC JSR CROUT + JMP REGDSP +TRACEBY JMP TRACEPC +IBREAK STA MACC + PLP FOR IRQ W/CARD ON + STX MXREG + STY MYREG + PHP + PLA + STA MSTATUS + TSX + STX MSPNT + CLD + PLA + STA MPCL + PLA + STA MPCH +BREAK SEC IRQ W/ CARD OFF + LDA MPCL ROM SAVED PC + SBC #2 AFTER DEC BY 2 + STA PCL + LDA MPCH + SBC #0 + STA PCH + LDX #4 +BRKSAVE LDA MACC,X COPY SAVED REGS + STA ACC,X + DEX + BPL BRKSAVE + LDX #$40 RESTORE ANALYST STACK + TXS + JMP GBRK +BRANCH JSR SAVE BRANCH WITH COND. MET + CLC + LDY #$01 + LDA (PCL),Y + JSR PCADJAP + JMP UPDPC +NBRNCH JSR SAVE ALL OTHER OPCODES + JMP UPDPC +INITBL NOP + NOP + JMP NBRNCH + JMP BRANCH +PULL PHP + INX + LDA STACK,X + TAY + LDA STATUS PULL FROM STACK AFFECTS + PHA N & Z FLAGS + PLP + TYA UPDATE N & Z + PHP + PLA + STA STATUS + TYA + PLP + RTS +STKOPC LDX SPNT STACK OPCODES + PLA OPCODE + TAY + AND #$10 + BEQ APCODE + TYA + ASL A + BCS OPCX + ASL A + ASL A + BCS XPLY + LDA YREG XPHY + BCC PUSH +XPLY JSR PULL + STA YREG + BCS UPDSTACK +OPCX ASL A + ASL A + BCS XPLX + LDA XREG XPHX + BCC PUSH +XPLX JSR PULL + STA XREG + BCS UPDSTACK +APCODE TYA + ASL A + ASL A + BMI PULLAP + BCC XPHP + LDA ACC XPHA + BCS PUSH +XPHP LDA STATUS +PUSH STA STACK,X + DEX + BNE UPDSTACK +PULLAP BCC XPLP + JSR PULL XPLA +ACCLOC STA ACC + BCS UPDSTACK +XPLP JSR PULL + STA STATUS +UPDSTACK JMP UPDSPNT +REGDSP JSR PRBL13 F(CTRL-E) + LDX #$07 +PRFLG LDA CHAR3,X PRINT 'NV-BDIZC' + JSR COUT + DEX + BPL PRFLG + JSR PRBL13 +RGDSPB JSR CROUT + LDA #$C1 PRINT ACC AND STATUS + JSR COUT IN BINARY + JSR OUTEQ + LDA ACC + JSR BNDSP + JSR OUTSP + LDA #$D0 + JSR COUT + JSR OUTEQ + LDA STATUS + JSR BNDSP + JSR PRBL13 + JSR RGDSP1 + JSR INSTDSP DISPLAY INSTRUCTION + JSR PRBL13 TO BE EXECUTED NEXT + JMP NEXTITM +RGDSP1 JSR CROUT + LDX #$FC +RDSP1 JSR OUTSP + LDA RTBL-$FC,X + JSR COUT + LDA #$BD + JSR COUT + LDA ACC-$FC,X + JSR PRBYTE + INX + BMI RDSP1 + JSR PRBL13 + LDX SPNT PRINT STACK IN THE FORM + LDY #$01 1NN- XX NN... + JSR PRYX2 + INX + LDY #6 + JSR OUTSP + LDA #$D8 + JSR COUT + JSR COUT +PRSTK JSR OUTSP + LDA STACK,X + JSR PRBYTE + INX + DEY + BNE PRSTK + JMP PRBL13 +BNDSP LDX #$08 INDEX FOR 8 BITS +NEXTBIT ASL A + PHA + BCS BIT1 + LDA #$30 '0' + DFB $2C SKIP NEXT INSTRUCTION +BIT1 LDA #$31 '1' + JSR COUT + PLA + DEX + BNE NEXTBIT + RTS +BINARY JSR PRA1 F(%) + JSR OUTSP + LDA (A1L),Y PRINT A1 IN BINARY. Y=0 + JSR BNDSP + JMP CROUT +BASCALC PHA + LSR A + AND #$03 + ORA #$04 + STA BASH + PLA + AND #$18 + BCC BSCLC2 + ADC #$7F +BSCLC2 STA BASL + ASL A + ASL A + ORA BASL + STA BASL + RTS +BELL LDY #$38 DURATION +BELL2 LDA #$2B FREQUENCY + JSR WAIT + LDA SPKR + DEY + BNE BELL2 + RTS +VIDOUT CMP #$A0 + BCC NOADV INVERSE, CTRL, OR FLASH +STOADV LDY CH + STA (BASL),Y + INC CH + LDA CH + CMP #$28 + BCS CR +RTS3 RTS +NOADV TAY + BPL STOADV INVERSE OR FLASH + CMP #$8D + BEQ CR + CMP #$88 + BNE RTS3 DON'T PRINT CTRL CHARS. + DEC CH BACKSPACE + BPL RTS3 + LDA #$28 + STA CH + DEC CH +UP LDA #$00 + CMP CV + BCS RTS4 + DEC CV +VTAB LDA CV +VTABZ JSR BASCALC + ADC #$00 + STA BASL +RTS4 RTS +HOME40 LDA #$00 + STA CV + LDY #$00 + STY CH +CLEOP1 PHA + JSR VTABZ + JSR CLEOLZ + LDY #$00 + PLA + ADC #$00 + CMP #$18 + BCC CLEOP1 + BCS VTAB +CR LDA #$00 + STA CH + INC CV + LDA CV + CMP #$18 + BCC VTABZ + DEC CV + LDA #$00 + PHA + JSR VTABZ +SCRL1 LDA BASL BASL = CURRENT + STA BAS2L BAS2L = OLD + LDA BASH + STA BAS2H + LDY #$28 + DEY + PLA + ADC #$01 + CMP #$18 + BCS SCRL3 + PHA + JSR VTABZ +SCRL2 LDA (BASL),Y + STA (BAS2L),Y + DEY + BPL SCRL2 + BMI SCRL1 +SCRL3 LDY #$00 + JSR CLEOLZ + BCS VTAB ALWAYS TAKEN +CLREOL LDY CH + LDA FLG8 SEE IF 80 COL VIDEO + BPL CLEOLZ 80 COL ONLY CLEARS NEXT + JMP PRBL33 33 SPACES FOLLOWING +CLEOLZ LDA #$A0 +CLEOL2 STA (BASL),Y + INY + CPY #$28 + BCC CLEOL2 + RTS +LWAIT LDA #$70 LIST SCROLL RATE +WAIT SEC +WAIT2 PHA +WAIT3 SBC #$01 + BNE WAIT3 + PLA + SBC #$01 + BNE WAIT2 + RTS +NXTA4 INC A4L INCREMENT A4 + BNE NXTA1 + INC A4H +NXTA1 LDA A1L + CMP A2L + LDA A1H + SBC A2H + INC A1L + BNE RTS4B + INC A1H +RTS4B RTS CARRY SET IF A1 >= A2 +CTRLC LDY KBD CTRL-C = BREAK TO MONITOR + BPL RTS4B + STY KBDSTRB + CPY #$93 CTRL-S = PAUSE + BNE CTLC +KYWAIT LDY PB0 F(S) ENTRY POINT + BMI KYWT2 + LDY KBD + BPL KYWAIT + STY KBDSTRB + DFB $2C +KYWT2 LDY #0 0 = OPEN APPLE PRESSED +CTLC CPY #$83 + BNE RTS4B + JMP MONZ +RDKEY JMP (KSWL) +KEYIN LDY CH + LDA (BASL),Y + PHA + AND #$3F INVERSE CURSOR + STA (BASL),Y + PLA + BIT KBD + BPL KEYIN + ORA #$80 + STA (BASL),Y + LDA KBD + BIT KBDSTRB + RTS +NOTCR LDA IN,X + JSR COUT + CMP #$88 + BEQ BCKSPC + CMP #$98 + BEQ CANCEL + CPX #34 BEEP ON LAST 4 CHAR. + BCC NOTCR1 + JSR BELL +NOTCR1 INX + CPX #38 38 CHARACTERS ALLOWED + BCC NXTCHAR +CANCEL LDA #$DC + JSR COUT +GETLNZ JSR CROUT + LDA PROMPT + JSR COUT + LDX #$01 +BCKSPC TXA + BEQ GETLNZ + DEX +NXTCHAR JSR RDKEY + CMP #$95 + BEQ NXTCHAR IGNORE '->' + CMP #$FF + BNE NOTDEL + LDA #$88 DELETE KEY = BACKSPACE +NOTDEL CMP #$88 + BNE CAPTST + PHA + JSR COUT BACKSPACE + JSR OUTSP DELETE CHARACTER + PLA BACKSPACE +CAPTST CMP #$E0 + BCC ADDINP + AND #$DF +ADDINP STA IN,X + CMP #$8D + BNE NOTCR + JSR CLREOL +CROUT LDA #$8D + BNE COUT +HOME LDA #$8C + BNE COUT +OUTSP LDA #$A0 + BNE COUT +PRA1 LDY A1H + LDX A1L +PRYX2 JSR CROUT + JSR PRNTYX + LDY #$00 + LDA #$AD + JMP COUT +MOD8CHK LDA A1L + AND #$07 + BNE DATAOUT +XAM JSR PRA1 F(.) A1.A2 +DATAOUT JSR OUTSP + LDA A1H SEE IF ZERO PAGE + BNE XAM2 + LDA A1L + SEC + SBC #ZFLG + BCC XAM2 TAKEN IF A1L < ZFLG + TAX OTHERWISE GET FROM ZBUF + LDA ZBUF,X + DFB $2C SKIP NEXT INSTRUCTION +XAM2 LDA (A1L),Y + JSR PRBYTE + JSR NXTA1 + BCC MOD8CHK CARRY CLEAR IF A1PRINIT SIMULATE PR#1 + LDA #MKEYIN PROPER DOS HOOKS. + STA MKSWH + STY MKSWL + LDA #MVIDOUT + STA MCSWH + STY MCSWL + LDA #40 + STA WNDWDTH + JSR IN40 + STA SETAN0 VIDEX 80 COL SOFTSWITCH + STA CLR80COL + STA CLR80VID + JSR HOME40 +STPRMPT LDA #$A3 + STA PROMPT + RTS +IN40 LDX #4 +MOVE40 LDA HOOK40-1,X + STA CSWL-1,X + DEX + BNE MOVE40 + STX FLG8 SET = 0 +RTS7 RTS +CHKVID LDA RD80VID RESET 40/80 COL IF NEEDED + ASL A BIT 7 INTO CARRY + LDA FLG8 + BMI CHK80 + BCC RTS7 + BCS IN80 40 -> 80 +CHK80 BCS RTS7 + BCC IN40 80 -> 40 + SKP 1 +*** 80 COLUMN DRIVER ROUTINE *** + SKP 1 +INIT80 JSR HOME + JSR PR3 + STA CLRCHAR2 + JSR IN80 + BMI STPRMPT RTS VIA STPRMPT +IN80 LDX #3 +MOVE80 LDA MCSWL,X + STA CSWL8,X + LDA HOOK80,X + STA CSWL,X + DEX + BPL MOVE80 + STX FLG8 SET = FF + RTS +COUT80 JSR EXCHV + JSR COUTZ80 + JMP EXCHV +COUTZ80 JMP (CSWL8) +KEYIN80 JSR EXCHV + JSR KEY80 + JMP EXCHV +KEY80 JMP (KSWL8) +EXCHV PHA + TXA + PHA + LDA CH + LDX MCH + STA MCH + STX CH + LDA CV + LDX MCV + STA MCV + STX CV + PLA + TAX + PLA + RTS +PRTITLE LDX #$00 PRINT TITLE +TITLLOC LDA TITLE,X + BEQ PRADDR + JSR COUT + INX + BNE TITLLOC +PRADDR LDA SUMLOC+2 PRINT ORIGIN ADDRESS + JSR PRBYTE + LDA #0 + JSR PRBYTE + JSR CROUT + JSR DOSUM + LDA A3L + CMP CHKSUM + BNE ERRSUM + LDA A3H + CMP CHKSUM+1 + BNE ERRSUM + JSR CROUT + LDA #$CF PRINT 'OK' + JSR COUT + LDA #$CB + JSR COUT + JMP CROUT +ERRSUM JMP PRERR +DOSUM LDA STARTLOC + STA A1L + LDA STARTLOC+1 + STA A1H + LDA ENDLOC + STA A2L + LDA ENDLOC+1 + STA A2H + LDX #0 + STX A3L + STX A3H +GETBYT CLC + LDA (A1L,X) + ADC A3L + STA A3L + LDA #0 + ADC A3H + STA A3H + JSR NXTA1 + BCC GETBYT + RTS +INITSUM JSR DOSUM CHKSUM OF START-ENDMAIN + LDA A3L + STA CHKSUM + LDA A3H +CSUMLOC STA CHKSUM+1 + RTS + SKP 1 +*** PROGRAM DATA AREA *** + SKP 1 +TITLE DFB $8D + ASC "ANALYST 5.0" + DFB $8D TITLE MARKS START OF PDA + ASC "ORG = $" + DFB $00 +FMT2 DFB 0,33,129,130,90,73,89,77 + DFB 145,146,134,74,133,157 +MNEML DFB 28,138 + DFB 28,35,93,139,27,161,157,138 + DFB 29,35,157,139,29,161,28,41 + DFB 25,174,105,168,25,35,36,83 + DFB 27,35,36,83,25,161,173,26 + DFB 165,91,165,172,139,138,174,174 + DFB 168,173,41,138,124,139,21,156 + DFB 109,156,165,105,41,83,132,19 + DFB 52,17,165,105,35,160 +MNEMR DFB 216,98 + DFB 90,72,38,98,148,136,84,68 + DFB 200,84,104,68,232,148,196,180 + DFB 8,132,116,180,40,110,116,244 + DFB 204,74,114,242,164,138,6,170 + DFB 118,162,116,198,116,116,68,104 + DFB 178,50,178,114,34,114,26,26 + DFB 38,38,114,114,136,200,196,202 + DFB 38,72,68,68,162,200 +FMT1 DFB 240,34,0,51,93,130,0,147 + DFB 243,34,0,51,93,136,0,153 + DFB 240,47,0,51,93,143,0,159 + DFB 240,34,0,59,93,136,0,148 + DFB 253,34,0,51,93,200,0,147 + DFB 17,34,0,51,93,200,0,169 + DFB 241,34,0,51,93,143,0,159 + DFB 241,34,0,51,93,143,0,159 + DFB 38,49,135,154 +OPC65C DFB 18,50,82,114 + DFB 146,178,210,242,58,26,137,28 + DFB 20,122,90,156,100,158,116,124 + DFB 60,52 + DFB 76,164,172,180,188,196,204,228 + DFB 236 +REPL65C DFB 17,49,81,113,145,177 + DFB 209,241,194,226,52,164,172,196 + DFB 228,92,92,92,92,124,60,52 + DFB 124,160,160,160,160,192,192 + DFB 224,224 +CHAR1 DFB 172,169,172,163,168,164 +CHAR2 DFB 217,0,216,164,164,0 +CHAR3 ASC "CZIDB-VN" +RTBL ASC "AXYP" +CHRTBL DFB 152,249,3,190,236 + DFB 166,164,6,149,5,187 + DFB 0,147,2,167,198,153 + DFB 186,154,239,233,1,191 + DFB 237,158,235,197 +SUBTBL DW PRTITLE-1 F(?) DO CHCKSUM OF MAIN + DW SETVID-1 F(@) SWITCH SCREENS + DW EXECJSR-1 F(J) EXECUTE JSR + DW REGDSP-1 F(CTRL-E) DISPLAY REGS + DW STEP-1 F(S) STEP + DW SETMODE-1 F(-) 16 BIT SUBTRACTION + DW SETMODE-1 F(+) 16 BIT ADDITION + DW MOVE-1 F(M) MOVE + DW LT-1 F(<) COPY A2 TO A4 & A5 + DW LIST-1 F(L) LIST 22 LINES + DW BASIC-1 F(CTRL-B) DOSWARM VECT. + DW GO-1 F(G) GO + DW SETMODE-1 F(:) STORE + DW SETREG-1 F(I) SET INTERNAL PC/REG + DW SETMODE-1 F(.) XAM + DW CRMON-1 F(CR) HANDLE CR + DW BLANK-1 F( ) HANDLE SPACES + DW ASC-1 F(CTRL-A) DUMP IN ASCII + DW MINI-1 F(!) MINI-ASSEMBLER + DW VFY-1 F(V) VERIFY + DW SETPRNT-1 F(P) TO PRINTER + DW LOAD-1 F(H) LOAD FOR HSF + DW FIND-1 F(CTRL-F) HEX SEQ. FIND + DW TRACE-1 F(T) TRACE OR SET TLIMIT + DW BINARY-1 F(%) VALUE IN BINARY + DW RELOC-1 F(R) RELOCATOR + DW CRMON-1 HANDLE CTRL-L AS CR +HOOK40 DW COUT40 + DW KEYIN +HOOK80 DW COUT80 + DW KEYIN80 +IRQLOC DW IBREAK +BRKLOC DW BREAK +STARTLOC DW START +ENDLOC DW ENDMAIN +ERRMSG DFB $8D MARKS END OF WORDS + ASC 'RRE' + DFB $8D +ENDMAIN DFB $00 = END OF STATIC PGM AREA + SKP 1 +*** DYNAMIC PROGRAM AREA *** + SKP 1 +CSWL DS 1 ADDR. OF OUTPUT ROUTINE +CSWH DS 1 +KSWL DS 2 ADDR. OF INPUT ROUTINE +CSWL8 DS 2 DON'T CHANGE ORDER +KSWL8 DS 2 OF CSWL-KSWL8 +LMNEM DS 1 +RMNEM DS 1 +LENGTH DS 1 +MODE DS 1 +FORMAT DS 1 +FUNNY DS 1 RESET VECTOR FUNNY BYTE +ERRFLG DS 1 SET FOR BAD OPCODE +XFLG DS 1 1 = SKIP INSTRUCTION +TFLG DS 1 1 = CANCEL COUT FOR TRC +JFLG DS 1 SET TO ALLOW F(J) +FLG8 DS 1 FF = 80 COL, 0 = 40 COL +PROMPT DS 1 +CH DS 1 +CV DS 1 +ACC DFB 0 DON'T CHANGE ORDER +XREG DFB 0 OF ACC TO SPNT +YREG DFB 0 +STATUS DS 1 +SPNT DS 1 +YSAV DS 1 +YSAV1 DS 1 +IN DS 38 KEYIN BUFFER. IN+37 TEMP. +TLIMIT DS 1 PAGE# OF TRACE LIMIT +XQT DS 15 BUFFER FOR F(S,CTRL-F,J) +ZBUF DS $100-ZFLG PAGE ZERO STORAGE BUFFER +CHKSUM DS 2 CHKSUM OF STATIC PROG. diff --git a/ANALYST 5.2.txt b/ANALYST 5.2.txt new file mode 100644 index 0000000..e226c1e --- /dev/null +++ b/ANALYST 5.2.txt @@ -0,0 +1,1961 @@ + LST OFF + SBTL + MSB ON + ORG $6000 + SKP 1 +********************************* +* * +* -< THE ANALYST >- * +* * +* VERSION 5.2 * +* * +* BY * +* * +* LARRY A. GREENE * +* * +********************************* + SKP 1 +*** DESCRIPTION *** + SKP 1 +; THIS PROGRAM OPERATES INDEPENDENT OF ROM BUT HAS COM- +; MANDS SIMILAR TO THE BUILT IN MONITOR. THE TRACE AND +; STEP FUNCTIONS HAVE BEEN GREATLY ENHANCED TO DISPLAY +; STATUS REGISTER FLAGS AND SET A BREAK POINT. THE MINI +; ASSEMBLER HAS BEEN INCLUDED AS WELL AS A HEX SEQUENCE +; FINDER. 65C02 OPCODES ARE ALSO SUPPORTED. ZERO PAGE +; REFS ARE STORED IN A BUFFER WHICH AVOIDS CONFLICT WITH +; THE PROGRAM BEING TRACED. THIS PROGRAM USES THE BOTTOM +; 1/2 OF THE STACK ($100-180). TO USE DOS EXIT WITH +; CTRL-B AND RE-ENTER WITH &. + SKP 1 +*** COMMANDS *** + SKP 1 +; CTRL-A DUMP MEMORY IN ASCII +; CTRL-B ENTER RESIDENT BASIC W/DOS. & TO RETURN +; CTRL-E EXAMINE INTERNAL REGISTERS +; CTRL-F FIND SPECIFIED HEX SEQUENCE DEFINED BY F(H) +; G GO EXECUTE IN IMMEDIATE MODE +; H LOAD BYTES FOR HSF F(CTRL-F) BY USING H: +; I CHANGE PC AND/OR INTERNAL A,X,Y,P,S REGISTERS +; J JUMP. EXECUTE JSR INSTRUCTION IN STEP MODE +; CTRL-L CLEAR PRESENT SCREEN AND HOME CURSOR +; L LIST DISASSEMBLED INSTRUCTIONS +; M MOVE BLOCK OF MEMORY +; P SEND OUTPUT TO PRINTER +; R RELOCATE ANALYST TO NEW ADDRESS PAGE +; S ENTER STEP MODE. STEP INSTRUCTION +; T TRACE PROGRAM OR SET TRACE LIMIT +; V VERIFY TWO BLOCKS OF MEMORY +; CTRL-X CANCEL LINE ENTRY +; X SKIP NEXT INSTRUCTION IN STEP MODE +; % PRINT ADDRESS DATA VALUE IN BINARY +; ? PRINT ORIGIN ADDRESS & DO INTERNAL CHECKSUM +; @ SET TEXT 40/80 COL SCREEN +; < RANGE DELIMITER +; . RANGE DELIMITER +; + 16 BIT ADDITION +; - 16 BIT SUBTRACTION +; : STORE VALUE IN MEMORY +; ! ENTER MINI-ASSEMBLER. "#" TO EXIT + SKP 1 +*** OPERATING NOTES *** + SKP 1 +; INPUT LINE LIMITED TO 38 CHARACTERS. BEEPS ON LAST 4. + SKP 1 +; HOME (CTRL-L) ACTS IMMEDIATELY. FOLLOW WITH . + SKP 1 +; FOR STEP TYPE 300S THEN S, OPEN-APPLE, SPACE, OR +; J TO STEP EACH INSTRUCTION. S OR OPEN-APPLE TO STEP +; INTO JSR. J TO EXECUTE SUBROUTINE. X TO SKIP INSTRUC- +; TION. T TO ENTER TRACE. @ FOR TEXT. CTRL-C TO EXIT. +; @ WILL EXECUTE NEXT INSTRUCTION. + SKP 1 +; FOR TRACE USE FFFF<2000T WHERE FFFF DENOTES BRKPOINT. +; PC PRINTED AT UPPER LEFT EVERY 256 LINES. OPEN APPLE +; ENTERS SLOW TRACE WITH PC PRINTED EACH LINE. CLOSED +; APPLE EXITS TO STEP MODE. TRACE WILL EXECUTE SUB- +; ROUTINES ABOVE PAGE# LIMIT IN IMMEDIATE MODE IF SET +; BY T:NN. WILL TRACE THRU RAM $D000-FFFF, HOWEVER. +; TO TRACE ALL SET T:00 WHICH IS DEFAULT VALUE. +; TRACE ACTIVITY INDICATED BY FLASHING $ OR # FOR JSR +; IMMEDIATE MODE. BREAKPOINT ENTERS STEP MODE AND DOES +; EXECUTE BREAKPOINT INSTRUCTION. + SKP 1 +; FOR JUMP TYPE 'J5' WHERE 5 REPRESENTS # OF PARM BYTES +; FOLLOWING JSR INSTRUCTION. J DEFAULTS TO 0. JUMP +; DURING STEP & TRACE IMMEDIATE HANDLE JSR $BF00 AS +; PRODOS MLI CALL WITH 3 PARM BYTES FOLLOWING. MUST USE +; 'J3' FROM COMMAND LINE. IF SUBROUTINE BEING 'JUMPED' +; CONTAINS A TXS INSTRUCTION, ANALYST WILL LOSE CONTROL! +; ALSO TRACE IMMEDIATE WILL NOT HANDLE A SUBROUTINE OTHER +; THAN $BF00 WITH PARM BYTES FOLLOWING! + SKP 1 +; STEP & TRACE BREAK FOR ILLEGAL OPCODES. PRINTS 'ERR' + SKP 1 +; TO CHANGE PC AND/OR INTERNAL REGS TYPE 300I:AA XX +; YY PP SS . PC ENTRY BEFORE I OPTIONAL. + SKP 1 +; FOR HEX SEQUENCE FINDER TYPE H:N1 N2 N3... +; 1000<2000 CTRL-F . + SKP 1 +; TO DUMP MEMORY IN ASCII USE 1000.2000 CTRL-A . + SKP 1 +; TO PRINT ADDRESS BYTE IN BINARY TYPE 2000% . + SKP 1 +; TO SWITCH SCREENS TYPE @8,@4 OR @ FOR TEXT. + SKP 1 +; TO RELOCATE TYPE NN00R . WILL ROUND OFF TO NEAREST +; PAGE BOUNDARY. DO NOT SET < $800! IF < 4K FROM OLD +; ORIGIN, WILL BE IGNORED. IF MOVED TO RAM CARD DO NOT +; CHANGE CARD R/W STATE! + SKP 1 +; DO NOT USE THE PRINTER WHEN THE ANALYST IS LOCATED +; ON THE RAM CARD. THE PRINTER WILL NOT INITIALIZE. +; ALSO RESET WILL NOT RETURN TO THE ANALYST LOCATED +; ON THE RAM CARD WITH 128K MACHINES. + SKP 1 +; & VECTOR $3F5 IS A WARMSTART RE-ENTRY WHICH CAN BE +; USED TO JMP INTO ANALYST FROM A RUNNING PROGRAM +; WITH ALL REGS PRESERVED. + SKP 1 +; THE ANALYST USES $C01F TO DETECT 80 COL MODE. +; THIS METHOD IS INVALID ON OLDER NON-IIE APPLES. + SKP 1 +; TO STEP AND TRACE AUX MEMORY, ANALYST SHOULD BE IN +; 80 COLUMN MODE. + SKP 1 +*** ROM ZERO PAGE EQUATES *** + SKP 1 +WNDWDTH EQU $21 +MCH EQU $24 +MCV EQU $25 +MCSWL EQU $36 +MCSWH EQU $37 +MKSWL EQU $38 +MKSWH EQU $39 +MPCL EQU $3A +MPCH EQU $3B +MA1L EQU $3C +MA1H EQU $3D +MA2L EQU $3E +MA2H EQU $3F +MA4L EQU $42 +MA4H EQU $43 +MACC EQU $45 +MXREG EQU $46 +MYREG EQU $47 +MSTATUS EQU $48 +MSPNT EQU $49 +RNDL EQU $4E +SPDBYT EQU $F1 APPLESOFT SPEED= + SKP 1 +*** ANALYST EQUATES *** + SKP 1 +STKLMT EQU $80 TOP OF STACK (IMMEDIATE) +ZFLG EQU $EE 2 BYTE ID ($D5 $AA) +A1L EQU $F0 A1L-A5H MUST BE IN ORDER +A1H EQU $F1 FOR MINI-ASSEMBLER +A2L EQU $F2 +A2H EQU $F3 +A3L EQU $F4 +A3H EQU $F5 +A4L EQU $F6 +A4H EQU $F7 +A5L EQU $F8 +A5H EQU $F9 +PCL EQU $FA +PCH EQU $FB +BASL EQU $FC +BASH EQU $FD +BAS2L EQU $FE +BAS2H EQU $FF LABEL MARKS END OF PAGE 0. +STACK EQU $0100 +DOSV EQU $03D0 DOS BASIC WARM ENTRY +BRKV EQU $03F0 BREAK VECTOR +SOFTEV EQU $03F2 RESET VECTOR +AMPERV EQU $03F5 ANALYST WARMSTART RE-ENTRY +MLI EQU $BF00 PRODOS INTERFACE + SKP 1 +*** ROM EQUATES *** + SKP 1 +KBD EQU $C000 +CLR80COL EQU $C000 ENABLE PAGE2 DISPLAY +MAINRD EQU $C002 +MAINWR EQU $C004 +CLRIOROM EQU $C006 +MAINZP EQU $C008 +AUXZP EQU $C009 +CLR80ROM EQU $C00A +CLR80VID EQU $C00C +CLRCHAR2 EQU $C00E +KBDSTRB EQU $C010 +RDAUXZP EQU $C016 BMI IF AUXZP +RD80VID EQU $C01F BMI IF 80 COL MODE +SPKR EQU $C030 +TXTSET EQU $C051 +LOWSCR EQU $C054 +SETAN0 EQU $C058 +PB0 EQU $C061 OPEN APPLE KEY +PB1 EQU $C062 CLOSED APPLE KEY +SWITCH2 EQU $C082 +SWITCH3 EQU $C083 +PRINIT EQU $C100 PRINTER IN SLOT 1 +PR3 EQU $C300 +AUXMOVE EQU $C311 +IDROM EQU $E000 = $4C IF ROM PRESENT +MKEYIN EQU $FD1B +MVIDOUT EQU $FDF0 +RESET EQU $FFFC RESET VECTOR IN RAMCARD +IRQ EQU $FFFE BREAK VECTOR IN RAMCARD + SKP 3 +GETSUM JSR INITSUM CREATE CHECKSUM OF MAIN + LDA #$2C WHEN FIRST BRUN +SUMLOC STA GETSUM DISABLE CHECKSUM + SKP 1 +*** STATIC MAIN PROGRAM AREA *** + SKP 1 +START CLD RESET POINTS HERE + LDX #STKLMT SET ANALYST STACK UPPER + TXS LIMIT + LDA ZFLG + CMP #$D5 + BNE NOID + LDA ZFLG+1 + CMP #$AA + BEQ START2 IF ID NOT PRESENT +NOID JSR ZSWAP THEN SWAP 0 PAGE + LDA #$D5 & SET ID --> ZFLG:D5 AA + STA ZFLG + LDA #$AA + STA ZFLG+1 +START2 JSR TEXT PRIMARY TEXT MODE + LDA #$00 + STA CLR80ROM DISABLE 80 COL ROM + STA CLRIOROM DISABLE INTERNAL I/O + STA CLRCHAR2 PRIMARY CHAR SET + STA TLIMIT TRACE ALL + STA STATUS CLEAR STATUS + STA ERRFLG CLEAR FLAGS + STA XFLG + STA TFLG + STA JFLG + STA PCL + STA PCH + LDX #$F0 + STX SPNT +CLRSTK STA STACK,X = 0 + INX + BNE CLRSTK + JSR PRTITLE + JMP MONZ +SETRV LDA STARTLOC + STA SOFTEV + STA RESET + LDA STARTLOC+1 + STA SOFTEV+1 + STA RESET+1 + EOR #$A5 + STA SOFTEV+2 + STA FUNNY SAVE FOR REFERENCE + RTS +INSDS1 LDX PCL + LDY PCH + JSR PRYX2 + JSR OUTSP + LDX #0 +INSDST LDA (PCL,X) +INSDS2 LDY #$FF DETERMINE LENGTH OF + STY LMNEM INSTRUCTION. OPCODE IN + TAY ACC. STORED IN LENGTH. + LSR A INVALID = 0 + BCC IEVEN 1 BYTE = 0 + ROR A 2 BYTE = 1 + BCS ERR 3 BYTE = 2 + AND #$87 +IEVEN LSR A + TAX + LDA FMT1,X + BCC RTMSKZ + LSR A + LSR A + LSR A + LSR A +RTMSKZ AND #$0F + CMP #$0F + BNE GETFMT +ERR LDY #$FF BAD OPCODE + STY ERRFLG + INY + STY LMNEM + STY RMNEM + STY FORMAT + STY LENGTH +RTS1 RTS +GETFMT TAX + LDA FMT2,X + STA FORMAT + AND #$03 + STA LENGTH + LDA TFLG BYPASS PRINT FORMATTING + BNE RTS1 IN TRACE + TYA + AND #$8F + STA IN+8 TEMP STORAGE + TYA + LDX #31 +GETFMT2 DEX + BMI MNNDX + CMP OPC65C,X MAKE SUBSTITUTION IF + BNE GETFMT2 65C02 OPCODE. + LDA REPL65C,X +MNNDX LDX IN+8 + LDY #$03 + CPX #$8A + BEQ MNNDX3 +MNNDX1 LSR A + BCC MNNDX3 + LSR A +MNNDX2 LSR A + ORA #$20 + DEY + BNE MNNDX2 + INY +MNNDX3 DEY + BNE MNNDX1 + RTS +INSTDSP JSR INSDS1 + PHA +PRNTOP LDA (PCL),Y + JSR PRBYTE + LDX #$01 +PRNTBL JSR PRBLNK + CPY LENGTH + INY + BCC PRNTOP + LDX #$03 + CPY #$03 + BCC PRNTBL + PLA + TAY + LDA LMNEM + BEQ PRMN1 + LDA MNEML,Y + STA LMNEM + LDA MNEMR,Y + STA RMNEM +PRMN1 LDA #$00 + LDY #$05 +PRMN2 ASL RMNEM + ROL LMNEM + ROL A + DEY + BNE PRMN2 + ADC #$BF + JSR COUT + DEX + BNE PRMN1 + JSR OUTSP + LDY LENGTH + LDX #$05 +PRADR1 CPX #$02 + BEQ PRADR5 +PRADR2 ASL FORMAT + BCC PRADR3 + LDA CHAR1,X + JSR COUT + LDA CHAR2,X + BEQ PRADR3 + JSR COUT +PRADR3 DEX + BPL PRADR1 + RTS +PRADR4 DEY + BMI PRADR2 + JSR PRBYTE +PRADR5 LDA FORMAT + CMP #$E8 + LDA (PCL),Y + BCC PRADR4 + JSR PCADJA + TAX + INX + BNE PRNTYX + INY +PRNTYX TYA +PRNTAX JSR PRBYTE + TXA + JMP PRBYTE +PRBL13 LDX #13 + DFB $2C SKIP NEXT INSTRUCTION +PRBL33 LDX #33 +PRBLNK JSR OUTSP PRINT X SPACES + DEX + BNE PRBLNK + RTS +PCADJ SEC UPDATE PC BY LENGTH+1 +PCADJLP LDA LENGTH +PCADJAP JSR PCADJA + STA PCL + STY PCH + RTS +PCADJL LDA LENGTH UPDATE PC BY LENGTH +PCADJA LDY PCH UPDATE PC BY ACC + TAX + BPL PCADJ2 + DEY +PCADJ2 ADC PCL + BCC RTS2 + INY +RTS2 RTS NEW PC IN Y,A +STEP TXA F(S) + BNE SSTEP FIRST TIME + JSR KYWAIT CTRL-C = BREAK + CPY #$CA + BNE STEP2 + LDA JFLG J = SINGLE STEP + BEQ SSTEP IF NO JSR, ELSE + DEC YSAV EXECUTE SUBROUTINE + PLA + PLA + JMP TRCPCS +STEP2 LDA JFLG SPC = SINGLE STEP IF + BNE STEP3 NOT JSR, ELSE IGNORE + CPY #$A0 + BEQ SSTEP +STEP3 CPY #$D3 S OR OPEN APPLE = + BEQ SSTEP SINGLE STEP ALWAYS + TYA + BEQ SSTEPW = 0 FOR OPEN APPLE. + CPY #$D4 T = ENTER TRACE MODE + BNE STEP4 + INC TFLG SET TRACE MODE FLAG + JMP TRACE4 AND ENTER TRACE. +STEP4 CPY #$D8 X = SKIP NEXT INSTRUCTION + BNE STEP5 + LDA #1 TURN OFF XQT EXECUTION + STA XFLG + BNE SSTEP ALWAYS TAKEN +STEP5 CPY #$C0 @ = TEXT MODE + BNE STEP + JSR TEXT +SSTEPW LDA #$FF PAUSE TO RELEASE O/A KEY + JSR WAIT +SSTEP JSR A1PC +SSTEPT DEC YSAV TRACE RE-ENTRY TO STEP + LDA #0 + STA CV + STA CH + JSR VTABZ + DEC CV TOP OF SCRN AFTER CROUT + JSR INSTDSP + JSR CLREOL + PLA REMOVE RTS TO NEXTITM + PLA + LDX XFLG + BEQ NOSKIP + DEX + STX XFLG + STX ERRFLG IN CASE SKIPPING ERROR + JSR PCADJ + JMP NXTPC SKIP INSTRUCTION +NOSKIP JMP TSTEP +PRNTPC LDA #0 PRINT PC AT UPPER LEFT + STA CH + LDA PROMPT + JSR COUT + LDA PCH + LDX PCL + JMP PRNTAX +TRACEPC JSR CHKVID CHECK/RESET 40/80 MODE + INC RNDL PRINT PC + BNE TRCPC1 EVERY 256 INSTRUCTIONS + LDA PROMPT FLASHING '$' FOR TRACE + EOR #$04 ACTIVITY. $A4->$A0->$A4 + STA PROMPT + JSR PRNTPC +TRCPC1 LDA JFLG + BEQ TRACE5 + LDA TLIMIT + BEQ TRACE5 FULL TRACE IF TLIMIT=0. + LDA PCH + CMP TLIMIT IF PC < TLIMIT PAGE# + BCC TRACE5 THEN TRACE THRU ELSE + LDY IDROM CHECK FOR ROM. IF IN + CPY #$4C ROM EXEC JSR IMMEDIATE + BEQ TRCPC2 MODE ELSE IF PC >= $D0 + CMP #$D0 THEN TRACE THRU. + BCS TRACE5 +TRCPC2 JSR STPRMPT '#' DENOTES JSR IMMED. + JSR PRNTPC PRINT EXEC SUBROUTINE + INC PROMPT '#' -> '$' + LDA #$FF FORCE PC PRINTING + STA RNDL AFTER JSR IMMED. +TRCPCS LDA PCL SEE IF PC = $BF00 + BNE TRCPCG + LDA PCH + CMP # '$' 1ST TIME ONLY + LDA #$FF FORCE VTAB TO TOP OF SCRN + STA CV WHEN CROUT INC'S CV TO 0 + JSR CROUT (NEEDED FOR 80 COL). +TRACE5 LDX #1 IF PC = A4 THEN ENTER STEP +TRACE6 LDA PCL,X + CMP A4L,X + BNE TRACE7 + DEX + BPL TRACE6 + INX + BEQ TRACES ALWAYS TAKEN +TRACE7 LDX #0 FOR INSDST + LDA PB1 BACK TO STEP MODE IF + BPL TRACE8 CLOSED APPLE PRESSED +TRACES STA KBDSTRB + STX TFLG CLEAR TRACE FLAG + JSR TEXT + JSR STPRMPT PROMPT BACK TO OLD '#' + LDY YSAV + DEY + LDA #$D3 PUT 'S' INTO INPUT BUFFER + STA IN,Y + JMP SSTEPT RE-ENTER STEP MODE +TRACE8 LDA PB0 SLOW TRACE IF OPEN APPLE + BPL TRACE9 PRESSED + LDA #$FF + STA RNDL FORCE PC PRINTING + PHA + JSR WAIT + PLA + JSR WAIT +TRACE9 JSR INSDST +TSTEP LDA FUNNY SEE IF RESET VECTOR + CMP SOFTEV+2 HAS BEEN CHANGED + BEQ TSTEP2 + JSR SETRV GET BACK RESET CONTROL +TSTEP2 LDA ERRFLG IF BAD OPCODE THEN BRK + BEQ TSTEP3 +XBRK LDY TFLG + BEQ SBRK + DEY + STY TFLG + DEY + STY A4L CLEAR OLD BREAK POINT + STY A4H +GBRK JSR INSTDSP DISP BRK FOR GO & TRACE + JSR RGDSP1 + BEQ BRKMON ALWAYS TAKEN +SBRK JSR CROUT + LDA #5 + STA CV + JSR VTABZ + JSR CLREOL ERASE OLD INSTRUCTION +BRKMON JMP ERRMON +XTSX LDX SPNT + STX XREG +XTXS LDX XREG +UPDSPNT STX SPNT UPDATE SPNT + CPX #STKLMT+1 STACK OVERFLOW IF + BCC XBRK IN ANALYST WORK AREA + JMP PCINC UPDATE PC +TSTEP3 TAX = 0 + STX JFLG DISALLOW F(J) IF NO JSR + LDA (PCL,X) GET OPCODE (X=0) + BEQ XBRK + LDY LENGTH + CMP #$20 + BEQ XJSR + CMP #$60 + BEQ XRTS + CMP #$BA + BEQ XTSX + CMP #$9A + BEQ XTXS + CMP #$7C + BEQ XJMPATX + CMP #$4C + BEQ XJMP + CMP #$6C + BEQ XJMPAT + CMP #$40 + BEQ XRTI + PHA + CMP #$5A + BCC TSTEP4 + TAX + AND #$1F + CMP #$1A + BEQ STACKOP PHX,PLX,PHY,PLY + TXA +TSTEP4 AND #$9F + CMP #$08 + BNE TSTEP5 +STACKOP JMP STKOPC PHA,PLA,PHP,PLP +TSTEP5 LDX #$08 +XQINIT LDA INITBL-1,X + STA XQT,X + DEX + BNE XQINIT + PLA OPCODE + CMP #$80 + BNE NBRA + ORA #$10 +NBRA AND #$1F + EOR #$14 + CMP #$04 = BRANCH OFFSET + BEQ XQ2 TAKEN IF BRANCH OPCODE +XQ1 LDA (PCL),Y Y = LENGTH +XQ2 STA XQT,Y XQT BCS BRNCH (B0 04) + DEY NOP + BPL XQ1 JMP NBRNCH (CCLR) + JMP XQJ BRNCH JMP BRANCH (CSET) +XRTI CLC + PLA + STA STATUS +XRTS LDX SPNT + INX + LDA STACK,X + STA PCL + INX + LDA STACK,X + STA PCH + STX SPNT + BNE PCINC ALWAYS TAKEN +XJMPATX INX + BNE XJMPAT +XJSR STA JFLG OK FOR F(J) + CLC + JSR PCADJL SET Y,A = RTS ADDR + PHA + LDX SPNT + TYA + STA STACK,X + DEX + PLA + STA STACK,X + DEX + STX SPNT + LDY #$02 +XJMP CLC +XJMPAT LDA (PCL),Y + PHA + DEY + LDA (PCL),Y + STA PCL + PLA + STA PCH + BCC NEWPC + DEX + BNE XJMP + LDA XREG + CLC + JSR PCADJAP + LDY #1 + BNE XJMP ALWAYS TAKEN +NBRNCH JSR SAVE ALL OTHER OPCODES + BMI UPDPC ALWAYS TAKEN +BRANCH JSR SAVE BRANCH WITH COND. MET + CLC + LDY #$01 + LDA (PCL),Y + JSR PCADJAP +UPDPC SEC +PCINC JSR PCADJLP +NEWPC LDA TFLG + BNE TRACEBY BYPASSES NEXTITM +NXTPC JSR CROUT + JMP REGDSP +TRACEBY JMP TRACEPC +INITBL NOP + NOP + JMP NBRNCH + JMP BRANCH +PULL PHP + INX + LDA STACK,X + TAY + LDA STATUS PULL FROM STACK AFFECTS + PHA N & Z FLAGS + PLP + TYA UPDATE N & Z + PHP + PLA + STA STATUS + TYA + PLP + RTS +STKOPC LDX SPNT STACK OPCODES + PLA OPCODE + TAY + AND #$10 + BEQ APCODE + TYA + ASL A + BCS OPCX + ASL A + ASL A + BCS XPLY + LDA YREG XPHY + BCC PUSH +XPLY JSR PULL + STA YREG + BCS UPDSTACK +OPCX ASL A + ASL A + BCS XPLX + LDA XREG XPHX + BCC PUSH +XPLX JSR PULL + STA XREG + BCS UPDSTACK +APCODE TYA + ASL A + ASL A + BMI PULLAP + BCC XPHP + LDA ACC XPHA + BCS PUSH +XPHP LDA STATUS +PUSH STA STACK,X + DEX + BNE UPDSTACK +PULLAP BCC XPLP + JSR PULL XPLA +ACCLOC STA ACC + BCS UPDSTACK +XPLP JSR PULL + STA STATUS +UPDSTACK JMP UPDSPNT +IBREAK STA MACC + PLP FOR IRQ W/CARD ON + STX MXREG + STY MYREG + PHP + PLA + STA MSTATUS + TSX + STX MSPNT + CLD + PLA + STA MPCL + PLA + STA MPCH +BREAK SEC IRQ W/ CARD OFF + LDA MPCL ROM SAVED PC + SBC #2 AFTER DEC BY 2 + STA PCL + LDA MPCH + SBC #0 + STA PCH + LDX #4 +BRKSAVE LDA MACC,X COPY SAVED REGS + STA ACC,X + DEX + BPL BRKSAVE + LDX #$40 RESTORE ANALYST STACK + TXS + JMP GBRK +REGDSP JSR PRBL13 F(CTRL-E) + LDX #$07 +PRFLG LDA CHAR3,X PRINT 'NV-BDIZC' + JSR COUT + DEX + BPL PRFLG + JSR PRBL13 +RGDSPB JSR CROUT + LDA #$C1 PRINT ACC AND STATUS + JSR COUT IN BINARY + JSR OUTEQ + LDA ACC + JSR BNDSP + JSR OUTSP + LDA #$D0 + JSR COUT + JSR OUTEQ + LDA STATUS + JSR BNDSP + JSR PRBL13 + JSR RGDSP1 + JSR INSTDSP DISPLAY INSTRUCTION + JSR PRBL13 TO BE EXECUTED NEXT + JMP NEXTITM +RGDSP1 JSR CROUT + LDX #0 +RDSP1 JSR OUTSP + LDA RTBL,X + JSR COUT + LDA #$BD + JSR COUT + LDA ACC,X + JSR PRBYTE + INX + CPX #4 + BCC RDSP1 + JSR PRBL13 + LDX SPNT PRINT STACK IN THE FORM + LDY #$01 1NN- XX NN... + JSR PRYX2 + INX + LDY #6 + JSR OUTSP + LDA #$D8 + JSR COUT + JSR COUT +PRSTK JSR OUTSP + LDA STACK,X + JSR PRBYTE + INX + DEY + BNE PRSTK + JMP PRBL13 +BNDSP LDX #$08 INDEX FOR 8 BITS +NEXTBIT ASL A + PHA + BCS BIT1 + LDA #$30 '0' + DFB $2C SKIP NEXT INSTRUCTION +BIT1 LDA #$31 '1' + JSR COUT + PLA + DEX + BNE NEXTBIT + RTS +BINARY JSR PRA1 F(%) + JSR OUTSP + LDA (A1L),Y PRINT A1 IN BINARY. Y=0 + JSR BNDSP + JMP CROUT +BASCALC PHA + LSR A + AND #$03 + ORA #$04 + STA BASH + PLA + AND #$18 + BCC BSCLC2 + ADC #$7F +BSCLC2 STA BASL + ASL A + ASL A + ORA BASL + STA BASL + RTS +BELL LDY #$38 DURATION +BELL2 LDA #$2B FREQUENCY + JSR WAIT + LDA SPKR + DEY + BNE BELL2 + RTS +VIDOUT CMP #$A0 + BCC NOADV INVERSE, CTRL, OR FLASH +STOADV LDY CH + STA (BASL),Y + INC CH + LDA CH + CMP #$28 + BCS CR +RTS3 RTS +NOADV TAY + BPL STOADV INVERSE OR FLASH + CMP #$8D + BEQ CR + CMP #$88 + BNE RTS3 DON'T PRINT CTRL CHARS. + DEC CH BACKSPACE + BPL RTS3 + LDA #$28 + STA CH + DEC CH +UP LDA #$00 + CMP CV + BCS RTS4 + DEC CV +VTAB LDA CV +VTABZ JSR BASCALC + ADC #$00 + STA BASL +RTS4 RTS +HOME40 LDA #$00 + STA CV + LDY #$00 + STY CH +CLEOP1 PHA + JSR VTABZ + JSR CLEOLZ + LDY #$00 + PLA + ADC #$00 + CMP #$18 + BCC CLEOP1 + BCS VTAB +CR LDA #$00 + STA CH + INC CV + LDA CV + CMP #$18 + BCC VTABZ + DEC CV + LDA #$00 + PHA + JSR VTABZ +SCRL1 LDA BASL BASL = CURRENT + STA BAS2L BAS2L = OLD + LDA BASH + STA BAS2H + LDY #$28 + DEY + PLA + ADC #$01 + CMP #$18 + BCS SCRL3 + PHA + JSR VTABZ +SCRL2 LDA (BASL),Y + STA (BAS2L),Y + DEY + BPL SCRL2 + BMI SCRL1 +SCRL3 LDY #$00 + JSR CLEOLZ + BCS VTAB ALWAYS TAKEN +CLREOL LDY CH + LDA FLG8 SEE IF 80 COL VIDEO + BPL CLEOLZ 80 COL ONLY CLEARS NEXT + JMP PRBL33 33 SPACES FOLLOWING +CLEOLZ LDA #$A0 +CLEOL2 STA (BASL),Y + INY + CPY #$28 + BCC CLEOL2 + RTS +LWAIT LDA #$70 LIST SCROLL RATE +WAIT SEC +WAIT2 PHA +WAIT3 SBC #$01 + BNE WAIT3 + PLA + SBC #$01 + BNE WAIT2 + RTS +NXTA4 INC A4L INCREMENT A4 + BNE NXTA1 + INC A4H +NXTA1 LDA A1L + CMP A2L + LDA A1H + SBC A2H + INC A1L + BNE RTS4B + INC A1H +RTS4B RTS CARRY SET IF A1 >= A2 +CTRLC LDY KBD CTRL-C = BREAK TO MONITOR + BPL RTS4B + STY KBDSTRB + CPY #$93 CTRL-S = PAUSE + BNE CTLC +KYWAIT LDY PB0 F(S) ENTRY POINT + BMI KYWT2 + LDY KBD + BPL KYWAIT + STY KBDSTRB + DFB $2C +KYWT2 LDY #0 0 = OPEN APPLE PRESSED +CTLC CPY #$83 + BNE RTS4B + JMP MONZ +RDKEY JMP (KSWL) +KEYIN LDY CH + LDA (BASL),Y + PHA + AND #$3F INVERSE CURSOR + STA (BASL),Y + PLA + BIT KBD + BPL KEYIN + ORA #$80 + STA (BASL),Y + LDA KBD + BIT KBDSTRB + RTS +NOTCR LDA IN,X + JSR COUT + CMP #$88 + BEQ BCKSPC + CMP #$98 + BEQ CANCEL + CPX #34 BEEP ON LAST 4 CHAR. + BCC NOTCR1 + JSR BELL +NOTCR1 INX + CPX #38 38 CHARACTERS ALLOWED + BCC NXTCHAR +CANCEL LDA #$DC + JSR COUT +GETLNZ JSR CROUT + LDA PROMPT + JSR COUT + LDX #$01 +BCKSPC TXA + BEQ GETLNZ + DEX +NXTCHAR JSR RDKEY + CMP #$95 + BEQ NXTCHAR IGNORE '->' + CMP #$FF + BNE NOTDEL + LDA #$88 DELETE KEY = BACKSPACE +NOTDEL CMP #$88 + BNE CAPTST + PHA + JSR COUT BACKSPACE + JSR OUTSP DELETE CHARACTER + PLA BACKSPACE +CAPTST CMP #$E0 + BCC ADDINP + AND #$DF +ADDINP STA IN,X + CMP #$8D + BNE NOTCR + JSR CLREOL +CROUT LDA #$8D + BNE COUT +HOME LDA #$8C + BNE COUT +OUTSP LDA #$A0 + BNE COUT +PRA1 LDY A1H + LDX A1L +PRYX2 JSR CROUT + JSR PRNTYX + LDY #$00 + LDA #$AD + JMP COUT +MOD8CHK LDA A1L + AND #$07 + BNE DATAOUT +XAM JSR PRA1 F(.) A1.A2 +DATAOUT JSR OUTSP + LDA A1H SEE IF ZERO PAGE + BNE XAM2 + LDA A1L + SEC + SBC #ZFLG + BCC XAM2 TAKEN IF A1L < ZFLG + TAX OTHERWISE GET FROM ZBUF + LDA ZBUF,X + DFB $2C SKIP NEXT INSTRUCTION +XAM2 LDA (A1L),Y + JSR PRBYTE + JSR NXTA1 + BCC MOD8CHK CARRY CLEAR IF A1PRINIT SIMULATE PR#1 + LDA #MKEYIN PROPER DOS HOOKS. + STA MKSWH + STY MKSWL + LDA #MVIDOUT + STA MCSWH + STY MCSWL + LDA #40 + STA WNDWDTH + JSR IN40 + STA SETAN0 VIDEX 80 COL SOFTSWITCH + STA CLR80COL + STA CLR80VID + JSR HOME40 +TXT1 LDA LOWSCR + LDA TXTSET + RTS +STPRMPT LDA #$A3 + STA PROMPT + RTS +IN40 LDX #4 +MOVE40 LDA HOOK40-1,X + STA CSWL-1,X + DEX + BNE MOVE40 + STX FLG8 SET = 0 +RTS7 RTS +CHKVID LDA RD80VID RESET 40/80 COL IF NEEDED + ASL A BIT 7 INTO CARRY + LDA FLG8 + BMI CHK80 + BCC RTS7 + BCS IN80 40 -> 80 +CHK80 BCS RTS7 + BCC IN40 80 -> 40 + SKP 1 +*** 80 COLUMN DRIVER ROUTINE *** + SKP 1 +INIT80 JSR HOME + JSR PR3 + STA CLRCHAR2 + JSR IN80 + BMI TXT1 ALWAYS TAKEN +IN80 LDX #3 +MOVE80 LDA MCSWL,X + STA CSWL8,X + LDA HOOK80,X + STA CSWL,X + DEX + BPL MOVE80 + STX FLG8 SET = FF + RTS +COUT80 JSR EXCHV + JSR COUTZ80 + JMP EXCHV +COUTZ80 JMP (CSWL8) +KEYIN80 JSR EXCHV + JSR KEY80 + JMP EXCHV +KEY80 JMP (KSWL8) +EXCHV PHA + TXA + PHA + LDA CH + LDX MCH + STA MCH + STX CH + LDA CV + LDX MCV + STA MCV + STX CV + PLA + TAX + PLA + RTS +PRTITLE LDX #$00 PRINT TITLE +TITLLOC LDA TITLE,X + BEQ PRADDR + JSR COUT + INX + BNE TITLLOC +PRADDR LDA SUMLOC+2 PRINT ORIGIN ADDRESS + JSR PRBYTE + LDA #0 + JSR PRBYTE + JSR CROUT + JSR DOSUM + LDA A3L + CMP CHKSUM + BNE ERRSUM + LDA A3H + CMP CHKSUM+1 + BNE ERRSUM + JSR CROUT + LDA #$CF PRINT 'OK' + JSR COUT + LDA #$CB + JSR COUT + JMP CROUT +ERRSUM JMP PRERR +DOSUM LDA STARTLOC + STA A1L + LDA STARTLOC+1 + STA A1H + LDA ENDLOC + STA A2L + LDA ENDLOC+1 + STA A2H + LDX #0 + STX A3L + STX A3H +GETBYT CLC + LDA (A1L,X) + ADC A3L + STA A3L + LDA #0 + ADC A3H + STA A3H + JSR NXTA1 + BCC GETBYT + RTS +INITSUM JSR DOSUM CHKSUM OF START-ENDMAIN + LDA A3L + STA CHKSUM + LDA A3H +CSUMLOC STA CHKSUM+1 + RTS + SKP 1 +*** PROGRAM DATA AREA *** + SKP 1 +TITLE DFB $8D + ASC "ANALYST 5.2" + DFB $8D TITLE MARKS START OF PDA + ASC "ORG = $" + DFB $00 +FMT2 DFB 0,33,129,130,90,73,89,77 + DFB 145,146,134,74,133,157 +MNEML DFB 28,138 + DFB 28,35,93,139,27,161,157,138 + DFB 29,35,157,139,29,161,28,41 + DFB 25,174,105,168,25,35,36,83 + DFB 27,35,36,83,25,161,173,26 + DFB 165,91,165,172,139,138,174,174 + DFB 168,173,41,138,124,139,21,156 + DFB 109,156,165,105,41,83,132,19 + DFB 52,17,165,105,35,160 +MNEMR DFB 216,98 + DFB 90,72,38,98,148,136,84,68 + DFB 200,84,104,68,232,148,196,180 + DFB 8,132,116,180,40,110,116,244 + DFB 204,74,114,242,164,138,6,170 + DFB 118,162,116,198,116,116,68,104 + DFB 178,50,178,114,34,114,26,26 + DFB 38,38,114,114,136,200,196,202 + DFB 38,72,68,68,162,200 +FMT1 DFB 240,34,0,51,93,130,0,147 + DFB 243,34,0,51,93,136,0,153 + DFB 240,47,0,51,93,143,0,159 + DFB 240,34,0,59,93,136,0,148 + DFB 253,34,0,51,93,200,0,147 + DFB 17,34,0,51,93,200,0,169 + DFB 241,34,0,51,93,143,0,159 + DFB 241,34,0,51,93,143,0,159 + DFB 38,49,135,154 +OPC65C DFB 18,50,82,114 + DFB 146,178,210,242,58,26,137,28 + DFB 20,122,90,156,100,158,116,124 + DFB 60,52 + DFB 76,164,172,180,188,196,204,228 + DFB 236 +REPL65C DFB 17,49,81,113,145,177 + DFB 209,241,194,226,52,164,172,196 + DFB 228,92,92,92,92,124,60,52 + DFB 124,160,160,160,160,192,192 + DFB 224,224 +CHAR1 DFB 172,169,172,163,168,164 +CHAR2 DFB 217,0,216,164,164,0 +CHAR3 ASC "CZIDB-VN" +RTBL ASC "AXYP" +CHRTBL DFB 152,249,3,190,236 + DFB 166,164,6,149,5,187 + DFB 0,147,2,167,198,153 + DFB 186,154,239,233,1,191 + DFB 237,158,235,197 +SUBTBL DW PRTITLE-1 F(?) DO CHCKSUM OF MAIN + DW SETVID-1 F(@) SWITCH SCREENS + DW EXECJSR-1 F(J) EXECUTE JSR + DW REGDSP-1 F(CTRL-E) DISPLAY REGS + DW STEP-1 F(S) STEP + DW SETMODE-1 F(-) 16 BIT SUBTRACTION + DW SETMODE-1 F(+) 16 BIT ADDITION + DW MOVE-1 F(M) MOVE + DW LT-1 F(<) COPY A2 TO A4 & A5 + DW LIST-1 F(L) LIST 22 LINES + DW BASIC-1 F(CTRL-B) DOSWARM VECT. + DW GO-1 F(G) GO + DW SETMODE-1 F(:) STORE + DW SETREG-1 F(I) SET INTERNAL PC/REG + DW SETMODE-1 F(.) XAM + DW CRMON-1 F(CR) HANDLE CR + DW BLANK-1 F( ) HANDLE SPACES + DW ASC-1 F(CTRL-A) DUMP IN ASCII + DW MINI-1 F(!) MINI-ASSEMBLER + DW VFY-1 F(V) VERIFY + DW SETPRNT-1 F(P) TO PRINTER + DW LOAD-1 F(H) LOAD FOR HSF + DW FIND-1 F(CTRL-F) HEX SEQ. FIND + DW TRACE-1 F(T) TRACE OR SET TLIMIT + DW BINARY-1 F(%) VALUE IN BINARY + DW RELOC-1 F(R) RELOCATOR + DW CRMON-1 HANDLE CTRL-L AS CR +HOOK40 DW COUT40 + DW KEYIN +HOOK80 DW COUT80 + DW KEYIN80 +IRQLOC DW IBREAK +BRKLOC DW BREAK +STARTLOC DW START +ENDLOC DW ENDMAIN +ERRMSG DFB $8D MARKS END OF WORDS + ASC 'RRE' + DFB $8D +ENDMAIN DFB $00 = END OF STATIC PGM AREA + SKP 1 +* DYNAMIC PROGRAM AREA * + SKP 1 +CSWL DS 1 ADDR. OF OUTPUT ROUTINE +CSWH DS 1 +KSWL DS 2 ADDR. OF INPUT ROUTINE +CSWL8 DS 2 DON'T CHANGE ORDER +KSWL8 DS 2 OF CSWL-KSWL8 +LMNEM DS 1 +RMNEM DS 1 +LENGTH DS 1 +MODE DS 1 +FORMAT DS 1 +FUNNY DS 1 RESET VECTOR FUNNY BYTE +ERRFLG DS 1 SET FOR BAD OPCODE +XFLG DS 1 1 = SKIP INSTRUCTION +TFLG DS 1 1 = CANCEL COUT FOR TRC +JFLG DS 1 SET TO ALLOW F(J) +FLG8 DS 1 FF = 80 COL, 0 = 40 COL +PROMPT DS 1 +CH DS 1 +CV DS 1 +ACC DS 1 DON'T CHANGE ORDER +XREG DS 1 OF ACC TO SPNT +YREG DS 1 +STATUS DS 1 +SPNT DS 1 +YSAV DS 1 +YSAV1 DS 1 +TLIMIT DS 1 PAGE# OF TRACE LIMIT +XQT DS 15 BUFFER FOR F(S,CTRL-F,J) +ZBUF DS $100-ZFLG PAGE ZERO STORAGE BUFFER +CHKSUM DS 2 CHKSUM OF STATIC PROG. +IN DS 38 KEYIN BUFFER. IN+8 TEMP. diff --git a/ANALYST 5.2E.txt b/ANALYST 5.2E.txt new file mode 100644 index 0000000..84d8bd5 --- /dev/null +++ b/ANALYST 5.2E.txt @@ -0,0 +1,2039 @@ + LST OFF + SBTL + MSB ON + ORG $6000 + SKP 1 +********************************* +* * +* -< THE ANALYST >- * +* * +* VERSION 5.2 * +* * +* BY * +* * +* LARRY A. GREENE * +* * +********************************* + SKP 1 +*** DESCRIPTION *** + SKP 1 +; THIS PROGRAM OPERATES INDEPENDENT OF ROM BUT HAS COM- +; MANDS SIMILAR TO THE BUILT IN MONITOR. THE TRACE AND +; STEP FUNCTIONS HAVE BEEN GREATLY ENHANCED TO DISPLAY +; STATUS REGISTER FLAGS AND SET A BREAK POINT. THE MINI +; ASSEMBLER HAS BEEN INCLUDED AS WELL AS A HEX SEQUENCE +; FINDER. 65C02 OPCODES ARE ALSO SUPPORTED. ZERO PAGE +; REFS ARE STORED IN A BUFFER WHICH AVOIDS CONFLICT WITH +; THE PROGRAM BEING TRACED. THIS PROGRAM USES THE BOTTOM +; 1/2 OF THE STACK ($100-180). TO USE DOS EXIT WITH +; CTRL-B AND RE-ENTER WITH &. + SKP 1 +*** COMMANDS *** + SKP 1 +; CTRL-A DUMP MEMORY IN ASCII +; CTRL-B ENTER RESIDENT BASIC W/DOS. & TO RETURN +; CTRL-E EXAMINE INTERNAL REGISTERS +; CTRL-F FIND SPECIFIED HEX SEQUENCE DEFINED BY F(H) +; G GO EXECUTE IN IMMEDIATE MODE +; H LOAD BYTES FOR HSF F(CTRL-F) BY USING H: +; I CHANGE PC AND/OR INTERNAL A,X,Y,P,S REGISTERS +; J JUMP. EXECUTE JSR INSTRUCTION IN STEP MODE +; CTRL-L CLEAR PRESENT SCREEN AND HOME CURSOR +; L LIST DISASSEMBLED INSTRUCTIONS +; M MOVE BLOCK OF MEMORY +; P SEND OUTPUT TO PRINTER +; R RELOCATE ANALYST TO NEW ADDRESS PAGE +; S ENTER STEP MODE. STEP INSTRUCTION +; T TRACE PROGRAM OR SET TRACE LIMIT +; V VERIFY TWO BLOCKS OF MEMORY +; CTRL-X CANCEL LINE ENTRY +; X SKIP NEXT INSTRUCTION IN STEP MODE +; % PRINT ADDRESS DATA VALUE IN BINARY +; ? PRINT ORIGIN ADDRESS & DO INTERNAL CHECKSUM +; @ SET TEXT 40/80 COL SCREEN +; < RANGE DELIMITER +; . RANGE DELIMITER +; + 16 BIT ADDITION +; - 16 BIT SUBTRACTION +; : STORE VALUE IN MEMORY +; ! ENTER MINI-ASSEMBLER. "#" TO EXIT + SKP 1 +*** OPERATING NOTES *** + SKP 1 +; INPUT LINE LIMITED TO 38 CHARACTERS. BEEPS ON LAST 4. + SKP 1 +; HOME (CTRL-L) ACTS IMMEDIATELY. FOLLOW WITH . + SKP 1 +; FOR STEP TYPE 300S THEN S, OPEN-APPLE, SPACE, OR +; J TO STEP EACH INSTRUCTION. S OR OPEN-APPLE TO STEP +; INTO JSR. J TO EXECUTE SUBROUTINE. X TO SKIP INSTRUC- +; TION. T TO ENTER TRACE. @ FOR TEXT. CTRL-C TO EXIT. +; @ WILL EXECUTE NEXT INSTRUCTION. + SKP 1 +; FOR TRACE USE FFFF<2000T WHERE FFFF DENOTES BRKPOINT. +; PC PRINTED AT UPPER LEFT EVERY 256 LINES. OPEN APPLE +; ENTERS SLOW TRACE WITH PC PRINTED EACH LINE. CLOSED +; APPLE EXITS TO STEP MODE. TRACE WILL EXECUTE SUB- +; ROUTINES ABOVE PAGE# LIMIT IN IMMEDIATE MODE IF SET +; BY T:NN. WILL TRACE THRU RAM $D000-FFFF, HOWEVER. +; TO TRACE ALL SET T:00 WHICH IS DEFAULT VALUE. +; TRACE ACTIVITY INDICATED BY FLASHING $ OR # FOR JSR +; IMMEDIATE MODE. BREAKPOINT ENTERS STEP MODE AND DOES +; EXECUTE BREAKPOINT INSTRUCTION. + SKP 1 +; FOR JUMP TYPE 'J5' WHERE 5 REPRESENTS # OF PARM BYTES +; FOLLOWING JSR INSTRUCTION. J DEFAULTS TO 0. JUMP +; DURING STEP & TRACE IMMEDIATE HANDLE JSR $BF00 AS +; PRODOS MLI CALL WITH 3 PARM BYTES FOLLOWING. MUST USE +; 'J3' FROM COMMAND LINE. IF SUBROUTINE BEING 'JUMPED' +; CONTAINS A TXS INSTRUCTION, ANALYST WILL LOSE CONTROL! +; ALSO TRACE IMMEDIATE WILL NOT HANDLE A SUBROUTINE OTHER +; THAN $BF00 WITH PARM BYTES FOLLOWING! + SKP 1 +; STEP & TRACE BREAK FOR ILLEGAL OPCODES. PRINTS 'ERR' + SKP 1 +; TO CHANGE PC AND/OR INTERNAL REGS TYPE 300I:AA XX +; YY PP SS . PC ENTRY BEFORE I OPTIONAL. + SKP 1 +; FOR HEX SEQUENCE FINDER TYPE H:N1 N2 N3... +; 1000<2000 CTRL-F . + SKP 1 +; TO DUMP MEMORY IN ASCII USE 1000.2000 CTRL-A . + SKP 1 +; TO PRINT ADDRESS BYTE IN BINARY TYPE 2000% . + SKP 1 +; TO SWITCH SCREENS TYPE @8,@4 OR @ FOR TEXT. + SKP 1 +; TO RELOCATE TYPE NN00R . WILL ROUND OFF TO NEAREST +; PAGE BOUNDARY. DO NOT SET < $800! IF < 4K FROM OLD +; ORIGIN, WILL BE IGNORED. IF MOVED TO RAM CARD DO NOT +; CHANGE CARD R/W STATE! + SKP 1 +; DO NOT USE THE PRINTER WHEN THE ANALYST IS LOCATED +; ON THE RAM CARD. THE PRINTER WILL NOT INITIALIZE. +; ALSO RESET WILL NOT RETURN TO THE ANALYST LOCATED +; ON THE RAM CARD WITH 128K MACHINES. + SKP 1 +; & VECTOR $3F5 IS A WARMSTART RE-ENTRY WHICH CAN BE +; USED TO JMP INTO ANALYST FROM A RUNNING PROGRAM +; WITH ALL REGS PRESERVED. + SKP 1 +; THE ANALYST USES $C01F TO DETECT 80 COL MODE. +; THIS METHOD IS INVALID ON OLDER NON-IIE APPLES. + SKP 1 +; TO STEP AND TRACE AUX MEMORY, ANALYST SHOULD BE IN +; 80 COLUMN MODE. + SKP 1 +*** ROM ZERO PAGE EQUATES *** + SKP 1 +WNDWDTH EQU $21 +MCH EQU $24 +MCV EQU $25 +MCSWL EQU $36 +MCSWH EQU $37 +MKSWL EQU $38 +MKSWH EQU $39 +MPCL EQU $3A +MPCH EQU $3B +MA1L EQU $3C +MA1H EQU $3D +MA2L EQU $3E +MA2H EQU $3F +MA4L EQU $42 +MA4H EQU $43 +MACC EQU $45 +MXREG EQU $46 +MYREG EQU $47 +MSTATUS EQU $48 +MSPNT EQU $49 +RNDL EQU $4E +SPDBYT EQU $F1 APPLESOFT SPEED= + SKP 1 +*** ANALYST EQUATES *** + SKP 1 +STKLMT EQU $80 TOP OF STACK (IMMEDIATE) +ZFLG EQU $EE 2 BYTE ID ($D5 $AA) +A1L EQU $F0 A1L-A5H MUST BE IN ORDER +A1H EQU $F1 FOR MINI-ASSEMBLER +A2L EQU $F2 +A2H EQU $F3 +A3L EQU $F4 +A3H EQU $F5 +A4L EQU $F6 +A4H EQU $F7 +A5L EQU $F8 +A5H EQU $F9 +PCL EQU $FA +PCH EQU $FB +BASL EQU $FC +BASH EQU $FD +BAS2L EQU $FE +BAS2H EQU $FF LABEL MARKS END OF PAGE 0. +STACK EQU $0100 + SKP 1 +*** DYNAMIC PROGRAM AREA *** + SKP 1 +* $0100 CANNOT BE USED OR PRODOS WILL NOT BRUN ANALYST + SKP 1 +CSWL EQU $0101 ADDR. OF OUTPUT ROUTINE +CSWH EQU $0102 +KSWL EQU $0103 ADDR. OF INPUT ROUTINE +CSWL8 EQU $0105 DON'T CHANGE ORDER +KSWL8 EQU $0107 OF CSWL-KSWL8 +LMNEM EQU $0109 +RMNEM EQU $010A +LENGTH EQU $010B +MODE EQU $010C +FORMAT EQU $010D +FUNNY EQU $010E RESET VECTOR FUNNY BYTE +ERRFLG EQU $010F SET FOR BAD OPCODE +XFLG EQU $0110 1 = SKIP INSTRUCTION +TFLG EQU $0111 1 = CANCEL COUT FOR TRC +JFLG EQU $0112 SET TO ALLOW F(J) +FLG8 EQU $0113 FF = 80 COL, 0 = 40 COL +PROMPT EQU $0114 +CH EQU $0115 +CV EQU $0116 +ACC EQU $0117 DON'T CHANGE ORDER +XREG EQU $0118 OF ACC TO SPNT +YREG EQU $0119 +STATUS EQU $011A +SPNT EQU $011B +YSAV EQU $011C +YSAV1 EQU $011D +TLIMIT EQU $011E PAGE# OF TRACE LIMIT +XQT EQU $011F BUFFER FOR F(S,CTRL-F,J) +ZBUF EQU $012E PAGE ZERO STORAGE BUFFER +CHKSUM EQU $0140 CHKSUM OF STATIC PROG. +IN EQU $0142 KEYIN BUFFER. IN+8 TEMP. +DOSV EQU $03D0 DOS BASIC WARM ENTRY +BRKV EQU $03F0 BREAK VECTOR +SOFTEV EQU $03F2 RESET VECTOR +AMPERV EQU $03F5 ANALYST WARMSTART RE-ENTRY +MLI EQU $BF00 PRODOS INTERFACE + SKP 1 +*** ROM EQUATES *** + SKP 1 +KBD EQU $C000 +CLR80COL EQU $C000 ENABLE PAGE2 DISPLAY +MAINRD EQU $C002 +MAINWR EQU $C004 +CLRIOROM EQU $C006 +MAINZP EQU $C008 +AUXZP EQU $C009 +CLR80ROM EQU $C00A +CLR80VID EQU $C00C +CLRCHAR2 EQU $C00E +KBDSTRB EQU $C010 +RDAUXZP EQU $C016 BMI IF AUXZP +RD80VID EQU $C01F BMI IF 80 COL MODE +SPKR EQU $C030 +TXTSET EQU $C051 +LOWSCR EQU $C054 +SETAN0 EQU $C058 +PB0 EQU $C061 OPEN APPLE KEY +PB1 EQU $C062 CLOSED APPLE KEY +SWITCH2 EQU $C082 +SWITCH3 EQU $C083 +PRINIT EQU $C100 PRINTER IN SLOT 1 +PR3 EQU $C300 +AUXMOVE EQU $C311 +IDROM EQU $E000 = $4C IF ROM PRESENT +MKEYIN EQU $FD1B +MVIDOUT EQU $FDF0 +RESET EQU $FFFC RESET VECTOR IN RAMCARD +IRQ EQU $FFFE BREAK VECTOR IN RAMCARD + SKP 3 +GETSUM JSR INITSUM CREATE CHECKSUM OF MAIN + LDA #$2C WHEN FIRST BRUN +SUMLOC STA GETSUM DISABLE CHECKSUM + LDA SUMLOC+1 COPY GETSUM - ENDMAIN + STA MA1L INTO AUX AT SAME ADDR + STA MA4L + LDA SUMLOC+2 + STA MA1H + STA MA4H + LDA ENDLOC + STA MA2L + LDA ENDLOC+1 + STA MA2H + SEC FLAG FOR MAIN TO AUX + JSR AUXMOVE + JSR SETRV RESET VECTOR TO 'START' + LDA IRQLOC SET IRQ TO HANDLE + STA IRQ BREAK INSTRUCTIONS + LDA IRQLOC+1 + STA IRQ+1 + LDA BRKLOC + STA BRKV + LDA BRKLOC+1 + STA BRKV+1 + LDA #>DOSV COPY $3D0-3FF TO AUX + STA MA1L + STA MA4L + LDA # ZFLG:D5 AA + STA ZFLG + LDA #$AA + STA ZFLG+1 +START2 JSR TEXT PRIMARY TEXT MODE + LDA #$00 + STA CLR80ROM DISABLE 80 COL ROM + STA CLRIOROM DISABLE INTERNAL I/O + STA CLRCHAR2 PRIMARY CHAR SET + STA TLIMIT TRACE ALL + STA STATUS CLEAR STATUS + STA ERRFLG CLEAR FLAGS + STA XFLG + STA TFLG + STA JFLG + STA PCL + STA PCH + LDX #$F0 + STX SPNT +CLRSTK STA STACK,X = 0 + INX + BNE CLRSTK + JSR PRTITLE + JMP MONZ +SETRV LDA STARTLOC + STA SOFTEV + STA RESET + LDA STARTLOC+1 + STA SOFTEV+1 + STA RESET+1 + EOR #$A5 + STA SOFTEV+2 + STA FUNNY SAVE FOR REFERENCE + RTS +INSDS1 LDX PCL + LDY PCH + JSR PRYX2 + JSR OUTSP + LDX #0 +INSDST LDA (PCL,X) +INSDS2 LDY #$FF DETERMINE LENGTH OF + STY LMNEM INSTRUCTION. OPCODE IN + TAY ACC. STORED IN LENGTH. + LSR A INVALID = 0 + BCC IEVEN 1 BYTE = 0 + ROR A 2 BYTE = 1 + BCS ERR 3 BYTE = 2 + AND #$87 +IEVEN LSR A + TAX + LDA FMT1,X + BCC RTMSKZ + LSR A + LSR A + LSR A + LSR A +RTMSKZ AND #$0F + CMP #$0F + BNE GETFMT +ERR LDY #$FF BAD OPCODE + STY ERRFLG + INY + STY LMNEM + STY RMNEM + STY FORMAT + STY LENGTH +RTS1 RTS +GETFMT TAX + LDA FMT2,X + STA FORMAT + AND #$03 + STA LENGTH + LDA TFLG BYPASS PRINT FORMATTING + BNE RTS1 IN TRACE + TYA + AND #$8F + STA IN+8 TEMP STORAGE + TYA + LDX #31 +GETFMT2 DEX + BMI MNNDX + CMP OPC65C,X MAKE SUBSTITUTION IF + BNE GETFMT2 65C02 OPCODE. + LDA REPL65C,X +MNNDX LDX IN+8 + LDY #$03 + CPX #$8A + BEQ MNNDX3 +MNNDX1 LSR A + BCC MNNDX3 + LSR A +MNNDX2 LSR A + ORA #$20 + DEY + BNE MNNDX2 + INY +MNNDX3 DEY + BNE MNNDX1 + RTS +INSTDSP JSR INSDS1 + PHA +PRNTOP LDA (PCL),Y + JSR PRBYTE + LDX #$01 +PRNTBL JSR PRBLNK + CPY LENGTH + INY + BCC PRNTOP + LDX #$03 + CPY #$03 + BCC PRNTBL + PLA + TAY + LDA LMNEM + BEQ PRMN1 + LDA MNEML,Y + STA LMNEM + LDA MNEMR,Y + STA RMNEM +PRMN1 LDA #$00 + LDY #$05 +PRMN2 ASL RMNEM + ROL LMNEM + ROL A + DEY + BNE PRMN2 + ADC #$BF + JSR COUT + DEX + BNE PRMN1 + JSR OUTSP + LDY LENGTH + LDX #$05 +PRADR1 CPX #$02 + BEQ PRADR5 +PRADR2 ASL FORMAT + BCC PRADR3 + LDA CHAR1,X + JSR COUT + LDA CHAR2,X + BEQ PRADR3 + JSR COUT +PRADR3 DEX + BPL PRADR1 + RTS +PRADR4 DEY + BMI PRADR2 + JSR PRBYTE +PRADR5 LDA FORMAT + CMP #$E8 + LDA (PCL),Y + BCC PRADR4 + JSR PCADJA + TAX + INX + BNE PRNTYX + INY +PRNTYX TYA +PRNTAX JSR PRBYTE + TXA + JMP PRBYTE +PRBL13 LDX #13 + DFB $2C SKIP NEXT INSTRUCTION +PRBL33 LDX #33 +PRBLNK JSR OUTSP PRINT X SPACES + DEX + BNE PRBLNK + RTS +PCADJ SEC UPDATE PC BY LENGTH+1 +PCADJLP LDA LENGTH +PCADJAP JSR PCADJA + STA PCL + STY PCH + RTS +PCADJL LDA LENGTH UPDATE PC BY LENGTH +PCADJA LDY PCH UPDATE PC BY ACC + TAX + BPL PCADJ2 + DEY +PCADJ2 ADC PCL + BCC RTS2 + INY +RTS2 RTS NEW PC IN Y,A +STEP TXA F(S) + BNE SSTEP FIRST TIME + JSR KYWAIT CTRL-C = BREAK + CPY #$CA + BNE STEP2 + LDA JFLG J = SINGLE STEP + BEQ SSTEP IF NO JSR, ELSE + DEC YSAV EXECUTE SUBROUTINE + PLA + PLA + JMP TRCPCS +STEP2 LDA JFLG SPC = SINGLE STEP IF + BNE STEP3 NOT JSR, ELSE IGNORE + CPY #$A0 + BEQ SSTEP +STEP3 CPY #$D3 S OR OPEN APPLE = + BEQ SSTEP SINGLE STEP ALWAYS + TYA + BEQ SSTEPW = 0 FOR OPEN APPLE. + CPY #$D4 T = ENTER TRACE MODE + BNE STEP4 + INC TFLG SET TRACE MODE FLAG + JMP TRACE4 AND ENTER TRACE. +STEP4 CPY #$D8 X = SKIP NEXT INSTRUCTION + BNE STEP5 + LDA #1 TURN OFF XQT EXECUTION + STA XFLG + BNE SSTEP ALWAYS TAKEN +STEP5 CPY #$C0 @ = TEXT MODE + BNE STEP + JSR TEXT +SSTEPW LDA #$FF PAUSE TO RELEASE O/A KEY + JSR WAIT +SSTEP JSR A1PC +SSTEPT DEC YSAV TRACE RE-ENTRY TO STEP + LDA #0 + STA CV + STA CH + JSR VTABZ + DEC CV TOP OF SCRN AFTER CROUT + JSR INSTDSP + JSR CLREOL + PLA REMOVE RTS TO NEXTITM + PLA + LDX XFLG + BEQ NOSKIP + DEX + STX XFLG + STX ERRFLG IN CASE SKIPPING ERROR + JSR PCADJ + JMP NXTPC SKIP INSTRUCTION +NOSKIP JMP TSTEP +PRNTPC LDA #0 PRINT PC AT UPPER LEFT + STA CH + LDA PROMPT + JSR COUT + LDA PCH + LDX PCL + JMP PRNTAX +TRACEPC JSR CHKVID CHECK/RESET 40/80 MODE + INC RNDL PRINT PC + BNE TRCPC1 EVERY 256 INSTRUCTIONS + LDA PROMPT FLASHING '$' FOR TRACE + EOR #$04 ACTIVITY. $A4->$A0->$A4 + STA PROMPT + JSR PRNTPC +TRCPC1 LDA JFLG + BEQ TRACE5 + LDA TLIMIT + BEQ TRACE5 FULL TRACE IF TLIMIT=0. + LDA PCH + CMP TLIMIT IF PC < TLIMIT PAGE# + BCC TRACE5 THEN TRACE THRU ELSE + LDY IDROM CHECK FOR ROM. IF IN + CPY #$4C ROM EXEC JSR IMMEDIATE + BEQ TRCPC2 MODE ELSE IF PC >= $D0 + CMP #$D0 THEN TRACE THRU. + BCS TRACE5 +TRCPC2 JSR STPRMPT '#' DENOTES JSR IMMED. + JSR PRNTPC PRINT EXEC SUBROUTINE + INC PROMPT '#' -> '$' + LDA #$FF FORCE PC PRINTING + STA RNDL AFTER JSR IMMED. +TRCPCS LDA PCL SEE IF PC = $BF00 + BNE TRCPCG + LDA PCH + CMP # '$' 1ST TIME ONLY + LDA #$FF FORCE VTAB TO TOP OF SCRN + STA CV WHEN CROUT INC'S CV TO 0 + JSR CROUT (NEEDED FOR 80 COL). +TRACE5 LDX #1 IF PC = A4 THEN ENTER STEP +TRACE6 LDA PCL,X + CMP A4L,X + BNE TRACE7 + DEX + BPL TRACE6 + INX + BEQ TRACES ALWAYS TAKEN +TRACE7 LDX #0 FOR INSDST + LDA PB1 BACK TO STEP MODE IF + BPL TRACE8 CLOSED APPLE PRESSED +TRACES STA KBDSTRB + STX TFLG CLEAR TRACE FLAG + JSR TEXT + JSR STPRMPT PROMPT BACK TO OLD '#' + LDY YSAV + DEY + LDA #$D3 PUT 'S' INTO INPUT BUFFER + STA IN,Y + JMP SSTEPT RE-ENTER STEP MODE +TRACE8 LDA PB0 SLOW TRACE IF OPEN APPLE + BPL TRACE9 PRESSED + LDA #$FF + STA RNDL FORCE PC PRINTING + PHA + JSR WAIT + PLA + JSR WAIT +TRACE9 JSR INSDST +TSTEP LDA FUNNY SEE IF RESET VECTOR + CMP SOFTEV+2 HAS BEEN CHANGED + BEQ TSTEP2 + JSR SETRV GET BACK RESET CONTROL +TSTEP2 LDA ERRFLG IF BAD OPCODE THEN BRK + BNE XBRK + TAX = 0 + STX JFLG DISALLOW F(J) IF NO JSR + LDA (PCL,X) GET OPCODE + PHA + LDY LENGTH + CPY #2 + BNE TSTEP2A + AND #$F0 CHECK FOR STA MAINZP OR + CMP #$80 STA ALTZP INSTRUCTION + BNE TSTEP2A + LDA (PCL),Y + CMP #$C0 + BNE TSTEP2A + DEY + LDA (PCL),Y + INY + CMP #8 + BCC TSTEP2A + CMP #$0A + BCS TSTEP2A + ROR A ODD/EVEN BIT EORED + ROR A AGAINST BIT7 OF AUXZP + EOR RDAUXZP STATE TO SEE IF CHANGE + BMI TSTEP2B BETWEEN MAIN OR AUX. +TSTEP2A JMP TSTEP3 +TSTEP2B JSR ZSWAP GET ANALYST ZERO PAGE + LDX #STKLMT INTO MAIN AND COPY VARS + LDA RDAUXZP ON STACK ACROSS. THEN + BMI AUX2MAIN PUT ANALYST PAGE0 BACK. +MAIN2AUX LDA STACK,X + STA AUXZP + STA STACK,X + STA MAINZP + DEX + BPL MAIN2AUX + STA AUXZP + BMI ZPDONE ALWAYS TAKEN +AUX2MAIN LDA STACK,X + STA MAINZP + STA STACK,X + STA AUXZP + DEX + BPL AUX2MAIN + STA MAINZP +ZPDONE JSR ZSWAP + INX + BEQ TSTEP3 ALWAYS TAKEN +XBRK LDY TFLG + BEQ SBRK + DEY + STY TFLG + DEY + STY A4L CLEAR OLD BREAK POINT + STY A4H +GBRK JSR INSTDSP DISP BRK FOR GO & TRACE + JSR RGDSP1 + BEQ BRKMON ALWAYS TAKEN +SBRK JSR CROUT + LDA #5 + STA CV + JSR VTABZ + JSR CLREOL ERASE OLD INSTRUCTION +BRKMON JMP ERRMON +XTSX LDX SPNT + STX XREG +XTXS LDX XREG +UPDSPNT STX SPNT UPDATE SPNT + CPX #STKLMT+1 STACK OVERFLOW IF + BCC XBRK IN ANALYST WORK AREA + JMP PCINC UPDATE PC +TSTEP3 PLA + BEQ XBRK + CMP #$20 + BEQ XJSR + CMP #$60 + BEQ XRTS + CMP #$BA + BEQ XTSX + CMP #$9A + BEQ XTXS + CMP #$7C + BEQ XJMPATX + CMP #$4C + BEQ XJMP + CMP #$6C + BEQ XJMPAT + CMP #$40 + BEQ XRTI + PHA + CMP #$5A + BCC TSTEP4 + TAX + AND #$1F + CMP #$1A + BEQ STACKOP PHX,PLX,PHY,PLY + TXA +TSTEP4 AND #$9F + CMP #$08 + BNE TSTEP5 +STACKOP JMP STKOPC PHA,PLA,PHP,PLP +TSTEP5 LDX #$08 +XQINIT LDA INITBL-1,X + STA XQT,X + DEX + BNE XQINIT + PLA OPCODE + CMP #$80 + BNE NBRA + ORA #$10 +NBRA AND #$1F + EOR #$14 + CMP #$04 = BRANCH OFFSET + BEQ XQ2 TAKEN IF BRANCH OPCODE +XQ1 LDA (PCL),Y Y = LENGTH +XQ2 STA XQT,Y XQT BCS BRNCH (B0 04) + DEY NOP + BPL XQ1 JMP NBRNCH (CCLR) + JMP XQJ BRNCH JMP BRANCH (CSET) +XRTI CLC + PLA + STA STATUS +XRTS LDX SPNT + INX + LDA STACK,X + STA PCL + INX + LDA STACK,X + STA PCH + STX SPNT + BNE PCINC ALWAYS TAKEN +XJMPATX INX + BNE XJMPAT +XJSR STA JFLG OK FOR F(J) + CLC + JSR PCADJL SET Y,A = RTS ADDR + PHA + LDX SPNT + TYA + STA STACK,X + DEX + PLA + STA STACK,X + DEX + STX SPNT + LDY #$02 +XJMP CLC +XJMPAT LDA (PCL),Y + PHA + DEY + LDA (PCL),Y + STA PCL + PLA + STA PCH + BCC NEWPC + DEX + BNE XJMP + LDA XREG + CLC + JSR PCADJAP + LDY #1 + BNE XJMP ALWAYS TAKEN +NBRNCH JSR SAVE ALL OTHER OPCODES + BMI UPDPC ALWAYS TAKEN +BRANCH JSR SAVE BRANCH WITH COND. MET + CLC + LDY #$01 + LDA (PCL),Y + JSR PCADJAP +UPDPC SEC +PCINC JSR PCADJLP +NEWPC LDA TFLG + BNE TRACEBY BYPASSES NEXTITM +NXTPC JSR CROUT + JMP REGDSP +TRACEBY JMP TRACEPC +INITBL NOP + NOP + JMP NBRNCH + JMP BRANCH +PULL PHP + INX + LDA STACK,X + TAY + LDA STATUS PULL FROM STACK AFFECTS + PHA N & Z FLAGS + PLP + TYA UPDATE N & Z + PHP + PLA + STA STATUS + TYA + PLP + RTS +STKOPC LDX SPNT STACK OPCODES + PLA OPCODE + TAY + AND #$10 + BEQ APCODE + TYA + ASL A + BCS OPCX + ASL A + ASL A + BCS XPLY + LDA YREG XPHY + BCC PUSH +XPLY JSR PULL + STA YREG + BCS UPDSTACK +OPCX ASL A + ASL A + BCS XPLX + LDA XREG XPHX + BCC PUSH +XPLX JSR PULL + STA XREG + BCS UPDSTACK +APCODE TYA + ASL A + ASL A + BMI PULLAP + BCC XPHP + LDA ACC XPHA + BCS PUSH +XPHP LDA STATUS +PUSH STA STACK,X + DEX + BNE UPDSTACK +PULLAP BCC XPLP + JSR PULL XPLA +ACCLOC STA ACC + BCS UPDSTACK +XPLP JSR PULL + STA STATUS +UPDSTACK JMP UPDSPNT +IBREAK STA MACC + PLP FOR IRQ W/CARD ON + STX MXREG + STY MYREG + PHP + PLA + STA MSTATUS + TSX + STX MSPNT + CLD + PLA + STA MPCL + PLA + STA MPCH +BREAK SEC IRQ W/ CARD OFF + LDA MPCL ROM SAVED PC + SBC #2 AFTER DEC BY 2 + STA PCL + LDA MPCH + SBC #0 + STA PCH + LDX #4 +BRKSAVE LDA MACC,X COPY SAVED REGS + STA ACC,X + DEX + BPL BRKSAVE + LDX #$40 RESTORE ANALYST STACK + TXS + JMP GBRK +REGDSP JSR PRBL13 F(CTRL-E) + LDX #$07 +PRFLG LDA CHAR3,X PRINT 'NV-BDIZC' + JSR COUT + DEX + BPL PRFLG + JSR PRBL13 +RGDSPB JSR CROUT + LDA #$C1 PRINT ACC AND STATUS + JSR COUT IN BINARY + JSR OUTEQ + LDA ACC + JSR BNDSP + JSR OUTSP + LDA #$D0 + JSR COUT + JSR OUTEQ + LDA STATUS + JSR BNDSP + JSR PRBL13 + JSR RGDSP1 + JSR INSTDSP DISPLAY INSTRUCTION + JSR PRBL13 TO BE EXECUTED NEXT + JMP NEXTITM +RGDSP1 JSR CROUT + LDX #0 +RDSP1 JSR OUTSP + LDA RTBL,X + JSR COUT + LDA #$BD + JSR COUT + LDA ACC,X + JSR PRBYTE + INX + CPX #4 + BCC RDSP1 + JSR PRBL13 + LDX SPNT PRINT STACK IN THE FORM + LDY #$01 1NN- XX NN... + JSR PRYX2 + INX + LDY #6 + JSR OUTSP + LDA #$D8 + JSR COUT + JSR COUT +PRSTK JSR OUTSP + LDA STACK,X + JSR PRBYTE + INX + DEY + BNE PRSTK + JMP PRBL13 +BNDSP LDX #$08 INDEX FOR 8 BITS +NEXTBIT ASL A + PHA + BCS BIT1 + LDA #$30 '0' + DFB $2C SKIP NEXT INSTRUCTION +BIT1 LDA #$31 '1' + JSR COUT + PLA + DEX + BNE NEXTBIT + RTS +BINARY JSR PRA1 F(%) + JSR OUTSP + LDA (A1L),Y PRINT A1 IN BINARY. Y=0 + JSR BNDSP + JMP CROUT +BASCALC PHA + LSR A + AND #$03 + ORA #$04 + STA BASH + PLA + AND #$18 + BCC BSCLC2 + ADC #$7F +BSCLC2 STA BASL + ASL A + ASL A + ORA BASL + STA BASL + RTS +BELL LDY #$38 DURATION +BELL2 LDA #$2B FREQUENCY + JSR WAIT + LDA SPKR + DEY + BNE BELL2 + RTS +VIDOUT CMP #$A0 + BCC NOADV INVERSE, CTRL, OR FLASH +STOADV LDY CH + STA (BASL),Y + INC CH + LDA CH + CMP #$28 + BCS CR +RTS3 RTS +NOADV TAY + BPL STOADV INVERSE OR FLASH + CMP #$8D + BEQ CR + CMP #$88 + BNE RTS3 DON'T PRINT CTRL CHARS. + DEC CH BACKSPACE + BPL RTS3 + LDA #$28 + STA CH + DEC CH +UP LDA #$00 + CMP CV + BCS RTS4 + DEC CV +VTAB LDA CV +VTABZ JSR BASCALC + ADC #$00 + STA BASL +RTS4 RTS +HOME40 LDA #$00 + STA CV + LDY #$00 + STY CH +CLEOP1 PHA + JSR VTABZ + JSR CLEOLZ + LDY #$00 + PLA + ADC #$00 + CMP #$18 + BCC CLEOP1 + BCS VTAB +CR LDA #$00 + STA CH + INC CV + LDA CV + CMP #$18 + BCC VTABZ + DEC CV + LDA #$00 + PHA + JSR VTABZ +SCRL1 LDA BASL BASL = CURRENT + STA BAS2L BAS2L = OLD + LDA BASH + STA BAS2H + LDY #$28 + DEY + PLA + ADC #$01 + CMP #$18 + BCS SCRL3 + PHA + JSR VTABZ +SCRL2 LDA (BASL),Y + STA (BAS2L),Y + DEY + BPL SCRL2 + BMI SCRL1 +SCRL3 LDY #$00 + JSR CLEOLZ + BCS VTAB ALWAYS TAKEN +CLREOL LDY CH + LDA FLG8 SEE IF 80 COL VIDEO + BPL CLEOLZ 80 COL ONLY CLEARS NEXT + JMP PRBL33 33 SPACES FOLLOWING +CLEOLZ LDA #$A0 +CLEOL2 STA (BASL),Y + INY + CPY #$28 + BCC CLEOL2 + RTS +LWAIT LDA #$70 LIST SCROLL RATE +WAIT SEC +WAIT2 PHA +WAIT3 SBC #$01 + BNE WAIT3 + PLA + SBC #$01 + BNE WAIT2 + RTS +NXTA4 INC A4L INCREMENT A4 + BNE NXTA1 + INC A4H +NXTA1 LDA A1L + CMP A2L + LDA A1H + SBC A2H + INC A1L + BNE RTS4B + INC A1H +RTS4B RTS CARRY SET IF A1 >= A2 +CTRLC LDY KBD CTRL-C = BREAK TO MONITOR + BPL RTS4B + STY KBDSTRB + CPY #$93 CTRL-S = PAUSE + BNE CTLC +KYWAIT LDY PB0 F(S) ENTRY POINT + BMI KYWT2 + LDY KBD + BPL KYWAIT + STY KBDSTRB + DFB $2C +KYWT2 LDY #0 0 = OPEN APPLE PRESSED +CTLC CPY #$83 + BNE RTS4B + JMP MONZ +RDKEY JMP (KSWL) +KEYIN LDY CH + LDA (BASL),Y + PHA + AND #$3F INVERSE CURSOR + STA (BASL),Y + PLA + BIT KBD + BPL KEYIN + ORA #$80 + STA (BASL),Y + LDA KBD + BIT KBDSTRB + RTS +NOTCR LDA IN,X + JSR COUT + CMP #$88 + BEQ BCKSPC + CMP #$98 + BEQ CANCEL + CPX #34 BEEP ON LAST 4 CHAR. + BCC NOTCR1 + JSR BELL +NOTCR1 INX + CPX #38 38 CHARACTERS ALLOWED + BCC NXTCHAR +CANCEL LDA #$DC + JSR COUT +GETLNZ JSR CROUT + LDA PROMPT + JSR COUT + LDX #$01 +BCKSPC TXA + BEQ GETLNZ + DEX +NXTCHAR JSR RDKEY + CMP #$95 + BEQ NXTCHAR IGNORE '->' + CMP #$FF + BNE NOTDEL + LDA #$88 DELETE KEY = BACKSPACE +NOTDEL CMP #$88 + BNE CAPTST + PHA + JSR COUT BACKSPACE + JSR OUTSP DELETE CHARACTER + PLA BACKSPACE +CAPTST CMP #$E0 + BCC ADDINP + AND #$DF +ADDINP STA IN,X + CMP #$8D + BNE NOTCR + JSR CLREOL +CROUT LDA #$8D + BNE COUT +HOME LDA #$8C + BNE COUT +OUTSP LDA #$A0 + BNE COUT +PRA1 LDY A1H + LDX A1L +PRYX2 JSR CROUT + JSR PRNTYX + LDY #$00 + LDA #$AD + JMP COUT +MOD8CHK LDA A1L + AND #$07 + BNE DATAOUT +XAM JSR PRA1 F(.) A1.A2 +DATAOUT JSR OUTSP + LDA A1H SEE IF ZERO PAGE + BNE XAM2 + LDA A1L + SEC + SBC #ZFLG + BCC XAM2 TAKEN IF A1L < ZFLG + TAX OTHERWISE GET FROM ZBUF + LDA ZBUF,X + DFB $2C SKIP NEXT INSTRUCTION +XAM2 LDA (A1L),Y + JSR PRBYTE + JSR NXTA1 + BCC MOD8CHK CARRY CLEAR IF A1PRINIT SIMULATE PR#1 + LDA #MKEYIN PROPER DOS HOOKS. + STA MKSWH + STY MKSWL + LDA #MVIDOUT + STA MCSWH + STY MCSWL + LDA #40 + STA WNDWDTH + JSR IN40 + STA SETAN0 VIDEX 80 COL SOFTSWITCH + STA CLR80COL + STA CLR80VID + JSR HOME40 +TXT1 LDA LOWSCR + LDA TXTSET + RTS +STPRMPT LDA #$A3 + STA PROMPT + RTS +IN40 LDX #4 +MOVE40 LDA HOOK40-1,X + STA CSWL-1,X + DEX + BNE MOVE40 + STX FLG8 SET = 0 +RTS7 RTS +CHKVID LDA RD80VID RESET 40/80 COL IF NEEDED + ASL A BIT 7 INTO CARRY + LDA FLG8 + BMI CHK80 + BCC RTS7 + BCS IN80 40 -> 80 +CHK80 BCS RTS7 + BCC IN40 80 -> 40 + SKP 1 +*** 80 COLUMN DRIVER ROUTINE *** + SKP 1 +INIT80 JSR HOME + JSR PR3 + STA CLRCHAR2 + JSR IN80 + BMI TXT1 ALWAYS TAKEN +IN80 LDX #3 +MOVE80 LDA MCSWL,X + STA CSWL8,X + LDA HOOK80,X + STA CSWL,X + DEX + BPL MOVE80 + STX FLG8 SET = FF + RTS +COUT80 JSR EXCHV + JSR COUTZ80 + JMP EXCHV +COUTZ80 JMP (CSWL8) +KEYIN80 JSR EXCHV + JSR KEY80 + JMP EXCHV +KEY80 JMP (KSWL8) +EXCHV PHA + TXA + PHA + LDA CH + LDX MCH + STA MCH + STX CH + LDA CV + LDX MCV + STA MCV + STX CV + PLA + TAX + PLA + RTS +PRTITLE LDX #$00 PRINT TITLE +TITLLOC LDA TITLE,X + BEQ PRADDR + JSR COUT + INX + BNE TITLLOC +PRADDR LDA SUMLOC+2 PRINT ORIGIN ADDRESS + JSR PRBYTE + LDA #0 + JSR PRBYTE + JSR CROUT + JSR DOSUM + LDA A3L + CMP CHKSUM + BNE ERRSUM + LDA A3H + CMP CHKSUM+1 + BNE ERRSUM + JSR CROUT + LDA #$CF PRINT 'OK' + JSR COUT + LDA #$CB + JSR COUT + JMP CROUT +ERRSUM JMP PRERR +DOSUM LDA STARTLOC + STA A1L + LDA STARTLOC+1 + STA A1H + LDA ENDLOC + STA A2L + LDA ENDLOC+1 + STA A2H + LDX #0 + STX A3L + STX A3H +GETBYT CLC + LDA (A1L,X) + ADC A3L + STA A3L + LDA #0 + ADC A3H + STA A3H + JSR NXTA1 + BCC GETBYT + RTS +INITSUM JSR DOSUM CHKSUM OF START-ENDMAIN + LDA A3L + STA CHKSUM + LDA A3H +CSUMLOC STA CHKSUM+1 + RTS + SKP 1 +*** PROGRAM DATA AREA *** + SKP 1 +TITLE DFB $8D + ASC "ANALYST 5.2" + DFB $8D TITLE MARKS START OF PDA + ASC "ORG = $" + DFB $00 +FMT2 DFB 0,33,129,130,90,73,89,77 + DFB 145,146,134,74,133,157 +MNEML DFB 28,138 + DFB 28,35,93,139,27,161,157,138 + DFB 29,35,157,139,29,161,28,41 + DFB 25,174,105,168,25,35,36,83 + DFB 27,35,36,83,25,161,173,26 + DFB 165,91,165,172,139,138,174,174 + DFB 168,173,41,138,124,139,21,156 + DFB 109,156,165,105,41,83,132,19 + DFB 52,17,165,105,35,160 +MNEMR DFB 216,98 + DFB 90,72,38,98,148,136,84,68 + DFB 200,84,104,68,232,148,196,180 + DFB 8,132,116,180,40,110,116,244 + DFB 204,74,114,242,164,138,6,170 + DFB 118,162,116,198,116,116,68,104 + DFB 178,50,178,114,34,114,26,26 + DFB 38,38,114,114,136,200,196,202 + DFB 38,72,68,68,162,200 +FMT1 DFB 240,34,0,51,93,130,0,147 + DFB 243,34,0,51,93,136,0,153 + DFB 240,47,0,51,93,143,0,159 + DFB 240,34,0,59,93,136,0,148 + DFB 253,34,0,51,93,200,0,147 + DFB 17,34,0,51,93,200,0,169 + DFB 241,34,0,51,93,143,0,159 + DFB 241,34,0,51,93,143,0,159 + DFB 38,49,135,154 +OPC65C DFB 18,50,82,114 + DFB 146,178,210,242,58,26,137,28 + DFB 20,122,90,156,100,158,116,124 + DFB 60,52 + DFB 76,164,172,180,188,196,204,228 + DFB 236 +REPL65C DFB 17,49,81,113,145,177 + DFB 209,241,194,226,52,164,172,196 + DFB 228,92,92,92,92,124,60,52 + DFB 124,160,160,160,160,192,192 + DFB 224,224 +CHAR1 DFB 172,169,172,163,168,164 +CHAR2 DFB 217,0,216,164,164,0 +CHAR3 ASC "CZIDB-VN" +RTBL ASC "AXYP" +CHRTBL DFB 152,249,3,190,236 + DFB 166,164,6,149,5,187 + DFB 0,147,2,167,198,153 + DFB 186,154,239,233,1,191 + DFB 237,158,235,197 +SUBTBL DW PRTITLE-1 F(?) DO CHCKSUM OF MAIN + DW SETVID-1 F(@) SWITCH SCREENS + DW EXECJSR-1 F(J) EXECUTE JSR + DW REGDSP-1 F(CTRL-E) DISPLAY REGS + DW STEP-1 F(S) STEP + DW SETMODE-1 F(-) 16 BIT SUBTRACTION + DW SETMODE-1 F(+) 16 BIT ADDITION + DW MOVE-1 F(M) MOVE + DW LT-1 F(<) COPY A2 TO A4 & A5 + DW LIST-1 F(L) LIST 22 LINES + DW BASIC-1 F(CTRL-B) DOSWARM VECT. + DW GO-1 F(G) GO + DW SETMODE-1 F(:) STORE + DW SETREG-1 F(I) SET INTERNAL PC/REG + DW SETMODE-1 F(.) XAM + DW CRMON-1 F(CR) HANDLE CR + DW BLANK-1 F( ) HANDLE SPACES + DW ASC-1 F(CTRL-A) DUMP IN ASCII + DW MINI-1 F(!) MINI-ASSEMBLER + DW VFY-1 F(V) VERIFY + DW SETPRNT-1 F(P) TO PRINTER + DW LOAD-1 F(H) LOAD FOR HSF + DW FIND-1 F(CTRL-F) HEX SEQ. FIND + DW TRACE-1 F(T) TRACE OR SET TLIMIT + DW BINARY-1 F(%) VALUE IN BINARY + DW RELOC-1 F(R) RELOCATOR + DW CRMON-1 HANDLE CTRL-L AS CR +HOOK40 DW COUT40 + DW KEYIN +HOOK80 DW COUT80 + DW KEYIN80 +IRQLOC DW IBREAK +BRKLOC DW BREAK +STARTLOC DW START +ENDLOC DW ENDMAIN +ERRMSG DFB $8D MARKS END OF WORDS + ASC 'RRE' + DFB $8D +ENDMAIN DFB $00 = END OF STATIC PGM AREA diff --git a/ANALYST 64.TXT b/ANALYST 64.TXT new file mode 100644 index 0000000..4cce51d --- /dev/null +++ b/ANALYST 64.TXT @@ -0,0 +1,1994 @@ + LST OFF + SBTL + MSB ON + ORG $6000 + SKP 1 +********************************* +* * +* -< THE ANALYST >- * +* * +* 64K VERSION * +* * +* 5/09/91 * +* * +********************************* + SKP 1 +*** DESCRIPTION *** + SKP 1 +; THIS PROGRAM OPERATES INDEPENDENT OF ROM BUT HAS COM- +; MANDS SIMILAR TO THE BUILT IN MONITOR. THE TRACE AND +; STEP FUNCTIONS HAVE BEEN GREATLY ENHANCED TO DISPLAY +; STATUS REGISTER FLAGS AND SET A BREAK POINT. THE MINI +; ASSEMBLER HAS BEEN INCLUDED AS WELL AS A HEX SEQUENCE +; FINDER. 65C02 OPCODES ARE ALSO SUPPORTED. ZERO PAGE +; REFS ARE STORED IN A BUFFER WHICH AVOIDS CONFLICT WITH +; THE PROGRAM BEING TRACED. THIS PROGRAM USES THE BOTTOM +; 1/2 OF THE STACK ($100-180). + SKP 1 +*** COMMANDS *** + SKP 1 +; CTRL-F FIND SPECIFIED HEX SEQUENCE DEFINED BY F(H) +; G GO EXECUTE IN IMMEDIATE MODE +; H LOAD BYTES FOR HSF F(CTRL-F) BY USING H: +; I DISPLAY/SET PC/INTERNAL A,X,Y,P,S REGISTERS +; J JUMP. EXECUTE JSR INSTRUCTION IN STEP MODE +; CTRL-L CLEAR PRESENT SCREEN AND HOME CURSOR +; L LIST DISASSEMBLY OR LOOP IN TRACE MODE. +; M MOVE BLOCK OF MEMORY +; P SEND OUTPUT TO PRINTER +; R RELOCATE ANALYST TO NEW ADDRESS PAGE +; S ENTER STEP MODE. STEP INSTRUCTION +; T TRACE PROGRAM +; V VERIFY TWO BLOCKS OF MEMORY +; X SKIP NEXT INSTRUCTION IN STEP MODE +; " DUMP MEMORY IN ASCII +; / SET OR PRINT SUBROUTINE TO JSR IMMED MODE +; % PRINT ADDRESS DATA VALUE IN BINARY +; ? PRINT ORIGIN ADDRESS & DO INTERNAL CHECKSUM +; @ SET TEXT 40/80 COL SCREEN +; < RANGE DELIMITER +; . RANGE DELIMITER +; + 16 BIT ADDITION +; - 16 BIT SUBTRACTION +; : STORE VALUE IN MEMORY +; ! ENTER MINI-ASSEMBLER. ALONE TO EXIT + SKP 1 +*** OPERATING NOTES *** + SKP 1 +; INPUT LINE LIMITED TO 38 CHARACTERS. BEEPS ON LAST 4. + SKP 1 +; HOME (CTRL-L) ACTS IMMEDIATELY. FOLLOW WITH . + SKP 1 +; FOR STEP TYPE 300S THEN S, OPEN-APPLE, SPACE, OR +; J TO STEP EACH INSTRUCTION. S OR OPEN-APPLE TO STEP +; INTO JSR. J TO EXECUTE SUBROUTINE. X TO SKIP INSTRUC- +; TION. T TO ENTER TRACE. @ FOR TEXT. L FOR LOOP. +; CTRL-C TO EXIT. LOOP COMMAND SETS BREAKPOINT AFTER +; INSTRUCTION TO BE EXECUTED NEXT AND ENTERS TRACE. CAN +; BE USED ON BRANCH WHICH LOOPS BACK TO TRACE OUT OF +; LOOP. @ WILL EXECUTE NEXT INSTRUCTION. PC SAVED ON +; EXIT AND CAN BE RESTORED BY CTRL-E EXAMINE REGISTERS. + SKP 1 +; FOR TRACE TYPE 2000T OR T . BREAKPOINT IS OPTIONAL +; AND DESIGNATED BY NNNN<2000T. SAME FOR STEP MODE. +; PC PRINTED AT TOP RIGHT EVERY 256 LINES. OPEN APPLE +; ENTERS SLOW TRACE WITH PC PRINTED EACH LINE. CLOSED +; APPLE EXITS TO STEP MODE. TRACE WILL EXECUTE SUB- +; ROUTINE SPECIFIED BY NNNN/ IN IMMEDIATE MODE TO ENABLE +; TRACING ACROSS DOS CALLS. USE FFFF/ TO TRACE ALL. '/' +; ALONE PRINTS VALUE. ROM $C000-FFFF WILL JSR IMMEDIATE +; MODE EXCEPT SETTING ORG+$FFF <> 0 ( NFFF:NN ) WILL EN- +; ABLE TRACING THRU JSR ROM $D000-FFFF BECAUSE CERTAIN +; ROM ROUTINES WHICH INVOLVE SETTING I/O AND DOS HOOKS +; DON'T RTS TO ANALYST. TRACE ACTIVITY DENOTED BY FLASH- +; ING $ OR # FOR JSR IMMEDIATE MODE. BREAKPOINT ENTERS +; STEP MODE AND DOES EXECUTE BREAKPOINT INSTRUCTION. + SKP 1 +; FOR JUMP TYPE 'J5' WHERE 5 REPRESENTS # OF PARM BYTES +; FOLLOWING JSR INSTRUCTION. J DEFAULTS TO 0. JUMP +; DURING STEP & TRACE IMMEDIATE HANDLE JSR $BF00 AS +; PRODOS MLI CALL WITH 3 PARM BYTES FOLLOWING. MUST USE +; 'J3' FROM COMMAND LINE. IF SUBROUTINE BEING 'JUMPED' +; CONTAINS A TXS INSTRUCTION, ANALYST MAY LOSE CONTROL! +; ALSO TRACE IMMEDIATE WILL NOT HANDLE A SUBROUTINE +; OTHER THAN $BF00 WITH PARM BYTES FOLLOWING! F(J) USES +; STACK IN ANALYST AREA. COULD EXEC J5 BY NNNN+8. +; TO CHANGE PC AND/OR INTERNAL REGS TYPE 300I:AA XX +; YY PP SS RR . PC ENTRY BEFORE I OPTIONAL. RR = +; STACK TOP REFERENCE SET BY A TXS INSTRUCTION. + SKP 1 +; FOR HEX SEQUENCE FINDER TYPE H:N1 N2 N3... THEN +; 1000<2000 CTRL-F . 8 BYTES MAX BECAUSE IN DS 29. + SKP 1 +; TO DUMP MEMORY IN ASCII USE 1000.2000" . + SKP 1 +; TO PRINT ADDRESS BYTE IN BINARY TYPE 2000% . + SKP 1 +; TO SWITCH SCREENS TYPE @8,@4 OR @ FOR TEXT. + SKP 1 +; TO RELOCATE TYPE NN00R . WILL ROUND OFF TO NEAREST +; PAGE BOUNDARY. DO NOT SET < $800! DO NOT MOVE < +- 4K +; FROM OLD ORIGIN! IF MOVED TO RAM CARD DO NOT CHANGE +; CARD R/W STATE! + SKP 1 +; RESET VECTOR $3F2 CAN BE SET MANUALLY TO ORIGIN ADDR. + SKP 1 +; DO NOT USE THE PRINTER WHEN THE ANALYST IS LOCATED +; ON THE RAM CARD. THE PRINTER WILL NOT INITIALIZE. +; ALSO RESET WILL NOT RETURN TO THE ANALYST LOCATED +; ON THE RAM CARD. + SKP 1 +; BY INSERTING JSR ORG+$0B A WARMSTART RE-ENTRY CAN +; BE USED TO JMP INTO ANALYST FROM A RUNNING PROGRAM +; WITH ALL REGS PRESERVED. + SKP 1 +; TO STEP AND TRACE AUX MEMORY, ANALYST SHOULD BE IN +; 80 COLUMN MODE. + SKP 1 +; TO USE DOS TYPE 3F5<3D0G, THEN USE & TO RE-ENTER. +; TO USE BASIC W/PRODOS TYPE $F1:00 AND $1FC:01 01. + SKP 1 +*** ROM ZERO PAGE EQUATES *** + SKP 1 +WNDWDTH EQU $21 +MCH EQU $24 +MBASL EQU $28 +MCSWL EQU $36 +MCSWH EQU $37 +MKSWL EQU $38 +MKSWH EQU $39 + SKP 1 +*** ANALYST EQUATES *** + SKP 1 +STKLMT EQU $80 TOP OF STACK (IMMEDIATE) +PCL EQU $EF LABEL MARKS PAGE 0 +PCH EQU $F0 +BASL EQU $F1 +BASH EQU $F2 LABEL USED AS IDENTIFIER +ZFLG EQU $F3 1 BYTE ID = $AA +A1L EQU $F4 A1L-A5H MUST BE IN ORDER +A1H EQU $F5 FOR MINI-ASSEMBLER +A2L EQU $F6 +A2H EQU $F7 +A3L EQU $F8 +A3H EQU $F9 +A4L EQU $FA +A4H EQU $FB +A5L EQU $FC +A5H EQU $FD +BAS2L EQU $FE +BAS2H EQU $FF LABEL MARKS END OF PAGE 0 +STACK EQU $0100 +MLI EQU $BF00 PRODOS INTERFACE + SKP 1 +*** ROM EQUATES *** + SKP 1 +KBD EQU $C000 +CLR80ROM EQU $C00A +CLR80VID EQU $C00C +KBDSTRB EQU $C010 +SPKR EQU $C030 +TXTSET EQU $C051 +LOWSCR EQU $C054 +PB0 EQU $C061 OPEN APPLE KEY +PB1 EQU $C062 CLOSED APPLE KEY +SWITCH2 EQU $C082 +PRINIT EQU $C100 PRINTER IN SLOT 1 +PR3 EQU $C300 +IDROM EQU $E000 = $4C IF ROM PRESENT +MKEYIN EQU $FD1B +MVIDOUT EQU $FDF0 + SKP 3 +GETSUM JSR INITSUM CREATE CHECKSUM OF MAIN + LDA #$2C WHEN FIRST BRUN +SUMLOC STA GETSUM DISABLE CHECKSUM + SKP 1 +*** STATIC MAIN PROGRAM AREA *** + SKP 1 +START JMP RESET COLD START +WARMV JMP REENTER WARM START (BY JSR WARMV) +INSDS1 LDX PCL + LDY PCH + JSR PRYX2 + JSR OUTSP + LDX #0 +INSDST LDA (PCL,X) +INSDS2 LDY #$FF DETERMINE LENGTH OF + STY LMNEM INSTRUCTION. OPCODE IN + TAY ACC. STORED IN LENGTH. + LSR A INVALID = 0 + BCC IEVEN 1 BYTE = 0 + ROR A 2 BYTE = 1 + BCS ERR 3 BYTE = 2 + AND #$87 +IEVEN LSR A + TAX + LDA FMT1,X + BCC RTMSKZ + LSR A + LSR A + LSR A + LSR A +RTMSKZ AND #$0F + CMP #$0F + BNE GETFMT +ERR LDY #$FF BAD OPCODE + STY ERRFLG + INY + STY LMNEM + STY RMNEM + STY FORMAT + STY LENGTH +RTS1 RTS +GETFMT TAX + LDA FMT2,X + STA FORMAT + AND #$03 + STA LENGTH + LDA TFLG BYPASS PRINT FORMATTING + BNE RTS1 IN TRACE + TYA + AND #$8F + STA FMTSAV TEMP STORAGE + TYA + LDX #31 +GETFMT2 DEX + BMI MNNDX + CMP OPC65C,X MAKE SUBSTITUTION IF + BNE GETFMT2 65C02 OPCODE. + LDA REPL65C,X +MNNDX LDX FMTSAV + LDY #$03 + CPX #$8A + BEQ MNNDX3 +MNNDX1 LSR A + BCC MNNDX3 + LSR A +MNNDX2 LSR A + ORA #$20 + DEY + BNE MNNDX2 + INY +MNNDX3 DEY + BNE MNNDX1 + RTS +INSTDSP JSR INSDS1 + PHA +PRNTOP LDA (PCL),Y + JSR PRBYTE + LDX #$01 +PRNTBL JSR PRBLNK + CPY LENGTH + INY + BCC PRNTOP + LDX #$03 + CPY #$03 + BCC PRNTBL + PLA + TAY + LDA LMNEM + BEQ PRMN1 + LDA MNEML,Y + STA LMNEM + LDA MNEMR,Y + STA RMNEM +PRMN1 LDA #$00 + LDY #$05 +PRMN2 ASL RMNEM + ROL LMNEM + ROL A + DEY + BNE PRMN2 + ADC #$BF + JSR COUT + DEX + BNE PRMN1 + JSR OUTSP + LDY LENGTH + LDX #$05 +PRADR1 CPX #$02 + BEQ PRADR5 +PRADR2 ASL FORMAT + BCC PRADR3 + LDA CHAR1,X + JSR COUT + LDA CHAR2,X + BEQ PRADR3 + JSR COUT +PRADR3 DEX + BPL PRADR1 + RTS +PRADR4 DEY + BMI PRADR2 + JSR PRBYTE +PRADR5 LDA FORMAT + CMP #$E8 + LDA (PCL),Y + BCC PRADR4 + JSR PCADJA + TAX + INX + BNE PRNTYX + INY +PRNTYX TYA +PRNTAX JSR PRBYTE + TXA + JMP PRBYTE +PRBLNK JSR OUTSP PRINT X SPACES + DEX + BNE PRBLNK + RTS +PCADJ SEC UPDATE PC BY LENGTH+1 +PCADJLP LDA LENGTH UPDATE PC BY LENGTH +PCADJAP JSR PCADJA UPDATE PC BY ACC + STA PCL + STY PCH + RTS +PCADJL LDA LENGTH SET Y,A = PC+LENGTH +PCADJA LDY PCH SET Y,A = PC+ACC + TAX + BPL PCADJ2 + DEY +PCADJ2 ADC PCL + BCC RTS2 + INY +RTS2 RTS +STEP DEC YSAV F(S) + PLA REMOVE RTS TO NEXTITM + PLA +STEPL TXA + BEQ STEPZ + JSR SETBREAK FIRST TIME + LDX #1 + BNE SSTEP ALWAYS TAKEN +STEPZ JSR KYWAIT CTRL-C = BREAK + CPY #$CA + BNE STEP2 + LDA JFLG J = SINGLE STEP + BEQ SSTEP IF NO JSR, ELSE + JMP TRCPCS EXECUTE SUBROUTINE +STEP2 CPY #$CC L = LOOP. SET BREAK + BNE STEP2A POINT AFTER INSTRUCTION + JSR PCADJL TO BE EXECUTED NEXT + STA BRKADDR AND ENTER TRACE. + STY BRKADDR+1 + JMP STEPT +STEP2A LDA JFLG SPC = SINGLE STEP IF + BNE STEP3 NOT JSR, ELSE IGNORE + CPY #$A0 + BEQ SSTEP +STEP3 CPY #$D3 S OR OPEN APPLE = + BEQ SSTEP SINGLE STEP ALWAYS + TYA + BEQ SSTEPW = 0 FOR OPEN APPLE. + CPY #$D4 T = ENTER TRACE MODE + BNE STEP4 +STEPT STY TFLG SET TRACE MODE FLAG + JMP TRACE4 AND ENTER TRACE. +STEP4 CPY #$D8 X = SKIP NEXT INSTRUCTION + BNE STEP5 + LDA #0 ENABLE SPC IF SKP WHILE + STA JFLG JSR DISPLAYED ACTIVE. + STA ERRFLG CLR IN CASE SKIP ERROR. + JSR PCADJ + JMP JRTSX +STEP5 CPY #$C0 @ = TEXT MODE + BNE STEPL LOOP BACK FOR INPUT + JSR TEXT +SSTEPW LDA #$FF PAUSE TO RELEASE O/A KEY + JSR WAIT +SSTEP JSR A1PC +SSTEPT JSR CLEARDSP TRACE RE-ENTRY TO STEP + JSR INSTDSP + LDX #3 + JSR PRBLNK + LDA (PCL,X) X=0 + AND #$0F + CMP #$01 SEE IF ZERO PAGE IND + BNE SSTEPZ + LDA #$A8 '(' + JSR COUT PRINT ABSOLUTE VALUE + LDA (PCL,X) IN PARENTHESIS + AND #$10 + BNE INDY TAKEN FOR (NN),Y. + LDX XREG FOR (NN,X). +INDY TXA X=0 FOR (NN),Y + LDY #1 + CLC + ADC (PCL),Y + PHA + JSR ZSWAP GET PROGRAM PAGE 0 AND + PLA SAVE POINTER ADDRESS ON + TAX STACK. + LDA $01,X + PHA + LDA $00,X + PHA + JSR ZSWAP RESTORE ANALYST PAGE 0 + PLA AND RECOVER POINTER ADDR. + TAX + PLA + JSR PRNTAX + LDA #$A9 ')' + JSR COUT +SSTEPZ JMP TSTEP +PRNTPC LDA #$FF PRINT PC AT TOP OF SCREEN + STA CV BY FORCING CROUT TO INC + JSR CROUT CV TO 0 (NEED FOR 80 COL) + LDA #29 + STA CH + LDA PROMPT + JSR COUT + LDA PCH + LDX PCL + JMP PRNTAX +TRACEPC INC COUNTER PRINT PC + BNE TRCPC2 EVERY 256 INSTRUCTIONS + LDA PROMPT FLASHING '$' FOR TRACE + EOR #$04 ACTIVITY. $A4->$A0->$A4 + STA PROMPT + JSR PRNTPC +TRCPC2 LDA JFLG + BEQ TRACE5 + LDA PCH + CMP #$C0 + BCC TRCPCD + CMP #$D0 JSR $C000-CFFF ALWAYS + BCS TRCPCR IMMED MODE IF ANALYST + LDY FLG8 IN 80 COL DISPLAY MODE. + BMI TRCPCI +TRCPCR LDY ROMFLG + BNE TRCPCD + LDY IDROM JSR ROM $D000-FFFF IN + CPY #$4C IMMEDIATE MODE UNLESS + BEQ TRCPCI ROM FLAG SET <> 0. +TRCPCD CMP DOSCALL+1 TRACE THRU JSR UNLESS = + BNE TRACE5 DOS SUBROUTINE SPECIFIED + LDA PCL BY F(/). + CMP DOSCALL + BNE TRACE5 +TRCPCI JSR STPRMPT '#' DENOTES JSR IMMED. + JSR PRNTPC PRINT EXEC SUBROUTINE + INC PROMPT '#' -> '$' + LDA #$FF FORCE PC PRINTING + STA COUNTER AFTER JSR IMMED. +TRCPCS LDA PCL SEE IF PC = $BF00 + BNE TRCPCG + LDA PCH + CMP # '$' 1ST TIME ONLY + JSR CLEARDSP +TRACE5 LDX #1 IF PC = A4 THEN ENTER STEP +TRACE6 LDA PCL,X + CMP BRKADDR,X + BNE TRACE7 + DEX + BPL TRACE6 + JSR SETBREAK CLEAR OLD BREAKPOINT + INX + BEQ TRACES ALWAYS TAKEN +TRACE7 LDX #0 FOR INSDST + LDA PB1 BACK TO STEP MODE IF + BPL TRACE8 CLOSED APPLE PRESSED +TRACES STA KBDSTRB + STX TFLG CLEAR TRACE FLAG + STX DSPTOP RESET DISPLAY TO TOP + JSR STPRMPT PROMPT BACK TO OLD '#' + LDY YSAV + LDA #$D3 PUT 'S' INTO INPUT BUFFER + STA IN,Y + JMP SSTEPT RE-ENTER STEP MODE +TRACE8 LDA PB0 SLOW TRACE IF OPEN APPLE + BPL TRACE9 PRESSED + LDA #$FF + STA COUNTER FORCE PC PRINTING + PHA + JSR WAIT + PLA + JSR WAIT +TRACE9 JSR INSDST +TSTEP LDA ERRFLG IF BAD OPCODE THEN BRK + BEQ TSTEP3 +XBRK LDA #0 + STA DSPTOP + STA TFLG + JSR CLEARDSP + JSR INSTDSP + JSR CROUT + JSR RGDSP1 + JMP ERRMON +XTSX LDX SPNT + STX XREG +XTXS LDX XREG + STX SREF +UPDSPNT STX SPNT UPDATE SPNT + CPX #STKLMT+1 STACK OVERFLOW IF + BCC XBRK IN ANALYST WORK AREA + JMP PCINC UPDATE PC +TSTEP3 TAX = 0 + STX JFLG DISALLOW F(J) IF NO JSR + LDA (PCL,X) GET OPCODE (X=0) + BEQ XBRK + LDY LENGTH + CMP #$20 + BEQ XJSR + CMP #$60 + BEQ XRTS + CMP #$BA + BEQ XTSX + CMP #$9A + BEQ XTXS + CMP #$40 + BEQ XBRK BREAK FOR RTI INSTRUCTION + CMP #$7C + BEQ XJMPATX + CMP #$4C + BEQ XJMP + CMP #$6C + BEQ XJMPAT + PHA + CMP #$5A + BCC TSTEP4 + TAX + AND #$1F + CMP #$1A + BEQ STACKOP PHX,PLX,PHY,PLY + TXA +TSTEP4 AND #$9F + CMP #$08 + BNE TSTEP5 +STACKOP JMP STKOPC PHA,PLA,PHP,PLP +TSTEP5 LDX #$08 +XQINIT LDA INITBL-1,X + STA XQT,X + DEX + BNE XQINIT + PLA OPCODE + CMP #$80 + BNE NBRA + ORA #$10 +NBRA AND #$1F + EOR #$14 + CMP #$04 = BRANCH OFFSET + BEQ XQ2 TAKEN IF BRANCH OPCODE +XQ1 LDA (PCL),Y Y = LENGTH +XQ2 STA XQT,Y XQT BCS BRNCH (B0 04) + DEY NOP + BPL XQ1 JMP NBRNCH (CCLR) + JMP XQJ BRNCH JMP BRANCH (CSET) +XRTS LDX SPNT + INX + LDA STACK,X + STA PCL + INX + LDA STACK,X + STA PCH + STX SPNT + DEC DSPTOP + JMP PCINC +XJMPATX INX + BNE XJMPAT +XJSR STA JFLG OK FOR F(J) + INC DSPTOP + CLC + JSR PCADJL SET Y,A = RTS ADDR + PHA + LDX SPNT + TYA + STA STACK,X + DEX + PLA + STA STACK,X + DEX + STX SPNT + LDY #$02 +XJMP CLC +XJMPAT LDA (PCL),Y + PHA + DEY + LDA (PCL),Y + STA PCL + PLA + STA PCH + BCC NEWPC + DEX + BNE XJMP + LDA XREG + CLC + JSR PCADJAP + LDY #1 + BNE XJMP ALWAYS TAKEN +NBRNCH JSR SAVE ALL OTHER OPCODES + BMI UPDPC ALWAYS TAKEN +BRANCH JSR SAVE BRANCH WITH COND. MET + CLC + LDY #$01 + LDA (PCL),Y + JSR PCADJAP +UPDPC SEC +PCINC JSR PCADJLP +NEWPC LDA TFLG + BNE TRACEBY BYPASSES NEXTITM +NXTPC JSR CROUT + JMP REGDSP +TRACEBY JMP TRACEPC +INITBL NOP + NOP + JMP NBRNCH + JMP BRANCH +PULL PHP + INX + LDA STACK,X + TAY + LDA STATUS PULL FROM STACK AFFECTS + PHA N & Z FLAGS + PLP + TYA UPDATE N & Z + PHP + PLA + STA STATUS + TYA + PLP + RTS +STKOPC LDX SPNT STACK OPCODES + PLA OPCODE + TAY + AND #$10 + BEQ APCODE + TYA + ASL A + BCS OPCX + ASL A + ASL A + BCS XPLY + LDA YREG XPHY + BCC PUSH +XPLY JSR PULL + STA YREG + BCS UPDSTACK +OPCX ASL A + ASL A + BCS XPLX + LDA XREG XPHX + BCC PUSH +XPLX JSR PULL + STA XREG + BCS UPDSTACK +APCODE TYA + ASL A + ASL A + BMI PULLAP + BCC XPHP + LDA ACC XPHA + BCS PUSH +XPHP LDA STATUS +PUSH STA STACK,X + DEX + BNE UPDSTACK +PULLAP BCC XPLP + JSR PULL XPLA +ACCLOC STA ACC + BCS UPDSTACK +XPLP JSR PULL + STA STATUS +UPDSTACK JMP UPDSPNT +SETBREAK LDX #1 SET BREAKPOINT TO A4 + LDA BRKADDR+1 IF GIVEN, ELSE $FFFF. + BEQ SETBRK2 BREAKPOINT GIVEN + LDA #$FF +SETBRK1 STA BRKADDR,X CLEAR OLD BREAKPOINT + DEX + BPL SETBRK1 + BMI RTS2A ALWAYS TAKEN +SETBRK2 LDA A4L,X SET BREAKPOINT + STA BRKADDR,X + DEX + BPL SETBRK2 +RTS2A RTS +LOAD LDA XQLOC1+1 F(H) + LDY XQLOC1+2 SETUP A3 = XQT+1 FOR HSF + BNE A3SET BUFFER (XQT=BYTE COUNT) +SETRG1 JSR A1PC + JSR SAVEPC +SETRG2 LDA ACCLOC+1 SETUP REGS FOR F(:) + LDY ACCLOC+2 +A3SET STA A3L + STY A3H + RTS +SETREG TXA F(I) SET OR DISPLAY REGS. + BNE SETRG1 TAKEN IF PC GIVEN. + LDY YSAV + LDA IN,Y + CMP #$8D + BNE SETRG2 + LDA PCREG I DISPLAYS REGS. + STA PCL + LDA PCREG+1 + STA PCH +REGDSP JSR RGDSP1 + JSR INSTDSP DISPLAY INSTRUCTION + JMP NEXTITM TO BE EXECUTED NEXT +RGDSP1 LDX #0 +RDSP1 LDA RTBL,X + JSR COUT + LDA #$BD + JSR COUT + LDA ACC,X + JSR PRBYTE + JSR OUTSP + INX + CPX #3 + BCC RDSP1 + LDX #7 +PRFLG LDA CHAR3,X PRINT 'NV-BDIZC' + JSR COUT + DEX + BPL PRFLG + JSR CROUT + LDA #$C1 PRINT ACC IN BINARY + JSR COUT + JSR OUTEQ + LDA ACC + JSR BNDSP + LDX #3 + JSR PRBLNK + LDA #$D0 PRINT STATUS IN BINARY + JSR COUT + JSR OUTEQ + LDA STATUS + JSR BNDSP + JSR CROUT + LDA #$D3 + JSR COUT + JSR OUTEQ + LDA SPNT + JSR PRBYTE + LDA #$BA + JSR COUT + LDA #$D8 + JSR COUT + JSR COUT + LDY #10 + LDX SPNT +PRNTSTK JSR OUTSP PRINT STACK BYTES FROM + CPX SREF SPNT TO SREF UP TO 10 + BEQ SAVEPC MAX. + INX + LDA STACK,X + JSR PRBYTE + DEY + BNE PRNTSTK +SAVEPC LDA PCL + STA PCREG + LDA PCH + STA PCREG+1 + RTS +BINARY LDY #0 F(%) PRINT VALUE AT + LDA (A1L),Y ADDRESS IN BINARY. +BNDSP LDX #$08 INDEX FOR 8 BITS +NEXTBIT ASL A + PHA + BCS BIT1 + LDA #$30 '0' + DFB $2C SKIP NEXT INSTRUCTION +BIT1 LDA #$31 '1' + JSR COUT + PLA + DEX + BNE NEXTBIT + RTS +BASCALC PHA + LSR A + AND #$03 + ORA #$04 + STA BASH + PLA + AND #$18 + BCC BSCLC2 + ADC #$7F +BSCLC2 STA BASL + ASL A + ASL A + ORA BASL + STA BASL + RTS +BELL LDY #$38 DURATION +BELL2 LDA #$2B FREQUENCY + JSR WAIT + LDA SPKR + DEY + BNE BELL2 + RTS +VIDOUT CMP #$A0 + BCC NOADV INVERSE, CTRL, OR FLASH +STOADV LDY CH + STA (BASL),Y + INC CH + LDA CH + CMP #$28 + BCS CR +RTS3 RTS +NOADV TAY + BPL STOADV INVERSE OR FLASH + CMP #$8D + BEQ CR + CMP #$88 + BNE RTS3 DON'T PRINT CTRL CHARS. + DEC CH BACKSPACE + BPL RTS3 + LDA #$28 + STA CH + DEC CH +UP LDA #$00 + CMP CV + BCS RTS4 + DEC CV +VTAB LDA CV +VTABZ JSR BASCALC + ADC #$00 + STA BASL +RTS4 RTS +HOME40 LDA #$00 + STA CV + LDY #$00 + STY CH +CLEOP1 PHA + JSR VTABZ + JSR CLEOLZ + LDY #$00 + PLA + ADC #$00 + CMP #$18 + BCC CLEOP1 + BCS VTAB +CR LDA #$00 + STA CH + INC CV + LDA CV + CMP #$18 + BCC VTABZ + DEC CV + LDA #$00 + PHA + JSR VTABZ +SCRL1 LDA BASL BASL = CURRENT + STA BAS2L BAS2L = OLD + LDA BASH + STA BAS2H + LDY #$28 + DEY + PLA + ADC #$01 + CMP #$18 + BCS SCRL3 + PHA + JSR VTABZ +SCRL2 LDA (BASL),Y + STA (BAS2L),Y + DEY + BPL SCRL2 + BMI SCRL1 +SCRL3 LDY #$00 + JSR CLEOLZ + BCS VTAB ALWAYS TAKEN +CLREOL LDY CH +CLEOLZ LDA #$A0 +CLEOL2 PHA + LDA FLG8 + BMI CLEOL3 + PLA + STA (BASL),Y + INY + BNE CLEOL4 ALWAYS TAKEN +CLEOL3 PLA + JSR COUT + LDY CH +CLEOL4 CPY #$28 + BCC CLEOL2 + RTS +CLEARDSP LDX #6 CLEAR DISPLAY WINDOW +CLRDSP1 LDA DSPTOP + BPL CLRDSP2 HOLD TOP OF DISPLAY + LDA #0 0 <= TOP <= 18. +CLRDSP2 CMP #18 + BCC CLRDSP3 + LDA #18 +CLRDSP3 STA DSPTOP + STA CV CLEAR 6 LINE DISPLAY + DEC CV FROM DSPTOP DOWN AND + TXA SET CV SO INSTDSP WILL + BEQ RTS4A PRINT AT DSPTOP UPON +CLRDSP4 JSR CROUT EXIT. + JSR CLREOL + DEX + BNE CLRDSP4 + BEQ CLRDSP1 +RTS4A RTS +LWAIT LDA #$70 LIST SCROLL RATE +WAIT SEC +WAIT2 PHA +WAIT3 SBC #$01 + BNE WAIT3 + PLA + SBC #$01 + BNE WAIT2 + RTS +NXTA4 INC A4L INCREMENT A4 + BNE NXTA1 + INC A4H +NXTA1 LDA A1L + CMP A2L + LDA A1H + SBC A2H + INC A1L + BNE RTS4B + INC A1H +RTS4B RTS CARRY SET IF A1 >= A2 +CTRLC LDY KBD CTRL-C = BREAK TO MONITOR + BPL RTS4B + STY KBDSTRB + CPY #$93 CTRL-S = PAUSE + BNE CTLC +KYWAIT LDY PB0 F(S) ENTRY POINT + BMI KYWT2 + LDY KBD + BPL KYWAIT + STY KBDSTRB + DFB $2C +KYWT2 LDY #0 0 = OPEN APPLE PRESSED +CTLC CPY #$83 + BNE RTS4B + JMP MONZ +RDKEY JMP (KSWL) +KEYIN LDY CH + LDA (BASL),Y + PHA + AND #$3F INVERSE CURSOR + STA (BASL),Y + PLA + BIT KBD + BPL KEYIN + ORA #$80 + STA (BASL),Y + LDA KBD + BIT KBDSTRB + RTS +NOTCR LDA IN,X + JSR COUT + CMP #$88 + BEQ BCKSPC + CPX #34 BEEP ON LAST 4 CHAR. + BCC NOTCR1 + JSR BELL +NOTCR1 INX + CPX #38 38 CHARACTERS ALLOWED + BCC NXTCHAR + LDA #$DC + JSR COUT +GETLNZ JSR CROUT + LDA PROMPT + JSR COUT + LDX #$01 +BCKSPC TXA + BEQ GETLNZ + DEX +NXTCHAR JSR RDKEY + CMP #$95 + BEQ NXTCHAR IGNORE '->' + CMP #$FF + BNE NOTDEL + LDA #$88 DELETE KEY = BACKSPACE +NOTDEL CMP #$88 + BNE CAPTST + PHA + JSR COUT BACKSPACE + JSR OUTSP DELETE CHARACTER + PLA BACKSPACE +CAPTST CMP #$E0 + BCC ADDINP + AND #$DF +ADDINP STA IN,X + CMP #$8D + BNE NOTCR +CROUT LDA #$8D + BNE COUT +HOME LDA #$8C + BNE COUT +OUTSP LDA #$A0 + BNE COUT +PRA1 LDY A1H + LDX A1L +PRYX2 JSR CROUT + JSR PRNTYX + LDY #$00 + LDA #$AD + JMP COUT +MOD8CHK LDA A1L + AND #$07 + BNE DATAOUT +XAM JSR PRA1 F(.) A1.A2 +DATAOUT JSR OUTSP + LDA A1H SEE IF ZERO PAGE + BNE XAM2 + LDA A1L + SEC + SBC #PCL + BCC XAM2 TAKEN IF A1L < PCL + TAX OTHERWISE GET FROM ZBUF + LDA ZBUF,X + DFB $2C SKIP NEXT INSTRUCTION +XAM2 LDA (A1L),Y + JSR PRBYTE + JSR NXTA1 + BCC MOD8CHK CARRY CLEAR IF A1PRINIT SIMULATE PR#1 + LDA # ZFLG:AA + STA ZFLG +RST2 JSR TEXT PRIMARY TEXT MODE + LDA #$00 + STA TFLG + STA JFLG + STA ROMFLG NOTRACE JSR ROM $D000-FFFF + JSR PRTITLE + JMP MONZ +ERRMON LDA ERRFLG IF ERROR, 'ERR' ON BRK + BEQ MON +PRERR LDX #4 PRINT 'ERR' +ERROUT LDA ERRMSG,X + JSR COUT + DEX + BPL ERROUT +MON CLD + JSR BELL +MONZ LDX #STKLMT SET STACK UPPER LIMIT + TXS + DEC BRKADDR+1 INSURE BRKPOINT CLEARED + JSR ZSWAPE MAKE SURE ANALYST 0 PAGE. + JSR CHKVID MATCH HOOKS W/DISPLAY MODE + JSR STPRMPT + JSR GETLNZ + JSR ZMODE + STY ERRFLG CLEAR ERROR FLAG (Y=0) + STY DSPTOP DISPLAY AT TOP +NXTITM JSR GETNUM HANDLE HEX DIGS TO 1ST + STY YSAV NON-HEX CHAR+1 (Y=INDX) + LDY #SUBTBL-CHRTBL +CHRSRCH DEY ACC = F(ACC) + BMI PRERR + CMP CHRTBL,Y + BNE CHRSRCH + JSR TOSUB +NEXTITM LDY YSAV + JMP NXTITM +DIG LDX #$03 HEX DIGIT NOW IN ACC LO + ASL A NIBBLE. KEYS 0-9=00-09 + ASL A KEYS A-F=FA-FF. MOVE + ASL A LO NIBBLE TO HI NIBBLE + ASL A +NXTBIT ASL A 4 BIT HEX DIG. INTO A2L + ROL A2L A2L TO A2H + ROL A2H + DEX + BPL NXTBIT +NXTBAS LDA MODE + BNE NXTBS2 IF MODE=0 COPY + LDA A2H,X A2 TO A1 & A3 + STA A1H,X + STA A3H,X +NXTBS2 INX + BEQ NXTBAS + BNE NXTCHR +GETNUM LDX #0 + LDA ZFLG SET A2 = 0 ONLY IF + CMP #$AA NOT IN DEFERRED STEP + BNE NXTCHR MODE. + STX A2L + STX A2H +NXTCHR LDA IN,Y F(ACC) = ACC EOR $B0 + INY ADC $88 (CARRY SET) + EOR #$B0 KEYS 0-9=$00-09 + CMP #$0A + BCC DIG TAKEN IF KEYS 0-9 + ADC #$88 KEYS A-F=$FA-FF + CMP #$FA + BCS DIG TAKEN IF KEYS A-F + RTS +TOSUB TYA # OF FUNCTION (START=0) + ASL A MULT BY 2 + TAY + LDA SUBTBL+1,Y + PHA + LDA SUBTBL,Y + PHA + LDA MODE OLD MODE FOR F(CR)&F( ) +ZMODE LDY #$00 + STY MODE + RTS RTS TO SUBROUTINE +EXECJSR LDA JFLG F(J) + BNE GOJSR +ERRJ JMP PRERR F(J) ATTEMPTED W/O JSR! +GOJSR LDY YSAV GET # OF PARM BYTES + JSR GETNUM + DEY + STY YSAV + LDA A2H + BNE ERRJ + LDA A2L + CMP #10 + BCS ERRJ ONLY 9 PARM BYTES MAX + TAY SAVE BYTE COUNT +GOPC LDX #14 +XQINIT2 LDA INITBL2,X FILL DUMMY BLOCK + STA XQT,X + DEX + BPL XQINIT2 + LDA PCL MOVE JSR ADDR TO XQT +XQLOC1 STA XQT+1 + LDA PCH + STA XQT+2 + LDX SPNT SET PC = PARM LIST - 1 + INX + LDA STACK,X + STA PCL + INX + LDA STACK,X + STA PCH + STX SPNT + TYA GET PARM BYTES + TAX + BEQ MVPRM1 NO PARM BYTES TO MOVE +MOVPARM LDA (PCL),Y MOVE PARM LIST TO DUMMY + STA XQT+2,Y + DEY + BNE MOVPARM +MVPRM1 INX + TXA ADJ PC TO POINT TO INST + CLC FOLLOWING PARM LIST + JSR PCADJAP + JMP XQJ EXECUTE JSR IMMED. MODE +INITBL2 JSR $0000 DUMMY BLOCK FOR F(J) + NOP 9 NOP'S FOR PARM BYTES + NOP + NOP + NOP + NOP + NOP + NOP + NOP + NOP + JMP JRTS +JRTS JSR SAVE + JSR CHKVID + LDA JFLG + BEQ JRTS3 DURING 'G0' W/O BREAK + LDA #0 + STA JFLG + LDA TFLG + BEQ JRTS2 DURING 'STEP' + JMP TRACE5 DURING TRACE IMMEDIATE +JRTS2 DEC DSPTOP UPDATE REGDSP AFTER JSR. +JRTSX JSR CLEARDSP 'SKIP' ENTERS HERE + JMP NXTPC +JRTS3 JMP NEXTITM + SKP 1 +*** THE MINI-ASSEMBLER *** + SKP 1 +RELADR SBC #$81 + LSR A + BNE PCERR + LDY A2H + LDX A2L + BNE RELADJ + DEY +RELADJ DEX + TXA + CLC + SBC PCL + STA A2L + BPL RELADJ2 + INY +RELADJ2 TYA + SBC PCH +PCERR BNE ERRAT +POKEAT LDY LENGTH +POKE LDX A1H,Y + TXA + STA (PCL),Y + DEY + BPL POKE + JSR UP + JSR UP + JSR INSTDSP + JSR CLREOL + JSR PCADJ + JMP MINI +DSS LDA A1H + JSR INSDS2 + TAX + LDA MNEMR,X + CMP A4L + BNE NXOPC + LDA MNEML,X + CMP A4H + BNE NXOPC + LDA A5L + LDY FORMAT + CPY #$9D + BEQ RELADR + CMP FORMAT + BEQ POKEAT +NXOPC DEC A1H + BNE DSS + INC A5L + DEC YSAV1 + BEQ DSS +ERRAT LDY YSAV +ERROR TYA + TAX + JSR PRBLNK + LDA #$DE + JSR COUT + JSR BELL +MINI LDA #$A1 + STA PROMPT + JSR GETLNZ + JSR ZMODE + LDA IN + CMP #$A0 + BEQ RDMNEM + TXA + BNE MINI2 + STA YSAV ALONE EXITS + JMP STPRMPT VIA NEXTITM +MINI2 JSR GETNUM + CMP #$93 F(:) +A1TOPC BNE ERROR + TXA + BEQ ERROR + JSR A1PCLP +RDMNEM LDA #$03 INDEX FOR 3 CHAR MNEM + STA A1H +RDMNEM2 JSR CHARIN + ASL A + SBC #$BE + CMP #$C2 LESS THAN 'A' + BCC ERROR NOT ASC LETTER SO ERR + ASL A + ASL A + LDX #$04 INDEX FOR 5 BITS +RDMNEM3 ASL A MOVE 5 BIT LETTER CODE + ROL A4L (* 3 LETTERS) INTO A4. + ROL A4H 26 LETTERS REQ. 5 BITS + DEX + BPL RDMNEM3 + DEC A1H + BEQ RDMNEM3 + BPL RDMNEM2 + LDX #$05 INDEX FOR 6 FORMAT BITS +RDFMT JSR CHARIN + STY YSAV + CMP CHAR1,X + BNE RDFMT2 + JSR CHARIN + CMP CHAR2,X + BEQ RDADDR + LDA CHAR2,X + BEQ RDFMT3 + CMP #$A4 + BEQ RDFMT3 + LDY YSAV +RDFMT2 CLC +RDFMT3 DEY +RDADDR ROL A5L + CPX #$03 + BNE RDADDR3 + JSR GETNUM + LDA A2H + BEQ RDADDR2 + INX +RDADDR2 STX YSAV1 + LDX #$03 + DEY +RDADDR3 STX A1H + DEX + BPL RDFMT + LDA A5L + ASL A + ASL A + ORA YSAV1 + CMP #$20 + BCS RDADDR4 + LDX YSAV1 + BEQ RDADDR4 + ORA #$80 +RDADDR4 STA A5L + STY YSAV + LDA IN,Y + CMP #$8D + BEQ DISAS + JMP A1TOPC +DISAS JMP DSS +CHARIN LDA IN,Y + INY + CMP #$A0 + BEQ CHARIN + RTS +MOD8CK LDA A1L + AND #$07 + BNE ASCOUT +ASC JSR PRA1 F(") +ASCOUT JSR OUTSP + LDA (A1L),Y + ORA #$80 + CMP #$A0 + BCS PRASC TAKEN IF NORM. OR LCASE + LDA #$A0 SPACE FOR CTRL OR INV +PRASC JSR COUT + JSR NXTA1 + BCC MOD8CK + RTS +FIND LDA #$FF F(CTRL-F) A4MKEYIN PROPER DOS HOOKS. + STA MKSWH + STY MKSWL + LDA #MVIDOUT + STA MCSWH + STY MCSWL + LDA #40 + STA WNDWDTH + JSR IN40 + STA CLR80VID + JSR HOME40 + STA LOWSCR + STA TXTSET + RTS +STPRMPT LDA #$A3 + STA PROMPT + RTS +IN40 LDX #4 +MOVE40 LDA HOOK40-1,X + STA CSWL-1,X + DEX + BNE MOVE40 + STX FLG8 SET = 0 +RTS7 RTS +CHKVID LDA MCSWH RESET 40/80 COL IF NEEDED + CMP #$C3 + PHP + LDA FLG8 + BMI CHK80 + PLP + BNE RTS7 + BEQ IN80 40 -> 80 +CHK80 PLP + BNE IN40 80 -> 40 + BEQ RTS7 + SKP 1 +*** 80 COLUMN DRIVER ROUTINE *** + SKP 1 +INIT80 JSR HOME + STA CLR80ROM ENABLES $C300 ROM + JSR PR3 +IN80 LDX #3 +MOVE80 LDA MCSWL,X + STA CSWL8,X + LDA HOOK80,X + STA CSWL,X + DEX + BPL MOVE80 + STX FLG8 SET = FF + RTS +COUT80 JSR EXCHV + JSR COUTZ80 + JMP EXCHV +COUTZ80 JMP (CSWL8) +KEYIN80 JSR EXCHV + JSR KEY80 + JMP EXCHV +KEY80 JMP (KSWL8) +EXCHV PHA + TXA + PHA + TYA + PHA + LDY #1 +EXCH2 LDA MCH,Y EXCHANGE CH,CV AND BASE + LDX CH,Y ADDRESS BETWEEN ANALYST + STA CH,Y AND 80 COL ROM COUT. + STX MCH,Y + LDA MBASL,Y + LDX BASL,Y + STA BASL,Y + STX MBASL,Y + DEY + BPL EXCH2 + PLA + TAY + PLA + TAX + PLA + RTS +PRTITLE LDX #$00 PRINT TITLE +TITLLOC LDA TITLE,X + BEQ PRADDR + JSR COUT + INX + BNE TITLLOC +PRADDR LDA SUMLOC+2 PRINT ORIGIN ADDRESS + JSR PRBYTE + LDA #0 + JSR PRBYTE + JSR CROUT + JSR DOSUM + LDA A3L + CMP CHKSUM + BNE ERRSUM + LDA A3H + CMP CHKSUM+1 + BNE ERRSUM + JSR CROUT + LDA #$CF PRINT 'OK' + JSR COUT + LDA #$CB + JSR COUT + JMP CROUT +ERRSUM JMP PRERR +DOSUM LDA STARTLOC + STA A1L + LDA STARTLOC+1 + STA A1H + LDA ENDLOC + STA A2L + LDA ENDLOC+1 + STA A2H + LDX #0 + STX A3L + STX A3H +GETBYT CLC + LDA (A1L,X) + ADC A3L + STA A3L + LDA #0 + ADC A3H + STA A3H + JSR NXTA1 + BCC GETBYT + RTS +INITSUM JSR DOSUM CHKSUM OF START-ENDMAIN + LDA A3L + STA CHKSUM + LDA A3H +CSUMLOC STA CHKSUM+1 + RTS + SKP 1 +*** PROGRAM DATA AREA *** + SKP 1 +TITLE DFB $8D + ASC "ANALYST 64" + DFB $8D TITLE MARKS START OF PDA + ASC "ORG = $" + DFB $00 +FMT2 DFB 0,33,129,130,90,73,89,77 + DFB 145,146,134,74,133,157 +MNEML DFB 28,138 + DFB 28,35,93,139,27,161,157,138 + DFB 29,35,157,139,29,161,28,41 + DFB 25,174,105,168,25,35,36,83 + DFB 27,35,36,83,25,161,173,26 + DFB 165,91,165,172,139,138,174,174 + DFB 168,173,41,138,124,139,21,156 + DFB 109,156,165,105,41,83,132,19 + DFB 52,17,165,105,35,160 +MNEMR DFB 216,98 + DFB 90,72,38,98,148,136,84,68 + DFB 200,84,104,68,232,148,196,180 + DFB 8,132,116,180,40,110,116,244 + DFB 204,74,114,242,164,138,6,170 + DFB 118,162,116,198,116,116,68,104 + DFB 178,50,178,114,34,114,26,26 + DFB 38,38,114,114,136,200,196,202 + DFB 38,72,68,68,162,200 +FMT1 DFB 240,34,0,51,93,130,0,147 + DFB 243,34,0,51,93,136,0,153 + DFB 240,47,0,51,93,143,0,159 + DFB 240,34,0,59,93,136,0,148 + DFB 253,34,0,51,93,200,0,147 + DFB 17,34,0,51,93,200,0,169 + DFB 241,34,0,51,93,143,0,159 + DFB 241,34,0,51,93,143,0,159 + DFB 38,49,135,154 +OPC65C DFB 18,50,82,114 + DFB 146,178,210,242,58,26,137,28 + DFB 20,122,90,156,100,158,116,124 + DFB 60,52 + DFB 76,164,172,180,188,196,204,228 + DFB 236 +REPL65C DFB 17,49,81,113,145,177 + DFB 209,241,194,226,52,164,172,196 + DFB 228,92,92,92,92,124,60,52 + DFB 124,160,160,160,160,192,192 + DFB 224,224 +CHAR1 DFB 172,169,172,163,168,164 +CHAR2 DFB 217,0,216,164,164,0 +CHAR3 ASC "CZIDB-VN" +RTBL ASC "AXY" +CHRTBL DFB 152,249,3,236 + DFB 166,164,6,149,5 + DFB 0,147,2,167,198,153 + DFB 155,154,239,233,1,191 + DFB 168,237,158,235,197 +SUBTBL DW PRTITLE-1 F(?) DO CHCKSUM OF MAIN + DW SETVID-1 F(@) SWITCH 40/80 COL + DW EXECJSR-1 F(J) EXECUTE JSR + DW STEP-1 F(S) STEP + DW SETMODE-1 F(-) 16 BIT SUBTRACTION + DW SETMODE-1 F(+) 16 BIT ADDITION + DW MOVE-1 F(M) MOVE + DW LT-1 F(<) COPY A2 TO A4 & A5 + DW LIST-1 F(L) LIST DISASSEMBLY + DW GO-1 F(G) GO + DW SETMODE-1 F(:) STORE + DW SETREG-1 F(I) SET INTERNAL PC/REG + DW SETMODE-1 F(.) XAM + DW CRMON-1 F(CR) HANDLE CR + DW BLANK-1 F( ) HANDLE SPACES + DW ASC-1 F(") DUMP IN ASCII + DW MINI-1 F(!) MINI-ASSEMBLER + DW VFY-1 F(V) VERIFY + DW SETPRNT-1 F(P) TO PRINTER + DW LOAD-1 F(H) LOAD FOR HSF + DW FIND-1 F(CTRL-F) HEX SEQ. FIND + DW SETDOS-1 F(/) SET DOS CALL JSR #. + DW TRACE-1 F(T) TRACE + DW BINARY-1 F(%) VALUE IN BINARY + DW RELOC-1 F(R) RELOCATOR + DW CRMON-1 HANDLE CTRL-L AS CR +HOOK40 DW COUT40 + DW KEYIN +HOOK80 DW COUT80 + DW KEYIN80 +STARTLOC DW START +ENDLOC DW ENDMAIN +ERRMSG DFB $8D MARKS END OF WORDS + ASC 'RRE' + DFB $8D +ENDMAIN DFB $00 = END OF STATIC PGM AREA + SKP 1 +* DYNAMIC PROGRAM AREA * + SKP 1 +CSWL DS 1 ADDR. OF OUTPUT ROUTINE +CSWH DS 1 +KSWL DS 2 ADDR. OF INPUT ROUTINE +CSWL8 DS 2 DON'T CHANGE ORDER +KSWL8 DS 2 OF CSWL-KSWL8 +TFLG DS 1 <> 0 = CANCEL COUT FOR TRC +JFLG DS 1 SET TO ALLOW F(J) +DOSCALL DS 2,255 SUBROUTINE TO JSR IMMED. +ERRFLG DS 1 SET FOR BAD OPCODE +PCREG DS 2,0 +ACC DFB 0 DON'T CHANGE ORDER +XREG DFB 0 OF ACC TO SPNT +YREG DFB 0 +STATUS DFB 0 +SPNT DFB $F0 +SREF DFB $F0 STACK REF SET BY TXS OPC +LMNEM DS 1 +RMNEM DS 1 +LENGTH DS 1 +FORMAT DS 1 +MODE DS 1 +FLG8 DS 1 FF = 80 COL, 0 = 40 COL +PROMPT DS 1 +CH DS 1 +CV DS 1 +DSPTOP DS 1 TOP OF DISPLAY FOR STEP +YSAV DS 1 +YSAV1 DS 1 +COUNTER DS 1 +BRKADDR DS 2,255 BREAK FOR STEP,TRACE,LIST +ZBUF DS $100-PCL PAGE ZERO STORAGE BUFFER +CHKSUM DS 2 CHKSUM OF STATIC PROG. +IN DS 38 KEYIN BUFFER. +FMTSAV EQU IN+12 TEMP STORAGE FOR INSTDSP +XQT DS 15 BUFFER FOR F(S,CTRL-F,J) +ENDPGM EQU >* +FREESPC EQU $FF-ENDPGM + DS FREESPC IF $NFFF SET <> 0 WILL TRC +ROMFLG DS 1 THRU JSR ROM $D000-FFFF. diff --git a/ANALYST DEBUG.txt b/ANALYST DEBUG.txt new file mode 100644 index 0000000..c08400f --- /dev/null +++ b/ANALYST DEBUG.txt @@ -0,0 +1,2096 @@ + LST OFF + X6502 + SBTL + MSB ON + ORG $8000 + SKP 1 +********************************* +* * +* -< ANALYST DEBUG >- * +* * +* 128K VERSION EX * +* * +* 6/16/91 * +* * +********************************* + SKP 1 +*** COMMANDS *** + SKP 1 +; CTRL-F FIND HEX SEQUENCE DEFINED BY F(H) +; G GO EXECUTE IN IMMEDIATE MODE +; H LOAD BYTES FOR HSF F(CTRL-F) BY USING H: +; I DISPLAY/SET PC/INTERNAL A,X,Y,P,S REGISTERS +; J JUMP. EXECUTE JSR INSTRUCTION IN STEP MODE +; CTRL-L CLEAR PRESENT SCREEN AND HOME CURSOR +; L LIST DISASSEMBLY OR LOOP IN TRACE MODE. +; M MOVE BLOCK OF MEMORY +; P SEND OUTPUT TO PRINTER +; R RELOCATE ANALYST TO NEW ADDRESS PAGE +; S ENTER STEP MODE. STEP INSTRUCTION +; T TRACE PROGRAM +; V PRINT ANALYST VERSION# AND ORIGIN ADDRESS. +; CTRL-X MOVE ANALYST TO AUX. DISABLED AFTER USE. +; X SKIP INSTRUCTION DURING STEP. TOGGLE MAIN/AUX +; " DUMP MEMORY IN ASCII +; / SET OR PRINT SUBROUTINE TO JSR IMMED MODE +; % PRINT ADDRESS DATA VALUE IN BINARY +; ? PRINT LAST 16 PC'S EXEC'D DURING TRACE +; @ SET TEXT 40/80 COL SCREEN +; < RANGE DELIMITER +; . RANGE DELIMITER +; + 16 BIT ADDITION +; - 16 BIT SUBTRACTION +; : STORE VALUE IN MEMORY +; ! ENTER MINI-ASSEMBLER. ALONE TO EXIT + SKP 1 +*** ROM ZERO PAGE EQUATES *** + SKP 1 +MCSWL EQU $36 +MCSWH EQU $37 +MA1 EQU $3C +MA2 EQU $3E +MA4 EQU $42 + SKP 1 +*** ANALYST EQUATES *** + SKP 1 +STKLMT EQU $D8 TOP OF STACK +PCL EQU $EF LABEL MARKS PAGE 0 +PCH EQU $F0 +BASL EQU $F1 +BASH EQU $F2 LABEL USED AS IDENTIFIER +ZFLG EQU $F3 1 BYTE ID = $D5 +A1L EQU $F4 A1L-A5H MUST BE IN ORDER +A1H EQU $F5 FOR MINI-ASSEMBLER +A2L EQU $F6 +A2H EQU $F7 +A3L EQU $F8 +A3H EQU $F9 +A4L EQU $FA +A4H EQU $FB +A5L EQU $FC +A5H EQU $FD +BAS2L EQU $FE +BAS2H EQU $FF LABEL MARKS END OF PAGE 0 +STACK EQU $0100 PRODOS USES $100 +WARMV EQU $0178 WARM REENTRY +XQTS EQU WARMV+6 EXEC AREA FOR STEP, TRACE +YPOKE EQU XQTS+21 +PEEK EQU XQTS+29 +YPEEK EQU XQTS+31 +XQT EQU XQTS+50 +MLI EQU $BF00 PRODOS INTERFACE + SKP 1 +*** ROM EQUATES *** + SKP 1 +KBD EQU $C000 +INHPAGE2 EQU $C001 AUX $400-7FF SHOWS TEXT +MAINRD EQU $C002 +MAINWR EQU $C004 +CLR80VID EQU $C00C +SET80VID EQU $C00D +KBDSTRB EQU $C010 +RDAUXZP EQU $C016 BMI IF AUXZP +RDPAGE2 EQU $C018 BMI IF INHPAGE2 ON +RDTEXT EQU $C01A BMI IF TEXT MODE +RDSCR EQU $C01C BMI IF DPAGE2 ON +RD80VID EQU $C01F BMI IF 80 COL MODE +SPKR EQU $C030 +TXTSET EQU $C051 +LOWSCR EQU $C054 +HISCR EQU $C055 +PB0 EQU $C061 OPEN APPLE KEY +PB1 EQU $C062 CLOSED APPLE KEY +SWITCH2 EQU $C082 +AUXMOVE EQU $C311 +OUTPORT EQU $FE95 USED TO SET PRINTER +IDROM EQU $E000 = $4C IF ROM PRESENT + SKP 3 +START JMP RESET COLD START +INSDS1 LDX PCL + LDY PCH + JSR PRYX2 + JSR OUTSP +INSDST JSR PEEK +INSDS2 LDY #$FF DETERMINE LENGTH OF + STY LMNEM INSTRUCTION. OPCODE IN + TAY ACC. STORED IN LENGTH. + LSR A INVALID = 0 + BCC IEVEN 1 BYTE = 0 + ROR A 2 BYTE = 1 + BCS ERR 3 BYTE = 2 + AND #$87 +IEVEN LSR A + TAX + LDA FMT1,X + BCC RTMSKZ + LSR A + LSR A + LSR A + LSR A +RTMSKZ AND #$0F + CMP #$0F + BNE GETFMT +ERR LDY #$FF BAD OPCODE + STY ERRFLG + INY + STY LMNEM + STY RMNEM + STY FORMAT + STY LENGTH +RTS1 RTS +GETFMT TAX + LDA FMT2,X + STA FORMAT + AND #$03 + STA LENGTH + LDA TFLG BYPASS PRINT FORMATTING + BNE RTS1 IN TRACE + TYA + AND #$8F + STA TEMP1 TEMP STORAGE + TYA + LDX #31 +GETFMT2 DEX + BMI MNNDX + CMP OPC65C,X MAKE SUBSTITUTION IF + BNE GETFMT2 65C02 OPCODE. + LDA REPL65C,X +MNNDX LDX TEMP1 + LDY #$03 + CPX #$8A + BEQ MNNDX3 +MNNDX1 LSR A + BCC MNNDX3 + LSR A +MNNDX2 LSR A + ORA #$20 + DEY + BNE MNNDX2 + INY +MNNDX3 DEY + BNE MNNDX1 + RTS +INSTDSP JSR INSDS1 + PHA +PRNTOP JSR YPEEK + JSR PRBYTE + LDX #$01 +PRNTBL JSR PRBLNK + CPY LENGTH + INY + BCC PRNTOP + LDX #$03 + CPY #$03 + BCC PRNTBL + PLA + TAY + LDA LMNEM + BEQ PRMN1 + LDA MNEML,Y + STA LMNEM + LDA MNEMR,Y + STA RMNEM +PRMN1 LDA #$00 + LDY #$05 +PRMN2 ASL RMNEM + ROL LMNEM + ROL A + DEY + BNE PRMN2 + ADC #$BF + JSR COUT + DEX + BNE PRMN1 + JSR OUTSP + LDY LENGTH + LDX #$05 +PRADR1 CPX #$02 + BEQ PRADR5 +PRADR2 ASL FORMAT + BCC PRADR3 + LDA CHAR1,X + JSR COUT + LDA CHAR2,X + BEQ PRADR3 + JSR COUT +PRADR3 DEX + BPL PRADR1 + RTS +PRADR4 DEY + BMI PRADR2 + JSR PRBYTE +PRADR5 LDA FORMAT + CMP #$E8 + JSR YPEEK + BCC PRADR4 + JSR PCADJA + TAX + INX + BNE PRNTYX + INY +PRNTYX TYA +PRNTAX JSR PRBYTE + TXA + JMP PRBYTE +PRBLNK3 LDX #3 +PRBLNK JSR OUTSP PRINT X SPACES + DEX + BNE PRBLNK + RTS +PCADJ SEC UPDATE PC BY LENGTH+1 +PCADJLP LDA LENGTH UPDATE PC BY LENGTH +PCADJAP JSR PCADJA UPDATE PC BY ACC + STA PCL + STY PCH + RTS +PCADJL LDA LENGTH SET Y,A = PC+LENGTH +PCADJA LDY PCH SET Y,A = PC+ACC + TAX + BPL PCADJ2 + DEY +PCADJ2 ADC PCL + BCC RTS2 + INY +RTS2 RTS +STEP DEC YSAV F(S) + PLA REMOVE RTS TO NEXTITM + PLA +STEPL TXA + BEQ STEPZ + JSR SETBREAK FIRST TIME + LDX #1 + BNE SSTEP ALWAYS TAKEN +STEPZ JSR KYWAIT CTRL-C = BREAK + CPY #$CA + BNE STEP2 + LDA JFLG J = SINGLE STEP + BEQ SSTEP IF NO JSR, ELSE + JMP TRCPCS EXECUTE SUBROUTINE +STEP2 CPY #$CC L = LOOP. SET BREAK + BNE STEP2A POINT AFTER INSTRUCTION + JSR PCADJL TO BE EXECUTED NEXT + STA BRKADDR AND ENTER TRACE. + STY BRKADDR+1 + JMP STEPT +STEP2A LDA JFLG SPC = SINGLE STEP IF + BNE STEP3 NOT JSR, ELSE IGNORE + CPY #$A0 + BEQ SSTEP +STEP3 CPY #$D3 S OR OPEN APPLE = + BEQ SSTEP SINGLE STEP ALWAYS + TYA + BEQ SSTEPW = 0 FOR OPEN APPLE. + CPY #$D4 T = ENTER TRACE MODE + BNE STEP4 + LDY #$FF +STEPT STY TFLG SET TRACE MODE FLAG + STY PCFLG ENABLE PC PRINTING + JMP STRACE AND ENTER TRACE. +STEP4 CPY #$D8 X = SKIP NEXT INSTRUCTION + BNE STEP5 + STZ JFLG ENABLE SPC IF SKP WHILE + STZ ERRFLG JSR DISPLAYED ACTIVE. + JSR PCADJ CLR IN CASE SKIP ERROR. + JMP JRTSX +STEP5 CPY #$C0 @ = TEXT MODE + BNE STEPL LOOP BACK FOR INPUT + JSR TEXT +SSTEPW JSR FWAIT PAUSE TO RELEASE O/A KEY +SSTEP JSR A1PC +SSTEPT JSR CLEARDSP TRACE RE-ENTRY TO STEP + JSR INSTDSP + JSR PRBLNK3 + JSR PEEK + AND #$0F + CMP #$01 SEE IF ZERO PAGE IND + BNE SSTEPZ + LDA #$A8 '(' + JSR COUT PRINT ABSOLUTE VALUE + JSR PEEK IN PARENTHESIS + AND #$10 + BNE INDY TAKEN FOR (NN),Y. + LDX XREG FOR (NN,X). +INDY TXA X=0 FOR (NN),Y + STA TEMP1 + LDY #1 + JSR YPEEK + CLC + ADC TEMP1 + PHA + JSR ZSWAP GET PROGRAM PAGE 0 AND + PLA SAVE POINTER ADDRESS ON + TAX STACK. + LDA $01,X + PHA + LDA $00,X + PHA + JSR ZSWAP RESTORE ANALYST PAGE 0 + PLA AND RECOVER POINTER ADDR. + TAX + PLA + JSR PRNTAX + LDA #$A9 ')' + JSR COUT +SSTEPZ JMP TSTEP +PRNTPC LDA #$FF PRINT PC AT TOP OF SCREEN + STA CV BY FORCING CROUT TO INC + JSR CROUT CV TO 0 (NEED FOR 80 COL) + LDA #29 + STA CH + LDA PROMPT + JSR COUT + LDA PCH + LDX PCL + JMP PRNTAX +TRACEPC LDX PCPNT SAVE PC TO BE EXEC'D + LDA PCH IN LIST BUFFER. + STA PCBUF,X + INX + LDA PCL + STA PCBUF,X + INX + CPX #32 + BCC PNTINC + LDX #0 +PNTINC STX PCPNT + LDA PB0 + BPL TRCPC1 + LDA PCFLG O/A TOGGLES PRINT PC + EOR #$FF ON/OFF + STA PCFLG + JSR FWAIT PAUSE TO RELEASE O/A KEY +TRCPC1 LDA PCFLG + BEQ TRCPC2 BYPASS PRINTING PC. + INC COUNTER PRINT PC + BNE TRCPC2 EVERY 256 INSTRUCTIONS + LDA PROMPT FLASHING '$' FOR TRACE + EOR #$04 ACTIVITY. $A4->$A0->$A4 + STA PROMPT + JSR PRNTPC +TRCPC2 LDA JFLG + BEQ TRACE5 + LDA PCH + CMP #$C0 + BCC TRCPCD + LDY ROMFLG + BNE TRCPCD + CMP #$D0 + BCC TRCPCI + LDY IDROM JSR ROM $C000-FFFF IN + CPY #$4C IMMEDIATE MODE UNLESS + BEQ TRCPCI ROM FLAG SET <> 0. +TRCPCD CMP DOSCALL+1 TRACE THRU JSR UNLESS = + BNE TRACE5 DOS SUBROUTINE SPECIFIED + LDA PCL BY F(/). + CMP DOSCALL + BNE TRACE5 +TRCPCI LDA PCFLG EXEC JSR IMMEDIATE. DON'T + BEQ TRCPCS PRINT IF O/A TURNED OFF. + JSR SPROMPT '#' DENOTES JSR IMMED. + JSR PRNTPC PRINT EXEC SUBROUTINE + JSR DPROMPT '$' PROMPT + LDA #$FF FORCE PC PRINTING + STA COUNTER AFTER JSR IMMED. +TRCPCS LDA PCL SEE IF PC = $BF00 + BNE TRCPCG + LDA PCH + CMP # TRACE ENTRY POINT + STZ DSPTOP FOR STEP -> TRACE + JSR DPROMPT '$' PROMPT + JSR CLEARDSP +TRACE5 LDX #1 IF PC = A4 THEN ENTER STEP +TRACE6 LDA PCL,X + CMP BRKADDR,X + BNE TRACE7 + DEX + BPL TRACE6 + JSR SETBREAK CLEAR OLD BREAKPOINT + BRA TRACES +TRACE7 LDA PB1 BACK TO STEP MODE IF + BPL TRACE8 CLOSED APPLE PRESSED +TRACES STA KBDSTRB + STZ TFLG CLEAR TRACE FLAG + STZ DSPTOP RESET DISPLAY TO TOP + LDA RDTEXT SEE IF GRAPHICS MODE + BMI TRACES2 + JSR TEXT GRAPHICS -> TEXT +TRACES2 JSR STPRMPT PROMPT BACK TO OLD '#' + LDY YSAV + LDA #$D3 PUT 'S' INTO INPUT BUFFER + STA IN,Y + JMP SSTEPT RE-ENTER STEP MODE +TRACE8 JSR INSDST +TSTEP LDA ERRFLG IF BAD OPCODE THEN BRK + BEQ TSTEP3 +XBRK STZ DSPTOP + STZ TFLG + JSR CLEARDSP + JSR INSTDSP + JSR CROUT + JSR RGDSP1 + JMP ERRMON +XTSX LDX SPNT + STX XREG +XTXS LDX XREG + STX SREF +UPDSPNT STX SPNT UPDATE SPNT + JMP UPDPC +TSTEP3 STZ JFLG DISALLOW F(J) IF NO JSR + JSR PEEK GET OPCODE + BEQ XBRK + CMP #$BA + BEQ XTSX + CMP #$9A + BEQ XTXS + CMP #$40 + BEQ XBRK BREAK FOR RTI INSTRUCTION + LDY LENGTH + CPY #2 + BEQ CHK128 + JMP TSTEP3B +CHK128 STA TEMP3 CHECK FOR 3-BYTE + JSR YPEEK $C002-C005, $C008-C009 + CMP #$C0 AUX R/W SWITCHES AND + BNE TSTEP3A HANDLE SPECIAL. + DEY + JSR YPEEK + INY + CMP #$02 + BCC TSTEP3A + CMP #$04 + BCC TSTEPRD + CMP #$06 + BCC TSTEPWR + CMP #$08 + BCC TSTEP3A + CMP #$0A + BCS TSTEP3A + STA TEMP3 + ROR A + ROR A + EOR RDAUXZP + BPL UPDPCGO NO CHANGE IN ZP STATE. + LDA XQTS+44 CHANGE ZP TO MAIN/AUX. + STA TEMP1 SAVE CURRENT MAIN/AUX + LDA XQTS+47 R/W STATUS. + STA TEMP2 + LDA XQTS+37 + STA TEMP4 + LDA XQTS+40 + STA TEMP5 + JSR ZSWAP RESTORE PROGRAM ZP. + LDY TEMP3 + STA $C000,Y SET NEW ZP STATE AND + JSR ZSWAP PUT ANALYST ZP BACK. + JSR INITXQTS COPY NEW IMAGE OF XQTS + LDA TEMP1 ONTO STACK AND WRITE + STA XQTS+44 IN CURRENT R/W STATES. + LDA TEMP2 + STA XQTS+47 + LDA TEMP4 + STA XQTS+37 + LDA TEMP5 + STA XQTS+40 + BRA UPDPCGO +TSTEPRD STA XQTS+44 SET PROGRAM READ STATE. + BRA UPDPCGO +TSTEPWR STA XQTS+47 SET PROGRAM WRITE STATE. +UPDPCGO JMP UPDPC +TSTEP3A LDA TEMP3 OPCODE + CMP #$20 + BEQ XJSR + CMP #$7C + BEQ XJMPATX + CMP #$4C + BEQ XJMP + CMP #$6C + BEQ XJMPAT +TSTEP3B CMP #$60 + BEQ XRTS + PHA + CMP #$5A + BCC TSTEP4 + TAX + AND #$1F + CMP #$1A + BEQ STACKOP PHX,PLX,PHY,PLY + TXA +TSTEP4 AND #$9F + CMP #$08 + BNE TSTEP5 +STACKOP JMP STKOPC PHA,PLA,PHP,PLP +TSTEP5 LDA #$EA + STA XQTS+4 + STA XQTS+5 + PLA OPCODE + CMP #$80 + BNE NBRA + ORA #$10 +NBRA AND #$1F + EOR #$14 + CMP #$04 = BRANCH OFFSET + BEQ XQ2 TAKEN IF BRANCH OPCODE +XQ1 JSR YPEEK Y = LENGTH +XQ2 STA XQTS+3,Y XQT BCS BRNCH (B0 04) + DEY NOP + BPL XQ1 JMP NBRNCH (CCLR) + JSR RESTORE BRNCH JMP BRANCH (CSET) + JMP XQTS +XRTS LDX SPNT + INX + LDA STACK,X + STA PCL + INX + LDA STACK,X + STA PCH + STX SPNT + DEC DSPTOP + BRA PCINC +XJMPATX INX + BNE XJMPAT +XJSR STA JFLG OK FOR F(J) + INC DSPTOP + CLC + JSR PCADJL SET Y,A = RTS ADDR + PHA + LDX SPNT + TYA + STA STACK,X + DEX + PLA + STA STACK,X + DEX + STX SPNT + LDY #$02 +XJMP CLC +XJMPAT JSR YPEEK + PHA + DEY + JSR YPEEK + STA PCL + PLA + STA PCH + BCC NEWPC + DEX + BNE XJMP + LDA XREG + CLC + JSR PCADJAP + LDY #1 + BRA XJMP +NBRNCH JSR SAVE ALL OTHER OPCODES + BRA UPDPC +BRANCH JSR SAVE BRANCH WITH COND. MET + CLC + LDY #$01 + JSR YPEEK + JSR PCADJAP +UPDPC SEC +PCINC JSR PCADJLP +NEWPC LDA TFLG + BNE TRACEBY BYPASSES NEXTITM +NXTPC JSR CROUT + JMP REGDSP +TRACEBY JMP TRACEPC +PULL PHP + INX + LDA STACK,X + TAY + LDA STATUS PULL FROM STACK AFFECTS + PHA N & Z FLAGS + PLP + TYA UPDATE N & Z + PHP + PLA + STA STATUS + TYA + PLP + RTS +STKOPC LDX SPNT STACK OPCODES + PLA OPCODE + TAY + AND #$10 + BEQ APCODE + TYA + ASL A + BCS OPCX + ASL A + ASL A + BCS XPLY + LDA YREG XPHY + BCC PUSH +XPLY JSR PULL + STA YREG + BCS UPDSTACK +OPCX ASL A + ASL A + BCS XPLX + LDA XREG XPHX + BCC PUSH +XPLX JSR PULL + STA XREG + BCS UPDSTACK +APCODE TYA + ASL A + ASL A + BMI PULLAP + BCC XPHP + LDA ACC XPHA + BCS PUSH +XPHP LDA STATUS +PUSH STA STACK,X + DEX + BNE UPDSTACK +PULLAP BCC XPLP + JSR PULL XPLA +ACCLOC STA ACC + BCS UPDSTACK +XPLP JSR PULL + STA STATUS +UPDSTACK JMP UPDSPNT +YPOKEPC PHA EXECUTE STA (PCL),Y + LDA PCL + STA A3L + LDA PCH + STA A3H + PLA + JMP YPOKE +* +* XQTS IMAGE AT $101-12C. INSTRUCTIONS WITH '@' ARE +* CHANGEABLE IN XQTS AREA TO SET MAIN/AUX R/W STATE. +* +INITBL JSR XQTS+36 WARMV. REAL-TIME REENTRY + JMP REENTER BY JSR $101. + JSR XQTS+43 XQTS + NOP + NOP + NOP + JMP XQTS+15 + JSR XQTS+36 + JMP BRANCH + JSR XQTS+36 XQTS+15 + JMP NBRNCH + JSR XQTS+43 YPOKE + STA (A3L),Y + JMP XQTS+36 + LDY #0 PEEK + JSR XQTS+43 YPEEK + LDA (PCL),Y + STA MAINRD @ XQTS+36. SET ANALYST + STA MAINWR @ STATE + RTS + STA MAINRD @ XQTS+43. SET PROGRAM + STA MAINWR @ STATE + RTS +* +SETBREAK LDX #1 SET BREAKPOINT TO A4 + LDA BRKADDR+1 IF GIVEN, ELSE $FFFF. + BEQ SETBRK2 BREAKPOINT GIVEN + LDA #$FF +SETBRK1 STA BRKADDR,X CLEAR OLD BREAKPOINT + DEX + BPL SETBRK1 + RTS +SETBRK2 LDA A4L,X SET BREAKPOINT + STA BRKADDR,X + DEX + BPL SETBRK2 + RTS +LOAD LDA XQLOC1+1 F(H) + LDY XQLOC1+2 SETUP A3 = XQT+1 FOR HSF + BRA A3SET BUFFER (XQT=BYTE COUNT) +SETRG1 JSR A1PC + JSR SAVEPC +SETRG2 LDA ACCLOC+1 SETUP REGS FOR F(:) + LDY ACCLOC+2 +A3SET STA A3L + STY A3H + RTS +SETREG TXA F(I) SET OR DISPLAY REGS. + BNE SETRG1 TAKEN IF PC GIVEN. + LDY YSAV + LDA IN,Y + CMP #$8D + BNE SETRG2 + LDA PCREG I DISPLAYS REGS. + STA PCL + LDA PCREG+1 + STA PCH +REGDSP JSR RGDSP1 + JSR INSTDSP DISPLAY INSTRUCTION + JMP NEXTITM TO BE EXECUTED NEXT +RGDSP1 LDX #0 +RDSP1 LDA RTBL,X + JSR COUT + LDA #$BD + JSR COUT + LDA ACC,X + JSR PRBYTE + JSR OUTSP + INX + CPX #3 + BCC RDSP1 + LDX #7 +PRFLG LDA CHAR3,X PRINT 'NV-BDIZC' + JSR COUT + DEX + BPL PRFLG + JSR CROUT + LDA #$C1 PRINT ACC IN BINARY + JSR COUT + JSR OUTEQ + LDA ACC + JSR BNDSP + JSR PRBLNK3 + LDA #$D0 PRINT STATUS IN BINARY + JSR COUT + JSR OUTEQ + LDA STATUS + JSR BNDSP + JSR CROUT + LDA #$D3 + JSR COUT + JSR OUTEQ + LDA SPNT + JSR PRBYTE + LDA #$BA + JSR COUT + LDA #$D8 + JSR COUT + JSR COUT + LDY #10 + LDX SPNT +PRNTSTK JSR OUTSP PRINT STACK BYTES FROM + CPX SREF SPNT TO SREF UP TO 10 + BEQ SAVEPC MAX. + INX + LDA STACK,X + JSR PRBYTE + DEY + BNE PRNTSTK +SAVEPC LDA PCL + STA PCREG + LDA PCH + STA PCREG+1 + RTS +BINARY JSR A1PCX F(%) PRINT VALUE AT + JSR CROUT ADDRESS IN BINARY. + JSR PEEK +BNDSP LDX #$08 INDEX FOR 8 BITS +NEXTBIT ASL A + PHA + BCS BIT1 + LDA #$30 '0' + DFB $2C SKIP NEXT INSTRUCTION +BIT1 LDA #$31 '1' + JSR COUT + PLA + DEX + BNE NEXTBIT + RTS +BELL LDY #$38 DURATION +BELL2 LDA #$2B FREQUENCY + JSR WAIT + LDA SPKR + DEY + BNE BELL2 + RTS +COUTZ JMP (CSWL) +VIDOUT BIT #$60 + BEQ CTRLCHAR + TAY + CMP #$60 + BCS VID1 + CMP #$40 + BCC VID1 + AND #$BF +VID1 LDY CH + BIT RD80VID + BPL VID3 + PHA + TYA + LSR A + BCS VID2 + STA HISCR +VID2 TAY + PLA +VID3 STA (BASL),Y + STA LOWSCR + LDY CH + INY + CPY WNDWDTH + BCS CR + STY CH +VIDRTS RTS +BACKSPC DEC CH + BPL VIDRTS + LDY WNDWDTH + DEY + STY CH +UP LDA CV + DEC A + CMP #0 + BMI VIDRTS +VTABVGO JMP VTABV +CTRLCHAR ORA #$80 + CMP #$88 + BEQ BACKSPC + CMP #$8C + BEQ HOME + CMP #$8D + BNE VIDRTS +CR LDA #$00 + STA CH + INC CV + LDA CV + CMP #24 + BCC VTABVGO + DEC CV + LDX #0 SCROLL + TXA + JSR VTABZ + BRA SCRL5 +SCRL1 LDY BASH + STY BAS2H + LDY BASL + STY BAS2L + TXA + JSR VTABZ + PHX + LDX WNDWDTH + LDY #0 +SCRL2 BIT RD80VID + BPL SCRL3 + STA HISCR + LDA (BASL),Y + STA (BAS2L),Y + DEX + BEQ SCRL4 + STA LOWSCR +SCRL3 LDA (BASL),Y + STA (BAS2L),Y + INY + DEX + BNE SCRL2 +SCRL4 STA LOWSCR + PLX +SCRL5 INX + CPX #24 + BCC SCRL1 + LDA #$00 + JSR CLEOLZ + JMP VTAB +HOME LDA #0 + STA CH + STA CV + JSR VTAB + SEC + LDA CV + PHA + SBC #24 + TAX + LDA CH + BRA CLS2 +CLS1 PHA + JSR VTABZ + LDA #$00 +CLS2 PHX + JSR CLEOLZ + PLX + PLA + INC A + INX + BNE CLS1 +VTAB LDA CV +VTABV STA CV +VTABZ PHA + LSR A + AND #$03 + ORA #$04 + STA BASH + PLA + AND #$18 + BCC BSCLC2 + ADC #$7F +BSCLC2 STA BASL + ASL A + ASL A + ORA BASL + STA BASL + RTS +CLREOL LDA CH +CLEOLZ BIT RD80VID + BPL CLEOL4 + PHA CLREOL 80 COL + SEC + SBC WNDWDTH + TAX + PLA + LSR A + TAY + PHP + LDA #$A0 + PLP + BCS CLEOL8B +CLEOL8A STA HISCR + STA (BASL),Y + INX + BEQ CLEOL8C +CLEOL8B STA LOWSCR + STA (BASL),Y + INY + INX + BNE CLEOL8A +CLEOL8C STA LOWSCR + RTS +CLEOL4 TAY + SEC + SBC WNDWDTH + TAX + LDA #$A0 +CLEOL4A STA (BASL),Y + INY + INX + BNE CLEOL4A + RTS +CLEARDSP LDX #6 CLEAR DISPLAY WINDOW +CLRDSP1 LDA DSPTOP + BPL CLRDSP2 HOLD TOP OF DISPLAY + LDA #0 0 <= TOP <= 18. +CLRDSP2 CMP #18 + BCC CLRDSP3 + LDA #18 +CLRDSP3 STA DSPTOP + STA CV CLEAR 6 LINE DISPLAY + DEC CV FROM DSPTOP DOWN AND + TXA SET CV SO INSTDSP WILL + BEQ RTS4A PRINT AT DSPTOP UPON +CLRDSP4 JSR CROUT EXIT. + PHX + JSR CLREOL + PLX + DEX + BNE CLRDSP4 + BEQ CLRDSP1 +RTS4A RTS +FWAIT LDA #$FF +WAIT SEC +WAIT2 PHA +WAIT3 SBC #$01 + BNE WAIT3 + PLA + SBC #$01 + BNE WAIT2 + RTS +NXTA4 INC A4L INCREMENT A4 + BNE NXTA1 + INC A4H +NXTA1 LDA A1L + CMP A2L + LDA A1H + SBC A2H + INC A1L + BNE RTS4B + INC A1H +RTS4B RTS CARRY SET IF A1 >= A2 +CTRLC LDY KBD CTRL-G = BREAK TO MONITOR + BPL RTS4B + STY KBDSTRB + CPY #$97 CTRL-W = PAUSE + BNE CTLC +KYWAIT LDY PB0 F(S) ENTRY POINT + BMI KYWT2 + LDY KBD + BPL KYWAIT + STY KBDSTRB + DFB $2C +KYWT2 LDY #0 0 = OPEN APPLE PRESSED +CTLC CPY #$87 + BNE RTS4B + JMP MONZ +RDKEY STY YSAV1 + LDY RDSCR + PHP + LDY RDPAGE2 + PHP + STA INHPAGE2 + STA LOWSCR + PHX + LDA CH + BIT RD80VID + BPL KEY2 + LSR A + BCS KEY2 + STA HISCR +KEY2 TAY + LDA (BASL),Y + PHA + EOR #$80 + BIT #$20 + BNE KEY3 + EOR #$40 +KEY3 STA (BASL),Y +KEY4 LDX KBD + BPL KEY4 + STA KBDSTRB + PLA + STA (BASL),Y + STA LOWSCR + TXA + JMP ENDHOOK +NOTCR LDA IN,X LABEL MARKS 'IN' + JSR COUT + CMP #$88 + BEQ BCKSPC + CPX #34 BEEP ON LAST 4 CHAR. + BCC NOTCR1 + JSR BELL +NOTCR1 INX + CPX #38 38 CHARACTERS ALLOWED + BCC NXTCHAR + LDA #$DC + JSR COUT +GETLNZ JSR CROUT + LDA PROMPT + JSR COUT + LDX #$01 +BCKSPC TXA + BEQ GETLNZ + DEX +NXTCHAR JSR RDKEY + CMP #$95 + BEQ NXTCHAR IGNORE '->' + CMP #$FF + BNE NOTDEL + LDA #$88 DELETE KEY = BACKSPACE +NOTDEL CMP #$88 + BNE CAPTST + PHA + JSR COUT BACKSPACE + JSR OUTSP DELETE CHARACTER + PLA BACKSPACE +CAPTST CMP #$E0 + BCC ADDINP + AND #$DF +ADDINP STA IN,X + CMP #$8D + BNE NOTCR +CROUT LDA #$8D + BNE COUTGO +OUTSP LDA #$A0 + BNE COUTGO +PRA1 LDY A1H + LDX A1L +PRYX2 JSR CROUT + JSR PRNTYX + LDY #$00 + LDA #$AD +COUTGO JMP COUT +ASC SEC F(") +XAM ROR A CARRY INTO BIT 7 + STA A3H + BRA XAM1 +MOD8CHK LDA A1L + AND #$07 + BNE DATAOUT +XAM1 JSR PRA1 F(.) A1.A2 HEX OR ASC +DATAOUT JSR OUTSP + LDA A1H SEE IF ZERO PAGE + BNE XAM2 + LDA A1L + SEC + SBC #PCL + BCC XAM2 TAKEN IF A1L < PCL + TAX ELSE GET FROM ZBUF + LDA ZBUF,X + BRA XAM3 +XAM2 JSR A1PCX + JSR PEEK +XAM3 LDX A3H + BPL XAM4 + ORA #$80 XAM IN ASC + CMP #$A0 + BCS PRASC TAKEN IF NORM. OR LCASE + LDA #$A0 SPACE FOR CTRL OR INV +PRASC JSR COUT + BRA XAM5 +XAM4 JSR PRBYTE XAM IN HEX +XAM5 JSR NXTA1 + BCC MOD8CHK CARRY CLEAR IF A1 ZFLG:D5 + STA ZFLG +RST2 JSR INITXQTS + STZ TFLG + STZ JFLG +TXTMON JSR TEXT + JSR HOME + JSR PRTITLE + BRA MONZ +ERRMON LDA ERRFLG IF ERROR, 'ERR' ON BRK + BEQ MON +PRERR LDX #4 PRINT 'ERR' +ERROUT LDA ERRMSG,X + JSR COUT + DEX + BPL ERROUT +MON CLD + JSR BELL +MONZ LDX #STKLMT + TXS + DEC BRKADDR+1 INSURE BRKPOINT CLEARED + JSR ZSWAPE MAKE SURE ANALYST 0 PAGE. + JSR CHKVID MATCH HOOKS W/DISPLAY MODE + JSR STPRMPT + JSR GETLNZ + JSR ZMODE + STZ ERRFLG CLEAR ERROR FLAG + STZ DSPTOP DISPLAY AT TOP +NXTITM JSR GETNUM HANDLE HEX DIGS TO 1ST + STY YSAV NON-HEX CHAR+1 (Y=INDX) + LDY #SUBTBL-CHRTBL +CHRSRCH DEY ACC = F(ACC) + BMI PRERR + CMP CHRTBL,Y + BNE CHRSRCH + JSR TOSUB +NEXTITM LDY YSAV + BRA NXTITM +DIG LDX #$03 HEX DIGIT NOW IN ACC LO + ASL A NIBBLE. KEYS 0-9=00-09 + ASL A KEYS A-F=FA-FF. MOVE + ASL A LO NIBBLE TO HI NIBBLE + ASL A +NXTBIT ASL A 4 BIT HEX DIG. INTO A2L + ROL A2L A2L TO A2H + ROL A2H + DEX + BPL NXTBIT +NXTBAS LDA MODE + BNE NXTBS2 IF MODE=0 COPY + LDA A2H,X A2 TO A1 & A3 + STA A1H,X + STA A3H,X +NXTBS2 INX + BEQ NXTBAS + BNE NXTCHR +GETNUM LDX #0 + STX A2L + STX A2H +NXTCHR LDA IN,Y F(ACC) = ACC EOR $B0 + INY ADC $88 (CARRY SET) + EOR #$B0 KEYS 0-9=$00-09 + CMP #$0A + BCC DIG TAKEN IF KEYS 0-9 + ADC #$88 KEYS A-F=$FA-FF + CMP #$FA + BCS DIG TAKEN IF KEYS A-F + RTS +TOSUB TYA # OF FUNCTION (START=0) + ASL A MULT BY 2 + TAY + LDA SUBTBL+1,Y + PHA + LDA SUBTBL,Y + PHA + LDA MODE OLD MODE FOR F(CR)&F( ) +ZMODE LDY #$00 + STY MODE + RTS RTS TO SUBROUTINE +EXECJSR LDA JFLG F(J) + BNE GOJSR +ERRJ JMP PRERR F(J) ATTEMPTED W/O JSR! +GOJSR LDY YSAV GET # OF PARM BYTES + JSR GETNUM + DEY + STY YSAV + LDA A2H + BNE ERRJ + LDA A2L + CMP #10 + BCS ERRJ ONLY 9 PARM BYTES MAX + TAY SAVE BYTE COUNT +GOPC LDX #17 +XQINIT2 LDA INITBL2,X FILL DUMMY BLOCK + STA XQT,X + DEX + BPL XQINIT2 + LDA PCL MOVE JSR ADDR TO XQT +XQLOC1 STA XQT+1 + LDA PCH + STA XQT+2 + LDX SPNT SET PC = PARM LIST - 1 + INX + LDA STACK,X + STA PCL + INX + LDA STACK,X + STA PCH + STX SPNT + TYA GET PARM BYTES + TAX + BEQ MVPRM1 NO PARM BYTES TO MOVE +MOVPARM JSR YPEEK MOVE PARM LIST TO DUMMY + STA XQT+2,Y + DEY + BNE MOVPARM +MVPRM1 INX + TXA ADJ PC TO POINT TO INST + CLC FOLLOWING PARM LIST + JSR PCADJAP + JMP XQJ EXECUTE JSR IMMED. MODE +INITBL2 JSR $0000 DUMMY BLOCK FOR F(J) + NOP 9 NOP'S FOR PARM BYTES + NOP + NOP + NOP + NOP + NOP + NOP + NOP + NOP + JSR XQTS+36 RESTORE ANALYST R/W + JMP JRTS +JRTS JSR SAVE + JSR CHKVID + LDA JFLG + BEQ JRTS3 DURING 'G0' W/O BREAK + STZ JFLG + LDA TFLG + BEQ JRTS2 DURING 'STEP' + JMP TRACE5 DURING TRACE IMMEDIATE +JRTS2 DEC DSPTOP UPDATE REGDSP AFTER JSR. +JRTSX JSR CLEARDSP 'SKIP' ENTERS HERE + JMP NXTPC +JRTS3 JMP NEXTITM +FIND LDA #$FF F(CTRL-F) A4 ALONE EXITS + JMP STPRMPT VIA NEXTITM +MINI2 JSR GETNUM + CMP #$93 F(:) +A1TOPC BNE ERROR + TXA + BEQ ERROR + JSR A1PCLP +RDMNEM LDA #$03 INDEX FOR 3 CHAR MNEM + STA A1H +RDMNEM2 JSR CHARIN + ASL A + SBC #$BE + CMP #$C2 LESS THAN 'A' + BCC ERROR NOT ASC LETTER SO ERR + ASL A + ASL A + LDX #$04 INDEX FOR 5 BITS +RDMNEM3 ASL A MOVE 5 BIT LETTER CODE + ROL A4L (* 3 LETTERS) INTO A4. + ROL A4H 26 LETTERS REQ. 5 BITS + DEX + BPL RDMNEM3 + DEC A1H + BEQ RDMNEM3 + BPL RDMNEM2 + LDX #$05 INDEX FOR 6 FORMAT BITS +RDFMT JSR CHARIN + STY YSAV + CMP CHAR1,X + BNE RDFMT2 + JSR CHARIN + CMP CHAR2,X + BEQ RDADDR + LDA CHAR2,X + BEQ RDFMT3 + CMP #$A4 + BEQ RDFMT3 + LDY YSAV +RDFMT2 CLC +RDFMT3 DEY +RDADDR ROL A5L + CPX #$03 + BNE RDADDR3 + JSR GETNUM + LDA A2H + BEQ RDADDR2 + INX +RDADDR2 STX YSAV1 + LDX #$03 + DEY +RDADDR3 STX A1H + DEX + BPL RDFMT + LDA A5L + ASL A + ASL A + ORA YSAV1 + CMP #$20 + BCS RDADDR4 + LDX YSAV1 + BEQ RDADDR4 + ORA #$80 +RDADDR4 STA A5L + STY YSAV + LDA IN,Y + CMP #$8D + BEQ DISAS + JMP A1TOPC +DISAS JMP DSS +CHARIN LDA IN,Y + INY + CMP #$A0 + BEQ CHARIN +ENDMINI RTS +RELOC LDA STARTLOC+1 F(R) + STA PCH + STZ PCL MAKE SURE ANALYST IS + JSR PEEK BEING READ FOR MOVE + CMP #$4C BY PEEKING START BYTE. + BNE ENDMINI DO NOT RELOCATE! + LDA A1H + STA A4H + PHA + STZ A4L + LDA STARTLOC+1 + STA A1H + STA A5L + STZ A1L + LDA NOTCR+2 LOCATION OF 'IN' + STA A2H WHICH MARKS END. + LDA NOTCR+1 + STA A2L + LDA A1H CALC DIFFERENCE BETWEEN + SEC OLD & NEW ORG + SBC A4H + STA A5H + LDA #AUXV-SUBTBL + LSR A DIVIDE BY 2 + TAY # OF WORDS + LDX #$FF +RELOC2 INX CONVERT SUBTBL WORDS + INX + LDA SUBTBL,X + SEC + SBC A5H + STA SUBTBL,X + DEY + BNE RELOC2 + LDA #$60 PUT IN RTS TO DISABLE + STA AUXV AUX LOADER. NOT MOVED. + JSR MOVE NEW ORG 80 +CHK80 BCC SET40 80 -> 40 +RTS7 RTS +SETVID LDY YSAV F(@) + LDA IN,Y + INC YSAV + CMP #$B4 '4' + BEQ SET40 + CMP #$B8 '8' + BEQ SET80 + DEC YSAV @ ALONE +TEXT LDA OUTVECT + STA CSWL + LDA OUTVECT+1 + STA CSWH + STA INHPAGE2 FOR AUX TO DISPLAY TEXT. + STA TXTSET + LDA RD80VID SET 40 OR 80 COL + BPL SET40 TEXT BASED ON RD80VID +SET80 LDA #$FF + STA FLG8 + LDA #80 + STA WNDWDTH + BIT RD80VID + BMI SET8D + STA SET80VID + LDA #$00 +SET8A PHA + JSR VTABZ + LDY #$00 +SET8B LDA (BASL),Y + TAX + PHY + TYA + LSR A + TAY + BCS SET8C + STA HISCR +SET8C TXA + STA (BASL),Y + PLY + STA LOWSCR + INY + CPY #$28 + BCC SET8B + TYA + JSR CLEOLZ + PLA + INC A + CMP #$18 + BCC SET8A +SET8D BRA SETDONE +SET40 STZ FLG8 + BIT RD80VID + BPL SET4D + STA CLR80VID + LDA #$00 +SET4A PHA + JSR VTABZ + LDY #$27 +SET4B TYA + LSR A + PHY + TAY + BCS SET4C + STA HISCR +SET4C LDA (BASL),Y + PLY + STA LOWSCR + STA (BASL),Y + DEY + BPL SET4B + PLA + INC A + CMP #$18 + BCC SET4A +SET4D LDA #40 + STA WNDWDTH + LDA #$27 + CMP CH + BCS SETDONE + STA CH +SETDONE JMP VTAB +HELP LDY #0 F(?) LIST LAST 16 PC +HLP2 LDA PCBUF,Y ADDRESSES EXECUTED + INY DURING TRACE. + LDX PCBUF,Y + INY + JSR PRNTAX + CPY PCPNT + BNE HLP3 + LDA #$BC + JSR COUT +HLP3 JSR CROUT + CPY #32 + BCC HLP2 + RTS +PRTITLE LDX #$00 F(V). PRINT TITLE +TITLLOC LDA TITLE,X + BEQ PRADDR + JSR COUT + INX + BRA TITLLOC +PRADDR LDA STARTLOC+1 PRINT ORIGIN ADDRESS + JSR PRBYTE + LDA #0 + JSR PRBYTE + JMP CROUT + SKP 1 +*** PROGRAM DATA AREA *** + SKP 1 +TITLE DFB $8D + ASC "ANALYST DEBUG" + DFB $8D TITLE MARKS START OF PDA + ASC "ORG = " +BANKORG ASC "$" + DFB $00 +MNEML DFB 28,138 + DFB 28,35,93,139,27,161,157,138 + DFB 29,35,157,139,29,161,28,41 + DFB 25,174,105,168,25,35,36,83 + DFB 27,35,36,83,25,161,173,26 + DFB 165,91,165,172,139,138,174,174 + DFB 168,173,41,138,124,139,21,156 + DFB 109,156,165,105,41,83,132,19 + DFB 52,17,165,105,35,160 +MNEMR DFB 216,98 + DFB 90,72,38,98,148,136,84,68 + DFB 200,84,104,68,232,148,196,180 + DFB 8,132,116,180,40,110,116,244 + DFB 204,74,114,242,164,138,6,170 + DFB 118,162,116,198,116,116,68,104 + DFB 178,50,178,114,34,114,26,26 + DFB 38,38,114,114,136,200,196,202 + DFB 38,72,68,68,162,200 +CHAR1 DFB 172,169,172,163,168,164 +CHAR2 DFB 217,0,216,164,164,0 +CHAR3 ASC "CZIDB-VN" +RTBL ASC "AXY" +ERRMSG DFB $8D + ASC 'RRE' + DFB $8D +PAGEFIL EQU >* + DS $FF-PAGEFIL,0 +ROMFLG DFB 1 TRACE JSR ROM $D000-FFFF +FMT2 DFB 0,33,129,130,90,73,89,77 + DFB 145,146,134,74,133,157 +FMT1 DFB 240,34,0,51,93,130,0,147 + DFB 243,34,0,51,93,136,0,153 + DFB 240,47,0,51,93,143,0,159 + DFB 240,34,0,59,93,136,0,148 + DFB 253,34,0,51,93,200,0,147 + DFB 17,34,0,51,93,200,0,169 + DFB 241,34,0,51,93,143,0,159 + DFB 241,34,0,51,93,143,0,159 + DFB 38,49,135,154 +OPC65C DFB 18,50,82,114 + DFB 146,178,210,242,58,26,137,28 + DFB 20,122,90,156,100,158,116,124 + DFB 60,52 + DFB 76,164,172,180,188,196,204,228 + DFB 236 +REPL65C DFB 17,49,81,113,145,177 + DFB 209,241,194,226,52,164,172,196 + DFB 228,92,92,92,92,124,60,52 + DFB 124,160,160,160,160,192,192 + DFB 224,224 +CHRTBL DFB 152,249,177,241,3,236 + DFB 166,164,6,149,5 + DFB 0,147,2,167,198,153 + DFB 155,154,239,233,1,191 + DFB 168,237,158,235,197 +SUBTBL DW HELP-1 F(?) LIST PC'S TRACED + DW SETVID-1 F(@) SWITCH 40/80 COL + DW AUXV-1 F(CTRL-X) MOVE TO AUX + DW AUXRW-1 F(X) MAIN/AUX $200-BFFF + DW EXECJSR-1 F(J) EXECUTE JSR + DW STEP-1 F(S) STEP + DW SETMODE-1 F(-) 16 BIT SUBTRACTION + DW SETMODE-1 F(+) 16 BIT ADDITION + DW MOVE-1 F(M) MOVE + DW LT-1 F(<) COPY A2 TO A4 & A5 + DW LIST-1 F(L) LIST DISASSEMBLY + DW GO-1 F(G) GO + DW SETMODE-1 F(:) STORE + DW SETREG-1 F(I) SET INTERNAL PC/REG + DW SETMODE-1 F(.) XAM + DW CRMON-1 F(CR) HANDLE CR + DW BLANK-1 F( ) HANDLE SPACES + DW ASC-1 F(") DUMP IN ASCII + DW MINI-1 F(!) MINI-ASSEMBLER + DW PRTITLE-1 F(V) PRINT TITLE + DW SETPRNT-1 F(P) TO PRINTER + DW LOAD-1 F(H) LOAD FOR HSF + DW FIND-1 F(CTRL-F) HEX SEQ. FIND + DW SETDOS-1 F(/) SET DOS CALL JSR #. + DW TRACE-1 F(T) TRACE + DW BINARY-1 F(%) VALUE IN BINARY + DW RELOC-1 F(R) RELOCATOR + DW CRMON-1 HANDLE CTRL-L AS CR +OUTVECT DW VIDOUT +STARTLOC DW START + SKP 1 +* DYNAMIC PROGRAM AREA * + SKP 1 +AUXV JMP AUXLOAD F(CTRL-X) ONE TIME VECTOR +CSWL DS 1 ADDR. OF OUTPUT ROUTINE +CSWH DS 1 +TFLG DS 1 <>0 = CANCEL COUT FOR TRC +JFLG DS 1 SET TO ALLOW F(J) +DOSCALL DS 2,255 SUBROUTINE TO JSR IMMED. +ERRFLG DS 1 SET FOR BAD OPCODE +PCREG DS 2,0 +ACC DFB 0 DON'T CHANGE ORDER +XREG DFB 0 OF ACC TO SPNT +YREG DFB 0 +STATUS DFB 0 +SPNT DFB $F0 +SREF DFB $F0 STACK REF SET BY TXS OPC +LMNEM DS 1 +RMNEM DS 1 +LENGTH DS 1 +FORMAT DS 1 +MODE DS 1 +FLG8 DS 1 FF = 80 COL, 0 = 40 COL +WNDWDTH DS 1 +PROMPT DS 1 +CH DS 1 +CV DS 1 +DSPTOP DS 1 TOP OF DISPLAY FOR STEP +YSAV DS 1 +YSAV1 DS 1 +PCPNT DFB 0 INDEX TO PCBUF +BRKADDR DS 2,255 BREAK FOR STEP,TRACE,LIST +ZBUF DS $100-PCL PAGE ZERO STORAGE BUFFER +IN DS 38,0 KEYIN BUFFER. RELOC LABEL. +TEMP1 EQU IN+12 FOR INSTDSP AND STEP. +TEMP2 EQU IN+13 FOR STEP. +TEMP3 EQU IN+14 FOR STEP. +TEMP4 EQU IN+15 FOR STEP. +TEMP5 EQU IN+16 FOR STEP. +PCFLG EQU IN+17 PRNTPC ON/OFF FOR TRACE +COUNTER EQU IN+18 FOR TRACE +PCBUF DS 32 32 BYTE PC SAVE AREA. +AUXLOAD LDA #>START F(CTRL-X) MOVE ANALYST + STA MA1 TO AUX. THIS CODE NOT + STA MA4 RELOCATEABLE. + LDA #AUXLOAD + STA MA2 + LDA #- * +* * +* 128K VERSION XP * +* * +* 2/07/05 * +* * +********************************* + SKP 1 +*** COMMANDS *** + SKP 1 +; CTRL-F FIND HEX SEQUENCE DEFINED BY F(H) +; G GO EXECUTE IN IMMEDIATE MODE +; H LOAD BYTES FOR HSF F(CTRL-F) BY USING H: +; I DISPLAY/SET PC/INTERNAL A,X,Y,P,S REGISTERS +; J JUMP. EXECUTE JSR INSTRUCTION IN STEP MODE +; CTRL-L CLEAR PRESENT SCREEN AND HOME CURSOR +; L LIST DISASSEMBLY OR LOOP IN TRACE MODE. +; M MOVE BLOCK OF MEMORY +; P SEND OUTPUT TO PRINTER +; R RELOCATE ANALYST TO NEW ADDRESS PAGE +; S ENTER STEP MODE. STEP INSTRUCTION +; T TRACE PROGRAM +; V PRINT ANALYST VERSION# AND ORIGIN ADDRESS. +; CTRL-X MOVE ANALYST TO AUX. DISABLED AFTER USE. +; X SKIP INSTRUCTION DURING STEP. TOGGLE MAIN/AUX +; " DUMP MEMORY IN ASCII +; / SET OR PRINT SUBROUTINE TO JSR IMMED MODE +; % PRINT ADDRESS DATA VALUE IN BINARY +; ? PRINT LAST 16 PC'S EXEC'D DURING TRACE +; @ SET TEXT 40/80 COL SCREEN +; < RANGE DELIMITER +; . RANGE DELIMITER +; + 16 BIT ADDITION +; - 16 BIT SUBTRACTION +; : STORE VALUE IN MEMORY +; ! ENTER MINI-ASSEMBLER. ALONE TO EXIT + SKP 1 +*** ROM ZERO PAGE EQUATES *** + SKP 1 +MCSWL EQU $36 +MCSWH EQU $37 +MA1 EQU $3C +MA2 EQU $3E +MA4 EQU $42 + SKP 1 +*** ANALYST EQUATES *** + SKP 1 +PCL EQU $EF LABEL MARKS PAGE 0 +PCH EQU $F0 +BASL EQU $F1 +BASH EQU $F2 LABEL USED AS IDENTIFIER +ZFLG EQU $F3 1 BYTE ID = $AA +A1L EQU $F4 A1L-A5H MUST BE IN ORDER +A1H EQU $F5 FOR MINI-ASSEMBLER +A2L EQU $F6 +A2H EQU $F7 +A3L EQU $F8 +A3H EQU $F9 +A4L EQU $FA +A4H EQU $FB +A5L EQU $FC +A5H EQU $FD +BAS2L EQU $FE +BAS2H EQU $FF LABEL MARKS END OF PAGE 0 +WARMV EQU $0102 WARM REENTRY +XQTS EQU WARMV+6 EXEC AREA FOR STEP, TRACE +YPOKE EQU XQTS+21 +PEEK EQU XQTS+29 +YPEEK EQU XQTS+31 +XQT EQU XQTS+50 18 BYTES +PCBUF EQU XQT+18 32 BYTE PC SAVE AREA. +IN EQU PCBUF+32 KEYIN BUFFER. 38 BYTES. +MLI EQU $BF00 PRODOS INTERFACE + SKP 1 +*** ROM EQUATES *** + SKP 1 +KBD EQU $C000 +INHPAGE2 EQU $C001 AUX $400-7FF SHOWS TEXT +MAINRD EQU $C002 +MAINWR EQU $C004 +CLR80VID EQU $C00C +SET80VID EQU $C00D +KBDSTRB EQU $C010 +RDAUXZP EQU $C016 BMI IF AUXZP +RDPAGE2 EQU $C018 BMI IF INHPAGE2 ON +RDTEXT EQU $C01A BMI IF TEXT MODE +RDSCR EQU $C01C BMI IF DPAGE2 ON +RD80VID EQU $C01F BMI IF 80 COL MODE +SPKR EQU $C030 +TXTSET EQU $C051 +LOWSCR EQU $C054 +HISCR EQU $C055 +PB0 EQU $C061 OPEN APPLE KEY +PB1 EQU $C062 CLOSED APPLE KEY +SWITCH2 EQU $C082 +AUXMOVE EQU $C311 +OUTPORT EQU $FE95 USED TO SET PRINTER +IDROM EQU $E000 = $4C IF ROM PRESENT + SKP 3 +START JMP RESET COLD START +INSDS1 LDX PCL + LDY PCH + JSR CROUT + JSR PRYX2 + JSR OUTSP +INSDST JSR PEEK +INSDS2 LDY #$FF DETERMINE LENGTH OF + STY LMNEM INSTRUCTION. OPCODE IN + TAY ACC. STORED IN LENGTH. + LSR A INVALID = 0 + BCC IEVEN 1 BYTE = 0 + ROR A 2 BYTE = 1 + BCS ERR 3 BYTE = 2 + AND #$87 +IEVEN LSR A + TAX + LDA FMT1,X + BCC RTMSKZ + LSR A + LSR A + LSR A + LSR A +RTMSKZ AND #$0F + CMP #$0F + BNE GETFMT +ERR LDY #$FF BAD OPCODE + STY ERRFLG + INY + STY LMNEM + STY RMNEM + STY FORMAT + STY LENGTH +RTS1 RTS +GETFMT TAX + LDA FMT2,X + STA FORMAT + AND #$03 + STA LENGTH + LDA TFLG BYPASS PRINT FORMATTING + BNE RTS1 IN TRACE + TYA + AND #$8F + PHA TEMP STORAGE + TYA + LDX #31 +GETFMT2 DEX + BMI MNNDX + CMP OPC65C,X MAKE SUBSTITUTION IF + BNE GETFMT2 65C02 OPCODE. + LDA REPL65C,X +MNNDX PLX + LDY #$03 + CPX #$8A + BEQ MNNDX3 +MNNDX1 LSR A + BCC MNNDX3 + LSR A +MNNDX2 LSR A + ORA #$20 + DEY + BNE MNNDX2 + INY +MNNDX3 DEY + BNE MNNDX1 + RTS +INSTDSP JSR INSDS1 + PHA +PRNTOP JSR YPEEK + JSR PRBYTE + LDX #$01 +PRNTBL JSR PRBLNK + CPY LENGTH + INY + BCC PRNTOP + LDX #$03 + CPY #$03 + BCC PRNTBL + PLA + TAY + LDA LMNEM + BEQ PRMN1 + LDA MNEML,Y + STA LMNEM + LDA MNEMR,Y + STA RMNEM +PRMN1 LDA #$00 + LDY #$05 +PRMN2 ASL RMNEM + ROL LMNEM + ROL A + DEY + BNE PRMN2 + ADC #$BF + JSR COUT + DEX + BNE PRMN1 + JSR OUTSP + LDY LENGTH + LDX #$05 +PRADR1 CPX #$02 + BEQ PRADR5 +PRADR2 ASL FORMAT + BCC PRADR3 + LDA CHAR1,X + JSR COUT + LDA CHAR2,X + BEQ PRADR3 + JSR COUT +PRADR3 DEX + BPL PRADR1 + RTS +PRADR4 DEY + BMI PRADR2 + JSR PRBYTE +PRADR5 LDA FORMAT + CMP #$E8 + JSR YPEEK + BCC PRADR4 + JSR PCADJA + TAX + INX + BNE PRNTYX + INY +PRNTYX TYA +PRNTAX JSR PRBYTE + TXA + JMP PRBYTE +PRBLNK3 LDX #3 +PRBLNK JSR OUTSP PRINT X SPACES + DEX + BNE PRBLNK + RTS +PCADJ SEC UPDATE PC BY LENGTH+1 +PCADJLP LDA LENGTH UPDATE PC BY LENGTH +PCADJAP JSR PCADJA UPDATE PC BY ACC + STA PCL + STY PCH + RTS +PCADJL LDA LENGTH SET Y,A = PC+LENGTH +PCADJA LDY PCH SET Y,A = PC+ACC + TAX + BPL PCADJ2 + DEY +PCADJ2 ADC PCL + BCC RTS2 + INY +RTS2 RTS +STEP DEC YSAV F(S) +STEPL TXA + BEQ STEPZ + JSR SETBREAK FIRST TIME + LDX #1 + BNE SSTEP ALWAYS TAKEN +STEPZ JSR KYWAIT + BNE STEP1 + INC YSAV CTRL-C = EXIT TO NEXTITM + JMP ZSWAPE VIA ZSWAPE RTS +STEP1 CPY #$CA + BNE STEP2 + LDA JFLG J = SINGLE STEP + BEQ SSTEP IF NO JSR, ELSE + JMP TRCPCS EXECUTE SUBROUTINE +STEP2 CPY #$CC L = LOOP. SET BREAK + BNE STEP2A POINT AFTER INSTRUCTION + JSR PCADJL TO BE EXECUTED NEXT + STA BRKADDR AND ENTER TRACE. + STY BRKADDR+1 + JMP STEPT +STEP2A LDA JFLG SPC = SINGLE STEP IF + BNE STEP3 NOT JSR, ELSE IGNORE + CPY #$A0 + BEQ SSTEP +STEP3 CPY #$D3 S OR OPEN APPLE = + BEQ SSTEP SINGLE STEP ALWAYS + TYA + BEQ SSTEPW = 0 FOR OPEN APPLE. + CPY #$D4 T = ENTER TRACE MODE + BNE STEP4 + LDY #$FF +STEPT STY TFLG SET TRACE MODE FLAG + STY PCFLG ENABLE PC PRINTING + JMP STRACE AND ENTER TRACE. +STEP4 CPY #$D8 X = SKIP NEXT INSTRUCTION + BNE STEP5 + STZ JFLG ENABLE SPC IF SKP WHILE + STZ ERRFLG JSR DISPLAYED ACTIVE. + JSR PCADJ CLR IN CASE SKIP ERROR. + JMP JRTSX +STEP5 CPY #$C0 @ = TEXT MODE + BNE STEPL LOOP BACK FOR INPUT + JSR TEXT +SSTEPW JSR FWAIT PAUSE TO RELEASE O/A KEY +SSTEP JSR A1PC +SSTEPT JSR CLEARDSP TRACE RE-ENTRY TO STEP + JSR INSTDSP + JSR PRBLNK3 + JSR PEEK + AND #$0F + CMP #$01 SEE IF ZERO PAGE IND + BNE SSTEPZ + LDA #$A8 '(' + JSR COUT PRINT ABSOLUTE VALUE + JSR PEEK IN PARENTHESIS + AND #$10 + BNE INDY TAKEN FOR (NN),Y. + LDX XREG FOR (NN,X). +INDY TXA X=0 FOR (NN),Y + STA TEMP1 + LDY #1 + JSR YPEEK + CLC + ADC TEMP1 + PHA + JSR ZSWAP GET PROGRAM PAGE 0 AND + PLA SAVE POINTER ADDRESS ON + TAX STACK. + LDA $01,X + PHA + LDA $00,X + PHA + JSR ZSWAP RESTORE ANALYST PAGE 0 + PLA AND RECOVER POINTER ADDR. + TAX + PLA + JSR PRNTAX + LDA #$A9 ')' + JSR COUT +SSTEPZ JMP TSTEP +PRNTPC LDA #$FF PRINT PC AT TOP OF SCREEN + STA CV BY FORCING CROUT TO INC + JSR CROUT CV TO 0 (NEED FOR 80 COL) + LDA #29 + STA CH + LDA PROMPT + JSR COUT + LDA PCH + LDX PCL + JMP PRNTAX +TRACEPC LDX PCPNT SAVE PC TO BE EXEC'D + LDA PCH IN LIST BUFFER. + STA PCBUF,X + INX + LDA PCL + STA PCBUF,X + INX + CPX #32 + BCC PNTINC + LDX #0 +PNTINC STX PCPNT + LDA PB0 + BPL TRCPC1 + LDA PCFLG O/A TOGGLES PRINT PC + EOR #$FF ON/OFF + STA PCFLG + JSR FWAIT PAUSE TO RELEASE O/A KEY +TRCPC1 LDA PCFLG + BEQ TRCPC2 BYPASS PRINTING PC. + INC COUNTER PRINT PC + BNE TRCPC2 EVERY 256 INSTRUCTIONS + LDA PROMPT FLASHING '$' FOR TRACE + EOR #$04 ACTIVITY. $A4->$A0->$A4 + STA PROMPT + JSR PRNTPC +TRCPC2 LDA JFLG + BEQ TRACE5 + LDA PCH + CMP #$C0 + BCC TRCPCD + LDY ROMFLG + BNE TRCPCD + CMP #$D0 + BCC TRCPCI + LDY IDROM JSR ROM $C000-FFFF IN + CPY #$4C IMMEDIATE MODE UNLESS + BEQ TRCPCI ROM FLAG SET <> 0. +TRCPCD CMP DOSCALL+1 TRACE THRU JSR UNLESS = + BNE TRACE5 DOS SUBROUTINE SPECIFIED + LDA PCL BY F(/). + CMP DOSCALL + BNE TRACE5 +TRCPCI LDA PCFLG EXEC JSR IMMEDIATE. DON'T + BEQ TRCPCS PRINT IF O/A TURNED OFF. + JSR SPROMPT '#' DENOTES JSR IMMED. + JSR PRNTPC PRINT EXEC SUBROUTINE + JSR DPROMPT '$' PROMPT + LDA #$FF FORCE PC PRINTING + STA COUNTER AFTER JSR IMMED. +TRCPCS LDA PCL SEE IF PC = $BF00 + BNE TRCPCG + LDA PCH + CMP # TRACE ENTRY POINT + STZ DSPTOP FOR STEP -> TRACE + JSR DPROMPT '$' PROMPT + JSR CLEARDSP +TRACE5 LDX #1 IF PC = A4 THEN ENTER STEP +TRACE6 LDA PCL,X + CMP BRKADDR,X + BNE TRACE7 + DEX + BPL TRACE6 + JSR SETBREAK CLEAR OLD BREAKPOINT + BRA TRACES +TRACE7 LDA PB1 BACK TO STEP MODE IF + BMI TRACES CLOSED APPLE PRESSED + JMP TRACE8 +TRACES STA KBDSTRB + STZ TFLG CLEAR TRACE FLAG + STZ DSPTOP RESET DISPLAY TO TOP + LDA RDTEXT SEE IF GRAPHICS MODE + BMI TRACES2 + JSR TEXT GRAPHICS -> TEXT +TRACES2 JSR STPRMPT PROMPT BACK TO OLD '#' + DEC YSAV + LDY YSAV + LDA #$D3 PUT 'S' INTO INPUT BUFFER + STA IN,Y + JMP SSTEPT RE-ENTER STEP MODE +NBRNCH JSR SAVE ALL OTHER OPCODES + BRA UPDPC +BRANCH JSR SAVE BRANCH WITH COND. MET + CLC + LDY #$01 + JSR YPEEK + JSR PCADJAP +UPDPC SEC +PCINC JSR PCADJLP +NEWPC LDA TFLG + BNE TRACEBY BYPASSES NEXTITM +NXTPC JSR CROUT + JMP REGDSP +TRACEBY JMP TRACEPC +XJMPATX INX + BNE XJMPAT +XJSR STA JFLG OK FOR F(J) + INC DSPTOP + CLC + JSR PCADJL SET Y,A = RTS ADDR + PHA + LDX SPNT + TYA + STA STACK,X + DEX + PLA + STA STACK,X + DEX + STX SPNT + LDY #$02 +XJMP CLC +XJMPAT JSR YPEEK + PHA + DEY + JSR YPEEK + STA PCL + PLA + STA PCH + BCC NEWPC + DEX + BNE XJMP + LDA XREG + CLC + JSR PCADJAP + LDY #1 + BRA XJMP +TRACE8 JSR INSDST +TSTEP LDA ERRFLG IF BAD OPCODE THEN BRK + BNE XBRK + STZ JFLG DISALLOW F(J) IF NO JSR + JSR PEEK GET OPCODE + LDY LENGTH + CPY #2 CHECK ALL 3-BYTE INST + BEQ TSTEP3 + JMP TSTEP4 +TSTEP3 CMP #$20 + BEQ XJSR + CMP #$7C + BEQ XJMPATX + CMP #$4C + BEQ XJMP + CMP #$6C + BEQ XJMPAT + PHA SAVE OPCODE. + JSR YPEEK GET ADDRESS HI-BYTE. + CMP #$01 HANDLE 3-BYTE $100 REF + BNE TSTEP3X SPECIAL. + PLA ADJ STACK. + LDA STACKLOC+2 SUBSTITUTE PSUEDO-STACK + BRA XQSTK + DS 8,0 +XQST1 JSR YPEEK +XQSTK STA XQTS+3,Y + DEY + BPL XQST1 + JSR RESTORE + JMP XQTS+3 EXEC IN ANALYST R/W MODE +XBRK STZ DSPTOP + STZ TFLG + JSR CLEARDSP + JSR INSTDSP + JSR CROUT + JSR RGDSP1 + JSR BELL + JMP ZSWAPE EXIT VIA NEXTITM +TSTEP3X CMP #$C0 $C002-C005, $C008-C009 + BNE TSTEP5 AUX R/W SWITCHES HANDLE + DEY SPECIAL. + JSR YPEEK + INY + CMP #$02 + BCC TSTEP5 + CMP #$04 + BCC TSTEPRD + CMP #$06 + BCC TSTEPWR + CMP #$08 + BCC TSTEP5 + CMP #$0A + BCS TSTEP5 + STA TEMP3 + ROR A + ROR A + EOR RDAUXZP + BPL STOUT2 NO CHANGE IN ZP STATE. + JSR ZSWAP RESTORE PROGRAM ZP. + LDA TEMP3 NEW ZP STATE + LSR A ODD/EVEN 9/8 + BCS ODDNEW + LDA #9 NEW = 8 + DFB $2C +ODDNEW LDA #8 NEW = 9 + STA TEMP2 OLD STATE + LDX #0 COPY XQTS ACROSS +STKLOOP LDY TEMP2 + STA $C000,Y OLD ZP + LDA $0100,X + LDY TEMP3 + STA $C000,Y NEW ZP + STA $0100,X + INX + BEQ STKOUT + CPX #>IN+12 + BNE STKLOOP + TSX COPY ANALYST STACK ACROSS + BRA STKLOOP +TSTEPRD STA XQTS+44 SET PROGRAM READ STATE. + BRA STOUT2 +TSTEPWR STA XQTS+47 SET PROGRAM WRITE STATE. + BRA STOUT2 +STKOUT JSR ZSWAP PUT ANALYST ZP BACK. +STOUT2 PLA PULL OPC TO ADJ STACK +UPDPCGO JMP UPDPC +TSTEP4 CPY #1 + BNE LEN0 + PHA SAVE OPCODE +TSTEP5 LDA #$EA + STA XQTS+4 + STA XQTS+5 + PLA OPCODE + CMP #$80 + BNE NBRA + ORA #$10 +NBRA AND #$1F + EOR #$14 + CMP #$04 = BRANCH OFFSET + BEQ XQ2 TAKEN IF BRANCH OPCODE +XQ1 JSR YPEEK Y = LENGTH +XQ2 STA XQTS+3,Y XQT BCS BRNCH (B0 04) + DEY NOP + BPL XQ1 JMP NBRNCH (CCLR) + JSR RESTORE BRNCH JMP BRANCH (CSET) + JMP XQTS +XTSX LDX SPNT + STX XREG +XTXS LDX XREG + STX SREF +UPDSPNT STX SPNT UPDATE SPNT + BRA UPDPCGO +LEN0 CMP #$60 + BEQ XRTS + CMP #$BA + BEQ XTSX + CMP #$9A + BEQ XTXS + CMP #$40 + BEQ XBRKGO BRK FOR RTI INSTRUCTION + CMP #$00 + BNE PHCHECK +XBRKGO JMP XBRK +PHCHECK PHA SAVE OPCODE + CMP #$5A + BCC TSTEP6 + TAX + AND #$1F + CMP #$1A + BEQ STKOPC PHX,PLX,PHY,PLY + TXA +TSTEP6 AND #$9F + CMP #$08 PHA,PLA,PHP,PLP + BNE TSTEP5 +STKOPC LDX SPNT STACK OPCODES + PLA OPCODE + TAY + AND #$10 + BEQ APCODE + TYA + ASL A + BCS OPCX + ASL A + ASL A + BCS XPLY + LDA YREG XPHY + BRA PUSH +XPLY JSR PULL + STA YREG +UPDSTACK BRA UPDSPNT +OPCX ASL A + ASL A + BCS XPLX + LDA XREG XPHX + BRA PUSH +XPLX JSR PULL + STA XREG + BRA UPDSTACK +APCODE TYA + ASL A + ASL A + BMI PULLAP + BCC XPHP + LDA ACC XPHA + BRA PUSH +XPHP LDA STATUS +PUSH STA STACK,X + DEX + BNE UPDSTACK +PULLAP BCC XPLP + JSR PULL XPLA +ACCLOC STA ACC + BRA UPDSTACK +XPLP JSR PULL + STA STATUS + BRA UPDSTACK +XRTS LDX SPNT + INX +STACKLOC LDA STACK,X + STA PCL + INX + LDA STACK,X + STA PCH + STX SPNT + DEC DSPTOP + JMP PCINC +PULL INX + LDY STATUS PULL FROM STACK AFFECTS + PHY N & Z FLAGS + PLP + LDA STACK,X + PHP UPDATE N & Z + PLY + STY STATUS + RTS +YPOKEPC PHA EXECUTE STA (PCL),Y + LDA PCL + STA A3L + LDA PCH + STA A3H + PLA + JMP YPOKE +* +* XQTS IMAGE AT $102-139. INSTRUCTIONS WITH '@' ARE +* CHANGEABLE IN XQTS AREA TO SET MAIN/AUX R/W STATE. +* +INITBL JSR XQTS+36 WARMV. REAL-TIME REENTRY + JMP REENTER BY JSR $102. + JSR XQTS+43 XQTS + NOP + NOP + NOP + JMP XQTS+15 + JSR XQTS+36 + JMP BRANCH + JSR XQTS+36 XQTS+15 + JMP NBRNCH + JSR XQTS+43 YPOKE + STA (A3L),Y + JMP XQTS+36 + LDY #0 PEEK + JSR XQTS+43 YPEEK + LDA (PCL),Y + STA MAINRD @ XQTS+36. SET ANALYST + STA MAINWR @ STATE + RTS + STA MAINRD @ XQTS+43. SET PROGRAM + STA MAINWR @ STATE + RTS +* +SETBREAK LDX #1 SET BREAKPOINT TO A4 + LDA BRKADDR+1 IF GIVEN, ELSE $FFFF. + BEQ SETBRK2 BREAKPOINT GIVEN + LDA #$FF +SETBRK1 STA BRKADDR,X CLEAR OLD BREAKPOINT + DEX + BPL SETBRK1 + RTS +SETBRK2 LDA A4L,X SET BREAKPOINT + STA BRKADDR,X + DEX + BPL SETBRK2 + RTS +LOAD LDA XQLOC1+1 F(H) + LDY XQLOC1+2 SETUP A3 = XQT+1 FOR HSF + BRA A3SET BUFFER (XQT=BYTE COUNT) +SETRG1 JSR A1PC + JSR SAVEPC +SETRG2 LDA ACCLOC+1 SETUP REGS FOR F(:) + LDY ACCLOC+2 +A3SET STA A3L + STY A3H + RTS +SETREG TXA F(I) SET OR DISPLAY REGS. + BNE SETRG1 TAKEN IF PC GIVEN. + LDY YSAV + LDA IN,Y + CMP #$8D + BNE SETRG2 + LDA PCREG I DISPLAYS REGS. + STA PCL + LDA PCREG+1 + STA PCH +REGDSP JSR RGDSP1 + JMP INSTDSP WILL RTS TO NEXTITM + DS 3,0 +RGDSP1 LDX #0 +RDSP1 LDA RTBL,X + JSR COUT + LDA #$BD + JSR COUT + LDA ACC,X + JSR PRBYTE + JSR OUTSP + INX + CPX #3 + BCC RDSP1 + LDX #7 +PRFLG LDA CHAR3,X PRINT 'NV-BDIZC' + JSR COUT + DEX + BPL PRFLG + JSR CROUT + LDA #$C1 PRINT ACC IN BINARY + JSR COUT + JSR OUTEQ + LDA ACC + JSR BNDSP + JSR PRBLNK3 + LDA #$D0 PRINT STATUS IN BINARY + JSR COUT + JSR OUTEQ + LDA STATUS + JSR BNDSP + JSR CROUT + LDA #$D3 + JSR COUT + JSR OUTEQ + LDA SPNT + JSR PRBYTE + LDA #$BA + JSR COUT + LDA #$D8 + JSR COUT + JSR COUT + LDY #10 + LDX SPNT +PRNTSTK JSR OUTSP PRINT STACK BYTES FROM + CPX SREF SPNT TO SREF UP TO 10 + BEQ SAVEPC MAX. + INX + LDA STACK,X + JSR PRBYTE + DEY + BNE PRNTSTK +SAVEPC LDA PCL + STA PCREG + LDA PCH + STA PCREG+1 + RTS +BINARY JSR A1PCX F(%) PRINT VALUE AT + JSR CROUT ADDRESS IN BINARY. + JSR PEEK +BNDSP LDX #$08 INDEX FOR 8 BITS +NEXTBIT ASL A + PHA + BCS BIT1 + LDA #$30 '0' + DFB $2C SKIP NEXT INSTRUCTION +BIT1 LDA #$31 '1' + JSR COUT + PLA + DEX + BNE NEXTBIT + RTS +BELL LDY #$38 DURATION +BELL2 LDA #$2B FREQUENCY + JSR WAIT + LDA SPKR + DEY + BNE BELL2 + RTS +COUTZ JMP (CSWL) +VIDOUT BIT #$60 + BEQ CTRLCHAR + TAY + CMP #$60 + BCS VID1 + CMP #$40 + BCC VID1 + AND #$BF +VID1 LDY CH + BIT RD80VID + BPL VID3 + PHA + TYA + LSR A + BCS VID2 + STA HISCR +VID2 TAY + PLA +VID3 STA (BASL),Y + STA LOWSCR + LDY CH + INY + CPY WNDWDTH + BCS CR + STY CH +VIDRTS RTS +BACKSPC DEC CH + BPL VIDRTS + LDY WNDWDTH + DEY + STY CH +UP LDA CV + DEC A + CMP #0 + BMI VIDRTS +VTABVGO JMP VTABV +CTRLCHAR ORA #$80 + CMP #$88 + BEQ BACKSPC + CMP #$8D + BNE VIDRTS +CR LDA #$00 + STA CH + INC CV + LDA CV + CMP #24 + BCC VTABVGO + DEC CV + LDX #0 SCROLL + TXA + JSR VTABZ + BRA SCRL5 +SCRL1 LDY BASH + STY BAS2H + LDY BASL + STY BAS2L + TXA + JSR VTABZ + PHX + LDX WNDWDTH + LDY #0 +SCRL2 BIT RD80VID + BPL SCRL3 + STA HISCR + LDA (BASL),Y + STA (BAS2L),Y + DEX + BEQ SCRL4 + STA LOWSCR +SCRL3 LDA (BASL),Y + STA (BAS2L),Y + INY + DEX + BNE SCRL2 +SCRL4 STA LOWSCR + PLX +SCRL5 INX + CPX #24 + BCC SCRL1 + LDA #$00 + JSR CLEOLZ + JMP VTAB +HOME LDA #0 + STA CH + STA CV +CLS1 PHA + JSR VTABZ + LDA #0 + JSR CLEOLZ + PLA + INC A + CMP #24 + BCC CLS1 +VTAB LDA CV +VTABV STA CV +VTABZ PHA + LSR A + AND #$03 + ORA #$04 + STA BASH + PLA + AND #$18 + BCC BSCLC2 + ADC #$7F +BSCLC2 STA BASL + ASL A + ASL A + ORA BASL + STA BASL + RTS +CLREOL LDA CH +CLEOLZ BIT RD80VID + BPL CLEOL4 + PHA CLREOL 80 COL + SEC + SBC WNDWDTH + TAX + PLA + LSR A + TAY + PHP + LDA #$A0 + PLP + BCS CLEOL8B +CLEOL8A STA HISCR + STA (BASL),Y + INX + BEQ CLEOL8C +CLEOL8B STA LOWSCR + STA (BASL),Y + INY + INX + BNE CLEOL8A +CLEOL8C STA LOWSCR + RTS +CLEOL4 TAY + SEC + SBC WNDWDTH + TAX + LDA #$A0 +CLEOL4A STA (BASL),Y + INY + INX + BNE CLEOL4A + RTS +CLEARDSP LDX #6 CLEAR DISPLAY WINDOW +CLRDSP1 LDA DSPTOP + BPL CLRDSP2 HOLD TOP OF DISPLAY + LDA #0 0 <= TOP <= 18. +CLRDSP2 CMP #18 + BCC CLRDSP3 + LDA #18 +CLRDSP3 STA DSPTOP + STA CV CLEAR 6 LINE DISPLAY + DEC CV FROM DSPTOP DOWN AND + TXA SET CV SO INSTDSP WILL + BEQ RTS4A PRINT AT DSPTOP UPON +CLRDSP4 JSR CROUT EXIT. + PHX + JSR CLREOL + PLX + DEX + BNE CLRDSP4 + BEQ CLRDSP1 +RTS4A RTS +FWAIT LDA #$FF +WAIT SEC +WAIT2 PHA +WAIT3 SBC #$01 + BNE WAIT3 + PLA + SBC #$01 + BNE WAIT2 + RTS +NXTA4 INC A4L INCREMENT A4 + BNE NXTA1 + INC A4H +NXTA1 LDA A1L + CMP A2L + LDA A1H + SBC A2H + INC A1L + BNE RTS4B + INC A1H +RTS4B RTS CARRY SET IF A1 >= A2 +CTRLC LDY KBD CHECK FOR CTRL-C + BPL CTLCRTS + STY KBDSTRB + CPY #$93 CTRL-S = PAUSE + BNE CTLC +KYWAIT LDY PB0 F(S) ENTRY POINT + BMI KYWT2 + LDY KBD + BPL KYWAIT + STY KBDSTRB + DFB $2C +KYWT2 LDY #0 0 = OPEN APPLE PRESSED +CTLC CPY #$83 +CTLCRTS RTS Z SET FOR CTRL-C. +RDKEY STY YSAV1 + LDY RDSCR + PHP + LDY RDPAGE2 + PHP + STA INHPAGE2 + STA LOWSCR + PHX + LDA CH + BIT RD80VID + BPL KEY2 + LSR A + BCS KEY2 + STA HISCR +KEY2 TAY + LDA (BASL),Y + PHA + EOR #$80 + BIT #$20 + BNE KEY3 + EOR #$40 +KEY3 STA (BASL),Y +KEY4 LDX KBD + BPL KEY4 + STA KBDSTRB + PLA + STA (BASL),Y + STA LOWSCR + TXA + JMP ENDHOOK +NOTCR LDA IN,X + JSR COUT + CMP #$88 + BEQ BCKSPC + CPX #34 BEEP ON LAST 4 CHAR. + BCC NOTCR1 + JSR BELL +NOTCR1 INX + CPX #38 38 CHARACTERS ALLOWED + BCC NXTCHAR + LDA #$DC + JSR COUT +GETLNZ JSR CROUT + LDA PROMPT + JSR COUT + LDX #$01 +BCKSPC TXA + BEQ GETLNZ + DEX +NXTCHAR JSR RDKEY + CMP #$95 + BEQ NXTCHAR IGNORE '->' + CMP #$FF + BNE NOTDEL + LDA #$88 DELETE KEY = BACKSPACE +NOTDEL CMP #$88 + BNE CAPTST + PHA + JSR COUT BACKSPACE + JSR OUTSP DELETE CHARACTER + PLA BACKSPACE +CAPTST CMP #$E0 + BCC ADDINP + AND #$DF +ADDINP STA IN,X + CMP #$8D + BNE NOTCR +CROUT LDA #$8D + BNE COUTGO +OUTSP LDA #$A0 + BNE COUTGO +PRA1 JSR CROUT + LDY A1H + LDX A1L +PRYX2 JSR PRNTYX + LDY #$00 + LDA #$AD +COUTGO JSR COUT +PRA1RTS RTS +ASC SEC F(") +XAM ROR A CARRY INTO BIT 7 + STA A3H + BRA XAM1 +MOD8CHK LDA A1L + AND #$07 + BNE DATAOUT +XAM1 JSR CTRLC F(.) A1.A2 HEX OR ASC + BEQ PRA1RTS + JSR PRA1 +DATAOUT JSR OUTSP + LDA A1H SEE IF ZERO PAGE + BEQ XAMZ + DEC A SEE IF $01NN + BNE XAM2 + LDA A1L GET $01NN FROM STACK,NN + TAX + LDA STACK,X + BRA XAM3 +XAMZ LDA A1L + SEC + SBC #PCL + BCC XAM2 TAKEN IF A1L < PCL + TAX ELSE GET FROM ZBUF + LDA ZBUF,X + BRA XAM3 +XAM2 JSR A1PCX + JSR PEEK +XAM3 LDX A3H + BPL XAM4 + ORA #$80 XAM IN ASC + CMP #$A0 + BCS PRASC TAKEN IF NORM. OR LCASE + LDA #$A0 SPACE FOR CTRL OR INV +PRASC JSR COUT + BRA XAM5 +XAM4 JSR PRBYTE XAM IN HEX +XAM5 JSR NXTA1 + BCC MOD8CHK CARRY CLEAR IF A1 ZFLG:AA + STA ZFLG +RST2 JSR INITXQTS + STZ TFLG + STZ JFLG +TXTMON JSR TEXT + JSR HOME + JSR PRTITLE +MONZ STZ ERRFLG + DEC BRKADDR+1 INSURE BRKPOINT CLEARED + JSR CHKVID MATCH HOOKS W/DISPLAY MODE + JSR STPRMPT + JSR GETLNZ + JSR ZMODE + STZ DSPTOP DISPLAY AT TOP +NXTITM JSR GETNUM HANDLE HEX DIGS TO 1ST + STY YSAV NON-HEX CHAR+1 (Y=INDX) + LDY #SUBTBL-CHRTBL +CHRSRCH DEY ACC = F(ACC) + BMI SYNERR + CMP CHRTBL,Y + BNE CHRSRCH + PHY + JSR TOSUB + PLY + BEQ MONZ 0 = OFFSET FOR F(CR) +NEXTITM LDY YSAV + BRA NXTITM +SYNERR JSR BELL + BRA MONZ +DIG LDX #$03 HEX DIGIT NOW IN ACC LO + ASL A NIBBLE. KEYS 0-9=00-09 + ASL A KEYS A-F=FA-FF. MOVE + ASL A LO NIBBLE TO HI NIBBLE + ASL A +NXTBIT ASL A 4 BIT HEX DIG. INTO A2L + ROL A2L A2L TO A2H + ROL A2H + DEX + BPL NXTBIT +NXTBAS LDA MODE + BNE NXTBS2 IF MODE=0 COPY + LDA A2H,X A2 TO A1 & A3 + STA A1H,X + STA A3H,X +NXTBS2 INX + BEQ NXTBAS + BNE NXTCHR +GETNUM LDX #0 + STX A2L + STX A2H +NXTCHR LDA IN,Y F(ACC) = ACC EOR $B0 + INY ADC $88 (CARRY SET) + EOR #$B0 KEYS 0-9=$00-09 + CMP #$0A + BCC DIG TAKEN IF KEYS 0-9 + ADC #$88 KEYS A-F=$FA-FF + CMP #$FA + BCS DIG TAKEN IF KEYS A-F + RTS +TOSUB TYA # OF FUNCTION (START=0) + ASL A MULT BY 2 + TAY + LDA SUBTBL+1,Y + PHA + LDA SUBTBL,Y + PHA + LDA MODE OLD MODE FOR F(CR)&F( ) +ZMODE LDY #$00 + STY MODE + RTS RTS TO SUBROUTINE +EXECJSR LDA JFLG F(J) + BNE GOJSR 'J' WITH NO JSR? +ERRJ JMP BELL RTS TO NEXTITM VIA BELL. +GOJSR LDY YSAV GET # OF PARM BYTES + JSR GETNUM + DEY + STY YSAV + LDA A2H + BNE ERRJ + LDA A2L + CMP #10 + BCS ERRJ ONLY 9 PARM BYTES MAX + TAY SAVE BYTE COUNT +GOPC LDX #17 +XQINIT2 LDA INITBL2,X FILL DUMMY BLOCK + STA XQT,X + DEX + BPL XQINIT2 + LDA PCL MOVE JSR ADDR TO XQT +XQLOC1 STA XQT+1 + LDA PCH + STA XQT+2 + LDX SPNT SET PC = PARM LIST - 1 + INX + LDA STACK,X + STA PCL + INX + LDA STACK,X + STA PCH + STX SPNT + TYA GET PARM BYTES + TAX + BEQ MVPRM1 NO PARM BYTES TO MOVE +MOVPARM JSR YPEEK MOVE PARM LIST TO DUMMY + STA XQT+2,Y + DEY + BNE MOVPARM +MVPRM1 INX + TXA ADJ PC TO POINT TO INST + CLC FOLLOWING PARM LIST + JSR PCADJAP + JMP XQJ EXECUTE JSR IMMED. MODE +INITBL2 JSR $0000 DUMMY BLOCK FOR F(J) + NOP 9 NOP'S FOR PARM BYTES + NOP + NOP + NOP + NOP + NOP + NOP + NOP + NOP + JSR XQTS+36 RESTORE ANALYST R/W + JMP JRTS +JRTS JSR SAVE + JSR CHKVID + LDA JFLG + BEQ JRTS3 DURING 'G0' W/O BREAK + STZ JFLG + LDA TFLG + BEQ JRTS2 DURING 'STEP' + JMP TRACE5 DURING TRACE IMMEDIATE +JRTS2 DEC DSPTOP UPDATE REGDSP AFTER JSR. +JRTSX JSR CLEARDSP 'SKIP' ENTERS HERE + JMP NXTPC +JRTS3 RTS RTS TO NEXTITM. +FIND LDA #$FF F(CTRL-F) A4 ALONE EXITS + JMP STPRMPT VIA NEXTITM +MINI2 JSR GETNUM + CMP #$93 F(:) +A1TOPC BNE ERROR + TXA + BEQ ERROR + JSR A1PCLP +RDMNEM LDA #$03 INDEX FOR 3 CHAR MNEM + STA A1H +RDMNEM2 JSR CHARIN + ASL A + SBC #$BE + CMP #$C2 LESS THAN 'A' + BCC ERROR NOT ASC LETTER SO ERR + ASL A + ASL A + LDX #$04 INDEX FOR 5 BITS +RDMNEM3 ASL A MOVE 5 BIT LETTER CODE + ROL A4L (* 3 LETTERS) INTO A4. + ROL A4H 26 LETTERS REQ. 5 BITS + DEX + BPL RDMNEM3 + DEC A1H + BEQ RDMNEM3 + BPL RDMNEM2 + LDX #$05 INDEX FOR 6 FORMAT BITS +RDFMT JSR CHARIN + STY YSAV + CMP CHAR1,X + BNE RDFMT2 + JSR CHARIN + CMP CHAR2,X + BEQ RDADDR + LDA CHAR2,X + BEQ RDFMT3 + CMP #$A4 + BEQ RDFMT3 + LDY YSAV +RDFMT2 CLC +RDFMT3 DEY +RDADDR ROL A5L + CPX #$03 + BNE RDADDR3 + JSR GETNUM + LDA A2H + BEQ RDADDR2 + INX +RDADDR2 STX YSAV1 + LDX #$03 + DEY +RDADDR3 STX A1H + DEX + BPL RDFMT + LDA A5L + ASL A + ASL A + ORA YSAV1 + CMP #$20 + BCS RDADDR4 + LDX YSAV1 + BEQ RDADDR4 + ORA #$80 +RDADDR4 STA A5L + STY YSAV + LDA IN,Y + CMP #$8D + BEQ DISAS + JMP A1TOPC +DISAS JMP DSS +CHARIN LDA IN,Y + INY + CMP #$A0 + BEQ CHARIN +ENDMINI RTS +RELOC LDA STARTLOC+1 F(R) + STA PCH + STZ PCL MAKE SURE ANALYST IS + JSR PEEK BEING READ FOR MOVE + CMP #$4C BY PEEKING START BYTE. + BNE ENDMINI DO NOT RELOCATE! + LDA A1H + STA A4H + PHA + STZ A4L + LDA STARTLOC+1 + STA A1H + STA A5L + STZ A1L + LDA AUXV+2 LOCATION OF 'AUXLOAD' + STA A2H WHICH MARKS END. + LDA AUXV+1 + STA A2L + LDA A1H CALC DIFFERENCE BETWEEN + SEC OLD & NEW ORG + SBC A4H + STA A5H + LDA #AUXV-SUBTBL + LSR A DIVIDE BY 2 + TAY # OF WORDS + LDX #$FF +RELOC2 INX CONVERT SUBTBL WORDS + INX + LDA SUBTBL,X + SEC + SBC A5H + STA SUBTBL,X + DEY + BNE RELOC2 + LDA #$60 PUT IN RTS TO DISABLE + STA AUXV AUX LOADER. NOT MOVED. + JSR MOVE NEW ORG 80 +CHK80 BCC SET40 80 -> 40 +RTS7 RTS +SETVID LDY YSAV F(@) + LDA IN,Y + INC YSAV + CMP #$B4 '4' + BEQ SET40 + CMP #$B8 '8' + BEQ SET80 + DEC YSAV @ ALONE +TEXT LDA OUTVECT + STA CSWL + LDA OUTVECT+1 + STA CSWH + STA INHPAGE2 FOR AUX TO DISPLAY TEXT. + STA TXTSET + LDA RD80VID SET 40 OR 80 COL + BPL SET40 TEXT BASED ON RD80VID +SET80 LDA #$FF + STA FLG8 + LDA #80 + STA WNDWDTH + BIT RD80VID + BMI SET8D + STA SET80VID + LDA #$00 +SET8A PHA + JSR VTABZ + LDY #$00 +SET8B LDA (BASL),Y + TAX + PHY + TYA + LSR A + TAY + BCS SET8C + STA HISCR +SET8C TXA + STA (BASL),Y + PLY + STA LOWSCR + INY + CPY #$28 + BCC SET8B + TYA + JSR CLEOLZ + PLA + INC A + CMP #$18 + BCC SET8A +SET8D BRA SETDONE +SET40 STZ FLG8 + BIT RD80VID + BPL SET4D + STA CLR80VID + LDA #$00 +SET4A PHA + JSR VTABZ + LDY #$27 +SET4B TYA + LSR A + PHY + TAY + BCS SET4C + STA HISCR +SET4C LDA (BASL),Y + PLY + STA LOWSCR + STA (BASL),Y + DEY + BPL SET4B + PLA + INC A + CMP #$18 + BCC SET4A +SET4D LDA #40 + STA WNDWDTH +SETDONE JMP VTAB +HELP LDY #0 F(?) LIST LAST 16 PC +HLP2 LDA PCBUF,Y ADDRESSES EXECUTED + INY DURING TRACE. + LDX PCBUF,Y + INY + JSR PRNTAX + CPY PCPNT + BNE HLP3 + LDA #$BC + JSR COUT +HLP3 JSR CROUT + CPY #32 + BCC HLP2 + RTS +PRTITLE LDX #$00 F(V). PRINT TITLE +TITLLOC LDA TITLE,X + BEQ PRADDR + JSR COUT + INX + BRA TITLLOC +PRADDR LDA STARTLOC+1 PRINT ORIGIN ADDRESS + JSR PRBYTE + LDA #0 + JSR PRBYTE + JMP CROUT + SKP 1 +*** PROGRAM DATA AREA *** + SKP 1 +TITLE DFB $8D + ASC "ANALYST 128XP" + DFB $8D TITLE MARKS START OF PDA + ASC "ORG = " +BANKORG ASC "$" + DFB $00 +MNEML DFB 28,138 + DFB 28,35,93,139,27,161,157,138 + DFB 29,35,157,139,29,161,28,41 + DFB 25,174,105,168,25,35,36,83 + DFB 27,35,36,83,25,161,173,26 + DFB 165,91,165,172,139,138,174,174 + DFB 168,173,41,138,124,139,21,156 + DFB 109,156,165,105,41,83,132,19 + DFB 52,17,165,105,35,160 +MNEMR DFB 216,98 + DFB 90,72,38,98,148,136,84,68 + DFB 200,84,104,68,232,148,196,180 + DFB 8,132,116,180,40,110,116,244 + DFB 204,74,114,242,164,138,6,170 + DFB 118,162,116,198,116,116,68,104 + DFB 178,50,178,114,34,114,26,26 + DFB 38,38,114,114,136,200,196,202 + DFB 38,72,68,68,162,200 +CHAR1 DFB 172,169,172,163,168,164 +CHAR2 DFB 217,0,216,164,164,0 +CHAR3 ASC "CZIDB-VN" +RTBL ASC "AXY" +FMT2 DFB 0,33,129,130,90,73,89,77 + DFB 145,146,134,74,133,157 +FMT1 DFB 240,34,0,51,93,130,0,147 + DFB 243,34,0,51,93,136,0,153 + DFB 240,47,0,51,93,143,0,159 + DFB 240,34,0,59,93,136,0,148 + DFB 253,34,0,51,93,200,0,147 + DFB 17,34,0,51,93,200,0,169 + DFB 241,34,0,51,93,143,0,159 + DFB 241,34,0,51,93,143,0,159 + DFB 38,49,135,154 +OPC65C DFB 18,50,82,114 + DFB 146,178,210,242,58,26,137,28 + DFB 20,122,90,156,100,158,116,124 + DFB 60,52 + DFB 76,164,172,180,188,196,204,228 + DFB 236 +REPL65C DFB 17,49,81,113,145,177 + DFB 209,241,194,226,52,164,172,196 + DFB 228,92,92,92,92,124,60,52 + DFB 124,160,160,160,160,192,192 + DFB 224,224 +CHRTBL DFB 198,152,249,177,241,3 + DFB 236,166,164,6,149,5 + DFB 0,147,2,167,153 + DFB 155,154,239,233,1,191 + DFB 168,237,158,235,197 +SUBTBL DW BL1-1 F(CR) MUST BE 1ST IN TBL + DW HELP-1 F(?) LIST PC'S TRACED + DW SETVID-1 F(@) SWITCH 40/80 COL + DW AUXV-1 F(CTRL-X) MOVE TO AUX + DW AUXRW-1 F(X) MAIN/AUX $200-BFFF + DW EXECJSR-1 F(J) EXECUTE JSR + DW STEP-1 F(S) STEP + DW SETMODE-1 F(-) 16 BIT SUBTRACTION + DW SETMODE-1 F(+) 16 BIT ADDITION + DW MOVE-1 F(M) MOVE + DW LT-1 F(<) COPY A2 TO A4 & A5 + DW LIST-1 F(L) LIST DISASSEMBLY + DW GO-1 F(G) GO + DW SETMODE-1 F(:) STORE + DW SETREG-1 F(I) SET INTERNAL PC/REG + DW SETMODE-1 F(.) XAM + DW BLANK-1 F( ) HANDLE SPACES + DW ASC-1 F(") DUMP IN ASCII + DW MINI-1 F(!) MINI-ASSEMBLER + DW PRTITLE-1 F(V) PRINT TITLE + DW SETPRNT-1 F(P) TO PRINTER + DW LOAD-1 F(H) LOAD FOR HSF + DW FIND-1 F(CTRL-F) HEX SEQ. FIND + DW SETDOS-1 F(/) SET DOS CALL JSR #. + DW TRACE-1 F(T) TRACE + DW BINARY-1 F(%) VALUE IN BINARY + DW RELOC-1 F(R) RELOCATOR + DW HOME-1 F(CTRL-L) CLEAR SCREEN +OUTVECT DW VIDOUT +STARTLOC DW START + SKP 1 +* DYNAMIC PROGRAM AREA * + SKP 1 +AUXV JMP AUXLOAD F(CTRL-X) ONE TIME VECTOR +CSWL DS 1 ADDR. OF OUTPUT ROUTINE +CSWH DS 1 +TFLG DS 1 <>0 = CANCEL COUT FOR TRC +JFLG DS 1 SET TO ALLOW F(J) +DOSCALL DW MLI ROUTINE TO JSR IMMED. +ERRFLG DS 1 SET FOR BAD OPCODE +PCREG DS 2,0 +ACC DFB 0 DON'T CHANGE ORDER +XREG DFB 0 OF ACC TO SPNT +YREG DFB 0 +STATUS DFB 0 +SPNT DFB $FF +SREF DFB $FF STACK REF SET BY TXS OPC +LMNEM DS 1 +RMNEM DS 1 +LENGTH DS 1 +FORMAT DS 1 +MODE DS 1 +FLG8 DS 1 FF = 80 COL, 0 = 40 COL +WNDWDTH DS 1 +PROMPT DS 1 +CH DS 1 +CV DFB 0 +DSPTOP DS 1 TOP OF DISPLAY FOR STEP +YSAV DS 1 +YSAV1 DS 1 +PCPNT DFB 0 INDEX TO PCBUF +BRKADDR DS 2,255 BREAK FOR STEP,TRACE,LIST +TEMP1 DS 1 FOR INSTDSP AND STEP. +TEMP2 DS 1 FOR STEP. +TEMP3 DS 1 FOR STEP. +PCFLG DS 1 PRNTPC ON/OFF FOR TRACE +COUNTER DS 1 FOR TRACE +ZBUF DS $100-PCL PAGE ZERO STORAGE BUFFER +PAGEFIL EQU >* + DS $FF-PAGEFIL +ROMFLG DFB 0 1 = TRACE JSR ROM $D000-FFFF +STACK DS $100,0 MUST BE ON PAGE BOUNDARY +AUXLOAD LDA #>START F(CTRL-X) MOVE ANALYST + STA MA1 TO AUX. THIS CODE NOT + STA MA4 RELOCATEABLE. + LDA #AUXLOAD + STA MA2 + LDA #- * +* * +* 128K VERSION * +* * +* 5/09/91 * +* * +********************************* + SKP 1 +*** COMMANDS *** + SKP 1 +; CTRL-F FIND HEX SEQUENCE DEFINED BY F(H) +; G GO EXECUTE IN IMMEDIATE MODE +; H LOAD BYTES FOR HSF F(CTRL-F) BY USING H: +; I DISPLAY/SET PC/INTERNAL A,X,Y,P,S REGISTERS +; J JUMP. EXECUTE JSR INSTRUCTION IN STEP MODE +; CTRL-L CLEAR PRESENT SCREEN AND HOME CURSOR +; L LIST DISASSEMBLY OR LOOP IN TRACE MODE. +; M MOVE BLOCK OF MEMORY +; P SEND OUTPUT TO PRINTER +; R RELOCATE ANALYST TO NEW ADDRESS PAGE +; S ENTER STEP MODE. STEP INSTRUCTION +; T TRACE PROGRAM +; V PRINT ANALYST VERSION# AND ORIGIN ADDRESS. +; CTRL-X MOVE ANALYST TO AUX MEMORY. DISABLED AFTER USE. +; X SKIP INSTRUCTION IN STEP MODE. TOGGLE MAIN/AUX +; " DUMP MEMORY IN ASCII +; / SET OR PRINT SUBROUTINE TO JSR IMMED MODE +; % PRINT ADDRESS DATA VALUE IN BINARY +; ? PRINT LAST 16 PC'S EXEC'D DURING TRACE +; @ SET TEXT 40/80 COL SCREEN +; < RANGE DELIMITER +; . RANGE DELIMITER +; + 16 BIT ADDITION +; - 16 BIT SUBTRACTION +; : STORE VALUE IN MEMORY +; ! ENTER MINI-ASSEMBLER. ALONE TO EXIT + SKP 1 +*** NOTES *** + SKP 1 +; F(R) RELOCATE DISABLES MINI-ASSEMBLER F(!) AND AUXLOAD +; F(CTRL-X) BECAUSE ONLY 4K MOVED. AUXLOAD MOVES ALL +; THEN DISABLES ITSELF. NEED TO USE BEFORE F(R). + SKP 1 +; INPUT BUFFER HAS 38 BYTES WHICH OVERLAPS 10 BYTES +; INTO PC SAVE BUFFER. + SKP 1 +*** ROM ZERO PAGE EQUATES *** + SKP 1 +WNDWDTH EQU $21 +MCH EQU $24 +MBASL EQU $28 +MCSWL EQU $36 +MCSWH EQU $37 +MKSWL EQU $38 +MKSWH EQU $39 +MA1 EQU $3C +MA2 EQU $3E +MA4 EQU $42 + SKP 1 +*** ANALYST EQUATES *** + SKP 1 +STKLMT EQU $80 TOP OF STACK (IMMEDIATE) +PCL EQU $EF LABEL MARKS PAGE 0 +PCH EQU $F0 +BASL EQU $F1 +BASH EQU $F2 LABEL USED AS IDENTIFIER +ZFLG EQU $F3 1 BYTE ID = $AA +A1L EQU $F4 A1L-A5H MUST BE IN ORDER +A1H EQU $F5 FOR MINI-ASSEMBLER +A2L EQU $F6 +A2H EQU $F7 +A3L EQU $F8 +A3H EQU $F9 +A4L EQU $FA +A4H EQU $FB +A5L EQU $FC +A5H EQU $FD +BAS2L EQU $FE +BAS2H EQU $FF LABEL MARKS END OF PAGE 0 +STACK EQU $0100 PRODOS USES $100 +WARMV EQU $0102 WARM REENTRY +XQTS EQU WARMV+6 EXEC AREA FOR STEP, TRACE +YPOKE EQU XQTS+21 +PEEK EQU XQTS+29 +YPEEK EQU XQTS+31 +XQT EQU XQTS+50 +MLI EQU $BF00 PRODOS INTERFACE + SKP 1 +*** ROM EQUATES *** + SKP 1 +KBD EQU $C000 +INHPAGE2 EQU $C001 AUX $400-7FF SHOWS TEXT +MAINRD EQU $C002 +MAINWR EQU $C004 +CLR80ROM EQU $C00A +CLR80VID EQU $C00C +KBDSTRB EQU $C010 +RDAUXZP EQU $C016 BMI IF AUXZP +RDPAGE2 EQU $C018 BMI IF INHPAGE2 ON +RDTEXT EQU $C01A BMI IF TEXT MODE +RDSCR EQU $C01C BMI IF DPAGE2 ON +RD80VID EQU $C01F BMI IF 80 COL MODE +SPKR EQU $C030 +TXTSET EQU $C051 +LOWSCR EQU $C054 +HISCR EQU $C055 +PB0 EQU $C061 OPEN APPLE KEY +PB1 EQU $C062 CLOSED APPLE KEY +SWITCH2 EQU $C082 +PRINIT EQU $C100 PRINTER IN SLOT 1 +PR3 EQU $C300 +AUXMOVE EQU $C311 +IDROM EQU $E000 = $4C IF ROM PRESENT +MKEYIN EQU $FD1B +MVIDOUT EQU $FDF0 + SKP 3 +*** STATIC MAIN PROGRAM AREA *** + SKP 1 +START JMP RESET COLD START +INSDS1 LDX PCL + LDY PCH + JSR PRYX2 + JSR OUTSP +INSDST JSR PEEK +INSDS2 LDY #$FF DETERMINE LENGTH OF + STY LMNEM INSTRUCTION. OPCODE IN + TAY ACC. STORED IN LENGTH. + LSR A INVALID = 0 + BCC IEVEN 1 BYTE = 0 + ROR A 2 BYTE = 1 + BCS ERR 3 BYTE = 2 + AND #$87 +IEVEN LSR A + TAX + LDA FMT1,X + BCC RTMSKZ + LSR A + LSR A + LSR A + LSR A +RTMSKZ AND #$0F + CMP #$0F + BNE GETFMT +ERR LDY #$FF BAD OPCODE + STY ERRFLG + INY + STY LMNEM + STY RMNEM + STY FORMAT + STY LENGTH +RTS1 RTS +GETFMT TAX + LDA FMT2,X + STA FORMAT + AND #$03 + STA LENGTH + LDA TFLG BYPASS PRINT FORMATTING + BNE RTS1 IN TRACE + TYA + AND #$8F + STA TEMP1 TEMP STORAGE + TYA + LDX #31 +GETFMT2 DEX + BMI MNNDX + CMP OPC65C,X MAKE SUBSTITUTION IF + BNE GETFMT2 65C02 OPCODE. + LDA REPL65C,X +MNNDX LDX TEMP1 + LDY #$03 + CPX #$8A + BEQ MNNDX3 +MNNDX1 LSR A + BCC MNNDX3 + LSR A +MNNDX2 LSR A + ORA #$20 + DEY + BNE MNNDX2 + INY +MNNDX3 DEY + BNE MNNDX1 + RTS +INSTDSP JSR INSDS1 + PHA +PRNTOP JSR YPEEK + JSR PRBYTE + LDX #$01 +PRNTBL JSR PRBLNK + CPY LENGTH + INY + BCC PRNTOP + LDX #$03 + CPY #$03 + BCC PRNTBL + PLA + TAY + LDA LMNEM + BEQ PRMN1 + LDA MNEML,Y + STA LMNEM + LDA MNEMR,Y + STA RMNEM +PRMN1 LDA #$00 + LDY #$05 +PRMN2 ASL RMNEM + ROL LMNEM + ROL A + DEY + BNE PRMN2 + ADC #$BF + JSR COUT + DEX + BNE PRMN1 + JSR OUTSP + LDY LENGTH + LDX #$05 +PRADR1 CPX #$02 + BEQ PRADR5 +PRADR2 ASL FORMAT + BCC PRADR3 + LDA CHAR1,X + JSR COUT + LDA CHAR2,X + BEQ PRADR3 + JSR COUT +PRADR3 DEX + BPL PRADR1 + RTS +PRADR4 DEY + BMI PRADR2 + JSR PRBYTE +PRADR5 LDA FORMAT + CMP #$E8 + JSR YPEEK + BCC PRADR4 + JSR PCADJA + TAX + INX + BNE PRNTYX + INY +PRNTYX TYA +PRNTAX JSR PRBYTE + TXA + JMP PRBYTE +PRBLNK3 LDX #3 +PRBLNK JSR OUTSP PRINT X SPACES + DEX + BNE PRBLNK + RTS +PCADJ SEC UPDATE PC BY LENGTH+1 +PCADJLP LDA LENGTH UPDATE PC BY LENGTH +PCADJAP JSR PCADJA UPDATE PC BY ACC + STA PCL + STY PCH + RTS +PCADJL LDA LENGTH SET Y,A = PC+LENGTH +PCADJA LDY PCH SET Y,A = PC+ACC + TAX + BPL PCADJ2 + DEY +PCADJ2 ADC PCL + BCC RTS2 + INY +RTS2 RTS +STEP DEC YSAV F(S) + PLA REMOVE RTS TO NEXTITM + PLA +STEPL TXA + BEQ STEPZ + JSR SETBREAK FIRST TIME + LDX #1 + BNE SSTEP ALWAYS TAKEN +STEPZ JSR KYWAIT CTRL-C = BREAK + CPY #$CA + BNE STEP2 + LDA JFLG J = SINGLE STEP + BEQ SSTEP IF NO JSR, ELSE + JMP TRCPCS EXECUTE SUBROUTINE +STEP2 CPY #$CC L = LOOP. SET BREAK + BNE STEP2A POINT AFTER INSTRUCTION + JSR PCADJL TO BE EXECUTED NEXT + STA BRKADDR AND ENTER TRACE. + STY BRKADDR+1 + JMP STEPT +STEP2A LDA JFLG SPC = SINGLE STEP IF + BNE STEP3 NOT JSR, ELSE IGNORE + CPY #$A0 + BEQ SSTEP +STEP3 CPY #$D3 S OR OPEN APPLE = + BEQ SSTEP SINGLE STEP ALWAYS + TYA + BEQ SSTEPW = 0 FOR OPEN APPLE. + CPY #$D4 T = ENTER TRACE MODE + BNE STEP4 + LDY #$FF +STEPT STY TFLG SET TRACE MODE FLAG + STY PCFLG ENABLE PC PRINTING + JMP STRACE AND ENTER TRACE. +STEP4 CPY #$D8 X = SKIP NEXT INSTRUCTION + BNE STEP5 + LDA #0 ENABLE SPC IF SKP WHILE + STA JFLG JSR DISPLAYED ACTIVE. + STA ERRFLG CLR IN CASE SKIP ERROR. + JSR PCADJ + JMP JRTSX +STEP5 CPY #$C0 @ = TEXT MODE + BNE STEPL LOOP BACK FOR INPUT + JSR TEXT +SSTEPW JSR FWAIT PAUSE TO RELEASE O/A KEY +SSTEP JSR A1PC +SSTEPT JSR CLEARDSP TRACE RE-ENTRY TO STEP + JSR INSTDSP + JSR PRBLNK3 + JSR PEEK + AND #$0F + CMP #$01 SEE IF ZERO PAGE IND + BNE SSTEPZ + LDA #$A8 '(' + JSR COUT PRINT ABSOLUTE VALUE + JSR PEEK IN PARENTHESIS + AND #$10 + BNE INDY TAKEN FOR (NN),Y. + LDX XREG FOR (NN,X). +INDY TXA X=0 FOR (NN),Y + STA TEMP1 + LDY #1 + JSR YPEEK + CLC + ADC TEMP1 + PHA + JSR ZSWAP GET PROGRAM PAGE 0 AND + PLA SAVE POINTER ADDRESS ON + TAX STACK. + LDA $01,X + PHA + LDA $00,X + PHA + JSR ZSWAP RESTORE ANALYST PAGE 0 + PLA AND RECOVER POINTER ADDR. + TAX + PLA + JSR PRNTAX + LDA #$A9 ')' + JSR COUT +SSTEPZ JMP TSTEP +PRNTPC LDA #$FF PRINT PC AT TOP OF SCREEN + STA CV BY FORCING CROUT TO INC + JSR CROUT CV TO 0 (NEED FOR 80 COL) + LDA #29 + STA CH + LDA PROMPT + JSR COUT + LDA PCH + LDX PCL + JMP PRNTAX +TRACEPC LDX PCPNT SAVE PC TO BE EXEC'D + LDA PCH IN LIST BUFFER. + STA PCBUF,X + INX + LDA PCL + STA PCBUF,X + INX + CPX #32 + BCC PNTINC + LDX #0 +PNTINC STX PCPNT + LDA PB0 + BPL TRCPC1 + LDA PCFLG O/A TOGGLES PRINT PC + EOR #$FF ON/OFF + STA PCFLG + JSR FWAIT PAUSE TO RELEASE O/A KEY +TRCPC1 LDA PCFLG + BEQ TRCPC2 BYPASS PRINTING PC. + INC COUNTER PRINT PC + BNE TRCPC2 EVERY 256 INSTRUCTIONS + LDA PROMPT FLASHING '$' FOR TRACE + EOR #$04 ACTIVITY. $A4->$A0->$A4 + STA PROMPT + JSR PRNTPC +TRCPC2 LDA JFLG + BEQ TRACE5 + LDA PCH + CMP #$C0 + BCC TRCPCD + CMP #$C3 JSR $C3NN IN IMMEDIATE + BNE TRCPC3 MODE IF ANALYST IN 80 + LDY FLG8 COL DISPLAY MODE. + BMI TRCPCI +TRCPC3 LDY ROMFLG + BNE TRCPCD + CMP #$D0 + BCC TRCPCI + LDY IDROM JSR ROM $D000-FFFF IN + CPY #$4C IMMEDIATE MODE UNLESS + BEQ TRCPCI ROM FLAG SET <> 0. +TRCPCD CMP DOSCALL+1 TRACE THRU JSR UNLESS = + BNE TRACE5 DOS SUBROUTINE SPECIFIED + LDA PCL BY F(/). + CMP DOSCALL + BNE TRACE5 +TRCPCI LDA PCFLG EXEC JSR IMMEDIATE. DON'T + BEQ TRCPCS PRINT IF O/A TURNED OFF. + JSR SPROMPT '#' DENOTES JSR IMMED. + JSR PRNTPC PRINT EXEC SUBROUTINE + JSR DPROMPT '$' PROMPT + LDA #$FF FORCE PC PRINTING + STA COUNTER AFTER JSR IMMED. +TRCPCS LDA PCL SEE IF PC = $BF00 + BNE TRCPCG + LDA PCH + CMP # TRACE ENTRY POINT + STA PCPNT + STA DSPTOP FOR STEP -> TRACE + JSR DPROMPT '$' PROMPT + JSR CLEARDSP +TRACE5 LDX #1 IF PC = A4 THEN ENTER STEP +TRACE6 LDA PCL,X + CMP BRKADDR,X + BNE TRACE7 + DEX + BPL TRACE6 + JSR SETBREAK CLEAR OLD BREAKPOINT + INX + BEQ TRACES ALWAYS TAKEN +TRACE7 LDX #0 + LDA PB1 BACK TO STEP MODE IF + BPL TRACE8 CLOSED APPLE PRESSED +TRACES STA KBDSTRB + STX TFLG CLEAR TRACE FLAG + STX DSPTOP RESET DISPLAY TO TOP + LDA RDTEXT SEE IF GRAPHICS MODE + BMI TRACES2 + JSR TEXT GRAPHICS -> TEXT +TRACES2 JSR STPRMPT PROMPT BACK TO OLD '#' + LDY YSAV + LDA #$D3 PUT 'S' INTO INPUT BUFFER + STA IN,Y + JMP SSTEPT RE-ENTER STEP MODE +TRACE8 JSR INSDST +TSTEP LDA ERRFLG IF BAD OPCODE THEN BRK + BEQ TSTEP3 +XBRK LDA #0 + STA DSPTOP + STA TFLG + JSR CLEARDSP + JSR INSTDSP + JSR CROUT + JSR RGDSP1 + JMP ERRMON +XTSX LDX SPNT + STX XREG +XTXS LDX XREG + STX SREF +UPDSPNT STX SPNT UPDATE SPNT + CPX #STKLMT+1 STACK OVERFLOW IF + BCC XBRK IN ANALYST WORK AREA + JMP UPDPC +TSTEP3 TAX = 0 + STX JFLG DISALLOW F(J) IF NO JSR + JSR PEEK GET OPCODE + BEQ XBRK + CMP #$BA + BEQ XTSX + CMP #$9A + BEQ XTXS + CMP #$40 + BEQ XBRK BREAK FOR RTI INSTRUCTION + LDY LENGTH + CPY #2 + BEQ CHK128 + JMP TSTEP3B +CHK128 STA TEMP3 CHECK FOR 3-BYTE + JSR YPEEK $C002-C005, $C008-C009 + CMP #$C0 AUX R/W SWITCHES AND + BNE TSTEP3A HANDLE SPECIAL. + DEY + JSR YPEEK + INY + CMP #$02 + BCC TSTEP3A + CMP #$04 + BCC TSTEPRD + CMP #$06 + BCC TSTEPWR + CMP #$08 + BCC TSTEP3A + CMP #$0A + BCS TSTEP3A + STA TEMP3 + ROR A + ROR A + EOR RDAUXZP + BPL UPDPCGO NO CHANGE IN ZP STATE. + LDA XQTS+44 CHANGE ZP TO MAIN/AUX. + STA TEMP1 SAVE CURRENT MAIN/AUX + LDA XQTS+47 R/W STATUS. + STA TEMP2 + LDA XQTS+37 + STA TEMP4 + LDA XQTS+40 + STA TEMP5 + JSR ZSWAP RESTORE PROGRAM ZP. + LDY TEMP3 + STA $C000,Y SET NEW ZP STATE AND + JSR ZSWAP PUT ANALYST ZP BACK. + JSR INITXQTS COPY NEW IMAGE OF XQTS + LDA TEMP1 ONTO STACK AND WRITE + STA XQTS+44 IN CURRENT R/W STATES. + LDA TEMP2 + STA XQTS+47 + LDA TEMP4 + STA XQTS+37 + LDA TEMP5 + STA XQTS+40 + BNE UPDPCGO ALWAYS TAKEN. +TSTEPRD STA XQTS+44 SET PROGRAM READ STATE. + BCC UPDPCGO ALWAYS TAKEN. +TSTEPWR STA XQTS+47 SET PROGRAM WRITE STATE. +UPDPCGO JMP UPDPC +TSTEP3A LDA TEMP3 OPCODE + CMP #$20 + BEQ XJSR + CMP #$7C + BEQ XJMPATX + CMP #$4C + BEQ XJMP + CMP #$6C + BEQ XJMPAT +TSTEP3B CMP #$60 + BEQ XRTS + PHA + CMP #$5A + BCC TSTEP4 + TAX + AND #$1F + CMP #$1A + BEQ STACKOP PHX,PLX,PHY,PLY + TXA +TSTEP4 AND #$9F + CMP #$08 + BNE TSTEP5 +STACKOP JMP STKOPC PHA,PLA,PHP,PLP +TSTEP5 LDA #$EA + STA XQTS+4 + STA XQTS+5 + PLA OPCODE + CMP #$80 + BNE NBRA + ORA #$10 +NBRA AND #$1F + EOR #$14 + CMP #$04 = BRANCH OFFSET + BEQ XQ2 TAKEN IF BRANCH OPCODE +XQ1 JSR YPEEK Y = LENGTH +XQ2 STA XQTS+3,Y XQT BCS BRNCH (B0 04) + DEY NOP + BPL XQ1 JMP NBRNCH (CCLR) + JSR RESTORE BRNCH JMP BRANCH (CSET) + JMP XQTS +XRTS LDX SPNT + INX + LDA STACK,X + STA PCL + INX + LDA STACK,X + STA PCH + STX SPNT + DEC DSPTOP + JMP PCINC +XJMPATX INX + BNE XJMPAT +XJSR STA JFLG OK FOR F(J) + INC DSPTOP + CLC + JSR PCADJL SET Y,A = RTS ADDR + PHA + LDX SPNT + TYA + STA STACK,X + DEX + PLA + STA STACK,X + DEX + STX SPNT + LDY #$02 +XJMP CLC +XJMPAT JSR YPEEK + PHA + DEY + JSR YPEEK + STA PCL + PLA + STA PCH + BCC NEWPC + DEX + BNE XJMP + LDA XREG + CLC + JSR PCADJAP + LDY #1 + BNE XJMP ALWAYS TAKEN +NBRNCH JSR SAVE ALL OTHER OPCODES + BMI UPDPC ALWAYS TAKEN +BRANCH JSR SAVE BRANCH WITH COND. MET + CLC + LDY #$01 + JSR YPEEK + JSR PCADJAP +UPDPC SEC +PCINC JSR PCADJLP +NEWPC LDA TFLG + BNE TRACEBY BYPASSES NEXTITM +NXTPC JSR CROUT + JMP REGDSP +TRACEBY JMP TRACEPC +PULL PHP + INX + LDA STACK,X + TAY + LDA STATUS PULL FROM STACK AFFECTS + PHA N & Z FLAGS + PLP + TYA UPDATE N & Z + PHP + PLA + STA STATUS + TYA + PLP + RTS +STKOPC LDX SPNT STACK OPCODES + PLA OPCODE + TAY + AND #$10 + BEQ APCODE + TYA + ASL A + BCS OPCX + ASL A + ASL A + BCS XPLY + LDA YREG XPHY + BCC PUSH +XPLY JSR PULL + STA YREG + BCS UPDSTACK +OPCX ASL A + ASL A + BCS XPLX + LDA XREG XPHX + BCC PUSH +XPLX JSR PULL + STA XREG + BCS UPDSTACK +APCODE TYA + ASL A + ASL A + BMI PULLAP + BCC XPHP + LDA ACC XPHA + BCS PUSH +XPHP LDA STATUS +PUSH STA STACK,X + DEX + BNE UPDSTACK +PULLAP BCC XPLP + JSR PULL XPLA +ACCLOC STA ACC + BCS UPDSTACK +XPLP JSR PULL + STA STATUS +UPDSTACK JMP UPDSPNT +* +* XQTS IMAGE AT $101-12C. INSTRUCTIONS WITH '@' ARE +* CHANGEABLE IN XQTS AREA TO SET MAIN/AUX R/W STATE. +* +INITBL JSR XQTS+36 WARMV. REAL-TIME REENTRY + JMP REENTER BY JSR $101. + JSR XQTS+43 XQTS + NOP + NOP + NOP + JMP XQTS+15 + JSR XQTS+36 + JMP BRANCH + JSR XQTS+36 XQTS+15 + JMP NBRNCH + JSR XQTS+43 YPOKE + STA (A3L),Y + JMP XQTS+36 + LDY #0 PEEK + JSR XQTS+43 YPEEK + LDA (PCL),Y + STA MAINRD @ XQTS+36. SET ANALYST + STA MAINWR @ STATE + RTS + STA MAINRD @ XQTS+43. SET PROGRAM + STA MAINWR @ STATE + RTS +* +SETBREAK LDX #1 SET BREAKPOINT TO A4 + LDA BRKADDR+1 IF GIVEN, ELSE $FFFF. + BEQ SETBRK2 BREAKPOINT GIVEN + LDA #$FF +SETBRK1 STA BRKADDR,X CLEAR OLD BREAKPOINT + DEX + BPL SETBRK1 + BMI RTS2A ALWAYS TAKEN +SETBRK2 LDA A4L,X SET BREAKPOINT + STA BRKADDR,X + DEX + BPL SETBRK2 +RTS2A RTS +LOAD LDA XQLOC1+1 F(H) + LDY XQLOC1+2 SETUP A3 = XQT+1 FOR HSF + BNE A3SET BUFFER (XQT=BYTE COUNT) +SETRG1 JSR A1PC + JSR SAVEPC +SETRG2 LDA ACCLOC+1 SETUP REGS FOR F(:) + LDY ACCLOC+2 +A3SET STA A3L + STY A3H + RTS +SETREG TXA F(I) SET OR DISPLAY REGS. + BNE SETRG1 TAKEN IF PC GIVEN. + LDY YSAV + LDA IN,Y + CMP #$8D + BNE SETRG2 + LDA PCREG I DISPLAYS REGS. + STA PCL + LDA PCREG+1 + STA PCH +REGDSP JSR RGDSP1 + JSR INSTDSP DISPLAY INSTRUCTION + JMP NEXTITM TO BE EXECUTED NEXT +RGDSP1 LDX #0 +RDSP1 LDA RTBL,X + JSR COUT + LDA #$BD + JSR COUT + LDA ACC,X + JSR PRBYTE + JSR OUTSP + INX + CPX #3 + BCC RDSP1 + LDX #7 +PRFLG LDA CHAR3,X PRINT 'NV-BDIZC' + JSR COUT + DEX + BPL PRFLG + JSR CROUT + LDA #$C1 PRINT ACC IN BINARY + JSR COUT + JSR OUTEQ + LDA ACC + JSR BNDSP + JSR PRBLNK3 + LDA #$D0 PRINT STATUS IN BINARY + JSR COUT + JSR OUTEQ + LDA STATUS + JSR BNDSP + JSR CROUT + LDA #$D3 + JSR COUT + JSR OUTEQ + LDA SPNT + JSR PRBYTE + LDA #$BA + JSR COUT + LDA #$D8 + JSR COUT + JSR COUT + LDY #10 + LDX SPNT +PRNTSTK JSR OUTSP PRINT STACK BYTES FROM + CPX SREF SPNT TO SREF UP TO 10 + BEQ SAVEPC MAX. + INX + LDA STACK,X + JSR PRBYTE + DEY + BNE PRNTSTK +SAVEPC LDA PCL + STA PCREG + LDA PCH + STA PCREG+1 + RTS +BINARY JSR A1PCX F(%) PRINT VALUE AT + JSR CROUT ADDRESS IN BINARY. + JSR PEEK +BNDSP LDX #$08 INDEX FOR 8 BITS +NEXTBIT ASL A + PHA + BCS BIT1 + LDA #$30 '0' + DFB $2C SKIP NEXT INSTRUCTION +BIT1 LDA #$31 '1' + JSR COUT + PLA + DEX + BNE NEXTBIT + RTS +BASCALC PHA + LSR A + AND #$03 + ORA #$04 + STA BASH + PLA + AND #$18 + BCC BSCLC2 + ADC #$7F +BSCLC2 STA BASL + ASL A + ASL A + ORA BASL + STA BASL + RTS +BELL LDY #$38 DURATION +BELL2 LDA #$2B FREQUENCY + JSR WAIT + LDA SPKR + DEY + BNE BELL2 + RTS +VIDOUT JMP (CSWL) +COUT40 CMP #$8C + BEQ HOME40 + CMP #$A0 + BCC NOADV INVERSE, CTRL, OR FLASH +STOADV LDY CH + STA (BASL),Y + INC CH + LDA CH + CMP #$28 + BCS CR +RTS3 RTS +NOADV TAY + BPL STOADV INVERSE OR FLASH + CMP #$8D + BEQ CR + CMP #$88 + BNE RTS3 DON'T PRINT CTRL CHARS. + DEC CH BACKSPACE + BPL RTS3 + LDA #$28 + STA CH + DEC CH +UP LDA #$00 + CMP CV + BCS RTS4 + DEC CV +VTAB LDA CV +VTABZ JSR BASCALC + ADC #$00 + STA BASL +RTS4 RTS +HOME40 LDA #$00 + STA CV + LDY #$00 + STY CH +CLEOP1 PHA + JSR VTABZ + JSR CLEOLZ + LDY #$00 + PLA + ADC #$00 + CMP #$18 + BCC CLEOP1 + BCS VTAB +CR LDA #$00 + STA CH + INC CV + LDA CV + CMP #$18 + BCC VTABZ + DEC CV + LDA #$00 + PHA + JSR VTABZ +SCRL1 LDA BASL BASL = CURRENT + STA BAS2L BAS2L = OLD + LDA BASH + STA BAS2H + LDY #$28 + DEY + PLA + ADC #$01 + CMP #$18 + BCS SCRL3 + PHA + JSR VTABZ +SCRL2 LDA (BASL),Y + STA (BAS2L),Y + DEY + BPL SCRL2 + BMI SCRL1 +SCRL3 LDY #$00 + JSR CLEOLZ + BCS VTAB ALWAYS TAKEN +CLREOL LDY CH +CLEOLZ LDA #$A0 +CLEOL2 PHA + LDA FLG8 + BMI CLEOL3 + PLA + STA (BASL),Y + INY + BNE CLEOL4 ALWAYS TAKEN +CLEOL3 PLA + JSR COUT + LDY CH +CLEOL4 CPY #$28 + BCC CLEOL2 + RTS +CLEARDSP LDX #6 CLEAR DISPLAY WINDOW +CLRDSP1 LDA DSPTOP + BPL CLRDSP2 HOLD TOP OF DISPLAY + LDA #0 0 <= TOP <= 18. +CLRDSP2 CMP #18 + BCC CLRDSP3 + LDA #18 +CLRDSP3 STA DSPTOP + STA CV CLEAR 6 LINE DISPLAY + DEC CV FROM DSPTOP DOWN AND + TXA SET CV SO INSTDSP WILL + BEQ RTS4A PRINT AT DSPTOP UPON +CLRDSP4 JSR CROUT EXIT. + JSR CLREOL + DEX + BNE CLRDSP4 + BEQ CLRDSP1 +RTS4A RTS +FWAIT LDA #$FF +WAIT SEC +WAIT2 PHA +WAIT3 SBC #$01 + BNE WAIT3 + PLA + SBC #$01 + BNE WAIT2 + RTS +NXTA4 INC A4L INCREMENT A4 + BNE NXTA1 + INC A4H +NXTA1 LDA A1L + CMP A2L + LDA A1H + SBC A2H + INC A1L + BNE RTS4B + INC A1H +RTS4B RTS CARRY SET IF A1 >= A2 +CTRLC LDY KBD CTRL-C = BREAK TO MONITOR + BPL RTS4B + STY KBDSTRB + CPY #$93 CTRL-S = PAUSE + BNE CTLC +KYWAIT LDY PB0 F(S) ENTRY POINT + BMI KYWT2 + LDY KBD + BPL KYWAIT + STY KBDSTRB + DFB $2C +KYWT2 LDY #0 0 = OPEN APPLE PRESSED +CTLC CPY #$83 + BNE RTS4B + JMP MONZ +RDKEY STY YSAV1 + LDY RDSCR + PHP + LDY RDPAGE2 + PHP + STA INHPAGE2 + STA LOWSCR + JSR KEYIN + JMP ENDHOOK +KEYIN JMP (KSWL) +KEYIN40 LDY CH + LDA (BASL),Y + PHA + AND #$3F INVERSE CURSOR + STA (BASL),Y + PLA + BIT KBD + BPL KEYIN40 + ORA #$80 + STA (BASL),Y + LDA KBD + BIT KBDSTRB + RTS +NOTCR LDA IN,X LABEL MARKS 'IN' + JSR COUT + CMP #$88 + BEQ BCKSPC + CPX #34 BEEP ON LAST 4 CHAR. + BCC NOTCR1 + JSR BELL +NOTCR1 INX + CPX #38 38 CHARACTERS ALLOWED + BCC NXTCHAR + LDA #$DC + JSR COUT +GETLNZ JSR CROUT + LDA PROMPT + JSR COUT + LDX #$01 +BCKSPC TXA + BEQ GETLNZ + DEX +NXTCHAR JSR RDKEY + CMP #$95 + BEQ NXTCHAR IGNORE '->' + CMP #$FF + BNE NOTDEL + LDA #$88 DELETE KEY = BACKSPACE +NOTDEL CMP #$88 + BNE CAPTST + PHA + JSR COUT BACKSPACE + JSR OUTSP DELETE CHARACTER + PLA BACKSPACE +CAPTST CMP #$E0 + BCC ADDINP + AND #$DF +ADDINP STA IN,X + CMP #$8D + BNE NOTCR +CROUT LDA #$8D + BNE COUTGO +HOME LDA #$8C + BNE COUTGO +OUTSP LDA #$A0 + BNE COUTGO +PRA1 LDY A1H + LDX A1L +PRYX2 JSR CROUT + JSR PRNTYX + LDY #$00 + LDA #$AD +COUTGO JMP COUT +ASC SEC F(") +XAM ROR A CARRY INTO BIT 7 + STA A3H + JMP XAM1 +MOD8CHK LDA A1L + AND #$07 + BNE DATAOUT +XAM1 JSR PRA1 F(.) A1.A2 HEX OR ASC +DATAOUT JSR OUTSP + LDA A1H SEE IF ZERO PAGE + BNE XAM2 + LDA A1L + SEC + SBC #PCL + BCC XAM2 TAKEN IF A1L < PCL + TAX ELSE GET FROM ZBUF + LDA ZBUF,X + JMP XAM3 +XAM2 JSR A1PCX + JSR PEEK +XAM3 LDX A3H + BPL XAM4 + ORA #$80 XAM IN ASC + CMP #$A0 + BCS PRASC TAKEN IF NORM. OR LCASE + LDA #$A0 SPACE FOR CTRL OR INV +PRASC JSR COUT + JMP XAM5 +XAM4 JSR PRBYTE XAM IN HEX +XAM5 JSR NXTA1 + BCC MOD8CHK CARRY CLEAR IF A1PRINIT SIMULATE PR#1 + LDA # ZFLG:AA + STA ZFLG +RST2 JSR INITXQTS + LDA #$00 + STA TFLG + STA JFLG + STA ROMFLG NOTRACE JSR ROM $C000-FFFF +TXTMON JSR TEXT + JSR PRTITLE + JMP MONZ +ERRMON LDA ERRFLG IF ERROR, 'ERR' ON BRK + BEQ MON +PRERR LDX #4 PRINT 'ERR' +ERROUT LDA ERRMSG,X + JSR COUT + DEX + BPL ERROUT +MON CLD + JSR BELL +MONZ LDX #STKLMT SET STACK UPPER LIMIT + TXS + DEC BRKADDR+1 INSURE BRKPOINT CLEARED + JSR ZSWAPE MAKE SURE ANALYST 0 PAGE. + JSR CHKVID MATCH HOOKS W/DISPLAY MODE + JSR STPRMPT + JSR GETLNZ + JSR ZMODE + STY ERRFLG CLEAR ERROR FLAG (Y=0) + STY DSPTOP DISPLAY AT TOP +NXTITM JSR GETNUM HANDLE HEX DIGS TO 1ST + STY YSAV NON-HEX CHAR+1 (Y=INDX) + LDY #SUBTBL-CHRTBL +CHRSRCH DEY ACC = F(ACC) + BMI PRERR + CMP CHRTBL,Y + BNE CHRSRCH + JSR TOSUB +NEXTITM LDY YSAV + JMP NXTITM +DIG LDX #$03 HEX DIGIT NOW IN ACC LO + ASL A NIBBLE. KEYS 0-9=00-09 + ASL A KEYS A-F=FA-FF. MOVE + ASL A LO NIBBLE TO HI NIBBLE + ASL A +NXTBIT ASL A 4 BIT HEX DIG. INTO A2L + ROL A2L A2L TO A2H + ROL A2H + DEX + BPL NXTBIT +NXTBAS LDA MODE + BNE NXTBS2 IF MODE=0 COPY + LDA A2H,X A2 TO A1 & A3 + STA A1H,X + STA A3H,X +NXTBS2 INX + BEQ NXTBAS + BNE NXTCHR +GETNUM LDX #0 + LDA ZFLG SET A2 = 0 ONLY IF + CMP #$AA NOT IN DEFERRED STEP + BNE NXTCHR MODE. + STX A2L + STX A2H +NXTCHR LDA IN,Y F(ACC) = ACC EOR $B0 + INY ADC $88 (CARRY SET) + EOR #$B0 KEYS 0-9=$00-09 + CMP #$0A + BCC DIG TAKEN IF KEYS 0-9 + ADC #$88 KEYS A-F=$FA-FF + CMP #$FA + BCS DIG TAKEN IF KEYS A-F + RTS +TOSUB TYA # OF FUNCTION (START=0) + ASL A MULT BY 2 + TAY + LDA SUBTBL+1,Y + PHA + LDA SUBTBL,Y + PHA + LDA MODE OLD MODE FOR F(CR)&F( ) +ZMODE LDY #$00 + STY MODE + RTS RTS TO SUBROUTINE +EXECJSR LDA JFLG F(J) + BNE GOJSR +ERRJ JMP PRERR F(J) ATTEMPTED W/O JSR! +GOJSR LDY YSAV GET # OF PARM BYTES + JSR GETNUM + DEY + STY YSAV + LDA A2H + BNE ERRJ + LDA A2L + CMP #10 + BCS ERRJ ONLY 9 PARM BYTES MAX + TAY SAVE BYTE COUNT +GOPC LDX #17 +XQINIT2 LDA INITBL2,X FILL DUMMY BLOCK + STA XQT,X + DEX + BPL XQINIT2 + LDA PCL MOVE JSR ADDR TO XQT +XQLOC1 STA XQT+1 + LDA PCH + STA XQT+2 + LDX SPNT SET PC = PARM LIST - 1 + INX + LDA STACK,X + STA PCL + INX + LDA STACK,X + STA PCH + STX SPNT + TYA GET PARM BYTES + TAX + BEQ MVPRM1 NO PARM BYTES TO MOVE +MOVPARM JSR YPEEK MOVE PARM LIST TO DUMMY + STA XQT+2,Y + DEY + BNE MOVPARM +MVPRM1 INX + TXA ADJ PC TO POINT TO INST + CLC FOLLOWING PARM LIST + JSR PCADJAP + JMP XQJ EXECUTE JSR IMMED. MODE +INITBL2 JSR $0000 DUMMY BLOCK FOR F(J) + NOP 9 NOP'S FOR PARM BYTES + NOP + NOP + NOP + NOP + NOP + NOP + NOP + NOP + JSR XQTS+36 RESTORE ANALYST R/W + JMP JRTS +JRTS JSR SAVE + JSR CHKVID + LDA JFLG + BEQ JRTS3 DURING 'G0' W/O BREAK + LDA #0 + STA JFLG + LDA TFLG + BEQ JRTS2 DURING 'STEP' + JMP TRACE5 DURING TRACE IMMEDIATE +JRTS2 DEC DSPTOP UPDATE REGDSP AFTER JSR. +JRTSX JSR CLEARDSP 'SKIP' ENTERS HERE + JMP NXTPC +JRTS3 JMP NEXTITM +FIND LDA #$FF F(CTRL-F) A4MKEYIN PROPER DOS HOOKS. + STA MKSWH + STY MKSWL + LDA #MVIDOUT + STA MCSWH + STY MCSWL + LDA #40 + STA WNDWDTH + JSR IN40 + STA CLR80VID + JSR HOME40 + STA LOWSCR + STA TXTSET + RTS +IN40 LDX #4 +MOVE40 LDA HOOK40-1,X + STA CSWL-1,X + DEX + BNE MOVE40 + STX FLG8 SET = 0 +RTS7 RTS +CHKVID LDA RD80VID RESET 40/80 COL IF NEEDED + ASL A BIT 7 INTO CARRY + LDA FLG8 + BMI CHK80 + BCC RTS7 + BCS IN80 40 -> 80 +CHK80 BCS RTS7 + BCC IN40 80 -> 40 + SKP 1 +*** 80 COLUMN DRIVER ROUTINE *** + SKP 1 +INIT80 JSR HOME + STA CLR80ROM ENABLES $C300 ROM + JSR PR3 +IN80 LDX #3 +MOVE80 LDA MCSWL,X + STA CSWL8,X + LDA HOOK80,X + STA CSWL,X + DEX + BPL MOVE80 + STX FLG8 SET = FF + RTS +COUT80 JSR EXCHV + JSR COUTZ80 + JMP EXCHV +COUTZ80 JMP (CSWL8) +KEYIN80 JSR EXCHV + JSR KEY80 + JMP EXCHV +KEY80 JMP (KSWL8) +EXCHV PHA + TXA + PHA + LDY #1 +EXCH2 LDA MCH,Y EXCHANGE CH,CV AND BASE + LDX CH,Y ADDRESS BETWEEN ANALYST + STA CH,Y AND 80 COL ROM COUT. + STX MCH,Y + LDA MBASL,Y + LDX BASL,Y + STA BASL,Y + STX MBASL,Y + DEY + BPL EXCH2 + PLA + TAX + PLA + RTS +HELP LDY #0 F(?) LIST LAST 16 PC +HLP2 LDA PCBUF,Y ADDRESSES EXECUTED + INY DURING TRACE. + LDX PCBUF,Y + INY + JSR PRNTAX + CPY PCPNT + BNE HLP3 + LDA #$BC + JSR COUT +HLP3 JSR CROUT + CPY #32 + BCC HLP2 + RTS +PRTITLE LDX #$00 F(V). PRINT TITLE +TITLLOC LDA TITLE,X + BEQ PRADDR + JSR COUT + INX + BNE TITLLOC +PRADDR LDA STARTLOC+1 PRINT ORIGIN ADDRESS + JSR PRBYTE + LDA #0 + JSR PRBYTE + JMP CROUT + SKP 1 +*** PROGRAM DATA AREA *** + SKP 1 +TITLE DFB $8D + ASC "ANALYST 128" + DFB $8D TITLE MARKS START OF PDA + ASC "ORG = " +BANKORG ASC "$" + DFB $00 +FMT2 DFB 0,33,129,130,90,73,89,77 + DFB 145,146,134,74,133,157 +MNEML DFB 28,138 + DFB 28,35,93,139,27,161,157,138 + DFB 29,35,157,139,29,161,28,41 + DFB 25,174,105,168,25,35,36,83 + DFB 27,35,36,83,25,161,173,26 + DFB 165,91,165,172,139,138,174,174 + DFB 168,173,41,138,124,139,21,156 + DFB 109,156,165,105,41,83,132,19 + DFB 52,17,165,105,35,160 +MNEMR DFB 216,98 + DFB 90,72,38,98,148,136,84,68 + DFB 200,84,104,68,232,148,196,180 + DFB 8,132,116,180,40,110,116,244 + DFB 204,74,114,242,164,138,6,170 + DFB 118,162,116,198,116,116,68,104 + DFB 178,50,178,114,34,114,26,26 + DFB 38,38,114,114,136,200,196,202 + DFB 38,72,68,68,162,200 +FMT1 DFB 240,34,0,51,93,130,0,147 + DFB 243,34,0,51,93,136,0,153 + DFB 240,47,0,51,93,143,0,159 + DFB 240,34,0,59,93,136,0,148 + DFB 253,34,0,51,93,200,0,147 + DFB 17,34,0,51,93,200,0,169 + DFB 241,34,0,51,93,143,0,159 + DFB 241,34,0,51,93,143,0,159 + DFB 38,49,135,154 +OPC65C DFB 18,50,82,114 + DFB 146,178,210,242,58,26,137,28 + DFB 20,122,90,156,100,158,116,124 + DFB 60,52 + DFB 76,164,172,180,188,196,204,228 + DFB 236 +REPL65C DFB 17,49,81,113,145,177 + DFB 209,241,194,226,52,164,172,196 + DFB 228,92,92,92,92,124,60,52 + DFB 124,160,160,160,160,192,192 + DFB 224,224 +CHAR1 DFB 172,169,172,163,168,164 +CHAR2 DFB 217,0,216,164,164,0 +CHAR3 ASC "CZIDB-VN" +RTBL ASC "AXY" +CHRTBL DFB 152,249,177,241,3,236 + DFB 166,164,6,149,5 + DFB 0,147,2,167,198,153 + DFB 155,154,239,233,1,191 + DFB 168,237,158,235,197 +SUBTBL DW HELP-1 F(?) LIST PC'S TRACED + DW SETVID-1 F(@) SWITCH 40/80 COL + DW AUXV-1 F(CTRL-X) MOVE TO AUX + DW AUXRW-1 F(X) MAIN/AUX $200-BFFF + DW EXECJSR-1 F(J) EXECUTE JSR + DW STEP-1 F(S) STEP + DW SETMODE-1 F(-) 16 BIT SUBTRACTION + DW SETMODE-1 F(+) 16 BIT ADDITION + DW MOVE-1 F(M) MOVE + DW LT-1 F(<) COPY A2 TO A4 & A5 + DW LIST-1 F(L) LIST DISASSEMBLY + DW GO-1 F(G) GO + DW SETMODE-1 F(:) STORE + DW SETREG-1 F(I) SET INTERNAL PC/REG + DW SETMODE-1 F(.) XAM + DW CRMON-1 F(CR) HANDLE CR + DW BLANK-1 F( ) HANDLE SPACES + DW ASC-1 F(") DUMP IN ASCII + DW GOMINI-1 F(!) MINI-ASSEMBLER + DW PRTITLE-1 F(V) PRINT TITLE + DW SETPRNT-1 F(P) TO PRINTER + DW LOAD-1 F(H) LOAD FOR HSF + DW FIND-1 F(CTRL-F) HEX SEQ. FIND + DW SETDOS-1 F(/) SET DOS CALL JSR #. + DW TRACE-1 F(T) TRACE + DW BINARY-1 F(%) VALUE IN BINARY + DW RELOC-1 F(R) RELOCATOR + DW CRMON-1 HANDLE CTRL-L AS CR +HOOK40 DW COUT40 + DW KEYIN40 +HOOK80 DW COUT80 + DW KEYIN80 +STARTLOC DW START +ERRMSG DFB $8D MARKS END OF WORDS + ASC 'RRE' + DFB $8D + SKP 1 +* DYNAMIC PROGRAM AREA * + SKP 1 +GOMINI JMP MINI F(!) DISABLED WHEN F(R) +AUXV JMP AUXLOAD F(CTRL-X) ONE TIME VECTOR +CSWL DS 1 ADDR. OF OUTPUT ROUTINE +CSWH DS 1 +KSWL DS 2 ADDR. OF INPUT ROUTINE +CSWL8 DS 2 DON'T CHANGE ORDER +KSWL8 DS 2 OF CSWL-KSWL8 +TFLG DS 1 <> 0 = CANCEL COUT FOR TRC +JFLG DS 1 SET TO ALLOW F(J) +DOSCALL DS 2,255 SUBROUTINE TO JSR IMMED. +ERRFLG DS 1 SET FOR BAD OPCODE +PCREG DS 2,0 +ACC DFB 0 DON'T CHANGE ORDER +XREG DFB 0 OF ACC TO SPNT +YREG DFB 0 +STATUS DFB 0 +SPNT DFB $F0 +SREF DFB $F0 STACK REF SET BY TXS OPC +LMNEM DS 1 +RMNEM DS 1 +LENGTH DS 1 +FORMAT DS 1 +MODE DS 1 +FLG8 DS 1 FF = 80 COL, 0 = 40 COL +PROMPT DS 1 +CH DS 1 +CV DS 1 +DSPTOP DS 1 TOP OF DISPLAY FOR STEP +YSAV DS 1 +YSAV1 DS 1 +PCPNT DFB 0 INDEX TO PCBUF +BRKADDR DS 2,255 BREAK FOR STEP,TRACE,LIST +ZBUF DS $100-PCL PAGE ZERO STORAGE BUFFER +IN DS 28,0 KEYIN BUFFER. RELOC LABEL. +TEMP1 EQU IN+12 FOR INSTDSP AND STEP. +TEMP2 EQU IN+13 FOR STEP. +TEMP3 EQU IN+14 FOR STEP. +TEMP4 EQU IN+15 FOR STEP. +TEMP5 EQU IN+16 FOR STEP. +PCFLG EQU IN+17 PRNTPC ON/OFF FOR TRACE +COUNTER EQU IN+18 FOR TRACE +PCBUF DS 32 32 BYTE PC SAVE AREA. +ENDPGM EQU >* +FREESPC EQU $FF-ENDPGM + DS FREESPC IF $NFFF SET <> 0 WILL TRC +ROMFLG DS 1 THRU JSR ROM $D000-FFFF. + SKP 1 +*** THE MINI-ASSEMBLER *** + SKP 1 +RELADR SBC #$81 + LSR A + BNE PCERR + LDY A2H + LDX A2L + BNE RELADJ + DEY +RELADJ DEX + TXA + CLC + SBC PCL + STA A2L + BPL RELADJ2 + INY +RELADJ2 TYA + SBC PCH +PCERR BNE ERRAT +POKEAT LDY LENGTH +POKE LDX A1H,Y + LDA PCL + STA A3L + LDA PCH + STA A3H + TXA + JSR YPOKE + DEY + BPL POKE + JSR UP + JSR UP + JSR INSTDSP + JSR CLREOL + JSR PCADJ + JMP MINI +DSS LDA A1H + JSR INSDS2 + TAX + LDA MNEMR,X + CMP A4L + BNE NXOPC + LDA MNEML,X + CMP A4H + BNE NXOPC + LDA A5L + LDY FORMAT + CPY #$9D + BEQ RELADR + CMP FORMAT + BEQ POKEAT +NXOPC DEC A1H + BNE DSS + INC A5L + DEC YSAV1 + BEQ DSS +ERRAT LDY YSAV +ERROR TYA + TAX + JSR PRBLNK + LDA #$DE + JSR COUT + JSR BELL +MINI JSR EPROMPT '!' PROMPT + JSR GETLNZ + JSR ZMODE + LDA IN + CMP #$A0 + BEQ RDMNEM + TXA + BNE MINI2 + STA YSAV ALONE EXITS + JMP STPRMPT VIA NEXTITM +MINI2 JSR GETNUM + CMP #$93 F(:) +A1TOPC BNE ERROR + TXA + BEQ ERROR + JSR A1PCLP +RDMNEM LDA #$03 INDEX FOR 3 CHAR MNEM + STA A1H +RDMNEM2 JSR CHARIN + ASL A + SBC #$BE + CMP #$C2 LESS THAN 'A' + BCC ERROR NOT ASC LETTER SO ERR + ASL A + ASL A + LDX #$04 INDEX FOR 5 BITS +RDMNEM3 ASL A MOVE 5 BIT LETTER CODE + ROL A4L (* 3 LETTERS) INTO A4. + ROL A4H 26 LETTERS REQ. 5 BITS + DEX + BPL RDMNEM3 + DEC A1H + BEQ RDMNEM3 + BPL RDMNEM2 + LDX #$05 INDEX FOR 6 FORMAT BITS +RDFMT JSR CHARIN + STY YSAV + CMP CHAR1,X + BNE RDFMT2 + JSR CHARIN + CMP CHAR2,X + BEQ RDADDR + LDA CHAR2,X + BEQ RDFMT3 + CMP #$A4 + BEQ RDFMT3 + LDY YSAV +RDFMT2 CLC +RDFMT3 DEY +RDADDR ROL A5L + CPX #$03 + BNE RDADDR3 + JSR GETNUM + LDA A2H + BEQ RDADDR2 + INX +RDADDR2 STX YSAV1 + LDX #$03 + DEY +RDADDR3 STX A1H + DEX + BPL RDFMT + LDA A5L + ASL A + ASL A + ORA YSAV1 + CMP #$20 + BCS RDADDR4 + LDX YSAV1 + BEQ RDADDR4 + ORA #$80 +RDADDR4 STA A5L + STY YSAV + LDA IN,Y + CMP #$8D + BEQ DISAS + JMP A1TOPC +DISAS JMP DSS +CHARIN LDA IN,Y + INY + CMP #$A0 + BEQ CHARIN +ENDMAIN RTS +AUXLOAD LDA #>START + STA MA1 + STA MA4 + LDA #ENDMAIN + STA MA2 + LDA #- * +* * +* 128K VERSION E * +* * +* 5/31/91 * +* * +********************************* + SKP 1 +*** COMMANDS *** + SKP 1 +; CTRL-F FIND HEX SEQUENCE DEFINED BY F(H) +; G GO EXECUTE IN IMMEDIATE MODE +; H LOAD BYTES FOR HSF F(CTRL-F) BY USING H: +; I DISPLAY/SET PC/INTERNAL A,X,Y,P,S REGISTERS +; J JUMP. EXECUTE JSR INSTRUCTION IN STEP MODE +; CTRL-L CLEAR PRESENT SCREEN AND HOME CURSOR +; L LIST DISASSEMBLY OR LOOP IN TRACE MODE. +; M MOVE BLOCK OF MEMORY +; P SEND OUTPUT TO PRINTER +; R RELOCATE ANALYST TO NEW ADDRESS PAGE +; S ENTER STEP MODE. STEP INSTRUCTION +; T TRACE PROGRAM +; V PRINT ANALYST VERSION# AND ORIGIN ADDRESS. +; CTRL-X MOVE ANALYST TO AUX. DISABLED AFTER USE. +; X SKIP INSTRUCTION DURING STEP. TOGGLE MAIN/AUX +; " DUMP MEMORY IN ASCII +; / SET OR PRINT SUBROUTINE TO JSR IMMED MODE +; % PRINT ADDRESS DATA VALUE IN BINARY +; ? PRINT LAST 16 PC'S EXEC'D DURING TRACE +; @ SET TEXT 40/80 COL SCREEN +; < RANGE DELIMITER +; . RANGE DELIMITER +; + 16 BIT ADDITION +; - 16 BIT SUBTRACTION +; : STORE VALUE IN MEMORY +; ! ENTER MINI-ASSEMBLER. ALONE TO EXIT + SKP 1 +*** ROM ZERO PAGE EQUATES *** + SKP 1 +MCSWL EQU $36 +MCSWH EQU $37 +MA1 EQU $3C +MA2 EQU $3E +MA4 EQU $42 + SKP 1 +*** ANALYST EQUATES *** + SKP 1 +STKLMT EQU $80 TOP OF STACK (IMMEDIATE) +PCL EQU $EF LABEL MARKS PAGE 0 +PCH EQU $F0 +BASL EQU $F1 +BASH EQU $F2 LABEL USED AS IDENTIFIER +ZFLG EQU $F3 1 BYTE ID = $AA +A1L EQU $F4 A1L-A5H MUST BE IN ORDER +A1H EQU $F5 FOR MINI-ASSEMBLER +A2L EQU $F6 +A2H EQU $F7 +A3L EQU $F8 +A3H EQU $F9 +A4L EQU $FA +A4H EQU $FB +A5L EQU $FC +A5H EQU $FD +BAS2L EQU $FE +BAS2H EQU $FF LABEL MARKS END OF PAGE 0 +STACK EQU $0100 PRODOS USES $100 +WARMV EQU $0102 WARM REENTRY +XQTS EQU WARMV+6 EXEC AREA FOR STEP, TRACE +YPOKE EQU XQTS+21 +PEEK EQU XQTS+29 +YPEEK EQU XQTS+31 +XQT EQU XQTS+50 +MLI EQU $BF00 PRODOS INTERFACE + SKP 1 +*** ROM EQUATES *** + SKP 1 +KBD EQU $C000 +INHPAGE2 EQU $C001 AUX $400-7FF SHOWS TEXT +MAINRD EQU $C002 +MAINWR EQU $C004 +CLR80VID EQU $C00C +SET80VID EQU $C00D +KBDSTRB EQU $C010 +RDAUXZP EQU $C016 BMI IF AUXZP +RDPAGE2 EQU $C018 BMI IF INHPAGE2 ON +RDTEXT EQU $C01A BMI IF TEXT MODE +RDSCR EQU $C01C BMI IF DPAGE2 ON +RD80VID EQU $C01F BMI IF 80 COL MODE +SPKR EQU $C030 +TXTSET EQU $C051 +LOWSCR EQU $C054 +HISCR EQU $C055 +PB0 EQU $C061 OPEN APPLE KEY +PB1 EQU $C062 CLOSED APPLE KEY +SWITCH2 EQU $C082 +AUXMOVE EQU $C311 +OUTPORT EQU $FE95 USED TO SET PRINTER +IDROM EQU $E000 = $4C IF ROM PRESENT + SKP 3 +START JMP RESET COLD START +INSDS1 LDX PCL + LDY PCH + JSR PRYX2 + JSR OUTSP +INSDST JSR PEEK +INSDS2 LDY #$FF DETERMINE LENGTH OF + STY LMNEM INSTRUCTION. OPCODE IN + TAY ACC. STORED IN LENGTH. + LSR A INVALID = 0 + BCC IEVEN 1 BYTE = 0 + ROR A 2 BYTE = 1 + BCS ERR 3 BYTE = 2 + AND #$87 +IEVEN LSR A + TAX + LDA FMT1,X + BCC RTMSKZ + LSR A + LSR A + LSR A + LSR A +RTMSKZ AND #$0F + CMP #$0F + BNE GETFMT +ERR LDY #$FF BAD OPCODE + STY ERRFLG + INY + STY LMNEM + STY RMNEM + STY FORMAT + STY LENGTH +RTS1 RTS +GETFMT TAX + LDA FMT2,X + STA FORMAT + AND #$03 + STA LENGTH + LDA TFLG BYPASS PRINT FORMATTING + BNE RTS1 IN TRACE + TYA + AND #$8F + STA TEMP1 TEMP STORAGE + TYA + LDX #31 +GETFMT2 DEX + BMI MNNDX + CMP OPC65C,X MAKE SUBSTITUTION IF + BNE GETFMT2 65C02 OPCODE. + LDA REPL65C,X +MNNDX LDX TEMP1 + LDY #$03 + CPX #$8A + BEQ MNNDX3 +MNNDX1 LSR A + BCC MNNDX3 + LSR A +MNNDX2 LSR A + ORA #$20 + DEY + BNE MNNDX2 + INY +MNNDX3 DEY + BNE MNNDX1 + RTS +INSTDSP JSR INSDS1 + PHA +PRNTOP JSR YPEEK + JSR PRBYTE + LDX #$01 +PRNTBL JSR PRBLNK + CPY LENGTH + INY + BCC PRNTOP + LDX #$03 + CPY #$03 + BCC PRNTBL + PLA + TAY + LDA LMNEM + BEQ PRMN1 + LDA MNEML,Y + STA LMNEM + LDA MNEMR,Y + STA RMNEM +PRMN1 LDA #$00 + LDY #$05 +PRMN2 ASL RMNEM + ROL LMNEM + ROL A + DEY + BNE PRMN2 + ADC #$BF + JSR COUT + DEX + BNE PRMN1 + JSR OUTSP + LDY LENGTH + LDX #$05 +PRADR1 CPX #$02 + BEQ PRADR5 +PRADR2 ASL FORMAT + BCC PRADR3 + LDA CHAR1,X + JSR COUT + LDA CHAR2,X + BEQ PRADR3 + JSR COUT +PRADR3 DEX + BPL PRADR1 + RTS +PRADR4 DEY + BMI PRADR2 + JSR PRBYTE +PRADR5 LDA FORMAT + CMP #$E8 + JSR YPEEK + BCC PRADR4 + JSR PCADJA + TAX + INX + BNE PRNTYX + INY +PRNTYX TYA +PRNTAX JSR PRBYTE + TXA + JMP PRBYTE +PRBLNK3 LDX #3 +PRBLNK JSR OUTSP PRINT X SPACES + DEX + BNE PRBLNK + RTS +PCADJ SEC UPDATE PC BY LENGTH+1 +PCADJLP LDA LENGTH UPDATE PC BY LENGTH +PCADJAP JSR PCADJA UPDATE PC BY ACC + STA PCL + STY PCH + RTS +PCADJL LDA LENGTH SET Y,A = PC+LENGTH +PCADJA LDY PCH SET Y,A = PC+ACC + TAX + BPL PCADJ2 + DEY +PCADJ2 ADC PCL + BCC RTS2 + INY +RTS2 RTS +STEP DEC YSAV F(S) + PLA REMOVE RTS TO NEXTITM + PLA +STEPL TXA + BEQ STEPZ + JSR SETBREAK FIRST TIME + LDX #1 + BNE SSTEP ALWAYS TAKEN +STEPZ JSR KYWAIT CTRL-C = BREAK + CPY #$CA + BNE STEP2 + LDA JFLG J = SINGLE STEP + BEQ SSTEP IF NO JSR, ELSE + JMP TRCPCS EXECUTE SUBROUTINE +STEP2 CPY #$CC L = LOOP. SET BREAK + BNE STEP2A POINT AFTER INSTRUCTION + JSR PCADJL TO BE EXECUTED NEXT + STA BRKADDR AND ENTER TRACE. + STY BRKADDR+1 + JMP STEPT +STEP2A LDA JFLG SPC = SINGLE STEP IF + BNE STEP3 NOT JSR, ELSE IGNORE + CPY #$A0 + BEQ SSTEP +STEP3 CPY #$D3 S OR OPEN APPLE = + BEQ SSTEP SINGLE STEP ALWAYS + TYA + BEQ SSTEPW = 0 FOR OPEN APPLE. + CPY #$D4 T = ENTER TRACE MODE + BNE STEP4 + LDY #$FF +STEPT STY TFLG SET TRACE MODE FLAG + STY PCFLG ENABLE PC PRINTING + JMP STRACE AND ENTER TRACE. +STEP4 CPY #$D8 X = SKIP NEXT INSTRUCTION + BNE STEP5 + STZ JFLG ENABLE SPC IF SKP WHILE + STZ ERRFLG JSR DISPLAYED ACTIVE. + JSR PCADJ CLR IN CASE SKIP ERROR. + JMP JRTSX +STEP5 CPY #$C0 @ = TEXT MODE + BNE STEPL LOOP BACK FOR INPUT + JSR TEXT +SSTEPW JSR FWAIT PAUSE TO RELEASE O/A KEY +SSTEP JSR A1PC +SSTEPT JSR CLEARDSP TRACE RE-ENTRY TO STEP + JSR INSTDSP + JSR PRBLNK3 + JSR PEEK + AND #$0F + CMP #$01 SEE IF ZERO PAGE IND + BNE SSTEPZ + LDA #$A8 '(' + JSR COUT PRINT ABSOLUTE VALUE + JSR PEEK IN PARENTHESIS + AND #$10 + BNE INDY TAKEN FOR (NN),Y. + LDX XREG FOR (NN,X). +INDY TXA X=0 FOR (NN),Y + STA TEMP1 + LDY #1 + JSR YPEEK + CLC + ADC TEMP1 + PHA + JSR ZSWAP GET PROGRAM PAGE 0 AND + PLA SAVE POINTER ADDRESS ON + TAX STACK. + LDA $01,X + PHA + LDA $00,X + PHA + JSR ZSWAP RESTORE ANALYST PAGE 0 + PLA AND RECOVER POINTER ADDR. + TAX + PLA + JSR PRNTAX + LDA #$A9 ')' + JSR COUT +SSTEPZ JMP TSTEP +PRNTPC LDA #$FF PRINT PC AT TOP OF SCREEN + STA CV BY FORCING CROUT TO INC + JSR CROUT CV TO 0 (NEED FOR 80 COL) + LDA #29 + STA CH + LDA PROMPT + JSR COUT + LDA PCH + LDX PCL + JMP PRNTAX +TRACEPC LDX PCPNT SAVE PC TO BE EXEC'D + LDA PCH IN LIST BUFFER. + STA PCBUF,X + INX + LDA PCL + STA PCBUF,X + INX + CPX #32 + BCC PNTINC + LDX #0 +PNTINC STX PCPNT + LDA PB0 + BPL TRCPC1 + LDA PCFLG O/A TOGGLES PRINT PC + EOR #$FF ON/OFF + STA PCFLG + JSR FWAIT PAUSE TO RELEASE O/A KEY +TRCPC1 LDA PCFLG + BEQ TRCPC2 BYPASS PRINTING PC. + INC COUNTER PRINT PC + BNE TRCPC2 EVERY 256 INSTRUCTIONS + LDA PROMPT FLASHING '$' FOR TRACE + EOR #$04 ACTIVITY. $A4->$A0->$A4 + STA PROMPT + JSR PRNTPC +TRCPC2 LDA JFLG + BEQ TRACE5 + LDA PCH + CMP #$C0 + BCC TRCPCD + LDY ROMFLG + BNE TRCPCD + CMP #$D0 + BCC TRCPCI + LDY IDROM JSR ROM $C000-FFFF IN + CPY #$4C IMMEDIATE MODE UNLESS + BEQ TRCPCI ROM FLAG SET <> 0. +TRCPCD CMP DOSCALL+1 TRACE THRU JSR UNLESS = + BNE TRACE5 DOS SUBROUTINE SPECIFIED + LDA PCL BY F(/). + CMP DOSCALL + BNE TRACE5 +TRCPCI LDA PCFLG EXEC JSR IMMEDIATE. DON'T + BEQ TRCPCS PRINT IF O/A TURNED OFF. + JSR SPROMPT '#' DENOTES JSR IMMED. + JSR PRNTPC PRINT EXEC SUBROUTINE + JSR DPROMPT '$' PROMPT + LDA #$FF FORCE PC PRINTING + STA COUNTER AFTER JSR IMMED. +TRCPCS LDA PCL SEE IF PC = $BF00 + BNE TRCPCG + LDA PCH + CMP # TRACE ENTRY POINT + STZ DSPTOP FOR STEP -> TRACE + JSR DPROMPT '$' PROMPT + JSR CLEARDSP +TRACE5 LDX #1 IF PC = A4 THEN ENTER STEP +TRACE6 LDA PCL,X + CMP BRKADDR,X + BNE TRACE7 + DEX + BPL TRACE6 + JSR SETBREAK CLEAR OLD BREAKPOINT + BRA TRACES +TRACE7 LDA PB1 BACK TO STEP MODE IF + BPL TRACE8 CLOSED APPLE PRESSED +TRACES STA KBDSTRB + STZ TFLG CLEAR TRACE FLAG + STZ DSPTOP RESET DISPLAY TO TOP + LDA RDTEXT SEE IF GRAPHICS MODE + BMI TRACES2 + JSR TEXT GRAPHICS -> TEXT +TRACES2 JSR STPRMPT PROMPT BACK TO OLD '#' + LDY YSAV + LDA #$D3 PUT 'S' INTO INPUT BUFFER + STA IN,Y + JMP SSTEPT RE-ENTER STEP MODE +TRACE8 JSR INSDST +TSTEP LDA ERRFLG IF BAD OPCODE THEN BRK + BEQ TSTEP3 +XBRK STZ DSPTOP + STZ TFLG + JSR CLEARDSP + JSR INSTDSP + JSR CROUT + JSR RGDSP1 + JMP ERRMON +XTSX LDX SPNT + STX XREG +XTXS LDX XREG + STX SREF +UPDSPNT STX SPNT UPDATE SPNT + CPX #STKLMT+1 STACK OVERFLOW IF + BCC XBRK IN ANALYST WORK AREA + JMP UPDPC +TSTEP3 STZ JFLG DISALLOW F(J) IF NO JSR + JSR PEEK GET OPCODE + BEQ XBRK + CMP #$BA + BEQ XTSX + CMP #$9A + BEQ XTXS + CMP #$40 + BEQ XBRK BREAK FOR RTI INSTRUCTION + LDY LENGTH + CPY #2 + BNE TSTEP3B + STA TEMP3 CHECK FOR 3-BYTE + JSR YPEEK $C002-C005, $C008-C009 + CMP #$C0 AUX R/W SWITCHES AND + BNE TSTEP3A HANDLE SPECIAL. + DEY + JSR YPEEK + INY + CMP #$02 + BCC TSTEP3A + CMP #$04 + BCC TSTEPRD + CMP #$06 + BCC TSTEPWR + CMP #$08 + BCC TSTEP3A + CMP #$0A + BCS TSTEP3A + STA TEMP3 + ROR A + ROR A + EOR RDAUXZP + BPL UPDPCGO NO CHANGE IN ZP STATE. + JSR ZSWAP RESTORE PROGRAM ZP. + LDA TEMP3 NEW ZP STATE + LSR A ODD/EVEN 9/8 + BCS ODDNEW + LDA #9 NEW = 8 + DFB $2C +ODDNEW LDA #8 NEW = 9 + STA TEMP2 OLD STATE + LDX #STKLMT COPY ANALYST STACK ACROSS +STKLOOP LDY TEMP2 + STA $C000,Y OLD ZP + LDA $0100,X + LDY TEMP3 + STA $C000,Y NEW ZP + STA $0100,X + DEX + BPL STKLOOP + JSR ZSWAP PUT ANALYST ZP BACK + BRA UPDPCGO +TSTEPRD STA XQTS+44 SET PROGRAM READ STATE. + BRA UPDPCGO +TSTEPWR STA XQTS+47 SET PROGRAM WRITE STATE. +UPDPCGO JMP UPDPC +TSTEP3A LDA TEMP3 OPCODE + CMP #$20 + BEQ XJSR + CMP #$7C + BEQ XJMPATX + CMP #$4C + BEQ XJMP + CMP #$6C + BEQ XJMPAT +TSTEP3B CMP #$60 + BEQ XRTS + PHA + CMP #$5A + BCC TSTEP4 + TAX + AND #$1F + CMP #$1A + BEQ STACKOP PHX,PLX,PHY,PLY + TXA +TSTEP4 AND #$9F + CMP #$08 + BNE TSTEP5 +STACKOP JMP STKOPC PHA,PLA,PHP,PLP +TSTEP5 LDA #$EA + STA XQTS+4 + STA XQTS+5 + PLA OPCODE + CMP #$80 + BNE NBRA + ORA #$10 +NBRA AND #$1F + EOR #$14 + CMP #$04 = BRANCH OFFSET + BEQ XQ2 TAKEN IF BRANCH OPCODE +XQ1 JSR YPEEK Y = LENGTH +XQ2 STA XQTS+3,Y XQT BCS BRNCH (B0 04) + DEY NOP + BPL XQ1 JMP NBRNCH (CCLR) + JSR RESTORE BRNCH JMP BRANCH (CSET) + JMP XQTS +XRTS LDX SPNT + INX + LDA STACK,X + STA PCL + INX + LDA STACK,X + STA PCH + STX SPNT + DEC DSPTOP + BRA PCINC +XJMPATX INX + BNE XJMPAT +XJSR STA JFLG OK FOR F(J) + INC DSPTOP + CLC + JSR PCADJL SET Y,A = RTS ADDR + PHA + LDX SPNT + TYA + STA STACK,X + DEX + PLA + STA STACK,X + DEX + STX SPNT + LDY #$02 +XJMP CLC +XJMPAT JSR YPEEK + PHA + DEY + JSR YPEEK + STA PCL + PLA + STA PCH + BCC NEWPC + DEX + BNE XJMP + LDA XREG + CLC + JSR PCADJAP + LDY #1 + BRA XJMP +NBRNCH JSR SAVE ALL OTHER OPCODES + BRA UPDPC +BRANCH JSR SAVE BRANCH WITH COND. MET + CLC + LDY #$01 + JSR YPEEK + JSR PCADJAP +UPDPC SEC +PCINC JSR PCADJLP +NEWPC LDA TFLG + BNE TRACEBY BYPASSES NEXTITM +NXTPC JSR CROUT + JMP REGDSP +TRACEBY JMP TRACEPC +PULL PHP + INX + LDA STACK,X + TAY + LDA STATUS PULL FROM STACK AFFECTS + PHA N & Z FLAGS + PLP + TYA UPDATE N & Z + PHP + PLA + STA STATUS + TYA + PLP + RTS +STKOPC LDX SPNT STACK OPCODES + PLA OPCODE + TAY + AND #$10 + BEQ APCODE + TYA + ASL A + BCS OPCX + ASL A + ASL A + BCS XPLY + LDA YREG XPHY + BCC PUSH +XPLY JSR PULL + STA YREG + BCS UPDSTACK +OPCX ASL A + ASL A + BCS XPLX + LDA XREG XPHX + BCC PUSH +XPLX JSR PULL + STA XREG + BCS UPDSTACK +APCODE TYA + ASL A + ASL A + BMI PULLAP + BCC XPHP + LDA ACC XPHA + BCS PUSH +XPHP LDA STATUS +PUSH STA STACK,X + DEX + BNE UPDSTACK +PULLAP BCC XPLP + JSR PULL XPLA +ACCLOC STA ACC + BCS UPDSTACK +XPLP JSR PULL + STA STATUS +UPDSTACK JMP UPDSPNT +YPOKEPC PHA EXECUTE STA (PCL),Y + LDA PCL + STA A3L + LDA PCH + STA A3H + PLA + JMP YPOKE +* +* XQTS IMAGE AT $101-12C. INSTRUCTIONS WITH '@' ARE +* CHANGEABLE IN XQTS AREA TO SET MAIN/AUX R/W STATE. +* +INITBL JSR XQTS+36 WARMV. REAL-TIME REENTRY + JMP REENTER BY JSR $101. + JSR XQTS+43 XQTS + NOP + NOP + NOP + JMP XQTS+15 + JSR XQTS+36 + JMP BRANCH + JSR XQTS+36 XQTS+15 + JMP NBRNCH + JSR XQTS+43 YPOKE + STA (A3L),Y + JMP XQTS+36 + LDY #0 PEEK + JSR XQTS+43 YPEEK + LDA (PCL),Y + STA MAINRD @ XQTS+36. SET ANALYST + STA MAINWR @ STATE + RTS + STA MAINRD @ XQTS+43. SET PROGRAM + STA MAINWR @ STATE + RTS +* +SETBREAK LDX #1 SET BREAKPOINT TO A4 + LDA BRKADDR+1 IF GIVEN, ELSE $FFFF. + BEQ SETBRK2 BREAKPOINT GIVEN + LDA #$FF +SETBRK1 STA BRKADDR,X CLEAR OLD BREAKPOINT + DEX + BPL SETBRK1 + RTS +SETBRK2 LDA A4L,X SET BREAKPOINT + STA BRKADDR,X + DEX + BPL SETBRK2 + RTS +LOAD LDA XQLOC1+1 F(H) + LDY XQLOC1+2 SETUP A3 = XQT+1 FOR HSF + BRA A3SET BUFFER (XQT=BYTE COUNT) +SETRG1 JSR A1PC + JSR SAVEPC +SETRG2 LDA ACCLOC+1 SETUP REGS FOR F(:) + LDY ACCLOC+2 +A3SET STA A3L + STY A3H + RTS +SETREG TXA F(I) SET OR DISPLAY REGS. + BNE SETRG1 TAKEN IF PC GIVEN. + LDY YSAV + LDA IN,Y + CMP #$8D + BNE SETRG2 + LDA PCREG I DISPLAYS REGS. + STA PCL + LDA PCREG+1 + STA PCH +REGDSP JSR RGDSP1 + JSR INSTDSP DISPLAY INSTRUCTION + JMP NEXTITM TO BE EXECUTED NEXT +RGDSP1 LDX #0 +RDSP1 LDA RTBL,X + JSR COUT + LDA #$BD + JSR COUT + LDA ACC,X + JSR PRBYTE + JSR OUTSP + INX + CPX #3 + BCC RDSP1 + LDX #7 +PRFLG LDA CHAR3,X PRINT 'NV-BDIZC' + JSR COUT + DEX + BPL PRFLG + JSR CROUT + LDA #$C1 PRINT ACC IN BINARY + JSR COUT + JSR OUTEQ + LDA ACC + JSR BNDSP + JSR PRBLNK3 + LDA #$D0 PRINT STATUS IN BINARY + JSR COUT + JSR OUTEQ + LDA STATUS + JSR BNDSP + JSR CROUT + LDA #$D3 + JSR COUT + JSR OUTEQ + LDA SPNT + JSR PRBYTE + LDA #$BA + JSR COUT + LDA #$D8 + JSR COUT + JSR COUT + LDY #10 + LDX SPNT +PRNTSTK JSR OUTSP PRINT STACK BYTES FROM + CPX SREF SPNT TO SREF UP TO 10 + BEQ SAVEPC MAX. + INX + LDA STACK,X + JSR PRBYTE + DEY + BNE PRNTSTK +SAVEPC LDA PCL + STA PCREG + LDA PCH + STA PCREG+1 + RTS +BINARY JSR A1PCX F(%) PRINT VALUE AT + JSR CROUT ADDRESS IN BINARY. + JSR PEEK +BNDSP LDX #$08 INDEX FOR 8 BITS +NEXTBIT ASL A + PHA + BCS BIT1 + LDA #$30 '0' + DFB $2C SKIP NEXT INSTRUCTION +BIT1 LDA #$31 '1' + JSR COUT + PLA + DEX + BNE NEXTBIT + RTS +BELL LDY #$38 DURATION +BELL2 LDA #$2B FREQUENCY + JSR WAIT + LDA SPKR + DEY + BNE BELL2 + RTS +COUTZ JMP (CSWL) +VIDOUT BIT #$60 + BEQ CTRLCHAR + TAY + CMP #$60 + BCS VID1 + CMP #$40 + BCC VID1 + AND #$BF +VID1 LDY CH + BIT RD80VID + BPL VID3 + PHA + TYA + LSR A + BCS VID2 + STA HISCR +VID2 TAY + PLA +VID3 STA (BASL),Y + STA LOWSCR + LDY CH + INY + CPY WNDWDTH + BCS CR + STY CH +VIDRTS RTS +BACKSPC DEC CH + BPL VIDRTS + LDY WNDWDTH + DEY + STY CH +UP LDA CV + DEC A + CMP #0 + BMI VIDRTS +VTABVGO JMP VTABV +CTRLCHAR ORA #$80 + CMP #$88 + BEQ BACKSPC + CMP #$8C + BEQ HOME + CMP #$8D + BNE VIDRTS +CR LDA #$00 + STA CH + INC CV + LDA CV + CMP #24 + BCC VTABVGO + DEC CV + LDX #0 SCROLL + TXA + JSR VTABZ + BRA SCRL5 +SCRL1 LDY BASH + STY BAS2H + LDY BASL + STY BAS2L + TXA + JSR VTABZ + PHX + LDX WNDWDTH + LDY #0 +SCRL2 BIT RD80VID + BPL SCRL3 + STA HISCR + LDA (BASL),Y + STA (BAS2L),Y + DEX + BEQ SCRL4 + STA LOWSCR +SCRL3 LDA (BASL),Y + STA (BAS2L),Y + INY + DEX + BNE SCRL2 +SCRL4 STA LOWSCR + PLX +SCRL5 INX + CPX #24 + BCC SCRL1 + LDA #$00 + JSR CLEOLZ + JMP VTAB +HOME LDA #0 + STA CH + STA CV + JSR VTAB + SEC + LDA CV + PHA + SBC #24 + TAX + LDA CH + BRA CLS2 +CLS1 PHA + JSR VTABZ + LDA #$00 +CLS2 PHX + JSR CLEOLZ + PLX + PLA + INC A + INX + BNE CLS1 +VTAB LDA CV +VTABV STA CV +VTABZ PHA + LSR A + AND #$03 + ORA #$04 + STA BASH + PLA + AND #$18 + BCC BSCLC2 + ADC #$7F +BSCLC2 STA BASL + ASL A + ASL A + ORA BASL + STA BASL + RTS +CLREOL LDA CH +CLEOLZ BIT RD80VID + BPL CLEOL4 + PHA CLREOL 80 COL + SEC + SBC WNDWDTH + TAX + PLA + LSR A + TAY + PHP + LDA #$A0 + PLP + BCS CLEOL8B +CLEOL8A STA HISCR + STA (BASL),Y + INX + BEQ CLEOL8C +CLEOL8B STA LOWSCR + STA (BASL),Y + INY + INX + BNE CLEOL8A +CLEOL8C STA LOWSCR + RTS +CLEOL4 TAY + SEC + SBC WNDWDTH + TAX + LDA #$A0 +CLEOL4A STA (BASL),Y + INY + INX + BNE CLEOL4A + RTS +CLEARDSP LDX #6 CLEAR DISPLAY WINDOW +CLRDSP1 LDA DSPTOP + BPL CLRDSP2 HOLD TOP OF DISPLAY + LDA #0 0 <= TOP <= 18. +CLRDSP2 CMP #18 + BCC CLRDSP3 + LDA #18 +CLRDSP3 STA DSPTOP + STA CV CLEAR 6 LINE DISPLAY + DEC CV FROM DSPTOP DOWN AND + TXA SET CV SO INSTDSP WILL + BEQ RTS4A PRINT AT DSPTOP UPON +CLRDSP4 JSR CROUT EXIT. + PHX + JSR CLREOL + PLX + DEX + BNE CLRDSP4 + BEQ CLRDSP1 +RTS4A RTS +FWAIT LDA #$FF +WAIT SEC +WAIT2 PHA +WAIT3 SBC #$01 + BNE WAIT3 + PLA + SBC #$01 + BNE WAIT2 + RTS +NXTA4 INC A4L INCREMENT A4 + BNE NXTA1 + INC A4H +NXTA1 LDA A1L + CMP A2L + LDA A1H + SBC A2H + INC A1L + BNE RTS4B + INC A1H +RTS4B RTS CARRY SET IF A1 >= A2 +CTRLC LDY KBD CTRL-C = BREAK TO MONITOR + BPL RTS4B + STY KBDSTRB + CPY #$93 CTRL-S = PAUSE + BNE CTLC +KYWAIT LDY PB0 F(S) ENTRY POINT + BMI KYWT2 + LDY KBD + BPL KYWAIT + STY KBDSTRB + DFB $2C +KYWT2 LDY #0 0 = OPEN APPLE PRESSED +CTLC CPY #$83 + BNE RTS4B + JMP MONZ +RDKEY STY YSAV1 + LDY RDSCR + PHP + LDY RDPAGE2 + PHP + STA INHPAGE2 + STA LOWSCR + PHX + LDA CH + BIT RD80VID + BPL KEY2 + LSR A + BCS KEY2 + STA HISCR +KEY2 TAY + LDA (BASL),Y + PHA + EOR #$80 + BIT #$20 + BNE KEY3 + EOR #$40 +KEY3 STA (BASL),Y +KEY4 LDX KBD + BPL KEY4 + STA KBDSTRB + PLA + STA (BASL),Y + STA LOWSCR + TXA + JMP ENDHOOK +NOTCR LDA IN,X LABEL MARKS 'IN' + JSR COUT + CMP #$88 + BEQ BCKSPC + CPX #34 BEEP ON LAST 4 CHAR. + BCC NOTCR1 + JSR BELL +NOTCR1 INX + CPX #38 38 CHARACTERS ALLOWED + BCC NXTCHAR + LDA #$DC + JSR COUT +GETLNZ JSR CROUT + LDA PROMPT + JSR COUT + LDX #$01 +BCKSPC TXA + BEQ GETLNZ + DEX +NXTCHAR JSR RDKEY + CMP #$95 + BEQ NXTCHAR IGNORE '->' + CMP #$FF + BNE NOTDEL + LDA #$88 DELETE KEY = BACKSPACE +NOTDEL CMP #$88 + BNE CAPTST + PHA + JSR COUT BACKSPACE + JSR OUTSP DELETE CHARACTER + PLA BACKSPACE +CAPTST CMP #$E0 + BCC ADDINP + AND #$DF +ADDINP STA IN,X + CMP #$8D + BNE NOTCR +CROUT LDA #$8D + BNE COUTGO +OUTSP LDA #$A0 + BNE COUTGO +PRA1 LDY A1H + LDX A1L +PRYX2 JSR CROUT + JSR PRNTYX + LDY #$00 + LDA #$AD +COUTGO JMP COUT +ASC SEC F(") +XAM ROR A CARRY INTO BIT 7 + STA A3H + BRA XAM1 +MOD8CHK LDA A1L + AND #$07 + BNE DATAOUT +XAM1 JSR PRA1 F(.) A1.A2 HEX OR ASC +DATAOUT JSR OUTSP + LDA A1H SEE IF ZERO PAGE + BNE XAM2 + LDA A1L + SEC + SBC #PCL + BCC XAM2 TAKEN IF A1L < PCL + TAX ELSE GET FROM ZBUF + LDA ZBUF,X + BRA XAM3 +XAM2 JSR A1PCX + JSR PEEK +XAM3 LDX A3H + BPL XAM4 + ORA #$80 XAM IN ASC + CMP #$A0 + BCS PRASC TAKEN IF NORM. OR LCASE + LDA #$A0 SPACE FOR CTRL OR INV +PRASC JSR COUT + BRA XAM5 +XAM4 JSR PRBYTE XAM IN HEX +XAM5 JSR NXTA1 + BCC MOD8CHK CARRY CLEAR IF A1 ZFLG:AA + STA ZFLG +RST2 JSR INITXQTS + STZ TFLG + STZ JFLG +TXTMON JSR TEXT + JSR HOME + JSR PRTITLE + BRA MONZ +ERRMON LDA ERRFLG IF ERROR, 'ERR' ON BRK + BEQ MON +PRERR LDX #4 PRINT 'ERR' +ERROUT LDA ERRMSG,X + JSR COUT + DEX + BPL ERROUT +MON CLD + JSR BELL +MONZ LDX #STKLMT SET STACK UPPER LIMIT + TXS + DEC BRKADDR+1 INSURE BRKPOINT CLEARED + JSR ZSWAPE MAKE SURE ANALYST 0 PAGE. + JSR CHKVID MATCH HOOKS W/DISPLAY MODE + JSR STPRMPT + JSR GETLNZ + JSR ZMODE + STZ ERRFLG CLEAR ERROR FLAG + STZ DSPTOP DISPLAY AT TOP +NXTITM JSR GETNUM HANDLE HEX DIGS TO 1ST + STY YSAV NON-HEX CHAR+1 (Y=INDX) + LDY #SUBTBL-CHRTBL +CHRSRCH DEY ACC = F(ACC) + BMI PRERR + CMP CHRTBL,Y + BNE CHRSRCH + JSR TOSUB +NEXTITM LDY YSAV + BRA NXTITM +DIG LDX #$03 HEX DIGIT NOW IN ACC LO + ASL A NIBBLE. KEYS 0-9=00-09 + ASL A KEYS A-F=FA-FF. MOVE + ASL A LO NIBBLE TO HI NIBBLE + ASL A +NXTBIT ASL A 4 BIT HEX DIG. INTO A2L + ROL A2L A2L TO A2H + ROL A2H + DEX + BPL NXTBIT +NXTBAS LDA MODE + BNE NXTBS2 IF MODE=0 COPY + LDA A2H,X A2 TO A1 & A3 + STA A1H,X + STA A3H,X +NXTBS2 INX + BEQ NXTBAS + BNE NXTCHR +GETNUM LDX #0 + LDA ZFLG SET A2 = 0 ONLY IF + CMP #$AA NOT IN DEFERRED STEP + BNE NXTCHR MODE. + STX A2L + STX A2H +NXTCHR LDA IN,Y F(ACC) = ACC EOR $B0 + INY ADC $88 (CARRY SET) + EOR #$B0 KEYS 0-9=$00-09 + CMP #$0A + BCC DIG TAKEN IF KEYS 0-9 + ADC #$88 KEYS A-F=$FA-FF + CMP #$FA + BCS DIG TAKEN IF KEYS A-F + RTS +TOSUB TYA # OF FUNCTION (START=0) + ASL A MULT BY 2 + TAY + LDA SUBTBL+1,Y + PHA + LDA SUBTBL,Y + PHA + LDA MODE OLD MODE FOR F(CR)&F( ) +ZMODE LDY #$00 + STY MODE + RTS RTS TO SUBROUTINE +EXECJSR LDA JFLG F(J) + BNE GOJSR +ERRJ JMP PRERR F(J) ATTEMPTED W/O JSR! +GOJSR LDY YSAV GET # OF PARM BYTES + JSR GETNUM + DEY + STY YSAV + LDA A2H + BNE ERRJ + LDA A2L + CMP #10 + BCS ERRJ ONLY 9 PARM BYTES MAX + TAY SAVE BYTE COUNT +GOPC LDX #17 +XQINIT2 LDA INITBL2,X FILL DUMMY BLOCK + STA XQT,X + DEX + BPL XQINIT2 + LDA PCL MOVE JSR ADDR TO XQT +XQLOC1 STA XQT+1 + LDA PCH + STA XQT+2 + LDX SPNT SET PC = PARM LIST - 1 + INX + LDA STACK,X + STA PCL + INX + LDA STACK,X + STA PCH + STX SPNT + TYA GET PARM BYTES + TAX + BEQ MVPRM1 NO PARM BYTES TO MOVE +MOVPARM JSR YPEEK MOVE PARM LIST TO DUMMY + STA XQT+2,Y + DEY + BNE MOVPARM +MVPRM1 INX + TXA ADJ PC TO POINT TO INST + CLC FOLLOWING PARM LIST + JSR PCADJAP + JMP XQJ EXECUTE JSR IMMED. MODE +INITBL2 JSR $0000 DUMMY BLOCK FOR F(J) + NOP 9 NOP'S FOR PARM BYTES + NOP + NOP + NOP + NOP + NOP + NOP + NOP + NOP + JSR XQTS+36 RESTORE ANALYST R/W + JMP JRTS +JRTS JSR SAVE + JSR CHKVID + LDA JFLG + BEQ JRTS3 DURING 'G0' W/O BREAK + STZ JFLG + LDA TFLG + BEQ JRTS2 DURING 'STEP' + JMP TRACE5 DURING TRACE IMMEDIATE +JRTS2 DEC DSPTOP UPDATE REGDSP AFTER JSR. +JRTSX JSR CLEARDSP 'SKIP' ENTERS HERE + JMP NXTPC +JRTS3 JMP NEXTITM +FIND LDA #$FF F(CTRL-F) A4 ALONE EXITS + JMP STPRMPT VIA NEXTITM +MINI2 JSR GETNUM + CMP #$93 F(:) +A1TOPC BNE ERROR + TXA + BEQ ERROR + JSR A1PCLP +RDMNEM LDA #$03 INDEX FOR 3 CHAR MNEM + STA A1H +RDMNEM2 JSR CHARIN + ASL A + SBC #$BE + CMP #$C2 LESS THAN 'A' + BCC ERROR NOT ASC LETTER SO ERR + ASL A + ASL A + LDX #$04 INDEX FOR 5 BITS +RDMNEM3 ASL A MOVE 5 BIT LETTER CODE + ROL A4L (* 3 LETTERS) INTO A4. + ROL A4H 26 LETTERS REQ. 5 BITS + DEX + BPL RDMNEM3 + DEC A1H + BEQ RDMNEM3 + BPL RDMNEM2 + LDX #$05 INDEX FOR 6 FORMAT BITS +RDFMT JSR CHARIN + STY YSAV + CMP CHAR1,X + BNE RDFMT2 + JSR CHARIN + CMP CHAR2,X + BEQ RDADDR + LDA CHAR2,X + BEQ RDFMT3 + CMP #$A4 + BEQ RDFMT3 + LDY YSAV +RDFMT2 CLC +RDFMT3 DEY +RDADDR ROL A5L + CPX #$03 + BNE RDADDR3 + JSR GETNUM + LDA A2H + BEQ RDADDR2 + INX +RDADDR2 STX YSAV1 + LDX #$03 + DEY +RDADDR3 STX A1H + DEX + BPL RDFMT + LDA A5L + ASL A + ASL A + ORA YSAV1 + CMP #$20 + BCS RDADDR4 + LDX YSAV1 + BEQ RDADDR4 + ORA #$80 +RDADDR4 STA A5L + STY YSAV + LDA IN,Y + CMP #$8D + BEQ DISAS + JMP A1TOPC +DISAS JMP DSS +CHARIN LDA IN,Y + INY + CMP #$A0 + BEQ CHARIN +ENDMINI RTS +RELOC LDA STARTLOC+1 F(R) + STA PCH + STZ PCL MAKE SURE ANALYST IS + JSR PEEK BEING READ FOR MOVE + CMP #$4C BY PEEKING START BYTE. + BNE ENDMINI DO NOT RELOCATE! + LDA A1H + STA A4H + PHA + STZ A4L + LDA STARTLOC+1 + STA A1H + STA A5L + STZ A1L + LDA NOTCR+2 LOCATION OF 'IN' + STA A2H WHICH MARKS END. + LDA NOTCR+1 + STA A2L + LDA A1H CALC DIFFERENCE BETWEEN + SEC OLD & NEW ORG + SBC A4H + STA A5H + LDA #AUXV-SUBTBL + LSR A DIVIDE BY 2 + TAY # OF WORDS + LDX #$FF +RELOC2 INX CONVERT SUBTBL WORDS + INX + LDA SUBTBL,X + SEC + SBC A5H + STA SUBTBL,X + DEY + BNE RELOC2 + LDA #$60 PUT IN RTS TO DISABLE + STA AUXV AUX LOADER. NOT MOVED. + JSR MOVE NEW ORG 80 +CHK80 BCC SET40 80 -> 40 +RTS7 RTS +SETVID LDY YSAV F(@) + LDA IN,Y + INC YSAV + CMP #$B4 '4' + BEQ SET40 + CMP #$B8 '8' + BEQ SET80 + DEC YSAV @ ALONE +TEXT LDA OUTVECT + STA CSWL + LDA OUTVECT+1 + STA CSWH + STA INHPAGE2 FOR AUX TO DISPLAY TEXT. + STA TXTSET + LDA RD80VID SET 40 OR 80 COL + BPL SET40 TEXT BASED ON RD80VID +SET80 LDA #$FF + STA FLG8 + LDA #80 + STA WNDWDTH + BIT RD80VID + BMI SET8D + STA SET80VID + LDA #$00 +SET8A PHA + JSR VTABZ + LDY #$00 +SET8B LDA (BASL),Y + TAX + PHY + TYA + LSR A + TAY + BCS SET8C + STA HISCR +SET8C TXA + STA (BASL),Y + PLY + STA LOWSCR + INY + CPY #$28 + BCC SET8B + TYA + JSR CLEOLZ + PLA + INC A + CMP #$18 + BCC SET8A +SET8D BRA SETDONE +SET40 STZ FLG8 + BIT RD80VID + BPL SET4D + STA CLR80VID + LDA #$00 +SET4A PHA + JSR VTABZ + LDY #$27 +SET4B TYA + LSR A + PHY + TAY + BCS SET4C + STA HISCR +SET4C LDA (BASL),Y + PLY + STA LOWSCR + STA (BASL),Y + DEY + BPL SET4B + PLA + INC A + CMP #$18 + BCC SET4A +SET4D LDA #40 + STA WNDWDTH + LDA #$27 + CMP CH + BCS SETDONE + STA CH +SETDONE JMP VTAB +HELP LDY #0 F(?) LIST LAST 16 PC +HLP2 LDA PCBUF,Y ADDRESSES EXECUTED + INY DURING TRACE. + LDX PCBUF,Y + INY + JSR PRNTAX + CPY PCPNT + BNE HLP3 + LDA #$BC + JSR COUT +HLP3 JSR CROUT + CPY #32 + BCC HLP2 + RTS +PRTITLE LDX #$00 F(V). PRINT TITLE +TITLLOC LDA TITLE,X + BEQ PRADDR + JSR COUT + INX + BRA TITLLOC +PRADDR LDA STARTLOC+1 PRINT ORIGIN ADDRESS + JSR PRBYTE + LDA #0 + JSR PRBYTE + JMP CROUT + SKP 1 +*** PROGRAM DATA AREA *** + SKP 1 +TITLE DFB $8D + ASC "ANALYST 128E" + DFB $8D TITLE MARKS START OF PDA + ASC "ORG = " +BANKORG ASC "$" + DFB $00 +MNEML DFB 28,138 + DFB 28,35,93,139,27,161,157,138 + DFB 29,35,157,139,29,161,28,41 + DFB 25,174,105,168,25,35,36,83 + DFB 27,35,36,83,25,161,173,26 + DFB 165,91,165,172,139,138,174,174 + DFB 168,173,41,138,124,139,21,156 + DFB 109,156,165,105,41,83,132,19 + DFB 52,17,165,105,35,160 +MNEMR DFB 216,98 + DFB 90,72,38,98,148,136,84,68 + DFB 200,84,104,68,232,148,196,180 + DFB 8,132,116,180,40,110,116,244 + DFB 204,74,114,242,164,138,6,170 + DFB 118,162,116,198,116,116,68,104 + DFB 178,50,178,114,34,114,26,26 + DFB 38,38,114,114,136,200,196,202 + DFB 38,72,68,68,162,200 +CHAR1 DFB 172,169,172,163,168,164 +CHAR2 DFB 217,0,216,164,164,0 +CHAR3 ASC "CZIDB-VN" +RTBL ASC "AXY" +ERRMSG DFB $8D + ASC 'RRE' + DFB $8D +PAGEFIL EQU >* + DS $FF-PAGEFIL,0 +ROMFLG DFB 1 TRACE JSR ROM $D000-FFFF +FMT2 DFB 0,33,129,130,90,73,89,77 + DFB 145,146,134,74,133,157 +FMT1 DFB 240,34,0,51,93,130,0,147 + DFB 243,34,0,51,93,136,0,153 + DFB 240,47,0,51,93,143,0,159 + DFB 240,34,0,59,93,136,0,148 + DFB 253,34,0,51,93,200,0,147 + DFB 17,34,0,51,93,200,0,169 + DFB 241,34,0,51,93,143,0,159 + DFB 241,34,0,51,93,143,0,159 + DFB 38,49,135,154 +OPC65C DFB 18,50,82,114 + DFB 146,178,210,242,58,26,137,28 + DFB 20,122,90,156,100,158,116,124 + DFB 60,52 + DFB 76,164,172,180,188,196,204,228 + DFB 236 +REPL65C DFB 17,49,81,113,145,177 + DFB 209,241,194,226,52,164,172,196 + DFB 228,92,92,92,92,124,60,52 + DFB 124,160,160,160,160,192,192 + DFB 224,224 +CHRTBL DFB 152,249,177,241,3,236 + DFB 166,164,6,149,5 + DFB 0,147,2,167,198,153 + DFB 155,154,239,233,1,191 + DFB 168,237,158,235,197 +SUBTBL DW HELP-1 F(?) LIST PC'S TRACED + DW SETVID-1 F(@) SWITCH 40/80 COL + DW AUXV-1 F(CTRL-X) MOVE TO AUX + DW AUXRW-1 F(X) MAIN/AUX $200-BFFF + DW EXECJSR-1 F(J) EXECUTE JSR + DW STEP-1 F(S) STEP + DW SETMODE-1 F(-) 16 BIT SUBTRACTION + DW SETMODE-1 F(+) 16 BIT ADDITION + DW MOVE-1 F(M) MOVE + DW LT-1 F(<) COPY A2 TO A4 & A5 + DW LIST-1 F(L) LIST DISASSEMBLY + DW GO-1 F(G) GO + DW SETMODE-1 F(:) STORE + DW SETREG-1 F(I) SET INTERNAL PC/REG + DW SETMODE-1 F(.) XAM + DW CRMON-1 F(CR) HANDLE CR + DW BLANK-1 F( ) HANDLE SPACES + DW ASC-1 F(") DUMP IN ASCII + DW MINI-1 F(!) MINI-ASSEMBLER + DW PRTITLE-1 F(V) PRINT TITLE + DW SETPRNT-1 F(P) TO PRINTER + DW LOAD-1 F(H) LOAD FOR HSF + DW FIND-1 F(CTRL-F) HEX SEQ. FIND + DW SETDOS-1 F(/) SET DOS CALL JSR #. + DW TRACE-1 F(T) TRACE + DW BINARY-1 F(%) VALUE IN BINARY + DW RELOC-1 F(R) RELOCATOR + DW CRMON-1 HANDLE CTRL-L AS CR +OUTVECT DW VIDOUT +STARTLOC DW START + SKP 1 +* DYNAMIC PROGRAM AREA * + SKP 1 +AUXV JMP AUXLOAD F(CTRL-X) ONE TIME VECTOR +CSWL DS 1 ADDR. OF OUTPUT ROUTINE +CSWH DS 1 +TFLG DS 1 <>0 = CANCEL COUT FOR TRC +JFLG DS 1 SET TO ALLOW F(J) +DOSCALL DS 2,255 SUBROUTINE TO JSR IMMED. +ERRFLG DS 1 SET FOR BAD OPCODE +PCREG DS 2,0 +ACC DFB 0 DON'T CHANGE ORDER +XREG DFB 0 OF ACC TO SPNT +YREG DFB 0 +STATUS DFB 0 +SPNT DFB $F0 +SREF DFB $F0 STACK REF SET BY TXS OPC +LMNEM DS 1 +RMNEM DS 1 +LENGTH DS 1 +FORMAT DS 1 +MODE DS 1 +FLG8 DS 1 FF = 80 COL, 0 = 40 COL +WNDWDTH DS 1 +PROMPT DS 1 +CH DS 1 +CV DS 1 +DSPTOP DS 1 TOP OF DISPLAY FOR STEP +YSAV DS 1 +YSAV1 DS 1 +PCPNT DFB 0 INDEX TO PCBUF +BRKADDR DS 2,255 BREAK FOR STEP,TRACE,LIST +ZBUF DS $100-PCL PAGE ZERO STORAGE BUFFER +IN DS 38,0 KEYIN BUFFER. RELOC LABEL. +TEMP1 EQU IN+12 FOR INSTDSP AND STEP. +TEMP2 EQU IN+13 FOR STEP. +TEMP3 EQU IN+14 FOR STEP. +PCFLG EQU IN+17 PRNTPC ON/OFF FOR TRACE +COUNTER EQU IN+18 FOR TRACE +PCBUF DS 32 32 BYTE PC SAVE AREA. +AUXLOAD LDA #>START F(CTRL-X) MOVE ANALYST + STA MA1 TO AUX. THIS CODE NOT + STA MA4 RELOCATEABLE. + LDA #AUXLOAD + STA MA2 + LDA #- * +* * +* 128K VERSION EX * +* * +* 6/22/91 * +* * +********************************* + SKP 1 +*** COMMANDS *** + SKP 1 +; CTRL-F FIND HEX SEQUENCE DEFINED BY F(H) +; G GO EXECUTE IN IMMEDIATE MODE +; H LOAD BYTES FOR HSF F(CTRL-F) BY USING H: +; I DISPLAY/SET PC/INTERNAL A,X,Y,P,S REGISTERS +; J JUMP. EXECUTE JSR INSTRUCTION IN STEP MODE +; CTRL-L CLEAR PRESENT SCREEN AND HOME CURSOR +; L LIST DISASSEMBLY OR LOOP IN TRACE MODE. +; M MOVE BLOCK OF MEMORY +; P SEND OUTPUT TO PRINTER +; R RELOCATE ANALYST TO NEW ADDRESS PAGE +; S ENTER STEP MODE. STEP INSTRUCTION +; T TRACE PROGRAM +; V PRINT ANALYST VERSION# AND ORIGIN ADDRESS. +; CTRL-X MOVE ANALYST TO AUX. DISABLED AFTER USE. +; X SKIP INSTRUCTION DURING STEP. TOGGLE MAIN/AUX +; " DUMP MEMORY IN ASCII +; / SET OR PRINT SUBROUTINE TO JSR IMMED MODE +; % PRINT ADDRESS DATA VALUE IN BINARY +; ? PRINT LAST 16 PC'S EXEC'D DURING TRACE +; @ SET TEXT 40/80 COL SCREEN +; < RANGE DELIMITER +; . RANGE DELIMITER +; + 16 BIT ADDITION +; - 16 BIT SUBTRACTION +; : STORE VALUE IN MEMORY +; ! ENTER MINI-ASSEMBLER. ALONE TO EXIT + SKP 1 +*** ROM ZERO PAGE EQUATES *** + SKP 1 +MCSWL EQU $36 +MCSWH EQU $37 +MA1 EQU $3C +MA2 EQU $3E +MA4 EQU $42 + SKP 1 +*** ANALYST EQUATES *** + SKP 1 +PCL EQU $EF LABEL MARKS PAGE 0 +PCH EQU $F0 +BASL EQU $F1 +BASH EQU $F2 LABEL USED AS IDENTIFIER +ZFLG EQU $F3 1 BYTE ID = $AA +A1L EQU $F4 A1L-A5H MUST BE IN ORDER +A1H EQU $F5 FOR MINI-ASSEMBLER +A2L EQU $F6 +A2H EQU $F7 +A3L EQU $F8 +A3H EQU $F9 +A4L EQU $FA +A4H EQU $FB +A5L EQU $FC +A5H EQU $FD +BAS2L EQU $FE +BAS2H EQU $FF LABEL MARKS END OF PAGE 0 +WARMV EQU $0102 WARM REENTRY +XQTS EQU WARMV+6 EXEC AREA FOR STEP, TRACE +YPOKE EQU XQTS+21 +PEEK EQU XQTS+29 +YPEEK EQU XQTS+31 +XQT EQU XQTS+50 18 BYTES +PCBUF EQU XQT+18 32 BYTE PC SAVE AREA. +IN EQU PCBUF+32 KEYIN BUFFER. 38 BYTES. +MLI EQU $BF00 PRODOS INTERFACE + SKP 1 +*** ROM EQUATES *** + SKP 1 +KBD EQU $C000 +INHPAGE2 EQU $C001 AUX $400-7FF SHOWS TEXT +MAINRD EQU $C002 +MAINWR EQU $C004 +CLR80VID EQU $C00C +SET80VID EQU $C00D +KBDSTRB EQU $C010 +RDAUXZP EQU $C016 BMI IF AUXZP +RDPAGE2 EQU $C018 BMI IF INHPAGE2 ON +RDTEXT EQU $C01A BMI IF TEXT MODE +RDSCR EQU $C01C BMI IF DPAGE2 ON +RD80VID EQU $C01F BMI IF 80 COL MODE +SPKR EQU $C030 +TXTSET EQU $C051 +LOWSCR EQU $C054 +HISCR EQU $C055 +PB0 EQU $C061 OPEN APPLE KEY +PB1 EQU $C062 CLOSED APPLE KEY +SWITCH2 EQU $C082 +AUXMOVE EQU $C311 +OUTPORT EQU $FE95 USED TO SET PRINTER +IDROM EQU $E000 = $4C IF ROM PRESENT + SKP 3 +START JMP RESET COLD START +INSDS1 LDX PCL + LDY PCH + JSR CROUT + JSR PRYX2 + JSR OUTSP +INSDST JSR PEEK +INSDS2 LDY #$FF DETERMINE LENGTH OF + STY LMNEM INSTRUCTION. OPCODE IN + TAY ACC. STORED IN LENGTH. + LSR A INVALID = 0 + BCC IEVEN 1 BYTE = 0 + ROR A 2 BYTE = 1 + BCS ERR 3 BYTE = 2 + AND #$87 +IEVEN LSR A + TAX + LDA FMT1,X + BCC RTMSKZ + LSR A + LSR A + LSR A + LSR A +RTMSKZ AND #$0F + CMP #$0F + BNE GETFMT +ERR LDY #$FF BAD OPCODE + STY ERRFLG + INY + STY LMNEM + STY RMNEM + STY FORMAT + STY LENGTH +RTS1 RTS +GETFMT TAX + LDA FMT2,X + STA FORMAT + AND #$03 + STA LENGTH + LDA TFLG BYPASS PRINT FORMATTING + BNE RTS1 IN TRACE + TYA + AND #$8F + PHA TEMP STORAGE + TYA + LDX #31 +GETFMT2 DEX + BMI MNNDX + CMP OPC65C,X MAKE SUBSTITUTION IF + BNE GETFMT2 65C02 OPCODE. + LDA REPL65C,X +MNNDX PLX + LDY #$03 + CPX #$8A + BEQ MNNDX3 +MNNDX1 LSR A + BCC MNNDX3 + LSR A +MNNDX2 LSR A + ORA #$20 + DEY + BNE MNNDX2 + INY +MNNDX3 DEY + BNE MNNDX1 + RTS +INSTDSP JSR INSDS1 + PHA +PRNTOP JSR YPEEK + JSR PRBYTE + LDX #$01 +PRNTBL JSR PRBLNK + CPY LENGTH + INY + BCC PRNTOP + LDX #$03 + CPY #$03 + BCC PRNTBL + PLA + TAY + LDA LMNEM + BEQ PRMN1 + LDA MNEML,Y + STA LMNEM + LDA MNEMR,Y + STA RMNEM +PRMN1 LDA #$00 + LDY #$05 +PRMN2 ASL RMNEM + ROL LMNEM + ROL A + DEY + BNE PRMN2 + ADC #$BF + JSR COUT + DEX + BNE PRMN1 + JSR OUTSP + LDY LENGTH + LDX #$05 +PRADR1 CPX #$02 + BEQ PRADR5 +PRADR2 ASL FORMAT + BCC PRADR3 + LDA CHAR1,X + JSR COUT + LDA CHAR2,X + BEQ PRADR3 + JSR COUT +PRADR3 DEX + BPL PRADR1 + RTS +PRADR4 DEY + BMI PRADR2 + JSR PRBYTE +PRADR5 LDA FORMAT + CMP #$E8 + JSR YPEEK + BCC PRADR4 + JSR PCADJA + TAX + INX + BNE PRNTYX + INY +PRNTYX TYA +PRNTAX JSR PRBYTE + TXA + JMP PRBYTE +PRBLNK3 LDX #3 +PRBLNK JSR OUTSP PRINT X SPACES + DEX + BNE PRBLNK + RTS +PCADJ SEC UPDATE PC BY LENGTH+1 +PCADJLP LDA LENGTH UPDATE PC BY LENGTH +PCADJAP JSR PCADJA UPDATE PC BY ACC + STA PCL + STY PCH + RTS +PCADJL LDA LENGTH SET Y,A = PC+LENGTH +PCADJA LDY PCH SET Y,A = PC+ACC + TAX + BPL PCADJ2 + DEY +PCADJ2 ADC PCL + BCC RTS2 + INY +RTS2 RTS +STEP DEC YSAV F(S) +STEPL TXA + BEQ STEPZ + JSR SETBREAK FIRST TIME + LDX #1 + BNE SSTEP ALWAYS TAKEN +STEPZ JSR KYWAIT + BNE STEP1 +STEPE INC YSAV CTRL-C = EXIT TO NEXTITM + JMP ZSWAPE VIA ZSWAPE RTS +STEP1 CPY #$CA + BNE STEP2 + LDA JFLG J = SINGLE STEP + BEQ SSTEP IF NO JSR, ELSE + JMP TRCPCS EXECUTE SUBROUTINE +STEP2 CPY #$CC L = LOOP. SET BREAK + BNE STEP2A POINT AFTER INSTRUCTION + JSR PCADJL TO BE EXECUTED NEXT + STA BRKADDR AND ENTER TRACE. + STY BRKADDR+1 + JMP STEPT +STEP2A LDA JFLG SPC = SINGLE STEP IF + BNE STEP3 NOT JSR, ELSE IGNORE + CPY #$A0 + BEQ SSTEP +STEP3 CPY #$D3 S OR OPEN APPLE = + BEQ SSTEP SINGLE STEP ALWAYS + TYA + BEQ SSTEPW = 0 FOR OPEN APPLE. + CPY #$D4 T = ENTER TRACE MODE + BNE STEP4 + LDY #$FF +STEPT STY TFLG SET TRACE MODE FLAG + STY PCFLG ENABLE PC PRINTING + JMP STRACE AND ENTER TRACE. +STEP4 CPY #$D8 X = SKIP NEXT INSTRUCTION + BNE STEP5 + STZ JFLG ENABLE SPC IF SKP WHILE + STZ ERRFLG JSR DISPLAYED ACTIVE. + JSR PCADJ CLR IN CASE SKIP ERROR. + JMP JRTSX +STEP5 CPY #$C0 @ = TEXT MODE + BNE STEPL LOOP BACK FOR INPUT + JSR TEXT +SSTEPW JSR FWAIT PAUSE TO RELEASE O/A KEY +SSTEP JSR A1PC +SSTEPT JSR CLEARDSP TRACE RE-ENTRY TO STEP + JSR INSTDSP + JSR PRBLNK3 + JSR PEEK + AND #$0F + CMP #$01 SEE IF ZERO PAGE IND + BNE SSTEPZ + LDA #$A8 '(' + JSR COUT PRINT ABSOLUTE VALUE + JSR PEEK IN PARENTHESIS + AND #$10 + BNE INDY TAKEN FOR (NN),Y. + LDX XREG FOR (NN,X). +INDY TXA X=0 FOR (NN),Y + STA TEMP1 + LDY #1 + JSR YPEEK + CLC + ADC TEMP1 + PHA + JSR ZSWAP GET PROGRAM PAGE 0 AND + PLA SAVE POINTER ADDRESS ON + TAX STACK. + LDA $01,X + PHA + LDA $00,X + PHA + JSR ZSWAP RESTORE ANALYST PAGE 0 + PLA AND RECOVER POINTER ADDR. + TAX + PLA + JSR PRNTAX + LDA #$A9 ')' + JSR COUT +SSTEPZ JMP TSTEP +PRNTPC LDA #$FF PRINT PC AT TOP OF SCREEN + STA CV BY FORCING CROUT TO INC + JSR CROUT CV TO 0 (NEED FOR 80 COL) + LDA #29 + STA CH + LDA PROMPT + JSR COUT + LDA PCH + LDX PCL + JMP PRNTAX +TRACEPC LDX PCPNT SAVE PC TO BE EXEC'D + LDA PCH IN LIST BUFFER. + STA PCBUF,X + INX + LDA PCL + STA PCBUF,X + INX + CPX #32 + BCC PNTINC + LDX #0 +PNTINC STX PCPNT + LDA PB0 + BPL TRCPC1 + LDA PCFLG O/A TOGGLES PRINT PC + EOR #$FF ON/OFF + STA PCFLG + JSR FWAIT PAUSE TO RELEASE O/A KEY +TRCPC1 LDA PCFLG + BEQ TRCPC2 BYPASS PRINTING PC. + INC COUNTER PRINT PC + BNE TRCPC2 EVERY 256 INSTRUCTIONS + LDA PROMPT FLASHING '$' FOR TRACE + EOR #$04 ACTIVITY. $A4->$A0->$A4 + STA PROMPT + JSR PRNTPC +TRCPC2 LDA JFLG + BEQ TRACE5 + LDA PCH + CMP #$C0 + BCC TRCPCD + LDY ROMFLG + BNE TRCPCD + CMP #$D0 + BCC TRCPCI + LDY IDROM JSR ROM $C000-FFFF IN + CPY #$4C IMMEDIATE MODE UNLESS + BEQ TRCPCI ROM FLAG SET <> 0. +TRCPCD CMP DOSCALL+1 TRACE THRU JSR UNLESS = + BNE TRACE5 DOS SUBROUTINE SPECIFIED + LDA PCL BY F(/). + CMP DOSCALL + BNE TRACE5 +TRCPCI LDA PCFLG EXEC JSR IMMEDIATE. DON'T + BEQ TRCPCS PRINT IF O/A TURNED OFF. + JSR SPROMPT '#' DENOTES JSR IMMED. + JSR PRNTPC PRINT EXEC SUBROUTINE + JSR DPROMPT '$' PROMPT + LDA #$FF FORCE PC PRINTING + STA COUNTER AFTER JSR IMMED. +TRCPCS LDA PCL SEE IF PC = $BF00 + BNE TRCPCG + LDA PCH + CMP # TRACE ENTRY POINT + STZ DSPTOP FOR STEP -> TRACE + JSR DPROMPT '$' PROMPT + JSR CLEARDSP +TRACE5 LDX #1 IF PC = A4 THEN ENTER STEP +TRACE6 LDA PCL,X + CMP BRKADDR,X + BNE TRACE7 + DEX + BPL TRACE6 + JSR SETBREAK CLEAR OLD BREAKPOINT + BRA TRACES +TRACE7 LDA PB1 BACK TO STEP MODE IF + BMI TRACES CLOSED APPLE PRESSED + JMP TRACE8 +TRACES STA KBDSTRB + STZ TFLG CLEAR TRACE FLAG + STZ DSPTOP RESET DISPLAY TO TOP + LDA RDTEXT SEE IF GRAPHICS MODE + BMI TRACES2 + JSR TEXT GRAPHICS -> TEXT +TRACES2 JSR STPRMPT PROMPT BACK TO OLD '#' + DEC YSAV + LDY YSAV + LDA #$D3 PUT 'S' INTO INPUT BUFFER + STA IN,Y + JMP SSTEPT RE-ENTER STEP MODE +NBRNCH JSR SAVE ALL OTHER OPCODES + BRA UPDPC +BRANCH JSR SAVE BRANCH WITH COND. MET + CLC + LDY #$01 + JSR YPEEK + JSR PCADJAP +UPDPC SEC +PCINC JSR PCADJLP +NEWPC LDA TFLG + BNE TRACEBY BYPASSES NEXTITM +NXTPC JSR CROUT + JMP REGDSP +TRACEBY JMP TRACEPC +XJMPATX INX + BNE XJMPAT +XJSR STA JFLG OK FOR F(J) + INC DSPTOP + CLC + JSR PCADJL SET Y,A = RTS ADDR + PHA + LDX SPNT + TYA + STA STACK,X + DEX + PLA + STA STACK,X + DEX + STX SPNT + LDY #$02 +XJMP CLC +XJMPAT JSR YPEEK + PHA + DEY + JSR YPEEK + STA PCL + PLA + STA PCH + BCC NEWPC + DEX + BNE XJMP + LDA XREG + CLC + JSR PCADJAP + LDY #1 + BRA XJMP +TRACE8 JSR INSDST +TSTEP LDA ERRFLG IF BAD OPCODE THEN BRK + BNE XBRK + STZ JFLG DISALLOW F(J) IF NO JSR + JSR PEEK GET OPCODE + LDY LENGTH + CPY #2 CHECK ALL 3-BYTE INST + BEQ TSTEP3 + JMP TSTEP4 +TSTEP3 CMP #$20 + BEQ XJSR + CMP #$7C + BEQ XJMPATX + CMP #$4C + BEQ XJMP + CMP #$6C + BEQ XJMPAT + PHA SAVE OPCODE. + JSR YPEEK GET ADDRESS HI-BYTE. + CMP #$01 HANDLE 3-BYTE $100 REF + BNE TSTEP3X SPECIAL. + PLA ADJ STACK. + LDA STACKLOC+2 SUBSTITUTE PSUEDO-STACK + BRA XQSTK + DS 8,0 +XQST1 JSR YPEEK +XQSTK STA XQTS+3,Y + DEY + BPL XQST1 + JSR RESTORE + JMP XQTS+3 EXEC IN ANALYST R/W MODE +XBRK STZ DSPTOP + STZ TFLG + JSR CLEARDSP + JSR INSTDSP + JSR CROUT + JSR RGDSP1 + JSR BELL + JMP STEPE EXIT TO NEXTITM. +TSTEP3X CMP #$C0 $C002-C005, $C008-C009 + BNE TSTEP5 AUX R/W SWITCHES HANDLE + DEY SPECIAL. + JSR YPEEK + INY + CMP #$02 + BCC TSTEP5 + CMP #$04 + BCC TSTEPRD + CMP #$06 + BCC TSTEPWR + CMP #$08 + BCC TSTEP5 + CMP #$0A + BCS TSTEP5 + STA TEMP3 + ROR A + ROR A + EOR RDAUXZP + BPL STOUT2 NO CHANGE IN ZP STATE. + JSR ZSWAP RESTORE PROGRAM ZP. + LDA TEMP3 NEW ZP STATE + LSR A ODD/EVEN 9/8 + BCS ODDNEW + LDA #9 NEW = 8 + DFB $2C +ODDNEW LDA #8 NEW = 9 + STA TEMP2 OLD STATE + LDX #0 COPY XQTS ACROSS +STKLOOP LDY TEMP2 + STA $C000,Y OLD ZP + LDA $0100,X + LDY TEMP3 + STA $C000,Y NEW ZP + STA $0100,X + INX + BEQ STKOUT + CPX #>IN+12 + BNE STKLOOP + TSX COPY ANALYST STACK ACROSS + BRA STKLOOP +TSTEPRD STA XQTS+44 SET PROGRAM READ STATE. + BRA STOUT2 +TSTEPWR STA XQTS+47 SET PROGRAM WRITE STATE. + BRA STOUT2 +STKOUT JSR ZSWAP PUT ANALYST ZP BACK. +STOUT2 PLA PULL OPC TO ADJ STACK +UPDPCGO JMP UPDPC +TSTEP4 CPY #1 + BNE LEN0 + PHA SAVE OPCODE +TSTEP5 LDA #$EA + STA XQTS+4 + STA XQTS+5 + PLA OPCODE + CMP #$80 + BNE NBRA + ORA #$10 +NBRA AND #$1F + EOR #$14 + CMP #$04 = BRANCH OFFSET + BEQ XQ2 TAKEN IF BRANCH OPCODE +XQ1 JSR YPEEK Y = LENGTH +XQ2 STA XQTS+3,Y XQT BCS BRNCH (B0 04) + DEY NOP + BPL XQ1 JMP NBRNCH (CCLR) + JSR RESTORE BRNCH JMP BRANCH (CSET) + JMP XQTS +XTSX LDX SPNT + STX XREG +XTXS LDX XREG + STX SREF +UPDSPNT STX SPNT UPDATE SPNT + BRA UPDPCGO +LEN0 CMP #$60 + BEQ XRTS + CMP #$BA + BEQ XTSX + CMP #$9A + BEQ XTXS + CMP #$40 + BEQ XBRKGO BRK FOR RTI INSTRUCTION + CMP #$00 + BNE PHCHECK +XBRKGO JMP XBRK +PHCHECK PHA SAVE OPCODE + CMP #$5A + BCC TSTEP6 + TAX + AND #$1F + CMP #$1A + BEQ STKOPC PHX,PLX,PHY,PLY + TXA +TSTEP6 AND #$9F + CMP #$08 PHA,PLA,PHP,PLP + BNE TSTEP5 +STKOPC LDX SPNT STACK OPCODES + PLA OPCODE + TAY + AND #$10 + BEQ APCODE + TYA + ASL A + BCS OPCX + ASL A + ASL A + BCS XPLY + LDA YREG XPHY + BRA PUSH +XPLY JSR PULL + STA YREG +UPDSTACK BRA UPDSPNT +OPCX ASL A + ASL A + BCS XPLX + LDA XREG XPHX + BRA PUSH +XPLX JSR PULL + STA XREG + BRA UPDSTACK +APCODE TYA + ASL A + ASL A + BMI PULLAP + BCC XPHP + LDA ACC XPHA + BRA PUSH +XPHP LDA STATUS +PUSH STA STACK,X + DEX + BNE UPDSTACK +PULLAP BCC XPLP + JSR PULL XPLA +ACCLOC STA ACC + BRA UPDSTACK +XPLP JSR PULL + STA STATUS + BRA UPDSTACK +XRTS LDX SPNT + INX +STACKLOC LDA STACK,X + STA PCL + INX + LDA STACK,X + STA PCH + STX SPNT + DEC DSPTOP + JMP PCINC +PULL INX + LDY STATUS PULL FROM STACK AFFECTS + PHY N & Z FLAGS + PLP + LDA STACK,X + PHP UPDATE N & Z + PLY + STY STATUS + RTS +YPOKEPC PHA EXECUTE STA (PCL),Y + LDA PCL + STA A3L + LDA PCH + STA A3H + PLA + JMP YPOKE +* +* XQTS IMAGE AT $102-139. INSTRUCTIONS WITH '@' ARE +* CHANGEABLE IN XQTS AREA TO SET MAIN/AUX R/W STATE. +* +INITBL JSR XQTS+36 WARMV. REAL-TIME REENTRY + JMP REENTER BY JSR $102. + JSR XQTS+43 XQTS + NOP + NOP + NOP + JMP XQTS+15 + JSR XQTS+36 + JMP BRANCH + JSR XQTS+36 XQTS+15 + JMP NBRNCH + JSR XQTS+43 YPOKE + STA (A3L),Y + JMP XQTS+36 + LDY #0 PEEK + JSR XQTS+43 YPEEK + LDA (PCL),Y + STA MAINRD @ XQTS+36. SET ANALYST + STA MAINWR @ STATE + RTS + STA MAINRD @ XQTS+43. SET PROGRAM + STA MAINWR @ STATE + RTS +* +SETBREAK LDX #1 SET BREAKPOINT TO A4 + LDA BRKADDR+1 IF GIVEN, ELSE $FFFF. + BEQ SETBRK2 BREAKPOINT GIVEN + LDA #$FF +SETBRK1 STA BRKADDR,X CLEAR OLD BREAKPOINT + DEX + BPL SETBRK1 + RTS +SETBRK2 LDA A4L,X SET BREAKPOINT + STA BRKADDR,X + DEX + BPL SETBRK2 + RTS +LOAD LDA XQLOC1+1 F(H) + LDY XQLOC1+2 SETUP A3 = XQT+1 FOR HSF + BRA A3SET BUFFER (XQT=BYTE COUNT) +SETRG1 JSR A1PC + JSR SAVEPC +SETRG2 LDA ACCLOC+1 SETUP REGS FOR F(:) + LDY ACCLOC+2 +A3SET STA A3L + STY A3H + RTS +SETREG TXA F(I) SET OR DISPLAY REGS. + BNE SETRG1 TAKEN IF PC GIVEN. + LDY YSAV + LDA IN,Y + CMP #$8D + BNE SETRG2 + LDA PCREG I DISPLAYS REGS. + STA PCL + LDA PCREG+1 + STA PCH +REGDSP JSR RGDSP1 + JMP INSTDSP WILL RTS TO NEXTITM + DS 3,0 +RGDSP1 LDX #0 +RDSP1 LDA RTBL,X + JSR COUT + LDA #$BD + JSR COUT + LDA ACC,X + JSR PRBYTE + JSR OUTSP + INX + CPX #3 + BCC RDSP1 + LDX #7 +PRFLG LDA CHAR3,X PRINT 'NV-BDIZC' + JSR COUT + DEX + BPL PRFLG + JSR CROUT + LDA #$C1 PRINT ACC IN BINARY + JSR COUT + JSR OUTEQ + LDA ACC + JSR BNDSP + JSR PRBLNK3 + LDA #$D0 PRINT STATUS IN BINARY + JSR COUT + JSR OUTEQ + LDA STATUS + JSR BNDSP + JSR CROUT + LDA #$D3 + JSR COUT + JSR OUTEQ + LDA SPNT + JSR PRBYTE + LDA #$BA + JSR COUT + LDA #$D8 + JSR COUT + JSR COUT + LDY #10 + LDX SPNT +PRNTSTK JSR OUTSP PRINT STACK BYTES FROM + CPX SREF SPNT TO SREF UP TO 10 + BEQ SAVEPC MAX. + INX + LDA STACK,X + JSR PRBYTE + DEY + BNE PRNTSTK +SAVEPC LDA PCL + STA PCREG + LDA PCH + STA PCREG+1 + RTS +BINARY JSR A1PCX F(%) PRINT VALUE AT + JSR CROUT ADDRESS IN BINARY. + JSR PEEK +BNDSP LDX #$08 INDEX FOR 8 BITS +NEXTBIT ASL A + PHA + BCS BIT1 + LDA #$30 '0' + DFB $2C SKIP NEXT INSTRUCTION +BIT1 LDA #$31 '1' + JSR COUT + PLA + DEX + BNE NEXTBIT + RTS +BELL LDY #$38 DURATION +BELL2 LDA #$2B FREQUENCY + JSR WAIT + LDA SPKR + DEY + BNE BELL2 + RTS +COUTZ JMP (CSWL) +VIDOUT BIT #$60 + BEQ CTRLCHAR + TAY + CMP #$60 + BCS VID1 + CMP #$40 + BCC VID1 + AND #$BF +VID1 LDY CH + BIT RD80VID + BPL VID3 + PHA + TYA + LSR A + BCS VID2 + STA HISCR +VID2 TAY + PLA +VID3 STA (BASL),Y + STA LOWSCR + LDY CH + INY + CPY WNDWDTH + BCS CR + STY CH +VIDRTS RTS +BACKSPC DEC CH + BPL VIDRTS + LDY WNDWDTH + DEY + STY CH +UP LDA CV + DEC A + CMP #0 + BMI VIDRTS +VTABVGO JMP VTABV +CTRLCHAR ORA #$80 + CMP #$88 + BEQ BACKSPC + CMP #$8D + BNE VIDRTS +CR LDA #$00 + STA CH + INC CV + LDA CV + CMP #24 + BCC VTABVGO + DEC CV + LDX #0 SCROLL + TXA + JSR VTABZ + BRA SCRL5 +SCRL1 LDY BASH + STY BAS2H + LDY BASL + STY BAS2L + TXA + JSR VTABZ + PHX + LDX WNDWDTH + LDY #0 +SCRL2 BIT RD80VID + BPL SCRL3 + STA HISCR + LDA (BASL),Y + STA (BAS2L),Y + DEX + BEQ SCRL4 + STA LOWSCR +SCRL3 LDA (BASL),Y + STA (BAS2L),Y + INY + DEX + BNE SCRL2 +SCRL4 STA LOWSCR + PLX +SCRL5 INX + CPX #24 + BCC SCRL1 + LDA #$00 + JSR CLEOLZ + JMP VTAB +HOME LDA #0 + STA CH + STA CV +CLS1 PHA + JSR VTABZ + LDA #0 + JSR CLEOLZ + PLA + INC A + CMP #24 + BCC CLS1 +VTAB LDA CV +VTABV STA CV +VTABZ PHA + LSR A + AND #$03 + ORA #$04 + STA BASH + PLA + AND #$18 + BCC BSCLC2 + ADC #$7F +BSCLC2 STA BASL + ASL A + ASL A + ORA BASL + STA BASL + RTS +CLREOL LDA CH +CLEOLZ BIT RD80VID + BPL CLEOL4 + PHA CLREOL 80 COL + SEC + SBC WNDWDTH + TAX + PLA + LSR A + TAY + PHP + LDA #$A0 + PLP + BCS CLEOL8B +CLEOL8A STA HISCR + STA (BASL),Y + INX + BEQ CLEOL8C +CLEOL8B STA LOWSCR + STA (BASL),Y + INY + INX + BNE CLEOL8A +CLEOL8C STA LOWSCR + RTS +CLEOL4 TAY + SEC + SBC WNDWDTH + TAX + LDA #$A0 +CLEOL4A STA (BASL),Y + INY + INX + BNE CLEOL4A + RTS +CLEARDSP LDX #6 CLEAR DISPLAY WINDOW +CLRDSP1 LDA DSPTOP + BPL CLRDSP2 HOLD TOP OF DISPLAY + LDA #0 0 <= TOP <= 18. +CLRDSP2 CMP #18 + BCC CLRDSP3 + LDA #18 +CLRDSP3 STA DSPTOP + STA CV CLEAR 6 LINE DISPLAY + DEC CV FROM DSPTOP DOWN AND + TXA SET CV SO INSTDSP WILL + BEQ RTS4A PRINT AT DSPTOP UPON +CLRDSP4 JSR CROUT EXIT. + PHX + JSR CLREOL + PLX + DEX + BNE CLRDSP4 + BEQ CLRDSP1 +RTS4A RTS +FWAIT LDA #$FF +WAIT SEC +WAIT2 PHA +WAIT3 SBC #$01 + BNE WAIT3 + PLA + SBC #$01 + BNE WAIT2 + RTS +NXTA4 INC A4L INCREMENT A4 + BNE NXTA1 + INC A4H +NXTA1 LDA A1L + CMP A2L + LDA A1H + SBC A2H + INC A1L + BNE RTS4B + INC A1H +RTS4B RTS CARRY SET IF A1 >= A2 +CTRLC LDY KBD CHECK FOR CTRL-C + BPL CTLCRTS + STY KBDSTRB + CPY #$93 CTRL-S = PAUSE + BNE CTLC +KYWAIT LDY PB0 F(S) ENTRY POINT + BMI KYWT2 + LDY KBD + BPL KYWAIT + STY KBDSTRB + DFB $2C +KYWT2 LDY #0 0 = OPEN APPLE PRESSED +CTLC CPY #$83 +CTLCRTS RTS Z SET FOR CTRL-C. +RDKEY STY YSAV1 + LDY RDSCR + PHP + LDY RDPAGE2 + PHP + STA INHPAGE2 + STA LOWSCR + PHX + LDA CH + BIT RD80VID + BPL KEY2 + LSR A + BCS KEY2 + STA HISCR +KEY2 TAY + LDA (BASL),Y + PHA + EOR #$80 + BIT #$20 + BNE KEY3 + EOR #$40 +KEY3 STA (BASL),Y +KEY4 LDX KBD + BPL KEY4 + STA KBDSTRB + PLA + STA (BASL),Y + STA LOWSCR + TXA + JMP ENDHOOK +NOTCR LDA IN,X + JSR COUT + CMP #$88 + BEQ BCKSPC + CPX #34 BEEP ON LAST 4 CHAR. + BCC NOTCR1 + JSR BELL +NOTCR1 INX + CPX #38 38 CHARACTERS ALLOWED + BCC NXTCHAR + LDA #$DC + JSR COUT +GETLNZ JSR CROUT + LDA PROMPT + JSR COUT + LDX #$01 +BCKSPC TXA + BEQ GETLNZ + DEX +NXTCHAR JSR RDKEY + CMP #$95 + BEQ NXTCHAR IGNORE '->' + CMP #$FF + BNE NOTDEL + LDA #$88 DELETE KEY = BACKSPACE +NOTDEL CMP #$88 + BNE CAPTST + PHA + JSR COUT BACKSPACE + JSR OUTSP DELETE CHARACTER + PLA BACKSPACE +CAPTST CMP #$E0 + BCC ADDINP + AND #$DF +ADDINP STA IN,X + CMP #$8D + BNE NOTCR +CROUT LDA #$8D + BNE COUTGO +OUTSP LDA #$A0 + BNE COUTGO +PRA1 JSR CROUT + JSR CTRLC + BEQ PRA1RTS + LDY A1H + LDX A1L +PRYX2 JSR PRNTYX + LDY #$00 + LDA #$AD +COUTGO JSR COUT +PRA1RTS RTS +ASC SEC F(") +XAM ROR A CARRY INTO BIT 7 + STA A3H + BRA XAM1 +MOD8CHK LDA A1L + AND #$07 + BNE DATAOUT +XAM1 JSR PRA1 F(.) A1.A2 HEX OR ASC + BEQ PRA1RTS +DATAOUT JSR OUTSP + LDA A1H SEE IF ZERO PAGE + BEQ XAMZ + DEC A SEE IF $01NN + BNE XAM2 + LDA A1L GET $01NN FROM STACK,NN + TAX + LDA STACK,X + BRA XAM3 +XAMZ LDA A1L + SEC + SBC #PCL + BCC XAM2 TAKEN IF A1L < PCL + TAX ELSE GET FROM ZBUF + LDA ZBUF,X + BRA XAM3 +XAM2 JSR A1PCX + JSR PEEK +XAM3 LDX A3H + BPL XAM4 + ORA #$80 XAM IN ASC + CMP #$A0 + BCS PRASC TAKEN IF NORM. OR LCASE + LDA #$A0 SPACE FOR CTRL OR INV +PRASC JSR COUT + BRA XAM5 +XAM4 JSR PRBYTE XAM IN HEX +XAM5 JSR NXTA1 + BCC MOD8CHK CARRY CLEAR IF A1 ZFLG:AA + STA ZFLG +RST2 JSR INITXQTS + STZ TFLG + STZ JFLG +TXTMON JSR TEXT + JSR HOME + JSR PRTITLE +MONZ STZ ERRFLG + DEC BRKADDR+1 INSURE BRKPOINT CLEARED + JSR CHKVID MATCH HOOKS W/DISPLAY MODE + JSR STPRMPT + JSR GETLNZ + JSR ZMODE + STZ DSPTOP DISPLAY AT TOP +NXTITM JSR GETNUM HANDLE HEX DIGS TO 1ST + STY YSAV NON-HEX CHAR+1 (Y=INDX) + LDY #SUBTBL-CHRTBL +CHRSRCH DEY ACC = F(ACC) + BMI SYNERR + CMP CHRTBL,Y + BNE CHRSRCH + PHY + JSR TOSUB + PLY + BEQ MONZ 0 = OFFSET FOR F(CR) +NEXTITM LDY YSAV + BRA NXTITM +SYNERR JSR BELL + BRA MONZ +DIG LDX #$03 HEX DIGIT NOW IN ACC LO + ASL A NIBBLE. KEYS 0-9=00-09 + ASL A KEYS A-F=FA-FF. MOVE + ASL A LO NIBBLE TO HI NIBBLE + ASL A +NXTBIT ASL A 4 BIT HEX DIG. INTO A2L + ROL A2L A2L TO A2H + ROL A2H + DEX + BPL NXTBIT +NXTBAS LDA MODE + BNE NXTBS2 IF MODE=0 COPY + LDA A2H,X A2 TO A1 & A3 + STA A1H,X + STA A3H,X +NXTBS2 INX + BEQ NXTBAS + BNE NXTCHR +GETNUM LDX #0 + STX A2L + STX A2H +NXTCHR LDA IN,Y F(ACC) = ACC EOR $B0 + INY ADC $88 (CARRY SET) + EOR #$B0 KEYS 0-9=$00-09 + CMP #$0A + BCC DIG TAKEN IF KEYS 0-9 + ADC #$88 KEYS A-F=$FA-FF + CMP #$FA + BCS DIG TAKEN IF KEYS A-F + RTS +TOSUB TYA # OF FUNCTION (START=0) + ASL A MULT BY 2 + TAY + LDA SUBTBL+1,Y + PHA + LDA SUBTBL,Y + PHA + LDA MODE OLD MODE FOR F(CR)&F( ) +ZMODE LDY #$00 + STY MODE + RTS RTS TO SUBROUTINE +EXECJSR LDA JFLG F(J) + BNE GOJSR 'J' WITH NO JSR? +ERRJ JMP BELL RTS TO NEXTITM VIA BELL. +GOJSR LDY YSAV GET # OF PARM BYTES + JSR GETNUM + DEY + STY YSAV + LDA A2H + BNE ERRJ + LDA A2L + CMP #10 + BCS ERRJ ONLY 9 PARM BYTES MAX + TAY SAVE BYTE COUNT +GOPC LDX #17 +XQINIT2 LDA INITBL2,X FILL DUMMY BLOCK + STA XQT,X + DEX + BPL XQINIT2 + LDA PCL MOVE JSR ADDR TO XQT +XQLOC1 STA XQT+1 + LDA PCH + STA XQT+2 + LDX SPNT SET PC = PARM LIST - 1 + INX + LDA STACK,X + STA PCL + INX + LDA STACK,X + STA PCH + STX SPNT + TYA GET PARM BYTES + TAX + BEQ MVPRM1 NO PARM BYTES TO MOVE +MOVPARM JSR YPEEK MOVE PARM LIST TO DUMMY + STA XQT+2,Y + DEY + BNE MOVPARM +MVPRM1 INX + TXA ADJ PC TO POINT TO INST + CLC FOLLOWING PARM LIST + JSR PCADJAP + JMP XQJ EXECUTE JSR IMMED. MODE +INITBL2 JSR $0000 DUMMY BLOCK FOR F(J) + NOP 9 NOP'S FOR PARM BYTES + NOP + NOP + NOP + NOP + NOP + NOP + NOP + NOP + JSR XQTS+36 RESTORE ANALYST R/W + JMP JRTS +JRTS JSR SAVE + JSR CHKVID + LDA JFLG + BEQ JRTS3 DURING 'G0' W/O BREAK + STZ JFLG + LDA TFLG + BEQ JRTS2 DURING 'STEP' + JMP TRACE5 DURING TRACE IMMEDIATE +JRTS2 DEC DSPTOP UPDATE REGDSP AFTER JSR. +JRTSX JSR CLEARDSP 'SKIP' ENTERS HERE + JMP NXTPC +JRTS3 RTS RTS TO NEXTITM. +FIND LDA #$FF F(CTRL-F) A4 ALONE EXITS + JMP STPRMPT VIA NEXTITM +MINI2 JSR GETNUM + CMP #$93 F(:) +A1TOPC BNE ERROR + TXA + BEQ ERROR + JSR A1PCLP +RDMNEM LDA #$03 INDEX FOR 3 CHAR MNEM + STA A1H +RDMNEM2 JSR CHARIN + ASL A + SBC #$BE + CMP #$C2 LESS THAN 'A' + BCC ERROR NOT ASC LETTER SO ERR + ASL A + ASL A + LDX #$04 INDEX FOR 5 BITS +RDMNEM3 ASL A MOVE 5 BIT LETTER CODE + ROL A4L (* 3 LETTERS) INTO A4. + ROL A4H 26 LETTERS REQ. 5 BITS + DEX + BPL RDMNEM3 + DEC A1H + BEQ RDMNEM3 + BPL RDMNEM2 + LDX #$05 INDEX FOR 6 FORMAT BITS +RDFMT JSR CHARIN + STY YSAV + CMP CHAR1,X + BNE RDFMT2 + JSR CHARIN + CMP CHAR2,X + BEQ RDADDR + LDA CHAR2,X + BEQ RDFMT3 + CMP #$A4 + BEQ RDFMT3 + LDY YSAV +RDFMT2 CLC +RDFMT3 DEY +RDADDR ROL A5L + CPX #$03 + BNE RDADDR3 + JSR GETNUM + LDA A2H + BEQ RDADDR2 + INX +RDADDR2 STX YSAV1 + LDX #$03 + DEY +RDADDR3 STX A1H + DEX + BPL RDFMT + LDA A5L + ASL A + ASL A + ORA YSAV1 + CMP #$20 + BCS RDADDR4 + LDX YSAV1 + BEQ RDADDR4 + ORA #$80 +RDADDR4 STA A5L + STY YSAV + LDA IN,Y + CMP #$8D + BEQ DISAS + JMP A1TOPC +DISAS JMP DSS +CHARIN LDA IN,Y + INY + CMP #$A0 + BEQ CHARIN +ENDMINI RTS +RELOC LDA STARTLOC+1 F(R) + STA PCH + STZ PCL MAKE SURE ANALYST IS + JSR PEEK BEING READ FOR MOVE + CMP #$4C BY PEEKING START BYTE. + BNE ENDMINI DO NOT RELOCATE! + LDA A1H + STA A4H + PHA + STZ A4L + LDA STARTLOC+1 + STA A1H + STA A5L + STZ A1L + LDA AUXV+2 LOCATION OF 'AUXLOAD' + STA A2H WHICH MARKS END. + LDA AUXV+1 + STA A2L + LDA A1H CALC DIFFERENCE BETWEEN + SEC OLD & NEW ORG + SBC A4H + STA A5H + LDA #AUXV-SUBTBL + LSR A DIVIDE BY 2 + TAY # OF WORDS + LDX #$FF +RELOC2 INX CONVERT SUBTBL WORDS + INX + LDA SUBTBL,X + SEC + SBC A5H + STA SUBTBL,X + DEY + BNE RELOC2 + LDA #$60 PUT IN RTS TO DISABLE + STA AUXV AUX LOADER. NOT MOVED. + JSR MOVE NEW ORG 80 +CHK80 BCC SET40 80 -> 40 +RTS7 RTS +SETVID LDY YSAV F(@) + LDA IN,Y + INC YSAV + CMP #$B4 '4' + BEQ SET40 + CMP #$B8 '8' + BEQ SET80 + DEC YSAV @ ALONE +TEXT LDA OUTVECT + STA CSWL + LDA OUTVECT+1 + STA CSWH + STA INHPAGE2 FOR AUX TO DISPLAY TEXT. + STA TXTSET + LDA RD80VID SET 40 OR 80 COL + BPL SET40 TEXT BASED ON RD80VID +SET80 LDA #$FF + STA FLG8 + LDA #80 + STA WNDWDTH + BIT RD80VID + BMI SET8D + STA SET80VID + LDA #$00 +SET8A PHA + JSR VTABZ + LDY #$00 +SET8B LDA (BASL),Y + TAX + PHY + TYA + LSR A + TAY + BCS SET8C + STA HISCR +SET8C TXA + STA (BASL),Y + PLY + STA LOWSCR + INY + CPY #$28 + BCC SET8B + TYA + JSR CLEOLZ + PLA + INC A + CMP #$18 + BCC SET8A +SET8D BRA SETDONE +SET40 STZ FLG8 + BIT RD80VID + BPL SET4D + STA CLR80VID + LDA #$00 +SET4A PHA + JSR VTABZ + LDY #$27 +SET4B TYA + LSR A + PHY + TAY + BCS SET4C + STA HISCR +SET4C LDA (BASL),Y + PLY + STA LOWSCR + STA (BASL),Y + DEY + BPL SET4B + PLA + INC A + CMP #$18 + BCC SET4A +SET4D LDA #40 + STA WNDWDTH +SETDONE JMP VTAB +HELP LDY #0 F(?) LIST LAST 16 PC +HLP2 LDA PCBUF,Y ADDRESSES EXECUTED + INY DURING TRACE. + LDX PCBUF,Y + INY + JSR PRNTAX + CPY PCPNT + BNE HLP3 + LDA #$BC + JSR COUT +HLP3 JSR CROUT + CPY #32 + BCC HLP2 + RTS +PRTITLE LDX #$00 F(V). PRINT TITLE +TITLLOC LDA TITLE,X + BEQ PRADDR + JSR COUT + INX + BRA TITLLOC +PRADDR LDA STARTLOC+1 PRINT ORIGIN ADDRESS + JSR PRBYTE + LDA #0 + JSR PRBYTE + JMP CROUT + SKP 1 +*** PROGRAM DATA AREA *** + SKP 1 +TITLE DFB $8D + ASC "ANALYST 128EX" + DFB $8D TITLE MARKS START OF PDA + ASC "ORG = " +BANKORG ASC "$" + DFB $00 +MNEML DFB 28,138 + DFB 28,35,93,139,27,161,157,138 + DFB 29,35,157,139,29,161,28,41 + DFB 25,174,105,168,25,35,36,83 + DFB 27,35,36,83,25,161,173,26 + DFB 165,91,165,172,139,138,174,174 + DFB 168,173,41,138,124,139,21,156 + DFB 109,156,165,105,41,83,132,19 + DFB 52,17,165,105,35,160 +MNEMR DFB 216,98 + DFB 90,72,38,98,148,136,84,68 + DFB 200,84,104,68,232,148,196,180 + DFB 8,132,116,180,40,110,116,244 + DFB 204,74,114,242,164,138,6,170 + DFB 118,162,116,198,116,116,68,104 + DFB 178,50,178,114,34,114,26,26 + DFB 38,38,114,114,136,200,196,202 + DFB 38,72,68,68,162,200 +CHAR1 DFB 172,169,172,163,168,164 +CHAR2 DFB 217,0,216,164,164,0 +CHAR3 ASC "CZIDB-VN" +RTBL ASC "AXY" +FMT2 DFB 0,33,129,130,90,73,89,77 + DFB 145,146,134,74,133,157 +FMT1 DFB 240,34,0,51,93,130,0,147 + DFB 243,34,0,51,93,136,0,153 + DFB 240,47,0,51,93,143,0,159 + DFB 240,34,0,59,93,136,0,148 + DFB 253,34,0,51,93,200,0,147 + DFB 17,34,0,51,93,200,0,169 + DFB 241,34,0,51,93,143,0,159 + DFB 241,34,0,51,93,143,0,159 + DFB 38,49,135,154 +OPC65C DFB 18,50,82,114 + DFB 146,178,210,242,58,26,137,28 + DFB 20,122,90,156,100,158,116,124 + DFB 60,52 + DFB 76,164,172,180,188,196,204,228 + DFB 236 +REPL65C DFB 17,49,81,113,145,177 + DFB 209,241,194,226,52,164,172,196 + DFB 228,92,92,92,92,124,60,52 + DFB 124,160,160,160,160,192,192 + DFB 224,224 +CHRTBL DFB 198,152,249,177,241,3 + DFB 236,166,164,6,149,5 + DFB 0,147,2,167,153 + DFB 155,154,239,233,1,191 + DFB 168,237,158,235,197 +SUBTBL DW BL1-1 F(CR) MUST BE 1ST IN TBL + DW HELP-1 F(?) LIST PC'S TRACED + DW SETVID-1 F(@) SWITCH 40/80 COL + DW AUXV-1 F(CTRL-X) MOVE TO AUX + DW AUXRW-1 F(X) MAIN/AUX $200-BFFF + DW EXECJSR-1 F(J) EXECUTE JSR + DW STEP-1 F(S) STEP + DW SETMODE-1 F(-) 16 BIT SUBTRACTION + DW SETMODE-1 F(+) 16 BIT ADDITION + DW MOVE-1 F(M) MOVE + DW LT-1 F(<) COPY A2 TO A4 & A5 + DW LIST-1 F(L) LIST DISASSEMBLY + DW GO-1 F(G) GO + DW SETMODE-1 F(:) STORE + DW SETREG-1 F(I) SET INTERNAL PC/REG + DW SETMODE-1 F(.) XAM + DW BLANK-1 F( ) HANDLE SPACES + DW ASC-1 F(") DUMP IN ASCII + DW MINI-1 F(!) MINI-ASSEMBLER + DW PRTITLE-1 F(V) PRINT TITLE + DW SETPRNT-1 F(P) TO PRINTER + DW LOAD-1 F(H) LOAD FOR HSF + DW FIND-1 F(CTRL-F) HEX SEQ. FIND + DW SETDOS-1 F(/) SET DOS CALL JSR #. + DW TRACE-1 F(T) TRACE + DW BINARY-1 F(%) VALUE IN BINARY + DW RELOC-1 F(R) RELOCATOR + DW HOME-1 F(CTRL-L) CLEAR SCREEN +OUTVECT DW VIDOUT +STARTLOC DW START + SKP 1 +* DYNAMIC PROGRAM AREA * + SKP 1 +AUXV JMP AUXLOAD F(CTRL-X) ONE TIME VECTOR +CSWL DS 1 ADDR. OF OUTPUT ROUTINE +CSWH DS 1 +TFLG DS 1 <>0 = CANCEL COUT FOR TRC +JFLG DS 1 SET TO ALLOW F(J) +DOSCALL DS 2,255 SUBROUTINE TO JSR IMMED. +ERRFLG DS 1 SET FOR BAD OPCODE +PCREG DS 2,0 +ACC DFB 0 DON'T CHANGE ORDER +XREG DFB 0 OF ACC TO SPNT +YREG DFB 0 +STATUS DFB 0 +SPNT DFB $FF +SREF DFB $FF STACK REF SET BY TXS OPC +LMNEM DS 1 +RMNEM DS 1 +LENGTH DS 1 +FORMAT DS 1 +MODE DS 1 +FLG8 DS 1 FF = 80 COL, 0 = 40 COL +WNDWDTH DS 1 +PROMPT DS 1 +CH DS 1 +CV DFB 0 +DSPTOP DS 1 TOP OF DISPLAY FOR STEP +YSAV DS 1 +YSAV1 DS 1 +PCPNT DFB 0 INDEX TO PCBUF +BRKADDR DS 2,255 BREAK FOR STEP,TRACE,LIST +TEMP1 DS 1 FOR INSTDSP AND STEP. +TEMP2 DS 1 FOR STEP. +TEMP3 DS 1 FOR STEP. +PCFLG DS 1 PRNTPC ON/OFF FOR TRACE +COUNTER DS 1 FOR TRACE +ZBUF DS $100-PCL PAGE ZERO STORAGE BUFFER +PAGEFIL EQU >* + DS $FF-PAGEFIL +ROMFLG DFB 1 TRACE JSR ROM $D000-FFFF +STACK DS $100,0 MUST BE ON PAGE BOUNDARY +AUXLOAD LDA #>START F(CTRL-X) MOVE ANALYST + STA MA1 TO AUX. THIS CODE NOT + STA MA4 RELOCATEABLE. + LDA #AUXLOAD + STA MA2 + LDA #- * +8000: 10 * * +8000: 11 * 128K VERSION XP * +8000: 12 * * +8000: 13 * 2/07/05 * +8000: 14 * * +8000: 15 ********************************* + +8000: 17 *** COMMANDS *** + +8000: 19 ; CTRL-F FIND HEX SEQUENCE DEFINED BY F(H) +8000: 20 ; G GO EXECUTE IN IMMEDIATE MODE +8000: 21 ; H LOAD BYTES FOR HSF F(CTRL-F) BY USING H: +8000: 22 ; I DISPLAY/SET PC/INTERNAL A,X,Y,P,S REGISTERS +8000: 23 ; J JUMP. EXECUTE JSR INSTRUCTION IN STEP MODE +8000: 24 ; CTRL-L CLEAR PRESENT SCREEN AND HOME CURSOR +8000: 25 ; L LIST DISASSEMBLY OR LOOP IN TRACE MODE. +8000: 26 ; M MOVE BLOCK OF MEMORY +8000: 27 ; P SEND OUTPUT TO PRINTER +8000: 28 ; R RELOCATE ANALYST TO NEW ADDRESS PAGE +8000: 29 ; S ENTER STEP MODE. STEP INSTRUCTION +8000: 30 ; T TRACE PROGRAM +8000: 31 ; V PRINT ANALYST VERSION# AND ORIGIN ADDRESS. +8000: 32 ; CTRL-X MOVE ANALYST TO AUX. DISABLED AFTER USE. +8000: 33 ; X SKIP INSTRUCTION DURING STEP. TOGGLE MAIN/AUX +8000: 34 ; " DUMP MEMORY IN ASCII +8000: 35 ; / SET OR PRINT SUBROUTINE TO JSR IMMED MODE +8000: 36 ; % PRINT ADDRESS DATA VALUE IN BINARY +8000: 37 ; ? PRINT LAST 16 PC'S EXEC'D DURING TRACE +8000: 38 ; @ SET TEXT 40/80 COL SCREEN +8000: 39 ; < RANGE DELIMITER +8000: 40 ; . RANGE DELIMITER +8000: 41 ; + 16 BIT ADDITION +8000: 42 ; - 16 BIT SUBTRACTION +8000: 43 ; : STORE VALUE IN MEMORY +8000: 44 ; ! ENTER MINI-ASSEMBLER. ALONE TO EXIT + +8000: 46 *** ROM ZERO PAGE EQUATES *** + +8000: 0036 48 MCSWL EQU $36 +8000: 0037 49 MCSWH EQU $37 +8000: 003C 50 MA1 EQU $3C +8000: 003E 51 MA2 EQU $3E +8000: 0042 52 MA4 EQU $42 + +8000: 54 *** ANALYST EQUATES *** + +8000: 00EF 56 PCL EQU $EF LABEL MARKS PAGE 0 +8000: 00F0 57 PCH EQU $F0 +8000: 00F1 58 BASL EQU $F1 +8000: 00F2 59 BASH EQU $F2 LABEL USED AS IDENTIFIER +8000: 00F3 60 ZFLG EQU $F3 1 BYTE ID = $AA +8000: 00F4 61 A1L EQU $F4 A1L-A5H MUST BE IN ORDER +8000: 00F5 62 A1H EQU $F5 FOR MINI-ASSEMBLER +8000: 00F6 63 A2L EQU $F6 +8000: 00F7 64 A2H EQU $F7 +8000: 00F8 65 A3L EQU $F8 +8000: 00F9 66 A3H EQU $F9 +8000: 00FA 67 A4L EQU $FA +8000: 00FB 68 A4H EQU $FB +8000: 00FC 69 A5L EQU $FC +8000: 00FD 70 A5H EQU $FD +8000: 00FE 71 BAS2L EQU $FE +8000: 00FF 72 BAS2H EQU $FF LABEL MARKS END OF PAGE 0 +8000: 0102 73 WARMV EQU $0102 WARM REENTRY +8000: 0108 74 XQTS EQU WARMV+6 EXEC AREA FOR STEP, TRACE +8000: 011D 75 YPOKE EQU XQTS+21 +8000: 0125 76 PEEK EQU XQTS+29 +8000: 0127 77 YPEEK EQU XQTS+31 +8000: 013A 78 XQT EQU XQTS+50 18 BYTES +8000: 014C 79 PCBUF EQU XQT+18 32 BYTE PC SAVE AREA. +8000: 016C 80 IN EQU PCBUF+32 KEYIN BUFFER. 38 BYTES. +8000: BF00 81 MLI EQU $BF00 PRODOS INTERFACE + +8000: 83 *** ROM EQUATES *** + +8000: C000 85 KBD EQU $C000 +8000: C001 86 INHPAGE2 EQU $C001 AUX $400-7FF SHOWS TEXT +8000: C002 87 MAINRD EQU $C002 +8000: C004 88 MAINWR EQU $C004 +8000: C00C 89 CLR80VID EQU $C00C +8000: C00D 90 SET80VID EQU $C00D +8000: C010 91 KBDSTRB EQU $C010 +8000: C016 92 RDAUXZP EQU $C016 BMI IF AUXZP +8000: C018 93 RDPAGE2 EQU $C018 BMI IF INHPAGE2 ON +8000: C01A 94 RDTEXT EQU $C01A BMI IF TEXT MODE +8000: C01C 95 RDSCR EQU $C01C BMI IF DPAGE2 ON +8000: C01F 96 RD80VID EQU $C01F BMI IF 80 COL MODE +8000: C030 97 SPKR EQU $C030 +8000: C051 98 TXTSET EQU $C051 +8000: C054 99 LOWSCR EQU $C054 +8000: C055 100 HISCR EQU $C055 +8000: C061 101 PB0 EQU $C061 OPEN APPLE KEY +8000: C062 102 PB1 EQU $C062 CLOSED APPLE KEY +8000: C082 103 SWITCH2 EQU $C082 +8000: C311 104 AUXMOVE EQU $C311 +8000: FE95 105 OUTPORT EQU $FE95 USED TO SET PRINTER +8000: E000 106 IDROM EQU $E000 = $4C IF ROM PRESENT + + + +8000:4C 9D 8A 108 START JMP RESET COLD START +8003:A6 EF 109 INSDS1 LDX PCL +8005:A4 F0 110 LDY PCH +8007:20 4C 88 111 JSR CROUT +800A:20 5B 88 112 JSR PRYX2 +800D:20 50 88 113 JSR OUTSP +8010:20 25 01 114 INSDST JSR PEEK +8013:A0 FF 115 INSDS2 LDY #$FF DETERMINE LENGTH OF +8015:8C CF 90 116 STY LMNEM INSTRUCTION. OPCODE IN +8018:A8 117 TAY ACC. STORED IN LENGTH. +8019:4A 118 LSR A INVALID = 0 +801A:90 05 8021 119 BCC IEVEN 1 BYTE = 0 +801C:6A 120 ROR A 2 BYTE = 1 +801D:B0 13 8032 121 BCS ERR 3 BYTE = 2 +801F:29 87 122 AND #$87 +8021:4A 123 IEVEN LSR A +8022:AA 124 TAX +8023:BD E3 8F 125 LDA FMT1,X +8026:90 04 802C 126 BCC RTMSKZ +8028:4A 127 LSR A +8029:4A 128 LSR A +802A:4A 129 LSR A +802B:4A 130 LSR A +802C:29 0F 131 RTMSKZ AND #$0F +802E:C9 0F 132 CMP #$0F +8030:D0 13 8045 133 BNE GETFMT +8032:A0 FF 134 ERR LDY #$FF BAD OPCODE +8034:8C C6 90 135 STY ERRFLG +8037:C8 136 INY +8038:8C CF 90 137 STY LMNEM +803B:8C D0 90 138 STY RMNEM +803E:8C D2 90 139 STY FORMAT +8041:8C D1 90 140 STY LENGTH +8044:60 141 RTS1 RTS +8045:AA 142 GETFMT TAX +8046:BD D5 8F 143 LDA FMT2,X +8049:8D D2 90 144 STA FORMAT +804C:29 03 145 AND #$03 +804E:8D D1 90 146 STA LENGTH +8051:AD C2 90 147 LDA TFLG BYPASS PRINT FORMATTING +8054:D0 EE 8044 148 BNE RTS1 IN TRACE +8056:98 149 TYA +8057:29 8F 150 AND #$8F +8059:48 151 PHA TEMP STORAGE +805A:98 152 TYA +805B:A2 1F 153 LDX #31 +805D:CA 154 GETFMT2 DEX +805E:30 08 8068 155 BMI MNNDX +8060:DD 27 90 156 CMP OPC65C,X MAKE SUBSTITUTION IF +8063:D0 F8 805D 157 BNE GETFMT2 65C02 OPCODE. +8065:BD 46 90 158 LDA REPL65C,X +8068:FA 159 MNNDX PLX +8069:A0 03 160 LDY #$03 +806B:E0 8A 161 CPX #$8A +806D:F0 0B 807A 162 BEQ MNNDX3 +806F:4A 163 MNNDX1 LSR A +8070:90 08 807A 164 BCC MNNDX3 +8072:4A 165 LSR A +8073:4A 166 MNNDX2 LSR A +8074:09 20 167 ORA #$20 +8076:88 168 DEY +8077:D0 FA 8073 169 BNE MNNDX2 +8079:C8 170 INY +807A:88 171 MNNDX3 DEY +807B:D0 F2 806F 172 BNE MNNDX1 +807D:60 173 RTS +807E:20 03 80 174 INSTDSP JSR INSDS1 +8081:48 175 PHA +8082:20 27 01 176 PRNTOP JSR YPEEK +8085:20 E2 88 177 JSR PRBYTE +8088:A2 01 178 LDX #$01 +808A:20 07 81 179 PRNTBL JSR PRBLNK +808D:CC D1 90 180 CPY LENGTH +8090:C8 181 INY +8091:90 EF 8082 182 BCC PRNTOP +8093:A2 03 183 LDX #$03 +8095:C0 03 184 CPY #$03 +8097:90 F1 808A 185 BCC PRNTBL +8099:68 186 PLA +809A:A8 187 TAY +809B:AD CF 90 188 LDA LMNEM +809E:F0 0C 80AC 189 BEQ PRMN1 +80A0:B9 3E 8F 190 LDA MNEML,Y +80A3:8D CF 90 191 STA LMNEM +80A6:B9 7E 8F 192 LDA MNEMR,Y +80A9:8D D0 90 193 STA RMNEM +80AC:A9 00 194 PRMN1 LDA #$00 +80AE:A0 05 195 LDY #$05 +80B0:0E D0 90 196 PRMN2 ASL RMNEM +80B3:2E CF 90 197 ROL LMNEM +80B6:2A 198 ROL A +80B7:88 199 DEY +80B8:D0 F6 80B0 200 BNE PRMN2 +80BA:69 BF 201 ADC #$BF +80BC:20 F5 88 202 JSR COUT +80BF:CA 203 DEX +80C0:D0 EA 80AC 204 BNE PRMN1 +80C2:20 50 88 205 JSR OUTSP +80C5:AC D1 90 206 LDY LENGTH +80C8:A2 05 207 LDX #$05 +80CA:E0 02 208 PRADR1 CPX #$02 +80CC:F0 1D 80EB 209 BEQ PRADR5 +80CE:0E D2 90 210 PRADR2 ASL FORMAT +80D1:90 0E 80E1 211 BCC PRADR3 +80D3:BD BE 8F 212 LDA CHAR1,X +80D6:20 F5 88 213 JSR COUT +80D9:BD C4 8F 214 LDA CHAR2,X +80DC:F0 03 80E1 215 BEQ PRADR3 +80DE:20 F5 88 216 JSR COUT +80E1:CA 217 PRADR3 DEX +80E2:10 E6 80CA 218 BPL PRADR1 +80E4:60 219 RTS +80E5:88 220 PRADR4 DEY +80E6:30 E6 80CE 221 BMI PRADR2 +80E8:20 E2 88 222 JSR PRBYTE +80EB:AD D2 90 223 PRADR5 LDA FORMAT +80EE:C9 E8 224 CMP #$E8 +80F0:20 27 01 225 JSR YPEEK +80F3:90 F0 80E5 226 BCC PRADR4 +80F5:20 1D 81 227 JSR PCADJA +80F8:AA 228 TAX +80F9:E8 229 INX +80FA:D0 01 80FD 230 BNE PRNTYX +80FC:C8 231 INY +80FD:98 232 PRNTYX TYA +80FE:20 E2 88 233 PRNTAX JSR PRBYTE +8101:8A 234 TXA +8102:4C E2 88 235 JMP PRBYTE +8105:A2 03 236 PRBLNK3 LDX #3 +8107:20 50 88 237 PRBLNK JSR OUTSP PRINT X SPACES +810A:CA 238 DEX +810B:D0 FA 8107 239 BNE PRBLNK +810D:60 240 RTS +810E:38 241 PCADJ SEC UPDATE PC BY LENGTH+1 +810F:AD D1 90 242 PCADJLP LDA LENGTH UPDATE PC BY LENGTH +8112:20 1D 81 243 PCADJAP JSR PCADJA UPDATE PC BY ACC +8115:85 EF 244 STA PCL +8117:84 F0 245 STY PCH +8119:60 246 RTS +811A:AD D1 90 247 PCADJL LDA LENGTH SET Y,A = PC+LENGTH +811D:A4 F0 248 PCADJA LDY PCH SET Y,A = PC+ACC +811F:AA 249 TAX +8120:10 01 8123 250 BPL PCADJ2 +8122:88 251 DEY +8123:65 EF 252 PCADJ2 ADC PCL +8125:90 01 8128 253 BCC RTS2 +8127:C8 254 INY +8128:60 255 RTS2 RTS +8129:CE DA 90 256 STEP DEC YSAV F(S) +812C:8A 257 STEPL TXA +812D:F0 07 8136 258 BEQ STEPZ +812F:20 2F 85 259 JSR SETBREAK FIRST TIME +8132:A2 01 260 LDX #1 +8134:D0 60 8196 261 BNE SSTEP ALWAYS TAKEN +8136:20 A9 87 262 STEPZ JSR KYWAIT +8139:D0 06 8141 263 BNE STEP1 +813B:EE DA 90 264 INC YSAV CTRL-C = EXIT TO NEXTITM +813E:4C 60 8A 265 JMP ZSWAPE VIA ZSWAPE RTS +8141:C0 CA 266 STEP1 CPY #$CA +8143:D0 08 814D 267 BNE STEP2 +8145:AD C3 90 268 LDA JFLG J = SINGLE STEP +8148:F0 4C 8196 269 BEQ SSTEP IF NO JSR, ELSE +814A:4C 75 82 270 JMP TRCPCS EXECUTE SUBROUTINE +814D:C0 CC 271 STEP2 CPY #$CC L = LOOP. SET BREAK +814F:D0 0C 815D 272 BNE STEP2A POINT AFTER INSTRUCTION +8151:20 1A 81 273 JSR PCADJL TO BE EXECUTED NEXT +8154:8D DD 90 274 STA BRKADDR AND ENTER TRACE. +8157:8C DE 90 275 STY BRKADDR+1 +815A:4C 73 81 276 JMP STEPT +815D:AD C3 90 277 STEP2A LDA JFLG SPC = SINGLE STEP IF +8160:D0 04 8166 278 BNE STEP3 NOT JSR, ELSE IGNORE +8162:C0 A0 279 CPY #$A0 +8164:F0 30 8196 280 BEQ SSTEP +8166:C0 D3 281 STEP3 CPY #$D3 S OR OPEN APPLE = +8168:F0 2C 8196 282 BEQ SSTEP SINGLE STEP ALWAYS +816A:98 283 TYA +816B:F0 26 8193 284 BEQ SSTEPW = 0 FOR OPEN APPLE. +816D:C0 D4 285 CPY #$D4 T = ENTER TRACE MODE +816F:D0 0B 817C 286 BNE STEP4 +8171:A0 FF 287 LDY #$FF +8173:8C C2 90 288 STEPT STY TFLG SET TRACE MODE FLAG +8176:8C E2 90 289 STY PCFLG ENABLE PC PRINTING +8179:4C 93 82 290 JMP STRACE AND ENTER TRACE. +817C:C0 D8 291 STEP4 CPY #$D8 X = SKIP NEXT INSTRUCTION +817E:D0 0C 818C 292 BNE STEP5 +8180:9C C3 90 293 STZ JFLG ENABLE SPC IF SKP WHILE +8183:9C C6 90 294 STZ ERRFLG JSR DISPLAYED ACTIVE. +8186:20 0E 81 295 JSR PCADJ CLR IN CASE SKIP ERROR. +8189:4C C4 8B 296 JMP JRTSX +818C:C0 C0 297 STEP5 CPY #$C0 @ = TEXT MODE +818E:D0 9C 812C 298 BNE STEPL LOOP BACK FOR INPUT +8190:20 63 8E 299 JSR TEXT +8193:20 7A 87 300 SSTEPW JSR FWAIT PAUSE TO RELEASE O/A KEY +8196:20 A6 89 301 SSTEP JSR A1PC +8199:20 51 87 302 SSTEPT JSR CLEARDSP TRACE RE-ENTRY TO STEP +819C:20 7E 80 303 JSR INSTDSP +819F:20 05 81 304 JSR PRBLNK3 +81A2:20 25 01 305 JSR PEEK +81A5:29 0F 306 AND #$0F +81A7:C9 01 307 CMP #$01 SEE IF ZERO PAGE IND +81A9:D0 36 81E1 308 BNE SSTEPZ +81AB:A9 A8 309 LDA #$A8 '(' +81AD:20 F5 88 310 JSR COUT PRINT ABSOLUTE VALUE +81B0:20 25 01 311 JSR PEEK IN PARENTHESIS +81B3:29 10 312 AND #$10 +81B5:D0 03 81BA 313 BNE INDY TAKEN FOR (NN),Y. +81B7:AE CA 90 314 LDX XREG FOR (NN,X). +81BA:8A 315 INDY TXA X=0 FOR (NN),Y +81BB:8D DF 90 316 STA TEMP1 +81BE:A0 01 317 LDY #1 +81C0:20 27 01 318 JSR YPEEK +81C3:18 319 CLC +81C4:6D DF 90 320 ADC TEMP1 +81C7:48 321 PHA +81C8:20 4D 8A 322 JSR ZSWAP GET PROGRAM PAGE 0 AND +81CB:68 323 PLA SAVE POINTER ADDRESS ON +81CC:AA 324 TAX STACK. +81CD:B5 01 325 LDA $01,X +81CF:48 326 PHA +81D0:B5 00 327 LDA $00,X +81D2:48 328 PHA +81D3:20 4D 8A 329 JSR ZSWAP RESTORE ANALYST PAGE 0 +81D6:68 330 PLA AND RECOVER POINTER ADDR. +81D7:AA 331 TAX +81D8:68 332 PLA +81D9:20 FE 80 333 JSR PRNTAX +81DC:A9 A9 334 LDA #$A9 ')' +81DE:20 F5 88 335 JSR COUT +81E1:4C 3E 83 336 SSTEPZ JMP TSTEP +81E4:A9 FF 337 PRNTPC LDA #$FF PRINT PC AT TOP OF SCREEN +81E6:8D D8 90 338 STA CV BY FORCING CROUT TO INC +81E9:20 4C 88 339 JSR CROUT CV TO 0 (NEED FOR 80 COL) +81EC:A9 1D 340 LDA #29 +81EE:8D D7 90 341 STA CH +81F1:AD D6 90 342 LDA PROMPT +81F4:20 F5 88 343 JSR COUT +81F7:A5 F0 344 LDA PCH +81F9:A6 EF 345 LDX PCL +81FB:4C FE 80 346 JMP PRNTAX +81FE:AE DC 90 347 TRACEPC LDX PCPNT SAVE PC TO BE EXEC'D +8201:A5 F0 348 LDA PCH IN LIST BUFFER. +8203:9D 4C 01 349 STA PCBUF,X +8206:E8 350 INX +8207:A5 EF 351 LDA PCL +8209:9D 4C 01 352 STA PCBUF,X +820C:E8 353 INX +820D:E0 20 354 CPX #32 +820F:90 02 8213 355 BCC PNTINC +8211:A2 00 356 LDX #0 +8213:8E DC 90 357 PNTINC STX PCPNT +8216:AD 61 C0 358 LDA PB0 +8219:10 0B 8226 359 BPL TRCPC1 +821B:AD E2 90 360 LDA PCFLG O/A TOGGLES PRINT PC +821E:49 FF 361 EOR #$FF ON/OFF +8220:8D E2 90 362 STA PCFLG +8223:20 7A 87 363 JSR FWAIT PAUSE TO RELEASE O/A KEY +8226:AD E2 90 364 TRCPC1 LDA PCFLG +8229:F0 10 823B 365 BEQ TRCPC2 BYPASS PRINTING PC. +822B:EE E3 90 366 INC COUNTER PRINT PC +822E:D0 0B 823B 367 BNE TRCPC2 EVERY 256 INSTRUCTIONS +8230:AD D6 90 368 LDA PROMPT FLASHING '$' FOR TRACE +8233:49 04 369 EOR #$04 ACTIVITY. $A4->$A0->$A4 +8235:8D D6 90 370 STA PROMPT +8238:20 E4 81 371 JSR PRNTPC +823B:AD C3 90 372 TRCPC2 LDA JFLG +823E:F0 5F 829F 373 BEQ TRACE5 +8240:A5 F0 374 LDA PCH +8242:C9 C0 375 CMP #$C0 +8244:90 10 8256 376 BCC TRCPCD +8246:AC FF 90 377 LDY ROMFLG +8249:D0 0B 8256 378 BNE TRCPCD +824B:C9 D0 379 CMP #$D0 +824D:90 13 8262 380 BCC TRCPCI +824F:AC 00 E0 381 LDY IDROM JSR ROM $C000-FFFF IN +8252:C0 4C 382 CPY #$4C IMMEDIATE MODE UNLESS +8254:F0 0C 8262 383 BEQ TRCPCI ROM FLAG SET <> 0. +8256:CD C5 90 384 TRCPCD CMP DOSCALL+1 TRACE THRU JSR UNLESS = +8259:D0 44 829F 385 BNE TRACE5 DOS SUBROUTINE SPECIFIED +825B:A5 EF 386 LDA PCL BY F(/). +825D:CD C4 90 387 CMP DOSCALL +8260:D0 3D 829F 388 BNE TRACE5 +8262:AD E2 90 389 TRCPCI LDA PCFLG EXEC JSR IMMEDIATE. DON'T +8265:F0 0E 8275 390 BEQ TRCPCS PRINT IF O/A TURNED OFF. +8267:20 39 8E 391 JSR SPROMPT '#' DENOTES JSR IMMED. +826A:20 E4 81 392 JSR PRNTPC PRINT EXEC SUBROUTINE +826D:20 36 8E 393 JSR DPROMPT '$' PROMPT +8270:A9 FF 394 LDA #$FF FORCE PC PRINTING +8272:8D E3 90 395 STA COUNTER AFTER JSR IMMED. +8275:A5 EF 396 TRCPCS LDA PCL SEE IF PC = $BF00 +8277:D0 09 8282 397 BNE TRCPCG +8279:A5 F0 398 LDA PCH +827B:C9 BF 399 CMP # TRACE ENTRY POINT +8296:9C D9 90 410 STZ DSPTOP FOR STEP -> TRACE +8299:20 36 8E 411 JSR DPROMPT '$' PROMPT +829C:20 51 87 412 JSR CLEARDSP +829F:A2 01 413 TRACE5 LDX #1 IF PC = A4 THEN ENTER STEP +82A1:B5 EF 414 TRACE6 LDA PCL,X +82A3:DD DD 90 415 CMP BRKADDR,X +82A6:D0 08 82B0 416 BNE TRACE7 +82A8:CA 417 DEX +82A9:10 F6 82A1 418 BPL TRACE6 +82AB:20 2F 85 419 JSR SETBREAK CLEAR OLD BREAKPOINT +82AE:80 08 82B8 420 BRA TRACES +82B0:AD 62 C0 421 TRACE7 LDA PB1 BACK TO STEP MODE IF +82B3:30 03 82B8 422 BMI TRACES CLOSED APPLE PRESSED +82B5:4C 3B 83 423 JMP TRACE8 +82B8:8D 10 C0 424 TRACES STA KBDSTRB +82BB:9C C2 90 425 STZ TFLG CLEAR TRACE FLAG +82BE:9C D9 90 426 STZ DSPTOP RESET DISPLAY TO TOP +82C1:AD 1A C0 427 LDA RDTEXT SEE IF GRAPHICS MODE +82C4:30 03 82C9 428 BMI TRACES2 +82C6:20 63 8E 429 JSR TEXT GRAPHICS -> TEXT +82C9:20 2A 8E 430 TRACES2 JSR STPRMPT PROMPT BACK TO OLD '#' +82CC:CE DA 90 431 DEC YSAV +82CF:AC DA 90 432 LDY YSAV +82D2:A9 D3 433 LDA #$D3 PUT 'S' INTO INPUT BUFFER +82D4:99 6C 01 434 STA IN,Y +82D7:4C 99 81 435 JMP SSTEPT RE-ENTER STEP MODE +82DA:20 38 8A 436 NBRNCH JSR SAVE ALL OTHER OPCODES +82DD:80 0C 82EB 437 BRA UPDPC +82DF:20 38 8A 438 BRANCH JSR SAVE BRANCH WITH COND. MET +82E2:18 439 CLC +82E3:A0 01 440 LDY #$01 +82E5:20 27 01 441 JSR YPEEK +82E8:20 12 81 442 JSR PCADJAP +82EB:38 443 UPDPC SEC +82EC:20 0F 81 444 PCINC JSR PCADJLP +82EF:AD C2 90 445 NEWPC LDA TFLG +82F2:D0 06 82FA 446 BNE TRACEBY BYPASSES NEXTITM +82F4:20 4C 88 447 NXTPC JSR CROUT +82F7:4C 78 85 448 JMP REGDSP +82FA:4C FE 81 449 TRACEBY JMP TRACEPC +82FD:E8 450 XJMPATX INX +82FE:D0 1E 831E 451 BNE XJMPAT +8300:8D C3 90 452 XJSR STA JFLG OK FOR F(J) +8303:EE D9 90 453 INC DSPTOP +8306:18 454 CLC +8307:20 1A 81 455 JSR PCADJL SET Y,A = RTS ADDR +830A:48 456 PHA +830B:AE CD 90 457 LDX SPNT +830E:98 458 TYA +830F:9D 00 91 459 STA STACK,X +8312:CA 460 DEX +8313:68 461 PLA +8314:9D 00 91 462 STA STACK,X +8317:CA 463 DEX +8318:8E CD 90 464 STX SPNT +831B:A0 02 465 LDY #$02 +831D:18 466 XJMP CLC +831E:20 27 01 467 XJMPAT JSR YPEEK +8321:48 468 PHA +8322:88 469 DEY +8323:20 27 01 470 JSR YPEEK +8326:85 EF 471 STA PCL +8328:68 472 PLA +8329:85 F0 473 STA PCH +832B:90 C2 82EF 474 BCC NEWPC +832D:CA 475 DEX +832E:D0 ED 831D 476 BNE XJMP +8330:AD CA 90 477 LDA XREG +8333:18 478 CLC +8334:20 12 81 479 JSR PCADJAP +8337:A0 01 480 LDY #1 +8339:80 E2 831D 481 BRA XJMP +833B:20 10 80 482 TRACE8 JSR INSDST +833E:AD C6 90 483 TSTEP LDA ERRFLG IF BAD OPCODE THEN BRK +8341:D0 45 8388 484 BNE XBRK +8343:9C C3 90 485 STZ JFLG DISALLOW F(J) IF NO JSR +8346:20 25 01 486 JSR PEEK GET OPCODE +8349:AC D1 90 487 LDY LENGTH +834C:C0 02 488 CPY #2 CHECK ALL 3-BYTE INST +834E:F0 03 8353 489 BEQ TSTEP3 +8350:4C 07 84 490 JMP TSTEP4 +8353:C9 20 491 TSTEP3 CMP #$20 +8355:F0 A9 8300 492 BEQ XJSR +8357:C9 7C 493 CMP #$7C +8359:F0 A2 82FD 494 BEQ XJMPATX +835B:C9 4C 495 CMP #$4C +835D:F0 BE 831D 496 BEQ XJMP +835F:C9 6C 497 CMP #$6C +8361:F0 BB 831E 498 BEQ XJMPAT +8363:48 499 PHA SAVE OPCODE. +8364:20 27 01 500 JSR YPEEK GET ADDRESS HI-BYTE. +8367:C9 01 501 CMP #$01 HANDLE 3-BYTE $100 REF +8369:D0 35 83A0 502 BNE TSTEP3X SPECIAL. +836B:68 503 PLA ADJ STACK. +836C:AD C9 84 504 LDA STACKLOC+2 SUBSTITUTE PSUEDO-STACK +836F:80 0B 837C 505 BRA XQSTK +8371: 0008 506 DS 8,0 +8379:20 27 01 507 XQST1 JSR YPEEK +837C:99 0B 01 508 XQSTK STA XQTS+3,Y +837F:88 509 DEY +8380:10 F7 8379 510 BPL XQST1 +8382:20 26 8A 511 JSR RESTORE +8385:4C 0B 01 512 JMP XQTS+3 EXEC IN ANALYST R/W MODE +8388:9C D9 90 513 XBRK STZ DSPTOP +838B:9C C2 90 514 STZ TFLG +838E:20 51 87 515 JSR CLEARDSP +8391:20 7E 80 516 JSR INSTDSP +8394:20 4C 88 517 JSR CROUT +8397:20 81 85 518 JSR RGDSP1 +839A:20 25 86 519 JSR BELL +839D:4C 60 8A 520 JMP ZSWAPE EXIT VIA NEXTITM +83A0:C9 C0 521 TSTEP3X CMP #$C0 $C002-C005, $C008-C009 +83A2:D0 68 840C 522 BNE TSTEP5 AUX R/W SWITCHES HANDLE +83A4:88 523 DEY SPECIAL. +83A5:20 27 01 524 JSR YPEEK +83A8:C8 525 INY +83A9:C9 02 526 CMP #$02 +83AB:90 5F 840C 527 BCC TSTEP5 +83AD:C9 04 528 CMP #$04 +83AF:90 45 83F6 529 BCC TSTEPRD +83B1:C9 06 530 CMP #$06 +83B3:90 46 83FB 531 BCC TSTEPWR +83B5:C9 08 532 CMP #$08 +83B7:90 53 840C 533 BCC TSTEP5 +83B9:C9 0A 534 CMP #$0A +83BB:B0 4F 840C 535 BCS TSTEP5 +83BD:8D E1 90 536 STA TEMP3 +83C0:6A 537 ROR A +83C1:6A 538 ROR A +83C2:4D 16 C0 539 EOR RDAUXZP +83C5:10 3C 8403 540 BPL STOUT2 NO CHANGE IN ZP STATE. +83C7:20 4D 8A 541 JSR ZSWAP RESTORE PROGRAM ZP. +83CA:AD E1 90 542 LDA TEMP3 NEW ZP STATE +83CD:4A 543 LSR A ODD/EVEN 9/8 +83CE:B0 03 83D3 544 BCS ODDNEW +83D0:A9 09 545 LDA #9 NEW = 8 +83D2:2C 546 DFB $2C +83D3:A9 08 547 ODDNEW LDA #8 NEW = 9 +83D5:8D E0 90 548 STA TEMP2 OLD STATE +83D8:A2 00 549 LDX #0 COPY XQTS ACROSS +83DA:AC E0 90 550 STKLOOP LDY TEMP2 +83DD:99 00 C0 551 STA $C000,Y OLD ZP +83E0:BD 00 01 552 LDA $0100,X +83E3:AC E1 90 553 LDY TEMP3 +83E6:99 00 C0 554 STA $C000,Y NEW ZP +83E9:9D 00 01 555 STA $0100,X +83EC:E8 556 INX +83ED:F0 11 8400 557 BEQ STKOUT +83EF:E0 78 558 CPX #>IN+12 +83F1:D0 E7 83DA 559 BNE STKLOOP +83F3:BA 560 TSX COPY ANALYST STACK ACROSS +83F4:80 E4 83DA 561 BRA STKLOOP +83F6:8D 34 01 562 TSTEPRD STA XQTS+44 SET PROGRAM READ STATE. +83F9:80 08 8403 563 BRA STOUT2 +83FB:8D 37 01 564 TSTEPWR STA XQTS+47 SET PROGRAM WRITE STATE. +83FE:80 03 8403 565 BRA STOUT2 +8400:20 4D 8A 566 STKOUT JSR ZSWAP PUT ANALYST ZP BACK. +8403:68 567 STOUT2 PLA PULL OPC TO ADJ STACK +8404:4C EB 82 568 UPDPCGO JMP UPDPC +8407:C0 01 569 TSTEP4 CPY #1 +8409:D0 38 8443 570 BNE LEN0 +840B:48 571 PHA SAVE OPCODE +840C:A9 EA 572 TSTEP5 LDA #$EA +840E:8D 0C 01 573 STA XQTS+4 +8411:8D 0D 01 574 STA XQTS+5 +8414:68 575 PLA OPCODE +8415:C9 80 576 CMP #$80 +8417:D0 02 841B 577 BNE NBRA +8419:09 10 578 ORA #$10 +841B:29 1F 579 NBRA AND #$1F +841D:49 14 580 EOR #$14 +841F:C9 04 581 CMP #$04 = BRANCH OFFSET +8421:F0 03 8426 582 BEQ XQ2 TAKEN IF BRANCH OPCODE +8423:20 27 01 583 XQ1 JSR YPEEK Y = LENGTH +8426:99 0B 01 584 XQ2 STA XQTS+3,Y XQT BCS BRNCH (B0 04) +8429:88 585 DEY NOP +842A:10 F7 8423 586 BPL XQ1 JMP NBRNCH (CCLR) +842C:20 26 8A 587 JSR RESTORE BRNCH JMP BRANCH (CSET) +842F:4C 08 01 588 JMP XQTS +8432:AE CD 90 589 XTSX LDX SPNT +8435:8E CA 90 590 STX XREG +8438:AE CA 90 591 XTXS LDX XREG +843B:8E CE 90 592 STX SREF +843E:8E CD 90 593 UPDSPNT STX SPNT UPDATE SPNT +8441:80 C1 8404 594 BRA UPDPCGO +8443:C9 60 595 LEN0 CMP #$60 +8445:F0 7C 84C3 596 BEQ XRTS +8447:C9 BA 597 CMP #$BA +8449:F0 E7 8432 598 BEQ XTSX +844B:C9 9A 599 CMP #$9A +844D:F0 E9 8438 600 BEQ XTXS +844F:C9 40 601 CMP #$40 +8451:F0 04 8457 602 BEQ XBRKGO BRK FOR RTI INSTRUCTION +8453:C9 00 603 CMP #$00 +8455:D0 03 845A 604 BNE PHCHECK +8457:4C 88 83 605 XBRKGO JMP XBRK +845A:48 606 PHCHECK PHA SAVE OPCODE +845B:C9 5A 607 CMP #$5A +845D:90 08 8467 608 BCC TSTEP6 +845F:AA 609 TAX +8460:29 1F 610 AND #$1F +8462:C9 1A 611 CMP #$1A +8464:F0 07 846D 612 BEQ STKOPC PHX,PLX,PHY,PLY +8466:8A 613 TXA +8467:29 9F 614 TSTEP6 AND #$9F +8469:C9 08 615 CMP #$08 PHA,PLA,PHP,PLP +846B:D0 9F 840C 616 BNE TSTEP5 +846D:AE CD 90 617 STKOPC LDX SPNT STACK OPCODES +8470:68 618 PLA OPCODE +8471:A8 619 TAY +8472:29 10 620 AND #$10 +8474:F0 26 849C 621 BEQ APCODE +8476:98 622 TYA +8477:0A 623 ASL A +8478:B0 11 848B 624 BCS OPCX +847A:0A 625 ASL A +847B:0A 626 ASL A +847C:B0 05 8483 627 BCS XPLY +847E:AD CB 90 628 LDA YREG XPHY +8481:80 28 84AB 629 BRA PUSH +8483:20 DB 84 630 XPLY JSR PULL +8486:8D CB 90 631 STA YREG +8489:80 B3 843E 632 UPDSTACK BRA UPDSPNT +848B:0A 633 OPCX ASL A +848C:0A 634 ASL A +848D:B0 05 8494 635 BCS XPLX +848F:AD CA 90 636 LDA XREG XPHX +8492:80 17 84AB 637 BRA PUSH +8494:20 DB 84 638 XPLX JSR PULL +8497:8D CA 90 639 STA XREG +849A:80 ED 8489 640 BRA UPDSTACK +849C:98 641 APCODE TYA +849D:0A 642 ASL A +849E:0A 643 ASL A +849F:30 10 84B1 644 BMI PULLAP +84A1:90 05 84A8 645 BCC XPHP +84A3:AD C9 90 646 LDA ACC XPHA +84A6:80 03 84AB 647 BRA PUSH +84A8:AD CC 90 648 XPHP LDA STATUS +84AB:9D 00 91 649 PUSH STA STACK,X +84AE:CA 650 DEX +84AF:D0 D8 8489 651 BNE UPDSTACK +84B1:90 08 84BB 652 PULLAP BCC XPLP +84B3:20 DB 84 653 JSR PULL XPLA +84B6:8D C9 90 654 ACCLOC STA ACC +84B9:80 CE 8489 655 BRA UPDSTACK +84BB:20 DB 84 656 XPLP JSR PULL +84BE:8D CC 90 657 STA STATUS +84C1:80 C6 8489 658 BRA UPDSTACK +84C3:AE CD 90 659 XRTS LDX SPNT +84C6:E8 660 INX +84C7:BD 00 91 661 STACKLOC LDA STACK,X +84CA:85 EF 662 STA PCL +84CC:E8 663 INX +84CD:BD 00 91 664 LDA STACK,X +84D0:85 F0 665 STA PCH +84D2:8E CD 90 666 STX SPNT +84D5:CE D9 90 667 DEC DSPTOP +84D8:4C EC 82 668 JMP PCINC +84DB:E8 669 PULL INX +84DC:AC CC 90 670 LDY STATUS PULL FROM STACK AFFECTS +84DF:5A 671 PHY N & Z FLAGS +84E0:28 672 PLP +84E1:BD 00 91 673 LDA STACK,X +84E4:08 674 PHP UPDATE N & Z +84E5:7A 675 PLY +84E6:8C CC 90 676 STY STATUS +84E9:60 677 RTS +84EA:48 678 YPOKEPC PHA EXECUTE STA (PCL),Y +84EB:A5 EF 679 LDA PCL +84ED:85 F8 680 STA A3L +84EF:A5 F0 681 LDA PCH +84F1:85 F9 682 STA A3H +84F3:68 683 PLA +84F4:4C 1D 01 684 JMP YPOKE +84F7: 685 * +84F7: 686 * XQTS IMAGE AT $102-139. INSTRUCTIONS WITH '@' ARE +84F7: 687 * CHANGEABLE IN XQTS AREA TO SET MAIN/AUX R/W STATE. +84F7: 688 * +84F7:20 2C 01 689 INITBL JSR XQTS+36 WARMV. REAL-TIME REENTRY +84FA:4C 7A 8A 690 JMP REENTER BY JSR $102. +84FD:20 33 01 691 JSR XQTS+43 XQTS +8500:EA 692 NOP +8501:EA 693 NOP +8502:EA 694 NOP +8503:4C 17 01 695 JMP XQTS+15 +8506:20 2C 01 696 JSR XQTS+36 +8509:4C DF 82 697 JMP BRANCH +850C:20 2C 01 698 JSR XQTS+36 XQTS+15 +850F:4C DA 82 699 JMP NBRNCH +8512:20 33 01 700 JSR XQTS+43 YPOKE +8515:91 F8 701 STA (A3L),Y +8517:4C 2C 01 702 JMP XQTS+36 +851A:A0 00 703 LDY #0 PEEK +851C:20 33 01 704 JSR XQTS+43 YPEEK +851F:B1 EF 705 LDA (PCL),Y +8521:8D 02 C0 706 STA MAINRD @ XQTS+36. SET ANALYST +8524:8D 04 C0 707 STA MAINWR @ STATE +8527:60 708 RTS +8528:8D 02 C0 709 STA MAINRD @ XQTS+43. SET PROGRAM +852B:8D 04 C0 710 STA MAINWR @ STATE +852E:60 711 RTS +852F: 712 * +852F:A2 01 713 SETBREAK LDX #1 SET BREAKPOINT TO A4 +8531:AD DE 90 714 LDA BRKADDR+1 IF GIVEN, ELSE $FFFF. +8534:F0 09 853F 715 BEQ SETBRK2 BREAKPOINT GIVEN +8536:A9 FF 716 LDA #$FF +8538:9D DD 90 717 SETBRK1 STA BRKADDR,X CLEAR OLD BREAKPOINT +853B:CA 718 DEX +853C:10 FA 8538 719 BPL SETBRK1 +853E:60 720 RTS +853F:B5 FA 721 SETBRK2 LDA A4L,X SET BREAKPOINT +8541:9D DD 90 722 STA BRKADDR,X +8544:CA 723 DEX +8545:10 F8 853F 724 BPL SETBRK2 +8547:60 725 RTS +8548:AD 6A 8B 726 LOAD LDA XQLOC1+1 F(H) +854B:AC 6B 8B 727 LDY XQLOC1+2 SETUP A3 = XQT+1 FOR HSF +854E:80 0C 855C 728 BRA A3SET BUFFER (XQT=BYTE COUNT) +8550:20 A6 89 729 SETRG1 JSR A1PC +8553:20 FE 85 730 JSR SAVEPC +8556:AD B7 84 731 SETRG2 LDA ACCLOC+1 SETUP REGS FOR F(:) +8559:AC B8 84 732 LDY ACCLOC+2 +855C:85 F8 733 A3SET STA A3L +855E:84 F9 734 STY A3H +8560:60 735 RTS +8561:8A 736 SETREG TXA F(I) SET OR DISPLAY REGS. +8562:D0 EC 8550 737 BNE SETRG1 TAKEN IF PC GIVEN. +8564:AC DA 90 738 LDY YSAV +8567:B9 6C 01 739 LDA IN,Y +856A:C9 8D 740 CMP #$8D +856C:D0 E8 8556 741 BNE SETRG2 +856E:AD C7 90 742 LDA PCREG I DISPLAYS REGS. +8571:85 EF 743 STA PCL +8573:AD C8 90 744 LDA PCREG+1 +8576:85 F0 745 STA PCH +8578:20 81 85 746 REGDSP JSR RGDSP1 +857B:4C 7E 80 747 JMP INSTDSP WILL RTS TO NEXTITM +857E: 0003 748 DS 3,0 +8581:A2 00 749 RGDSP1 LDX #0 +8583:BD D2 8F 750 RDSP1 LDA RTBL,X +8586:20 F5 88 751 JSR COUT +8589:A9 BD 752 LDA #$BD +858B:20 F5 88 753 JSR COUT +858E:BD C9 90 754 LDA ACC,X +8591:20 E2 88 755 JSR PRBYTE +8594:20 50 88 756 JSR OUTSP +8597:E8 757 INX +8598:E0 03 758 CPX #3 +859A:90 E7 8583 759 BCC RDSP1 +859C:A2 07 760 LDX #7 +859E:BD CA 8F 761 PRFLG LDA CHAR3,X PRINT 'NV-BDIZC' +85A1:20 F5 88 762 JSR COUT +85A4:CA 763 DEX +85A5:10 F7 859E 764 BPL PRFLG +85A7:20 4C 88 765 JSR CROUT +85AA:A9 C1 766 LDA #$C1 PRINT ACC IN BINARY +85AC:20 F5 88 767 JSR COUT +85AF:20 46 89 768 JSR OUTEQ +85B2:AD C9 90 769 LDA ACC +85B5:20 12 86 770 JSR BNDSP +85B8:20 05 81 771 JSR PRBLNK3 +85BB:A9 D0 772 LDA #$D0 PRINT STATUS IN BINARY +85BD:20 F5 88 773 JSR COUT +85C0:20 46 89 774 JSR OUTEQ +85C3:AD CC 90 775 LDA STATUS +85C6:20 12 86 776 JSR BNDSP +85C9:20 4C 88 777 JSR CROUT +85CC:A9 D3 778 LDA #$D3 +85CE:20 F5 88 779 JSR COUT +85D1:20 46 89 780 JSR OUTEQ +85D4:AD CD 90 781 LDA SPNT +85D7:20 E2 88 782 JSR PRBYTE +85DA:A9 BA 783 LDA #$BA +85DC:20 F5 88 784 JSR COUT +85DF:A9 D8 785 LDA #$D8 +85E1:20 F5 88 786 JSR COUT +85E4:20 F5 88 787 JSR COUT +85E7:A0 0A 788 LDY #10 +85E9:AE CD 90 789 LDX SPNT +85EC:20 50 88 790 PRNTSTK JSR OUTSP PRINT STACK BYTES FROM +85EF:EC CE 90 791 CPX SREF SPNT TO SREF UP TO 10 +85F2:F0 0A 85FE 792 BEQ SAVEPC MAX. +85F4:E8 793 INX +85F5:BD 00 91 794 LDA STACK,X +85F8:20 E2 88 795 JSR PRBYTE +85FB:88 796 DEY +85FC:D0 EE 85EC 797 BNE PRNTSTK +85FE:A5 EF 798 SAVEPC LDA PCL +8600:8D C7 90 799 STA PCREG +8603:A5 F0 800 LDA PCH +8605:8D C8 90 801 STA PCREG+1 +8608:60 802 RTS +8609:20 A4 89 803 BINARY JSR A1PCX F(%) PRINT VALUE AT +860C:20 4C 88 804 JSR CROUT ADDRESS IN BINARY. +860F:20 25 01 805 JSR PEEK +8612:A2 08 806 BNDSP LDX #$08 INDEX FOR 8 BITS +8614:0A 807 NEXTBIT ASL A +8615:48 808 PHA +8616:B0 03 861B 809 BCS BIT1 +8618:A9 30 810 LDA #$30 '0' +861A:2C 811 DFB $2C SKIP NEXT INSTRUCTION +861B:A9 31 812 BIT1 LDA #$31 '1' +861D:20 F5 88 813 JSR COUT +8620:68 814 PLA +8621:CA 815 DEX +8622:D0 F0 8614 816 BNE NEXTBIT +8624:60 817 RTS +8625:A0 38 818 BELL LDY #$38 DURATION +8627:A9 2B 819 BELL2 LDA #$2B FREQUENCY +8629:20 7C 87 820 JSR WAIT +862C:AD 30 C0 821 LDA SPKR +862F:88 822 DEY +8630:D0 F5 8627 823 BNE BELL2 +8632:60 824 RTS +8633:6C C0 90 825 COUTZ JMP (CSWL) +8636:89 60 826 VIDOUT BIT #$60 +8638:F0 46 8680 827 BEQ CTRLCHAR +863A:A8 828 TAY +863B:C9 60 829 CMP #$60 +863D:B0 06 8645 830 BCS VID1 +863F:C9 40 831 CMP #$40 +8641:90 02 8645 832 BCC VID1 +8643:29 BF 833 AND #$BF +8645:AC D7 90 834 VID1 LDY CH +8648:2C 1F C0 835 BIT RD80VID +864B:10 0A 8657 836 BPL VID3 +864D:48 837 PHA +864E:98 838 TYA +864F:4A 839 LSR A +8650:B0 03 8655 840 BCS VID2 +8652:8D 55 C0 841 STA HISCR +8655:A8 842 VID2 TAY +8656:68 843 PLA +8657:91 F1 844 VID3 STA (BASL),Y +8659:8D 54 C0 845 STA LOWSCR +865C:AC D7 90 846 LDY CH +865F:C8 847 INY +8660:CC D5 90 848 CPY WNDWDTH +8663:B0 25 868A 849 BCS CR +8665:8C D7 90 850 STY CH +8668:60 851 VIDRTS RTS +8669:CE D7 90 852 BACKSPC DEC CH +866C:10 FA 8668 853 BPL VIDRTS +866E:AC D5 90 854 LDY WNDWDTH +8671:88 855 DEY +8672:8C D7 90 856 STY CH +8675:AD D8 90 857 UP LDA CV +8678:3A 858 DEC A +8679:C9 00 859 CMP #0 +867B:30 EB 8668 860 BMI VIDRTS +867D:4C FB 86 861 VTABVGO JMP VTABV +8680:09 80 862 CTRLCHAR ORA #$80 +8682:C9 88 863 CMP #$88 +8684:F0 E3 8669 864 BEQ BACKSPC +8686:C9 8D 865 CMP #$8D +8688:D0 DE 8668 866 BNE VIDRTS +868A:A9 00 867 CR LDA #$00 +868C:8D D7 90 868 STA CH +868F:EE D8 90 869 INC CV +8692:AD D8 90 870 LDA CV +8695:C9 18 871 CMP #24 +8697:90 E4 867D 872 BCC VTABVGO +8699:CE D8 90 873 DEC CV +869C:A2 00 874 LDX #0 SCROLL +869E:8A 875 TXA +869F:20 FE 86 876 JSR VTABZ +86A2:80 30 86D4 877 BRA SCRL5 +86A4:A4 F2 878 SCRL1 LDY BASH +86A6:84 FF 879 STY BAS2H +86A8:A4 F1 880 LDY BASL +86AA:84 FE 881 STY BAS2L +86AC:8A 882 TXA +86AD:20 FE 86 883 JSR VTABZ +86B0:DA 884 PHX +86B1:AE D5 90 885 LDX WNDWDTH +86B4:A0 00 886 LDY #0 +86B6:2C 1F C0 887 SCRL2 BIT RD80VID +86B9:10 0D 86C8 888 BPL SCRL3 +86BB:8D 55 C0 889 STA HISCR +86BE:B1 F1 890 LDA (BASL),Y +86C0:91 FE 891 STA (BAS2L),Y +86C2:CA 892 DEX +86C3:F0 0B 86D0 893 BEQ SCRL4 +86C5:8D 54 C0 894 STA LOWSCR +86C8:B1 F1 895 SCRL3 LDA (BASL),Y +86CA:91 FE 896 STA (BAS2L),Y +86CC:C8 897 INY +86CD:CA 898 DEX +86CE:D0 E6 86B6 899 BNE SCRL2 +86D0:8D 54 C0 900 SCRL4 STA LOWSCR +86D3:FA 901 PLX +86D4:E8 902 SCRL5 INX +86D5:E0 18 903 CPX #24 +86D7:90 CB 86A4 904 BCC SCRL1 +86D9:A9 00 905 LDA #$00 +86DB:20 19 87 906 JSR CLEOLZ +86DE:4C F8 86 907 JMP VTAB +86E1:A9 00 908 HOME LDA #0 +86E3:8D D7 90 909 STA CH +86E6:8D D8 90 910 STA CV +86E9:48 911 CLS1 PHA +86EA:20 FE 86 912 JSR VTABZ +86ED:A9 00 913 LDA #0 +86EF:20 19 87 914 JSR CLEOLZ +86F2:68 915 PLA +86F3:1A 916 INC A +86F4:C9 18 917 CMP #24 +86F6:90 F1 86E9 918 BCC CLS1 +86F8:AD D8 90 919 VTAB LDA CV +86FB:8D D8 90 920 VTABV STA CV +86FE:48 921 VTABZ PHA +86FF:4A 922 LSR A +8700:29 03 923 AND #$03 +8702:09 04 924 ORA #$04 +8704:85 F2 925 STA BASH +8706:68 926 PLA +8707:29 18 927 AND #$18 +8709:90 02 870D 928 BCC BSCLC2 +870B:69 7F 929 ADC #$7F +870D:85 F1 930 BSCLC2 STA BASL +870F:0A 931 ASL A +8710:0A 932 ASL A +8711:05 F1 933 ORA BASL +8713:85 F1 934 STA BASL +8715:60 935 RTS +8716:AD D7 90 936 CLREOL LDA CH +8719:2C 1F C0 937 CLEOLZ BIT RD80VID +871C:10 24 8742 938 BPL CLEOL4 +871E:48 939 PHA CLREOL 80 COL +871F:38 940 SEC +8720:ED D5 90 941 SBC WNDWDTH +8723:AA 942 TAX +8724:68 943 PLA +8725:4A 944 LSR A +8726:A8 945 TAY +8727:08 946 PHP +8728:A9 A0 947 LDA #$A0 +872A:28 948 PLP +872B:B0 08 8735 949 BCS CLEOL8B +872D:8D 55 C0 950 CLEOL8A STA HISCR +8730:91 F1 951 STA (BASL),Y +8732:E8 952 INX +8733:F0 09 873E 953 BEQ CLEOL8C +8735:8D 54 C0 954 CLEOL8B STA LOWSCR +8738:91 F1 955 STA (BASL),Y +873A:C8 956 INY +873B:E8 957 INX +873C:D0 EF 872D 958 BNE CLEOL8A +873E:8D 54 C0 959 CLEOL8C STA LOWSCR +8741:60 960 RTS +8742:A8 961 CLEOL4 TAY +8743:38 962 SEC +8744:ED D5 90 963 SBC WNDWDTH +8747:AA 964 TAX +8748:A9 A0 965 LDA #$A0 +874A:91 F1 966 CLEOL4A STA (BASL),Y +874C:C8 967 INY +874D:E8 968 INX +874E:D0 FA 874A 969 BNE CLEOL4A +8750:60 970 RTS +8751:A2 06 971 CLEARDSP LDX #6 CLEAR DISPLAY WINDOW +8753:AD D9 90 972 CLRDSP1 LDA DSPTOP +8756:10 02 875A 973 BPL CLRDSP2 HOLD TOP OF DISPLAY +8758:A9 00 974 LDA #0 0 <= TOP <= 18. +875A:C9 12 975 CLRDSP2 CMP #18 +875C:90 02 8760 976 BCC CLRDSP3 +875E:A9 12 977 LDA #18 +8760:8D D9 90 978 CLRDSP3 STA DSPTOP +8763:8D D8 90 979 STA CV CLEAR 6 LINE DISPLAY +8766:CE D8 90 980 DEC CV FROM DSPTOP DOWN AND +8769:8A 981 TXA SET CV SO INSTDSP WILL +876A:F0 0D 8779 982 BEQ RTS4A PRINT AT DSPTOP UPON +876C:20 4C 88 983 CLRDSP4 JSR CROUT EXIT. +876F:DA 984 PHX +8770:20 16 87 985 JSR CLREOL +8773:FA 986 PLX +8774:CA 987 DEX +8775:D0 F5 876C 988 BNE CLRDSP4 +8777:F0 DA 8753 989 BEQ CLRDSP1 +8779:60 990 RTS4A RTS +877A:A9 FF 991 FWAIT LDA #$FF +877C:38 992 WAIT SEC +877D:48 993 WAIT2 PHA +877E:E9 01 994 WAIT3 SBC #$01 +8780:D0 FC 877E 995 BNE WAIT3 +8782:68 996 PLA +8783:E9 01 997 SBC #$01 +8785:D0 F6 877D 998 BNE WAIT2 +8787:60 999 RTS +8788:E6 FA 1000 NXTA4 INC A4L INCREMENT A4 +878A:D0 02 878E 1001 BNE NXTA1 +878C:E6 FB 1002 INC A4H +878E:A5 F4 1003 NXTA1 LDA A1L +8790:C5 F6 1004 CMP A2L +8792:A5 F5 1005 LDA A1H +8794:E5 F7 1006 SBC A2H +8796:E6 F4 1007 INC A1L +8798:D0 02 879C 1008 BNE RTS4B +879A:E6 F5 1009 INC A1H +879C:60 1010 RTS4B RTS CARRY SET IF A1 >= A2 +879D:AC 00 C0 1011 CTRLC LDY KBD CHECK FOR CTRL-C +87A0:10 19 87BB 1012 BPL CTLCRTS +87A2:8C 10 C0 1013 STY KBDSTRB +87A5:C0 93 1014 CPY #$93 CTRL-S = PAUSE +87A7:D0 10 87B9 1015 BNE CTLC +87A9:AC 61 C0 1016 KYWAIT LDY PB0 F(S) ENTRY POINT +87AC:30 09 87B7 1017 BMI KYWT2 +87AE:AC 00 C0 1018 LDY KBD +87B1:10 F6 87A9 1019 BPL KYWAIT +87B3:8C 10 C0 1020 STY KBDSTRB +87B6:2C 1021 DFB $2C +87B7:A0 00 1022 KYWT2 LDY #0 0 = OPEN APPLE PRESSED +87B9:C0 83 1023 CTLC CPY #$83 +87BB:60 1024 CTLCRTS RTS Z SET FOR CTRL-C. +87BC:8C DB 90 1025 RDKEY STY YSAV1 +87BF:AC 1C C0 1026 LDY RDSCR +87C2:08 1027 PHP +87C3:AC 18 C0 1028 LDY RDPAGE2 +87C6:08 1029 PHP +87C7:8D 01 C0 1030 STA INHPAGE2 +87CA:8D 54 C0 1031 STA LOWSCR +87CD:DA 1032 PHX +87CE:AD D7 90 1033 LDA CH +87D1:2C 1F C0 1034 BIT RD80VID +87D4:10 06 87DC 1035 BPL KEY2 +87D6:4A 1036 LSR A +87D7:B0 03 87DC 1037 BCS KEY2 +87D9:8D 55 C0 1038 STA HISCR +87DC:A8 1039 KEY2 TAY +87DD:B1 F1 1040 LDA (BASL),Y +87DF:48 1041 PHA +87E0:49 80 1042 EOR #$80 +87E2:89 20 1043 BIT #$20 +87E4:D0 02 87E8 1044 BNE KEY3 +87E6:49 40 1045 EOR #$40 +87E8:91 F1 1046 KEY3 STA (BASL),Y +87EA:AE 00 C0 1047 KEY4 LDX KBD +87ED:10 FB 87EA 1048 BPL KEY4 +87EF:8D 10 C0 1049 STA KBDSTRB +87F2:68 1050 PLA +87F3:91 F1 1051 STA (BASL),Y +87F5:8D 54 C0 1052 STA LOWSCR +87F8:8A 1053 TXA +87F9:4C 0C 89 1054 JMP ENDHOOK +87FC:BD 6C 01 1055 NOTCR LDA IN,X +87FF:20 F5 88 1056 JSR COUT +8802:C9 88 1057 CMP #$88 +8804:F0 1C 8822 1058 BEQ BCKSPC +8806:E0 22 1059 CPX #34 BEEP ON LAST 4 CHAR. +8808:90 03 880D 1060 BCC NOTCR1 +880A:20 25 86 1061 JSR BELL +880D:E8 1062 NOTCR1 INX +880E:E0 26 1063 CPX #38 38 CHARACTERS ALLOWED +8810:90 14 8826 1064 BCC NXTCHAR +8812:A9 DC 1065 LDA #$DC +8814:20 F5 88 1066 JSR COUT +8817:20 4C 88 1067 GETLNZ JSR CROUT +881A:AD D6 90 1068 LDA PROMPT +881D:20 F5 88 1069 JSR COUT +8820:A2 01 1070 LDX #$01 +8822:8A 1071 BCKSPC TXA +8823:F0 F2 8817 1072 BEQ GETLNZ +8825:CA 1073 DEX +8826:20 BC 87 1074 NXTCHAR JSR RDKEY +8829:C9 95 1075 CMP #$95 +882B:F0 F9 8826 1076 BEQ NXTCHAR IGNORE '->' +882D:C9 FF 1077 CMP #$FF +882F:D0 02 8833 1078 BNE NOTDEL +8831:A9 88 1079 LDA #$88 DELETE KEY = BACKSPACE +8833:C9 88 1080 NOTDEL CMP #$88 +8835:D0 08 883F 1081 BNE CAPTST +8837:48 1082 PHA +8838:20 F5 88 1083 JSR COUT BACKSPACE +883B:20 50 88 1084 JSR OUTSP DELETE CHARACTER +883E:68 1085 PLA BACKSPACE +883F:C9 E0 1086 CAPTST CMP #$E0 +8841:90 02 8845 1087 BCC ADDINP +8843:29 DF 1088 AND #$DF +8845:9D 6C 01 1089 ADDINP STA IN,X +8848:C9 8D 1090 CMP #$8D +884A:D0 B0 87FC 1091 BNE NOTCR +884C:A9 8D 1092 CROUT LDA #$8D +884E:D0 12 8862 1093 BNE COUTGO +8850:A9 A0 1094 OUTSP LDA #$A0 +8852:D0 0E 8862 1095 BNE COUTGO +8854:20 4C 88 1096 PRA1 JSR CROUT +8857:A4 F5 1097 LDY A1H +8859:A6 F4 1098 LDX A1L +885B:20 FD 80 1099 PRYX2 JSR PRNTYX +885E:A0 00 1100 LDY #$00 +8860:A9 AD 1101 LDA #$AD +8862:20 F5 88 1102 COUTGO JSR COUT +8865:60 1103 PRA1RTS RTS +8866:38 1104 ASC SEC F(") +8867:6A 1105 XAM ROR A CARRY INTO BIT 7 +8868:85 F9 1106 STA A3H +886A:80 06 8872 1107 BRA XAM1 +886C:A5 F4 1108 MOD8CHK LDA A1L +886E:29 07 1109 AND #$07 +8870:D0 08 887A 1110 BNE DATAOUT +8872:20 9D 87 1111 XAM1 JSR CTRLC F(.) A1.A2 HEX OR ASC +8875:F0 EE 8865 1112 BEQ PRA1RTS +8877:20 54 88 1113 JSR PRA1 +887A:20 50 88 1114 DATAOUT JSR OUTSP +887D:A5 F5 1115 LDA A1H SEE IF ZERO PAGE +887F:F0 0B 888C 1116 BEQ XAMZ +8881:3A 1117 DEC A SEE IF $01NN +8882:D0 15 8899 1118 BNE XAM2 +8884:A5 F4 1119 LDA A1L GET $01NN FROM STACK,NN +8886:AA 1120 TAX +8887:BD 00 91 1121 LDA STACK,X +888A:80 13 889F 1122 BRA XAM3 +888C:A5 F4 1123 XAMZ LDA A1L +888E:38 1124 SEC +888F:E9 EF 1125 SBC #PCL +8891:90 06 8899 1126 BCC XAM2 TAKEN IF A1L < PCL +8893:AA 1127 TAX ELSE GET FROM ZBUF +8894:BD E4 90 1128 LDA ZBUF,X +8897:80 06 889F 1129 BRA XAM3 +8899:20 A4 89 1130 XAM2 JSR A1PCX +889C:20 25 01 1131 JSR PEEK +889F:A6 F9 1132 XAM3 LDX A3H +88A1:10 0D 88B0 1133 BPL XAM4 +88A3:09 80 1134 ORA #$80 XAM IN ASC +88A5:C9 A0 1135 CMP #$A0 +88A7:B0 02 88AB 1136 BCS PRASC TAKEN IF NORM. OR LCASE +88A9:A9 A0 1137 LDA #$A0 SPACE FOR CTRL OR INV +88AB:20 F5 88 1138 PRASC JSR COUT +88AE:80 03 88B3 1139 BRA XAM5 +88B0:20 E2 88 1140 XAM4 JSR PRBYTE XAM IN HEX +88B3:20 8E 87 1141 XAM5 JSR NXTA1 +88B6:90 B4 886C 1142 BCC MOD8CHK CARRY CLEAR IF A1 ZFLG:AA +8AAC:85 F3 1379 STA ZFLG +8AAE:20 6B 8A 1380 RST2 JSR INITXQTS +8AB1:9C C2 90 1381 STZ TFLG +8AB4:9C C3 90 1382 STZ JFLG +8AB7:20 63 8E 1383 TXTMON JSR TEXT +8ABA:20 E1 86 1384 JSR HOME +8ABD:20 0C 8F 1385 JSR PRTITLE +8AC0:9C C6 90 1386 MONZ STZ ERRFLG +8AC3:CE DE 90 1387 DEC BRKADDR+1 INSURE BRKPOINT CLEARED +8AC6:20 3F 8E 1388 JSR CHKVID MATCH HOOKS W/DISPLAY MODE +8AC9:20 2A 8E 1389 JSR STPRMPT +8ACC:20 17 88 1390 JSR GETLNZ +8ACF:20 39 8B 1391 JSR ZMODE +8AD2:9C D9 90 1392 STZ DSPTOP DISPLAY AT TOP +8AD5:20 14 8B 1393 NXTITM JSR GETNUM HANDLE HEX DIGS TO 1ST +8AD8:8C DA 90 1394 STY YSAV NON-HEX CHAR+1 (Y=INDX) +8ADB:A0 1C 1395 LDY #SUBTBL-CHRTBL +8ADD:88 1396 CHRSRCH DEY ACC = F(ACC) +8ADE:30 11 8AF1 1397 BMI SYNERR +8AE0:D9 65 90 1398 CMP CHRTBL,Y +8AE3:D0 F8 8ADD 1399 BNE CHRSRCH +8AE5:5A 1400 PHY +8AE6:20 2B 8B 1401 JSR TOSUB +8AE9:7A 1402 PLY +8AEA:F0 D4 8AC0 1403 BEQ MONZ 0 = OFFSET FOR F(CR) +8AEC:AC DA 90 1404 NEXTITM LDY YSAV +8AEF:80 E4 8AD5 1405 BRA NXTITM +8AF1:20 25 86 1406 SYNERR JSR BELL +8AF4:80 CA 8AC0 1407 BRA MONZ +8AF6:A2 03 1408 DIG LDX #$03 HEX DIGIT NOW IN ACC LO +8AF8:0A 1409 ASL A NIBBLE. KEYS 0-9=00-09 +8AF9:0A 1410 ASL A KEYS A-F=FA-FF. MOVE +8AFA:0A 1411 ASL A LO NIBBLE TO HI NIBBLE +8AFB:0A 1412 ASL A +8AFC:0A 1413 NXTBIT ASL A 4 BIT HEX DIG. INTO A2L +8AFD:26 F6 1414 ROL A2L A2L TO A2H +8AFF:26 F7 1415 ROL A2H +8B01:CA 1416 DEX +8B02:10 F8 8AFC 1417 BPL NXTBIT +8B04:AD D3 90 1418 NXTBAS LDA MODE +8B07:D0 06 8B0F 1419 BNE NXTBS2 IF MODE=0 COPY +8B09:B5 F7 1420 LDA A2H,X A2 TO A1 & A3 +8B0B:95 F5 1421 STA A1H,X +8B0D:95 F9 1422 STA A3H,X +8B0F:E8 1423 NXTBS2 INX +8B10:F0 F2 8B04 1424 BEQ NXTBAS +8B12:D0 06 8B1A 1425 BNE NXTCHR +8B14:A2 00 1426 GETNUM LDX #0 +8B16:86 F6 1427 STX A2L +8B18:86 F7 1428 STX A2H +8B1A:B9 6C 01 1429 NXTCHR LDA IN,Y F(ACC) = ACC EOR $B0 +8B1D:C8 1430 INY ADC $88 (CARRY SET) +8B1E:49 B0 1431 EOR #$B0 KEYS 0-9=$00-09 +8B20:C9 0A 1432 CMP #$0A +8B22:90 D2 8AF6 1433 BCC DIG TAKEN IF KEYS 0-9 +8B24:69 88 1434 ADC #$88 KEYS A-F=$FA-FF +8B26:C9 FA 1435 CMP #$FA +8B28:B0 CC 8AF6 1436 BCS DIG TAKEN IF KEYS A-F +8B2A:60 1437 RTS +8B2B:98 1438 TOSUB TYA # OF FUNCTION (START=0) +8B2C:0A 1439 ASL A MULT BY 2 +8B2D:A8 1440 TAY +8B2E:B9 82 90 1441 LDA SUBTBL+1,Y +8B31:48 1442 PHA +8B32:B9 81 90 1443 LDA SUBTBL,Y +8B35:48 1444 PHA +8B36:AD D3 90 1445 LDA MODE OLD MODE FOR F(CR)&F( ) +8B39:A0 00 1446 ZMODE LDY #$00 +8B3B:8C D3 90 1447 STY MODE +8B3E:60 1448 RTS RTS TO SUBROUTINE +8B3F:AD C3 90 1449 EXECJSR LDA JFLG F(J) +8B42:D0 03 8B47 1450 BNE GOJSR 'J' WITH NO JSR? +8B44:4C 25 86 1451 ERRJ JMP BELL RTS TO NEXTITM VIA BELL. +8B47:AC DA 90 1452 GOJSR LDY YSAV GET # OF PARM BYTES +8B4A:20 14 8B 1453 JSR GETNUM +8B4D:88 1454 DEY +8B4E:8C DA 90 1455 STY YSAV +8B51:A5 F7 1456 LDA A2H +8B53:D0 EF 8B44 1457 BNE ERRJ +8B55:A5 F6 1458 LDA A2L +8B57:C9 0A 1459 CMP #10 +8B59:B0 E9 8B44 1460 BCS ERRJ ONLY 9 PARM BYTES MAX +8B5B:A8 1461 TAY SAVE BYTE COUNT +8B5C:A2 11 1462 GOPC LDX #17 +8B5E:BD 99 8B 1463 XQINIT2 LDA INITBL2,X FILL DUMMY BLOCK +8B61:9D 3A 01 1464 STA XQT,X +8B64:CA 1465 DEX +8B65:10 F7 8B5E 1466 BPL XQINIT2 +8B67:A5 EF 1467 LDA PCL MOVE JSR ADDR TO XQT +8B69:8D 3B 01 1468 XQLOC1 STA XQT+1 +8B6C:A5 F0 1469 LDA PCH +8B6E:8D 3C 01 1470 STA XQT+2 +8B71:AE CD 90 1471 LDX SPNT SET PC = PARM LIST - 1 +8B74:E8 1472 INX +8B75:BD 00 91 1473 LDA STACK,X +8B78:85 EF 1474 STA PCL +8B7A:E8 1475 INX +8B7B:BD 00 91 1476 LDA STACK,X +8B7E:85 F0 1477 STA PCH +8B80:8E CD 90 1478 STX SPNT +8B83:98 1479 TYA GET PARM BYTES +8B84:AA 1480 TAX +8B85:F0 09 8B90 1481 BEQ MVPRM1 NO PARM BYTES TO MOVE +8B87:20 27 01 1482 MOVPARM JSR YPEEK MOVE PARM LIST TO DUMMY +8B8A:99 3C 01 1483 STA XQT+2,Y +8B8D:88 1484 DEY +8B8E:D0 F7 8B87 1485 BNE MOVPARM +8B90:E8 1486 MVPRM1 INX +8B91:8A 1487 TXA ADJ PC TO POINT TO INST +8B92:18 1488 CLC FOLLOWING PARM LIST +8B93:20 12 81 1489 JSR PCADJAP +8B96:4C 12 8A 1490 JMP XQJ EXECUTE JSR IMMED. MODE +8B99:20 00 00 1491 INITBL2 JSR $0000 DUMMY BLOCK FOR F(J) +8B9C:EA 1492 NOP 9 NOP'S FOR PARM BYTES +8B9D:EA 1493 NOP +8B9E:EA 1494 NOP +8B9F:EA 1495 NOP +8BA0:EA 1496 NOP +8BA1:EA 1497 NOP +8BA2:EA 1498 NOP +8BA3:EA 1499 NOP +8BA4:EA 1500 NOP +8BA5:20 2C 01 1501 JSR XQTS+36 RESTORE ANALYST R/W +8BA8:4C AB 8B 1502 JMP JRTS +8BAB:20 38 8A 1503 JRTS JSR SAVE +8BAE:20 3F 8E 1504 JSR CHKVID +8BB1:AD C3 90 1505 LDA JFLG +8BB4:F0 14 8BCA 1506 BEQ JRTS3 DURING 'G0' W/O BREAK +8BB6:9C C3 90 1507 STZ JFLG +8BB9:AD C2 90 1508 LDA TFLG +8BBC:F0 03 8BC1 1509 BEQ JRTS2 DURING 'STEP' +8BBE:4C 9F 82 1510 JMP TRACE5 DURING TRACE IMMEDIATE +8BC1:CE D9 90 1511 JRTS2 DEC DSPTOP UPDATE REGDSP AFTER JSR. +8BC4:20 51 87 1512 JRTSX JSR CLEARDSP 'SKIP' ENTERS HERE +8BC7:4C F4 82 1513 JMP NXTPC +8BCA:60 1514 JRTS3 RTS RTS TO NEXTITM. +8BCB:A9 FF 1515 FIND LDA #$FF F(CTRL-F) A4 ALONE EXITS +8CCC:4C 2A 8E 1641 JMP STPRMPT VIA NEXTITM +8CCF:20 14 8B 1642 MINI2 JSR GETNUM +8CD2:C9 93 1643 CMP #$93 F(:) +8CD4:D0 D3 8CA9 1644 A1TOPC BNE ERROR +8CD6:8A 1645 TXA +8CD7:F0 D0 8CA9 1646 BEQ ERROR +8CD9:20 A9 89 1647 JSR A1PCLP +8CDC:A9 03 1648 RDMNEM LDA #$03 INDEX FOR 3 CHAR MNEM +8CDE:85 F5 1649 STA A1H +8CE0:20 5C 8D 1650 RDMNEM2 JSR CHARIN +8CE3:0A 1651 ASL A +8CE4:E9 BE 1652 SBC #$BE +8CE6:C9 C2 1653 CMP #$C2 LESS THAN 'A' +8CE8:90 BF 8CA9 1654 BCC ERROR NOT ASC LETTER SO ERR +8CEA:0A 1655 ASL A +8CEB:0A 1656 ASL A +8CEC:A2 04 1657 LDX #$04 INDEX FOR 5 BITS +8CEE:0A 1658 RDMNEM3 ASL A MOVE 5 BIT LETTER CODE +8CEF:26 FA 1659 ROL A4L (* 3 LETTERS) INTO A4. +8CF1:26 FB 1660 ROL A4H 26 LETTERS REQ. 5 BITS +8CF3:CA 1661 DEX +8CF4:10 F8 8CEE 1662 BPL RDMNEM3 +8CF6:C6 F5 1663 DEC A1H +8CF8:F0 F4 8CEE 1664 BEQ RDMNEM3 +8CFA:10 E4 8CE0 1665 BPL RDMNEM2 +8CFC:A2 05 1666 LDX #$05 INDEX FOR 6 FORMAT BITS +8CFE:20 5C 8D 1667 RDFMT JSR CHARIN +8D01:8C DA 90 1668 STY YSAV +8D04:DD BE 8F 1669 CMP CHAR1,X +8D07:D0 14 8D1D 1670 BNE RDFMT2 +8D09:20 5C 8D 1671 JSR CHARIN +8D0C:DD C4 8F 1672 CMP CHAR2,X +8D0F:F0 0E 8D1F 1673 BEQ RDADDR +8D11:BD C4 8F 1674 LDA CHAR2,X +8D14:F0 08 8D1E 1675 BEQ RDFMT3 +8D16:C9 A4 1676 CMP #$A4 +8D18:F0 04 8D1E 1677 BEQ RDFMT3 +8D1A:AC DA 90 1678 LDY YSAV +8D1D:18 1679 RDFMT2 CLC +8D1E:88 1680 RDFMT3 DEY +8D1F:26 FC 1681 RDADDR ROL A5L +8D21:E0 03 1682 CPX #$03 +8D23:D0 0E 8D33 1683 BNE RDADDR3 +8D25:20 14 8B 1684 JSR GETNUM +8D28:A5 F7 1685 LDA A2H +8D2A:F0 01 8D2D 1686 BEQ RDADDR2 +8D2C:E8 1687 INX +8D2D:8E DB 90 1688 RDADDR2 STX YSAV1 +8D30:A2 03 1689 LDX #$03 +8D32:88 1690 DEY +8D33:86 F5 1691 RDADDR3 STX A1H +8D35:CA 1692 DEX +8D36:10 C6 8CFE 1693 BPL RDFMT +8D38:A5 FC 1694 LDA A5L +8D3A:0A 1695 ASL A +8D3B:0A 1696 ASL A +8D3C:0D DB 90 1697 ORA YSAV1 +8D3F:C9 20 1698 CMP #$20 +8D41:B0 07 8D4A 1699 BCS RDADDR4 +8D43:AE DB 90 1700 LDX YSAV1 +8D46:F0 02 8D4A 1701 BEQ RDADDR4 +8D48:09 80 1702 ORA #$80 +8D4A:85 FC 1703 RDADDR4 STA A5L +8D4C:8C DA 90 1704 STY YSAV +8D4F:B9 6C 01 1705 LDA IN,Y +8D52:C9 8D 1706 CMP #$8D +8D54:F0 03 8D59 1707 BEQ DISAS +8D56:4C D4 8C 1708 JMP A1TOPC +8D59:4C 79 8C 1709 DISAS JMP DSS +8D5C:B9 6C 01 1710 CHARIN LDA IN,Y +8D5F:C8 1711 INY +8D60:C9 A0 1712 CMP #$A0 +8D62:F0 F8 8D5C 1713 BEQ CHARIN +8D64:60 1714 ENDMINI RTS +8D65:AD BC 90 1715 RELOC LDA STARTLOC+1 F(R) +8D68:85 F0 1716 STA PCH +8D6A:64 EF 1717 STZ PCL MAKE SURE ANALYST IS +8D6C:20 25 01 1718 JSR PEEK BEING READ FOR MOVE +8D6F:C9 4C 1719 CMP #$4C BY PEEKING START BYTE. +8D71:D0 F1 8D64 1720 BNE ENDMINI DO NOT RELOCATE! +8D73:A5 F5 1721 LDA A1H +8D75:85 FB 1722 STA A4H +8D77:48 1723 PHA +8D78:64 FA 1724 STZ A4L +8D7A:AD BC 90 1725 LDA STARTLOC+1 +8D7D:85 F5 1726 STA A1H +8D7F:85 FC 1727 STA A5L +8D81:64 F4 1728 STZ A1L +8D83:AD BF 90 1729 LDA AUXV+2 LOCATION OF 'AUXLOAD' +8D86:85 F7 1730 STA A2H WHICH MARKS END. +8D88:AD BE 90 1731 LDA AUXV+1 +8D8B:85 F6 1732 STA A2L +8D8D:A5 F5 1733 LDA A1H CALC DIFFERENCE BETWEEN +8D8F:38 1734 SEC OLD & NEW ORG +8D90:E5 FB 1735 SBC A4H +8D92:85 FD 1736 STA A5H +8D94:A9 3C 1737 LDA #AUXV-SUBTBL +8D96:4A 1738 LSR A DIVIDE BY 2 +8D97:A8 1739 TAY # OF WORDS +8D98:A2 FF 1740 LDX #$FF +8D9A:E8 1741 RELOC2 INX CONVERT SUBTBL WORDS +8D9B:E8 1742 INX +8D9C:BD 81 90 1743 LDA SUBTBL,X +8D9F:38 1744 SEC +8DA0:E5 FD 1745 SBC A5H +8DA2:9D 81 90 1746 STA SUBTBL,X +8DA5:88 1747 DEY +8DA6:D0 F2 8D9A 1748 BNE RELOC2 +8DA8:A9 60 1749 LDA #$60 PUT IN RTS TO DISABLE +8DAA:8D BD 90 1750 STA AUXV AUX LOADER. NOT MOVED. +8DAD:20 66 89 1751 JSR MOVE NEW ORG 80 +8E4C:90 6A 8EB8 1825 CHK80 BCC SET40 80 -> 40 +8E4E:60 1826 RTS7 RTS +8E4F:AC DA 90 1827 SETVID LDY YSAV F(@) +8E52:B9 6C 01 1828 LDA IN,Y +8E55:EE DA 90 1829 INC YSAV +8E58:C9 B4 1830 CMP #$B4 '4' +8E5A:F0 5C 8EB8 1831 BEQ SET40 +8E5C:C9 B8 1832 CMP #$B8 '8' +8E5E:F0 1A 8E7A 1833 BEQ SET80 +8E60:CE DA 90 1834 DEC YSAV @ ALONE +8E63:AD B9 90 1835 TEXT LDA OUTVECT +8E66:8D C0 90 1836 STA CSWL +8E69:AD BA 90 1837 LDA OUTVECT+1 +8E6C:8D C1 90 1838 STA CSWH +8E6F:8D 01 C0 1839 STA INHPAGE2 FOR AUX TO DISPLAY TEXT. +8E72:8D 51 C0 1840 STA TXTSET +8E75:AD 1F C0 1841 LDA RD80VID SET 40 OR 80 COL +8E78:10 3E 8EB8 1842 BPL SET40 TEXT BASED ON RD80VID +8E7A:A9 FF 1843 SET80 LDA #$FF +8E7C:8D D4 90 1844 STA FLG8 +8E7F:A9 50 1845 LDA #80 +8E81:8D D5 90 1846 STA WNDWDTH +8E84:2C 1F C0 1847 BIT RD80VID +8E87:30 2D 8EB6 1848 BMI SET8D +8E89:8D 0D C0 1849 STA SET80VID +8E8C:A9 00 1850 LDA #$00 +8E8E:48 1851 SET8A PHA +8E8F:20 FE 86 1852 JSR VTABZ +8E92:A0 00 1853 LDY #$00 +8E94:B1 F1 1854 SET8B LDA (BASL),Y +8E96:AA 1855 TAX +8E97:5A 1856 PHY +8E98:98 1857 TYA +8E99:4A 1858 LSR A +8E9A:A8 1859 TAY +8E9B:B0 03 8EA0 1860 BCS SET8C +8E9D:8D 55 C0 1861 STA HISCR +8EA0:8A 1862 SET8C TXA +8EA1:91 F1 1863 STA (BASL),Y +8EA3:7A 1864 PLY +8EA4:8D 54 C0 1865 STA LOWSCR +8EA7:C8 1866 INY +8EA8:C0 28 1867 CPY #$28 +8EAA:90 E8 8E94 1868 BCC SET8B +8EAC:98 1869 TYA +8EAD:20 19 87 1870 JSR CLEOLZ +8EB0:68 1871 PLA +8EB1:1A 1872 INC A +8EB2:C9 18 1873 CMP #$18 +8EB4:90 D8 8E8E 1874 BCC SET8A +8EB6:80 32 8EEA 1875 SET8D BRA SETDONE +8EB8:9C D4 90 1876 SET40 STZ FLG8 +8EBB:2C 1F C0 1877 BIT RD80VID +8EBE:10 25 8EE5 1878 BPL SET4D +8EC0:8D 0C C0 1879 STA CLR80VID +8EC3:A9 00 1880 LDA #$00 +8EC5:48 1881 SET4A PHA +8EC6:20 FE 86 1882 JSR VTABZ +8EC9:A0 27 1883 LDY #$27 +8ECB:98 1884 SET4B TYA +8ECC:4A 1885 LSR A +8ECD:5A 1886 PHY +8ECE:A8 1887 TAY +8ECF:B0 03 8ED4 1888 BCS SET4C +8ED1:8D 55 C0 1889 STA HISCR +8ED4:B1 F1 1890 SET4C LDA (BASL),Y +8ED6:7A 1891 PLY +8ED7:8D 54 C0 1892 STA LOWSCR +8EDA:91 F1 1893 STA (BASL),Y +8EDC:88 1894 DEY +8EDD:10 EC 8ECB 1895 BPL SET4B +8EDF:68 1896 PLA +8EE0:1A 1897 INC A +8EE1:C9 18 1898 CMP #$18 +8EE3:90 E0 8EC5 1899 BCC SET4A +8EE5:A9 28 1900 SET4D LDA #40 +8EE7:8D D5 90 1901 STA WNDWDTH +8EEA:4C F8 86 1902 SETDONE JMP VTAB +8EED:A0 00 1903 HELP LDY #0 F(?) LIST LAST 16 PC +8EEF:B9 4C 01 1904 HLP2 LDA PCBUF,Y ADDRESSES EXECUTED +8EF2:C8 1905 INY DURING TRACE. +8EF3:BE 4C 01 1906 LDX PCBUF,Y +8EF6:C8 1907 INY +8EF7:20 FE 80 1908 JSR PRNTAX +8EFA:CC DC 90 1909 CPY PCPNT +8EFD:D0 05 8F04 1910 BNE HLP3 +8EFF:A9 BC 1911 LDA #$BC +8F01:20 F5 88 1912 JSR COUT +8F04:20 4C 88 1913 HLP3 JSR CROUT +8F07:C0 20 1914 CPY #32 +8F09:90 E4 8EEF 1915 BCC HLP2 +8F0B:60 1916 RTS +8F0C:A2 00 1917 PRTITLE LDX #$00 F(V). PRINT TITLE +8F0E:BD 27 8F 1918 TITLLOC LDA TITLE,X +8F11:F0 06 8F19 1919 BEQ PRADDR +8F13:20 F5 88 1920 JSR COUT +8F16:E8 1921 INX +8F17:80 F5 8F0E 1922 BRA TITLLOC +8F19:AD BC 90 1923 PRADDR LDA STARTLOC+1 PRINT ORIGIN ADDRESS +8F1C:20 E2 88 1924 JSR PRBYTE +8F1F:A9 00 1925 LDA #0 +8F21:20 E2 88 1926 JSR PRBYTE +8F24:4C 4C 88 1927 JMP CROUT + +8F27: 1929 *** PROGRAM DATA AREA *** + +8F27:8D 1931 TITLE DFB $8D +8F28:C1 CE C1 CC 1932 ASC "ANALYST 128XP" +8F35:8D 1933 DFB $8D TITLE MARKS START OF PDA +8F36:CF D2 C7 A0 1934 ASC "ORG = " +8F3C:A4 1935 BANKORG ASC "$" +8F3D:00 1936 DFB $00 +8F3E:1C 8A 1937 MNEML DFB 28,138 +8F40:1C 23 5D 8B 1938 DFB 28,35,93,139,27,161,157,138 +8F48:1D 23 9D 8B 1939 DFB 29,35,157,139,29,161,28,41 +8F50:19 AE 69 A8 1940 DFB 25,174,105,168,25,35,36,83 +8F58:1B 23 24 53 1941 DFB 27,35,36,83,25,161,173,26 +8F60:A5 5B A5 AC 1942 DFB 165,91,165,172,139,138,174,174 +8F68:A8 AD 29 8A 1943 DFB 168,173,41,138,124,139,21,156 +8F70:6D 9C A5 69 1944 DFB 109,156,165,105,41,83,132,19 +8F78:34 11 A5 69 1945 DFB 52,17,165,105,35,160 +8F7E:D8 62 1946 MNEMR DFB 216,98 +8F80:5A 48 26 62 1947 DFB 90,72,38,98,148,136,84,68 +8F88:C8 54 68 44 1948 DFB 200,84,104,68,232,148,196,180 +8F90:08 84 74 B4 1949 DFB 8,132,116,180,40,110,116,244 +8F98:CC 4A 72 F2 1950 DFB 204,74,114,242,164,138,6,170 +8FA0:76 A2 74 C6 1951 DFB 118,162,116,198,116,116,68,104 +8FA8:B2 32 B2 72 1952 DFB 178,50,178,114,34,114,26,26 +8FB0:26 26 72 72 1953 DFB 38,38,114,114,136,200,196,202 +8FB8:26 48 44 44 1954 DFB 38,72,68,68,162,200 +8FBE:AC A9 AC A3 1955 CHAR1 DFB 172,169,172,163,168,164 +8FC4:D9 00 D8 A4 1956 CHAR2 DFB 217,0,216,164,164,0 +8FCA:C3 DA C9 C4 1957 CHAR3 ASC "CZIDB-VN" +8FD2:C1 D8 D9 1958 RTBL ASC "AXY" +8FD5:00 21 81 82 1959 FMT2 DFB 0,33,129,130,90,73,89,77 +8FDD:91 92 86 4A 1960 DFB 145,146,134,74,133,157 +8FE3:F0 22 00 33 1961 FMT1 DFB 240,34,0,51,93,130,0,147 +8FEB:F3 22 00 33 1962 DFB 243,34,0,51,93,136,0,153 +8FF3:F0 2F 00 33 1963 DFB 240,47,0,51,93,143,0,159 +8FFB:F0 22 00 3B 1964 DFB 240,34,0,59,93,136,0,148 +9003:FD 22 00 33 1965 DFB 253,34,0,51,93,200,0,147 +900B:11 22 00 33 1966 DFB 17,34,0,51,93,200,0,169 +9013:F1 22 00 33 1967 DFB 241,34,0,51,93,143,0,159 +901B:F1 22 00 33 1968 DFB 241,34,0,51,93,143,0,159 +9023:26 31 87 9A 1969 DFB 38,49,135,154 +9027:12 32 52 72 1970 OPC65C DFB 18,50,82,114 +902B:92 B2 D2 F2 1971 DFB 146,178,210,242,58,26,137,28 +9033:14 7A 5A 9C 1972 DFB 20,122,90,156,100,158,116,124 +903B:3C 34 1973 DFB 60,52 +903D:4C A4 AC B4 1974 DFB 76,164,172,180,188,196,204,228 +9045:EC 1975 DFB 236 +9046:11 31 51 71 1976 REPL65C DFB 17,49,81,113,145,177 +904C:D1 F1 C2 E2 1977 DFB 209,241,194,226,52,164,172,196 +9054:E4 5C 5C 5C 1978 DFB 228,92,92,92,92,124,60,52 +905C:7C A0 A0 A0 1979 DFB 124,160,160,160,160,192,192 +9063:E0 E0 1980 DFB 224,224 +9065:C6 98 F9 B1 1981 CHRTBL DFB 198,152,249,177,241,3 +906B:EC A6 A4 06 1982 DFB 236,166,164,6,149,5 +9071:00 93 02 A7 1983 DFB 0,147,2,167,153 +9076:9B 9A EF E9 1984 DFB 155,154,239,233,1,191 +907C:A8 ED 9E EB 1985 DFB 168,237,158,235,197 +9081:25 89 1986 SUBTBL DW BL1-1 F(CR) MUST BE 1ST IN TBL +9083:EC 8E 1987 DW HELP-1 F(?) LIST PC'S TRACED +9085:4E 8E 1988 DW SETVID-1 F(@) SWITCH 40/80 COL +9087:BC 90 1989 DW AUXV-1 F(CTRL-X) MOVE TO AUX +9089:12 8E 1990 DW AUXRW-1 F(X) MAIN/AUX $200-BFFF +908B:3E 8B 1991 DW EXECJSR-1 F(J) EXECUTE JSR +908D:28 81 1992 DW STEP-1 F(S) STEP +908F:49 89 1993 DW SETMODE-1 F(-) 16 BIT SUBTRACTION +9091:49 89 1994 DW SETMODE-1 F(+) 16 BIT ADDITION +9093:65 89 1995 DW MOVE-1 F(M) MOVE +9095:57 89 1996 DW LT-1 F(<) COPY A2 TO A4 & A5 +9097:7B 89 1997 DW LIST-1 F(L) LIST DISASSEMBLY +9099:DA 89 1998 DW GO-1 F(G) GO +909B:49 89 1999 DW SETMODE-1 F(:) STORE +909D:60 85 2000 DW SETREG-1 F(I) SET INTERNAL PC/REG +909F:49 89 2001 DW SETMODE-1 F(.) XAM +90A1:2A 89 2002 DW BLANK-1 F( ) HANDLE SPACES +90A3:65 88 2003 DW ASC-1 F(") DUMP IN ASCII +90A5:B5 8C 2004 DW MINI-1 F(!) MINI-ASSEMBLER +90A7:0B 8F 2005 DW PRTITLE-1 F(V) PRINT TITLE +90A9:B3 89 2006 DW SETPRNT-1 F(P) TO PRINTER +90AB:47 85 2007 DW LOAD-1 F(H) LOAD FOR HSF +90AD:CA 8B 2008 DW FIND-1 F(CTRL-F) HEX SEQ. FIND +90AF:FA 8D 2009 DW SETDOS-1 F(/) SET DOS CALL JSR #. +90B1:86 82 2010 DW TRACE-1 F(T) TRACE +90B3:08 86 2011 DW BINARY-1 F(%) VALUE IN BINARY +90B5:64 8D 2012 DW RELOC-1 F(R) RELOCATOR +90B7:E0 86 2013 DW HOME-1 F(CTRL-L) CLEAR SCREEN +90B9:36 86 2014 OUTVECT DW VIDOUT +90BB:00 80 2015 STARTLOC DW START + +90BD: 2017 * DYNAMIC PROGRAM AREA * + +90BD:4C 00 92 2019 AUXV JMP AUXLOAD F(CTRL-X) ONE TIME VECTOR +90C0: 0001 2020 CSWL DS 1 ADDR. OF OUTPUT ROUTINE +90C1: 0001 2021 CSWH DS 1 +90C2: 0001 2022 TFLG DS 1 <>0 = CANCEL COUT FOR TRC +90C3: 0001 2023 JFLG DS 1 SET TO ALLOW F(J) +90C4:00 BF 2024 DOSCALL DW MLI ROUTINE TO JSR IMMED. +90C6: 0001 2025 ERRFLG DS 1 SET FOR BAD OPCODE +90C7: 0002 2026 PCREG DS 2,0 +90C9:00 2027 ACC DFB 0 DON'T CHANGE ORDER +90CA:00 2028 XREG DFB 0 OF ACC TO SPNT +90CB:00 2029 YREG DFB 0 +90CC:00 2030 STATUS DFB 0 +90CD:FF 2031 SPNT DFB $FF +90CE:FF 2032 SREF DFB $FF STACK REF SET BY TXS OPC +90CF: 0001 2033 LMNEM DS 1 +90D0: 0001 2034 RMNEM DS 1 +90D1: 0001 2035 LENGTH DS 1 +90D2: 0001 2036 FORMAT DS 1 +90D3: 0001 2037 MODE DS 1 +90D4: 0001 2038 FLG8 DS 1 FF = 80 COL, 0 = 40 COL +90D5: 0001 2039 WNDWDTH DS 1 +90D6: 0001 2040 PROMPT DS 1 +90D7: 0001 2041 CH DS 1 +90D8:00 2042 CV DFB 0 +90D9: 0001 2043 DSPTOP DS 1 TOP OF DISPLAY FOR STEP +90DA: 0001 2044 YSAV DS 1 +90DB: 0001 2045 YSAV1 DS 1 +90DC:00 2046 PCPNT DFB 0 INDEX TO PCBUF +90DD: 0002 2047 BRKADDR DS 2,255 BREAK FOR STEP,TRACE,LIST +90DF: 0001 2048 TEMP1 DS 1 FOR INSTDSP AND STEP. +90E0: 0001 2049 TEMP2 DS 1 FOR STEP. +90E1: 0001 2050 TEMP3 DS 1 FOR STEP. +90E2: 0001 2051 PCFLG DS 1 PRNTPC ON/OFF FOR TRACE +90E3: 0001 2052 COUNTER DS 1 FOR TRACE +90E4: 0011 2053 ZBUF DS $100-PCL PAGE ZERO STORAGE BUFFER +90F5: 00F5 2054 PAGEFIL EQU >* +90F5: 000A 2055 DS $FF-PAGEFIL +90FF:00 2056 ROMFLG DFB 0 1 = TRACE JSR ROM $D000-FFFF +9100: 0100 2057 STACK DS $100,0 MUST BE ON PAGE BOUNDARY +9200:A9 00 2058 AUXLOAD LDA #>START F(CTRL-X) MOVE ANALYST +9202:85 3C 2059 STA MA1 TO AUX. THIS CODE NOT +9204:85 42 2060 STA MA4 RELOCATEABLE. +9206:A9 80 2061 LDA #AUXLOAD +920E:85 3E 2065 STA MA2 +9210:A9 92 2066 LDA #