Apple Assembly Line
Volume 5 -- Issue 1 October 1984

In This Issue...

Index to Volume 4

This time last year we published a cumulative index to the first three years of Apple Assembly Line. In this issue we add a separate index to Volume 4, covering October 83 through September 84. Perhaps in another year or two we can do another complete index.

65802 is Here!

After nearly a year of more or less patient waiting, we finally have a sample 65802 microprocessor. It does indeed plug right into an Apple //e, and works just fine. See Bob's story inside for all the details.

Blind Word Processor

Subscriber Larry Skutchan, of Little Rock, Arkansas, has adapted the S-C Word Processor to work with the Echo Two Speech Synthesizer. He now has a special word processor for the blind, which he says is the best available. The price will be $95.50. Larry is a blind university student, majoring in Computer Science. You can reach him at (501) 568-2172.


18-Digit Arithmetic, Part 6 Bob Sander-Cederlof

This month's installment will cover some of the elementary functions: VAL, INT, ABS, SGN, and SQR. I will also introduce a general polynomial evaluator, which will be used by most of the other math functions.

Most of the functions expect a single argument, which will be loaded into DAC by the expression evaluator just before calling the function code. The function code will compute a value based on the argument, and leave the result in DAC. As the expression evaluator calls with JSR, the function code returns with RTS.

One exception to the above paragraph is the VAL function. VAL processes a string expression, and converts it into a value in DAC. The code in lines 1350-1610 of the listing closely parallels the VAL code in the Applesoft ROMs. Lines 1350-1370 evaluate the string expression. Lines 1380-1460 save the current TXTPTR value (which points into your Applesoft program), and makes TXTPTR point instead at the resulting string. Lines 1470-1520 save the byte just past the end of the string and store a 00 terminator byte in its place. FIN will evaluate the string, placing the numeric value into DAC. Then lines 1540-1600 restore the byte after the string and TXTPTR.

The INT function zeroes any digits after the decimal point in a number. A number in DAC has 20 digits. The exponent will be $00 if the value is zero, $01-40 if the value is all fractional, $41-53 if the value has from 1 to 19 digits before the decimal point, or $54-7F if the value has no fractional digits.

Lines 1650-1700 remove the $40 bias from the exponent. If the exponent was $00-40, DP.ZERO will force DAC to zero. Lines 1730-1740 check for the case of no fractional digits, and exit immediately. Lines 1750-1860 zero the digits after the decimal point. If the exponent was odd, there is one digit to be removed in the first byte to be cleared; the rest get both digits zeroed.

The simplest function is ABS, or absolute value. All it requires is forcing the sign positive, handled at lines 1910-1930.

Almost as simple is SGN, or sign function. SGN returns -1, 0, or +1, according as DAC was negative, zero, or greater-than- zero. Lines 1970-1980 check DAC.EXPONENT, which will be zero if-and-only-if DAC is zero. If the value is not zero, lines 1990-2030 force the value to be 1.0, while retaining the original sign.

SQR, the square root function, is more interesting. Do you remember the way you learned to take square roots in high school? Neither do I, but there is a handier way in computers anyway.

Suppose I want to find square root of 25. I could start with a wild guess, check it to see if I am close by squaring and comparing with 25, and then refining my guess until it is as accurate as I need. Suppose my wild guess is 7 (pretty wild!).

7*7 is 49, which is bigger than 25, so my next guess should be less than 7. Instead of just guessing wildly for the next one, why not take the average between 7 and 25/7? That average is 5.286. The average of 5.286 and 25/5.286 is 5.0076. The next one is 5.0000079. You can see that I am rapidly approaching the answer of 5.0.

The method of refining an approximation as exemplified above was derived originally be Sir Isaac Newton. His method involves calculus, can get quite complex, and applies to all sorts of problems. But in the case of the square root, it is as simple as averaging an approximation with the argument divided by the approximation.

It turns out that it is a very good method, because if you can get an initial approximation that has the first few digits right, the number of digits that are correct will slightly more than double each time you run through Newton's improver.

The next trick is to reduce the range of possible arguments from the full range of zero to 10^63 down to the range from .1 to 1.0. The zero case is easy, because SQR(0) = 0, and is handled at lines 2100-2110. Notice that lines 2120-2130 weed out negative arguments, which are not allowed.

Remember that the square root of X*10^n is equal to SQR(X)*10^(n/2). Lines 2150-2190 save the exponent, and change it to $40. This changes the value in DAC to the range .1 to 1.0. I have a book which gives polynomial approximations to the square root in that range. One with the form aX^4+bX^3+...+e gives an approximation with is accurate in the first 2.56 digits. Three iterations by Newton yield more than 22 accurate digits. The same book shows a cubic polynomial which gives 2.98 accurate digits if we can get the value into the range between .25 and 1.0.

Lines 2200-2280 fold the values between .1 and .25 up to the range .4 through 1.0 by multiplying the value by 4. (This multiplication goes pretty fast, since most of the bytes are zero.) The fact that we quadrupled the value is remembered, so that we can later halve the approximate root at lines 2350-2410. The cubic polynomial is evaluated in lines 2290-2340, by calling POLY.N. The result, by the time we reach line 2420, is an approximate square root of the number between .1 and 1; now we need to make it an approximate root of the original argument.

Lines 2420-2480 compute the exponent of the square root, by simply dividing the original exponent by two. If there is a remainder, meaning the original exponent was odd, then we also need to multply the trial root by SQR(10). This is handled in lines 2490-2550. The halved original exponent next is added to the trial exponent, giving a good first approximation to the square root of the original argument. Lines 2600-2740 run through three cycles of the Newton iteration, giving plenty of precision. If we were carrying enough digits along, the 2.98 digits of precision our polynomial produced would be refined to a full 26 digits, according to my book.

Speaking of the book, it is one I bought a number of years ago when working on double precision math for a Control Data 3300 time sharing system. As far as I know, it is still the best book in its field. Computer Approximations, by J. F. Hart and about seven other authors, was published in 1968 by John Wiley & Sons. I don't know if it is still in print or not, but if you ever need to create some high precision math routines, you ought to try to find a copy.

A very common element in the evaluation of many math functions is an approximation to the function over a limited range by a polynomial, or by the quotient of two polynomials. Therefore it is handy to have an efficient subroutine to evaluate a polynomial. Two different entry points allow efficient evaluation of two kinds: those whose first coefficient is 1, and the rest. POLY.N evaluates those whose first coefficient is not one, and POLY.1 does those whose first is 1.

       POLY.N --  a*x^n + b*x^n-1 + ...
       POLY.1 --    x^n + a*x^n-1 + ...

In both cases, you enter with the address of a table of coefficients in the Y- and A-registers (hi-byte in Y, lo-byte in A), and the degree of the polynomial in the X-register. Thus you see that in lines 2290-2340 the table P.SQR is addressed, and the degree of polynomial is 3 (cubic). Both POLY.N and POLY.1 assume that the value of x is in TEMP2. Where all terms have been computed and added, the result will be in DAC.

Actually, I may have misled you a little in the last sentence. The terms of the polynomial are not separately computed and added, but rather they are accumulated in a simple serial fashion:

       poly = ((( a * x + b) * x + c) * x + d) * x + e

