10
20
30
40
50
60
70
80
90
100
110 :
120 OSWRCH=&FFEE:OSNEWL=&FFE7:OSBYTE=&FFF4:OSWORD=&FFF1:BRKV=&202
130
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%:
1290 [OPT P*3+4
1300 STX &24B:PLA:RTS :\ Claim *BASIC command
1310 :
1320 .HeaderCode
1330 ]NEXT
1340 PRINT"*SAVE HDR ";~mcode%;" ";~O%