Apple Assembly Line Volume 3 -- Issue 4 January, 1983 In This Issue... ---------------- Super Scroller . . . . . . . . . . . . . . . . . . . . . . 2 Micro Cookbook, vol. 1 (Review). . . . . . . . . . . . . . 8 Branch Opcode Names. . . . . . . . . . . . . . . . . . . . 9 Catalog Arranger Additions . . . . . . . . . . . . . . . . 10 Filename Editor for Catalog Aranger. . . . . . . . . . . . 11 Quickie No. 5 . . . . . . . . . . . . . . . . . . . . . . 20 Adding Decimal Values from ASCII Strings . . . . . . . . . 21 Still More on Hardcore Magazine. . . . . . . . . . . . . . 23 New "What's Where" . . . . . . . . . . . . . . . . . . . . 23 Programming a Language Card. . . . . . . . . . . . . . . . 25 The Book (of Apple Software) . . . . . . . . . . . . . . . 26 Seed Thoughts on Extensions. . . . . . . . . . . . . . . . 27 Plug for Some Neat New Products. . . . . . . . . . . . . . 28 Super Scroller.................................Jeffrey Scott East Norwalk, CT ------------------------------------------------------------ I am a manager of a software department in a company that makes computerized money counting equipment (6502 based). We have two programming departments: one which is called "applications" (Pascal and BASIC only) and another called "software engineering" where we use assembly language. We use the S-C Macro Assembler after having sampled all others. And in fact, with my Apple II, 5 Mbyte hard drive, and 3.6 MHz "Number Nine 6502" plug-in board, I can assemble a 300-page source program in about 2.5 minutes! I love the Apple II, but I don't like being tied to an operating system that I didn't write myself. I use RWTS, but for the rest I use my own code. I remember one day trying to output to the screen while receiving at 2400 baud. The Apple monitor's scroll was so slow that I lost the first few characters from the front of every line. While writing my own substitute scroll routine, the idea was born that the absolute fastest scroll would be straight in-line code: one "LDA $xxxx...STA $xxxx" pair for each byte on the screen. Just for fun, I wrote the following program, which generates the 960 LDA-STA pairs to scroll the whole screen! The generator program is only 145 bytes long, but it "writes" a program 5521 bytes long! This "Super Scroller" is not for everyone...it requires a spare 5521 bytes ($1591) of memory somewhere. If you do, you need only equate "PGM.START.IN.RAM" to your available area, call "PGM.TO.WRITE.SCROLLING.PGM", and then you can call the Super Scroller at "PGM.START.IN.RAM whenever you need it. Since the scroller can be generated whenever it is needed, it can be part of an overlay environment. You only need a 5.5K buffer available at the right times. At other times the same memory can be used other ways. To illustrate the speediness of Super Scroller, I wrote a memory dump whose output is the same as the Apple monitor memory dump. It is set up to display from $0000 through $BFFF. With Super Scroller, it takes only about 51 seconds; without, it takes 2 minutes 57 seconds (over three times longer!). Someone might object that I did not clear the bottom line after scrolling up. I elected to just write a fresh bottom line, and clear to the end of line after the last new character is written. 1000 *SAVE SUPER SCROLL GENERATOR 1010 *-------------------------------- 1020 * 1030 * APPLE SUPER SCROLLER 1040 * 1050 *-------------------------------- 1060 * PROGRAM TO CREATE A FAST SCROLLER 1070 * 1080 * CREATES AN ALL "IN-LINE" SCROLL ROUTINE 1090 * WHICH MAY BE CALLED AS A SUBROUTINE. 1100 * 1110 * WILL SCROLL LINES 2-24 UP TO LINES 1-23 1120 * IN ONLY 7.6 MILLISECONDS. 1130 * 1140 * BOTTOM LINE IS LEFT UNCHANGED; YOU MAY 1150 * WISH TO ADD MORE CODE TO BLANK BOTTOM LINE. 1160 *-------------------------------- 1170 1180 PGM.START.IN.RAM .EQ $4000 1190 PROGRAM .EQ $02 - $03 1200 UPPER.LINE .EQ $04 - $05 1210 LOWER.LINE .EQ $06 - $07 1220 *-------------------------------- 1230 .MA SCRN 1240 .DA ]1,]1+$80,]1+$100,]1+$180 1250 .DA ]1+$200,]1+$280,]1+$300,]1+$380 1260 .EM 1270 *-------------------------------- 1280 APPLE.SCREEN.ADDRESSES 1290 >SCRN $400 LINES 1-8 1300 >SCRN $428 LINES 9-16 1310 >SCRN $450 LINES 17-24 1320 *-------------------------------- 1330 PGM.TO.WRITE.SCROLLING.PGM 1340 1350 LDA #PGM.START.IN.RAM 1360 STA PROGRAM 1370 LDA /PGM.START.IN.RAM 1380 STA PROGRAM+1 1390 *-------------------------------- 1400 LDX #0 FOR LINE = 1 TO 23 1410 .1 LDA APPLE.SCREEN.ADDRESSES,X 1420 STA UPPER.LINE 1430 LDA APPLE.SCREEN.ADDRESSES+1,X 1440 STA UPPER.LINE+1 1450 1460 LDA APPLE.SCREEN.ADDRESSES+2,X 1470 STA LOWER.LINE 1480 LDA APPLE.SCREEN.ADDRESSES+3,X 1490 STA LOWER.LINE+1 1500 1510 TXA SAVE LINE # 1520 PHA 1530 *-------------------------------- 1540 LDX #40 FOR CHAR = 1 TO 40 1550 .2 LDY #0 1560 LDA #$AD "LDA ABSOLUTE" 1570 STA (PROGRAM),Y 1580 INY 1590 LDA LOWER.LINE 1600 STA (PROGRAM),Y 1610 INY 1620 LDA LOWER.LINE+1 1630 STA (PROGRAM),Y 1640 INY 1650 LDA #$8D "STA ABSOLUTE" 1660 STA (PROGRAM),Y 1670 INY 1680 LDA UPPER.LINE 1690 STA (PROGRAM),Y 1700 INY 1710 LDA UPPER.LINE+1 1720 STA (PROGRAM),Y 1730 *-------------------------------- 1740 TYA UPDATE PROGRAM POINTER 1750 SEC 1760 ADC PROGRAM 1770 STA PROGRAM 1780 BCC .3 1790 INC PROGRAM+1 1800 .3 INC UPPER.LINE NEXT CHAR POSITION 1810 INC LOWER.LINE 1820 DEX 1830 BNE .2 1840 *-------------------------------- 1850 PLA 1860 TAX 1870 INX NEXT LINE 1880 INX 1890 CPX #2*23 1900 BNE .1 1910 *-------------------------------- 1920 LDY #0 1930 LDA #$60 "RTS" 1940 STA (PROGRAM),Y 1950 RTS 1960 *-------------------------------- 1970 * A FAST MEMORY DUMP!! 1980 *-------------------------------- 1990 MEML .EQ $8 2000 MEMH .EQ $9 2010 SCREEN.WRITE.LINE .EQ $7D0 2020 *-------------------------------- 2030 START.DEMO 2040 JSR PGM.TO.WRITE.SCROLLING.PGM 2050 MEMDUMP 2060 LDA #0 DISPLAY FROM $0000 THRU $BFFF 2070 STA MEML 2080 STA MEMH 2090 .1 LDX #0 X = CHAR PNTR IN OUTPUT LINE 2100 LDA MEMH DISPLAY ADDRESS 2110 JSR DISPLAY.BYTE 2120 LDA MEML 2130 JSR DISPLAY.BYTE 2140 LDA #$AD "- " 2150 STA SCREEN.WRITE.LINE,X 2160 INX 2170 LDA #$A0 2180 STA SCREEN.WRITE.LINE,X 2190 INX 2200 LDY #0 2210 .2 LDA (MEML),Y DISPLAY 8 BYTES 2220 JSR DISPLAY.BYTE 2230 LDA #$A0 2240 STA SCREEN.WRITE.LINE,X 2250 INX 2260 INY 2270 CPY #8 2280 BNE .2 2290 .3 STA SCREEN.WRITE.LINE,X 2300 INX 2310 CPX #40 CLEAR TO END OF LINE 2320 BCC .3 2330 *-------------------------------- 2340 JSR PGM.START.IN.RAM 2350 *-------------------------------- 2360 LDA #8 2370 CLC 2380 ADC MEML 2390 STA MEML 2400 LDA MEMH 2410 ADC #0 2420 STA MEMH 2430 .4 CMP #$C0 STOP AT $BFFF 2440 BNE .1 2450 RTS 2460 *-------------------------------- 2470 DISPLAY.BYTE 2480 PHA 2490 LSR 2500 LSR 2510 LSR 2520 LSR 2530 JSR DISPLAY.NYBBLE 2540 PLA 2550 AND #$0F 2560 DISPLAY.NYBBLE 2570 ORA #$B0 MAKE HEX DIGIT 2580 CMP #$BA 2590 BCC .1 2600 ADC #6 2610 .1 STA SCREEN.WRITE.LINE,X 2620 INX 2630 RTS S-C Macro Assembler (the best there is!)...........................$80.00 Upgrade from Version 4.0 to MACRO..................................$27.50 Source code of Version 4.0 on disk.................................$95.00 Fully commented, easy to understand and modify to your own tastes. S-C Macro Assembler /// (coming soon!)............................$???.00 Applesoft Source Code on Disk......................................$50.00 Very heavily commented. Requires Applesoft and S-C Assembler. ES-CAPE: Extended S-C Applesoft Program Editor....................$60.00 AAL Quarterly Disks...........................................each $15.00 Each disk contains all the source code from three issues of "Apple Assembly Line", to save you lots of typing and testing time. QD#1: Oct-Dec 1980 QD#2: Jan-Mar 1981 QD#3: Apr-Jun 1981 QD#4: Jul-Sep 1981 QD#5: Oct-Dec 1981 QD#6: Jan-Mar 1982 QD#7: Apr-Jun 1982 QD#8: Jul-Sep 1982 QD#9: Oct-Dec 1982 Double Precision Floating Point for Applesoft......................$50.00 Provides 21-digit precision for Applesoft programs. Includes sample Applesoft subroutines for standard math functions. FLASH! Integer BASIC Compiler (Laumer Research)................... $79.00 Source Code for FLASH! Runtime Package.............................$39.00 Super Disk Copy III (Sensible Software).............(reg. $30.00) $27.00 Amper-Magic (Anthro-Digital)........................(reg. $75.00) $67.50 Amper-Magic Volume 2 (Anthro-Digital)...............(reg. $35.00) $30.00 Quick-Trace (Anthro-Digital)........................(reg. $50.00) $45.00 Cross-Reference and Dis-Assembler (Rak-Ware).......................$45.00 Apple White Line Trace (Lone Star Industrial Computing)............$50.00 (A unique learning tool) Blank Diskettes (with hub rings).................package of 20 for $50.00 Small 3-ring binder with 10 vinyl disk pages and disks.............$36.00 Vinyl disk pages, 6"x8.5", hold one disk each................10 for $4.50 Reload your own NEC PC-8023 ribbon cartridges...........each ribbon $5.00 Reload your own NEC Spinwriter Multi-Strike Film cartridges....each $2.50 Diskette Mailing Protectors.........................10-99: 40 cents each 100 or more: 25 cents each Ashby Shift-Key Mod................................................$15.00 Lower-Case Display Encoder ROM.....................................$25.00 Only Revision level 7 or later Apples. Books, Books, Books..........................compare our discount prices! "Enhancing Your Apple II, vol. 1", Lancaster.........($15.95) $15.00 "Incredible Secret Money Machine", Lancaster..........($7.95) $7.50 "Micro Cookbook, vol. 1", Lancaster..................($15.95) $15.00 "Beneath Apple DOS", Worth & Lechner.................($19.95) $18.00 "Bag of Tricks", Worth & Lechner, with diskette......($39.95) $36.00 "Apple Graphics & Arcade Game Design", Stanton.......($19.95) $18.00 "Assembly Lines: The Book", Roger Wagner.............($19.95) $18.00 "What's Where in the Apple", Second Edition..........($24.95) $23.00 "What's Where Guide" (updates first edition)..........($9.95) $9.00 "6502 Assembly Language Programming", Leventhal......($16.99) $16.00 "6502 Subroutines", Leventhal........................($12.99) $12.00 "MICRO on the Apple--1", includes diskette...........($24.95) $23.00 "MICRO on the Apple--2", includes diskette...........($24.95) $23.00 "MICRO on the Apple--3", includes diskette...........($24.95) $23.00 Add $1 per book for US postage. Foreign orders add postage needed. *** S-C SOFTWARE, P. O. BOX 280300, Dallas, TX 75228 *** *** (214) 324-2050 *** *** We take Master Charge, VISA and American Express *** Micro Cookbook, vol. 1 (Review).....................Bill Morgan --------------------------------------------------------------- Here are some more details about Don Lancaster's other new book, "Micro Cookbook, vol. 1 -- Fundamentals." As I said last month, the focus of the book is what to learn and how to learn it. He emphasizes "what actually gets used", rather than an exhaustive coverage of all possibilities. The best quick description of the book is an excerpt from the Preface: Our aim is to show you how micros work, and how you can profit from and enjoy the micro revolution. We start with the power and the underlying idea behind all micros. From there we build up the framework for all the important micro concepts and terms. The micro-processor families are broken down into three simple and easily understood schools. Chapter Two starts with a set of rules for winning the micro game. These rules have been thoroughly tested in the real world and are not at all what you might expect. After that, we check into many of the resources that are available to you as a micro user. A survey of micro trainers is included. The Funny Numbers section (Chapter 3) shows you ways to use and understand the number systems involved in micros, particularly binary and hexadecimal. From there, we look at logic, both as hardware gates and as software commands. The fourth chapter is all about codes. The important codes that are covered include straight binary, 2's complement binary, ASCII, BCD, instruction codes, user port codes, and various serial data-transmission codes and standards. The 2's complement codings are presented in a new and understandable way. Chapter 5 tells us many things about memory. We go into electronic memory -- beginning with simple latches and progressing to clocked flip-flops. Mainstream microcomputer memory is attacked next -- from static RAMs up through dynamic RAM, ROM, PROM, EPROM, and EEPROM memories. "Micro Cookbook -- Fundamentals" is just that: Fundamental. I am a complete novice on hardware. After reading Lancaster's book, I still can't design custom interfaces for my Apple, but I can now read the more technical books without getting totally lost. I have a better understanding of address decoding and of what the memory chips are really doing. The book is informative, enlightening, and entertaining. I recommend it. This Cookbook is about 360 pages of text, plus appendices and index. There are many drawings and charts. List price is $15.95. We will be selling it for $15.00 + postage. Funny Opcode Names in the 6801 Manual......Bob Sander-Cederlof -------------------------------------------------------------- Paul Lundgren (of Microcomp, Inc. in Newtown, CT) brought some interesting facts to my attention today. When I implemented my 6801 Cross Assemblers, I used what was at the time the latest documentatin available. Paul had some printed two years later, and there were some differences. For some reason, the Motorola 6801 Reference Manual changes the name of the ASL and ASLD opcodes to LSL and LSLD. There is no difference in operation, just a difference in spelling. The S-C Cross Assembler only recognizes the ASL and ASLD spellings. The opcode tables are near the end of the assembler, so you can easily find these entries to change them if you feel strongly about it. The Motorola book also lists alias names for the BCC and BCS opcodes. In the 6801 (or other 68xx chips), carry clear means the last test was greater or equal, so the alias name is BHS (Branch if High or Same). Carry set means the test was smaller, so the alias is BLO. Note that the meaning of carry after a comparison in the 68xx chips is exactly the opposite of carry in the 6502! Here are some macros to use for BHS and BLO: .MA BHS BCC ]1 .EM .MA BLO BCS ]1 .EM Some assemblers for the 6502 have two alias opcodes for BCC and BCS. For example, LISA has BLT for BCC (Branch if Less Than), and BGE for BCS (Branch if Greater than or Equal). [ I didn't do this in the S-C Assemblers because the meaning depends on whether the values tested are considered to be signed or unsigned. ] Here are two macros to implement BLT and BGE in the 6502 version of the S-C Macro Assembler: .MA BLT BCC ]1 .EM .MA BGE BCS ]1 .EM An Addition to CATALOG ARRANGER.................Dave Barkovitch --------------------------------------------------------------- I really like Bill Morgan's CATALOG ARRANGER, from the October issue of AAL. There is something I want to change, though. When you move the cursor to the end of a long catalog, the cursor stays in the middle of the screen and the catalog scrolls up, until only the top half of the screen is filled. Here are some patches to make the cursor move down to the end, and keep 22 files on the screen: 2931 LDA NUMBER.OF.ELEMENTS 2932 SEC 2933 SBC #LINE.COUNT 2934 BPL .5 2935 LDA #ZERO 2936 .5 STA LAST.ELEMENT 3830 BPL .7 3841 BEQ .1 3842 .7 CMP LAST.ELEMENT 3843 BCC .1 3844 LDA LAST.ELEMENT 5991 LAST.ELEMENT .BS 1 And Another Change.................................Bill Collins --------------------------------------------------------------- CATALOG ARRANGER is a great utility. Here are a couple of things you might like to know: 1. Version 4.0 of the S-C Assembler will not accept division in the operand. If you have that version then change line 3820 to SBC #11. 2. If you have DOS relocated into a RAM card you need to add the following lines for bank switching purposes: 1165 MONREAD .EQ $C082 1167 DOSREAD .EQ $C083 Then add BIT MONREAD at these positions: Lines 1675, 3785, 3855, 3895, 4015 (".5" moved to this line), 4205 (".3" moved to this line), 4315, 4425, 4455 (".7" moved to this line). And add BIT DOSREAD at these spots: Lines 1535-36, 1685-86, 3795-96, 3905-06, 3975-76, 4035-36, 4215-16, 4345-46, 4465-66, 4955-56. Also, all DOS addresses must be moved up 16K (lines 1180-1310.) $Axxx addresses become $Exxx and $Bxxx become $Fxxx. A Filename Editor for CATALOG ARRANGER..............Bill Morgan --------------------------------------------------------------- Many thanks to all of you who have called and written to say how much you like the CATALOG ARRANGER. I'm glad to hear that others find it as useful as I do. Here's my favorite addition to the program, the ability to edit the filename in the cursor. Now you can change a name by inserting or deleting characters, insert control characters, and place display titles in the catalog, using normal, inverse, flashing, or lower case text. There are a couple of unique features in this editor. The cursor clearly indicates Insert, Overtype, or Override mode, and also shows whether the input will be Normal, Inverse, Flashing, or Lower Case. The display unambiguously shows all these types, plus Control. The price of all this clarity is three display lines for one text line, but that's no problem in this program. These concepts can easily be adapted to edit any line of forty or fewer characters. The principles also apply to longer lines, but the screen display would have to be handled carefully. Installation To add FILENAME EDITOR to CATALOG ARRANGER just type in S.FILENAME.EDITOR from this listing, and save it on the same disk with S.CATALOG.ARRANGER. Then LOAD S.CATALOG.ARRANGER and make the following changes and additions: 1030 .TF CATALOG.ARRANGER.NEW 1480 LINE.COUNT .EQ 21 1915 CMP #$85 ^E 1920 BNE .1 1922 JSR RENAME.FILE 1924 JMP DISPLAY.AND.READ.KEY 5865 .IN S.FILENAME.EDITOR Then SAVE the new S.CATALOG.ARRANGER and assemble it. Operation To rename a file, just use the arrow keys to move the cursor to the file you want, and type "CTRL-E" (for Edit). The name you selected will appear near the bottom of the screen, between square brackets. Any control characters in the name will have a bar above them. The caret below the first character of the name is the cursor. Any non-control characters you type will replace the characters on the screen. Control characters will have the effects shown in the command list below. Especially note that RETURN will enter the name in the lower buffer into the filename array, ESC will return you to the Arranger without altering the filename, and CTRL-R will restore the original filename. One way to have fun with this program is to put dummy files in the catalog, for titles or just for decoration. In Applesoft, SAVE as many dummy programs (10 REM, for example) as you need. Then BRUN CATALOG ARRANGER, move the dummy programs to where you want them, and edit the names. If you start the new file name with six CTRL-H's, it will blank out the "A 002 " before the name. You can use inverse, flashing or lower case text in titles. If you insert CTRL-M's (RETURNS) after a name there will be blank lines in the catalog. Play with it for a while, and let me know if you come up with any especially neat tricks. Here are the commands: <-- -- Left Arrow. Move the cursor left one position. --> -- Right Arrow. Move the cursor right one position. RETURN -- Enter. Enter the changed name into the upper display. ESC -- Escape. Return to arranging, without entering the changed name. ^B -- Beginning. Move the cursor to the beginning of the line. ^D -- Delete. Delete one character at the cursor. ^E -- End. Move the cursor to the end of the name. ^F -- Find. Move the cursor to a particular character. Type "^FA" to move the cursor to the next "A" in the name. Type another "A" to move to the following "A", and so on. Any character other than the search key will be entered or executed. ^I -- Insert. Turn on Insert Mode. Following characters will be inserted to the left of the backslash cursor. Any control character turns Insert off. ^O -- Override. Insert the next character typed "as is". This allows you to insert control characters into a name. ^R -- Restore. Restore the name to its original condition, as it appears in the upper display. ^S -- Shift Mode. Cycle between Normal, Inverse, Flashing, and Lower Case entry. The cursor changes to show the current mode. ^Z -- Zap. Remove all characters from the cursor to the end of the name. How it All Works When you type CTRL-E to enter the editor, line 1090 transfers the filename into an edit buffer located in the screen memory at $757-$774. The main loop of the editor is lines 1190-1320. All through the editor the Y-register is the cursor position in the line. The routine DISPLAY.EDIT.BUFFER shows the brackets before and after the name, puts bars over any control characters, displays the cursor, and gets the next keystroke. The main loop then checks whether that key was a control. If it was not a control character, it is passed to the input section (lines 1340-1570), where the character is masked according to the current MASK.MODE (Normal, Inverse, Flashing, or Lower-case) and either inserted or just placed in the line. The program then jumps back to E.START to redisplay the buffer and get the next key. If you enter a control character, the program JSR's to the SEARCH.AND.PERFORM routine at lines 3250-3390 (taken straight from Bob's article in the August '82 AAL.) Here we look up the command key in the table at lines 3420-3550 and do a PHA, PHA, RTS type branch to the appropriate command handler, or to the monitor's BELL, if the command didn't match anything in the table. Almost all of the command handlers end with an RTS that returns control to line 1320. The exceptions are OVERRIDE (lines 1590-1650) and RESTORE (lines 2150-2180), since they exit through internal JMP's, and RETURN/ESC (lines 2660-2720), since those return to the main program. Another oddity is the FIND routine (lines 2420-2640), since it has two exits. Line 2640 returns to line 1320 through the BELL routine. Lines 2590-2620 are needed to process a keystroke that is not a repetition of the search key. 1000 *SAVE S.FILENAME.EDITOR 1010 *-------------------------------- 1020 MON.YSAVE .EQ $34 1030 CONTROL.LINE .EQ $6D7 1040 EDIT.BUFFER .EQ $757 1050 CURSOR.LINE .EQ $7D7 1060 MON.BELL .EQ $FF3A 1070 *-------------------------------- 1080 RENAME.FILE 1090 JSR MOVE.FILE.INTO.BUFFER 1100 LDY #$FF 1110 STY MASK.ONE INITIALIZE 1120 INY 1130 STY INPUT.MODE VARIABLES 1140 STY MASK.TWO 1150 STY MASK.MODE 1160 LDA #$DE ^ 1170 STA CURSOR 1180 *-------------------------------- 1190 E.START 1200 JSR DISPLAY.EDIT.BUFFER UPDATE DISPLAY 1210 * AND GET KEYSTROKE 1220 1230 REENTRY 1240 CMP #$A0 CONTROL? 1250 BCS E.INPUT NO, INPUT IT 1260 LDA #ZERO YES, 1270 STA INPUT.MODE TURN OFF INSERT 1280 LDA #$DE ^ 1290 STA CURSOR 1300 LDX #ZERO 1310 JSR SEARCH.AND.PERFORM GO DO SOMETHING 1320 JMP E.START 1330 *-------------------------------- 1340 E.INPUT 1350 AND MASK.ONE CONDITION 1360 ORA MASK.TWO CHARACTER 1370 STA CURRENT.CHAR 1380 BIT INPUT.MODE INSERT OR OVERTYPE? 1390 BPL PLACE.CHARACTER 1400 1410 INSERT.CHARACTER 1420 STY MON.YSAVE SAVE CURSOR 1430 LDX #29 START AT END OF BUFFER 1440 .1 CPX MON.YSAVE TO CURSOR YET? 1450 BEQ PLACE.CHARACTER YES 1460 LDA EDIT.BUFFER-1,X NO, MOVE CHAR UP 1470 STA EDIT.BUFFER,X TO MAKE HOLE 1480 DEX NEXT CHAR 1490 BPL .1 ...ALWAYS 1500 1510 PLACE.CHARACTER 1520 LDA CURRENT.CHAR 1530 STA EDIT.BUFFER,Y 1540 CPY #29 END OF BUFFER? 1550 BCS .1 YES, RETURN 1560 INY NO, MOVE CURSOR 1570 .1 JMP E.START 1580 *-------------------------------- 1590 E.OVERRIDE 1600 PLA 1610 PLA 1620 LDA #$A2 SET CURSOR 1630 STA CURSOR.LINE,Y TO " 1640 JSR GETKEY 1650 JMP INSERT.CHARACTER 1660 *-------------------------------- 1670 E.LEFT.ARROW 1680 DEY MOVE CURSOR LEFT 1690 BPL .1 IF IT WENT NEGATIVE 1700 INY RESTORE IT TO 0 1710 .1 RTS 1720 *-------------------------------- 1730 E.RIGHT.ARROW 1740 CPY #29 AT END YET? 1750 BCS .1 YES, IGNORE 1760 INY NO, MOVE CURSOR RIGHT 1770 .1 RTS 1780 *-------------------------------- 1790 E.INSERT 1800 LDA #$FF TURN INSERT ON 1810 STA INPUT.MODE 1820 LDA #$DC \ 1830 STA CURSOR 1840 RTS 1850 *-------------------------------- 1860 E.DELETE 1870 TYA SET X TO 1880 TAX CURSOR 1890 .1 CPX #29 AT END? 1900 BEQ .2 BRANCH IF SO 1910 LDA EDIT.BUFFER+1,X 1920 STA EDIT.BUFFER,X MOVE ONE CHAR 1930 INX NEXT 1940 BCC .1 ...ALWAYS 1950 .2 LDA #SPACE PUT SPACE 1960 STA EDIT.BUFFER,X ON END 1970 RTS 1980 *-------------------------------- 1990 E.BEGINNING 2000 LDY #ZERO ZERO CURSOR 2010 RTS 2020 *-------------------------------- 2030 E.END 2040 LDY #29 START AT END OF BUFFER 2050 .1 LDA EDIT.BUFFER,Y 2060 CMP #SPACE SPACE? 2070 BNE .2 NO, WE'RE AT END OF NAME 2080 DEY YES, MOVE LEFT 2090 BPL .1 AND TRY AGAIN 2100 .2 CPY #29 STILL AT END OF BUFFER? 2110 BEQ .3 YES, STAY THERE 2120 INY NO, RIGHT ONE SPACE 2130 .3 RTS 2140 *-------------------------------- 2150 E.RESTORE 2160 PLA POP A RETURN 2170 PLA ADDRESS AND 2180 JMP RENAME.FILE START OVER 2190 *-------------------------------- 2200 E.SET.MODE 2210 INC MASK.MODE NEXT MODE 2220 LDA MASK.MODE IF MODE = 4 2230 AND #3 MAKE IT ZERO 2240 STA MASK.MODE 2250 TAX USE MODE FOR INDEX 2260 LDA MASK.ONE.TABLE,X AND SET 2270 STA MASK.ONE MASKS 2280 LDA MASK.TWO.TABLE,X 2290 STA MASK.TWO 2300 RTS 2310 *-------------------------------- 2320 E.ZAP 2330 TYA START AT 2340 TAX CURSOR 2350 LDA #SPACE 2360 .1 STA EDIT.BUFFER,X 2370 INX 2380 CPX #30 DONE? 2390 BCC .1 2400 RTS 2410 *-------------------------------- 2420 E.FIND 2430 JSR GETKEY GET SEARCH KEY 2440 STA SEARCH.KEY 2450 .1 TYA 2460 TAX 2470 .2 INX START AT CURSOR+1 2480 CPX #30 END? 2490 BCS .3 YES, NOT FOUND 2500 LDA EDIT.BUFFER,X 2510 CMP SEARCH.KEY MATCH? 2520 BNE .2 NO, NEXT X 2530 TXA YES, MOVE CURSOR 2540 TAY 2550 JSR DISPLAY.EDIT.BUFFER 2560 * NEXT KEYPRESS 2570 CMP SEARCH.KEY SAME CHARACTER? 2580 BEQ .1 YES, FIND IT AGAIN 2590 PLA NO, PULL A RETURN 2600 PLA ADDRESS AND GO 2610 LDA CURRENT.CHAR 2620 JMP REENTRY PROCESS THIS KEY 2630 2640 .3 JMP MON.BELL RETURN THROUGH BELL 2650 *-------------------------------- 2660 E.RETURN 2670 JSR MOVE.BUFFER.INTO.ARRAY 2680 2690 E.ESCAPE 2700 PLA POP ONE RETURN 2710 PLA ADDRESS AND RETURN 2720 RTS TO ARRANGING 2730 *-------------------------------- 2740 MOVE.FILE.INTO.BUFFER 2750 LDA ACTIVE.ELEMENT SET 2760 JSR POINT.TO.A POINTER 2770 LDY #3 2780 .1 LDA (POINTER),Y MOVE 2790 STA EDIT.BUFFER-3,Y NAME 2800 INY 2810 CPY #$21 2820 BCC .1 2830 RTS 2840 *-------------------------------- 2850 MOVE.BUFFER.INTO.ARRAY 2860 LDA ACTIVE.ELEMENT MAKE 2870 JSR POINT.TO.A POINTER 2880 LDY #3 2890 .1 LDA EDIT.BUFFER-3,Y MOVE 2900 STA (POINTER),Y NAME 2910 INY 2920 CPY #$21 2930 BCC .1 2940 RTS 2950 *-------------------------------- 2960 DISPLAY.EDIT.BUFFER 2970 LDA #$DD ] 2980 STA EDIT.BUFFER-1 LEFT END 2990 LDA #$DB [ 3000 STA EDIT.BUFFER+30 RIGHT END 3010 LDX #29 3020 .1 LDA #SPACE 3030 STA CONTROL.LINE,X REMOVE OLD CONTROL 3040 STA CURSOR.LINE,X BAR AND CURSOR 3050 LDA EDIT.BUFFER,X 3060 CMP #$A0 3070 BCS .2 CONTROL? 3080 CMP #$80 3090 BCC .2 3100 LDA #$DF _ YES, PUT BAR 3110 STA CONTROL.LINE,X 3120 .2 DEX 3130 BPL .1 3140 LDA CURSOR GET CURSOR, 3150 AND MASK.ONE CONDITION IT, 3160 ORA MASK.TWO 3170 STA CURSOR.LINE,Y AND SHOW IT 3180 *-------------------------------- 3190 GETKEY LDA KEYBOARD 3200 BPL GETKEY 3210 STA KEYSTROBE 3220 STA CURRENT.CHAR 3230 RTS 3240 *-------------------------------- 3250 SEARCH.AND.PERFORM.NEXT 3260 INX NEXT ENTRY 3270 INX 3280 INX 3290 3300 SEARCH.AND.PERFORM 3310 LDA EDIT.TABLE,X GET VALUE FROM TABLE 3320 BEQ .1 NOT IN TABLE 3330 CMP CURRENT.CHAR 3340 BNE SEARCH.AND.PERFORM.NEXT 3350 .1 LDA EDIT.TABLE+2,X LOW BYTE OF ADDRESS 3360 PHA 3370 LDA EDIT.TABLE+1,X HIGH BYTE 3380 PHA 3390 RTS GO DO IT! 3400 *-------------------------------- 3410 EDIT.TABLE 3420 .DA #$82,E.BEGINNING-1 ^B 3430 .DA #$84,E.DELETE-1 ^D 3440 .DA #$85,E.END-1 ^E 3450 .DA #$86,E.FIND-1 ^F 3460 .DA #$88,E.LEFT.ARROW-1 <-- 3470 .DA #$89,E.INSERT-1 ^I 3480 .DA #$8D,E.RETURN-1 RETURN 3490 .DA #$8F,E.OVERRIDE-1 ^O 3500 .DA #$92,E.RESTORE-1 ^R 3510 .DA #$93,E.SET.MODE-1 ^S 3520 .DA #$95,E.RIGHT.ARROW-1 --> 3530 .DA #$9A,E.ZAP-1 ^Z 3540 .DA #$9B,E.ESCAPE-1 ESC 3550 .DA #$00,MON.BELL-1 OTHERS 3560 *-------------------------------- 3570 MASK.ONE.TABLE 3580 .DA #$FF,#$3F,#$7F,#$FF 3590 3600 MASK.TWO.TABLE 3610 .DA #$00,#$00,#$40,#$20 3620 *-------------------------------- 3630 CURRENT.CHAR .BS 1 3640 SEARCH.KEY .BS 1 3650 INPUT.MODE .BS 1 (0 OR $FF) 3660 MASK.MODE .BS 1 (0 TO 3) 3670 MASK.ONE .BS 1 (FROM TABLE ABOVE 3680 MASK.TWO .BS 1 ( " " " ) 3690 CURSOR .BS 1 ($DE, $DC, OR $A2) 3700 * ( ^ , \ , OR " ) 3710 *-------------------------------- S-C Macro Cross Assemblers -------------------------- The high cost of dedicated microprocessor development systems has forced many technical people to look for alternate methods to develop programs for the various popular microprocessors. Combining the versatile Apple II with the S-C Macro Assembler provides a cost effective and powerful development system. Hobbyists and engineers alike will find the friendly combination the easiest and best way to extend their skills to other microprocessors. The S-C Macro Cross Assemblers are all identical in operation to the S-C Macro Assembler; only the language assembled is different. They are sold as upgrade packages to the S-C Macro Assembler. The S-C Macro Assembler, complete with 100-page reference manual, costs $80; once you have it, you may add as many Cross Assemblers as you wish at a nominal price. The following S-C Macro Cross Assembler versions are now available, or soon will be: Motorola: 6800/6801/6802 now $32.50 6805 now $32.50 6809 now $32.50 68000 now $50 Intel: 8048 now $32.50 8051 soon $32.50 8085 soon $32.50 Zilog: Z-80 now $32.50 RCA: 1802/1805 soon $32.50 Rockwell: 65C02 now $20 The S-C Macro Assembler family is well known for its ease-of-use and powerful features. Thousands of users in over 30 countries and in every type of industry attest to its speed, dependablility, and user-friendliness. There are 20 assembler directives to provide powerful macros, conditional assembly, and flexible data generation. INCLUDE and TARGET FILE capabilities allow source programs to be as large as your disk space. The integrated, co-resident source program editor provides global search and replace, move, and edit. The EDIT command has 15 sub-commands combined with global selection. Each S-C Assembler diskette contains two complete ready-to-run assemblers: one is for execution in the mother-board RAM; the other executes in a 16K RAM Card. The HELLO program offers menu selection to load the version you desire. The disks may be copied using any standard Apple disk copy program, and copies of the assembler may be BSAVEd on your working disks. S-C Software Corporation has frequently been commended for outstanding support: competent telephone help, a monthly (by subscription) newsletter, continuing enhancements, and excellent upgrade policies. S-C Software Corporation (214) 324-2050 P.O. Box 280300, Dallas, Texas, 75228 Quickie No. 5..................................Horst Schneider -------------------------------------------------------------- To print a dashed line on the screen: JSR $FD9C Print one dash JSR $FCA3 same character across screen To print any character across screen: LDY #0 LDA #$xx xx = ASCII screen code for char JSR $FCA3 To print any character across most of screen: LDY #xx xx = starting column LDA #$yy yy = ASCII screen code for char JSR $FCA3 Adding Decimal Values from ASCII Strings...Bob Sander-Cederlof -------------------------------------------------------------- The program below shows a nifty way to add two decimal values together and get the result as an ASCII string, without ever converting decimal to binary or binary to decimal. The example shows two six-character values being added, but any length would work the same. For simplicity's sake I used a leading zero format, and allow no signs or decimal points. Fancier features can wait for more cerebral times. The beautiful part is the way the 6502's carry flag works. On entering the add loop, I clear carry. Then I add a pair of digits, preserving the ASCII code. If the sum is more than "9" ($39), the CMP will leave carry set, prepared for subtracting 10 at line 1160. After subtracting 10, carry will be set (because the SBC caused no borrow). This carry then propagates to the next digit. Strictly speaking, I should allow the sum to be one digit longer than the addend and augend strings, and store the final carry value there. Any reasonably useful version would also allow leading blanks and decimal points, be callable as an &-routine with string parameters, automatically handle non-aligned decimal points, and allow negative numbers. I'll try all these for next month. 1000 *SAVE S.STRING.ADD 1010 *-------------------------------- 1020 * STRING ADDITION 1030 *-------------------------------- 1040 S1 .AS /000189/ 1050 S2 .AS /007030/ 1060 *-------------------------------- 1070 S3 .AS / / 1080 *-------------------------------- 1090 ADD LDX #5 6 DIGITS 1100 CLC START WITH NO CARRY 1110 .1 LDA S1,X NEXT DIGIT PAIR 1120 AND #$0F CHANGE ASCII TO BINARY CODE 1130 ADC S2,X RESULT IS IN ASCII AGAIN 1140 CMP #$3A UNLESS MORE THAN 9 1150 BCC .2 OKAY 1160 SBC #10 NEED TO PROPAGATE CARRY 1170 .2 STA S3,X SUM DIGIT IN ASCII 1180 DEX MORE DIGITS? 1190 BPL .1 YES 1200 RTS NO, RETURN Still More on Hardcore Magazine............Bob Sander-Cederlof -------------------------------------------------------------- I bought the latest, Vol. 1 No. 3, off the newsstand a few days ago. It is 72 pages, $3.50. I believe those 72 pages far surpass in usefulness the 600-odd pages of some familiar monthlies. A highlight for me was a complete assembly listing (in S-C format!) of HyperDOS, by John Bridges. HyperDOS modifies the LOAD and BLOAD commands so that loading runs up to five times faster. This is the same improvement factor offered by a half dozen DOS-mods on the market, such as DOS Enhancer from S&H Software. (Of course, DOS Enhancer also speeds up SAVE and BSAVE, and include many other useful utilities with the package.) If you are a nibble copier, you will be pleased with the listing of parameters for Locksmith and Nibbles Away II. As usual, there are a lot of hints on "how to unlock" those copy-protected disks: see "Controlling the I.O.B.", and "Boot Code Tracing". Bev Haight (author of "Night Falls", among others) gives some excellent information on graphics, games, and even secrets to publishing. Bev describes, explains, and lists a new game called "Zyphyr Wars" for your pleasure and edification. There is a lot more. Even an interview with Mike Markulla regarding Apple's position on software protection! Issue number 4 promises to focus on graphics: novice-to-expert how-to's, complete graphic aid programs, tables, charts, reviews, etc. The New "What's Where".....................Bob Sander-Cederlof -------------------------------------------------------------- Micro has doubled the size and tripled the value of their "What's Where in the Apple" book. There is now a 152-page double-column type-set 20-chapter text together with the previously published atlas and gazetteer. The new edition retails at $24.95 (our price $23). If you already have the older edition, you only need the update, called "The Guide to What's Where", for $9.95 retail (our price ($9 even). If you order books from us, remember to include enough for shipping. Programming a Language Card.........................Bill Morgan --------------------------------------------------------------- Recently we've received a couple of questions about the exact meaning of all those $C08x addresses used to access a language (or RAM) card in slot 0. Here's a rundown of what memory cards are and how to use them. A RAM card is a plug-in board containing an extra 16K (or more) of memory, which can be used instead of the language ROMs on your Apple motherboard. The $C08x addresses are switches that determine which memory will be used whenever you read or write an address from $D000-$FFFF. With the proper use of the switches on a 16K card, your Apple becomes a machine with 76K of memory! (That includes motherboard RAM, motherboard ROM, and the full RAM card.) Here's a summary of the addresses and their functions: Address Read Write Bank ------- ---- ----- ---- $C080 Card Mother 2 $C081* Mother Card 2 $C082 Mother Mother 2 $C083* Card Card 2 $C088 Card Mother 1 $C089* Mother Card 1 $C08A Mother Mother 1 $C08B* Card Card 1 The stars indicate addresses which must be accessed twice to have effect (these are the ones that write-enable the card.) These addresses are "soft switches", much like those for switching the screen display modes. To throw a switch, just use a LDA or any instruction that reads the location. From BASIC you can use a PEEK. STA or POKE also work with most RAM cards, but not all of them. Experiment with yours to see how it behaves. If you're writing a program for use on other people's Apples it's safest to stay with instructions that read the location. The Bank column refers to the fact that a language card actually has 16K of memory, but the range from $D000 to $FFFF is only 12K. The other 4K ought to be $C000-$CFFF, but that's the area that Apple uses for special Input/Output functions. Therefore, there is an extra 4K "bank" which can be addressed at $D000-DFFF. Normally, only Bank 2 is used. If a program gets bigger than 12K it becomes necessary to use Bank 1, but that starts getting complicated. The best approach is to put routines or data in bank 1 that don't have to refer to anything in bank 2. You can then have the main code above $E000 decide which bank to use. Some programs seem to use the motherboard and RAM card memories at the same time. Examples of this are ES-CAPE.LC and the programs that relocate DOS into the RAM card. Generally, these have a short "bridge" or "switcher" routine somewhere in the motherboard RAM. When the program in the RAM card needs to call a routine in the motherboard ROM, it actually calls the bridge. The bridge routine then throws the appropriate $C08x switches and calls the necessary ROM routine. When that routine finishes, the bridge then switches back to the RAM card and continues the program there. Another thing to consider is whether the program in the RAM card needs the system monitor. If so, you need to make sure there is a copy of the monitor on the RAM card. Here's how to use the monitor to copy itself into a RAM card: ]CALL-151 *C081 C081 *F800