The coefficients and other constants shown in lines 2770-2830 are in a special format which includes an extra two digits. You will remember that the basic operations (+-*/) are carried out to 20 digits. Therefore these constants are carried out to 20 digits. They are not critical in the square root computation, thanks to Sir Isaac, but the log and trig functions will need them.

  1000 *SAVE S.DP18 FUNC 1
  1010 *--------------------------------
  1020 AS.CHRGOT  .EQ $00B7
  1030 AS.FRMEVL  .EQ $DD7B
  1040 AS.CHKSTR  .EQ $DD7B
  1050 AS.FRESTR  .EQ $E600
  1060 AS.ILLERR  .EQ $E199
  1070 *--------------------------------
  1080 DMULT      .EQ $FFFF
  1090 DDIV       .EQ $FFFF
  1100 DADD       .EQ $FFFF
  1110 FIN        .EQ $FFFF
  1120 DP.TRUE    .EQ $FFFF
  1130 DP.ZERO    .EQ $FFFF
  1140 MOVE.DAC.TEMP3 .EQ $FFFF
  1150 MOVE.DAC.TEMP2 .EQ $FFFF
  1160 MOVE.TEMP2.DAC .EQ $FFFF
  1170 MOVE.YA.DAC.1  .EQ $FFFF
  1180 MOVE.YA.ARG.1  .EQ $FFFF
  1190 MOVE.TEMP3.ARG .EQ $FFFF
  1200 MOVE.TEMP2.ARG .EQ $FFFF
  1210 *--------------------------------
  1220 TXTPTR     .EQ $B8,B9
  1230 DEST       .EQ $60,61
  1240 *--------------------------------
  1250 TEMP2      .BS 1
  1260 TEMP3      .BS 1
  1270 P1         .BS 2
  1280 DAC.EXPONENT .BS 1
  1290 DAC.HI       .BS 10
  1300 DAC.SIGN     .BS 1
  1310 *--------------------------------
  1320 *      VAL (X$) FUNCTION
  1330 *--------------------------------
  1340 DP.VAL JSR AS.CHRGOT
  1350        JSR AS.FRMEVL     GET STRING
  1360        JSR AS.CHKSTR MAKE SURE IT IS A STRING
  1370        LDA TXTPTR   SAVE TXTPTR
  1380        PHA          ...ON STACK
  1390        LDA TXTPTR+1
  1400        PHA
  1410        JSR AS.FRESTR FREE THE STRING;GET ADR IN
  1420        STX TXTPTR   Y,X AND LEN IN A
  1430        STX DEST    SAVE BEGINNING OF STRING
  1440        STY TXTPTR+1
  1450        STY DEST+1
  1460        TAY          LENGTH TO Y
  1470        STA TEMP2    SAVE LENGTH
  1480        LDA (TXTPTR),Y
  1490        PHA          SAVE CHAR AT END OF STRING
  1500        LDA #0
  1510        STA (TXTPTR),Y  PUT 0 AT END OF STRING
  1520        JSR FIN      GET THE NUMBER
  1530        PLA          GET CHAR
  1540        LDY TEMP2    GET LENGTH
  1550        STA (DEST),Y
  1560        PLA           RESTORE TXTPTR
  1570        STA TXTPTR+1
  1580        PLA
  1590        STA TXTPTR
  1600        RTS          VAL IS IN DAC
  1610 *--------------------------------
  1620 *      INT FUNCTION
  1630 *--------------------------------
  1640 DP.INT LDA DAC.EXPONENT
  1650        SEC
  1660        SBC #$40     REMOVE OFFSET
  1670        BPL .1       POSITIVE EXP
  1680 *---ALL FRACTION, MAKE = 0-------
  1690 .0     JMP DP.ZERO
  1700 *---SOME INTEGER, TRUNCATE-------
  1710 .1     BEQ .0       ...ALL FRACTION
  1720        CMP #20      ALL INTEGER?
  1730        BCS .4       ...YES, NONTHING TO LOP
  1740        LSR          DIVIDE BY 2
  1750        TAY          BYTE INDEX
  1760        BCC .3       ...NO NYBBLE TO CLEAR
  1770        LDA DAC.HI,Y ...CLEAR A NYBBLE
  1780        AND #$F0
  1790        STA DAC.HI,Y
  1800 .2     INY          ...NEXT BYTE
  1810        CPY #10      FINISHED?
  1820        BCS .4       ...YES
  1830 .3     LDA #0       CLEAR A BYTE
  1840        STA DAC.HI,Y
  1850        BEQ .2       ...ALWAYS
  1860 .4     RTS
  1870 *--------------------------------
  1880 *      ABS (DAC)
  1890 *--------------------------------
  1900 DP.ABS LDA #0       STORE 0 IN
  1910        STA DAC.SIGN SIGN
  1920        RTS
  1930 *--------------------------------
  1940 *      SGN (DAC)
  1950 *--------------------------------
  1960 DP.SGN LDA DAC.EXPONENT
  1970        BEQ .1       IT IS 0, SO LEAVE IT
  1980        LDA DAC.SIGN
  1990        PHA          SAVE SIGN
  2000        JSR DP.TRUE  PUT 1 IN DAC
  2010        PLA
  2020        STA DAC.SIGN RESTORE SIGN
  2030 .1     RTS
  2040 *--------------------------------
  2050 *      SQR (DAC)
  2060 *      #0072 IN HART, ET AL
  2070 *--------------------------------
  2080 ERR.SQ JMP AS.ILLERR  ILLEGAL QUANTITY
  2090 DP.SQR LDA DAC.EXPONENT
  2100        BEQ .3        SQR(0)=0
  2110        LDA DAC.SIGN
  2120        BMI ERR.SQ   MUST BE POSITIVE
  2130        JSR MOVE.DAC.TEMP3 SAVE X
  2140 *---REDUCE RANGE TO .1 - 1-------
  2150        LDA DAC.EXPONENT
  2160        PHA          SAVE EXPONENT
  2170        LDA #$40     CHANGE RANGE TO .1 THRU .9999...9
  2180        STA DAC.EXPONENT
  2190 *---REDUCE RANGE TO .25 - 1------
  2200        LDA DAC.HI
  2210        CMP #$25     LESS THAN .25?
  2220        PHP          SAVE ANSWER
  2230        BCS .4       ...NO
  2240        LDA #CON.FOUR
  2250        LDY /CON.FOUR
  2260        JSR MOVE.YA.ARG.1
  2270        JSR DMULT
  2280 *---CALC FIRST APPROX.-----------
  2290 .4     JSR MOVE.DAC.TEMP2
  2300        LDA #P.SQR   GET FIRST APPROXIMATION
  2310        LDY /P.SQR   FROM AX^3+BX^2+CX+D
  2320        LDX #P.SQR.N
  2330        JSR POLY.N
  2340 *---ADJUST APPROX FOR FOLDING----
  2350        PLP          WAS X<.25?
  2360        BCS .5       ...NO
  2370        LDA #CON.HALF
  2380        LDY /CON.HALF
  2390        JSR MOVE.YA.ARG.1
  2400        JSR DMULT
  2410 *---COMPUTE SQR EXPONENT---------
  2420 .5     PLA          GET EXPONENT FROM BEGINNING
  2430        SEC
  2440        SBC #$40     REMOVE OFFSET
  2450        ROR          DIVIDE BY TWO (KEEP SIGN)
  2460        EOR #$80
  2470        BCC .1       DON'T MULT BY SQR(10)
  2480 *---ADJUST APPROX FOR ODD EXP----
  2490        PHA          SAVE EXPONENT/2
  2500        LDA #CON.SQR10
  2510        LDY /CON.SQR10
  2520        JSR MOVE.YA.ARG.1
  2530        JSR DMULT
  2540        PLA
  2550 *---INSTALL NEW EXPONENT---------
  2560 .1     CLC
  2570        ADC DAC.EXPONENT
  2580        STA DAC.EXPONENT
  2590 *---THREE NEWTON ITERATIONS------
  2600        LDA #3
  2610        STA TEMP3
  2620 .2     JSR MOVE.DAC.TEMP2     TEMP2 = Y
  2630        JSR MOVE.TEMP3.ARG     GET X
  2640        JSR DDIV               X/Y
  2650        JSR MOVE.TEMP2.ARG
  2660        JSR DADD               X/Y+Y
  2670        LDA #CON.HALF
  2680        LDY /CON.HALF
  2690        JSR MOVE.YA.ARG.1
  2700        JSR DMULT              (X/Y+Y)/2
  2710        DEC TEMP3              ANY MORE?
  2720        BNE .2                 ...YES
  2730 .3     RTS                    ...DONE
  2740 *--------------------------------
  2750 P.SQR.N  .EQ 3
  2760 P.SQR      .HS 4028736982400000000000
  2770            .HS C082588889100000000000
  2780            .HS 4113225638600000000000
  2790            .HS 4021701867200000000000
  2800 CON.SQR10  .HS 4131622776601683793320
  2810 CON.HALF   .HS 4050000000000000000000
  2820 CON.FOUR   .HS 4140000000000000000000
  2830 *--------------------------------
  2840 *      POLYNOMIAL EVALUATOR ROUTINES
  2850 *      (Y,A) = ADDRESS OF COEFFICIENT TABLE
  2860 *      ARRANGED HIGHEST POWER TO LOWEST
  2870 *      CONSTANTS DO USE GUARD BYTE (11 TOTAL)
  2880 *--------------------------------
  2890 *   DO A POLYNOMIAL WITH 1ST CONSTANT 1
  2900 *      (TEMP2) IS X-VALUE
  2910 *      (X-REG) IS N
  2920 *           WHERE N = POWER OF X
  2930 *           FOR EXAMPLE, IF N=2 : X^2+AX+B
  2940 *                           N=4 : X^4+AX^3+BX^2+CX+D
  2950 *--------------------------------
  2960 POLY.1
  2970        STA P1
  2980        STY P1+1
  2990        STX TEMP3
  3000        JSR MOVE.TEMP2.DAC
  3010 POLY   LDA P1
  3020        LDY P1+1
  3030        JSR MOVE.YA.ARG.1
  3040        JSR DADD
  3050        DEC TEMP3    FINISHED YET?
  3060        BNE POLY2    ...NO
  3070        RTS          ...YES
  3080 *--------------------------------
  3090 *      DO A POLYNOMIAL WITH 1ST CONSTANT <> 1
  3100 *      (TEMP2) IS X-VALUE
  3110 *      (X-REG) IS N
  3120 *           WHERE N = POWER OF X
  3130 *           FOR EXAMPLE, IF N=2 : AX^2+BX+C
  3140 *                           N=3 : AX^3+BX^2+CX+D
  3150 *--------------------------------
  3160 POLY.N
  3170        STA P1
  3180        STY P1+1
  3190        STX TEMP3
  3200        JSR MOVE.YA.DAC.1
  3210 POLY2  JSR MOVE.TEMP2.ARG
  3220        JSR DMULT
  3230        CLC
  3240        LDA P1
  3250        ADC #11      NUMBER OF BYTES
  3260        STA P1
  3270        BCC POLY
  3280        INC P1+1
  3290        BNE POLY     ...ALWAYS
  3300 *--------------------------------

