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).