Classic Computer Magazine Archive COMPUTE! ISSUE 9 / FEBRUARY 1981 / PAGE 64

THE APPLE® GAZETTE

List Apple Integer Basic Programs One Page At A Time

Keith Falkner,
Toronto, Canada

The obvious way to examine an unfamiliar program is to type "LIST". In APPLE'S INTEGER BASIC, this often gives little or no useful information, because the whole program is listed at great speed, and the moving display can scarcely be read. If the listing could be stopped, this would be no problem; however, only the RESET key stops the listing. Pressing the RESET key is brutal and inelegant, and can cause loss of the program being listed.

This small program in Assembly Language provides a convenient way to list INTEGER BASIC programs without those two problems. It lists one screen-full of the BASIC program, then waits for any key to be pressed. If any key but CTRL-C is pressed, the next screen-full of the program is listed, and so on until the whole BASIC program has been displayed. At any time, CTRL-C can be entered, and the listing ceases, with one screen-full of the BASIC program still visible. This makes it simple to browse an INTEGER BASIC program either quickly or slowly, and stop after any screen-load ("page").

This program does not interfere with BASIC, and as listed here, it occupies a part of memory where it will not likely be damaged. Locations 700-762 ($2BC-$2FA) are approximately the final quarter of the 256-byte keyboard input buffer, and are used only if more than 188 characters are entered as a line of BASIC or in reponse to an INPUT instruction. Either of these is very unusual, and in practice, the program is not over-written.

Users with little experience in machine language can easily enter this program with the Mini-Assembler which is part of APPLE'S Monitor, as follows:

> CALL - 151 (enter the Machine-language monitor)
*F666G          (enter the Mini-Assembler)
!2BC : LDACA    (no need to type spaces or $)
! STAE2         (a space is needed after the !)
! LDACB         (and so on ...)

For the "branch" instructions, BCC, BNE, BCS, and BPL, the actual address branched-to is needed. For example:

! CMP4D         (the instruction on line 0027)
! BNE2E0        (it branches to SHOWME at $2E0)

APPLE suggests using the RESET key to exit the Mini-Assembler, but there is a gentler way:

!$FF69G       (type it as shown, with no spaces)

The program can be saved on disk via:

*BSAVE LISTAPAGE, A700, L63

It can be saved onto tape via:

*2BC.2FAW (there will be only 1 "beep")

At any time, this program can be loaded into memory without disturbing any BASIC program already present. To load it from disk, type:

>BLOAD LISTAPAGE

To load it from tape, a more complicated sequence is needed:

>CALL -151 (to Monitor again)
*2BC.2FAR     (press PLAY before pressing RETURN)
*E003G        (or CTRL-C)

In either case, the program is safely hiding in locations 700-762 inclusive, and it can be used in these ways:

To list a BASIC program from the beginning, just type "CALL 700" to see the first page. Press any key except CTRL-C to see more, or press CTRL-C to stop listing after any page.

The program has a second entry-point which is also useful. Type "CALL 708" to resume listing a program after the line most recently listed. For example, to list some lines starting with line 2000, type "LIST 1999", whether or not such a line exists, then type "CALL 708", and successive pages starting with line 2000 will be listed. "CALL 708" can also be used to resume a listing which had been begun by "CALL 700" and stopped by CTRL-C.

Experienced users of machine-language will have noticed that this program is relocatable. In other words, it does not contain any reference to its own absolute address. That in turn means that it can occupy any locations in memory that are not in use for other purposes, and function there without needing any changes. Other locations which can be used to contain this program include, from most convenient to least:

Page 3, locations 768-830 (or nearby) is easiest because neither the APPLE monitor nor BASIC makes use of this space, hence of course, it is the popular place for noise-making routines and various other uses which would conflict with this. 2048-2110. In issue CLR and LOMEM:2110 to prevent BASIC variables from over-writing the routine.

16322-16384. Issue NEW and HIMEM: 16322 to prevent a BASIC program from over-writing the routine. Those addresses interfere with High-Resolution graphics, and will be different in a machine with more or less than 16K of memory.

LINE# LOC CODE    LINE
0003 0000                   .OPT NOSYM
0004 0000            ; LIST INTEGER BASIC PROGRAM
0005 0000            ; ONE SCREEN-FULL AT A TIME:
0006 0000            ;
0007 0000                  *=700
0008 02BC            ;
0009 02BC            ; **ENTER HERE TO LIST FROM START
0010 02BC            ;
0011 02BC A5CA             LDA $CA
0012 02BE 85E2             STA $E2         ;INIT POINTERS TO
0013 02C0 A5CB             LDA $CB         ;START OF PROGRAM
0014 02C2 85E3             STA $E3
0015 02C4            ;
0016 02C4            ; **ENTER HERE TO RESUME LISTING
0017 02C4            ;
0018 02C4 A54C             LDA $4C
0019 02C6 85E6             STA $E6        ;LIST UNTIL
0020 02C8 A54D             LDA $40        ;HIMEM: HIT
0021 02CA 85E7             STA $E7
0022 02CC 2C10C0    RESUME BIT $C010       ;RESET KEYBOARD
0023 02CF 2058FC           JSR $FC58      ;CLEAR THE SCREEN
0024 02D2           ;
0025 02D2           ;  SEE IF THERE IS MORE TO LIST.
0026 02D2 A5E3      ANYMOR LDA $E3
0027 02D4 C54D             CMP $4D        ;ALL DONE?
0028 02D6 9008             BCC SHOWME     ;NO.
0029 02D8 D01B             BNE EXIT       ;YES.
0030 02DA A5E2             LDA $E2        ;MAYBE ...
0031 02DC C54C             CMP $4C        ;FOR SURE?
0032 02DE B015             BCS EXIT       ;YES.
0033 02E0 206DE0  SHOWME   JSR $E06D       ;LIST ONE LINE
0034 02E3         ;
0035 02E3         ;  SEE IF ROOM TO LIST ANOTHER LINE.
0036 02E3 A525           LDA $25         ;CURRENT LINE ON SCREEN
0037 02E5 18             CLC
0038 02E6 6904           ADC #4          ;LEAVE ROOM FOR 4 LINES
0039 02E8 C523           CMP $23         ;ROOM FOR ANOTHER LINE?
0040 02EA 90E6           BCC ANYMOR      ;Y: GO TRY TO LIST MORE
0041 02EC         ;
0042 02EC         ;  SCREEN IS FULL. WAIT FOR A KEY.
0043 02EC AD00C0  WAITKY LDA $C000       ;SEE WHICH KEY PRESSED.
0044 02EF 10FB           BPL WAITKY     ;NONE. KEEP ON WAITING.
0045 02F1 C983           CMP #$83       ;WAS IT CTRL-C?
0046 02F3 D0D7           BNE RESUME     ;N: DO ANOTHER PAGE.
0047 02F5 2C10C0 EXIT    BIT $C010       ;RESET KEYBOARD.
0048 02F8 4C03E0         JMP $E003      ;BACK TO BASIC.
0049 02FB                .END

Other locations, such as the gap above the variables and below the program might be tried if none of the above appeals. Experiment at will in this fashion, and remember, "You can't hurt the computer by pressing keys".

This program provides a helpful alternative to the "LIST" command, filling an irritating gap in APPLE'S flexible and rapid INTEGER BASIC.