> WinSrc  by Alan Blundell  for Master Series only ( (C) BAU July 1990 2@ 30/10/2011 JGH: Updated to use correct OSWORD block layout <: F 7:ver$="2.00" P =&7000 Z vars d "Assembling ROM..." n pass=4 6 2 x "Pass ";(pass-2)2 P%=&8000:O%=&7000 romhead windows   "Calculating checksums"; !checksum("begin","comcheck") !checksum("comcheck","clear") checksum("clear","open6") "checksum("open6","calcstart") $checksum("calcstart","colconv") "checksum("colconv","restore") &checksum("restore","bottomright")  '"Press SPACE to save code.":=32 A"SAVE WINDOWS"+ver$,1)+ver$,3)+" 7000 "+~O%+" 0 FFFBBC00"  ": , vars 6osbyte=&FFF4:oswrch=&FFEE @osnewl=&FFE7:osasci=&FFE3 Jgsread=&FFC5:gsinit=&FFC2 Tosrdsc=&FFB9:oswrsc=&FFB3 ^wrscptr=&D6 hoswnum=&EF:oswptr=&F0 rrdscptr=&F6 | VDU variables graphl=&300:graphb=&302 graphr=&304:grapht=&306 textl=&308:textb=&309 textr=&30A:textt=&30B originX=&30C:originY=&30E cursorX=&310:cursorY=&312 #oldcursorX=&314:oldcursorY=&316 Xpos=&318:Ypos=&319 screenstart=&34E byteschar=&34F  TLHC=&350 bytesrow=&352  mode=&355 forecol=&357:backcol=&358 plotfore=&35B:plotback=&35C gforecol=&36D:gbackcol=&36E & ZP usage 0addr=&A8:temp=&AA:count=&AB : screen=&AC:mult=&AC:byte=&AE Drepeat=&AF N OSWORD block variables Xoswwin=193:oswbase=0 boswcmd=oswbase+2 loswres=oswbase+3 voswblk=oswbase+4  :  romhead  [OPT pass  .begin EQUB 0:EQUW 0 JMP serviceentry  EQUB &82 EQUB (copyright-&8000) EQUB ver$  .title EQUS "WINDOWS":EQUB 0  EQUS ver$ .copyright EQUB 0  EQUS "(C)1988 Alan Blundell"  EQUB 0  \ *.serviceentry 4PHP > CMP #4:BNE P%+5:JMP comcheck H CMP #8:BNE P%+5:JMP oswcheck RCMP #9:BEQ help \CMP #39:BEQ reset f PLP:RTS p\ z .reset PHA:PHX:PHY JSR wclear  JMP out \  .help PHA:PHX:PHY CLD:CLC:JSR gsinit BEQ helptitle:LDX #255  .loop1 INX:LDA helpstring,X BEQ ourhelp JSR gsread A #32:CMP helpstring,X  BEQ loop1 CMP #".":BEQ ourhelp  JMP out $\ ..helpstring 8EQUS "windows"+0 B\ L.helptitle V JSR print ` EQUB 13:EQUS "WINDOWS "+ver$ jEQUB 13:EQUS " WINDOWS" t EQUB 13 ~NOP  JMP out \  .ourhelp  JSR print  EQUB 13 EQUS "WINDOWS "+ver$+13 .EQUS " WCLEAR clears any window data"+13 4EQUS " (automatically cleared on break)"+13 5EQUS " WFREE displays remaining data space"+13 4EQUS " WBACK makes previous window active"+13 0EQUS " WFORE makes next window active"+13 :EQUS " OSWORD "+oswwin+" to open/close a window"+13 NOP  JMP outdone \  .comcheck (PHA:PHX:PHY 2CLD:SEC:JSR gsinit <BNE gsok:JMP out F .gsok PLDX #0:JSR setjmp ZJSR gsread d CMP #"X" nBEQ notprefix xDEY .notprefix  STY temp  .loop2 JSR gsread CMP #".":BEQ gotcom A #32:CMP commands,X BNE nextcom INX:LDA commands,X BMI gotcom:BPL loop2  .nextcom INX:LDA commands,X BPL nextcom JSR setjmp  LDY temp LDA commands,X CMP #&FF:BNE loop2 " JMP out , .gotcom 6 STY temp @JMP (addr) J\ T .setjmp ^LDA commands,X:STA addr+1 h!INX:LDA commands,X:STA addr+0 r INX:RTS |\  .oswcheck PHA:PHX:PHY LDA oswnum CMP #oswwin:BNE out LDY #oswcmd LDA (oswptr),Y CMP #10:BCS out  ASL A  TAY:LDA ostable,Y:STA addr+0  INY:LDA ostable,Y:STA addr+1 JSR getcoords JMP (addr) \  .ostable EQUW closeall EQUW close &EQUW release 0EQUW open3 :EQUW open4 DEQUW open5 NEQUW open6 XEQUW open7 bEQUW open8 lEQUW open9 v\ .out PLY:PLX:PLA:PLP RTS \  .outdone PLY:PLX:PLA LDA #0:PLP RTS \  .errors PLA:STA addr+0 PLA:STA addr+1  LDY #1  .loop3  LDA (addr),Y:BEQ skip1 STA &101,Y  INY:BNE loop3 * .skip1 4STA &101,Y:STA &100 >STX &101:JMP &100 H\ R .print \ STY temp fPLA:STA addr+0 pPLA:STA addr+1 z LDY #0  .loop4 #INC addr+0:BNE skip2:INC addr+1  .skip2 LDA (addr),Y CMP #&EA:BEQ endtext JSR osasci \BIT &FF:\BMI esc  JMP loop4  .endtext  LDY temp JMP (addr) \  \.esc \LDA #126:\JSR osbyte \JSR osnewl:\LDX #17 \JSR errors $\EQUS "Escape" .\BRK 8\ B .hexout LPHA VLSR A:LSR A `LSR A:LSR A j JSR pchar tPLA ~ .pchar  #&0F:CLC ADC #"0" CMP #"9"+1 BCC skip3:ADC #6 .skip3 JMP oswrch \ .commands 1EQUB clear 256:EQUB clear 256:EQUS "wclear" 0EQUB free 256:EQUB free 256:EQUS "wfree" 0EQUB wback 256:EQUB wback 256:EQUS "wback" 0EQUB wfore 256:EQUB wfore 256:EQUS "wfore" EQUD &FFFFFFFF ]  : ( windows 2 [OPT pass <\ F .clear PJSR wclear ZJMP outdone d\ n .wclear xLDA #data 256 STA ptrlo:STA activelo LDA #data 256 STA ptrhi:STA activehi RTS \ .free JSR osnewl LDA #"&":JSR oswrch SEC:LDA #&FF SBC ptrlo:PHA LDA #&BF:SBC ptrhi JSR hexout:PLA JSR hexout  JSR print *EQUS " bytes free for window data"+13 NOP "JMP outdone ,\ 6 .wback @LDA activelo JCMP #data 256:BNE skip4 TLDA activehi ^CMP #data 256:BNE skip4 h LDX #134 rJSR errors |EQUS "No window active" BRK .skip4 JSR activetoaddr JSR pointblock JSR storeheader JSR moveback JSR pointblock JSR restore LDA #&2E JSR incaddr JSR setactive JMP outdone \  .wfore JSR checkptr $LDA ptrlo:CMP activelo:BNE skip5 &$LDA ptrhi:CMP activehi:BNE skip5 0 LDX #132 :JSR errors D%EQUS "Last window already active" NBRK X .skip5 bJSR ptrtoaddr l .loop5 vJSR pointblock LDY #&2C:LDA (addr),Y CMP activelo:BNE skip6 INY:LDA (addr),Y CMP activehi:BEQ skip7 .skip6 JSR moveback JMP loop5 .skip7 LDA addr+0:PHA LDA addr+1:PHA JSR moveback JSR pointblock JSR storeheader PLA:STA addr+1 PLA:STA addr+0 JSR restore LDA #&2E *JSR incaddr 4JSR setactive >JMP outdone H\ R \ Window command 2 - Release \ \ -------------------------- f .release pJSR checkptr zJSR ptrtoaddr JSR pointblock JSR moveback JSR setptr JSR checkactive JMP outdone \ *\ Window command 0 - Close all windows *\ ------------------------------------ .closeall &LDA ptrlo:CMP #data 256:BNE skip8 &LDA ptrhi:CMP #data 256:BNE skip8 JMP outdone .skip8 JSR closewindow JMP closeall \ $-\ Window command 1 - Close current window .-\ --------------------------------------- 8 .close BJSR checkptr LJSR closewindow VJMP outdone `\ j.closewindow tJSR ptrtoaddr ~JSR pointblock JSR moveback JSR pointblock JSR restore  LDA #&2E JSR incaddr JSR setptr JSR checkactive  LDY #0  .loop6 LDA (addr),Y STA coords,Y INY  CPY #4  BCC loop6  LDA #4 JSR incaddr (JSR calcstart 2 LDY #0 <STY repeat F .rows P LDA left Z STA count dLDA screen+0 nSTA wrscptr+0 xLDA screen+1 STA wrscptr+1  .cols LDX byteschar  .chars JSR unpack JSR oswrsc INC wrscptr+0  BNE skip9 INC wrscptr+1  .skip9 DEX  BNE chars  INC count  LDA count  CMP right  BNE cols "JSR nextrow , INC top 6 LDA top @CMP bottom J BNE rows TRTS ^\ h\ Window command 6 r\ ---------------- | .open6 JSR square JMP open67 \ \ Window command 7 \ ----------------  .open7  JSR round JMP open67 \ \ Window command 8 \ ----------------  .open8 JSR square JMP open89 \ \ Window command 9 &\ ---------------- 0 .open9 : JSR round DJMP open89 N\ X .open89 bJSR checkmode l LDA top vSEC  SBC #3 BMI open6789out  STA top JSR setframe  LDA #166 JSR doline LDA topright JSR oswrch  LDA #169 JSR oswrch $LDY #oswblk+6 :\ ->title colours JSR setcols  LDX left INX  JSR ptitle  CPX right  BCS skip10 * LDA #32 4JSR doline > .skip10 H#LDY #oswblk+8 :\ ->edge colours RJSR setcols \ LDA #169 fJSR oswrch p LDX left z LDA #171 JSR oswrch INX  LDA #166 JSR doline  LDA #173 JSR oswrch  LDY top INY INY INY JMP doframe \ .open6789out JSR getcoords  JMP open5 \ $ .open67 .JSR checkmode 8 DEC top BBMI open6789out LJSR setframe V%LDY #oswblk+6 :\ -> title colours `JSR setcols j LDX left tINX ~JSR ptitle #LDY #oswblk+8 :\ ->edge colours JSR setcols  CPX right BCS skip11  LDA #166 JSR doline  .skip11 LDA topright JSR oswrch  LDY top INY JMP doframe \  .setframe  DEC left BMI open6789out ( LDY mode 2 INC right < LDA right FCMP colstable,Y PBCS open6789out ZINC bottom dLDA bottom nCMP rowstable,Y xBCS open6789out JSR ptrtoaddr JSR pointblock JSR storeheader JSR ptrtoaddr JSR storesc JSR setwind #LDY #oswblk+8 :\ ->edge colours JSR setcols  LDA #12 JSR oswrch LDA topleft JSR oswrch  LDX left INX RTS \ " .doframe , LDX left 6 LDA #169 @JSR oswrch J LDA #32 TINX ^JSR doline h LDA #169 rJSR oswrch |INY CPY bottom BCC doframe LDA bottomleft JSR oswrch  LDX left INX  LDA #166 JSR doline  LDX Xpos  LDY Ypos  LDA #26 JSR oswrch  LDA #31 JSR oswrch TXA JSR oswrch &TYA 0JSR oswrch :LDA bottomright DJSR oswrch NJSR getcoords XJSR setwind b#LDY #oswblk+4 :\ ->text colours lJSR setcols v LDA #12 JSR oswrch JSR storeheader JSR setptractive JMP outdone \ \ Window command 5 \ ----------------  .open5 JSR checkmode  DEC top BPL skip12  INC top  JMP open4  .skip12  JSR ptrtoaddr JSR pointblock  JSR storeheader *JSR ptrtoaddr 4JSR storesc >JSR setwind H$LDY #oswblk+6 :\ ->title colours RJSR setcols \ LDX left fJSR ptitle pDEX z LDA #32 JSR doline  INC top JSR setwind $LDY #oswblk+4 :\ -> text colours JSR setcols  LDA #12 JSR oswrch JSR storeheader JSR setptractive JMP outdone \ \ Window command 4 \ ----------------  .open4  JSR open $LDY #oswblk+4 :\ -> text colours $JSR setcols . LDA #12 8JSR oswrch BJMP outdone L\ V\ Window command 3 `\ ---------------- j .open3 t JSR open ~JMP outdone \  .open JSR ptrtoaddr JSR pointblock JSR storeheader JSR ptrtoaddr JSR storesc JSR storeheader JSR setptractive JMP setwind \ .calcstart INC bottom  INC right LDA TLHC+0 STA screen+0 (LDA TLHC+1 2STA screen+1 < LDY top FBEQ skip13 P .loop7 ZLDA screen dCLC nADC bytesrow xSTA screen+0 LDA screen+1 ADC bytesrow+1 STA screen+1 DEY  BNE loop7  .skip13  LDY left BEQ skip14  .loop8 LDA screen CLC ADC byteschar STA screen+0 LDA screen+1  ADC #0 STA screen+1 "DEY , BNE loop8 6 .skip14 @RTS J\ T .storesc ^JSR chkedge h LDY #0 r .loop9 |LDA coords,Y STA (addr),Y INY  CPY #4  BCC loop9  LDA #4 JSR incaddr  LDA top PHA JSR calcstart LDA screen STA rdscptr LDA screen+1 STA rdscptr+1  LDY #0 JSR osrdsc  STA byte & LDA #1 0STA repeat :INC rdscptr DBNE skip15 NINC rdscptr+1 X .skip15 b LDA left l STA count vLDX byteschar DEX BNE chars2  .rows2  LDA left  STA count LDA screen STA rdscptr LDA screen+1 STA rdscptr+1  .cols2 LDX byteschar  .chars2  STX temp JSR osrdsc  LDX temp  CMP byte  BEQ samebyte *PHA 4 JSR pack >PLA H STA byte RINC repeat \BNE stored f .samebyte pLDA repeat z CMP #255 BNE skip16  JSR pack  .skip16 INC repeat  .stored INC rdscptr BNE skip17 INC rdscptr+1  .skip17 DEX BNE chars2  INC count  LDA count  CMP right  BNE cols2 JSR nextrow $ INC top . LDA top 8CMP bottom B BNE rows2 L JSR pack VDEC bottom ` DEC right jPLA t STA top ~RTS \ .storeheader  LDY #0  LDA #28  JSR put  LDA textl  LDX textb  JSR put2  LDA textr  LDX textt  JSR put2  LDA #17  JSR put  LDA forecol JSR colconv  JSR put (PHA 2 LDA #17 < JSR put FLDA backcol PJSR colconv Z A #&80 d JSR put n LDA #17 xJSR oswrch PLA JSR oswrch  LDA #31  JSR put  LDA Xpos SEC  SBC textl  JSR put  LDA Ypos SEC  SBC textt  JSR put  LDA #29  JSR put LDA originX LDX originX+1 " JSR put2 ,LDA originY 6LDX originY+1 @ JSR put2 J LDA #24 T JSR put ^LDA byteschar h LSR A r LSR A | LSR A  STA count LDA graphl LDX graphl+1  JSR setX LDA graphb LDX graphb+1  JSR setY LDA graphr LDX graphr+1  JSR setX LDA grapht LDX grapht+1  JSR setY  LDA #18  JSR put LDA plotfore & JSR put 0LDA gforecol : JSR put D LDA #18 N JSR put XLDA plotback b JSR put lLDA gbackcol v A #&80 JSR put LDA #25 LDX #4 JSR put2 LDA oldcursorX LDX oldcursorX+1 JSR setX LDA oldcursorY LDX oldcursorY+1 JSR setY LDA #25 LDX #4 JSR put2 !LDA cursorX ! LDX cursorX+1 ! JSR put2 ! LDA cursorY !*LDX cursorY+1 !4 JSR put2 !>RTS !H\ !R .colconv !\ STA temp !f LDX #255 !p .loop10 !z LDA #17 !JSR oswrch !INX !TXA !JSR oswrch ! LDA temp !CMP forecol !BNE loop10 !TXA !RTS !\ !.put !STA (addr),Y !INY "RTS "\ " .put2 "$STA (addr),Y ".INY "8TXA "BSTA (addr),Y "LINY "VRTS "`\ "j .setX "t STA mult "~STX mult+1 " LDA count " .loop11 " ASL mult "ROL mult+1 " LSR A "BNE loop11 " LDA mult "SEC "SBC originX " STA mult "LDA mult+1 "SBC originX+1 #TAX # LDA mult # JSR put2 #RTS #(\ #2 .setY #<STX mult+1 #F ASL A #PROL mult+1 #Z ASL A #dROL mult+1 #nSEC #xSBC originY # STA mult #LDA mult+1 #SBC originY+1 #TAX # LDA mult # JSR put2 #RTS #\ # .setwind # LDA #28 #JSR oswrch # LDY #0 # .loop12 $LDA coords,Y $JSR oswrch $INY $" CPY #4 $,BNE loop12 $6 LDA #29 $@JSR oswrch $J LDA left $T JSR convX $^LDA bottom $hCLC $r ADC #1 $| JSR convY $JSR invert $JSR multwrch $ LDA #24 $JSR oswrch $ LDA #0 $JSR oswrch $JSR oswrch $JSR oswrch $JSR oswrch $ LDA right $SEC $ SBC left $CLC % ADC #1 % JSR convX %LDA bottom %&SEC %0 SBC top %:CLC %D ADC #1 %N JSR convY %XJSR multwrch %b LDY #255 %l .moves %v LDA #25 %JSR oswrch % LDA #4 %JSR oswrch % LDA #0 %JSR oswrch %JSR oswrch %JSR oswrch %JSR oswrch %INY % BEQ moves %RTS %\ % .convX &CLC & LDY #0 & STY mult & LDY byteschar &* STY count &4 .loop13 &> ASL A &H ROL mult &R LSR count &\BNE loop13 &fJSR oswrch &p LDA mult &zJMP oswrch &\ & .convY &CLC & LDY #0 &STY mult+1 & ASL A &ROL mult+1 & ASL A &ROL mult+1 & ASL A &ROL mult+1 & ASL A &ROL mult+1 ' ASL A 'ROL mult+1 ' STA mult '$RTS '.\ '8 .invert 'BLDA #1024 256 'LSEC 'V SBC mult '` STA mult 'jLDA #1024 256 'tSBC mult+1 '~STA mult+1 'RTS '\ ' .multwrch ' LDA mult 'JSR oswrch 'LDA mult+1 'JMP oswrch '\ ' .setcols 'LDA #17:JSR oswrch 'LDA (oswptr),Y:JSR oswrch 'LDA #17:JSR oswrch ()INY:LDA (oswptr),Y:A #&80:JSR oswrch ( (LDA #18:JSR oswrch:LDA #0:JSR oswrch (!DEY:LDA (oswptr),Y:JSR oswrch ((LDA #18:JSR oswrch:LDA #0:JSR oswrch (()INY:LDA (oswptr),Y:A #&80:JMP oswrch (2\ (< .pack (FLDA repeat:STA (addr),Y:INY (PLDA byte:STA (addr),Y:DEY (ZLDA #2:JSR incaddr (d%LDA addr+1:CMP #&BF:BCC stillfree (n4LDA addr:CMP #&BF \&FF-&2E-2 for 2 more bytes (xBCC stillfree (LDX #128:JSR errors ($EQUS "No memory for window data" (BRK (.stillfree ( LDA #0 (STA repeat (RTS (\ ( .unpack (LDA repeat (BNE skip18 (LDA (addr),Y (STA repeat )INY )LDA (addr),Y ) STA byte )"DEY ), LDA #2 )6JSR incaddr )@ .skip18 )JDEC repeat )T LDA byte )^RTS )h\ )r .nextrow )|LDA screen )CLC )ADC bytesrow )STA screen )LDA screen+1 )ADC bytesrow+1 ) CMP #&80 )BCC skip19 ) #&7F )CLC )ADC screenstart ) .skip19 )STA screen+1 )RTS *\ * .incaddr *CLC *& ADC addr *0 STA addr *:LDA addr+1 *D ADC #0 *NSTA addr+1 *XRTS *b\ *l .restore *v LDY #0 * .loop14 *LDA (addr),Y *JSR oswrch *INY * CPY #&2C *BCC loop14 *RTS *\ *.getcoords *LDY #oswblk * .loop15 *&LDA (oswptr),Y :\ Copy coords *STA coords-oswblk,Y +%INY:CPY #oswblk+4 :\ four bytes + BNE loop15 +RTS + \ +* .checkptr +4 LDA ptrlo +>CMP #data 256 +HBNE skip20 +R LDA ptrhi +\CMP #data 256 +fBNE skip20 +pLDX #131:JSR errors +zEQUS "No window open" +BRK + .skip20 +RTS +\ +.ptrtoaddr + LDA ptrlo + STA addr + LDA ptrhi +STA addr+1 +RTS +\ +.activetoaddr +LDA activelo , STA addr ,LDA activehi ,STA addr+1 ,$RTS ,.\ ,8.setptractive ,B LDA ptrlo ,LSTA (addr),Y ,VINY ,` LDA ptrhi ,jSTA (addr),Y ,t LDA #&2E ,~JSR incaddr ,JSR setactive ,JMP setptr ,\ ,.checkactive , LDA ptrhi ,CMP activehi ,BEQ locheck ,BCC change , .nochange ,RTS , .locheck , LDA ptrlo -CMP activelo - BCS nochange - .change -JMP setactive -(\ -2.pointblock -< LDA addr -FSEC -P SBC #&2E -Z STA addr -dLDA addr+1 -n SBC #0 -xSTA addr+1 -RTS -\ -.setactive - LDA addr -STA activelo -LDA addr+1 -STA activehi -RTS -\ - .setptr - LDA addr - STA ptrlo -LDA addr+1 . STA ptrhi .RTS .\ ." .moveback ., LDY #&2C .6LDA (addr),Y .@PHA .JINY .TLDA (addr),Y .^STA addr+1 .hPLA .r STA addr .|RTS .\ . .square . LDA #163 .STA topleft . LDA #165 .STA topright . LDA #170 .STA bottomleft . LDA #172 .STA bottomright .RTS .\ . .round / LDA #176 /STA topleft / LDA #177 /&STA topright /0 LDA #178 /:STA bottomleft /D LDA #179 /NSTA bottomright /XRTS /b\ /l .ptitle /vLDY #oswblk+10 / .loop16 /LDA (oswptr),Y /3CMP #32:BCC skip21 :\ Terinated by control char /JSR oswrch / INY:INX / CPX right /BCC loop16 / .skip21 /RTS /\ / .doline /JSR oswrch:INX /CPX right:BCC doline 0RTS 0 \ 0.checkmode 0 LDA mode 0*CMP #7:BCC modeok 04LDX #129:JSR errors 0>$EQUS "Not suitable for teletext" 0HBRK 0R .modeok 0\RTS 0f\ 0p .chkedge 0z LDA right 0 CMP left 0BCC chkerr 0 LDY mode 0CMP colstable,Y 0BCS chkerr 0LDA bottom 0 CMP top 0BCC chkerr 0CMP rowstable,Y 0BCS chkerr 0RTS 0 .chkerr 0LDX #135:JSR errors 1EQUS "Parameters" 1BRK 1\ 1$.colstable 1. EQUB 80 18 EQUB 40 1B EQUB 20 1L EQUB 80 1V EQUB 40 1` EQUB 20 1j EQUB 40 1t EQUB 40 1~\ 1.rowstable 1 EQUB 32 1 EQUB 32 1 EQUB 32 1 EQUB 25 1 EQUB 32 1 EQUB 32 1 EQUB 25 1 EQUB 25 1\ 1\Variables held in SWR 1.ptrlo :EQUB data 256 2.ptrhi :EQUB data 256 2 .activelo :EQUB data 256 2.activehi :EQUB data 256 2 .coords 2(.left :EQUB 0 22.bottom :EQUB 0 2<.right :EQUB 0 2F.top :EQUB 0 2P.topleft :EQUB 0 2Z.topright :EQUB 0 2d.bottomleft :EQUB 0 2n.bottomright:EQUB 0 2x] 2data=P%+&2E 2 2: 2checksum(start$,end$) 2start%=(start$)-(P%-O%) 2end%=(end$)-1-(P%-O%) 2 sum%=0: loop%=start% end% 2sum%=sum%+?loop%: 2 check% 2T check%<>sum% '"Checksum error between:"'" .";start$;" and .";end$: "."; 2 2: 2/ 34146,35024,47709,54234,53724,62358,41279