Post Reply 
'91 TDS 256KB RAM Card for the HP-48 SX
03-22-2015, 11:22 PM
Post: #14
RE: '91 TDS 256KB RAM Card for the HP-48 SX
Here's a disassembly of Super Switcher:

Code:
*******************************************************************************
ASSEMBLE
    ABS    C0000
RPL
*******************************************************************************
LOCALLABEL L_C0000
ASSEMBLE
      CON(5)  =DORRP
      CON(3)  #302
      REL(5)  L_C1149
*******************************************************************************
      CON(5)  0
L_C0012
      CON(2)  6
      NIBASC  'LIB804'
      CON(2)  6
RPL
  xTITLE HP.SW\20:Super\20SWITCH
  xROMID   324  ( %804 )
  xCONFIG  LibCfg324
*******************************************************************************
* ROMPTR table
*******************************************************************************
EXTERNAL xABOUT\B1\B1804    ( ROMPTR 324 0    at C0074 )
EXTERNAL xSW        ( ROMPTR 324 1    at C016D )
EXTERNAL xBS1        ( ROMPTR 324 2    at C043D )
EXTERNAL xBS2        ( ROMPTR 324 3    at C04E3 )
EXTERNAL XLIB_324_4    ( ROMPTR 324 4    at C0582 )
EXTERNAL XLIB_324_5    ( ROMPTR 324 5    at C06C1 )
EXTERNAL XLIB_324_6    ( ROMPTR 324 6    at C06DB )
EXTERNAL XLIB_324_7    ( ROMPTR 324 7    at C06F5 )
EXTERNAL XLIB_324_8    ( ROMPTR 324 8    at C0750 )
EXTERNAL XLIB_324_9    ( ROMPTR 324 9    at C07AB )
EXTERNAL XLIB_324_A    ( ROMPTR 324 A    at C0838 )
EXTERNAL XLIB_324_B    ( ROMPTR 324 B    at C08C2 )
EXTERNAL XLIB_324_C    ( ROMPTR 324 C    at C0904 )
EXTERNAL XLIB_324_D    ( ROMPTR 324 D    at C096E )
EXTERNAL XLIB_324_E    ( ROMPTR 324 E    at C0BE8 )
EXTERNAL XLIB_324_F    ( ROMPTR 324 F    at C0EBC )
*******************************************************************************
*******************************************************************************
ASSEMBLE
      CON(1)  #8
RPL
*******************************************************************************
xNAME ABOUT\B1\B1804
::
  TURNMENUOFF
ASSEMBLE
      CON(5)  =DOCSTR
      REL(5)  L_C0148
      NIBASC  'Super SWITCH for 48GX\n'
      NIBASC  '      \n'
      NIBASC  '            by HPnuts\n'
      NIBASC  '            &  HPdark\n'
      NIBASC  '\n'
      NIBASC  '\A9Copyright  04/12/1993'
L_C0148
RPL
  THREE EIGHT Disp5x7 %6 Ck&Freeze
;
*******************************************************************************
ASSEMBLE
    CON(1)  #8
RPL
*******************************************************************************
xNAME SW
::
  0LastRomWrd! XLIB_324_7 ITE
  ::
    {
      $ "EXIT"
      ::
        ::
          %0 xMENU
        ;
      ;
    }
    %1 XLIB_324_F 3PICK %FP % 4E-1 %= ITE
    ::
      XLIB_324_5 XYZW>YZWX %IP %1 XLIB_324_E %2
      XLIB_324_E %3 XLIB_324_E %4 XLIB_324_E
    ;
    ::
      {
      }
      DUP XLIB_324_5 SIXROLL %IP %1 XLIB_324_E %2
      XLIB_324_E
    ;
    2DROP SIX {}N
  ;
  {
  }
  XLIB_324_8 ITE
  ::
    {
      $ "EXIT"
      ::
        ::
          %0 xMENU
        ;
      ;
    }
    %2 XLIB_324_F 3PICK %FP % 4E-1 %= ITE
    ::
      XLIB_324_6 XYZW>YZWX %IP %1 XLIB_324_E %2
      XLIB_324_E %3 XLIB_324_E %4 XLIB_324_E
    ;
    ::
      {
      }
      DUP XLIB_324_6 SIXROLL %IP %1 XLIB_324_E %2
      XLIB_324_E
    ;
    2DROP SIX {}N
  ;
  {
  }
  &COMP TOTEMPOB NotList?Err InitMenu