An Even Trickier Index to Mask Charles Putney
Dublin, Eire

I got AAL today (September 1984 issue), and pored through it as usual. The index article on page 18 caught my eye. Naturally I tried to think of a smaller way of coding the routine like your TRICKIER.WAY of 32 bytes. Here it is, in only 23 bytes!

     1000 *--------------------------------
     1010 *      PUTNEY'S WAY
     1020 *--------------------------------
     1030 PUTNEY.WAY
     1040        AND #7       .....421
     1050        LSR          ......42, 1 IN CARRY
     1060        PHA          SAVE FOR LATER PLP
     1070        LDA #1       INITIAL MASK VALUE
     1080        BCC .1       NO NEED TO SHIFT 1
     1090        ASL
     1100 .1     PLP          GET 1.....42 AS NV.BDIZC
     1110        BCC .2       NO NEED TO SHIFT 2
     1120        PHP
     1130        ASL
     1140        ASL
     1150        PLP
     1160 .2     BNE .3       NO NEED TO SHIFT 4
     1170        ASL
     1180        ASL
     1190        ASL
     1200        ASL
     1210 .3     RTS

The timing, not including a JSR to it nor the RTS at the end, varies from a best case of 21 cycles to a worst case of 39 cycles.

[One note of warning: the PLP pulls a status of 000000xx, setting the I-status to zero. This enables IRQ interrupts, which might be very dangerous if you have an interrupting source connected and were otherwise unprepared.]


Correction to DP18, Part 5 Paul Schlyter

The following comments relate to the listing on page 13 of the September 1984 issue.

It appears to me that lines 4610-4620 and 4650-4660 can be deleted. They check for the non-tokenized forms of + and -, which I believe will never be presented to DP18.

There is a definite bug at line 4460: the LDA #$02 should be LDA #$04. Compare with lines 4370 and 4410, and you will see how I caught it. Also the comment on line 4170, which says the bit map is in the form 00000<=>.


Another Tricky Way Bruce Love
Hamilton, New Zealand

Here is my effort to improve your version of turning an index into a mask. It uses (shudder!) self-modifying code, but it is shorter and faster and I think easy to understand.

LOVE.VERSION
       AND #7
       EOR #7
       STA .1+1
       LDA #1
.1     BNE .1  (OFFSET FILLED IN)
       ASL
       ASL
       ASL
       ASL
       ASL
       ASL
       ASL
       RTS

And still another David Eisler
Littleton, Colorado

With reference to Turn Index into a Mask (AAL Sept 84), here is another tricky alternative. It uses only the A-register, is only 16 bytes long, and takes 9 to 23 cycles.

EISLER.VERSION
       AND #7
       STA .1+1
       LDA #$80
.1     BNE .1  (OFFSET FILLED IN)
       LSR
       LSR
       LSR
       LSR
       LSR
       LSR
       LSR
       RTS

The 65802 is Here! Bob Sander-Cederlof

I think it was last December that I learned of the new 16-bit versions of our old friend, the 6502. You will remember my enthusiastic description in the Jan 84 issue. People at Western Design Center were optimistic about shipping chips in a month or so. Very optimistic. Way too optimistic. Nevertheless, they followed the tradition of our whole industry by continuing to stick by their commitment. Every time we called, it was always in a month or so!

But yesterday (Oct 12th) it arrived. Nice shiny new COD sticker on top, for $98.05, and nice new 40-legged bug inside. I plugged the 65802 into my //e, after carefully removing the 65C02 I had just put in a week before. Power on, the drive whirrs, RESET works, hurray!

