> SMFree/src v0.10 6 List free memory in relocatable sideways modules , 28-Feb-1999 v0.10 JGH: Initial version (: 27OSASCI=&FFE3:OSWRCH=&FFEE:OSNEWL=&FFE7:OSBYTE=&FFF4 <- mcode% &300:load%=&FFFF0900:ver$="0.10" F*addr=&A8:total=&AA:num=total:pad=num+3 P: Z P=0 1 dP%=load%:O%=mcode% n[OPT P*2+4 x.txtMessage .txtPlus :EQUS " + ":EQUB 0 #.txtTotal:EQUS "Total: ":EQUB 0 .txtComma:EQUS ", ":EQUB 0 *.txtBytes:EQUS " bytes":EQUB 13:EQUB 0 : .exec% ;LDA #0:LDX #1:JSR OSBYTE :\ Find machine type ATXA:BNE ListStart :\ If not Electron, X<>&00 CLDA #&05:STA ROMSEL+1 :\ Change to Electron ROMSEL .ListStart LDA #0:LDX #3 .ListZero 1STA total,X:DEX:BPL ListZero :\ total=0 : ;LDA &F4:PHA:LDX #15 :\ Start with ROM 15 .ScanRomLoop "JSR SelectRom ,8LDA #&BF:STA addr+1 :\ Start at &BFFE 6LDA #&FE:STA addr+0 @;LDY #0:SEC :\ SEC on first pass J.lp1 T6LDA (addr),Y: &BFFF:BNE found :\ Byte different ^;LDA addr+0:BNE P%+4:DEC addr+1 :\ Decrement address hDEC addr+0 rACLC:LDA addr+1:BMI lp1 :\ Loop while still in ROM |D :\ Ends at &7FFF for full ROM  .found KJSR IncAddr:JSR IncAddr1 :\ Increment addr to first free byte 8LDA #&FF:JSR PrHex :\ Print FFFxyyyy LDA &F4:A #&F0:JSR PrHex 4LDX #addr+1-addr:LDY #2:JSR PrAddr :\ Print addr 5LDX #txtPlus-txtMessage:JSR PrMsg :\ Print ' + ' SEC 9LDA #&00:SBC addr+0:STA addr+0 :\ addr=free space 9LDA #&C0:SBC addr+1:STA addr+1 :\ addr=&C000-addr :LDX #addr+1-addr:LDY #2:JSR PrAddr :\ Print free space :JSR AddTotal :\ total=total+free : LDA #" ":JSR OSWRCH:LDX #0  .romtitle 9LDA &8009,X :\ Print ROM title ACMP #" ":BCC romtitledone :\ Stop at invalie character &CMP #&7F:BCS romtitledone 0JSR OSWRCH:INX:BNE romtitle :.romtitledone DJSR OSNEWL N:LDX &F4:DEX:BPL ScanRomLoop :\ Step to next ROM X: b8LDX #txtTotal-txtMessage:JSR PrMsg :\ Print 'Total ' l&LDA total+1:ADC addr+1:STA total+1 H"LDA total+2:ADC #0:STA total+2 RRTS \: f .PrAddr pLDA addr,X:JSR PrHex zDEX:DEY:BNE PrAddr RTS :  .PrMsg "LDA txtMessage,X:BEQ PrMsgDone JSR OSASCI:INX:BNE PrMsg .PrMsgDone RTS :  .PrHex PHA:LSR A:LSR A:LSR A:LSR A JSR PrNyb:PLA  .PrNyb  #15:CMP #10:BCC PrDigit ADC #6:.PrDigit ADC #"0":JMP OSWRCH : $!\ Print 24-bit decimal number .!\ --------------------------- 8 .PrDec24 B8LDY #6*3-3 :\ 6 digits L.PrDec24Lp1 VCLDX #&FF:SEC :\ Start with digit=-1 `.PrDec24Lp2 jELDA num+0:SBC PrDecTens+0,Y:STA num+0 :\ Subtract current tens t)LDA num+1:SBC PrDecTens+1,Y:STA num+1 ~)LDA num+2:SBC PrDecTens+2,Y:STA num+2 =INX:BCS PrDec24Lp2 :\ Loop until <0 HLDA num+0:ADC PrDecTens+0,Y:STA num+0 :\ Add current tens back in )LDA num+1:ADC PrDecTens+1,Y:STA num+1 )LDA num+2:ADC PrDecTens+2,Y:STA num+2 BTXA:BNE PrDec24Digit :\ Not zero, print it >LDA pad:BNE PrDec24Print:BEQ PrDec24Next :\ pad<>0, use it .PrDec24Digit BLDX #"0":STX pad :\ No more zero padding =A #"0" :\ Print this digit .PrDec24Print JSR OSWRCH .PrDec24Next CDEY:DEY:DEY:BPL PrDec24Lp1 :\ Loop for next digit  RTS : .PrDecTens (EQUW 1 :EQUB 1 65536 2EQUW 10 :EQUB 10 65536 < EQUW 100 :EQUB 100 65536 F!EQUW 1000 :EQUB 1000 65536 P"EQUW 10000 :EQUB 10000 65536 Z#EQUW 100000:EQUB 100000 65536 d: nEQUS "v"+ver$ x] E" *Save SMFree ";~mcode%;" ";~O%;" ";~exec%&FFFF0000;" ";~load%