;
*******************************************************************************
ASSEMBLE
    CON(1)  #8
RPL
*******************************************************************************
xNAME BS1
::
  %1 SWAP XLIB_324_D xABOUT\B1\B1804 XY>Y DATE TOD
  % 1E-4 %HMS+ ' PURGALARM%
  XYZW>YZWX XLIB_324_5 ' DOAPWL
  FOUR # 2D9D COMPN TOTEMPOB THREE{}N STOALM{} DROP
;
*******************************************************************************
ASSEMBLE
    CON(1)  #8
RPL
*******************************************************************************
xNAME BS2
::
  %2 SWAP XLIB_324_D xABOUT\B1\B1804 XY>Y DATE TOD
  % 1E-4 %HMS+ ' PURGALARM%
  XYZW>YZWX XLIB_324_6 ' DOAPWL
  FOUR # 2D9D COMPN TOTEMPOB THREE{}N STOALM{} DROP
;
*******************************************************************************
NULLNAME XLIB_324_4
::
  XLIB_324_9 SWAP XYZW>YZWX 2DROP AND SWAP TWO #= AND ITE
  ONE
  ZERO
  '
  ::
    CODE
          GOSBVL  =SAVPTR
          A=DAT1  A
          D1=D1+  5
          D0=A
          D0=D0+  5
          C=DAT0  B
          D=C     B
          C=C-1   B
          GOC     L_C0606
          LC(5)   L_C0000
          UNCNFG
L_C0606
          A=DAT1  A
          D0=A
          D0=D0+  5
          GOSUB   L_C063B
          NIBHEX  0EEECECC01
          NIBHEX  0EEECECE03
          NIBHEX  0EEECEEEC0
          NIBHEX  0EEECEEC07
L_C063B
          C=RSTK
          A=DAT0  B
          A=A-1   B
          D1=C
          A=A-1   B
          GOC     L_C0655
L_C064C
          D1=D1+  10
          A=A-1   B
          GONC    L_C064C
L_C0655
          LC(2)   #A
          B=C     B
          LC(5)   #FFFFA
          D0=C
L_C0666
          A=DAT1  A
          C=A     P
          D0=C
          A=DAT0  B
          D1=D1+  1
          B=B-1   B
          GONC    L_C0666
          D=D-1   B
          GOC     L_C068B
          LC(5)   L_C0000
          CONFIG
L_C068B
          GOSBVL  =GETPTR
          D=D+1   A
          D1=D1+  5
          GOVLNG  =DropLoop
    ENDCODE
  ;
  TWO # 2D9D COMPN TOTEMPOB
;
*******************************************************************************
NULLNAME XLIB_324_5
::
  ONE XLIB_324_4
;
*******************************************************************************
NULLNAME XLIB_324_6
::
  TWO XLIB_324_4
;
*******************************************************************************
NULLNAME XLIB_324_7
::
  XLIB_324_A ROT 2DROP ITE
  ::
    ' TAG 1
    ID BANK XLIB_324_C
  ;
  FALSE
;
*******************************************************************************
NULLNAME XLIB_324_8
::
  XLIB_324_A XYZ>ZXY 2DROP ITE
  ::
    ' TAG 2
    ID BANK XLIB_324_C
  ;
  FALSE
;
*******************************************************************************
  NULLNAME XLIB_324_9
  CODE
        AD0EX
        R0=A
        D0=(5)  =CARDSTAT
        A=DAT0  B
        D=D-1   A
        D1=D1-  5
        LC(5)   =TRUE
        ?ABIT=1 2
        GOYES   L_C07DD
        LC(3)   #AC0
L_C07DD
        DAT1=C  A
        D1=D1-  5
        D=D-1   A
        LC(3)   #A81
        ?ABIT=1 0
        GOYES   L_C07F6
        LC(3)   #AC0
