10 REM Softie (Softie1)
   20 REM Soft key extensions
   30 REM by David Holton
   40 REM for M/C
   50 REM (c) BBC Acorn User May 1991
   60 :
   70 Z%=&5000
   80 zp1=&7A
   90 zp2=zp1+1
  100 copyVec1=zp1+2
  110 copyVec2=zp1+3
  120 copyHi=&93
  130 osasci=&FFE3
  140 osnewl=&FFE7
  150 oswrch=&FFEE
  160 osbyte=&FFF4
  170 oscli=&FFF7
  180 :
  190 FOR N%=4 TO 6 STEP 2
  200   P%=&8000
  210   O%=Z%
  220   [ OPT N%
  230   BRK
  240   BRK
  250   BRK
  260   JMP whatsUpNow
  270   EQUB &82
  280   EQUB offset MOD &100
  290   EQUB &91
  300   .title
  310   EQUS"MR SOFTIE'S Magic Soft-Keys Rom"
  320   BRK
  330   EQUB &0D
  340   EQUS"  FK (flip banks of f1-f9)"
  350   EQUB &0D
  360   EQUS"  SK (show f1-f9)"
  370   EQUB &0D
  380   EQUS"  WK (wipe f1-f9)"
  390   EQUB &0D
  400   EQUB &1B
  410   .offset
  420   BRK
  430   EQUS"(C) BBC Acorn User '91"
  440   BRK
  450   :
  460   ]
  470   O%=Z%+&1000
  480   P%=&9000
  490   [ OPT N%
  500   :
  510   .whatsUpNow
  520   PHA
  530   PHX
  540   PHY
  550   CMP #&27
  560   BEQ pollJmp
  570   CMP #&24
  580   BEQ cpyBkJmp
  590   CMP #&15
  600   BEQ initJmp
  610   CMP #9
  620   BEQ help
  630   CMP #4
  640   BEQ youRang
  650   :
  660   .noClaim
  670   PLY
  680   PLX
  690   PLA
  700   RTS
  710   :
  720   .pollJmp
  730   JMP pollOn
  740   :
  750   .initJmp
  760   LDA &209
  770   INA
  780   BEQ noClaim
  790   JMP initiate
  800   :
  810   .cpyBkJmp
  820   JMP copyBack
  830   :
  840   .help
  850   LDA (&F2),Y
  860   CMP #&0D
  870   BNE notOurHelp
  880   JSR osnewl
  890   LDX #&FF
  900   .helpLoop
  910   INX
  920   LDA title,X
  930   JSR osasci
  940   CMP #&1B
  950   BNE helpLoop
  960   JSR osnewl
  970   .notOurHelp
  980   JMP noClaim
  990   :
 1000   .youRang
 1010   INY
 1020   INY
 1030   LDA (&F2),Y
 1040   CMP #&0D
 1050   BNE notOurs
 1060   DEY
 1070   LDA (&F2),Y
 1080   AND #&DF
 1090   CMP #ASC"K"
 1100   BNE notOurs
 1110   DEY
 1120   LDA (&F2),Y
 1130   AND #&DF
 1140   CMP #ASC"F"
 1150   BEQ flipJmp
 1160   CMP #ASC"S"
 1170   BEQ showJmp
 1180   CMP #ASC"W"
 1190   BEQ wipeJmp
 1200   .notOurs
 1210   JMP noClaim
 1220   :
 1230   .flipJmp
 1240   JMP flip
 1250   :
 1260   .showJmp
 1270   JMP show
 1280   :
 1290   .wipeJmp
 1300   JMP wipe
 1310   :
 1320   .pollOn
 1330   LDA #&16
 1340   JSR osbyte
 1350   JMP noClaim
 1360   :
 1370   .initiate
 1380   SEI
 1390   LDA #oscliTrap MOD &100
 1400   STA &DAB
 1410   LDA #oscliTrap DIV &100
 1420   STA &DAC
 1430   LDA &F4
 1440   STA &DAD
 1450   LDA #&FF
 1460   STA &209
 1470   LDA #&0C
 1480   STA &208
 1490   CLI
 1500   LDA #&17
 1510   JSR osbyte
 1520   JMP noClaim
 1530   :
 1540   .oscliTrap
 1550   JSR &E802
 1560   LDA &701
 1570   AND #&DF
 1580   CMP #ASC"K"
 1590   BNE noNeed
 1600   JSR save
 1610   JSR byeAndy
 1620   .noNeed
 1630   RTS
 1640   :
 1650   .pageInAndy
 1660   LDA &F4
 1670   ORA #&80
 1680   BRA fixRomsel
 1690   :
 1700   .byeAndy
 1710   LDA &F4
 1720   AND #&7F
 1730   .fixRomsel
 1740   STA &FE30
 1750   STA &F4
 1760   RTS
 1770   :
 1780   .testPtrs
 1790   LDY #&10
 1800   .chkLoop
 1810   LDA &8011,Y
 1820   CMP #&80
 1830   BMI fail
 1840   CMP #&84
 1850   BPL fail
 1860   DEY
 1870   BPL chkLoop
 1880   RTS
 1890   .fail
 1900   LDA #&12
 1910   JSR osbyte
 1920   RTS
 1930   :
 1940   .save
 1950   JSR pageInAndy
 1960   JSR testPtrs
 1970   .update
 1980   LDA &800F
 1990   STA &F8
 2000   LDA &8020
 2010   STA &F9
 2020   LDY #&21
 2030   .upDloop
 2040   LDA &8000,Y
 2050   STA store,Y
 2060   DEY
 2070   BPL upDloop
 2080   RTS
 2090   :
 2100   .copyBack
 2110   LDY #&10
 2120   .chkLoop2
 2130   LDA store+&11,Y
 2140   CMP #&80
 2150   BMI copout
 2160   CMP #&84
 2170   BPL copout
 2180   DEY
 2190   BPL chkLoop2
 2200   JSR pageInAndy
 2210   LDY #&21
 2220   .cBloop
 2230   LDA store,Y
 2240   STA &8000,Y
 2250   DEY
 2260   BPL cBloop
 2270   .copout
 2280   JSR byeAndy
 2290   JMP noClaim
 2300   :
 2310   .flip
 2320   JSR pageInAndy
 2330   SEI
 2340   LDY #0
 2350   LDX #4
 2360   LDA #&80
 2370   STA zp2
 2380   STZ zp1
 2390   LDA #copyHi
 2400   STA copyVec2
 2410   STZ copyVec1
 2420   .flipLoop
 2430   LDA (zp1),Y
 2440   STA temp
 2450   LDA (copyVec1),Y
 2460   STA (zp1),Y
 2470   LDA temp
 2480   STA (copyVec1),Y
 2490   INY
 2500   BNE flipLoop
 2510   INC zp2
 2520   INC copyVec2
 2530   DEX
 2540   BNE flipLoop
 2550   CLI
 2560   JSR testPtrs
 2570   JSR update
 2580   :
 2590   .show
 2600   JSR byeAndy
 2610   LDA #&20
 2620   STA zp1
 2630   STA zp2
 2640   LDA &355
 2650   CMP #7
 2660   BNE showGo
 2670   LDA #&82
 2680   STA zp1
 2690   INA
 2700   STA zp2
 2710   .showGo
 2720   JSR osnewl
 2730   LDA #ASC"0"
 2740   .shoLoop
 2750   PHA
 2760   LDA zp1
 2770   JSR oswrch
 2780   PLA
 2790   PHA
 2800   JSR oswrch
 2810   LDA zp2
 2820   JSR oswrch
 2830   PLA
 2840   PHA
 2850   STA shoText+5
 2860   LDX #shoText MOD &100
 2870   LDY #shoText DIV &100
 2880   JSR oscli
 2890   PLA
 2900   INA
 2910   CMP #1+ASC"9"
 2920   BNE shoLoop
 2930   JSR osnewl
 2940   PLY
 2950   PLX
 2960   PLA
 2970   LDA #0
 2980   RTS
 2990   :
 3000   .wipe
 3010   LDA #&12
 3020   JSR osbyte
 3030   JSR pageInAndy
 3040   JSR update
 3050   JMP show
 3060   :
 3070   .shoText
 3080   EQUS"SHOW ?"
 3090   EQUB &0D
 3100   :
 3110   .temp
 3120   BRK
 3130   .store
 3140   ]
 3150 NEXT
 3160 OSCLI "SRWRITE "+STR$~Z%+" "+STR$~(O%+1)+" 8000 7"