> Reset/s 0 Needs to be assembled with 65C12 assembler : (*OSBYTE=&FFF4:OSFILE=&FFDD:OSARGS=&FFDA 2 mcode% &200 <load%=&FFFF0900 F: P P=0 1 ZO%=mcode%:P%=load% d[OPT P*3+4+16 n.go% x%LDA #1:LDX #&A8:LDY #0:JSR OSARGS BLDA (&A8),Y:CMP #13:BEQ reset:TAY \ *RESET or *RESET .reset 3TYA: #7:PHA \ Reduce to 0-7 ALDX #253:LDA #163:JSR OSBYTE \ Initially try OSBYTE call >PLA \ Otherwise, do manually : .ForceReset \ A=RESET type \ 0=Soft Break \ 1=Power On \ 2=Hard Break : FSEI:CLD :\ Disable IRQs, ensure binary mode BLDX #&FF:TXS:PHA :\ Reset stack, save Break type LDA #&8F:LDX #&0C 0LDY #&FF:JSR OSBYTE :\ Claim NMIs "2LDX #&40:STX &0D00 :\ Disable NMIs ,7LDA #0:JSR OSBYTE :\ Read machine type 67LDA &FFFC:STA &A8 :\ &A8/9=>RESET code @LDA &FFFD:STA &A9 J:TXA:BEQ ResetElk :\ Jump if &00=Electron T: ^4LDA #&C0:STA &FEA0 :\ Reset hardware h0LDA #&A0:STA &FEE0 :\ Tube Reset r8LDA #&20:STA &FEE0 :\ Release Tube Reset |0PLA:BEQ ResetJump :\ Soft Break :LSR A:BCC ResetHard :\ Hard Reset is fiddly 6LDA #127:STA &FE4E :\ Reset system VIA .ResetJump 6JMP (&FFFC) :\ Enter RESET code :  .ResetElk =LDA #&C0:STA &FC28 :\ Reset Electron hardware 9LDA #&A0:STA &FCE0 :\ Electron Tube Reset ALDA #&20:STA &FCE0 :\ Release Electron Tube Reset 0PLA:BEQ ResetJump :\ Soft Break .LDY #24:LSR A:BCS ResetElkJump :\ Power On 0TAY:DEX :\ Y=0, X=&FF .ResetElkHard LDA (&A8),Y:INY 2CMP #&20:BNE ResetElkHard :\ Look for JSR INY:INY:LDA (&A8),Y &2CMP #&08:BNE ResetElkHard :\ Look for PHP 0.ResetElkJump :GLDA &F4:A #&F0:STA &FE05 :\ Set up the ULA, set M=Ctrl Pressed DHPHA:PHP :\ Push NotPowerOn, push CTRL pressed NDBMI ResetAddJump :\ Branch to jump into reset code X: b.ResetHard l;LDY #&0F:STY &FE42 :\ SysVIA PortB=iiiioooo v .ResetIO 8DEY:STY &FE40 :\ Write to I/O latch ACPY #&09:BCS ResetIO :\ Loop to set up internal I/O CPX #&03:BCS ResetMaster : \ Read BBC keyboard links  LDX #&09 .ResetBBCLinks LDY #&03:STY &FE40 LDY #&7F:STY &FE43 STX &FE4F:LDX &FE4F GCPX #&80:ROR &FC :\ Rotate keystate in bit 7 into &FC DEX:BNE ResetBBCLinks :ROL &FC :\ &FC holds link state :  0LDY #0 :\ Y=0, X=&FF .ResetBBClp  LDA (&A8),Y:INY *7CMP #&26:BNE ResetBBClp :\ Look for 'ROL zp' 4.ResetAddJump >FTYA:ADC &A8:STA &A8 :\ Update (&A8) to next instruction HLLDA #0:STA &028D:STA &FE00 :\ Initialise last BREAK flag and Elk ULA RFADC &A9:STA &A9 :\ (A8)=>continuation of reset code \ISEC:LDA #2:JMP (&A8) :\ CS=CTRL pressed, jump to RESET code f: p.ResetMaster z LDY #0 .ResetMasterLp1 2LDA (&A8),Y:INY :\ Look for JSR CMP #&20:BNE ResetMasterLp1 >INY:INY:LDA (&A8),Y :\ Check if followed by JMP CMP #&4C:BNE ResetMasterLp1 @INY:LDA (&A8),Y:STA &F6 :\ (F6)=>reset code in ROM 15 INY:LDA (&A8),Y:STA &F7 .ResetMasterLp2 ;JSR ResetROMByte :\ Read byte from ROM 15 4CMP #&E0:BNE ResetMasterLp2 :\ Look for 'CPX' @JSR ResetROMByte :\ Read next byte from ROM 15 9CMP #&80:BNE ResetMasterLp2 :\ Look for 'CPX #&80' ,\ &F6/7 now points to rest of RESET code : ALDA #&53:STA &FE8E :\ Write to hardware I/O RESET  B;LDA #&DC:STA &DF05:STZ &DF04 :\ Point to command line L3STZ &DFDD :\ Clear * flag V)LDX #(ResetCodeEnd-ResetCode-1) &FF `.ResetLoop jLDA ResetCode,X:STA &100,X t1DEX:BPL ResetLoop:TXS :\ Reset stack ~GLDA &F7: #&40 :\ Test if code is in SROM or I/O area ESTA &FE34:STA &FC :\ Set memory map according to &F7 NLDA #&0F:STA &028E :\ Set keypad SHIFT setting, prepare ROM=15 KPHA:SEC:JMP &100 :\ Push <>0=Not PowerOn, CS=CTRL pressed : .ResetCode DSTA &FE30 :\ Page in MOS ROM (IRQs are off) 8JMP (&F6) :\ Jump to RESET code .ResetCodeEnd : .ResetROMByte 4LDA #&40:STA &FE34 :\ Set memory map 8LDA (&F6) :\ Read byte manually