L_C07F6
        DAT1=C  A
        D1=D1-  5
        D=D-1   A
        LC(3)   #A81
        ?ABIT=1 3
        GOYES   L_C080F
        LC(3)   #AC0
L_C080F
        DAT1=C  A
        D1=D1-  5
        D=D-1   A
        LC(3)   #A81
        ?ABIT=1 1
        GOYES   L_C0828
        LC(3)   #AC0
L_C0828
        DAT1=C  A
        A=R0
        D0=A
        GOVLNG  (=GETPTRLOOP)+6
  ENDCODE
*******************************************************************************
  NULLNAME XLIB_324_A
  CODE
        AD0EX
        R0=A
        D0=(5)  (=CONFTAB)+4
        A=DAT0  B
        D=D-1   A
        D1=D1-  5
        LC(5)   =TRUE
        ?ABIT=1 1
        GOYES   L_C086A
        LC(3)   #AC0
L_C086A
        DAT1=C  A
        D1=D1-  5
        D=D-1   A
        D0=D0+  1
        C=A     B
        A=DAT0  B
        C=C+A   B
        A=A&C   B
        LC(3)   #A81
        ?ABIT=1 1
        GOYES   L_C0893
        LC(3)   #AC0
L_C0893
        DAT1=C  A
        D1=D1-  5
        D=D-1   A
        D0=D0+  2
        A=DAT0  B
        LC(3)   #A81
        ?ABIT=1 1
        GOYES   L_C08B2
        LC(3)   #AC0
L_C08B2
        DAT1=C  A
        A=R0
        D0=A
        GOVLNG  (=GETPTRLOOP)+6
  ENDCODE
*******************************************************************************
NULLNAME XLIB_324_B
::
  XLIB_324_9 FIVEROLL %1 %= IT
  ::
    SWAP XYZW>WXYZ
  ;
  XYZ>
;
*******************************************************************************
NULLNAME XLIB_324_C
::
  xIFERR
    ::
      xEVAL TRUE
    ;
  xERRTHEN
    ::
      xIF
        % -5.5E1 xFC?
      xTHEN
        xDROP
      xIFEND
      FALSE
    ;
  xIFEND
;
*******************************************************************************
NULLNAME XLIB_324_D
::
  0LastRomWrd!
  CK2
  DUPTYPEREAL? NcaseTYPEERR
  SWAP DUPTYPEREAL? NcaseTYPEERR
  COERCE2 SWAP DUP ONE #< OVER FOUR #> OR IT
  ::
    2DROP $ "Error:\nBad Bank Number" xEXIT
  ;
  SWAP DUP ONE #< OVER TWO #> OR IT
  ::
    2DROP $ "Error:\nBad Port Number" xEXIT
  ;
  XLIB_324_A 4PICK TWO #= ITE
  ::
    ITE
    2DROP
    ::
      XYZW> $ "Error:\nNo Switch Card in :2:" xEXIT
    ;
  ;
  ::
    DROP ITE
    DROP
    ::
      ITE
      ::
        2DROP $ "Error:\nCard Merge in :1:" xEXIT
      ;
      ::
        2DROP $ "Error:\nNo Switch Card in :1:" xEXIT
      ;
    ;
  ;
  SWAP
