> 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 #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 LDA #&FE:STA addr+0 ;LDY #0:SEC :\ SEC on first pass ".lp1 ,6LDA (addr),Y: &BFFF:BNE found :\ Byte different 6;LDA addr+0:BNE P%+4:DEC addr+1 :\ Decrement address @DEC addr+0 JACLC:LDA addr+1:BMI lp1 :\ Loop while still in ROM TD :\ Ends at &7FFF for full ROM ^ .found hKJSR IncAddr:JSR IncAddr1 :\ Increment addr to first free byte r8LDA #&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 JSR OSWRCH:INX:BNE romtitle .romtitledone JSR OSNEWL &:LDX &F4:DEX:BPL ScanRomLoop :\ Step to next ROM 0: :8LDX #txtTotal-txtMessage:JSR PrMsg :\ Print 'Total ' DDEX:DEY:BNE PrAddr HRTS R: \ .PrMsg f"LDA txtMessage,X:BEQ PrMsgDone pJSR OSASCI:INX:BNE PrMsg z.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 !\ ---------------------------  .PrDec24 8LDY #6*3-3 :\ 6 digits .PrDec24Lp1 CLDX #&FF:SEC :\ Start with digit=-1 $.PrDec24Lp2 .ELDA num+0:SBC PrDecTens+0,Y:STA num+0 :\ Subtract current tens 8)LDA num+1:SBC PrDecTens+1,Y:STA num+1 B)LDA num+2:SBC PrDecTens+2,Y:STA num+2 L=INX:BCS PrDec24Lp2 :\ Loop until <0 VHLDA num+0:ADC PrDecTens+0,Y:STA num+0 :\ Add current tens back in `)LDA num+1:ADC PrDecTens+1,Y:STA num+1 j)LDA num+2:ADC PrDecTens+2,Y:STA num+2 tBTXA: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 EQUW 10 :EQUB 10 65536  EQUW 100 :EQUB 100 65536  !EQUW 1000 :EQUB 1000 65536 "EQUW 10000 :EQUB 10000 65536 #EQUW 100000:EQUB 100000 65536 (: 2EQUS "v"+ver$ <] FE" *Save SMFree ";~mcode%;" ";~O%;" ";~exec%&FFFF0000;" ";~load%