diff --git a/ANALYST.1025.TXT b/ANALYST.1025.TXT new file mode 100644 index 0000000..52f2a74 --- /dev/null +++ b/ANALYST.1025.TXT @@ -0,0 +1,2068 @@ +* LST OFF + SBTL + X6502 + MSB ON + ORG $8000 + SKP 1 +********************************* +* * +* -< THE ANALYST >- * +* * +* 128K VERSION XE * +* * +* BUILD 1025 01/10/21 * +* * +* (UPDATE BUILD# IN TITLE) * +* * +********************************* + 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 +; 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 +; & EXIT TO OR FROM DOS / PRODOS +; ? PRINT LAST 16 PC'S EXEC'D DURING TRACE +; @ SET TEXT 40/80 COL SCREEN +; < RANGE DELIMITER +; . RANGE DELIMITER +; : STORE VALUE IN MEMORY + SKP 1 +*** ROM ZERO PAGE EQUATES *** + SKP 1 +MA1 EQU $3C +MA2 EQU $3E +MA4 EQU $42 +CURLIN EQU $75 #1021 APPLESOFT CURRENT LINE NUMBER + 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 +DECWORD EQU BAS2L #1024 decimal word to print Applsoft line# +IN EQU $0132 #1019 +WARMV EQU $0162 WARM REENTRY #1019 MOVED UP $30 +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 +AUXMOVE EQU $C311 +NEWSTT EQU $D7D2 #1022 APPLESOFT NEXT STATEMENT +MWAIT EQU $FCA8 #1023 ROM WAIT ALWAYS HANDLED IMMEDIATE +MVIDOUT EQU $FDF0 +OUTPORT EQU $FE95 USED TO SET PRINTER +IDROM EQU $E000 = $4C IF ROM PRESENT + SKP 3 +START SED TEST FOR 65C02 IN DECIMAL MODE + LDA #$99 + CLC + ADC #$01 ROLLING ACC FROM 99 TO 100 IN DECIMAL + CLD AFFECTS N FLAG DIFFERENTLY + BPL X65C02 BETWEEN A 6502 VS A 65C02 + LDX #$F3 6502 SETS N FLAG AND GETS HERE +REQU LDA NOT65C-$F3,X #1013 INCREASED X INDEX BY 5 + JSR MVIDOUT USE THIS TO AVOID DOS HOOKS + INX + BNE REQU + RTS +X65C02 JMP RESET COLD START +INSDS1 LDX PCL + LDY PCH + JSR CROUT + JSR PRYX2 + JSR OUTSP +INSDST LDA PCH + CMP #WARMV + BCS INSDSP + LDY #>WARMV-1 IT IS SO COPY REGION FROM PSEUDO-STACK +COPYSTK LDA STACK,Y + STA $100,Y + DEY + BPL COPYSTK +INSDSP JSR PEEK + 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 +CHAR1LOC LDA CHAR1,X #1020 + 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 +PRBLN1 DEX #1024 PRINT X-1 SPACES + 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 + BRA 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 #1021 PROGRAM PAGE 0 ALREADY PRESENT +* JSR ZSWAP GET PROGRAM PAGE 0 AND +* PLA SAVE POINTER ADDRESS ON STACK + TAX + LDA $01,X + PHA + LDA $00,X +* PHA #1021 PROGRAM PAGE 0 ALREADY PRESENT +* 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 ASFLAG #1022 SEE IF NEWSTT EXECUTED + BEQ NOASFT + LDX CURLIN #1022 PRINT APPLESOFT LINE# UPPER LEFT + LDA CURLIN+1 +* +* #1024 Print A,X in decimal ascii +* + STX DECWORD DECWORD same as BASH2L + STA DECWORD+1 since no scrolling will occur + LDA #$FF flag end of digits +DODIGIT PHA save low order digit + LDA #0 remainder=0 + TAY divdone=true + LDX #16 16 bit divide +DLOOP CMP #5 calc decword/10 + BCC MUL2 + SBC #5 remove high digit & shift 1 into decword + INY divdone=false +MUL2 ROL DECWORD shift /10 result into decword + ROL DECWORD+1 + ROL A shift bits of input into acc (mod 10) + DEX + BNE DLOOP continue 16 bit divide + DEY + BPL DODIGIT if result of /10 was not 0, do next digit + LDX #6 count for space fill at end +1 +PRDIG JSR PRHEXZ print highest digit + DEX + PLA pull next highest ascii digit + BPL PRDIG if not end of digits $FF, print more + JSR PRBLN1 print x-1 spaces +NOASFT LDA #29 + STA CH + LDA PROMPT + JSR COUT + LDA PCH + LDX PCL + JMP PRNTAX +TRACEPC LDA PCH #1022 CHECK IF PC=NEWSTT + CMP #NEWSTT + BNE TRCPCA + LDA #1 + STA ASFLAG CURRENTLY RUNNING APPLESOFT +TRCPCA 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 #MWAIT + BEQ TRCPCI HANDLE $FCA8 IMMEDIATE + TYA RESTORE PCH +NWAIT 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 + BEQ TRACEL + JMP TRACE7 +TRACEL DEX + BPL TRACE6 + JSR SETBREAK CLEAR OLD BREAKPOINT +TRACES STA KBDSTRB + STZ TFLG CLEAR TRACE FLAG + STZ DSPTOP RESET DISPLAY TO TOP + 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 +TRACE7 LDA PB1 BACK TO STEP MODE IF + BMI TRACES CLOSED APPLE PRESSED + 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 +* +* #1015 HANDLE $00FF AND $01FF INDEXED SPECIAL BECAUSE OF APPLESOFT ROM +* + PHA SAVE OPCODE. + JSR YPEEK GET OPERAND ADDRESS HIGH + CMP #$02 + BCS TSTEP3X TAKEN IF PC >= $200 + TAX SAVE OPERAND ADDRESS HIGH + PLA OPCODE + PHA CHK FOR INDEXED OPERAND ADDR PAGE 0 OR 1 + CMP #$99 STA NNNN,Y + BEQ INDX + CMP #$9D STA NNNN,X + BEQ INDX + CMP #$B9 LDA NNNN,Y + BEQ INDX + CMP #$BD LDA NNNN,X + BEQ INDX + TXA OPERAND ADDRESS HIGH + BEQ TSTEP3RS TAKEN FOR ABSOLUTE $00NN + JSR YPEEK1 #1016 NOW ABSOLUTE $01NN. GET OPERAND LOW + CMP #$FE CHECK $1FE-1FF AND HANDLE ABSOLUTE + BCS TSTEP3RS REAL STACK FOR APPLESOFT ROM LINE# +NIDXS PLA ADJ STACK. NOW < $01FE ABSOLUTE + LDA STACKLOC+2 SUBSTITUTE PSUEDO-STACK + BRA XQSTK +INDX JSR YPEEK1 NOW 00NN OR 01NN INDEXED. GET OPERAND LOW + CMP #$FB = 00FN OR 01FN INDEXED ? + BCS IDXFN + TXA + BNE NIDXS HANDLE $01NN INDEXED (NOT FN) PSEUDO STACK + BEQ TSTEP3RS FOR $00NN INDEXED (NOT FN) +IDXFN TXA OPERAND ADDR HIGH + BNE TSTEP3RS $01FN INDEXED WILL BE IN $200 KEYIN BUFFER + PLA ADJ STACK. HANDLE $00FN INDEXED + LDX STACKLOC+2 SUBSTITUTE PSEUDO-STACK -1 + DEX FOR 00FN INDEXED INTO STACK + TXA + BRA XQSTK +XQST1 JSR YPEEK +XQSTK STA XQTS+3,Y + DEY + BPL XQST1 +XQRST JSR RESTORE #1018 + 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 +TSTEP3RS JSR YPEEK RESTORE OPERAND ADDR HI BYTE +TSTEP3X CMP #$C0 $C002-C005, $C008-C009 + BNE TSTEP5N AUX R/W SWITCHES HANDLE SPECIAL + JSR YPEEK1 GET OPERAND ADDR LOW + CMP #$02 + BCC TSTEP5C + CMP #$04 + BCC TSTEPRD + CMP #$06 + BCC TSTEPWR + CMP #$08 +TSTEP5C 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 TAKEN FOR 1 BYTE INSTRUCTION + PHA SAVE OPCODE OF 2 BYTE INSTRUCTION + CMP #$B1 #1018 TEST IF (ZP),Y IS IN STACK PAGE + BEQ TSTEP4I IF LDA (ZP),Y + CMP #$91 STA (ZP),Y ? + BNE TSTEP5N +TSTEP4I JSR YPEEK GET ZP OPERAND FOR LDA/STA (ZP),Y + TAX NOW X = OFFSET IN PAGE 0 TO INDEXED ADDR + LDA $01,X GET ADDR HIGH WHERE OPERAND POINTS + CMP #$01 IS (ZP) POINTING TO STACK PAGE? +TSTEP5N BNE TSTEP5 + LDA STACKLOC+2 SUBSTITUTE PSEUDO-STACK + STA XQTS+5 CHANGE LDA/STA (ZP),Y TO LDA/STA $01NN,Y + LDA $00,X PCL + STA XQTS+4 + PLA OPCODE + ORA #$08 CHANGE TO ABS INDEXED,Y + STA XQTS+3 NEW OPCODE + JMP XQRST EXECUTE (ZP),Y AS $01NN,Y ABSOLUTE +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 XRTIGO HANDLE RTI INSTRUCTION #1019 + CMP #$00 + BNE PHCHECK + JMP XBRK +XRTIGO JMP XRTI +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 +XRTI LDX SPNT HANDLE RTI #1019 + INX + LDA STACK,X + STA STATUS + INX + LDA STACK,X + STA PCL + INX + LDA STACK,X + STA PCH + STX SPNT + JMP NEWPC +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 $122-159. 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 +* +YPEEK1 DEY GET YPEEK-1 #1017 + JSR YPEEK + INY + 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 +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 #8 + LDX SPNT +PRNTSTK JSR OUTSP PRINT STACK BYTES FROM + CPX SREF SPNT TO SREF UP TO 6 + BEQ SAVEPC MAX. + INX + LDA STACK,X + JSR PRBYTE + DEY + BNE PRNTSTK +SAVEPC LDA PCL + STA PCREG + LDA PCH + STA PCREG+1 + RTS +BNDSP LDX #$08 INDEX FOR 8 BITS +NEXTBIT ASL A + PHA + BCS BIT1 + LDA #$B0 '0' + DFB $2C SKIP NEXT INSTRUCTION +BIT1 LDA #$B1 '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 + 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 + BIT RDTEXT + BMI CLS1 + RTS DO NOT CLEAR TEXT PAGE IF IN GRAPHICS MODE +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 + BIT RDTEXT IF IN TEXT MODE, DO NORMAL CLREOL + BMI CLRDSPT BECAUSE WRITES TO TEXT SCREEN + LDX #34 + JSR PRBLNK + BRA CLRDSPG +CLRDSPT JSR CLREOL +CLRDSPG 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 + BPL KEY1 AVOID FLICKER IF HGR2 + STA LOWSCR +KEY1 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 +PRHOME JSR HOME + JSR PRTITLE +MONZ STZ ERRFLG + STZ ASFLAG #1022 + DEC BRKADDR+1 INSURE BRKPOINT CLEARED + JSR CHKVID MATCH HOOKS W/DISPLAY MODE + JSR STPRMPT + JSR GETLNZ +PARSE 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 80 +CHK80 BCC SET40 80 -> 40 +RTS7 RTS +SETVID LDY YSAV F(@) + LDA IN,Y + INC YSAV + CMP #$B8 '8' + BEQ SET80 + CMP #$B4 '4' + BEQ SET40 + DEC YSAV @ ALONE +TEXT STA LOWSCR #1007 SO TEXT RECOVERS FROM HGR2 + STA TXTSET + STA INHPAGE2 #1009 SO TEXT RECOVERS FROM @2 IN AUX + LDA OUTVECT + STA CSWL + LDA OUTVECT+1 + STA CSWH + 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 +PRTITL1 LDA TITLE,X + BEQ PRADDR + JSR COUT + INX + BRA PRTITL1 +PRADDR LDA STARTLOC+1 PRINT ORIGIN ADDRESS + JSR PRBYTE + LDA #0 + JSR PRBYTE + JMP CROUT +* +* #1020 AUXLOAD MOVED HERE AND MADE RELOCATEABLE +* +AUXV STZ MA1 F(CTRL-X) MOVE ANALYST TO AUX MEMORY + STZ MA4 PAGE ALIGNED LOW = 0 + LDA STARTLOC+1 PAGE# OF START + STA MA1+1 + STA MA4+1 + STZ MA2 PAGE ALIGNED LOW = 0 + LDA ENDLOC+1 + STA MA2+1 + LDA #$03 + STA INITBL+43 + LDA #$05 + STA INITBL+46 + JSR INITXQTS + LDA #$60 + STA AUXV DISABLE FUTURE MOVES TO AUXMEM + LDA #$D8 'X' + STA BANKORG + SEC + JSR AUXMOVE A1.A2 TO A4 + LDX #5 +AUXLD2 LDA INITBL4,X + STA XQT,X + DEX + BPL AUXLD2 + STZ START DESTROY OLD ANALYST ID + STA INHPAGE2 #1008 SO CTRL-X WORKS + JMP XQT + LST ON +INITBL4 JSR XQTS+36 + JMP TXTMON + SKP 1 +*** PROGRAM DATA AREA *** + SKP 1 +* +* CHAR1 MARKS START OF PROGRAM DATA AREA #1020 +* +CHAR1 DFB 172,169,172,163,168,164 +CHAR2 DFB 217,0,216,164,164,0 +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 +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 +RTBL ASC "AXY" +TITLE DFB $8D + ASC "ANALYST 128XE" + DFB $8D + ASC "BUILD = 1025" + DFB $8D + ASC "ORG = " +BANKORG ASC "$" + DFB $00 +NOT65C DFB $8D + ASC "65C02 REQ'D" + DFB $8D +DOSTR ASC "3F5<3D0G" + DFB $8D +FMT2 DFB 0,33,129,130,90,73,89,77 + DFB 145,146,134,74,133,157 +CHAR3 ASC "CZIDB-VN" +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 +CHRTBL DFB 198,152,249,177,241,3 + DFB 236,6,149,5 + DFB 0,147,2,167,153 + DFB 155,239 +* DFB 233 #1024 f(P) removed + DFB 1,191 + DFB 168,237,159,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 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 PRTITLE-1 F(V) PRINT TITLE +* DW SETPRNT-1 F(P) TO PRINTER #1024 REMOVED + 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 EXDOS-1 F(&) EXIT TO DOS + DW RELOC-1 F(R) RELOCATOR + DW HOME-1 F(CTRL-L) CLEAR SCREEN +OUTVECT DW VIDOUT +*HCOUTLOC DW HCOUT #1025 +*FONTLOC DW FONTADR #1025 +STARTLOC DW START +ENDLOC DW PGMEND MARKER FOR END OF CODE TO RELOC + SKP 1 +* DYNAMIC PROGRAM AREA * + SKP 1 +GBASE DFB $40 $20 = HGR $40 = HGR2 +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 +ASFLAG DS 1 #1022 NZ WHEN APPLESOFT NEWSTT ENCOUNTERED +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 + LST ON +PAGEFIL EQU >* + DS $FF-PAGEFIL +ROMFLG DFB 0 1 = TRACE JSR ROM $D000-FFFF +* LST OFF +STACK DS $100,0 MUST BE ON PAGE BOUNDARY +PGMEND EQU * #1020 PAGE ALIGNED END OF MOVE +* LST NOASYM diff --git a/Analyst.1025.instructions.txt b/Analyst.1025.instructions.txt new file mode 100644 index 0000000..f2bd358 --- /dev/null +++ b/Analyst.1025.instructions.txt @@ -0,0 +1,95 @@ + + *** Analyst Debugger Version 128XE *** + + 01/10/21 Build 1025 + last edit: 1/7/24 + +This debugger version requires an enhanced 128k Apple //e with a 65c02 processor. The memory footprint is about $1200 so about 4.6k. The best place to run it seems to be $8000-9200 but occasionally $6000-7200. $6000 stays above the graphics pages and $8000 hides below the $9600 buffers. The reason it works so well is that it is totally independent of the ROM's. All subroutines are internal and even it's use of the stack and zero page are almost totally virtual. This debugger traces code as an emulator. This trace code is heavily expanded from Woz's original concept of how to do step and trace from a pseudo (INITBL) region. (look up XQ1 and INITBL in the original Apple II monitor F8 rom) . My code that is hidden in the stack is a larger INITBL. Most virtual execution of opcodes is done in the middle of the stack at $132-169 and when the alt zero page is needed, it mirrors a copy to that same space in the altzp. All memory softswitches are executed from the main zp except the altzp ones. By maintaining a mirror copy of $132-169 in altzp, when the altzp switch is executed, it is immediately in the same spot in the alternate zp/stack. + + ** Command Summary ** + +ctrl-F Find hex sequence defined by f(H). (see Details below) + G Go execute in immediate mode + H load Hex bytes to find with ctrl-F (see Details below) + I show or set pc and Internal A,X,Y,P,S registers (see Details below) + J execute JSR subroutine in immediate mode during step (see Details below) +ctrl-L clear present screen and home cursor + L list 65c02 disassembly or Loop in trace mode (see Details for List and Loop below) + M Move block of memory + R Relocate debugger to new address page (see Details below) + S enter Step mode or Step an instruction (see Details below) + T Trace program (see Details below) + V display debugger Version and origin address ($nnnn is in main memory, Xnnnn is in aux memory) +ctrl-X move debugger to aux bank (disabled after use - see Details below) + X toggle main/auX ram banks (see Details below) or skip neXt instruction during step + " dump memory in ascii (see Details below) + / set/display subroutine to jsr in immediate mode (see Details below) + & exit to or from DOS / ProDOS (see Details below) + ? display last 16 pc's executed during trace + @ set output to 40/80 columns or text mode from graphics (see Details below) + < range delimiter + . range delimiter + : store value in memory + + ** Command Details ** + +To find a sequence of hex bytes in an address range, type H:n1 n2 n3... then xxxx. + +To display the Program Counter (PC) and internal registers, type I. To change the PC (nnnn) and registers, type nnnnI:AA XX YY PP SS RR . PC entry before I is optional. RR = stack top reference set by a TXS instruction. + +For Listing a disassembly, the output is continuous, use ctrl-s to pause, ctrl-c to stop. +To list only a range, yyyy 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 instruction, T to enter trace, @ for text mode, L for loop, ctrl-c +to exit. Loop command sets breakpoint after instruction to be executed next +and enters trace. This can be used on a branch instruction which loops +back to trace until loop is done. @ will execute next instruction. + +For trace, type nnnnT or T . Breakpoint is optional and +designated by bbbb 0 which will enable tracing thru JSR ROM subroutines +because certain ROM routines which involve setting i/o and dos hooks +do not RTS to Analyst. For example, if Analyst ORG = $8000 then 91FF:01 will trace ROM. JSR $C3nn will always JSR immediate mode if Analyst is +running 80 columns because it uses the same subroutines. Trace activity is +denoted by a flashing $ (or # for JSR immediate mode). Breakpoint enters +step mode and does execute the breakpoint instruction. Step and Trace +break for illegal opcodes and display 'ERR'. + +For jump, type 'Jn' where n represents the # of parameter bytes +following the JSR instruction. J defaults to 0. Jumps during step and +trace immediate handle JSR $BF00 as J3 for ProDOS MLI with 3 parameter bytes +following. If subroutine being jumped contains a TXS instruction, Analyst +may lose control !!! Also, trace immediate will not handle a subroutine +other than $BF00 with parameter bytes following !!! f(J) uses stack in Analyst +local memory. To execute Jn, a breakpoint could be set after n parameter bytes by the command: xxxx+3+n switches between main and aux $200-BFFF r/w. +'}' brace prompt denotes aux read mode only. To insure aux or main is both +read and write enabled, use 'X' to reset r/w together. + +Typing ctrl-X moves a copy of Analyst to aux memory. This is a one-time function which disables itself after use. Also disabled if f(R) relocate is done. + +To dump memory in ascii, type xxxx.yyyy" or xxxx". + +To switch text screens, type @8 for 80 col, @4 for 40 col or @ for text mode from graphics. + +To relocate, type nn00R . It will round off to nearest page boundary. +Do not set < $800 !!! Do not move less than +- $1400 from old origin !!! +If moved to ram card, do not change card r/w state !!! After this function is used, f(ctrl-X) aux move is disabled. + +To use DOS / ProDOS, type & then use & to re-enter. & will re-enter Analyst +even after a ctrl-reset. & is the same as executing 3F5<3D0G in Analyst + + ** Misc Operating Notes ** + +Keyboard input buffer is limited to 38 characters. + + + +