10 REM > HighRom/src
   20 REM Demonstrate using high workspace
   30 :
   40 OSWRCH=&FFEE:OSNEWL=&FFE7:OSASCI=&FFE3:OSFILE=&FFDD
   50 DIM mcode% &1000
   60 FOR P=0 TO 1
   70   P%=&8000:O%=mcode%
   80   [OPT P*3+4
   90   BRK:BRK:BRK:JMP Service
  100   EQUB &82:EQUB Copy-&8000
  110   EQUB &00:EQUS "TESTROM"
  120   .Copy
  130   EQUB &00:EQUS "(C)"
  140   EQUB &00
  150   :
  160   .Service
  170   PHA:LDA &DF0,X                      :\ Get workspace flags
  180   BMI P%+4:EOR #&40                   :\ Toggle bit 6 if bit 7 is zero
  190   ASL A:BPL ServDisabled:PLA          :\ Exit if the resultant bit 6 is clear
  200   :
  210   \ Do the service call dispatch
  220   CMP #&24:BEQ Serv24  :\ How much high w/s needed
  230   CMP #&22:BEQ Serv22  :\ Claim high workspace
  240   CMP #&02:BEQ Serv02  :\ Claim low workspace
  250   :
  260   CMP #&09:BEQ Serv09  :\ Test code
  270   RTS
  280   :
  290   .ServDisabled
  300   PLA:RTS                             :\ Restore service call and return
  310   
  320   
  330   \ -----------------------------------------------------------
  340   \ SERVICE &24 - State how much private Hazel workspace needed
  350   \ -----------------------------------------------------------
  360   .Serv24
  370   DEY:RTS                           :\ Need one page of private workspace
  380   :
  390   \ -------------------------------------------
  400   \ SERVICE &22 - Claim Hazel private workspace
  410   \ -------------------------------------------
  420   .Serv22
  430   CPY #&DC:BCC P%+4:LDY #&DC        :\ If run out of Hazel, point to top of Hazel
  440   TYA:STA &DF0,X                    :\ Note location of private workspace
  450   INY:LDA #&22:RTS                  :\ Claim one page of workspace and return
  460   :
  470   \ ---------------------------------------
  480   \ SERVICE 2 - Claim private low workspace
  490   \ ---------------------------------------
  500   .Serv02
  510   LDA OSFILE:CMP #&6C:BCS Serv2bbc  :\ Always claim low workspace on BBC
  520   LDA &DF0,X                        :\ Get workspace pointer
  530   CMP #&DC:BCC Serv2done            :\ If we haven't run out of Hazel, use it
  540   .Serv2bbc
  550   TYA:STA &DF0,X                    :\ Note location of private workspace
  560   INY                               :\ Use one page of low workspace
  570   .Serv2done
  580   \ ROMs often do Break initialisation here
  590   LDA #2:RTS                        :\ Restore and exit
  600   :
  610   \ Test code, display something with *HELP
  620   .Serv09
  630   LDX #0
  640   .Serv09lp
  650   LDA Serv09Text,X:BEQ Serv09b
  660   JSR OSASCI:INX:BNE Serv09lp
  670   .Serv09b
  680   LDX &F4:LDA &DF0,X:JSR PrHex
  690   LDA #ASC"0":JSR OSWRCH:JSR OSWRCH
  700   JSR OSNEWL
  710   LDA #9:RTS
  720   .Serv09Text
  730   EQUB 13:EQUS "Workspace at &":EQUB 0
  740   .PrHex
  750   PHA:LSR A:LSR A:LSR A:LSR A:JSR PrNyb:PLA
  760   .PrNyb
  770   AND #15:CMP #10:BCC P%+4:ADC #6:ADC #48:JMP OSWRCH
  780   :
  790   \ Set (ws) to point to my workspace
  800   .FindWS
  810   LDX &F4:LDA &DF0,X:STA ws+1:LDA #0:STA ws+0:RTS
  820 ]NEXT
  830 PRINT"*SAVE HIGHROM ";~mcode%;" ";~O%