C@) U$%  g0} ]$)$$Ω `%@$e$$%`  R@P1    *  .`GH`N ,  LYL LL (ǭ` L Թ< HH   ? 0,(h 0: < =;Ң79x 608:2344  4, 8 " ,P ҥ D X0ɀ7Ъ`# 21 4 2 r L1 ) 000} F 0 1 2 r 4 16` H < A CE0Z& 'L\䩏,,09$806LpLe1i1`}00) ߍҩҭҍ ) `H) 000ҩh `ҍ ҩ(ҩҩ`23`@1` } H h `1E1`@` $S    L 51 8F5j41*F8 H)} 1h  = 1I-Ӎө15)? @5,02424 2H h4 )ILYf | 2 p $% C7 } C$%% ޠ0 %%$%*5 DDЙ ` ( + }*)L *O(   x % i L x) x %  i !" ! 2_('0v  T  } 0   .B  % a ) C  S  WL:L x !'( }` S %&L08` I")B 5JJT   'y(y  L> tL }*` ("X%'8  HH`43{L #+) 0 +?8@  *!"ʎ 1 } F GG xL+0  LE0 *$  $ #! Eʈ E }ʽ E7EȩE, 0EȩE  ί`dJ ? ` + 7   % WC} ?C$ )(  W  CL °ELB,   W   '(',   L } % i '( x E` + L ,C  )C  방 ) ` x0?M$L# t}M&L%  N ! x x!N#L$ML 6  g) 0=I8j O Y }$ S  ) `I #'I0_G/IɛI0 I  L ) }ECȱE, CqECȊqEC  G LLP SROTCES EERF H0 C ) *,-,?, Gh)H<, GȽG }h>, GȄI  +d   GI`DC8C D 0IGIDC`$0Z:ȩ$.} ȩ "* ??/ɛ   Ýн .` x T p T  ih  }=H*"" h0Ch h0!)C)и?ٞЪ   T 08.`0 _  t0!T :&}GȽ%GȽ!G tL'( %&!:\8$#H hcLgД%&8`  u0!:G)&G)&ȱG%}ȱGH)h0})Hh `"!" x%#&$`8$ iiSE` dEE 8$EF h `}0(`( dEFEi ( ɃL x@ #H)h$7pH#^$ji "0 "hEEdEiE}ȱEiE`h`hQEEd ) E8EȱEE` 8E pQEEH.8 %%*&h%%  &` x莃"!}s  L!7 !0*&"  77 x! !EF :  ."}  x""GH`ʎc` .: c, +1    8 mI }0 `#$  U ɨ%X LF l.(`SYS SODhChDC.C/`0." "!} x}b   $'%NL`% %b    ~$ b H Zh0  r0T"} B 109ͨ-ͩ(  110@A ?,,HHN0  ^hh`EDLL#} Й8HIHI V0,b0 LOlD:AUTORUN.SYS}  V` I t$}D5FCE߈CECEDFF!!I өύ @ԍ`ϩ m)` Bb  %}yC Eϼ  "4  ` L)#j|DFqCqE}` 3 Ҭ@@@ό@(` y&} Y(`E:D1:SDUP.SYSHILV L n"  t` e B L2JBLVDE`s'}ssdex ;#@D:D:D:*.**SYS: "$;DOS SYS:}1000 ;Filename: D:DISSEM.01010 ;1020 ;ɠàқ1030 ;1040 ;Copyright Alec Benson 19871050 ;1060 .)}OPT NO LIST1070 .OPT NO MLIST1080 ;1090 PASS .= PASS+11100 .IF PASS=11110 .INCLUDE #D:SYSEQU.M651120 *} .INCLUDE #D:IOMAC.LIB1130 .INCLUDE #D:DISSEM.MAC1140 .ENDIF 1150 ;1160 .TITLE "ATARI SYMBOLIC DISASSE+}MBLER"1170 ;1180 .INCLUDE #D:DISSEM.11190 .INCLUDE #D:DISSEM.21200 .INCLUDE #D:DISSEM.31210 .INCLUDE #D:,}DISSEM.41220 .INCLUDE #D:DISSEM.51230 .INCLUDE #D:DISSEM.61240 ;1250 *= *+101260 ;1270 ZPAG .DS ZM ;Ze-}ro page labels1280 PAG .DS PM ;Non zero page labels1290 LAB .DS DM ;Branches & jumps1300 ;1310 *= *+10132.}0 ;1330 BUF = * ;Code buffer1340 ;1350 .ORG RUNAD1360 ;1370 .WORD BEGIN1380 ;1390 .END *+10132s1000 ;Filename: D:DISSEM.11010 ;1020 .PAGE "Equates"1030 ;1040 ;͠ӛ1050 ;1060 DOSVEC = $0A ;DOS entry0}1070 LMARGN = $52 ;Left margin1080 ROWCRS = $54 ;Cursor row1090 COLCRS = $55 ;Cursor column1100 COLOR4 = $02C8 1};Screen margin1110 CRSINH = $02F0 ;Cursor inhibit flag1120 DVSTAT = $02EA ;Device status1130 DSPFLG = $02FE ;Display fl2}ag1140 SDMCTL = $022F ;DMA enable1150 CONSOL = $D01F ;Function keys1160 ;1170 ;͠ӛ1180 ;1190 TRUE = 0123}00 FALSE = 11210 START = 6 ;START key value1220 SPACE = 32 ;Ascii space1230 ;1240 SL = 6 ;Label lengt4}h1250 LL = SL+2 ;Label+hex digits1260 ZL = SL+1 ;Label+hex digit1270 DM = LL*700 ;Branch/jump table size15}280 PM = LL*700 ;Non zero page address table size1290 ZM = LL*255 ;Zero page table size1300 LTOP = DM/LL-1 ;Max. n6}o entries-11310 PTOP = PM/LL-1 ;Ditto1320 ;1330 ;1340 .PAGE "Zero Page Variables"1350 ;1360 ;ϠŠӛ17}370 ;1380 .ORG $801390 ;1400 ;Flags1410 ;1420 SECOND .DS 1 ;Second pass1430 NOSCREEN .DS 1 ;Screen on/off1440 8}LODFILE .DS 1 ;Binary load file1450 FLAG .DS 1 ;Text/Valid code1460 QUICK .DS 1 ;Quick 1st pass1470 ASMFLAG .DS9} 1 ;Output to diskfile1480 TABLES .DS 1 ;Accessing table print routines1490 MORE .DS 1 ;Part file read1500 END.O:}F.FILE .DS 1 ;End of file1510 ALL .DS 1 ;Print all labels1520 ENTRYFLAG .DS 1 ;Table entry mode1530 LABFLAG .DS 1 ;};Create labels1540 FOUND .DS 1 ;Label found1550 SINGLE .DS 1 ;1 disk drive only1560 PRFLAG .DS 1 ;Suppress leadi<}ng 0's in decimal output routine1570 ZPRINT .DS 1 ;Printing zero page1580 ;1590 ;Working variables1600 ;1610 SCREEN .=}DS 1 ;Holds screen status1620 R .DS 1 ;Char. from keyboard1630 R1 .DS 1 ;Saves char. from keyboard1640 X>} .DS 2 ;Holds # bytes in last instruction1650 XSAVE .DS 1 ;Saves X register1660 LSAVE .DS 1 ;Saves 1st char?} of label1670 LLENGTH .DS 2 ;Label length1680 DECL .DS 1 ;Used in1690 DECH .DS 1 ; converting1700 DIGIT .DS 1@} ; decimal output1710 POINTER .DS 2 ;Code pointer1720 SAVPOINTER .DS 2 ;Saves code pointer1730 OFFSET .DS 2 ;CodeA} offset1740 CODEND .DS 2 ;End of code1750 NUM .DS 2 ;Hex number1760 HEX .DS 4 ;Ascii hex #1770 SECTOR.NO .B}DS 2 ;1st sector #1780 SECSIZ .DS 2 ;Sector size1790 NO.SECTORS .DS 2 ;# of sectors1800 SAV.NO.SECTORS .DS 2 ;Saves # oC}f sectors1810 INDIR .DS 2 ;Pointer1820 BUFLEN .DS 2 ;Buffer length1830 LIDX .DS 2 ;# of entries in LAB1840 ZID}DX .DS 2 ;# of entries in ZPAG1850 PIDX .DS 2 ;# of entries in PAG1860 LINE_NO .DS 2 ;Error return address1870E} NO_ENTRIES .DS 2 ;Used to hold # of entries in table search routine1880 INDEX .DS 2 ;Label address -used in label searcF}h1890 BOTTOM .DS 2 ;Used in binary search1900 MIDDLE .DS 2 ;Used in binary search1910 FIRST .DS 2 ;File start adG}dr.1920 LAST .DS 2 ;File end addr.1930 LENGTH .DS 2 ;File segment length1940 SURPLUS .DS 2 ;Excess of segment leH}ngth over buffer size1950 M .DS 3 ;Ascii mnem. code1960 WRK .DS 5 ;Temporary storage1970 TEMP .DS 8 ;TeI}mporary storage1980 L .DS SL+1 ;Label storage1990 ;2000 .PAGE "Variables & Buffers"2010 ;2020 .ORG $200020J}30 ;2040 ;Ӡӛ2050 ;2060 LINE .DS 41+2*[SL-6] ;Line print buffer2070 LINE16 = LINE+16+SL2080 ERROR_NUM .DK}S 6 ;Error #2090 ;2100 .PAGE "Mnemonic Code Table"2110 ;2120 ;àŠś2130 ;2140 MNEM_TABLE2150 .BYL}TE "BRKAORAJ???A???ATSBCORACASLC???APHPAORABASLM???ATSBFORAFASLF???ABPLIORAK"2160 .BYTE "ORAO???ATRBCORADASLD???ACLCAORAM}HINAA???ATRBFORAGASLG???AJSRNANDJ???A"2170 .BYTE "???ABITCANDCROLC???APLPAANDBROLM???ABITFANDFROLF???ABMIIANDKANDO???ABIN}TD"2180 .BYTE "ANDDROLD???ASECAANDHDEAA???ABITGANDGROLG???ARTIAEORJ???A???A???AEORCLSRC"2190 .BYTE "???APHAAEORBLSRO}M???AJMPNEORFLSRF???ABVCIEORKEORO???A???AEORDLSRD???A"2200 .BYTE "CLIAEORHPHYA???A???AEORGLSRG???ARTSAADCJ???A???ASTZCADP}CCRORC???APLAAADCB"2210 .BYTE "RORM???AJMPLADCFRORF???ABVSIADCKADCO???ASTZDADCDRORD???ASEIAADCHPLYA???A"2220 .BYTE Q}"JMPPADCGRORG???ABRAISTAJ???A???ASTYCSTACSTXC???ADEYA???ATXAA???ASTYFSTAF"2230 .BYTE "STXF???ABCCISTAKSTAO???ASTYDSTADSTR}XD???ATYAASTAHTXSA???ASTZFSTAGSTZG???A"2240 .BYTE "LDYBLDAJLDXB???ALDYCLDACLDXC???ATAYALDABTAXA???ALDYFLDAFLDXF???A"225S}0 .BYTE "BCSILDAKLDAO???ALDYDLDADLDXE???ACLVALDAHTSXA???ALDYGLDAGLDXH???A"2260 .BYTE "CPYBCMPJ???A???ACPYCCMPCDECC??T}?AINYACMPBDEXA???ACPYFCMPFDECF???A"2270 .BYTE "BNEICMPKCMPO???A???ACMPDDECD???ACLDACMPHPHXA???A???ACMPGDECG???ACPXBSBCJ"U}2280 .BYTE "???A???ACPXCSBCCINCC???AINXASBCBNOPA???ACPXFSBCFINCF???ABEQISBCKSBCO???A"2290 .BYTE "???ASBCDINCD???ASEV}DASBCHPLXA???A???ASBCGINCG???A"2300 ;2310 .PAGE "Constants"2320 ;2330 ;ӛ2340 ;2350 AM1 .BYTE ".BYTE $" ;UseW}d in2360 AM2 .BYTE "#$" ; building2370 AM3 .BYTE ",X",EOL ; up disassembly2380 AM4 .BYTE ",Y",EOL2390 AM5 .BYTE ",X)",EOX}L2400 AM6 .BYTE "),Y",EOL2410 AM7 .BYTE ")",EOL2420 SPACES .BYTE " " ;Used for space fill2430 LM1 .BYTE " = $" ;FoY}r label printing2440 RS .BYTE "0",EOL ;Print buffer2450 LIMIT .BYTE 0 ;Print buffer2460 DIN .BYTE "D1:" ;File name buffZ}ers2470 IN .BYTE "12.12345678.123",EOL2480 DOUT .BYTE "D1:"2490 OUT .BYTE "12.12345678.123",EOL2500 ;2510 .PAGE "Me[}ssages"2520 ;2530 ;ӛ2540 ;2550 WHICH .BYTE "Which? "2560 LABEL_MSG .BYTE "}Do you want standard labels (Y/N)? "\}2570 ENTRY_MSG .BYTE " Enter your label names and addresses.",EOL," Enter 'END' to finish.",EOL,EOL," Name: "2580 ADDRESS_MS]}G .BYTE "Address (1-4 Hex): "2590 NUMBER_MSG .BYTE "Enter a number from 1 to "2600 CONT_MSG .BYTE "1040"2610 ERROR_MSG .^}BYTE "}ERROR # "2620 PAUSE_MSG .BYTE EOL,EOL,EOL,"Press any key to continue"2630 START_MSG .BYTE "Start address: "264_}0 END_MSG .BYTE "End address: "2650 FILE_MSG .BYTE "Filespec: "2660 BIN_MSG .BYTE "Is this a binary load file (Y/N)? "2670`} ORG_MSG .BYTE "ORG address: "2680 SECNUM_MSG .BYTE "Start sector number: "2690 NUMSEC_MSG .BYTE "Number of sectors: "2700a} RETURN_MSG .BYTE EOL,"Insert disk & press when ready"2710 DATA_MSG .BYTE "}Ok to write new data files (Y/N)? "2720b} END.OF.MESSAGES2730 ;2740 .END ess when ready"2710 DATA_MSG .BYTE "}Ok to write new data files (Y/N)? "2720'1000 ;Filename: D:DISSEM.21010 ;1020 .PAGE "Initialisation & Main Loop"1030 ;1040 ;͠ΠΠ d}"1050 ;1060 BEGIN1070 JSR INITIALISE ;Init variables1080 JSR ENTER_LABELS ;Enter labels1090 MAIN1100 JSR MA e}IN_MENU ;Main menu1110 JMP MAIN1120 ;1130 .PAGE "Disassembly Main Loop"1140 ;1150 ;ΠРҠٛ116 f}0 ;1170 DISASSEM1180 INC CRSINH ;Cursor off1190 INC DSPFLG ;Display ctrls1200 LDA NOSCREEN ;Screen off?121 g}0 BNE ML1 ;No1220 LDA #0 ;Yes1230 STA SDMCTL1240 ML11250 BUMP POINTER ;Inc code ptr1260 h}SUBW POINTER,OFFSET,NUM ;Actual address1270 CPW CODEND,NUM ;Finished?1280 BCS ML2 ;No1290 JMP ML10 ; i}Yes1300 ML21310 LDA #FALSE ;Don't add label1320 STA LABFLAG ;to table1330 LDY #01340 LDA NUM+1 ;Conve j}rt to Ascii1350 JSR HEXASC1360 LDA NUM1370 JSR HEXASC1380 JSR PAG_SEARCH ;Look for lab1390 LDA FOUND k} ;Found?1400 BEQ ML3 ;Yes, print it1410 JSR LAB_SEARCH ;Look for lab1420 LDA L ;Found label?1430 l} BEQ ML3 ;No1440 LDA #$FF ;Yes, print it1450 STA FLAG1460 ML31470 LDA #SPACE ;Clear print buffer1 m}480 LDY #39+2*[SL-6]1490 ML41500 STA LINE,Y1510 DEY 1520 BPL ML41530 MOVE HEX,LINE+1,4 ;Addr. into n} buffer1540 ;1550 ;Get an instruction from memory1560 ;and calculate the position of1570 ;its mnemonic code in the table. o}1580 ;1590 LDY #01600 LDA (POINTER),Y ;Get instruction1610 STA NUM ;Save it1620 STA INDIR1630 S p}TY INDIR+11640 ASL INDIR ;NUM*41650 ROL INDIR+11660 ASL INDIR1670 ROL INDIR+11680 ADDW INDIR,MNE q}M_TABLE ;Add to table addr1690 LDY #01700 LDA NUM ;Convert to Ascii1710 JSR HEXASC1720 MOVE HEX,LIN r}E+6,2 ;To buffer1730 ;1740 ;Get mode index from table1750 ;1760 LDY #31770 SEC 1780 LDA (INDIR),Y1790 s}SBC #'A ;Remove Ascii offset1800 AND FLAG ;To print or not1810 ASL A ;Times 21820 TAX ;Se t}t index1830 ;1840 ;Get mnemonic from table1850 ;1860 DEY 1870 ML51880 LDA (INDIR),Y1890 STA M,Y1900 D u}EY 1910 BPL ML51920 ;1930 ;This simulates an ON-GOSUB1940 ;1950 LDA # >[ML6-1] ;Return address1960 PHA 197 v}0 LDA # <[ML6-1]1980 PHA 1990 LDA MODE+1,X2000 PHA 2010 LDA MODE,X2020 PHA 2030 RTS w} ;GOSUB2040 ;2050 MODE2060 .WORD IMPLIED-1,IMMEDIATE-1,ZERO_PAGE-1,ZERO_PAGE_X-12070 .WORD ZERO_PAGE_Y-1,ABSOLUTE x}-1,ABSOLUTE_X-1,ABSOLUTE_Y-12080 .WORD RELATIVE-1,INDIRECT_X-1,INDIRECT_Y-1,ABSOLUTE_IND-12090 .WORD ACCUMULATOR-1, y}JMP_JSR-1,INDIRECT-1,ABSOLUTE_IND_X-12100 ;2110 ML62120 LDA QUICK ;Quick 1st pass?2130 BEQ ML8 ;Yes, skip p z}rint2140 LDA ASMFLAG ;Disk output?2150 BNE ML7 ;No2160 PRINT 2,LINE+162170 JMP ML82180 ML72190 {} PRINT 2,LINE2200 ML82210 ON.ERROR ERROR2220 LDA CONSOL2230 CMP #START ;Pressed START?2240 BEQ ML9 |} ;Yes, exit2250 JMP ML1 ;Next line2260 ML92270 PLA ;POP2280 PLA 2290 LDA #FALSE ;No mor }}e2300 STA MORE2310 CLOSE 22320 CLOSE 32330 ML102340 LDA SCREEN ;Restore screen2350 STA SDMCTL ~}2360 LDA #02370 STA CRSINH ;Cursor on2380 STA DSPFLG ;Don't display ctrls2390 RTS 2400 ;2410 .PAGE } "Main Menu"2420 ;2430 ;Π՛2440 ;2450 MAIN_MENU2460 PRINT 0,"}"2470 POSITION 6,12480 PRINT 0," }ɠà"2490 POSITION 6,32500 PRINT 0,"Copyright Alec Benson, 1987"2510 POSITION 10, }62520 PRINT 0," DECODE MEMORY"2530 POSITION 10,82540 PRINT 0," DECODE DISK FILE"2550 POSITION 1 }0,102560 PRINT 0," DECODE DISK SECTOR(S)"2570 POSITION 10,122580 PRINT 0," PRINT LABEL TABLES"2590 } POSITION 10,142600 PRINT 0," ENTER LABELS"2610 POSITION 10,162620 PRINT 0," RETURN TO DOS"2630 MM }12640 POSITION 10,202650 PRINT 0,WHICH,LABEL_MSG-WHICH2660 LDA #'6 ;Max # commands2670 STA LIMIT }2680 LDA # MM12710 STA LINE_NO+12720 JSR GETK }EY ;Get keypress2730 PRINT 0,"}"2740 LDA #$FF2750 STA FLAG2760 LDA #FALSE ;Not accessing2770 STA } TABLES ;table routines2780 LDA R ;Command #2790 ASL A ;Times 22800 TAX 2810 ;2820 ;Simulated O }N-GOSUB to menu options2830 ;2840 LDA # >[MM2-1]2850 PHA 2860 LDA # <[MM2-1]2870 PHA 2880 LDA FUNCT }ION+1,X2890 PHA 2900 LDA FUNCTION,X2910 PHA 2920 MM22930 RTS 2940 ;2950 FUNCTION2960 .WORD MEMORY }-1,FILE-1,SECTOR-1,LABELS-1,LABEL_ENTRY-1,DOS-12970 ;2980 .PAGE "Initialisation"2990 ;3000 ;Λ3010 ;302 }0 INITIALISE3030 GRAPHICS 03040 LDA SDMCTL ;Save screen setup3050 STA SCREEN3060 LDA #0 ;Set left } margin3070 STA LMARGN3080 STA PIDX ;Init. variables3090 STA PIDX+13100 STA LIDX3110 STA LIDX+13 }120 STA ZIDX3130 STA ZIDX+13140 LDA #FALSE ;Set flag off3150 STA SECOND3160 SEC ;Calculate b }uffer3170 LDA MEMTOP ; length3180 SBC # BUF3220 } STA BUFLEN+13230 RTS 3240 ;3250 .PAGE "Enter Labels"3260 ;3270 ;Ҡӛ3280 ;3290 ENTER_LABELS3300 } PRINT 0,LABEL_MSG,ENTRY_MSG-LABEL_MSG3310 LDA #0 ;No commands3320 STA LIMIT3330 JSR GETKEY3340 P }RINT 0,RS3350 LDA RS3360 AND #$5F ;Make upper case3370 CMP #'Y ;Standard labels?3380 BEQ EL1 };Yes3390 JMP EL3 ;No, skip3400 ;3410 ;Read D:ZPLABEL.DAT3420 ;3430 EL13440 OPEN 3,4,0,"D:ZPLABEL.DAT"345 }0 ON.ERROR EL7 ;Not found3460 BGET 3,ZPAG,ZM ;Read file3470 DIV ICBLL+$30,ZL,ZIDX,TEMP3480 CLOSE 3 }3490 ;3500 ;Read D:PLABEL.DAT3510 ;3520 EL23530 OPEN 3,4,0,"D:PLABEL.DAT"3540 ON.ERROR EL8 ;Not found3550 } BGET 3,PAG,PM ;Read file3560 DIV ICBLL+$30,LL,PIDX,TEMP3570 CLOSE 33580 ;3590 LABEL_ENTRY3600 EL33610 } LDA #TRUE3620 STA ENTRYFLAG ;Allow label entry3630 EL43640 POSITION 0,13650 PRINT 0,ENTRY_MSG,ADDRES }S_MSG-ENTRY_MSG3660 INPUT 0,L,SL+1 ;Get a label3670 LDA L3680 CMP #'E ;END?3690 BNE EL53700 LD }A L+13710 CMP #'N3720 BNE EL53730 LDA L+23740 CMP #'D3750 BNE EL53760 LDA L+33770 CMP #EOL }3780 BNE EL53790 LDA #FALSE ;No more labels3800 STA ENTRYFLAG3810 RTS 3820 ;3830 EL53840 LDA L } ;Null entry?3850 CMP #EOL3860 BEQ EL4 ;Yes, try again3870 ;3880 ;NOTE: Have to allow for EOL3890 ; in IN }PUT character count.3900 LDA #SL+1 ;Is label =3910 SEC ;to standard3920 SBC ICBLL ;length?3930 } BEQ EL6 ;Yes3940 TAY ;No-Shorter3950 LDX #SL-1 ;Add spaces3960 LDA #SPACE ;to make-up3970 EL }5A3980 STA L,X ;length3990 DEX 4000 DEY 4010 BNE EL5A4020 ;4030 EL64040 POSITION 1,64050 } PRINT 0,ADDRESS_MSG,NUMBER_MSG-ADDRESS_MSG4060 LDA # EL64090 STA LINE_NO+14100 JSR HEXIN ;Get a hex address4110 JSR CLR_ERRLINE ;Clear error msg line4120 ; }4130 LDA #FALSE ;Don't create4140 STA LABFLAG ; labels4150 LDA L ;Save 1st char4160 STA LSAVE4170 } JSR LAB_SEARCH ;Look for label4180 LDA FOUND ;Found label?4190 BEQ EL6.1 ;Yes4200 LDA #TRUE ;Create }label4210 STA LABFLAG4220 LDA LSAVE ;Recover 1st char4230 STA L4240 JSR PAG_SEARCH ;Look for label4250 } EL6.14260 PRINT 0,"}"4270 JMP EL44280 ;4290 ;Warning messages4300 ;4310 EL74320 CLOSE 34330 POS }ITION 5,184340 PRINT 0,"Couldn't find D:ZPLABEL.DAT"4350 JMP EL24360 ;4370 EL84380 CLOSE 34390 PO }SITION 5,204400 PRINT 0,"Couldn't find D:PLABEL.DAT"4410 JMP EL34420 ;4430 .END CLOSE 34390 PO d1000 ;Filename: D:DISSEM.31010 ;1020 .PAGE "Addressing Modes"1030 ;1040 ;ĠǠԛ1050 ;1060 IMPLIE}D1070 LDA L ;Found label?1080 BEQ IM1 ;No1090 MOVE L,LINE+16,SL ;Move label1100 IM11110 LDA }FLAG ;Text?1120 BEQ TEXT ;Yes1130 LDA M ;Invalid opcode?1140 CMP #'?1150 BEQ TEXT ;Yes116}0 MOVE M,LINE16+1,3 ;Move mnemonic1170 LDA #EOL ;Terminate line1180 STA LINE16+41190 RTS 1200 ;1210} TEXT1220 LDA #0 ;Set text mode1230 STA FLAG1240 MOVE AM1,LINE16+1,7 ;.BYTE $1250 MOVE HEX,LINE1}6+8,21260 LDA #';1270 STA LINE16+131280 LDA NUM1290 STA LINE16+141300 LDA #EOL1310 STA LINE16+1}51320 LDA NUM ;Opcode1330 BEQ TE1 ;BRK (0)1340 CMP #EOL1350 BNE TE2 ;Remain in text mode1360} TE11370 LDA #$FF ;Exit text mode1380 STA FLAG1390 TE21400 RTS 1410 ;1420 ;ŠǛ1430 ;1}440 IMMEDIATE1450 JSR INCPTR ;Inc. code pointer1460 JSR MOVE_MNEM ;Move mnemonic1470 MOVE AM2,LINE16+6,2 ;#}$1480 MOVE HEX,LINE16+8,21490 LDA #EOL1500 STA LINE16+101510 RTS 1520 ;1530 ;ϠŠǛ154}0 ;1550 ZERO_PAGE1560 LDA #EOL1570 STA WRK1580 ZP11590 JSR INCPTR ;Inc. code ptr.1600 JSR MOVE_MNEM ;M}ove mnem.1610 LDA #TRUE ;Create label1620 STA LABFLAG1630 JSR ZPAG_SEARCH ;Look for label1640 JSR FLUSH}_BLANKS1650 ZP21660 LDA L,X ;Move label1670 STA LINE16+6,X1680 DEX 1690 BPL ZP21700 LDY XSAVE1}710 INY 1720 LDX #01730 ZP31740 LDA WRK,X1750 STA LINE16+6,Y1760 INX 1770 INY 1780 CMP #EO}L1790 BNE ZP31800 RTS 1810 ;1820 ;ϠŠؠǠś1830 ;1840 ZERO_PAGE_X1850 MOVE AM3,WRK,3 ;},X1860 JMP ZP11870 ;1880 ;ϠŠ٠Ǡś1890 ;1900 ZERO_PAGE_Y1910 MOVE AM4,WRK,3 ;,Y1920 J}MP ZP11930 ;1940 ;ŠǠś1950 ;1960 ABSOLUTE1970 LDA #EOL1980 STA WRK1990 AB12000 JSR IN}CPTR ;Inc. code ptr2010 MOVE HEX,LINE+9,2 ;Address2020 LDA NUM ;Save2030 STA TEMP2040 JSR INCPTR2}050 MOVE HEX,LINE+12,22060 JSR MOVE_MNEM1 ;Move mnem.2070 LDA NUM2080 STA NUM+12090 LDA TEMP2100 } STA NUM2110 LDA #TRUE ;Create label2120 STA LABFLAG2130 JSR PAG_SEARCH ;Find label2140 LDA L ;}Found label?2150 BEQ AB5 ;No2160 JSR FLUSH_BLANKS ;Yes2170 AB22180 LDA L,X ;Move label2190 STA L}INE16+6,X2200 DEX 2210 BPL AB22220 LDY XSAVE2230 INY 2240 AB32250 LDX #02260 AB42270 LDA WRK,}X2280 STA LINE16+6,Y2290 INX 2300 INY 2310 CMP #EOL2320 BNE AB42330 RTS 2340 ;2350 AB52360 } LDA #'$ ;No label2370 STA LINE16+62380 MOVE LINE+12,LINE16+7,22390 MOVE LINE+9,LINE16+9,22400 }LDY #52410 JMP AB32420 ;2430 ;ŠؠǠś2440 ;2450 ABSOLUTE_X2460 MOVE AM3,WRK,3 ;,X2470 } JMP AB12480 ;2490 ;Š٠Ǡś2500 ;2510 ABSOLUTE_Y2520 MOVE AM4,WRK,3 ;,Y2530 JMP AB12540 ;}2550 ;ԩؠǠś2560 ;2570 INDIRECT_X2580 MOVE AM5,WRK,4 ;,X)2590 JMP IY12600 ;2610 ;}ԩ٠Ǡś2620 ;2630 INDIRECT_Y2640 MOVE AM6,WRK,4 ;),Y2650 IY12660 JSR INCPTR ;Inc. code ptr26}70 JSR MOVE_MNEM ;Move mnem2680 LDA #TRUE ;Create label2690 STA LABFLAG2700 LDA #'(2710 STA LINE16+}62720 JSR ZPAG_SEARCH ;Look for label2730 JSR FLUSH_BLANKS2740 IY22750 LDA L,X ;Move label2760 STA L}INE16+7,X2770 DEX 2780 BPL IY22790 LDY XSAVE2800 INY 2810 LDX #02820 IY32830 LDA WRK,X2840 } STA LINE16+7,Y2850 INX 2860 INY 2870 CMP #EOL2880 BNE IY32890 RTS 2900 ;2910 ;ԩ}Ǡś2920 ;2930 ;65C02 Processor only2940 ;2950 INDIRECT2960 MOVE AM7,WRK,2 ;)2970 JMP IY12980 ;2990 ;}ŠǠś3000 ;3010 RELATIVE3020 JSR INCPTR ;Inc. code ptr3030 LDA NUM ;Save branch disp.3040 } STA TEMP+63050 JSR MOVE_MNEM ;Move mnem3060 ;3070 ;NUM=TEMP+POINTER+1-OFFSET3080 ;ie address of forward branch30}90 SUBW POINTER,OFFSET,NUM3100 SEC 3110 LDA NUM3120 ADC TEMP+63130 STA NUM3140 LDA NUM+13150 } ADC #03160 STA NUM+13170 LDA #1273180 ;3190 CMP TEMP+6 ;Forward branch3200 BCS RE1 ;Yes3210 ;}3220 ;NUM=TEMP+POINTER-255-OFFSET3230 ;ie address of backwards branch3240 SEC 3250 LDA NUM3260 SBC # <256327}0 STA NUM3280 LDA NUM+13290 SBC # >2563300 STA NUM+13310 RE13320 JSR PAG_SEARCH ;Look for label in a}ddress table3330 LDA FOUND ;Found label?3340 BEQ RE1A ;Yes3350 LDA #'L ;1st char of label3360 ST}A L3370 MOVE SPACES,L+1,SL-1 ;Fill rest of label with spaces3380 LDA #TRUE ;Create label3390 STA LABFLAG3}400 JSR LAB_SEARCH ;Look for label in branch table3410 LDA FOUND ;Found label?3420 BNE RE3 ;No3430 RE1A}3440 JSR FLUSH_BLANKS ;Yes3450 RE23460 LDA L,X ;Move label3470 STA LINE16+6,X3480 DEX 3490 BPL R}E23500 LDY XSAVE3510 INY 3520 LDA #EOL3530 STA LINE16+6,Y3540 RTS 3550 ;No label3560 RE33570 }LDA #'*3580 STA LINE16+63590 LDA #127 ;Forward branch?3600 CMP TEMP+63610 BCS RE5 ;Yes3620 LD}A #'-3630 STA LINE16+73640 SEC ;Make positive3650 LDA #2543660 SBC TEMP+63670 STA DECL ;S}ave3680 RE43690 LDA #03700 STA DECH3710 LDA # <[LINE16+8] ;Set up pointer3720 STA INDIR3730 LDA # >}[LINE16+8]3740 STA INDIR+13750 JSR DECOUT ;Convert to Ascii3760 LDA #EOL3770 INY 3780 STA (INDIR),Y}3790 RTS 3800 ;3810 RE53820 LDA #'+3830 STA LINE16+73840 CLC ;Adjust disp.3850 LDA TEMP+6}3860 ADC #23870 STA DECL3880 JMP RE43890 ;3900 ;ŠԠǠś3910 ;3920 ABSOLUTE_IND39}30 MOVE AM7,WRK,2 ;)3940 AI3950 JSR INCPTR ;Inc code ptr3960 MOVE HEX,LINE+9,23970 LDA NUM3980 }STA TEMP ;Save3990 JSR INCPTR ;Inc code ptr4000 MOVE HEX,LINE+12,24010 JSR MOVE_MNEM1 ;Move mnem4020 } LDA NUM4030 STA NUM+14040 LDA TEMP4050 STA NUM4060 LDA #'(4070 STA LINE16+64080 JSR PAG_SEARC}H ;Look for label4090 LDA FOUND ;Found label?4100 BEQ AI0 ;Yes4110 LDA #'J ;1st char of label4120 } STA L ;Save it4130 MOVE SPACES,L+1,SL-1 ;Fill rest of label with spaces4140 LDA #TRUE ;Create label41}50 STA LABFLAG4160 JSR LAB_SEARCH ;Look for label4170 LDA L ;Found label?4180 BEQ AI3 ;No4190 A}I04200 JSR FLUSH_BLANKS ;Yes4210 AI14220 LDA L,X ;Move label4230 STA LINE16+7,X4240 DEX 4250 BP}L AI14260 LDY XSAVE4270 INY 4280 AI1.14290 LDX #04300 AI24310 LDA WRK,X4320 STA LINE16+7,Y4330 } INX 4340 INY 4350 CMP #EOL4360 BNE AI24370 RTS 4380 ;4390 AI34400 LDA #'$ ;Label not found4}410 STA LINE16+74420 MOVE LINE+12,LINE16+8,24430 MOVE LINE+9,LINE16+10,24440 LDY #54450 JMP AI1.1}4460 ;4470 ;ŠԠؠǠś4480 ;4490 ;65C02 processor only4500 ;4510 ABSOLUTE_IND_X4520 MOVE} AM5,WRK,4 ;,X)4530 JMP AI4540 ;4550 ;ҠǠś4560 ;4570 ACCUMULATOR4580 LDA L ;Found} label?4590 BEQ AC1 ;No4600 MOVE L,LINE+16,SL ;Move label4610 AC14620 MOVE M,LINE16+1,3 ;Move mnem46}30 LDA #'A4640 STA LINE16+64650 LDA #EOL4660 STA LINE16+74670 RTS 4680 ;4690 ;РҠŠ}Ǡś4700 ;4710 JMP_JSR4720 JSR INCPTR ;Inc code ptr4730 MOVE HEX,LINE+9,24740 LDA NUM4750 S}TA TEMP ;Save4760 JSR INCPTR ;Inc code ptr4770 MOVE HEX,LINE+12,24780 JSR MOVE_MNEM1 ;Move mnem4790 } LDA NUM4800 STA NUM+14810 LDA TEMP4820 STA NUM4830 JSR PAG_SEARCH ;Look for label in address table4840 } LDA FOUND ;Found label?4850 BEQ JJ0 ;Yes4860 LDA #'J ;1st char of label4870 STA L4880 MOVE} SPACES,L+1,SL-1 ;Fill rest of label with spaces4890 LDA #TRUE ;Create label4900 STA LABFLAG4910 JSR LAB_SE}ARCH ;Look for label in branch/jump table4920 LDA L ;Found label?4930 BEQ JJ2 ;No4940 JJ04950 JSR F}LUSH_BLANKS ;Yes4960 JJ14970 LDA L,X ;Move label4980 STA LINE16+6,X4990 DEX 5000 BPL JJ15010 LD}Y XSAVE5020 INY 5030 LDA #EOL5040 STA LINE16+6,Y5050 RTS 5060 ;5070 JJ25080 LDA #'$ ;No label }found5090 STA LINE16+65100 MOVE LINE+12,LINE16+7,25110 MOVE LINE+9,LINE16+9,25120 LDA #EOL5130 S}TA LINE16+115140 RTS 5150 ;5160 .END 12,LINE16+7,25110 MOVE LINE+9,LINE16+9,25120 LDA #EOL5130 S11000 ;Filename: D:DISSEM.41010 ;1020 .PAGE "Decoding Routines"1030 ;1040 ;Šٛ1050 ;1060 MEMORY1070 }POSITION 1,21080 PRINT 0,START_MSG,END_MSG-START_MSG1090 LDA # MEMO}RY1120 STA LINE_NO+11130 JSR HEXIN ;Start address1140 JSR CLR_ERRLINE ;Clear error msg line1150 LDA SEC}OND ;2nd time through?1160 BNE ME1 ;No1170 LDA TEMP1180 CMP #EOL ;Null entry?1190 BNE ME1 ;No}1200 MOVE SAVPOINTER,POINTER,2 art ;Use old start address1210 JMP ME21220 ME11230 SEC 1240 LDA NUM } ;Start addr -11250 SBC #11260 STA POINTER1270 STA SAVPOINTER1280 LDA NUM+11290 SBC #01300 STA }POINTER+11310 STA SAVPOINTER+11320 LDA #0 ;No offset1330 STA OFFSET1340 STA OFFSET+11350 ME21360 } POSITION 1,41370 PRINT 0,END_MSG,FILE_MSG-END_MSG1380 LDA # ME214}10 STA LINE_NO+11420 JSR HEXIN ;End address1430 JSR CLR_ERRLINE ;Clear error msg line1440 LDA SECOND ;2}nd time through?1450 BNE ME3 ;No1460 LDA TEMP1470 CMP #EOL ;Null entry?1480 BEQ ME5 ;Yes1490 }ME31500 LDA TEMP1510 CMP #EOL ;Null entry?1520 BNE ME4 ;No1530 LDA #$FF ;End address1540 S}TA NUM ; = $FFFF1550 STA NUM+11560 ME41570 MOVE NUM,CODEND,2 ;Set end addr1580 ME51590 JSR OUTPUT ;Ch}oose output device1600 LDA #TRUE1610 STA SECOND ;2nd time=true1620 JSR DISASSEM ;Disassemble1630 CLOSE } 21640 LDA NOSCREEN ;Screen off?1650 BEQ ME6 ;Yes-Skip1660 JSR PAUSE ;Wait for keypress1670 ME61680 } RTS 1690 ;1700 ;ŠӠś1710 ;1720 FILE1730 POSITION 1,21740 PRINT 0,FILE_MSG,BIN_MSG-FILE_MSG175}0 MOVE SPACES,IN+1,2 ;Clear :'s1760 INPUT 0,IN,16 ;Filename1770 LDA IN1780 CMP #EOL ;No file name?}1790 BEQ FILE ;Yes- Re-prompt1800 POSITION 1,41810 PRINT 0,BIN_MSG,ORG_MSG-BIN_MSG1820 LDA #01830 } STA LIMIT1840 LDA #FALSE1850 STA LODFILE ;Not load file1860 STA SECOND ;1st time through1870 JSR GET}KEY ;Get response1880 PRINT 0,RS ;Print it1890 LDA RS1900 AND #$5F ;Fold to uppercase1910 CMP #'Y } ;Yes?1920 BNE FI1 ;No1930 LDA #TRUE ;It's a load file1940 STA LODFILE1950 JMP FI21960 FI11970 } POSITION 1,61980 PRINT 0,ORG_MSG,SECNUM_MSG-ORG_MSG1990 LDA # FI1}2020 STA LINE_NO+12030 JSR HEXIN ;Get ORG address2050 FI22060 JSR OUTPUT ;Choose output device2070 LD}A #3 ;End of buffer adj2080 STA X2090 LDA #02100 STA X+12110 JSR OPENIN ;Open file-Read2120 O}N.ERROR ERROR2130 LDA LODFILE ;Load file?2140 BEQ FI3 ;Yes2150 MOVE BUFLEN,LENGTH,2 ;#bytes = buffer le}ngth2160 JMP FI52170 FI32180 LDA #3 ;End of buffer adj2190 STA X2200 BGET 3,FIRST,2 ;Read file22 }10 ON.ERROR FI142220 LDA #$FF ;Test header2230 CMP FIRST2240 BNE FI42250 CMP FIRST+12260 BN }E FI42270 BGET 3,FIRST,2 ;Start addr2280 FI42285 MOVE FIRST,NUM,2 ;Save2290 BGET 3,LAST,2 ;End addr230 }0 SUBW LAST,FIRST,LENGTH2310 BUMP LENGTH ;Segment length2320 FI52330 LDA #FALSE2340 STA MORE ;No m }ore segments2350 CPW BUFLEN,LENGTH ;Buffer< segment length?2360 BCS FI6 ;No2370 LDA #TRUE ;Yes2380  } STA MORE ; more segment2390 SUBW LENGTH,BUFLEN,SURPLUS ;Bytes left over2400 MOVE BUFLEN,LENGTH,2 ;Set leng}th=buffer length2410 FI62420 BGET 3,BUF,LENGTH,0 ;Read file2430 MOVE ICBLL+$30,LENGTH,2 ;# of bytes read2440 } LDA #FALSE ;Assume not EOF2450 CPY #1 ;Read whole of length?2460 BEQ FI9 ;Yes2470 LDA #TRUE ;E}nd of file2480 FI92490 STA END.OF.FILE2500 ;2510 ;POINTER=BUF-1-(3-X)2520 ADDW X,BUF,POINTER2530 SEC 254}0 LDA POINTER2550 SBC #42560 STA POINTER2570 STA SAVPOINTER2580 LDA POINTER+12590 SBC #02600 } STA POINTER+12610 STA SAVPOINTER+12620 ;2630 ;OFFSET=BUF-NUM-(3-X)2640 ADDW X,BUF,OFFSET2650 SEC 2660 } LDA OFFSET2670 SBC #32680 STA OFFSET2690 LDA OFFSET+12700 SBC #02710 STA OFFSET+12720 SUBW } OFFSET,NUM2730 ;2740 ;CODEND=BUF+LENGTH-1-OFFSET2750 ADDW LENGTH,BUF,CODEND2760 SEC 2770 LDA CODEND2780 } SBC #12790 STA CODEND2800 LDA CODEND+12810 SBC #02820 STA CODEND+12830 SUBW CODEND,OFFSET2840} ;2850 LDA MORE ;More?2860 BEQ FI10 ;Yes2870 LDA LODFILE ;Load file?2880 BEQ FI11 ;Yes2890 }LDA END.OF.FILE ;End of file?2900 BEQ FI11 ;Yes2910 FI102920 ;2930 ;CODEND=CODEND-22940 LDA CODEND2950 S}BC #22960 STA CODEND2970 LDA CODEND+12980 SBC #02990 STA CODEND+13000 ;3010 FI113020 LDA #TRUE303}0 STA SECOND ;2nd time3040 JSR DISASSEM ;Disassemble3050 ;3060 ;X=NUM-CODEND3070 SEC 3080 LDA NUM3090 } SBC CODEND3100 STA X3110 ;3120 LDA MORE ;More?3130 BNE FI12 ;No3140 MOVE SURPLUS,LENGTH,2 ;S}et length to read = surplus bytes3150 JSR ADJUST ;Fix up disassembly at end of buffer3160 JMP FI5 ;Do rest of }segment3170 FI123180 LDA END.OF.FILE ;End of file?3190 BEQ FI14 ;Yes3200 LDA LODFILE ;Load file?3210 }BNE FI13 ;No3220 JMP FI3 ;Yes-Next segment3230 FI133240 MOVE BUFLEN,LENGTH,2 ;LENGTH=BUFLEN3250 JSR }ADJUST ;Fix up3260 JMP FI5 ;Do rest of file3270 FI143280 CLOSE 23290 CLOSE 33300 LDA NOSCREEN ;}Screen off?3310 BEQ FI15 ;Yes-Skip3320 JSR PAUSE ;No-Wait for key3330 FI153340 RTS 3350 ;3360 ;Subrout }ine to move bytes from3370 ;end of buffer to start of3380 ;buffer. This ensures that an3390 ;opcode and its arguments are!}3400 ;not broken-up by crossing over3410 ;the end of the file buffer.3420 ;3430 ADJUST3440 LDY #0 ;Index3450 "} LDA X ;Bytes to move3460 CMP #1 ;2 byte instruction?3470 BNE ADJ1 ;No3480 LDA (POINTER),Y ;Yes#}3490 STA BUF-2 ;Move3500 INY 3510 LDA (POINTER),Y3520 STA BUF-13530 RTS 3540 ADJ13550 CMP #2$} ;1 byte instruction3560 BNE ADJ2 ;No-Exit3570 LDA (POINTER),Y ;Yes3580 STA BUF-1 ;Move3590 ADJ236%}00 RTS 3610 ;3620 ;Šˠӛ3630 ;3640 SECTOR3650 POSITION 1,23660 PRINT 0,SECNUM_MSG,NUMSEC_&}MSG-SECNUM_MSG3670 LDA # SECTOR3700 STA LINE_NO+13710 JSR DECIN '} ;Get start sector #3720 JSR CLR_ERRLINE ;Clear error msg line3730 LDA NUM ;=0?3740 ORA NUM+13750 BEQ(} SE1 ;Yes-Error3760 ;3770 LDA NUM ;> 1040?3780 SBC # <[1040+1]3790 LDA NUM+13800 SBC # >[1040+1])}3810 BCC SE2 ;No-Ok3820 SE13830 POSITION 0,223840 PRINT 0,NUMBER_MSG+1,ERROR_MSG-[NUMBER_MSG+1]3850 *} JMP SECTOR3860 SE23870 MOVE NUM,SECTOR.NO,2 ;Save3880 SE2A3890 POSITION 1,43900 PRINT 0,NUMSEC_MSG+},RETURN_MSG-NUMSEC_MSG3910 LDA # SE2A3940 STA LINE_NO+13950 JSR DEC,}IN ;Get number of sectors3960 JSR CLR_ERRLINE ;Clear error msg line3970 SEC 3980 LDA # <10413990 SBC SE-}CTOR.NO ;1041-start sector #4000 STA DECL4010 LDA # >10414020 SBC SECTOR.NO+14030 STA DECH4040 ;4050 .} LDA NUM ;=0?4060 ORA NUM+14070 BEQ SE3 ;Yes-Error4080 ;4090 CLC ;# sectors+14100 LDA D/}ECL4110 ADC #14120 STA TEMP4130 LDA DECH4140 ADC #04150 STA TEMP+14160 ;4170 CPW NUM,TEMP ;I0}n range?4180 BCC SE4 ;Yes-Skip4190 SE34200 POSITION 0,224210 PRINT 0,NUMBER_MSG+1,CONT_MSG-[NUMBER_MS1}G+1]4220 LDA # ERROR_NUM4250 STA INDIR+14260 JS2}R DECOUT ;Convert to Ascii decimal number4270 INY 4280 LDA #EOL4290 STA (INDIR),Y4300 PRINT 0,ERROR_NU3}M ;Print max sector #4310 JMP SE2A4320 SE44330 MOVE NUM,NO.SECTORS,2 ;Save4340 SE4.14350 POSITION 1,6434}60 PRINT 0,ORG_MSG,SECNUM_MSG-ORG_MSG4370 LDA # SE4.14400 STA LIN5}E_NO+14410 JSR HEXIN ;Get ORG address4420 JSR CLR_ERRLINE ;Clear error msg line4430 LDA #FALSE4440 STA 6}SECOND ;Set not second4450 LDA #TRUE4460 STA SINGLE ;1 drive4470 POSITION 1,84480 PRINT 0,"Insert s7}ource disk in drive 1"4490 JSR PAUSE ;Wait for key4500 DSTATUS 3,TEMP ;Drive status4510 ON.ERROR ERROR48}520 LDA DVSTAT ;Get drive status4530 AND #$20 ;Double density?4540 BEQ SE5 ;No-Single4550 LDA # <29}56 ;Set sector size4560 STA SECSIZ4570 LDA # >2564580 BNE SE64590 SE54600 LDA #128 ;Set sector size:}4610 STA SECSIZ4620 LDA #04630 SE64640 STA SECSIZ+14650 SE6A4660 ;4670 ;POINTER=BUF-14680 LDA # <[BUF-;}1]4690 STA POINTER4700 STA SAVPOINTER4710 LDA # >[BUF-1]4720 STA POINTER+14730 STA SAVPOINTER+14740<} ;4750 ;OFFSET=BUF-NUM4760 SEC 4770 LDA # BUF4810 S=}BC NUM+14820 STA OFFSET+14830 ;4840 LDA #FALSE4850 STA MORE ;Not more4860 MUL NO.SECTORS,SECSIZ,TEM>}P,TEMP+2,0 ;# bytes4870 CPW BUFLEN,TEMP ;# bytes>buffer length?4880 LDA #04890 SBC TEMP+24900 BCS SE7 ?} ;no-Skip4910 LDA #TRUE ;Yes4920 STA MORE ;Show more4930 MOVE NO.SECTORS,SAV.NO.SECTORS,2 ;Save # of @}sectors4940 ;4950 ;CODEND=BUF+NO.SECTORS*SECSIZ-1-OFFSET4960 DIV BUFLEN,SECSIZ,NO.SECTORS,TEMP+2,0 ;Divide buffer byA} sector length4970 SE74980 MUL NO.SECTORS,SECSIZ,CODEND,TEMP,04990 SUBW CODEND,OFFSET5000 ADDW CODEND,BB}UF5010 SEC 5020 LDA CODEND5030 SBC #15040 STA CODEND5050 LDA CODEND+15060 SBC #05070 STA CC}ODEND+15080 ;5090 LDA ASMFLAG ;Disk output?5100 BNE SE8 ;No-Skip5110 LDA SECOND ;2nd time through?5120 D} BNE SE8 ;No-Skip5130 LDA SINGLE ;1 drive?5140 BNE SE8 ;No-Skip5150 PRINT 0,"} Insert source diE}sk"5160 JSR PAUSE ;Wait for key5170 SE85180 MOVE NO.SECTORS,TEMP,25190 DISKIO 1,'R,SECTOR.NO,TEMP,SECSIF}Z,BUF5200 ON.ERROR ERROR5210 SE95220 LDA SECOND ;2nd time through?5230 BEQ SE10 ;Yes-Skip5240 JSR G}OUTPUT ;No-Get output device5250 LDA ASMFLAG ;Output to disk?5260 BNE SE10 ;No-Skip5270 LDA ICDNO+$20 ;GetH} drive #5280 CMP #1 ;1 drive?5290 BEQ SE10 ;Yes-Skip5300 LDA #FALSE ;No5310 STA SINGLE ;Show muI}lti drive5320 SE105330 LDA ASMFLAG ;Output to disk?5340 BNE SE11 ;No-Skip5350 LDA SECOND ;2nd time througJ}h?5360 BNE SE11 ;No-Skip5370 LDA SINGLE ;1 drive?5380 BNE SE11 ;No-Skip5390 PRINT 0,"} Insert dK}estination disk"5400 JSR PAUSE ;Wait for key5410 SE115420 LDA #TRUE5430 STA SECOND ;Set 2nd time flag5440L} JSR DISASSEM ;Disassemble5450 LDA MORE ;More?5460 BNE SE12 ;No-Skip5470 ;5480 ;SECTOR.NO=SECTOR.NO+NO.M}SECTORS5490 CLC 5500 LDA SECTOR.NO5510 ADC NO.SECTORS5520 STA SECTOR.NO5530 LDA SECTOR.NO+15540 N} ADC NO.SECTORS+15550 STA SECTOR.NO+15560 ;5570 ;NO.SECTORS=SAV.NO.SECTORS-NO.SECTORS5580 SUBW SAV.NO.SECTORS,NO}O.SECTORS,NO.SECTORS5590 JMP SE6A ;Read some more5600 SE125610 CLOSE 25620 LDA NOSCREEN ;Screen off?563P}0 BEQ SE13 ;Yes5640 JSR PAUSE ;Wait for key5650 SE135660 RTS 5670 ;5680 .PAGE "Label Printing"5690Q} ;5700 ;Ԡ̠ӛ5710 ;5720 LABELS5730 LDA #TRUE5740 STA TABLES ;Doing table routines5750 LDA #FAR}LSE5760 STA ALL ;Not all labels5770 PRINT 0,"}"5780 POSITION 14,15790 PRINT 0,"̠"58S}00 POSITION 10,45810 PRINT 0," ALL BRANCHES & JUMPS"5820 POSITION 10,65830 PRINT 0," BRANCHES ONT}LY"5840 POSITION 10,85850 PRINT 0," JUMPS ONLY"5860 POSITION 10,105870 PRINT 0," ZERO-PAGE MEMOU}RY LOCATIONS"5880 POSITION 10,125890 PRINT 0," NON ZERO-PAGE LOCATIONS"5900 POSITION 10,145910 PRV}INT 0," MEMORY LOCATIONS & JUMPS"5920 POSITION 10,165930 PRINT 0," WRITE DATA FILES"5940 POSITION 10,W}185950 PRINT 0," RETURN TO MAIN MENU"5960 LA15970 POSITION 10,215980 PRINT 0,WHICH,LABEL_MSG-WHICH599X}0 LDA #'86000 STA LIMIT6010 LDA # LA16040 STA LINE_NO+16050 Y} JSR GETKEY ;Get response6060 LDA R6070 STA R1 ;Save6080 LDA RS6090 CMP #'7 ;Skip output routinZ}e6100 BCS LA26110 JSR OUTPUT ;Choose output device6120 LA26130 LDA R1 ;Get response6140 ASL A [} ;*26150 TAX 6160 LDA # >[LA3-1]6170 PHA 6180 LDA # <[LA3-1]6190 PHA 6200 LDA LABEL_OPTIONS+1,\}X6210 PHA 6220 LDA LABEL_OPTIONS,X6230 PHA 6240 RTS ;ON GOSUB6250 ;6260 LABEL_OPTIONS6270 ]}.WORD BRANCHES_JUMPS-1,BRANCHES-1,JUMPS-1,ZERO_PAGE_LABELS-16280 .WORD NON_ZERO_PAGE-1,ALL_LABELS-1,DATA_FILES-1,EXIT_MA^}IN-16290 LA36300 CLOSE 26310 JMP LABELS ;Around & around6320 ;6330 ;Print branches & jumps6340 ;6350 BRANCH_}ES_JUMPS6360 LDA #06370 STA L ;Null selection6380 BJ16390 PRINT 2,"*BRANCHES AND JUMPS"6400 LDA `}# LAB6430 STA INDIR+16440 LDA #FALSE6450 STA ZPRINT a};Not zero page6460 LDA #LL ;Entry length6470 STA LLENGTH6480 MOVE LIDX,NO_ENTRIES,2 ;# of entries6490 b} ORA NO_ENTRIES ;Table empty?6500 BNE BJ2 ;No6510 JMP LP3 ;Yes-Exit6520 BJ26530 JMP LABEL_PRINT ;Doc} printing6540 ;6550 ;Print branches only6560 ;6570 BRANCHES6580 LDA #'L6590 STA L ;Branches start with Ld}6600 JMP BJ1 ;Do printing6610 ;6620 ;Print jumps only6630 ;6640 JUMPS6650 LDA #'J6660 STA L ;Jumpe}s start with J6670 JMP BJ1 ;Do printing6680 ;6690 ;Print non zero-page addresses6700 ;6710 NON_ZERO_PAGE6720 f} LDA #06730 STA L ;Null6740 PRINT 2,"* NON ZERO PAGE ADDRESSES"6750 LDA # PAG6780 STA INDIR+16790 LDA #FALSE6800 STA ZPRINT ;Not zero page6810 LDA #q} B$DOS SYSB(DISSEM 0 B4/DISSEM 1 BCcDISSEM 2 BJDISSEM 3 BDISSEM 4 BZDISSEM 5 B?DISSEM 6 B!/SYSEQU M65BwPDISSEM MACLL ;Entry length6820 STA LLENGTH6830 MOVE PIDX,NO_ENTRIES,2 ;# of entries6840 ORA NO_ENTRIES ;Table emptr}y?6850 BNE NZP1 ;No6860 JMP LP3 ;Yes-Exit6870 NZP16880 JMP LABEL_PRINT ;Do printing6890 ;6900 ;Prints} zero page labels6910 ;6920 ZERO_PAGE_LABELS6930 LDA #06940 STA L ;Null6950 PRINT 2,"* ZERO PAGE ADDt}RESSES"6960 LDA # ZPAG6990 STA INDIR+17000 LDA #TRUEu}7010 STA ZPRINT ;Printing zero page7020 LDA #ZL ;Entry length7030 STA LLENGTH7040 MOVE ZIDX,NO_ENTRv}IES,2 ;# of entries7050 ORA NO_ENTRIES ;Table empty?7060 BNE ZPL1 ;No7070 JMP LP3 ;Yes-Exit7080 ZPL17w}090 JMP LABEL_PRINT ;Do printing7100 ;7110 ;Print all addresses & jumps7120 ;7130 ALL_LABELS7140 LDA #TRUE7150 x} STA ALL ;Print all labels7160 JSR ZERO_PAGE_LABELS7170 JSR NON_ZERO_PAGE7180 LDA #FALSE7190 STA Ay}LL ;Flag off7200 JMP JUMPS7210 ;7220 ;Write ZPLABEL.DAT & PLABEL.DAT7230 ;7240 DATA_FILES7250 PRINT 0,DATz}A_MSG,END.OF.MESSAGES-DATA_MSG7260 LDA #07270 STA LIMIT7280 JSR GETKEY ;Wait for key7290 PRINT 0,RS ;P{}rint response7300 LDA RS ;Get response7310 AND #$5F ;Fold to upper-case7320 CMP #'Y ;Yes?7330 |} BEQ DF1 ;Yes7340 JMP DF2 ;No7350 DF17360 PRINT 0,RETURN_MSG,DATA_MSG-RETURN_MSG7370 LDA #07380 }} STA LIMIT7390 JSR GETKEY ;Wait for key7400 PRINT 0,"}Writing ZPLABEL.DAT"7410 CLOSE 27420 OPEN~} 2,8,0,"D1:ZPLABEL.DAT"7430 ON.ERROR ERROR7440 MUL ZIDX,ZL,TEMP,TEMP+2 ;Calculate file length7450 BPUT }2,ZPAG,TEMP,07460 ON.ERROR ERROR7470 CLOSE 27480 PRINT 0,"Writing PLABEL.DAT"7490 OPEN 2,8,0,}"D1:PLABEL.DAT"7500 ON.ERROR ERROR7510 MUL PIDX,LL,TEMP,TEMP+2 ;Calculate file length7520 BPUT 2,PAG,TEM}P,07530 ON.ERROR ERROR7540 DF27550 RTS 7560 ;7570 ;Return to main menu7580 ;7590 EXIT_MAIN7600 PLA } ;Pop return addr.7610 PLA 7620 RTS 7630 ;7640 ;Main label printing routine7650 ;7660 LABEL_PRINT7670 L}DA CONSOL ;Check function keys7680 CMP #START ;START key?7690 BNE LP0 ;No-Continue7700 RTS ;Yes-}Exit7710 ;7720 LP07730 LDA L ;Check 1st char?7740 BEQ LP1 ;No-Skip7750 LDY #07760 LDA (INDIR)},Y ;Get 1st char7770 CMP L ;The one we want?7780 BNE LP2 ;No7790 LP17800 JSR PRINT_LABELS ;Print la}bel7810 LP27820 CLC 7830 LDA LLENGTH ;Get entry length7840 ADC INDIR ;Add to index7850 STA INDIR7860 } LDA INDIR+17870 ADC #07880 STA INDIR+17890 DEC NO_ENTRIES ;Dec. # entries7900 BNE LABEL_PRINT ;Next l}abel7910 LDA NO_ENTRIES+17920 BEQ LP3 ;Finished7930 DEC NO_ENTRIES+17940 JMP LABEL_PRINT ;Next7950 L}P37960 PRINT 27970 LDA ALL7980 BEQ LP47990 LDA NOSCREEN8000 BEQ LP48010 JSR PAUSE ;Wait for} key8020 LP48030 RTS 8040 ;8050 ;Subroutine for label printing8060 ;8070 PRINT_LABELS8080 LDY #SL-1 ;Label l}ength8090 PRLOOP8100 LDA (INDIR),Y ;Move entry8110 STA LINE,Y8120 DEY 8130 BPL PRLOOP8140 ;8150 LD}A ZPRINT ;Zero page?8160 BEQ PRL0 ;Yes8170 LDY #SL+1 ;Point to addr8180 LDA (INDIR),Y ;Get addr8190 } LDY #0 ;Set index8200 JSR HEXASC ;Convert8210 MOVE HEX,LINE+SL,28220 PRL08230 LDY #SL ;Point to }addr8240 LDA (INDIR),Y ;Get addr8250 LDY #2 ;Set index8260 JSR HEXASC ;Convert8270 MOVE HEX+2,LIN}E+SL+2,28280 LDA ASMFLAG ;Output to disk?8290 BEQ PRL0A :Yes8300 JMP PRL3 ;No-Skip8310 PRL0A8320 P}RINT 2,LINE,SL ;Label8330 PRINT 2,LM1,4 ;= $8340 LDA ZPRINT ;Zero page?8350 BEQ PRL1 ;Yes8360 PRI}NT 2,LINE+SL,4 ;Address8370 JMP PRL28380 PRL18390 PRINT 2,LINE+SL+2,2 ;Zero page address8400 PRL28410 PR}INT 28420 JMP PRL5 ;Exit8430 ;8440 PRL38450 PRINT 2,LINE,SL ;Label8460 PRINT 2,SPACES,8*[1+SL/8]-SL };Spaces8470 LDA ZPRINT ;Zero page?8480 BEQ PRL4 ;Yes8490 PRINT 2,LINE+SL,4 ;Address8500 PRINT 2,S}PACES,4 ;Spaces8510 JMP PRL58520 PRL48530 PRINT 2,LINE+SL+2,2 ;Address8540 PRINT 2,SPACES,6 ;Spaces8550 }PRL58560 ON.ERROR ERROR8570 RTS 8580 ;8590 .END +SL+2,2 ;Address8540 PRINT 2,SPACES,6 ;Spaces8550 C1000 ;Filename: D:DISSEM.51010 ;1020 .PAGE "Label Search Routines"1030 ;1040 ;ȠҠ͠Π›1050 ;1060 ;Sear}ch for a label in a table1070 ; of branches and jumps created1080 ; by the disassembler.1090 ;1100 ;LIDX = # entries in t}able1110 ;LAB = address of table1120 ;LL = length of label+hex address1130 ;1140 LAB_SEARCH1150 SEARCH LIDX,LAB,LL} ;Search1160 LDA FOUND ;Found label?1170 BNE LS2 ;No1180 LDA ENTRYFLAG ;Enter label mode?1190 BNE L}S0 ;No1200 JMP LS4.1 ;Yes1210 LS01220 LDY #SL-11230 LS11240 LDA (INDEX),Y ;Move label1250 STA L,Y}1260 DEY 1270 BPL LS11280 RTS 1290 ;1300 LS21310 LDA LABFLAG ;Create label?1320 BNE LS2A ;No13}30 SEC ;Table full?1340 LDA # LTOP1370 SBC LIDX+11380 BCS }LS3 ;No1390 LS2A1400 LDA #0 ;Null label1410 STA L1420 RTS 1430 ;1440 LS31450 ;INDEX+LL1460 }ADDW INDEX,LL,TEMP1470 ;LIDX*LL1480 MUL LIDX,LL,TEMP+2,TEMP+41490 ;1500 ;Address of top of table1510 ADDW T}EMP+2,LAB1520 ;1530 CPW TEMP+2,TEMP ;LIDX*LL+ADR(LAB)>INDEX+LL?1540 BCC LS4 ;No1550 SUBW TEMP+2,INDEX} ;# bytes to move1560 MOVE INDEX,TEMP+4,21570 BLOCK_MOVE TEMP+4,TEMP,TEMP+21580 LS41590 LDY #SL1600 }LDA NUM ;Insert hex addr.1610 STA (INDEX),Y ;in table1620 INY 1630 LDA NUM+11640 STA (INDEX),Y1650 ;}1660 BUMP LIDX ;Bump # entries1670 LDA ENTRYFLAG ;Label entry mode?1680 BNE LS5 ;No1690 LS4.11700 }LDY #SL-1 ;Label into table1710 LS4.21720 LDA L,Y1730 STA (INDEX),Y1740 DEY 1750 BPL LS4.21760 RT}S 1770 ;1780 LS51790 MOVE LIDX,DECL,21800 LDA # <[L+1] ;Pointer1810 STA INDIR1820 LDA # >[L+1]1830 } STA INDIR+11840 JSR DECOUT ;Into Ascii1850 JSR LS4.1 ;Insert label1860 ;1870 SUBW POINTER,OFFSET,TEMP}1880 CPW TEMP,NUM ;NUM>POINTER-OFFSET?1890 BCS LS6 ;No1900 LDA #TRUE ;Yes-Must be forward reference19}10 STA FOUND ;so show label found1920 LS61930 RTS 1940 ;1950 ;ȠҠ͠ΠǛ1960 ;1970 ;Search for a }label in a table1980 ; of zero page addresses created1990 ; by either the disassembler or2000 ; the user.2010 ;2020 ;ZID}X = # entries in table2030 ;ZPAG = address of table2040 ;ZL = length of label+hex address2050 ;2060 ZPAG_SEARCH2070 } SEARCH ZIDX,ZPAG,ZL ;Search2080 LDA FOUND ;Found label?2090 BNE ZS2 ;No2100 LDA ENTRYFLAG ;Table entry} mode?2110 BNE ZS0 ;No2120 JMP ZS4A ;Yes2130 ZS02140 LDY #SL-12150 ZS12160 LDA (INDEX),Y ;Move l}abel2170 STA L,Y2180 DEY 2190 BPL ZS12200 RTS 2210 ;2220 ZS22230 LDA LABFLAG ;Create label?2240 } BEQ ZS3 ;Yes2250 RTS 2260 ;2270 ZS32280 ;INDEX+ZL2290 ADDW INDEX,ZL,TEMP2300 ;ZIDX*ZL2310 MUL Z}IDX,ZL,TEMP+2,TEMP+42320 ;2330 ;Address of top of table2340 ADDW TEMP+2,ZPAG2350 ;2360 CPW TEMP+2,TEMP ;ZIDX}*ZL+ADDR(ZPAG) >=INDEX+ZL?2370 BCC ZS4 ;No2380 SUBW TEMP+2,INDEX ;# bytes to move2390 MOVE INDEX,TEMP+}4,22400 BLOCK_MOVE TEMP+4,TEMP,TEMP+22410 ;2420 ZS42430 LDY #SL2440 LDA NUM ;Insert hex addr.2450 } STA (INDEX),Y ; in table2460 ;2470 BUMP ZIDX ;Bump # entries2480 LDA ENTRYFLAG ;Entry mode?2490 BNE ZS6 } ;No2500 ;2510 ZS4A2520 LDY #SL-12530 ZS52540 LDA L,Y ;Label into table2550 STA (INDEX),Y2560 DEY} 2570 BPL ZS52580 RTS 2590 ;2600 ZS62610 LDA #'Z ;1st char of label2620 STA L2630 MOVE SPACE}S,L+1,SL-1 ;Fill rest of label with spaces2640 MOVE ZIDX,DECL,2 ;# entries2650 LDA # <[L+1] ;Pointer2660 STA} INDIR2670 LDA # >[L+1]2680 STA INDIR+12690 JSR DECOUT ;Convert to Ascii2700 JMP ZS4A2710 ;2720 ;}ȠҠ͠ΠǛ2730 ;2740 ;Search for a label in a table2750 ; of non zero page addresses2760 ; created by the disassemb}ler or2770 ; the user.2780 ;2790 ;PIDX = # entries in table2800 ;PAG = address of table2810 ;LL = length of label+hex ad}dress2820 ;2830 PAG_SEARCH2840 LDA NUM+1 ;Zero page2850 CMP #0 ; address?2860 BNE PS1 ;No2870 } JSR ZPAG_SEARCH ;Yes-Search in zero page table2880 RTS 2890 ;2900 PS12910 SEARCH PIDX,PAG,LL ;Search2920 } LDA FOUND ;Found label?2930 BNE PS3 ;No2940 LDA ENTRYFLAG ;Entry mode?2950 BNE PS1A ;No2960 JMP} PS5A ;Yes2970 PS1A2980 LDY #SL-12990 PS23000 LDA (INDEX),Y ;Move label3010 STA L,Y3020 DEY 3030 } BPL PS23040 RTS 3050 ;3060 PS33070 LDA LABFLAG ;Create label?3080 BNE PS3A ;No3090 SEC ;Ta}ble full?3100 LDA # PTOP3130 SBC PIDX+13140 BCS PS4 ;No3150 PS3A}3160 LDA #0 ;Null label3170 STA L3180 RTS 3190 ;3200 PS43210 ;INDEX+LL3220 ADDW INDEX,LL,TEMP32}30 ;PIDX*LL3240 MUL PIDX,LL,TEMP+2,TEMP+43250 ;3260 ;Address of top of table3270 ADDW TEMP+2,PAG3280 ;3290 } CPW TEMP+2,TEMP ;PIDX*LL+ADDR(PAG)>=INDEX+LL?3300 BCC PS5 ;No3310 SUBW TEMP+2,INDEX ;# bytes to move33}20 MOVE INDEX,TEMP+4,23330 BLOCK_MOVE TEMP+4,TEMP,TEMP+23340 PS53350 LDY #SL3360 LDA NUM ;Insert }hex addr.3370 STA (INDEX),Y ;in table3380 INY 3390 LDA NUM+13400 STA (INDEX),Y3410 ;3420 BUMP PID}X ;Bump # entries3430 LDA ENTRYFLAG ;Entry mode?3440 BNE PS7 ;No3450 ;3460 PS5A3470 LDY #SL-13480 PS63}490 LDA L,Y ;Insert label in table3500 STA (INDEX),Y3510 DEY 3520 BPL PS63530 RTS 3540 ;3550 PS}73560 LDA #'W ;1st char of label3570 STA L3580 MOVE SPACES,L+1,SL-1 ;Fill rest of label with spaces3590} MOVE PIDX,DECL,2 ;# entries3600 LDA # <[L+1] ;Pointer3610 STA INDIR3620 LDA # >[L+1]3630 STA INDIR}+13640 JSR DECOUT ;Convert to Ascii3650 JMP PS5A3660 ;3670 .PAGE "Select Output Device"3680 ;3690 ;Š}ƠԠś3700 ;3710 OUTPUT3720 LDA #FALSE3730 STA ASMFLAG ;Not to disk3740 STA QUICK ;No quick pass}3750 PRINT 0,"}"3760 POSITION 5,13770 PRINT 0,"OUTPUT TO -"3780 POSITION 10,43790 PRINT 0,}" SCREEN"3800 POSITION 10,63810 PRINT 0," PRINTER"3820 POSITION 10,83830 PRINT 0," DISK FILE"}3840 LDA TABLES ;Table printing?3850 BEQ OU1 ;Yes-Skip3860 POSITION 10,103870 PRINT 0," QUICK 1S}T PASS"3880 OU13890 POSITION 10,153900 PRINT 0,WHICH,LABEL_MSG-WHICH3910 LDY #'33920 LDA TABLES3930} BEQ OU23940 LDY #'43950 OU23960 STY LIMIT ;# of options3970 LDA # OU14000 STA LINE_NO+14010 JSR GETKEY ;Get response4020 CLOSE 24030 LDA R } ;Choice4040 ASL A ;*24050 TAX ;Index4060 LDA DEVICES+1,X ;ON GOTO4070 PHA 4080 LDA }DEVICES,X4090 PHA 4100 RTS 4110 ;4120 DEVICES4130 .WORD EDITOR-1,PRINTER-1,DISK_FILE-1,QUICK_PASS-14140 ;4}150 ;Screen output4160 ;4170 EDITOR4180 OPEN 2,8,0,"E:"4190 ON.ERROR ERROR4200 LDA #FALSE4210 STA N}OSCREEN ;Screen on4220 RTS 4230 ;4240 ;Printer output4250 ;4260 PRINTER4270 OPEN 2,8,0,"P:"4280 ON.ERRO}R ERROR4290 LDA #TRUE4300 STA NOSCREEN ;Screen off4310 RTS 4320 ;4330 ;Disk file output4340 ;4350 DISK_FI}LE4360 POSITION 5,204370 PRINT 0,FILE_MSG,BIN_MSG-FILE_MSG4380 INPUT 0,OUT,16 ;Get file name4390 LD}A OUT4400 CMP #EOL ;No file name?4410 BEQ DISK_FILE ;Yes- Re-prompt4420 PRINT 0,RETURN_MSG,DATA_MSG-RETUR}N_MSG4430 LDA #04440 STA LIMIT4450 JSR GETKEY ;Wait for keypress4460 JSR OPENOUT ;Open file output4470 } ON.ERROR ERROR ;Error4480 LDA #TRUE4490 STA ASMFLAG ;Labels & mnemonics only4500 STA NOSCREEN ;Screen of}f4510 RTS 4520 ;4530 ;Quick first pass4540 ;4550 QUICK_PASS4560 LDA #TRUE4570 STA NOSCREEN ;Screen off458}0 STA QUICK ;Do quick pass4590 RTS 4600 ;4610 .PAGE "Error Routine"4620 ;4630 ;РԯԠӛ46}40 ;4650 ERROR4660 LDA SCREEN ;Restore screen4670 STA SDMCTL4680 LDA #52 ;Red border4690 STA COLOR4}4700 STY DECL ;Error #4710 LDA #04720 STA DECH4730 STA DSPFLG ;Controls on4740 PRINT 0,ERROR_M}SG,PAUSE_MSG-ERROR_MSG4750 LDA # ERROR_NUM4780 STA INDIR+14}790 JSR DECOUT ;Convert to Ascii4800 INY 4810 LDA #EOL4820 STA (INDIR),Y4830 PRINT 0,ERROR_NUM484}0 CLOSE 24850 CLOSE 34860 LDX #$FF ;Reset stack4870 TXS 4880 INX 4890 STX CRSINH ;Cursor} on4900 STX COLOR4 ;Black border4910 JSR PAUSE ;Wait for keypress4920 JMP MAIN ;Main menu4930 ;4940 } .PAGE "Keyboard Response"4950 ;4960 ;ԠŠ͠ě4970 ;4980 GETKEY4990 CLOSE 35000 OPEN 3},4,0,"K:"5010 GETCHR 3 ;Get a key5020 CMP #EOL ;EOL?5030 BNE GK1 ;No5040 LDA #SPACE ;Yes-Make }it a space5050 GK15060 STA RS ;Save5070 SEC 5080 SBC #'1 ;Sub Ascii ofset+15090 STA R ;Sa}ve index5100 CLOSE 35110 LDA LIMIT ;Choices?5120 BNE GK3 ;Yes5130 GK25140 RTS ;No-Return}5150 GK35160 PRINT 0,RS ;Print choice5170 LDA RS ;Get choice5180 CMP #'1 ;<1?5190 BCC GK4 } ;Yes-Error5200 CMP LIMIT ;> max choice #5210 BCC GK2 ;No-ok5220 BEQ GK25230 GK45240 PRINT 0,NUM}BER_MSG,CONT_MSG-NUMBER_MSG5250 PRINT 0,LIMIT,15260 PLA ;Pop return addr.5270 PLA 5280 JMP (LIN}E_NO) ;Error return addr5290 ;5300 .PAGE "Pause Routine"5310 ;5320 ;Š͛5330 ;5340 PAUSE5350 PRINT }0,PAUSE_MSG,START_MSG-PAUSE_MSG5360 LDA #05370 STA LIMIT5380 JSR GETKEY ;Wait for key5390 RTS 5400 ;54}10 .PAGE "Mnemonic Print"5420 ;5430 ;ŠàϠԠқ5440 ;5450 MOVE_MNEM5460 MOVE HEX,LINE+9,25}470 MOVE_MNEM15480 LDA L5490 BEQ MOVE_MNEM25500 MOVE L,LINE+16,SL5510 MOVE_MNEM25520 MOVE M,LINE16+1},35530 RTS 5540 ;5550 .PAGE "Flush Blanks"5560 ;5570 ;ȠǠӛ5580 ;5590 FLUSH_BLANKS5600 LD}X #SL-15610 FB15620 LDA L,X5630 DEX 5640 BMI FB25650 CMP #SPACE5660 BEQ FB15670 FB25680 INX }5690 STX XSAVE ;Save index5700 RTS 5710 ;5720 .PAGE "Exit"5730 ;5740 ;ΠϠӛ5750 ;5760 DOS5770 } JMP (DOSVEC)5780 ;5790 ;ҠҠś5800 ;5810 CLR_CODE5820 .BYTE 1565830 CLR_ERRLINE5840 POSITION 0,}225850 PRINT 0,CLR_CODE,15860 RTS 5870 ;5880 .END 20 .BYTE 1565830 CLR_ERRLINE5840 POSITION 0,E1000 ;Filename: D:DISSEM.61010 ;1020 .PAGE "General Purpose Subroutines"1030 ;1040 ;ΠˠŠҠԛ1050 ;1}060 ;Routine to allow input of file1070 ;name with or without a device1080 ;or device number. Opens file1090 ;for input.1}100 ;1110 OPENIN1120 LDA IN+11130 CMP #':1140 BEQ OPENIN11150 LDA IN+21160 CMP #':1170 BEQ OPE}NIN11180 OPEN 3,4,0,DIN1190 JMP OPENIN21200 OPENIN11210 OPEN 3,4,0,IN1220 OPENIN21230 RTS 1240 ;1}250 ;ΠˠŠҠԛ1260 ;1270 ;Routine to allow input of file1280 ;name with or without a device1290 ;or devic}e number. Opens file1300 ;for output.1310 ;1320 OPENOUT1330 LDA OUT+11340 CMP #':1350 BEQ OPENOUT11360 } LDA OUT+21370 CMP #':1380 BEQ OPENOUT11390 OPEN 2,8,0,DOUT1400 JMP OPENOUT21410 OPENOUT11420 OP}EN 2,8,0,OUT1430 OPENOUT21440 RTS 1450 ;1460 ;̠ԛ1470 ;1480 ;Input a decimal number from the1490 ;keybo}ard, check if a valid1500 ;number, and convert to a 2 byte1510 ;binary integer in NUM.1520 ;1530 DECIN1540 INPUT 0},TEMP,6 ;Input #1550 LDX #0 ;Zero NUM1560 STX NUM1570 STX NUM+11580 DEC11590 LDA TEMP,X ;Get digit}1600 CMP #'0 ;Decimal?1610 BCC NOT_DEC ;No1620 CMP #'9+1 ;Decimal?1630 BCS NOT_DEC ;No1640 AND} #$0F ;Zero top nibble1650 LDY #17 ;# shifts1660 BNE DEC3 ;Always1670 DEC21680 BCC DEC2A ;No carr}y1690 ADC #10-1 ;add 101700 DEC2A1710 LSR A ;Rotate1720 DEC31730 ROR NUM+11740 ROR NUM1750 } DEY 1760 BNE DEC21770 INX ;Next digit1780 CPX #51790 BNE DEC11800 DECEND1810 RTS ;}Finished1820 NOT_DEC1830 CMP #EOL ;EOL?1840 BEQ DECEND ;Yes-ok1850 POSITION 0,221860 PRINT 0,"}Decimal digits only"1870 PLA ;Pop return addr1880 PLA 1890 JMP (LINE_NO) ;Error return1900 ;1910 ;}̠ԛ1920 ;1930 ;Converts a 2 byte binary number1940 ;to a 1-5 digit Ascii decimal1950 ;number. Suppresses leading}1960 ;zeroes. Outputs number to1970 ;address pointed to by INDIR.1980 ;1990 DECOUT2000 LDA #0 ;Flag to suppress}2010 STA PRFLAG ;leading zeroes2020 TAY ;Zero pointer index2030 LDX #7 ;Index to table2040 DECO}UT12050 LDA #'0 ;Ascii 02060 STA DIGIT2070 DECOUT22080 SEC 2090 LDA DECL ;# to convert2100 S}BC DECTAB-1,X2110 PHA ;Save2120 DEX ;Dec index2130 LDA DECH ;# to convert2140 SBC DECT}AB+1,X2150 BCC DECOUT3 ;02160 ROR PRFLAG ;Non zero2170 STA DECH2180 PLA ;Retrieve2190 STA D}ECL2200 INC DIGIT ;Bump2210 INX 2220 BNE DECOUT22230 DECOUT32240 PLA 2250 LDA PRFLAG ;Leading 0?}2260 BEQ DECOUT4 ;Yes-skip2270 LDA DIGIT ;Ascii digit2280 STA (INDIR),Y ;To output2290 INY 2300 DECOUT}42310 DEX 2320 BPL DECOUT1 ;Next digit2330 LDA DECL ;Last digit2340 ORA #'0 ;Make Ascii2350 S }TA (INDIR),Y2360 RTS 2370 DECTAB2380 .WORD 102390 .WORD 1002400 .WORD 10002410 .WORD 100002420 ;2 }430 ;ؠԛ2440 ;2450 ;Input a hex number from the2460 ;keyboard, check if it is a valid2470 ;hex number, and convert  }it to a2480 ;2 byte binary integer in NUM.2490 ;2500 HEXIN2510 INPUT 0,TEMP,5 ;Get number2520 LDX #0 ;Zer }o NUM2530 STX NUM2540 STX NUM+12550 NEXTCHR2560 LDA TEMP,X ;Get digit2570 CMP #'0 ;Hex?2580 BC }C NOT_HEX ;No2590 CMP #'9+1 ;Hex?2600 BCC IS_HEX ;Yes2610 CMP #'A ;Hex?2620 BCC NOT_HEX ;No2630 } CMP #'F+1 ;Hex?2640 BCS NOT_HEX ;No2650 SBC #'A-10-1 ;Ascii offset2660 IS_HEX2670 ASL A ;Move to u}pper nibble2680 ASL A2690 ASL A2700 ASL A2710 LDY #4 ;4 bits2720 ROL42730 ASL A ;Rotate }into NUM2740 ROL NUM2750 ROL NUM+12760 DEY 2770 BNE ROL42780 INX ;Next digit2790 CPX #4}2800 BNE NEXTCHR2810 HEXEND2820 RTS 2830 NOT_HEX2840 CMP #EOL ;EOL?2850 BEQ HEXEND ;Yes-ok2860 } POSITION 0,222870 PRINT 0,"Enter a hex number from $0000 to $FFFF"2880 PLA ;Pop return addr2890 } PLA 2900 JMP (LINE_NO) ;Error return2910 ;2920 ;ԠŠқ2930 ;2940 ;Not really a general purpose2950} ;subroutine but convenient to2960 ;place here as it is followed by2970 ;a hex to Ascii conversion.2980 ; Increments disa}ssembly code2990 ;pointer and peeks digit.3000 ;3010 INCPTR3020 BUMP POINTER3030 LDY #03040 LDA (POINTER)},Y3050 STA NUM3060 ;3070 ;ؠԛ3080 ;3090 ;Converts a single byte binary3100 ;number to a 2 digit Ascii hex31}10 ;number in HEX. Input in A reg.3120 ;3130 HEXASC3140 PHA ;Save3150 LSR A ;Move to lower nibble3}160 LSR A3170 LSR A3180 LSR A3190 JSR HEXOUT ;Convert3200 PLA ;Retrieve3210 AND #$0F } ;Zero top nibble3220 HEXOUT3230 CMP #10 ;A-F?3240 BCS ALPHA ;Yes3250 ORA #'0 ;Convert #3260 B}NE HXOUT ;Always3270 ALPHA3280 ADC #'A-10-1 ;Ascii offset3290 HXOUT3300 STA HEX,Y3310 INY 3320 RTS 3}330 ;3340 ;٠Ƞś3350 ;3360 ;Searches a table for a hex3370 ;address. If found sets flag3380 ;FOUND to tr}ue. Returns address3390 ;of label/address in INDEX.3400 ;Requires # of entries in table,3410 ;length of label+address.342}0 ;3430 TOP = NO_ENTRIES3440 ;3450 SEARCH3460 LDA #FALSE3470 STA FOUND ;Init. to false3480 LDA NO_ENTRI}ES3490 ORA NO_ENTRIES+1 ;0 entries?3500 BNE SEARCH1 ;No-Continue3510 JMP NOTFND ;Yes-Exit3520 ;3530 SEARCH1}3540 SEC ;Adjust index3550 LDA TOP3560 SBC #13570 STA TOP3580 BCS SEARCH23590 DEC TOP+1 }3600 SEARCH23610 LDA #0 ;Set bottom index3620 STA BOTTOM3630 STA BOTTOM+13640 MOVE INDEX,TEMP,2 ;!}Save table base address3650 ;3660 SEARCH33670 CLC ;BOTTOM+TOP3680 LDA BOTTOM3690 ADC TOP3700 ST"}A MIDDLE3710 LDA BOTTOM+13720 ADC TOP+13730 STA MIDDLE+13740 LSR MIDDLE+1 ;(BOTTOM+TOP)/23750 ROR MI#}DDLE3760 ;Calculate displacement3770 ; INDEX=MIDDLE*LLENGTH3780 MUL MIDDLE,LLENGTH,INDEX,TEMP+2,03790 ;3800 CL$}C ;Current table addr3810 LDA TEMP3820 ADC INDEX3830 STA INDEX3840 LDA TEMP+13850 ADC INDEX+%}13860 STA INDEX+13870 ;3880 PMATCH3890 LDY LLENGTH ;Entry length3900 CMPE3910 DEY ;Adjust index392&}0 LDA NUM-SL,Y ;Get addr.3930 CMP (INDEX),Y ;Match?3940 BNE CMPE2 ;No3950 CPY #SL ;Finished:3960 '} BNE CMPE ;No3970 LDA #TRUE ;Matches3980 STA FOUND3990 NOTFND4000 RTS 4010 ;4020 CMPE24030 BCC C(}MPE3 ;Lower4040 CLC ;BOTTOM=MIDDLE+14050 LDA MIDDLE4060 ADC #14070 STA BOTTOM4080 LDA MIDD)}LE+14090 ADC #04100 STA BOTTOM+14110 CPW TOP,BOTTOM ;Finished?4120 BCS CMPE4 ;No_Continue4130 LD*}A INDEX ;Yes-Point to next4140 ADC LLENGTH ; available addr.4150 STA INDEX4160 LDA INDEX+14170 ADC #0+}4180 STA INDEX+14190 JMP NOTFND ;Exit4200 ;4210 CMPE34220 LDA MIDDLE ;MIDDLE=0?4230 ORA MIDDLE+14240 ,} BEQ NOTFND ;Yes-Exit4250 SEC ;TOP=MIDDLE-14260 LDA MIDDLE4270 SBC #14280 STA TOP4290 LD-}A MIDDLE+14300 SBC #04310 STA TOP+14320 CPW TOP,BOTTOM ;Finished?4330 BCC NOTFND ;Yes-Exit4340 CMPE4.}4350 JMP SEARCH3 ;No-Continue4360 ;4370 .END CPW TOP,BOTTOM ;Finished?4330 BCC NOTFND ;Yes-Exit4340 CMPE481000 .PAGE "OSS SYSTEM EQUATES FOR ATARI"1010 ;1020 ; Recommended File Name: SYSEQU.M651030 ;1040 ;1050 ; DEVICE C"0}ONTROL BLOCK EQUATES1060 ;1070 *= $0300 ;START OF DCB1080 DCB1090 ;1100 DDEVIC .DS 1 ;SERIAL BUS ID1110 DUNIT"1} .DS 1 ;DEVICE UNIT NO.1120 DCOMND .DS 1 ;SIO COMMAND1130 DSTATS .DS 1 ;STATUS CODE1140 DBUFLO .DS 2 ;BUFFER "2}ADDRESS1150 DBUFHI = DBUFLO+11160 DTIMLO .DS 1 ;TIME-OUT VALUE1170 DUNUSE .DS 1 ;UNUSED1180 DBYTLO .DS 2 ;BYTES "3}TRANSFERRED1190 DBYTHI = DBYTLO+11200 DAUX1 .DS 1 ;AUX 1 (NO SECTORS)1210 DAUX2 .DS 1 ;AUX 21220 ;1230 DCBLEN = "4}*-DCB ;LENGTH OF DCB1240 ;1250 ; I/O CONTROL BLOCK EQUATES1260 ;1270 SAVEPC = * ;SAVE CURRENT ORG1280 ;1290 *"5}= $0340 ;START OF SYSTEM IOCBS1300 IOCB1310 ;1320 ICHID .DS 1 ;DEVICE HANDLER IS (SET BY OS)1330 ICDNO .DS 1 ;"6}DEVICE NUMBER (SET BY OS)1340 ICCOM .DS 1 ;I/O COMMAND1350 ICSTA .DS 1 ;I/O STATUS1360 ICBADR .DS 2 ;BUFFER ADD"7}RESS1370 ICPUT .DS 2 ;DH PUT ROUTINE (ADR-1)1380 ICBLEN .DS 2 ;BUFFER LENGTH1390 ICAUX1 .DS 1 ;AUX 11400 ICAUX2"8} .DS 1 ;AUX 21410 ICAUX3 .DS 1 ;AUX 31420 ICAUX4 .DS 1 ;AUX 41430 ICAUX5 .DS 1 ;AUX 51440 ICAUX6 .DS 1 ;AU"9}X 61450 ;1460 IOCBLEN = *-IOCB ;LENGTH OF ONE IOCB1470 ;1480 ICBAL = ICBADR1490 ICBAH = ICBADR+11500 ICPTL = ICPUT1510":} ICPTH = ICPUT+11520 ICBLL = ICBLEN1530 ICBLH = ICBLEN+11540 ICAX1 = ICAUX11550 ICAX2 = ICAUX21560 ICAX3 = ICAUX31570 I";}CAX4 = ICAUX41580 ICAX5 = ICAUX51590 ICAX6 = ICAUX61600 ;1610 ; IOCB COMMAND VALUE EQUATES1620 ;1630 COPN = 3 ;O"<}PEN1640 CGBINR = 7 ;GET BINARY RECORD1650 CGTXTR = 5 ;GET TEXT RECORD1660 CPBINR = 11 ;PUT BINARY RECORD167"=}0 CPTXTR = 9 ;PUT TEXT RECORD1680 CCLOSE = 12 ;CLOSE1690 CSTAT = 13 ;GET STATUS1700 ;1710 ; DEVICE DEPENDEN">}T COMMAND EQUATES FOR FILE MANAGER1720 ;1730 CREN = 32 ;RENAME1740 CERA = 33 ;ERASE1750 CPRO = 35 ;PROT"?}ECT1760 CUNP = 36 ;UNPROTECT1770 CPOINT = 37 ;POINT1780 CNOTE = 38 ;NOTE1790 ;1800 ; AUX1 VALUES REQD FOR"@} OPEN1810 ;1820 OPIN = 4 ;OPEN INPUT1830 OPOUT = 8 ;OPEN OUTPUT1840 OPUPD = 12 ;OPEN UPDATE1850 OPAPND"A} = 9 ;OPEN APPEND1860 OPDIR = 6 ;OPEN DIRECTORY1870 ;1880 .PAGE 1890 ;1900 ; EXECUTE FLAG DEFINES1910 ;"B}1920 EXCYES = $80 ;EXECUTE IN PROGRESS1930 EXCSCR = $40 ;ECHO EXECUTE INPUT TO SCREEN1940 EXCNEW = $10 ;EXECUTE ST"C}ARTUP MODE1950 EXCSUP = $20 ;COLD START EXEC FLAG1960 ;1970 ; MISC ADDRES EQUATES1980 ;1990 CPALOC = $0A ;POINTER "D}TO CP2000 WARMST = $08 ;WARM START (0=COLD)2010 MEMLO = $02E7 ;AVAIL MEM (LOW) PTR2020 MEMTOP = $02E5 ;AVAIL MEM (HI"E}GH) PTR2030 APPMHI = $0E ;UPPER LIMIT OF APPLICATION MEMORY2040 INITADR = $02E2 ;ATARI LOAD/INIT ADR2050 INITAD = INITA"F}DR2060 GOADR = $02E0 ;ATARI LOAD/GO ADR2070 RUNAD = GOADR2080 CARTLOC = $BFFA ;CARTRIDGE RUN LOCATION2090 EOL = $9B "G} ;END OF LINE CHAR2100 ;2110 ; RESIDENT HANDLERS2120 ;2130 EDITRV = $E400 ;SCREEN EDITOR ENTRY2140 SCRENV = $E410 ;D"H}ISPLAY HANDLER ENTRY2150 KEYBDV = $E420 ;KEYBOARD HANDLER2160 PRINTV = $E430 ;PRINTER HANDLER2170 CASETV = $E440 ;CASSE"I}TTE HANDLER2180 DSKINV = $E453 ;DISK HANDLER ENTRY2190 CIO = $E456 ;CIO ENTRY ADR2200 CIOV = CIO2210 SIOV = $E459 "J} ;SIO ENTRY POINT2220 GPDVV = $E48F ;GENERIC PARALLEL HANDLER ENTRY2230 ;2240 ; CP FUNCTION AND VALUE DISPLACEMENT2250"K} ; (INDIRECT THROUGH CPALOC)2260 ; IE. (CPALOC),Y2270 ;2280 CPGNFN = 3 ;GET NEXT FILE NAME2290 CPDFDV = "L}$07 ;DEFAULT DRIVE (3 BYTES)2300 CPBUFP = $0A ;CMD BUFF NEXT CHAR POINTER (1 BYTE)2310 CPEXFL = $0B ;EXECUTE FLAG"M}2320 CPEXFN = $0C ;EXECUTE FILE NAME (16 BYTES)2330 CPEXNP = $1C ;EXECUTE NOTE/POINT VALUES2340 CPFNAM = $21 ;FILE"N}NAME BUFFER2350 RUNLOC = $3D ;CP/A LOAD/RUN ADR2360 CPCMDB = $3F ;COMMAND BUFFER (60 BYTES)2370 CPCMDGO = $F32380 ;"O}2390 *= SAVEPC ;RESTORE PC2400 ;AD/RUN ADR2360 CPCMDB = $3F ;COMMAND BUFFER (60 BYTES)2370 CPCMDGO = $F32380 ; )1000 ;Filename: D:DISSEM.MAC1010 ;1020 .PAGE "Macros"1030 ;-------------------------------1040 ;1050 ; MACRO: GRAPH&Q}ICS1060 ;1070 ; FORM: GRAPHICS n1080 ;1090 ; n is the BASIC graphics mode1100 ;1110 ; sets the graphics mode1120 ;1&R}130 ; If n<64 then n is a literal,1140 ; else n is a memory location.1150 ;1160 .MACRO GRAPHICS 1170 .IF %0<>1&S}1180 .ERROR "GRAPHICS: wrong number of parameters"1190 .ELSE 1200 JMP @CONT1210 @AX11220 .BYTE 0&T}1230 @AX21240 .BYTE 01250 @CONT1260 CLOSE 61270 .IF %1<641280 LDA #%11290 .ELSE &U}1300 LDA %11310 .ENDIF 1320 STA @AX21330 AND #$F01340 EOR #$101350 ORA #$0C136&V}0 STA @AX11370 OPEN 6,@AX1,@AX2,"S:"1380 .ENDIF 1390 .ENDM 1400 ;1410 ;-------------------------&W}------1420 ;1430 ; MACRO: POSITION1440 ;1450 ; FORM: POSITION x,y1460 ;1470 ; x is X co-ordinate1480 ; y is Y co-or&X}dinate1490 ;1500 ; puts the cursor at a specific1510 ; place on the screen1520 ;1530 ; x and y may be literals or1540 &Y}; memory locations.1550 ;1560 .MACRO POSITION 1570 .IF %0<>21580 .ERROR "POSITION: wrong number of param&Z}eters"1590 .ELSE 1600 .IF %1<3201610 LDA # <%11620 STA COLCRS1630 LDA # >%11640 &[} STA COLCRS+11650 .ELSE 1660 LDA %11670 STA COLCRS1680 LDA %1+11690 STA CO&\}LCRS+11700 .ENDIF 1710 .IF %2<1921720 LDA #%21730 .ELSE 1740 LDA %21750 &]} .ENDIF 1760 STA ROWCRS1770 .ENDIF 1780 .ENDM 1790 ;1800 ;-------------------------------1810 ;1820 ; &^}MACRO: ON.ERROR1830 ;1840 ; FORM: ON.ERROR label1850 ;1860 ; On a CIO or SIO error, (Y reg1870 ;>= $80) jumps to error &_}routine1880 ;at 'label'.1890 ;1900 .MACRO ON.ERROR 1910 .IF %0<>11920 .ERROR "ON.ERROR: wrong number of &`}arguments"1930 .ELSE 1940 BPL *+51950 JMP %11960 .ENDIF 1970 .ENDM 1980 ;1990 ;-----------&a}--------------------2000 ;2010 ; MACRO: BLOCK_MOVE2020 ; FORM: BLOCK_MOVE source,dest,no. bytes2030 ;2040 ;Block upward&b}s move in 256 byte blocks2050 ;source is from address2060 ;dest is to address2070 ;no. bytes is number of bytes2080 ;209&c}0 ;All parameters are memory locations not immediate values.2100 ;2110 .MACRO BLOCK_MOVE 2120 .IF %0<>32130 &d} .ERROR "BLOCK_MOVE: wrong number of arguments"2140 .ELSE 2150 LDA %3+12160 TAX 2170 CLC 2180 &e} ADC %1+12190 STA %1+12200 TXA 2210 CLC 2220 ADC %2+12230 STA %2+12240 LDY %3&f}2250 INX 2260 @LOOP TYA 2270 BEQ @HIDEC2280 @MVBLK DEY 2290 LDA (%1),Y2300 STA (%2),Y2310 &g} JMP @LOOP2320 @HIDEC DEC %1+12330 DEC %2+12340 DEX 2350 BNE @MVBLK2360 .ENDIF 2370 .ENDM &h}2380 ;2390 ;-------------------------------2400 ;2410 ; MACRO: MOVE2420 ; FORM: MOVE source,dest,no. bytes2430 ;2440 ;&i}Moves 1 to 255 bytes2450 ;2460 ;All parameters are memory locations2470 ;2480 .MACRO MOVE 2490 .IF %0<>32500 &j} .ERROR "MOVE: wrong number of arguments"2510 .ELSE 2520 .IF %3<32530 LDA %12540 STA %&k}22550 .IF %3=22560 LDA %1+12570 STA %2+12580 .ENDIF 2590 .ELSE 2600 &l} LDX # <[%3-1]2610 @MO LDA %1,X2620 STA %2,X2630 DEX 2640 BPL @MO2650 .ENDIF 26&m}60 .ENDIF 2670 .ENDM 2680 ;2690 ;-------------------------------2700 ;2710 ; MACRO: ADDW2720 ; FORM: ADDW nu&n}m1,num2[,num3]2730 ;2740 ;Adds two 16 bit values2750 ;2760 ;Parameters 1 and 3 are memory locations.2770 ;Parameter 2 is&o} an immediate value.2780 ;If parameter 3 is used it will contain2790 ;the result of the addition, otherwise the2800 ;resul&p}t is placed in parameter 1.2810 ;2820 .MACRO ADDW 2830 .IF %0<2 .OR %0>32840 .ERROR "ADDW: wrong number o&q}f arguments"2850 .ELSE 2860 CLC 2870 LDA %12880 ADC # <%22890 .IF %0=32900 STA &r}%32910 .ELSE 2920 STA %12930 .ENDIF 2940 LDA %1+12950 ADC # >%22960 .IF %0=&s}32970 STA %3+12980 .ELSE 2990 STA %1+13000 .ENDIF 3010 .ENDIF 3020 .ENDM 303&t}0 ;3040 ;-------------------------------3050 ;3060 ; MACRO: SUBW3070 ; FORM: SUBW num1,num2[,num3]3080 ;3090 ;Subtract&u}s two 16 bit values3100 ;3110 ;All parameters are memory locations3120 ;If parameter 3 is used it will contain3130 ;the r&v}esult of the subtraction, otherwise the3140 ;result is placed in parameter 1.3150 ;3160 .MACRO SUBW 3170 .IF %0&w}<2 .OR %0>33180 .ERROR "SUBW: wrong number of arguments"3190 .ELSE 3200 SEC 3210 LDA %13220 &x} SBC %23230 .IF %0=33240 STA %33250 .ELSE 3260 STA %13270 .ENDIF 3280 LD&y}A %1+13290 SBC %2+13300 .IF %0=33310 STA %3+13320 .ELSE 3330 STA %1+13340 &z} .ENDIF 3350 .ENDIF 3360 .ENDM 3370 ;3380 ;-------------------------------3390 ;3400 ; MACRO: CPW3410 ; FOR&{}M: CPW val1,val23420 ;3430 ;Compares two 16 bit values - Sets carry flag accordingly3440 ;3450 ;Both parameters are memor&|}y locations.3460 .MACRO CPW 3470 .IF %0<>23480 .ERROR "CPW: wrong number of arguments"3490 .ELSE 3&}}500 SEC 3510 LDA %13520 SBC %23530 LDA %1+13540 SBC %2+13550 .ENDIF 3560 .ENDM &~}3570 ;3580 ;-------------------------------3590 ;3600 ; MACRO: MUL3610 ; FORM: MUL val1,val2,val3,work[,flag]3620 ;Mul&}tiplies two 16 bit values.3630 ;3640 ;Parameters 1, 3 and 4 are memory locations.3650 ;If parameter 5 is used then paramet&}r 2 is3660 ;a memory location else an immediate value.3670 ;val3 is the product3680 ;val4 is a tempory store3690 ;3700 &} .MACRO MUL 3710 .IF %0<4 .OR %0>53720 .ERROR "MUL: wrong number of arguments"3730 .ELSE 3740 &}MOVE %1,%3,23750 LDX #03760 STX %43770 STX %4+13780 LDY #163790 BNE @MUL23800 @MUL1 CLC &}3810 LDA %43820 .IF %0=53830 ADC %23840 .ELSE 3850 ADC # <%23860 .ENDIF &}3870 STA %43880 LDA %4+13890 .IF %0=53900 ADC %2+13910 .ELSE 3920 ADC # >%2&}3930 .ENDIF 3940 STA %4+13950 @MUL2 LSR %4+13960 ROR %43970 ROR %3+13980 ROR %33990 &} DEY 4000 BMI @MUL34010 BCC @MUL24020 BCS @MUL14030 @MUL34040 .ENDIF 4050 .ENDM 4060 ;4&}070 ;-------------------------------4080 ;4090 ; MACRO: DIV4100 ; FORM: DIV val1,val2,val3,val4[,flag]4110 ;4120 ;Divid&}es one 16 bit value by another.4130 ;4140 ;val1, val3 and val4 are memory locations.4150 ;If flag contains any value, val4&} is a4160 ;memory location else an immediate value.4170 ;4180 ;val1 is dividend4190 ;val2 is divisor4200 ;val3 is quotie&}nt4210 ;val4 is remainder4220 ;4230 .MACRO DIV 4240 .IF %0<4 .OR %0>54250 .ERROR "DIV: wrong number of a&}rguments"4260 .ELSE 4270 MOVE %1,%3,24280 LDX #04290 STX %44300 STX %4+14310 LDY &}#164320 @DIV1 ASL %34330 ROL %3+14340 ROL %44350 ROL %4+14360 SEC 4370 LDA %44380 &} .IF %0=54390 SBC %24400 .ELSE 4410 SBC # <%24420 .ENDIF 4430 TAX 4440 LDA&} %4+14450 .IF %0=54460 SBC %2+14470 .ELSE 4480 SBC # >%24490 .ENDIF 4500 &}BCC @DIV24510 STX %44520 STA %4+14530 INC %34540 @DIV2 DEY 4550 BNE @DIV14560 .ENDIF 457&}0 .ENDM 4580 ;4590 ;-------------------------------4600 ; MACRO: SEARCH4610 ; FORM: SEARCH no entries,address,length&}4620 ;4630 ;Sets up parameters for table search routine.4640 ;4650 ;Parameters are:4660 ; Number of entries in table467&}0 ; Table address4680 ; Length of table entry4690 ;4700 ;Parameters 1 and 3 are memory locations,4710 ; parameter 2 is an&} immediate value.4720 ;4730 .MACRO SEARCH 4740 .IF %0<>34750 .ERROR "SEARCH: wrong number of arguments"4&}760 .ELSE 4770 MOVE %1,NO_ENTRIES,24780 LDA # <%24790 STA INDEX4800 LDA # >%24810 &}STA INDEX+14820 LDA # <%34830 STA LLENGTH4840 LDA # >%34850 STA LLENGTH+14860 JSR SEARCH4&}870 .ENDIF 4880 .ENDM 4890 ;4900 ;-------------------------------4910 ;4920 ; MACRO: DISKIO4930 ; FORM: DISK&}IO device#,command,start,#sectors,size,buf4940 ;4950 ;Reads or writes from or to a specified4960 ;number of sectors. Drive&} may be single or double density.4970 ;4980 ;device#: Device number4990 ;command: R=read, W or P =write5000 ;start: start&} sector number5010 ;#sectors: number of sectors5020 ;size: # of bytes in a sector5030 ;buf: Buffer address to read or writ&}e from or to.5040 ;5050 ;Parameters 1, 2 and 6 are immediate values.5060 ;Other parameters are locations in memory.5070 ;&}5080 .MACRO DISKIO 5090 .IF %0<>65100 .ERROR "DISKIO: wrong number of arguments"5110 .ELSE 5120 &} LDA # <%15130 STA DUNIT5140 LDA # <%25150 STA DCOMND5160 LDA %35170 STA DAUX15180 &} LDA %3+15190 STA DAUX25200 LDA # <%65210 STA DBUFLO5220 LDA # >%65230 STA DBUFHI5240 &} LDA %45250 BNE @DI15260 DEC %4+15270 @DI1 LDA #'15280 STA DDEVIC5290 LDA #75300 STA&} DTIMLO5310 LDX #$405320 LDA DCOMND5330 CMP #'R5340 BEQ @DI25350 LDX #$805360 @DI2 STX D&}STATS5370 LDA %55380 STA DBYTLO5390 LDA %5+15400 STA DBYTHI5410 JSR SIOV5420 BMI @D&}I45430 CLC 5440 LDA DBUFLO5450 ADC %55460 STA DBUFLO5470 LDA DBUFHI5480 ADC %5+154&}90 STA DBUFHI5500 INC DAUX15510 BNE @DI35520 INC DAUX25530 @DI3 DEC %45540 BNE @DI15550 &} DEC %4+15560 BPL @DI15570 LDY #15580 @DI45590 .ENDIF 5600 .ENDM 5610 ;5620 ;--------------&}-----------------5630 ;5640 ; MACRO: BUMP5650 ; FORM: BUMP var5660 ;5670 ;Increments a counter by 15680 ;5690 .MA&}CRO BUMP 5700 .IF %0<>15710 .ERROR "BUMP: wrong number of arguments"5720 .ELSE 5730 INC %15740 &} BNE @BU5750 INC %1+15760 @BU5770 .ENDIF 5780 .ENDM 5790 ;5800 ;-------------------------------581&}0 ;5820 ; MACRO: DSTATUS5830 ;5840 ; FORM: DSTATUS ch,buf5850 ;5860 ; ch is given as in the @CH macro5870 ; buf must b&}e the address of an appropriate5880 ; buffer in memory5890 ;5900 ; returns the status of the device5910 ; specified by &}the open channel5920 ;5930 .MACRO DSTATUS 5940 .IF %0<>25950 .ERROR "STATUS: wrong number of arguments"5&}960 .ELSE 5970 @CH %15980 @CV CSTAT5990 STA ICCOM,X6000 JSR CIO6010 STY %26020 &} .ENDIF 6030 .ENDM 6040 ;6050 ;-------------------------------6060 ;6070 ; FORM: GETCHR ch6080 ;6090 ; ch i&}s given as in the @CH macro6100 ; gets or puts a character to/from6110 ; the A register from/to the device6120 ; speci&}fied by ch6130 ;6140 .MACRO GETCHR 6150 .IF %0<>16160 .ERROR "GETCHR: wrong number of arguments"6170 &} .ELSE 6180 @CH %16190 LDA #CGBINR6200 STA ICCOM,X6210 LDA #06220 STA ICBLEN,X6230 &} STA ICBLEN+1,X6240 JSR CIO6250 .ENDIF 6260 .ENDM 6270 ;6280 ;-------------------------------6290 ;&}6300 ; MACROS: BGET and BPUT6310 ;6320 ; FORM: BGET ch,buf,len[,flag]6330 ; BPUT ch,buf,len[,flag]6340 ;6350 ;&} ch is given as in the @CH macro6360 ; len is assumed to be an immediate value if there are only 36370 ; parameters, othe&}rwise a6380 ; memory location6390 ; buf must be the address of an appropriate6400 ; buffer in memory6410 ;6420 ; put&}s or gets length bytes to/from the6430 ; specified buffer, uses binary read/write6440 ;6450 ;6460 ; first: a common mac&}ro6470 ;6480 .MACRO @GP 6490 @CH %16500 LDA #%46510 STA ICCOM,X6520 LDA # <%26530 STA ICBADR&},X6540 LDA # >%26550 STA ICBADR+1,X6560 LDA # <%36570 STA ICBLEN,X6580 LDA # >%36590 STA ICBLEN&}+1,X6600 JSR CIO6610 .ENDM 6620 ;6630 ; and another6640 ;6650 .MACRO @GP1 6660 @CH %16670 LDA &}#%46680 STA ICCOM,X6690 LDA # <%26700 STA ICBADR,X6710 LDA # >%26720 STA ICBADR+1,X6730 LDA %3&}6740 STA ICBLEN,X6750 LDA %3+16760 STA ICBLEN+1,X6770 JSR CIO6780 .ENDM 6790 ;6800 .MACRO BGET &}6810 .IF %0<3 .OR %0>46820 .ERROR "BGET: wrong number of parameters"6830 .ELSE 6840 .IF %0=468&}50 @GP1 %1,%2,%3,CGBINR6860 .ELSE 6870 @GP %1,%2,%3,CGBINR6880 .ENDIF 6890 .END&}IF 6900 .ENDM 6910 ;6920 .MACRO BPUT 6930 .IF %0<3 .OR %0>46940 .ERROR "BPUT: wrong number of parame&}ters"6950 .ELSE 6960 .IF %0=46970 @GP1 %1,%2,%3,CPBINR6980 .ELSE 6990 @GP %1,%&}2,%3,CPBINR7000 .ENDIF 7010 .ENDIF 7020 .ENDM 7030 ;7040 ;-------------------------------7050 ;7060 &}; MACRO: PRINT7070 ;7080 ; FORM: PRINT ch[,buffer[,length]]7090 ;7100 ; ch is as given in @CH macro7110 ; if no buffe&}r, prints just a RETURN7120 ; if no length given, 255 assumed7130 ;7140 ; used to print text. To print text without RETUR&}N,7150 ; length must be given. See OS/A+ manual7160 ;7170 ; EXCEPTION: second parameter may be a literal7180 ; string (&}e.g., PRINT 0,"test"), in which7190 ; case the length (if given) is ignored.7200 ;7210 .MACRO PRINT 7220 .IF %&}0<1 .OR %0>37230 .ERROR "PRINT: wrong number of parameters"7240 .ELSE 7250 .IF %0>17260 .IF&} %2<1287270 JMP *+4+%27280 @IO .BYTE %$2,$9B7290 @GP %1,@IO,%2+1,CPTXTR7300 .ELSE &}7310 .IF %0=27320 @GP %1,%2,255,CPTXTR7330 .ELSE 7340 @GP %1,%2,%3,CPB&}INR7350 .ENDIF 7360 .ENDIF 7370 .ELSE 7380 JMP *+47390 @IO .BYTE $9B7400 &} @GP %1,@IO,1,CPTXTR7410 .ENDIF 7420 .ENDIF 7430 .ENDM 7440 ;*+47390 @IO .BYTE $9B7400 $Y