So far I have spent about six hours exploring the new opcodes. I used the new but yet unreleased version 2.0 of the S-C Macro Assembler, naturally. The literature available up till now has been very sketchy on the details of some of the new opcodes and addressing modes. Anyway, no matter how well the printed word is used, the chip itself will always have the final say, the last word.

Which reminds me that I have already had to correct one mis-understanding (bug?). I was not computing the relative offsets for the 16-bit relative address mode. There are two opcodes which use this mode: BRL, Branch Relative Long; and PER, Push Effective address Relative.

BRL can branch anywhere within a 64K memory, using an offset of 16-bits. Compare this with the other relative branches, which use only an 8-bit offset and can only branch inside a 256-byte space centered around the instruction. BRL's offset ranges from -32768 to +32767.

PER pushes two bytes onto the stack. The two bytes pushed are the high byte and then the low byte of the address calculated by adding the 16-bit offset to the current PC-register. For example,

       0800- 62 FD FF    PER $0800
       0803-

pushes first $08 and then $00 onto the stack. Voila! Now we really can write position independent code! Using the 16-bit mode, I can PER the address of a data item or table onto the stack, and then PLX (Pull to X-register) that address, and access data by LDA 0,X or the like.

Another favorite pair are the two block move instructions: MVN and MVP. With these I can move any block of memory from 1 byte up to 64K bytes from anywhere to anywhere. With the 65802, anywhere is still limited to the 64K address space, but with the 65816 it can be anywhere in 16 megabytes.

To get full advantage of MVP and MVN, you need to be in the 16-bit mode. You get there in two steps: first you turn on the 65802 mode, as opposed to the 6502-emulation mode; and then you set some status bits which select 16-bit memory references and 16-bit indexing.

You turn on the 65802 mode by clearing the new E-bit in the status register. The E-bit hides behind the Carry bit, and you access it with the XCE (Exchange C and E) instruction.

       CLC
       XCE     turns on 65802 mode

       SEC
       XCE     turns on 6502 emulation mode

Then REP #$30 turns on the 16-bit mode. REP stands for Reset P-bits. Wherever there are one bits in the immediate value, the corresponding status bits will be cleared. Where there are zero bits in the immediate value, the corresponding status bits will be unaffected. The two bits cleared by REP #$30 are the M- and X-bits. If either of these, or both, are zero, the immediate mode of LDA, LDX, LDY, CMP, ADC, SBC, AND, ORA, and EOR become three byte instructions. For example,

       LDA ##$1234

loads $1234 into the extended 16-bit A-register. The long A-reg gets a new name or two. The high byte is called the B-register, the low byte is still the A-register, and the pair together are called the C-register.

Okay. Now back to the block movers. Both of the moves require some setting up first. You put the 16-bit address of the source block into the X-register, the destination address in Y, and the move count in C. For example, suppose I want to move the block $0800-$0847 up to $0912:

       LDX ##$0800     source
       LDY ##$0912     destination
       LDA ##$0047     # bytes - 1
       MVN 0,0         move it

As each byte is moved, X and Y are incremented and A is decremented. After all is complete, A will have $FFFF, X=$0848, and Y=$095A.

MVP, on the other hand, decrements the A-, X- and Y-registers for each byte moved. If the block source and destination overlap, you can use the one which moves in the order that prevents mis-copying.

Those two zeroes after the MVN instruction above are two 8-bit values. In the 65802 they don't mean anything, but in the 65816 they are the high 8-bits of the 24-bit addresses of source and destination. In the 65816, you could copy one entire 64K bank to another with just four instructions! And it only takes 3 cycles per byte moved!

The 65802 plugs directly into the 6502 socket in your Apple //e. It may or may not work in older Apples ... I haven't tried it yet. The 65816 will not plug into any current Apple II, even though it also has forty pins. The extra 8-bits of address are multiplexed on the 8 data lines, and the meaning of the other pins is somewhat changed.

Please don't get the idea that plugging in this new chip will speed up your old software. Old software will stay in the 6502 emulation mode, and will run at exactly the same pace as before. New software can be written which will take advantage of the new features, and it can be a little faster, more compact, and so on. The exciting future of the 65802 and 65816 lies not inside old Apples, but in the Apples yet to be born. I am dreaming of a 4-megahertz, 1- to 8-megabyte Apple ...

Meanwhile, here is a REAL example. Way back in the January 1981 issue of Apple Assembly Line I published a General Move Subroutine. It was set up as a control-Y command for the monitor. As an improvement over the monitor M-command, it could move blocks which overlapped either up or down in memory without repeating the leading bytes.

The following program takes advantage of the MVN and MVP commands to greatly speed up and shrink my previous effort. The old one took 149 bytes, the new one only 80. Disregarding all the setup time, which also improved, the time to move a single byte changed from a minimum of 16 cycles to a consistent 3 cycles.

Lines through 1090 describe how to set up and run the program, but don't even TRY it until you get a 65802 chip into your Apple! The new opcodes will do amazing things in an old 6502 chip, but nothing at all like intended.

Line 1100, the .OP 65816 directive, tells version 2.0 that it should allow and assemble the full 65816 instruction set.

Lines 1180-1250 are executed if you use $300G after assembling, or if you BRUN it from a type-B file.

A1, A2, and A4 are monitor variables which are setup by the control-Y command. When you type, for example, 800<900.957^Y (where by ^Y I mean control-Y), $800 is stored in A4, $900 in A1, and $957 in A2.

Lines 1270-1290 save the three registers, and these will be restored later at lines 1500-1520. Lines 1320-1340 get us unto the 16-bit mode described above. Just before returning to the monitor we will switch back to 6502 emulation mode, at lines 1480-1490.

Lines 1360-1390 calculate the #bytes-1 to be moved, by using 16-bit subtraction. Note that the opcodes assembled are exactly the same as they would be for 8-bit operations; the cpu does 16-bit steps here because we set the 16-bit mode.

Lines 1410-1460 determine which direction the block is to be moved: up toward higher memory addresses, or down toward lower addresses. By using two separate routines we prevent garbling the move of an overlapping block.

Lines 1610-1660 move a block down. It is as easy as rolling off a log.... Just load up the registers, and do an MVN command.

Lines 1680-1760 move a block up. Here we need the addresses of the ends of the blocks, so lines 1690-1720 calculate the end address for the destination. Then we do the MVP command, and zzaappp! it's done.

  1000 *SAVE S.GENERAL MOVER
  1010 *--------------------------------
  1020 *   BRUN the program to set it up as
  1030 *      a control-Y monitor command.
  1040 *--------------------------------
  1050 *   Use like the Monitor M-command:
  1060 *      A1 -- Source start address
  1070 *      A2 -- Source end address
  1080 *      A4 -- Destination start address
  1090 *--------------------------------
  1100        .OP 65816
  1110        .OR $300
  1120 *--------------------------------
  1130 A1     .EQ $3C,3D
  1140 A2     .EQ $3E,3F
  1150 A4     .EQ $42,43
  1160 BLKSIZ .EQ $00,01
  1170 *--------------------------------
  1180 CONTROL.Y.SETUP
  1190        LDA #$4C
  1200        STA $3F8
  1210        LDA #GENERAL.MOVER
  1220        STA $3F9
  1230        LDA /GENERAL.MOVER
  1240        STA $3FA
  1250        RTS
  1260 *--------------------------------
  1270 GENERAL.MOVER
  1280        PHA
  1290        PHY
  1300        PHX
  1310 *--------------------------------
  1320        CLC          65816 MODE
  1330        XCE
  1340        REP #$30     16-BIT MODE
  1350 *--------------------------------
  1360        SEC          Compute block length - 1
  1370        LDA A2
  1380        SBC A1
  1390        STA BLKSIZ
  1400 *--------------------------------
  1410        LDA A1
  1420        CMP A4       Determine direction of move
  1430        BCC .1       ...UP
  1440        JSR MOVE.DOWN
  1450        BRA .2       ...ALWAYS
  1460 .1     JSR MOVE.UP
  1470 *--------------------------------
  1480 .2     SEC          RETURN TO 6502 MODE
  1490        XCE
  1500        PLX
  1510        PLY
  1520        PLA
  1530        RTS
  1600 *--------------------------------
  1610 MOVE.DOWN
  1620        LDX A1       Source start address
  1630        LDY A4       Destination start address
  1640        LDA BLKSIZ   # Bytes - 1
  1650        MVN 0,0
  1660        RTS
  1670 *--------------------------------
  1680 MOVE.UP
  1690        CLC
  1700        LDA A4
  1710        ADC BLKSIZ
  1720        TAY          Destination end address
  1730        LDX A2       Source end address
  1740        LDA BLKSIZ   # Bytes - 1
  1750        MVP 0,0
  1760        RTS

