@L|}6CD l0C)HCC WhL/h `CmCDiD`  R@W1  Y0@R !L` D  C D     )16CS S)  C)D1 p p 0 C9DI pCDL~CiCDiD`Ǫ D  C D     )16CS S)  C)D1 p p }0 C9DI pCDL~CiCDiD` DD˙` d J)L !}D L(( LL()  L| L( S LH 0p n  } CY?  q  L L  ` )}ǝ `A! d߰")-݆ "  $G@LLL&0") $G% }DžH0 3S8`G ȱG ȱG   Gȭ Gȭ GG}GHiH8(()) G$H% `(0 }ǥ)8` d)L ݆ & LGȘ ݆LL d  ! LL d)N>Q  HH) }  hyhyB q L> Lm JJ  Ln*` dB%' }ǰ8  H H` 1 { LL   !L     Hh SY?  q  1L }  !? S   q 1 L   Ll  Lg E`L   !L)  q 1L}) `L0AM݊L݉ ML  N݆LLLNLMLHG!@}1F GȱGLLEEȩÑEȑEEȑE Ed E7EȩE  q} L !,0,0SGɛ L 1 !L EHEh W G gLLSROTCES EERF } G) *Gȩ GȽG GȌd q q G`  8   0G  `D}GCEDC0X:Ȣ Y ȱC* ? 0.. , 0%n ?A[ 0 : L`L  `, 0`Y}`piH n0)բY? 08`0 }  0$L GGȽG L `8L`L}Nj8`  05G)݁,G)ȱGȱGHh0})Hh` B! 8`8iiiLE`}ǠE8FEh( l0`ɃLL L8^~jj8jHi hEEEiEȱEiE` dTE} H8EEȱEEȩEh J E8   . m  i`LI!)E1FR}1LJ舩9GIH`LJJ`HGHh l`} S gL   8 rii `дCDCG W  }#C  Lq` X٨`DOS( ySYS IIIIIIIIIIIIIIIC`0 ߩ0}}~}  HE %|+-3G||DDOS PVDOSDOS[ `SYS sx}~}})}}~} CDOS SYS~}V 0`BDELV !B }`LVUQ   ]   TU J ]L!T  #      TU  } L ? .  t`GBJ V~DEHI B V0dV!}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEh"}ǢDEL8HI   0 HI,0 0  9 .G VLO#},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D1:MEM.SAV J y08 B|DEHI$}G V0 0`B;DELV䌚 !B y`@ʆ v s? F0Ξ05: [ BDEHI%}% VY8 B V  @  /DE `E:D1:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO &}STILL RUN DOS B;DE J V (` 9 V⪍ ઍ  -'}ǔLLu DEHILV 9 .l 9 .l  `` s$B VBH(}I|DE V BLV nB,DE J V* \*` B V BLVDEHI BLVL)}Ǫ1u H232435; 1 ;  hh@2 e1i1LHҍ 00) 08 109hh@ Ҡ2e*})1i1232435ޥ<<823Z\}} 3E:}DISK OPERATING SYSTEM II VERSION 2.0SCOPYRIGHT 1980 ATARIA. DISK DIRECTORY I. FORMAT DISKB. RUN CARTRIDGE J. D,}UPLICATE DISKC. COPY FILE ^K. BINARY SAVED. DELETE FILE(S) L. BINARY LOADE. RENAME FILEb M. RUN AT ADDRESSF. LOCK F-}ILE )N. CREATE MEM.SAVG. UNLOCK FILE- RO. DUPLICATE FILEH. WRITE DOS FILESW9!&x#!7&p))'&X*./)L''-؆莟.}R'S  vW DEHHI 1A#! @ ~0ɛ8A0.) ȅ 1 1i/}ǥil ! 1L NO SUCH ITEMSELECT ITEM OR FOR MENU! 0 .{z:*{}.|~ 1 0 00}JB 18L^%|DLl%DIRECTORY--SEARCH SPEC,LIST FILE? # 0 0 n&|D! 1L NOT A DISK FILE1}ǛN !B 1L " 1 !BDED:}:1BJ|DE 1DEBH2}I 1 h0ߢ 0.  0?詛 1 ~0YЛ 1 "L<" "L 3}[ BL1TYPE "Y" TO DELETE...DELETE FILE SPECCOPY--FROM, TO?OPTION NOT ALLOWED DDT` MAC 308 COPYING---D2:DDT.4}MAC # 0|D .L$A#B#C#JB|DE 1BHIDD#E 1D#0: B5} 1L B#C#C#B# B 1N#$0SYS1}:e#D# d# D# .d#ȽD# d# 𩛙d#X# 1,A#6}GPdD#ELO- A.BJdD#E 1 1HH 0hh|DL^%1}:e# Lt% e#dD#EL%7}7 1 0 . .0% 1L WILD CARDS NOT ALLOWED IN DESTINATION 0 A.|K@C}ǩ//3Hu ξL/L DRIVE TO WRITE DOS FILES TO?WRITING NEW DOS FILESTYPE "Y" TO WRITE DOS TO DRIVE 2.?}D2:DOS.SYSERROR - NOT VERSION 2 FORMAT. , &* բ( 1L `[) 0NΞ 0 L1M) 1@} L BAD LOAD FILELOAD FROM WHAT FILE?) 0 0#B 1L WHAT FILE TO LOCK?) 0 0$B 1L WHAT FILE TO UNLOCK?DUA}P DISK-SOURCE,DEST DRIVES?TYPE "Y" IF OK TO USE PROGRAM AREACAUTION: A "Y" INVALIDATES MEM.SAV. h  ,B}  `)  <0 2 2 0  ,   ,,ޢ* 1L ,K* 1 ~0 0C}FINSERT BOTH DISKS, TYPE RETURNERROR - DRIVES INCOMPATIBLE., 1 ~038  , 1L D}Ǿ, &*  Lz+, 0 , 1 ~0 + Y,0!,0 ,L+ ,mm  v,"ǭE}0Ξ, 05,Lt+L +,Hh` NOT ENOUGH ROOMINSERT SOURCE DISK,TYPE RETURNF}INSERT DESTINATION DISK,TYPE RETURN`    `L,8,0( rG}L1(`ߢ) 1* 1 ~0Y`hhL S SL1) 8`NAME OF FILE TO MOVE?- 0 0|DLtH}G% A., 1 <0 0 .@L# .BJ 1  DEHIB V L1 ,5 1 <0,L. I}I JB|,A#Pd#DE 1 HI BDEHHII 1 B 1 , 1 <0,0Lf- B VJ},A#P, 1 <0 0L#L ߢ) 1* 1 ~0Yj383}mm ݭK}}`8}``|* ? ɛ,`|:(|/ 1L `DESTINATION CANT L}BE DOS.SYS0 0H{ $22Δ $28/L /) $2 Π $2 0 ξM}ǩhAΞB,0 J 1 BޝDEHI,HDE 1HIHIDELSAVE-N}GIVE FILE,START,END(,INIT,RUN)O X0 1`BDEPHI V` X0H 1 L O}ǭ0 0 1L0`PLEASE TYPE 1 LETTER,0`hhL <0 1L0LA1 ,;ɛ7,"ɛ:ݦ1ݥP}A"D|ݤD|ȩ:|ȩ|ɛ,,(/+.ީ1 1,ɛ`轤{Q}?NAME TOO LONG B VL ` L1I H1EӝDL1DEI|mDiE` V0`8d/8 i:"2!22 1R} L ERROR- 128ɛ+,' 20*.. өw2 1``2TOO MANY DIGITSINVALIDS} HEXADECIMAL PARAMETER800 0 8 00`,0'D800H,ɛh`2L1NEED D1 THRU D4;uT}~;ADDMACROby%LCLCADC%1ENDM;AIBMACRO inc,by%LLDA %2ADD %1STA %2ENDM;AIWMACROinc,wd%LCLCLDA%2ADCV}%1STA%2BCC?%KINC%2+1?%K=*ENDM;INWMACROwd%LINC%1BNE?%KINC%1+1?%K=*ENDM;TEQMACROv1,v2,locW}%LLDA%1CMP%2BEQ%3ENDM;BGEMACROloc%LBCS%1ENDM;BLTMACROloc%LBCC%1ENDM;MVBMACRO by1,by2%LLDA %1X}ǛSTA %2ENDM;MVWMACROwd1,wd2%LLDA%1STA%2LDA%1+1STA%2+1ENDM;SAWMACROadr,wd%LLDA#low %1STA%2LDAY}#high %1STA%2+1ENDM;SDBMACROinc,by%LLDA %2SUB %1STA %2ENDM;SDWMACROdec,wd%LSECLDA%2SBC%1STA%Z}G2BCS?%KDEC%2+1?%K=*ENDM;SUBMACROby%LSECSBC%1ENDMEJECT**Zero Page Definitions**;;:DINDIR=2:[}[DNDR2=4:DNDR3=6;7*9;A C;J 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=$FCD8EJECTSUBTTL 'DEBUGGING MODULE';;JMP :DDTE;;:SSYMT=*E_} CHO15DB' *'DW0DB1ENDM;;J***DDT STORAGE AREA*:PCSAVDS2:ASAVDS1:PSA`}VDS1:XSAVDS1:YSAVDS1:SPSAVDS2:PZSAVDS6:PFSAVDS4:DMSAVDS1:CHSAVDS2:DSCNFLDS1:OLDDLLDS2:BTEMPDSa}2:ITEMPDS1:TBYTEDS1:UNDFFDS1:SSFLAGDS1:CONTFLDS1:CHCOLDS1:EXAMWIDS2:CONTADDS2:BRKORDS1:CRSTATDSb}1:CCDS1:FSIZEDS1:HEXVALDS2:MPROTDS1:NMSYMDS1:DNCKDS1:TBYT2DS1:STEMPDS2:WINDFDS1:PFLAGDS1:VBISVc}DS2:VBDSVDS2:PRISVDS1:DOSSVDS6:QFLAGDS1:BOTSKDS1:TOPSKDS1:PACKFDS1:SSTRDS5:SSSIZDS1:DEPSWDS1d}: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:DOSCAe},:RESET,:NKYBD;;EJECT=**DDTI(DDT INITIALIZATION POINT)*DDTILDX #1:DDT0LDA :DOSVf}EC+2,XSTA :DOSSV+2,XLDA :DOSLD+2,XSTA :DOSVEC+2,XDEXBPL :DDT0BMI :RSET1;:RESETJSR :JSRI1;INDIRECT SUB. CALL:g}RSET1SEILDX #1:RSET2LDA :DOSVEC,XSTA :DOSSV,XLDA :DOSLD,XSTA :DOSVEC,XDEXBPL :RSET2LDA # LOW ECODESTA :MEMh}LOLDA # HIGH ECODESTA :MEMLO+1LDX #1;SET KEYBOARD VECTORS:RSET3LDA :VKEYBD,XSTA :DOSSV+4,XLDA :DOSLD+4,XSTA :i}VKEYBD,XDEXBPL :RSET3CLIRTS:JSRI1JMP (:DOSSV+2);;:DOSCALDX #3;RESTORE DOS VECTORS:DOSC1LDA :DOSSV,XSTA :Dj}OSVEC,XDEXBPL :DOSC1MVW :DOSSV+4,:VKEYBDJMP (:DOSVEC):NKYBDLDA :KBCODE;GET KEYBOARD CHARACTERCMP :DBCHRBNE :NKk}YB3;IF NOT DBUG ENTRY CHAR. CONTINUESAW :JRST,:BTEMP;SET UP BREAKPOINTLDA :SHINS;CK IF WE HAVE SHOWN INSTRBNE :NKYB2l}GINC :SHINS:NKYB2STA :WINDF;SET WINDOW FLAG FOR INSTR.TYAPHATXAPHA;SAVE OTHER REGISTERSLDA #0JSR :SETBP:JRm}m8STPLATAXPLATAYPLARTI;:NKYB3JMP (:DOSSV+4)[**:DDTE (DDT ENTRY POINT)*:DDTn}cESAW :DBEN1,:BTEMPLDA :SHINSBNE :DBEN2INC :SHINS:DBEN2STA :WINDFJSR :SETBP:DBEN1RTS;}*o} ***SUBROUTINE :DDT**:DDTPLA;RESTORE ACCSTA :ASAV;SAVE REGISTERS IN STORAGESTX :XSAVSTY :YSAVCLD;Cp}LEAR DECIMAL FLAGPLA;SAVE OTHER STATE VARIABLESSTA :PSAVPLASECSBC #2;CORRECT FOR BRK QUIRKSTA :PCSAVPLASBq}C #0STA :PCSAV+1TSXSTX :SPSAVLDX #5;NOW SAVE PG ZERO LOCS:DBUG0LDA :DINDIR,XSTA :PZSAV,XDEXBPL :DBUG0CLIr};CLEAR INTERRUPT DISABLEMVB #0,:DSCNFL;SET FLAG TO DBUG SCREEN OFFSTA :SSFLAG;CLEAR SS AUTO FLAGSTA :CONTFL;CLEAR Cs}ONTINUE FLAGSTA :COLDST;CLEAR COLDST FLAGLDA :BRKP0;CLEAR BRKP0 IF SETBNE :DBUG2LDA :BRKP0+1BEQ :DBUG3:DBUG2MVWt} :BRKP0,:BTEMPJSR :RESTOR:DBUG3MVW :PCSAV,:EXAMWI;SET UP WINDOW INDEXJSR :CLRSK;CLEAR PULL STACKJSR :SCTOG;TURN ONu} DBUG SCREEN;;FIRST WE CHECK IF IN AUTO MODE; OR IF WE ARE DOING A CONTINUE; THEN WE CHECK IF START,SELECT OR OPTION v}IS PRESSED;:DBND5LDA :SSFLAG;CK IF IN AUTO MODEBEQ :DBN56LDA :BRKKY;CK IF BREAK HAS BEEN HITBNE :DBN55INC :BRKKYw};TURN OFF BREAK INDICATOR:DBN50STA :SSFLAG;OK, SO TURN OFF SS AUTO FLAGMVB :CRSTAT,:CRSINH;ALSO RESTORE CURSOR STATEx}LDA :DSCNFL;SET SCREEN TODBUGBNE :DBN57JSR :SCTOGBNE :DBN57:DBN55LDA :TFLAG;CK IF TRAP ONBEQ :DBN60LDA :PCSAVy}CMP :TADDBNE :DBN59LDA :PCSAV+1CMP :TADD+1BNE :DBN59:DBN58LDA #0BEQ :DBN50:DBN59CMP :TADD+3BNE :DBN60LDA :Pz}CSAV+1CMP :TADD+4BEQ :DBN58:DBN60JMP :SSTEP;SO, GO DO NEXT INSTR.:DBN56LDA :CONTFL;CK IF IN CONTINUE MODEBEQ :DBN{}57JMP :CONTRT;GOTO CONTINUE RETURN:DBN57LDA #1;CK IF START PRESSEDBIT :CONSOLBNE :DCON2JSR :DEBOUNINC :CONTFL|};SET UP FOR NORMAL EXITJMP :CONT;;:DCON2LDA :CONSOL;CK IF SELECTAND #2BNE :DCON1JSR :SCTOG;TOGGLE SCREENLDA #}}2JSR :DEBOUNBEQ :DBND5;:DCON1LDA #4BIT :CONSOL;CK IF OPTIONBNE :DCMDIJSR :DEBOUNJMP :SSTEP;:DCMDIJSR :CLRC~}GMDTEQ :CH,#255,:DCMD2;CK IF KEY PRESSEDJSR :ONLIST;CK IF ON LIST OF APPROVED CHARACTERSBCC :DCMD3:DCMD2JMP :DBND5:}DCMD3JSR :PUTCHJMP (:DNDR2);;:DCONTLDA :DSCNFL;CK STATE OF DISPLAYBEQ :DCNT1JSR :SCTOG;TOGGLE SCREEN IF NECESSAY}Ǜ:DCNT1LDX #5;RESTORE PG ZERO:DCNT2LDA :PZSAV,XSTA :DINDIR,XDEXBPL :DCNT2LDA #$C0STA :NMIEN;RESTORE NMI SLD}A #1STA :WINDF;SET WINDOW FLAG TO DISASSLDX :SPSAV;RESTORE STACK POINTERTXSLDA :PCSAV+1;NOW RESTORE STATEPHALD}HA :PCSAVPHALDA :PSAVPHALDX :XSAVLDY :YSAVLDA :ASAVRTI;;k** THIS SUBROUTI}NE TOGGLES THE* DDT SCREEN AND THE NORMAL ONE*:SCTOGJSR :VSYNCLDA :DSCNFLBEQ :DBSC1;CK WHAT STATE THE SCREEN IS IN}ǛDEC :DSCNFLLDX #3:SCTG2LDA :PFSAV,XSTA $2C5,XDEXBPL :SCTG2MVW :CHSAV,:CHACT;RESTORE CHAR SET CNTLMVB :PRISV,}$26F;RESTORE PRIORITYMVB :OLDDLL,:SDLSTL;THIS RESETS OLD SCREENSTA :DLISTLMVB :OLDDLL+1,:SDLSTL+1STA :DLISTL+1MV}B :DMSAV,:SDMCTL;AND DMA CONTROLSTA :DMACTLAND #$0CLSR ALSR ASTA :GRACTLLDX #3:SCTG4LDA :VBISV,XSTA :VVBKI,X}ǛDEXBPL :SCTG4 LDA #$C0STA :NMIEN;ALLOW DMISRTS;:DBSC1INC :DSCNFLLDX #3:DBSC2LDA $2C5,X;SAVE COLOR REGIST}ERSSTA :PFSAV,XDEXBPL :DBSC2MVW :CHACT,:CHSAVMVB $26F,:PRISV;SAVE PRIORITYMVB #148,$2C8;AND SET UP DBUG COLOR} REGISTERSLDA #$CSTA $2C5LDA #0STA $26F;SET PRIORITYSTA $2C6STA :QFLAG;CLEAR QFLAG WHILE WE'RE AT ITSAW $E0}02,:CHACTMVW :SDLSTL,:OLDDLL;SAVE CURRENT LOCATION OF DLMVB :SDMCTL,:DMSAVJSR :SETSCN;CLEAR AND SET UP SCREENJSR :}SSCRN;AND UPDATE DYNAMIC PARTS JSR :VSYNCMVB # LOW :DDTLST,:SDLSTLSTA :DLISTLMVB # HIGH :DDTLST,:SDLSTL+1STA :DLI}STL+1LDX #4LDA #0STA :GRACTL:TOG1STA :GRAFP0,XDEXBPL :TOG1MVB #34,:SDMCTLSTA :DMACTLLDX #3:TOG2LDA :VVBKI}k,XSTA :VBISV,XDEXBPL :TOG2SAW $E45F,:VVBKISAW $E462,:VVBKDLDA #$40STA :NMIENRTS;;EJECT}*}***SUBROUTINE :SETBP (SET BREAKPOINT)** THIS ROUTINE IS CALLED TO SET UP A* BREAK POINT. THE BREAKPOI}NT NUMBER* SHOULD BE IN THE ACCUMULATOR . AND THE* BREAK POINT LOCATION THEN* SHOULD BE IN :BTEMP;:SETBPSTA :TBYTE;}GSAVE VALUE TEM-ASL A;MULTIPLY *2ADC :TBYTE;NOW IT'S MULTIPLIED BY 3TAX;PUT IN X REG;; CHECK IF ALREADY SET;}LDA :BRKP0,XBNE :SETB1LDA :BRKP0+1,XBEQ :SETB2:SETB1LDA :BTEMPPHA;SAVE TEMPLDA :BTEMP+1PHALDA :BRKP0,X;IF }NOT, FIRST RESTORESTA :BTEMPLDA :BRKP0+1,XSTA :BTEMP+1TXAPHAJSR :RESTORPLATAXPLA;NOW RESTORE :BTEMPSTA }:BTEMP+1PLASTA :BTEMP:SETB2LDY #0;SET=0 FOR DINDIRMVB :BTEMP+1,:DINDIR+1STA :BRKP0+1,X;SET UP POINTER TO BREAKPO}INTMVB :BTEMP,:DINDIRSTA :BRKP0,XLDA (:DINDIR),Y;GET CURRENT VALUESTA :BRKP0+2,X;AND SAVELDA #0STA (:DINDIR),Y}I;SET BREAKPOINTMVB #LOW :DDT,:VBREAKMVB #HIGH :DDT,:VBREAK+1RTS;k**SUBROUTINE :RES}TOR (RESTORE BREAKPOINT)*:RESTORMVW :BTEMP,:DINDIRJSR :STBPP;SET POINTERBCC :REST6LDA #$EALDY #0STA (:DINDIR),Y}ǛRTS;:REST6LDA :BRKP0+2,X;GET PROPER INSTRUCTIONLDY #0;SET UP Y FOR DINDIRECTSTA (:DINDIR),Y;RESTORETYA;MOVE }T0 TO ACCSTA :BRKP0,XSTA :BRKP0+1,X;CLEAR OUT BREAKPOINTSTA :BRKP0+2,XRTS;t**SUBROU}TINE :STBPP (SET BREAKPOINT POINTER)*:STBPPLDX #0;GET READY TO RESTORE INSTRUCTION:REST0LDA :BTEMP;LOAD A WITH LOW BY}TE OF BRKP LOCATIONCMP :BRKP0,X;THIS SHOULD EQUAL ONE OF THE BRKPsBEQ :REST1;IS THIS IT?:REST3INX; NO. INCREMENT X }AND TRY AGAININXINXCPX #21;CK IF AT END OF TABLEBNE :REST0SEC;SET NOT FOUND FLAGRTS;; FIRST BYTE WAS EQUA}L;:REST1LDA :BTEMP+1;GET HIGH BYTE OF PCCMP :BRKP0+1,X;IS THIS IT?BNE :REST3;NO, TRY AGAIN;; SECOND BYTE EQUAL}+CLCRTSEJECTSUBTTL 'SETUP DDT SCREEN'M***SUBROUTINE :SETSCN** THIS ROUTINE CLEARS} AND SETS UP SCREEN*:SETSCNLDA # LOW [:DSCNTB+40];SET UP POINTER TO SCREEN AREASTA :DINDIR ;IGNORE FIRST LINE OF SCR}EENLDA # HIGH [:DSCNTB+40]STA :DINDIR+1LDX #15;NUMBER OF LINES TO CLEAR:CDSC0LDA #0LDY #39;NUMBER OF BYTES TO C}LEAR ON LINE:CDSC1STA (:DINDIR),YDEYBPL :CDSC1AIW #40,:DINDIR;ADD OFFSET TO NEXT LINEDEX;CK IF ANY MORE LINES LE}FTBNE :CDSC0AIW #40,:DINDIR;ADD OFFSET TO SKIP BREAKPOINT LINELDY #119;NUMBER OF BYTES LEFT TO CLEARLDA #0:CDSC3S}GTA (:DINDIR),YDEYBPL :CDSC3;; NOW SET UP VARIABLE SLOT BOARD;JSR :SETSMP;SET UP POINTERS TO SYMBOLSMVB #0,:NMSYM};SET # OF SYMBOLS TO 0:DSYM0LDY #5;NUMBER OF CHARCTERS-1 IN VAR. NAME:DSYM1LDA (:DNDR2),Y;GET CHARACTERCMP #$20;CK} FOR SPACESBNE :DSYM2TXAPHA;SAVE XDEYLDX #5:DSYMNLDA (:DNDR2),Y;CK IF NEXT 5 ARE SPACES ALSOCMP #$20BNE :S}YMOKDEYDEXBNE :DSYMNPLA ;CLEAR STACKJMP :DSEP;AND DRAW SEPERATORS;:SYMOKLDY #5;RESTORE YPLATAX;AND X}:DSYM2LDA (:DNDR2),YJSR :INTREP:DSYM3STA (:DINDIR),YDEYBPL :DSYM2INC :NMSYM;INCREMENT # OF SYMBOLSAIW #40,:DIND}IRAIW #9,:DNDR2DEX;ALL VARIABLES SHOWN ?BNE :DSYM0;; NOW DRAW SEPERATOR LINES;:DSEPLDA # LOW [:DSCNTB+63]STA} :DINDIRLDA # HIGH [:DSCNTB+63]STA :DINDIR+1;THIS SETS UP POINTER TO SCREENLDX #15;NUMBERS OF ROWS TO DRAW ON:DBLI}1LDY #0;INITIAL INDEXLDA #124STA (:DINDIR),YLDY #4STA (:DINDIR),YLDY #11STA (:DINDIR),YAIW #40,:DINDIR;OFFS}ET TO NEXT ROWDEX;ANY ROWS LEFT ?BNE :DBLI1LDA # LOW [:DSCNTB+684]STA :DINDIR;NOW SET POINTER TO BKP SEPERATORSL}DA # HIGH [:DSCNTB+684]STA :DINDIR+1LDX #3:DBLI2LDY #30LDA #124:DBLI3STA (:DINDIR),YDEYDEYDEYDEYDEYBPL }:DBLI3AIW #40,:DINDIRDEXBNE :DBLI2;;LDA # LOW [:DSCNTB+160];OFFSET TO CURRENT POSITION POINTERSTA :DINDIRLDA #}p HIGH [:DSCNTB+160]STA :DINDIR+1LDA #30;VALUE FOR >LDY #0STA (:DINDIR),Y;PUT ON SCREENRTSEJECT}*}**SUBROUTINE :SSCRN(SHOW SCREEN)*:SSCRNJSR :SETSMPLDX :NMSYMBEQ :DSYM9:DSYM7LDY #6;POINT Y }TO VARIABLE VALUELDA (:DNDR2),YSTA :DNDR3;SET UP INDIRECT POINTER TO CONTENTSINYLDA (:DNDR2),YSTA :DNDR3+1INYL}DA (:DNDR2),YCMP #1BEQ :DSYMB;ONLY A BYTELDY #1LDA (:DNDR3),YLDY #8;SET Y TO POSITION VALUE ON SCREENJSR :SHHE}XLDY #0LDA (:DNDR3),YLDY #10:DSYM8JSR :SHHEXDEX;CK IF ALL VARIABLES SHOWNBEQ :DSYM9AIW #40,:DINDIRAIW #9,:D}NDR2JMP :DSYM7;;:DSYMBLDY #0LDA (:DNDR3),YLDY #8BNE :DSYM8;; NOW SHOW THE BREAKPOINTS;:DSYM9LDA # LOW [:DS}CNTB+720];SET UP POINTER TO BRKP AREA ON SCREENSTA :DINDIRLDA # HIGH [:DSCNTB+720]STA :DINDIR+1LDX #0LDY #0LDA #}G8STA :TBYT2:DSM91JSR :SHBRK;SHOW BRKPSDEC :TBYT2BNE :DSM91JSR :SHSTK;SHOW STACKJSR :SHSTAT;AND REGISTER STATE};AND FALL INTO :DWIND;:**SUBROUTINE :DWIND (DISPLAY WINDOW)*:DWINDLDA :WINDFASL AT}AXLDA :WINTI,XSTA :DNDR2INXLDA :WINTI,XSTA :DNDR2+1SAW :DSCNTB,:DINDIRLDY #22:DWIN0LDA (:DNDR2),YSTA (:DIND}IR),YDEYBPL :DWIN0AIW #41,:DINDIRLDA :EXAMWISECSBC #3STA :DNDR2;BACK WINDOW UP 3LDA :EXAMWI+1SBC #0STA }:DNDR2+1LDA :WINDF;CK WHICH FILTER IS INBNE :DWIN1JMP :DIINS;DISPLAY INSTRUCTIONS:DWIN1CMP #1BEQ :DWIN2JMP :D}HEXW:DWIN2MVB #15,:TBYTE;BYTES TO SHOWMVB #3,:MPROT;BYTES TO PROTECT INITIALLY:DIS1JSR :CLIN;CLEAR LINELDA :DND}R2+1;HIGH BYTE OF ADDRESS LOCATIONJSR :SHHEXLDA :DNDR2JSR :SHHEXLDY #0LDA (:DNDR2),Y;NOW GET VALUE AT THAT LOCA}0TIONSTA :ITEMP;SAVELDY #5JSR :SHHEX;;;6 NOW DO THE DISASSEMBLY;;LDA :MPROT;CHECK IF BYTE IS PROTECTEDBNE} :NXINSLDA #0STA :UNDFF;CLEAR UNDEFINED FLAGSTA :BRKOR;AND BRK DISPLAY FLAGLDA :ITEMPBNE :DIS2;MAKE SURE IT'S NO}T A BRKJSR :BRINSSTA :ITEMPLDA #$80STA :BRKORLDA :ITEMP:DIS2JSR :DETLEN;GET LENGTH OF INS.STA :MPROTLDY #8}LDA :ITEMP;GET INSTRUCTIONAND #03CMP #3BEQ :UNDEFLDA :ITEMPAND #$0F;MASK OFF LOWER 4CMP #2BEQ :UNDF1LDA :IT}EMPAND #7BEQ :OBYTEJSR :FNDPATBCC :UNDF2BCS :UNDEF;:OBYTELDA :ITEMPCMP #$80BEQ :UNDEFLSR A;GET NON ZERO }DIGITS TO RIGHTLSR ALSR AJMP :UNDF2;:UNDF1LDA :ITEMP;TEST FOR LDXCMP #$A2BNE :UNDEFLDA #45;OFFSET FOR LDX}BNE :UNDF2;:UNDEFMVB #1,:MPROTLDA #16;UND IS THE 16 TH MENM.STA :UNDFF;SET UNDEFINED FLAG:UNDF2JSR :SMNEM;SHOW I}TJSR :SHWAD;AND THE ADDRESS MODE:NXINSAIW #40,:DINDIR;OFFSETS TO NEXT LINE ON SCREENINW :DNDR2;AND MEMORY ADDRESS}DEC :MPROTDEC :TBYTEBEQ :SSCR9JMP :DIS1:SSCR9RTS;;:CLINLDA #0;CLEAR DISPLAY WINDOW LINETAY:CLIN1STA (:DIND}IR),YINYCPY #22BNE :CLIN1TAYRTS;:DHEXWMVB #3,:TBYTESTA :MPROTJSR :DIS1;DISPLAY 1ST THREE BYTESLDA :DNDR2}EAND #3EOR #$FFADD #5JSR :DHLIN;SHOW CURRENT LINELDA :QFLAG;SEE IF ALREADY SHOWNBEQ :DHXW0RTS:DHXW0LDA #11S} TA :TBYT2:DHXW1AIW #40,:DINDIR' ;NEXT LINE ON SCREENLDA #4;SHOW 4 BYTES FROM HERE ONJSR :DHLINDEC :TBYT2BNE }:DHXW1RTS;:DHLINSTA :TBYTE;BYTE TO SHOWSTA :MPROTJSR :CLINLDA :DNDR2+1JSR :SHHEXLDA :DNDR2JSR :SHHEXLDY #}5:DHLN1TYATAXLDY #0LDA (:DNDR2),Y;THIS GETS NEXT VALUE TO SHOWPHATXATAYPLAJSR :SHHEXINYINW :DNDR2DEC} :TBYTEBNE :DHLN1;IF ANY MORE SHOWMVB :MPROT,:TBYTELDY #18;NOW DO ATASCII DECODINGSDW :MPROT,:DNDR2:DHLN2TYATA}XLDY #0LDA (:DNDR2),YPHATXATAYPLAJSR :INTREPSTA (:DINDIR),YINYINW :DNDR2DEC :TBYTEBNE :DHLN2RTS;:}DIINSMVB #15,:TBYTE;SHOW THE INSTRUCTIONSMVB # LOW :INSTW,:DNDR2MVB # HIGH :INSTW,:DNDR2+1:DIIN1LDY #21:DIIN2LDA (:}DNDR2),YJSR :INTREPSTA (:DINDIR),YDEYBPL :DIIN2AIW #40,:DINDIRAIW #22,:DNDR2DEC :TBYTEBNE :DIIN1RTS;:INST}oWDB 'OPTION-SINGLE STEPS 'DB 'SELECT-TOGGLES SCREEN 'DB 'START -RETURNS TO CODE'DB ' COMMANDS ARE :s 'DB 'E EXAMINE ADDRESS'DB 'C CONTINUE,LEAVE BRKP'DB 'G GOTO ADDRESS 'DB 'B<#>, SET BREAKP.'DB 'R<#>, C}HANGE REG.'DB 'D DEPOSIT HEX STR'DB 28,29DB ' PULL WINDOW UP/DOWN'DB 'I INTERPRETIVE MODE 'DB 'W TOGGLE DIS}P. WINDOW'DB 'T<#>, SET TRAP 'DB 'S SEARCH HEX STR';;:WINTIDW:TIINS,:TIDIS,:TIHEX:TIINSDB$A4,$B5,$AE},$A9,$AF,$AE,$87,$F3,$80DB$A4,$A5,$A2,$B5,$A7,$A7,$A9,$AE,$A7,$80DB$B4,$AF,$AF,$AC:TIDISDB$80,$AC,$AF,$A3,$80,$80,$B}6,$A1,$AC,$80DB$A9,$AE,$B3,$B4,$B2,$B5,$A3,$B4,$A9,$AFDB$AE,$80,$80:TIHEXDB$80,$AC,$AF,$A3,$80,$80,$80,$80,$B6,$A1};DB$AC,$B5,$A5,$B3,$80,$80,$80,$80,$A3,$A8DB$A1,$B2,$B3\**SUBROUTINE :SHSTK (SHOW STACK)}I**:SHSTKLDA # LOW [:DSCNTB+64];SET UP SCREEN POINTERSTA :DINDIR Q ;OFFSET TO STACK WINDOWPHA;SAVE THIS PO}INTERLDA # HIGH [:DSCNTB+64]STA :DINDIR+1PHALDX #14;FIRST CLEAR STACK AREA:SSTKCLDA #0TAYSTA (:DINDIR),YIN}GYSTA (:DINDIR),YAIW #40,:DINDIRDEXBPL :SSTKCPLASTA :DINDIR+1PLASTA :DINDIRLDA :SPSAV;NOW COMPUTE DEPTH OF} STACKADD #15BCC :SSTK2LDA #$FF:SSTK2TAX;MOVE VALUE TO XSAW $100,:DNDR2;SET UP 'STACK POINTER ':SSTK1CPX :SP}SAV;CK IF PSTACK EMPTYBEQ :SSTK3TXA;MOVE X TO YTAYLDA (:DNDR2),Y;GET VALUE OFF PSEUDO STACKLDY #0JSR :SHHE}3XAIW #40,:DINDIRDEXBNE :SSTK1:SSTK3RTS;;S**SUBROUTINE :SETSMP (SET POINTER TO SYMB}OL TABLE:SETSMPLDA # LOW [:DSCNTB+68];SET UP POINTER TO VARIABLE AREASTA :DINDIRLDA # HIGH [:DSCNTB+68]STA :DINDIR}+1MVB # LOW :SSYMT,:DNDR2;SET POINTER TO SYMBOL TABLEMVB # HIGH :SSYMT,:DNDR2+1LDX #15;NUMBER OF VARIABLES WATCHED}#RTS;EJECTSUBTTL'SINGLE STEP'F** THIS CODE HANDLES THE SINGLE STEP*:SSTEPMVW :PC}SAV,:DNDR2;SET UP POINTERLDY #0LDA (:DNDR2),Y;GET INSTRUCTIONBNE :SST3;MAKE SURE IT'S NOT A BRKJSR :BRINS;OTH}ERWISE, GET IT:SST3STA :ITEMPJSR :TFORB;SEE IF FORBIDDENBCC :SST0JMP :SSSIM;SIMULATE INSTRUCTION:SST0JSR :PTBED};PREPARE TEST BEDLDA :ITEMPJSR :DETLEN;GET LENGTHTAXDEXTAYDEYCLCADC :PCSAV;FUDGE PROG. COUNTER FOR AFTE}R INSTR.STA :PCSAVBCC :SST1INC :PCSAV+1:SST1LDA (:DNDR2),Y;TRANSFER INSTRUCTION TO TEST BEDSTA :TBED,XDEXDEY}BPL :SST1LDA :ITEMP;JUST IN CASE IT WAS A BRKSTA :TBED:SST2LDX :XSAV;RESTORE REGISTER STATELDY :YSAVLDA :PSAV}PHALDA :ASAVPLPJMP :TBED;EXECUTE INSTRUCTION;;:SSRETSTA :ASAV;SAVE REGISTER STATE AGAINSTX :XSAVSTY :YSAV}PHPPLASTA :PSAVTSXSTX :SPSAVCLD;MAKE SURE WE'RE IN BINARY MODECLI:SSRT2LDA :DSCNFL;CK IF WE NEED TO UPDAT}EBEQ :SSRT3JSR :VSYNCJSR :SHSTAT;UPDATE REGISTER STATEJSR :VSYNC;WAIT FOR SYNCMVW :PCSAV,:EXAMWI;SET NEW MEMOR}Y WINDOW INDEXMVB #1,:WINDFJSR :SSCRNLDA :SSFLAGBNE :SSRT3LDA #4JSR :DEBOUNJSR :VSYNC:SSRT3JMP :DBND5;GO BA}CK AND CHECK CONSOLE;:TBEDDS3JMP :SSRETJMP :SSBC2;THIS JMP IF FOR CONDITIONAL BRANCHES;;:PTBEDLDX #2LDA #$EA};NOP OP CODE:PTB1STA :TBED,XDEXBPL :PTB1RTS;;:TFORBLDX #0LDA :ITEMP:TFOR2CMP :FORB,XBEQ :FFND;CK IF OP CO}GDE IN ON FORBIDDEN LISTINXCPX #14BNE :TFOR2CLCRTS:FFNDSECRTS;:FORBDB$90,$B0,$F0,$D0,$30,$10,$50,$70,$00DB}$4C,$6C,$20,$40,$60;;:SSSIMTXAASL A;MULTIPLY BY 2TAXLDA :SSROU,X;GET ADDRESS OF ROUTINESTA :SSRAM+1LDA :SSR}OU+1,XSTA :SSRAM+2:SSRAMJMP :SSRAM;GOTO ROUTINE;;:SSROUDW:SSBC,:SSBC,:SSBC,:SSBC,:SSBC,:SSBC,:SSBC,:SSBCDW:SSBRK},:SSJMP,:SSJMI,:SSJSR,:SSRTI,:SSRTS;:SSJMPJSR :PCAD;SET PC TO NEXT ADDJMP :SSRT2;:SSJMILDY #1LDA (:DNDR2),YSTA :}DINDIRINYLDA (:DNDR2),Y;SET DINDIR TO NEXT ADSTA :DINDIR+1LDY #0LDA (:DINDIR),YSTA :PCSAV;NOW GET THE TARGET AD}DRESSINYLDA (:DINDIR),YSTA :PCSAV+1JMP :SSRT2;:SSRTSPLAADD #1;CORRECT FOR JSR WIERDNESSSTA :PCSAVPLAADC }#0STA :PCSAV+1INC :SPSAV;UPDATE STACK POINTERINC :SPSAVJMP :SSRT2;:SSJSRJSR :PCADAIW #2,:DNDR2LDA :DNDR2+1P}HALDA :DNDR2PHADEC :SPSAVDEC :SPSAV;UPDATE STACK POINTER SHADOWJMP :SSRT2;:SSBCAIW #2,:PCSAVJSR :PTBEDLDA :}ITEMPSTA :TBED;PUT COND. BRACH INS. IN TEST BEDLDA #4;OFFSET TO 2 ND JMP INS.STA :TBED+1JMP :SST2;:SSBC2CLDCL}ILDY #1LDA (:DNDR2),YBPL :SSBC3;THIS SETS FOR FOR POS & NEG OFFSETDEY:SSBC3DEYCLCADC :PCSAVSTA :PCSAVTYA}ADC :PCSAV+1STA :PCSAV+1JMP :SSRT2;:SSBRKMVW :DNDR2,:BTEMP;FIRST RESTORE BRK PNTJSR :RESTORJMP :SSTEP;AND RETRY} SINGLE STEP;:SSRTIPLASTA :PSAVPLASTA :PCSAVPLASTA :PCSAV+1AIB #3,:SPSAVJMP :SSRT2;:PCADLDY #1LDA (:DND}fR2),YSTA :PCSAVINYLDA (:DNDR2),YSTA :PCSAV+1RTS;EJECTSUBTTL 'SUPPORT ROUTINES FOR DDT'}*} **SUBROUTINE :VSYNC** THIS ROUTINE SYNCHRONIZES TO VERTICAL BLANK*:VSYNCLDA #$7B:VSYN1CMP :VCOUNTBNE :VSY} N1RTS;;,**SUBROUTINE :DEBOUN** THIS ROUTINE DEBOUNCES THE CONSOLE* , IT EXPECTS THE}v MASK VALUE TO BE* IN THE ACC*:DEBOUNBIT :CONSOLBEQ :DEBOUN:DB2ADC #1BNE :DB2:DB3ADC #1BNE :DB3RTS;}*}**SUBROUTINE :DETLEN (DETERMINE LENGTH)** THIS ROUTINE DETERMINES THE LENGTH * OF THE OPCODE }PASSED IN THE ACC*:DETLENLDY #1;ASSUME LENGTH = 1CMP #0;CK BRKBEQ :DETRMCMP #$40;RTIBEQ :DETRMCMP #$60;RTS}GBEQ :DETRMLDY #3;NOW ASSUME =3CMP #$20;JSRBEQ :DETRMAND #$1F;STRIP OFF UPPER 3 BITSCMP #$19;TEST FOR ABS,Y}BEQ :DETRMAND #$0F;STRIP TO 4 BITSTAXLDY :LENTAB,X:DETRMTYARTS;:LENTABDB2,2,2,1,2,2,2,1,1DB2,1,1,3,3,3,3;}!***SUBROUTINE :BRINS(BREAKPOINT LENGTH)** THIS ROUTINE RETRIEVES THE PROPER* BREAKPO}lINT INSTRUCTION *:BRINSMVW :DNDR2,:BTEMPJSR :STBPPBCC :BRI2LDA #0RTS:BRI2LDA :BRKP0+2,XRTS;}*}**SUBROUTINE :INTREP (INTERNAL REPRENSATION)*:INTREPPHAAND #$80STA :INRAM+1PLAAND #$7FCMP #32}BMI :INTR1CMP #96BPL :INRAMSUB #32BPL :INRAM:INTR1ORA #64:INRAMORA #0RTSEJECTSUBTTL 'SHOW SUPPORT ROUTINES' }"**SUBROUTINE :SHBRK (SHOW BREAKPOINTS)*:SHBRKLDA :BRKP0+4,X;GET FIRST BYTE OF ADDRESS }EJSR :SHHEXLDA :BRKP0+3,XJSR :SHHEXINXINXINXINYRTS;;f***SUBROUTINE :SHSTAT } (SHOW STATE)** THIS ROUTINE IS USED TO SHOW THE* VALUES OF REGISTER STATE*:SHSTATLDA # LOW :DSCRN;SET UP POINTER }TO DBUG SCREENSTA :DINDIRLDA # HIGH :DSCRNSTA :DINDIR+1LDY #80;OFFSET TO WHERE VALUES ARE SHOWNLDA :PCSAV+1;NOW }SHOW VALUESJSR :SHHEXLDA :PCSAVJSR :SHHEXINYLDA :ASAVJSR :SHHEXINYINYLDA :PSAVJSR :SHBININYLDA :XSAV }LJSR :SHHEXINYLDA :YSAVJSR :SHHEXINYLDA :SPSAVJSR :SHHEXRTS;n***SUBROUTINE }_ :SHHEX (SHOW HEX)** THIS ROUTINE IS USED TO SHOW A VALUE* IN THE ACC IN HEX NOTATION**d ROUTINE ASSUMES DINDIR & }Y ARE* SET TO POINT TO LOCATION FOR SHOW*:SHHEXPHA;SAVE TEMPLSR ALSR ALSR A;GET LEFT NIBBLE TO RIGHTLSR A }JSR :HXDIGPLAAND #$0F;NOW MASK OFF RIGHT NIBBLEJMP :HXDIG;;:HXDIGADD #16;ADD OFFSET FOR NUMBERSCMP #26;CK IF }J > 10BLT :HX0ADD #7;ADD HEX OFFSET:HX0STA (:DINDIR),YINYRTS;l***SUBROUTINE : }SHBIN (SHOW BINARY)*:SHBINLDX #8;SET UP COUNTER FOR DIGITS:SHB2ASL A;SHIFT LEFT TO GET BIT IN CARRYJSR :BIDIGDEX }BNE :SHB2RTS;:BIDIGPHA;SAVE TEMPBCS :BID1LDA #16;LOAD VALUE FOR 0:BID2STA (:DINDIR),YINYPLARTS;:BID1 }C/LDA #17;LOAD WITH VALUE FOR 1BNE :BID2;;P**SUBROUTINE :SMNEM(SHOW MENMONIC)*:SMNEM } PHA;SAVE TEMPASL A;MULTIPLY BY 2STA :BTEMPPLAADD :BTEMPTAXLDA :MNETAB,XJSR :SHLETLDA :MNETAB+1,XJSR :SHL }$ETLDA :MNETAB+2,XJMP :SHLET;;A**SUBROUTINE :SHLET:SHLETJSR :INTREPORA :BRKORSTA ( }:DINDIR),YINYRTS6**SUBROUTINE :FNDPAT (FIND PATTERN)** THIS ROUTINE FINDS IF THE OPC }ODE * MATCHES ONE IN THE TABLE PATTERNS*:FNDPATLDX #0:PATL1LDA :ITEMP;GET OPCODEAND :PATTAB,X;MASK OFF DON'T CARES }ǛINXCMP :PATTAB,X;SEE IF IT MATCHESBEQ :PATFDINXCPX # 68;CK IF AT END OF TABLEBNE :PATL1SEC;NOPE, INDICATE F }AILURERTS:PATFDTXA;YEP, THIS IS ITLSR A;DIVIDE BY 2ADD #32;ADD OFFSET TO START OF PATTERN MNEM.RTS;:PATTAB }DB$E3,$61,$E3,$21,$E7,$06,$F7,$24,$E3,$C1DB$F7,$E4,$F7,$C4,$E7,$C6,$FF,$CA,$E3,$41DB$E7,$E6,$DF,$4C,$E3,$A1,$E7,$A6,$E }7,$A4DB$E7,$46,$FF,$EA,$E3,$01,$E7,$26,$E7,$66DB$E3,$E1,$E3,$81,$EF,$86,$EF,$84,$FF,$AADB$FF,$BA,$FF,$8A,$FF,$9A,$FF }5,$0A,$FF,$4ADB$FF,$2A,$FF,$6A,$FF,$8E,$FF,$8C;;V**SUBROUTINE :SHWAD (SHOW ADDRESS MODE })*:SHWADLDA :UNDFF;CHECK IF INSTRUCTION UNDEFINEDBEQ :SHAD1RTS:SHAD1LDX #0STX :DNCK;CLEAR DON'T CKECK FLAG FOR M }NAD ROUT:SHAD2LDA :ITEMP;GET OP CODEAND :ADPAT,X;MASK OFF DONT CARES INXCMP :ADPAT,X;NOW SEE IF IT MATCHES THE MA }NDATORY PARTBEQ :ADFND;YESINXINXBNE :SHAD2;NO, TRY NEXT;:ADFNDINXLDA :ADPAT,X;GET ADDRESS MODEASL A;MULTI }PLY BY 2TAXLDA :ADROU,X;GET FIRST BYTE OF MODE ROUTINESTA :ADRAM+1;PUT IN INDIRECT BYTELDA :ADROU+1,X;GET HIGH BYT }ESTA :ADRAM+2INY:ADRAMJMP :ADRAM;;:ADROUDW:INDX,:INDY,:IMM,:ZX,:ZY,:IND,:ACC,:REL,:ABSX,:ABSY,:ABS,:Z,:IMP;;:AD }PATDB$1F,$01,$00,$1F,$11,$01,$1F,$09,$02,$FF,$A2,$02DB$BF,$A0,$02,$FF,$C0,$02,$1F,$15,$03,$DF,$94,$03DB$1F,$16,$03,$D }F,$96,$04,$FF,$6C,$05,$9F,$0A,$06DB$1F,$10,$07,$1F,$1D,$08,$1F,$1E,$08,$FF,$BC,$08DB$1F,$19,$09,$FF,$BE,$09,$1F,$0D,$0A },$1F,$0E,$0ADB$1F,$0C,$0A,$FF,$20,$0A,$1F,$05,$0B,$1F,$06,$0BDB$7F,$24,$0B,$BF,$84,$0B,$FF,$E4,$0BDB$BF,$00,$0C,$FF, }G$60,$0C,$0F,$08,$0C,$8F,$8A,$0C;;:INDXJSR :LPARJSR :NXBYJSR :COMXJMP :RPAR;:INDYJSR :LPARJSR :NXBYJSR :RPAR }JMP :COMY;:IMMLDA # 3; #STA (:DINDIR),YINYEJECTLDA #$80;DONT DECODE MENM FOR IMM.STA :DNCKJMP :NXBY;:ZXL }DA :ITEMPCMP #$96;CK IF EXCEPTIONBEQ :ZYCMP #$B6BEQ :ZYJSR :NXBYJMP :COMX;:ZYJSR :NXBYJMP :COMY;:INDJSR !}:LPARJSR :NXADJMP :RPAR;:ACCLDA # 33; ASTA (:DINDIR),YINYRTS;:ABSXLDA :ITEMPCMP #$BEBEQ :ABSYJSR :NXAD "}ǛJMP :COMX;:ABSYJSR :NXADJMP :COMY;:ABSJMP :NXAD;:ZJMP :NXBY;:IMPRTS;:RELLDA #$80STA :DNCKJSR :NXBYLD #}Y #1;NOW SHOW COMPUTED OFFSETLDA (:DNDR2),YPHALDY #15AND #$80BMI :RELBKLDA #93STA (:DINDIR),YLDY #0:REL0P $}LACLCADC :DNDR2STA :STEMPTYAADC :DNDR2+1STA :STEMP+1AIW #2,:STEMPLDA :STEMP+1LDY #16JSR :SHHEXLDA :STEM %}PJMP :SHHEX;:RELBKLDA #92STA (:DINDIR),YLDY #$FFBNE :REL0;;:LPARLDA # 8;(STA (:DINDIR),YINYRTS;:RPAR &}LDA # 9; )STA (:DINDIR),YINYRTS;:COMXJSR :COMLDA # 56; XSTA (:DINDIR),YINYRTS;:COMYJSR :COMLDA # 57 '}; YSTA (:DINDIR),YINYRTS;:NXBYTYATAXLDY #1LDA (:DNDR2),YPHATXATAYPLAJSR :CKBY;CK IF IN SYM TABBC (}C :NXBY1RTS:NXBY1JMP :SHHEX;:NXADTYATAXLDY #1LDA (:DNDR2),YSTA :STEMP;PUT IN SHOW TEMP LOCATIONINYLDA (:D )}NDR2),YSTA :STEMP+1PHATXATAYPLAJSR :MNAD;CK IF ADD IS IN SYM TABBCC :NXAD1RTS:NXAD1LDX #$80STX :DNCK;SE *}T DONT CK FLAGJSR :SHHEXJMP :NXBY;:COMLDA # 12; ,STA (:DINDIR),YINYRTS;;:CKBYBIT :DNCK;CK IF FLAG SETBPL +} :CKBY1CLC;CLEAR CARRY AS SIGNALRTS:CKBY1STA :STEMP;SET TO 0LDX #0STX :STEMP+1:MNADPHALDA :NMSYM;MAKE SURE ,}IT'S NOT EMPTYBEQ :MNAD2STA :TBYT2;SAVE AS COUNTERLDA # LOW :SSYMTADD #6STA :MNRM+1;SET UP X-INDIRECT POINTERLD -}A # HIGH :SSYMTADC #0STA :MNRM+2:MNAD0LDX #0LDA :STEMP:MNRMCMP :MNRM,X;CK 1ST BYTE (NOTE : THE ADD PORTION WILL CH .}ANGE)BNE :MNAD1CPX #0BNE :MNAD3;OK , SO BYTES CK AND X=1INXLDA :STEMP+1JMP :MNRM;;:MNAD1DEC :TBYT2;ANY SYMB /}OLS LEFTBEQ :MNAD2AIW #9,:MNRM+1JMP :MNAD0;:MNAD2CLC;PREPARE FOR EXIT, AND SHOW FAILUREPLARTS;:MNAD3LDA :MN 0}GRM+1SUB #6STA :MNRM2+1;AND PREPARE NEXT X-INDIRECTLDA :MNRM+2SBC #0STA :MNRM2+2LDX #0:MNRM2LDA :MNRM2,X;GET C 1}1nHARACTER (MODIFIED ADDRESS)JSR :INTREPSTA (:DINDIR),YINYINXCPX #6BNE :MNRM2SECPLARTS;;;;t THIS IS T 2}HE MNEMONIC TABLE;:MNETABDB'BRKPHPBPLCLCJSRPLPBMISECRTIPHABVCCLIRTSPLABVSSEI'DB'???DEYBCCTYALDYTAYBCSCLVCPYINYBNECLDCP 3}XINXBEQSED'DB'ADCANDASLBITCMPCPXCPYDECDEXEORINCJMPLDALDXLDYLSR'DB'NOPORAROLRORSBCSTASTXSTYTAXTSXTXATXS'DB'ASLLSRROLR 4}/ORSTXSTY'EJECTSUBTTL'COMMAND INTERPRETER'O***THIS SECTION DEALS WITH* THE COMMAND IN 5}TERPRETER*:GETCHLDA :CHCMP #255;CK IF KEY PRESSEDBEQ :GETCHPHAMVB #255,:CHPLALDX #15:GETC0CMP :KEYCD,X;CK 6}IF IN KEY CODE TABLEBEQ :GETC2DEXBPL :GETC0LDX #2;CK IF IN DELIMITER TABLE:GETC3CMP :DELCD,XBEQ :GETC4DEXBP 7}L :GETC3CMP #52;CK IF DELETEBNE :GETCHLDA #0;SET DELETE INDICATORSEC;SET CONTROL FLAGBCS :GETC7;:GETC2TXA 8}ǛADD #16;CONVERT TO HEXCMP #26BLT :GETC7ADD #7BNE :GETC7:GETC4SEC;SET DELIMITER FLAG:GETC7JMP :CLICK;CLICK 9}X;:KEYCDDB50,31,30,26,24,29,27,51,53,48DB63,21,18,58,42,56:DELCDDB33,32,12;;y**C :}LEAR THE COMMAND BUFFER*:CLRCMDJSR :SETPULDY #12;NUM. OF SPACES TO CLEARLDA #0:CLRC1STA (:DINDIR),YDEYBNE :CLR ;}1C1LDA #$80STA (:DINDIR),YSTY :CHCOLRTS;V***:ONLIST * THIS ROUTINE TESTS IF <} A CHARACTER IS * ON THE APPROVED DDT LIST*:ONLISTLDX #13;NUM OF VALUES TO TRY:ONLI1CMP :KEYTB,X;CK VALUEBEQ :ONLI =}2DEX;IF NOT IT, GET READY FOR NEXTBPL :ONLI1SECMVB #255,:CHRTS;:ONLI2LDA :CMDCD,X;GET THE INTERNAL REP.PHA >}TXAASL ATAXLDA :KEYRU,XSTA :DNDR2LDA :KEYRU+1,XSTA :DNDR2+1JSR :CLICK;CLICKMVB #255,:CHPLACLCRTS;:K ?}jEYTBDB42,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*:PUTCHPHAJSR :SETPULDY :CHCOLPLASTA (:DINDIR),YINYLDA #$80STA (:DINDIR),YSTY : A} CHCOLRTS;-**:SETPULDA #LOW [:DSCRN+107];SET UP POINTER TO BUFFERSTA :DINDIRLDA # HI B}GGH [:DSCRN+107]STA :DINDIR+1RTS;;:KEYRUDW :EXAM,:CONT,:GO,:STBRK,:REGIS,:DEPOSDW :PULLWI,:INTERP,:CHWIN,:TRAP,:SPU C}CLDDW :PUSHW,:SPSHW,:SERCH;;@*B;H THIS ROUTINE PULLS THE MEMORY WINDOW DOWN;:PULLWIL D}DA :WINDFCMP #2BNE :PULL1INW :EXAMWIMVB #0,:QFLAGJSR :CLRSKLDA :EXAMWIAND #3BEQ :PULL3INC :QFLAGBNE :PULL E}3:PULL1MVW :EXAMWI,:DNDR2LDY #0LDA (:DNDR2),YBNE :PULL2JSR :BRINS:PULL2JSR :DETLENPHAJSR :PUSHSPLAADD :EX F}PAMWISTA :EXAMWIBCC :PULL3INC :EXAMWI+1:PULL3JSR :DWINDJMP :DBND5;;;k*; THIS ROUTINE G}PULLS THE WINDOW; DOWN, A SCREEN AT A TIME:SPULDLDA :WINDFCMP #2BNE :SPLD1MVB #0,:QFLAGJSR :CLRSKLDA :EXAMWI H}pAND #$FC;MASK OFF BITS 0 & 1ADD #44STA :EXAMWIBCC :SPLD0INC :EXAMWI+1:SPLD0JSR :DWINDJMP :DBND5;;t THIS SECT I}ION HANDLES THE DISASSEMBLY FILTER;:SPLD1LDA #12STA :TBYTE:SPLD2MVW :EXAMWI,:DINDIRLDY #0LDA (:DINDIR),YJSR :DET J}LENSTA :ITEMPLDA :TBYTE;GET NUM. OF SCREEN LINES LEFTSUB :ITEMP;AND SUBTRACT THIS INSTR. SIZEBMI :SPLD0STA :TBYTE K}:LDA :ITEMPJSR :PUSHSAIW :ITEMP,:EXAMWIJMP :SPLD2;]*;;THIS ROUTINE PUSHES THE; L}WINDOW UP:PUSHWLDA :WINDFCMP #2BNE :PUSH1LDA :EXAMWIBNE :PUSH0DEC :EXAMWI+1:PUSH0DEC :EXAMWIMVB #0,:QFLAGJS M}R :CLRSKLDA :EXAMWIAND #3CMP #3BEQ :PUSH3INC :QFLAGBNE :PUSH3:PUSH1JSR :PULLS;RETURNS LAST PULL SIZEBCS :PUS N}DH3+3STA :ITEMPSDW :ITEMP,:EXAMWI:PUSH3JSR :DWINDJMP :DBND5;g*;;THIS ROUTINE PUSH O}ES THE; WINDOW UP A SCREEN AT A TIME:SPSHWLDA :WINDFCMP #2BNE :SPSH1LDA #0STA :QFLAGJSR :CLRSKLDA :EXAMWIAN P}nD #$FC;MASK OFF BITS 0 & 1SUB #44STA :EXAMWIBCS :SPSH0DEC :EXAMWI+1:SPSH0JSR :DWINDJMP :DBND5;;r THIS SECTIO Q}N HANDLES THE DISASSEMBLY FILTER;:SPSH1LDA #12STA :TBYTE:SPSH2JSR :PULLSBCS :SPSH0STA :ITEMPLDA :TBYTE;GET NUM. R} OF SCREEN LINES LEFTSUB :ITEMP;AND SUBTRACT THIS INSTR. SIZEBPL :SPSH3LDA :ITEMPJSR :PUSHSJMP :SPSH0:SPSH3STA : S})TBYTESDW :ITEMP,:EXAMWIJMP :SPSH2;;J*L;P THIS IS THE WINDOW STACK SECTION;:CLRSKMVB T}G #0,:BOTSKSTA :TOPSKSTA :PACKFRTS;;:PULLSLDA :PACKF;CHECK IF STACK EMPTYBNE :PULS1SEC;IF SO, SIGNAL ERRORR U}UTS;:PULS1TAY;SET PACK NUMBER IN YLDX :TOPSKDEYBNE :PULS0CPX :BOTSK;FIRST CHECK IF AT BOTTOM OF STACKBNE :PULS V}6STY :PACKFSECRTS;:PULS6DEXTXAAND #$3FSTA :TOPSKTAXLDY #4:PULS0STY :PACKFLDA :STACK,X:PULS3DEYBEQ W}:PULS4LSR ALSR ABPL :PULS3:PULS4AND #3CLCRTS;;:PUSHSLDX #3STX :TBYT2LDX :PACKFBNE :PSHS1INXINC :PAC X}KF:PSHS1DEXBEQ :PSHS3:PSHS2ASL AASL AASL :TBYT2ASL :TBYT2DEXBNE :PSHS2:PSHS3LDX :TOPSKEOR :STACK,XAND : Y}TBYT2EOR :STACK,XSTA :STACK,XLDA :PACKFADD #1CMP #5BEQ :PSHS4STA :PACKFRTS:PSHS4MVB #1,:PACKFLDA :TOPSK Z}ADD #1AND #$3FSTA :TOPSKLDA :BOTSKCMP :TOPSKBNE :PSHS5ADD #1AND #$3FSTA :BOTSK:PSHS5RTS;;:STACKDS64;* [}!*; THIS ROUTINE TURNS THE INTERPRETIVE FLAG ON:INTERPINC :SSFLAGMVB #1,:WINDFMVB :CR \}SINH,:CRSTATJMP :DBND5;;;:CONTINC :CONTFL;TURN CONTINUE FLAG ONMVW :PCSAV,:CONTADJMP :SSTEP;;:CONTRTDEC :CONT ]}FLBNE :CONT2;CK IF NORMAL EXITMVW :CONTAD,:BTEMPLDA #0JSR :SETBPJMP :DCONT;:CONT2DEC :CONTFLJMP :DCONT;;** ^}!** :EXAM (EXAMINE)*:EXAMLDA #0;SPACE OVER 1 CHAR.STA :QFLAG;CLEAR QUIT FLAGJSR _}:GTADDBCS :EXAM1;CK IF NULL ADDRESSMVW :HEXVAL,:EXAMWI;MOVE ADDRESS TO EXAM WINDOWJSR :CLRSK;CLEAR PULL STACKJSR `}):DWIND;SHOW WINDOW:EXAM1JMP :DBND5;M**:GETVAL (GET VALUE)*:GETVALLDA #0STA :C a}C;SET CHAR. COUNTER TO 0:GTV1JSR :GETCH;GET CHAR.BCS :DELIM;IF DELIMITERTAXTEQ :CC,:FSIZE,:GTV1TXAJSR :PUTCH b};PUT CHAR ON SCREENINC :CC;INCREMENT CHAR. COUNTJMP :GTV1;:DELIMCMP #0BEQ :DELI2RTS;:DELI2LDA :CCBNE :DELI3 c}ǛPLA;CLEAR RTS VALUEPLAPLAPLAJMP :DBND5:DELI3DEC :CCLDA #0LDY :CHCOLSTA (:DINDIR),YDEYLDA #$80STA (: d}$DINDIR),YDEC :CHCOLJMP :GTV1;E**SUBROUTINE :GTADD (GET ADDRESS)*:GTADDJSR :PUTCH e}RLDA #4STA :FSIZE;SET FIELD SIZEJSR :GETVAL;GET ADDRESS VALUEJMP :CONVRT;t**:CONVR f}GT (CONVERT ATASCII TO HEX)*:CONVRTLDA :CCBNE :CONV2SECRTS;THIS FLAGS NULL VALUE:CONV2LDA :CHCOLSUB :CCTAYJ g}gSR :SETPU;SET POINTERMVB #0,:HEXVALSTA :HEXVAL+1:CONV4JSR :GTHX;GET HEX VALUEPHAINY;SET Y TO NEXT CHARACTERJS q}`dB'DOS SYSB*+DUP (SYSB4UDDT- MACB DDTLST MACB SHELL MACBSHELL1 MACBSHELL2 MACBSHELL3 MACC;BPSEUDO MACBSHELL4 MACBBASPSU MACBPSEUDO@ B2SHELL4 OBJB1PSHELL1 OBJB1AUTORUN SYSBDISKNAMEDATqR :ROTVPLAORA :HEXVALSTA :HEXVALDEC :CCBNE :CONV4CLCRTS;:GTHXLDA (:DINDIR),YCMP #$20BLT :GTH1ADD #9:G r}^TH1AND #$0FRTS;;:ROTVLDX #4:ROTV1ASL :HEXVALROL :HEXVAL+1DEXBNE :ROTV1RTS;z** s}ySUBROUTINE :GO*:GOLDA #0JSR :GTADD;GET ADDRESS VALUEBCC :GO1JMP :DBND5:GO1MVW :HEXVAL,:PCSAVJMP :DCONT;;}* t}**SUBROUTINE DEPOSIT*:DEPOSMVW :EXAMWI,:DNDR2;SET UP INDIRECT POINTERMVB #0,:DEPSW:DEPXXLDA # u}0;EXTERNAL ENTRY POINTSTA :QFLAGJSR :GTSTR;GET HEX STRINGSDB :CC,:CHCOLMVB :CC,:TBYTELSR A;COMPUTE STRING SIZE v}ǛADC #0STA :SSSIZ:DEPO0LDA :TBYTESUB #2BMI :DEPO2STA :TBYTEMVB #2,:CC:DEPO4ADD :CHCOLSTA :CHCOLJSR :CONVRT w}ǛLDY #0STA (:DNDR2),YINW :DNDR2JMP :DEPO0;:DEPO2ADD #1BMI :DEPO3STA :TBYTEMVB #1,:CCBNE :DEPO4;:DEPO3LDA x}C: :DEPSWBEQ :DEPO5RTS:DEPO5JSR :SSCRNJMP :DBND5;;Y**SUBROUTINE :SERCH*:SERCHLDA # y}yLOW :SSTRSTA :DNDR2LDA # HIGH :SSTRSTA :DNDR2+1MVB #1,:DEPSWJSR :DEPXXLDA :EXAMWIADD #1STA :DINDIRLDA :EXAM z}WI+1ADC #0STA :DINDIR+1:SER1JSR :SMTCHBCS :SFNDINW :DINDIRLDA :DINDIR+1CMP #$C0:SER2BNE :SER1JMP :DBND5;: {}SFNDMVW :DINDIR,:EXAMWIMVB #0,:QFLAGJSR :SSCRNJMP :DBND5;;:SMTCHLDY #0:SMT2LDA :SSTR,YCMP (:DINDIR),YBNE :SM |}:NOINYCPY :SSSIZBMI :SMT2SECRTS;:SMNOCLCRTSZ**SUBROUTINE :STBRK (SET BREAKPOIN }}T)*:STBRKLDA #0JSR :GTBYT;GET VALUEBCS :STBR6LDA :HEXVALBEQ :STBR6CMP #7BGE :STBR6PHA;SAVE BRKP #LDA #1 ~}2;FOR ,JSR :GTADDBCC :STBR4PLASTA :TBYTE;SO RESTORE OLD BRKPASL AADC :TBYTE;MULTIPLY X 3TAXLDA :BRKP0,X }STA :BTEMPLDA :BRKP0+1,XSTA :BTEMP+1JSR :RESTORJMP :STBR5:STBR4MVW :HEXVAL,:BTEMP;MOVE BRK LOCATION TO :BTEMPPLA }G;GET BRKP # BACKJSR :SETBP:STBR5JSR :SSCRN:STBR6JMP :DBND5;;c**SUBROUTINE :GTBYT (GET }KBYTE)*:GTBYTJSR :PUTCHLDA #2STA :FSIZEJSR :GETVALJMP :CONVRT;;l**SUBROUTINE :GT }GSTR (GET STRING)*:GTSTRJSR :PUTCHLDA #10STA :FSIZEJMP :GETVALd**ROUTINE :REGIS (REGIST }ER CHANGE)*:REGISLDA #0STA :CCJSR :PUTCH;SPACE OVER:REG1LDA :CHCMP #255BEQ :REG1PHAMVB #255,:CHPLALDX # }2:REG11CMP :DELCD,XBEQ :REG5DEXBPL :REG11CMP #52;?DELETEBEQ :RDELTAXLDA :CCBNE :RTWO;ALREADY TYPED ONE C }HAR.TXALDX #4:REG2CMP :REGTB,X;CK IF CHAC. IN TABLEBEQ :REG3DEXBPL :REG2BMI :REGBK;:REG3STX :PFLAG:REG4LD }A :REGCD,XJSR :CLICKJSR :PUTCHINC :CCBNE :REG1;:RTWOCPX #18;IS IS A CBNE :REG1LDA :PFLAGCMP #1;HAS P BEE }N TYPEDBNE :REG1LDA #$80STA :PFLAGLDX #5BNE :REG4;:REG5LDA :CCBEQ :REGBKJSR :CLICKLDA #12;LOAD WITH VALU }E FOR ,BIT :PFLAGBMI :REG6JSR :GTBYTBCS :REGBKLDA :HEXVALLDX :PFLAGSTA :ASAV,XBCC :REG9;:REG6JSR :GTADDB }CS :REGBKMVW :HEXVAL,:PCSAV:REG9JSR :SHSTATJSR :SHSTK:REGBKJMP :DBND5;:RDELLDA :CCBEQ :REGBKJSR :CLICKDEC :C }GCBEQ :RDEL2LDA #1STA :PFLAG;INDICATE ONLY P TYPED:RDEL2LDA #0LDY :CHCOLSTA (:DINDIR),YDEYLDA #$80STA (:DIN }UDIR),YDEC :CHCOLJMP :REG1:REGTBDB63,10,22,43,62:REGCDDB33,48,56,57,51,35;t**ROUTIN }E :CHWIN (CHANGE WINDOW)*:CHWINLDX :WINDFINXCPX #3BMI :CHWN2LDX #0:CHWN2STX :WINDFLDA #0STA :QFLAG;CLEAR QU }"IT FLAGJSR :DWINDJMP :DBND5;G*I*N ROUTINE :TRAP; (TRAP INTERPRETIVE MODE)*:TRA }PLDA #0JSR :GTBYTBCS :TRAP2LDA :HEXVALBEQ :TRAP2CMP #3BGE :TRAP2LSR ABEQ :TRAP4LDA #3:TRAP4PHALDA #12 }JSR :GTADDBCC :TRAP0PLA TAXLDA #0STA :TADD,XSTA :TADD+1,XLDA :TADDORA :TADD+1BNE :TRAP5LDA :TADD+3ORA } :TADD+4BNE :TRAP5:TRAP1STA :TFLAG:TRAP5JSR :SSCRN:TRAP2JMP :DBND5:TRAP0PLATAXLDA :HEXVALSTA :TADD,XLDA :HE }XVAL+1STA :TADD+1,XLDA #1BNE :TRAP1:CKBY1STA :STEMP;SET TO 0LDX #0STX :STEMP+1:MNADPHALDA :NMSYM;MAKE SURE *E ;EJECT,***THIS IS THE DATA AND INITIAL * SETUP FOR THE DDT TEXT SCREEN:DDTLSTDB1 }12,112,112,66DW:DSCNTBDB2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,65DW:DDTLST:DSCNTBDB128,172,175,163,128,182 },161,172,128,169,174,179DB180,178,181,163,180,169,175,174,128,128,128,252DB179,180,171,252,128,182,161,178,142,128,252, }182DB161,172,181,165DS600DB162,171,176,145,252,162,171,176,146,252,162,171,176,147,252DB162,171,176,148,252,162,1 }71,176,149,252,162,171,176,150,252,180,178,176,145,252DB180,178,176,146,128DS120:DSCRNDB128,176,163,128,252,161,163, }163,252,174,182DB128,162,164,169,186,163,252,184,128,252DB185,128,252,179,176,252DB128,128,128,163,175,173,173DB1 }61,174,164,128,128,128DB0,0,0,0,124,0,0,0,124,0,0,0,0,0,0,0,0,124,0,0,124DB0,0,124,0,0,124,0,0,0,0,0,0,0,0,0,0,0,0,0D }B0,0,0,0,124,0,0,0,124,0,0,0,0,0,0,0,0,124,0,0,124DB0,0,124,0,0,124,0,0,0,0,0,0,0,0,0,0,0,0,0DB0,0,0,0,124,0,0,0,124,0 },0,0,0,0,0,0,0,124,0,0,124DB0,0,124,0,0,124,0,0,0,0,0,0,0,0,0,0,0,0,0;EJECTSETUP FOR THE DDT TEXT SCREEN:DDTLSTDB1 S%**** THIS IS THE GENERAL SHELL PROGRAM** YOU SHOULD ASSEMBLE THIS PROGRAM* TO }ATTACH YOUR TEST PROGRAM* TO THE DEBUGGING SYSTEM.** REFER TO THE DDT DOCUMENTATION* FOR INSTRUCTIONS ON CUSTOMIZIN}8G* THIS PROGRAM FOR YOUR PARTICULAR* NEEDS.***]*e****r STEP 1** } FIRST YOU HAVE TO DECIDE WHERE* DDT AND YOUR CODE WILL RESIDE.** ONE CHOICE IS TO LET DDT SIT* RIGHT ON TOP OF DO}S, AND IN A* SENSE, BE AN EXTENSION OF IT.** IN THIS CASE THE ORG STATEMENT* SETS DDT TO BEGIN RIGHT WHERE* DOS }STOPS. NOTE THIS IS THE * STANDARD 2 DISK DRIVE DOS* CONFIGURATION.** IF YOU HAVE SPECIAL CONDITIONS* (FEWER DIS}bK DRIVE BUFFERS, THE* 850 ON, ... ) THEN CHANGE THE* ORG TO SUIT YOUR TASTE.*ORG $1CFC*}*} ***STEP 2** NOW YOU HAVE TO MAKE SURE THE* DDT CODE IS ASSEMBLED.* HERE, IT IS ASSUMED THAT ALL* THE}G NECESSARY FILES ARE LOCATED* ON DRIVE 1.** YOU CAN CHANGE THE FILE* DESIGNATORS HOWEVER, TO FIT* YOUR DEVELOPME}0NT SYSTEM.*PROCDDT=*INCLUDE D:DDT.MAC*U***STEP 3** THE NEXT FILE IS THE D}ISPLAY LIST* AND SCREEN AREA FOR DDT.** THIS CODE TAKES UP JUST UNDER 1 K* OF MEMORY SPACE, AND HAS SOME* BOUNDA}RY CROSSING RESTRICTIONS.** NOTE THAT THE FOLLOWING ORG* STATEMENT ASSURES THAT THE DISPLAY* LIST DOES NOT CROSS A }1K BOUNDARY* AND THAT THE SCREEN MEMORY DOES* NOT CROSS A 4K BOUNDARY.** IF YOU WANT TO MOVE THE SCREEN* FOR ANY} REASON, MODIFY THIS* STATEMENT.** NOTE ALSO THAT THE ICODE LABEL* IS USED TO DEFINE A SPOT TO * STORE INITIALIZ}1ATION CODE.* 9 BYTES ARE SAVED FOR THIS*IF 8[VHIGH *]/4]+1]*1024]-*]<33] OR \[HIGH *]/8]+1]*1024]-*]<993]]ORG}R [[[HIGH *]/4]+1]*1024ENDIF*INCLUDE D:DDTLST.MACEPROCICODE= *ORG *+9*w***S}TEP 4** THE DDT INITIALIZATION CODE SETS* UP A ROUTINE THAT MODIFIES THE* MEMLO POINTER WHENEVER THE RESET* BUTT}ON IS PRESSED.** NORMALLY THIS IS USED TO "HIDE"* THE DDT CODE, AND MAKE THE FREE* MEMORY AREA START JUST AFTER DDT}Ǜ** TO MODIFY THIS SET UP YOU WILL* HAVE TO DEFINE AN ECODE VALUE TO* BE PLACED IN THE MEMLO POINTER.** ONE SUGG}ESTION WOULD BE TO SIMPLY* PUT THE NORMAL VALUE THAT WOULD * BE THERE ANYWAY.** FOR INSTANCE IN THE STANDARD DOS* }C CONFIGURATION, YOU MIGHT PUT* ECODE = $1CFC*ECODE=**h***STEP 5** NOW}s YOU HAVE TO ATTACH YOUR OWN* CODE. A COUPLE OF THINGS SHOULD* BE NOTED.** 1. YOU SHOULD REMOVE ANY ORG*y STAT}EMENTS FROM YOUR CODE* 3AND PLACE THEM HERE.*9 UWITH NO NEW ORG STATEMENT,*[ vYOUR CODE WILL FOLLOW THE*| D}DT CODE. CURRENTLY THAT* =MEANS YOUR CODE WOULD START*C xAROUND $3715** 2. REMOVE ANY END STATEMENT FROM*} } YOUR PROGRAM. IF NOT, IT WILL*& gDEFINITELY SCREW THINGS UP.*ORGYOURORGINCLUDE D:YOURPROG*}*}***STEP 6** IF YOU WANT TO DEFINE A MINI* SYMBOL TABLE, THIS IS THE SPOT.* THE ORG STATEMENT SHOUL}CiD SET THE* ORG TO WHEREEVER DDT IS +3** RECALL THAT EACH SYMBOL NEEDS TO* BE DEFINED LIKE :**n DB 'SYMBOL' ;}6 CHARACTERS* 3DW SYMBOL ;SYMBOL LOCATION*8 >DB 1F b;A 1 OR 2*ORG DDT+3DB'h x'DW0DB1*}*} ***STEP 7* NOW YOU HAVE TO TELL THE SYSTEM* WHERE TO GO TO RUN THE CODE** THE STR}UCTURE WE HAVE HERE WILL* INITIALIZE DDT, CALL DDT TO* ALLOW YOU TO SET UP INITIAL * BREAKPOINTS, AND THEN JUMP TO*} THE START OF YOUR CODE.* % 0ORG ICODE7 RJSR DDTI ;INITIALIZE DDTY `JSR DDTd o;ENTER DDTv JMP YOU})RORG ;AND RUN YOUR CODE**ENDICODE*N*** YOU SHOULD ASSEMBLE THIS PROGRAM* TO O LIST L,I,-M2**** THIS IS THE DOS STAND-ALONE SHELL** IT IS DESIGNED FOR EXPERIMEN}=TING* WITH DDT AND EXPLORING THE 800* OPERATING SYSTEM*b*f**s STEP 1**} DDT SITS RIGHT ON TOP OF DOS** IN THIS CASE THE ORG STATEMENT* SETS DDT TO BEGIN RIGHT WHERE* DOS STOPS. NOTE TH}:IS IS THE * STANDARD DOS CONFIGURATION.*ORG $1CFC*_***STEP 2** THIS ATTACHES}* DDT*PROCDDT=*INCLUDE D:DDT.MAC*O***STEP 3** THE NEXT FILE IS THE DISPLAY}) LIST* AND SCREEN AREA FOR DDT.*IF 0[NHIGH *]/4]+1]*1024]-*]<33] OR T[HIGH *]/8]+1]*1024]-*]<993]]ORG [[[HIGH}J *]/4]+1]*1024ENDIF*INCLUDE D:DDTLST.MACEPROCICODE= *ORG *+9*o***STEP 4*}* THE DDT INITIALIZATION CODE SETS* UP A ROUTINE THAT MODIFIES THE* MEMLO POINTER WHENEVER THE RESET* BUTTON IS PR}WESSED.** HERE WE JUST RESET THE POINTER TO* IT'S NORMAL VALUE*ECODE=$1CFC*|*}***STEP 5** NO STEP 5 IN THIS CASE*O***STEP 6** THIS SHELL SETS UP A MINI SY}MBOL* TABLE OF VARIABLES THAT THE* OPERATING SYSTEMS USES IN * CONTROLLING THE SYSTEM.** REFER TO DE RE ATARI MO}RE * INFORMATION ON THESE VARIABLES.ORG DDT+3DB'RAMSIZ'DW$2E4DB1DB'MEMLO 'DW$2E7DB2DB'MEMTOP'DW$}G2E5DB2DB'SDLST 'DW$230DB2DB'SAVMSC'DW$58DB2DB'TXTMSC'DW$294DB2DB'CHART 'DW$2F3DB1DB}'CHBAS 'DW$2F4DB1DB'COLOR4'DW$2C8DB1DB'COLOR1'DW$2C5DB1DB'COLOR2'DW$2C6DB1DB'SDMCTL'DW}*$22FDB1DB'POKMSK'DW$10DB1*O***STEP 7* IN THIS CASE, WE WANT DDT TO*}X BE INITIALIZED THEN CALLED,* AND FINALLY, TO EXIT TO DOS* IF DBUG IS EXITED.*_ jORG ICODEq JSR DDTI ;}INITIALIZE DDT JSR DDT! ,;ENTER DDT3 FRTS*ENDICODE*k*NED FOR EXPERIMENl LIST L,I,-M2**** THIS IS THE BASIC LANGUAGE SHELL ** IT IS DESIGNED FOR EXAMINING}8 THE* FEATURES OF, AND DEBUGGING* BASIC PROGRAMS.*]*a**n STEP 1** DD}T SITS RIGHT ON TOP OF DOS.** IN THIS CASE THE ORG STATEMENT* SETS DDT TO BEGIN RIGHT WHERE* DOS STOPS. NOTE THIS I}6S THE * STANDARD DOS CONFIGURATION.*ORG $1CFC*[***STEP 2** THIS ATTACHES DD}(T.*PROCDDT=*INCLUDE D:DDT.MAC*M***STEP 3** THE NEXT FILE IS THE DISPLAY L})IST* AND SCREEN AREA FOR DDT.**IF 0[NHIGH *]/4]+1]*1024]-*]<33] OR T[HIGH *]/8]+1]*1024]-*]<993]]ORG [[[HIGH}5 *]/4]+1]*1024ENDIFINCLUDE D:DDTLST.MACEPROC*Z***STEP 4** THE DDT INITIALIZ}ATION CODE SETS* UP A ROUTINE THAT MODIFIES THE* MEMLO POINTER WHENEVER THE RESET* BUTTON IS PRESSED.** THIS IS }_USED TO "HIDE" THE DDT* CODE. THE FREE MEMORY AREA STARTS* JUST AFTER DDT.*ECODE=**}*}*2**STEP 5** NO STEP 5 IN THIS CASE*W***STEP 6** THIS SHELL SETS UP A} MINI SYMBOL* TABLE OF VARIABLES THAT BASIC* USES TO MANAGE MEMORY AND RUN* A PROGRAM.** REFER TO DE RE ATARI (T}HE CLASSIC* BEST SELLER) FOR MORE INFO ON* HOW BASIC WORKS INTERNALLY.*ORG DDT+3DB'LOMEM 'DW$80DB2DB'VNT}P 'DW$82DB2DB'VNTD 'DW$84DB2DB'VVTP 'DW$86DB2DB'STMTAB'DW$88DB2DB'STMCUR'DW$8ADB}G2DB'STARP 'DW$8CDB2DB'RUNSTK'DW$8EDB2DB'MEMTOP'DW$90DB2DB'HIMEM 'DW$2E5DB2DB'FR0-1 '}DW$D4DB2DB'FR0-2 'DW$D6DB2DB'FR0-3 'DW$D8DB2DB'SDLST 'DW$230DB2DB'SAVMSC'DW$58DB2**}$***STEP 7* IN THIS CASE, ALL WE WANT IS FOR* DDT TO BE INITIALIZED.* ENDDDTI}*'*(2**** THIS IS THE BASIC LANGUAGE SHELL ** IT IS DESIGNED FOR EXAMINING( LIST L,I,-M2**** THIS IS THE SHELL FOR DEBUGGING* AN ASSEMBLY LANGUAGE ROUTINE.*}%*)**6 STEP 1** DDT SITS RIGHT ON TOP OF DOS.** IN THIS CASE THE ORG S}TATEMENT* SETS DDT TO BEGIN RIGHT WHERE* DOS STOPS. NOTE THIS IS THE * STANDARD 2 DISK DRIVE DOS* CONFIGURATION.}*ORG $1CFC*4***STEP 2** THIS ATTACHES DDT.*PROCDDT=*INCLUDE D:DDT.MAC*}&***STEP 3** THE NEXT FILE IS THE DISPLAY LIST* AND SCREEN AREA FOR DDT.**I}F ['HIGH *]/4]+1]*1024]-*]<33] OR -[HIGH *]/8]+1]*1024]-*]<993]]ORG [[[HIGH *]/4]+1]*1024ENDIF*INCLUDE D:DDTL}#ST.MACEPROCICODE= *ORG *+9*H***STEP 4** THE DDT INITIALIZATION CODE SETS* } UP A ROUTINE THAT MODIFIES THE* MEMLO POINTER WHENEVER THE RESET* BUTTON IS PRESSED.** THIS IS USED TO "HIDE" THE}T DDT* CODE, AND MAKE THE FREE* MEMORY AREA START JUST AFTER DDT*ECODE=**y***}STEP 5**THIS ATTACHES THE PSEUDO TEST* ROUTINE*ORG$4000INCLUDE D:PSEUDO.MAC** NEXT WE HAVE A TRICK THAT ALLO}TWS* US TO BE ABLE TO LOCATE A PORTION* OF THE TEST CODE EASILY.LPRNDWPRN*y***}STEP 6**ORG DDT+3DB'DEGRAN'DWDEGRANDB1DB'RANNUM'DWRANNUMDB2DB'RANNM2'DWRANNUM+2DB2DB'UPPER}5 'DWUPPERDB1DB'VALUE 'DWVALUEDB1DB';.'DW0DB1DB'PSEUDO'DWPSEUDODB1DB'PRN 'DWPRN}DB1DB'LOOP 'DWLOOPDB1DB'TEST 'DWTESTDB1DB'SHIFT 'DWSHIFTDB1DB'GENONE'DWGENONEDB1DB'}C-2'DW0DB1DB'L PRN'DWLPRNDB2*W***STEP 7** HERE WE WANT TO INIT}IALIZE DDT,* JUMP TO DDT TO ALLOW INITIAL* SET UP OF BREAKPOINTS AND OTHER* VALUES, AND THEN JUMP TO* THE START }OF THE TEST ROUTINE.*  *ORG ICODE1 LJSR DDTI ;INITIALIZE DDTS ZJSR DDT^ i;ENTER DDTp JMP $4000 ;}#AND RUN YOUR CODE**ENDICODE*H*LL FOR DEBUGGING* AN ASSEMBLY LANGUAGE ROUTINE.*I$***THIS IS THE DRIVER FOR**TESTING THE PSEUDO SUBROUTINE*GETPSULDA #$16STA DEG!}RAN;THIS SETS THE 'DEGREE OF RANDOMNESS'LDA #$21;THIS IS THE INITIAL SEEDSTA RANNUMLDA #0;SET UPPER LIMIT COUNTER W!}ITH 0STA UPPERLOOPINC UPPER;INCREMENT UPPER LIMIT COUNTER BY 1JSR PSEUDO;NOW GET NUMBER LESS THAN OR EQUAL;TO THE!}; UPPER LIMITSTA VALUETESTJMP LOOP;AND GO DO IT AGAINT***SUBROUTINE PSEUDO** THIS ROUTINE !}IS USED TO GENERATE* A PSEUDO RANDOM NUMBER.** IT CALLS PRN SUCCESSIVELY TO GET* A STREAM OF RANDOM BITS.** THE VAL!}KUE IN UPPER* IS THE UPPER LIMIT DESIRED FOR* THE RANDOM NUMBER, WHERE*P 0<=NUMBER<=UPPER LIMIT<=255*** PSEUDO ALS!}O USES ANOTHER VALUE* DEGRAM , WHICH IS HOW MANY TIMES* PRN IS CALLED FOR RANDOM BITS.* THIS NUMBER REPRESENTS 'HOW RAN!}DOM'* THE GENERATED NUMBER WILL APPEAR TO BE**** LOCATIONS RANNUM-RANNUM+3 ARE USED* TO STORE THE INTERNAL 32 BIT !}RANDOM VALUE*** THIS IS THE SEED VALUE THAT SHOULD* BE INITIALIZED TO START OR RESTART* A SEQUENCE** THE ROUTI!}NE WORKS BY SUCCESSIVELY CALLING* THE PRN ROUTINE, WHICH EFFECTIVELY* GENERATES A PSEUDO RANDOM BIT.* EACH TIME THRO!}UGH THIS LOOP, A* RUNNING VALUE (WHICH WAS INITIALIZED* TO THE UPPER LIMIT DESIRED) IS SHIFTER* RIGHT, I.E. DIVIDED !}BY 2.* THE PSEUDO RANDOM BIT IS USED TO DECIDE* WHETHER OR NOT TO ADD THE ORIGINAL* UPPER LIMIT IN BEFORE SHIFTING.!}* THE RESULTING VALUE WHEN THIS PROCESS* HAS CONTINUED DEGRAN TIMES IS A VALUE THAT* MUST BE LESS THAN OR EQUAL TO T!}HE ORIGINAL* UPPER LIMIT, YET IS COMPOSED OF RNADOM* "BINARY FRAGMENTS" OF THE UPPER LIMIT**PSEUDOLDA UPPER;LOAD A!}GCC WITH UPPER LIMIT TO INITIALIZELDX DEGRAN;HOW MANY TIMES TO CALL PRNPLOOPTAYJSR PRN;PROCESS THE INTERNAL 32 BIT NU!}M.TYABCC SHIFT;CARRY INDICATED WHETHER TO ADD OR NOTCLCADC UPPERSHIFTROR A;DIVIDE BY 2DEXBNE PLOOPRTS;;!} ***SUBROUTINE PRN** THIS ROUTINE ROTATES LEFT THE INTERNAL* 32 BIT NUMBER, THEN SETS B"}IT 0* BASED ON EOR OF RANNUM+3 AND * RANNUMPRNASL RANNUMLDA RANNUM+1ROL ASTA RANNUM+1LDA RANNUM+2ROL ASTA R"}ANNUM+2LDA RANNUM+3ROL ASTA RANNUM+3EOR RANNUMBMI GENONE;IF MINUS ADD 1 AND SET THE CARRYCLCRTSGENONEINC RAN"}NUMSECRTS;;RANNUMDS4DEGRANDS1UPPERDS1VALUEDS1**TESTING THE PSEUDO SUBROUTINE*GETPSULDA #$16STA DEG @%**** THIS IS THE HYBRID LANGUAGE SHELL** IT IS DESIGNED FOR DEBUGGING* PROGRAMS &}.THAT COMBINE BASIC* AND ASSEMBLY LANGUAGE*S*W**d STEP 1** IN THIS CASE&} DDT SITS RIGHT ON* TOP OF THE FMS PORTION OF DOS,* AND THE PSEUDO CODE HAS BEEN* PLACED IN PAGE SIX.*ORG $1CFC*&}&*p**STEP 2** THIS ATTTACHES DDT*PROCDDT=*INCLUDE D:DDT.MAC*}*&}*o**STEP 3** THE NEXT FILE IS THE DISPLAY LIST* AND SCREEN AREA FOR DDT.*IF v[HIGH *]&}/4]+1]*1024]-*]<33] OR [HIGH *]/8]+1]*1024]-*]<993]]ORG [[[HIGH *]/4]+1]*1024ENDIF*INCLUDE D:DDTLST.MACEPROCIC& }ODE= *ORG *+9*8***STEP 4** THE DDT INITIALIZATION CODE SETS* UP A ROUTINE T& }HAT MODIFIES THE* MEMLO POINTER WHENEVER THE RESET* BUTTON IS PRESSED.** THIS IS USED TO "HIDE" THE DDT* CODE, A& }ND MAKE THE FREE* MEMORY AREA START JUST AFTER DDT** TO MODIFY THIS SET UP YOU WILL* HAVE TO DEFINE AN ECODE VALUE & }TO* BE PLACED IN THE MEMLO POINTER.** ONE SUGGESTION WOULD BE TO SIMPLY* PUT THE NORMAL VALUE THAT WOULD * BE TH& }xERE ANYWAY.** FOR INSTANCE IN THE STANDARD DOS* CONFIGURATION, YOU MIGHT PUT* ECODE = $1CFC*ECODE=**}*&} ***STEP 5** THIS ATTACHES THE PSEUDO CODE* AND THE LINK TO BASIC*ORG$600INCLUD&}C'E D:BASPSU.MACINCLUDE D:PSEUDO.MAC*L***STEP 6** THIS IS THE SAME MINISYMBOL TAB&}LE* AS IN SHELL3.MAC*ORG DDT+3DB'DEGRAN'DWDEGRANDB1DB'RANNUM'DWRANNUMDB2DB'RANNM2'DWRANNUM+2D&}CB2DB'UPPER 'DWUPPERDB1DB'VALUE 'DWVALUEDB1DB'I.'DW0DB1DB'PSEUDO'DWPSEUDODB1DB'PRN&} 'DWPRNDB1DB'LOOP 'DWLOOPDB1DB'TEST 'DWTESTDB1DB'SHIFT 'DWSHIFTDB1DB'GENONE'DWGENO&} NEDB1*0*m**STEP 7* HERE WE INITIALIZE DDT AND * THAT'S IT.*t ORG ICOD&}E $JSR DDTI ;INITIALIZE DDT+ @RTS**ENDICODE*e* DEBUGGING* PROGRAMS $f*!**% =THIS PROGRAM LINKS THE*A WPSEUDO RANDOM NUMBER*[ qGENERATOR TO BASIC**u TO RESET*} THE "SEED", USE* /A=USR(1536,SEEDVALUE)**3 QTO GENERATE A PSEUDO RANDDOM*U vNUMBER LESS THAN AN UPPER LIMIT*z A=U*}SR(1539,UPPERLIMIT)*JMP SETJMP GET**SETPLA;POP OFF NUMBER OF VARIABLESPLASTA RANNUM;SET THE LOWEST VALUE TO L*}OWER PARTPLASTA RANNUM+1;AND THE HIGH PART OF SEED ALSOLDA #0STA RANNUM+2STA RANNUM+3RTS**GETPLAPLAPLA*}q;THIS IS THE UPPER LIMITSTA UPPERJSR PSEUDOSTA $D4;RETURN VALUE TO BASICLDA # 0STA $D5RTS****u TO RESET(n(SANSANSWSEENUMBEUPPE1=@BCJKRVA6Z[ak;@o,  } .}y $$ THIS DEMONSTRATES THE PSEUDO RANDOM NUMBER GENERATOR(%  ! NEW SEED (Y OR N) %20Y@e}.}<!  ENTER NEW SEED : !>6-?:A6<,A$  ENTER UPPER LIMIT : $F/ + HOW MANY NUMBERS TO GENER.}ATE : /P- -@P%6-?:A9<,) - Z  DONE  @@TkD:PSEUDO;@o,  } ,e L}  ! $* -3 6< ?E HN QW Z` ci lr u{ 2}  45N  0 2x  7X`l2 }  l $tHH hhh@l `hhh8h2!}GXD ! . B6 1! 2"}"L&L/, L(L/)  L(, L(L& - -L `-l ԩ2#}HHH@  D(SΛo0ԭ1ԭ/) JJТ"`2$}o o01/ d! @" D(.0ԩ31ԢН "/2%}Ԣ"_"#b$%@ !` m#HHH !hhh2&}Ǎ` G!`` 8``v3'i(i(w2'} m& H hL!!"h (i(i л3| i(2(}5|i(3` m&Hȱȱ. ) )!i(i LH"2)}٩6 (γ & ( %"#%N3i)8LK$L#2*} # ) ) )k ( Z()/)) d)$ɀJJJL#ɢ- 2+}ǰ =) )i(ΰΡL#``#$ #)Ii #` i( #γ` #2,} ) )Hh )Ρ筰8Hh (Ρ`$ (i(i2-}cΡ`OPTION-SINGLE STEPS SELECT-TOGGLES SCREEN START $%-RETURNS TO CODE COMMANDS ARE :g E EXAMINE ADDRESS2.}C CONTINUE,LEAVE BRKPG GOTO ADDRESS B<#>, SET BREAKP.R<#>, CHANGE REG.D DEPOSIT HEX STR PULL WINDOW 2/}UP/DOWNI INTERPRETIVE MODE W TOGGLE DISP. WINDOWT<#>, SET T%&RAP S SEARCH HEX STR%%%󀤥20}"(,H3Hȑi(hhi )21}i(`3` ( 1'LR' &' Z(ʨ&'m'ʈ'H(L'22}ǎhX* D( ( D( @" L( D(L '(L&L''`D'`8`0PpLl @` 23}Gd'b'e'c'La'''''''''('''(' 6(L&ȱȱL&hihiL& 6(iHHΌΌL24}4&i &'''L&XmmL& !L()&hhhiL&ȱ`{ `25}<,ii`@` ))|(`@ G!``H)(h) 0 `8  @ ` ) )26}A`n6P ) )ȭ )ȭ %)ȭ )ȭ )ȭ )`HEJ )h)L))*ii` /)`Hh`H 27}hm+ Z)+ Z)+LZ) ( `=))D8`Ji `a!$ALF&f J*j28}`=*** ))))L)k*w*************+ ߔߖl 29}      $ `  + 8+ &+L + + 8+ +L/+ȩL8+ɖ ɶ 8+L&+ 8+L/+ + K+L +!2:}`ɾ K+L&+ K+L/+LK+L8+` 8+H)0/]heei )L+ , )\ϩ` ` o+82;}` o+9`Hh u+`L )ȱHh +` )L8+ `,`H=i+i+ݡ+ 2<}ǭL+γ+i ++L+h`+8++++ (8h`BRKPHPBPLCLCJSRPLPBMISECRTIPHA ,-BVCCLIRTSPLABVSSEI???DEY2=}BCCTYALDYTAYBCSCLVCPYINYBNECLDCPXINXBEQSEDADCANDASLBITCMPCPXCPYDECDEXEORINCJMPLDALDXLDYLSRNOPORAROLRORSBCSTASTXSTYTAXTSXTXATX2>}SASLLSRROLRORSTXSTYHh,-4ک8ii8L2350?:*8! s- -.` 2?}D- 8`R-H |-}- h`*=(: .-ON>%#'"2$])74]\\3H s-hȩ`م6`0/0120-/22-J..C2@}1 .),' ( Z(H '/hm "L .)i,.. "L 2A}ǡ Z(80؍ '/mL.!ΧΦ .) .8Χ "L2B} .)8,Χ "L  .8  '/L.8ΧL.`8`//2C}8`ʊ)?/JJ)` ]/-]//i`i)?i)?`/2D}Ǽ0LL&Τ LΤL e0 . "L ,ͭ `-2E}C L'0`hLάΥL'0 `- "0Ls08`8 s- 0H 0h ά` i )`.2F}F`01 e0LL 18Ji80m s0L1i0 2G}Ǎڭ` @"LDž 0ii 1L @"L08`` 1?:6H2H}ǩ e0h12 m !L1h @"L `- "0Ls0 `- L"0 `-Hh-?4q2I}ݹ20[2 `-меޭ1 ,0 1" e0 ( &L ά2J}ǷΥ2u3L2? +>!0893#0 "L 161-JH e0#h    @"Lh2K}pppBN3-A.3552L}3n6 77<||DN||||_d||lv||||}2M} ||!||||/|LLhh}h~`hhh Cԩ`!} CL7 2N}cYmj`}~*~**M}0`}8`jDEGRANRANNUM}RANNM2UPPER VALUE i.PSEUDOCPRN Y2O}6LOOP 7TEST @SHIFT TGENONEx77 `7< ?E HN QW Z` ci lr u{ 03 L}  ! $* -3 6< ?E HN QW Z` ci lr u{ 6Q}  45N  0 2x  X`l6R}  l $tHH hhh@l `hhh8h6S}XD ! . B6 1! 6T}L&L/, L(L/)  L(, L(L& - -L `-l ԩ6U}HHH@  D(SΛo0ԭ1ԭ/) JJТ"`6V}o o01/ d! @" D(.0ԩ31ԢН "/6W}GԢ"_"#b$%@ !` m#HHH !hhh6X}XǍ` G!`` 8``v3'i(i(w6Y} m& H hL!!"h (i(i л3| i(6Z}5|i(3` m&Hȱȱ. ) )!i(i LH"6[}٩6 (γ & ( %"#%N3i)8LK$L#6\} # ) ) )k ( Z()/)) d)$ɀJJJL#ɢ- 6]}ǰ =) )i(ΰΡL#``#$ #)Ii #` i( #γ` #6^} ) )Hh )Ρ筰8Hh (Ρ`$ (i(i6_}E_cΡ`OPTION-SINGLE STEPS SELECT-TOGGLES SCREEN START $%-RETURNS TO CODE COMMANDS ARE :g E EXAMINE ADDRESS6`}C CONTINUE,LEAVE BRKPG GOTO ADDRESS B<#>, SET BREAKP.R<#>, CHANGE REG.D DEPOSIT HEX STR PULL WINDOW 6a}UP/DOWNI INTERPRETIVE MODE W TOGGLE DISP. WINDOWT<#>, SET T%&RAP S SEARCH HEX STR%%%󀤥6b}"(,H3Hȑi(hhi )6c}i(`3` ( 1'LR' &' Z(ʨ&'m'ʈ'H(L'6d}ǎhX* D( ( D( @" L( D(L '(L&L''`D'`8`0PpLl @` 6e}d'b'e'c'La'''''''''('''(' 6(L&ȱȱL&hihiL& 6(iHHΌΌL6f}&i &'''L&XmmL& !L()&hhhiL&ȱ`{ `6g}<,ii`@` ))|(`@ G!``H)(h) 0 `8  @ ` ) )6h}A`n6P ) )ȭ )ȭ %)ȭ )ȭ )ȭ )`HEJ )h)L))*ii` /)`Hh`H 6i}hm+ Z)+ Z)+LZ) ( `=))D8`Ji `a!$ALF&f J*j6j}`=*** ))))L)k*w*************+ ߔߖl 6k}      $ `  + 8+ &+L + + 8+ +L/+ȩL8+ɖ ɶ 8+L&+ 8+L/+ + K+L +!6l}`ɾ K+L&+ K+L/+LK+L8+` 8+H)0/]heei )L+ , )\ϩ` ` o+86m}` o+9`Hh u+`L )ȱHh +` )L8+ `,`H=i+i+ݡ+ 6n}ǭL+γ+i ++L+h`+8++++ (8h`BRKPHPBPLCLCJSRPLPBMISECRTIPHA ,-BVCCLIRTSPLABVSSEI???DEY6o}BCCTYALDYTAYBCSCLVCPYINYBNECLDCPXINXBEQSEDADCANDASLBITCMPCPXCPYDECDEXEORINCJMPLDALDXLDYLSRNOPORAROLRORSBCSTASTXSTYTAXTSXTXATX6p}GSASLLSRROLRORSTXSTYHh,-4ک8ii8L2350?:*8! s- -.` 6q}qD- 8`R-H |-}- h`*=(: .-ON>%#'"2$])74]\\3H s-hȩ`م6`0/0120-/22-J..C6r}1 .),' ( Z(H '/hm "L .)i,.. "L 6s}ǡ Z(80؍ '/mL.!ΧΦ .) .8Χ "L6t} .)8,Χ "L  .8  '/L.8ΧL.`8`//6u}8`ʊ)?/JJ)` ]/-]//i`i)?i)?`/6v}Ǽ0LL&Τ LΤL e0 . "L ,ͭ `-6w} L'0`hLάΥL'0 `- "0Ls08`8 s- 0H 0h ά` i )`.6x}`01 e0LL 18Ji80m s0L1i0 6y}Ǎڭ` @"LDž 0ii 1L @"L08`` 1?:6H6z}ǩ e0h12 m !L1h @"L `- "0Ls0 `- L"0 `-Hh-?4q6{}ݹ20[2 `-меޭ1 ,0 1" e0 ( &L ά6|}ǷΥ2u3L2? +>!0893#0 "L 161-JH e0#h    @"Lh6}}pppBN3-A.3556~}3n6 77<||DN||||_d||lv||||}6} ||!||||.sRAMSIZMEMLO MEMTOPSDLST 0SAVMSCXTXTMSCCHART CHBAS COL6}?OR4COLOR1COLOR2SDMCTL/POKMSK77  `7 E HN QW Z` ci lr u{ 4; L}  ! $* -3 6< ?E HN QW Z` ci lr u{ :}C  45N  0 2x  7X`l:}  l $tHH hhh@l `hhh8h:}XD ! . B6 1! :}L&L/, L(L/)  L(, L(L& - -L `-l ԩ:}HHH@  D(SΛo0ԭ1ԭ/) JJТ"`:}o o01/ d! @" D(.0ԩ31ԢН "/:}Ԣ"_"#b$%@ !` m#HHH !hhh:}Ǎ` G!`` 8``v3'i(i(w:} m& H hL!!"h (i(i л3| i(:}5|i(3` m&Hȱȱ. ) )!i(i LH":}٩6 (γ & ( %"#%N3i)8LK$L#:} # ) ) )k ( Z()/)) d)$ɀJJJL#ɢ- :}ǰ =) )i(ΰΡL#``#$ #)Ii #` i( #γ` #:} ) )Hh )Ρ筰8Hh (Ρ`$ (i(i:}cΡ`OPTION-SINGLE STEPS SELECT-TOGGLES SCREEN START $%-RETURNS TO CODE COMMANDS ARE :g E EXAMINE ADDRESS:}C CONTINUE,LEAVE BRKPG GOTO ADDRESS B<#>, SET BREAKP.R<#>, CHANGE REG.D DEPOSIT HEX STR PULL WINDOW :}UP/DOWNI INTERPRETIVE MODE W TOGGLE DISP. WINDOWT<#>, SET T%&RAP S SEARCH HEX STR%%%󀤥:}"(,H3Hȑi(hhi ):}Gi(`3` ( 1'LR' &' Z(ʨ&'m'ʈ'H(L':}ǎhX* D( ( D( @" L( D(L '(L&L''`D'`8`0PpLl @` :}d'b'e'c'La'''''''''('''(' 6(L&ȱȱL&hihiL& 6(iHHΌΌL:}&i &'''L&XmmL& !L()&hhhiL&ȱ`{ `:}<,ii`@` ))|(`@ G!``H)(h) 0 `8  @ ` ) ):}A`n6P ) )ȭ )ȭ %)ȭ )ȭ )ȭ )`HEJ )h)L))*ii` /)`Hh`H :}hm+ Z)+ Z)+LZ) ( `=))D8`Ji `a!$ALF&f J*j:}`=*** ))))L)k*w*************+ ߔߖl :}      $ `  + 8+ &+L + + 8+ +L/+ȩL8+ɖ ɶ 8+L&+ 8+L/+ + K+L +!:}`ɾ K+L&+ K+L/+LK+L8+` 8+H)0/]heei )L+ , )\ϩ` ` o+8:}` o+9`Hh u+`L )ȱHh +` )L8+ `,`H=i+i+ݡ+ :}ǭL+γ+i ++L+h`+8++++ (8h`BRKPHPBPLCLCJSRPLPBMISECRTIPHA ,-BVCCLIRTSPLABVSSEI???DEY:}BCCTYALDYTAYBCSCLVCPYINYBNECLDCPXINXBEQSEDADCANDASLBITCMPCPXCPYDECDEXEORINCJMPLDALDXLDYLSRNOPORAROLRORSBCSTASTXSTYTAXTSXTXATX:}SASLLSRROLRORSTXSTYHh,-4ک8ii8L2350?:*8! s- -.` :}D- 8`R-H |-}- h`*=(: .-ON>%#'"2$])74]\\3H s-hȩ`م6`0/0120-/22-J..C:}1 .),' ( Z(H '/hm "L .)i,.. "L :}ǡ Z(80؍ '/mL.!ΧΦ .) .8Χ "L:} .)8,Χ "L  .8  '/L.8ΧL.`8`//:}G8`ʊ)?/JJ)` ]/-]//i`i)?i)?`/:}Ǽ0LL&Τ LΤL e0 . "L ,ͭ `-:} L'0`hLάΥL'0 `- "0Ls08`8 s- 0H 0h ά` i )`.:}`01 e0LL 18Ji80m s0L1i0 :}Ǎڭ` @"LDž 0ii 1L @"L08`` 1?:6H:}ǩ e0h12 m !L1h @"L `- "0Ls0 `- L"0 `-Hh-?4q:}ݹ20[2 `-меޭ1 ,0 1" e0 ( &L ά:}ǷΥ2u3L2? +>!0893#0 "L 161-JH e0#h    @"Lh:}pppBN3-A.355:}3n6 77<||DN||||_d||lv||||}:} ||!||||.LOMEM VNTP VNTD VVTP STMTABSTMCURSTARP RUNSTKMEM:}HTOPHIMEM FR0-1 FR0-2 FR0-3 SDLST 0SAVMSCX N QW Z` ci lr u{ 8BGAPX-20150DUNION'S DEBUGGING TOOL (DDT)JIM DUNION09/17/8285CESS COMPLETEDD2:TITLE! INPUT MASTER DISK TO N<?EE+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++