þþg0dX;SAVE#D:DMPT1.M65nEIx!X;----------------------------‚X;ŒX;Disk Master–!X;the Disk Editor/Disassembler X;ªX; (C) 1989 BY ST-LOG´X;¾X;by: Barry KolbeÈX;and Bryan SchappelÒX;Ü!X;----------------------------æX;ðú„PASS„PASS „PASS>ŒD:SYSEQU.M65"X;,X;Zero Page Usage6X;@€J‚Y1;;save x/y holdT‚Y2;;areas^ ‚Y3h ‚X1r ‚X2| ‚X3†„TMP1;;temp variables „TMP2š „TMP3¤†AIFLAG;;asc/internal®T;;pntr¸L;;pntr„CTMP;;extra tempÌ„SECL;;sec # loÖ„SECH;;sec # hià…UNITS;;units digitê„TENS;;tens digitô‚IV;;inverse flagþƒHDF;;hex/dex flag„ICNT;;counter ƒNMD „TOTD&ƒHXL;;hex lo0ƒHXH;;hex hi:†HXORST;;hex/stringD…FBYTE;;first byteN†MATFLG;;match flagX…LNKLO;;link lob…LNKHI;;link hil…SSECL;;save sec lov…SSECH;;save sec hi€‡DENSITY;;density flagŠ†SRCDRV;;source drive”†DESDRV;;dest'n drivež„ADDR;;disa address¨„INDR;;pointer²‚OP;;first disa byte¼…DTEMP;;next 2 bytesÆ…NBYTE;;# instr bytesЄHXDC;;hex/dec flagÚ†ADD_ON;;address offsetä…LOC_S;;address startî…LOC_E;;address endø…CNTLO;;counter„DINS;;disa hold …IMODE;;input mode†MAXLEN;;max length …SRFLG;;srch data flag*†INPLOC;;input loc4†BYTCNT;;segment cnt>†GETPTR;;sec offsetH†STLOAD;;start loadR†ENLOAD;;end load\„TYPE;;disa/filef‡LABELS?;;label flagp†S.SIZE;;sector sizez†BUFPNT;;output pntr„…LINES;;#line in bigbufŽ…BYTES;;bytes gotten˜…SFLAG;;source flag¢†SECCNT;;sector count¬ˆSECBYTES;;bytes/sector¶‚SM(;;screen memoryÀ …LINE0‚SM(;;text windowʆBIGBUF€;;P: bufferÔ†PRNBUFÀÞX;èX;PRINT macroòX;ü †PRINT  Q>4  %>5  †EPRINT$.X;8X;Work BuffersBX;L,V…MYBUF€;;sec work buf`…DSBUF€;;data bufferj†INPLIN(;;input linet…SRBUF-;;search buffer~„IBUF-;;input bufferˆ‡SRCFILE;;source file’‡DSTFILE;;dest'n fileœX;¦X;Program Start°X;º0;;originÄ…START!…INTRO;;go intro!ÎX;ØX;Intro Display ListâX;ì„INDL p=p=p=p=pö p=p=p=p=F †CREDIT  p=B ƒIL0 =p== ( = ==A2 „INDL<X;FX;Info Display ListPX;Z†INFODL p=p=p=Fd ƒCR2n =@=Bx ‚SM(‚ ====Œ ====A– †INFODL X;ªX;Disassembler Display List´X;¾†DISADL p=p=p=FÈ ƒCR2Ò  =BÜ †INFOLNæ  ==Bð ‚SMú ==== ==== ==== ====" A, †DISADL6X;@ƒIL0 A   âùº Âáòòù ËïAJ Aìâå áîä Âòùáî ÓAT AŠãèáððåì   A^ A  Ðòïäõãåä æïòºAh A Á®Î®Á®Ì®Ï®Ç® ÃAr AŠïíðõôéîç  A| AŠïðôéïî diA† AŠsk editor A AŠóåìåãô diAš AŠsassemblerA¤ AŠ óôáòô exA® AŠit A¸X;†INFOLN A   ÍÎÅ  ÏðåòáîäAÌ A          ÁÄÄÒ AÖ AŠÂ± Â² Â³  AàX;êX;Disassembler promptsôX;þ‚P0 ADisa Type [F/D]A=‚P3 ADest'n [E/P/Dn]A=‚P4 A Labels [Y/N]A=‚P5 A Source FileA=&‚P1 ASrc Drive [1-8]A=0‚P2 A Density [1-2]A=:‚P6 A Sector [1-2D0]A=D‚P7 A # of SectorsA=N‚P8 A Offset [0-7F]A=X‚P9 AOrigin [0-FFFF]A=b‚PA AByt/Sec [7D/80]A=lX;vX;INCLUDE Support Files€X;Š>ŒD1:DMPT2.M65”>ŒD1:DMPT3.M65ž>ŒD1:DMPT4.M65¨X;²X;Intro Screen¼X;Æ…INTRO-;;chill decimalÐ$>ÿ;;clear stackÚBä Q†POKMSKîM>ø P†POKMSK P…IRQEN Q>4„INDL;;turn on theP†SDLSTL;;intro display Q>5„INDL;;list.*P†SDLSTL4Q>";;normal PF> P†SDMCTLHQ> ;;white textR P†COLOR1\Q>;;black borderf P†COLOR4pQ>;;grey backgrndzP†LMARGN;;left marg=2„ P†COLOR2ŽQ>”;;blue gr1 text˜ P†COLOR3¢†I_LOOPQ†CONSOL;;get consol¬R>;;start?¶ HƒT_5;;no.À!†WARMSV;;yes, so long!ʃT_5R>;;select?ÔF†GO_DIS;;yes. disa.ÞR>;;option?èH†I_LOOP;;no, loopò!†DISKED;;Disk Editor.üX; X;Disassembler Data Entry X; †GO_DISQ>4†INFODL;;install$ P†SDLSTL;;the data. Q>5†INFODL;;entry DLIST8 P†SDLSTLB  †CLRSCN;;clear screenL Q>4‚P0;;point to theV P„INDR;;first prompt` Q>5‚P0j P„INDRt  †PROMPT;;Disk/Files~ X;ˆ ƒP00 †GETONE;;get input’ DƒP01;;ok?œ †GO_INT!…INTRO;;no way.¦ X;° ƒP01Q„IBUF;;get charº M>ß;;make upper/normÄ $>;;0=filesÎ R> F;;was it F?Ø FƒP02;;yes!â R> D;;a D?ì HƒP00;;no.ö 2;;up flag ƒP02&„TYPE;;save type X;  †PROMPT;;dest'n device ƒP30 …GETFN;;get name( E†GO_INT;;bad input2 %>;;copy to pos 20<  ‡CHECKFN;;check filenameF EƒP30;;oops, bad one.P  …G.DRV;;get drive #Z P†DESDRV;;save it.d X;n  †PROMPT;;want labels?x ƒP40 †GETONE;;get response.‚ E†GO_INT;;bad one.Œ Q„IBUF;;get char– M>ß  $>;;0=labels.ª R> Y;;a Y?´ FƒP41;;yes.¾ R> N;;try N?È HƒP40;;no.Ò 2;;1=no labelsÜ ƒP41&‡LABELS?;;save choiceæ X;ð Q„TYPE;;files or disk?ú H†F_SECS;;want disk.  †PROMPT;;filename X; ƒP50 …GETFN;;get filename" ƒG.0E†GO_INT;;bad one., %>;;posit 06  ‡CHECKFN;;check Fname@ EƒP50;;oops.J  …G.DRV;;get driveT P†SRCDRV;;save it.^ !†DIS_IT;;and disa!h X;r †F_SECS ‡UP_INDR;;skip fname|  †PROMPT;;source drive† ƒP10 †GETONE;;get response E†GO_INT;;bad one.š Q„IBUF;;get the char¤ M>® ;;;make 1-8¸ S> 0 GƒP10;;<0? yes!Ì R> ;;=>9?Ö EƒP10;;yes.à P†SRCDRV;;save itê X;ô  †PROMPT;;densityþ ƒP20 †GETONE;;input. ƒG.1EƒG.0;;bad input. Q„IBUF;;get char M>;;mask inverse& ;;;make 0-10 S> 1: GƒP20;;<0?, yes.D R>;;>1?N EƒP20;;yes.X P‡DENSITY;;save densityb >;;X=Al Q„SDLO9;;get max sec #v PƒFR0;;and put it in€ Q„SDHI9;;FR0.Š PƒFR0”  ‡BIN2HEX;;make hex.ž %>;;copy max #¨ „D.CPQ…LBUFF8;;into the next² P‚P6 8;;prompt.¼ 3Æ )>Ð H„D.CPÚ X;ä  †PROMPT;;sectorî ƒP60 ‡SPC_NUM;;get numberø EƒG.1  ‡TESTFR0;;in range? EƒP60;;no. QƒFR0;;yes, so we P„SECL;;save the sector* QƒFR0;;number for4 P„SECH;;later.> X;H  †PROMPT;;#secsR ƒP70 ‡SPC_NUM;;get number\ ƒG.2EƒG.1;;bad one.f QƒFR0;;is number 0?p LƒFR0z FƒP70;;yes, that's bad„ QƒFR0;;save the numberŽ P†SECCNT;;of sectors for˜ ,;;later & add on¢ O„SECL;;start sector¬ PƒFR0;;so we can test¶ QƒFR0;;to see if tooÀ P†SECCNT;;many sec'sÊ O„SECH;;will be read.Ô PƒFR0Þ  ‡TESTFR0;;in range?è EƒP70;;no way.ò X;ü  †PROMPT;;offsetƒP80 ‡SPC_NUM;;get numberEƒG.2QƒFR0;;test hi byte$HƒP80;;>? yes!.QƒFR0;;get lo byte8R>€;;=> $80?BEƒP80;;yes.LP†GETPTR;;save for laterVX;` †PROMPT;;originjƒP90 ‡SPC_NUM;;get numbertEƒG.2~QƒFR0;;copy the numˆP„ADDR;;into the addr’QƒFR0;;for the disa-œP„ADDR;;ssembler.¦X;° †PROMPT;;sector size.ºƒPA0 ‡SPC_NUM;;get numberÄEƒG.2ÎQƒFR0;;no hi byteØHƒPA0;;allowed!âQƒFR0;;test lo byteìR>};;125 bytes?öF„G.SZ;;yes!R>€;;128 bytes?  HƒPA0;;no.„G.SZP†S.SIZE;;save sizeX;(X;Disassembly Entry Point2X;<†DIS_IT †CLRSCN;;zap screenF'…SFLAG;;clear flagPQ>4†DISADL;;install theZP†SDLSTL;;disa DLISTd Q>5†DISADLnP†SDLSTLx †OPENIN;;open input‚ ‡OPENOUT;;open outputŒX;–†D_LOOP ‡DISAMEM;;do instr.  ˆPRINT.IT;;print itªQ>;;clear counter´ P…BYTES¾$>ÿ;;get a $FFȆC_LOOPQ‚CH;;key press?ÒR>ÿÜF†D_LOOP;;no.æ&‚CH;;clear CHðR>;;escape?úH…T.SPC;;no.†END.IT&‚CH;;clear CH and!†D_OVER;;exit.X;"…T.SPCR>!;;Space=pause, H†D_LOOP6X;@†K.WAITQ‚CH;;get keypressJR>;;escape?TF†END.IT;;yes, exit^R>!;;wait for SPChH†K.WAIT;;to stop ther&‚CH;;pause.|!†D_LOOP;;loop again.†X;X;Get drive numberšX;¤…G.DRVQ„IBUF;;get char®;;;set carry¸S> 0;;subtract '0Â:;;and leaveÌX;ÖX;E: Print routineàX;ê!†EPRINTP„E.LP;;save lo byteô'„E.LP;;save hi byteþ„E.LPQÿÿ;;get charF„E.DN;;if 0, all done …E.PUT;;put the char#„E.LP;;bump pointer& H„E.LP0 #„E.LP:H„E.LP;;and loopD„E.DN:;;so long.NX;XX;E: Put byte routinebX;l…E.PUTR>ƒEOL;;is it a CR?vH…E.EOL;;no.€…PUTCRQ†LMARGN;;set xpos toŠP†COLCRS;;the margin”#†ROWCRS;;bump yposž!†SCROLL;;check scroll¨X;²…E.EOL †ASC2IC;;make icode¼ 5;;save itÆ%†ROWCRS;;get yposÐQ‚GL8;;look up theÚPL;;address of thisäQ‚GH8;;line and storeîPL;;in temp areaø7;;get char back%†COLCRS;;get xpos P@L7;;on screen!X;  3;;up xpos*)>';;at rmargn?4D„E.LV;;no.>F„E.LV;;just there.H#†ROWCRS;;next lineR †SCROLL;;scroll screen\%†LMARGN;;get marginf„E.LV'†COLCRS;;set xposp:;;and leavezX;„ X;Check to see if screen mustŽX;be scrolled.˜X;¢†SCROLL%†ROWCRS;;get ypos¬)>;;at line 21?¶D„S.NO;;no.ÀQ>4‚SM;;get the addrsÊPT;;of line 0 & 1Ô Q>5‚SMÞ PTèQ>4‚SM( òPLüQ>5‚SM(  PL$>;;line counter„S.M1%>';;now move 1 line$„S.M2Q@L7;;up 40 bytes.P@T781B I„S.M2LQL;;now update theVPT;;pointers.`QLjPTt,~O>(ˆPL’ QLœO>¦ PL°2;;up line countº(>;;at end?ÄH„S.M1;;no way.Î"†ROWCRS;;dec yposØ„S.NO:;;and leaveâX;ìX;Print a PromptöX;†PROMPT …PUTCR;;print CR Q>@;;force uppercase P†SHFLOKQ>;;and no inverse( P†INVFLG2Q„INDR;;get addr of<%„INDR;;the promptF †EPRINT;;print itPQ> :;;put a ':'Z …E.PUTdQ> ;;and a spacen …E.PUTx …G_SCR;;clear line‚ ‡UP_INDRQ„INDR;;add 16 to getŒ,;;to the next–O>;;prompt.  P„INDRª D…UP_HI´ #„INDR¾…UP_HI:;;so long.È…G_SCRQ†COLCRS;;get xposÒ%†ROWCRS;;and yposÜ,;;add line addræO‚GL8ð P†INPLOCúQ‚GH8O>P†INPLOC%>;;zap 21 chars"Q>;;a space,…G_CLRP@†INPLOC7;;on screen61;;down counter@I…G_CLR;;and loopJ:;;so long.TX;^X;Get 1 byte via INPUThX;r†GETONE …G_SCR;;clear line|%>;;force text mode† '…IMODE 3;;1 charš!…INPUT;;get input¤X;®X;Get a Filename¸X;Â…GETFN …G_SCR;;zap lineÌ%>;;force text modeÖ '…IMODEà%>;;get 15 charsê !…INPUTôX;þX;Special get numberX;‡SPC_NUM …G_SCR;;zap line!…G_NUM;;get a number&X;0X;Test FR0 for sector range:X;D‡TESTFR0QƒFR0;;is FR0 a 0?N LƒFR0XF…T.ERR;;yes!b$‡DENSITY;;get densitylQƒFR0;;check to seevR„SDHI9;;if the sector€D„T.GD;;number in FR0ŠF„T.LO;;is allowed.” E…T.ERRž „T.LOQƒFR0¨ R„SDLO9² D„T.GD¼ F„T.GDÆ…T.ERR;;;signal errorÐ:Ú„T.GD,;;signal goodä:îX;øX;Check Filename for Dx:X; ‡CHECKFNQ„IBUF;;get 1st charR>ƒEOL;;is it EOL? F„CH.B;;yes.*R> D;;is it 'D'?4F„FN.D;;yes.>R> P;;is it 'P'?HF„CH.C;;yes.RR> E;;is it 'E'?\H„CH.B;;no.f„CH.CQ> :;;make 2nd charpP„IBUF;a ':' and thezQ>ƒEOL;;3rd char an EOL„ P„IBUFŽ„CH.R$>;;zero index˜„CH.LQ„IBUF9;;get input char¢P‡SRCFILE8;;save in buf¬3;;up buf index¶2;;up input indxÀ(>;;done 20 yet?ÊH„CH.L;;no.Ô,;;signal good.Þ:;;and leave.èX;ò„FN.DQ„IBUF;;get 3rd charüR> :;;3rd char a ':'?H„CH.B;;no, bad nameQ„IBUF;;get drive #R> 1;;less than 1?$D„CH.B;;yes..R> 9;;greater than 8?8 D„CH.RB„CH.B;;;signal badL:VX;`"X;Dump Editor Screen to PrinterjX;t†DMPSCN †PRNLFD~ G…PRERRˆQ>4†BORDER;;print top’%>5†BORDER;;borderœ †DMPSUB¦ G…PRERR°Q>;;count linesºPT;;of sectr infoÄ„DMLP$T;;get indexÎQ‚GL9;;Lo/Hi bytesØ%‚GH9;;line addressâ †DMPSUB;;print itì G…PRERRö#T;;next lineQT R>;;done 16?H„DMLP;;nopeQ>4†STATUS;;print(%>5†STATUS;;status line2 †DMPSUB<I„DMOK;;Y has errorF…PRERR!…IOERR;;dble returnP „DMOK:ZX;dX;Printer LinefeednX;x†PRNLFDQ> ‚ P†PRNBUFŒ Q>ƒEOL–P†PRNBUF HƒSAPªX;´X;Print a Line using SIO¾X;ȆDMPSUBPL;;save addressÒ'L;;for indirectÜ%>æƒDML$>;;use as anð&„TMP1;;inverse flagúQ@L7;;get byteIƒDMJ;;inversed?#„TMP1;;yes-set flagƒDMJM>;;mask it off"R>{;;skip control,E„PERD;;characters6R>`@EƒPRKJR>@T E„PERD^,;;change tohO> ;;ATASCIIrƒPRK$„TMP1;;was it inverse?| F„PORK;;no†L>€;;add back in H„PORKš„PERDQ> .;;'.' for contrls¤„PORKP†PRNBUF8;;into buffer®3¸)>';;done w/line? HƒDML;;noÌQ>ƒEOL;;add EOLÖP†PRNBUF'àX;êƒSAP$> ;;copy cmdsôƒSIPQ†PSIOCB9;;to DDEVICþP90IƒSIP „SIOV;;let SIO print&:0X;:†PSIOCB @;;printerD ;;unit 1N W;;writeX €;;send bit 7=outb †PRNBUF;;bufferl 0;;time outv (;;buf length€ N;;normal prntŠ ;;unused”X;žX;Get Label Data¨X;²>‹D:DMPT5.M65¼X;ÆX;Find where program endsÐX;ÚIä ‡ENDPROG îEIøX;X;Add Run address X; …RUNAD  …START*