Analyst/ANALYST 4.3.txt

1984 lines
35 KiB
Plaintext

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 <CR>.
SKP 1
; FOR STEP TYPE 300S <CR> 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<CR> 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 <CR>. PC ENTRY BEFORE I OPTIONAL.
SKP 1
; FOR HEX SEQUENCE FINDER TYPE H:NN H1 H2...
; 1000<2000 CTRL-F <CR> WHERE NN = # OF BYTES.
SKP 1
; TO DUMP MEMORY IN ASCII USE 1000.2000 CTRL-A <CR>.
SKP 1
; TO PRINT ADDRESS BYTE IN BINARY TYPE 2000% <CR>.
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 <CR>. 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 #<MLI
BNE TRCPCG
LDY #3 3 PARMS FOR PRODOS MLI
DFB $2C SKIP NEXT INSTRUCTION
TRCPCG LDY #0 0 PARMS FOR EXEC
JMP GOPC
TRACE JSR SKPCHR F(T)
DEC YSAV
CMP #$BA ':'
BNE TRACE2
LDA TLOC+1 'T:' SETS UP TLIMIT
STA A3L TO STORE VALUE
LDA TLOC+2
STA A3H
RTS
TRACE2 TXA
BNE TRACE3
TLOC LDA TLIMIT 'T' ALONE PRINTS VALUE
JSR PRBYTE
JMP CROUT RTS VIA CROUT
TRACE3 STX TFLG A4<A1T. A4 = BREAK TO STEP
JSR A1PCLP
TRACE4 INC PROMPT '#' -> '$' 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 A1<A2
RTS
XAMPM LSR A
BCC XAM
LSR A
LSR A
LDA A1L 16 BIT ADD. OR SUB.
BCC ADD
SBC A2L SUBTRACT A2 FROM A1
STA A1L RESULT IN A1
LDA A1H
SBC A2H
STA A1H
JMP PRANS
ADD ADC A2L ADD A1 AND A2
STA A1L RESULT IN A1
LDA A1H
ADC A2H
STA A1H
PRANS JSR OUTEQ
LDA A1H
JSR PRBYTE
LDA A1L
PRBYTE PHA
LSR A
LSR A
LSR A
LSR A
JSR PRHEXZ
PLA
AND #$0F
PRHEXZ ORA #$B0
CMP #$BA
BCC COUT
ADC #$06
COUT CMP #$8D
BNE COUTZ
STY YSAV1
JSR CTRLC
LDY YSAV1
COUTZ JMP (CSWL)
COUT40 STY YSAV1
PHA
CMP #$8C CHECK FOR HOME (CTRL-L)
BNE COUT40A
JSR HOME40
JMP COUT40B
COUT40A JSR VIDOUT
COUT40B PLA
LDY YSAV1
RTS
OUTEQ LDA #$BD
BNE COUT
BL1 DEC YSAV F(CR) CALLS HERE
BEQ RTS5 CR ONLY SO IGNORE
BLANK DEX
BNE SETMDZ
CMP #$BA
BNE XAMPM
STA MODE F(:)
LDA A2L
STA (A3L),Y
INC A3L
BNE RTS5
INC A3H
RTS5 RTS
SETREG JSR A1PC F(I)
LDA ACCLOC+1
STA A3L SETUP REGS FOR F(:)
LDA ACCLOC+2
STA A3H
RTS
SETMODE LDY YSAV
LDA IN-1,Y EQUALS :,+,- OR . MODE
SETMDZ STA MODE
RTS
LT LDX #$01 F(<)
LT2 LDA A2L,X COPY A2 TO A4
STA A4L,X
DEX
BPL LT2
RTS
MOVE LDA (A1L),Y F(M) A4<A1.A2M
STA (A4L),Y
JSR NXTA4 INCREMENTS A1 AND A4
BCC MOVE CARRY CLEAR IF A1<A2
RTS
VFY LDA (A1L),Y F(V) A4<A1.A2V
CMP (A4L),Y
BEQ VFYOK
JSR PRA1
LDA (A1L),Y
JSR PRBYTE
JSR OUTSP
LDA #$A8 '('
JSR COUT
LDA (A4L),Y
JSR PRBYTE
LDA #$A9 ')'
JSR COUT
JSR LWAIT
VFYOK JSR NXTA4
BCC VFY
RTS
LIST JSR A1PC F(L)
LIST2 JSR INSTDSP
JSR PCADJ
JSR LWAIT
BEQ LIST2 ALWAYS TAKEN
A1PC TXA X=0 IF NO # GIVEN
BEQ RTS6
A1PCLP LDA A1L,X X=1
STA PCL,X
DEX
BPL A1PCLP
LDA #0
STA JFLG
RTS6 RTS
SETPRNT JSR CROUT F(P)
LDA SWITCH2
LDY MCSWL SAVE CURRENT MONITOR
LDA MCSWH OUTPUT HOOK.
STY CSWL
STA CSWH
LDY #>PRINIT SIMULATE PR#1
LDA #<PRINIT
STY MCSWL
STA MCSWH
JSR PRINIT
LDY MCSWL RESTORE OLD MONITOR
LDA CSWL OUTPUT HOOK AND SET
STY CSWL COUT TO PRINTER BY
STA MCSWL EXCHANGING CSW'S.
LDY MCSWH
LDA CSWH
STY CSWH
STA MCSWH
RTS
BASIC LDA SWITCH2 F(CTRL-B)
JSR ZSWAP
LDA #$4C SETUP WARMSTART RE-ENTRY
STA AMPERV
LDA JRTSLOC+1
STA AMPERV+1
LDA JRTSLOC+2
STA AMPERV+2
JSR HOME
LDX #0 CORRECT PRODOS FLUKE
STX SPDBYT TO ALLOW BASIC PROGRAM
INX ENTRY IN IMMED MODE
STX STACK+$FC
STX STACK+$FD
JMP DOSV
GO JSR A1PC F(G)
JMP TRCPCG
CRMON JSR BL1 F(CR)
JMP MONZ
XQJ LDA STATUS RESTORE REGS
PHA
JSR ZSWAP GET PROGRAM 0 PAGE
LDA ACC
LDX XREG
LDY YREG
PLP
JMP XQT EXECUTE
SAVE PHP
STA ACC
PLA
STA STATUS
CLD
STX XREG
STY YREG
ZSWAP LDX #BAS2H-ZFLG
ZSWP1 LDA ZFLG,X
PHA
LDA ZBUF,X
STA ZFLG,X
PLA
STA ZBUF,X
DEX
BPL ZSWP1
RTS
ERRMON LDA ERRFLG IF ERROR, 'ERR' ON BRK
BEQ MON
PRERR LDX #0 PRINT 'ERR'
ERROUT LDA ERRMSG,X
BEQ MON
JSR COUT
INX
BNE ERROUT
MON CLD
JSR BELL
MONZ LDX #STKLMT SET STACK UPPER LIMIT
TXS
JSR STPRMPT
JSR GETLNZ
JSR ZMODE
STY ERRFLG CLEAR ERROR FLAG (Y=0)
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 #$00 CLEAR A2 TO 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 JSR UP
JSR UP
LDY YSAV GET # OF PARM BYTES
LDA IN,Y
CMP #$8D
BNE NCR
LDA #$B0 DEFAULT NO PARM (NORM)
DEC YSAV
NCR INC YSAV
EOR #$B0
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
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
JRTSLOC JMP JRTS
JRTS JSR SAVE
LDA JFLG
BEQ JRTS3 DURING 'G0'
LDA #0
STA JFLG
LDA TFLG
BEQ JRTS2 DURING 'STEP'
JMP TRACE5 DURING TRACE IMMEDIATE
JRTS2 LDA #1 UPDATE REG DISPLAY
STA CV AFTER SUBROUTINE
JSR VTAB
JMP RGDSPB
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 #$A3 IF "#" PRESSED, EXIT
BNE CKADR
JMP STPRMPT VIA NEXTITM
CKADR CMP #$A0
BEQ RDMNEM
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(CTRL-A)
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
LOAD LDA XQ2+1 F(H)
STA A3L SETUP A3 FOR HSF BUFFER
LDA XQ2+2
STA A3H
RTS
FIND LDA #$FF F(CTRL-F)
STA A1L HEX SEQUENCE FINDER
STA A4L
DEC A4H
LDX XQT
DEX
BNE FXEND
LDA A1H
CMP #$FF
BNE FXEND
DEC A1L
FXEND DEC A1L
DEX
BNE FXEND
INCBAS INC A4L
BNE TESTEND
INC A4H
LDA A4H
CMP #$C0
BNE TESTEND
LDA #$C1
STA A4H
TESTEND LDA A1H
CMP A4H
BCC DONE
BEQ TESTLO
BNE SETTMP
TESTLO LDA A1L
CMP A4L
BCC DONE
SETTMP LDA A4H
STA A5H
LDA A4L
CLC
ADC XQT
STA A5L
BCC SETX
INC A5H
SETX LDX XQT
INX
CHGTMP SEC
LDA A5L
SBC #$01
STA A5L
BCS CMPNUM
DEC A5H
CMPNUM LDY #$00
LDA (A5L),Y
DEX
CMP XQT,X
BNE INCBAS
LDA A5L
CMP A4L
BNE CHGTMP
LDX A4L
LDA A4H
JSR PRNTAX
JSR OUTSP
CLV
BVC INCBAS
DONE JMP CROUT
RELOC LDA A1H F(R)
STA A4H
STA PCH
STA A3H
CMP #$D0
BCC RELOC1
LDA SWITCH3 R/W ENABLE RAM CARD
LDA SWITCH3 FOR MOVE TO CARD.
RELOC1 LDA #0 PAGE BOUNDARY ONLY
STA A4L
STA PCL
STA A3L
LDA SUMLOC+2
STA A1H
STA A5L
LDA SUMLOC+1
STA A1L
LDA ENDLOC+1
STA A2H
LDA ENDLOC
STA A2L
LDA #$20 WILL NEED NEW CHECKSUM
STA GETSUM
LDA A1H CALC DIFFERENCE BETWEEN
SEC OLD & NEW ORG
SBC A4H
STA A5H
LDA #ERRMSG-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
JSR MOVE NEW ORG<GETSUM.ENDMAIN
INC A2H
LDA PRTITLE+1 END OF STATIC PGM AREA
STA A4L
LDA PRTITLE+2
SEC
SBC A5H
STA A4H
RELOC3 LDX #0
JSR INSDST
LDY LENGTH
CPY #2 3-BYTE INSTRUCTION ?
BCC NABS
LDX #0
LDA (PCL,X)
CMP #$2C
BEQ NABS IGNORE BIT ABSOLUTE
LDA (PCL),Y Y=2
LDX A2H IF OLD ENDMAIN WAS $FFNN
BEQ CHKLO THEN DON'T CHECK ABOVE !!
CMP A2H SEE IF WITHIN OLD
BCS NABS START-ENDMAIN
CHKLO CMP A5L
BCC NABS
SBC A5H CONVERT TO NEW ADDR
STA (PCL),Y
NABS JSR PCADJ
CMP A4L SEE IF PC < NEW END OF
TYA STATIC PGM AREA
SBC A4H
BCC RELOC3
JMP (A3L) RUN NEW ORG
SKPCHR LDY YSAV
LDA IN,Y
INC YSAV
RTS
SETVID JSR SKPCHR F(@)
CMP #$C8 'H'
BEQ HIRESZ
CMP #$CC 'L'
BEQ LORESZ
CMP #$B4 '4'
BEQ INIT40
CMP #$B8 '8'
BNE TEXT
JMP INIT80
TEXT DEC YSAV
TXT1 LDA LOWSCR F(@) ALONE
LDA TXTSET = PRIMARY TEXT PAGE
JMP RTS6B
GRERR JMP PRERR
HIRESZ JSR SKPCHR
CMP #$B1
BEQ HIRES1
CMP #$B2
BNE GRERR
LDA HISCR HIRES PAGE 2 F(@H2)
JMP HISET
HIRES1 LDA LOWSCR HIRES PAGE 1 F(@H1)
HISET LDA HIRES
JMP ALLGR
LORESZ JSR SKPCHR
CMP #$B1
BEQ LORES1
CMP #$B2
BNE GRERR
LDA HISCR LORES PAGE 2 F(@L2)
JMP LOWSET
LORES1 LDA LOWSCR LORES PAGE 1 F(@L1)
LOWSET LDA LORES
ALLGR LDA MIXCLR ALL GRAPHICS
LDA TXTCLR
RTS6B RTS
INIT40 LDA #<MKEYIN EXECUTE PR#0 TO KEEP
LDY #>MKEYIN PROPER DOS HOOKS.
STA MKSWH
STY MKSWL
LDA #<MVIDOUT
LDY #>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.