;
*******************************************************************************
NULLNAME XLIB_324_E
::
  2DUP %= ITE
  ::
    {
ASSEMBLE
          CON(5)  =DOGROB
          REL(5)  L_C0C4A
          CON(5)  #8
          CON(5)  #15
          NIBHEX  FFFFF1
          NIBHEX  100001
          NIBHEX  D42011
          NIBHEX  551811
          NIBHEX  DC0011
          NIBHEX  551011
          NIBHEX  D4AB31
          NIBHEX  100001
* |*********************   | *
* |*                   *   | *
* |* **  *  *      *   *   | *
* |* * * * *      **   *   | *
* |* **  **        *   *   | *
* |* * * * *       *   *   | *
* |* **  *  * *** ***  *   | *
* |*                   *   | *
L_C0C4A
          CON(5)  =DOGROB
          REL(5)  L_C0C8E
          CON(5)  #8
          CON(5)  #15
          NIBHEX  FFFFF1
          NIBHEX  100001
          NIBHEX  D42831
          NIBHEX  551021
          NIBHEX  DC0831
          NIBHEX  551801
          NIBHEX  D4AB31
          NIBHEX  100001
* |*********************   | *
* |*                   *   | *
* |* **  *  *     ***  *   | *
* |* * * * *        *  *   | *
* |* **  **       ***  *   | *
* |* * * * *      *    *   | *
* |* **  *  * *** ***  *   | *
* |*                   *   | *
L_C0C8E
          CON(5)  =DOGROB
          REL(5)  L_C0CD2
          CON(5)  #8
          CON(5)  #15
          NIBHEX  FFFFF1
          NIBHEX  100001
          NIBHEX  D42831
          NIBHEX  551021
          NIBHEX  DC0031
          NIBHEX  551021
          NIBHEX  D4AB31
          NIBHEX  100001
* |*********************   | *
* |*                   *   | *
* |* **  *  *     ***  *   | *
* |* * * * *        *  *   | *
* |* **  **        **  *   | *
* |* * * * *        *  *   | *
* |* **  *  * *** ***  *   | *
* |*                   *   | *
L_C0CD2
          CON(5)  =DOGROB
          REL(5)  L_C0D16
          CON(5)  #8
          CON(5)  #15
          NIBHEX  FFFFF1
          NIBHEX  100001
          NIBHEX  D42021
          NIBHEX  551031
          NIBHEX  DC0821
          NIBHEX  551871
          NIBHEX  D4A321
          NIBHEX  100001
* |*********************   | *
* |*                   *   | *
* |* **  *  *       *  *   | *
* |* * * * *       **  *   | *
* |* **  **       * *  *   | *
* |* * * * *      **** *   | *
* |* **  *  * ***   *  *   | *
* |*                   *   | *
L_C0D16
RPL
    }
    SWAP COERCE NTHELCOMP DROP ' TakeOver
    TWO{}N
  ;
  ::
    {
ASSEMBLE
          CON(5)  =DOGROB
          REL(5)  L_C0D91
          CON(5)  #8
          CON(5)  #15
          NIBHEX  000000
          NIBHEX  FFFFF1
          NIBHEX  3BDFE1
          NIBHEX  BAE7E1
          NIBHEX  33FFE1
          NIBHEX  BAEFE1
          NIBHEX  3B54C1
          NIBHEX  FFFFF1
* |                        | *
* |*********************   | *
* |**  ** ** ****** ****   | *
* |** * * * ******  ****   | *
* |**  **  ******** ****   | *
* |** * * * ******* ****   | *
* |**  ** ** *   *   ***   | *
* |*********************   | *
L_C0D91
          CON(5)  =DOGROB
          REL(5)  L_C0DD5
          CON(5)  #8
          CON(5)  #15
          NIBHEX  000000
          NIBHEX  FFFFF1
          NIBHEX  3BD7C1
          NIBHEX  BAEFD1
          NIBHEX  33F7C1
          NIBHEX  BAE7F1
          NIBHEX  3B54C1
          NIBHEX  FFFFF1
* |                        | *
* |*********************   | *
* |**  ** ** *****   ***   | *
* |** * * * ******** ***   | *
* |**  **  *******   ***   | *
* |** * * * ****** *****   | *
* |**  ** ** *   *   ***   | *
* |*********************   | *
L_C0DD5
          CON(5)  =DOGROB
          REL(5)  L_C0E19
          CON(5)  #8
          CON(5)  #15
          NIBHEX  000000
          NIBHEX  FFFFF1
          NIBHEX  3BD7C1
          NIBHEX  BAEFD1
          NIBHEX  33FFC1
          NIBHEX  BAEFD1
          NIBHEX  3B54C1
          NIBHEX  FFFFF1
* |                        | *
* |*********************   | *
* |**  ** ** *****   ***   | *
* |** * * * ******** ***   | *
* |**  **  ********  ***   | *
* |** * * * ******** ***   | *
* |**  ** ** *   *   ***   | *
* |*********************   | *
L_C0E19
          CON(5)  =DOGROB
          REL(5)  L_C0E5D
          CON(5)  #8
          CON(5)  #15
          NIBHEX  000000
          NIBHEX  FFFFF1
          NIBHEX  3BDFD1
          NIBHEX  BAEFC1
          NIBHEX  33F7D1
          NIBHEX  BAE781
          NIBHEX  3B5CD1
          NIBHEX  FFFFF1
* |                        | *
* |*********************   | *
* |**  ** ** ******* ***   | *
* |** * * * *******  ***   | *
* |**  **  ******* * ***   | *
* |** * * * ******    **   | *
* |**  ** ** *   *** ***   | *
* |*********************   | *
L_C0E5D
RPL
    }
    OVER COERCE NTHELCOMP DROP SWAP COERCE 4PICK ' DOAPWL
    THREE # 2D9D COMPN TOTEMPOB TWO{}N
  ;
  XYZ>ZXY
