diff options
Diffstat (limited to 'docs/os12/mdfs.net/Docs/Comp/BBC/OS1-20/D940')
| -rw-r--r-- | docs/os12/mdfs.net/Docs/Comp/BBC/OS1-20/D940 | 1 | 
1 files changed, 1 insertions, 0 deletions
| diff --git a/docs/os12/mdfs.net/Docs/Comp/BBC/OS1-20/D940 b/docs/os12/mdfs.net/Docs/Comp/BBC/OS1-20/D940 new file mode 100644 index 0000000..1c5c51c --- /dev/null +++ b/docs/os12/mdfs.net/Docs/Comp/BBC/OS1-20/D940 @@ -0,0 +1 @@ +*************************************************************************
*************************************************************************
**                                                                     **
**      SYSTEM STARTUP                                                 **
**                                                                     **
*************************************************************************
*************************************************************************
* DEFAULT PAGE &02 SETTINGS (VECTORS, OSBYTE VARIABLES)
* RESET CODE
*************************************************************************
*                                                                       *
*       DEFAULT SYSTEM SETTINGS FOR PAGE &02                            *
*                                                                       *
*************************************************************************
-------------------------------------------------------------------------
|                                                                       |
|       DEFAULT VECTOR TABLE                                            |
|                                                                       |
-------------------------------------------------------------------------
D940	DW  &E310	; USERV				&200
D942	DW  &DC54	; BRKV 				&202
D944	DW  &DC93	; IRQ1V				&204
D946	DW  &DE89	; IRQ2V				&206
D948	DW  &DF89	; CLIV 				&208
D94A	DW  &E772	; BYTEV				&20A
D94C	DW  &E7EB	; WORDV				&20C
D94E	DW  &E0A4	; WRCHV				&20E
D950	DW  &DEC5	; RDCHV				&210
D952	DW  &F27D	; FILEV				&212
D954	DW  &F18E	; ARGSV				&214
D956	DW  &F4C9	; BGETV				&216
D958	DW  &F529	; BPUTV				&218
D95A	DW  &FFA6	; GBPBV				&21A
D95C	DW  &F3CA	; FINDV				&21C
D95E	DW  &F1B1	; FSCV 				&21E
D960	DW  &FFA6	; EVNTV				&220
D962	DW  &FFA6	; UPTV 				&222
D964	DW  &FFA6	; NETV 				&224
D966	DW  &FFA6	; VDUV 				&226
D968	DW  &EF02	; KEYV 				&228
D96A	DW  &E4B3	; INSBV				&22A
D96C	DW  &E464	; REMVB				&22C
D96E	DW  &E1D1	; CNPV 				&22E
D970	DW  &FFA6	; IND1V				&230
D972	DW  &FFA6	; IND2V				&232
D974	DW  &FFA6	; IND3V				&234
-------------------------------------------------------------------------
|                                                                       |
|       DEFAULT MOS VARIABLES SETTINGS                                  |
|                                                                       |
-------------------------------------------------------------------------
* Read/Written by OSBYTE &A6 to &FC
D976	DW  &0190   ; OSBYTE variables base address          &236   *FX166/7
		    ; (address to add to osbyte number)
