; ADDMACROby %LCLC ADC%1 ENDM ; AIBMACRO inc,by %LLDA %2 ADD %1 STA %2 ENDM ; AIWMACROinc,wd %LCLC LDA%2 ADC%1 STA%2 BCC?%K INC%2+1 ?%K=* ENDM ; INWMACROwd %LINC%1 BNE?%K INC%1+1 ?%K=* ENDM ; TEQMACROv1,v2,loc %LLDA%1 CMP%2 BEQ%3 ENDM ; BGEMACROloc %LBCS%1 ENDM ; BLTMACROloc %LBCC%1 ENDM ; MVBMACRO by1,by2 %LLDA %1 STA %2 ENDM ; MVWMACROwd1,wd2 %LLDA%1 STA%2 LDA%1+1 STA%2+1 ENDM ; SAWMACROadr,wd %LLDA#low %1 STA%2 LDA#high %1 STA%2+1 ENDM ; SDBMACROinc,by %LLDA %2 SUB %1 STA %2 ENDM ; SDWMACROdec,wd %LSEC LDA%2 SBC%1 STA%2 BCS?%K DEC%2+1 ?%K=* ENDM ; SUBMACROby %LSEC SBC%1 ENDM EJECT **Zero Page Definitions * * ; ; :DINDIR=2 :DNDR2=4 :DNDR3=6 ;******************************** ; ; OTHER DEFINITIONS ; :SDMCTL=$22F :DMACTL=$D401 :GRAFP0=$D00D :VCOUNT=$D40B :CHACT=$2F3 :CHBAS=$2F4 :CH=$2FC :VBREAK=$206 :SDLSTL=$230 :DLISTL=$D402 :CONSOL=$D01F :BRKKY=$11 :CRSINH=$2F0 :MEMLO=$2E7 :DOSVEC=$0A :KBCODE=$D209 :VKEYBD=$208 :NMIEN=$D40E :COLDST=$244 :VVBKI=$222 :VVBKD=$224 :GRACTL=$D01D :CLICK=$FCD8 EJECT SUBTTL 'DEBUGGING MODULE' ; ; JMP :DDTE ; ; :SSYMT=* ECHO15 DB' ' DW0 DB1 ENDM ; ; ******************************** * *DDT STORAGE AREA * :PCSAVDS2 :ASAVDS1 :PSAVDS1 :XSAVDS1 :YSAVDS1 :SPSAVDS2 :PZSAVDS6 :PFSAVDS4 :DMSAVDS1 :CHSAVDS2 :DSCNFLDS1 :OLDDLLDS2 :BTEMPDS2 :ITEMPDS1 :TBYTEDS1 :UNDFFDS1 :SSFLAGDS1 :CONTFLDS1 :CHCOLDS1 :EXAMWIDS2 :CONTADDS2 :BRKORDS1 :CRSTATDS1 :CCDS1 :FSIZEDS1 :HEXVALDS2 :MPROTDS1 :NMSYMDS1 :DNCKDS1 :TBYT2DS1 :STEMPDS2 :WINDFDS1 :PFLAGDS1 :VBISVDS2 :VBDSVDS2 :PRISVDS1 :DOSSVDS6 :QFLAGDS1 :BOTSKDS1 :TOPSKDS1 :PACKFDS1 :SSTRDS5 :SSSIZDS1 :DEPSWDS1 :DBCHRDB$DC :SHINSDB0 :BRKP0DB0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 :TADDDB0,0,0,0,0 :TFLAGDB0 :DOSLDDW:DOSCA,:RESET,:NKYBD ; ; EJECT *********************************** *DDTI(DDT INITIALIZATION POINT) * DDTILDX #1 :DDT0LDA :DOSVEC+2,X STA :DOSSV+2,X LDA :DOSLD+2,X STA :DOSVEC+2,X DEX BPL :DDT0 BMI :RSET1 ; :RESETJSR :JSRI1;INDIRECT SUB. CALL :RSET1SEI LDX #1 :RSET2LDA :DOSVEC,X STA :DOSSV,X LDA :DOSLD,X STA :DOSVEC,X DEX BPL :RSET2 LDA # LOW ECODE STA :MEMLO LDA # HIGH ECODE STA :MEMLO+1 LDX #1;SET KEYBOARD VECTORS :RSET3LDA :VKEYBD,X STA :DOSSV+4,X LDA :DOSLD+4,X STA :VKEYBD,X DEX BPL :RSET3 CLI RTS :JSRI1JMP (:DOSSV+2) ; ; :DOSCALDX #3;RESTORE DOS VECTORS :DOSC1LDA :DOSSV,X STA :DOSVEC,X DEX BPL :DOSC1 MVW :DOSSV+4,:VKEYBD JMP (:DOSVEC) :NKYBDLDA :KBCODE;GET KEYBOARD CHARACTER CMP :DBCHR BNE :NKYB3;IF NOT DBUG ENTRY CHAR. CONTINUE SAW :JRST,:BTEMP;SET UP BREAKPOINT LDA :SHINS;CK IF WE HAVE SHOWN INSTR BNE :NKYB2 INC :SHINS :NKYB2STA :WINDF;SET WINDOW FLAG FOR INSTR. TYA PHA TXA PHA;SAVE OTHER REGISTERS LDA #0 JSR :SETBP :JRSTPLA TAX PLA TAY PLA RTI ; :NKYB3JMP (:DOSSV+4) *********************************** *:DDTE (DDT ENTRY POINT) * :DDTESAW :DBEN1,:BTEMP LDA :SHINS BNE :DBEN2 INC :SHINS :DBEN2STA :WINDF JSR :SETBP :DBEN1RTS ; *********************************** * *SUBROUTINE :DDT * * :DDTPLA;RESTORE ACC STA :ASAV;SAVE REGISTERS IN STORAGE STX :XSAV STY :YSAV CLD;CLEAR DECIMAL FLAG PLA;SAVE OTHER STATE VARIABLES STA :PSAV PLA SEC SBC #2;CORRECT FOR BRK QUIRK STA :PCSAV PLA SBC #0 STA :PCSAV+1 TSX STX :SPSAV LDX #5;NOW SAVE PG ZERO LOCS :DBUG0LDA :DINDIR,X STA :PZSAV,X DEX BPL :DBUG0 CLI;CLEAR INTERRUPT DISABLE MVB #0,:DSCNFL;SET FLAG TO DBUG SCREEN OFF STA :SSFLAG;CLEAR SS AUTO FLAG STA :CONTFL;CLEAR CONTINUE FLAG STA :COLDST;CLEAR COLDST FLAG LDA :BRKP0;CLEAR BRKP0 IF SET BNE :DBUG2 LDA :BRKP0+1 BEQ :DBUG3 :DBUG2MVW :BRKP0,:BTEMP JSR :RESTOR :DBUG3MVW :PCSAV,:EXAMWI;SET UP WINDOW INDEX JSR :CLRSK;CLEAR PULL STACK JSR :SCTOG;TURN ON DBUG SCREEN ; ;FIRST WE CHECK IF IN AUTO MODE ; OR IF WE ARE DOING A CONTINUE ; THEN WE CHECK IF START,SELECT OR OPTION IS PRESSED ; :DBND5LDA :SSFLAG;CK IF IN AUTO MODE BEQ :DBN56 LDA :BRKKY;CK IF BREAK HAS BEEN HIT BNE :DBN55 INC :BRKKY;TURN OFF BREAK INDICATOR :DBN50STA :SSFLAG;OK, SO TURN OFF SS AUTO FLAG MVB :CRSTAT,:CRSINH;ALSO RESTORE CURSOR STATE LDA :DSCNFL;SET SCREEN TODBUG BNE :DBN57 JSR :SCTOG BNE :DBN57 :DBN55LDA :TFLAG;CK IF TRAP ON BEQ :DBN60 LDA :PCSAV CMP :TADD BNE :DBN59 LDA :PCSAV+1 CMP :TADD+1 BNE :DBN59 :DBN58LDA #0 BEQ :DBN50 :DBN59CMP :TADD+3 BNE :DBN60 LDA :PCSAV+1 CMP :TADD+4 BEQ :DBN58 :DBN60JMP :SSTEP;SO, GO DO NEXT INSTR. :DBN56LDA :CONTFL;CK IF IN CONTINUE MODE BEQ :DBN57 JMP :CONTRT;GOTO CONTINUE RETURN :DBN57LDA #1;CK IF START PRESSED BIT :CONSOL BNE :DCON2 JSR :DEBOUN INC :CONTFL;SET UP FOR NORMAL EXIT JMP :CONT ; ; :DCON2LDA :CONSOL;CK IF SELECT AND #2 BNE :DCON1 JSR :SCTOG;TOGGLE SCREEN LDA #2 JSR :DEBOUN BEQ :DBND5 ; :DCON1LDA #4 BIT :CONSOL;CK IF OPTION BNE :DCMDI JSR :DEBOUN JMP :SSTEP ; :DCMDIJSR :CLRCMD TEQ :CH,#255,:DCMD2;CK IF KEY PRESSED JSR :ONLIST;CK IF ON LIST OF APPROVED CHARACTERS BCC :DCMD3 :DCMD2JMP :DBND5 :DCMD3JSR :PUTCH JMP (:DNDR2) ; ; :DCONTLDA :DSCNFL;CK STATE OF DISPLAY BEQ :DCNT1 JSR :SCTOG;TOGGLE SCREEN IF NECESSAY :DCNT1LDX #5;RESTORE PG ZERO :DCNT2LDA :PZSAV,X STA :DINDIR,X DEX BPL :DCNT2 LDA #$C0 STA :NMIEN;RESTORE NMI S LDA #1 STA :WINDF;SET WINDOW FLAG TO DISASS LDX :SPSAV;RESTORE STACK POINTER TXS LDA :PCSAV+1;NOW RESTORE STATE PHA LDA :PCSAV PHA LDA :PSAV PHA LDX :XSAV LDY :YSAV LDA :ASAV RTI ; ; *********************************** * THIS SUBROUTINE TOGGLES THE * DDT SCREEN AND THE NORMAL ONE * :SCTOGJSR :VSYNC LDA :DSCNFL BEQ :DBSC1;CK WHAT STATE THE SCREEN IS IN DEC :DSCNFL LDX #3 :SCTG2LDA :PFSAV,X STA $2C5,X DEX BPL :SCTG2 MVW :CHSAV,:CHACT;RESTORE CHAR SET CNTL MVB :PRISV,$26F;RESTORE PRIORITY MVB :OLDDLL,:SDLSTL;THIS RESETS OLD SCREEN STA :DLISTL MVB :OLDDLL+1,:SDLSTL+1 STA :DLISTL+1 MVB :DMSAV,:SDMCTL;AND DMA CONTROL STA :DMACTL AND #$0C LSR A LSR A STA :GRACTL LDX #3 :SCTG4LDA :VBISV,X STA :VVBKI,X DEX BPL :SCTG4 LDA #$C0 STA :NMIEN;ALLOW DMIS RTS ; :DBSC1INC :DSCNFL LDX #3 :DBSC2LDA $2C5,X;SAVE COLOR REGISTERS STA :PFSAV,X DEX BPL :DBSC2 MVW :CHACT,:CHSAV MVB $26F,:PRISV;SAVE PRIORITY MVB #148,$2C8;AND SET UP DBUG COLOR REGISTERS LDA #$C STA $2C5 LDA #0 STA $26F;SET PRIORITY STA $2C6 STA :QFLAG;CLEAR QFLAG WHILE WE'RE AT IT SAW $E002,:CHACT MVW :SDLSTL,:OLDDLL;SAVE CURRENT LOCATION OF DL MVB :SDMCTL,:DMSAV JSR :SETSCN;CLEAR AND SET UP SCREEN JSR :SSCRN;AND UPDATE DYNAMIC PARTS JSR :VSYNC MVB # LOW :DDTLST,:SDLSTL STA :DLISTL MVB # HIGH :DDTLST,:SDLSTL+1 STA :DLISTL+1 LDX #4 LDA #0 STA :GRACTL :TOG1STA :GRAFP0,X DEX BPL :TOG1 MVB #34,:SDMCTL STA :DMACTL LDX #3 :TOG2LDA :VVBKI,X STA :VBISV,X DEX BPL :TOG2 SAW $E45F,:VVBKI SAW $E462,:VVBKD LDA #$40 STA :NMIEN RTS ; ; EJECT *********************************** * *SUBROUTINE :SETBP (SET BREAKPOINT) * * THIS ROUTINE IS CALLED TO SET UP A * BREAK POINT. THE BREAKPOINT NUMBER * SHOULD BE IN THE ACCUMULATOR . AND THE * BREAK POINT LOCATION THEN * SHOULD BE IN :BTEMP ; :SETBPSTA :TBYTE;SAVE VALUE TEM- ASL A;MULTIPLY *2 ADC :TBYTE;NOW IT'S MULTIPLIED BY 3 TAX;PUT IN X REG ; ; CHECK IF ALREADY SET ; LDA :BRKP0,X BNE :SETB1 LDA :BRKP0+1,X BEQ :SETB2 :SETB1LDA :BTEMP PHA;SAVE TEMP LDA :BTEMP+1 PHA LDA :BRKP0,X;IF NOT, FIRST RESTORE STA :BTEMP LDA :BRKP0+1,X STA :BTEMP+1 TXA PHA JSR :RESTOR PLA TAX PLA;NOW RESTORE :BTEMP STA :BTEMP+1 PLA STA :BTEMP :SETB2LDY #0;SET=0 FOR DINDIR MVB :BTEMP+1,:DINDIR+1 STA :BRKP0+1,X;SET UP POINTER TO BREAKPOINT MVB :BTEMP,:DINDIR STA :BRKP0,X LDA (:DINDIR),Y;GET CURRENT VALUE STA :BRKP0+2,X;AND SAVE LDA #0 STA (:DINDIR),Y;SET BREAKPOINT MVB #LOW :DDT,:VBREAK MVB #HIGH :DDT,:VBREAK+1 RTS ; ********************************** *SUBROUTINE :RESTOR (RESTORE BREAKPOINT) * :RESTORMVW :BTEMP,:DINDIR JSR :STBPP;SET POINTER BCC :REST6 LDA #$EA LDY #0 STA (:DINDIR),Y RTS ; :REST6LDA :BRKP0+2,X;GET PROPER INSTRUCTION LDY #0;SET UP Y FOR DINDIRECT STA (:DINDIR),Y;RESTORE TYA;MOVE 0 TO ACC STA :BRKP0,X STA :BRKP0+1,X;CLEAR OUT BREAKPOINT STA :BRKP0+2,X RTS ; ******************************** *SUBROUTINE :STBPP (SET BREAKPOINT POINTER) * :STBPPLDX #0;GET READY TO RESTORE INSTRUCTION :REST0LDA :BTEMP;LOAD A WITH LOW BYTE OF BRKP LOCATION CMP :BRKP0,X;THIS SHOULD EQUAL ONE OF THE BRKPs BEQ :REST1;IS THIS IT? :REST3INX; NO. INCREMENT X AND TRY AGAIN INX INX CPX #21;CK IF AT END OF TABLE BNE :REST0 SEC;SET NOT FOUND FLAG RTS ; ; FIRST BYTE WAS EQUAL ; :REST1LDA :BTEMP+1;GET HIGH BYTE OF PC CMP :BRKP0+1,X;IS THIS IT? BNE :REST3;NO, TRY AGAIN ; ; SECOND BYTE EQUAL CLC RTS EJECT SUBTTL 'SETUP DDT SCREEN' ********************************** * *SUBROUTINE :SETSCN * * THIS ROUTINE CLEARS AND SETS UP SCREEN * :SETSCNLDA # LOW [:DSCNTB+40];SET UP POINTER TO SCREEN AREA STA :DINDIR ;IGNORE FIRST LINE OF SCREEN LDA # HIGH [:DSCNTB+40] STA :DINDIR+1 LDX #15;NUMBER OF LINES TO CLEAR :CDSC0LDA #0 LDY #39;NUMBER OF BYTES TO CLEAR ON LINE :CDSC1STA (:DINDIR),Y DEY BPL :CDSC1 AIW #40,:DINDIR;ADD OFFSET TO NEXT LINE DEX;CK IF ANY MORE LINES LEFT BNE :CDSC0 AIW #40,:DINDIR;ADD OFFSET TO SKIP BREAKPOINT LINE LDY #119;NUMBER OF BYTES LEFT TO CLEAR LDA #0 :CDSC3STA (:DINDIR),Y DEY BPL :CDSC3 ; ; NOW SET UP VARIABLE SLOT BOARD ; JSR :SETSMP;SET UP POINTERS TO SYMBOLS MVB #0,:NMSYM;SET # OF SYMBOLS TO 0 :DSYM0LDY #5;NUMBER OF CHARCTERS-1 IN VAR. NAME :DSYM1LDA (:DNDR2),Y;GET CHARACTER CMP #$20;CK FOR SPACES BNE :DSYM2 TXA PHA;SAVE X DEY LDX #5 :DSYMNLDA (:DNDR2),Y;CK IF NEXT 5 ARE SPACES ALSO CMP #$20 BNE :SYMOK DEY DEX BNE :DSYMN PLA ;CLEAR STACK JMP :DSEP;AND DRAW SEPERATORS ; :SYMOKLDY #5;RESTORE Y PLA TAX;AND X :DSYM2LDA (:DNDR2),Y JSR :INTREP :DSYM3STA (:DINDIR),Y DEY BPL :DSYM2 INC :NMSYM;INCREMENT # OF SYMBOLS AIW #40,:DINDIR AIW #9,:DNDR2 DEX;ALL VARIABLES SHOWN ? BNE :DSYM0 ; ; NOW DRAW SEPERATOR LINES ; :DSEPLDA # LOW [:DSCNTB+63] STA :DINDIR LDA # HIGH [:DSCNTB+63] STA :DINDIR+1;THIS SETS UP POINTER TO SCREEN LDX #15;NUMBERS OF ROWS TO DRAW ON :DBLI1LDY #0;INITIAL INDEX LDA #124 STA (:DINDIR),Y LDY #4 STA (:DINDIR),Y LDY #11 STA (:DINDIR),Y AIW #40,:DINDIR;OFFSET TO NEXT ROW DEX;ANY ROWS LEFT ? BNE :DBLI1 LDA # LOW [:DSCNTB+684] STA :DINDIR;NOW SET POINTER TO BKP SEPERATORS LDA # HIGH [:DSCNTB+684] STA :DINDIR+1 LDX #3 :DBLI2LDY #30 LDA #124 :DBLI3STA (:DINDIR),Y DEY DEY DEY DEY DEY BPL :DBLI3 AIW #40,:DINDIR DEX BNE :DBLI2 ; ; LDA # LOW [:DSCNTB+160];OFFSET TO CURRENT POSITION POINTER STA :DINDIR LDA # HIGH [:DSCNTB+160] STA :DINDIR+1 LDA #30;VALUE FOR > LDY #0 STA (:DINDIR),Y;PUT ON SCREEN RTS EJECT ********************************** *SUBROUTINE :SSCRN(SHOW SCREEN) * :SSCRNJSR :SETSMP LDX :NMSYM BEQ :DSYM9 :DSYM7LDY #6;POINT Y TO VARIABLE VALUE LDA (:DNDR2),Y STA :DNDR3;SET UP INDIRECT POINTER TO CONTENTS INY LDA (:DNDR2),Y STA :DNDR3+1 INY LDA (:DNDR2),Y CMP #1 BEQ :DSYMB;ONLY A BYTE LDY #1 LDA (:DNDR3),Y LDY #8;SET Y TO POSITION VALUE ON SCREEN JSR :SHHEX LDY #0 LDA (:DNDR3),Y LDY #10 :DSYM8JSR :SHHEX DEX;CK IF ALL VARIABLES SHOWN BEQ :DSYM9 AIW #40,:DINDIR AIW #9,:DNDR2 JMP :DSYM7 ; ; :DSYMBLDY #0 LDA (:DNDR3),Y LDY #8 BNE :DSYM8 ; ; NOW SHOW THE BREAKPOINTS ; :DSYM9LDA # LOW [:DSCNTB+720];SET UP POINTER TO BRKP AREA ON SCREEN STA :DINDIR LDA # HIGH [:DSCNTB+720] STA :DINDIR+1 LDX #0 LDY #0 LDA #8 STA :TBYT2 :DSM91JSR :SHBRK;SHOW BRKPS DEC :TBYT2 BNE :DSM91 JSR :SHSTK;SHOW STACK JSR :SHSTAT;AND REGISTER STATE ;AND FALL INTO :DWIND ; ********************************* *SUBROUTINE :DWIND (DISPLAY WINDOW) * :DWINDLDA :WINDF ASL A TAX LDA :WINTI,X STA :DNDR2 INX LDA :WINTI,X STA :DNDR2+1 SAW :DSCNTB,:DINDIR LDY #22 :DWIN0LDA (:DNDR2),Y STA (:DINDIR),Y DEY BPL :DWIN0 AIW #41,:DINDIR LDA :EXAMWI SEC SBC #3 STA :DNDR2;BACK WINDOW UP 3 LDA :EXAMWI+1 SBC #0 STA :DNDR2+1 LDA :WINDF;CK WHICH FILTER IS IN BNE :DWIN1 JMP :DIINS;DISPLAY INSTRUCTIONS :DWIN1CMP #1 BEQ :DWIN2 JMP :DHEXW :DWIN2MVB #15,:TBYTE;BYTES TO SHOW MVB #3,:MPROT;BYTES TO PROTECT INITIALLY :DIS1JSR :CLIN;CLEAR LINE LDA :DNDR2+1;HIGH BYTE OF ADDRESS LOCATION JSR :SHHEX LDA :DNDR2 JSR :SHHEX LDY #0 LDA (:DNDR2),Y;NOW GET VALUE AT THAT LOCATION STA :ITEMP;SAVE LDY #5 JSR :SHHEX ; ; ; NOW DO THE DISASSEMBLY ; ; LDA :MPROT;CHECK IF BYTE IS PROTECTED BNE :NXINS LDA #0 STA :UNDFF;CLEAR UNDEFINED FLAG STA :BRKOR;AND BRK DISPLAY FLAG LDA :ITEMP BNE :DIS2;MAKE SURE IT'S NOT A BRK JSR :BRINS STA :ITEMP LDA #$80 STA :BRKOR LDA :ITEMP :DIS2JSR :DETLEN;GET LENGTH OF INS. STA :MPROT LDY #8 LDA :ITEMP;GET INSTRUCTION AND #03 CMP #3 BEQ :UNDEF LDA :ITEMP AND #$0F;MASK OFF LOWER 4 CMP #2 BEQ :UNDF1 LDA :ITEMP AND #7 BEQ :OBYTE JSR :FNDPAT BCC :UNDF2 BCS :UNDEF ; :OBYTELDA :ITEMP CMP #$80 BEQ :UNDEF LSR A;GET NON ZERO DIGITS TO RIGHT LSR A LSR A JMP :UNDF2 ; :UNDF1LDA :ITEMP;TEST FOR LDX CMP #$A2 BNE :UNDEF LDA #45;OFFSET FOR LDX BNE :UNDF2 ; :UNDEFMVB #1,:MPROT LDA #16;UND IS THE 16 TH MENM. STA :UNDFF;SET UNDEFINED FLAG :UNDF2JSR :SMNEM;SHOW IT JSR :SHWAD;AND THE ADDRESS MODE :NXINSAIW #40,:DINDIR;OFFSETS TO NEXT LINE ON SCREEN INW :DNDR2;AND MEMORY ADDRESS DEC :MPROT DEC :TBYTE BEQ :SSCR9 JMP :DIS1 :SSCR9RTS ; ; :CLINLDA #0;CLEAR DISPLAY WINDOW LINE TAY :CLIN1STA (:DINDIR),Y INY CPY #22 BNE :CLIN1 TAY RTS ; :DHEXWMVB #3,:TBYTE STA :MPROT JSR :DIS1;DISPLAY 1ST THREE BYTES LDA :DNDR2 AND #3 EOR #$FF ADD #5 JSR :DHLIN;SHOW CURRENT LINE LDA :QFLAG;SEE IF ALREADY SHOWN BEQ :DHXW0 RTS :DHXW0LDA #11 STA :TBYT2 :DHXW1AIW #40,:DINDIR ;NEXT LINE ON SCREEN LDA #4;SHOW 4 BYTES FROM HERE ON JSR :DHLIN DEC :TBYT2 BNE :DHXW1 RTS ; :DHLINSTA :TBYTE;BYTE TO SHOW STA :MPROT JSR :CLIN LDA :DNDR2+1 JSR :SHHEX LDA :DNDR2 JSR :SHHEX LDY #5 :DHLN1TYA TAX LDY #0 LDA (:DNDR2),Y;THIS GETS NEXT VALUE TO SHOW PHA TXA TAY PLA JSR :SHHEX INY INW :DNDR2 DEC :TBYTE BNE :DHLN1;IF ANY MORE SHOW MVB :MPROT,:TBYTE LDY #18;NOW DO ATASCII DECODING SDW :MPROT,:DNDR2 :DHLN2TYA TAX LDY #0 LDA (:DNDR2),Y PHA TXA TAY PLA JSR :INTREP STA (:DINDIR),Y INY INW :DNDR2 DEC :TBYTE BNE :DHLN2 RTS ; :DIINSMVB #15,:TBYTE;SHOW THE INSTRUCTIONS MVB # LOW :INSTW,:DNDR2 MVB # HIGH :INSTW,:DNDR2+1 :DIIN1LDY #21 :DIIN2LDA (:DNDR2),Y JSR :INTREP STA (:DINDIR),Y DEY BPL :DIIN2 AIW #40,:DINDIR AIW #22,:DNDR2 DEC :TBYTE BNE :DIIN1 RTS ; :INSTWDB 'OPTION-SINGLE STEPS ' DB 'SELECT-TOGGLES SCREEN ' DB 'START -RETURNS TO CODE' DB ' COMMANDS ARE : ' DB 'E EXAMINE ADDRESS' DB 'C CONTINUE,LEAVE BRKP' DB 'G GOTO ADDRESS ' DB 'B<#>, SET BREAKP.' DB 'R<#>, CHANGE REG.' DB 'D DEPOSIT HEX STR' DB 28,29 DB ' PULL WINDOW UP/DOWN' DB 'I INTERPRETIVE MODE ' DB 'W TOGGLE DISP. WINDOW' DB 'T<#>, SET TRAP ' DB 'S SEARCH HEX STR' ; ; :WINTIDW:TIINS,:TIDIS,:TIHEX :TIINSDB$A4,$B5,$AE,$A9,$AF,$AE,$87,$F3,$80 DB$A4,$A5,$A2,$B5,$A7,$A7,$A9,$AE,$A7,$80 DB$B4,$AF,$AF,$AC :TIDISDB$80,$AC,$AF,$A3,$80,$80,$B6,$A1,$AC,$80 DB$A9,$AE,$B3,$B4,$B2,$B5,$A3,$B4,$A9,$AF DB$AE,$80,$80 :TIHEXDB$80,$AC,$AF,$A3,$80,$80,$80,$80,$B6,$A1 DB$AC,$B5,$A5,$B3,$80,$80,$80,$80,$A3,$A8 DB$A1,$B2,$B3 ********************************* *SUBROUTINE :SHSTK (SHOW STACK) * * :SHSTKLDA # LOW [:DSCNTB+64];SET UP SCREEN POINTER STA :DINDIR  ;OFFSET TO STACK WINDOW PHA;SAVE THIS POINTER LDA # HIGH [:DSCNTB+64] STA :DINDIR+1 PHA LDX #14;FIRST CLEAR STACK AREA :SSTKCLDA #0 TAY STA (:DINDIR),Y INY STA (:DINDIR),Y AIW #40,:DINDIR DEX BPL :SSTKC PLA STA :DINDIR+1 PLA STA :DINDIR LDA :SPSAV;NOW COMPUTE DEPTH OF STACK ADD #15 BCC :SSTK2 LDA #$FF :SSTK2TAX;MOVE VALUE TO X SAW $100,:DNDR2;SET UP 'STACK POINTER ' :SSTK1CPX :SPSAV;CK IF PSTACK EMPTY BEQ :SSTK3 TXA;MOVE X TO Y TAY LDA (:DNDR2),Y;GET VALUE OFF PSEUDO STACK LDY #0 JSR :SHHEX AIW #40,:DINDIR DEX BNE :SSTK1 :SSTK3RTS ; ; ******************************** *SUBROUTINE :SETSMP (SET POINTER TO SYMBOL TABLE :SETSMP LDA # LOW [:DSCNTB+68];SET UP POINTER TO VARIABLE AREA STA :DINDIR LDA # HIGH [:DSCNTB+68] STA :DINDIR+1 MVB # LOW :SSYMT,:DNDR2;SET POINTER TO SYMBOL TABLE MVB # HIGH :SSYMT,:DNDR2+1 LDX #15;NUMBER OF VARIABLES WATCHED RTS ; EJECT SUBTTL'SINGLE STEP' *********************************** * THIS CODE HANDLES THE SINGLE STEP * :SSTEPMVW :PCSAV,:DNDR2;SET UP POINTER LDY #0 LDA (:DNDR2),Y;GET INSTRUCTION BNE :SST3;MAKE SURE IT'S NOT A BRK JSR :BRINS;OTHERWISE, GET IT :SST3STA :ITEMP JSR :TFORB;SEE IF FORBIDDEN BCC :SST0 JMP :SSSIM;SIMULATE INSTRUCTION :SST0JSR :PTBED;PREPARE TEST BED LDA :ITEMP JSR :DETLEN;GET LENGTH TAX DEX TAY DEY CLC ADC :PCSAV;FUDGE PROG. COUNTER FOR AFTER INSTR. STA :PCSAV BCC :SST1 INC :PCSAV+1 :SST1LDA (:DNDR2),Y;TRANSFER INSTRUCTION TO TEST BED STA :TBED,X DEX DEY BPL :SST1 LDA :ITEMP;JUST IN CASE IT WAS A BRK STA :TBED :SST2LDX :XSAV;RESTORE REGISTER STATE LDY :YSAV LDA :PSAV PHA LDA :ASAV PLP JMP :TBED;EXECUTE INSTRUCTION ; ; :SSRETSTA :ASAV;SAVE REGISTER STATE AGAIN STX :XSAV STY :YSAV PHP PLA STA :PSAV TSX STX :SPSAV CLD;MAKE SURE WE'RE IN BINARY MODE CLI :SSRT2LDA :DSCNFL;CK IF WE NEED TO UPDATE BEQ :SSRT3 JSR :VSYNC JSR :SHSTAT;UPDATE REGISTER STATE JSR :VSYNC;WAIT FOR SYNC MVW :PCSAV,:EXAMWI;SET NEW MEMORY WINDOW INDEX MVB #1,:WINDF JSR :SSCRN LDA :SSFLAG BNE :SSRT3 LDA #4 JSR :DEBOUN JSR :VSYNC :SSRT3JMP :DBND5;GO BACK AND CHECK CONSOLE ; :TBEDDS3 JMP :SSRET JMP :SSBC2;THIS JMP IF FOR CONDITIONAL BRANCHES ; ; :PTBEDLDX #2 LDA #$EA;NOP OP CODE :PTB1STA :TBED,X DEX BPL :PTB1 RTS ; ; :TFORBLDX #0 LDA :ITEMP :TFOR2CMP :FORB,X BEQ :FFND;CK IF OP CODE IN ON FORBIDDEN LIST INX CPX #14 BNE :TFOR2 CLC RTS :FFNDSEC RTS ; :FORBDB$90,$B0,$F0,$D0,$30,$10,$50,$70,$00 DB$4C,$6C,$20,$40,$60 ; ; :SSSIMTXA ASL A;MULTIPLY BY 2 TAX LDA :SSROU,X;GET ADDRESS OF ROUTINE STA :SSRAM+1 LDA :SSROU+1,X STA :SSRAM+2 :SSRAMJMP :SSRAM;GOTO ROUTINE ; ; :SSROUDW:SSBC,:SSBC,:SSBC,:SSBC,:SSBC,:SSBC,:SSBC,:SSBC DW:SSBRK,:SSJMP,:SSJMI,:SSJSR,:SSRTI,:SSRTS ; :SSJMPJSR :PCAD;SET PC TO NEXT ADD JMP :SSRT2 ; :SSJMILDY #1 LDA (:DNDR2),Y STA :DINDIR INY LDA (:DNDR2),Y;SET DINDIR TO NEXT AD STA :DINDIR+1 LDY #0 LDA (:DINDIR),Y STA :PCSAV;NOW GET THE TARGET ADDRESS INY LDA (:DINDIR),Y STA :PCSAV+1 JMP :SSRT2 ; :SSRTSPLA ADD #1;CORRECT FOR JSR WIERDNESS STA :PCSAV PLA ADC #0 STA :PCSAV+1 INC :SPSAV;UPDATE STACK POINTER INC :SPSAV JMP :SSRT2 ; :SSJSRJSR :PCAD AIW #2,:DNDR2 LDA :DNDR2+1 PHA LDA :DNDR2 PHA DEC :SPSAV DEC :SPSAV;UPDATE STACK POINTER SHADOW JMP :SSRT2 ; :SSBCAIW #2,:PCSAV JSR :PTBED LDA :ITEMP STA :TBED;PUT COND. BRACH INS. IN TEST BED LDA #4;OFFSET TO 2 ND JMP INS. STA :TBED+1 JMP :SST2 ; :SSBC2CLD CLI LDY #1 LDA (:DNDR2),Y BPL :SSBC3;THIS SETS FOR FOR POS & NEG OFFSET DEY :SSBC3DEY CLC ADC :PCSAV STA :PCSAV TYA ADC :PCSAV+1 STA :PCSAV+1 JMP :SSRT2 ; :SSBRKMVW :DNDR2,:BTEMP;FIRST RESTORE BRK PNT JSR :RESTOR JMP :SSTEP;AND RETRY SINGLE STEP ; :SSRTIPLA STA :PSAV PLA STA :PCSAV PLA STA :PCSAV+1 AIB #3,:SPSAV JMP :SSRT2 ; :PCADLDY #1 LDA (:DNDR2),Y STA :PCSAV INY LDA (:DNDR2),Y STA :PCSAV+1 RTS ; EJECT SUBTTL 'SUPPORT ROUTINES FOR DDT' ******************************** *SUBROUTINE :VSYNC * * THIS ROUTINE SYNCHRONIZES TO VERTICAL BLANK * :VSYNCLDA #$7B :VSYN1CMP :VCOUNT BNE :VSYN1 RTS ; ; ******************************** *SUBROUTINE :DEBOUN * * THIS ROUTINE DEBOUNCES THE CONSOLE * , IT EXPECTS THE MASK VALUE TO BE * IN THE ACC * :DEBOUNBIT :CONSOL BEQ :DEBOUN :DB2ADC #1 BNE :DB2 :DB3ADC #1 BNE :DB3 RTS ; ********************************* *SUBROUTINE :DETLEN (DETERMINE LENGTH) * * THIS ROUTINE DETERMINES THE LENGTH * OF THE OPCODE PASSED IN THE ACC * :DETLENLDY #1;ASSUME LENGTH = 1 CMP #0;CK BRK BEQ :DETRM CMP #$40;RTI BEQ :DETRM CMP #$60;RTS BEQ :DETRM LDY #3;NOW ASSUME =3 CMP #$20;JSR BEQ :DETRM AND #$1F;STRIP OFF UPPER 3 BITS CMP #$19;TEST FOR ABS,Y BEQ :DETRM AND #$0F;STRIP TO 4 BITS TAX LDY :LENTAB,X :DETRMTYA RTS ; :LENTABDB2,2,2,1,2,2,2,1,1 DB2,1,1,3,3,3,3 ; ********************************* * *SUBROUTINE :BRINS(BREAKPOINT LENGTH) * * THIS ROUTINE RETRIEVES THE PROPER * BREAKPOINT INSTRUCTION * :BRINSMVW :DNDR2,:BTEMP JSR :STBPP BCC :BRI2 LDA #0 RTS :BRI2LDA :BRKP0+2,X RTS ; ********************************* *SUBROUTINE :INTREP (INTERNAL REPRENSATION) * :INTREPPHA AND #$80 STA :INRAM+1 PLA AND #$7F CMP #32 BMI :INTR1 CMP #96 BPL :INRAM SUB #32 BPL :INRAM :INTR1ORA #64 :INRAMORA #0 RTS EJECT SUBTTL 'SHOW SUPPORT ROUTINES' ********************************* *SUBROUTINE :SHBRK (SHOW BREAKPOINTS) * :SHBRKLDA :BRKP0+4,X;GET FIRST BYTE OF ADDRESS JSR :SHHEX LDA :BRKP0+3,X JSR :SHHEX INX INX INX INY RTS ; ; ********************************* * *SUBROUTINE :SHSTAT (SHOW STATE) * * THIS ROUTINE IS USED TO SHOW THE * VALUES OF REGISTER STATE * :SHSTATLDA # LOW :DSCRN;SET UP POINTER TO DBUG SCREEN STA :DINDIR LDA # HIGH :DSCRN STA :DINDIR+1 LDY #80;OFFSET TO WHERE VALUES ARE SHOWN LDA :PCSAV+1;NOW SHOW VALUES JSR :SHHEX LDA :PCSAV JSR :SHHEX INY LDA :ASAV JSR :SHHEX INY INY LDA :PSAV JSR :SHBIN INY LDA :XSAV JSR :SHHEX INY LDA :YSAV JSR :SHHEX INY LDA :SPSAV JSR :SHHEX RTS ; ********************************** * *SUBROUTINE :SHHEX (SHOW HEX) * * THIS ROUTINE IS USED TO SHOW A VALUE * IN THE ACC IN HEX NOTATION * * ROUTINE ASSUMES DINDIR & Y ARE * SET TO POINT TO LOCATION FOR SHOW * :SHHEXPHA;SAVE TEMP LSR A LSR A LSR A;GET LEFT NIBBLE TO RIGHT LSR A JSR :HXDIG PLA AND #$0F;NOW MASK OFF RIGHT NIBBLE JMP :HXDIG ; ; :HXDIGADD #16;ADD OFFSET FOR NUMBERS CMP #26;CK IF > 10 BLT :HX0 ADD #7;ADD HEX OFFSET :HX0STA (:DINDIR),Y INY RTS ; ********************************** * *SUBROUTINE :SHBIN (SHOW BINARY)* :SHBINLDX #8;SET UP COUNTER FOR DIGITS :SHB2ASL A;SHIFT LEFT TO GET BIT IN CARRY JSR :BIDIG DEX BNE :SHB2 RTS ; :BIDIGPHA;SAVE TEMP BCS :BID1 LDA #16;LOAD VALUE FOR 0 :BID2STA (:DINDIR),Y INY PLA RTS ; :BID1LDA #17;LOAD WITH VALUE FOR 1 BNE :BID2 ; ; ********************************* *SUBROUTINE :SMNEM(SHOW MENMONIC) * :SMNEMPHA;SAVE TEMP ASL A;MULTIPLY BY 2 STA :BTEMP PLA ADD :BTEMP TAX LDA :MNETAB,X JSR :SHLET LDA :MNETAB+1,X JSR :SHLET LDA :MNETAB+2,X JMP :SHLET ; ; ***************************** *SUBROUTINE :SHLET :SHLET JSR :INTREP ORA :BRKOR STA (:DINDIR),Y INY RTS ********************************* *SUBROUTINE :FNDPAT (FIND PATTERN) * * THIS ROUTINE FINDS IF THE OPCODE * MATCHES ONE IN THE TABLE PATTERNS * :FNDPATLDX #0 :PATL1LDA :ITEMP;GET OPCODE AND :PATTAB,X;MASK OFF DON'T CARES INX CMP :PATTAB,X;SEE IF IT MATCHES BEQ :PATFD INX CPX # 68;CK IF AT END OF TABLE BNE :PATL1 SEC;NOPE, INDICATE FAILURE RTS :PATFDTXA;YEP, THIS IS IT LSR A;DIVIDE BY 2 ADD #32;ADD OFFSET TO START OF PATTERN MNEM. RTS ; :PATTABDB$E3,$61,$E3,$21,$E7,$06,$F7,$24,$E3,$C1 DB$F7,$E4,$F7,$C4,$E7,$C6,$FF,$CA,$E3,$41 DB$E7,$E6,$DF,$4C,$E3,$A1,$E7,$A6,$E7,$A4 DB$E7,$46,$FF,$EA,$E3,$01,$E7,$26,$E7,$66 DB$E3,$E1,$E3,$81,$EF,$86,$EF,$84,$FF,$AA DB$FF,$BA,$FF,$8A,$FF,$9A,$FF,$0A,$FF,$4A DB$FF,$2A,$FF,$6A,$FF,$8E,$FF,$8C ; ; ********************************* *SUBROUTINE :SHWAD (SHOW ADDRESS MODE) * :SHWADLDA :UNDFF;CHECK IF INSTRUCTION UNDEFINED BEQ :SHAD1 RTS :SHAD1LDX #0 STX :DNCK;CLEAR DON'T CKECK FLAG FOR MNAD ROUT :SHAD2LDA :ITEMP;GET OP CODE AND :ADPAT,X;MASK OFF DONT CARES INX CMP :ADPAT,X;NOW SEE IF IT MATCHES THE MANDATORY PART BEQ :ADFND;YES INX INX BNE :SHAD2;NO, TRY NEXT ; :ADFNDINX LDA :ADPAT,X;GET ADDRESS MODE ASL A;MULTIPLY BY 2 TAX LDA :ADROU,X;GET FIRST BYTE OF MODE ROUTINE STA :ADRAM+1;PUT IN INDIRECT BYTE LDA :ADROU+1,X;GET HIGH BYTE STA :ADRAM+2 INY :ADRAMJMP :ADRAM ; ; :ADROUDW:INDX,:INDY,:IMM,:ZX,:ZY,:IND,:ACC,:REL,:ABSX,:ABSY,:ABS,:Z,:IMP ; ; :ADPATDB$1F,$01,$00,$1F,$11,$01,$1F,$09,$02,$FF,$A2,$02 DB$BF,$A0,$02,$FF,$C0,$02,$1F,$15,$03,$DF,$94,$03 DB$1F,$16,$03,$DF,$96,$04,$FF,$6C,$05,$9F,$0A,$06 DB$1F,$10,$07,$1F,$1D,$08,$1F,$1E,$08,$FF,$BC,$08 DB$1F,$19,$09,$FF,$BE,$09,$1F,$0D,$0A,$1F,$0E,$0A DB$1F,$0C,$0A,$FF,$20,$0A,$1F,$05,$0B,$1F,$06,$0B DB$7F,$24,$0B,$BF,$84,$0B,$FF,$E4,$0B DB$BF,$00,$0C,$FF,$60,$0C,$0F,$08,$0C,$8F,$8A,$0C ; ; :INDXJSR :LPAR JSR :NXBY JSR :COMX JMP :RPAR ; :INDYJSR :LPAR JSR :NXBY JSR :RPAR JMP :COMY ; :IMMLDA # 3; # STA (:DINDIR),Y INY EJECT LDA #$80;DONT DECODE MENM FOR IMM. STA :DNCK JMP :NXBY ; :ZXLDA :ITEMP CMP #$96;CK IF EXCEPTION BEQ :ZY CMP #$B6 BEQ :ZY JSR :NXBY JMP :COMX ; :ZYJSR :NXBY JMP :COMY ; :INDJSR :LPAR JSR :NXAD JMP :RPAR ; :ACCLDA # 33; A STA (:DINDIR),Y INY RTS ; :ABSXLDA :ITEMP CMP #$BE BEQ :ABSY JSR :NXAD JMP :COMX ; :ABSYJSR :NXAD JMP :COMY ; :ABSJMP :NXAD ; :ZJMP :NXBY ; :IMPRTS ; :RELLDA #$80 STA :DNCK JSR :NXBY LDY #1;NOW SHOW COMPUTED OFFSET LDA (:DNDR2),Y PHA LDY #15 AND #$80 BMI :RELBK LDA #93 STA (:DINDIR),Y LDY #0 :REL0PLA CLC ADC :DNDR2 STA :STEMP TYA ADC :DNDR2+1 STA :STEMP+1 AIW #2,:STEMP LDA :STEMP+1 LDY #16 JSR :SHHEX LDA :STEMP JMP :SHHEX ; :RELBKLDA #92 STA (:DINDIR),Y LDY #$FF BNE :REL0 ; ; :LPARLDA # 8;( STA (:DINDIR),Y INY RTS ; :RPARLDA # 9; ) STA (:DINDIR),Y INY RTS ; :COMXJSR :COM LDA # 56; X STA (:DINDIR),Y INY RTS ; :COMYJSR :COM LDA # 57 ; Y STA (:DINDIR),Y INY RTS ; :NXBYTYA TAX LDY #1 LDA (:DNDR2),Y PHA TXA TAY PLA JSR :CKBY;CK IF IN SYM TAB BCC :NXBY1 RTS :NXBY1JMP :SHHEX ; :NXADTYA TAX LDY #1 LDA (:DNDR2),Y STA :STEMP;PUT IN SHOW TEMP LOCATION INY LDA (:DNDR2),Y STA :STEMP+1 PHA TXA TAY PLA JSR :MNAD;CK IF ADD IS IN SYM TAB BCC :NXAD1 RTS :NXAD1LDX #$80 STX :DNCK;SET DONT CK FLAG JSR :SHHEX JMP :NXBY ; :COMLDA # 12; , STA (:DINDIR),Y INY RTS ; ; :CKBYBIT :DNCK;CK IF FLAG SET BPL :CKBY1 CLC;CLEAR CARRY AS SIGNAL RTS :CKBY1STA :STEMP;SET TO 0 LDX #0 STX :STEMP+1 :MNADPHA LDA :NMSYM;MAKE SURE IT'S NOT EMPTY BEQ :MNAD2 STA :TBYT2;SAVE AS COUNTER LDA # LOW :SSYMT ADD #6 STA :MNRM+1;SET UP X-INDIRECT POINTER LDA # HIGH :SSYMT ADC #0 STA :MNRM+2 :MNAD0LDX #0 LDA :STEMP :MNRMCMP :MNRM,X;CK 1ST BYTE (NOTE : THE ADD PORTION WILL CHANGE) BNE :MNAD1 CPX #0 BNE :MNAD3;OK , SO BYTES CK AND X=1 INX LDA :STEMP+1 JMP :MNRM ; ; :MNAD1DEC :TBYT2;ANY SYMBOLS LEFT BEQ :MNAD2 AIW #9,:MNRM+1 JMP :MNAD0 ; :MNAD2CLC;PREPARE FOR EXIT, AND SHOW FAILURE PLA RTS ; :MNAD3LDA :MNRM+1 SUB #6 STA :MNRM2+1;AND PREPARE NEXT X-INDIRECT LDA :MNRM+2 SBC #0 STA :MNRM2+2 LDX #0 :MNRM2LDA :MNRM2,X;GET CHARACTER (MODIFIED ADDRESS) JSR :INTREP STA (:DINDIR),Y INY INX CPX #6 BNE :MNRM2 SEC PLA RTS; ; ; ; THIS IS THE MNEMONIC TABLE ; :MNETABDB'BRKPHPBPLCLCJSRPLPBMISECRTIPHABVCCLIRTSPLABVSSEI' DB'???DEYBCCTYALDYTAYBCSCLVCPYINYBNECLDCPXINXBEQSED' DB'ADCANDASLBITCMPCPXCPYDECDEXEORINCJMPLDALDXLDYLSR' DB'NOPORAROLRORSBCSTASTXSTYTAXTSXTXATXS' DB'ASLLSRROLRORSTXSTY' EJECT SUBTTL'COMMAND INTERPRETER' ******************************** * *THIS SECTION DEALS WITH * THE COMMAND INTERPRETER * :GETCHLDA :CH CMP #255;CK IF KEY PRESSED BEQ :GETCH PHA MVB #255,:CH PLA LDX #15 :GETC0CMP :KEYCD,X;CK IF IN KEY CODE TABLE BEQ :GETC2 DEX BPL :GETC0 LDX #2;CK IF IN DELIMITER TABLE :GETC3CMP :DELCD,X BEQ :GETC4 DEX BPL :GETC3 CMP #52;CK IF DELETE BNE :GETCH LDA #0;SET DELETE INDICATOR SEC;SET CONTROL FLAG BCS :GETC7 ; :GETC2TXA ADD #16;CONVERT TO HEX CMP #26 BLT :GETC7 ADD #7 BNE :GETC7 :GETC4SEC;SET DELIMITER FLAG :GETC7JMP :CLICK;CLICK ; :KEYCDDB50,31,30,26,24,29,27,51,53,48 DB63,21,18,58,42,56 :DELCDDB33,32,12 ; ; ********************************* *CLEAR THE COMMAND BUFFER * :CLRCMDJSR :SETPU LDY #12;NUM. OF SPACES TO CLEAR LDA #0 :CLRC1STA (:DINDIR),Y DEY BNE :CLRC1 LDA #$80 STA (:DINDIR),Y STY :CHCOL RTS ; ************************************* * *:ONLIST * THIS ROUTINE TESTS IF A CHARACTER IS * ON THE APPROVED DDT LIST * :ONLISTLDX #13;NUM OF VALUES TO TRY :ONLI1CMP :KEYTB,X;CK VALUE BEQ :ONLI2 DEX;IF NOT IT, GET READY FOR NEXT BPL :ONLI1 SEC MVB #255,:CH RTS ; :ONLI2LDA :CMDCD,X;GET THE INTERNAL REP. PHA TXA ASL A TAX LDA :KEYRU,X STA :DNDR2 LDA :KEYRU+1,X STA :DNDR2+1 JSR :CLICK;CLICK MVB #255,:CH PLA CLC RTS ; :KEYTBDB42,18,61,21,40,58,15,13,46,45,79,14,78,62 ; :CMDCDDB37,35,39,34,50,36,93,41,55,52,93,92,92,51 ; *********************************** * *:PUTCH * :PUTCHPHA JSR :SETPU LDY :CHCOL PLA STA (:DINDIR),Y INY LDA #$80 STA (:DINDIR),Y STY :CHCOL RTS ; ******************************** * :SETPULDA #LOW [:DSCRN+107];SET UP POINTER TO BUFFER STA :DINDIR LDA # HIGH [:DSCRN+107] STA :DINDIR+1 RTS ; ; :KEYRUDW :EXAM,:CONT,:GO,:STBRK,:REGIS,:DEPOS DW :PULLWI,:INTERP,:CHWIN,:TRAP,:SPULD DW :PUSHW,:SPSHW,:SERCH ; ;********************************* ; THIS ROUTINE PULLS THE MEMORY WINDOW DOWN ; :PULLWILDA :WINDF CMP #2 BNE :PULL1 INW :EXAMWI MVB #0,:QFLAG JSR :CLRSK LDA :EXAMWI AND #3 BEQ :PULL3 INC :QFLAG BNE :PULL3 :PULL1MVW :EXAMWI,:DNDR2 LDY #0 LDA (:DNDR2),Y BNE :PULL2 JSR :BRINS :PULL2JSR :DETLEN PHA JSR :PUSHS PLA ADD :EXAMWI STA :EXAMWI BCC :PULL3 INC :EXAMWI+1 :PULL3JSR :DWIND JMP :DBND5 ; ; ;*************************** ; THIS ROUTINE PULLS THE WINDOW ; DOWN, A SCREEN AT A TIME :SPULDLDA :WINDF CMP #2 BNE :SPLD1 MVB #0,:QFLAG JSR :CLRSK LDA :EXAMWI AND #$FC;MASK OFF BITS 0 & 1 ADD #44 STA :EXAMWI BCC :SPLD0 INC :EXAMWI+1 :SPLD0JSR :DWIND JMP :DBND5 ; ; THIS SECTION HANDLES THE DISASSEMBLY FILTER ; :SPLD1LDA #12 STA :TBYTE :SPLD2MVW :EXAMWI,:DINDIR LDY #0 LDA (:DINDIR),Y JSR :DETLEN STA :ITEMP LDA :TBYTE;GET NUM. OF SCREEN LINES LEFT SUB :ITEMP;AND SUBTRACT THIS INSTR. SIZE BMI :SPLD0 STA :TBYTE LDA :ITEMP JSR :PUSHS AIW :ITEMP,:EXAMWI JMP :SPLD2 ;*********************************** ; ;THIS ROUTINE PUSHES THE ; WINDOW UP :PUSHWLDA :WINDF CMP #2 BNE :PUSH1 LDA :EXAMWI BNE :PUSH0 DEC :EXAMWI+1 :PUSH0DEC :EXAMWI MVB #0,:QFLAG JSR :CLRSK LDA :EXAMWI AND #3 CMP #3 BEQ :PUSH3 INC :QFLAG BNE :PUSH3 :PUSH1JSR :PULLS;RETURNS LAST PULL SIZE BCS :PUSH3+3 STA :ITEMP SDW :ITEMP,:EXAMWI :PUSH3JSR :DWIND JMP :DBND5 ;*********************************** ; ;THIS ROUTINE PUSHES THE ; WINDOW UP A SCREEN AT A TIME :SPSHWLDA :WINDF CMP #2 BNE :SPSH1 LDA #0 STA :QFLAG JSR :CLRSK LDA :EXAMWI AND #$FC;MASK OFF BITS 0 & 1 SUB #44 STA :EXAMWI BCS :SPSH0 DEC :EXAMWI+1 :SPSH0JSR :DWIND JMP :DBND5 ; ; THIS SECTION HANDLES THE DISASSEMBLY FILTER ; :SPSH1LDA #12 STA :TBYTE :SPSH2JSR :PULLS BCS :SPSH0 STA :ITEMP LDA :TBYTE;GET NUM. OF SCREEN LINES LEFT SUB :ITEMP;AND SUBTRACT THIS INSTR. SIZE BPL :SPSH3 LDA :ITEMP JSR :PUSHS JMP :SPSH0 :SPSH3STA :TBYTE SDW :ITEMP,:EXAMWI JMP :SPSH2 ; ;********************************* ; THIS IS THE WINDOW STACK SECTION ; :CLRSKMVB #0,:BOTSK STA :TOPSK STA :PACKF RTS ; ; :PULLSLDA :PACKF;CHECK IF STACK EMPTY BNE :PULS1 SEC;IF SO, SIGNAL ERROR RTS ; :PULS1TAY;SET PACK NUMBER IN Y LDX :TOPSK DEY BNE :PULS0 CPX :BOTSK;FIRST CHECK IF AT BOTTOM OF STACK BNE :PULS6 STY :PACKF SEC RTS ; :PULS6DEX TXA AND #$3F STA :TOPSK TAX LDY #4 :PULS0STY :PACKF LDA :STACK,X :PULS3DEY BEQ :PULS4 LSR A LSR A BPL :PULS3 :PULS4AND #3 CLC RTS ; ; :PUSHSLDX #3 STX :TBYT2 LDX :PACKF BNE :PSHS1 INX INC :PACKF :PSHS1DEX BEQ :PSHS3 :PSHS2ASL A ASL A ASL :TBYT2 ASL :TBYT2 DEX BNE :PSHS2 :PSHS3LDX :TOPSK EOR :STACK,X AND :TBYT2 EOR :STACK,X STA :STACK,X LDA :PACKF ADD #1 CMP #5 BEQ :PSHS4 STA :PACKF RTS :PSHS4MVB #1,:PACKF LDA :TOPSK ADD #1 AND #$3F STA :TOPSK LDA :BOTSK CMP :TOPSK BNE :PSHS5 ADD #1 AND #$3F STA :BOTSK :PSHS5RTS ; ; :STACKDS64 ;********************************** ; THIS ROUTINE TURNS THE INTERPRETIVE FLAG ON :INTERPINC :SSFLAG MVB #1,:WINDF MVB :CRSINH,:CRSTAT JMP :DBND5 ; ; ; :CONTINC :CONTFL;TURN CONTINUE FLAG ON MVW :PCSAV,:CONTAD JMP :SSTEP ; ; :CONTRTDEC :CONTFL BNE :CONT2;CK IF NORMAL EXIT MVW :CONTAD,:BTEMP LDA #0 JSR :SETBP JMP :DCONT ; :CONT2DEC :CONTFL JMP :DCONT ; ; *********************************** * :EXAM (EXAMINE) * :EXAMLDA #0;SPACE OVER 1 CHAR. STA :QFLAG;CLEAR QUIT FLAG JSR :GTADD BCS :EXAM1;CK IF NULL ADDRESS MVW :HEXVAL,:EXAMWI;MOVE ADDRESS TO EXAM WINDOW JSR :CLRSK;CLEAR PULL STACK JSR :DWIND;SHOW WINDOW :EXAM1JMP :DBND5 ; ************************************ *:GETVAL (GET VALUE) * :GETVALLDA #0 STA :CC;SET CHAR. COUNTER TO 0 :GTV1JSR :GETCH;GET CHAR. BCS :DELIM;IF DELIMITER TAX TEQ :CC,:FSIZE,:GTV1 TXA JSR :PUTCH;PUT CHAR ON SCREEN INC :CC;INCREMENT CHAR. COUNT JMP :GTV1 ; :DELIMCMP #0 BEQ :DELI2 RTS ; :DELI2LDA :CC BNE :DELI3 PLA;CLEAR RTS VALUE PLA PLA PLA JMP :DBND5 :DELI3DEC :CC LDA #0 LDY :CHCOL STA (:DINDIR),Y DEY LDA #$80 STA (:DINDIR),Y DEC :CHCOL JMP :GTV1 ; ********************************* *SUBROUTINE :GTADD (GET ADDRESS) * :GTADDJSR :PUTCH LDA #4 STA :FSIZE;SET FIELD SIZE JSR :GETVAL;GET ADDRESS VALUE JMP :CONVRT ; ********************************** *:CONVRT (CONVERT ATASCII TO HEX) * :CONVRTLDA :CC BNE :CONV2 SEC RTS;THIS FLAGS NULL VALUE :CONV2LDA :CHCOL SUB :CC TAY JSR :SETPU;SET POINTER MVB #0,:HEXVAL STA :HEXVAL+1 :CONV4JSR :GTHX;GET HEX VALUE PHA INY;SET Y TO NEXT CHARACTER JSR :ROTV PLA ORA :HEXVAL STA :HEXVAL DEC :CC BNE :CONV4 CLC RTS ; :GTHXLDA (:DINDIR),Y CMP #$20 BLT :GTH1 ADD #9 :GTH1AND #$0F RTS ; ; :ROTVLDX #4 :ROTV1ASL :HEXVAL ROL :HEXVAL+1 DEX BNE :ROTV1 RTS ; **************************** *SUBROUTINE :GO * :GOLDA #0 JSR :GTADD;GET ADDRESS VALUE BCC :GO1 JMP :DBND5 :GO1MVW :HEXVAL,:PCSAV JMP :DCONT ; ; *************************** *SUBROUTINE DEPOSIT * :DEPOSMVW :EXAMWI,:DNDR2;SET UP INDIRECT POINTER MVB #0,:DEPSW :DEPXXLDA #0;EXTERNAL ENTRY POINT STA :QFLAG JSR :GTSTR;GET HEX STRING SDB :CC,:CHCOL MVB :CC,:TBYTE LSR A;COMPUTE STRING SIZE ADC #0 STA :SSSIZ :DEPO0LDA :TBYTE SUB #2 BMI :DEPO2 STA :TBYTE MVB #2,:CC :DEPO4ADD :CHCOL STA :CHCOL JSR :CONVRT LDY #0 STA (:DNDR2),Y INW :DNDR2 JMP :DEPO0 ; :DEPO2ADD #1 BMI :DEPO3 STA :TBYTE MVB #1,:CC BNE :DEPO4 ; :DEPO3LDA :DEPSW BEQ :DEPO5 RTS :DEPO5JSR :SSCRN JMP :DBND5 ; ;******************************* *SUBROUTINE :SERCH * :SERCHLDA # LOW :SSTR STA :DNDR2 LDA # HIGH :SSTR STA :DNDR2+1 MVB #1,:DEPSW JSR :DEPXX LDA :EXAMWI ADD #1 STA :DINDIR LDA :EXAMWI+1 ADC #0 STA :DINDIR+1 :SER1JSR :SMTCH BCS :SFND INW :DINDIR LDA :DINDIR+1 CMP #$C0 :SER2BNE :SER1 JMP :DBND5 ; :SFNDMVW :DINDIR,:EXAMWI MVB #0,:QFLAG JSR :SSCRN JMP :DBND5 ; ; :SMTCHLDY #0 :SMT2LDA :SSTR,Y CMP (:DINDIR),Y BNE :SMNO INY CPY :SSSIZ BMI :SMT2 SEC RTS ; :SMNOCLC RTS ******************************** *SUBROUTINE :STBRK (SET BREAKPOINT) * :STBRKLDA #0 JSR :GTBYT;GET VALUE BCS :STBR6 LDA :HEXVAL BEQ :STBR6 CMP #7 BGE :STBR6 PHA;SAVE BRKP # LDA #12;FOR , JSR :GTADD BCC :STBR4 PLA STA :TBYTE;SO RESTORE OLD BRKP ASL A ADC :TBYTE;MULTIPLY X 3 TAX LDA :BRKP0,X STA :BTEMP LDA :BRKP0+1,X STA :BTEMP+1 JSR :RESTOR JMP :STBR5 :STBR4MVW :HEXVAL,:BTEMP;MOVE BRK LOCATION TO :BTEMP PLA;GET BRKP # BACK JSR :SETBP :STBR5JSR :SSCRN :STBR6JMP :DBND5 ; ; **************************** *SUBROUTINE :GTBYT (GET BYTE) * :GTBYTJSR :PUTCH LDA #2 STA :FSIZE JSR :GETVAL JMP :CONVRT ; ;********************************* *SUBROUTINE :GTSTR (GET STRING) * :GTSTRJSR :PUTCH LDA #10 STA :FSIZE JMP :GETVAL ***************************** *ROUTINE :REGIS (REGISTER CHANGE) * :REGISLDA #0 STA :CC JSR :PUTCH;SPACE OVER :REG1LDA :CH CMP #255 BEQ :REG1 PHA MVB #255,:CH PLA LDX #2 :REG11CMP :DELCD,X BEQ :REG5 DEX BPL :REG11 CMP #52;?DELETE BEQ :RDEL TAX LDA :CC BNE :RTWO;ALREADY TYPED ONE CHAR. TXA LDX #4 :REG2CMP :REGTB,X;CK IF CHAC. IN TABLE BEQ :REG3 DEX BPL :REG2 BMI :REGBK ; :REG3STX :PFLAG :REG4LDA :REGCD,X JSR :CLICK JSR :PUTCH INC :CC BNE :REG1 ; :RTWOCPX #18;IS IS A C BNE :REG1 LDA :PFLAG CMP #1;HAS P BEEN TYPED BNE :REG1 LDA #$80 STA :PFLAG LDX #5 BNE :REG4 ; :REG5LDA :CC BEQ :REGBK JSR :CLICK LDA #12;LOAD WITH VALUE FOR , BIT :PFLAG BMI :REG6 JSR :GTBYT BCS :REGBK LDA :HEXVAL LDX :PFLAG STA :ASAV,X BCC :REG9 ; :REG6JSR :GTADD BCS :REGBK MVW :HEXVAL,:PCSAV :REG9JSR :SHSTAT JSR :SHSTK :REGBKJMP :DBND5 ; :RDELLDA :CC BEQ :REGBK JSR :CLICK DEC :CC BEQ :RDEL2 LDA #1 STA :PFLAG;INDICATE ONLY P TYPED :RDEL2LDA #0 LDY :CHCOL STA (:DINDIR),Y DEY LDA #$80 STA (:DINDIR),Y DEC :CHCOL JMP :REG1 :REGTBDB63,10,22,43,62 :REGCDDB33,48,56,57,51,35 ; ******************************* *ROUTINE :CHWIN (CHANGE WINDOW) * :CHWINLDX :WINDF INX CPX #3 BMI :CHWN2 LDX #0 :CHWN2STX :WINDF LDA #0 STA :QFLAG;CLEAR QUIT FLAG JSR :DWIND JMP :DBND5 ; ************************************* * ROUTINE :TRAP; (TRAP INTERPRETIVE MODE) * :TRAPLDA #0 JSR :GTBYT BCS :TRAP2 LDA :HEXVAL BEQ :TRAP2 CMP #3 BGE :TRAP2 LSR A BEQ :TRAP4 LDA #3 :TRAP4PHA LDA #12 JSR :GTADD BCC :TRAP0 PLA TAX LDA #0 STA :TADD,X STA :TADD+1,X LDA :TADD ORA :TADD+1 BNE :TRAP5 LDA :TADD+3 ORA :TADD+4 BNE :TRAP5 :TRAP1STA :TFLAG :TRAP5JSR :SSCRN :TRAP2JMP :DBND5 :TRAP0PLA TAX LDA :HEXVAL STA :TADD,X LDA :HEXVAL+1 STA :TADD+1,X LDA #1 BNE :TRAP1