Out of Print Bob Sander-Cederlof

After printing the mini-review of Gene Zumchak's Microprocessor Design and Troubleshooting last month, we naturally started receiving orders for the book. I had some on order from Sams, but Lo! It is now out-of-print! I talked with someone inside Sams and they said it will probably remain out-of-print.

I talked with the author directly, and I believe that if necessary he will re-publish the book himself. It is a worthy book, and needs to be available. He wants to update some of the material, too. We'll let you know when we can get it again.

You may have noticed that computer books are now the in thing to publish. I would not be surprised if some publishers began having serious difficulties because of their eagerness to grab this market. They are publishing fluff for the neophytes, forgetting the really useful technical titles. I hope Sams does not forget how it got where it is today.

Meanwhile, as Art Carlson says, If you see a book you need you had better get while it is still available.

On this same subject, let's see if we can put some pressure on Apple to make their reference manuals more readily available. I find that very few (hardly any) Apple dealers will stock or even special order the ProDOS, //e, and //c Reference Manuals. More than twice I have been told that (for example) the //e manual had never been published, even though I bought a copy at a store many moons ago. It seems that Apple will only sell the books in bundles of five or more of the same title, and then only to Apple dealers. Apple dealers seem to not want to order five or more of what are a relatively slow moving item. After all, they are not book stores. And consequently, Apple gets the erroneous impression that they really do not need to publish the manuals, because no one is buying them! If you know anyone in Apple, pass the word to them: WE DO WANT REFERENCE MANUALS. Maybe it does make sense not to ship a copy of every manual with every computer, but some means MUST be available for EVERY owner to buy the manuals he needs.


Corrections to Line Number Cross Reference Bill Morgan

Allen Miller just called up from Hong Kong (at 3:30 AM his time!) to report a problem with the Line Number Cross Reference program in the August issue. It seems that as published it only prints out the first line number list in each chain. The troublemaker is line 4560, which says BNE .1. Well .1 is the next line, so the routine is always exiting after only one pass. Line 4560 should read BNE PRINT.CHAIN, to go back to the beginning rather than on to the end.

Then Chuck Welman called to point out yet another problem. It seems that an undefined line number greater than the last line of the program caused LCR to head off into the wilderness. When I investigated this one it proceeded to get even stranger. LCR would hang only if the undefined line number was greater than 19668! Less than 19668 came out just right, and equal to 19668 worked, but LCR mistakenly said the line was defined. Now here was a real creepy crawler of a bug!

Well the problem turned out to be in the CHECK.DEFINITION routine. Here are the offending lines:

     4790 .4    LDY #0
     4800       LDA (PNTR),Y    lo-byte of next line address
     4810       PHA
     4820       INY
     4830       LDA (PNTR),Y    and hi-byte
     4840       STA PNTR+1
     4850       PLA
     4860       STA PNTR
     4870       JMP CHECK.DEFINITION

This code is called when CHECK.DEFINITION wants to get the next line of the Applesoft program. The trouble comes up because there is no check for end-of-program. Sooner or later we come to the zero bytes that mark the end, load up PNTR with zeroes, and go back to CHECK.DEFINITION to try what seems to be the next line. That routine then compares the line number we are checking to the contents of locations 2 and 3 of memory, which Applesoft has loaded with D4 and 4C. Now $4CD4 equals 19668, so that's where that funny number came from!

Here is a slightly rearranged, working version of lines 4790-4870. Note that we have reversed the hi-lo byte sequence and added a check for a zero hi-byte:

     4790 .4    LDY #1
     4800       LDA (PNTR),Y    hi-byte of next line address
     4805       BEQ .2          end of program?
     4810       PHA
     4820       DEY
     4830       LDA (PNTR),Y    and lo-byte
     4840       STA PNTR
     4850       PLA
     4860       STA PNTR+1
     4870       JMP CHECK.DEFINITION

Index to Articles in Apple Assembly Line, Volume 4

AAAA
Applesoft
  Fast Garbage Collection..........................Paul Shetler... 3/84/2-12
  Faster Amper-Routine to Zero Arrays..........Johan Zwiekhorst... 9/84/16-17
  Generalized GOTO and GOSUB............................Bob S-C...12/83/15-17
  Random Numbers for Applesoft..........................Bob S-C... 5/84/2-13
  More Random Number Generators.........................Bob S-C... 6/84/15-18

BBBB Benchmarks Rod's Color Pattern in 6502 Code............Charles H. Putney... 3/84/21-26 Sieve Benchmark on the 68000...............Peter J. McInerney... 7/84/16-17 Updating the 6502 Prime Sifter........................Bob S-C... 7/84/18-19 Book Reviews Annotated 68000 Bibliography......................Bill Morgan... 2/84/19 Assembly Cookbook for the Apple II/IIe................Bob S-C... 9/84/28,30 Beneath Apple ProDOS..................................Bob S-C... 9/84/28,31 Bibliography on Apple Hi-Res Graphics.................Bob S-C... 9/84/23-27 The Computer Hacker and Dataphile Digest....................11/83/24 Demise of Dataphile Digest..................................12/83/1 Don Lancaster's Micro Cookbook, Volume 2........Bill Morgan... 1/84/9 Don Lancaster Strikes Again (another new book).................. 7/84/1 Microcomputer Design & Troubleshooting................Bob S-C... 9/84/30 Understanding the Apple II, by Jim Sather.............Bob S-C... 1/84/25-26

CCCC Corrections Corrections to Generic Screen Dump...............Steve Knouse...10/83/12 Corrections to the Intellec Hex Converter.............Bob S-C... 5/84/1 Cross Assemblers Changing Tab Stops in the 68000 Cross Assembler.......Bob S-C... 3/84/15 Converting to Intellec Hex Format.....................Bob S-C... 4/84/14-18 Corrections to the Intellec Hex Converter...........Bob S-C... 5/84/1 Converting to Motorola S-Format.......................Bob S-C... 6/84/22-27 Hitachi 6301 Cross Assembler (announcement)...........Bob S-C...11/83/21 New Cross Assemblers: Z-8, GI-1650, GI-1670.................... 8/84/1 Zilog Z-8 Cross Assembler....................................... 4/84/1 Cyclic Redundancy Check Subroutine......................Bob S-C... 4/84/2-10 Finding the Erroneous Bit Using CRC................Bruce Love... 6/84/20-21