D978	DB  &0D9F   ; Address of extended vectors            &238   *FX168/9
D97A	DB  &02A1   ; Address of ROM information table       &23A   *FX170/1
D97C	DB  &F02B   ; Address of key translation table       &23C   *FX172/3
D97E	DB  &0300   ; Address of VDU variables               &23E   *FX174/5
D980	DB  &00     ; CFS/Vertical sync Timeout counter      &240   *FX176
D981	DB  &00     ; Current input buffer number            &241   *FX177
D982	DB  &FF     ; Keyboard interrupt processing flag     &242   *FX178
D983	DB  &00     ; Primary OSHWM (default PAGE)           &243   *FX179
D984	DB  &00     ; Current OSHWM (PAGE)                   &244   *FX180
D985	DB  &01     ; RS423 input mode                       &245   *FX181
D986	DB  &00     ; Character explosion state              &246   *FX182
D987	DB  &00     ; CFS/RFS selection, CFS=0 ROM=2         &247   *FX183
D988	DB  &00     ; Video ULA control register copy        &248   *FX184
D989	DB  &00     ; Pallette setting copy                  &249   *FX185
D98A	DB  &00     ; ROM number selected at last BRK        &24A   *FX186
D98B	DB  &FF     ; BASIC ROM number                       &24B   *FX187
D98C	DB  &04     ; Current ADC channel number             &24C   *FX188
D98D	DB  &04     ; Maximum ADC channel number             &24D   *FX189
D98E	DB  &00     ; ADC conversion 0/8bit/12bit            &24E   *FX190
D98F	DB  &FF     ; RS423 busy flag (bit 7=0, busy)        &24F   *FX191
D990	DB  &56     ; ACIA control register copy             &250   *FX192
D991	DB  &19     ; Flash counter                          &251   *FX193
D992	DB  &19     ; Flash mark period count                &252   *FX194
D993	DB  &19     ; Flash space period count               &253   *FX195
D994	DB  &32     ; Keyboard auto-repeat delay             &254   *FX196
D995	DB  &08     ; Keyboard auto-repeat rate              &255   *FX197
D996	DB  &00     ; *EXEC file handle                      &256   *FX198
D997	DB  &00     ; *SPOOL file handle                     &257   *FX199
D998	DB  &00     ; Break/Escape handing                   &258   *FX200
D999	DB  &00     ; Econet keyboard disable flag           &259   *FX201
D99A	DB  &20     ; Keyboard status                        &25A   *FX202
		    ;  bit 3=1 shift pressed
		    ;  bit 4=0 caps  lock
		    ;  bit 5=0 shift lock
		    ;  bit 6=1 control bit
		    ;  bit 7=1 shift enabled
D99B	DB  &09     ; Serial input buffer full threshold     &25B   *FX203
D99C	DB  &00     ; Serial input suppression flag          &25C   *FX204
D99D	DB  &00     ; Cassette/RS423 flag (0=CFS, &40=RS423) &25D   *FX205
D99E	DB  &00     ; Econet OSBYTE/OSWORD interception flag &25E   *FX206
D99F	DB  &00     ; Econet OSRDCH interception flag        &25F   *FX207
D9A0	DB  &00     ; Econet OSWRCH interception flag        &260   *FX208
D9A1	DB  &50     ; Speech enable/disable flag (&20/&50)   &261   *FX209
D9A2	DB  &00     ; Sound output disable flag              &262   *FX210
D9A3	DB  &03     ; BELL channel number                    &263   *FX211
D9A4	DB  &90     ; BELL amplitude/Envelope number         &264   *FX212
D9A5	DB  &64     ; BELL frequency                         &265   *FX213
D9A6	DB  &06     ; BELL duration                          &266   *FX214
D9A7	DB  &81     ; Startup message/!BOOT error status     &267   *FX215
D9A8	DB  &00     ; Length of current soft key string      &268   *FX216
D9A9	DB  &00     ; Lines printed since last paged halt    &269   *FX217
D9AA	DB  &00     ; 0-(Number of items in VDU queue)       &26A   *FX218
D9AB	DB  &09     ; TAB key value                          &26B   *FX219
D9AC	DB  &1B     ; ESCAPE character                       &26C   *FX220
	; The following are input buffer code interpretation variables for
	; bytes entered into the input buffer with b7 set (is 128-255).
	; The standard keyboard only enters characters &80-&BF with the
	; function keys, but other characters can be entered, for instance
	; via serial input of via other keyboard input systems.
	; 0=ignore key
	; 1=expand as soft key
	; 2-FF add to base for ASCII code
