> SWMode/src v1.20 $ Select thin MODEs 8-14 in SRAM  by J.G.Harston (: 2#assem(0)::assem(2):sm_table 0 - disabled JSR ExplodeChars  .ServEnd PLA:TAY:LDX &F4:PLA:RTS :  .Serv27 $LDA ModeFlag-CodeStart+Intercept 1 #&3F:BNE Serv27End:\ ModeFlag<>0 - disabled LDX #CodeEnd-CodeStart & .Serv27Lp 0#LDA CodeStart,X:STA Intercept,X :DEX:BPL Serv27Lp:LDX &F4 D$STX RomNum+1-CodeStart+Intercept N1LDA wrchv+0:STA OldWRCH+1-CodeStart+Intercept X1LDA wrchv+1:STA OldWRCH+2-CodeStart+Intercept b8LDA #(NewWRCH-CodeStart+Intercept) 255:STA wrchv+0 l8LDA #(NewWRCH-CodeStart+Intercept) 256:STA wrchv+1 v.Serv27End LDA #&27:RTS : .CodeStart <.ModeFlag:\ b7=intercept pending, b6=previously new mode BRK  .NewWRCH $BIT ModeFlag-CodeStart+Intercept BMI ModePending BIT vduq:BMI OldWRCH CMP #22:BEQ ModePending  .OldWRCH  JMP 0 .ModePending PHA:LDA &F4:PHA  .RomNum LDA #0:STA &F4:STA &FE30  JSR DoMode:\ Call ROM code *PLA:STA &F4:STA &FE30 4 PLA:RTS > .CodeEnd H: R .DoMode \/LDA ModeFlag-CodeStart+Intercept:BMI ModeGo f,A #&80:STA ModeFlag-CodeStart+Intercept p+LDA #22:JMP OldWRCH-CodeStart+Intercept z:  .ModeGo -TXA:PHA:TYA:PHA:LDA zp+1:PHA:LDA zp+0:PHA 1TSX:LDA &108,X:PHA :\ Mode number 9JSR OldWRCH-CodeStart+Intercept:\ Complete the call 6TAX:LDA &27C: #2 :\ Check *FX settings 7BNE ModeExitDone :\ output disabled 4LDA &D0:BMI ModeExitDone:TXA :\ 21 in effect  #&7F:CMP #10:BEQ OldMode  #&78:CMP #8:BEQ NewMode :  .OldMode $BIT ModeFlag-CodeStart+Intercept 9BVC ModeExitDone :\ Already in an old =ASL A:BMI ModeExitDone :\ Don't reset if b6 set 1JSR ExplodeChars :\ Reset chars .ModeExitDone $PLA:LDA #0 . .ModeExit 8$STA ModeFlag-CodeStart+Intercept B-PLA:STA zp+0:PLA:STA zp+1:PLA:TAY:PLA:TAX LRTS V: ` .NewMode jJSR WhatOS:BCS ModeExploded tPLA:TAX:PLA: #127 :\ Get table index and back CMP #7:BNE NotMode7 &LDA #2:STA &FE00:LDA #53:STA &FE01  .NotMode7 ;TXA:PHA :\ Save index into table LDA ModeTable+3,X:LSR A LLSR A:LSR A:BEQ ModeColours :\ Don't need to change number of colours 3STA &360:LDA #20:JSR RAWVDU :\ Reset palette  .ModeColours :PLA:TAX :\ Get table index back +LDA ModeTable+0,X:STA &30A :\ Width (/LDA ModeTable+1,X:STA &34F :\ Byte/Char 2,LDA ModeTable+2,X:TAX :\ Cursor <LSR A:BCC ModeAdust F$LDA #&55:STA &363:ASL A:STA &362 PLDA #1:STA &361 Z.ModeAdust d2LDA #154:JSR OSBYTE :\ Set VideoULA n8BIT ModeFlag-CodeStart+Intercept:BVS AlreadyExploded x:  \ Now define thin characters  LDX #32 LDA chars+0:STA zp+0 LDA chars+1:STA zp+1  .defn_lp1  TXA:PHA LDA #23:JSR RAWVDU PLA:PHA:JSR RAWVDU  LDY #0  .defn_lp2 PLA:PHA:LSR A:TYA:PHA LDA (zp),Y:BCC defn_lp3 ASL A:ASL A:ASL A:ASL A  .defn_lp3  #&F0:JSR RAWVDU #PLA:TAY:INY:CPY #8:BNE defn_lp2 ""PLA:TAX:INX:LSR A:BCC defn_lp1 ,TYA:CLC:ADC zp+0:STA zp+0 6LDA #0:ADC zp+1:STA zp+1 @TXA:BNE defn_lp1 J.AlreadyExploded TLDA #&40:JMP ModeExit ^: h .WhatOS rLDA #20:LDX #6:JSR OSBYTE:LDA #25:JMP OSBYTE:\ Reset chars :  EQUB 0 .ModeTable 4\ colours+basemode, ULA value, bytes/char, width 6EQUD &0198084F:\ mode 8 80x32x4 4-colour 0 6EQUD &02D41027:\ mode 9 40x32x16 16-colour 1 QEQUD &82F42013:\ mode 10 20x32x16 256-colour 2 not possible -> 16 colours 6EQUD &1B98084F:\ mode 11 80x25x4 4-colour 3 HEQUD &05840827:\ mode 12 40x32x2 4-colour 4, small-memory 1 HEQUD &7DC11013:\ mode 13 20x32x4 16-colour 5, small-memory 2 6EQUD &1E840827:\ mode 14 40x25x4 4-colour 6 %EQUD &074A0127:\ mode 15 40x25x8 : .chars:EQUW Chars:.Chars &1]:"LOAD ThinSet "+~O%:P%=P%+&380:O%=O%+&380 0RelocTable=P% :: D: Nݤsm_pass(pass%) Xpass%=0:M%=0 bpass%=1:M%=O%-mcode% lP%=&8100-128*(pass%2) vO%=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