DDDD Disassemblers Building Label Tables for DISASM......................Bob S-C... 7/84/12-13 Using EXEC Files with Rak-Ware's DISASM............Bob Kovacs... 4/84/26-28 Disk Drive Pressure Pads................................Bob S-C... 3/84/20 DOS Enhancements and Patches Changing VERIFY to DISPLAY............................Bob S-C... 3/84/13-14 DOS Checksummer Debate Update.........................Bob S-C... 2/84/10 DOSology and DOSonomy.................................Bob S-C... 6/84/9 Feedback on our DOSonomy...................................... 7/84/1 Faster Booting for Screenwriter II.................Bob Leedom...10/83/14 Killing the EXEC..................................Bob Bragner...11/83/22 Modify DOS for Big BSAVEs.............................Bob S-C... 8/84/28 DOS Enhancements and Patches, contd. Patches to Avoid Interrupt Trouble......... .......Bruce Field, Bob S-C, and Bill Morgan... 1/84/10-11 Peeking at the CATALOG................................Bob S-C... 2/84/6 Quick DOS Updating vs. MASTER.CREATE..................Bob S-C... 4/84/19-23 Using EXEC Files with Rak-Ware's DISASM............Bob Kovacs... 4/84/26-28 Double Precision Arithmetic Package DPFP Now Includes Source Code................................... 4/84/1 Decimal 18-Digit Floating Point Arithmetic Package....Bob S-C... Part 1, Addition and Subtraction.............................. 5/84/20-25 Part 2, Over/Underflow, Load/Store, Multiplication, Rounding.. 6/84/2-8 Part 3, Division and Input Conversion......................... 7/84/2-11 Part 4, Output Conversion..................................... 8/84/2-11 Part 5, Applesoft Linkage and Expression Parsing.............. 9/84/2-15 Speed vs. Space, Faster Multiplication........................ 7/84/26-28

EEEE Enhancements and Patches to S-C Macro Assembler Changing Tab Stops in the 68000 Cross Assembler.......Bob S-C... 3/84/15 EXTRA DEFINITION ERROR, Avoiding..................Bill Morgan...10/83/17 Large Assembly Listing into Text File.......Robert F. O'Brien...10/83/16 Lower Case Titles in Version 1.1................Bob Matzinger...10/83/17 Lower Case Titles Revisited.....................Bob Matzinger...11/83/28 More on Assembly Listing into Text File.......Tracy L. Shafer...12/83/12-14 Procedure for Converting S-C Source Files to Text Files without Owning an S-C Assembler..........Bob S-C...12/83/26-28 S-C Macro and GPLE.LC on the //e..................Bob Bragner... 3/84/16 Suppressing Unwanted Object Bytes in Listings...David Roberts...10/83/19 Using the PRT Command in S-C Macro................Bill Morgan... 6/84/12-14 EPROMs Burning and Erasing EPROMs............................Bob S-C... 4/84/23-24 Converting to Intellec Hex Format.....................Bob S-C... 4/84/14-18 Corrections to Intellec Hex Converter...............Bob S-C... 5/84/1 Converting to Motorola S-Format.......................Bob S-C... 6/84/22-27

GGGG Graphics Bibliography on Apple Hi-Res Graphics.................Bob S-C... 9/84/23-27 If You Like Shapes, Try Shapemaker....................Bob S-C...10/83/24 Macro Generates Quotient/Remainder Table for Hi-Res...Bob S-C... 2/84/28 Rod's Color Pattern in 6502 Code............Charles H. Putney... 3/84/21-26

HHHH Hardware Troubleshooting About Disk Drive Pressure Pads........................Bob S-C... 3/84/20 Finding Trouble in a Big RAM Card.....................Bob S-C...12/83/21-24 Making a 65C02 Work in My Apple II Plus........William O'Ryan... 6/84/28 Quick Memory Testing..................................Bob S-C... 7/84/14 Review of Microcomputer Design & Troubleshooting.....Bob S-C... 9/84/28-31 Speaking of Slow Chips..............................Bob Stout... 8/84/27 Hardware Reviews Amazing quikLoader Card.............................Bob S-C... 2/84/27 An Apple Mouse, and other news.................................. 1/84/1 Apple //c.............................................Bob S-C... 5/84/14-16 Our //c came in and we love it; however.............Bob S-C... 7/84/24 Burning and Erasing EPROMs............................Bob S-C... 4/84/23-24 Hardware Reviews, contd. More Clocks for Apple.................................Bob S-C... 4/84/10 More on the New 65802 and 65816.......................Bob S-C... 1/84/14-20 Non-volatile RAM Chip (mention)..................Rodney Jacks...11/83/1 Qwerty 68000 Training/Development System..............Bob S-C...11/83/16-17 So That's a Macintosh!............................Bill Morgan... 2/84/11 Timemaster II from Applied Engineering................Bob S-C...12/83/19-20

IIII Interrupts DOS Patches to Avoid Interrupt Trouble..... .......Bruce Field, Bob S-C, and Bill Morgan... 1/84/10-11 Enable/Disable IRQ from Applesoft.....................Bob S-C... 8/84/13-14 Profiler: Using 60Hz IRQ's to Profile a Program...Bill Morgan... 1/84/2-9

LLLL Language Card Finding Trouble in a Big RAM Card.....................Bob S-C...12/83/21-24 Fixing the Andromeda 16K RAM Card.................Bob Bernard... 6/84/19 Table of //e Soft Switches............................Bob S-C... 2/84/20-21 Line Number Cross Reference for Applesoft...........Bill Morgan... 8/84/15-26 Listing into Text File, Large Assembly........Robert F. O'Brien...10/83/16 More on Assembly Listing intor Text Files.....Tracy L. Shafer...12/83/12-14 Lower Case Titles in Version 1.1...........................Bob Matzinger...10/83/17 Titles Revisited................................Bob Matzinger...11/83/28

MMMM Macros Building Label Tables for DISASM......................Bob S-C... 7/84/12-13 Counting Lines Produced by Macro Expansion........Bill Morgan...10/83/21 Macro-calculated Spiral Screen Clear............Bruce V. Love...10/83/20 Macro Generates Quotient/Remainder Table for Hi-Res...Bob S-C... 2/84/28 Sorting and Swapping..................................Bob S-C... 7/84/20-23 Memory Testing Finding Trouble in a Big RAM Card.....................Bob S-C...12/83/21-24 Quick Memory Testing..................................Bob S-C... 7/84/14 Monitor Enhancements Booting ProDOS with a Modified Monitor ROM......Jan Eugenides... 6/84/18 Compilation of Monitor Modifications.............Steve Knouse...10/83/2-9 Fast Scroll for the //e 80-column.....................Bob S-C... 2/84/8-10 Apple //e ROM Revision................................Bob S-C... 5/84/18-19 Monitor Information Erv Edge's Source of //e CxROM on Disk.......................... 2/84/1 Delays, delays, delays (especially $FCA8).............Bob S-C... 2/84/14-18

