Pixie v2.4 - Memory debugging CDA Written by Richard Bennett April 1989 Copyright (c) 1989-1993 by Oz-Data (FREEWARE) This file last updated: 4th October 1993 Software last updated: 4th October 1993 Write to: P.O. Box 271 Turramurra NSW, 2074 Australia. AppleLink: AUST0391 Internet gateway: AUST0391@applelink.apple.com GEnie: RICHARD.B I can also be found at any Apple IIgs meeting of the Apple Users' Group, Sydney, Australia. NOTE: Users upgrading from a previous level of Pixie should read the file PIXIE.UPDATES for a brief description of changes. NOTE 2: Pixie is a very powerful debugging CDA. Please take some time to read this documentation properly. There is help online, however like Nifty List, there are ALOT of commands, and takes a while to comprehend how it all works, and not all are listed in the online help. NOTE 3: This document is a very quick hack, converted from an AppleWorks file. The layout and use of colour sucks, but it will improve when I get some spare time. I did this quickly to get v2.4 out the door. Pixie consists of the following four files; PIXIE230.CDA The desk accessory itself PIXIE.DAT Contains all the known data areas Pixie CAN run without this file PIXIE.HELP The online help text Pixie CAN run without this file Pixie.v2.4.dox This teach text doc file (NOT used by Pixie) Pixie will also use NLIST.DATA if it has been loaded into memory, or if it resides in your SYSTEM/DESK.ACCS subdirectory. NLIST.DATA is part of a shareware product called Nifty List by David A Lyons, and available from DAL Systems. If Nifty List is currently active, it will have already loaded the NLIST.DATA file into memory and set it up for speed indexing. If Nifty List is not active, then the file will still be read by Pixie whenever it is needed. When Pixie is first activated, it does the following things; 1. Load up all the variables with various system pointers. (see below for details) 2. Insert a hook into the system COP vector. 3. Test the machine memory size. If at least two megabytes, Pixie will perform the following extra functions; Load the HELP text into memory. Load the DAT file into memory. 4. Search for the memory loaded version of NLIST.DATA. Search for the disk version of NLIST.DATA. Set a flag to say which one to use from now on. 5. If the DAT file wasn't loaded in step 3, it is read now to allocate however much minimum memory it requires to be used. This is currently $800 bytes in v2.4. 6. Save system interrupt status, and disable keyboard and VBL interrupts. Test which tool sets are currently loaded and active. If TransWarpGS is found, set it to full speed. 7. Display the main memory display screen. From now on, entering Pixie will only perform functions 6 and 7. To signify that Pixie is ready for commands, a Ô?Õ is displayed in the top left hand corner of the display. This can help you tell when Pixie is away and doing something, such as searching NLIST.DATA on disk, or printing the screen. By inserting a COP $50 or COP 'P' into your program code, you can explicitly call Pixie during tracing or execution. It is not necessary to setup any special variables or registers, as Pixie does all of this for you. The only restriction, is that you must be in native mode, else it will be passed on to the ROM COP vector. (see more on COP below) For step 3, if an error occurs whilst loading files, or allocating memory, Pixie will default to the next support level of that feature. eg. If the DAT file won't fit entirely in memory, it will be used from disk. If any of the files can't be found, or some disk error occurs, Pixie will inform you that this feature has been disabled. Disk errors include activation from P8, as GS/OS is no longer available. Features that use the data file are; SPC - data display NA - inquire on data area (pointer) NR - inquire on data area (handle) ^ - move forward by last data area length OA-^ - move backward by last data area length The memory allocated is left as unlocked when Pixie is not active. This allows the memory manager to move it around as much as it likes to make room for your application. These features are also deactivated if the memory cannot be initially allocated. When in P8, the pathnames in various displays will not show up, but instead their user type will be displayed. This is because the GS/OS support routines have been de-activated by GS/OS whilst switching to P8. The P8/pathname restricted commands are; H - handle information D - auto-handle-info GT - goto heartbeat task GC - goto chunk GS - goto same ID GU - goto UserID Much care has been taken to provide P8 support for all the Pixie functions that a P8 programmer would require. Because of this, various Pixie displays may appear slow or different compared to when they are used under GS/OS. GS/OS specific functions however, such as goto window, are simply not supported whilst P8 is active. Some commands require certain tool sets (listed at the end of this file) to be loaded and active (_xxxSTATUS must be true). Rather than list which ones are required for each command, I simply de-activate them from Pixie. If a certain command is missing from a menu, then this is probably the reason. So as not to be totally confused over which tool sets are required, the list at the end of this file should give you an idea which commands require what. As mentioned previously, the tool sets are checked on each invocation of Pixie, so certain commands may seem to be active sometimes, and not others. If all the listed tool sets are active, then every command is guaranteed to be active. If you are not using Pixie for a particular session, and don't want rampant Pixie memory chunks all over the place, simply never invoke Pixie. Similarly if you don't want the COP features either. Another way, is to press ^R to reload Pixie, and just never invoke it. Moving around Pixie always displays $100 bytes starting at the current memory pointer. Any special functions on a specific memory location, are done with the current memory pointer. To move the memory pointer around, you can use the following keys, with automatic wrapping of the display around hardware pages, and non existent memory; left arrow move down by $100 bytes right arrow move up by $100 bytes up arrow move down by $10 bytes down arrow move up by $10 bytes L move forward by a long word (open-apple L for backwards) W move forward by a word (open-apple W for backwards) + move forward by 1 byte = same as + - move backward by 1 byte _ same as - - on keypad, go backward by a specific number of bytes + on keypad, go forward by a specific number of bytes B move to a specific bank > move to the next bank . same as > < move to the previous bank , same as < M go to a specific memory location OA-M go to a specific 16 bit memory location, within the same bank = on keypad. same as M G go to a special memory location (see GOTO description below) @ go to the offset into the current memory chunk being displayed by retrieving the current word in memory, and using that as the index value. good for following loaded index file chains such as those in NLIST.DATA and PIXIE.DAT. de-activated when looking at free memory # move forwards in memory by the number of bytes specified by the byte at the current memory location (use open-apple-# to go backwards) $ move forwards in memory, completely skipping over the PString at the current memory location ^ move forwards in memory by the length of the last displayed data area. (use open-apple-^ to go backwards) & move to the two byte address stored at the current memory location, whilst staying within the same bank 1 ... 9 move forwards in memory by the nominated number of bytes. (use open-apple-num to go backwards) (non-keypad only) GOTO By pressing ÔGÕ, you are presented with the following options; P go to the memory pointer stored at the current memory location (your current location is saved in VAR0) H go to the memory location pointed to by the handle stored at the current memory location (your current location is saved in VAR0) I same as H (stands for [I]ndirect location) L go to a memory location input from the keyboard (same as pressing 'M' from the main display) (your current location is saved in VAR0) M same as L (stands for [M]emory location, as on main display) W go to a window. if the window manager is active, you will be presented with a list of current windows. use the arrows to move around, and return to select which window. if you press L, the first 9 windows will be loaded into variables VAR1 through VAR9. if the window manager is active, but there are no windows, you will be told so. an asterisk ("*") before the windrec pointer indicates a system window T go to an entry in the heartbeat interrupt queue. use the arrows to move around, and return to select which task. if you press L, the first 9 tasks will be loaded into variables VAR1 through VAR9. the location retrieved is actually the start of the task code. to view the task header, simply press OA-L twice to back up by two long words (you can then data display HEARTBEAT). if there are currently no tasks in the queue, you will be told so C go to a memory chunk selected from a list of current memory handles S go to a memory chunk selected from a list of memory chunks with the same master UserID as that you are currently looking at. this option is deactivated if you are currently looking at free memory U go to a memory chunk selected from a list of memory chunks with the same master UserID as that input from the keyboard G go to the GS/OS Loader Globals (you can then use data display to display the LOADERGLOBALS) F go to a particular file, selected from a list of pathnames currently in the System Loader pathname table R go to a resource in the current resource file 0-9 by pressing a number from 0 to 9, you will load that variable into the current memory pointer. (this can also be done by pressing the keypad number keys from the main display screen) Memory allocation The amount of memory the current version of Pixie can allocate, is starting to increase to such a degree, that Pixie is no longer a "quick and dirty method of displaying memory chunks". There are currently two main versions of Pixie, those being v1.14 (from the 1989 Australian Apple II Developers conference disk), and version 2 (all 2.xx versions). The former is a "quick and dirty" version, and doesn't use much memory, whereas the second one has "grown up" to Nifty List size. Alot of the memory allocation is based on the machine size, in that any machine with at least 2 megabytes of RAM will have all the Pixie functions memory resident (except NLIST.DATA if it is on disk). Handles and stuff From the main display, you have the following commands that deal in some way or another with memory handles. H display the handle information of the current memory location P display a miscellaneous list of ports and pointers N inquire on a specific thingo (see below) R go to the beginning of the memory chunk in which the current memory location belongs, and display its handle information (rewind) E go to the end of the memory chunk in which the current memory location belongs, and display its handle information. you can then press '+' to get to the memory chunk directly following it. by combining the auto-handle-info option and the 'E' and Ô+Õ commands, it is easy to quickly skip along through the various allocated memory chunks in low memory OA-F fill the current memory chunk with a byte value input from the keyboard. this feature is de-activated if the current memory pointer is in free memory The handle display, shows the following information; Handle: The actual handle of this memory chunk. The offset from the start of this memory chunk of the current memory pointer. Size: The size of the memory chunk. Chunk: This shows the memory chunk start and end addresses. Attrib: The attributes of this memory chunk are shown in hex, and binary. The binary display also has a bit position map printed above it. UserID: The actual UserID of this memory chunk, and the type of the UserID. Path: If possible, the GS/OS class 1 pathname of the file as extracted from GS/OS. Any indirect handle information (eg, from i[N]quire on [P]ointer), still shows the offset from the start of the memory chunk, of the current memory pointer. This can be confusing at times when the offset is actually a negative value, which is when the handle you are getting information on is higher in memory than the current memory pointer. (ie. to get from the handle to where you are now, you have to add the negative value of the offset to the start of the displayed handle) iNquire on stuff By pressing 'N' from the main display, you can get the following information; P the handle information of the memory chunk that contains the memory location stored at the current memory location H the handle information of the handle stored at the current memory location A a data area display of the location stored at the current memory location (see below) R a data area display of the location pointed to by the handle stored at the current memory location (see below) Data displays By pressing the space bar, or 'A'/'R' from the iNquire menu, you can display the various data areas included with Pixie. By typing '?' to the prompt for the name, you will get a list of all the currently available areas. You can then invoke it again, and type in either the name of the area, or the number that was allocated to it. eg. to display a GRAFPORT, you could type either 'GRAFPORT', or the number next to it. The default display consists of the following three parts; 1. The actual address of each entry. 2. The name of the entry as specified in the appropriate Apple manual. 3. The actual value that the location contains. By turning 'explain' on (see toggle options below), the display is different, and shows the following three things; 1. The name of the entry as specified in the appropriate Apple manual. 2. The actual value that the location contains. 3. A short description of what the entry means. If the data file is currently on disk, and the disk is no longer online, you will not be prompted for the disk. By re-inserting the disk, the feature will be re-activated. Also, where original Apple labels and definitions apply, the spelling is as originally specified. BUT, in the various descriptions, Australian (english) spelling is used instead. (eg. colour and NOT color) Toggle options All of the following toggle options keep their value between sessions, and can be selected from the main display. A toggle the ascii output mask on the main display. this turns off all mousetext, inverse and flashing characters O toggle mousetext on and off. all mousetext characters now become flashing. this also effects the Pixie screen layout D auto-handle-info on/off. when Pixie displays memory, it also, by default, shows the handle information for the particular chunk being displayed. this feature comes in handy when scanning through memory with a-h-i on, and wish to keep the handle information on the screen as you go. ie. use a-h-i on for scanning, and then off when you've found the wanted handle, and it will be held on the display (until you use another command that changes the display). a-h-i on is signified by an asterisk in the top left hand corner of the screen I toggle the Pixie interrupt routines. initially, Pixie will not touch the interrupt flag in the status register. this means that a CDA invocation of Pixie will have interrupts enabled, and a COP call won't. by pressing 'I', both modes will disable interrupts. this is handy for examining interrupt handlers in memory. when you press Ô*Õ to go to monitor, interrupts are automatically enabled, thus ignoring the current 'I' setting. keyboard and VBL interrupts are always disabled by Pixie anyway, so 'I' would only be handy for something like scan-line interrupts, or for slowing down the TransWarp GS to the current IIgs system speed at $C036 Miscellaneous The following miscellaneous commands are also available from the main display; C to select which language card bank is displayed, press C, and then the bank you want. ie. '0' or 'B' will select the first bank, and '1' or '3' will select the second bank * enter the system monitor. as usual, just press ^y to return this sets the two display registers to that of the current memory pointer, the L register to the Pixie L= register, and the e/m/x flags to zero. all other registers are left as originally set ! displays the status of a few Pixie options, the state of system memory, and the name of the currently running application ^G graphics functions. (see below) T display the function pointer (FPtr) and work area pointer (WAP) of an input tool number. if NLIST.DATA is available, the tool call format is also displayed OA-T open-apple T does the same as T, except the tool call monitor is also hooked in. if the tool is in RAM, and the tool call monitor is installed, the subsequent calls to the tool with shift held down will flash the border and beep the speaker. by pressing escape at the prompt for a tool number, the monitor is removed. the current state of the monitor is displayed in the Ô!Õ status display % displays the word at the current memory location in binary ? displays the online help text ^R reload Pixie. if the system disk is still online, Pixie will be reloaded into memory. the current Pixie and its associated memory chunks are purged, and the entry removed from the CDA menu. the Pixie loaded from disk is then inserted into the menu. Pixie then exits to the CDA menu, where you can select the newly loaded version, which will of course re-do all the initial startup tasks mentioned at the beginning of this documentation OA-P displays the boot volume name, GS/OS version, file level, SysPrefs, SessionStatus, and all the GS/OS prefixs which currently have pathnames attached to them ESC returns you to the CDA menu Graphics functions By pressing Ô^GÕ (control-G) from the main display, you can select a very limited number of graphics functions. Whether super hires is currently on or off is also displayed if Pixie was called by a COP. S displays the current SCBs (scan line control byte) for each line on the super hires screen P displays the 16 currently defined palettes Z zoom in on an area on the super hires screen, and display the byte values on the text screen. you then use the arrows keys to move around, or the [RETURN] or [Tab] keys to toggle between the graphics and text mode displays. OA-arrows move around by the whole width of the window. [ESC] to quit C displays the controls connected to the current front window. use the arrows to select which control, and [RETURN] or [Tab] to toggle between graphics and text mode displays. [SPC] will redraw the current control. [ESC] to quit The [Z]oom display, shows the SCB, and the line number of the corresponding line. Also, down the bottom, is the current horizontal offset. Whilst in text mode, you can press [A] and [S] to toggle between the line address and SCB/line number displays. The [C]ontrol display uses the WASZ and IJKM keys to re-size the control's rect dynamically. To shorten any of the sides of the rect, use the WASZ keys, and to lengthen them use the IJKM keys. Any rect changes you make will be kept by the system, however the controls will not be redrawn. With controls which actually involve Quickdraw II changes (eg. clicking buttons), this obviously means that the changes will occur in the new position, whilst the old position still contains the original image. This shouldn't cause a problem, considering this feature is mainly for customizing dialogs during program design. Undocumented The following commands are also available, but not on the help screen. These are mainly my own debug commands, but I've left them in case you want to find various Pixie internals; / goto start of Pixie Z call WIPEDISP (routine to clear handle display) G/ by pressing 'G' to go into the goto display, and then pressing '/' and a number key, you can quickly go to any of the Pixie memory areas. the keys available are; 1 - Pixie itself 2 - Pixie DAT file (if loaded) else the buffer for it 3 - Pixie HELP file (if loaded) 4 - NLIST.DATA (if loaded) 5 - Pixie internal buffer 6 - COP internal buffer (for saving $00/0100-$00/01FF) Variables There are 10 variables, numbered from VAR0 to VAR9. All the memory jumping routines save the current location in VAR0, which serves as an undo variable. Whenever a special location is displayed (eg. ÔPÕ to display the ports, or ÔTÕ to display the FPtr), the location displayed is loaded into VAR1. You can explicitly set any of the variables (including VAR0 and VAR1) by pressing ÔVÕ, and then the number of the variable to save (or by simply pressing open-apple and a number on the keypad). All the variables are kept intact across sessions, and can be listed by pressing ÔV?Õ. On startup, the variables are set to the following values; VAR0 - $00/0000 VAR1 - pointer to the current Grafport VAR2 - pointer to COP handler (before Pixie hooks in) VAR3 - pointer to Desk Accessory manager VAR4 - pointer to quarter second interrupt handler VAR5 - pointer to one second interrupt handler VAR6 - pointer to cursor update routine VAR7 - $E1/0000 VAR8 - pointer to the first entry in the Memory manager used handle list VAR9 - pointer to the first UserID in the Memory manager UserID list The only commands that can't be undone using the undo variable (VAR0), are the really simple memory movement commands. These are; up-arrow, down-arrow, left-arrow, right-arrow, non-keypad number keys, non-keypad +, non-keypad =, non-keypad -, non-keypad _, <, >, comma, non-keypad full-stop. Searching Pixie has the ability to scan all of memory for input strings, which can be of a variable length, with optional wildcards. To edit the search display, press ÔSÕ or ÔFÕ. The current string is displayed in hex and ascii, and either can be edited by pressing the tab key. Use the arrows to move around the fields, the delete key to delete a character, or control-x to delete the whole lot. You can toggle a byte between high and low value by pressing the up and down arrows, and insert wildcards by pressing the space bar in hex mode. Once you've finished editing, press return to start the search, or escape to exit to the main display again. Pixie will not present matches if the string is found within Pixie itself. Also; U allows a userid mask to be used with the search function. the current status of the mask is displayed in the Ô!Õ status display Memory editing If editing memory by using the monitor annoys you, press return. The Pixie edit function allows you to move around in the current display and enter in hex values. By pressing return again, the cursor will flash to indicate text input mode. Pressing ESC will exit to the main display. Whilst in hex input mode, the memory values can be shifted to high and low by pressing ÔHÕ and ÔLÕ. Memory editing does not have an undo function, so whatever you change, it's permanent. When you first press return, the handle information of the current memory pointer is display for reference. Printing The print functions use the text tools to hook into slot #1, and use standard Imagewriter II control codes. control-Z dumps the whole 80 column text screen to printer. this can be done whenever Pixie asks for input. (eg. window list) control-P dumps the text screen which was displayed before Pixie, or the Desk Accessories menu was invoked. . from the keypad. dumps out a complete memory map, plus a matching handle list. When you select the memory map function, you will be asked to toggle two special options before pressing return to start the dump. The first is ÔFÕ, and selects whether full memory is dumped, or chunks larger than $1000 bytes are simply summarized. The second is to turn the graphic display on or off. By turning of the graphic display (memory map), only the handle list will be dumped. With both displays dumped to printer, the handle list can easily be matched with the graphic display by using the lettering legend in the first column. COP stuff When Pixie is called by a COP $50, the COP address is printed at the top of the screen, and set to VAR1. Memory $00/0100-$00/01FF is saved internally, and the S register set to use that space. Pixie always allocates its direct page space from the stack on entry, so in this case the direct page and stack are both set to page 1. If you wish to look at page 1 as it was when the COP was called, press ÔG/6Õ. By pressing ÔQÕ, you can change the RTI return address, or by pressing Ô1Õ on the keypad, you can go to the location that the application was interrupted from ('Q' is only active when Pixie is called by a COP instruction). When entering the monitor, the following registers are also set to what they were when the program was interrupted; A 16 bit accumulator X 16 bit X register Y 16 bit Y register S 16 bit stack pointer P processor status register (with the interrupt flag set on) B DBK (data bank register) K PBR (program bank register) M machine state register ($C068 without INTCXROM) Q quagmire register (bit7=speed,bit6-bit0=$C035|6-0) m accumulator length x index register length e emulation setting (always zero, as Pixie doesn't support an emulation mode COP) The L register, and the two display registers are set to the L= and current memory pointer registers from the Pixie display. TransWarp GS stuff When Pixie is activated, part of its startup is a check for a TransWarp GS card. If found, the current configuration is saved, and the card set to the following mode: The fastest speed the card can handle. Data Cache enabled. AppleTalk/IRQ enabled (so you can use ÔIÕ from the main display to slow down the machine at any time) When exiting, Pixie restores the original TransWarp GS settings. The only change will be that the Data Cache has changed due to Pixie running with it enabled. Once your application is re-activated, the Data Cache should soon build up again in about a second or so. The speed at which the TransWarp GS was running before Pixie was activated, is displayed in the top right corner of the screen for reference. This can be useful to check if particular programs have actually slowed down, or changed the speed of the TransWarp GS. Pixie Tools Pixie has an external entry point for programmers to use Pixie routines. To find the Pixie Tools entry point, simply scan the used handle list for a handle with the UserID set to $5xxx, and examine the chunk for the Pixie ID bytes. After the mandatory CDA header of a PString and two longwords, there is an ID word of $4252. The following longword is the address of the Pixie Tools. To call it, simply load the Y register with the routine number, and call the entry point in native mode with all registers long. Here is some sample Merlin code to find the Pixie Tools entry point; FINDPIXIE LDA >$E11600 TAX LDA >$E11602 :LOOP STX 0 STA 2 LDY #6 LDA [TEMPHANDLE],Y AND #$F000 CMP #$5000 BNE :NEXT LDA [0] TAX LDY #2 LDA [0],Y STX 4 STA 6 LDA [4] ;Skip over CDA PString AND #$FF CLC ADC #9 ; and CDA Startup/Shutdown address TAY LDA [4],Y CMP :RBID ;Is this Pixie? BNE :NEXT INY INY LDA [4],Y ;Pixie Tools LO address STA PIXIETOOLS+1 INY LDA [4],Y ;Pixie Tools HI address STA PIXIETOOLS+1+1 CLC RTS :NEXT LDY #16 LDA [TEMPHANDLE],Y TAX INY INY LDA [TEMPHANDLE],Y BNE :LOOP CPX #0 BNE :LOOP SEC RTS :RBID DA 'RB' PIXIETOOLS JSL 0 RTS Functions: (All XA register pairs are X-lo and A-hi) 0001 Set the current memory pointer to X and A registers 0n02 Set variable n to the location in the X and A registers (The variable must be a numeric digit from 0 to 9, else it is ignored by Pixie) 0003 If Pixie hasn't been activated, hook into the system COP vector Pixie tool usage The tools used by Pixie are listed below; Tool Locator required , Memory manager required MMStartup, , Miscellaneous required System Loader optional LGetPathname2, InitialLoad2, UserShutdown Quickdraw II optional GetPort, InvertRect Control Manager optional DrawOneCtl Menu Manager optional GetMenuMgrPort Window Manager optional GetWMgrPort, GetWindow, GetWTitle, FrontWindow, GetFirstWindow Resource Manager optional GetCurResourceFile, GetMapHandle Text tools required , Integer Math required Int2Dec,Multiply Hints and interesting things to do DEVICE DRIVERS: By finding a device driver in memory, you can easily display its DIBs by pressing ÔRÕ to rewind to the beginning of the driver, and pressing Ô@Õ to offset to the first DIB. You can then data display the DIB, or goto the pointer at the current memory location, which is the pointer to the next DIB in the chain (the data area is defined as GSOSDIB). DATA DISPLAY: A neat trick with the data display, is to go to location $00/0000 and do the display of the area you require. This will then give you the offsets into the area of each entry without having to open the appropriate Apple manual, once you've put the pages back into correct order anyway, and spending ten minutes trying to find the diagram. HEARTBEAT TASKS: As mentioned in the Goto section, you can goto a task, and then press OA-8 to back space by eight bytes to the task header. GRAFPORTS: OA-L on a GrafPort will usually backspace to a pointer to the next GrafPort in the chain. Also, you can go to the current GrafPort by pressing 1 on the numeric keypad, as long as you haven't changed variable 1, or retrieved any other addresses. By pressing ÔPÕ from the main display, variable 1 will be reloaded with the location of the current GrafPort. BANK E1 VECTORS: Press ÔMÕ and type ÔE1/Õ to go to location $E1/0000, and then press the space bar for data display, and type ÔE10000Õ to display all the vectors. Turn explain on (press ÔXÕ from main display) for a detailed description of each one. Alternatively, if you haven't changed variable 7, you could simply press the 7 key on the numeric keypad to goto location $E1/0000. PIXIE UNDER P8: If you activated Pixie under P8, and are missing some of the functions which P8 doesn't provide, you can quit P8 to GS/OS, press Ô^RÕ to reload Pixie, activate the new version, and then launch P8 again. You will now have access to all Pixie functions. SEARCH FOR ROUTINES IN MEMORY: When looking for a routine in memory, it may be easier to press ÔGCÕ to goto a chunk, and then look at the end of the list for memory chunks. eg. FREDA allocates $400 bytes for itself. By checking the end of the list in ÔGCÕ, I can find the $400 bytes, and take note of the UserID. Now I can simply do a ÔGUÕ and type in the UserID to get a list of all FREDAs memory chunks (of which the first in the list is FREDA itself). GSOS STUFF: The last Loader call, and GS/OS call, can be displayed by ÔGGÕ to goto the Loader Globals, and displaying the LOADERGLOBALS data area. MENU MANAGER: By pressing ÔPÕ to get the current menu bar, and going to that location, you can display the control record by pressing the space bar and typing ÔCTLRECÕ. A handle to each menu record then follows, so you can simply press Ô^Õ to skip the CTLREC and ÔGHÕ to goto the handle (and then use data display on MENU). Using Ô0Õ on the keypad will then bounce you back to the end of the CTLREC again. DIALOG DESIGN: By knocking up a quick rough dialog template, Ô^GCÕ can be used to completely define the dialog rects dynamically. You can then Ô^PÕ (print) each screen and copy the rect values into your program. No more re-assemblies just to get your name centred properly! Of course you could always use a resource editor, but then the template isn't within the program is it! FREEWARE NOTES Yes, this program is freeware. Yes, this program is free. No, you are not allowed to modify the program or data files in any way. Because Pixie is freeware, the only charge you may have to pay, is the copying charge by a registered Apple user group. Companies that run public domain libraries, are NOT allowed to sell, distribute or transfer this program in any way, because it is also copyright (c) 1989-1993 by Oz Data. Permission is given however for online systems to let users download Pixie as long as there is no charge for Pixie itself. All the code and data files of the Pixie software (excluding of course NLIST.DATA) remain copyright (c) 1989-1993 by Oz-Data. So there! The layout of the data file, PIXIE.DAT, is quite involved, and if you modify it at all, chances are it won't work anymore. I will supply the layout to anyone who wants it, either in Merlin source code, or on paper. So just write, with a self addressed return envelope. Having this source can be handy if your application has its own data areas, or if you have some layouts that I haven't included. There are two reasons why PIXIE.DAT isn't a text file; 1-Speed, 2-Memory. If PIXIE.DAT is being read from disk (ie. your machine is less than 2Meg), the lookup of each data area could take quite a while in an unformatted text file, such as NLIST.DATA, so you're stuck with this special layout instead. I have plans for an internal editor within Pixie, but that's a while off yet. If you have a program that would like to use some of Pixie's routines, simply drop me a line, and I'll put in a new Pixie Tools call for you. Access to PIXIE.DAT will also be available in later versions of Pixie, so any data areas you would like to see included will be gladly accepted as well. This program has nothing to do with the Nifty List CDA from DAL systems. If you are NOT a registered user of Nifty List, then the use of the NLIST.DATA file with Pixie MAY infringe copyright. But you can sort that out with David Lyons if you so wish. However, if you have a data file with a list of tool calls, and it just happens to be called NLIST.DATA, and you swear that the name is just a co-incidence, then this will probably not infringe. In either case, speak to Dave. How was I to know that when I started writing Pixie, Dave had just started on Nifty List? Pixie and Nifty List have been pretty much neck and neck feature wise through each successive revision (except for a few specific things which each one does - disassembly and data data display imediately spring to mind). Which you choose to use really depends on whether you prefer a command line interface, or a hot key interface, and whether you prefer disassembly or hex output. Apart from that, there is not much difference. You could argue feature against feature, but there will always be Òmore than one way to skin a catÓ. Please address all correspondence to: Richard Bennett P.O. Box 271 Turramurra NSW 2074 Australia AppleLink: AUST0391 Internet gateway: AUST0391@applelink.apple.com GEnie: RICHARD.B Or you can speak to me at any of the Apple II meetings of the AUG (Apple Users Group) Inc., Sydney, Australia. Just ask around for Richard. Special thanks, however small; Chris Nelligan, John Maclean, Simon Walmsley, Cameron Brawn, Godfrey Gamble, and Matt Deatherage. Special thanks to Matt Deatherage and David Lyons (DTS APPLE INC. US) for showing me Nifty List after I asked ÒWhy don't people use Pixie?Ó, and Godfrey Gamble (DTS APPLE OZ) and Matt Deatherage for helping out with new system 5 info and various beta info. (Australia is a long way from Cupertino!) Apple II forever! II Infinitum!