********************************** PmmC Revision R4.4 7th May 2015 ********************************** 1] Fixed uSD corruption when writing to file with cluster number > 32k, occurs when using minimum valid cluster size and uSD more than half full. ************************************ PmmC Revision R4.3 4th March 2015 ************************************ 1] Fixed serial data overflowing buffer when using comms TX buffers was lost. 2] Printing non existent characters from uSD fonts can cause unexpected issues 3] Allow .4xe (or .4fn) to have image or data 'secretly' appended to it. 4] Fixed str_Match(+I) matching DEF to ABCDEF 5] Putch and print([CHR] x) not obeying to() when font is uSD based. *************************************** PmmC Revision R4.2 15th October 2014 *************************************** 1] Fixed After seeking on file <512 bytes long, a file_Read that 'hits' EOF will always return "Size" bytes, rather than the actual bytes left. ************************************ PmmC Revision R4.1 11th July 2014 ************************************ 1] Fixed fragmented file creation when file closed on cluster boundary and then appended to 2] Fixed possibly corrupted file when file updated across cluster boundary. ************************************* PmmC Revision R4.0 17th March 2014 ************************************* 1] Add FAT Random R/W to Append Mode, also updated file sets archive bit 2] Refine (R3.9 change) to touch action in extreme positions. 3] Fix gfx_SetClipRegion() only working on uLCD-43* displays 4] I2C_AckPoll() not working 5] I2C routines locking up if I2C bus error **************************************** PmmC Revision R3.9 17th December 2013 **************************************** 1] Some uSD cards failing Init (Internal manufacturer Lexar, external brands AData, Lexar, Patriot) 2] 16GB Samsung uSD cards failing init 3] Maximum Read/Write address on uSD in RAW mode was 4GB, now 64GB (max SD-HC size) Note! PeekW and PokeW constants for MEDIA_SECTOR_LO and MEDIA_SECTOR_LO have changed as a result of this fix. This is included with Workshop 4.1.0.25. Similarly the constants will be wrong if an older PmmC is used with new Workshop (resulting in Runtime error #22, Bad address for peekW or pokeW) 4] Display using SSD1963 not showing runtime error if display page other than 0 5] Load of 'null' function causing later PmmC restart 6] Return codes from file_PlayWAV() byte sized rather than integer sized 7] Touch on uLCD-32WPTU could be wrong on left and top 'extremes', this can also be seen with other displays if touch calibration is intentionally done wrongly. 8] uLCD-43PT fixed touch spurious releases on right hand half of display on displays with AR1021 touch controller 9] Possible incorrect Pixel(s) being drawn after gfx_ScreenCopyPaste on displays using SSD1963 controller (uLCD-43*, uVGA-*, etc.) **************************************** PmmC Revision R3.8 23rd October 2013 **************************************** 1] Fixed/added ability for programs to detect/recover from unexpected uSD removal. This is not to be encouraged as unexpected removal can damage uSD cards. 2] Added sys_DeepSleep() and disp_Disconnect() to enable lower power consumption, during sleep and/or periperal power off states. 3] Fixed Unicode characters with a low byte of 0x00, 0x0A, 0x0D, 0xFF not displaying correctly **************************************** PmmC Revision R3.7 2nd September 2013 **************************************** 1] Fixed charWidth for Unicode uSD fonts incorrect. 2] Fixed pin_Set() not setting Bus pins as output (also IO_Pin5 if previously used as input in same program) **************************************** PmmC Revision R3.6 18th June 2013 **************************************** 1] Fixed ScreenCopyPaste corrupts screen when overlayed copy in certain directions **************************************** PmmC Revision R3.5 23rd May 2013 **************************************** 1] Added disp_Init() function. 2] Fixed %d being same as %u(i.e. unsigned) in str_Printf. 3] Fixed system reset when attempting to load image control and insufficient memory. 4] Fixed mem_Copy not working correctly when destination overlays source. Note: "PicasoGFX2_Functions.fnc" currently has disp_Init() requiring 2 parameters, if you intend using this function you can either supply 2 dummy parameters, or edit the .FNC file and remove the parameters from the definition. The .FNC file will be updated in the next Workshop release, so if you do the former you will get a compile error when you recompile with the new Workshop. **************************************** PmmC Revision R3.4 1st March 2013 **************************************** 1] Fixed "\n" ignored after line 20. 2] Fixed outlineColour being displayed as part of gfx_Cls(). 3] Fixed 'block icon' in custom font not displaying. 4] Fixed Missed touch releases on uLCD-43PT with new b firmware *************************************** PmmC Revision R3.3 18th December 2012 *************************************** 1] Fixed issue with consecutive loading of functions using file_LoadFunction. File buffer allocations were not being released, creating holes in the heap between the function allocations. Fixed. 2] Changed PWM centre voltage to reduce click on file_PlayWAV initial startup. 3] Fixed issue with file_FindFirst - was retaining last filesearch pattern if file_FindFirst was called consecutively. Fixed 4] Sleep unit timing for sys_Sleep was incorrect. Fixed *************************************** PmmC Revision R3.2 29th October 2012 *************************************** 1] Buffered TX service was still turning pin around too early when buffer empties., added code to wait for buffer to completely empty on last byte before turning pin around. 2] The ucmp_3232 function was returning incorrect results if either number had bit 15 set. It was actually acting as a signed compare. Fixed 3] uSD startup speed was inadvertently set to the wrong rate for startup in PmmC v 3.1, this had the effect of stopping certain cards from initializing properly during file_Mount. Fixed. 4] If you have a file with 1 image init and go file_image(0,0,handle) ; // image displays file_image(0,0,handle) ; // fails at EOF Fixed, Added code to detect if rewind necessary at EOF 5] img_Darken was same as img_Lighten Fixed, img_Darken now darkens 6] Modified snd_Pitch so that if arg is -1, it just returns wav sample rate without modifiyng pitch. 7] Fixed a bug in file_findFirst , it would fail if first file in directory was deleted. 8] Fixed a memory leak for file_FindFirst with no follow through with file_FindNext - fixed. The file control block that is created for the search process is now returned to the heap when any other file functions are used. 9] Audio interrupt was not being disabled when entering sleep. This would case a crash if sys_Sleep was used after file_PlayWAV. NB:- Please be sure to update compiler to v 2.7.0.3, some other minor problems have been fixed. 1] Fixed some further issues with switch statement, complex nests would fail. 2] Compiler would not allow references to PmmC functions in DATA statement 3] A missing endfunc on last function in a program that had more than one function would hang compiler FYI: "Compiler.exe", "Compiler_Readme.txt" and updated "TheSwitchAndCaseStatements-4DGL rev 1.01.pdf" documents included in the zip file. Click the "Compiler V2.7.0.3" hyperlink to download the Compiler.zip file. *************************************** PmmC Revision R3.1 9th October 2012 *************************************** Unzip the release distribution to a folder of your choice. First, please note that the 'switch' function has been fixed, along with various other global initialization issues in the compiler, so copy 'compiler.exe' to the 'DEP' folder in the '4D Workshop 3 IDE' folder. Test code in the PmmC v 3.1 release will only work properly with the new compiler, so the first thing you must do is replace the compiler in the DEP folder with the new compiler exe. Now is also a good time to prepare a FAT16 uSD card and load all the files from the 'Demo Copy To Disk' folder to the uSD, this will allow you to evaluate the demo source code without having to compile or download anything. Place the uSD in the module, fire up the Workshop and open RUNDEMOS.4DG. Compile it, download to FLASH - make sure the FLASH box is ticked. Note that quite a few of the demo's now have switch statements. Make sure you upgrade the compiler before trying to recompile the demo's else the old compiler will just hang in certain places. Pleas read the doc "TheSwitchAndCaseStatements-4DGL.pdf" for further information. PmmC upgrade notes:- [1] Certain brands of uSD cards were not working. This was not a fault directly, but a failure of the manufacturer of the uSD card to follow the standard regarding 'continous read' mode. We use continuous mode to blit images to the GRAM window as fast as possible, mostly this feature is not used.... A workaround for these cards has been implemented, so now these 'odd' cards should work... [2] mem_Copy and str_ByteMove were not correctly dealing with overlapping memory. this is now fixed [3] lookup8 and lookup16 were not working if program was run from FLASH (eg when using #MODE RUNFLASH) [4] it is now possible for a parent to access child globals when using file_LoadFunction. var fncHandle; // a var for a handle to sliders.4dg var slidervals; // a reference var used to access global vars in sliders.4dg fncHandle := file_LoadFunction("sliders.4xe"); // load the function slidervals := fncHandle&0x7FFF; // note that memory allocations for transient programs are biased with 8000h which must be removed. slidervals++; // note that all globals start at '1' slidervals[0] := 25; // set sliders to initial positions slidervals[1] := 20; slidervals[2] := 30; slidervals[3] := 15; slidervals[4] := 35; slidervals[5] := 20; slidervals[6] := 40; slidervals[7] := 25; slidervals[8] := 45; slidervals[9] := 5; r := fncHandle(); // activate the function print("Return value = 0x", [HEX] r,"\n"); print("Slider 1 ", slidervals[0]," Slider 2 ", slidervals[1],"\n"); // print the values, they may have changed print("Slider 3 ", slidervals[2]," Slider 4 ", slidervals[3],"\n"); print("Slider 5 ", slidervals[4]," Slider 6 ", slidervals[5],"\n"); print("Slider 7 ", slidervals[6]," Slider 8 ", slidervals[7],"\n"); print("Slider 9 ", slidervals[8]," Slider 10 ", slidervals[9],"\n"); mem_Free(fncHandle); // done with sliders, release its memory //Refer to RUNDEMOS.4DG (http://www.4dsystems.com.au/downloads/Share/RUNDEMOS.zip) code for further reference. [5] Customer Complaint - Timer events should be cancelled when entering / leaving any child processes. Well, not necessarily. Considering we are working with a 'tiny' environment, it was decided to leave things the way they are, but explain things a lot better.... A note on timer usage and the sys_SetTimerEvent(...) function. The timer system used in 4DGL is simple to use, but rather primitive, and it is up to the programmer to protect against certain pitfalls. When a timer is used in conjunction with a timer event, the event can only run in the current code space, therefore the following cautions must be taken into consideration. When a child process is run using the file_run or file_exec function, or if a file was loaded with file_Loadfunction and is executed, the loaded process gets its own code and memory space, therefore, any timer that reaches zero that has a timer event attached in the parent code space, will fail and cause a crash as an attempt is made to force the program counter to some wild place in the child process - not what we want! There are 2 ways to overcome this problem. 1] If a child process will not be requiring the use of any timers or timer events, the parent program can simply use the eventsPostpone() function before calling or entering the child process. Once the parent program regains control, the eventsResume() function will allow any events in the queue to then be processed. The side effect of this method is that several events may bank up, and will execute immediately once the eventsResume() takes place. This however disallows a child process to use any timer events in the sub program so method 2 is preferable in this case. 2] The parent program can 'disconnect' the event(s) by setting it/them to zero prior to child process execution, or setting the associated timer to zero so the event wont fire. In either case, it is necessary to do the following:- while(sys_EventQueue()); to ensure the event queue is empty prior to calling the child process. Note also that if just the timer is set to zero, the child process cannot use this timer. If the timer was now set to a value and the old event still existed, when the timer reaches zero the 'bad' parent address event will fire causing a crash. The reverse situation also applies of course, the same level of respect is required if a child program needs to use any timer events. Method [1] (above) will not work as the events have been postponed, stopping the child process from using any timer events. If the child process did an eventsResume() in this case,everything would crash miserably. So the same applies,a child that uses any timer events must respect any timers that may be used by the parent, and a child must zero the sys_SetTimerEvent before returning to the parent. Compiler v 2.7.0.2 upgrade notes [1] There was a problem with the compiler de-referencing the address of a global variable within a DATA statement (a rare usage but a valid one that should work) The old workaround would be to deref the global variable addresses manually, eg:- #DATA word yTx 0, ((yT1>>1)+1), ((yT2>>1)+1), ((yT3>>1)+1), ((yT4>>1)+1) #END // old kludge to get correct addresses Compiler now produces correct offset , so the following now works:- #DATA word yTx 0, yT1, yT2, yT3, yT4 #END // compiler error, bad deref - fixed 30/09/2012 var justPadding[16]; var yT1, yT2, yT3, yT4; // forward ref ok func main() yT1 := 0x1111; yT2 := 0x2222; yT3 := 0x3333; yT4 := 0x4444; print ([HEX] &yT1, " "); // address of global var yT1 print ([HEX] &yT2, " "); // address of global var yT2 print ([HEX] &yT3, " "); // address of global var yT3 print ([HEX] &yT4, "\n"); // address of global var yT4 print ([HEX] yTx[1], " "); // pointer to yT1 print ([HEX] yTx[2], " "); // pointer to yT2 print ([HEX] yTx[3], " "); // pointer to yT3 print ([HEX] yTx[4], "\n"); // pointer to yT4 print ([HEX] *yTx[1], " "); // prints 0x1111 print ([HEX] *yTx[2], " "); // prints 0x2222 print ([HEX] *yTx[3], " "); // prints 0x3333 print ([HEX] *yTx[4], "\n"); // prints 0x4444 print ([HEX] &yTx[1], " "); // gives address of DATA array yTx[1] print ([HEX] &yTx[2], " "); // gives address of DATA array yTx[2] print ([HEX] &yTx[3], " "); // gives address of DATA array yTx[3] print ([HEX] &yTx[4], " "); // gives address of DATA array yTx[4] [2] A bug in array initializtion was preventing the '@' function from working. Code such as the following example now works properly. var w, h, obj[6]; w := peekW(GFX_XMAX)+1; // max width h := peekW(GFX_YMAX)+1; // max height obj[0] := gfx_RectangleFilled ; obj[1] := [ABS(RAND()%w), ABS(RAND()%h), ABS(RAND()%w), ABS(RAND()%w), RAND()]; // load elements 1-5 with random x1,y1,x2,y2,colour obj[0](@&stuff[1], 5); // execute the rectangle function Please refer to 4DGL Compiler Release Notes v 2_7_0_2.pdf for further compiler information. *************************************** PmmC Revision R3.0 26th June 2012 *************************************** 1] COM1 doesnt work with the buffered service, was sending rubbish - fixed. 2] Sending a \n character first after selecting a uSD font was resetting processor - fixed 3] There is now a seperate PmmC for the 4.3" LCD non touch module - uLCD-43P-GFX-R30.PmmC 4] Due to integer rounding, baud rates are not exact, actual baud rates are defined here for reference MIDI 9 31,250.00 ( 0.00%) BAUD_110 0 110.00 ( 0.00%) BAUD_300 1 300.00 ( 0.00%) BAUD_600 2 599.94 (-0.01%) BAUD_1200 3 1,199.87 (-0.01%) BAUD_2400 4 2,399.74 (-0.01%) BAUD_4800 5 4,799.49 (-0.01%) BAUD_9600 6 9,598.98 (-0.01%) BAUD_14400 7 14,423.08 (+0.16%) BAUD_19200 8 19,263.70 (+0.33%) BAUD_31250 9 31,250.00 ( 0.00%) BAUD_38400 10 38,527.40 (+0.33%) BAUD_56000 11 56,250.00 (+0.45%) BAUD_57600 12 57,397.96 (-0.35%) BAUD_115200 13 117,187.50 (+1.73%) BAUD_128000 14 127,840.91 (-0.12%) BAUD_256000 15 255,681.82 (-0.12%) BAUD_300000 16 312,500.00 (+4.17%) BAUD_375000 17 351,562.50 (-6.25%) BAUD_500000 18 468,750.00 (-6.25%) BAUD_600000 19 562,500.00 (-6.25%) Note: "PicasoGFX2_Functions.fnc" file must be placed in the workshop "..\4D Labs\4D Workshop 3 IDE\INCLUDE" folder Note: “The downloaded (4DGL Workshop3 IDE) setup application will create the required 4DGL-Workshop3 folders and install all the required files. Note that in-line with current Microsoft philosophy all samples and demos are located in the ‘All Users\Shared Documents\4D Labs’ folder (XP) or ‘Users\Public\Documents\4D Labs’ folder (Vista and Windows 7)." *************************************** PmmC Revision R2.9 05th June 2012 *************************************** NB!!!!!!! "PicasoGFX2_Functions.fnc" file must be placed in the workshop "..\4D Labs\4D Workshop 3 IDE\INCLUDE" folder Note: “The downloaded (4DGL Workshop3 IDE) setup application will create the required 4DGL-Workshop3 folders and install all the required files. Note that in-line with current Microsoft philosophy all samples and demos are located in the ‘All Users\Shared Documents\4D Labs’ folder (XP) or ‘Users\Public\Documents\4D Labs’ folder (Vista and Windows 7)." ====================================== PmmC changes ====================================== ============================================================================================ ============================================================================================ changes/fixes in 2.9 1] com_TXbuffer and com1_TXbuffer functions have been modified and take an extra parameter. Refer to example COMx_Burst_Test1.4dg for explanation of use. func com_TXbuffer("buf", "bufsize", "pin"), 0; // sets the buffer location for buffered transmission // Syntax: com_TXbuffer("buf", "bufsize", "pin"); // Usage : com_TXbuffer(mybuf, 1024, IO1_PIN); // set the TX buffer, usin IO1_PIN for turnaround // Usage : com_TXbuffer(0, 0); // revert to non buffered service // Notes : initialize a serial buffer for the COM0 output. // : The program must declare a var array as a circular buffer. // : When a TX buffer is declared for comms, the transmission // : of characters becomes non blocking. The only time // : blocking will occur is if the buffer has insufficient space // : to accept the next character, in which case the function // : will wait for buffer space to become available. If the // : TX buffer is no longer required, just set the buffer pointer // : to zero, the size in this case doesnt matter and is ignored. // : The function can resize or reallocated to another buffer at // : any time. The buffer is flushed before any changes are made. // : "pin" designates an IO pin to control a bi-directional // : control device for half duplex mode. "pin" will go HI at the // : start of a transmission, and will return low after the final // : byte is transmitted. If not required, just set "pin" to zero. 2] Image control will now show error box for out of range video frames. Also, if frame is set to -1, just a rectangle will be drawn in background colour to blank an image. (see test program ImageControlFrameOverrun.4dg) 3] FAT16 uSD cards can now be formatted with 64k clusters. 4] Clipping issues now fixed, some large images were not being clipped properly. 5] All I/O pins are now configured as inputs, prevously they were configured as outputs / LO 6] txt_Attributes(n) was not working, now fixed. 7] DIVISION by zero and MODULUS of zero were resetting, now fixed, illegal operations returns zero. 8] str_Printf was not advancing source pointer properl, fixed, refer to test program Str_PrintfCheck.4dg 9] Transparent image mode has test program and explanation of use, refer to test program transparentTest.4dg 10] ucmp16 was not working correctly, fixed, refer to test program ucmp32.4dg 11] Memory for font storage is now dynamically allocated, allowing very large user defined characters to be used. Previously, the allocation was only fixed 64 bytes, limting character size to a 512 pixel array which limited character size to approx 22 pixels square. The tradeoff for this is that you cannot allocate the entire amount of memory returned by mem_Heap(), so allow 32 bytes for the internal fonts, adjusting this amount accordingly if you have custom larger fonts. ============================================================================================ ============================================================================================ ************************************** PmmC Revision R2.8 27th Jan 2012 ************************************** 1] Fixed 4.3" CT touch problems, now common PmmC for both versions 2] See C:\Users\user\Dropbox\4D Projects\4D Products\PICASO-GFX2\PmmC 2.7 Buglist\FIXED-I2C_Putn_Bug I2C_PutN is fixed, it was stopping when 0x00 encountered in strings. 3] See C:\Users\user\Dropbox\4D Projects\4D Products\PICASO-GFX2\PmmC 2.7 Buglist\FIXED-str_Printf_Bug str_Printf is fixed, was incorrectly calculating number following %. This also applied to %0ns 4] serout_1 was not checking pending flag FIXED 20120127 http://4d.websitetoolbox.com/post/printadd?id=5686973 maybe he's the first to use it 5] str_Printf was falsely adjusting string pointer on control string containing string chars eg: str_Printf(&p,"%s"); would add an extra 3 to the string pointer. FIXED 20120128 6] str_Cat and str_CatN return pointer to incremented source. It should return a pointer to the destination, the doc is correct. FIXED 20120128 7] Restriction on number of pixels in a character are now removed. Pixel array buffer now dynamically allocates what is requred, whereas before it used a fixed buffer limiting matrix to 800 pixels (buffer was 100 bytes) 8] Added function to return unsigned carry. This replaces the solution of:- C := (A[0]<0)^(B[0]>=0) ^ (!OVF()); // 34usec with a faster function call CY(); // 5usec http://4d.websitetoolbox.com/post/overflow-register-5671096 //================================================================ func CY(), 1; // Syntax: CY(); // Usage : myvar := 0xFFF8 + 9; // result = 1 // : print(myvar," "CY(),"\n"); // carry = 1 // Notes : This function returns the carry status of an // unsigned overflow from any 16 or 32bit additions or sutractions. //================================================================ 9] Added new func for non aligned byte copy as there was no support other than a 'roll your own' loop which was rather slow ==================================================================== func str_ByteMove("src", "dest", "count"), 1; // func str_ByteMove("src", "dest", "count"), 1; // Syntax : str_ByteMove(src, dest, bytecount); // Input : STR *source points to byte aligned source. // : STR *dest points to byte aligned destination. // : VAR count number of bytes to transfer. // Usage : nextpos := str_ByteMove(s, d, 100); // Notes : copy bytes from "src" to "dest", stopping only // : when "count" is exhausted. // : No terminator is appended, it is purely a // : byte copy, and any zeroes encountered will // : also be copied. // Returns : returns a pointer to the end of the destination // : (which is "dest" + "count") //================================================================= 10] Added new functions for string copy as there was no support other than 'roll your own' loops which were rather slow //================================================================= func str_Copy("dest", "src"), 1; // Syntax : str_Copy(dest, src); // Input : STR *dest points to byte aligned destination. // : STR *source points to byte aligned source. // Usage : nextplace := str_Copy(d, s); // Notes : copy a string from "src" to "dest", stopping only // : when the end of source string "src" is encountered // : (0x00 terminator). // : The terminator is always appended, even if "src" is // : an empty string. // Returns : returns a pointer to the 0x00 string terminator at // : end of "dest" (which is "dest" + str_Length(src); ) //================================================================ //================================================================ func str_CopyN("dest", "src", "count"), 1; // Syntax : str_CopyN(dest, src, bytecount); // Input : STR *dest points to byte aligned destination. // : STR *source points to byte aligned source. // : VAR count max number of chars to copy. // Usage : nextplace := str_CopyN(d, s, 100); // Notes : copy a string from "src" to "dest", stopping only // : when "count" is exhausted, or end of source // : string "str" is encountered (0x00 string terminator). // : The terminator is always appended, even if // : "count" is zero, or "src" is a null string. // Returns : returns a pointer to the 0x00 string terminator // : (which is "dest" + whatever was copied) //================================================================ 11] Added unsigned 16 x 16 multiply with 32bit result //================================================================ func umul_1616("&res32", "val1", "val2"), 1; // Syntax : umul_1616(&res32, varA, varB); // Input : DWORD *result points to 32bit result register. // : VAR val1 16bit register or constant // : VAR val2 16bit register or constant // Usage : var res32[2]; // : umul_1616(&res32, myvar, 50000); // Notes : performs an unsigned multiply of 2 x 16bit values // : placing the 32bit result in a 2 word array. // Returns : the pointer to the 32bit result. // : carry and overflow are not affected. //================================================================ 12] Added 32 bit addition function //================================================================ func uadd_3232("&res32", "&val1", "&val2"), 1; // Syntax : uadd_3232(&res32, &varA, &varB); // Input : DWORD *res32 points to optional result (or zero for compare) // : DWORD *val1 points to 32bit augend // : DWORD *val2 points to 32bit addend // Usage : var res32[2]; // : res := uadd_3232(res32, val1, val2); // Notes : performs an unsigned addition of 2 x 32bit values // : placing the 32bit result in a 2 word array. // Returns : returns 1 on 32bit unsigned overflow (carry). // ; carry flag is also set on 32bit unsigned overflow // ; and can be read with the CY() function. //================================================================ 12] Added 32 bit unsigned subtraction function //================================================================ func usub_3232("&res32", "&val1", "&val2"), 1; // Syntax : usub_3232(&res32, &varA, &varB); // Input : DWORD *res32 points to optional result (or zero for compare) // : DWORD *val1 points to first 32bit minuend // : DWORD *val2 points to 32bit subtrahend // Usage : var res32[2]; // : res := usub_3232(res32, val1, val2); // Notes : performs an unsigned subtraction of 2 x 32bit values // : placing the 32bit result in a 2 word array. // Returns : returns 1 on 32bit unsigned overflow (borrow). // ; carry flag is also set on 32bit unsigned underflow // ; and can be read with the CY() function. //================================================================ 13] Added 32 bit unsigned compare function //================================================================ func ucmp_3232("&val1", "&val2"), 1; // Syntax : ucmp_3232(&varA, &varB); // Input : DWORD *val1 points to 32bit minuend // : DWORD *val2 points to 32bit sutrahend // Usage : res := ucmp_3232(val1, val2); // Notes : performs an unsigned comparison of 2 x 32bit values. // : The result of the subtraction is returned. // Returns : 0 if equal // : 1 if val1 > val2 // : -1 if val1 < val2 // : This function does not affect the carry flag. //================================================================ 14] Displays using SSD1963 driver IC (uLCD43xx and uVGAII) now supports gfx_ColourChange which was not supported on previous PmmC's, Full screen colour change in less than 80msec. Note that the READ_PAGE is the source, and WRITE_PAGE is the destination for the colour change operation. 15] Displays using SSD1963 driver IC (uLCD43xx and uVGAII) have an improved gfx_ScreenCopyPaste(..) function that will now copy a full page to another page in less than 70msec. 16] Incorrect memory size constants in PicasoGFX2_Functions.fnc __MAXPROG 15360 // user program space __MAXMEM 14336 // user memory bytes have been changed to correct values of:- __MAXPROG 14400 // user program space __MAXMEM 14400 // user memory bytes ============================================================================================ ============================================================================================ *************************************** PmmC Revision R2.7 13th Dec 2011 *************************************** 1] media_WriteByte was missing - this was common to all r26 modules - fixed 2] Sleep NQR on wakeup - this was common to all r26 modules, uSD card was not being re-enable - fixed 3] Transparent images not implemented on uVGA or either 4.3" - fixed