PPPP Patches and Modifications to Other Software Booting ProDOS with a Modified Monitor ROM......Jan Eugenides... 6/84/18 Faster Booting for Screenwriter II.................Bob Leedom...10/83/14 More on ProDOS and Non-Standard Apples.......................... 6/84/1 S-C Macro and GPLE.LC on the //e..................Bob Bragner... 3/84/16 Speaking of Locksmith 5.0...................Warren R. Johnson... 3/84/19 Using EXEC Files with Rak-Ware's DISASM............Bob Kovacs... 4/84/26-28 Will ProDOS Work on a Franklin?.....................Bob Stout... 3/84/20 Prime Number Sieve Benchmark Sieve Benchmark on the 68000...............Peter J. McInerney... 7/84/16-17 Updating the 6502 Prime Sifter........................Bob S-C... 7/84/18-19 Printer Interfaces Using the PRT Command in S-C Macro................Bill Morgan... 6/84/12-14 ProDOS Booting ProDOS with a Modified Monitor ROM......Jan Eugenides... 6/84/18 Clock Drivers and ProDOS..............................Bob S-C...11/83/25-28 Commented Listings $F800-F90B, $F996-FEBD..............................Bob S-C...11/83/2-14 $F142-F1BE..........................................Bob S-C...11/83/25-28 $F90C-F995, $FD00-FE9A, $FEBE-FFFF..................Bob S-C...12/83/2-11 More on ProDOS and Non-Standard Apples.......................... 6/84/1 Review of Beneath Apple ProDOS......................Bob S-C... 9/84/28-31 Will ProDOS Really Fly?...............................Bob S-C... 3/84/28 Will ProDOS Work on a Franklin?.....................Bob Stout... 3/84/20 Profiler: Using 60Hz IRQ's to Profile a Program.....Bill Morgan... 1/84/2-9

RRRR Random Number Generators Random Numbers for Applesoft..........................Bob S-C... 5/84/2-13 More Random Number Generators.........................Bob S-C... 6/84/15-18 Reviews, see Book Reviews, Hardware Reviews, Software Reviews

SSSS S-C Macro Assembler Enhancements and Patches........ .........see Enhancements and Patches to S-C Macro Assembler S-C Software Corporation Clarification about our Copyrights....................Bob S-C... 2/84/8 I Think It Was a Bad Dream (Suits, Suits, Suits)......Bob S-C... 1/84/12-14 New Cross Assemblers: Z-8, GI-1650, GI-1670.................... 8/84/1 New Products: Z-8 Cross Asm, DPFP, and Macro 1.1 Source......... 4/84/1,28 Orphans and Widows, Updating the S-C Word Processor...Bob S-C... 7/84/25 Price Changes.........................................Bob S-C...10/83/13 Where To? (68000? C?)............................Bill Morgan...10/83/19 Where To? Revisited...............................Bill Morgan...12/83/28 Screen Dump, Corrections to Generic................Steve Knouse...10/83/12 Screenwriter II, Faster Booting for..................Bob Leedom...10/83/14 Software Reviews Aztec C Compiler for Apple DOS....................Bill Morgan...11/83/18-20 Note on Aztec C.................................Bill Morgan...12/83/14 Barkovitch Utilities............................................ 6/84/21 Lancaster's OBJ.APWRT][F..............................Bob S-C... 3/84/19 Locksmith 5.0.........................................Bob S-C... 1/84/26 Speaking of Locksmith 5.0.................Warren R. Johnson... 3/84/19 OBJ.APWRT][F Updated to AW//e Toolkit...........Don Lancaster... 6/84/10 Shapemaker If You Like Shapes, Try Shapemaker..................Bob S-C...10/83/24 Shapemaker Enhancements......................Frank Belanger...11/83/24 Source Code On Disk DPFP (Double Precision for Applesoft)........................... 4/84/1 Erv Edge's Source for //e CxROM................................. 2/84/1 S-C Macro Assembler Version 1.1 Source Code..................... 4/84/1,28 Spiral Screen Clear, Macro-Calculated.............Bruce V. Love...10/83/20

TTTT Techniques Cyclic Redundancy Check Subroutine....................Bob S-C... 4/84/2-10 Finding the Erroneous Bit Using CRC..............Bruce Love... 6/84/20-21 Delays, delays, delays (especially $FCA8).............Bob S-C... 2/84/14-18 Enable/Disable IRQ from Applesoft.....................Bob S-C... 8/84/13-14 Fast Scroll for the //e 80-column.....................Bob S-C... 2/84/8-10 Listing Buried Messages...............................Bob S-C... 2/84/2-5 Making a Map of Differences...........................Bob S-C... 5/84/27-28 Peeking at the CATALOG................................Bob S-C... 2/84/6 Put Your Messages on the Screen...............William R. Reed... 9/84/22 Redundancy in Tables for Faster Lookups...............Bob S-C... 3/84/17-18 Text Area Erase Routine..........................Jeff Creamer... 2/84/22-25 Turn an Index into a Mask.............................Bob S-C... 9/84/18-21 Sorting and Swapping..................................Bob S-C... 7/84/20-23 Speed vs. Space, faster DP18 Multiplication...........Bob S-C... 7/84/26-28 Tips and Hints Reminder about Wrap-Around Addressing.............Bill Parker... 2/84/12 Table of //e Soft Switches............................Bob S-C... 2/84/20-21 What That Code Did....................John Broderick, Bob S-C... 5/84/26

UUUU Utility Programs Corrections to Generic Screen Dump...............Steve Knouse...10-83/12 Converting S-C Source Files to Text Files without Owning an S-C Assembler..................Bob S-C...12/83/26-28 Line Number Cross Reference for Applesoft.........Bill Morgan... 8/84/15-26 PROFILER: Using 60Hz IRQ's to Profile a Program...Bill Morgan... 1/84/2-9 Still More Tinkering with VCR......................Louis Pitz...10/83/11

VVVV VCR, Still More Tinkering with.......................Louis Pitz...10/83/11

WWWW Wagner, Roger, Some Interesting News.............................. 5/84/17 Wozniak, Steve On-Line with Steve Wozniak...................................... 1/84/27-28 Evening with Woz..................................Bill Morgan... 4/84/11-12

6502 65802, 65816 More on the New 65802 and 65816.......................Bob S-C... 1/84/14-20 65C02 Making a 65C02 Work in My Apple II Plus........William O'Ryan... 6/84/28 Will Rockwell's 65C02 Work in an Old Apple?.........Bob Stout... 3/84/16 65C02 vs. the Older Apples............................Bob S-C... 5/84/19 68000 Annotated 68000 Bibliography......................Bill Morgan... 2/84/19 Qwerty 68000 Training/Development System (review).....Bob S-C...11/83/16-17 68000 Color Pattern...............................Bob Urschel... 1/84/21-24 Changing Tab Stops in the 68000 Cross Assembler.......Bob S-C... 3/84/15 Sieve Benchmark on the 68000...............Peter J. McInerney... 7/84/16-17


Macintosh Assemblers Lane Hauck
San Diego, CA

I have the privilege* of Beta testing two 68000 assemblers for the Macintosh -- the one from Apple (Workshop), and the one from Mainstay. Mainstay is the serious side of Funsoft.

* (If you are masochistic, and enjoy little surprises like alert boxes with no messages or GoAwayButtons in them, frequent crashes, and system fonts abruptly changing; you too might want to become a Beta Tester.)

I've gotten permission from both Apple and Mainstay to talk about these products. The versions I'm testing are preliminary, and therefore subject to change.