D9AD	DB  &01     ; C0-&CF                                 &26D   *FX221
D9AE	DB  &D0     ; D0-&DF                                 &26E   *FX222
D9AF	DB  &E0     ; E0-&EF                                 &26F   *FX223
D9B0	DB  &F0     ; F0-&FF                                 &270   *FX224
D9B1	DB  &01     ; 80-&8F function key                    &271   *FX225
D9B2	DB  &80     ; 90-&9F Shift+function key              &272   *FX226
D9B3	DB  &90     ; A0-&AF Ctrl+function key               &273   *FX227
D9B4	DB  &00     ; B0-&BF Shift+Ctrl+function key         &274   *FX228
D9B5	DB  &00     ; ESCAPE key status (0=ESC, 1=ASCII)     &275   *FX229
D9B6	DB  &00     ; ESCAPE action                          &276   *FX230
D9B7	DB  &FF     ; USER 6522 Bit IRQ mask                 &277   *FX231
D9B8	DB  &FF     ; 6850 ACIA Bit IRQ bit mask             &278   *FX232
D9B9	DB  &FF     ; System 6522 IRQ bit mask               &279   *FX233
D9BA	DB  &00     ; Tube prescence flag                    &27A   *FX234
D9BB	DB  &00     ; Speech processor prescence flag        &27B   *FX235
D9BC	DB  &00     ; Character destination status           &27C   *FX236
D9BD	DB  &00     ; Cursor editing status                  &27D   *FX237
****************** Soft Reset high water mark ***************************
D9BE	DB  &00     ; unused                                 &27E   *FX238
D9BF	DB  &00     ; unused                                 &27F   *FX239
D9C0	DB  &00     ; Country code                           &280   *FX240
D9C1	DB  &00     ; User flag                              &281   *FX241
D9C2	DB  &64     ; Serial ULA control register copy       &282   *FX242
D9C3	DB  &05     ; Current system clock state             &283   *FX243
D9C4	DB  &FF     ; Soft key consitancy flag               &284   *FX244
D9C5	DB  &01     ; Printer destination                    &285   *FX245
D9C6	DB  &0A     ; Printer ignore character               &286   *FX246
   	
****************** Hard Reset High water mark ***************************
   	
D9C7	DB  &00     ; Break Intercept Vector JMP opcode      &288   *FX247
D9C8	DB  &00     ; Break Intercept Vector address low     &288   *FX248
D9C9	DB  &00     ; Break Intercept Vector address high    &289   *FX249
D9CA	DB  &00     ; unused (memory used for VDU)           &28A   *FX250
D9CB	DB  &00     ; unused (memory used for display)       &28B   *FX251
D9CC	DB  &FF     ; Current language ROM number            &28C   *FX252
   	
****************** Power-On Reset High Water mark ***********************
**************************************************************************
**************************************************************************
**                                                                      **
**      RESET (BREAK) ENTRY POINT                                       **
**                                                                      **
**      Power up Enter with nothing set, 6522 System VIA IER bits       **
**      0 to 6 will be clear                                            **
**                                                                      **
**      BREAK IER bits 0 to 6 one or more will be set 6522 IER          **
**      not reset by BREAK                                              **
**                                                                      **
**************************************************************************
**************************************************************************
D9CD	LDA #&40    ;set NMI first instruction to RTI
D9CF	STA &0D00   ;NMI ram start
D9D2	SEI         ;disable interrupts just in case
D9D3	CLD         ;clear decimal flag
D9D4	LDX #&FF    ;reset stack to where it should be
D9D6	TXS         ;(&1FF)
D9D7	LDA &FE4E   ;read interupt enable register of the system VIA
D9DA	ASL         ;shift bit 7 into carry
D9DB	PHA         ;save what's left
D9DC	BEQ &D9E7   ;if Power up A=0 so D9E7
D9DE	LDA &0258   ;else if BREAK pressed read BREAK Action flags (set by
		    ;*FX200,n)
