Welcome to Scribd, the world's digital library. Read, publish, and share books and documents. See more
Download
Standard view
Full view
of .
Look up keyword
Like this
4Activity
0 of .
Results for:
No results containing your search query
P. 1
AAL8212

AAL8212

Ratings:

5.0

(1)
|Views: 208|Likes:
Published by Moe B. Us

More info:

Published by: Moe B. Us on Apr 03, 2008
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as TXT, PDF, TXT or read online from Scribd
See more
See less

09/27/2012

pdf

text

original

 
Apple Assembly LineVolume 3 -- Issue 3 December, 1982In This Issue...----------------Making Internal JMPs and JSRs Relocatable. . . . . . . . . 2Add Bit-Control to Apple Monitor . . . . . . . . . . . . . 10Assembly Listings on TEXT Files. . . . . . . . . . . . . . 13Add a New Feature to ES-CAPE . . . . . . . . . . . . . . . 14Applesoft Source, Completely Commented . . . . . . . . . . 15New Enhanced 6502 Nearly Here! . . . . . . . . . . . . . . 16Toggling Upper/Lower Case in the S-C Macro Assembler . . . 19Save Garbage by Emptying Arrays. . . . . . . . . . . . . . 22Splitting Strings to Fit Your Display. . . . . . . . . . . 26Enhancing Your Apple II (A Review) . . . . . . . . . . . . 29Clarification on Loading the RAM Card. . . . . . . . . . . 32Quickies . . . . . . . . . . . . . . . . . . 13, 14, 15, & 30Cross Assemblers continue to appear. We now have ready a versionfor the Intel 8048, and one for the yet unreleased Rockwell65C02. More on the latter inside.Don Lancaster, famous author of many books published by HowardSams, says the Apple II is probably going to have a greaterimpact on history than the automobile or television! Perhapsverging on Applolatry, but you will surely enjoy his new book.See Bill's reviews inside.If I am trying to learn how to program in assembly language, orto increase my skill at it, what (besides AAL) should I read? Istrongly recommend Softalk, Nibble, Micro, and Call APPLE. Everymonth they publish excellent examples of assembly languageprograms which you can study, modify, and use. As for books,Roger Wagner's, Lance Leventhal's, and Don Lancaster's are myfavorites at this time.Making Internal JMPs and JSRs Relocatable.........Peter Meyer-------------------------------------------------------------A machine language routine is said to be relocatable if it canfunction properly regardless of its absolute location in memory.If a routine contains a JMP or a JSR to an INTERNAL address thenit is not relocatable; if it is run in another part of memorythen the internal JSR or JMP will still reference the formerregion of memory. JMPs and JSRs to subroutines at absolutelocations (e.g. in the Monitor) do not impair the relocatability
 
of a routine.I will explain here a technique whereby you can, in effect,perform internal JSRs and JMPs without impairing therelocatability of your routine. There is a small price to payfor this: namely, an increase in the length of your routine.Your routine must be preceded by a 2-part Header Routine which is43 bytes long. In addition, each internal JSR requires 8 bytesof code, and each internal JMP requires 11 bytes of code.No tables or other data storage are required, except that threebytes must be reserved for a JMP instruction. These three bytescan be anywhere in memory, but must be at an absolute location.There are three bytes that normally are used only by Applesoft,namely, the ampersand JMP vector at $3F5 to $3F7. Since we arehere concerned only with machine language routines in their ownright, we can use the locations $3F5 to $3F7 for our ownpurposes. However, other locations would do just as well.The technique is fully illustrated in the accompanying assemblylanguage program. This routine consists of three parts:(1) Header Part 1 (SETUP), which sets up a JMP instructionat VECTOR (at $3F5-$3F7, but could be different, asexplained above) to point to Header Part 2.(2) Header Part 2 (HANDLER), which is a 15-byte section ofcode whose task is to handle requests to perform internalJSRs and JMPs (more on this below).(3) The main part of the routine, in which internal JSRs andJMPs (in effect) are performed using macro instructions.When your routine (including the Header) is executed, the firstthing that happens is that Header Part 1 locates itself (usingthe well-known JSR $FF58 technique), then places a JMP HANDLER atVECTOR. Thereafter a JMP VECTOR is equivalent to JMP HANDLER, anda JSR VECTOR is equivalent to a JSR HANDLER. The HANDLER routinehandles requests from your routine for internal JSRs and JMPs.To perform a JSR to an internal subroutine labelled SUBR simplyinclude the following code:HERE LDA #SUBR-HERE-7 low byte of offsetLDY /SUBR-HERE-7 high byte of offsetTSXJSR VECTORAs explained above, the JSR VECTOR is in effect a JSR HANDLER.The Header Part 2 code takes the values in the A and Y registersand adds them to an address which it obtains from the stack toobtain the address of SUBR. It then places this address in INDEX($5E,5F) and executes "JMP (INDEX)".An internal JMP, from one part of your routine to another, isperformed in a similar manner. Suppose you wish to JMP from HEREto THERE. It is done as follows:HERE LDA #THERE-HERE-7 low byte of offset
 
LDY /THERE-HERE-7 high byte of offsetTSXJSR $FF58JMP VECTORSince we are (in effect) performing a JMP, rather than a JSR, wedo a JMP VECTOR rather than a JSR VECTOR. The other differenceis that we have a JSR $FF58 following the TSX.Clearly the sequence of instructions which allows you to performa JMP or a JSR could be coded as a macro. The macros to use areshown in the accompanying program listing. By using macros aninternal JMP or JSR can be performed with a single macroinstruction bearing a very close resemblance to a real JSR or JMPinstruction.The following program, which consists of the Header Routine plusa demonstration routine, can be assembled to disk using the .TFdirective. It can then be BRUN at any address and it willfunction properly. Thus it is relocatable, despite the fact thatthere are (in effect) an internal JMP and two internal JSRsperformed.When performing an internal JSR or JMP using my techniques, it isnot possible to pass values in the registers, since these arerequired to pass information to the HANDLER routine. Nor is itadvisable to try to pass parameters on the stack, even though theHANDLER routine does not change the value of the stack pointer.Better is to deposit values in memory and retrieve them after thetransition has been made.The HANDLER routine passes control to the requested part of yourroutine using a JMP indirect. (INDEX at $5E,5F, has been used inthe accompanying program, but any other address would do as well,provided that it does not cross a page boundary.) This means thatthe section of your routine to which control is passed (whetheror not it is a subroutine) may find its own location byinspecting the contents of the location used for the JMPindirect. This feature of this technique is also illustrated inthe accompanying program, in the PRINT.MESSAGE subroutine.The use of internal data blocks is something not normallypossible in a relocatable routine, but it can be done if thetechniques shown here are used.This method of performing internal JSRs and JMPs in a relocatableroutine may be simplified if the routine is intended to functionas a subroutine appended to an Applesoft program. If thesubroutine is appended using my utility the Routine Machine(available from Southwestern Data Systems), then it is notnecessary to include the 47-byte Header Routine. Internal JMPsand JSRs can still be performed exactly as described above,except that the address of VECTOR must be $3F5-$3F7. Thistechnique is not described in the documentation to the RoutineMachine. A full explanation may be found in the Appendix to thedocumentation accompanying Ampersoft Program Library, Volume 4(also available from Southwestern Data Systems).

Activity (4)

You've already reviewed this. Edit your review.
1 hundred reads
1 thousand reads
pavink liked this
dezlac liked this

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->