The Workshop is in version 0.6 release, and is expected to be available about October (I'd guess November). The Mainstay product is scheduled for early October release, and judging from their staff and working hours, I think they'll make it. (I visited them in Agoura, CA, and found a very smart and hard working group of programmers.)

Although both assemblers do the same thing -- translate 68000 source programs into runnable programs on the Macintosh -- they couldn't be more different in how they operate!

The Apple Assembler

The Workshop has several parts. EDIT, ASM, LINK and EXEC are four applications that do the actual code development. Additionally, RMAKER creates resource files from text source files created by EDIT. And finally, MacDB and its associated Nub programs provide debug support for when your code doesn't run.

The development system can run on one drive, but two are highly recommended.

EDIT: This is a DISK BASED editor, so the short document frustrations of MacWrite are avoided. Additionally, you can open up to four documents, and cut and paste between them (a la Lisa)! This is a bare bones (but wonderful) editor, without fancy fonts or formatting. One improvement over the Lisa editor: it has a reverse tab -- hitting backspace from a tab stop takes you back not one space, but back one tab position. This is a great convenience when you're entering formatted source code.

ASM: Supports conditional assembly, macros (both Lisa-type and new Mac-type). It's tailored to the Mac development environment (for example it helps you write relocatable code).

Toolbox support is provided by special, compressed equate files (they are compressed by a program called PacSyms, which you can use to compress your own equate files). The Workshop provides all the Trap and symbol equates mentioned in Inside Macintosh.

LINK: Links .REL code modules produced by the Assembler, and (eventually -- not working yet) output files from RMAKER to produce a final file, complete with your code and resources. Takes its direction from a .LINK text file.

EXEC: Lets you automate the entire ASM-LINK process. One great improvement over the Lisa version: you can direct EXEC to reenter the editor if any assembly or link errors occur.

FIVE debuggers are supplied. MacDB is the best, most visible debugger I'ver ever seen. It requires two Macs (or one Mac and a Lisa running MacWorks). The Workshop will be supplied with an interconnect cable for two Macs. Other debugger versions (which don't require the second Mac) let you debug from an 8-line onscreen window on the Mac, and from any remote terminal.

This is a professional, complete, industrial strength 68000 assembly language development package. Its utilization of the Macintosh environment is total and outstanding. My only real quibble is that it takes a fair amount of time (a few minutes) to turn one cycle from EDIT to running the new code. A hard disk would presumably improve this greatly.

If you're an interactive programmer who likes to make changes and see their results QUICKLY, you might be interested in the Mainstay Assembler.

The Mainstay Assembler

If you've ever used any of the assemblers for the Apple II from S-C Software, you'll feel right at home with the Mainstay environment. It's patterned after the S-C 68000 Cross Assembler, and it looks and feels just like you're running on an Apple //e!

The fact that none of the Macintosh interface is used will bother some, especially the Mac purists. Mainstay's intention is to get a quality assembler to market quickly, and the approach they've taken allows this to happen. I don't mind non-fidelity to the Mac interface in a DEVELOPMENT product -- we developers are EXPECTED to put up with all sorts of indignities!

This is an absolute assembler, meaning that your code module is produced with an address origin, and it is loaded and run at that address. It does not produce linkable code modules, as does the Apple Workshop Assembler. In fact no linker is supplied or required.

The Editor is built in, and it functions much like the Apple II. The cursor is moved around with keyboard commands. The Editor has BASIC-like line numbers and the normal complement of line-number oriented commands (RENumber, COPY, MOVE, etc.).

Resources are handled right inside your source code (remember there is only one code module). This is more convenient than the Apple RMAKER approach.

The Assembler supports conditional assembly, macros, and local labels. It takes a novel approach in how it is installed and run on the Macintosh.

When you start the Assembler, it grabs a large chunk of memory from the application heap, and uses it for storing the symbol table, source code, and object code. Typing MEM shows you exactly where these three memory areas are. While you're in the Assembler environment, your code stays put, so you can deal with absolute addresses without fear that the memory manager will move things around on you.

This means that you can edit, assemble, and test your code IMMEDIATELY, without goin through a linking and (optionally) a resource compiling step. This is the primary strength of this assembler -- it allows quicklook programming which is ideal for experimentation and learning the Macintosh system.

Eventually you will want to make your application an installable Macintosh program, so you should get into the habit of writing position independent code. The Mainstay package will supply the tools necessary to make your application runnable on the Mac. It will also contain Toolbox and Operating System equate files.

There are some nice Apple II-like features, such as typing DIR to look at the disk catalog. In the Mac environment, you have to exit the application and get back to the desktop to see your files. You can also type EJECT and eject a disk immediately. I like to do this just before running new code, to protect disks from my runaway test programs that mysteriously fire up the disk drive.

Having this assembler, a Mac, and a copy of INSIDE MACINTOSH might just be the most efficient way to learn the Macintosh. The prime benefit of this assembler is its very high speed in moving between editing, assembling, and running your test code.

Which One?

Which assembler would I recommend? At this stage I'd have to give the universal Computer Salesman answer: It depends.

The Apple one allows you to write separate code modules, assemble them, and then link them together later. This allows you to utilize already written and debugged modules in new programs.

Another advantage of the linker approach is that a single module can be changed and reassembled, and then linked to other already-debugged modules. This saves reassembling the whole shebang every time you make a change.

If you like this relocatable assembler approach, you'll want the Apple Assembler. (If you're comfortable with the Lisa Assembler, ditto.)

The Mainstay Assembler, by contrast, is an absolute assembler - it puts code at a particular place in memory (set by an ORG - origin statement), and allows only one module -- your entire program. (Better write relocatable code if you want it to run as an application, though!)

The Mainstay Assembler is so fast (especially if you put a LIST OFF directive at the beginning of your code), that it negates the speed advantage of the linked module approach. I would guess that it takes you from source code edit to running reassembled code in about one-twentieth the time required by the Apple Assembler. if you're an interactive programmer who likes to see results of program changes FAST, the Mainstay Assembler is for you.

If time is a factor, the Mainstay product will ship within a week; the Apple Assembler is supposed to come out in October, but I doubt it.

If you're unhappy with non-Mac-user-interface products, you're better off with the Apple version. The operation of the Mainstay assembler is a bit strange at first, but anyone with Apple II roots will adjust quickly.

Here's a factor I consider very important: Apple is a Pascal house with almost no support given to assembly language programming of the Macintosh. I've found their support in this area dismal.

The Mainstay Assembler is a major committment by this small company. I've had quite a bit of technical interaction with them, and have found them to be very intelligent, motivated, and responsive. I've had indications that you'll be able to expect not only Assembler support from Mainstay, but also some Macintosh support as well.

--------

[ 10/15 -- The folks at Mainstay tell me they started shipping last week, so we should have some copies for sale by the time you read this. The introductory price is $100. -- Bill ].


Apple Assembly Line is published monthly by S-C SOFTWARE CORPORATION, P.O. Box 280300, Dallas, Texas 75228. Phone (214) 324-2050. Subscription rate is $18 per year in the USA, sent Bulk Mail; add $3 for First Class postage in USA, Canada, and Mexico; add $12 postage for other countries. Back issues are available for $1.80 each (other countries add $1 per back issue for postage).

All material herein is copyrighted by S-C SOFTWARE, all rights reserved. Unless otherwise indicated, all material herein is authored by Bob Sander-Cederlof. (Apple is a registered trademark of Apple Computer, Inc.)