> LDPIC/s  Screen Loader  David Acton/Bruce Smith ( BBC B/B+/M/Electron 2! (c) Acorn User October 1986 < Bugfixed by J.G.Harston F- 14-Feb-1994 Added shadow screen support P+ 22-Dec-2017 Added 12-bit nULA palette Z: dname$="LDPIC":ver$="v2.10" noswrch=&FFEE:osbyte=&FFF4 x*osfind=&FFCE:osbget=&FFD7:osargs=&FFDA ! mcode% &200:load%=&FFFF0900 'addr=&A8:mode=&A8:bits=&AA:data=&AB *byte=&AC:count=&AD:dbits=&AE:cbits=&AF :  opt%=4 7 3 O%=mcode%:P%=load% [OPT opt% $.stack:BRK:.chn:BRK:.startHi:BRK .step:BRK:.pass:BRK ] O%=mcode%:P%=load% [OPT opt% .errSyntax ,BRK:EQUB 220:EQUS "Syntax: LDPIC " .errNotFound *BRK:EQUB 214:EQUS "File not found":BRK ": ,.go% 6start for this pass :  .mainlp 8JSR read1bit:BCC forward :\ 0=immediate data 6LDX cbits:JSR readbits:STA count :\ Get byte count 0LDX dbits:JSR readbits:\STA byte :\ Get byte  LDY #&00  .goback 2LDA byte:STA (addr),Y :\ Store byte 6JSR addmove :\ Update address  ADEC count:BNE goback :\ Loop to store these bytes  BEQ next  : * .forward 40LDX dbits:JSR readbits :\ Get byte >2LDY #&00:STA (addr),Y :\ Store byte H6JSR addmove :\ Update address R: \ .next fBLDA addr+1:BPL mainlp :\ Still within screen memory p7DEC pass:BNE dopass :\ Do another pass z:  .align GLDA #0:STA bits :\ Flush to align to byte boundary .LDA #&7F:LDX chn:JSR osbyte :\ Read  TXA:PHA : JLDA #19:JSR osbyte :\ Wait for HSync to minimise flicker 2LDA #&40:STA &FE22 :\ Reset nULA 2LDA &248:STA &FE20 :\ Reset vULA GPLA:BNE setpalette :\ No more file, set 4-bit palette ;\LDA #0 :\ b4-b7=palette index  .rgb12lp ?SEC:SBC #&10:STA dbits :\ Step to next palette index (LDX #4:JSR readbits :\ red 3A dbits:STA &FE23 :\ Store index+red *LDX #4:JSR readbits:ASL A :\ green 8ASL A:ASL A:ASL A:STA cbits :\ Move green to b4-b7 $)LDX #4:JSR readbits :\ blue .4A cbits:STA &FE23 :\ Store green+blue 8LDA dbits:BNE rgb12lp B5JSR read8bits:BEQ setpalette :\ No more settings L .auxlp V:PHA:JSR read8bits:STA &FE22 :\ Set nULA aux register `PLA:SEC:SBC #1:BNE auxlp j: t.setpalette ~3LDX #&0F :\ 16 palette entries  .rgb4lp %LDA #&13:JSR oswrch :\ 19 .TXA:JSR oswrch :\ Colour number 4LDA palette,X:JSR oswrch :\ Set physical colour *LDA #&00:JSR oswrch :\ rgb=0,0,0 JSR oswrch:JSR oswrch DEX:BPL rgb4lp :  .close +LDA &248:STA &FE20 :\ Reset vULA 3LDA #0:JSR vramSelect :\ Page out video RAM 3LDA #0:LDY chn:JMP osfind :\ Close file and end :  .addmove &LDA addr+0:CLC:ADC step:STA addr+0 "LDA addr+1:ADC #&00:STA addr+1 (RTS 2: < .read1bit F7DEC bits:BPL noget :\ Decr. bits remaining P-LDY chn:JSR osbget:BCS eof :\ Get a byte Z3STA data:LDA #7:STA bits :\ 8 bits remaining d .noget n3ASL data:RTS :\ Get bit to carry x.eof >LDX stack:BEQ close :\ Stack not saved, close file ;TXS:BNE setpalette :\ Stack saved, set palette : .read8bits  LDX #8  .readbits TXA:PHA:LDA #0:STA byte  .nextbit =JSR read1bit:ROR byte :\ Move bits into top of byte DEX:BNE nextbit :  PLA:TAX .alignbits CPX #8:BCS return :ROR byte:INX:BNE alignbits :\ Align to bottom of byte  .return " LDA byte , .vramOk 6RTS @: J.vramSelect T;PHA:TAX :\ A=0 main RAM, A=1 video RAM ^LLDA #108:JSR osbyte :\ Attempt to select Master/Integra-B video RAM h2PLA:INX:BNE vramOk :\ X<>255, successful r9 #1:TAX :\ A=1 main RAM, A=0 video RAM |ILDA #111:JMP osbyte :\ Attempt to select Aries/Watford video RAM :  .palette  .modebase KEQUB &30:EQUB &30:EQUB &30:EQUB &40:EQUB &58:EQUB &58:EQUB &60:EQUB &7C  EQUS ver$ : )]: palette+16>&B00:"Code overrun": :"Saving ";name$; K "SAVE "+name$+" "+~mcode%+" "+~O%+" "+~(go%&FFFF0000)+" "+~load%