;
*******************************************************************************
NULLNAME XLIB_324_F
::
  DUP XLIB_324_B SWAP %2 %= ITE
  ::
    ITE
ASSEMBLE
        CON(5)  =DOGROB
        REL(5)  L_C0F33
        CON(5)  #8
        CON(5)  #15
        NIBHEX  000000
        NIBHEX  300081
        NIBHEX  11E011
        NIBHEX  968C31
        NIBHEX  54EC71
        NIBHEX  962C31
        NIBHEX  11E011
        NIBHEX  300081
* |                        | *
* |**                 **   | *
* |*   *    ***    *   *   | *
* |*  * **    *  ****  *   | *
* |* *   *  ***  ***** *   | *
* |*  * **  *    ****  *   | *
* |*   *    ***    *   *   | *
* |**                 **   | *
L_C0F33
        CON(5)  =DOGROB
        REL(5)  L_C0F77
        CON(5)  #8
        CON(5)  #15
        NIBHEX  000000
        NIBHEX  300081
        NIBHEX  10E011
        NIBHEX  108C31
        NIBHEX  10EC71
        NIBHEX  102C31
        NIBHEX  10E011
        NIBHEX  300081
* |                        | *
* |**                 **   | *
* |*        ***    *   *   | *
* |*          *  ****  *   | *
* |*        ***  ***** *   | *
* |*        *    ****  *   | *
* |*        ***    *   *   | *
* |**                 **   | *
L_C0F77
RPL
  ;
  ::
    ITE
ASSEMBLE
        CON(5)  =DOGROB
        REL(5)  L_C0FCA
        CON(5)  #8
        CON(5)  #15
        NIBHEX  000000
        NIBHEX  300081
        NIBHEX  114011
        NIBHEX  966C31
        NIBHEX  544C71
        NIBHEX  964C31
        NIBHEX  11E011
        NIBHEX  300081
* |                        | *
* |**                 **   | *
* |*   *     *     *   *   | *
* |*  * **  **   ****  *   | *
* |* *   *   *   ***** *   | *
* |*  * **   *   ****  *   | *
* |*   *    ***    *   *   | *
* |**                 **   | *
L_C0FCA
        CON(5)  =DOGROB
        REL(5)  L_C100E
        CON(5)  #8
        CON(5)  #15
        NIBHEX  000000
        NIBHEX  300081
        NIBHEX  104011
        NIBHEX  106C31
        NIBHEX  104C71
        NIBHEX  104C31
        NIBHEX  10E011
        NIBHEX  300081
* |                        | *
* |**                 **   | *
* |*         *     *   *   | *
* |*        **   ****  *   | *
* |*         *   ***** *   | *
* |*         *   ****  *   | *
* |*        ***    *   *   | *
* |**                 **   | *
L_C100E
RPL
  ;
  ONE {}N
;
LOCALLABEL LibCfg324
::
  # 324 TOSRRP
;
*******************************************************************************
LOCALLABEL LibEnd324
ASSEMBLE
    CON(5)  (*)-L_C0012
