> AP6Count/src v0.05 5 Count RAM on startup and display startup banner = On unexpanded BBC B, SRAM banks will be seen duplicated (/ 10-Oct-2014 v0.01 Initial working version 2) 15-Oct-2014 v0.02 Works on Electron <, 16-Jan-2016 v0.02 Electron AP6 version F/ 20-Jan-2016 v0.03 Compatible with EEPROMs P5 14-Feb-2016 v0.04 Checks for extra TURBO memory Z0 29-Feb-2016 Displays Shadow or Turbo d8 20-May-2016 v0.05 Displays Electron 'Acorn' bitmap n: x#assem(0)::assem(2):sm_table FA$="*SAVE "+fname$+" "+~(mcode%+M%)+" "+~O%+" FFFF0000 FFFBBC00" A$;:A$:  : assem(pass%) fname$="AP6Count" 7OSASCI=&FFE3:OSNEWL=&FFE7:OSWRCH=&FFEE:OSBYTE=&FFF4 ? mcode% 1024,L%-1: Enough space for two copies plus table :  pass%=pass% pass%+1 opt%=sm_pass(pass%)+8+16 [OPT opt% .ROMStart BRK:EQUW RelocTable JMP Service $EQUB &82:EQUB Copyright-ROMStart "EQUB &00:EQUS "RAMCountAP6" ,&EQUB &00:EQUS "0.05 (20 May 2016)" 6.Copyright @+EQUB &00:EQUS "(C)J.G.Harston":EQUB &00 J: T .Service ^PHA hCMP #&01:BEQ RAMCount rCMP #&2B:BEQ RAMCount | .ServExit  PLA:RTS :  .RAMCount .LDA &28D:BEQ ServExit :\ Soft BREAK /LDA &27A:BNE ServExit :\ Tube active DLDA &267:BPL ServExit :\ Startup message already replaced : #&7F:STA &267 :\ Suppress startup message STA &FCD9:STA &FCDB :\ Write protect sideways RAM STA &FCDD:STA &FCDF : 2TYA:PHA :\ Save RAM count :LDX #0:JSR PrMsg :\ Print 'Electron' :  >LDA &FFFC:STA &F6 :\ &F6/7=>start of RESET code LDA &FFFD:STA &F7  .FindAcorn *?LDY #10 :\ Offset to code to check for 47LDA (&F6),Y:CMP #&13:BNE FindAcornNext :\ Not #&13 >DEY H=LDA (&F6),Y:CMP #&A0:BEQ FindAcornFound :\ Found LDY #&13 R.FindAcornNext \INC &F6:BNE FindAcorn fINC &F7:BNE FindAcorn p.FindAcornFound zALDA #&60:BNE AcornCopyByte :\ Put RTS at end of copied code .AcornCopyLp 9LDA (&F6),Y :\ Get byte from MOS ROM .AcornCopyByte 1STA &100,Y :\ Copy to stack ;DEY:BPL AcornCopyLp :\ Copy Acorn drawing code 2JSR &100 :\ Draw the Acorn  LDA #9:JSR OSWRCH:JSR OSWRCH : 5LDX #MsgSha-MsgBase :\ Point to 'Shadow' :LDA &27F:BMI PrExtra :\ Print 'Shadow' if b7=1 6LSR A:BCC PrNoExtra :\ If b0=0, not Turbo 4LDX #MsgTub-MsgBase :\ Point to 'Turbo'  .PrExtra =JSR PrMsg :\ Print 'Shadow' or 'Turbo' .PrNoExtra : $ret.lo, ret.hi, code... gLDA #1:PHA :\ Cy=Elk, A=&01, X=??, Y=count, SP=>&01, ret.lo, ret.hi, code... gTSX :\ Cy=Elk, A=&01, X=SP, Y=count, SP=>&01, ret.lo, ret.hi, code... gINX:INX:INX :\ Cy=Elk, A=&01, X=SP+2, Y=count, SP=>&01, ret.lo, ret.hi, code... mTXA:PHA :\ Cy=Elk, A=SP+3, X=SP+2, Y=count, SP=>SP+3, &01, ret.lo, ret.hi, code... ESEC:ADC #romselect-CodeStart :\ Calculate low byte of SelectRom :STA &102+loop-CodeStart,X :\ Insert JSR SelectRom FADC #(romselect2-romselect) :\ Calculate low byte of SelectRom2 ;STA &104+romselect-CodeStart,X :\ Insert JSR SelectRom2 7LDX #15 :\ Start at X=ROM 15 LDA &8008:CMP &8008:BNE toggle :\ Toggling, must be EEPROM nBPLP:BNE rom :\ NE from earlier, ROM or EEPROM xAINY :\ increment number of RAM banks .rom 9DEX:BPL loop :\ loop for all 16 banks :PLA:TAX :\ restore ROM and return .romselect :LDA #12:JSR &100:\romselect2 :\ do Electron pre-select TXA .romselect2 3STA &F4:STA &FE05:RTS :\ select ROM bank  .CodeEnd : "\ Print messages offset from X "\ ----------------------------  .PrMsg LDA MsgBase,X:BEQ MsgDone JSR OSASCI:INX:BNE PrMsg  .MsgDone "RTS ,: 6#\ Banner messages and RAM sizes @#\ ----------------------------- J .MsgBase T8.MsgElk:EQUB 13:EQUB 7:EQUS "Acorn Electron ":EQUB 0 ^!.MsgSha:EQUS "Shadow ":EQUB 0 h .MsgTub:EQUS "Turbo ":EQUB 0 r: | .RAMlow 8EQUD &64483216 :\ Low BCD of RAM count EQUD &28129680 EQUD &92766044 EQUD &56402408 EQUD &20048872  .RAMhigh 9EQUD &00000000 :\ High BCD of RAM count EQUD &01010000 EQUD &01010101 EQUD &02020202 EQUD &03030202 :  .PrHex PHA:LSR A:LSR A:LSR A:LSR A JSR PrNyb:PLA  .PrNyb &! #15:CMP #10:BCC P%+4:ADC #6 0ADC #"0":JMP OSWRCH :: D+\ Relocation table to make *SMLoad-able N+\ ------------------------------------- X]:RelocTable=P% b: l: vݤsm_pass(pass%) pass%=0:M%=0 pass%=1:M%=O%-mcode% P%=&8100-128*(pass%2) O%=mcode%+M%*(pass%2)2 /pass%=1: O%+M%*2.125>L%:"Code overrun": ="4647",pass%+1,1) : sm_table >base80%=mcode%+M%:base81%=mcode%:byte%=0:count%=0:off%=0: Pbyte80%=base80%?off%:byte81%=base81%?off%: off%>=M%:byte80%=&80:byte81%=&80 ] ((byte81%-byte80%) &FE)<>0 "ERROR: Offset by more than one page at &";~&8000+off% M (byte80% &C0)=&80:byte%=byte%2+128*(byte81%-byte80%):count%=count%+1 1 count%=8:?O%=byte%:O%=O%+1:byte%=0:count%=0 $off%=off%+1:off%>=M% count%=0