10 REM > ROMHdr6/s
   20 REM 18-Jan-2001 v0.01 Service code matches *help/*command with ROM title.
   30 REM                   *Help prints ROM title and whole version string.
   40 REM 15-Aug-2005 v0.02 *Help prints ROM title and version number only.
   50 REM 28-Nov-2008 v0.03 *Help optimised slightly.
   60 REM 15-Aug-2015 v0.04 Simple non-matched *Help, claims *BASIC command.
   70 REM 03-Oct-2015 v0.05 Watches for Tube being set up to disables other ROMs
   80 REM                   if not for this cpu and claim *BASIC, checks for
   90 REM                   Master giving 'Not a language' on Reset.
  100 REM 17-Oct-2015 v0.06 Checks the CPU on the other side of the Tube.
  110 :
  120 OSWRCH=&FFEE:OSNEWL=&FFE7:OSBYTE=&FFF4:OSWORD=&FFF1:BRKV=&202
  130 REM cpu%=2:cpuid%=&A2
  140 cpu%=7:cpuid%=&77
  150 :
  160 DIM mcode% &200
  170 FOR P=0 TO 1
  180   P%=&8000:O%=mcode%
  190   [OPT P*3+4
  200   .HeaderStart
  210   CLC:BCC Language
  220   JMP  Service                         :\ Service entry
  230   EQUB &E0+cpu%                        :\ Service+Language+Tube+6502
  240   EQUB HeaderCopyright-HeaderStart
  250   EQUB 0                               :\ Version byte
  260   EQUS "PDP11 BASIC":EQUB 0            :\ ROM title
  270   EQUS "0.20 (10 Mar 2009)"            :\ Version string
  280   .HeaderCopyright
  290   EQUB 0:EQUS "(C) J.G.Harston":EQUB 0 :\ Copyright message
  300   EQUD &0000B000                       :\ Tube transfer address
  310   EQUD HeaderCode-HeaderStart          :\ Offset to Tube execution address
  320   :
  330   .Language
  340   .LangLoop
  350   LDA #ASC">":JSR &FFEE
  360   LDA #ASC"*":JSR &FFEE
  370   LDA #0:STA &70
  380   LDA #7:STA &71
  390   LDA #255:STA &72
  400   LDA #032:STA &73
  410   LDA #255:STA &74
  420   LDX #&70:LDY #0:LDA #0:JSR OSWORD
  430   BCS Escape
  440   LDX #0:LDY #7:JSR &FFF7
  450   CLC:BCC LangLoop
  460   .Escape
  470   LDA #126:JSR OSBYTE
  480   LDA #ASC"E":JSR &FFEE
  490   LDA #ASC"S":JSR &FFEE
  500   LDA #ASC"C":JSR &FFEE
  510   JSR &FFE7
  520   CLC:BCC LangLoop
  530   EQUS "---"
  540   :
  550   :
  560   \ Code has to be position independent to become byte code
  570   .Service
  580   PHA
  590   CMP #&01:BEQ ServCheckTube         :\ Check if Tube present
  600   \CMP #&0F:\BEQ ServCheckROMs       :\ Check ROMs
  610   CMP #&11:BEQ ServCheckROMs         :\ Check ROMs, BBC
  620   CMP #&27:BEQ ServCheckROMs         :\ Check ROMs, Master
  630   CMP #&06:BEQ ServError             :\ Check for 'Not a language'
  640   CMP #&09:BNE ServReturn            :\ Not *Help
  650   :
  660   LDA (&F2),Y:CMP #13:BNE ServReturn :\ Not *Help <cr>
  670   JSR OSNEWL:LDX #0                  :\ Display *Help message
  680   .HelpLp
  690   LDA &8009,X:BNE HelpChar:LDA #32   :\ Convert &00 to space
  700   .HelpChar
  710   CMP #ASC"(":BEQ HelpDone           :\ End at version date
  720   JSR OSWRCH:INX:BNE HelpLp          :\ Print character and loop
  730   .HelpDone
  740   JSR OSNEWL:PLA:RTS
  750   :
  760   .ServCheckTube
  770   LDA &27A:BMI ServReturn                :\ Tube present, don't disable
  780   .ServLangOff
  790   LDX &F4:LDA &2A1,X:AND #&BF:STA &2A1,X :\ No Tube, remove my language bit
  800   .ServReturn
  810   PLA:RTS
  820   :
  830   .ServError
  840   LDX &F0:LDA &102,X                 :\ Get stacked flags
  850   LSR A:BCS ServReturn               :\ Not entered at Reset
  860   LDY #0:LDA (&FD),Y:BNE ServReturn  :\ Not error &00
  870   .ServErrorLp
  880   ADC (&FD),Y:INY:CPY #23:BNE ServErrorLp
  890   CMP #&EA:BNE ServReturn            :\ Not 'Not a language'
  900   LDX &F4:LDA #142:JMP OSBYTE        :\ Enter myself, then error if disabled
  910   :
  920   .ServCheckROMs
  930   LDA BRKV+1:BNE ServReturn          :\ BRKVhi>&00, Tube not active
  940   :
  950   \ Look at other side of Tube to check the CPU
  960   TYA:PHA                            :\ Save Y
  970   .ServTubeClaim
  980   LDA #&C0+63:JSR &406:BCC ServTubeClaim :\ Claim Tube with ID=LanguageStart
  990   LDA #&00:PHA:PHA                   :\ Push &0000F800 onto stack
 1000   LDA #&F8:PHA:TSX:LDY #1            :\ XY=>address on stack
 1010   LDA #&00:PHA                       :\ Finish pushing address
 1020   JSR &406                           :\ A=0 - Read bytes from Tube
 1030   PLA:PLA:PLA:PLA:LDX #7             :\ Clear stack and 9us delay
 1040   .ServTubeDelay
 1050   DEX:BNE ServTubeDelay              :\ 7*2.5us = total 26us delay
 1060   LDX &FEE5:LDA #&80+63:JSR &406     :\ Get the byte, release Tube
 1070   PLA:TAY                            :\ Restore Y
 1080   CPX #cpuid%:BNE ServLangOff        :\ Byte not a JMP opcode
 1090   :
 1100   \ CoProcessor is the CPU I want, disable other languages and claim *BASIC
 1110   LDX #15                            :\ Disable other languages
 1120   .ServTubeLp
 1130   LDA &2A1,X:AND #&4F                :\ Get language and CPU bits
 1140   CMP #&40+cpu%:BEQ ServTubeNext     :\ Language for my CPU, leave it
 1150   LDA &2A1,X:AND #&BF:STA &2A1,X     :\ Remove language bit
 1160   .ServTubeNext
 1170   DEX:BPL ServTubeLp
 1180   :
 1190   LDX &28C:BMI ServSetLang           :\ No language yet, make it me
 1200   LDA &2A1,X:AND #&4F                :\ Find current language's ROM type
 1210   CMP #&40+cpu%:BEQ ServSetBasic     :\ If it is my CPU leave it
 1220   .ServSetLang
 1230   LDX &F4:STX &28C                   :\ Make me the current language
 1240   .ServSetBasic
 1250   LDX &F4
 1260   .z%
 1270   LDA &2A1,X:ORA #&40:STA &2A1,X     :\ Ensure my language bit is set
 1280   ]:IF cpu%<>2:z%=P%-z%:P%=P%-z%:O%=O%-z%:REM Remove test code
 1290   [OPT P*3+4
 1300   STX &24B:PLA:RTS                   :\ Claim *BASIC command
 1310   :
 1320   .HeaderCode
 1330 ]NEXT
 1340 PRINT"*SAVE HDR ";~mcode%;" ";~O%