> SVPIC/src  Screen Compressor  David Acton/Bruce Smith ( BBC B/B+/M/E 2! (C) Acorn User October 1986 < Bugfixed by J.G.Harston F- 14-Feb-1994 Added shadow screen support P: Zname$="SVPIC":ver$="v2.00" dosword=&FFF1:osbyte=&FFF4 n*osfind=&FFCE:osbput=&FFD4:osargs=&FFDA x! mcode% &200:load%=&FFFF0900 addr=&A8:bits=&AA:data=&AB byte=&AC:count=&AD:dbits=&AE :  opt%=4 7 3 O%=mcode%:P%=&900 [OPT opt% 8.outch:BRK:.chn:BRK:.startHi:BRK:.step:BRK:.pass:BRK 6.size :BRK:BRK:.step0 :BRK:.cbits0:BRK:.cntmax:BRK 6.small:BRK:BRK:.stepsv:BRK:.cbitsv:BRK:.maxsv :BRK ] O%=mcode%:P%=load% [OPT opt% .errSyntax /BRK:EQUB 220:EQUS "Syntax: SVPIC ":BRK : .go% ":LDX #addr:LDY #0:LDA #1:JSR osargs :\ Get command line ,7LDA (addr),Y:CMP #33:BCC errSyntax :\ No parameters 6LDX addr+0:LDY addr+1 @-LDA #&80:JSR osfind:STA chn :\ Open file J=LDA #&08:STA bits :\ Initialise 8 bits waiting T9LDA #&87:JSR osbyte:TYA:PHA :\ Y=current screen mode ^LDA modebase,Y:STA startHi h6LDA #&84:JSR osbyte :\ Y.b7=shadow screen rTYA:BPL noshadow |5LDA #1:JSR vramSelect :\ Page in video RAM  .noshadow : 9LDY #0:STA addr+0:JSR copy :\ addr=>start of screen BLDX #1:STX dbits:STX pass :\ Find the widest byte in memory  .back10 STX step:LDA dbits =CMP (addr),Y:BCS over8 :\ Skip if data <= test byte 3SEC:ROL dbits :\ Widen test byte 8INX:CPX #8 :\ Incr. number of bits :BCC back10:BCS over9 :\ Loop if still < 8 bits  .over8 .forward11 HALDA size,X:STA small,X :\ This pass the smallest so far RDEX:BPL forward11 \: fA\LDA size+0:\STA small+0 :\ This pass the smallest so far p\LDA size+1:\STA small+1 z\LDA step0:\STA stepsv \LDA cbits0:\STA cbitsv \LDA cntmax:\STA maxsv :  .roll SEC:ROL cntmax ;INC cbits0:LDA cbits0 :\ Try more count bits 8CMP #9:BNE redo :\ Try up to 8 bits 6INC step0:LDA step0 :\ Try more steps :CMP #9:BNE restart :\ Loop up to 8 steps : 5LDA chn:STA outch :\ Enable output ALDA #&08:STA bits :\ Initialise 8 bits waiting 5LDA stepsv:STA step0:JSR write8bits :\ Write step 6LDA cbitsv:STA cbits0:JSR write8bits:\ Write cbits LDA maxsv:STA cntmax @JSR compress :\ Compress the screen data $: . .close 8/LDX #8:LDA #0:JSR writebits :\ Flush output B5LDA #0:JSR vramSelect :\ Page video RAM out L1LDA #0:LDY chn:JMP osfind :\ Close and exit V: `0\ Compress the screen using current settings j .compress tLDA step0:STA step ~SEC:SBC #1:STA pass  .doall start for this pass  .allagain 3LDY #0:LDA (addr),Y :\ Get current byte 9LDY step:CMP (addr),Y :\ Compare with next byte ;BEQ over16 :\ Same, jump to count them 1CLC:JSR write1bit :\ 0=single value /LDY #0:LDA (addr),Y :\ Get the byte 5LDX dbits:JSR writebits :\ Write single value CMP byte:BEQ back11 :\ Loop back if still the same Z: d .setcarry n3SEC:JSR write1bit :\ 1=multiple value x LDA count .LDX cbits0:JSR writebits :\ Write count  LDA byte .LDX dbits:JSR writebits :\ Write value ;BIT addr+1:BPL allagain :\ Loop until end of screen 2BMI forward2 :\ Do another pass :  .forward ;JSR addthem:BPL allagain :\ Loop until end of screen  .forward2 2DEC pass:BPL doall :\ Do another pass RTS : .write1bit 9ROL data :\ Rotate Carry into data 7DEC bits:BNE return :\ Decr. bits remaining ?INC size+0:BNE nohigh :\ Incr. number of bytes output "INC size+1 , .nohigh 68LDY outch:BEQ noput :\ Skip if only counting @7LDA data:JSR osbput :\ Output the data byte J .noput T?LDA #8:STA bits :\ Reset back to 8 bits waiting ^ .return hRTS r: |.write8bits  LDX #8 .writebits 6LSR A :\ Move bit into Carry >PHA:JSR write1bit:PLA :\ Send Carry to output stream 8DEX:BNE writebits :\ Loop for all the bits RTS :  .copy :LDA startHi:STA addr+1 :\ Set addr=screenstart RTS :  .addthem 5LDA addr+0:CLC:ADC step:STA addr+0 :\ Update addr  LDA addr+1:ADC #0:STA addr+1  .vramOk RTS &: 0.vramSelect :;PHA:TAX :\ A=0 main RAM, A=1 video RAM DLLDA #108:JSR osbyte :\ Attempt to select Master/Integra-B video RAM N2PLA:INX:BNE vramOk :\ X<>255, successful X9 #1:TAX :\ A=1 main RAM, A=0 video RAM bILDA #111:JMP osbyte :\ Attempt to select Aries/Watford video RAM l: v.blk  .modebase KEQUB &30:EQUB &30:EQUB &30:EQUB &40:EQUB &58:EQUB &58:EQUB &60:EQUB &7C  EQUS ver$  .end% : #]: end%>&B00:"Code overrun": :"Saving ";name$; J"SAVE "+name$+" "+~mcode%+" "+~O%+" "+~(go%&FFFF0000)+" "+~load%