diff --git a/ANALYST64K.1018.txt b/ANALYST64K.1018.txt new file mode 100644 index 0000000..a7aabd8 --- /dev/null +++ b/ANALYST64K.1018.txt @@ -0,0 +1 @@ + SBTL MSB ON ORG $8000 SKP 1 ********************************* * * * -< THE ANALYST >- * * * * 64K VERSION * * * * BUILD #1018 12/06/20 * * * ********************************* SKP 1 *** DESCRIPTION *** SKP 1 ; THIS PROGRAM OPERATES INDEPENDENT OF ROM BUT HAS COM- ; MANDS SIMILAR TO THE BUILT IN MONITOR. THE GO AND BREAK ; 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 MIDDLE ; OF THE STACK ($132-1B0). IT ALSO UTILIZES A 4K BANK ; OF THE 16K LANGUAGE CARD TO KEEP A COPY OF ITSELF ; WHICH DOESN'T CONFLICT WITH BASIC OR DOS 3.3. ; NMI INTERRUPTS ARE ALSO SUPPORTED AS WELL AS USE OF A ; SERIAL TERMINAL FOR CONSOLE I/O TO BE INDEPENDENT OF ; SCREEN MEMORY OR GRAPHICS OF THE PROGRAM BEING TRACED. 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 ; 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 RE-ENTER PROGRAM AFTER NMI ; > COPY ANALYST TO LANGUAGE CARD ; V VERIFY TWO BLOCKS OF MEMORY ; " DUMP MEMORY IN ASCII ; & EXIT TO DOS AND RETURN FROM DOS ; ? PRINT ORIGIN ADDRESS & DO INTERNAL CHECKSUM ; @ SET TEXT 40 COL SCREEN OR SERIAL TERMINAL ; < 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 ; TO DISPLAY PC AND INTERNAL REGISTERS TYPE I . ; 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 SWITCH TERMINALS TYPE @4 OR @ FOR 40 COL TEXT, @S FOR SERIAL. ; @S SHOULD BE FOLLOWED BY > TO COPY NEW SETTINGS TO LANGUAGE CARD. 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 ; TO USE DOS TYPE 3F5<3D0G, THEN USE & TO RE-ENTER. ; WILL NOT WORK FROM INTEGER BASIC !! SKP 1 * #1008 ADDS LANGUAGE CARD SUPPORT AND REDUCED SIZE FOR NMI BOOT TRACE. * WHEN FIRST BRUN, ANALYST COPIES ITSELF TO UNUSED 4K BANK OF LC AND * NMI HANDLER TO MID-STACK. WHEN NMI OCCURS, MEMORY REGIONS ARE * EXCHANGED TO BRING ANALYST BACK WHILE SAVING THE PROGRAM BEING TRACED. * R WILL RESTORE THE SAVED REGION AND REGS THEN EXECUTE PCREG REAL-TIME SKP 1 *** ROM ZERO PAGE EQUATES *** SKP 1 WNDWDTH EQU $21 MCSWL EQU $36 MCSWH EQU $37 MKSWL EQU $38 MKSWH EQU $39 SKP 1 *** ANALYST EQUATES *** SKP 1 STKLMT EQU $D0 #1014 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 NMIEXEC EQU $0120 #1013 NMI EXECUTES IN STACK NMIVECT EQU $03FB #1004 HNDL NMI INTERRUPT SKP 1 *** ROM EQUATES *** SKP 1 KBD EQU $C000 KBDSTRB EQU $C010 SPKR EQU $C030 TXTSET EQU $C051 LOWSCR EQU $C054 PB0 EQU $C061 OPEN APPLE KEY SWITCH2 EQU $C082 PRINIT EQU $C100 PRINTER IN SLOT 1 MKEYIN EQU $FD1B MVIDOUT EQU $FDF0 * *** CCS7710 EQUATES #1005 *** * CCSSLOT EQU $20 SLOT# OF CCS7710 CARD ACIACTRL EQU $C080 ACIA CONTROL REGISTER ACIASTAT EQU $C080 ACIA STATUS REGISTER ACIADATA EQU $C081 ACIA DATA REGISTER * 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) CCSINIT LDY #CCSSLOT #1005 CCS7710 TERMINAL LDA #$03 RESET ACIA STA ACIACTRL,Y LDA #$15 8 BITS, STA ACIACTRL,Y NO PARITY, ONE STOP BIT RTS CCSKEY STY YSAV2 LDY #CCSSLOT CCSKY1 LDA ACIADATA,Y READ AND DISCARD DATA LDA ACIASTAT,Y ARE CTS AND DCD SIGNALS AND #$0C PRESENT? BNE CCSKY1 NO, WAIT HERE CCSKY2 LDA ACIASTAT,Y YES, IS RECEIVER READY? AND #$01 BEQ CCSKY2 NO, LOOP UNTIL READY LDA ACIADATA,Y YES, READ DATA ORA #$80 SET HIGH BIT FOR APPLE II LDY YSAV2 RTS CCSCOUT PHA SAVE CHAR STY YSAV2 LDY #CCSSLOT CCSOUT2 LDA ACIASTAT,Y TRANSMITTER READY? AND #$02 MASK OTHER BITS BEQ CCSOUT2 NO, PAUSE UNTIL IT IS PLA RESTORE CHAR STA ACIADATA,Y TRANSMIT DATA LDY YSAV2 RTS INSDS1 LDX PCL LDY PCH JSR PRYX2 JSR OUTSP LDX #0 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 RTS GETFMT TAX LDA FMT2,X STA FORMAT AND #$03 STA LENGTH 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 LDA LENGTH UPDATE PC BY LENGTH PCADJAP JSR PCADJA UPDATE PC BY ACC STA PCL STY PCH RTS PCADJA LDY PCH SET Y,A = PC+ACC TAX BPL PCADJ2 DEY PCADJ2 ADC PCL BCC RTS2 INY RTS2 RTS ACCLOC STA ACC 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 JSR RGDSP1 #1018 NO REGDSP 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 #$FF SPNT TO $FF UP TO 10 #1010 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 #$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 #1018 * BMI CLEOL3 PLA STA (BASL),Y INY BNE CLEOL4 ALWAYS TAKEN PLA #1018 WAS CLEOL3 JSR COUT LDY CH CLEOL4 CPY #$28 BCC CLEOL2 RTS *CLEARDSP LDX #6 #1018 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 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 LDA #$00 #1018 * STA JFLG RST2 JSR PRTITLE JMP MONZ PRERR LDX #4 PRINT 'ERR' ERROUT LDA ERRMSG,X JSR COUT DEX BPL ERROUT 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 STPRMPT JSR GETLNZ PARSE 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 GOPC LDX #5 #1010 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) JMP JRTS #1010 NO J PARMS JRTS JSR SAVE * LDA JFLG #1018 * BEQ JRTS3 DURING 'G0' W/O BREAK * LDA #0 * STA JFLG * DEC DSPTOP UPDATE REGDSP AFTER JSR. * JSR CLEARDSP 'SKIP' ENTERS HERE * JSR CROUT * JMP REGDSP JMP NEXTITM #1018 WAS JRTS3 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 JSR HOME40 STA LOWSCR STA TXTSET RTS INITSER JSR CCSINIT #1005 LDX #4 MOVESER LDA HOOKSER-1,X STA CSWL-1,X DEX BNE MOVESER * STX FLG8 #1018 RTS STPRMPT LDA #$A3 STA PROMPT RTS IN40 LDX #4 MOVE40 LDA HOOK40-1,X STA CSWL-1,X DEX BNE MOVE40 * STX FLG8 #1018 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 STA CHKSUM+1 RTS SKP 1 *** PROGRAM DATA AREA *** SKP 1 TITLE DFB $8D ASC "ANALYST 64K #1018 NMI LC" DFB $8D TITLE MARKS START OF PDA ASC "ORG = $" DFB $00 DOSTR ASC "3F5<3D0G" DFB $8D 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,151 DFB 6,149,5 DFB 0,147,2,167,198,153 DFB 155,154,239,233,1,191 DFB 159,235,197 SUBTBL DW PRTITLE-1 F(?) DO CHCKSUM OF MAIN DW SETVID-1 F(@) SWITCH 40/80 COL DW COPYLC-1 F(>) COPY TO LANGUAGE CARD #1008 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 EXDOS-1 F(&) EXIT TO DOS DW RSENTR-1 F(R) REAL TIME RE-ENTRY FROM NMI #1014 DW CRMON-1 HANDLE CTRL-L AS CR HOOK40 DW COUT40 DW KEYIN HOOKSER DW CCSCOUT #1005 DW CCSKEY NMIXLOC DW NMIEXEC #1016 NMILOC DW NMIHNDL #1007 NMIEND DW ENDHNDL #1008 BEGIN DW GETSUM #1008 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 * JFLG DS 1 SET TO ALLOW F(J) #1018 ERRFLG DS 1 SET FOR BAD OPCODE PCREG DS 2,0 DON'T CHANGE THE ACC DFB 0 ORDER OF PCREG TO SPNT XREG DFB 0 YREG DFB 0 STATUS DFB 0 SPNT DFB $F0 LMNEM DS 1 RMNEM DS 1 LENGTH DS 1 FORMAT DS 1 MODE DS 1 *FLG8 DS 1 FF = 80 COL, 0 = 40 COL #1018 PROMPT DS 1 CH DS 1 CV DS 1 DSPTOP DS 1 TOP OF DISPLAY FOR STEP YSAV DS 1 YSAV1 DS 1 YSAV2 DS 1 #1005 FMTSAV DS 1 TEMP STORAGE FOR INSTDSP #1010 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. XQT DS 15 BUFFER FOR F(CTRL-F,G) ENDPGM EQU * \ No newline at end of file diff --git a/ANALYST64K.1019.txt b/ANALYST64K.1019.txt new file mode 100644 index 0000000..f625e5e --- /dev/null +++ b/ANALYST64K.1019.txt @@ -0,0 +1 @@ + SBTL MSB ON ORG $4000 SKP 1 ********************************* * * * -< THE ANALYST >- * * * * 64K VERSION * * * * BUILD #1019 12/17/20 * * * ********************************* SKP 1 *** DESCRIPTION *** SKP 1 ; THIS PROGRAM OPERATES INDEPENDENT OF ROM BUT HAS COM- ; MANDS SIMILAR TO THE BUILT IN MONITOR. THE GO AND BREAK ; 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 MIDDLE ; OF THE STACK ($132-1B0). IT ALSO UTILIZES A 4K BANK ; OF THE 16K LANGUAGE CARD TO KEEP A COPY OF ITSELF ; WHICH DOESN'T CONFLICT WITH BASIC OR DOS 3.3. ; NMI INTERRUPTS ARE ALSO SUPPORTED AS WELL AS USE OF A ; SERIAL TERMINAL FOR CONSOLE I/O TO BE INDEPENDENT OF ; SCREEN MEMORY OR GRAPHICS OF THE PROGRAM BEING TRACED. 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 ; 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 RE-ENTER PROGRAM AFTER NMI ; > COPY ANALYST TO LANGUAGE CARD ; V VERIFY TWO BLOCKS OF MEMORY ; " DUMP MEMORY IN ASCII ; & EXIT TO DOS AND RETURN FROM DOS ; ? PRINT ORIGIN ADDRESS & DO INTERNAL CHECKSUM ; @ SET TEXT 40 COL SCREEN OR SERIAL TERMINAL ; < 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 ; TO DISPLAY PC AND INTERNAL REGISTERS TYPE I . ; 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 SWITCH TERMINALS TYPE @4 OR @ FOR 40 COL TEXT, @S FOR SERIAL. ; @S SHOULD BE FOLLOWED BY > TO COPY NEW SETTINGS TO LANGUAGE CARD. 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 ; TO USE DOS TYPE 3F5<3D0G, THEN USE & TO RE-ENTER. ; WILL NOT WORK FROM INTEGER BASIC !! SKP 1 * #1008 ADDS LANGUAGE CARD SUPPORT AND REDUCED SIZE FOR NMI BOOT TRACE. * WHEN FIRST BRUN, ANALYST COPIES ITSELF TO UNUSED 4K BANK OF LC AND * NMI HANDLER TO MID-STACK. WHEN NMI OCCURS, MEMORY REGIONS ARE * EXCHANGED TO BRING ANALYST BACK WHILE SAVING THE PROGRAM BEING TRACED. * R WILL RESTORE THE SAVED REGION AND REGS THEN EXECUTE PCREG REAL-TIME SKP 1 *** ROM ZERO PAGE EQUATES *** SKP 1 WNDWDTH EQU $21 MCSWL EQU $36 MCSWH EQU $37 MKSWL EQU $38 MKSWH EQU $39 SKP 1 *** ANALYST EQUATES *** SKP 1 STKLMT EQU $D0 #1014 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 NMIEXEC EQU $0120 #1013 NMI EXECUTES IN STACK NMIVECT EQU $03FB #1004 HNDL NMI INTERRUPT SKP 1 *** ROM EQUATES *** SKP 1 KBD EQU $C000 KBDSTRB EQU $C010 SPKR EQU $C030 TXTSET EQU $C051 LOWSCR EQU $C054 PB0 EQU $C061 OPEN APPLE KEY SWITCH2 EQU $C082 PRINIT EQU $C100 PRINTER IN SLOT 1 MKEYIN EQU $FD1B MVIDOUT EQU $FDF0 * *** CCS7710 EQUATES #1005 *** * CCSSLOT EQU $20 SLOT# OF CCS7710 CARD ACIACTRL EQU $C080 ACIA CONTROL REGISTER ACIASTAT EQU $C080 ACIA STATUS REGISTER ACIADATA EQU $C081 ACIA DATA REGISTER * 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) CCSINIT LDY #CCSSLOT #1005 CCS7710 TERMINAL LDA #$03 RESET ACIA STA ACIACTRL,Y LDA #$15 8 BITS, STA ACIACTRL,Y NO PARITY, ONE STOP BIT RTS CCSKEY STY YSAV2 LDY #CCSSLOT CCSKY1 LDA ACIADATA,Y READ AND DISCARD DATA LDA ACIASTAT,Y ARE CTS AND DCD SIGNALS AND #$0C PRESENT? BNE CCSKY1 NO, WAIT HERE CCSKY2 LDA ACIASTAT,Y YES, IS RECEIVER READY? AND #$01 BEQ CCSKY2 NO, LOOP UNTIL READY LDA ACIADATA,Y YES, READ DATA ORA #$80 SET HIGH BIT FOR APPLE II LDY YSAV2 RTS CCSCOUT PHA SAVE CHAR STY YSAV2 LDY #CCSSLOT CCSOUT2 LDA ACIASTAT,Y TRANSMITTER READY? AND #$02 MASK OTHER BITS BEQ CCSOUT2 NO, PAUSE UNTIL IT IS PLA RESTORE CHAR STA ACIADATA,Y TRANSMIT DATA LDY YSAV2 RTS INSDS1 LDX PCL LDY PCH JSR PRYX2 JSR OUTSP LDX #0 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 RTS GETFMT TAX LDA FMT2,X STA FORMAT AND #$03 STA LENGTH 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 LDA LENGTH UPDATE PC BY LENGTH PCADJAP JSR PCADJA UPDATE PC BY ACC STA PCL STY PCH RTS PCADJA LDY PCH SET Y,A = PC+ACC TAX BPL PCADJ2 DEY PCADJ2 ADC PCL BCC RTS2 INY RTS2 RTS ACCLOC STA ACC 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 JSR RGDSP1 #1018 NO REGDSP 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 #$FF SPNT TO $FF UP TO 10 #1010 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 #$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 #1018 * BMI CLEOL3 PLA STA (BASL),Y INY BNE CLEOL4 ALWAYS TAKEN PLA #1018 WAS CLEOL3 JSR COUT LDY CH CLEOL4 CPY #$28 BCC CLEOL2 RTS *CLEARDSP LDX #6 #1018 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 #1019 * BMI KYWT2 KYWAIT LDY KBD BPL KYWAIT STY KBDSTRB * DFB $2C #1019 *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 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 LDA #$00 #1018 * STA JFLG RST2 JSR PRTITLE JMP MONZ PRERR LDX #4 PRINT 'ERR' ERROUT LDA ERRMSG,X JSR COUT DEX BPL ERROUT 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 STPRMPT JSR GETLNZ PARSE 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 GOPC LDX #5 #1010 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) JMP JRTS #1010 NO J PARMS JRTS JSR SAVE * LDA JFLG #1018 * BEQ JRTS3 DURING 'G0' W/O BREAK * LDA #0 * STA JFLG * DEC DSPTOP UPDATE REGDSP AFTER JSR. * JSR CLEARDSP 'SKIP' ENTERS HERE * JSR CROUT * JMP REGDSP JMP NEXTITM #1018 WAS JRTS3 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 JSR HOME40 STA LOWSCR STA TXTSET RTS INITSER JSR CCSINIT #1005 LDX #4 MOVESER LDA HOOKSER-1,X STA CSWL-1,X DEX BNE MOVESER * STX FLG8 #1018 RTS STPRMPT LDA #$A3 STA PROMPT RTS IN40 LDX #4 MOVE40 LDA HOOK40-1,X STA CSWL-1,X DEX BNE MOVE40 * STX FLG8 #1018 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 STA CHKSUM+1 RTS SKP 1 *** PROGRAM DATA AREA *** SKP 1 TITLE DFB $8D ASC "ANALYST 64K #1019 NMI LC" DFB $8D TITLE MARKS START OF PDA ASC "ORG = $" DFB $00 DOSTR ASC "3F5<3D0G" DFB $8D 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,151 DFB 6,149,5 DFB 0,147,2,167,198,153 DFB 155,154,239,233,1,191 DFB 159,235,197 SUBTBL DW PRTITLE-1 F(?) DO CHCKSUM OF MAIN DW SETVID-1 F(@) SWITCH 40/80 COL DW COPYLC-1 F(>) COPY TO LANGUAGE CARD #1008 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 EXDOS-1 F(&) EXIT TO DOS DW RSENTR-1 F(R) REAL TIME RE-ENTRY FROM NMI #1014 DW CRMON-1 HANDLE CTRL-L AS CR HOOK40 DW COUT40 DW KEYIN HOOKSER DW CCSCOUT #1005 DW CCSKEY NMIXLOC DW NMIEXEC #1016 NMILOC DW NMIHNDL #1007 NMIEND DW ENDHNDL #1008 BEGIN DW GETSUM #1008 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 * JFLG DS 1 SET TO ALLOW F(J) #1018 ERRFLG DS 1 SET FOR BAD OPCODE PCREG DS 2,0 DON'T CHANGE THE ACC DFB 0 ORDER OF PCREG TO SPNT XREG DFB 0 YREG DFB 0 STATUS DFB 0 SPNT DFB $F0 LMNEM DS 1 RMNEM DS 1 LENGTH DS 1 FORMAT DS 1 MODE DS 1 *FLG8 DS 1 FF = 80 COL, 0 = 40 COL #1018 PROMPT DS 1 CH DS 1 CV DS 1 DSPTOP DS 1 TOP OF DISPLAY FOR STEP YSAV DS 1 YSAV1 DS 1 YSAV2 DS 1 #1005 FMTSAV DS 1 TEMP STORAGE FOR INSTDSP #1010 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. XQT DS 15 BUFFER FOR F(CTRL-F,G) ENDPGM EQU * \ No newline at end of file