Metropoli BBS
VIEWER: stofix.doc MODE: TEXT (ASCII)
this is the STOFIX library, version 1.1. It provides a workaround for the STO
and PINIT bug described below on ROM L & M HP48GX's. It's 1187 bytes in size,
its checksum is #81E5h and its Library ID is 1222.

STOFIX is designed to run in any port on ROM rev A-M '48s.

Installation
------------

  * if you've a GX w/ two cards installed, remove the card from port 1 as
    described in your manual if you want to store the library into another
    port than 0 or 1
  * download STOFIX.LIB into your '48
  * recall it onto the stack and purge the variable containing the d/led
    copy
  * enter the port number where the library should be stored at, press STO
  * warmstart your '48 by pressing ON-C or power cycle it
  * reinstall the card in port 1 (if neccessary) as described in your manual

Commands
--------

  STOFIX provides 3 new commands, you'll see them after entering the STOFIX
  menu (<right>-2 STOFI on a GX, <left>-\|^ STOFI on a SX):

   sto		( object1 object2		-->		)

    This command is a replacement for the build-in STO command, it does
    exactly the same, except that it does stores directeced to a port > 1
    in a correct manner.

   pinit	(				-->		)

    This command is a replacement for the PINIT command, it does exactly
    the same, except it won't corrupt the memory of card 1.

   SFHLP	(				-->		)

    'StoFix HeLP' - shows three screens of help information.

Usage
-----

  Use the STOFIX commands on a L or M HP48GX in case you have installed RAM
  cards in ports 1 & 2 for doing the following tasks to avoid memory losts/
  corruption:

    * to store a library or backup into a port > 1, use sto
    * to store other objects into a port > 1, use sto
    * to initialize a mulit port card, use pinit

Big description
---------------

  There's a *really* bad BUG which appears in ROM rev L & M HP48GX's. I've
  only access to this machines, so I don't know if this bug also appears in
  other G rev's too. I really hope this is fixed in rev P...

  Objects are stored into ports 1-33 from low to high address, and each obj
  sequence is terminated by 5 0-nibbles following immediately the last obj of
  a port. This marker is used as end of obj sequence and to signal an intact
  port.

  Two cards will share the address space starting at address #C0000, port 1
  will be active all the time, and ports 2-33 are memory mapped into this
  address space temporarily on accesse requests.

  If you've plugged in two cards, and store a library into eg. port 2 (with
  2 STO - this may be a 32k, 128k or 1M card) the following actions takes
  place:

    a) port 2 is mapped to #C0000
    b) the postion of the 00000 marker is determined
    c) the library is added to the obj sequence in the port
    d) a new 00000 marker is written
    e) port 1 is mapped back to #C0000

  Here the bug appears: in ROM rev L & M '48s steps d) and e) are swapped !

  Consequences:

   1) If you've a writeprotected card in port 1, only the 00000 marker wasn't
      written - because there's a good chance that the remainder of the card
      isn't filled with zeros, this will cause the 'Invallid Card Data'
      message each time you turn on your '48. On a rev M just run PINIT in
      this case. The rev L don't have the PINIT command, so you should remove
      the card in port 1 before storing something into the card in port 2
      (causing that port 2 is mapped to #C0000 permanently)

   2) If you've a writable, FREEd, card in port 1, additional to the above
      effect the 00000 marker is written into port 1 - depending on the fill
      level of port 1 this will cause at least a modification of one object.
      There may be a lot of different effects caused by this - and there's a
      good chance to loose memory if you access the modified data (eg. by
      executing a modified library command or by restoring a corrupt backup)

   3) If you've a writable, MERGEd, card in port 1, additional to the effects
      described in 1), the 00000 marker was written to the system RAM - again
      this may cause various suspicious effects, the most likely is to loose
      RAM later or earlier...

   4) The PINIT command on a rev M '48 will trash your card 1 too. It
      initializes ports 1-33 by storing a small object into it and then
      immediately deleting the object - the storing operation is performed
      by the STO kernel... If you've a multiport card in poert 2, and execute
      PINIT, a bunch of 00000s may be scattered all over card 1...

  How to 'see' the bug:

  Get two empty RAM cards, a memory scanner and a library. Plug in the cards,
  and determine the size of the library w/ DUP BYTES SWAP DROP 2 * R->B,
  assuming the result is #1A51, use the memory scanner to examine the address
  #C1A51 (this is port 1) and make shure that there're no 0's. Now store the
  library into port 2 w/ 2 STO. Launch the scanner again and take a look at
  #C1A51 - if you see 00000, you got it. For beeing shure you can additionaly
  remove the card of port 1, and take a look at #C1A51 again (this time port
  2) - assuming that there wheren't any 0's before storing the lib, you won't
  see the 00000 sequence...
[ RETURN TO DIRECTORY ]