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 #