From d37ecc44da7100bd21c6b9a8ce3b10b360a6f5ed Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Fri, 18 Mar 2022 22:29:12 +0100 Subject: [PATCH] More documentation --- README.md | 197 +++++++++++++++++++++++++++++++- oscar64/ByteCodeGenerator.cpp | 22 ++++ oscar64/ByteCodeGenerator.h | 1 + oscar64/NativeCodeGenerator.cpp | 35 +++++- samples/fractals/mbmulti3d.png | Bin 0 -> 3601 bytes samples/hires/bitblit.png | Bin 0 -> 5040 bytes samples/hires/func3d.png | Bin 0 -> 13273 bytes samples/hiresmc/polygon.png | Bin 0 -> 5936 bytes samples/rasterirq/colorbars.png | Bin 0 -> 1454 bytes 9 files changed, 253 insertions(+), 2 deletions(-) create mode 100644 samples/fractals/mbmulti3d.png create mode 100644 samples/hires/bitblit.png create mode 100644 samples/hires/func3d.png create mode 100644 samples/hiresmc/polygon.png create mode 100644 samples/rasterirq/colorbars.png diff --git a/README.md b/README.md index c08023d..9c51172 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,6 @@ A windows installer is provided with the release, the compiler is installed into The compiler can also built using MSVC or GCC. A visual studio project and a makefile are part of the source repository. The makefile is in the make folder. - ### Compiler arguments The compiler is command line driven, and creates an executable .prg file. @@ -83,6 +82,12 @@ The compiler is command line driven, and creates an executable .prg file. A list of source files can be provided. +### Building the samples + +The windows installer puts the samples into the users documents folder, using the directory "%userprofile%\documents\oscar64\samples". A batch file *make.bat* is also placed into this directory which invokes the compiler and builds all samples. It invokes a second batch file in "%userprofile%\documents\oscar64\bin\oscar64.bat" that calls the compiler. + +On a linux installation one can build the samples invoking the *build.sh* shell script in the samples directory. + ## Language extensions The compiler has various extensions to simplify developing for the C64. @@ -294,6 +299,196 @@ The compiler provides two levels of interrupt safe functions. The specifier __i return 0 } +## Samples + +### Character input and output "stdio" + +#### helloworld.c + +### Disk file access "kernalio" + +The C64 uses various kernal routines to read and write files on disk. These routines are available with a library All samples in this directory use drive 9, but can easily be changed to drive 8. + +#### Reading the directory "diskdir.c" + +Reads the directory from the current disk in drive 9 and displays it on screen. + + +#### Writing characters "charwrite.c" + +Opens a ".prg" file on drive 9 for writing and writes 128 characters into the file. + +#### Reading characters "charread.c" + +Opens a ".prg" file on drive 9 for reading, reads all characters from the file and prints there character code on screen. + +#### Writing binary data "filewrite.c" + +Opens a ".prg" file on drive 9 for writing and writes an array of structs as binary data into the file. + +#### Reading binary data "fileread.c" + +Opens a ".prg" file on drive 9 for reading and reads an array of structs as binary data into the file. + +#### Writing image data "hireswrite.c" + +Renders a hires image into a buffer at 0xe000..0xff40 and saves it to disk. The added complexity is, that the kernal itself cannot access the memory in this region because it is covered by the kernal ROM itself. The operation is therefore implemented using a 200 byte RAM buffer. + +#### Reading image data "hiresread.c" + +Reads a hires image from disk into a buffer at 0xe000..0xff40 and displays it. The read can be performed without a secondary buffer, because writes to the ROM end up in the RAM underneath. + +### Remapping memory "memmap" + +The C64 memory map is very flexible. These samples show how to manipulate the memory map and use easyflash ROMs to execute larger programs. + +#### Using more memory "largemem.c" + +Moves the BASIC ROM out of the way and allows the use of memory from 0x0800..0xcfff for the compiled C program. + +#### Using all memory "allmem.c" + +Moves the BASIC ROM, Kernal ROM and the IO area out of the way and allows the use of memory from 0x0800 to 0xfff0 for the compiled C code. An interrupt trampoline is installed to keep the kernal going. + +#### Custom character set "charsetlo.c" + +Embedds a custom character set into the prg file at 0x2000..0x27ff and switches the character set base address in the VIC to this address. The code and data portion of the compiled program is split into two areas to make room for this fixed location data. + +#### Himem character set "charsethi.c" + +Embedds a custom character set into the prg file at 0xc800..0xcfff and switches the character set base address in the VIC to this address. + +#### Copy character set "charsetcopy.c" + +Embedds a custom character set into the prg file at 0xc000..0xc7ff and copies it to 0xd000 on startup. This frees this area for stack and heap usage. + +#### Easyflash banking "easyflash.c" + +When compiling for easyflash, the linker will place the code and data section into bank 0 and copy it to 0x0900..0x7fff at startup. The remaining banks are free to be used for data or additional codes and can be banked in as needed. This sample uses banks one to six for additional functions. + +#### Easyflash common area "easyflashshared.c" + +This sample reserves a fixed area of several banks for a common code segment. A multiplexer function is placed into this common segment to select a different bank and call a function in that bank. + +#### Easyflash relocated area "easyflashreloc.c" + +An alternative to calling the function in the cartridge ROM itself is to copy it to a different location in RAM and execute it there. This sample creates functions in different ROM banks that are linked for a memory area in RAM at 0x7000. The code is copied from the ROM to RAM and then executed. + +#### Terminate stay resident "tsr.c" + +A common usage for the RAM area in 0xc000..0xcfff which is visible but not usable from BASIC is to install a terminate stay resident BASIC extension, which can then be called using sys 49152. + +It would be a waste of disk space and load time to load this directly into 0xc000 together with a BASIC start code at 0x0800. This sample uses the linker to link the code for the TSR at 0xc000 but place it into the prg at 0x0900. The startup then copies this code to 0xc000. + +### Hires graphics "hires" + +The C64 has a hires graphics mode with 320x200 pixels. Oscar provides a library for rendering in on screen and off screen bitmaps. + +#### Draw lines "lines.c" + +Draws and clears lines with various patterns. + +#### Draw 3D wireframe "cube3d.c" + +Draws a rotating 3D wireframe cube using draw (OR) and clear (AND) operations. The 3D operations are performed using 12.4 bit fixpoint math. + +#### Software bit blit engine "bitblit.c" + +![Various bitblit modes](samples/hires/bitblit.png) + +Demonstrates the various bit blit modes of the software blit engine, including mask and pattern. + +#### Draw polygons "polygon.c" + +Draws a series of pattern filled stars with changing orientation and size. + +#### Mixed text and hires screen "splitscreen.c" + +Uses the library to split the screen into an upper hires and lower text mode screen. The text area is used to query the user for x, y and radius of circles to draw. + +#### 3D Function plotter "func3d.c" + +![3D Function plotter](samples/hires/func3d.png) + +Draws a 3D function using flat shading and the painters algorithm. All 3D operations are performed with floating point numbers using the vector library . + +### Multicolor bitmaps "hiresmc" + +The C64 bitmap graphics mode can also use 2bit per pixel, resulting in an image of 160x200 with four colors. The oscar library implements various drawing operations in this mode. All x coordinates still range from 0 to 320 to keep a quasi square pixel layout. + +#### Draw polygons "polygon.c" + +![Colored stars](samples/hiresmc/polygon.png) + +Similar to its hires counterpart but using different colors and patterns. + +#### Fill similar colored areas "floodfill.c" + +Draws filled random circles and fills the space using flood fill. + +#### 3D Function plotter "func3d.c" + +Similar to its hires counterpart but using four shades of grey. + + +### Mandelbrot renderer "fractals" + +Various versions of the mandelbrot set using float arithmetic. + +#### Text mode fractal "mbtext.c" + +Simple mandelbrot renderer using text cells and colors to generate a 40x25 pixel image. + +#### Hires fractal "mbhires.c" + +Hires version using black and white to show the mandelbrot set. + +#### Multi color fractal "mbmulti.c" + +Multi color version using pure and mixed colors. + +#### 3D shaded fractal "mbmulti3d.c" + +![Mandelbrot fractal in 3D](samples/fractals/mbmulti3d.png) + +Mandelbrot rendered in 3D with shading. The image is drawn in columns from back to front, using two adjacent columns to calculate slope and brightness. + + +### Raster beam interrupts "rasterirq" + +Interrupts based on the raster beam are an important part of the C64 programmers toolbox. Switching VIC registers on specific lines opens up many additional features, such a more sprites using multiplexing, combining modes or changing colors or scroll offsets. The library provides easy access to this feature using on the fly code generation. + +#### Static color changes "colorbars.c" + +![Color bars](samples/rasterirq/colorbars.png) + +Changes the background and border colors several times per frame, creating horizontal color bars. + +#### Crawling text at bottom "textcrawler.c" + +Draws a scrolling line of text at the bottom of the screen. + +#### Crawling text at bottom in IRQ "autocrawler.c" + +Draws a scrolling line of text at the bottom of the screen, using an interrupt to update the text. + +#### movingbars.c + +Changing the background and border color at varying vertical positions giving the impression of two chasing colored bars. + +#### openborders.c + +Open the vertical screen borders by switching the vertical size bit at the appropriate raster lines. + + +### scrolling + +### sprites + +### games + + + ## Implementation Details diff --git a/oscar64/ByteCodeGenerator.cpp b/oscar64/ByteCodeGenerator.cpp index 2b4189d..14530f2 100644 --- a/oscar64/ByteCodeGenerator.cpp +++ b/oscar64/ByteCodeGenerator.cpp @@ -315,6 +315,13 @@ bool ByteCodeInstruction::IsIntegerConst(void) const return mCode >= BC_CONST_8 && mCode <= BC_CONST_32; } +bool ByteCodeInstruction::IsCompare(void) const +{ + return mCode >= BC_BINOP_CMPUR_16 && mCode <= BC_BINOP_CMPSI_8 || + mCode == BC_BINOP_CMP_F32 || mCode == BC_BINOP_CMP_U32 || mCode == BC_BINOP_CMP_S32; +} + + bool ByteCodeInstruction::CheckAccuSize(uint32 & used) { bool changed = false; @@ -4571,6 +4578,21 @@ bool ByteCodeBasicBlock::PropagateAccuCrossBorder(int accu, int addr) mVisited = true; if (mEntryBlocks.Size() != 1) accu = addr = -1; + else + { + ByteCodeBasicBlock* p = mEntryBlocks[0]; + + int s = p->mIns.Size(); + + if (p->mIns.Size() >= 2 && mIns.Size() == 2 && + mIns[1].IsCompare() && p->mIns[s - 1].IsSame(mIns[1]) && + ((mIns[0].mCode == BC_LOAD_REG_16 && (p->mIns[s - 2].mCode == BC_LOAD_REG_16 || p->mIns[s - 2].mCode == BC_STORE_REG_16)) || + (mIns[0].mCode == BC_LOAD_REG_8 && (p->mIns[s - 2].mCode == BC_LOAD_REG_8 || p->mIns[s - 2].mCode == BC_STORE_REG_8))) && + p->mIns[s - 2].mRegister == mIns[0].mRegister) + { + mIns.SetSize(0); + } + } int j = 0; for (int i = 0; i < mIns.Size(); i++) diff --git a/oscar64/ByteCodeGenerator.h b/oscar64/ByteCodeGenerator.h index 04c03b3..19871bc 100644 --- a/oscar64/ByteCodeGenerator.h +++ b/oscar64/ByteCodeGenerator.h @@ -225,6 +225,7 @@ public: bool IsLocalAccess(void) const; bool IsShiftByRegister(void) const; bool IsIntegerConst(void) const; + bool IsCompare(void) const; bool IsCommutative(void) const; bool IsSame(const ByteCodeInstruction& ins) const; diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index be9ff26..20b539a 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -13317,7 +13317,7 @@ bool NativeCodeBasicBlock::OptimizeSimpleLoop(NativeCodeProcedure * proc) { changed = OptimizeSimpleLoopInvariant(proc, nullptr, nullptr); } - else if (sz > 3 && sz < 200 && mNumEntries == 2 && mTrueJump == this) + else if (sz > 3 && sz < 200 && mNumEntries >= 2 && mTrueJump == this) { bool simple = true; @@ -17868,6 +17868,23 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass int a = mIns[i + 1].mAddress; mIns[i + 1].mAddress = mIns[i + 4].mAddress; mIns[i + 4].mAddress = a; progress = true; } + else if (pass > 0 && + mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && + mIns[i + 1].IsShift() && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && + mIns[i + 2].IsShift() && mIns[i + 2].mMode == ASMIM_IMPLIED && + mIns[i + 3].IsShift() && mIns[i + 3].mMode == ASMIM_ZERO_PAGE && + mIns[i + 4].IsShift() && mIns[i + 4].mMode == ASMIM_IMPLIED && + mIns[i + 5].mType == ASMIT_STA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && + mIns[i + 5].mAddress == mIns[i + 0].mAddress && !(mIns[i + 5].mLive & LIVE_CPU_REG_A) && + mIns[i + 5].mAddress != mIns[i + 1].mAddress && mIns[i + 5].mAddress != mIns[i + 3].mAddress) + { + mIns[i + 2].CopyMode(mIns[i + 0]); mIns[i + 2].mLive |= LIVE_MEM; + mIns[i + 4].CopyMode(mIns[i + 0]); mIns[i + 4].mLive |= LIVE_MEM; + mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED; + mIns[i + 5].mType = ASMIT_NOP; mIns[i + 5].mMode = ASMIM_IMPLIED; + progress = true; + } + #if 1 if (pass == 0 && mIns[i + 0].mType == ASMIT_CLC && @@ -18305,6 +18322,8 @@ void NativeCodeBasicBlock::BuildPlacement(GrowingArray& p { if (!mPlaced) { + assert(mBranch != ASMIT_JMP || mIns.Size() > 0); + mPlaced = true; mPlace = placement.Size(); placement.Push(this); @@ -18396,6 +18415,13 @@ bool NativeCodeBasicBlock::CalculateOffset(int& total) total += BranchByteSize(total, mTrueJump->mOffset); else if (mTrueJump->mPlace == mPlace + 1) total += BranchByteSize(total, mFalseJump->mOffset); + else if ( + mFalseJump->mPlace > mTrueJump->mPlace && mFalseJump->mPlace < mPlace || + mFalseJump->mPlace < mTrueJump->mPlace && mFalseJump->mPlace > mPlace) + { + total += BranchByteSize(total, mFalseJump->mOffset); + total += JumpByteSize(mTrueJump, mTrueJump->mOffset - total); + } else { total += BranchByteSize(total, mTrueJump->mOffset); @@ -18431,6 +18457,13 @@ void NativeCodeBasicBlock::CopyCode(NativeCodeProcedure * proc, uint8* target) end += PutBranch(proc, mBranch, mTrueJump->mOffset - end); else if (mTrueJump->mPlace == mPlace + 1) end += PutBranch(proc, InvertBranchCondition(mBranch), mFalseJump->mOffset - end); + else if ( + mFalseJump->mPlace > mTrueJump->mPlace && mFalseJump->mPlace < mPlace || + mFalseJump->mPlace < mTrueJump->mPlace && mFalseJump->mPlace > mPlace) + { + end += PutBranch(proc, InvertBranchCondition(mBranch), mFalseJump->mOffset - end); + end += PutJump(proc, mTrueJump, mTrueJump->mOffset - end); + } else { end += PutBranch(proc, mBranch, mTrueJump->mOffset - end); diff --git a/samples/fractals/mbmulti3d.png b/samples/fractals/mbmulti3d.png new file mode 100644 index 0000000000000000000000000000000000000000..9f1b8d700abc3e83f9b9b8336da937eb08e6680e GIT binary patch literal 3601 zcmbtXYgAKb*4~E`4|q9(6-EiSI99FJRz?B}CvoSL}Q8-At(go5)#KL+KxhqkYEIfA_f!)NVpR+3)ghk`qr8s^L_Jozwfj6^X~Pm zz2E2Do?YJfJn}pMz_da)864X&OT||{LPwME1#xr|Nf%S`%_LUc1_ny z+@}Y(Zg0toddcpDlLdBlBrpO%fB>KYPyoyTOaMsme+mDWaMFKQ{dcbaB7b@0lMTHErUmb|Rgvo)rJ&vRqy<`)`&G^B?L zT_TPJrr9#4>gR#2rS*BuMlUb{v>M|fCg17j}PIq zh}?@9Fu;h0UY#D-8m4v6riQe+hS_T~L%lJb*50VW)~q&3=w_kUOQuJM)){Jb28khs zYxkH;U{a58$)}t%!@}H7(qGwirZN$-M`eCfAP9l+O*~|+Zi`F(=t;YAe-Ua}yW_yC z^v7TNdB&K6;_BRfhncjWBe{o~Y@uvDEcN%M=OKYo@Th+D85}u7M>mL3YVL-bA5{=XVp)x;~aw3jf7$=Amy-r-H{ zQtpo-<`6fB_VttJ8vC}-NVxR)XjaJN-HyUbmy~SxKUR1zkGeWrJB1s>6^%ScUtK(T{MVuxyjrNY_N>tBas;q z7cCQ6TMPc|)seDevELSSDO264m9=+|s(zjG=$KtkJHE4^eE)tIjtr=PtItrr=wNw+ zOl}qt?ym$Y@pI(3AkeSRk3Q1j#CPlqxKi1;uwHIef5PF-UMre*$~@wz30cbXkWHPQ zs_1ZR<)za`D z_drkjnBBUP?&WY8p+GV_{YS5@CmHC{gfkZpMqTe_ytBYBln8hC27E3Mvihei^kGN4 zvLfF1b}kXKoB#IuC{C|zh^@MkWPoDR>AhxUmF`xZj_KhoA=Z+9ml@B+IXyw>tcC}4 zev!wDpXpeU4T2MzoxWC{18!MzOM3rP*Rf$O_pB<8RxQ~uHvGd(Iu&qwCiGa4_#Lv( zaO+}>rfu-AG2d5v#NP!xcTfdrVnu#%?{Yi7lCK-~->$C+BE zw5%Vk54f6DeLs*_8f7MM(92x|_?*p2o!-&wZntZ%&rIFk>xt-EioY9RE+9*{X7F@b zRZJ)d6$S5JSv8Z+=St!uxbrJ@cgj=(k-|&r?6+|q;FP6|h{9!_tP&B6Q^MJovV32E zQ~F4G{Sa~l#q-+ zJ$l;ZgQm$wJDUEgCQlQDnvsGh9+mOoNeNTS;#9fNK~#KDN!EwDtRWh zM`1E6`*YZZg+8LGq^1+64)^cd5nq`8VTsrYm{#UW(%=2L_@>_$grg>}GUdp+nujZD z3Wna7%uRka&JxBoeU;N%|EkO-ygL{tjjqy6I3uDH3vX)Uu%DWqYX?`oLQ_ z<-&~F)B^7cUbA3{BN2A}jv!pdH(eE@*ZPjJwbjP8hOJAhNv>*AMUuQ99@-`ef}3}&Hs4^j79V68AgOaxLIRqB#hc3;b1l1v)Xyckdk+t}JSD*4wB`3AQ($I%Xol#tU z8M_cSnw_XnGt$z0Hz*G`@@koC=czl(Jj#3^Z{W>@IlnLJFi$x<*y%M;X4QS~OuTLa zvinOpMM=xeNLj|xwdV(f?!M@Q6y<)L-dIe8Y`cXluz>QA$Lv&#hfP>khYrxiGEbyvZG7*cKw z>^3F#Mi6AF%9ooTT7#vJ3?rn6ZxAzlu=!%9B^N9ED-^N^QZ^6;#Sw4G1V#aj3E4If zsWPRjv^;4kalHUzbyf)(jeIzjzy%8`EOMjdMdffW(1W zO};~%4<1~r*OtC2NgVyO=Zyfd&s1=nm>@QG@t^>em_w%Z{yL?&bhFsq{o4vmT`*hO z3`|)dLbWd(*d7$HeE|nTZ{8?blx<52+>p_H+5?r%22UP9Z`+t~E2*Eu)%(a&nUVqG zjM+01VY!)1P-H-o_TfC`>7ysT?6chlbN@g}O6ldhU5=;co_o;^R0e>nFH#mF7A9+>eoUA z93DJC>e7dYno$YHL!@01)77p6b3B5V%Yb-oC3WjkLgP_VZWKU!m+`t;2loHBM4#Ni de*lmEXuO$qW93c0#oqt`wr|_zS-ORu@edik3?Bdh literal 0 HcmV?d00001 diff --git a/samples/hires/bitblit.png b/samples/hires/bitblit.png new file mode 100644 index 0000000000000000000000000000000000000000..905738dc75abb9778292c28b4dafdfda817eacd1 GIT binary patch literal 5040 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 literal 0 HcmV?d00001 diff --git a/samples/hires/func3d.png b/samples/hires/func3d.png new file mode 100644 index 0000000000000000000000000000000000000000..fb2f0e5a8e2eff4049678e3708ad7941a365ea5b GIT binary patch literal 13273 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 P0Dya12AUP>4&na?n=xr$ literal 0 HcmV?d00001 diff --git a/samples/hiresmc/polygon.png b/samples/hiresmc/polygon.png new file mode 100644 index 0000000000000000000000000000000000000000..78c1f08b9d5c406454f4288f9f4ae9156e45fec5 GIT binary patch literal 5936 zcmb_gdpHy9-@kXDjTM`wNluR#Q<+Ld2c{l{94gz&aXQfo6*ZA<7EdRqQaaJrPaew} zo>)S&S@qzl=wJ#BOC?jNjA6F-^85FFulI0W?_Zzm`d;_yrET!(C~_pe5^yuujR$`N%Nok*5JT=_|PTOm2$nt!D(?yI+nzNJTVDGB~#6 zL5pkdfMy7Q4Y|>$i~$=001o^=0t^5m0RJ6GL$#^nW*S9e^l2kt-OBJfeFXr30zmqo zpj4YWf!Dl~=<|Y+(#u-qEmi>l03$uns2%&huzkQrudV#Ea#*7O#mXC4m&?-UNtQGp zTf&<8WplCO$v{@~)GU`dkosg;GlOfKm!WBoi7!rh4Ed(}9VtsEYoZPM(>L1{r5Wpc zMj=vg)8SJ00vpRFFWsq#m7IZ;Xm7+&)VoX@R6pcAuMoWro)$S+U@HZMgLLebl~AAh zlj_ZyCa|W0)9aYgr}b&E$Y|3iag*q1AO(dLnYgBc%EQZ{04MeFv;8tcu=A~o9ki)n z>G2XjB0Hx*DsGMOt)dQc0|0=%&u@^mBfgmH-n3iL0M_??%xLbLYR@z>Ni+z@H5Ctg3y_4b5z;}swUo*0a@EOMK14sY`AQC{KLDvpRUd$*7U zMfF2Tn$g81{n8M|@$2YuA+wP+^`r34Ev*48E+60^_HoWy$;@|2V{kM}s~Q}Yi`u_` z`x%@Bp#iS4ph~}NoSH)m#V+J8*Jkrxo-ox3hII~r$j&9d`gWeD{zSCDE|@+B!{MZC zg3|%G(sL<$haVe#|Cp7@5_&Q0nE6#xm^6prbi#`9v*eJ2Hk&qHEO}?Er2(vfSM5t& zfvhQBauA+=a;8RWhN68WIGxyNEX?Af$M;Mo{#=BjWx!1#D-_~)~E1xqs;3!Y@tMrQTVl0`Nw^V5=aLpB{rEA+_d%C^nk|J^WkBq@&k zGPBur)|!6-C+++ocBM@aoXpw1@(^5WIj4E1WfgF@%K}1cn;;f%YI!ecGh04VwWuvcn)J%6f619|3azShRN$_$ZOkF;@Ui zT2jv2^9Am!mpZT?5cp&$qTT)jekFYeP{x8?`Q07ywS>6wZNX3{0Vg#c;`V$JilQNo zxtmoS#v&i4gE8KcIwT9h|7`Nev?sl*yd%OS*t;)666Z1^iX$an>3yRPCY@cpjuO9jBN zYCn{p9_>9!X!+UhZq~Gi9%xkg@bTM|ohaTR==)Nm%V1)muG=SUxREWWY`%02Mf(R{ zm5N;o+3*BGcgQHJlChah5u;;g?ZP)$F8ViJKG&QhF^*4h$*_SEs_Y5`J7a;SIMOAyumtrzOX_+G57!;VtHQL!i8)DdH0ydWqqEI zi1b-uUc`|D@Jt&NO$N`e?-fmZxM+nKZ|$SfcCRHVm<8U4$XPEE;N`Z4>{^ zohX$|x@&ZC>92MNHpMr8eZ~=U`$sd=NH5s?2h*)&Qb~e_PM-ZB^!+#)|4@amrS6Eg zN62g}NkV$dHX9TVRvqdk#7O1jO+o?Jwy07s3Bq0pTM*WR*sIKo4j%ati)M1#!BP%` z`Cfo$cgt9{)2(8OxK`LmhdV2S9oT}=*kQuCu~p#opVLF)o>(FLmA~e&16$LksufhI zmhwWep@KOorG{^N5K?gT6BVLnT2radYRq*FNLwZ=+_Fi2=CJ?#D)Mgt=e_x(jq0mn z(1eGSE|HiT@- zn1Me#05{#Hh(0Dq(D6WKV)*LP>xT5GKu|KWy|HI%awR7e+A=HNY2V_&E;F*36NUoS z-K}J=STk>W+sEf7=?S|9@~LaL>mpnrMd?M=zWHXlGNhgTeh`p9%u7S(eQG!AaT+LB zObu341}$iYGCOGjgOoNS{fN&tjfHe)bjR+v)Wj)MV^+c_H%0Cj<<#>yx4W37@;q(* z*I!o`la}?1+AW;0Iz{FV=w1-urpoU75Ve__C1G${g}WpKt@GyX;=EGwE5%FoUi*|( zsI3-7Yjve3Dz~4QsLO2#)udVM5vuUkN^an?O25GmpN?(=q7fp~os(#D10cL$yDxMc zZ|{@`2WfT<_f{IQDhXdz<=hYDrEdn)IuSn5IFbA*Ss5MZ#Em-P#(vgfH4>Hfw5Xiu zPp!*D4=WakA71*Lz&C1N&$QV&nmE+7-ecd_t6*o6al>MWG8P2v^n_NbN3T%qO51Cb zt9vPG2hlE?g(c+Lx_d;dhulS}Dni;EiyFk%hGQYe zt;WeQ+3WiU9zFc0bhTSVnKUk%C%uuWfE$A^(#dsMyx_);cho_6+hSi+UB`-|d#i3#V)V0`zU2z~fNJ8Uz=)-plu7$X zh9NMVOuqg=<%+%twda9kMwV9)@KBoAt5Y6mz73jr1ts(hen{XkCcj57hdj-5g%H`L z&Q_4V$i}G}_|d{p^{-CTO^W5$8Nt+nGr9A+`sa~R!f{2ZfBJ3N1y;AT2s|$t3 zrL%)vm9E(C2zkkL%v`-VNcCc7^mxPfqefRT%|4KApl{bgujF4wtSDf4DHmep0s$plHqq7fn~+ zDtftdwg&U!P1~jep{3*gYwEUyG}IqjuEhY@^_#uLEY;KUH|XR?y7A2xp$1oTA5}VL zq!c`?p0ujj#8uuy@;b(lUa;$zqkN)0j}yeVH$pyCM(Nyd%*;Lycs-y{)Ktia!`vZP z8g0sL42cdRPkpbCS2#BGCKzc$7AbO8>rM~M>f3W`k{GDTl^lUj*Wm|L^%GFI*ZmGx zWJE6p$ImZUpSs(dr)kIcHTxs)FreqINhU_L4#2SLcXiT4+v~0hY5*wp6QfQRsxxxP2f|Y>s<0<1;rl*%F2sV5}eHcY(VlRK8-2hAu|l# zbPUMUlgJ_8FYOx|#Nuy<$_p&-eaV!Zgg!b9_fWcG_sUJI4}k_F)-Zwp5Zo4W9!!$9 z_*gNtiF%zY{_3tz@cY*wU&^^};IC9^cnA?7X#)g4S-mSYd0!Aaci{6P87{Xl`&!Q5 zoGYr{a0m9Ax(f|Ro_f$%V*!+XkBn5sJb%5|dmA8Wo}3{5vCb|+5q3vDyaKC>fX2<% zU3CORAd}Frs}DoZRqj&;M-C=vE({`4ElKyrB!NEZta%s!v(;KsN!56E?Y!p4k6pBt zg0$RSe$MXrSM^4oF50>hVp@7oCKqDLMAB})voTJmXL4_ikGNYzxInU}t>#Xx(QSfO z$S{ulKAV#@R<2avMy^H}*|wC*G8D*3?g5 z0!PozeO3>BGTWv&Z_!fx{#jfb@`Ym6r8MEp=xkkYAfQU{A_2Fzucu@5I{LAG*57S< zmIh1$)`=#dboJ(;bZKCsvNCe^ej&KM7cRiDVKG6AL$wBNibG+kio@-NJDYM$esfMw z|BIM|nHD_X82%E{VXo`NMlPdevI22Zn$qN*@{iIkih)7Kkv-25 zP*J9Y0euucON1JFYx?R&?ObhUn#I&t`(a}_dqI&fiIaP zTCcArhYYJ?YvED^PHLaU>ezpD6i%d{iW8{tS3xS(tHI&lX%5=zAj4XJApQbRH4YtB zl`-ZE_TGz zygW)KNrTehsQ!fw2-YY(UqB1PvnfeXai*6;$iJz>a%@A5F;X#sPlfW`@utR4M`W%L zHsti*2u^;K;^pyV=vVg##!s>Sqgzfef^2b}d^pix6V3|$2s?p;z;<8IoL$-A_SEOS zzhdKZL=2g84R$O!shqicY8sx5>;?MK6NXft_wFPg_EE(I1N0fY|Wq`ZG)C@ z+g?}|0e=DSwLCb1wqrQ;p;=QZez`1q(N>?R(~aUxqB)0Bka~}mI9^`<;r!lvt*v_+ zC5(B$#R^KV@9-sFgyj8wDIX)-iL`Z}+E8!we7VVYhZeCUIyQ@y49!P`dWV}e(uOQ^ zyW8xZ%C`$V*rDo`J>~oeb+z&E3kVTvScNWKYx|6~DF`9TzB94^Xhk=h8 znlcTm7XDb&F!4G|h(ALO1_CNcT${c786wOQhLd*q=KBMY;~9pBtDR^=a_7?gp7s1| zZci_o99+fOZxG()Bn5x2=1`EdYpPh0M@GY~e?)8kAZPb~n~9(=M1frvq+$3`%5LiV z-LVrM8C?uZ#WRF|4hO=!hd%xB6X9PG&~vOuLX0=@CWWzPbQ3<`b9LiGbVm>(*bPc# zyK(Z}I4K@+{&AHQ5`)oqMEv<#LK3v3&HmA0R5lwzW21`{7t3mlJZ}ML$-~FH(}QS* zo8KO`e6mb%P72nn=esnJN91%Pc@q|o1-Q+_1ipIzC|`&<$Xx|s?|Tp{Ws#{N+lN(U zwQfblM@Gm78_60A2+Vu)i1or%hoO9N8odn{x-mYBizb5AyiSr^on_hjY4w zNy+s7(Kw}q4nM}(7I_A;VI|~~;~9p4xsx2?iePaSeof%$6<5ZFTYw^Dwoypsx9hT4 z*H#r%*3$DHj(vy&@m}#u5I`z>&0BRnbr2&NSY>K{^{HN zn9{j;85vvCy?^w+%m!~t1gr0JKEm_EbaeshxAjJErYx1K!1m2Uh4UJMb)6NQ?GqTL zA^U)t_XgRhsAo_`HdRu;6TvbrI6klSTi9$zIR_y@Z-PmGB5g(SKP%+H!dBYcOBxgg zgL^8xwn{(tGB4bcG-Qsh#0k_QXpuRZzo?Et(wlvKSG{0$7Nc0l7IXFqxB$=S4I?CJpMoPlQP!0wa>AKq)P z+48w{pc;8_5)PI$A3J?)NprA0*E?a$)KFUx*q!|W5EwPFhnb)4q3qa|=>{DF4q%tr zLH=u-R(csFF~b4d|D7}ZKl{D^=Or`%*s(uYGv8~kuU$=$004mB??GECd}y5i0O`S) A7ytkO literal 0 HcmV?d00001 diff --git a/samples/rasterirq/colorbars.png b/samples/rasterirq/colorbars.png new file mode 100644 index 0000000000000000000000000000000000000000..11bed46a7e2b38e99c7a58dc8aa4ad92549ad9bc GIT binary patch literal 1454 zcmeAS@N?(olHy`uVBq!ia0y~yU~FJuU=-kBV_;y|xp46x1_strPZ!6Kid%2*8fFUz zG936=K1riQ;1Anf>nTblqUsAPGm@U7gNN+z{0@5$l$=h zAizKtldjquj3>4Tw8h@Ic=zq&|9SQ|_Q>2V+v5AC?B;d7-!-Xm`PXVSs{Xs4k9_*^ zaldSR-{y+?(EIgMKW=)jpI>vUwqJJjqQ{ZPf3M&5KehhZ=6`i_ul}2Ucm1B*rGM)< z7#NiUqH$4lmr##JYirA)zjeA@@e--no-Ie_u2I)%y7H?Iqh!@819B@uzw0 z2e=lfy_Wvl>1mN|vp4pdiafX5J&Oj05}#i^wq_^084j$Bn_Z@6tC=2K*BLu&W@%9T z{TJ)NGVsLo9^^x;~HO7CwM3&t&{Z@(TmnSjDpGr?}VTjttG^2Ep*+J$K6Nb=r z|EG60csnrsSMj(1oAKwo!}>k@q?|Y&et#Q3bNl7*y(zt-wsH+(Yzz&bpWC-Eq9&JJ z>&oALba!Vwz{Sw8Gm>#jqI%!7F!guQ7BV7z{rQvc>AnBAssD7f9D{blEFBp>HMNIp zK7J{SoLr+LQTdpG>4M=)<8L=q^qD{o{Li>V{pp(1`WwBCH~YQfZf`EwvPG)47Nqs5 z@4m?Cb;~66f6r2@cVLj3_2cy(o8YI+_dbR)IZRibE&tB!-+4#`4i%5dOl6r;&r=J)sB{nliNV1z0J>j`lE^!L2*e;JboQ3hmFz>*hu zPo8$y-p9_6z=|**W>txE{)e{*0vR?iVdlGC3%`H(HEl5teeZ8RpWnxX-NL<3pQeH% z05uIeFfhDmd-C_g)eDJOEwoa+dDrfnEdzr#dHElf4q!ByB?*Pv9Vl}=SbM|H&*Bry Xm-pYW5l&@bU|{fc^>bP0l+XkKQh}`U literal 0 HcmV?d00001