L_C1149
    CON(2)  6
    NIBASC  'DOC804'
    CON(2)  6
      CON(5)  =DOCSTR
      REL(5)  L_C1797
      NIBASC  'Super SWITCH for 48GX\n'
      NIBASC  '\AF\AF\AF\AF\AF\AF\AF\AF\AF\AF\AF\AF\AF\AF\AF\AF\AF\AF\AF\AF\AF\n'
      NIBASC  ' ********************\n'
      NIBASC  ' * Switch une carte *\n'
      NIBASC  ' * en port 1 ou 2 ! *\n'
      NIBASC  ' *  Utilisable en   *\n'
      NIBASC  ' *  port 1 ou 2     *\n'
      NIBASC  ' ********************\n'
      NIBASC  '\n'
      NIBASC  '\n'
      NIBASC  '  +---------------+\n'
      NIBASC  '  | DOCUMENTATION |\n'
      NIBASC  '  +---------------+\n'
      NIBASC  '\n'
      NIBASC  'Pr\E9liminaire\n'
      NIBASC  '\AF\AF\AF\AF\AF\AF\AF\AF\AF\AF\AF\AF\AF\n'
      NIBASC  'Il faut stocker sur\n'
      NIBASC  'chaque banc la variable\n'
      NIBASC  'BANK de la forme x.y\n'
      NIBASC  'x \8D num\E9ro du banc\n'
      NIBASC  'y \8D nb total de bancs\n'
      NIBASC  '\n'
      NIBASC  'Exemple :\n'
      NIBASC  '1.4 :1:BANK STO\n'
      NIBASC  '{Pour une carte 512Ko}\n'
      NIBASC  '{Configur\E9e en banc 1}\n'
      NIBASC  '\n'
      NIBASC  'SW: (Aucune entr\E9e)\n'
      NIBASC  '\AF\AF\n'
      NIBASC  'Utilitaire donnant le\n'
      NIBASC  'num\E9ro du banc selectionn\E9\n'
      NIBASC  'en Inversion Video et\n'
      NIBASC  'les bancs disponibles\n'
      NIBASC  'et switchables \n'
      NIBASC  'ainsi que la position\n'
      NIBASC  'de la protection en\n'
      NIBASC  '\E9criture.Pour les 2\n'
      NIBASC  'ports.\n'
      NIBASC  '\n'
      NIBASC  '\n'
      NIBASC  'BS1: (num\E9ro du banc)\n'
      NIBASC  '\AF\AF\AF\n'
      NIBASC  'Switch la carte en port\n'
      NIBASC  '1 sur le banc demand\E9\n'
      NIBASC  '\n'
      NIBASC  '\n'
      NIBASC  'BS2: (num\E9ro du banc)\n'
      NIBASC  '\AF\AF\AF\n'
      NIBASC  'Switch la carte en port\n'
      NIBASC  '2 sur le banc demand\E9'

A bit strange is the lack of argument checks for BS1 and BS2 (prior to using SWAP), which are commands accessible to the user. If you simply execute these commands (with no arguments), you could possibly crash the calculator (usage of SysRPL command SWAP without guaranteeing sufficient arguments; oddly the checks come after SWAP).

Anyway, the code uses UNCNFG at address #C0000h to unconfigure card slot 2 (if necessary) and does a series of reads at #FFFF?h. This suggests that there is probably an additional chip on the card that acts as a latch. This also suggests that it may not work correctly for an HP48SX with cards in both slots.

As for a warmstart, it appears to be designed into the program. When you request a bankswitch, it sets up an alarm that does a warmstart and configures the ports. (I was wrong earlier w/ respect to my warmstart comments.) Perhaps you may want to check that the bank was actually switched as a warmstart is not a cause for alarm (pun optional).

Graph 3D | QPI | SolveSys
Find all posts by this user
Quote this message in a reply
Post Reply 


Messages In This Thread
RE: '91 TDS 256KB RAM Card for the HP-48 SX - Han - 03-22-2015 11:22 PM



User(s) browsing this thread: 1 Guest(s)