D9E1	LSR         ;divide by 2
D9E2	CMP #&01    ;if (bit 1 not set by *FX200)
D9E4	BNE &DA03   ;then &DA03
D9E6	LSR         ;divide A by 2 again (A=0 if *FX200,2/3 else A=n/4
********** clear memory routine ******************************************
D9E7	LDX #&04    ;get page to start clearance from (4)
D9E9	STX &01     ;store it in ZP 01
D9EB	STA &00     ;store A at 00
D9ED	TAY         ;and in Y to set loop counter
   	
D9EE	STA (&00),Y ;clear store
D9F0	CMP &01     ;until address &01 =0
D9F2	BEQ &D9FD   ;
D9F4	INY         ;increment pointer
D9F5	BNE &D9EE   ;if not zero loop round again
D9F7	INY         ;else increment again (Y=1) this avoids overwriting
   		    ;RTI instruction at &D00
D9F8	INX         ;increment X
D9F9	INC &01     ;increment &01
D9FB	BPL &D9EE   ;loop until A=&80 then exit
   		    ;note that RAM addressing for 16k loops around so
   		    ;&4000=&00 hence checking &01 for 00.  This avoids
   		    ;overwriting zero page on BREAK
D9FD	STX &028E   ;writes marker for available RAM 40 =16k,80=32
DA00	STX &0284   ;write soft key consistency flag
**+********** set up system VIA *****************************************
DA03	LDX #&0F    ;set PORT B to output on bits 0-3 Input 4-7
DA05	STX &FE42   ;
*************************************************************************
*                                                                       *
*        set addressable latch IC 32 for peripherals via PORT B         *
*                                                                       *
*       ;bit 3 set sets addressed latch high adds 8 to VIA address      *
*       ;bit 3 reset sets addressed latch low                           *
*                                                                       *
*       Peripheral              VIA bit 3=0             VIA bit 3=1     *
*                                                                       *
*       Sound chip              Enabled                 Disabled        *
*       speech chip (RS)        Low                     High            *
*       speech chip (WS)        Low                     High            *
*       Keyboard Auto Scan      Disabled                Enabled         *
*       C0 address modifier     Low                     High            *
*       C1 address modifier     Low                     High            *
*       Caps lock  LED          ON                      OFF             *
*       Shift lock LED          ON                      OFF             *
*                                                                       *
*       C0 & C1 are involved with hardware scroll screen address        *
*************************************************************************
   	;X=&F on entry
DA08	DEX         ;loop start
DA09	STX &FE40   ;write latch IC32
DA0C	CPX #&09    ;is it 9
DA0E	BCS &DA08   ;if so go back and do it again
   		    ;X=8 at this point
   		    ;Caps lock On, SHIFT lock undetermined
   		    ;Keyboard Autoscan on
   		    ;sound disabled (may still sound)
DA10	INX         ;X=9
DA11	TXA         ;A=X
DA12	JSR &F02A   ;interrogate keyboard
DA15	CPX #&80    ;for keyboard links 9-2 and CTRL key (1)
DA17	ROR &FC     ;rotate MSB into bit 7 of &FC
DA19	TAX         ;get back value of X for loop
DA1A	DEX         ;decrement it
DA1B	BNE &DA11   ;and if >0 do loop again
   		    ; on exit if Carry set link 3 made
   		    ;link 2 = bit 0 of &FC and so on
   		    ;if CTRL pressed bit 7 of &FC=1
   		    ;X=0
DA1D	STX &028D   ;clear last BREAK flag
DA20	ROL &FC     ;CTRL is now in carry &FC is keyboard links
DA22	JSR &EEEB   ;set LEDs carry on entry  bit 7 of A on exit
DA25	ROR         ;get carry back into carry flag
****** set up page 2 ****************************************************
DA26	LDX #&9C    ;
DA28	LDY #&8D    ;
DA2A	PLA         ;get back A from &D9DB
DA2B	BEQ &DA36   ;if A=0 power up reset so DA36 with X=&9C Y=&8D
DA2D	LDY #&7E    ;else Y=&7E
DA2F	BCC &DA42   ;and if not CTRL-BREAK DA42 WARM RESET
DA31	LDY #&87    ;else Y=&87 COLD RESET
DA33	INC &028D   ;&28D=1
DA36	INC &028D   ;&28D=&28D+1
DA39	LDA &FC     ;get keyboard links set
DA3B	EOR #&FF    ;invert
DA3D	STA &028F   ;and store at &28F
DA40	LDX #&90    ;X=&90
**********: set up page 2 *************************************************
   	;on entry    &28D=0 Warm reset, X=&9C, Y=&7E
   		    ;&28D=1 Power up  , X=&90, Y=&8D
   		    ;&28D=2 Cold reset, X=&9C, Y=&87
DA42	LDA #&00    ;A=0
DA44	CPX #&CE    ;zero &200+X to &2CD
DA46	BCC &DA4A   ;
DA48	LDA #&FF    ;then set &2CE to &2FF to &FF
DA4A	STA &0200,X ;
DA4D	INX         ;
DA4E	BNE &DA44   ;
   		    ;A=&FF X=0
DA50	STA &FE63   ;set port A of user via to all outputs (printer out)
DA53	TXA         ;A=0
DA54	LDX #&E2    ;X=&E2
DA56	STA &00,X   ;zero zeropage &E2 to &FF
DA58	INX         ;
DA59	BNE &DA56   ;X=0
DA5B	LDA &D93F,Y ;copy data from &D93F+Y
DA5E	STA &01FF,Y ;to &1FF+Y
DA61	DEY         ;until
DA62	BNE &DA5B   ;1FF+Y=&200
DA64	LDA #&62    ;A=&62
DA66	STA &ED     ;store in &ED
DA68	JSR &FB0A   ;set up ACIA
   		    ;X=0
************** clear interrupt and enable registers of Both VIAs ********
DA6B	LDA #&7F    ;
DA6D	INX         ;
DA6E	STA &FE4D,X ;
DA71	STA &FE6D,X ;
DA74	DEX         ;
DA75	BPL &DA6E   ;
DA77	CLI         ;briefly allow interrupts to clear anything pending
DA78	SEI         ;disallow again N.B. All VIA IRQs are disabled
DA79	BIT &FC     ;if bit 6=1 then JSR &F055 (normally 0)
DA7B	BVC &DA80   ;else DA80
DA7D	JSR &F055   ;F055 JMP (&FDFE) probably causes a BRK unless
   		    ;hardware there redirects it.
   		    ;
DA80	LDX #&F2    ;enable interrupts 1,4,5,6 of system VIA
DA82	STX &FE4E   ;
   		    ;0      Keyboard enabled as needed
   		    ;1      Frame sync pulse
   		    ;4      End of A/D conversion
   		    ;5      T2 counter (for speech)
   		    ;6      T1 counter (10 mSec intervals)
   		    ;
DA85	LDX #&04    ;set system VIA PCR
DA87	STX &FE4C   ;
   		    ;CA1 to interrupt on negative edge (Frame sync)
   		    ;CA2 Handshake output for Keyboard
   		    ;CB1 interrupt on negative edge (end of conversion)
   		    ;CB2 Negative edge (Light pen strobe)
   		    ;
DA8A	LDA #&60    ;set system VIA ACR
DA8C	STA &FE4B   ;
   		    ;disable latching
   		    ;disable shift register
   		    ;T1 counter continuous interrupts
   		    ;T2 counter timed interrupt
DA8F	LDA #&0E    ;set system VIA T1 counter (Low)
DA91	STA &FE46   ;
   		    ;this becomes effective when T1 hi set
DA94	STA &FE6C   ;set user VIA PCR
   		    ;CA1 interrupt on -ve edge (Printer Acknowledge)
   		    ;CA2 High output (printer strobe)
   		    ;CB1 Interrupt on -ve edge (user port)
   		    ;CB2 Negative edge (user port)
DA97	STA &FEC0   ;set up A/D converter
   		    ;Bits 0 & 1 determine channel selected
   		    ;Bit 3=0 8 bit conversion bit 3=1 12 bit
DA9A	CMP &FE6C   ;read user VIA IER if = &0E then DAA2 chip present
DA9D	BEQ &DAA2   ;so goto DAA2
DA9F	INC &0277   ;else increment user VIA mask to 0 to bar all
   		    ;user VIA interrupts
DAA2	LDA #&27    ;set T1 (hi) to &27 this sets T1 to &270E (9998 uS)
DAA4	STA &FE47   ;or 10msec, interrupts occur every 10msec therefore
DAA7	STA &FE45   ;
DAAA	JSR &EC60   ;clear the sound channels
DAAD	LDA &0282   ;read serial ULA control register
DAB0	AND #&7F    ;zero bit 7
DAB2	JSR &E6A7   ;and set up serial ULA
DAB5	LDX &0284   ;get soft key status flag
DAB8	BEQ &DABD   ;if 0 (keys OK) then DABD
DABA	JSR &E9C8   ;else reset function keys
*************************************************************************
*                                                                       *
*       Check sideways ROMS and make rom list                           *
*                                                                       *
*************************************************************************
   	
   		    ;X=0
DABD	JSR &DC16   ;set up ROM latch and RAM copy to X
DAC0	LDX #&03    ;set X to point to offset in table
DAC2	LDY &8007   ;get copyright offset from ROM
   		    ; DF0C = ")C(",0
DAC5	LDA &8000,Y ;get first byte
DAC8	CMP &DF0C,X ;compare it with table byte
DACB	BNE &DAFB   ;if not the same then goto DAFB
DACD	INY         ;point to next byte
DACE	DEX         ;(s)
DACF	BPL &DAC5   ;and if still +ve go back to check next byte
   		    ;this point is reached if 5 bytes indicate valid
   		    ;ROM (offset +4 in (C) string)
*************************************************************************
* Check first 1k of each ROM against higher priority Roms to ensure that*
* there are no matches, if a match found ignore lower priority ROM      *
*************************************************************************
DAD1	LDX &F4     ;get RAM copy of ROM No. in X
DAD3	LDY &F4     ;and Y
DAD5	INY         ;increment Y to check
DAD6	CPY #&10    ;if ROM 15 is current ROM
DAD8	BCS &DAFF   ;if equal or more than 16 goto &DAFF
   		    ;to store catalogue byte
DADA	TYA         ;else put Y in A
DADB	EOR #&FF    ;invert it
DADD	STA &FA     ;and store at &FA
DADF	LDA #&7F    ;store &7F at
DAE1	STA &FB     ;&FB to get address &7FFF-Y
DAE3	STY &FE30   ;set new ROM
DAE6	LDA (&FA),Y ;Get byte
DAE8	STX &FE30   ;switch back to previous ROM
DAEB	CMP (&FA),Y ;and compare with previous byte called
DAED	BNE &DAD5   ;if not the same then go back and do it again
   		    ;with next rom up
DAEF	INC &FA     ;else increment &FA to point to new location
DAF1	BNE &DAE3   ;if &FA<>0 then check next byte
DAF3	INC &FB     ;else inc &FB
DAF5	LDA &FB     ;and check that it doesn't exceed
DAF7	CMP #&84    ;&84 (1k checked)
DAF9	BCC &DAE3   ;then check next byte(s)
DAFB	LDX &F4     ;X=(&F4)
DAFD	BPL &DB0C   ;if +ve then &DB0C
DAFF	LDA &8006   ;get rom type
DB02	STA &02A1,X ;store it in catalogue
DB05	AND #&8F    ;check for BASIC (bit 7 not set)
DB07	BNE &DB0C   ;if not BASIC the DB0C
DB09	STX &024B   ;else store X at BASIC pointer
DB0C	INX         ;increment X to point to next ROM
DB0D	CPX #&10    ;is it 15 or less
DB0F	BCC &DABD   ;if so goto &DABD for next ROM
OS SERIES V
GEOFF COX
*************************************************************************
*                                                                       *
*       Check SPEECH System                                             *
*                                                                       *
*************************************************************************
    	            ;X=&10
DB11	BIT &FE40   ;if bit 7 low then we have speech system fitted
DB14	BMI &DB27   ;else goto DB27
DB16	DEC &027B   ;(027B)=&FF to indicate speech present
DB19	LDY #&FF    ;Y=&FF
DB1B	JSR &EE7F   ;initialise speech generator
DB1E	DEX         ;via this
DB1F	BNE &DB19   ;loop
    	            ;X=0
DB21	STX &FE48   ;set T2 timer for speech
DB24	STX &FE49   ;
*********** SCREEN SET UP **********************************************
    	            ;X=0
DB27	LDA &028F   ;get back start up options (mode)
DB2A	JSR &C300   ;then jump to screen initialisation
DB2D	LDY #&CA    ;Y=&CA
DB2F	JSR &E4F1   ;to enter this in keyboard buffer
    	            ;this enables the *KEY 10 facility
********* enter BREAK intercept with Carry Clear ************************
DB32	JSR &EAD9   ;check to see if BOOT address is set up, if so
    	            ;JMP to it
DB35	JSR &F140   ;set up cassette options
DB38	LDA #&81    ;test for tube to FIFO buffer 1
DB3A	STA &FEE0   ;
DB3D	LDA &FEE0   ;
DB40	ROR         ;put bit 0 into carry
DB41	BCC &DB4D   ;if no tube then DB4D
DB43	LDX #&FF    ;else
DB45	JSR &F168   ;issue ROM service call &FF
    	            ;to initialise TUBE system
DB48	BNE &DB4D   ;if not 0 on exit (Tube not initialised) DB4D
DB4A	DEC &027A   ;else set tube flag to show it's active
DB4D	LDY #&0E    ;set current value of PAGE
DB4F	LDX #&01    ;issue claim absolute workspace call
DB51	JSR &F168   ;via F168
DB54	LDX #&02    ;send private workspace claim call
DB56	JSR &F168   ;via F168
DB59	STY &0243   ;set primary OSHWM
DB5C	STY &0244   ;set current OSHWM
DB5F	LDX #&FE    ;issue call for Tube to explode character set etc.
DB61	LDY &027A   ;Y=FF if tube present else Y=0
DB64	JSR &F168   ;and make call via F168
DB67	AND &0267   ;if A=&FE and bit 7 of 0267 is set then continue
DB6A	BPL &DB87   ;else ignore start up message
DB6C	LDY #&02    ;output to screen
DB6E	JSR &DEA9   ;'BBC Computer ' message
DB71	LDA &028D   ;0=warm reset, anything else continue
DB74	BEQ &DB82   ;
DB76	LDY #&16    ;by checking length of RAM
DB78	BIT &028E   ;
DB7B	BMI &DB7F   ;and either
DB7D	LDY #&11    ;
DB7F	JSR &DEA9   ;finishing message with '16k' or '32k'
DB82	LDY #&1B    ;and two newlines
DB84	JSR &DEA9   ;
*********: enter BREAK INTERCEPT ROUTINE WITH CARRY SET (call 1)
DB87	SEC         ;
DB88	JSR &EAD9   ;look for break intercept jump do *TV etc
DB8B	JSR &E9D9   ;set up LEDs in accordance with keyboard status
DB8E	PHP         ;save flags
DB8F	PLA         ;and get back in A
DB90	LSR         ;zero bits 4-7 and bits 0-2 bit 4 which was bit 7
DB91	LSR         ;may be set
DB92	LSR         ;
DB93	LSR         ;
DB94	EOR &028F   ;eor with start-up options which may or may not
DB97	AND #&08    ;invert bit 4
DB99	TAY         ;Y=A
DB9A	LDX #&03    ;make fs initialisation call, passing boot option in Y
DB9C	JSR &F168   ;Eg, RUN, EXEC or LOAD !BOOT file
DB9F	BEQ &DBBE   ;if a ROM accepts this call then DBBE
DBA1	TYA         ;else put Y in A
DBA2	BNE &DBB8   ;if Y<>0 DBB8
DBA4	LDA #&8D    ;else set up standard cassete baud rates
DBA6	JSR &F135   ;via &F135
DBA9	LDX #&D2    ;
DBAB	LDY #&EA    ;
DBAD	DEC &0267   ;decrement ignore start up message flag
DBB0	JSR OSCLI   ;and execute */!BOOT
DBB3	INC &0267   ;restore start up message flag
DBB6	BNE &DBBE   ;if not zero then DBBE
DBB8	LDA #&00    ;else A=0
DBBA	TAX         ;X=0
DBBB	JSR &F137   ;set tape speed
******** Preserve current language on soft RESET ************************
DBBE	LDA &028D   ;get last RESET Type
DBC1	BNE &DBC8   ;if not soft reset DBC8
DBC3	LDX &028C   ;else get current language ROM address
DBC6	BPL &DBE6   ;if +ve (language available) then skip search routine
*************************************************************************
*                                                                       *
*       SEARCH FOR LANGUAGE TO ENTER (Highest priority)                 *
*                                                                       *
*************************************************************************
DBC8	LDX #&0F    ;set pointer to highest available rom
DBCA	LDA &02A1,X ;get rom type from map
DBCD	ROL         ;put hi-bit into carry, bit 6 into bit 7
DBCE	BMI &DBE6   ;if bit 7 set then ROM has a language entry so DBE6
DBD0	DEX         ;else search for language until X=&ff
DBD1	BPL &DBCA   ;
*************** check if tube present ***********************************
DBD3	LDA #&00    ;if bit 7 of tube flag is set BMI succeeds
DBD5	BIT &027A   ;and TUBE is connected else
DBD8	BMI &DC08   ;make error
********* no language error ***********************************************
DBDA	BRK         ;
DBDB	DB  &F9     ;error number
DBDC	DB  'Language?'     ;message
DBE5	BRK         ;
DBE6	CLC         ;
*************************************************************************
*                                                                       *
*       OSBYTE 142 - ENTER LANGUAGE ROM AT &8000                        *
*                                                                       *
*       X=rom number C set if OSBYTE call clear if initialisation       *
*                                                                       *
*************************************************************************
DBE7	PHP         ;save flags
DBE8	STX &028C   ;put X in current ROM page
DBEB	JSR &DC16   ;select that ROM
DBEE	LDA #&80    ;A=128
DBF0	LDY #&08    ;Y=8
DBF2	JSR &DEAB   ;display text string held in ROM at &8008,Y
DBF5	STY &FD     ;save Y on exit (end of language string)
DBF7	JSR OSNEWL  ;two line feeds
DBFA	JSR OSNEWL  ;are output
DBFD	PLP         ;then get back flags
DBFE	LDA #&01    ;A=1 required for language entry
DC00	BIT &027A   ;check if tube exists
DC03	BMI &DC08   ;and goto DC08 if it does
DC05	JMP &8000   ;else enter language at &8000
*************************************************************************
*                                                                       *
*       TUBE FOUND, ENTER TUBE SOFTWARE                                 *
*                                                                       *
*************************************************************************
DC08	JMP &0400   ;enter tube environment
*************************************************************************
*                                                                       *
*       OSRDRM entry point                                              *
*                                                                       *
*       get byte from PHROM or page ROM                                 *
*       Y= rom number, address is in &F6/7                              *
*************************************************************************
DC0B	LDX &F4     ;get current ROM number into X
DC0D	STY &F4     ;store new number in &F4
DC0F	STY &FE30   ;switch in ROM
DC12	LDY #&00    ;get current PHROM address
DC14	LDA (&F6),Y ;and get byte
******** Set up Sideways Rom latch and RAM copy *************************
    	    ;on entry X=ROM number
DC16	STX &F4     ;RAM copy of rom latch
DC18	STX &FE30   ;write to rom latch
DC1B	RTS         ;and return
\ No newline at end of file | 
