368 Commits

Author SHA1 Message Date
meepingsnesroms
df927c1e45 Attempt to upgrade Musashi 2019-11-11 11:03:08 -08:00
meepingsnesroms
a06d013f33 Create getOs4FunctionNames.py 2019-11-07 13:31:23 -08:00
meepingsnesroms
c08bdd573a Create dalAddrFromPc.py 2019-11-07 13:28:11 -08:00
meepingsnesroms
4712e77413 Cleanups, add missing button, log PC for more events 2019-11-07 12:20:18 -08:00
meepingsnesroms
57d19df30d Update TPS65010, fix T3 overclocking method 2019-09-25 11:29:09 -07:00
meepingsnesroms
dd09261b53 Fix cutting off the 6MB of ROM at the end and SIGSEGV on reset 2019-09-23 17:20:57 -07:00
meepingsnesroms
c72edbfa1b Remove old CPU core linkage 2019-09-23 10:33:59 -07:00
meepingsnesroms
20348abf85 Update logging 2019-09-22 22:45:57 -07:00
meepingsnesroms
6b1e293c44 Use opcode timing instead of frame timing for CPU timer events
Makes things much faster!
2019-09-22 22:32:52 -07:00
meepingsnesroms
d0292b312f Add key matrix handleing 2019-09-22 19:13:21 -07:00
meepingsnesroms
2b982cee22 Update tests.c 2019-09-22 15:40:39 -07:00
meepingsnesroms
2c072ded8a ARM calling is working 2019-09-22 14:25:09 -07:00
meepingsnesroms
309f91312f Fill out more of the TSC2101 test 2019-09-22 13:26:43 -07:00
meepingsnesroms
4450ac9402 Arm test code is now compiling and linking properly 2019-09-21 20:07:04 -07:00
meepingsnesroms
01bebf5418 Switch to new compiler, need to test 2019-09-21 19:35:05 -07:00
meepingsnesroms
4c7d34facf ARM tests are now compiling, not callable yet though 2019-09-20 13:42:11 -07:00
meepingsnesroms
16924bb811 Fix test compiling 2019-09-20 10:46:55 -07:00
meepingsnesroms
e9d6d21625 Add ARM side C code skeleton, definetly broke test compiling 2019-09-18 16:18:04 -07:00
meepingsnesroms
6b351c67fd Start working on T3 ADC test 2019-09-17 10:11:35 -07:00
meepingsnesroms
7be8825f96 More USB stuff 2019-09-16 19:41:01 -07:00
meepingsnesroms
02778eeb08 Update pxa260Udc.c 2019-09-12 14:12:18 -07:00
meepingsnesroms
f76abf87a1 Add more USB port registers 2019-09-12 13:54:01 -07:00
meepingsnesroms
0bb3287d6d Better event logging 2019-09-12 12:56:05 -07:00
meepingsnesroms
64950ac431 Block annyoing idle loop 2019-09-12 12:12:47 -07:00
meepingsnesroms
85e9a03796 Merge pull request #95 from meepingsnesroms/master
Merge over tvOS support
2019-09-12 10:42:00 -07:00
meepingsnesroms
14e0d66101 Merge pull request #94 from yoshisuga/tvos_platform
(tvOS) support building
2019-09-12 10:40:56 -07:00
Yoshi Sugawara
eea4c328d2 (tvOS) support building 2019-09-11 07:50:47 -10:00
meepingsnesroms
9143759c29 Small changes 2019-09-05 17:35:47 -07:00
meepingsnesroms
9289232dd0 Was stuck on a delay loop, now to implement the USB enough to boot 2019-09-02 09:57:55 -07:00
meepingsnesroms
a2dbb98d88 I2C seems fixed now 2019-09-01 12:45:49 -07:00
meepingsnesroms
fd572858e2 Lots of I2C bugs
Still need to fix more
2019-09-01 11:41:43 -07:00
meepingsnesroms
d5b6664c73 Get ARM accesses working 2019-08-30 19:02:46 -07:00
meepingsnesroms
ff46e40ded Start adding arm testing stuff, remove special emu functions 2019-08-30 16:17:09 -07:00
meepingsnesroms
f00cfd057b Fix swapped registers, TSC2101 status now tells Palm OS what values are new 2019-08-30 11:38:37 -07:00
meepingsnesroms
12ed98e68b Doesnt get as far anymore but is more accurate 2019-08-27 17:54:32 -07:00
meepingsnesroms
e277ae8a3b More TSC2101 work 2019-08-27 11:45:10 -07:00
meepingsnesroms
80850117e6 Add more of TSC2101 2019-08-26 18:01:29 -07:00
meepingsnesroms
09ae1544e4 Fix missing define 2019-08-26 15:03:05 -07:00
meepingsnesroms
c4e9edf702 Make interrupts clearable(and persistant when not acknoledged) 2019-08-26 14:06:59 -07:00
meepingsnesroms
dbf1341597 Remove backlight value from SED1376 and make it a percentage for T3 2019-08-24 21:42:23 -07:00
meepingsnesroms
5af248eaef Partially implement TSC2101 buffer 2019-08-24 12:56:18 -07:00
meepingsnesroms
afa5b13d14 Fix another bug in TSC2101 making commands never again start after the first 2019-08-23 14:06:52 -07:00
meepingsnesroms
68c9e28c08 Implement more of the TSC2101 2019-08-22 13:50:57 -07:00
meepingsnesroms
7962bee8bf Terminate TSC2101 command when its finished 2019-08-20 17:02:51 -07:00
meepingsnesroms
e6535b546c Add chip select and reset lines for TSC2101 2019-08-20 11:45:45 -07:00
meepingsnesroms
696874b42a Merge pull request #93 from meepingsnesroms/master
Add new changes from master
2019-08-17 21:59:58 -07:00
meepingsnesroms
ab608e1d78 Merge pull request #92 from webgeek1234/master
libretro: allow mingw cross compile
2019-08-17 21:58:45 -07:00
Aaron Kling
7ccef9020c libretro: allow mingw cross compile 2019-08-17 18:36:54 -05:00
meepingsnesroms
65e12a2b7b Some I2C fixes 2019-08-15 17:20:47 -07:00
meepingsnesroms
7ab964efcb Attach IC memory accessors 2019-08-15 16:22:23 -07:00
meepingsnesroms
4129e74af0 Fix RetroArch port again
Overclocking should be working now for both ports.
2019-08-15 15:53:06 -07:00
meepingsnesroms
8dcf19d2e1 Add namespaces to vars and make chip define headers subfiles of there chips 2019-08-15 15:21:45 -07:00
meepingsnesroms
aa196cb87f Remove custom driver stuff, no longer needed 2019-08-15 15:12:36 -07:00
meepingsnesroms
136cdca5d7 Add more tsc2101 stuff 2019-08-15 13:40:34 -07:00
meepingsnesroms
d4b9997d43 Add TSC2101 protocol handler 2019-08-13 17:39:57 -07:00
meepingsnesroms
8de283a87d SSP finished 2019-08-13 10:16:27 -07:00
meepingsnesroms
c860faa9e7 Add more of SSR, fix some bugs 2019-08-12 21:53:06 -07:00
meepingsnesroms
0d87bf2610 Add most of SSP SPI port 2019-08-10 21:35:23 -07:00
meepingsnesroms
99da94a143 More SSP regs 2019-08-09 12:43:16 -07:00
meepingsnesroms
ca89c58c1a Add SSP files 2019-08-08 21:59:49 -07:00
meepingsnesroms
771856944b Finish PXA255 references, update uARM to latest 2019-08-08 18:48:56 -07:00
meepingsnesroms
814d180642 I2C should be working now 2019-08-02 18:29:46 -07:00
meepingsnesroms
ad53041077 Fake cycle counting seems to be working 2019-08-01 13:47:57 -07:00
meepingsnesroms
6bfae8fcb2 Try to implement basic CPU timing, untested 2019-07-31 15:47:42 -07:00
meepingsnesroms
9eb415c4ac More I2C work 2019-07-30 16:56:32 -07:00
meepingsnesroms
632a57a38f Implement basic PMU comunication
I2C registers for PXA260 arnet finished yet though so cant actually send anything
2019-07-30 15:44:21 -07:00
meepingsnesroms
430ebc01a0 Add I2C accessors 2019-07-30 11:32:57 -07:00
meepingsnesroms
cc882d2141 Add some I2C stuff 2019-07-30 11:08:48 -07:00
meepingsnesroms
5ad9760c52 Get RetroArch build compiling again 2019-07-30 10:06:37 -07:00
meepingsnesroms
d67233cc8e Add skeleton files for some T3 chips 2019-07-30 09:58:44 -07:00
meepingsnesroms
07d8ee95f1 Update changelog 2019-07-29 13:57:04 -07:00
meepingsnesroms
a6f3ec5c1f Use HMARK 2019-07-29 13:37:08 -07:00
meepingsnesroms
631111ce25 Add UART 2 stuff
Neither UART 1 or 2 is working yet.
2019-07-29 11:32:18 -07:00
meepingsnesroms
4237ae0eb8 Add T3 SD chip disable patch
Should make debugging easier for now, dont need an SD slot for a while anyway.
2019-07-22 16:40:06 -07:00
meepingsnesroms
07b4aa53a8 Clean up sandbox to prepare for adding ARMv5 tools to it 2019-07-22 15:00:20 -07:00
meepingsnesroms
81bbcd20f0 Allow setting OS version number to something other than 4/5 2019-07-22 12:14:00 -07:00
meepingsnesroms
58d59a9964 Add callbacks for reconfiguring the serial ports 2019-07-20 09:53:15 -07:00
meepingsnesroms
e601bf1e15 Some LCD fixes from Dmitry Grinberg 2019-07-16 20:42:22 -07:00
meepingsnesroms
369b2ebaf4 Fix spacing in readme 2019-07-13 22:15:18 -07:00
meepingsnesroms
bc47eee5c0 Git apperently forgot this file a while ago 2019-07-12 22:15:53 -07:00
meepingsnesroms
943dfb3b09 More UART stuff 2019-07-09 10:38:39 -07:00
meepingsnesroms
a23df8f79a Fix number 2019-07-08 19:58:06 -07:00
meepingsnesroms
e0c1cb9d6b Save state fixes for UARTs 2019-07-08 19:55:59 -07:00
meepingsnesroms
7b6fcdb0e1 Set up basic external communication functions
Just got rid of the CPU FIFOs for UART, each emulated device will have an infintly large receive buffer which is written to directly by the other emulated devics transmit, the oldest 12 or 64 bytes of that buffer will belong to the CPU, when the CPU reads a byte it gets deleted and if theres more bytes the CPU will be able to access the next.
Turning off the FIFO will flush the whole buffer because the CPU would have been unable to read those bytes since it was off.

Now I just need to set up UART2 and a USB to serial adapter and I can try to sync my modern laptop with Palm Desktop on a Windows XP computer.
2019-07-08 19:48:44 -07:00
meepingsnesroms
e70d84fac4 More UART stuff 2019-06-20 20:44:50 -07:00
meepingsnesroms
d67b44130a Minor cleanups, verify states are working on Windows
They work on Windows, dont know why the are broken on Mac?
2019-06-20 17:46:34 -07:00
meepingsnesroms
1567cbce67 Clean up global namespace, add basic UART1 for m515
Going to try and get it to not crash when beaming.
2019-06-20 17:40:18 -07:00
meepingsnesroms
3059dfda06 Delay some stuff 2019-06-20 13:47:11 -07:00
meepingsnesroms
94f4c09d54 Rename to PXA260, PXA255 is almost identical and that naming is misleading 2019-06-12 18:41:38 -07:00
meepingsnesroms
452d5030a1 Update ARM debug functions, allow QT port to compile without OS 5 support 2019-06-12 10:23:45 -07:00
meepingsnesroms
1bb71d8aec Postpone some stuff to next release 2019-06-09 12:00:44 -07:00
meepingsnesroms
0337882c4f Remove QPixmap and switch to QImage for rendering
Need to test if this fixes Android.
2019-06-09 10:52:11 -07:00
meepingsnesroms
33f7cb8948 Merge pull request #91 from meepingsnesroms/tungstenT3Support
Disable OpenMP on libretro for now
2019-06-08 20:44:20 -07:00
meepingsnesroms
51e405fc84 Disable OpenMP on libretro for now
Causing way too many issues for the benefit
2019-06-08 20:43:44 -07:00
meepingsnesroms
d0ccc7115f Merge pull request #90 from meepingsnesroms/tungstenT3Support
Input updates
2019-06-07 13:23:31 -07:00
meepingsnesroms
61602de392 Update mouse click button 2019-06-07 12:34:15 -07:00
meepingsnesroms
29ca09302f Make control layout relative to SNES controller 2019-06-06 16:57:07 -07:00
meepingsnesroms
4c8649da4e Add small ARM patch, update roadmap 2019-06-04 20:44:11 -07:00
meepingsnesroms
9723c83381 Update Makefile.common 2019-06-04 15:18:07 -07:00
meepingsnesroms
37f4b859aa Cleanups, implement FEATURE_SYNCED_RTC, allow disabling graffiti
Also patched RetroArch makefile again, this will enable ARM on more platforms, possibly causing more build issues when merged.
2019-06-02 22:12:49 -07:00
meepingsnesroms
7ba0cb5dca Jused checked, m515 screen refreshes almost instantly
Remove the ghosting stuff, if caused flickering too.
2019-06-01 16:35:55 -07:00
meepingsnesroms
c95792b146 Update ghosting 2019-06-01 16:31:54 -07:00
meepingsnesroms
c111be3f64 Add ghosting support, not finished yet 2019-06-01 16:23:46 -07:00
meepingsnesroms
b145a329c0 Merge pull request #88 from meepingsnesroms/master
Merge over button names
2019-05-30 17:59:20 -07:00
meepingsnesroms
0ca5627ee3 Fix buffer overflow 2019-05-30 17:57:41 -07:00
meepingsnesroms
a1fd0799be Merge pull request #84 from paradadf/button-names
Change button names
2019-05-30 17:39:30 -07:00
paradadf
4fb3bed984 Update libretro.c
Use names from manual
2019-05-30 17:21:31 -04:00
meepingsnesroms
9ed1d0c21d Commit some broken code so I can test it on my other comupter with asan 2019-05-30 10:42:19 -07:00
meepingsnesroms
1405e2a681 Attach the timer 2019-05-29 16:36:34 -07:00
meepingsnesroms
55013870ca Attach PwrClk module 2019-05-29 15:52:37 -07:00
meepingsnesroms
912210695d ARM: Add cp14, dosent do much yet 2019-05-28 19:50:55 -07:00
meepingsnesroms
5c89783ea0 Cleanups, fix armv7 dynarec issue 2019-05-28 15:18:25 -07:00
meepingsnesroms
c68fac77cc Merge pull request #83 from meepingsnesroms/tungstenT3Support
Clean up overcomplicated launcher operation
2019-05-27 15:42:00 -07:00
meepingsnesroms
d0ca2655bb Update roadmap.txt 2019-05-27 15:41:04 -07:00
meepingsnesroms
5c1547467b Completley redo how launcher works
RetroArch still works.
Also tested .img file with a separate .info file in RetroArch and it worked.
2019-05-27 15:20:42 -07:00
meepingsnesroms
8e9ef22f42 Fix another state path issue
Also disabled keyboard focus so mapping keys like space and enter dont do anything weird.
2019-05-26 22:58:51 -07:00
meepingsnesroms
892359f226 Fix state manager not loading state list when opened 2019-05-26 22:14:06 -07:00
meepingsnesroms
d46e146ae7 Prevent invalid paths and get custom state dirs working 2019-05-26 20:08:45 -07:00
meepingsnesroms
fc6b32d065 Merge pull request #82 from meepingsnesroms/tungstenT3Support
Fix MSVC again
2019-05-26 16:24:30 -07:00
meepingsnesroms
66f32cdb94 Fix MSVC stuff again 2019-05-26 16:22:47 -07:00
meepingsnesroms
3601c471cf Update roadmap.txt 2019-05-26 16:06:14 -07:00
meepingsnesroms
9384fc37a8 Crop whitespace from svgs
All button images are the around the same size now instead of some being tiny.
2019-05-26 15:59:28 -07:00
meepingsnesroms
02fe7809ff Update roadmap.txt 2019-05-26 14:40:16 -07:00
meepingsnesroms
5f3ace9b6b Update launcher now actualy launches the program instead of the homescreen 2019-05-26 14:31:44 -07:00
meepingsnesroms
967c2f3ec1 Pause emu while selecting new content and select files again now that files can be installed after boot 2019-05-26 12:11:52 -07:00
meepingsnesroms
99dfc62823 Merge pull request #81 from meepingsnesroms/tungstenT3Support
Fix 4 bugs
2019-05-26 10:00:09 -07:00
meepingsnesroms
f0b9d524a6 Fix 4 bugs
Prevent the standard case from overwriting EMU_SUPPORT_PALM_OS5 := 1 from the jni makefile.
Remove unsupported __builtin_expect(x, y) from MSVC compilers.
Use <*.h> headers instead of <c*> headers for C headers in C++11 for RetroArchs weird Mac OS toolchain.
Remove unused <mutex> header for RetroArchs weird Mac OS toolchain.
2019-05-26 09:59:03 -07:00
meepingsnesroms
80026cb33e Merge pull request #80 from meepingsnesroms/tungstenT3Support
Compile fix for Mac OS
2019-05-25 22:24:57 -07:00
meepingsnesroms
5f1e8a53c1 Compile fix for Mac OS 2019-05-25 22:23:41 -07:00
meepingsnesroms
b068d6ed53 Merge pull request #79 from meepingsnesroms/tungstenT3Support
Fix the fix
2019-05-25 14:31:40 -07:00
meepingsnesroms
b222b23bd0 Fix the fix 2019-05-25 14:31:09 -07:00
meepingsnesroms
7e0399ad17 Merge pull request #78 from meepingsnesroms/tungstenT3Support
More RetroArch fixes
2019-05-25 14:23:14 -07:00
meepingsnesroms
f355c82d0b Disable multithreading for simple loops(no function calls, < 1000 runs)
Try to fix silkscreen issue in a clean and fast way.
2019-05-25 14:21:41 -07:00
meepingsnesroms
535c9254f6 Some more fixes
<cstdint> for Mac OS and disabeing OS5 for msvc because of custom asm syntax.
2019-05-25 10:14:30 -07:00
meepingsnesroms
4476697b4b Merge pull request #76 from meepingsnesroms/tungstenT3Support
Tons of bugfixes
2019-05-25 09:59:45 -07:00
meepingsnesroms
92d6a857a8 Tons of bugfixes 2019-05-25 09:58:00 -07:00
meepingsnesroms
6e8005cf56 Merge pull request #74 from meepingsnesroms/tungstenT3Support
Add launcher to RetroArch port
2019-05-24 18:37:59 -07:00
meepingsnesroms
eb4a241ef4 Android is now compiling 2019-05-24 18:28:46 -07:00
meepingsnesroms
ec66577b53 Update Makefile.common 2019-05-24 16:03:21 -07:00
meepingsnesroms
41a305f0bd Just use real setjmp 2019-05-24 15:45:16 -07:00
meepingsnesroms
e9f7a40c53 Fix some segfaults and missing symbols
It runs now but pushing to master is going to be a mess.
2019-05-24 15:16:21 -07:00
meepingsnesroms
b1914d9586 More RetroArch port fixes 2019-05-24 14:33:56 -07:00
meepingsnesroms
a63000884f Fix some oopsies 2019-05-24 13:53:07 -07:00
meepingsnesroms
5a38b67708 More work on RetroArch port 2019-05-24 13:36:41 -07:00
meepingsnesroms
97e00aaef2 Launcher now successfuly skips touch calibration
More work on keeping OS 4 and 5 separate too.
2019-05-23 17:23:31 -07:00
meepingsnesroms
82c767a7a0 Update libretro.c 2019-05-23 15:44:51 -07:00
meepingsnesroms
ab4788c921 Major speed and launcher cleanups 2019-05-23 15:25:15 -07:00
meepingsnesroms
c4eec6864b Launcher now makes filesystem images but the OS wont execpt them 2019-05-22 18:06:18 -07:00
meepingsnesroms
9b09d19e19 Switch to Tungsten T3, widescreen is more important than a keyboard 2019-05-22 14:51:00 -07:00
meepingsnesroms
3de2c67cae Tested more, this dosent slow down games, there just slow when doing a lot of stuff 2019-05-19 16:10:53 -07:00
meepingsnesroms
1d693ae10d Fix some buggy stuff 2019-05-19 15:55:38 -07:00
meepingsnesroms
1b3336c9af Clean up file accesses in frontend, remove timing hack, seems to be working 2019-05-19 13:45:56 -07:00
meepingsnesroms
4d88e893e0 Launcher work
Gonna try and make the launcher as simple as possible, no zip files, the frontend can handle that if it wants.

Going to make the Qt port launch directorys instead of files too since the file dialog only allows selecting files or directorys and some apps have resource files.
2019-05-18 20:01:28 -07:00
meepingsnesroms
2238274f51 Put back self modifying code check 2019-05-17 21:58:45 -07:00
meepingsnesroms
5b93a54b2b Win64 support is now working, Win32 also works with dynarec disabled now 2019-05-17 21:50:29 -07:00
meepingsnesroms
c89da48739 Fix crashing with ARMv5 core 2019-05-17 21:46:23 -07:00
meepingsnesroms
b6093dc8ca Work on launcher
Also tryed to get x86 windows working without dynarec enabled
2019-05-17 21:18:31 -07:00
meepingsnesroms
48ba518086 Work on launcher 2019-05-16 12:02:13 -07:00
meepingsnesroms
372d23e534 Update launcher.h 2019-05-14 10:34:22 -07:00
meepingsnesroms
125e85d73b Got Mac RetroArch build working with ARM emulator
Hopefully dident break ARM emulator on Windows.
2019-05-13 12:38:42 -07:00
meepingsnesroms
d70e2b02b9 Remove unneeded file access functions from ARM emulator 2019-05-13 11:53:43 -07:00
meepingsnesroms
a2058e2d73 Remove buffer_t stuff from RetroArch port, fix path names 2019-05-13 09:32:33 -07:00
meepingsnesroms
c7f8816541 Can now compile without the dynarec enabled, removed buffer_t 2019-05-12 23:09:36 -07:00
meepingsnesroms
6c53ade08b Start file launcher stuff 2019-05-12 20:50:54 -07:00
meepingsnesroms
d8abf3643d Update flx68000.c 2019-05-12 11:32:56 -07:00
meepingsnesroms
a80b783c71 More SD card optimizations 2019-05-12 11:10:38 -07:00
meepingsnesroms
06acab1345 Try to speed up SD card accesses, theoreticly should be a 10<->16x speed up 2019-05-11 13:34:07 -07:00
meepingsnesroms
8482c98010 Cleanups, add some Tungsten C timer stuff 2019-05-03 14:33:54 -07:00
meepingsnesroms
3c645bd0bd Move stuff, set proper ARM CPU ID 2019-05-01 13:25:52 -07:00
meepingsnesroms
368757023c Cleanups, add PCMCIA slot stuff to ARM 2019-05-01 13:06:06 -07:00
meepingsnesroms
4d803c6fc0 Clean up emulator*State* functions 2019-05-01 11:06:39 -07:00
meepingsnesroms
cb9093c5f4 Add all the OS5 stuff to the RetroArch makefiles 2019-04-25 11:19:37 -07:00
meepingsnesroms
fa5f85e77c Fix addr_cache stuff, now executing
Also tried to fix compiling with dynarec off, dont know it works yet though.
2019-04-24 19:19:44 -07:00
meepingsnesroms
1b5f4d215f Update Mu.pro 2019-04-24 17:15:28 -07:00
meepingsnesroms
55a2e97bc5 Clean ups
The dynarec is using the segmentation fault handler as a speed up, so debugging will be really hard.
2019-04-24 16:55:31 -07:00
meepingsnesroms
0a58122f4b Remove fixed SD card IDs, should help make Palm game carts work 2019-04-24 12:18:43 -07:00
meepingsnesroms
5a7191cd47 Fix ASM clang conflict
Add circle ci stuff, need to actually set it up though
2019-04-24 11:18:48 -07:00
meepingsnesroms
cee653b1a0 Remove block alignment requirement for SD card accesses
Also fix bug where a multiple block write could write to anywhere in host RAM
2019-04-24 11:10:10 -07:00
meepingsnesroms
0bf5f9f981 Fix 2 SEGFAULTs 2019-04-21 21:55:46 -07:00
meepingsnesroms
23f943ce8b Prepare for a test run 2019-04-21 21:39:16 -07:00
meepingsnesroms
9e98f29215 Attach IC part 2019-04-21 21:31:11 -07:00
meepingsnesroms
ee7fd8e676 Clean up and attach LCD stuff 2019-04-21 21:05:01 -07:00
meepingsnesroms
34e4b9ce7c Remove more calculator stuff from the dynarec
Increase MEM_SIZE define, start making module wrapper for the PXA255.
2019-04-21 19:05:48 -07:00
meepingsnesroms
4e7a08e6df Snowy plover 2019-04-21 14:49:35 -07:00
meepingsnesroms
ae6efb6b7b Now compiling with PXA255 code
Still only Windows x86_32.
2019-04-21 13:20:13 -07:00
meepingsnesroms
f1d1c3f051 Rename more Dragonball exclusive stuff
Dynarec is compiling on Windows x86_32, still not attached though.
2019-04-21 12:24:55 -07:00
meepingsnesroms
03101a5214 Almost seems to be compiling 2019-04-19 20:52:43 -07:00
meepingsnesroms
f4a6d6c1b0 Add dynarec stuff
This broke compiling for now.
2019-04-19 18:16:11 -07:00
meepingsnesroms
bb2698b498 Put more vars under the "dbvz" module 2019-04-19 11:21:11 -07:00
meepingsnesroms
48ff83d3af Merge pull request #72 from meepingsnesroms/removeOldArmCpu
Remove old arm cpu
2019-04-19 11:02:02 -07:00
meepingsnesroms
48d3983b72 Remove more old stuff 2019-04-19 10:59:32 -07:00
meepingsnesroms
f7f7b9d2d9 Remove ARM stuff from muExpDriver
Still keeping the driver around for potential speed hacks and overclock config.
2019-04-19 10:50:24 -07:00
meepingsnesroms
2244a1edd8 Cleanups prepare to add Tungsten C stuff 2019-04-19 10:38:35 -07:00
meepingsnesroms
f7c1dacba4 Start tunring m515 and dragonball stuff into modules
Prepareing for tungsten c support.
2019-04-19 09:35:14 -07:00
meepingsnesroms
47ba41fdc5 Clean up ARM references 2019-04-17 13:11:04 -07:00
meepingsnesroms
6df973a77c Remove ARM stuff from core 2019-04-17 13:03:38 -07:00
meepingsnesroms
180a8ba97f Add new feature bits to RetroArch port, update chunk info print format 2019-04-15 13:10:32 -07:00
meepingsnesroms
84c0c40f36 Set up FEATURE_DURABLE in GUI, fix settings icon not scaling 2019-04-15 13:00:50 -07:00
meepingsnesroms
8eae0b1ddd Update unimplementedHardware.txt 2019-04-15 12:00:54 -07:00
meepingsnesroms
efc3b9ca77 Fix consistncy of REG_PPC, it is now always the start address of the last opcode executed
Before there was an inconsistancy where it would be set to the current opcode when exiting the loop, that causes weird side effects and is completely unneeded since it will just be set the next time the loop starts anyway.
2019-04-14 22:36:20 -07:00
meepingsnesroms
4c27b1abb1 Print chunk misalignment details on fail 2019-04-14 21:05:52 -07:00
meepingsnesroms
e1a9162cc9 Locate another potential alignment check 2019-04-11 15:15:28 -07:00
meepingsnesroms
71af4b89a5 Update sandbox.c 2019-04-11 13:01:17 -07:00
meepingsnesroms
65db73b129 Patch another memory function to 32 bit alignment 2019-04-11 12:33:58 -07:00
meepingsnesroms
2270e8f112 List other functions that may need to be patched 2019-04-11 11:41:44 -07:00
meepingsnesroms
1b538a0bfe Some ASM updates 2019-04-11 11:38:08 -07:00
meepingsnesroms
8cd5dcb446 Locate another memory alignment check 2019-04-11 11:04:40 -07:00
meepingsnesroms
1ec53c904a Memory alignment tests are working
Shuffling memory is causing misalignment but allocation seems to always be 32 bit aligned now.
2019-04-11 10:51:11 -07:00
meepingsnesroms
f2233197e4 Add sandbox frame callback, make memory alignment test 2019-04-11 09:51:26 -07:00
meepingsnesroms
432233d8f1 It kinda works still 2019-04-09 11:07:03 -07:00
meepingsnesroms
07af2b45ec Fix MemChunkNew patches again 2019-04-09 00:28:19 -07:00
meepingsnesroms
d3540e3f77 Fix OS patch 2019-04-08 22:53:21 -07:00
meepingsnesroms
6c144a3e85 Add OS patch 2019-04-08 22:25:41 -07:00
meepingsnesroms
f166dd173b Add alignment info 2019-04-08 22:04:44 -07:00
meepingsnesroms
f11fdcdf18 ARM actually ran so I will just commit this
There is still severe issues with 32 bit alignment.
2019-04-08 21:28:15 -07:00
meepingsnesroms
1b407a4497 Make new patch for unaligned access since disabling it completely broke things 2019-04-08 18:53:50 -07:00
meepingsnesroms
81f0521165 Revert "Attempt to block 32 bit alignment requirement"
This reverts commit 79af40b61f.
2019-04-08 18:11:41 -07:00
meepingsnesroms
79af40b61f Attempt to block 32 bit alignment requirement
This didnt work so it will be reverted right after this commit.
2019-04-08 18:11:27 -07:00
meepingsnesroms
182a188cda More debug tools and tests, seems 32 bit alignment is still messing with ARM execution 2019-04-08 17:43:18 -07:00
meepingsnesroms
d34b0a0694 Fix invalid jump instruction 2019-04-08 15:01:43 -07:00
meepingsnesroms
a40b29dca4 Merge pull request #70 from meepingsnesroms/master
Copy fixes from master to armCpu
2019-04-07 11:50:43 -05:00
meepingsnesroms
e6262335d9 Incomplete, just syncing so I can install the repo on another computer 2019-04-07 09:34:05 -07:00
meepingsnesroms
c6174d335b Fix non PIC 68k assembly code, add support for MinGW 2019-04-07 09:30:20 -07:00
meepingsnesroms
c9138ec32a Put back old debug stuff that forwards MemPtrNew call
This debug version was not in a git commit, but the new one doesnt trigger.
2019-04-05 18:48:11 -07:00
meepingsnesroms
15d7d2dd54 Some ARM fixes 2019-04-05 11:33:38 -07:00
meepingsnesroms
424d07ce60 Add LED support, fix function not returning value 2019-04-05 07:25:04 -07:00
meepingsnesroms
857b4bbed3 Fixed buffer overflow of trap table 2019-04-04 21:49:30 -07:00
meepingsnesroms
90ed900001 Update libretro port, LED still dosent work 2019-04-04 18:41:29 -07:00
meepingsnesroms
20400675fa Expose memory watch API to MuExpDriver 2019-04-02 21:02:23 -07:00
meepingsnesroms
850064d498 Add basic ARMv5 support to sandbox, finish sandbox save and load state 2019-04-02 17:21:58 -07:00
meepingsnesroms
089090486c More cleanups
Almost have a decent debugger now
2019-04-02 14:24:32 -07:00
meepingsnesroms
dc200683e2 Move more logging stuff to sandbox
Register logging still isnt working though
2019-04-02 13:51:37 -07:00
meepingsnesroms
33002e9fb3 Cleanups, try and make sandbox C89 compliant 2019-04-02 12:35:20 -07:00
meepingsnesroms
992e1cda84 Begin adding ability to monitor app behavior with sandbox 2019-04-02 12:03:21 -07:00
meepingsnesroms
6ca82f22cc Add missing semicannoli 2019-03-31 12:39:57 -07:00
meepingsnesroms
bdb445fb72 Fixed debug stack reading 2019-03-31 12:24:28 -07:00
meepingsnesroms
806c95b20b Allow clearing key binds without assigning new ones 2019-03-30 11:40:12 -07:00
meepingsnesroms
6b488b8817 Add armv5Cpu struct to savestate, remove blobs again now that the 32 bit alignment requirement is gone
Also disabled more icache stuff since it had alignment restrictions and wasnt used anyway.
2019-03-29 17:19:03 -07:00
meepingsnesroms
e579e67b19 Clean up ARMv5 code 2019-03-29 13:22:02 -07:00
meepingsnesroms
d31862b435 Merge pull request #69 from meepingsnesroms/armCpu
Merge over important Qt updates
2019-03-27 11:45:18 -07:00
meepingsnesroms
ea8a4fd618 Update readme.md 2019-03-27 09:39:36 -07:00
meepingsnesroms
68d45bb396 Allow setting feature bits through GUI 2019-03-26 17:15:51 -07:00
meepingsnesroms
6b81ca4cc0 Keyboard support for Qt GUI
Theres now a settings panel too.
2019-03-26 11:51:02 -07:00
meepingsnesroms
9b39360288 Start adding a settings window and allow disableing onscreen buttons 2019-03-25 21:38:01 -07:00
meepingsnesroms
111220a17f Remove old print audio buffer code, disable opcode prefetch to keep compatibility 2019-03-25 14:30:14 -07:00
meepingsnesroms
f6bee9c9cf Separate the creator IDs of MuExpDriver and TstSuite
Apperently for applications the creator is a 4 char application name not actually the creator, otherwise the apps will be considered the same app.
2019-03-14 11:21:04 -07:00
meepingsnesroms
5f5ea20c66 Clean up MuExpDriver GUI
Decided not to let the user set the OS version, that will only cause more issues I will have to deal with down the line.
2019-03-13 12:32:11 -07:00
meepingsnesroms
60389c9a0e Add functions to operate on the trap dispatchers stack frame
Only really useful for 1 function, emuSysUnimplemented, will tell me what and where unimplemented API calls are coming from.

This takes advantage of the trap dispatcher being clueless as to the signature of the function its calling, if I just make the stack frame bigger then the real one it will capture some of the previous functions stack going backwards.

Havent verifyed the output of this yet though.
2019-03-12 15:31:41 -07:00
meepingsnesroms
df49ff3a4c Update MuExpDriver, doesnt do anything new though 2019-03-11 20:03:55 -07:00
meepingsnesroms
017797509e Now reads current CPU speed when opening the GUI 2019-03-08 12:23:41 -08:00
meepingsnesroms
96919e3458 More fixes 2019-03-08 11:55:12 -08:00
meepingsnesroms
968cafda58 Update MuExpDriver GUI, still needs work though 2019-03-08 10:51:05 -08:00
meepingsnesroms
1b1346fa7e Add safe mode flag, Chuzzle still doesnt work 2019-03-07 16:57:38 -08:00
meepingsnesroms
eb159b1e02 Increase accuracy of SD card resets 2019-03-07 12:44:34 -08:00
meepingsnesroms
a1ee77c9a5 Cleanups, disable ARMv5 icache
For some reason the new versions of MuExpDriver dont work with Chuzzle anymore.
2019-03-06 12:35:27 -08:00
meepingsnesroms
7f5c14baee Clean up ARM loader a bit
Gonna try to disable ARM alignment requirements next.
2019-03-06 11:41:21 -08:00
meepingsnesroms
89f50f88c5 Make sandboxOnMemoryAccess recursion safe, allow printing function name where error occurred 2019-03-03 20:31:55 -08:00
meepingsnesroms
419b18f170 Check LCD params on set not render, allow capturing memory accesses 2019-03-03 11:37:46 -08:00
meepingsnesroms
930e4f314c Fix reset button crashing when pressed before the emu is started 2019-03-03 10:49:14 -08:00
meepingsnesroms
89e193a091 Add reset button to Qt, optimize all the svgs 2019-03-02 11:14:08 -08:00
meepingsnesroms
fa98647959 Fix invalid writes to storage area
Also starting to render hires stuff, but crashes on BltChars
2019-03-01 21:04:01 -08:00
meepingsnesroms
11c392f8b6 Start implementing fake HwrDisplayAttributes 2019-03-01 14:06:58 -08:00
meepingsnesroms
dd8e8d2141 Add CSB1 memory mapping even though it has no chip, needed for accurate error handling
Cull some old fixed issues from the bug list.
2019-03-01 10:49:26 -08:00
meepingsnesroms
c5a094620a Add debug tags in Tungsten W driver install function 2019-02-28 13:05:43 -08:00
meepingsnesroms
53b5ea1e6b Ignore Tungsten W GPU driver, just want the new graphics API, not hardware drivers 2019-02-28 11:06:45 -08:00
meepingsnesroms
e3dbfaf369 Update muExpDriver 2019-02-28 10:19:19 -08:00
meepingsnesroms
d936c13205 320x320 stuff 2019-02-26 17:15:22 -08:00
meepingsnesroms
8d19f91487 Start working on hires mode 2019-02-26 14:13:16 -08:00
meepingsnesroms
f0d2b992da Remove duplicate reset code 2019-02-26 10:29:55 -08:00
meepingsnesroms
afa7462733 Merge pull request #68 from meepingsnesroms/armCpu
Fix 3 possible SD card corruption bugs
2019-02-26 10:19:59 -08:00
meepingsnesroms
e034878ee0 Fix 3 possible SD card corruption bugs
0 out SD card struct on load, should prevent a non zero pointer size from getting through and fixed the mask to include the 2, 4 and 8mb size bits, and put parentheses around the size mask to & before +.
2019-02-26 10:19:18 -08:00
meepingsnesroms
b637a6495f Merge pull request #67 from meepingsnesroms/armCpu
Fixes
2019-02-25 15:35:48 -08:00
meepingsnesroms
97cd9bc543 Can now get SD cards size properly on format, reduce offsets from 64 to 32 bit
If theres a > 4gb savestate, thats the problem, not the address bits in the offset.
2019-02-25 15:32:35 -08:00
meepingsnesroms
7660f2e64b Move CRC tables out of main file, start switch away from fixed CSD, having it breaks formating cards that arnt 1gb 2019-02-25 14:03:54 -08:00
meepingsnesroms
cd3acf4c98 Merge pull request #66 from meepingsnesroms/armCpu
Mu v1.0.0
2019-02-25 10:32:51 -08:00
meepingsnesroms
338aa7ed4e Enable SD access on RetroArch port 2019-02-25 10:27:58 -08:00
meepingsnesroms
d43d9c637f v1.0.0 prep 2019-02-25 09:18:01 -08:00
meepingsnesroms
a51a549ecd Remove USB hack 2019-02-25 08:45:11 -08:00
meepingsnesroms
7c0a2b0dde Write works add new SD card vars to save states 2019-02-25 06:46:48 -08:00
meepingsnesroms
1543c35f49 Writing now works with hack, dont know what causes the desync
Just need to remove this hack and the NOP patch applied to the serial/USB print routine and then I will be ready for another release
2019-02-24 23:15:18 -08:00
meepingsnesroms
0710c2cf26 May have an idea of what is wrong with SD writes
Also add a common sense limit of 2gb to the SD card insert routine.
2019-02-24 21:54:36 -08:00
meepingsnesroms
31fbd559f5 Still gives error on write but seems to actually write the data, at least the first block
Dont know what is wrong yet.
2019-02-24 16:57:03 -08:00
meepingsnesroms
57c24f55d6 SD card write is starting to work 2019-02-24 14:52:16 -08:00
meepingsnesroms
0290174a7e SD card now reads properly 2019-02-24 13:15:00 -08:00
meepingsnesroms
5cc6f229c1 Will attempt to format the card now, but will fail because writes arnt implemented 2019-02-24 11:40:23 -08:00
meepingsnesroms
ff04a096b9 Actually send the data instead of sending the token 512 times
SD card now displays properly at least, data transfer is still broken.
2019-02-24 11:25:28 -08:00
meepingsnesroms
fb9bd5243d Try to get SD card multiblock read working, its still not though 2019-02-23 14:56:07 -08:00
meepingsnesroms
915e7d3247 Almost have single block read working on SD card 2019-02-23 13:25:27 -08:00
meepingsnesroms
42852dc331 Add large FIFO for SD card responses, can now read the OCR, CSD and CID 2019-02-23 11:17:30 -08:00
meepingsnesroms
1662655786 Now initializes SD card, but gives up after reading OCR 2019-02-22 13:35:41 -08:00
meepingsnesroms
3f0e0baca0 Almost able to fully initialize SD card 2019-02-22 13:11:53 -08:00
meepingsnesroms
d802e93681 Add SD card response bits 2019-02-22 12:08:01 -08:00
meepingsnesroms
142b8152d8 More SD card stuff 2019-02-22 11:36:40 -08:00
meepingsnesroms
8dbc416bfd SD card init step 1 now works, needed to unset the XCH bit 2019-02-22 09:57:08 -08:00
meepingsnesroms
0cdf24711b More SD card stuff 2019-02-21 13:26:55 -08:00
meepingsnesroms
3cb346bbbb Remove old feature bits 2019-02-21 11:41:47 -08:00
meepingsnesroms
a57d45862e Use lowercase paths like pilrc 2019-02-21 11:03:31 -08:00
meepingsnesroms
c7dc657de5 Fix 2 bitmap converter bugs, all the icons work now 2019-02-21 10:22:52 -08:00
meepingsnesroms
a1dba7bb9f Move expansion hardware stuff 2019-02-20 12:43:31 -08:00
meepingsnesroms
d39eb886f1 Add remaining standard accessors for SED1376 2019-01-24 12:41:58 -08:00
meepingsnesroms
afb43ff3eb Change how ARM stack is set, add memalign functions
Need to patch the Palm OS malloc function to always allocate 32 bit aligned too.
2019-01-23 14:28:11 -08:00
meepingsnesroms
7c585bd242 Add simple accessors for SED1376 timing registers 2019-01-21 20:54:21 -08:00
meepingsnesroms
d305fe4dfc Update muExpDriver add a GUI(its still nonfunctional though) 2019-01-21 19:25:09 -08:00
meepingsnesroms
fac89d59bb Merge pull request #56 from meepingsnesroms/armCpu
Arm cpu
2019-01-20 22:29:42 +00:00
meepingsnesroms
f9229590f5 Add CPU speed to muExpDriver 2019-01-20 14:26:51 -08:00
meepingsnesroms
64ec6f6e91 Allow the emulator to set its own speed, prep for Chuzzle
This is far cleaner than a normal overclock, its always 100% on boot to allow normal init and custom speeds can be set per app, this was not doable with just FEATURE_FAST_CPU doubling the clock speed.
2019-01-20 10:08:00 -08:00
meepingsnesroms
133484b0dc Put memory saving back to normal
First OS 5 game is running, its not ARM though.
2019-01-19 09:41:06 -08:00
meepingsnesroms
7b39db4782 Update memory comments, add value to ARMv5 save state 2019-01-17 19:33:01 -08:00
meepingsnesroms
8a990b2839 Increase ADS7846 accuracy, implement PLLFSR 8 bit reads, enable logging on all unemulated regiser accesses 2019-01-17 13:45:11 -08:00
meepingsnesroms
4f96b53bb1 Make return/break syntax match for all memory accessors 2019-01-16 19:40:09 -08:00
meepingsnesroms
6ba1e42926 Match switch/return style, THE LAST COMMIT AND THIS HAVE BROKEN RAM ACCESS
Running experiments on larger RAM sizes, normal RAM access is broken right now.
2019-01-16 14:37:18 -08:00
meepingsnesroms
424a0cb5a5 Too much stuff to list 2019-01-16 14:21:38 -08:00
meepingsnesroms
8304eb33f9 More driver work 2019-01-11 15:54:34 -08:00
meepingsnesroms
0b645f8d7e Fix invalid SDK patch, try to add basic GUI 2019-01-10 10:16:19 -08:00
meepingsnesroms
f02bba3755 Start work on GUI 2019-01-10 09:05:45 -08:00
meepingsnesroms
1282d1b2b7 Put all the *.func blobs back, everything compiles
Presumably ARM should run now as is if there isnt any more unforseen circumstances.
2019-01-10 08:53:56 -08:00
meepingsnesroms
23b5fc6456 In emulation there is no right or wrong, only success or failure
The ARM blobs are back, they were checked with online dissasembler, no more low level ARM C compiling, its too much work.
2019-01-09 20:59:02 -08:00
meepingsnesroms
60b14cf79b This was a horrible experince, prc-tools is shit
There is no way to reliably write to a register in C, volatile is broken, optimizations cant be disabled, and the standalone code resource macros only work in C, so getting the correct register state for hypercall is impossible without making binary blobs at least for ARM, the 68k blob function seems OK to optimize since it isnt interrupted.
2019-01-09 19:47:14 -08:00
meepingsnesroms
def07b53d0 Ok, ARM blobs seem to be compiling 2019-01-09 11:47:17 -08:00
meepingsnesroms
e885942603 Remembered the register keyword, can just do the stack stuff in C with no vars on stack 2019-01-09 10:49:18 -08:00
meepingsnesroms
bf2163b21d This function seems to be done, now comes ARM asm 2019-01-09 09:29:28 -08:00
meepingsnesroms
02033457de Try to match Palm OS call format exactly
Not tested yet
2019-01-09 08:19:35 -08:00
meepingsnesroms
7e17a5a3e8 Add asm stuff 2019-01-08 21:34:33 -08:00
meepingsnesroms
5d4df87b7c Implement the ASM functions in psudocode
Have to manually compile it bit by bit then endian swap the ARM opcodes
2019-01-08 19:12:53 -08:00
meepingsnesroms
d16f495f1c Write C part of PceNativeCall handler 2019-01-08 16:16:54 -08:00
meepingsnesroms
7581114be6 Allow setting device IDs to match the screen and CPU type 2019-01-08 12:19:16 -08:00
meepingsnesroms
84d96c29d7 Early commit, unfinished
I am going to be pushing unfinished commits more now becuse my dev laptop is on the decline and I dont want to lose progress.
2019-01-08 11:19:11 -08:00
meepingsnesroms
fa7194f1f5 Commit finished, custom IO is working 2019-01-07 20:03:11 -08:00
meepingsnesroms
fad58ee6f3 Unfinished, computer is acting physically broken
May not work anymore after reboot so Ill just commit now.
2019-01-07 16:53:55 -08:00
meepingsnesroms
32f440a26d Correct code style a bit 2019-01-04 15:02:22 -08:00
meepingsnesroms
6d2466cf3b muExpansionDriver now compiles!!! 2019-01-04 13:29:36 -08:00
meepingsnesroms
e4625f1233 Try to get muExpansionDriver compiling, still not compiling though 2019-01-04 12:56:16 -08:00
meepingsnesroms
512dd785f6 Work on OS side driver, use (void) instead of () in Palm tools 2019-01-04 12:02:38 -08:00
meepingsnesroms
e1ef2fe5a1 ARM now seems to be fully attached, also hooked up more emu commands(Ill need them later anyway)
Just need to write the driver and get save states working for ARM.
2019-01-04 11:06:50 -08:00
meepingsnesroms
7238544735 Add more ARM stuff 2019-01-03 14:00:34 -08:00
meepingsnesroms
b3c2d4c09b Start emu side driver, ...
Label 64 bit constants to prevent them form being truncated, remove EMU_CMD_KEY, nothing is going to make arbitrary writes to the space I am using.
2019-01-02 17:13:01 -08:00
meepingsnesroms
2d1fcbdfb9 Attach more hardware registers 2019-01-01 14:01:00 -08:00
meepingsnesroms
bf65ad9b38 ARM stuff step 1
Dont know how many steps this will take, its very complicated :)
2019-01-01 12:13:59 -08:00
meepingsnesroms
b39797da21 Merge pull request #55 from meepingsnesroms/devel
Devel
2018-12-31 19:20:39 +00:00
meepingsnesroms
8b008aa575 Clean up flx68000PcLongJump remove more safety checks from release builds 2018-12-31 11:19:13 -08:00
meepingsnesroms
20f1e8b2ed Remove old function 2018-12-31 09:46:40 -08:00
meepingsnesroms
1ce59ac0f6 Merge pull request #54 from meepingsnesroms/devel
Update code for fast local memory access
2018-12-31 17:13:33 +00:00
meepingsnesroms
9761b9baca Update code for fast local memory access 2018-12-31 09:03:36 -08:00
meepingsnesroms
cdc74a654e Merge pull request #53 from meepingsnesroms/devel
Redo all the CPU stuff again
2018-12-30 01:49:09 +00:00
meepingsnesroms
4144f7c8b6 Prevent unaligned 32 bit accesses 2018-12-29 17:46:11 -08:00
meepingsnesroms
a9fbe45d52 Try to move cyclone speedups to musashi since cyclone is gone 2018-12-29 14:05:20 -08:00
meepingsnesroms
6829ed6f81 Finish removing cyclone 2018-12-29 12:05:48 -08:00
meepingsnesroms
f34256ba69 No more cyclone 2018-12-29 11:40:04 -08:00
meepingsnesroms
97397d49ee Merge pull request #52 from meepingsnesroms/devel
Disable cyclone again
2018-12-29 00:58:40 +00:00
meepingsnesroms
adbd803dc9 Merge pull request #51 from meepingsnesroms/devel
Devel
2018-12-28 04:33:13 +00:00
meepingsnesroms
1fb14b6675 Merge pull request #50 from meepingsnesroms/devel
Fix link.T for classics
2018-12-24 21:00:25 +00:00
meepingsnesroms
91995814dd Merge pull request #49 from meepingsnesroms/devel
Fix returning port k for port f
2018-12-22 19:57:10 +00:00
meepingsnesroms
ba9e6f2a6e Merge pull request #48 from meepingsnesroms/devel
Fix naming convention in hwrTestSuite
2018-12-21 04:25:17 +00:00
meepingsnesroms
c49889b030 Merge pull request #47 from meepingsnesroms/devel
Get tests and emu in sync, fix typo
2018-12-21 04:21:02 +00:00
meepingsnesroms
6cdfec1fd9 Merge pull request #46 from meepingsnesroms/devel
Add issue template
2018-12-14 01:37:46 +00:00
meepingsnesroms
17d0df1bc9 Merge pull request #45 from meepingsnesroms/devel
Try to redo port d interrupts again, they all seem to be right this time
2018-12-13 05:28:33 +00:00
meepingsnesroms
1a2993df55 Merge pull request #43 from meepingsnesroms/devel
Misc fixes
2018-12-10 20:23:22 +00:00
meepingsnesroms
8f5a6d1279 Merge pull request #42 from meepingsnesroms/devel
No cyclone for iOS, it really doesnt want to work
2018-12-09 17:42:59 +00:00
meepingsnesroms
4ba20d67e2 Merge pull request #41 from meepingsnesroms/devel
Test cyclone on iOS again
2018-12-09 17:32:32 +00:00
meepingsnesroms
9f701da401 Merge pull request #40 from meepingsnesroms/devel
Android fix
2018-12-08 20:17:47 +00:00
meepingsnesroms
fcb56ff523 Merge pull request #39 from meepingsnesroms/devel
More makefile changes
2018-12-08 19:28:27 +00:00
meepingsnesroms
274b5f6e6f Merge pull request #38 from meepingsnesroms/devel
Just disable asm on iOS for now
2018-12-08 16:40:42 +00:00
meepingsnesroms
f9fe7b69dc Merge pull request #37 from meepingsnesroms/devel
Please work now
2018-12-08 16:25:39 +00:00
meepingsnesroms
f6d688987c Merge pull request #36 from meepingsnesroms/devel
Split clang and GCC version of Cyclone since they each wont accept so…
2018-12-08 16:07:23 +00:00
meepingsnesroms
406bf692ee Merge pull request #35 from meepingsnesroms/devel
Enable Cyclone68k
2018-12-08 08:35:13 +00:00
meepingsnesroms
a4142a25e1 Merge pull request #34 from meepingsnesroms/devel
Add overlay, make button map match overlay
2018-12-07 18:39:24 +00:00
meepingsnesroms
8059920bfb Merge pull request #33 from meepingsnesroms/devel
Update version info
2018-12-06 18:14:54 +00:00
meepingsnesroms
7081547823 Merge pull request #32 from meepingsnesroms/devel
Fix power button bug
2018-12-05 21:53:59 +00:00
341 changed files with 84271 additions and 473150 deletions

15
.circleci/config.yml Normal file
View File

@@ -0,0 +1,15 @@
# Use the latest 2.1 version of CircleCI pipeline processing engine, see https://circleci.com/docs/2.0/configuration-reference/
version: 2.1
# Use a package of configuration called an orb, see https://circleci.com/docs/2.0/orb-intro/
orbs:
# Declare a dependency on the welcome-orb
welcome: circleci/welcome-orb@0.3.1
# Orchestrate or schedule a set of jobs, see https://circleci.com/docs/2.0/workflows/
workflows:
# Name the workflow "Welcome"
Welcome:
# Run the welcome/run job in its own container
jobs:
- welcome/run

5
.gitignore vendored
View File

@@ -3,7 +3,7 @@
*.dll
*.so
*.dylib
*.pro.user
*.pro.user*
*_emscripten.bc
/libretroBuildSystem/obj
/libretroBuildSystem/libs
@@ -11,9 +11,10 @@
/tools/palm/hwTestSuite/*.bin
/tools/palm/hwTestSuite/*.grc
/tools/palm/hwTestSuite/*.prc
/tools/palm/hwTestSuite/armCode
/tools/palm/hwTestSuite/TstSuite
/tools/palm/hwTestSuite/TstSuite-sections.s
/tools/palm/hwTestSuite/TstSuite-sections.ld
/tools/desktop/build-BufferGraphViewer-*
/tools/desktop/build-MakePalmIcon-*
/tools/desktop/build-MakePalmBitmap-*
/tools/desktop/export16BitImageProperly/convert

6
bugs/accidentalFinds.txt Normal file
View File

@@ -0,0 +1,6 @@
Bugs in other peoples code I found while writing Mu, haven't followed up on them yet:
(RetroArch)RETRO_ENVIRONMENT_GET_MIDI_INTERFACE states its passed a pointer to a pointer but its just a pointer to a struct
(RetroArch)"led_driver" setting is not exposed to GUI
(RetroArch)retro_set_environment will sometimes be called multiple times and provide invalid values fetching environment variables on the subsequent calls, this will cause function pointers to be corrupted if they are not checked for validity first
Fixed:

1
bugs/currentBug.txt Normal file
View File

@@ -0,0 +1 @@
T3 locks up endlessly checking TSC2101 interrupts

View File

@@ -1,18 +0,0 @@
0x9bdfeacc 0f 10 08 e2 and r1, r8, #15
0x9bdfead0 <+0x0004> 01 11 d7 e7 ldrb r1, [r7, r1, lsl #2]
0x9bdfead4 <+0x0008> 01 2c b0 e1 lsls r2, r1, #24
0x9bdfead8 <+0x000c> 02 a1 02 e2 and r10, r2, #-2147483648 ; 0x80000000
0x9bdfeadc <+0x0010> 01 a1 8a 03 orreq r10, r10, #1073741824 ; 0x40000000
0x9bdfeae0 <+0x0014> 1e 2c 08 e2 and r2, r8, #7680 ; 0x1e00
0x9bdfeae4 <+0x0018> a2 03 97 e7 ldr r0, [r7, r2, lsr #7]
0x9bdfeae8 <+0x001c> 01 30 80 e2 add r3, r0, #1
0x9bdfeaec <+0x0020> a2 33 87 e7 str r3, [r7, r2, lsr #7]
0x9bdfeaf0 <+0x0024> 0f e0 a0 e1 mov lr, pc
0x9bdfeaf4 <+0x0028> 74 f0 97 e5 ldr pc, [r7, #116] ; 0x74
0x9bdfeaf8 <+0x002c> b2 80 d4 e0 ldrh r8, [r4], #2
0x9bdfeafc <+0x0030> 08 50 55 e2 subs r5, r5, #8
0x9bdfeb00 <+0x0034> 08 f1 96 c7 ldrgt pc, [r6, r8, lsl #2]
0x9bdfeb04 <+0x0038> a3 fb ff ea b 0x9bdfd998 <CycloneEnd>
Crashed with SIGSEGV
When compiled in release mode crashes with SIGILL

View File

@@ -1,87 +0,0 @@
The datasheet states:
When external interrupts INT[3:0], IRQ1, IRQ2, IRQ3, and IRQ6 are programmed as edge-triggered interrupts, they can be cleared by writing a 1 to the corresponding status bit in the interrupt status register in the interrupt controller. When programmed as level-triggered interrupts, these interrupts are cleared at the requesting sources.
But all attempts to use the INT* pins as edge triggered have failed and they continue as level triggered
PDIUSBD12 uses CSA1 and CPU A1 as USB A0
All of the interrupt signals in the table can be used as system wake-up interrupts, except for the edge interrupt on INT[3:0]. Edge interrupts on INT[3:0] can only interrupt the CPU when the system is awake. The INT[3:0] signals are all level 4 interrupts, but IRQx has its own level. Any combination of Port D signals and OR (negative logic) can be selected to generate keyboard (KB) interrupts to the CPU. The KBx signal is an active low, level-sensitive interrupt of the selected pins. Like the other ports, each pin can be configured as an input or output on a bit-by-bit basis. When they are configured as inputs, each pin can generate a CPU interrupt.
CS(A/B/C/D)1 seem to not be connected, only CS*0 is used
PFPUEN has both pull up and pull down on it, the 4 address lines are the pull downs
cmp.* seems like it can only set the Carry flag if the result or one of the parameters is negative
The first argument to a function is the last pushed on the stack(proof below, the 16 bit int is the last argument and its pushed first)
ROM:1003026C move.w d0,-(sp) ; Move Data from Source to Destination
ROM:1003026E move.l a4,-(sp) ; Move Data from Source to Destination
ROM:10030270 move.l d7,-(sp) ; Move Data from Source to Destination
ROM:10030272 trap #$F ; Trap sysTrapStrNCopy
ROM:10030272 dc.w $A2CE
Char * StrNCopy(Char *dst, const Char *src, Int16 n)SYS_TRAP(sysTrapStrNCopy);
HwrIRQ4Handler Interrupt Level 4 Priority(top of the list is checked first):
UART 1 and 2(they have the same priority)
RTC
All Buttons
IVR = 0x18
interrupt vector start = 0x60
vectors starting at level 0(no interrupt) to level 7
0x00000060:0x00000000 (no interrupt, never called)
0x00000064:0x101904BE
0x00000068:0x101904EC
0x0000006C:0x1019051A
0x00000070:0x10190548 (level 4, hardware buttons)
0x00000074:0x10190576 (level 5, seems to be touchscreen)
0x00000078:0x101905A4
0x0000007C:0x10015F34 (level 7, debugging IRQ, not used)
SPI Routine Location:
PrvSetBB7846ChanRef or PrvReadnBB7846PwrDn
0x10081518
SPI Start Chunk(sent once on boot):
12 4 bit delay, 8 bit check battery command, 0x0AE0
5 5 bit receive, continued from last command, 0x0014
Palm OS reads from the touchscreen SPI in 5 accesses:
SPI2 transfer, ENABLE:true, XCH:true, IRQ:false, IRQEN:false, BITCOUNT:16(printed 1 times)
SPI2 transfer, before:0xE01B, after:0x00FF(printed 1 times)
SPI2 transfer, ENABLE:true, XCH:true, IRQ:false, IRQEN:false, BITCOUNT:3(printed 1 times)
SPI2 transfer, before:0x0004, after:0x0026(printed 1 times)
SPI2 transfer, ENABLE:true, XCH:true, IRQ:false, IRQEN:false, BITCOUNT:5(printed 1 times)
SPI2 transfer, before:0x001D, after:0x03BF(printed 1 times)
SPI2 transfer, ENABLE:true, XCH:true, IRQ:false, IRQEN:false, BITCOUNT:12(printed 1 times)
SPI2 transfer, before:0x0E1C, after:0xCE00(printed 1 times)
SPI2 transfer, ENABLE:true, XCH:true, IRQ:false, IRQEN:false, BITCOUNT:16(printed 1 times)
SPI2 transfer, before:0xE01C, after:0xFEFF(printed 1 times)
resync event?{
16 0xE01B
3 only sends 0s, delay or receive, 0x0004
5 only sends 0s, delay or receive, 0x001D
}
12 4 bit delay, 8 bit send command, 0x0E1C
16 0xE01C
TouchScreen Read Order:
//check x
Accessed ADS7846 Ch:5, Normal Mode, Power Save:0, PC:0x1008119E.(printed 1 times)
//don't know why
Accessed ADS7846 Ch:0, Normal Mode, Power Save:3, PC:0x10081208.(printed 1 times)
//don't know why
Accessed ADS7846 Ch:6, Normal Mode, Power Save:3, PC:0x10081208.(printed 1 times)
//...repeat until released
//check battery before returning
Accessed ADS7846 Ch:2, Normal Mode, Power Save:3, PC:0x10081208.(printed 1 times)

6
bugs/fixed/T3Crash.txt Normal file
View File

@@ -0,0 +1,6 @@
10:32:11: Debugging starts
mincore\com\oleaut32\dispatch\ups.cpp(2125)\OLEAUT32.dll!00007FFE26F51D23: (caller: 00007FFE26F51E9A) ReturnHr(1) tid(1870) 8002801D Library not registered.
QObject::~QObject: Timers cannot be stopped from another thread
10:32:24: Debugging has finished
Just a crash from killing the program due to a buffer overflow.

View File

@@ -0,0 +1,14 @@
chip select may not be readable from CPU
Need to investigate:
HwrSpiCsSet_100AC772
CPU read 8 bits from register 0x704, PC:0x100A5976.(printed 65536 times)
It may not be reading back at all, because it sure keeps trying.
This is SPICONT1, the only purpose this many reads could accomplish is checking if an exchange is in progress.
it seems the write response is off by 1 bit, i don't know why
Fixed:
XCH bit was not being cleared

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
Release at Christmas 17:00 GMT, 9:00 My time, 12:00 SquirrelJME devs time
I post to r/emulation, Stephanie(SquirrelJME dev) posts to Twitter and Mastodon
Cinco De Mayo(May 5th), 17:00 GMT, hopefully with some good ARM stuff(delayed again)
Easter release, 17:00 GMT, hopefully with some good ARM stuff(delayed)
Done:
Release at Christmas 17:00 GMT, 9:00 My time, 12:00 SquirrelJME devs time
I post to r/emulation, Stephanie(SquirrelJME dev) posts to Twitter and Mastodon
Sister projects with SquirrelJME: https://github.com/XerTheSquirrel/SquirrelJME

View File

@@ -1,10 +1,12 @@
This is like unimplementedHardware.txt but only lists things that have functionality issues not accuracy issues.
UGUI file picker for RetroArch
State manager goes bezerk and crashes when saving on android, also can't close the window or it won't open again(also only on Android)
If there is no userdata-en-m515.ram on Android the emu won't create it(this is likely because theres no graceful exit being done on Android only goto home menu and kill process)
app install hack needs to be removed when SD card works
Fixed:
app install hack needs to be removed when SD card works(done, its only enabled in developer mode for fast testing)
cyclone68k is broken on iOS(not gonna happen, iOS supposedly has its own ASM syntax)
double pressing power button issue(better without PDKBEN but still not correct)
Holding the buttons emulates pressing them like a turbo button(may be caused by the lack of sound emulation(wrong, sound works now))(may be because the minimum length of a button press is a whole frame(wrong, increasing the framerate doesn't change this behavior))(port d doesn't seem to be documented properly)

View File

@@ -1,5 +0,0 @@
cyclone68k is crasing again when you turn the Palm off then turn it back on
Fixed:
Endian compatibility is broken(the CPU state needs to be standardized)(fixed again with musashi and the other 68k core isn't used right now)
RetroArch port crashes on exit(needed to check if environ_cb returned true, switched to libretro-common filestreams too)

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

View File

@@ -0,0 +1,4 @@
Whenever I register ShadowThief, this happens:
It happens on any version of Mu
PHEM/ST is fine

View File

@@ -1,9 +1,6 @@
CPU:
sysTrapPceNativeCall, ARM Emulator
Trace T1 bit, should be unused by the OS and applications anyway
Test what bits of IMR are writable
SCR privilege violation doesnt trigger the same as on hardware(likely has to do with not emulating the unused chip selects)
TCN2 is unimplemented and seems to be used by the same routines that turn the CPU off for sleep mode
hardware registers don't have there names printed in sandbox
CPU I/O:
Peripheral Control Register, audio ppm mixing selection
@@ -11,7 +8,6 @@ Setting the battery dead bit(PDDATA 0x80) if the emulated battery percent gets t
DRAMC write enable
Port M Infrared shutdown (PMDATA 0x20)
some undocumented I/O might be on port e and port j
SPI1, probably the SD card since SD cards use SPI for data transfer
SPITEST SSTATUS is undocumented and therefore unemulated
When SPICLK2, SPITXD or SPIRXD on port e is disabled ADS7846 functions should respond appropriately(not transmitting or receiving or blocking both for the clock)
REFREQ clock frequency in RTCCTL should slow down the RTC when enabled
@@ -20,40 +16,91 @@ SPI1 slave mode, should never be used
RxOverflow on SPI1, don't know if back or front of FIFO is overwritten on overflow(currently losing oldest entry)
ICR POL(1,2,3,6) may flip the pin value as well as the interrupt, POL5 does not flip the INT5 pin though, this was confirmed with a hardware test(it doesnt seem to but there is instability on the pin when the SD card is plugged in, this may have to do with card detect also being a data line on the SD pinout)
PWM2 is not implemented
don't know if flushing the PWM1 FIFO sets all the bytes to 0x00, or just sets the read pointer to the write pointer preserving the newest sample and making the size 0(readPtr = writePtr has significantly cleaner audio then 0ing it out though)
while it is stated that the PLL is turned off "30 clocks" after the DISPLL bit is set, it doesnt state where the clocks come from, CLK32 or SYSCLK
SPI1 SPISPC register
UART1 USTCNT1
PLLFSR has a hack that makes busy wait loops finish faster by toggling the CLK32 bit on read, for power button issue
should also not transfer data to SD card when MOSI, MISO or SPICLK1 are disabled
port d data register INT* bits seem to have there data bits cleared when an edge triggered interrupt is cleared(according to MC68VZ328UM.pdf Page 10-15)
Cyclone will cause SIGSEGVs, don't know why yet(seems to have been caused by compressed jumptable)
sound plays too long when the category's menu is selected on the home screen and the pen is pressed and held in the middle of the screen(only happens there, other views of the same type don't have this issue)(effected by CPU speed, turning it up reduces the duration of the excess squeal)(the home menu may be changing the clock speed when this menu is released since it refreshes a bunch of icons which is CPU intensive, if it is it would distort the audio since sysclks are only calculated at the begining of a frame the new value would not take effect until a new frame began, and since it works properly sometimes that is probably when the change occurs just at the end of the last frame and the sysclk duration refresh happens at the intended time due to the new frame starting)
UART1 OLD DATA interrupt uses timing, may just have this be the same a DATA READY
SPI1 rxOverflow is may not be emulated exactly as its supposed to be, the overflow data is written to the newest FIFO byte when it should probably be written to the oldest
UART CTS pin is not emulated
since actual UART hardware is not being used should be safe to ignore the parity bit and timing
Memory:
SD card can't be read or written to by Palm OS
unknown if DRAM bit expanded address space is used for CSC when its not an extension of CSD
there is conflicting information on whether the DRAM bit effects CSC, needs a test made
the unemulated chip selects(CSB1, CSC0/1) privilege violation interrupts will not be handled properly
may need to emulated CSC0/1 chip selects
SED1376:
swivelview register
ADS7846:
verify chip select(no test has been done yet, but everything points to port g bit 2)
need to trigger a false PENIRQ interrupt on reading certain channels
electrical noise on lines(conversions probably should have +-20 added to values)(probably no need for this, it works so theres no need to use less precise values)
in the edge case that SPICLK2 is disabled while using ADS7846 and a 1 was the last bit shifted out 0s will still be shifted in
need to to verify behavior of differential mode bit
TSC2101:
values of AUX1 and AUX2 are unknown an need to be tested, emulation has issues with the USB port shortly after and it would make sense that since the T3 has the same connector as the m515 AUX1 is the device type resistor in the bottom connector
SD Card:
block specific write protect bits don't work
IRQ2 may actually be attached to the SD Card data out pin, triggering an interrupt when a 0 is received to process the return data
need to test if Port J Pin 3(SD card chip select) is attached to Port D Pin 5(SD Card Status(IRQ2))(pinouts.ru says chip select and card detect are the same line)
This thing: case SEND_STATUS://HACK, need to add real write protection, this command is also how the host reads the value of the little switch on the side
Debug tools:
ADS7846 channels can't be read in single reference mode in hwTestSuite
Mu sandbox dosent have memory and opcode hooks setup when in ARMv5 mode
MakePalmBitmap:
Other:
Qt port dosent support Windows touchscreen input
memory dumping dosent work for OS 5 yet
T3 I2C currently has no ACK bits(should work without them its just inaccurate)(I2C works fine though)
T3 emulation attempts to set GPIO1(reset button) as an output
GPIO lines from misc chips to CPU are not implemented
PXA260 idle mode is unimplemented
Fixed:
Endian compatibility is broken(the CPU state needs to be standardized)
RetroArch port crashes on exit(needed to check if environ_cb returned true, switched to libretro-common filestreams too)
make the headers belong to the main file of the target chip being emulated for specs
remove specs folder
UART1 USTCNT1
trying to beam anything will lock up the OS
Qt dosent have a hybrid file/folder selector so apps will always have to be launched from folders for now
File Installer isnt working yet
Qt GUI dosent resize properly with 320x320 framebuffer
PLLFSR has a hack that makes busy wait loops finish faster by toggling the CLK32 bit on read, for power button issue(removed, power button works as expected if you wait at least 2 seconds before pushing it again(makes sence that it cnat read the new press while its turning off the CPU))
(CPU)VFP(floating point) coprocessor for ARM(dont think the ARM Palms even used VFP)
(Other)need to get rid of buffer_t, its not used much anyway
ARM dynarec SIGSEGVs on exit(pushing play in the debugger still lets it continue, dont think this is a bug)
(Feature)need to add FEATURE_DURABLE which will ignore CPU errors, increasing stability at the cost of bugginess
(RetroArch port)set the alarm LED using retro_set_led_state_t on RetroArch
(CPU I/O)SPI1 SPISPC register(this is just a clock divider used to slow transfers to allow the voltages to settle, since the emu has no voltages all transfers are just instant)
(CPU)TCN2 is unimplemented and seems to be used by the same routines that turn the CPU off for sleep mode(it is implemented now and it wasn't the cause of the sleep mode issue)
(CPU)SCR privilege violation doesnt trigger the same as on hardware(likely has to do with not emulating the unused chip selects)(I added those chip selects)
(CPU)Trace T1 bit, should be unused by the OS and applications anyway(this was fixed long ago, don't know why it was still listed?)
(SD Card)data blocks won't work properly when CRC checks are enabled
(SD Card)the CRC of CSD and CID are invalid
unemulated chip select(CSB1) privilege violation interrupts are not handled properly
SD card can't be inserted in RetroArch port
USB chip seems to share an interrupt with the SD card(the SD card interrupt is unimplemented at boot and triggers a printf over USB instead, if USB is not properly emulated that will cause a lock up)(enough of the USB is now emulated to prevent this)
(SD Card)need to an input option for the write protect switch on the side of the SD card(will be fixed at input time since you can't flip it when in the slot)
(SD Card)memory block ordering is broken
(SD Card)block length is fixed at 512 right now(this is actually proper behavior for newer SDSC cards)
(SD Card)need to dump valid SCR
(SD Card)SEND_SCR may not be sending in the proper format(the return data format was not specified in the spec I read)(data packet format is working)
SPI1(the SD card interface)(SPI1 master mode seems fully implemented now)
SD card can't be read or written to by Palm OS(SPI transactions are going both ways now, some flash chip read commands are implemented too)
(ADS7846)need to trigger a false PENIRQ interrupt on reading certain channels(this is being done now)
(MakePalmBitmap)the small icons are corrupt
(MakePalmBitmap)the non 16 bpp large icons are corrupt
need to test if Port J Pin 3(SD card chip select) is attached to Port D Pin 5(SD Card Status(IRQ2))(pinouts.ru says chip select and card detect are the same line)(IRQ2 doesnt change when SD card chip select is toggled regardless of wether the card is inserted)
the "Fatal Error" dialog reset button doesnt work, may not be a bug, could just an be issue with certain errors needing a full reset(its error dependent, one bug proved the other bug wasn't actually a bug)
don't know if flushing the PWM1 FIFO sets all the bytes to 0x00, or just sets the read pointer to the write pointer preserving the newest sample and making the size 0(readPtr = writePtr has significantly cleaner audio then 0ing it out though(they sound the same now, this just masked the actual issue))
edge triggered INT* don't clear on write to ISR when masked in IMR(I needed to use (ints & ~IMR) not (ints & IMR) which only triggers disable interrupts while blocking active ones)
PDKBEN also has a hack for power on(its been removed)
On hardware PDIRQEG seems not to actually work at all(CPUID:0x57000000)(it does)
@@ -82,7 +129,6 @@ Edge triggered IRQ* interrupt pins may actually read the value of the interrupt
ADS7846 channels are not implemented properly in the emulator(works now)
ADS7846 Channels 3 and 4(they need to be scaled differently)(works now)
CPU32 table lookup opcodes(there is no CPU32)
USB chip seems to share an interrupt with the SD card(the SD card interrupt is unimplemented at boot and triggers a printf over USB instead, if USB is not properly emulated that will cause a lock up)
IRQ2 seems to not even be hooked up in IDA(IRQ2 is setup after boot by the SD driver, the kernels IRQ2 driver only sends a debug message over USB or serial)
framebuffer accesses can cause a buffer overflow(this was always the case, its not a new bug)(just increased the buffer to an address line maskable size)
chipselect mirroring is wrong(CS*0 and CS*1 are considered continuous when mapped with more address space than memory, mirroring is currently [CS*0, CS*1, repeat alternating till the end of address space] it should be [CS*0, repeat CS*0 until half way through CS* address space, CS*1, repeat CS*1 until end of CS* address space])

View File

@@ -1,3 +1,10 @@
------------------------------------------
v(1/3*3) to v1.0.0(Christmas 2018 - Feb 25 2019)
Core:
*SD card support
*all non timing based hacks are gone, this was my requirement for a v1.0.0 release
------------------------------------------
v0.9.5 to v(1/3*3)(equal to 1 until measured in a finite precision system)(Oct 18 2018 - Christmas 2018)
@@ -10,6 +17,7 @@ Qt GUI:
*removed unneeded buffers on the GUI side and replaced them with a mutex
Core:
*fix power button double press bug
*sound works perfectly as far as I can tell(unless a program purposely sets the sample length > 1 second, which is useless for generating sound anyway)
*add ARM optimized 68k CPU core(not fully working yet, SIGSEGVs when running)
*allow safety checks to be disabled with EMU_NO_SAFETY, accuracy is maintained when its not defined

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -35,6 +35,8 @@ else ifeq ($(platform),windows_msvc2003_x86)
include $(BUILD_DIR)/Makefile.windows_msvc2003_x86
else ifeq ($(platform),windows_msvc2005_x86)
include $(BUILD_DIR)/Makefile.windows_msvc2005_x86
else ifeq ($(platform),windows_msvc2008_x86)
include $(BUILD_DIR)/Makefile.windows_msvc2008_x86
else ifeq ($(platform),windows_msvc2010_x86)
include $(BUILD_DIR)/Makefile.windows_msvc2010_x86
else ifeq ($(platform),windows_msvc2010_x64)
@@ -159,6 +161,17 @@ CC += -miphoneos-version-min=5.0
CFLAGS += -miphoneos-version-min=5.0
endif
# tvOS
else ifeq ($(platform), tvos-arm64)
TARGET := $(TARGET_NAME)_libretro_tvos.dylib
fpic := -fPIC
SHARED := -dynamiclib
CFLAGS := -DIOS
ifeq ($(IOSSDK),)
IOSSDK := $(shell xcodebuild -version -sdk appletvos Path)
endif
# Theos iOS
else ifeq ($(platform), theos_ios)
DEPLOYMENT_IOSVERSION = 5.0
@@ -442,7 +455,7 @@ else ifeq ($(platform), xbox1_msvc2003)
else
EXT ?= dll
TARGET := $(TARGET_NAME)_libretro.$(EXT)
CC = gcc
CC ?= gcc
SHARED := -shared -static-libgcc -static-libstdc++ -s -Wl,--version-script=$(BUILD_DIR)/link.T
CFLAGS += -D__WIN32__ -D__WIN32_LIBRETRO__
endif
@@ -463,9 +476,9 @@ endif
include $(BUILD_DIR)/Makefile.common
OBJECTS := $(SOURCES_C:.c=.o) $(SOURCES_ASM:.S=.o)
OBJECTS := $(SOURCES_C:.c=.o) $(SOURCES_CXX:.cpp=.o) $(SOURCES_ASM:.S=.o)
DEFINES = $(COREDEFINES)
DEFINES += $(COREDEFINES)
ifeq ($(STATIC_LINKING), 1)
DEFINES += -DSTATIC_LINKING
@@ -488,6 +501,7 @@ endif
COMMON_DEFINES += $(CODE_DEFINES) $(WARNINGS_DEFINES) $(fpic)
CFLAGS += $(DEFINES) $(COMMON_DEFINES)
CXXFLAGS += $(DEFINES) $(COMMON_DEFINES)
ifneq (,$(findstring msvc,$(platform)))
OBJOUT = -Fo
@@ -507,7 +521,7 @@ endif
ifeq ($(platform), theos_ios)
COMMON_FLAGS := -DIOS -DARM $(COMMON_DEFINES) $(INCFLAGS) -I$(THEOS_INCLUDE_PATH) -Wno-error
$(LIBRARY_NAME)_CFLAGS += $(COMMON_FLAGS)
${LIBRARY_NAME}_FILES = $(SOURCES_C) $(SOURCES_ASM)
${LIBRARY_NAME}_FILES = $(SOURCES_C) $(SOURCES_CXX) $(SOURCES_ASM)
include $(THEOS_MAKE_PATH)/library.mk
else
all: $(TARGET)
@@ -526,8 +540,6 @@ else
$(CC) $(fpic) $(SHARED) $(INCFLAGS) $(LDFLAGS) $(OBJOUT)$@ $(OBJECTS) $(LIBM)
endif
@echo "** BUILD SUCCESSFUL! GG NO RE **"
%.o: %.c
$(CC) $(INCFLAGS) $(CFLAGS) -c $(OBJOUT)$@ $<

View File

@@ -2,43 +2,107 @@ EMU_PATH := $(CORE_DIR)/../src
LIBRETRO_COMM_DIR := $(CORE_DIR)/libretro-common
COREDEFINES :=
# my first make function!!!
CHECK_ALL = $(strip $(foreach v,$(2),$(if $(findstring $(v),$(1)),$(v),)))
INCFLAGS := -I$(LIBRETRO_COMM_DIR)/include
ifeq ($(DEBUG), 1)
COREDEFINES += -DEMU_DEBUG -DEMU_SANDBOX
else
EMU_FAST_CPU = 1
COREDEFINES += -DEMU_NO_SAFETY
endif
ifneq (,$(findstring msvc200,$(platform)))
# "unix" or "win" is not specific enough, need to know the CPU arch too
this_system := $(platform)
ifneq (,$(filter unix win,$(this_system)))
this_system := $(shell $(CC) -dumpmachine)
endif
ifneq (,$(findstring msvc200,$(this_system)))
INCFLAGS += -I$(LIBRETRO_COMM_DIR)/include/compat/msvc
endif
ifneq (,$(findstring msvc20,$(platform)))
ifneq (,$(findstring msvc20,$(this_system)))
# Mu is dependent on stdbool.h and the standard inline directive existing
INCFLAGS += -I$(CORE_DIR)/fixIncludes/stdbool
COREDEFINES += -Dinline=_inline -DINLINE=_inline
endif
ifneq (,$(filter ps3 sncps3 psl1ght ngc wii wiiu,$(platform)))
ifneq (,$(call CHECK_ALL,$(this_system),windows mingw))
# Windows
ifeq (,$(findstring msvc,$(this_system)))
EMU_SUPPORT_PALM_OS5 := 1
EMU_OS := windows
ifneq (,$(call CHECK_ALL,$(this_system),x86_64 x64))
EMU_ARCH := x86_64
else
EMU_ARCH := x86_32
endif
else
# MSVC uses its own(incompatible) ASM syntax
EMU_SUPPORT_PALM_OS5 := 0
endif
else ifneq (,$(call CHECK_ALL,$(this_system),armv8 aarch64))
# ARM Linux 64
EMU_SUPPORT_PALM_OS5 := 1
EMU_ARCH := armv8
EMU_OS := linux
else ifneq (,$(call CHECK_ALL,$(this_system),armv rpi2 rpi3))
# ARM Linux(rpi3 is aarch64 but its almost always used in 32bit mode)
EMU_SUPPORT_PALM_OS5 := 1
EMU_ARCH := armv7
EMU_OS := linux
else ifneq (,$(findstring armhf,$(this_system)))
# ARM Linux ARMv5
# this needs to be before "linux" because it will trigger the linux case
EMU_SUPPORT_PALM_OS5 := 0
else ifneq (,$(call CHECK_ALL,$(this_system),osx linux))
# x86_* Linux
EMU_SUPPORT_PALM_OS5 := 1
ifneq (,$(call CHECK_ALL,$(this_system),osx x86_64 x64))
EMU_ARCH := x86_64
else
EMU_ARCH := x86_32
endif
EMU_OS := linux
endif
# OS 5 isnt even booting yet, just turn the dynarec off to make it compile easier
EMU_ARCH := unknown
ifneq (,$(filter ps3 sncps3 psl1ght ngc wii wiiu,$(this_system)))
COREDEFINES += -DEMU_BIG_ENDIAN
else ifeq ($(platform), osx)
else ifeq ($(this_system), osx)
ifeq ($(arch), ppc)
COREDEFINES += -DEMU_BIG_ENDIAN
endif
endif
# ifneq (,$(filter qnx vita ctr rpi2 classic_armv7_a7,$(platform)))
# EMU_OPTIMIZE_FOR_ARM32 = 1
# else ifneq (,$(findstring armv7,$(platform)))
# EMU_OPTIMIZE_FOR_ARM32 = 1
# else ifneq (,$(findstring armv6,$(platform)))
# EMU_OPTIMIZE_FOR_ARM32 = 1
# else ifneq (,$(findstring armhf,$(platform)))
# EMU_OPTIMIZE_FOR_ARM32 = 1
# use all CPUs and optimize for the most likely outcome, Android is handled separately
# Apple broke OpenMP in there port of Clang so no Mac OS or iOS
# ifneq (,$(call CHECK_ALL,$(this_system),windows mingw linux))
# # none of libretros MSVC compilers work with these optimizations for multiple different reasons
# # they dont have the library "VCOMP.lib"
# # they are too old for the extension to exist
# # MSVC never has or will support __builtin_expect
# ifeq (,$(findstring msvc,$(this_system)))
# COREDEFINES += -fopenmp -DEMU_MULTITHREADED -DEMU_MANAGE_HOST_CPU_PIPELINE
# LDFLAGS += -fopenmp
# endif
# endif
# use C++11
ifeq ($(EMU_SUPPORT_PALM_OS5), 1)
ifneq ($(this_system), android_jni)
CXXFLAGS += -std=c++11
endif
endif
# RetroArch needs to be able to launch files directly
EMU_HAVE_FILE_LAUNCHER := 1
include $(EMU_PATH)/makefile.all
COREDEFINES += $(EMU_DEFINES)
@@ -46,6 +110,8 @@ COREDEFINES += $(EMU_DEFINES)
SOURCES_C := $(CORE_DIR)/libretro.c \
$(CORE_DIR)/cursors.c \
$(EMU_SOURCES_C)
SOURCES_CXX := $(EMU_SOURCES_CXX)
SOURCES_ASM := $(EMU_SOURCES_ASM)
ifneq ($(STATIC_LINKING), 1)
SOURCES_C += $(LIBRETRO_COMM_DIR)/compat/compat_strl.c \
@@ -57,5 +123,3 @@ ifneq ($(STATIC_LINKING), 1)
$(LIBRETRO_COMM_DIR)/string/stdstring.c \
$(LIBRETRO_COMM_DIR)/vfs/vfs_implementation.c
endif
SOURCES_ASM := $(EMU_SOURCES_ASM)

View File

@@ -59,7 +59,7 @@ RETROLDXFLAGS =
#################
# Final variables
DEFINES = $(PLATDEFS) $(RETRODEFS)
DEFINES = $(PLATDEFS) $(COREDEFINES) $(RETRODEFS)
CFLAGS = $(PLATCFLAGS) $(RETROCFLAGS) $(DEFINES) $(INCLUDES)
CXXFLAGS = $(PLATCXXFLAGS) $(RETROCXXFLAGS) $(DEFINES) $(INCLUDES)
LDFLAGS = $(PLATLDFLAGS) $(RETROLDFLAGS)

View File

@@ -59,7 +59,7 @@ RETROLDXFLAGS =
#################
# Final variables
DEFINES = $(PLATDEFS) $(RETRODEFS)
DEFINES = $(PLATDEFS) $(COREDEFINES) $(RETRODEFS)
CFLAGS = $(PLATCFLAGS) $(RETROCFLAGS) $(DEFINES) $(INCLUDES)
CXXFLAGS = $(PLATCXXFLAGS) $(RETROCXXFLAGS) $(DEFINES) $(INCLUDES)
LDFLAGS = $(PLATLDFLAGS) $(RETROLDFLAGS)

View File

@@ -59,7 +59,7 @@ RETROLDXFLAGS =
#################
# Final variables
DEFINES = $(PLATDEFS) $(RETRODEFS)
DEFINES = $(PLATDEFS) $(COREDEFINES) $(RETRODEFS)
CFLAGS = $(PLATCFLAGS) $(RETROCFLAGS) $(DEFINES) $(INCLUDES)
CXXFLAGS = $(PLATCXXFLAGS) $(RETROCXXFLAGS) $(DEFINES) $(INCLUDES)
LDFLAGS = $(PLATLDFLAGS) $(RETROLDFLAGS)

View File

@@ -59,7 +59,7 @@ RETROLDXFLAGS =
#################
# Final variables
DEFINES = $(PLATDEFS) $(RETRODEFS)
DEFINES = $(PLATDEFS) $(COREDEFINES) $(RETRODEFS)
CFLAGS = $(PLATCFLAGS) $(RETROCFLAGS) $(DEFINES) $(INCLUDES)
CXXFLAGS = $(PLATCXXFLAGS) $(RETROCXXFLAGS) $(DEFINES) $(INCLUDES)
LDFLAGS = $(PLATLDFLAGS) $(RETROLDFLAGS)

View File

@@ -59,7 +59,7 @@ RETROLDXFLAGS =
#################
# Final variables
DEFINES = $(PLATDEFS) $(RETRODEFS)
DEFINES = $(PLATDEFS) $(COREDEFINES) $(RETRODEFS)
CFLAGS = $(PLATCFLAGS) $(RETROCFLAGS) $(DEFINES) $(INCLUDES)
CXXFLAGS = $(PLATCXXFLAGS) $(RETROCXXFLAGS) $(DEFINES) $(INCLUDES)
LDFLAGS = $(PLATLDFLAGS) $(RETROLDFLAGS)

View File

@@ -59,7 +59,7 @@ RETROLDXFLAGS =
#################
# Final variables
DEFINES = $(PLATDEFS) $(RETRODEFS)
DEFINES = $(PLATDEFS) $(COREDEFINES) $(RETRODEFS)
CFLAGS = $(PLATCFLAGS) $(RETROCFLAGS) $(DEFINES) $(INCLUDES)
CXXFLAGS = $(PLATCXXFLAGS) $(RETROCXXFLAGS) $(DEFINES) $(INCLUDES)
LDFLAGS = $(PLATLDFLAGS) $(RETROLDFLAGS)

View File

@@ -59,7 +59,7 @@ RETROLDXFLAGS =
#################
# Final variables
DEFINES = $(PLATDEFS) $(RETRODEFS)
DEFINES = $(PLATDEFS) $(COREDEFINES) $(RETRODEFS)
CFLAGS = $(PLATCFLAGS) $(RETROCFLAGS) $(DEFINES) $(INCLUDES)
CXXFLAGS = $(PLATCXXFLAGS) $(RETROCXXFLAGS) $(DEFINES) $(INCLUDES)
LDFLAGS = $(PLATLDFLAGS) $(RETROLDFLAGS)

View File

@@ -59,7 +59,7 @@ RETROLDXFLAGS =
#################
# Final variables
DEFINES = $(PLATDEFS) $(RETRODEFS)
DEFINES = $(PLATDEFS) $(COREDEFINES) $(RETRODEFS)
CFLAGS = $(PLATCFLAGS) $(RETROCFLAGS) $(DEFINES) $(INCLUDES)
CXXFLAGS = $(PLATCXXFLAGS) $(RETROCXXFLAGS) $(DEFINES) $(INCLUDES)
LDFLAGS = $(PLATLDFLAGS) $(RETROLDFLAGS)

View File

@@ -59,7 +59,7 @@ RETROLDXFLAGS =
#################
# Final variables
DEFINES = $(PLATDEFS) $(RETRODEFS)
DEFINES = $(PLATDEFS) $(COREDEFINES) $(RETRODEFS)
CFLAGS = $(PLATCFLAGS) $(RETROCFLAGS) $(DEFINES) $(INCLUDES)
CXXFLAGS = $(PLATCXXFLAGS) $(RETROCXXFLAGS) $(DEFINES) $(INCLUDES)
LDFLAGS = $(PLATLDFLAGS) $(RETROLDFLAGS)

View File

@@ -59,7 +59,7 @@ RETROLDXFLAGS =
#################
# Final variables
DEFINES = $(PLATDEFS) $(RETRODEFS)
DEFINES = $(PLATDEFS) $(COREDEFINES) $(RETRODEFS)
CFLAGS = $(PLATCFLAGS) $(RETROCFLAGS) $(DEFINES) $(INCLUDES)
CXXFLAGS = $(PLATCXXFLAGS) $(RETROCXXFLAGS) $(DEFINES) $(INCLUDES)
LDFLAGS = $(PLATLDFLAGS) $(RETROLDFLAGS)

View File

@@ -59,7 +59,7 @@ RETROLDXFLAGS =
#################
# Final variables
DEFINES = $(PLATDEFS) $(RETRODEFS)
DEFINES = $(PLATDEFS) $(COREDEFINES) $(RETRODEFS)
CFLAGS = $(PLATCFLAGS) $(RETROCFLAGS) $(DEFINES) $(INCLUDES)
CXXFLAGS = $(PLATCXXFLAGS) $(RETROCXXFLAGS) $(DEFINES) $(INCLUDES)
LDFLAGS = $(PLATLDFLAGS) $(RETROLDFLAGS)

View File

@@ -0,0 +1,101 @@
##############
# Works on hosts Linux
# apt-get install mingw-w64
##########################
# Checks the host platform
HOST_PLATFORM = linux
ifeq ($(shell uname -a),)
HOST_PLATFORM = windows
else ifneq ($(findstring MINGW,$(shell uname -a)),)
HOST_PLATFORM = windows
else ifneq ($(findstring Darwin,$(shell uname -a)),)
HOST_PLATFORM = darwin
else ifneq ($(findstring win,$(shell uname -a)),)
HOST_PLATFORM = windows
endif
####################################
# Variable setup for Makefile.common
CORE_DIR ?= ..
BUILD_DIR ?= .
INCLUDES =
include $(BUILD_DIR)/Makefile.common
#################
# Toolchain setup
CC = cl.exe
CXX = cl.exe
PATH := $(shell IFS=$$'\n'; cygpath "$(VS90COMNTOOLS)../../VC/bin"):$(PATH)
PATH := $(PATH):$(shell IFS=$$'\n'; cygpath "$(VS90COMNTOOLS)../IDE")
INCLUDE := $(shell IFS=$$'\n'; cygpath "$(VS90COMNTOOLS)../../VC/include")
LIB := $(shell IFS=$$'\n'; cygpath -w "$(VS90COMNTOOLS)../../VC/lib")
WindowsSdkDir := $(INETSDK)
export INCLUDE := $(INCLUDE);$(WindowsSdkDir)/Include
export LIB := $(LIB);$(WindowsSdkDir);$(INETSDK)/Lib
############
# Extensions
OBJEXT = .obj
SOEXT = .dll
################
# Platform setup
STATIC_LINKING = 0
platform = win
PLATDEFS =
PLATCFLAGS = -DWINVER=0x0400 -D_WIN32_WINNT=0x0400 -DWIN32 -DCORRECT_VRAM_READS -D_WINDOWS -D_USRDLL -D_CRT_SECURE_NO_WARNINGS -DMSVC2010_EXPORTS -DFRONTEND_SUPPORTS_RGB565 -DGIT_VERSION=\"$(GIT_VERSION)\"
PLATCXXFLAGS = $(PLATCFLAGS)
#PLATLDFLAGS = -shared -lm
#PLATLDXFLAGS = -shared -lm
################
# libretro setup
RETRODEFS = -D__LIBRETRO__ -wd4710 -wd4711 -wd4127 -wd4204 -wd4242 -wd4244 -wd4820 -wd4214 -wd4100 -wd4738 -wd4706 -wd4668 -wd4245 -wd4255 -wd4389 -wd4305 -wd4113
RETROCFLAGS =
RETROCXXFLAGS =
RETROLDFLAGS =
RETROLDXFLAGS =
#################
# Final variables
DEFINES = $(PLATDEFS) $(COREDEFINES) $(RETRODEFS)
CFLAGS = $(PLATCFLAGS) $(RETROCFLAGS) $(DEFINES) $(INCLUDES)
CXXFLAGS = $(PLATCXXFLAGS) $(RETROCXXFLAGS) $(DEFINES) $(INCLUDES)
LDFLAGS = $(PLATLDFLAGS) $(RETROLDFLAGS)
LDXFLAGS = $(PLATLDXFLAGS) $(RETROLDXFLAGS)
########
# Tuning
ifeq ($(DEBUG),1)
CFLAGS += -Od -Zi -D_DEBUG
CXXFLAGS += -Od -Zi -D_DEBUG
LDFLAGS += -DEBUG -DLL
else
CFLAGS += -O2 -DNDEBUG
CXXFLAGS += -O2 -DNDEBUG
LDFLAGS += -DLL
endif
ifneq ($(LOG_PERFORMANCE),)
CFLAGS += -DLOG_PERFORMANCE
CXXFLAGS += -DLOG_PERFORMANCE
endif
###############
# Include rules
include $(BUILD_DIR)/Makefile.rules

View File

@@ -44,8 +44,8 @@ platform = win
PLATDEFS =
PLATCFLAGS = -fstrict-aliasing
PLATCXXFLAGS = -fstrict-aliasing
PLATLDFLAGS = -shared -lm
PLATLDXFLAGS = -shared -lm
PLATLDFLAGS = -shared -lm -static-libgcc -static-libstdc++
PLATLDXFLAGS = -shared -lm -static-libgcc -static-libstdc++
################
# libretro setup
@@ -59,7 +59,7 @@ RETROLDXFLAGS =
#################
# Final variables
DEFINES = $(PLATDEFS) $(RETRODEFS)
DEFINES = $(PLATDEFS) $(COREDEFINES) $(RETRODEFS)
CFLAGS = $(PLATCFLAGS) $(RETROCFLAGS) $(DEFINES) $(INCLUDES)
CXXFLAGS = $(PLATCXXFLAGS) $(RETROCXXFLAGS) $(DEFINES) $(INCLUDES)
LDFLAGS = $(PLATLDFLAGS) $(RETROLDFLAGS)

View File

@@ -44,8 +44,8 @@ platform = win
PLATDEFS =
PLATCFLAGS = -fpic -fstrict-aliasing
PLATCXXFLAGS = -fpic -fstrict-aliasing
PLATLDFLAGS = -shared -lm
PLATLDXFLAGS = -shared -lm
PLATLDFLAGS = -shared -lm -static-libgcc -static-libstdc++
PLATLDXFLAGS = -shared -lm -static-libgcc -static-libstdc++
################
# libretro setup
@@ -59,7 +59,7 @@ RETROLDXFLAGS =
#################
# Final variables
DEFINES = $(PLATDEFS) $(RETRODEFS)
DEFINES = $(PLATDEFS) $(COREDEFINES) $(RETRODEFS)
CFLAGS = $(PLATCFLAGS) $(RETROCFLAGS) $(DEFINES) $(INCLUDES)
CXXFLAGS = $(PLATCXXFLAGS) $(RETROCXXFLAGS) $(DEFINES) $(INCLUDES)
LDFLAGS = $(PLATLDFLAGS) $(RETROLDFLAGS)

View File

@@ -4,15 +4,22 @@ CORE_DIR := $(LOCAL_PATH)/..
GIT_VERSION := " $(shell git rev-parse --short HEAD || echo unknown)"
# prevent persisting in non ARM builds after the first ARM build
EMU_OPTIMIZE_FOR_ARM32 := 0
platform = android_jni
# set ASM CPU core, only use with ARMv4<->7, ARMv8 is its own architecture
# ifeq ($(TARGET_ARCH), arm)
# ifneq ($(TARGET_ARCH_ABI), arm64-v8a)
# EMU_OPTIMIZE_FOR_ARM32 := 1
# endif
# endif
# Palm OS 5 support
EMU_SUPPORT_PALM_OS5 := 1
EMU_OS := linux
ifeq ($(TARGET_ARCH_ABI), x86)
EMU_ARCH := x86_32
else ifeq ($(TARGET_ARCH_ABI), x86_64)
EMU_ARCH := x86_64
else ifeq ($(TARGET_ARCH_ABI), armeabi-v7a)
EMU_ARCH := armv7
else ifeq ($(TARGET_ARCH_ABI), arm64-v8a)
EMU_ARCH := armv8
else
EMU_ARCH := unknown
endif
include $(CORE_DIR)/build/Makefile.common
@@ -24,7 +31,9 @@ endif
include $(CLEAR_VARS)
LOCAL_MODULE := retro
LOCAL_SRC_FILES := $(SOURCES_C) $(SOURCES_ASM)
LOCAL_SRC_FILES := $(SOURCES_C) $(SOURCES_CXX) $(SOURCES_ASM)
# LOCAL_CFLAGS := $(COREFLAGS) -fopenmp -DEMU_MULTITHREADED -DEMU_MANAGE_HOST_CPU_PIPELINE
# LOCAL_LDFLAGS := -Wl,-version-script=$(CORE_DIR)/build/link.T -fopenmp
LOCAL_CFLAGS := $(COREFLAGS)
LOCAL_LDFLAGS := -Wl,-version-script=$(CORE_DIR)/build/link.T

View File

@@ -1,2 +1,5 @@
APP_ABI := all
# only compile the CPUs that Android actually used at some point
APP_ABI := armeabi armeabi-v7a arm64-v8a x86 x86_64
APP_PLATFORM := android-18
APP_STL := c++_static
APP_CPPFLAGS += -std=c++11

View File

@@ -875,12 +875,12 @@ enum retro_mod
* types already defined in the libretro API.
*
* The core must pass an array of const struct retro_controller_info which
* is terminated with a blanked out struct. Each element of the
* is terminated with a blanked out struct. Each element of the
* retro_controller_info struct corresponds to the ascending port index
* that is passed to retro_set_controller_port_device() when that function
* is called to indicate to the core that the frontend has changed the
* active device subclass. SEE ALSO: retro_set_controller_port_device()
*
*
* The ascending input port indexes provided by the core in the struct
* are generally presented by frontends as ascending User # or Player #,
* such as Player 1, Player 2, Player 3, etc. Which device subclasses are
@@ -892,7 +892,7 @@ enum retro_mod
* User or Player, beginning with the generic Libretro device that the
* subclasses are derived from. The second inner element of each entry is the
* total number of subclasses that are listed in the retro_controller_description.
*
*
* NOTE: Even if special device types are set in the libretro core,
* libretro should only poll input based on the base input device types.
*/
@@ -1079,10 +1079,19 @@ enum retro_mod
* fastforwarding mode.
*/
#define RETRO_ENVIRONMENT_GET_TARGET_REFRESH_RATE (50 | RETRO_ENVIRONMENT_EXPERIMENTAL)
/* float * --
* Float value that lets us know what target refresh rate
* is curently in use by the frontend.
*
* The core can use the returned value to set an ideal
* refresh rate/framerate.
*/
/* VFS functionality */
/* File paths:
* File paths passed as parameters when using this api shall be well formed unix-style,
* File paths passed as parameters when using this api shall be well formed UNIX-style,
* using "/" (unquoted forward slash) as directory separator regardless of the platform's native separator.
* Paths shall also include at least one forward slash ("game.bin" is an invalid path, use "./game.bin" instead).
* Other than the directory separator, cores shall not make assumptions about path format:
@@ -1100,6 +1109,10 @@ enum retro_mod
* Introduced in VFS API v1 */
struct retro_vfs_file_handle;
/* Opaque directory handle
* Introduced in VFS API v3 */
struct retro_vfs_dir_handle;
/* File open flags
* Introduced in VFS API v1 */
#define RETRO_VFS_FILE_ACCESS_READ (1 << 0) /* Read only mode */
@@ -1119,6 +1132,12 @@ struct retro_vfs_file_handle;
#define RETRO_VFS_SEEK_POSITION_CURRENT 1
#define RETRO_VFS_SEEK_POSITION_END 2
/* stat() result flags
* Introduced in VFS API v3 */
#define RETRO_VFS_STAT_IS_VALID (1 << 0)
#define RETRO_VFS_STAT_IS_DIRECTORY (1 << 1)
#define RETRO_VFS_STAT_IS_CHARACTER_SPECIAL (1 << 2)
/* Get path from opaque handle. Returns the exact same path passed to file_open when getting the handle
* Introduced in VFS API v1 */
typedef const char *(RETRO_CALLCONV *retro_vfs_get_path_t)(struct retro_vfs_file_handle *stream);
@@ -1128,7 +1147,7 @@ typedef const char *(RETRO_CALLCONV *retro_vfs_get_path_t)(struct retro_vfs_file
* Introduced in VFS API v1 */
typedef struct retro_vfs_file_handle *(RETRO_CALLCONV *retro_vfs_open_t)(const char *path, unsigned mode, unsigned hints);
/* Close the file and release its resources. Must be called if open_file returns non-NULL. Returns 0 on succes, -1 on failure.
/* Close the file and release its resources. Must be called if open_file returns non-NULL. Returns 0 on success, -1 on failure.
* Whether the call succeeds ot not, the handle passed as parameter becomes invalid and should no longer be used.
* Introduced in VFS API v1 */
typedef int (RETRO_CALLCONV *retro_vfs_close_t)(struct retro_vfs_file_handle *stream);
@@ -1141,7 +1160,7 @@ typedef int64_t (RETRO_CALLCONV *retro_vfs_size_t)(struct retro_vfs_file_handle
* Introduced in VFS API v2 */
typedef int64_t (RETRO_CALLCONV *retro_vfs_truncate_t)(struct retro_vfs_file_handle *stream, int64_t length);
/* Get the current read / write position for the file. Returns - 1 for error.
/* Get the current read / write position for the file. Returns -1 for error.
* Introduced in VFS API v1 */
typedef int64_t (RETRO_CALLCONV *retro_vfs_tell_t)(struct retro_vfs_file_handle *stream);
@@ -1169,6 +1188,39 @@ typedef int (RETRO_CALLCONV *retro_vfs_remove_t)(const char *path);
* Introduced in VFS API v1 */
typedef int (RETRO_CALLCONV *retro_vfs_rename_t)(const char *old_path, const char *new_path);
/* Stat the specified file. Retruns a bitmask of RETRO_VFS_STAT_* flags, none are set if path was not valid.
* Additionally stores file size in given variable, unless NULL is given.
* Introduced in VFS API v3 */
typedef int (RETRO_CALLCONV *retro_vfs_stat_t)(const char *path, int32_t *size);
/* Create the specified directory. Returns 0 on success, -1 on unknown failure, -2 if already exists.
* Introduced in VFS API v3 */
typedef int (RETRO_CALLCONV *retro_vfs_mkdir_t)(const char *dir);
/* Open the specified directory for listing. Returns the opaque dir handle, or NULL for error.
* Support for the include_hidden argument may vary depending on the platform.
* Introduced in VFS API v3 */
typedef struct retro_vfs_dir_handle *(RETRO_CALLCONV *retro_vfs_opendir_t)(const char *dir, bool include_hidden);
/* Read the directory entry at the current position, and move the read pointer to the next position.
* Returns true on success, false if already on the last entry.
* Introduced in VFS API v3 */
typedef bool (RETRO_CALLCONV *retro_vfs_readdir_t)(struct retro_vfs_dir_handle *dirstream);
/* Get the name of the last entry read. Returns a string on success, or NULL for error.
* The returned string pointer is valid until the next call to readdir or closedir.
* Introduced in VFS API v3 */
typedef const char *(RETRO_CALLCONV *retro_vfs_dirent_get_name_t)(struct retro_vfs_dir_handle *dirstream);
/* Check if the last entry read was a directory. Returns true if it was, false otherwise (or on error).
* Introduced in VFS API v3 */
typedef bool (RETRO_CALLCONV *retro_vfs_dirent_is_dir_t)(struct retro_vfs_dir_handle *dirstream);
/* Close the directory and release its resources. Must be called if opendir returns non-NULL. Returns 0 on success, -1 on failure.
* Whether the call succeeds ot not, the handle passed as parameter becomes invalid and should no longer be used.
* Introduced in VFS API v3 */
typedef int (RETRO_CALLCONV *retro_vfs_closedir_t)(struct retro_vfs_dir_handle *dirstream);
struct retro_vfs_interface
{
/* VFS API v1 */
@@ -1185,6 +1237,14 @@ struct retro_vfs_interface
retro_vfs_rename_t rename;
/* VFS API v2 */
retro_vfs_truncate_t truncate;
/* VFS API v3 */
retro_vfs_stat_t stat;
retro_vfs_mkdir_t mkdir;
retro_vfs_opendir_t opendir;
retro_vfs_readdir_t readdir;
retro_vfs_dirent_get_name_t dirent_get_name;
retro_vfs_dirent_is_dir_t dirent_is_dir;
retro_vfs_closedir_t closedir;
};
struct retro_vfs_interface_info
@@ -1207,6 +1267,7 @@ enum retro_hw_render_interface_type
RETRO_HW_RENDER_INTERFACE_D3D10 = 2,
RETRO_HW_RENDER_INTERFACE_D3D11 = 3,
RETRO_HW_RENDER_INTERFACE_D3D12 = 4,
RETRO_HW_RENDER_INTERFACE_GSKIT_PS2 = 5,
RETRO_HW_RENDER_INTERFACE_DUMMY = INT_MAX
};

View File

@@ -11,30 +11,57 @@
#include <compat/strl.h>
#include <retro_miscellaneous.h>
#include <streams/file_stream.h>
#include <string/stdstring.h>
#include "../src/emulator.h"
#include "../src/portability.h"
#include "../src/silkscreen.h"
#include "../src/fileLauncher/launcher.h"
#include "cursors.h"
#define JOYSTICK_DEADZONE 4000
#define JOYSTICK_MULTIPLIER 0.0001
#define SCREEN_HIRES (!(palmFramebufferWidth == 160 && palmFramebufferHeight == 220))
#define SCREEN_HIRES (!(palmFramebufferWidth == 160))
static retro_log_printf_t log_cb;
static retro_video_refresh_t video_cb;
static retro_audio_sample_batch_t audio_cb;
static retro_environment_t environ_cb;
static retro_input_poll_t input_poll_cb;
static retro_input_state_t input_state_cb;
static retro_log_printf_t log_cb = NULL;
static retro_video_refresh_t video_cb = NULL;
static retro_audio_sample_batch_t audio_cb = NULL;
static retro_set_led_state_t led_cb = NULL;
static retro_environment_t environ_cb = NULL;
static retro_input_poll_t input_poll_cb = NULL;
static retro_input_state_t input_state_cb = NULL;
static uint32_t emuFeatures;
static double cpuSpeed;
static bool syncRtc;
static bool allowInvalidBehavior;
#if defined(EMU_SUPPORT_PALM_OS5)
static bool useOs5;
#endif
static bool firstRetroRunCall;
static bool dontRenderGraffiti;
static bool useJoystickAsMouse;
static float touchCursorX;
static float touchCursorY;
static char contentPath[PATH_MAX_LENGTH];
static uint16_t mouseCursorOldArea[32 * 32];
static bool runningImgFile;
static uint16_t screenYEnd;
static void frontendGetCurrentTime(uint8_t* writeBack){
time_t rawTime;
struct tm* timeInfo;
time(&rawTime);
timeInfo = localtime(&rawTime);
writeBack[0] = timeInfo->tm_hour;
writeBack[1] = timeInfo->tm_min;
writeBack[2] = timeInfo->tm_sec;
}
static void renderMouseCursor(int16_t screenX, int16_t screenY){
if(SCREEN_HIRES){
int8_t x;
@@ -43,11 +70,15 @@ static void renderMouseCursor(int16_t screenX, int16_t screenY){
//align cursor to side of image
screenX -= 6;
for(y = 0; y < 32; y++)
for(x = 6; x < 26; x++)
if(screenX + x >= 0 && screenY + y >= 0 && screenX + x < palmFramebufferWidth && screenY + y < palmFramebufferHeight)
for(y = 0; y < 32; y++){
for(x = 6; x < 26; x++){
if(screenX + x >= 0 && screenY + y >= 0 && screenX + x < palmFramebufferWidth && screenY + y < palmFramebufferHeight){
mouseCursorOldArea[y * 32 + x] = palmFramebuffer[(screenY + y) * palmFramebufferWidth + screenX + x];
if(cursor32x32[y * 32 + x] != 0xFFFF)
palmFramebuffer[(screenY + y) * palmFramebufferWidth + screenX + x] = cursor32x32[y * 32 + x];
}
}
}
}
else{
int8_t x;
@@ -56,11 +87,42 @@ static void renderMouseCursor(int16_t screenX, int16_t screenY){
//align cursor to side of image
screenX -= 3;
for(y = 0; y < 16; y++){
for(x = 3; x < 13; x++){
if(screenX + x >= 0 && screenY + y >= 0 && screenX + x < palmFramebufferWidth && screenY + y < palmFramebufferHeight){
mouseCursorOldArea[y * 16 + x] = palmFramebuffer[(screenY + y) * palmFramebufferWidth + screenX + x];
if(cursor16x16[y * 16 + x] != 0xFFFF)
palmFramebuffer[(screenY + y) * palmFramebufferWidth + screenX + x] = cursor16x16[y * 16 + x];
}
}
}
}
}
static void unrenderMouseCursor(int16_t screenX, int16_t screenY){
if(SCREEN_HIRES){
int8_t x;
int8_t y;
//align cursors missing rectangle to side of image
screenX -= 6;
for(y = 0; y < 32; y++)
for(x = 6; x < 26; x++)
if(screenX + x >= 0 && screenY + y >= 0 && screenX + x < palmFramebufferWidth && screenY + y < palmFramebufferHeight)
palmFramebuffer[(screenY + y) * palmFramebufferWidth + screenX + x] = mouseCursorOldArea[y * 32 + x];
}
else{
int8_t x;
int8_t y;
//align cursors missing rectangle to side of image
screenX -= 3;
for(y = 0; y < 16; y++)
for(x = 3; x < 13; x++)
if(screenX + x >= 0 && screenY + y >= 0 && screenX + x < palmFramebufferWidth && screenY + y < palmFramebufferHeight)
if(cursor16x16[y * 16 + x] != 0xFFFF)
palmFramebuffer[(screenY + y) * palmFramebufferWidth + screenX + x] = cursor16x16[y * 16 + x];
palmFramebuffer[(screenY + y) * palmFramebufferWidth + screenX + x] = mouseCursorOldArea[y * 16 + x];
}
}
@@ -78,56 +140,32 @@ static void check_variables(bool booting){
struct retro_variable var = {0};
if(booting){
emuFeatures = FEATURE_ACCURATE;
var.key = "palm_emu_feature_ram_huge";
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
if (!strcmp(var.value, "enabled"))
emuFeatures |= FEATURE_RAM_HUGE;
var.key = "palm_emu_feature_fast_cpu";
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
if (!strcmp(var.value, "enabled"))
emuFeatures |= FEATURE_FAST_CPU;
var.key = "palm_emu_feature_hybrid_cpu";
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
if (!strcmp(var.value, "enabled"))
emuFeatures |= FEATURE_HYBRID_CPU;
var.key = "palm_emu_feature_custom_fb";
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
if (!strcmp(var.value, "enabled"))
emuFeatures |= FEATURE_CUSTOM_FB;
var.key = "palm_emu_cpu_speed";
if(environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
cpuSpeed = atoi(var.value);
var.key = "palm_emu_feature_synced_rtc";
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
if (!strcmp(var.value, "enabled"))
emuFeatures |= FEATURE_SYNCED_RTC;
if(environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
syncRtc = !strcmp(var.value, "enabled");
var.key = "palm_emu_feature_hle_apis";
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
if (!strcmp(var.value, "enabled"))
emuFeatures |= FEATURE_HLE_APIS;
var.key = "palm_emu_feature_emu_honest";
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
if (!strcmp(var.value, "enabled"))
emuFeatures |= FEATURE_EMU_HONEST;
var.key = "palm_emu_feature_ext_keys";
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
if (!strcmp(var.value, "enabled"))
emuFeatures |= FEATURE_EXT_KEYS;
var.key = "palm_emu_feature_durable";
if(environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
allowInvalidBehavior = !strcmp(var.value, "enabled");
}
var.key = "palm_emu_use_joystick_as_mouse";
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value){
if (!strcmp(var.value, "enabled"))
useJoystickAsMouse = true;
else
useJoystickAsMouse = false;
}
if(environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
useJoystickAsMouse = !strcmp(var.value, "enabled");
var.key = "palm_emu_disable_graffiti";
if(environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
dontRenderGraffiti = !strcmp(var.value, "enabled");
#if defined(EMU_SUPPORT_PALM_OS5)
var.key = "palm_emu_use_os5";
if(environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
useOs5 = !strcmp(var.value, "enabled");
#endif
}
void retro_init(void){
@@ -156,9 +194,9 @@ void retro_get_system_info(struct retro_system_info *info){
#ifndef GIT_VERSION
#define GIT_VERSION ""
#endif
info->library_version = "v1/3*3" GIT_VERSION;
info->need_fullpath = false;
info->valid_extensions = "rom";
info->library_version = "v1.1.0" GIT_VERSION;
info->need_fullpath = true;
info->valid_extensions = "prc|pqa|img";
}
void retro_get_system_av_info(struct retro_system_av_info *info){
@@ -167,53 +205,68 @@ void retro_get_system_av_info(struct retro_system_av_info *info){
info->geometry.base_width = 160;
info->geometry.base_height = 220;
info->geometry.max_width = 480;
#if defined(EMU_SUPPORT_PALM_OS5)
info->geometry.max_width = 320;
info->geometry.max_height = 480;
#else
info->geometry.max_width = 160;
info->geometry.max_height = 220;
#endif
info->geometry.aspect_ratio = 160.0 / 220.0;
}
void retro_set_environment(retro_environment_t cb){
struct retro_log_callback logging;
struct retro_vfs_interface_info vfs_getter = { 1, NULL };
struct retro_led_interface led_getter;
struct retro_variable vars[] = {
{ "palm_emu_feature_ram_huge", "Extra RAM Hack; disabled|enabled" },
{ "palm_emu_feature_fast_cpu", "Overclock 2x; disabled|enabled" },
{ "palm_emu_feature_hybrid_cpu", "Extra RAM Hack; disabled|enabled" },
{ "palm_emu_feature_custom_fb", "Custom Resolution; disabled|enabled" },
{ "palm_emu_cpu_speed", "CPU Speed; 1.0|1.5|2.0|2.5|3.0|0.5" },
{ "palm_emu_feature_synced_rtc", "Force Match System Clock; disabled|enabled" },
{ "palm_emu_feature_hle_apis", "HLE API Implementations; disabled|enabled" },
{ "palm_emu_feature_emu_honest", "Tell Programs They're In An Emulator(for test programs); disabled|enabled" },
{ "palm_emu_feature_ext_keys", "Enable OS5 Keys; disabled|enabled" },
{ "palm_emu_feature_durable", "Ignore Invalid Behavior; disabled|enabled" },
{ "palm_emu_use_joystick_as_mouse", "Use Left Joystick As Mouse; disabled|enabled" },
{ "palm_emu_disable_graffiti", "Disable Graffiti Area; disabled|enabled" },
#if defined(EMU_SUPPORT_PALM_OS5)
{ "palm_emu_use_os5", "Boot Apps In OS 5(DEV ONLY); disabled|enabled" },
#endif
{ 0 }
};
struct retro_input_descriptor input_desc[] = {
{ 0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X, "Touchscreen Mouse X" },
{ 0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_Y, "Touchscreen Mouse Y" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R2, "Touchscreen Mouse Click" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "Dpad Left" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "Dpad Up" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "Dpad Down" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "Dpad Right" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R, "Dpad Middle" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Power" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "Calender" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "Address Book" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "Todo" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "Notes" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R, "Touchscreen Mouse Click" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "Dpad Up" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "Dpad Down" },
#if defined(EMU_SUPPORT_PALM_OS5)
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "Dpad Left" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "Dpad Right" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT, "Dpad Center" },
#endif
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Power" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "Date Book" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "Address Book" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "To Do List" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "Note Pad" },
{ 0 }
};
bool no_rom = true;
environ_cb = cb;
environ_cb(RETRO_ENVIRONMENT_SET_SUPPORT_NO_GAME, &no_rom);
if (environ_cb(RETRO_ENVIRONMENT_GET_LOG_INTERFACE, &logging))
if(environ_cb(RETRO_ENVIRONMENT_GET_LOG_INTERFACE, &logging) && logging.log)
log_cb = logging.log;
else
if(!log_cb)
log_cb = fallback_log;
if(environ_cb(RETRO_ENVIRONMENT_GET_VFS_INTERFACE, &vfs_getter))
filestream_vfs_init(&vfs_getter);
led_getter.set_led_state = NULL;
if(environ_cb(RETRO_ENVIRONMENT_GET_LED_INTERFACE, &led_getter) && led_getter.set_led_state)
led_cb = led_getter.set_led_state;
if(environ_cb(RETRO_ENVIRONMENT_GET_VFS_INTERFACE, &vfs_getter) && vfs_getter.iface)
filestream_vfs_init(&vfs_getter);
environ_cb(RETRO_ENVIRONMENT_SET_VARIABLES, vars);
environ_cb(RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS, input_desc);
}
@@ -245,6 +298,40 @@ void retro_reset(void){
void retro_run(void){
input_poll_cb();
//some RetroArch functions can only be called from this function so call those if needed
if(unlikely(firstRetroRunCall)){
struct retro_game_geometry geometry;
#if defined(EMU_SUPPORT_PALM_OS5)
if(useOs5){
if(dontRenderGraffiti){
geometry.base_width = 320;
geometry.base_height = 320;
geometry.max_width = 320;
geometry.max_height = 480;
}
else{
geometry.base_width = 320;
geometry.base_height = 480;
}
}
else{
#endif
if(dontRenderGraffiti){
geometry.base_width = 160;
geometry.base_height = 160;
}
else{
geometry.base_width = 160;
geometry.base_height = 220;
}
#if defined(EMU_SUPPORT_PALM_OS5)
}
#endif
geometry.aspect_ratio = (float)geometry.base_width / (float)geometry.base_height;
environ_cb(RETRO_ENVIRONMENT_SET_GEOMETRY, &geometry);
firstRetroRunCall = false;
}
//touchscreen
if(useJoystickAsMouse){
int16_t x = input_state_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X);
@@ -268,27 +355,31 @@ void retro_run(void){
palmInput.touchscreenX = touchCursorX / (palmFramebufferWidth - 1);
palmInput.touchscreenY = touchCursorY / (palmFramebufferHeight - 1);
palmInput.touchscreenTouched = input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R2);
palmInput.touchscreenTouched = input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R);
}
else{
//use RetroArch internal pointer
palmInput.touchscreenX = ((float)input_state_cb(0, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_X) / 0x7FFF + 1.0) / 2.0;
palmInput.touchscreenY = ((float)input_state_cb(0, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_Y) / 0x7FFF + 1.0) / 2.0;
palmInput.touchscreenY = ((float)input_state_cb(0, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_Y) / 0x7FFF + 1.0) / 2.0 * ((float)screenYEnd / palmFramebufferHeight);
palmInput.touchscreenTouched = input_state_cb(0, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_PRESSED);
}
//dpad
palmInput.buttonUp = input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP);
palmInput.buttonRight = input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT);
palmInput.buttonDown = input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN);
palmInput.buttonLeft = input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT);
palmInput.buttonSelect = input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R);
#if defined(EMU_SUPPORT_PALM_OS5)
if(useOs5){
palmInput.buttonLeft = input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT);
palmInput.buttonRight = input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT);
palmInput.buttonCenter = input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT);
}
#endif
//app buttons
palmInput.buttonCalendar = input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A);
palmInput.buttonAddress = input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B);
palmInput.buttonTodo = input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y);
palmInput.buttonNotes = input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X);
palmInput.buttonCalendar = input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y);
palmInput.buttonAddress = input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X);
palmInput.buttonTodo = input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B);
palmInput.buttonNotes = input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A);
//special buttons
palmInput.buttonPower = input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START);
@@ -300,68 +391,119 @@ void retro_run(void){
if(useJoystickAsMouse)
renderMouseCursor(touchCursorX, touchCursorY);
video_cb(palmFramebuffer, palmFramebufferWidth, palmFramebufferHeight, palmFramebufferWidth * sizeof(uint16_t));
video_cb(palmFramebuffer, palmFramebufferWidth, screenYEnd, palmFramebufferWidth * sizeof(uint16_t));
audio_cb(palmAudio, AUDIO_SAMPLES_PER_FRAME);
if(led_cb){
led_cb(0, palmMisc.greenLed);
#if defined(EMU_SUPPORT_PALM_OS5)
led_cb(1, palmMisc.redLed);
#endif
}
//repair damage done to the framebuffer by the mouse cursor
if(useJoystickAsMouse)
unrenderMouseCursor(touchCursorX, touchCursorY);
}
bool retro_load_game(const struct retro_game_info *info){
buffer_t rom;
buffer_t bootloader;
uint8_t* romData;
uint32_t romSize;
uint8_t* bootloaderData;
uint32_t bootloaderSize;
char romPath[PATH_MAX_LENGTH];
char bootloaderPath[PATH_MAX_LENGTH];
char saveRamPath[PATH_MAX_LENGTH];
char sdImgPath[PATH_MAX_LENGTH];
struct RFILE* romFile;
struct RFILE* bootloaderFile;
struct RFILE* saveRamFile;
struct RFILE* sdImgFile;
const char* systemDir;
const char* saveDir;
time_t rawTime;
struct tm* timeInfo;
bool hasSram = false;
uint32_t error;
if(info == NULL)
return false;
environ_cb(RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY, &systemDir);
environ_cb(RETRO_ENVIRONMENT_GET_SAVE_DIRECTORY, &saveDir);
rom.data = info->data;
rom.size = info->size;
//bootloader
strlcpy(bootloaderPath, systemDir, PATH_MAX_LENGTH);
strlcat(bootloaderPath, "/bootloader-en-m515.rom", PATH_MAX_LENGTH);
bootloaderFile = filestream_open(bootloaderPath, RETRO_VFS_FILE_ACCESS_READ, RETRO_VFS_FILE_ACCESS_HINT_NONE);
if(bootloaderFile){
bootloader.size = filestream_get_size(bootloaderFile);
bootloader.data = malloc(bootloader.size);
if(bootloader.data)
filestream_read(bootloaderFile, bootloader.data, bootloader.size);
else
bootloader.size = 0;
filestream_close(bootloaderFile);
}
else{
bootloader.data = NULL;
bootloader.size = 0;
}
//updates the emulator configuration
check_variables(true);
error = emulatorInit(rom, bootloader, emuFeatures);
environ_cb(RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY, &systemDir);
if(info && !string_is_empty(info->path)){
//boot application
strlcpy(contentPath, info->path, PATH_MAX_LENGTH);
runningImgFile = string_is_equal_case_insensitive(contentPath + strlen(contentPath) - 4, ".img");
}
else{
//boot standard device image, "os5" or "os4" gets appended below
strlcpy(contentPath, systemDir, PATH_MAX_LENGTH);
strlcat(contentPath, "/default", PATH_MAX_LENGTH);
runningImgFile = false;
}
//ROM
strlcpy(romPath, systemDir, PATH_MAX_LENGTH);
#if defined(EMU_SUPPORT_PALM_OS5)
if(useOs5)
strlcat(romPath, "/palmos52-en-t3.rom", PATH_MAX_LENGTH);
else
#endif
strlcat(romPath, "/palmos41-en-m515.rom", PATH_MAX_LENGTH);
romFile = filestream_open(romPath, RETRO_VFS_FILE_ACCESS_READ, RETRO_VFS_FILE_ACCESS_HINT_NONE);
if(romFile){
romSize = filestream_get_size(romFile);
romData = malloc(romSize);
if(romData)
filestream_read(romFile, romData, romSize);
else
romSize = 0;
filestream_close(romFile);
}
else{
//cant load without ROM
return false;
}
//bootloader, will simple be ignored for Tungsten T3
strlcpy(bootloaderPath, systemDir, PATH_MAX_LENGTH);
strlcat(bootloaderPath, "/bootloader-en-m515.rom", PATH_MAX_LENGTH);
bootloaderFile = filestream_open(bootloaderPath, RETRO_VFS_FILE_ACCESS_READ, RETRO_VFS_FILE_ACCESS_HINT_NONE);
if(bootloaderFile){
bootloaderSize = filestream_get_size(bootloaderFile);
bootloaderData = malloc(bootloaderSize);
if(bootloaderData)
filestream_read(bootloaderFile, bootloaderData, bootloaderSize);
else
bootloaderSize = 0;
filestream_close(bootloaderFile);
}
else{
bootloaderData = NULL;
bootloaderSize = 0;
}
error = emulatorInit(romData, romSize, bootloaderData, bootloaderSize, syncRtc, allowInvalidBehavior);
free(romData);
if(bootloaderData)
free(bootloaderData);
if(error != EMU_ERROR_NONE)
return false;
if(bootloader.data)
free(bootloader.data);
//save RAM
strlcpy(saveRamPath, saveDir, PATH_MAX_LENGTH);
strlcat(saveRamPath, "/userdata-en-m515.ram", PATH_MAX_LENGTH);
strlcpy(saveRamPath, contentPath, PATH_MAX_LENGTH);
#if defined(EMU_SUPPORT_PALM_OS5)
if(useOs5)
strlcat(saveRamPath, ".os5", PATH_MAX_LENGTH);
else
#endif
strlcat(saveRamPath, ".os4", PATH_MAX_LENGTH);
strlcat(saveRamPath, ".ram", PATH_MAX_LENGTH);
saveRamFile = filestream_open(saveRamPath, RETRO_VFS_FILE_ACCESS_READ, RETRO_VFS_FILE_ACCESS_HINT_NONE);
if(saveRamFile){
hasSram = true;
if(filestream_get_size(saveRamFile) == emulatorGetRamSize()){
filestream_read(saveRamFile, palmRam, emulatorGetRamSize());
swap16BufferIfLittle(palmRam, emulatorGetRamSize() / sizeof(uint16_t));
@@ -369,37 +511,171 @@ bool retro_load_game(const struct retro_game_info *info){
filestream_close(saveRamFile);
}
if(!runningImgFile){
//SD card
strlcpy(sdImgPath, contentPath, PATH_MAX_LENGTH);
#if defined(EMU_SUPPORT_PALM_OS5)
if(useOs5)
strlcat(sdImgPath, ".os5", PATH_MAX_LENGTH);
else
#endif
strlcat(sdImgPath, ".os4", PATH_MAX_LENGTH);
strlcat(sdImgPath, ".sd.img", PATH_MAX_LENGTH);
sdImgFile = filestream_open(sdImgPath, RETRO_VFS_FILE_ACCESS_READ, RETRO_VFS_FILE_ACCESS_HINT_NONE);
if(sdImgFile){
uint32_t sdImgSize = filestream_get_size(sdImgFile);
//use the NULL, size, NULL method because it takes less RAM
error = emulatorInsertSdCard(NULL, sdImgSize, NULL);
if(error == EMU_ERROR_NONE)
filestream_read(sdImgFile, palmSdCard.flashChipData, sdImgSize);
filestream_close(sdImgFile);
}
}
//set RTC
time(&rawTime);
timeInfo = localtime(&rawTime);
emulatorSetRtc(timeInfo->tm_yday, timeInfo->tm_hour, timeInfo->tm_min, timeInfo->tm_sec);
//see if RetroArch wants something launched
if(info && !string_is_empty(info->path)){
struct RFILE* contentFile;
uint8_t* contentData;
uint32_t contentSize;
contentFile = filestream_open(contentPath, RETRO_VFS_FILE_ACCESS_READ, RETRO_VFS_FILE_ACCESS_HINT_NONE);
if(contentFile){
contentSize = filestream_get_size(contentFile);
contentData = malloc(contentSize);
if(contentData)
filestream_read(contentFile, contentData, contentSize);
else
return false;
filestream_close(contentFile);
}
else{
//no content at path, fail time
return false;
}
launcherBootInstantly(hasSram);
if(runningImgFile){
char infoPath[PATH_MAX_LENGTH];
struct RFILE* infoFile;
uint8_t* infoData = NULL;
uint32_t infoSize;
sd_card_info_t sdInfo;
memset(&sdInfo, 0x00, sizeof(sdInfo));
strlcpy(infoPath, contentPath, PATH_MAX_LENGTH);
infoPath[strlen(infoPath) - 4] = '\0';//chop off ".img"
strlcat(infoPath, ".info", PATH_MAX_LENGTH);
infoFile = filestream_open(infoPath, RETRO_VFS_FILE_ACCESS_READ, RETRO_VFS_FILE_ACCESS_HINT_NONE);
if(infoFile){
infoSize = filestream_get_size(infoFile);
infoData = malloc(infoSize);
if(infoData)
filestream_read(infoFile, infoData, infoSize);
filestream_close(infoFile);
}
if(infoData)
launcherGetSdCardInfoFromInfoFile(infoData, infoSize, &sdInfo);
error = emulatorInsertSdCard(contentData, contentSize, infoData ? &sdInfo : NULL);
if(infoData)
free(infoData);
}
else{
if(!hasSram)
error = launcherInstallFile(contentData, contentSize);
if(error == EMU_ERROR_NONE)
error = launcherExecute(launcherGetAppId(contentData, contentSize));
}
free(contentData);
if(error != EMU_ERROR_NONE)
return false;
}
//set the time callback
palmGetRtcFromHost = frontendGetCurrentTime;
//set mouse position
touchCursorX = palmFramebufferWidth / 2;
touchCursorY = palmFramebufferHeight / 2;
//make touches land on the correct spot and screen render the correct size when the graffiti area is off
if(dontRenderGraffiti){
#if defined(EMU_SUPPORT_PALM_OS5)
if(useOs5)
screenYEnd = 320;
else
#endif
screenYEnd = 160;
}
else{
screenYEnd = palmFramebufferHeight;
}
//used to resize things properly
firstRetroRunCall = true;
//set default CPU speed
emulatorSetCpuSpeed(cpuSpeed);
return true;
}
void retro_unload_game(void){
const char* saveDir;
char saveRamPath[PATH_MAX_LENGTH];
char sdImgPath[PATH_MAX_LENGTH];
struct RFILE* saveRamFile;
environ_cb(RETRO_ENVIRONMENT_GET_SAVE_DIRECTORY, &saveDir);
struct RFILE* sdImgFile;
//save RAM
strlcpy(saveRamPath, saveDir, PATH_MAX_LENGTH);
strlcat(saveRamPath, "/userdata-en-m515.ram", PATH_MAX_LENGTH);
strlcpy(saveRamPath, contentPath, PATH_MAX_LENGTH);
#if defined(EMU_SUPPORT_PALM_OS5)
if(useOs5)
strlcat(saveRamPath, ".os5", PATH_MAX_LENGTH);
else
#endif
strlcat(saveRamPath, ".os4", PATH_MAX_LENGTH);
strlcat(saveRamPath, ".ram", PATH_MAX_LENGTH);
saveRamFile = filestream_open(saveRamPath, RETRO_VFS_FILE_ACCESS_WRITE, RETRO_VFS_FILE_ACCESS_HINT_NONE);
if(saveRamFile){
swap16BufferIfLittle(palmRam, emulatorGetRamSize() / sizeof(uint16_t));//this will no longer be used, so its ok to destroy it when swapping
filestream_write(saveRamFile, palmRam, emulatorGetRamSize());
filestream_close(saveRamFile);
}
emulatorExit();
if(!runningImgFile){
//SD card
if(palmSdCard.flashChipData){
strlcpy(sdImgPath, contentPath, PATH_MAX_LENGTH);
#if defined(EMU_SUPPORT_PALM_OS5)
if(useOs5)
strlcat(sdImgPath, ".os5", PATH_MAX_LENGTH);
else
#endif
strlcat(sdImgPath, ".os4", PATH_MAX_LENGTH);
strlcat(sdImgPath, ".sd.img", PATH_MAX_LENGTH);
sdImgFile = filestream_open(sdImgPath, RETRO_VFS_FILE_ACCESS_WRITE, RETRO_VFS_FILE_ACCESS_HINT_NONE);
if(sdImgFile){
filestream_write(sdImgFile, palmSdCard.flashChipData, palmSdCard.flashChipSize);
filestream_close(sdImgFile);
}
}
}
emulatorDeinit();
}
unsigned retro_get_region(void){
@@ -418,21 +694,11 @@ size_t retro_serialize_size(void){
}
bool retro_serialize(void *data, size_t size){
buffer_t saveBuffer;
saveBuffer.data = (uint8_t*)data;
saveBuffer.size = size;
return emulatorSaveState(saveBuffer);
return emulatorSaveState(data, size);
}
bool retro_unserialize(const void *data, size_t size){
buffer_t saveBuffer;
saveBuffer.data = (uint8_t*)data;
saveBuffer.size = size;
return emulatorLoadState(saveBuffer);
return emulatorLoadState(data, size);
}
void* retro_get_memory_data(unsigned id){

View File

@@ -1,15 +1,21 @@
display_name = "Palm OS (Mu)"
authors = "guicrith / meepingsnesroms"
supported_extensions = "rom"
supported_extensions = "prc|pqa|img"
corename = "Mu"
manufacturer = "Palm"
categories = "Emulator"
systemname = "Palm OS"
license = "Non-commercial"
permissions = ""
display_version = "v1/3*3"
supports_no_game = "false"
firmware_count = 1
firmware0_desc = "bootloader-en-m515.rom (MC68VZ328 UART Bootloader)"
firmware0_path = "bootloader-en-m515.rom"
display_version = "v1.1.0"
supports_no_game = "true"
firmware_count = 3
firmware0_desc = "palmos41-en-m515.rom (Palm OS 4.1)"
firmware0_path = "palmos41-en-m515.rom"
firmware0_opt = "true"
firmware1_desc = "palmos52-en-t3.rom (Palm OS 5.2.1)"
firmware1_path = "palmos52-en-t3.rom"
firmware1_opt = "true"
firmware2_desc = "bootloader-en-m515.rom (MC68VZ328 UART Bootloader)"
firmware2_path = "bootloader-en-m515.rom"
firmware2_opt = "true"

View File

@@ -11,14 +11,14 @@ overlay0_desc2 = "up,0.504283,0.802938,radial,0.06852,0.04479"
overlay0_desc2_overlay = "X1_wswan.png"
overlay0_desc3 = "down,0.504283,0.964221,radial,0.06852,0.04479"
overlay0_desc3_overlay = "X3_wswan.png"
overlay0_desc4 = "a,0.0821626,0.960563,radial,0.07407,0.04167"
overlay0_desc4_overlay = "A.png"
overlay0_desc5 = "b,0.234211,0.960563,radial,0.07407,0.04167"
overlay0_desc5_overlay = "B.png"
overlay0_desc6 = "x,0.918421,0.960563,radial,0.07407,0.04167"
overlay0_desc6_overlay = "X.png"
overlay0_desc7 = "y,0.770469,0.960563,radial,0.07407,0.04167"
overlay0_desc7_overlay = "Y.png"
overlay0_desc4 = "y,0.0821626,0.960563,radial,0.07407,0.04167"
overlay0_desc4_overlay = "Y.png"
overlay0_desc5 = "x,0.234211,0.960563,radial,0.07407,0.04167"
overlay0_desc5_overlay = "X.png"
overlay0_desc6 = "a,0.918421,0.960563,radial,0.07407,0.04167"
overlay0_desc6_overlay = "A.png"
overlay0_desc7 = "b,0.770469,0.960563,radial,0.07407,0.04167"
overlay0_desc7_overlay = "B.png"
overlay0_desc8 = "start,0.860359,0.810741,rect,0.07037,0.03958"
overlay0_desc8_overlay = "start.png"
overlay0_desc9 = "menu_toggle,0.0552632,0.801573,radial,0.046296,0.02604"

View File

@@ -22,51 +22,58 @@ DEFINES += QT_DEPRECATED_WARNINGS
# You can also select to disable deprecated APIs only up to a certain version of Qt.
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
CONFIG += support_palm_os5
windows{
RC_ICONS = windows/Mu.ico
QMAKE_CFLAGS += -openmp
QMAKE_CXXFLAGS += -openmp
DEFINES += "_Pragma=__pragma"
DEFINES += EMU_MULTITHREADED
*msvc*{
QMAKE_CFLAGS += -openmp
QMAKE_CXXFLAGS += -openmp
DEFINES += "_Pragma=__pragma" EMU_MULTITHREADED
}
*-g++{
QMAKE_CFLAGS += -fopenmp
QMAKE_CXXFLAGS += -fopenmp
QMAKE_LFLAGS += -fopenmp
DEFINES += EMU_MULTITHREADED EMU_MANAGE_HOST_CPU_PIPELINE
}
CONFIG += cpu_x86_32 # this should be auto detected in the future
}
macx{
# QMAKE_CFLAGS += -std=c89 -D__STDBOOL_H -Dinline= -Dbool=char -Dtrue=1 -Dfalse=0 # tests C89 mode
# CONFIG += sdk_no_version_check # using 10.14 SDK which Qt only unofficialy supports
ICON = macos/Mu.icns
QMAKE_INFO_PLIST = macos/Info.plist
DEFINES += EMU_MULTITHREADED
DEFINES += EMU_MULTITHREADED EMU_MANAGE_HOST_CPU_PIPELINE
CONFIG += cpu_x86_64 # Mac OS is only x86_64
}
linux-g++{
QMAKE_CFLAGS += -fopenmp
QMAKE_CXXFLAGS += -fopenmp
QMAKE_LFLAGS += -fopenmp
DEFINES += EMU_MULTITHREADED
DEFINES += EMU_MULTITHREADED EMU_MANAGE_HOST_CPU_PIPELINE
CONFIG += cpu_x86_64 # this should be auto detected in the future
}
android{
QMAKE_CFLAGS += -fopenmp
QMAKE_CXXFLAGS += -fopenmp
QMAKE_LFLAGS += -fopenmp
DEFINES += EMU_MULTITHREADED
}
ios{
# QMAKE_INFO_PLIST = ios/Info.plist
DEFINES += EMU_MULTITHREADED
# iOS is now ARMv8 only, cyclone wont work
DEFINES += EMU_MULTITHREADED EMU_MANAGE_HOST_CPU_PIPELINE
CONFIG += cpu_armv7 # this should be auto detected in the future
}
CONFIG(debug, debug|release){
# debug build, be accurate, fail hard, and add logging
DEFINES += EMU_DEBUG EMU_CUSTOM_DEBUG_LOG_HANDLER
# EMU_SANDBOX
CONFIG += emu_fast_cpu
DEFINES += EMU_DEBUG EMU_CUSTOM_DEBUG_LOG_HANDLER EMU_SANDBOX
# DEFINES += EMU_SANDBOX_LOG_MEMORY_ACCESSES # checks all reads and writes to memory and logs certain events
# DEFINES += EMU_SANDBOX_OPCODE_LEVEL_DEBUG # for breakpoints
# DEFINES += EMU_SANDBOX_LOG_JUMPS # log large jumps
# DEFINES += EMU_SANDBOX_LOG_APIS # for printing sysTrap* calls, EMU_SANDBOX_OPCODE_LEVEL_DEBUG must be on too
CONFIG += no_dynarec # easier to debug with
macx|linux-g++{
# DEFINES += EMU_SANDBOX_OPCODE_LEVEL_DEBUG
# DEFINES += EMU_SANDBOX_LOG_APIS
# also check for any buffer overflows and memory leaks
# -fsanitize=undefined,leak
QMAKE_CFLAGS += -fstack-protector-strong -fsanitize=address -Werror=array-bounds
@@ -75,97 +82,207 @@ CONFIG(debug, debug|release){
}
}else{
# release build, go fast
CONFIG += emu_fast_cpu
DEFINES += EMU_NO_SAFETY
}
support_palm_os5{
DEFINES += EMU_SUPPORT_PALM_OS5 # the Qt build will not be supporting anything too slow to run OS 5
DEFINES += SUPPORT_LINUX # forces the dynarec to use accurate mode and disable Nspire OS hacks
!no_dynarec{
# Windows is only supported in 32 bit mode right now(this is a limitation of the dynarec)
# iOS needs IS_IOS_BUILD set, but the Qt port does not support iOS currently
cpu_x86_32{
SOURCES += \
../../src/armv5te/translate_x86.c \
../../src/armv5te/asmcode_x86.S
}
else{
# x86 has this implemented in asmcode_x86.S
SOURCES += \
../../src/armv5te/asmcode.c
}
cpu_x86_64{
SOURCES += \
../../src/armv5te/translate_x86_64.c \
../../src/armv5te/asmcode_x86_64.S
}
cpu_armv7{
SOURCES += \
../../src/armv5te/translate_arm.cpp \
../../src/armv5te/asmcode_arm.S
}
cpu_armv8{
SOURCES += \
../../src/armv5te/translate_aarch64.cpp \
../../src/armv5te/asmcode_aarch64.S
}
}
else{
# use platform independant C with no dynarec
SOURCES += \
../../src/armv5te/asmcode.c
DEFINES += NO_TRANSLATION
}
windows{
SOURCES += \
../../src/armv5te/os/os-win32.c
}
macx|linux-g++|android{
SOURCES += \
../../src/armv5te/os/os-linux.c
}
SOURCES += \
../../src/pxa260/pxa260_DMA.c \
../../src/pxa260/pxa260_DSP.c \
../../src/pxa260/pxa260_GPIO.c \
../../src/pxa260/pxa260_IC.c \
../../src/pxa260/pxa260_LCD.c \
../../src/pxa260/pxa260_PwrClk.c \
../../src/pxa260/pxa260_RTC.c \
../../src/pxa260/pxa260_TIMR.c \
../../src/pxa260/pxa260_UART.c \
../../src/pxa260/pxa260I2c.c \
../../src/pxa260/pxa260Memctrl.c \
../../src/pxa260/pxa260Timing.c \
../../src/pxa260/pxa260Ssp.c \
../../src/pxa260/pxa260Udc.c \
../../src/pxa260/pxa260.c \
../../src/armv5te/arm_interpreter.cpp \
../../src/armv5te/cpu.cpp \
../../src/armv5te/coproc.cpp \
../../src/armv5te/emuVarPool.c \
../../src/armv5te/thumb_interpreter.cpp \
../../src/armv5te/mem.c \
../../src/armv5te/mmu.c \
../../src/tps65010.c \
../../src/tsc2101.c \
../../src/w86l488.c
HEADERS += \
../../src/pxa260/pxa260_CPU.h \
../../src/pxa260/pxa260_DMA.h \
../../src/pxa260/pxa260_DSP.h \
../../src/pxa260/pxa260_GPIO.h \
../../src/pxa260/pxa260_IC.h \
../../src/pxa260/pxa260_LCD.h \
../../src/pxa260/pxa260_PwrClk.h \
../../src/pxa260/pxa260_RTC.h \
../../src/pxa260/pxa260_TIMR.h \
../../src/pxa260/pxa260_UART.h \
../../src/pxa260/pxa260I2c.h \
../../src/pxa260/pxa260Memctrl.h \
../../src/pxa260/pxa260Timing.h \
../../src/pxa260/pxa260Ssp.h \
../../src/pxa260/pxa260Udc.h \
../../src/pxa260/pxa260_types.h \
../../src/pxa260/pxa260_math64.h \
../../src/pxa260/pxa260Accessors.c.h \
../../src/pxa260/pxa260.h \
../../src/armv5te/os/os.h \
../../src/armv5te/asmcode.h \
../../src/armv5te/bitfield.h \
../../src/armv5te/cpu.h \
../../src/armv5te/emu.h \
../../src/armv5te/mem.h \
../../src/armv5te/translate.h \
../../src/armv5te/cpudefs.h \
../../src/armv5te/debug.h \
../../src/armv5te/mmu.h \
../../src/armv5te/armsnippets.h \
../../src/armv5te/literalpool.h \
../../src/tungstenT3Bus.h \
../../src/tps65010.h \
../../src/tsc2101.h \
../../src/w86l488.h
}
CONFIG += c++11
INCLUDEPATH += $$PWD/qt-common/include
emu_fast_cpu{
DEFINES += EMU_FAST_CPU
optimize_for_arm32{
# only use with ARMv4<->7, ARMv8 is its own architecture
DEFINES += EMU_OPTIMIZE_FOR_ARM32
SOURCES += ../../src/m68k/cyclone/CycloneNew.S
}else{
SOURCES += ../../src/m68k/fame/famec.c
}
}else{
SOURCES += ../../src/m68k/musashi/m68kcpu.c \
../../src/m68k/musashi/m68kdasm.c \
../../src/m68k/musashi/m68kopac.c \
../../src/m68k/musashi/m68kopdm.c \
../../src/m68k/musashi/m68kopnz.c \
../../src/m68k/musashi/m68kops.c
}
SOURCES += \
../../src/ads7846.c \
../../src/armv5te/disasm.c \
../../src/audio/blip_buf.c \
../../src/dbvz.c \
../../src/debug/sandbox.c \
../../src/emulator.c \
../../src/fileLauncher/launcher.c \
../../src/flx68000.c \
../../src/m515Bus.c \
../../src/m68k/m68kcpu.c \
../../src/m68k/m68kdasm.c \
../../src/m68k/m68kops.c \
../../src/pdiUsbD12.c \
../../src/sdCard.c \
../../src/sed1376.c \
../../src/silkscreen.c \
debugviewer.cpp \
emuwrapper.cpp \
main.cpp \
mainwindow.cpp \
statemanager.cpp \
touchscreen.cpp \
../../src/audio/blip_buf.c \
../../src/debug/sandbox.c \
../../src/ads7846.c \
../../src/emulator.c \
../../src/flx68000.c \
../../src/hardwareRegisters.c \
../../src/memoryAccess.c \
../../src/pdiUsbD12.c \
../../src/sdCard.c \
../../src/sed1376.c \
../../src/silkscreen.c
settingsmanager.cpp
HEADERS += \
../../src/ads7846.h \
../../src/armv5te/disasm.h \
../../src/audio/blip_buf.h \
../../src/dbvz.h \
../../src/dbvzRegisterAccessors.c.h \
../../src/dbvzRegisterNames.c.h \
../../src/dbvzTiming.c.h \
../../src/debug/sandbox.h \
../../src/debug/sandboxTrapNumToName.c.h \
../../src/debug/trapNames.h \
../../src/emulator.h \
../../src/fileLauncher/launcher.h \
../../src/flx68000.h \
../../src/m515Bus.h \
../../src/m68k/m68k.h \
../../src/m68k/m68kconf.h \
../../src/m68k/m68kcpu.h \
../../src/m68k/m68kexternal.h \
../../src/m68k/m68kops.h \
../../src/pdiUsbD12.h \
../../src/pdiUsbD12CommandNames.c.h \
../../src/portability.h \
../../src/sdCard.h \
../../src/sdCardAccessors.c.h \
../../src/sdCardCommandNames.c.h \
../../src/sdCardCrcTables.c.h \
../../src/sed1376.h \
../../src/sed1376Accessors.c.h \
../../src/sed1376RegisterNames.c.h \
../../src/silkscreen.h \
debugviewer.h \
emuwrapper.h \
mainwindow.h \
statemanager.h \
touchscreen.h \
../../src/audio/blip_buf.h \
../../src/debug/sandbox.h \
../../src/debug/sandboxTrapNumToName.c.h \
../../src/debug/trapNames.h \
../../src/m68k/cyclone/Cyclone.h \
../../src/m68k/musashi/m68k.h \
../../src/m68k/musashi/m68kconf.h \
../../src/m68k/musashi/m68kcpu.h \
../../src/m68k/musashi/m68kops.h \
../../src/specs/dragonballVzRegisterSpec.h \
../../src/ads7846.h \
../../src/emulator.h \
../../src/endianness.h \
../../src/flx68000.h \
../../src/hardwareRegisters.h \
../../src/hardwareRegistersAccessors.c.h \
../../src/hardwareRegistersTiming.c.h \
../../src/memoryAccess.h \
../../src/pdiUsbD12.h \
../../src/portability.h \
../../src/sdCard.h \
../../src/sed1376.h \
../../src/sed1376Accessors.c.h \
../../src/silkscreen.h \
../../src/specs/sed1376RegisterSpec.h \
../../src/specs/pdiUsbD12CommandSpec.h \
../../src/specs/emuFeatureRegisterSpec.h \
../../src/specs/sdCardCommandSpec.h \
../../src/m68k/fame/fame.h \
../../src/m68k/fame/famec_opcodes.h
settingsmanager.h
FORMS += \
mainwindow.ui \
debugviewer.ui \
statemanager.ui
statemanager.ui \
settingsmanager.ui
CONFIG += mobility
MOBILITY =
DISTFILES += \
../../src/fileLauncher/readme.md \
android/AndroidManifest.xml \
android/gradle/wrapper/gradle-wrapper.jar \
android/gradlew \
@@ -176,19 +293,24 @@ DISTFILES += \
android/res/drawable-hdpi/icon.png \
android/res/drawable-ldpi/icon.png \
android/res/drawable-mdpi/icon.png \
images/boot.svg \
images/addressBook.svg \
images/calendar.svg \
images/center.svg \
images/center.svg \
images/debugger.svg \
images/down.svg \
images/install.svg \
images/left.svg \
images/left.svg \
images/notes.svg \
images/pause.svg \
images/play.svg \
images/power.svg \
images/right.svg \
images/right.svg \
images/screenshot.svg \
images/settingsManager.svg \
images/stateManager.svg \
images/stop.svg \
images/todo.svg \

View File

@@ -1,12 +1,13 @@
#include "debugviewer.h"
#include "ui_debugviewer.h"
#include <QVector>
#include <QString>
#include <QFile>
#include <QDir>
#include <vector>
#include <stdint.h>
#include <stdio.h>
#include "mainwindow.h"
#include "emuwrapper.h"
@@ -44,42 +45,24 @@ int64_t DebugViewer::numberFromString(QString str, bool negativeAllowed){
return value;
}
QString DebugViewer::stringFromNumber(int64_t number, bool hex, uint32_t forcedZeros){
QString numString;
if(hex){
numString += QString::number(number, 16).toUpper();
while(numString.length() < (int)forcedZeros)numString.push_front("0");
numString.push_front("0x");
}
else{
numString += QString::number(qAbs(number), 10);
while(numString.length() < (int)forcedZeros)numString.push_front("0");
if(number < 0)
numString.push_front("-");
}
return numString;
}
void DebugViewer::debugRadioButtonHandler(){
switch(bitsPerEntry){
case 8:
ui->debug8Bit->setDown(true);
ui->debug16Bit->setDown(false);
ui->debug32Bit->setDown(false);
ui->debug8Bit->setChecked(true);
ui->debug16Bit->setChecked(false);
ui->debug32Bit->setChecked(false);
break;
case 16:
ui->debug8Bit->setDown(false);
ui->debug16Bit->setDown(true);
ui->debug32Bit->setDown(false);
ui->debug8Bit->setChecked(false);
ui->debug16Bit->setChecked(true);
ui->debug32Bit->setChecked(false);
break;
case 32:
ui->debug8Bit->setDown(false);
ui->debug16Bit->setDown(false);
ui->debug32Bit->setDown(true);
ui->debug8Bit->setChecked(false);
ui->debug16Bit->setChecked(false);
ui->debug32Bit->setChecked(true);
break;
}
}
@@ -94,12 +77,12 @@ void DebugViewer::on_debugGetHexValues_clicked(){
if(address != INT64_MIN && length != INT64_MIN && length != 0 && address + bits / 8 * length - 1 <= 0xFFFFFFFF){
for(int64_t count = 0; count < length; count++){
uint64_t data = emu.getEmulatorMemory(address, bits);
uint64_t data = emu.debugGetEmulatorMemory(address, bits);
QString value;
value += stringFromNumber(address, true, 8);
value += QString::asprintf("0x%08X", (uint32_t)address);
value += ":";
if(data != UINT64_MAX)
value += stringFromNumber(data, true, bits / 8 * 2);
value += QString::asprintf("0x%0*X", bits / 8 * 2, (uint32_t)data);
else
value += "Unsafe Access";
ui->debugValueList->addItem(value);
@@ -126,7 +109,7 @@ void DebugViewer::on_debug32Bit_clicked(){
debugRadioButtonHandler();
}
void DebugViewer::on_debugDump_clicked(){
void DebugViewer::on_debugDumpToFile_clicked(){
QString fileBuffer;
QFile fileOut(((MainWindow*)parentWidget())->settings->value("resourceDirectory", "").toString() + "/debugDumps/" + ui->debugFilePath->text());
@@ -142,32 +125,23 @@ void DebugViewer::on_debugDump_clicked(){
}
}
void DebugViewer::on_debugPrintAudioBuffer_clicked(){
EmuWrapper& emu = ((MainWindow*)parentWidget())->emu;
const int16_t* samples = emu.getAudioSamples();
ui->debugValueList->clear();
for(uint32_t index = 0; index < AUDIO_SAMPLES_PER_FRAME * 2; index++)
ui->debugValueList->addItem(stringFromNumber(index, false, 5) + ":" + stringFromNumber(samples[index], false, 5));
void DebugViewer::on_debugDumpToTerminal_clicked(){
for(int index = 0; index < ui->debugValueList->count(); index++)
printf("%s\n", ui->debugValueList->item(index)->text().toStdString().c_str());
fflush(stdout);
}
void DebugViewer::on_debugShowRegisters_clicked(){
std::vector<uint32_t> registers = ((MainWindow*)parentWidget())->emu.getCpuRegisters();
EmuWrapper& emu = ((MainWindow*)parentWidget())->emu;
ui->debugValueList->clear();
for(uint8_t dRegs = 0; dRegs < 8; dRegs++)
ui->debugValueList->addItem("D" + stringFromNumber(dRegs, false, 0) + ":" + stringFromNumber(registers[dRegs], true, 8));
for(uint8_t aRegs = 0; aRegs < 8; aRegs++)
ui->debugValueList->addItem("A" + stringFromNumber(aRegs, false, 0) + ":" + stringFromNumber(registers[8 + aRegs], true, 8));
ui->debugValueList->addItem("SP:" + stringFromNumber(registers[15], true, 8));
ui->debugValueList->addItem("PC:" + stringFromNumber(registers[16], true, 8));
ui->debugValueList->addItem("SR:" + stringFromNumber(registers[17], true, 4));
ui->debugValueList->addItems(emu.debugGetCpuRegisterString().split('\n'));
}
void DebugViewer::on_debugPrintDebugLogs_clicked(){
void DebugViewer::on_debugShowDebugLogs_clicked(){
EmuWrapper& emu = ((MainWindow*)parentWidget())->emu;
std::vector<QString>& debugStrings = emu.getDebugStrings();
std::vector<uint64_t>& duplicateCallCount = emu.getDuplicateCallCount();
QVector<QString>& debugStrings = emu.debugGetLogEntrys();
QVector<uint64_t>& duplicateCallCount = emu.debugGetDuplicateLogEntryCount();
int64_t length = numberFromString(ui->debugLength->text(), true/*negative allowed*/);
ui->debugValueList->clear();
@@ -190,6 +164,6 @@ void DebugViewer::on_debugPrintDebugLogs_clicked(){
void DebugViewer::on_debugEraseDebugLogs_clicked(){
EmuWrapper& emu = ((MainWindow*)parentWidget())->emu;
emu.getDebugStrings().clear();
emu.getDuplicateCallCount().clear();
emu.debugGetLogEntrys().clear();
emu.debugGetDuplicateLogEntryCount().clear();
}

View File

@@ -18,7 +18,6 @@ public:
private:
int64_t numberFromString(QString str, bool negativeAllowed);
QString stringFromNumber(int64_t number, bool hex, uint32_t forcedZeros = 0);
private slots:
void debugRadioButtonHandler();
@@ -29,10 +28,10 @@ private slots:
void on_debug16Bit_clicked();
void on_debug32Bit_clicked();
void on_debugDump_clicked();
void on_debugPrintAudioBuffer_clicked();
void on_debugDumpToFile_clicked();
void on_debugDumpToTerminal_clicked();
void on_debugShowRegisters_clicked();
void on_debugPrintDebugLogs_clicked();
void on_debugShowDebugLogs_clicked();
void on_debugEraseDebugLogs_clicked();
private:

View File

@@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>548</width>
<width>561</width>
<height>393</height>
</rect>
</property>
@@ -45,16 +45,16 @@
</sizepolicy>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="5" column="1" colspan="3">
<widget class="QPushButton" name="debugGetHexValues">
<item row="2" column="1">
<widget class="QRadioButton" name="debug8Bit">
<property name="text">
<string>Get Hex Values</string>
</property>
<property name="autoDefault">
<bool>false</bool>
<string>8bit</string>
</property>
</widget>
</item>
<item row="0" column="0" rowspan="11">
<widget class="QListWidget" name="debugValueList"/>
</item>
<item row="2" column="2">
<widget class="QRadioButton" name="debug16Bit">
<property name="text">
@@ -62,19 +62,6 @@
</property>
</widget>
</item>
<item row="7" column="1" colspan="3">
<widget class="QPushButton" name="debugShowRegisters">
<property name="text">
<string>Show Registers</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item row="0" column="0" rowspan="11">
<widget class="QListWidget" name="debugValueList"/>
</item>
<item row="4" column="1" colspan="3">
<widget class="QLineEdit" name="debugFilePath">
<property name="placeholderText">
@@ -82,43 +69,6 @@
</property>
</widget>
</item>
<item row="8" column="1" colspan="3">
<widget class="QPushButton" name="debugPrintDebugLogs">
<property name="text">
<string>Print Debug Logs</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item row="9" column="1" colspan="3">
<widget class="QPushButton" name="debugEraseDebugLogs">
<property name="text">
<string>Erase Debug Logs</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item row="10" column="1" colspan="3">
<widget class="QPushButton" name="debugDump">
<property name="text">
<string>Dump To File</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item row="3" column="1" colspan="3">
<widget class="QLineEdit" name="debugLength">
<property name="placeholderText">
<string>Length</string>
</property>
</widget>
</item>
<item row="1" column="1" colspan="3">
<widget class="QLineEdit" name="debugAddress">
<property name="placeholderText">
@@ -126,6 +76,13 @@
</property>
</widget>
</item>
<item row="3" column="1" colspan="3">
<widget class="QLineEdit" name="debugLength">
<property name="placeholderText">
<string>Length</string>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QRadioButton" name="debug32Bit">
<property name="text">
@@ -133,17 +90,60 @@
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QRadioButton" name="debug8Bit">
<item row="5" column="1" colspan="3">
<widget class="QPushButton" name="debugGetHexValues">
<property name="text">
<string>8bit</string>
<string>Get Hex Values</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item row="6" column="1" colspan="3">
<widget class="QPushButton" name="debugPrintAudioBuffer">
<widget class="QPushButton" name="debugShowRegisters">
<property name="text">
<string>Print Last Frame Audio Buffer</string>
<string>Show Registers</string>
</property>
</widget>
</item>
<item row="7" column="1" colspan="3">
<widget class="QPushButton" name="debugShowDebugLogs">
<property name="text">
<string>Show Debug Logs</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item row="9" column="1" colspan="3">
<widget class="QPushButton" name="debugDumpToFile">
<property name="text">
<string>Dump To File</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item row="8" column="1" colspan="3">
<widget class="QPushButton" name="debugEraseDebugLogs">
<property name="text">
<string>Erase Debug Logs</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item row="10" column="1" colspan="3">
<widget class="QPushButton" name="debugDumpToTerminal">
<property name="text">
<string>Dump To Terminal</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>

View File

@@ -1,7 +1,8 @@
#include <QString>
#include <QPixmap>
#include <QImage>
#include <QVector>
#include <QDir>
#include <QFile>
#include <QFileInfo>
#include <QByteArray>
#include <QDateTime>
#include <QDate>
@@ -10,34 +11,36 @@
#include <new>
#include <chrono>
#include <thread>
#include <vector>
#include <string>
#include <stdint.h>
#if defined(Q_OS_ANDROID)
#include <android/log.h>
#endif
#include <string.h>
#include <time.h>
#include "emuwrapper.h"
#include "../../src/emulator.h"
#include "../../src/fileLauncher/launcher.h"
extern "C"{
#include "../../src/flx68000.h"
#include "../../src/m68k/m68k.h"
#include "../../src/pxa260/pxa260.h"
#include "../../src/armv5te/disasm.h"
#include "../../src/debug/sandbox.h"
}
#define MAX_LOG_ENTRY_LENGTH 200
static bool alreadyExists = false;//there can only be one of this class since it wrappers C code
static std::vector<QString> debugStrings;
static std::vector<uint64_t> duplicateCallCount;
uint32_t frontendDebugStringSize;
char* frontendDebugString;
static QVector<QString> debugStrings;
static QVector<uint64_t> duplicateCallCount;
uint32_t frontendDebugStringSize;
char* frontendDebugString;
void frontendHandleDebugPrint(){
#if defined(Q_OS_ANDROID)
__android_log_print(ANDROID_LOG_DEBUG, "MuDebug", "%s", frontendDebugString);
#else
QString newDebugString = frontendDebugString;
//this debug handler doesnt need the \n
@@ -54,7 +57,18 @@ void frontendHandleDebugPrint(){
debugStrings.push_back(newDebugString);
duplicateCallCount.push_back(1);
}
#endif
}
static void frontendGetCurrentTime(uint8_t* writeBack){
time_t rawTime;
struct tm* timeInfo;
time(&rawTime);
timeInfo = localtime(&rawTime);
writeBack[0] = timeInfo->tm_hour;
writeBack[1] = timeInfo->tm_min;
writeBack[2] = timeInfo->tm_sec;
}
@@ -69,8 +83,8 @@ EmuWrapper::EmuWrapper(){
emuPaused = false;
emuNewFrameReady = false;
frontendDebugString = new char[200];
frontendDebugStringSize = 200;
frontendDebugString = new char[MAX_LOG_ENTRY_LENGTH];
frontendDebugStringSize = MAX_LOG_ENTRY_LENGTH;
}
EmuWrapper::~EmuWrapper(){
@@ -81,6 +95,9 @@ EmuWrapper::~EmuWrapper(){
frontendDebugStringSize = 0;
debugStrings.clear();
duplicateCallCount.clear();
//allow creating a new emu class after the old one is closed
alreadyExists = false;
}
void EmuWrapper::emuThreadRun(){
@@ -97,100 +114,93 @@ void EmuWrapper::emuThreadRun(){
emuPaused = true;
}
std::this_thread::sleep_for(std::chrono::milliseconds(3));
std::this_thread::sleep_for(std::chrono::milliseconds(5));
}
}
uint32_t EmuWrapper::init(const QString& romPath, const QString& bootloaderPath, const QString& ramPath, const QString& sdCardPath, uint32_t features){
void EmuWrapper::writeOutSaves(){
if(emuRamFilePath != ""){
QFile ramFile(emuRamFilePath);
uint32_t emuRamSize = emulatorGetRamSize();
uint8_t* emuRamData = new uint8_t[emuRamSize];
emulatorSaveRam(emuRamData, emuRamSize);
//save out RAM before exit
if(ramFile.open(QFile::WriteOnly | QFile::Truncate)){
ramFile.write((const char*)emuRamData, emuRamSize);
ramFile.close();
}
delete[] emuRamData;
}
if(emuSdCardFilePath != ""){
uint32_t emuSdCardSize = emulatorGetSdCardSize();
uint8_t* emuSdCardData = new uint8_t[emuSdCardSize];
if(emulatorGetSdCardData(emuSdCardData, emuSdCardSize) == EMU_ERROR_NONE){
QFile sdCardFile(emuSdCardFilePath);
//save out SD card before exit
if(sdCardFile.open(QFile::WriteOnly | QFile::Truncate)){
sdCardFile.write((const char*)emuSdCardData, emuSdCardSize);
sdCardFile.close();
}
}
}
}
uint32_t EmuWrapper::init(const QString& assetPath, uint8_t osVersion, bool syncRtc, bool allowInvalidBehavior, bool fastBoot){
if(!emuRunning && !emuInited){
//start emu
uint32_t error;
QFile romFile(romPath);
QFile bootloaderFile(bootloaderPath);
QByteArray romData;
QByteArray bootloaderData;
buffer_t romBuff;
buffer_t bootloaderBuff;
QString osVersionId = osVersion == 4 ? "41" : osVersion == 5 ? "52" : QString::number((int)osVersion) + "0";
QString model = osVersion > 4 ? "en-t3" : "en-m515";
QFile romFile(assetPath + "/palmos" + osVersionId + "-" + model + ".rom");
QFile bootloaderFile(assetPath + "/bootloader-" + model + ".rom");
QFile ramFile(assetPath + "/userdata-" + model + ".ram");
QFile sdCardFile(assetPath + "/sd-" + model + ".img");
bool hasBootloader = true;
if(romFile.open(QFile::ReadOnly | QFile::ExistingOnly)){
romData = romFile.readAll();
romFile.close();
//used to mark saves with there OS version and prevent corruption
emuOsName = "os" + QString::number((int)osVersion);
romBuff.data = (uint8_t*)romData.data();
romBuff.size = romData.size();
}
else{
if(!romFile.open(QFile::ReadOnly | QFile::ExistingOnly))
return EMU_ERROR_INVALID_PARAMETER;
}
if(bootloaderPath != ""){
if(bootloaderFile.open(QFile::ReadOnly | QFile::ExistingOnly)){
bootloaderData = bootloaderFile.readAll();
bootloaderFile.close();
if(!bootloaderFile.open(QFile::ReadOnly | QFile::ExistingOnly))
hasBootloader = false;
bootloaderBuff.data = (uint8_t*)bootloaderData.data();
bootloaderBuff.size = bootloaderData.size();
}
else{
return EMU_ERROR_INVALID_PARAMETER;
}
}
else{
bootloaderBuff.data = NULL;
bootloaderBuff.size = 0;
}
error = emulatorInit(romBuff, bootloaderBuff, features);
error = emulatorInit((uint8_t*)romFile.readAll().data(), romFile.size(), hasBootloader ? (uint8_t*)bootloaderFile.readAll().data() : NULL, hasBootloader ? bootloaderFile.size() : 0, syncRtc, allowInvalidBehavior);
if(error == EMU_ERROR_NONE){
QTime now = QTime::currentTime();
palmGetRtcFromHost = frontendGetCurrentTime;
emulatorSetRtc(QDate::currentDate().day(), now.hour(), now.minute(), now.second());
if(ramPath != ""){
QFile ramFile(ramPath);
if(ramFile.exists()){
if(ramFile.open(QFile::ReadOnly | QFile::ExistingOnly)){
QByteArray ramData;
buffer_t emuRam;
ramData = ramFile.readAll();
ramFile.close();
emuRam.data = (uint8_t*)ramData.data();
emuRam.size = ramData.size();
//only copy in data if its the correct size, the file will be overwritten on exit with the devices RAM either way
//(changing RAM size requires a factory reset for now and always will when going from 128mb back to 16mb)
if(emuRam.size == emulatorGetRamSize())
emulatorLoadRam(emuRam);
}
}
if(ramFile.open(QFile::ReadOnly | QFile::ExistingOnly)){
emulatorLoadRam((uint8_t*)ramFile.readAll().data(), ramFile.size());
ramFile.close();
}
if(sdCardPath != ""){
QFile sdCardFile(sdCardPath);
if(sdCardFile.exists()){
if(sdCardFile.open(QFile::ReadOnly | QFile::ExistingOnly)){
QByteArray sdCardData;
buffer_t newSdCard;
sdCardData = sdCardFile.readAll();
sdCardFile.close();
newSdCard.data = (uint8_t*)sdCardData.data();
newSdCard.size = sdCardData.size();
emulatorInsertSdCard(newSdCard);
}
}
if(sdCardFile.open(QFile::ReadOnly | QFile::ExistingOnly)){
emulatorInsertSdCard((uint8_t*)sdCardFile.readAll().data(), sdCardFile.size(), NULL);
sdCardFile.close();
}
emuInput = palmInput;
emuRamFilePath = ramPath;
emuSdCardFilePath = sdCardPath;
emuRamFilePath = assetPath + "/userdata-" + model + ".ram";
emuSdCardFilePath = assetPath + "/sd-" + model + ".img";
emuSaveStatePath = assetPath + "/states-" + model + ".states";
//make the place to store the saves
QDir(emuSaveStatePath).mkdir(".");
//skip the boot screen
if(fastBoot)
launcherBootInstantly(ramFile.exists());
//start the thread
emuThreadJoin = false;
emuInited = true;
emuRunning = true;
@@ -201,6 +211,9 @@ uint32_t EmuWrapper::init(const QString& romPath, const QString& bootloaderPath,
else{
return error;
}
romFile.close();
bootloaderFile.close();
}
return EMU_ERROR_NONE;
@@ -212,36 +225,8 @@ void EmuWrapper::exit(){
if(emuThread.joinable())
emuThread.join();
if(emuInited){
if(emuRamFilePath != ""){
QFile ramFile(emuRamFilePath);
buffer_t emuRam;
emuRam.size = emulatorGetRamSize();
emuRam.data = new uint8_t[emuRam.size];
emulatorSaveRam(emuRam);
//save out RAM before exit
if(ramFile.open(QFile::WriteOnly | QFile::Truncate)){
ramFile.write((const char*)emuRam.data, emuRam.size);
ramFile.close();
}
delete[] emuRam.data;
}
if(emuSdCardFilePath != ""){
buffer_t emuSdCard = emulatorGetSdCardBuffer();
if(emuSdCard.data){
QFile sdCardFile(emuSdCardFilePath);
//save out SD card before exit
if(sdCardFile.open(QFile::WriteOnly | QFile::Truncate)){
sdCardFile.write((const char*)emuSdCard.data, emuSdCard.size);
sdCardFile.close();
}
}
}
emulatorExit();
writeOutSaves();
emulatorDeinit();
}
}
@@ -261,53 +246,121 @@ void EmuWrapper::resume(){
}
}
uint32_t EmuWrapper::saveState(const QString& path){
bool wasPaused = isPaused();
uint32_t error = EMU_ERROR_INVALID_PARAMETER;
QFile stateFile(path);
void EmuWrapper::reset(bool hard){
if(emuInited){
bool wasPaused = isPaused();
if(!wasPaused)
pause();
if(!wasPaused)
pause();
//save here
if(stateFile.open(QFile::WriteOnly)){
buffer_t stateData;
if(hard)
emulatorHardReset();
else
emulatorSoftReset();
stateData.size = emulatorGetStateSize();
stateData.data = new uint8_t[stateData.size];
emulatorSaveState(stateData);//no need to check for errors since the buffer is always the right size
stateFile.write((const char*)stateData.data, stateData.size);
stateFile.close();
error = EMU_ERROR_NONE;
if(!wasPaused)
resume();
}
if(!wasPaused)
resume();
return error;
}
uint32_t EmuWrapper::loadState(const QString& path){
void EmuWrapper::setCpuSpeed(double speed){
if(emuInited){
bool wasPaused = isPaused();
if(!wasPaused)
pause();
emulatorSetCpuSpeed(speed);
if(!wasPaused)
resume();
}
}
uint32_t EmuWrapper::bootFromFile(const QString& mainPath){
bool wasPaused = isPaused();
uint32_t error = EMU_ERROR_INVALID_PARAMETER;
QFile stateFile(path);
uint32_t error = EMU_ERROR_NONE;
QFileInfo pathInfo(mainPath);
QFile appFile(mainPath);
QFile ramFile(mainPath + "." + emuOsName + ".ram");
QFile sdCardFile(mainPath + "." + emuOsName + ".sd.img");
QString suffix = QFileInfo(mainPath).suffix().toLower();
bool hasSaveRam;
bool hasSaveSdCard;
if(!wasPaused)
pause();
if(stateFile.open(QFile::ReadOnly)){
QByteArray stateDataBuffer;
buffer_t stateData;
//save the current data for the last program launched, or the standard device image if none where launched
writeOutSaves();
stateDataBuffer = stateFile.readAll();
stateFile.close();
stateData.data = (uint8_t*)stateDataBuffer.data();
stateData.size = stateDataBuffer.size();
//its OK if these fail, the buffer will just be NULL, 0 if they do
hasSaveRam = ramFile.open(QFile::ReadOnly | QFile::ExistingOnly);
hasSaveSdCard = suffix != "img" ? sdCardFile.open(QFile::ReadOnly | QFile::ExistingOnly) : false;
if(emulatorLoadState(stateData))
error = EMU_ERROR_NONE;
//fully clear the emu
emulatorEjectSdCard();
emulatorHardReset();
if(hasSaveRam)
emulatorLoadRam((uint8_t*)ramFile.readAll().data(), ramFile.size());
if(hasSaveSdCard)
emulatorInsertSdCard((uint8_t*)sdCardFile.readAll().data(), sdCardFile.size(), NULL);
//its OK if these fail
if(hasSaveRam)
ramFile.close();
if(hasSaveSdCard)
sdCardFile.close();
launcherBootInstantly(hasSaveRam);
if(appFile.open(QFile::ReadOnly | QFile::ExistingOnly)){
QByteArray fileBuffer = appFile.readAll();
appFile.close();
if(suffix == "img"){
QFile infoFile(mainPath.mid(0, mainPath.length() - 3) + "info");//swap "img" for "info"
sd_card_info_t sdInfo;
memset(&sdInfo, 0x00, sizeof(sdInfo));
if(infoFile.open(QFile::ReadOnly | QFile::ExistingOnly)){
launcherGetSdCardInfoFromInfoFile((uint8_t*)infoFile.readAll().data(), infoFile.size(), &sdInfo);
infoFile.close();
}
error = emulatorInsertSdCard((uint8_t*)fileBuffer.data(), fileBuffer.size(), &sdInfo);
if(error != EMU_ERROR_NONE)
goto errorOccurred;
}
else{
if(!hasSaveRam){
error = launcherInstallFile((uint8_t*)fileBuffer.data(), fileBuffer.size());
if(error != EMU_ERROR_NONE)
goto errorOccurred;
}
error = launcherExecute(launcherGetAppId((uint8_t*)fileBuffer.data(), fileBuffer.size()));
if(error != EMU_ERROR_NONE)
goto errorOccurred;
}
}
//everything worked, set output save files
emuRamFilePath = mainPath + "." + emuOsName + ".ram";
emuSdCardFilePath = suffix != "img" ? mainPath + "." + emuOsName + ".sd.img" : "";//dont duplicate booted SD card images
emuSaveStatePath = mainPath + "." + emuOsName + ".states";
//make the place to store the saves
QDir(emuSaveStatePath).mkdir(".");
//need this goto because the emulator must be released before returning
errorOccurred:
if(error != EMU_ERROR_NONE){
//try and recover from error
emulatorEjectSdCard();
emulatorHardReset();
}
if(!wasPaused)
@@ -324,15 +377,9 @@ uint32_t EmuWrapper::installApplication(const QString& path){
if(!wasPaused)
pause();
if(appFile.open(QFile::ReadOnly)){
QByteArray appDataBuffer;
buffer_t appData;
appDataBuffer = appFile.readAll();
if(appFile.open(QFile::ReadOnly | QFile::ExistingOnly)){
error = launcherInstallFile((uint8_t*)appFile.readAll().data(), appFile.size());
appFile.close();
appData.data = (uint8_t*)appDataBuffer.data();
appData.size = appDataBuffer.size();
error = emulatorInstallPrcPdb(appData);
}
if(!wasPaused)
@@ -341,22 +388,160 @@ uint32_t EmuWrapper::installApplication(const QString& path){
return error;
}
std::vector<QString>& EmuWrapper::getDebugStrings(){
uint32_t EmuWrapper::saveState(const QString& name){
bool wasPaused = isPaused();
uint32_t error = EMU_ERROR_INVALID_PARAMETER;
QFile stateFile(emuSaveStatePath + "/" + name + ".state");
if(!wasPaused)
pause();
//save here
if(stateFile.open(QFile::WriteOnly)){
uint32_t stateSize = emulatorGetStateSize();
uint8_t* stateData = new uint8_t[stateSize];
emulatorSaveState(stateData, stateSize);//no need to check for errors since the buffer is always the right size
stateFile.write((const char*)stateData, stateSize);
stateFile.close();
error = EMU_ERROR_NONE;
}
if(!wasPaused)
resume();
return error;
}
uint32_t EmuWrapper::loadState(const QString& name){
bool wasPaused = isPaused();
uint32_t error = EMU_ERROR_INVALID_PARAMETER;
QFile stateFile(emuSaveStatePath + "/" + name + ".state");
if(!wasPaused)
pause();
if(stateFile.open(QFile::ReadOnly | QFile::ExistingOnly)){
if(emulatorLoadState((uint8_t*)stateFile.readAll().data(), stateFile.size()))
error = EMU_ERROR_NONE;
stateFile.close();
}
if(!wasPaused)
resume();
return error;
}
void EmuWrapper::setPenValue(float x, float y, bool touched){
emuInput.touchscreenX = x;
emuInput.touchscreenY = y;
emuInput.touchscreenTouched = touched;
}
void EmuWrapper::setKeyValue(uint8_t key, bool pressed){
switch(key){
case BUTTON_UP:
emuInput.buttonUp = pressed;
break;
case BUTTON_DOWN:
emuInput.buttonDown = pressed;
break;
case BUTTON_LEFT:
emuInput.buttonLeft = pressed;
break;
case BUTTON_RIGHT:
emuInput.buttonRight = pressed;
break;
case BUTTON_CENTER:
emuInput.buttonCenter = pressed;
break;
case BUTTON_CALENDAR:
emuInput.buttonCalendar = pressed;
break;
case BUTTON_ADDRESS:
emuInput.buttonAddress = pressed;
break;
case BUTTON_TODO:
emuInput.buttonTodo = pressed;
break;
case BUTTON_NOTES:
emuInput.buttonNotes = pressed;
break;
case BUTTON_VOICE_MEMO:
emuInput.buttonVoiceMemo = pressed;
break;
case BUTTON_POWER:
emuInput.buttonPower = pressed;
break;
default:
break;
}
}
QVector<QString>& EmuWrapper::debugGetLogEntrys(){
return debugStrings;
}
std::vector<uint64_t>& EmuWrapper::getDuplicateCallCount(){
QVector<uint64_t>& EmuWrapper::debugGetDuplicateLogEntryCount(){
return duplicateCallCount;
}
std::vector<uint32_t> EmuWrapper::getCpuRegisters(){
std::vector<uint32_t> registers;
QString EmuWrapper::debugGetCpuRegisterString(){
QString regString = "";
for(uint8_t reg = 0; reg < 18; reg++)
registers.push_back(flx68000GetRegister(reg));
return registers;
if(palmEmulatingTungstenT3){
for(uint8_t regs = 0; regs < 16; regs++)
regString += QString::asprintf("R%d:0x%08X\n", regs, pxa260GetRegister(regs));
regString += QString::asprintf("SP:0x%08X\n", pxa260GetRegister(13));
regString += QString::asprintf("LR:0x%08X\n", pxa260GetRegister(14));
regString += QString::asprintf("PC:0x%08X\n", pxa260GetPc());
regString += QString::asprintf("CPSR:0x%08X\n", pxa260GetCpsr());
regString += QString::asprintf("SPSR:0x%08X", pxa260GetSpsr());
}
else{
for(uint8_t dRegs = 0; dRegs < 8; dRegs++)
regString += QString::asprintf("D%d:0x%08X\n", dRegs, flx68000GetRegister(dRegs));
for(uint8_t aRegs = 0; aRegs < 8; aRegs++)
regString += QString::asprintf("A%d:0x%08X\n", aRegs, flx68000GetRegister(8 + aRegs));
regString += QString::asprintf("SP:0x%08X\n", flx68000GetRegister(15));
regString += QString::asprintf("PC:0x%08X\n", flx68000GetPc());
regString += QString::asprintf("SR:0x%04X", flx68000GetStatusRegister());
}
return regString;
}
uint64_t EmuWrapper::getEmulatorMemory(uint32_t address, uint8_t size){
uint64_t EmuWrapper::debugGetEmulatorMemory(uint32_t address, uint8_t size){
if(palmEmulatingTungstenT3)
return pxa260ReadArbitraryMemory(address, size);
return flx68000ReadArbitraryMemory(address, size);
}
QString EmuWrapper::debugGetEmulatorDisassemble(uint32_t address, uint32_t opcodes){
QString output = "";
if(palmEmulatingTungstenT3){
}
else{
for(uint32_t index = 0; index < opcodes; index++){
}
}
return output;
}

View File

@@ -1,12 +1,12 @@
#pragma once
#include <QPixmap>
#include <QImage>
#include <QVector>
#include <QString>
#include <QByteArray>
#include <thread>
#include <atomic>
#include <vector>
#include <stdint.h>
#include "../../src/emulator.h"
@@ -22,32 +22,50 @@ private:
std::atomic<bool> emuRunning;
std::atomic<bool> emuPaused;
std::atomic<bool> emuNewFrameReady;
QString emuOsName;
QString emuRamFilePath;
QString emuSdCardFilePath;
QString emuSaveStatePath;
input_t emuInput;
void emuThreadRun();
void writeOutSaves();
public:
input_t emuInput;
enum{
BUTTON_UP = 0,
BUTTON_DOWN,
BUTTON_LEFT,
BUTTON_RIGHT,
BUTTON_CENTER,
BUTTON_CALENDAR,
BUTTON_ADDRESS,
BUTTON_TODO,
BUTTON_NOTES,
BUTTON_VOICE_MEMO,
BUTTON_POWER,
BUTTON_TOTAL_COUNT
};
EmuWrapper();
~EmuWrapper();
uint32_t init(const QString& romPath, const QString& bootloaderPath = "", const QString& ramPath = "", const QString& sdCardPath = "", uint32_t features = FEATURE_ACCURATE);
uint32_t init(const QString& assetPath, uint8_t osVersion, bool syncRtc = false, bool allowInvalidBehavior = false, bool fastBoot = false);
void exit();
void pause();
void resume();
uint32_t saveState(const QString& path);
uint32_t loadState(const QString& path);
void reset(bool hard);
void setCpuSpeed(double speed);
uint32_t bootFromFile(const QString& mainPath);
uint32_t installApplication(const QString& path);
const QString& getStatePath() const{return emuSaveStatePath;}//needed for looking up state pictures in the GUI
uint32_t saveState(const QString& name);
uint32_t loadState(const QString& name);
bool isInited() const{return emuInited;}
bool isRunning() const{return emuRunning;}
bool isPaused() const{return emuPaused;}
uint32_t installApplication(const QString& path);
std::vector<QString>& getDebugStrings();
std::vector<uint64_t>& getDuplicateCallCount();
std::vector<uint32_t> getCpuRegisters();
void setPenValue(float x, float y, bool touched);
void setKeyValue(uint8_t key, bool pressed);
uint16_t screenWidth() const{return palmFramebufferWidth;}
uint16_t screenHeight() const{return palmFramebufferHeight;}
@@ -55,9 +73,13 @@ public:
void frameHandled(){emuNewFrameReady = false;}
//calling these while newFrameReady() == false is undefined behavior, the other thread may be writing to them
const QPixmap getFramebuffer(){return QPixmap::fromImage(QImage((uchar*)palmFramebuffer, palmFramebufferWidth, palmFramebufferHeight, palmFramebufferWidth * sizeof(uint16_t), QImage::Format_RGB16));}
const QImage getFramebufferImage(){return QImage((uchar*)palmFramebuffer, palmFramebufferWidth, palmFramebufferHeight, palmFramebufferWidth * sizeof(uint16_t), QImage::Format_RGB16);}
const int16_t* getAudioSamples() const{return palmAudio;}
bool getPowerButtonLed() const{return palmMisc.powerButtonLed;}
bool getPowerButtonLed() const{return palmMisc.greenLed;}
uint64_t getEmulatorMemory(uint32_t address, uint8_t size);
QVector<QString>& debugGetLogEntrys();
QVector<uint64_t>& debugGetDuplicateLogEntryCount();
QString debugGetCpuRegisterString();
uint64_t debugGetEmulatorMemory(uint32_t address, uint8_t size);
QString debugGetEmulatorDisassemble(uint32_t address, uint32_t opcodes);
};

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 7.6 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.1 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

@@ -1,337 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48px"
height="48px"
id="svg1307"
sodipodi:version="0.32"
inkscape:version="0.46"
sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/actions"
sodipodi:docname="media-record.svg"
inkscape:export-filename="/home/lapo/Desktop/Grafica/Icone/media-actions-outlines.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs1309">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 24 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="48 : 24 : 1"
inkscape:persp3d-origin="24 : 16 : 1"
id="perspective47" />
<linearGradient
id="linearGradient3837">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop3839" />
<stop
style="stop-color:#ffffff;stop-opacity:0.78350514;"
offset="1"
id="stop3841" />
</linearGradient>
<linearGradient
id="linearGradient2257">
<stop
style="stop-color:#ef2929"
offset="0"
id="stop2259" />
<stop
style="stop-color:#cc0000"
offset="1"
id="stop2261" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient3340">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3342" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop3344" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient8662">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop8664" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop8666" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8662"
id="radialGradient2228"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.536723,-3.241652e-13,16.87306)"
cx="24.837126"
cy="36.421127"
fx="24.837126"
fy="36.421127"
r="15.644737" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3340"
id="radialGradient1368"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(3.658819,-3.13388e-16,1.719536e-16,2.080782,-62.4164,12.76204)"
cx="21.929186"
cy="-3.2182934"
fx="21.929186"
fy="-3.2182934"
r="13" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2257"
id="radialGradient2263"
cx="22.5"
cy="28.116049"
fx="22.5"
fy="28.116049"
r="14.537862"
gradientTransform="matrix(2.365562,-4.942242e-16,5.359766e-16,2.202845,-30.72517,-34.23996)"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3837"
id="linearGradient3843"
x1="21.702389"
y1="8.9115314"
x2="21.816015"
y2="35.546108"
gradientUnits="userSpaceOnUse" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2257"
id="radialGradient3845"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.365562,-4.942242e-16,5.359766e-16,2.202845,-30.72517,-34.23996)"
cx="22.5"
cy="28.116049"
fx="22.5"
fy="28.116049"
r="14.537862" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="0.11372549"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="-125.50077"
inkscape:cy="34.59508"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:grid-points="true"
fill="#ef2929"
showguides="false"
inkscape:guide-bbox="true"
guidetolerance="1px"
stroke="#ef2929"
inkscape:window-width="872"
inkscape:window-height="688"
inkscape:window-x="494"
inkscape:window-y="160"
showborder="true"
inkscape:showpageshadow="false">
<sodipodi:guide
orientation="horizontal"
position="38.996647"
id="guide2194" />
<sodipodi:guide
orientation="horizontal"
position="9.0140845"
id="guide2196" />
<sodipodi:guide
orientation="vertical"
position="9.0140845"
id="guide2198" />
<sodipodi:guide
orientation="vertical"
position="38.975184"
id="guide2200" />
<sodipodi:guide
orientation="horizontal"
position="22.988281"
id="guide2202" />
<sodipodi:guide
orientation="vertical"
position="23.908786"
id="guide2204" />
<sodipodi:guide
orientation="vertical"
position="157.99417"
id="guide4332" />
<sodipodi:guide
orientation="horizontal"
position="-36.062446"
id="guide4334" />
<sodipodi:guide
orientation="horizontal"
position="-58.02695"
id="guide4336" />
<sodipodi:guide
orientation="vertical"
position="180.00287"
id="guide4338" />
<sodipodi:guide
orientation="vertical"
position="107.92217"
id="guide4417" />
<sodipodi:guide
orientation="vertical"
position="129.93087"
id="guide4419" />
<sodipodi:guide
orientation="horizontal"
position="19.996875"
id="guide5106" />
<sodipodi:guide
orientation="horizontal"
position="63.039674"
id="guide5119" />
<sodipodi:guide
orientation="horizontal"
position="49.066305"
id="guide5121" />
<sodipodi:guide
orientation="horizontal"
position="-86.007168"
id="guide5307" />
<sodipodi:guide
orientation="horizontal"
position="-108.09009"
id="guide5309" />
<sodipodi:guide
orientation="horizontal"
position="-100.15429"
id="guide3111" />
<inkscape:grid
id="GridFromPre046Settings"
type="xygrid"
originx="0px"
originy="0px"
spacingx="0.5px"
spacingy="0.5px"
color="#0000ff"
empcolor="#0000ff"
opacity="0.2"
empopacity="0.4"
empspacing="2" />
</sodipodi:namedview>
<metadata
id="metadata1312">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Media Record</dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Lapo Calamandrei</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
<dc:subject>
<rdf:Bag>
<rdf:li>media</rdf:li>
<rdf:li>player</rdf:li>
<rdf:li>record</rdf:li>
<rdf:li>music</rdf:li>
<rdf:li>sound</rdf:li>
<rdf:li>video</rdf:li>
</rdf:Bag>
</dc:subject>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer"
style="display:inline">
<path
transform="matrix(0.920697,0,0,0.99358,3.679484,1.641236)"
d="M 36.5 22 A 14 13 0 1 1 8.5,22 A 14 13 0 1 1 36.5 22 z"
sodipodi:ry="13"
sodipodi:rx="14"
sodipodi:cy="22"
sodipodi:cx="22.5"
id="path3835"
style="opacity:0.15;color:#000000;fill:url(#radialGradient3845);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3843);stroke-width:3.13661647;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
sodipodi:type="arc"
inkscape:r_cx="true"
inkscape:r_cy="true" />
<path
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="/home/lapo/Desktop/Grafica/Icone/media-actions.png"
sodipodi:type="arc"
style="opacity:0.03999999;color:#000000;fill:url(#radialGradient2228);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
id="path2226"
sodipodi:cx="24.837126"
sodipodi:cy="36.421127"
sodipodi:rx="15.644737"
sodipodi:ry="8.3968935"
d="M 40.481863 36.421127 A 15.644737 8.3968935 0 1 1 9.1923885,36.421127 A 15.644737 8.3968935 0 1 1 40.481863 36.421127 z"
transform="matrix(1.150533,0,0,0.565685,-4.5765,16.55285)" />
<path
sodipodi:type="arc"
style="color:#000000;fill:url(#radialGradient2263);fill-opacity:1.0;fill-rule:evenodd;stroke:#cc0000;stroke-width:1.0757246;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
id="path2525"
sodipodi:cx="22.5"
sodipodi:cy="22"
sodipodi:rx="14"
sodipodi:ry="13"
d="M 36.5 22 A 14 13 0 1 1 8.5,22 A 14 13 0 1 1 36.5 22 z"
transform="matrix(0.894862,0,0,0.9657,3.855776,2.660348)" />
<path
sodipodi:type="arc"
style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#f77d7d;stroke-width:1.21739173;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
id="path2527"
sodipodi:cx="24"
sodipodi:cy="24"
sodipodi:rx="14"
sodipodi:ry="14"
d="M 38 24 A 14 14 0 1 1 10,24 A 14 14 0 1 1 38 24 z"
transform="matrix(0.821429,0,0,0.821429,4.285117,4.191455)" />
<path
style="opacity:0.6;fill:url(#radialGradient1368);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.25pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
d="M 23.84315,11.90574 C 17.563618,11.985335 12.438727,16.897799 12.03065,23.09324 C 18.148473,25.61002 25.90107,21.642017 35.172655,19.711354 C 34.484245,16.962785 30.617935,11.90574 23.9994,11.90574 C 23.947693,11.90574 23.894703,11.905087 23.84315,11.90574 z "
id="path2529"
sodipodi:nodetypes="cccsc" />
</g>
</svg>
<svg height="32.880508" width="35.999573" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><radialGradient id="a" cx="22.5" cy="28.115999" gradientTransform="matrix(2.365562 0 0 2.202845 -30.72517 -34.23996)" gradientUnits="userSpaceOnUse" r="14.538"><stop offset="0" stop-color="#ef2929"/><stop offset="1" stop-color="#c00"/></radialGradient><radialGradient id="b" cx="24.837" cy="36.421001" gradientTransform="matrix(1 0 0 .536723 0 16.87306)" gradientUnits="userSpaceOnUse" r="15.645"><stop offset="0"/><stop offset="1" stop-opacity="0"/></radialGradient><radialGradient id="c" cx="21.929001" cy="-3.218" gradientTransform="matrix(3.658819 0 0 2.080782 -68.416046 3.736818)" gradientUnits="userSpaceOnUse" r="13"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></radialGradient><linearGradient id="d" gradientUnits="userSpaceOnUse" x1="21.702" x2="21.816" y1="8.912" y2="35.546001"><stop offset="0"/><stop offset="1" stop-color="#fff" stop-opacity=".784"/></linearGradient><g fill-rule="evenodd" transform="translate(-5.999646 -9.025222)"><path d="m36.5 22a14 13 0 1 1 -28 0 14 13 0 1 1 28 0z" style="opacity:.15;stroke-width:3.136616;stroke-linecap:square;stroke-linejoin:round;fill:url(#a);stroke:url(#d)" transform="matrix(.920697 0 0 .99358 3.679484 1.641236)"/><path d="m40.481863 36.421127a15.644737 8.3968937 0 1 1 -31.2894745 0 15.644737 8.3968937 0 1 1 31.2894745 0z" fill="url(#b)" opacity=".04" transform="matrix(1.150533 0 0 .565685 -4.5765 16.55285)"/><path d="m36.5 22a14 13 0 1 1 -28 0 14 13 0 1 1 28 0z" fill="url(#a)" stroke="#c00" stroke-linecap="square" stroke-linejoin="round" stroke-width="1.076" transform="matrix(.894862 0 0 .9657 3.855776 2.660348)"/></g><path d="m29.499773 14.880529a11.500006 11.500006 0 1 1 -23.0000123 0 11.500006 11.500006 0 1 1 23.0000123 0z" fill="none" stroke="#f77d7d" stroke-linecap="square" stroke-linejoin="round" stroke-width=".999679"/><path d="m17.843504 2.8805179c-6.279532.07959-11.4044233 4.992059-11.8125003 11.1875001 6.1178233 2.51678 13.8704203-1.451223 23.1420053-3.381886-.68841-2.7485691-4.55472-7.8056141-11.173255-7.8056141-.05171 0-.104697-.000653-.15625 0z" fill="url(#c)" fill-rule="evenodd" opacity=".6"/></svg>

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

View File

@@ -1,200 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
sodipodi:docname="go-down.svg"
sodipodi:docbase="/home/tigert/cvs/freedesktop.org/tango-icon-theme/scalable/actions"
inkscape:version="0.46"
sodipodi:version="0.32"
id="svg11300"
height="48px"
width="48px"
inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
inkscape:export-xdpi="90.000000"
inkscape:export-ydpi="90.000000"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs3">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 24 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="48 : 24 : 1"
inkscape:persp3d-origin="24 : 16 : 1"
id="perspective24" />
<linearGradient
id="linearGradient1442">
<stop
id="stop1444"
offset="0"
style="stop-color:#73d216" />
<stop
id="stop1446"
offset="1.0000000"
style="stop-color:#4e9a06" />
</linearGradient>
<linearGradient
id="linearGradient8662"
inkscape:collect="always">
<stop
id="stop8664"
offset="0"
style="stop-color:#000000;stop-opacity:1;" />
<stop
id="stop8666"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient8650"
inkscape:collect="always">
<stop
id="stop8652"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop8654"
offset="1"
style="stop-color:#ffffff;stop-opacity:0;" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8662"
id="radialGradient1444"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.536723,1.614716e-15,16.87306)"
cx="24.837126"
cy="36.421127"
fx="24.837126"
fy="36.421127"
r="15.644737" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient1442"
id="radialGradient1469"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.871885e-16,-0.843022,1.020168,2.265228e-16,0.606436,42.58614)"
cx="35.292667"
cy="20.494493"
fx="35.292667"
fy="20.494493"
r="16.956199" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8650"
id="radialGradient1471"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(3.749427e-16,-2.046729,-1.557610,-2.853404e-16,44.11559,66.93275)"
cx="15.987216"
cy="1.5350308"
fx="15.987216"
fy="1.5350308"
r="17.171415" />
</defs>
<sodipodi:namedview
inkscape:window-y="30"
inkscape:window-x="0"
inkscape:window-height="818"
inkscape:window-width="1280"
inkscape:showpageshadow="false"
inkscape:document-units="px"
inkscape:grid-bbox="true"
showgrid="false"
inkscape:current-layer="layer1"
inkscape:cy="23.239067"
inkscape:cx="15.972815"
inkscape:zoom="11.313708"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
borderopacity="0.25490196"
bordercolor="#666666"
pagecolor="#ffffff"
id="base"
fill="#4e9a06"
stroke="#4e9a06" />
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Steiner</dc:title>
</cc:Agent>
</dc:creator>
<dc:source>http://jimmac.musichall.cz</dc:source>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
<dc:title>Go Down</dc:title>
<dc:subject>
<rdf:Bag>
<rdf:li>go</rdf:li>
<rdf:li>lower</rdf:li>
<rdf:li>down</rdf:li>
<rdf:li>arrow</rdf:li>
<rdf:li>pointer</rdf:li>
<rdf:li>&gt;</rdf:li>
</rdf:Bag>
</dc:subject>
<dc:contributor>
<cc:Agent>
<dc:title>Andreas Nilsson</dc:title>
</cc:Agent>
</dc:contributor>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
inkscape:label="Layer 1"
id="layer1">
<path
transform="matrix(1.214466,0.000000,0.000000,0.595458,-6.163846,16.31275)"
d="M 40.481863 36.421127 A 15.644737 8.3968935 0 1 1 9.1923885,36.421127 A 15.644737 8.3968935 0 1 1 40.481863 36.421127 z"
sodipodi:ry="8.3968935"
sodipodi:rx="15.644737"
sodipodi:cy="36.421127"
sodipodi:cx="24.837126"
id="path8660"
style="opacity:0.20454545;color:#000000;fill:url(#radialGradient1444);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
sodipodi:type="arc" />
<g
id="g1464"
transform="matrix(-1.000000,0.000000,0.000000,-1.000000,47.02856,43.99921)">
<path
style="opacity:1.0000000;color:#000000;fill:url(#radialGradient1469);fill-opacity:1.0000000;fill-rule:evenodd;stroke:#3a7304;stroke-width:1.0000004;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
d="M 14.519136,38.500000 L 32.524165,38.496094 L 32.524165,25.504468 L 40.519531,25.496656 L 23.374809,5.4992135 L 6.5285585,25.497284 L 14.524440,25.501074 L 14.519136,38.500000 z "
id="path8643"
sodipodi:nodetypes="cccccccc" />
<path
style="opacity:0.50802141;color:#000000;fill:url(#radialGradient1471);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
d="M 39.429889,24.993467 L 32.023498,25.005186 L 32.026179,37.998023 L 16.647623,37.98887 C 17.417545,19.64788 27.370272,26.995797 32.029282,16.341991 L 39.429889,24.993467 z "
id="path8645"
sodipodi:nodetypes="cccccc" />
<path
sodipodi:nodetypes="cccccccc"
id="path8658"
d="M 15.520704,37.496094 L 31.522109,37.500000 L 31.522109,24.507050 L 38.338920,24.491425 L 23.384644,7.0388396 L 8.6781173,24.495782 L 15.518018,24.501029 L 15.520704,37.496094 z "
style="opacity:0.48128340;color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.0000004;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
</g>
</g>
</svg>
<svg height="38.00079" width="38.000004" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><radialGradient id="a" cx="24.837126" cy="36.421127" gradientTransform="matrix(1.214466 0 0 .319596 -11.163843 21.360739)" gradientUnits="userSpaceOnUse" r="15.644737"><stop offset="0"/><stop offset="1" stop-opacity="0"/></radialGradient><radialGradient id="b" cx="35.292667" cy="20.494493" gradientTransform="matrix(0 -.843022 1.020168 0 .606436 42.58614)" gradientUnits="userSpaceOnUse" r="16.9562"><stop offset="0" stop-color="#73d216"/><stop offset="1" stop-color="#4e9a06"/></radialGradient><radialGradient id="c" cx="15.987216" cy="1.535031" gradientTransform="matrix(0 -2.046729 -1.55761 0 44.11559 66.93275)" gradientUnits="userSpaceOnUse" r="17.171415"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></radialGradient><path d="m38.000003 33.000791a19.000001 4.9999976 0 1 1 -38.000003 0 19.000001 4.9999976 0 1 1 38.000003 0z" fill="url(#a)" fill-rule="evenodd" opacity=".204545" stroke-width=".85039"/><g transform="matrix(-1 0 0 -1 42.028562 39)"><path d="m14.519136 38.5 18.005029-.0039v-12.991632l7.995366-.0078-17.144722-19.9974545-16.8462505 19.9980705 7.9958815.0038z" style="fill-rule:evenodd;stroke:#3a7304;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill:url(#b)"/><path d="m39.429889 24.993467-7.406391.01172.0027 12.992837-15.378556-.0092c.769903-18.340944 10.72263-10.993027 15.38164-21.646833z" fill="url(#c)" fill-rule="evenodd" opacity=".508021"/><path d="m15.520704 37.496094 16.001405.003906v-12.99295l6.816811-.015625-14.954276-17.4525854-14.7065267 17.4569424 6.8399007.0052z" fill="none" opacity=".481283" stroke="#fff" stroke-miterlimit="10"/></g></svg>

Before

Width:  |  Height:  |  Size: 8.1 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -1,497 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48.000000px"
height="48.000000px"
id="svg14603"
sodipodi:version="0.32"
inkscape:version="0.46"
sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/apps"
sodipodi:docname="system-installer.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs3">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 24 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="48 : 24 : 1"
inkscape:persp3d-origin="24 : 16 : 1"
id="perspective79" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient5060"
id="radialGradient5031"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
cx="605.71429"
cy="486.64789"
fx="605.71429"
fy="486.64789"
r="117.14286" />
<linearGradient
inkscape:collect="always"
id="linearGradient5060">
<stop
style="stop-color:black;stop-opacity:1;"
offset="0"
id="stop5062" />
<stop
style="stop-color:black;stop-opacity:0;"
offset="1"
id="stop5064" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient5060"
id="radialGradient5029"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
cx="605.71429"
cy="486.64789"
fx="605.71429"
fy="486.64789"
r="117.14286" />
<linearGradient
id="linearGradient5048">
<stop
style="stop-color:black;stop-opacity:0;"
offset="0"
id="stop5050" />
<stop
id="stop5056"
offset="0.5"
style="stop-color:black;stop-opacity:1;" />
<stop
style="stop-color:black;stop-opacity:0;"
offset="1"
id="stop5052" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5048"
id="linearGradient5027"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
x1="302.85715"
y1="366.64789"
x2="302.85715"
y2="609.50507" />
<linearGradient
id="linearGradient7844"
inkscape:collect="always">
<stop
id="stop7846"
offset="0"
style="stop-color:#000000;stop-opacity:1;" />
<stop
id="stop7848"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient7834"
inkscape:collect="always">
<stop
id="stop7836"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop7838"
offset="1"
style="stop-color:#ffffff;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient7670">
<stop
id="stop7672"
offset="0"
style="stop-color:#dfdfdf;stop-opacity:1;" />
<stop
id="stop7674"
offset="1.0000000"
style="stop-color:#c0c0c0;stop-opacity:1.0000000;" />
</linearGradient>
<linearGradient
gradientTransform="matrix(1.008511,0.000000,0.000000,1.000000,-47.59576,-0.285714)"
gradientUnits="userSpaceOnUse"
y2="40.857143"
x2="72.857140"
y1="9.7142859"
x1="64.571426"
id="linearGradient7676"
xlink:href="#linearGradient7670"
inkscape:collect="always" />
<linearGradient
gradientTransform="translate(-2.000000,0.000000)"
gradientUnits="userSpaceOnUse"
y2="0.50379461"
x2="19.323767"
y1="11.312428"
x1="19.362535"
id="linearGradient7840"
xlink:href="#linearGradient7834"
inkscape:collect="always" />
<radialGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.333333,1.298874e-16,25.06362)"
r="22.728432"
fy="37.595428"
fx="24.546707"
cy="37.595428"
cx="24.546707"
id="radialGradient7850"
xlink:href="#linearGradient7844"
inkscape:collect="always" />
<linearGradient
id="aigrd1"
gradientUnits="userSpaceOnUse"
x1="14.9966"
y1="11.1885"
x2="32.511"
y2="34.3075">
<stop
offset="0"
style="stop-color:#EBEBEB"
id="stop3034" />
<stop
offset="0.5"
style="stop-color:#FFFFFF"
id="stop3036" />
<stop
offset="1"
style="stop-color:#EBEBEB"
id="stop3038" />
</linearGradient>
<linearGradient
id="aigrd2"
gradientUnits="userSpaceOnUse"
x1="12.2744"
y1="32.4165"
x2="35.3912"
y2="14.2033">
<stop
offset="0"
style="stop-color:#FBFBFB"
id="stop3043" />
<stop
offset="0.5"
style="stop-color:#B6B6B6"
id="stop3045" />
<stop
offset="1"
style="stop-color:#E4E4E4"
id="stop3047" />
</linearGradient>
<linearGradient
id="linearGradient4236">
<stop
style="stop-color:#ffffff;stop-opacity:0.32673267;"
offset="0.0000000"
id="stop4238" />
<stop
style="stop-color:#ffffff;stop-opacity:0.60396039;"
offset="1.0000000"
id="stop4240" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient6028">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop6030" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop6032" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient6036">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop6038" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop6040" />
</linearGradient>
<linearGradient
y2="14.2033"
x2="35.3912"
y1="32.4165"
x1="12.2744"
gradientUnits="userSpaceOnUse"
id="linearGradient3394">
<stop
id="stop3396"
style="stop-color:#fff307;stop-opacity:1.0000000;"
offset="0.0000000" />
<stop
id="stop3398"
style="stop-color:#166eff;stop-opacity:1.0000000;"
offset="0.50000000" />
<stop
id="stop3400"
style="stop-color:#ffffff;stop-opacity:0.0000000;"
offset="1.0000000" />
</linearGradient>
<radialGradient
r="22.728432"
fy="37.595428"
fx="24.546707"
cy="37.595428"
cx="24.546707"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.333333,1.121564e-14,25.06362)"
gradientUnits="userSpaceOnUse"
id="radialGradient10566"
xlink:href="#linearGradient7844"
inkscape:collect="always" />
<linearGradient
y2="34.3075"
x2="32.511"
y1="11.1885"
x1="14.9966"
gradientTransform="matrix(0.683145,0.000000,0.000000,0.683145,18.55581,18.12886)"
gradientUnits="userSpaceOnUse"
id="linearGradient10568"
xlink:href="#aigrd1"
inkscape:collect="always" />
<linearGradient
y2="14.2033"
x2="35.3912"
y1="32.4165"
x1="12.2744"
gradientTransform="matrix(0.705308,0.000000,0.000000,0.705308,18.02392,17.61692)"
gradientUnits="userSpaceOnUse"
id="linearGradient10570"
xlink:href="#aigrd2"
inkscape:collect="always" />
<linearGradient
y2="28.000000"
x2="29.000000"
y1="14.625000"
x1="21.125000"
gradientTransform="matrix(0.717302,0.000000,0.000000,0.717302,17.73603,18.06909)"
gradientUnits="userSpaceOnUse"
id="linearGradient10572"
xlink:href="#linearGradient4236"
inkscape:collect="always" />
<linearGradient
y2="28.000000"
x2="29.000000"
y1="14.625000"
x1="21.125000"
gradientTransform="matrix(0.717302,0.000000,0.000000,0.717302,17.73603,18.06909)"
gradientUnits="userSpaceOnUse"
id="linearGradient10574"
xlink:href="#linearGradient4236"
inkscape:collect="always" />
<linearGradient
y2="54.698483"
x2="48.798885"
y1="3.6100161"
x1="10.501720"
gradientTransform="matrix(0.573842,0.000000,0.000000,0.573842,20.97995,19.56347)"
gradientUnits="userSpaceOnUse"
id="linearGradient10576"
xlink:href="#linearGradient6036"
inkscape:collect="always" />
<linearGradient
y2="18.366575"
x2="17.742729"
y1="31.494707"
x1="28.702885"
gradientUnits="userSpaceOnUse"
id="linearGradient10578"
xlink:href="#linearGradient6028"
inkscape:collect="always" />
<radialGradient
r="21.333334"
fy="27.569166"
fx="37.751469"
cy="27.569166"
cx="37.751469"
gradientTransform="matrix(0.441746,0.498655,-0.407098,0.360624,32.00755,10.21308)"
gradientUnits="userSpaceOnUse"
id="radialGradient10580"
xlink:href="#linearGradient3394"
inkscape:collect="always" />
</defs>
<sodipodi:namedview
fill="#a40000"
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="0.26666667"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="-127.33612"
inkscape:cy="17.441956"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:showpageshadow="false"
inkscape:window-width="872"
inkscape:window-height="688"
inkscape:window-x="213"
inkscape:window-y="160" />
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>System - Installer</dc:title>
<dc:creator>
<cc:Agent>
<dc:title>jakub Steiner</dc:title>
</cc:Agent>
</dc:creator>
<dc:source>http://jimmac.musichall.cz</dc:source>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<path
sodipodi:nodetypes="ccccc"
id="path7822"
d="M 7.0663522,9.8326324 L 11.142857,5.5714286 L 34.714286,5.5714286 L 39.034663,9.9336477 L 7.0663522,9.8326324 z "
style="opacity:1.0000000;color:#000000;fill:#6b6c69;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#606060;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
<g
id="g5022"
transform="matrix(2.01828e-2,0,0,2.086758e-2,41.09416,37.29644)">
<rect
y="-150.69685"
x="-1559.2523"
height="478.35718"
width="1339.6335"
id="rect4173"
style="opacity:0.40206185;color:black;fill:url(#linearGradient5027);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
<path
sodipodi:nodetypes="cccc"
id="path5058"
d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
style="opacity:0.40206185;color:black;fill:url(#radialGradient5029);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
<path
style="opacity:0.40206185;color:black;fill:url(#radialGradient5031);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
id="path5018"
sodipodi:nodetypes="cccc" />
</g>
<rect
ry="1.4285715"
rx="1.4285721"
y="9.4285717"
x="6.5756874"
height="31.142857"
width="32.848644"
id="rect6910"
style="opacity:1.0000000;color:#000000;fill:url(#linearGradient7676);fill-opacity:1.0000000;fill-rule:evenodd;stroke:#606060;stroke-width:1.0000001;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
<path
sodipodi:nodetypes="cccccc"
id="rect7826"
d="M 38.857143,22.756128 L 38.857143,39.184701 C 38.857143,39.659558 38.494011,40.041844 38.042945,40.041844 L 15.874474,40.041844 L 15.923863,22.756128 C 15.923863,22.756128 38.857143,22.756128 38.857143,22.756128 z "
style="color:#000000;fill:#a40000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:1.0000000 1.0000000 ;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
<path
sodipodi:nodetypes="cc"
id="path7824"
d="M 15.379549,11.285714 L 15.379549,39.285714"
style="opacity:1.0000000;color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#606060;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:1.0000000 1.0000000 ;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
<path
style="color:#000000;fill:#f0f0f0;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:1.0000000 1.0000000 ;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
d="M 38.857143,22.613273 L 38.857143,11.470414 C 38.857143,10.995557 38.494011,10.613271 38.042945,10.613271 L 15.874474,10.613271 L 15.923863,22.613273 C 15.923863,22.613273 38.857143,22.613273 38.857143,22.613273 z "
id="path10582"
sodipodi:nodetypes="cccccc" />
<path
sodipodi:nodetypes="ccccccccs"
id="rect7829"
d="M 11.512932,6.5274685 C 11.512932,6.5274685 34.285047,6.5274685 34.285047,6.5274685 C 34.285047,6.5274685 38.542046,10.784467 38.542046,10.784467 L 38.542046,39.215524 C 38.542046,39.503290 38.310378,39.734958 38.022612,39.734958 L 7.9773979,39.734958 C 7.6896315,39.734958 7.4579639,39.503290 7.4579639,39.215524 L 7.4579639,10.784467 C 7.4579639,10.784467 11.512932,6.5274685 11.512932,6.5274685 z "
style="opacity:0.62566847;color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:url(#linearGradient7840);stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
<g
transform="translate(-0.999997,-0.285714)"
id="g10554">
<path
transform="matrix(0.550240,0.000000,0.000000,0.550240,19.89726,20.62321)"
d="M 47.275139 37.595428 A 22.728432 7.5761442 0 1 1 1.8182755,37.595428 A 22.728432 7.5761442 0 1 1 47.275139 37.595428 z"
sodipodi:ry="7.5761442"
sodipodi:rx="22.728432"
sodipodi:cy="37.595428"
sodipodi:cx="24.546707"
id="path10170"
style="opacity:0.62566847;color:#000000;fill:url(#radialGradient10566);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:1.0000000 1.0000000 ;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
sodipodi:type="arc" />
<g
id="g10156"
transform="translate(-1.642857,-2.642857)">
<path
style="fill:url(#linearGradient10568);fill-rule:nonzero;stroke:none;stroke-miterlimit:4.0000000"
d="M 34.951289,21.954475 C 28.324780,21.954475 22.996247,27.283008 22.996247,33.909517 C 22.996247,40.536026 28.324780,45.864559 34.951289,45.864559 C 41.577799,45.864559 46.906332,40.536026 46.906332,33.909517 C 46.906332,27.283008 41.577799,21.954475 34.951289,21.954475 L 34.951289,21.954475 z M 34.951289,36.778727 C 33.380055,36.778727 32.082079,35.480751 32.082079,33.909517 C 32.082079,32.338283 33.380055,31.040307 34.951289,31.040307 C 36.522523,31.040307 37.820499,32.338283 37.820499,33.909517 C 37.820499,35.480751 36.522523,36.778727 34.951289,36.778727 z "
id="path3040" />
<path
style="fill:url(#linearGradient10570);fill-rule:nonzero;stroke:#808080;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
d="M 34.951305,21.566644 C 28.109819,21.566644 22.608417,27.068045 22.608417,33.909532 C 22.608417,40.751018 28.109819,46.252419 34.951305,46.252419 C 41.792792,46.252419 47.294193,40.751018 47.294193,33.909532 C 47.294193,27.068045 41.792792,21.566644 34.951305,21.566644 L 34.951305,21.566644 z M 34.951305,36.871824 C 33.329097,36.871824 31.989012,35.531740 31.989012,33.909532 C 31.989012,32.287324 33.329097,30.947239 34.951305,30.947239 C 36.573513,30.947239 37.913598,32.287324 37.913598,33.909532 C 37.913598,35.531740 36.573513,36.871824 34.951305,36.871824 z "
id="path3049" />
<path
style="opacity:0.10999996;fill-rule:nonzero;stroke:none;stroke-miterlimit:4.0000000"
d="M 34.951289,28.111323 C 31.713337,28.111323 29.153095,30.746866 29.153095,33.909517 C 29.153095,37.147471 31.788638,39.707712 34.951289,39.707712 C 38.189242,39.707712 40.749484,37.072169 40.749484,33.909517 C 40.749484,30.671564 38.113940,28.111323 34.951289,28.111323 L 34.951289,28.111323 z M 34.951289,37.072169 C 33.219361,37.072169 31.788638,35.641446 31.788638,33.909517 C 31.788638,32.177589 33.219361,30.746866 34.951289,30.746866 C 36.683217,30.746866 38.113940,32.177589 38.113940,33.909517 C 38.113940,35.641446 36.683217,37.072169 34.951289,37.072169 z "
id="path3051" />
<path
id="path3916"
d="M 38.150519,22.816711 L 36.086643,30.847436 C 36.732045,31.019312 37.248181,31.418679 37.598790,31.971330 L 44.709966,27.639233 C 43.255134,25.269429 40.920193,23.525895 38.150519,22.816711 z "
style="fill:url(#linearGradient10572);fill-opacity:1.0000000;fill-rule:nonzero;stroke:none;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
<path
style="fill:url(#linearGradient10574);fill-opacity:1.0000000;fill-rule:nonzero;stroke:none;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
d="M 30.911911,44.678269 L 33.629199,36.844465 C 33.000117,36.620097 32.518571,36.179639 32.214597,35.600027 L 24.771257,39.332667 C 26.026282,41.814082 28.209936,43.743724 30.911911,44.678269 z "
id="path4214" />
<path
sodipodi:nodetypes="cccccc"
id="path5264"
d="M 34.951287,22.548803 C 28.654207,22.548803 23.590575,27.612435 23.590575,33.909515 C 23.590575,40.206596 28.654207,45.270227 34.951287,45.270227 C 41.248368,45.270227 46.311999,40.206596 46.311999,33.909515 C 46.311999,27.612435 41.248368,22.548803 34.951287,22.548803 L 34.951287,22.548803 z "
style="opacity:0.54644811;fill:none;fill-rule:nonzero;stroke:url(#linearGradient10576);stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
<path
transform="matrix(0.573842,0.000000,0.000000,0.573842,21.03068,19.61419)"
d="M 30.405591 24.930641 A 6.0987959 6.0987959 0 1 1 18.207999,24.930641 A 6.0987959 6.0987959 0 1 1 30.405591 24.930641 z"
sodipodi:ry="6.0987959"
sodipodi:rx="6.0987959"
sodipodi:cy="24.930641"
sodipodi:cx="24.306795"
id="path6026"
style="opacity:0.67213112;color:#000000;fill:none;fill-opacity:0.31638417;fill-rule:nonzero;stroke:url(#linearGradient10578);stroke-width:1.6215941;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
sodipodi:type="arc" />
<path
id="path3390"
d="M 34.951289,23.065643 C 28.940684,23.065643 24.107415,27.898912 24.107415,33.909517 C 24.107415,39.920122 28.940684,44.753391 34.951289,44.753391 C 40.961895,44.753391 45.795164,39.920122 45.795164,33.909517 C 45.795164,27.898912 40.961895,23.065643 34.951289,23.065643 L 34.951289,23.065643 z M 34.951289,36.512047 C 33.526094,36.512047 32.348759,35.334712 32.348759,33.909517 C 32.348759,32.484322 33.526094,31.306987 34.951289,31.306987 C 36.376484,31.306987 37.553819,32.484322 37.553819,33.909517 C 37.553819,35.334712 36.376484,36.512047 34.951289,36.512047 z "
style="opacity:0.11428566;fill:url(#radialGradient10580);fill-opacity:1.0000000;fill-rule:nonzero;stroke:none;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
</g>
</g>
</g>
</svg>
<svg height="30.219618" width="32.000008" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="9.758869" x2="20.784717" y1="11.832546" y2="23.957546"><stop offset="0" stop-color="#729fcf"/><stop offset="1" stop-color="#5187d6"/></linearGradient><linearGradient id="b" gradientUnits="userSpaceOnUse" x1="9.758869" x2="20.784717" y1="11.832546" y2="23.957546"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#fff" stop-opacity=".340206"/></linearGradient><radialGradient id="c" cx="23.070683" cy="35.127438" gradientTransform="matrix(1.4184041 .02503119 -.01273728 .42257812 -16.102765 10.288754)" gradientUnits="userSpaceOnUse" r="10.31934"><stop offset="0"/><stop offset="1" stop-opacity="0"/></radialGradient><path d="m32.000005 25.627211a16.000003 4.5910004 0 1 1 -32.00000425 0 16.000003 4.5910004 0 1 1 32.00000425 0z" fill="url(#c)" opacity=".108247" stroke-width="1.751562"/><path d="m20.398226 26.523429v-9.02696l9.978465-.04018v-6.995324h-9.969535l-.0089-9.96016978-7.016273.01116.0045 9.93115178-9.9896263.07366-.03571 6.968539 10.0342693-.02902.0067 9.040353z" fill="#75a1d0" stroke="#3465a4"/><path d="m19.382572 25.514667v-9.034182h10.002602l-.0067-5.024429h-9.986974v-9.9949738l-4.994834.01786.0089 9.9771158-10.0261883.01786-.02679 4.97309 10.0643924.0089-.01339 9.027485z" fill="url(#a)" opacity=".408602" stroke="url(#b)" stroke-width="1.000001"/><path d="m3.8838706 13.980747c0 1.9375 25.9843744-.96875 25.9843744-.03125v-3l-9.984375.03125v-9.9652278h-5.999999v9.9652278h-10.0000004z" fill="#fff" fill-rule="evenodd" opacity=".311828"/></svg>

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -1,854 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
sodipodi:docname="go-previous.svg"
sodipodi:docbase="/home/andreas/projekt/tango/scalable"
inkscape:version="0.46"
sodipodi:version="0.32"
id="svg11300"
height="48px"
width="48px"
inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
inkscape:export-xdpi="90.000000"
inkscape:export-ydpi="90.000000"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs3">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 24 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="48 : 24 : 1"
inkscape:persp3d-origin="24 : 16 : 1"
id="perspective128" />
<linearGradient
id="linearGradient2591">
<stop
style="stop-color:#73d216"
offset="0"
id="stop2593" />
<stop
style="stop-color:#4e9a06"
offset="1.0000000"
id="stop2595" />
</linearGradient>
<linearGradient
id="linearGradient10314">
<stop
style="stop-color:#7ea5d6;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop10316" />
<stop
style="stop-color:#467ec5;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop10318" />
</linearGradient>
<linearGradient
id="linearGradient8938">
<stop
id="stop8940"
offset="0.0000000"
style="stop-color:#fdc674;stop-opacity:1.0000000;" />
<stop
id="stop8942"
offset="1.0000000"
style="stop-color:#d88103;stop-opacity:1.0000000;" />
</linearGradient>
<linearGradient
id="linearGradient8662"
inkscape:collect="always">
<stop
id="stop8664"
offset="0"
style="stop-color:#000000;stop-opacity:1;" />
<stop
id="stop8666"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient8650"
inkscape:collect="always">
<stop
id="stop8652"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop8654"
offset="1"
style="stop-color:#ffffff;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient7636"
inkscape:collect="always">
<stop
id="stop7638"
offset="0"
style="stop-color:#000000;stop-opacity:1;" />
<stop
id="stop7640"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient7614">
<stop
id="stop7616"
offset="0.0000000"
style="stop-color:#ffffff;stop-opacity:1.0000000;" />
<stop
style="stop-color:#ffffff;stop-opacity:1.0000000;"
offset="0.21590909"
id="stop7649" />
<stop
style="stop-color:#838383;stop-opacity:1.0000000;"
offset="0.50000000"
id="stop7632" />
<stop
id="stop7618"
offset="1"
style="stop-color:#838383;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient7608">
<stop
style="stop-color:#ffffff;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop7610" />
<stop
id="stop7622"
offset="0.46022728"
style="stop-color:#e3e3e3;stop-opacity:1.0000000;" />
<stop
style="stop-color:#dadada;stop-opacity:0.67058824;"
offset="0.61970556"
id="stop7624" />
<stop
style="stop-color:#d1d1d1;stop-opacity:0.34285715;"
offset="1.0000000"
id="stop7612" />
</linearGradient>
<linearGradient
id="linearGradient7602">
<stop
id="stop7604"
offset="0.0000000"
style="stop-color:#f6f6f6;stop-opacity:1.0000000;" />
<stop
id="stop7606"
offset="1.0000000"
style="stop-color:#e0e0e0;stop-opacity:1.0000000;" />
</linearGradient>
<linearGradient
id="linearGradient7586">
<stop
id="stop7588"
offset="0.0000000"
style="stop-color:#525252;stop-opacity:1.0000000;" />
<stop
id="stop7590"
offset="1.0000000"
style="stop-color:#000000;stop-opacity:1.0000000;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient12836">
<stop
style="stop-color:#515152;stop-opacity:1;"
offset="0"
id="stop12838" />
<stop
style="stop-color:#515152;stop-opacity:0;"
offset="1"
id="stop12840" />
</linearGradient>
<linearGradient
id="linearGradient12828">
<stop
style="stop-color:#cccccd;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop12830" />
<stop
id="stop12862"
offset="0.0000000"
style="stop-color:#adadae;stop-opacity:1.0000000;" />
<stop
style="stop-color:#8f8f90;stop-opacity:0.0000000;"
offset="1.0000000"
id="stop12832" />
</linearGradient>
<linearGradient
id="linearGradient12810">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop12812" />
<stop
style="stop-color:#e5e5e5;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop12814" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient11625">
<stop
style="stop-color:#fce94f;stop-opacity:1;"
offset="0"
id="stop11627" />
<stop
style="stop-color:#fce94f;stop-opacity:0;"
offset="1"
id="stop11629" />
</linearGradient>
<linearGradient
id="linearGradient11615">
<stop
style="stop-color:#636363;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop11617" />
<stop
style="stop-color:#000000;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop11619" />
</linearGradient>
<linearGradient
id="linearGradient11602">
<stop
style="stop-color:#ffffff;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop11604" />
<stop
style="stop-color:#c5c5c5;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop11606" />
</linearGradient>
<linearGradient
id="linearGradient11594">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop11596" />
<stop
style="stop-color:#d1d1d1;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop11598" />
</linearGradient>
<linearGradient
id="linearGradient11520">
<stop
style="stop-color:#fbfbfb;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop11522" />
<stop
style="stop-color:#dcdcdc;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop11524" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient11508">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop11510" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop11512" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient11494">
<stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop11496" />
<stop
style="stop-color:#ef2929;stop-opacity:0;"
offset="1"
id="stop11498" />
</linearGradient>
<linearGradient
id="linearGradient11415">
<stop
style="stop-color:#204a87;stop-opacity:0.0000000;"
offset="0.0000000"
id="stop11417" />
<stop
id="stop11423"
offset="0.50000000"
style="stop-color:#204a87;stop-opacity:1.0000000;" />
<stop
style="stop-color:#204a87;stop-opacity:0;"
offset="1"
id="stop11419" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient11399">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop11401" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop11403" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient11415"
id="linearGradient11425"
gradientUnits="userSpaceOnUse"
x1="15.828360"
y1="3.7744560"
x2="43.615788"
y2="34.462429"
gradientTransform="translate(-60.28571,-0.285714)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient11415"
id="linearGradient11427"
gradientUnits="userSpaceOnUse"
x1="9.6957054"
y1="9.3458843"
x2="35.679932"
y2="39.033859"
gradientTransform="translate(-60.57143,0.000000)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient11415"
id="linearGradient11439"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-60.85714,0.428571)"
x1="13.267134"
y1="19.774456"
x2="26.758644"
y2="33.462429" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient11399"
id="radialGradient11441"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.487395,0.000000,20.06483)"
cx="12.071428"
cy="39.142857"
fx="12.071428"
fy="39.142857"
r="8.5000000" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient11494"
id="radialGradient11500"
cx="27.577173"
cy="15.048258"
fx="27.577173"
fy="15.048258"
r="3.8335034"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.243453,2.106784e-16,-2.106784e-16,1.243453,-6.713754,-3.742847)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient11494"
id="radialGradient11504"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.243453,2.106784e-16,-2.106784e-16,1.243453,-6.713754,-3.742847)"
cx="27.577173"
cy="16.049133"
fx="27.577173"
fy="16.049133"
r="3.8335034" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient11508"
id="radialGradient11514"
cx="30.203562"
cy="44.565483"
fx="30.203562"
fy="44.565483"
r="6.5659914"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.338462,2.166583e-14,29.48178)"
gradientUnits="userSpaceOnUse" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient11520"
id="radialGradient11526"
cx="24.445690"
cy="35.878170"
fx="24.445690"
fy="35.878170"
r="20.530962"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.995058,-1.535926e-32,0.000000,1.855412,24.94925,-30.20430)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient11508"
id="radialGradient11532"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.338462,-5.348412e-14,29.48178)"
cx="30.203562"
cy="44.565483"
fx="30.203562"
fy="44.565483"
r="6.5659914" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient11594"
id="linearGradient11600"
x1="20.092352"
y1="8.9471626"
x2="31.799011"
y2="38.947163"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.045319,0.000000,0.000000,0.957884,48.16627,1.415543)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient11520"
id="linearGradient11608"
x1="24.445671"
y1="0.49847093"
x2="24.445671"
y2="39.447163"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.984324,0.000000,0.000000,0.957884,49.65734,1.415543)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient11615"
id="radialGradient11621"
cx="25.000000"
cy="27.749998"
fx="25.000000"
fy="27.749998"
r="4.7500000"
gradientTransform="matrix(3.570338,3.171097e-15,-4.005596e-15,4.509900,-64.25843,-94.25499)"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient11625"
id="linearGradient11631"
x1="21.500000"
y1="30.000000"
x2="21.500000"
y2="27.375000"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient11625"
id="linearGradient11635"
gradientUnits="userSpaceOnUse"
x1="21.500000"
y1="30.000000"
x2="21.500000"
y2="27.375000"
gradientTransform="translate(2.000000,0.000000)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient11625"
id="linearGradient11639"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(4.000000,0.000000)"
x1="21.500000"
y1="30.000000"
x2="21.500000"
y2="27.375000" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient11625"
id="linearGradient11643"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(6.000000,0.000000)"
x1="21.500000"
y1="30.000000"
x2="21.500000"
y2="27.375000" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient11625"
id="linearGradient11647"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(8.000000,0.000000)"
x1="21.500000"
y1="30.000000"
x2="21.500000"
y2="27.375000" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient11625"
id="linearGradient11655"
gradientUnits="userSpaceOnUse"
x1="21.500000"
y1="30.000000"
x2="21.500000"
y2="27.375000" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient11625"
id="linearGradient11657"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(2.000000,0.000000)"
x1="21.500000"
y1="30.000000"
x2="21.500000"
y2="27.375000" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient11625"
id="linearGradient11659"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(4.000000,0.000000)"
x1="21.500000"
y1="30.000000"
x2="21.500000"
y2="27.375000" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient11625"
id="linearGradient11661"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(6.000000,0.000000)"
x1="21.500000"
y1="30.000000"
x2="21.500000"
y2="27.375000" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient12810"
id="linearGradient12816"
x1="65.623963"
y1="21.459777"
x2="87.528968"
y2="21.459777"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient12810"
id="linearGradient12818"
gradientUnits="userSpaceOnUse"
x1="84.998962"
y1="25.209778"
x2="62.591469"
y2="12.022278" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient12828"
id="radialGradient12834"
cx="88.593018"
cy="33.398670"
fx="88.593018"
fy="33.398670"
r="7.0056136"
gradientTransform="matrix(0.969219,0.227988,-0.194668,0.827570,9.443870,-15.99848)"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient12836"
id="linearGradient12842"
x1="88.750000"
y1="31.656250"
x2="92.062500"
y2="36.656250"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient12810"
id="linearGradient12878"
gradientUnits="userSpaceOnUse"
x1="65.623963"
y1="21.459777"
x2="87.528968"
y2="21.459777" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient12836"
id="linearGradient12880"
gradientUnits="userSpaceOnUse"
x1="88.750000"
y1="31.656250"
x2="92.062500"
y2="36.656250" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient12828"
id="radialGradient12882"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.969219,0.227988,-0.194668,0.827570,9.443870,-15.99848)"
cx="88.593018"
cy="33.398670"
fx="88.593018"
fy="33.398670"
r="7.0056136" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient12810"
id="linearGradient12884"
gradientUnits="userSpaceOnUse"
x1="84.998962"
y1="25.209778"
x2="62.591469"
y2="12.022278" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient11615"
id="radialGradient12894"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(3.570338,3.171097e-15,-4.005596e-15,4.509900,-64.25843,-94.25499)"
cx="25.000000"
cy="27.749998"
fx="25.000000"
fy="27.749998"
r="4.7500000" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient11625"
id="linearGradient12896"
gradientUnits="userSpaceOnUse"
x1="21.500000"
y1="30.000000"
x2="21.500000"
y2="27.375000"
gradientTransform="translate(7.267442e-2,-0.181686)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient11625"
id="linearGradient12898"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(2.072674,-0.181686)"
x1="21.500000"
y1="30.000000"
x2="21.500000"
y2="27.375000" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient11625"
id="linearGradient12900"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(4.072674,-0.181686)"
x1="21.500000"
y1="30.000000"
x2="21.500000"
y2="27.375000" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient11625"
id="linearGradient12902"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(6.000000,0.000000)"
x1="21.500000"
y1="30.000000"
x2="21.500000"
y2="27.375000" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient11625"
id="linearGradient12911"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(7.267442e-2,-0.181686)"
x1="21.500000"
y1="30.000000"
x2="21.500000"
y2="27.375000" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient11625"
id="linearGradient12913"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(2.072674,-0.181686)"
x1="21.500000"
y1="30.000000"
x2="21.500000"
y2="27.375000" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient11625"
id="linearGradient12915"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(4.072674,-0.181686)"
x1="21.500000"
y1="30.000000"
x2="21.500000"
y2="27.375000" />
<linearGradient
y2="21.067410"
x2="24.445690"
y1="33.447811"
x1="31.597168"
gradientTransform="matrix(0.476329,0.000000,0.000000,0.627721,62.07560,9.156933)"
gradientUnits="userSpaceOnUse"
id="linearGradient7584"
xlink:href="#linearGradient11594"
inkscape:collect="always" />
<radialGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.407878,2.776254e-16,-5.900875e-16,1.861050,14.96976,-20.55775)"
r="6.0270013"
fy="29.099535"
fx="24.399090"
cy="29.099535"
cx="24.399090"
id="radialGradient7592"
xlink:href="#linearGradient7586"
inkscape:collect="always" />
<linearGradient
y2="11.042997"
x2="22.585604"
y1="34.149513"
x1="22.585604"
gradientTransform="matrix(1.059222,0.000000,0.000000,0.808101,48.08657,4.001391)"
gradientUnits="userSpaceOnUse"
id="linearGradient7596"
xlink:href="#linearGradient7608"
inkscape:collect="always" />
<linearGradient
gradientTransform="translate(49.32070,0.000000)"
gradientUnits="userSpaceOnUse"
y2="38.454056"
x2="28.284273"
y1="28.554562"
x1="25.279068"
id="linearGradient7642"
xlink:href="#linearGradient7636"
inkscape:collect="always" />
<radialGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.777122,-8.126449e-2,6.891211e-2,2.223012,4.035118,-33.24798)"
r="4.4774761"
fy="29.609560"
fx="24.483574"
cy="29.609560"
cx="24.483574"
id="radialGradient7647"
xlink:href="#linearGradient7614"
inkscape:collect="always" />
<radialGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-2.046729,-3.749427e-16,-2.853404e-16,1.557610,67.59375,3.275309)"
r="17.171415"
fy="5.7859797"
fx="25.075571"
cy="5.7859797"
cx="25.075571"
id="radialGradient8656"
xlink:href="#linearGradient8650"
inkscape:collect="always" />
<radialGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.536723,6.772795e-15,16.87306)"
r="15.644737"
fy="36.421127"
fx="24.837126"
cy="36.421127"
cx="24.837126"
id="radialGradient8668"
xlink:href="#linearGradient8662"
inkscape:collect="always" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2591"
id="radialGradient2597"
cx="22.291636"
cy="32.797512"
fx="22.291636"
fy="32.797512"
r="16.956199"
gradientTransform="matrix(-0.843022,1.871885e-16,2.265228e-16,1.020168,43.57646,1.205215)"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
inkscape:window-y="30"
inkscape:window-x="0"
inkscape:window-height="818"
inkscape:window-width="1280"
inkscape:showpageshadow="false"
inkscape:document-units="px"
inkscape:grid-bbox="true"
showgrid="false"
inkscape:current-layer="layer1"
inkscape:cy="25.461494"
inkscape:cx="15.433072"
inkscape:zoom="16"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
borderopacity="0.25490196"
bordercolor="#666666"
pagecolor="#ffffff"
id="base"
fill="#4e9a06"
stroke="#4e9a06" />
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Steiner</dc:title>
</cc:Agent>
</dc:creator>
<dc:source>http://jimmac.musichall.cz</dc:source>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
<dc:title>Go Previous</dc:title>
<dc:subject>
<rdf:Bag>
<rdf:li>go</rdf:li>
<rdf:li>previous</rdf:li>
<rdf:li>left</rdf:li>
<rdf:li>arrow</rdf:li>
<rdf:li>pointer</rdf:li>
<rdf:li>&lt;</rdf:li>
</rdf:Bag>
</dc:subject>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
inkscape:label="Layer 1"
id="layer1">
<path
transform="matrix(-1.271186,0.000000,0.000000,1.271186,56.19514,-15.27857)"
d="M 40.481863 36.421127 A 15.644737 8.3968935 0 1 1 9.1923885,36.421127 A 15.644737 8.3968935 0 1 1 40.481863 36.421127 z"
sodipodi:ry="8.3968935"
sodipodi:rx="15.644737"
sodipodi:cy="36.421127"
sodipodi:cx="24.837126"
id="path8660"
style="opacity:0.29946521;color:#000000;fill:url(#radialGradient8668);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
sodipodi:type="arc" />
<path
sodipodi:nodetypes="cccccccc"
id="path8643"
d="M 39.490316,15.496821 L 39.490316,32.491241 L 26.537753,32.491241 L 26.537753,40.973779 L 6.577917,23.973588 L 26.531563,6.7295901 L 26.531563,15.502125 L 39.490316,15.496821 z "
style="opacity:1.0000000;color:#000000;fill:url(#radialGradient2597);fill-opacity:1.0000000;fill-rule:evenodd;stroke:#3a7304;stroke-width:1.0000004;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
<path
sodipodi:nodetypes="cccccc"
id="path8645"
d="M 25.988368,7.9779766 L 25.988368,16.034451 L 38.930538,16.034451 L 38.930538,24.918914 C 22.180538,18.668914 22.797001,30.213626 7.547,23.963626 L 25.988368,7.9779766 z "
style="opacity:0.50802141;color:#000000;fill:url(#radialGradient8656);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
<path
style="opacity:0.48128340;color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.0000004;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
d="M 38.475551,16.541365 L 38.475551,31.463305 L 25.490184,31.463305 L 25.490184,38.764721 L 8.168419,23.96903 L 25.506145,9.0636299 L 25.506145,16.546262 L 38.475551,16.541365 z "
id="path8658"
sodipodi:nodetypes="cccccccc" />
</g>
</svg>
<svg height="35.463821" width="39.774742" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><radialGradient id="a" cx="25.075571" cy="5.78598" gradientTransform="matrix(-2.046729 0 0 1.55761 67.59375 3.275309)" gradientUnits="userSpaceOnUse" r="17.171415"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></radialGradient><radialGradient id="b" cx="24.837126" cy="36.421127" gradientTransform="matrix(1 0 0 .536723 0 16.87306)" gradientUnits="userSpaceOnUse" r="15.644737"><stop offset="0"/><stop offset="1" stop-opacity="0"/></radialGradient><radialGradient id="c" cx="22.291636" cy="32.797512" gradientTransform="matrix(-.843022 0 0 1.020168 43.57646 1.205215)" gradientUnits="userSpaceOnUse" r="16.9562"><stop offset="0" stop-color="#73d216"/><stop offset="1" stop-color="#4e9a06"/></radialGradient><g fill-rule="evenodd" transform="translate(-4.735163 -6.229649)"><path d="m40.481863 36.421127a15.644737 8.3968937 0 1 1 -31.2894745 0 15.644737 8.3968937 0 1 1 31.2894745 0z" fill="url(#b)" opacity=".299465" transform="matrix(-1.271186 0 0 1.271186 56.19514 -15.27857)"/><path d="m39.490316 15.496821v16.99442h-12.952563v8.482538l-19.959836-17.000191 19.953646-17.2439979v8.7725349z" fill="url(#c)" stroke="#3a7304" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="m25.988368 7.9779766v8.0564744h12.94217v8.884463c-16.75-6.25-16.133537 5.294712-31.383538-.955288z" fill="url(#a)" opacity=".508021"/></g><path d="m33.740388 10.311716v14.92194h-12.985367v7.301416l-17.3217645-14.795691 17.3377255-14.9054005v7.4826325z" fill="none" opacity=".481283" stroke="#fff" stroke-miterlimit="10"/></svg>

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -1,548 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:export-ydpi="240.00000"
inkscape:export-xdpi="240.00000"
inkscape:export-filename="/home/jimmac/gfx/novell/pdes/trunk/docs/BIGmime-text.png"
sodipodi:docname="text-x-generic.svg"
sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/mimetypes"
inkscape:version="0.46"
sodipodi:version="0.32"
id="svg249"
height="48.000000px"
width="48.000000px"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs3">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 24 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="48 : 24 : 1"
inkscape:persp3d-origin="24 : 16 : 1"
id="perspective78" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient5060"
id="radialGradient6719"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
cx="605.71429"
cy="486.64789"
fx="605.71429"
fy="486.64789"
r="117.14286" />
<linearGradient
inkscape:collect="always"
id="linearGradient5060">
<stop
style="stop-color:black;stop-opacity:1;"
offset="0"
id="stop5062" />
<stop
style="stop-color:black;stop-opacity:0;"
offset="1"
id="stop5064" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient5060"
id="radialGradient6717"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
cx="605.71429"
cy="486.64789"
fx="605.71429"
fy="486.64789"
r="117.14286" />
<linearGradient
id="linearGradient5048">
<stop
style="stop-color:black;stop-opacity:0;"
offset="0"
id="stop5050" />
<stop
id="stop5056"
offset="0.5"
style="stop-color:black;stop-opacity:1;" />
<stop
style="stop-color:black;stop-opacity:0;"
offset="1"
id="stop5052" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5048"
id="linearGradient6715"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
x1="302.85715"
y1="366.64789"
x2="302.85715"
y2="609.50507" />
<linearGradient
inkscape:collect="always"
id="linearGradient4542">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop4544" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop4546" />
</linearGradient>
<linearGradient
id="linearGradient15662">
<stop
id="stop15664"
offset="0.0000000"
style="stop-color:#ffffff;stop-opacity:1.0000000;" />
<stop
id="stop15666"
offset="1.0000000"
style="stop-color:#f8f8f8;stop-opacity:1.0000000;" />
</linearGradient>
<radialGradient
id="aigrd3"
cx="20.8921"
cy="64.5679"
r="5.257"
fx="20.8921"
fy="64.5679"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#F0F0F0"
id="stop15573" />
<stop
offset="1.0000000"
style="stop-color:#9a9a9a;stop-opacity:1.0000000;"
id="stop15575" />
</radialGradient>
<radialGradient
id="aigrd2"
cx="20.8921"
cy="114.5684"
r="5.256"
fx="20.8921"
fy="114.5684"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#F0F0F0"
id="stop15566" />
<stop
offset="1.0000000"
style="stop-color:#9a9a9a;stop-opacity:1.0000000;"
id="stop15568" />
</radialGradient>
<linearGradient
id="linearGradient269">
<stop
id="stop270"
offset="0.0000000"
style="stop-color:#a3a3a3;stop-opacity:1.0000000;" />
<stop
id="stop271"
offset="1.0000000"
style="stop-color:#4c4c4c;stop-opacity:1.0000000;" />
</linearGradient>
<linearGradient
id="linearGradient259">
<stop
id="stop260"
offset="0.0000000"
style="stop-color:#fafafa;stop-opacity:1.0000000;" />
<stop
id="stop261"
offset="1.0000000"
style="stop-color:#bbbbbb;stop-opacity:1.0000000;" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient269"
id="radialGradient15656"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.968273,0.000000,0.000000,1.032767,3.353553,0.646447)"
cx="8.8244190"
cy="3.7561285"
fx="8.8244190"
fy="3.7561285"
r="37.751713" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient259"
id="radialGradient15658"
gradientUnits="userSpaceOnUse"
gradientTransform="scale(0.960493,1.041132)"
cx="33.966679"
cy="35.736916"
fx="33.966679"
fy="35.736916"
r="86.708450" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient15662"
id="radialGradient15668"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.968273,0.000000,0.000000,1.032767,3.353553,0.646447)"
cx="8.1435566"
cy="7.2678967"
fx="8.1435566"
fy="7.2678967"
r="38.158695" />
<radialGradient
r="5.256"
fy="114.5684"
fx="20.8921"
cy="114.5684"
cx="20.8921"
gradientTransform="matrix(0.229703,0.000000,0.000000,0.229703,4.613529,3.979808)"
gradientUnits="userSpaceOnUse"
id="radialGradient2283"
xlink:href="#aigrd2"
inkscape:collect="always" />
<radialGradient
r="5.257"
fy="64.5679"
fx="20.8921"
cy="64.5679"
cx="20.8921"
gradientTransform="matrix(0.229703,0.000000,0.000000,0.229703,4.613529,3.979808)"
gradientUnits="userSpaceOnUse"
id="radialGradient2285"
xlink:href="#aigrd3"
inkscape:collect="always" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4542"
id="radialGradient4548"
cx="24.306795"
cy="42.07798"
fx="24.306795"
fy="42.07798"
r="15.821514"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.284916,0.000000,30.08928)"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
inkscape:window-y="160"
inkscape:window-x="343"
inkscape:window-height="688"
inkscape:window-width="872"
inkscape:document-units="px"
inkscape:grid-bbox="true"
showgrid="false"
inkscape:current-layer="layer6"
inkscape:cy="24.318443"
inkscape:cx="25.938708"
inkscape:zoom="5.6568542"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
borderopacity="0.25490196"
bordercolor="#666666"
pagecolor="#ffffff"
id="base"
inkscape:showpageshadow="false" />
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Generic Text</dc:title>
<dc:subject>
<rdf:Bag>
<rdf:li>text</rdf:li>
<rdf:li>plaintext</rdf:li>
<rdf:li>regular</rdf:li>
<rdf:li>document</rdf:li>
</rdf:Bag>
</dc:subject>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Steiner</dc:title>
</cc:Agent>
</dc:creator>
<dc:source>http://jimmac.musichall.cz</dc:source>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer6"
inkscape:label="Shadow">
<g
style="display:inline"
transform="matrix(2.105461e-2,0,0,2.086758e-2,42.85172,41.1536)"
id="g6707">
<rect
style="opacity:0.40206185;color:black;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
id="rect6709"
width="1339.6335"
height="478.35718"
x="-1559.2523"
y="-150.69685" />
<path
style="opacity:0.40206185;color:black;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
id="path6711"
sodipodi:nodetypes="cccc" />
<path
sodipodi:nodetypes="cccc"
id="path6713"
d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
style="opacity:0.40206185;color:black;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
</g>
</g>
<g
style="display:inline"
inkscape:groupmode="layer"
inkscape:label="Base"
id="layer1">
<rect
style="color:#000000;fill:url(#radialGradient15658);fill-opacity:1.0000000;fill-rule:nonzero;stroke:url(#radialGradient15656);stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:block;overflow:visible"
id="rect15391"
width="34.875000"
height="40.920494"
x="6.6035528"
y="3.6464462"
ry="1.1490486" />
<rect
style="color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:nonzero;stroke:url(#radialGradient15668);stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:block;overflow:visible"
id="rect15660"
width="32.775887"
height="38.946384"
x="7.6660538"
y="4.5839462"
ry="0.14904857"
rx="0.14904857" />
<g
transform="translate(0.646447,-3.798933e-2)"
id="g2270">
<g
id="g1440"
style="fill:#ffffff;fill-opacity:1.0000000;fill-rule:nonzero;stroke:#000000;stroke-miterlimit:4.0000000"
transform="matrix(0.229703,0.000000,0.000000,0.229703,4.967081,4.244972)">
<radialGradient
id="radialGradient1442"
cx="20.892099"
cy="114.56840"
r="5.2560000"
fx="20.892099"
fy="114.56840"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#F0F0F0"
id="stop1444" />
<stop
offset="1"
style="stop-color:#474747"
id="stop1446" />
</radialGradient>
<path
style="stroke:none"
d="M 23.428000,113.07000 C 23.428000,115.04300 21.828000,116.64200 19.855000,116.64200 C 17.881000,116.64200 16.282000,115.04200 16.282000,113.07000 C 16.282000,111.09600 17.882000,109.49700 19.855000,109.49700 C 21.828000,109.49700 23.428000,111.09700 23.428000,113.07000 z "
id="path1448" />
<radialGradient
id="radialGradient1450"
cx="20.892099"
cy="64.567902"
r="5.2570000"
fx="20.892099"
fy="64.567902"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#F0F0F0"
id="stop1452" />
<stop
offset="1"
style="stop-color:#474747"
id="stop1454" />
</radialGradient>
<path
style="stroke:none"
d="M 23.428000,63.070000 C 23.428000,65.043000 21.828000,66.643000 19.855000,66.643000 C 17.881000,66.643000 16.282000,65.043000 16.282000,63.070000 C 16.282000,61.096000 17.882000,59.497000 19.855000,59.497000 C 21.828000,59.497000 23.428000,61.097000 23.428000,63.070000 z "
id="path1456" />
</g>
<path
style="fill:url(#radialGradient2283);fill-rule:nonzero;stroke:none;stroke-miterlimit:4.0000000"
d="M 9.9950109,29.952326 C 9.9950109,30.405530 9.6274861,30.772825 9.1742821,30.772825 C 8.7208483,30.772825 8.3535532,30.405301 8.3535532,29.952326 C 8.3535532,29.498892 8.7210780,29.131597 9.1742821,29.131597 C 9.6274861,29.131597 9.9950109,29.499122 9.9950109,29.952326 z "
id="path15570" />
<path
style="fill:url(#radialGradient2285);fill-rule:nonzero;stroke:none;stroke-miterlimit:4.0000000"
d="M 9.9950109,18.467176 C 9.9950109,18.920380 9.6274861,19.287905 9.1742821,19.287905 C 8.7208483,19.287905 8.3535532,18.920380 8.3535532,18.467176 C 8.3535532,18.013742 8.7210780,17.646447 9.1742821,17.646447 C 9.6274861,17.646447 9.9950109,18.013972 9.9950109,18.467176 z "
id="path15577" />
</g>
<path
style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.98855311;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:0.017543854"
d="M 11.505723,5.4942766 L 11.505723,43.400869"
id="path15672"
sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:0.20467831"
d="M 12.500000,5.0205154 L 12.500000,43.038228"
id="path15674"
sodipodi:nodetypes="cc" />
</g>
<g
inkscape:groupmode="layer"
id="layer5"
inkscape:label="Text"
style="display:inline">
<g
transform="matrix(0.909091,0.000000,0.000000,1.000000,2.363628,0.000000)"
id="g2253">
<rect
style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:block;overflow:visible"
id="rect15686"
width="22.000004"
height="1.0000000"
x="15.000002"
y="9.0000000"
rx="0.15156493"
ry="0.065390877" />
<rect
style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:block;overflow:visible"
id="rect15688"
width="22.000004"
height="1.0000000"
x="15.000002"
y="11.000000"
rx="0.15156493"
ry="0.065390877" />
<rect
style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:block;overflow:visible"
id="rect15690"
width="22.000004"
height="1.0000000"
x="15.000002"
y="13.000000"
rx="0.15156493"
ry="0.065390877" />
<rect
style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:block;overflow:visible"
id="rect15692"
width="22.000004"
height="1.0000000"
x="15.000002"
y="15.000000"
rx="0.15156493"
ry="0.065390877" />
<rect
style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:block;overflow:visible"
id="rect15694"
width="22.000004"
height="1.0000000"
x="15.000002"
y="17.000000"
rx="0.15156493"
ry="0.065390877" />
<rect
style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:block;overflow:visible"
id="rect15696"
width="22.000004"
height="1.0000000"
x="15.000002"
y="19.000000"
rx="0.15156493"
ry="0.065390877" />
<rect
style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:block;overflow:visible"
id="rect15698"
width="22.000004"
height="1.0000000"
x="15.000002"
y="21.000000"
rx="0.15156493"
ry="0.065390877" />
<rect
style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:block;overflow:visible"
id="rect15700"
width="22.000004"
height="1.0000000"
x="15.000002"
y="23.000000"
rx="0.15156493"
ry="0.065390877" />
<rect
style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:block;overflow:visible"
id="rect15732"
width="9.9000053"
height="1.0000000"
x="14.999992"
y="25.000000"
rx="0.068204239"
ry="0.065390877" />
<rect
style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:block;overflow:visible"
id="rect15736"
width="22.000004"
height="1.0000000"
x="14.999992"
y="29.000000"
rx="0.15156493"
ry="0.065390877" />
<rect
style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:block;overflow:visible"
id="rect15738"
width="22.000004"
height="1.0000000"
x="14.999992"
y="31.000000"
rx="0.15156493"
ry="0.065390877" />
<rect
style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:block;overflow:visible"
id="rect15740"
width="22.000004"
height="1.0000000"
x="14.999992"
y="33.000000"
rx="0.15156493"
ry="0.065390877" />
<rect
style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:block;overflow:visible"
id="rect15742"
width="22.000004"
height="1.0000000"
x="14.999992"
y="35.000000"
rx="0.15156493"
ry="0.065390877" />
<rect
style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:block;overflow:visible"
id="rect15744"
width="15.400014"
height="1.0000000"
x="14.999992"
y="37.000000"
rx="0.10609552"
ry="0.065390877" />
</g>
</g>
</svg>
<svg height="44.845078" width="42.749992" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><radialGradient id="a" cx="605.71399" cy="486.64801" gradientTransform="matrix(-.05841368 0 0 .041103 42.475882 19.792594)" gradientUnits="userSpaceOnUse" r="117.143" xlink:href="#b"/><linearGradient id="b"><stop offset="0"/><stop offset="1" stop-opacity="0"/></linearGradient><radialGradient id="c" cx="605.71399" cy="486.64801" gradientTransform="matrix(.05841368 0 0 .041103 .274121 19.792594)" gradientUnits="userSpaceOnUse" r="117.143" xlink:href="#b"/><linearGradient id="d" gradientTransform="matrix(.05841368 0 0 .041103 .262625 19.792594)" gradientUnits="userSpaceOnUse" x1="302.85699" x2="302.85699" y1="366.64801" y2="609.505"><stop offset="0" stop-opacity="0"/><stop offset=".5"/><stop offset="1" stop-opacity="0"/></linearGradient><radialGradient id="e" cx="8.824" cy="3.756" gradientTransform="matrix(.968273 0 0 1.032767 .603549 -2.499553)" gradientUnits="userSpaceOnUse" r="37.751999"><stop offset="0" stop-color="#a3a3a3"/><stop offset="1" stop-color="#4c4c4c"/></radialGradient><radialGradient id="f" cx="33.966999" cy="35.737" gradientTransform="matrix(.960493 0 0 1.041132 -2.750004 -3.146)" gradientUnits="userSpaceOnUse" r="86.708"><stop offset="0" stop-color="#fafafa"/><stop offset="1" stop-color="#bbb"/></radialGradient><radialGradient id="g" cx="8.144" cy="7.268" gradientTransform="matrix(.968273 0 0 1.032767 .603549 -2.499553)" gradientUnits="userSpaceOnUse" r="38.159"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#f8f8f8"/></radialGradient><linearGradient id="h"><stop offset="0" stop-color="#f0f0f0"/><stop offset="1" stop-color="#9a9a9a"/></linearGradient><radialGradient id="i" cx="7.309443" cy="27.113012" gradientUnits="userSpaceOnUse" r="1.207" xlink:href="#h"/><radialGradient id="j" cx="7.309443" cy="15.627012" gradientUnits="userSpaceOnUse" r="1.208" xlink:href="#h"/><g stroke-width=".020961"><path d="m7.2722665 34.862922h28.2054605v9.982156h-28.2054605z" fill="url(#d)" opacity=".402"/><path d="m35.477728 34.863265v9.981606c3.00816.01879 7.272267-2.236371 7.272265-4.991445 0-2.755074-3.35688-4.99016-7.272265-4.990161z" fill="url(#c)" opacity=".402"/><path d="m7.2722665 34.863265v9.981606c-3.0081606.01879-7.2722665-2.236371-7.2722665-4.991445s3.3568796-4.99016 7.2722665-4.990161z" fill="url(#a)" opacity=".402"/></g><rect display="block" fill="url(#f)" height="40.919998" ry="1.149" stroke="url(#e)" stroke-linecap="round" stroke-linejoin="round" width="34.875" x="3.853996" y=".5"/><rect display="block" fill="none" height="38.945999" rx=".149" stroke="url(#g)" stroke-linecap="round" stroke-linejoin="round" width="32.776001" x="4.915996" y="1.438"/><g fill="#fff" transform="matrix(.229703 0 0 .229703 2.863524 1.060983)"><path d="m23.428 113.07c0 1.973-1.6 3.572-3.573 3.572-1.974 0-3.573-1.6-3.573-3.572 0-1.974 1.6-3.573 3.573-3.573s3.573 1.6 3.573 3.573z"/><path d="m23.428 63.07c0 1.973-1.6 3.573-3.573 3.573-1.974 0-3.573-1.6-3.573-3.573 0-1.974 1.6-3.573 3.573-3.573s3.573 1.6 3.573 3.573z"/></g><path d="m7.8914535 26.768337c0 .453204-.3675248.820499-.8207288.820499-.4534338 0-.8207289-.367524-.8207289-.820499 0-.453434.3675248-.820729.8207289-.820729.453204 0 .8207288.367525.8207288.820729z" fill="url(#i)"/><path d="m7.8914535 15.283187c0 .453204-.3675248.820729-.8207288.820729-.4534338 0-.8207289-.367525-.8207289-.820729 0-.453434.3675248-.820729.8207289-.820729.453204 0 .8207288.367525.8207288.820729z" fill="url(#j)"/><g fill="none" transform="translate(-2.750004 -3.146)"><path d="m11.505723 5.4942766v37.9065924" stroke="#000" stroke-opacity=".018" stroke-width=".989"/><path d="m12.5 5.0205154v38.0177126" stroke="#fff" stroke-opacity=".205"/></g><g fill="#9b9b9b" fill-opacity=".55" transform="matrix(.909091 0 0 1 -.386376 -3.146)"><rect display="block" height="1" rx=".152" ry=".065" width="22" x="15" y="9"/><rect display="block" height="1" rx=".152" ry=".065" width="22" x="15" y="11"/><rect display="block" height="1" rx=".152" ry=".065" width="22" x="15" y="13"/><rect display="block" height="1" rx=".152" ry=".065" width="22" x="15" y="15"/><rect display="block" height="1" rx=".152" ry=".065" width="22" x="15" y="17"/><rect display="block" height="1" rx=".152" ry=".065" width="22" x="15" y="19"/><rect display="block" height="1" rx=".152" ry=".065" width="22" x="15" y="21"/><rect display="block" height="1" rx=".152" ry=".065" width="22" x="15" y="23"/><rect display="block" height="1" rx=".068" ry=".065" width="9.9" x="15" y="25"/><rect display="block" height="1" rx=".152" ry=".065" width="22" x="15" y="29"/><rect display="block" height="1" rx=".152" ry=".065" width="22" x="15" y="31"/><rect display="block" height="1" rx=".152" ry=".065" width="22" x="15" y="33"/><rect display="block" height="1" rx=".152" ry=".065" width="22" x="15" y="35"/><rect display="block" height="1" rx=".106" ry=".065" width="15.4" x="15" y="37"/></g></svg>

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

View File

@@ -1,641 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48px"
height="48px"
id="svg1307"
sodipodi:version="0.32"
inkscape:version="0.46"
sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/actions"
sodipodi:docname="media-playback-pause.svg"
inkscape:export-filename="/home/lapo/Desktop/Grafica/Icone/media-actions-outlines.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs1309">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 24 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="48 : 24 : 1"
inkscape:persp3d-origin="24 : 16 : 1"
id="perspective85" />
<linearGradient
id="linearGradient2817">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop2819" />
<stop
style="stop-color:#ffffff;stop-opacity:0.48453608;"
offset="1"
id="stop2821" />
</linearGradient>
<linearGradient
id="linearGradient2584">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop2586" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop2588" />
</linearGradient>
<linearGradient
id="linearGradient2697">
<stop
id="stop2699"
offset="0"
style="stop-color:#babdb6" />
<stop
id="stop2701"
offset="1"
style="stop-color:#555753" />
</linearGradient>
<linearGradient
id="linearGradient2679"
inkscape:collect="always">
<stop
id="stop2681"
offset="0"
style="stop-color:#f7f7f7;stop-opacity:1" />
<stop
id="stop2683"
offset="1"
style="stop-color:#ccd0c7;stop-opacity:1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient3081">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3083" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop3085" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient8662">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop8664" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop8666" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2679"
id="radialGradient2112"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-42.61165,283.7891)"
cx="169.77171"
cy="100.20107"
fx="169.77171"
fy="100.20107"
r="11" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2697"
id="linearGradient2122"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-12.00000,0.000000)"
x1="169"
y1="110.33805"
x2="169"
y2="93.204849" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3081"
id="linearGradient2124"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(133.0000,70.99999)"
x1="15.089521"
y1="15.291994"
x2="14"
y2="52.510574" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8662"
id="radialGradient2137"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.536723,4.473733e-13,16.87306)"
cx="24.837126"
cy="36.421127"
fx="24.837126"
fy="36.421127"
r="15.644737" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8662"
id="radialGradient2139"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.536723,-1.416456e-12,16.87306)"
cx="24.837126"
cy="36.421127"
fx="24.837126"
fy="36.421127"
r="15.644737" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8662"
id="radialGradient2725"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.536723,4.526469e-13,16.87306)"
cx="24.837126"
cy="36.421127"
fx="24.837126"
fy="36.421127"
r="15.644737" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8662"
id="radialGradient2727"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.536723,-1.432388e-12,16.87306)"
cx="24.837126"
cy="36.421127"
fx="24.837126"
fy="36.421127"
r="15.644737" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2679"
id="radialGradient2729"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-42.61165,283.7891)"
cx="169.77171"
cy="100.20107"
fx="169.77171"
fy="100.20107"
r="11" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2697"
id="linearGradient2731"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-12,0)"
x1="169"
y1="110.33805"
x2="169"
y2="93.204849" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3081"
id="linearGradient2733"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(133,70.99999)"
x1="15.089521"
y1="15.291994"
x2="14"
y2="52.510574" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8662"
id="radialGradient2745"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.536723,4.579205e-13,16.87306)"
cx="24.837126"
cy="36.421127"
fx="24.837126"
fy="36.421127"
r="15.644737" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8662"
id="radialGradient2747"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.536723,-1.44832e-12,16.87306)"
cx="24.837126"
cy="36.421127"
fx="24.837126"
fy="36.421127"
r="15.644737" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2679"
id="radialGradient2749"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-42.61165,283.7891)"
cx="169.77171"
cy="100.20107"
fx="169.77171"
fy="100.20107"
r="11" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2697"
id="linearGradient2751"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-12,0)"
x1="169"
y1="110.33805"
x2="169"
y2="93.204849" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3081"
id="linearGradient2753"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(133,70.99999)"
x1="15.089521"
y1="15.291994"
x2="14"
y2="52.510574" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2679"
id="radialGradient2791"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-42.61165,283.7891)"
cx="169.77171"
cy="100.20107"
fx="169.77171"
fy="100.20107"
r="11" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2697"
id="linearGradient2793"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-12,0)"
x1="169"
y1="110.33805"
x2="169"
y2="93.204849" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2697"
id="linearGradient2795"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-12,0)"
x1="169"
y1="110.33805"
x2="169"
y2="93.204849" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3081"
id="linearGradient2797"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(133,70.99999)"
x1="15.089521"
y1="15.291994"
x2="14"
y2="52.510574" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3081"
id="linearGradient2800"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-4e-4,-9.426e-2)"
x1="15.089521"
y1="15.291994"
x2="14"
y2="52.510574" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2697"
id="linearGradient2803"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,1.004384,-145.0004,-71.4625)"
x1="169"
y1="110.33805"
x2="169"
y2="93.204849" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2697"
id="linearGradient2806"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-145.0004,-97.0943)"
x1="169"
y1="110.33805"
x2="169"
y2="93.204849" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2679"
id="radialGradient2809"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-175.6121,212.6949)"
cx="169.77171"
cy="100.20107"
fx="169.77171"
fy="100.20107"
r="11" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2817"
id="linearGradient2823"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.103262,0,0,1.054917,-163.1228,-76.31138)"
x1="174.83363"
y1="84.263489"
x2="174.74524"
y2="105.49083" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3081"
id="linearGradient2825"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-4e-4,-26.09426)"
x1="15.089521"
y1="15.291994"
x2="14"
y2="52.510574" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2679"
id="radialGradient2831"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-175.6121,186.6949)"
cx="169.77171"
cy="100.20107"
fx="169.77171"
fy="100.20107"
r="11" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2817"
id="linearGradient2858"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.103262,0,0,1.054917,-163.1228,-76.31138)"
x1="174.83363"
y1="84.263489"
x2="174.74524"
y2="105.49083" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2679"
id="radialGradient2860"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-175.6121,212.6949)"
cx="169.77171"
cy="100.20107"
fx="169.77171"
fy="100.20107"
r="11" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2697"
id="linearGradient2862"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,1.004384,-145.0004,-71.4625)"
x1="169"
y1="110.33805"
x2="169"
y2="93.204849" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3081"
id="linearGradient2864"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-4e-4,-9.426e-2)"
x1="15.089521"
y1="15.291994"
x2="14"
y2="52.510574" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="0.19607843"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="-59.41743"
inkscape:cy="19.968635"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:grid-points="true"
fill="#fcaf3e"
showguides="false"
inkscape:guide-bbox="true"
guidetolerance="1px"
stroke="#729fcf"
inkscape:window-width="872"
inkscape:window-height="688"
inkscape:window-x="0"
inkscape:window-y="160"
showborder="true"
inkscape:showpageshadow="false">
<sodipodi:guide
orientation="horizontal"
position="38.996647"
id="guide2194" />
<sodipodi:guide
orientation="horizontal"
position="9.0140845"
id="guide2196" />
<sodipodi:guide
orientation="vertical"
position="9.0140845"
id="guide2198" />
<sodipodi:guide
orientation="vertical"
position="38.975184"
id="guide2200" />
<sodipodi:guide
orientation="horizontal"
position="22.988281"
id="guide2202" />
<sodipodi:guide
orientation="vertical"
position="23.908786"
id="guide2204" />
<sodipodi:guide
orientation="vertical"
position="157.99417"
id="guide4332" />
<sodipodi:guide
orientation="horizontal"
position="-36.062446"
id="guide4334" />
<sodipodi:guide
orientation="horizontal"
position="-58.02695"
id="guide4336" />
<sodipodi:guide
orientation="vertical"
position="180.00287"
id="guide4338" />
<sodipodi:guide
orientation="vertical"
position="107.92217"
id="guide4417" />
<sodipodi:guide
orientation="vertical"
position="129.93087"
id="guide4419" />
<sodipodi:guide
orientation="horizontal"
position="19.996875"
id="guide5106" />
<sodipodi:guide
orientation="horizontal"
position="63.039674"
id="guide5119" />
<sodipodi:guide
orientation="horizontal"
position="49.066305"
id="guide5121" />
<sodipodi:guide
orientation="horizontal"
position="-86.007168"
id="guide5307" />
<sodipodi:guide
orientation="horizontal"
position="-108.09009"
id="guide5309" />
<sodipodi:guide
orientation="horizontal"
position="-100.15429"
id="guide3111" />
<inkscape:grid
id="GridFromPre046Settings"
type="xygrid"
originx="0px"
originy="0px"
spacingx="0.5px"
spacingy="0.5px"
color="#0000ff"
empcolor="#0000ff"
opacity="0.2"
empopacity="0.4"
empspacing="2" />
</sodipodi:namedview>
<metadata
id="metadata1312">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Media Playback Pause</dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Lapo Calamandrei</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
<dc:subject>
<rdf:Bag>
<rdf:li>media</rdf:li>
<rdf:li>pause</rdf:li>
<rdf:li>playback</rdf:li>
<rdf:li>video</rdf:li>
<rdf:li>music</rdf:li>
</rdf:Bag>
</dc:subject>
<dc:contributor>
<cc:Agent>
<dc:title>Jakub Steiner</dc:title>
</cc:Agent>
</dc:contributor>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer"
style="display:inline">
<g
id="g2837">
<path
inkscape:r_cy="true"
inkscape:r_cx="true"
id="path2815"
d="M 26.086565,12.829103 L 26.086565,34.982359 L 34.912658,34.982359 L 34.912658,12.829103 L 26.086565,12.829103 z "
style="opacity:0.15;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient2823);stroke-width:1.99999952;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
<path
id="path2827"
d="M 26.4996,13.40575 L 26.4996,34.40575 L 34.4996,34.40575 L 34.4996,13.40575 L 26.4996,13.40575 z "
style="color:#000000;fill:url(#radialGradient2809);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
<path
style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient2803);stroke-width:1.00000012;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
d="M 26.4996,13.407946 L 26.4996,34.50001 L 34.4996,34.50001 L 34.4996,13.407946 L 26.4996,13.407946 z "
id="path2762"
inkscape:r_cx="true"
inkscape:r_cy="true" />
<path
id="path2811"
d="M 27.4996,14.40575 L 27.4996,33.40575 L 33.4996,33.40575 L 33.4996,14.40575 L 27.4996,14.40575 z "
style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient2800);stroke-width:0.9999997;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
<path
sodipodi:nodetypes="ccccc"
inkscape:r_cy="true"
inkscape:r_cx="true"
id="path2479"
d="M 28.019106,14.942758 L 28.019106,23.328389 L 33.013048,22.70967 L 33.013048,14.85437 L 28.019106,14.942758 z "
style="opacity:0.5;color:#000000;fill:#f7f7f7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible" />
</g>
<g
id="use2844"
inkscape:r_cx="true"
inkscape:r_cy="true"
transform="translate(-12.97229,0)">
<path
style="opacity:0.15;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient2858);stroke-width:1.99999952;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
d="M 26.086565,12.829103 L 26.086565,34.982359 L 34.912658,34.982359 L 34.912658,12.829103 L 26.086565,12.829103 z "
id="path2848"
inkscape:r_cx="true"
inkscape:r_cy="true" />
<path
style="color:#000000;fill:url(#radialGradient2860);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
d="M 26.4996,13.40575 L 26.4996,34.40575 L 34.4996,34.40575 L 34.4996,13.40575 L 26.4996,13.40575 z "
id="path2850"
inkscape:r_cx="true"
inkscape:r_cy="true" />
<path
inkscape:r_cy="true"
inkscape:r_cx="true"
id="path2852"
d="M 26.4996,13.407946 L 26.4996,34.50001 L 34.4996,34.50001 L 34.4996,13.407946 L 26.4996,13.407946 z "
style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient2862);stroke-width:1.00000012;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
<path
style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient2864);stroke-width:0.9999997;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
d="M 27.4996,14.40575 L 27.4996,33.40575 L 33.4996,33.40575 L 33.4996,14.40575 L 27.4996,14.40575 z "
id="path2854"
inkscape:r_cx="true"
inkscape:r_cy="true" />
<path
style="opacity:0.5;color:#000000;fill:#f7f7f7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
d="M 28.019106,14.942758 L 28.019106,25.007768 L 33.013048,24.389049 L 33.013048,14.85437 L 28.019106,14.942758 z "
id="path2856"
inkscape:r_cx="true"
inkscape:r_cy="true"
sodipodi:nodetypes="ccccc" />
</g>
</g>
</svg>
<svg height="24.153255" width="23.798384" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientTransform="matrix(1.103262 0 0 1.054917 -175.23707 -88.140483)" gradientUnits="userSpaceOnUse" x1="174.83363" x2="174.74524" xlink:href="#l" y1="84.263489" y2="105.49083"/><radialGradient id="b" cx="169.77171" cy="100.20107" gradientTransform="matrix(.00000356 -1.07205 1.992104 -.00000125 -187.72637 200.8658)" gradientUnits="userSpaceOnUse" r="11" xlink:href="#k"/><linearGradient id="c" gradientTransform="matrix(1 0 0 1.004384 -157.11467 -83.291603)" gradientUnits="userSpaceOnUse" x1="169" x2="169" xlink:href="#j" y1="110.33805" y2="93.204849"/><linearGradient id="d" gradientUnits="userSpaceOnUse" x1="2.974846" x2="1.885325" xlink:href="#i" y1="3.368631" y2="40.58721"/><linearGradient id="e" gradientTransform="matrix(1.103262 0 0 1.054917 -163.1228 -76.31138)" gradientUnits="userSpaceOnUse" x1="174.83363" x2="174.74524" xlink:href="#l" y1="84.263489" y2="105.49083"/><radialGradient id="f" cx="169.77171" cy="100.20107" gradientTransform="matrix(.00000356 -1.07205 1.992104 -.00000125 -175.6121 212.6949)" gradientUnits="userSpaceOnUse" r="11" xlink:href="#k"/><linearGradient id="g" gradientTransform="matrix(1 0 0 1.004384 -145.0004 -71.4625)" gradientUnits="userSpaceOnUse" x1="169" x2="169" xlink:href="#j" y1="110.33805" y2="93.204849"/><linearGradient id="h" gradientUnits="userSpaceOnUse" x1="15.089121" x2="13.9996" xlink:href="#i" y1="15.197734" y2="52.416313"/><linearGradient id="i" gradientUnits="userSpaceOnUse" x1="15.089121" x2="13.9996" y1="15.197734" y2="52.416313"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></linearGradient><linearGradient id="j" gradientTransform="matrix(1 0 0 1.004384 -145.0004 -71.4625)" gradientUnits="userSpaceOnUse" x1="169" x2="169" y1="110.33805" y2="93.204849"><stop offset="0" stop-color="#babdb6"/><stop offset="1" stop-color="#555753"/></linearGradient><radialGradient id="k" cx="169.77171" cy="100.20107" gradientTransform="matrix(.00000356 -1.07205 1.992104 -.00000125 -175.6121 212.6949)" gradientUnits="userSpaceOnUse" r="11"><stop offset="0" stop-color="#f7f7f7"/><stop offset="1" stop-color="#ccd0c7"/></radialGradient><linearGradient id="l" gradientTransform="matrix(1.103262 0 0 1.054917 -163.1228 -76.31138)" gradientUnits="userSpaceOnUse" x1="174.83363" x2="174.74524" y1="84.263489" y2="105.49083"><stop offset="0"/><stop offset="1" stop-color="#fff" stop-opacity=".484536"/></linearGradient><path d="m13.97229 1v22.153256h8.826093v-22.153256z" style="opacity:.15;fill:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke:url(#a)"/><path d="m14.385325 1.576647v21h8v-21z" fill="url(#b)" fill-rule="evenodd"/><path d="m14.385325 1.578843v21.092064h8v-21.092064z" fill="none" stroke="url(#c)" stroke-linecap="square" stroke-linejoin="round"/><path d="m15.385325 2.576647v19h6v-19z" fill="none" stroke="url(#d)" stroke-linecap="square"/><path d="m15.904831 3.113655v8.385631l4.993942-.618719v-7.8553z" display="block" fill="#f7f7f7" opacity=".5"/><g transform="translate(-25.086565 -11.829103)"><path d="m26.086565 12.829103v22.153256h8.826093v-22.153256z" style="opacity:.15;fill:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke:url(#e)"/><path d="m26.4996 13.40575v21h8v-21z" fill="url(#f)" fill-rule="evenodd"/><path d="m26.4996 13.407946v21.092064h8v-21.092064z" fill="none" stroke="url(#g)" stroke-linecap="square" stroke-linejoin="round"/><path d="m27.4996 14.40575v19h6v-19z" fill="none" stroke="url(#h)" stroke-linecap="square"/><path d="m28.019106 14.942758v10.06501l4.993942-.618719v-9.534679z" display="block" fill="#f7f7f7" opacity=".5"/></g></svg>

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@@ -1,319 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48px"
height="48px"
id="svg1307"
sodipodi:version="0.32"
inkscape:version="0.46"
sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/actions"
sodipodi:docname="media-playback-start.svg"
inkscape:export-filename="/home/lapo/Desktop/Grafica/Icone/media-actions-outlines.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs1309">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 24 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="48 : 24 : 1"
inkscape:persp3d-origin="24 : 16 : 1"
id="perspective49" />
<linearGradient
id="linearGradient2684">
<stop
id="stop2686"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop2688"
offset="1"
style="stop-color:#000000;stop-opacity:1;" />
</linearGradient>
<linearGradient
id="linearGradient2584">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop2586" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop2588" />
</linearGradient>
<linearGradient
id="linearGradient5075">
<stop
style="stop-color:#adb0a8;stop-opacity:1;"
offset="0"
id="stop5077" />
<stop
style="stop-color:#464744;stop-opacity:1"
offset="1"
id="stop5079" />
</linearGradient>
<linearGradient
id="linearGradient2691"
inkscape:collect="always">
<stop
id="stop2693"
offset="0"
style="stop-color:#ffffff;stop-opacity:1" />
<stop
id="stop2695"
offset="1"
style="stop-color:#d3d7cf" />
</linearGradient>
<linearGradient
id="linearGradient3340">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3342" />
<stop
style="stop-color:#ffffff;stop-opacity:0.62886596;"
offset="1"
id="stop3344" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5075"
id="linearGradient2306"
gradientUnits="userSpaceOnUse"
x1="71.288956"
y1="124.11652"
x2="70.826942"
y2="95"
gradientTransform="translate(-45.00042,-71.09425)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2691"
id="radialGradient2314"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(5.324342e-2,-0.836238,2.019473,0.128568,-151.9195,108.0768)"
cx="107.5884"
cy="83.990814"
fx="107.5884"
fy="83.990814"
r="12.551644" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2684"
id="linearGradient2690"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.128181,0,0,1.128181,-53.99314,-83.36009)"
x1="70.913956"
y1="101.74152"
x2="70.951942"
y2="88.923729" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="0.19607843"
inkscape:pageopacity="0.0000000"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="-117.42449"
inkscape:cy="12.980288"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:grid-points="true"
fill="#555753"
showguides="false"
inkscape:guide-bbox="true"
guidetolerance="1px"
stroke="#555753"
inkscape:window-width="872"
inkscape:window-height="688"
inkscape:window-x="326"
inkscape:window-y="160"
showborder="true"
inkscape:showpageshadow="false">
<sodipodi:guide
orientation="horizontal"
position="38.996647"
id="guide2194" />
<sodipodi:guide
orientation="horizontal"
position="9.0140845"
id="guide2196" />
<sodipodi:guide
orientation="vertical"
position="9.0140845"
id="guide2198" />
<sodipodi:guide
orientation="vertical"
position="38.975184"
id="guide2200" />
<sodipodi:guide
orientation="horizontal"
position="22.988281"
id="guide2202" />
<sodipodi:guide
orientation="vertical"
position="23.908786"
id="guide2204" />
<sodipodi:guide
orientation="vertical"
position="157.99417"
id="guide4332" />
<sodipodi:guide
orientation="horizontal"
position="-36.062446"
id="guide4334" />
<sodipodi:guide
orientation="horizontal"
position="-58.02695"
id="guide4336" />
<sodipodi:guide
orientation="vertical"
position="180.00287"
id="guide4338" />
<sodipodi:guide
orientation="vertical"
position="107.92217"
id="guide4417" />
<sodipodi:guide
orientation="vertical"
position="129.93087"
id="guide4419" />
<sodipodi:guide
orientation="horizontal"
position="19.996875"
id="guide5106" />
<sodipodi:guide
orientation="horizontal"
position="63.039674"
id="guide5119" />
<sodipodi:guide
orientation="horizontal"
position="49.066305"
id="guide5121" />
<sodipodi:guide
orientation="horizontal"
position="-86.007168"
id="guide5307" />
<sodipodi:guide
orientation="horizontal"
position="-108.09009"
id="guide5309" />
<sodipodi:guide
orientation="horizontal"
position="-100.15429"
id="guide3111" />
<inkscape:grid
id="GridFromPre046Settings"
type="xygrid"
originx="0px"
originy="0px"
spacingx="0.5px"
spacingy="0.5px"
color="#0000ff"
empcolor="#0000ff"
opacity="0.2"
empopacity="0.4"
empspacing="2" />
</sodipodi:namedview>
<metadata
id="metadata1312">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Media Playback Start</dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Lapo Calamandrei</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
<dc:subject>
<rdf:Bag>
<rdf:li>play</rdf:li>
<rdf:li>media</rdf:li>
<rdf:li>music</rdf:li>
<rdf:li>video</rdf:li>
<rdf:li>player</rdf:li>
</rdf:Bag>
</dc:subject>
<dc:contributor>
<cc:Agent>
<dc:title>Jakub Steiner</dc:title>
</cc:Agent>
</dc:contributor>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer4"
inkscape:label="contorno"
style="display:inline" />
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer"
style="display:inline">
<path
sodipodi:nodetypes="cccc"
id="path2682"
d="M 12,39.5 L 12,9 L 38.06998,23.817079 L 12,39.5 z "
style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient2690);stroke-width:1.99999833;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;opacity:0.15"
inkscape:r_cx="true"
inkscape:r_cy="true" />
<path
inkscape:r_cy="true"
inkscape:r_cx="true"
style="color:#000000;fill:url(#radialGradient2314);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00000036;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
d="M 12.49946,37.81149 L 12.49946,10.000005 L 36.602747,23.905748 L 12.49946,37.81149 z "
id="path3375"
sodipodi:nodetypes="cccc" />
<path
inkscape:r_cy="true"
inkscape:r_cx="true"
style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient2306);stroke-width:1.00000036;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
d="M 12.49946,37.81149 L 12.49946,10.000005 L 36.602747,23.905748 L 12.49946,37.81149 z "
id="path2479"
sodipodi:nodetypes="cccc" />
<path
inkscape:r_cy="true"
inkscape:r_cx="true"
style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
d="M 12.99946,10.87449 L 12.99946,36.93699 L 35.59321,23.90574 L 12.99946,10.87449 z M 13.99946,12.62449 L 33.56196,23.90574 L 13.99946,35.18699 L 13.99946,12.62449 z "
id="path2481"
sodipodi:nodetypes="cccccccc" />
<path
style="opacity:0.5;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
d="M 13.9375,12.5625 L 13.9375,24.25 C 18.206698,24.205215 23.101656,23.904436 31,22.375 L 13.9375,12.5625 z "
id="path2339"
inkscape:r_cx="true"
inkscape:r_cy="true"
sodipodi:nodetypes="cccc" />
</g>
</svg>
<svg height="32.499847" width="28.06988" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="15.288535" x2="14.826522" y1="45.022197" y2="15.905677"><stop offset="0" stop-color="#adb0a8"/><stop offset="1" stop-color="#464744"/></linearGradient><radialGradient id="b" cx="107.5884" cy="83.990814" gradientTransform="matrix(.05324342 -.836238 2.019473 .128568 -162.9195 100.07673)" gradientUnits="userSpaceOnUse" r="12.551644"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#d3d7cf"/></radialGradient><linearGradient id="c" gradientUnits="userSpaceOnUse" x1="15.010636" x2="15.053492" y1="23.422687" y2="8.961898"><stop offset="0" stop-color="#fff"/><stop offset="1"/></linearGradient><path d="m.99999899 31.499927v-30.49999985l26.06998001 14.81707885z" style="opacity:.15;fill:none;stroke-width:1.999998;stroke-linecap:square;stroke-linejoin:round;stroke:url(#c)"/><path d="m1.499459 29.811417v-27.8114848l24.103287 13.9057428z" fill="url(#b)" fill-rule="evenodd"/><path d="m1.499459 29.811417v-27.8114848l24.103287 13.9057428z" fill="none" stroke="url(#a)" stroke-linecap="square" stroke-linejoin="round"/><g fill="#fff" transform="translate(-11.000001 -8.000073)"><path d="m12.99946 10.87449v26.0625l22.59375-13.03125zm1 1.75 19.5625 11.28125-19.5625 11.28125z" fill-rule="evenodd"/><path d="m13.9375 12.5625v11.6875c4.269198-.044785 9.164156-.345564 17.0625-1.875z" display="block" opacity=".5"/></g></svg>

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -1,424 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
sodipodi:docname="system-shutdown.svg"
sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/actions"
inkscape:version="0.46"
sodipodi:version="0.32"
id="svg11300"
height="48px"
width="48px"
inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
inkscape:export-xdpi="90.000000"
inkscape:export-ydpi="90.000000"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs3">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 24 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="48 : 24 : 1"
inkscape:persp3d-origin="24 : 16 : 1"
id="perspective62" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient5060"
id="radialGradient5031"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
cx="605.71429"
cy="486.64789"
fx="605.71429"
fy="486.64789"
r="117.14286" />
<linearGradient
inkscape:collect="always"
id="linearGradient5060">
<stop
style="stop-color:black;stop-opacity:1;"
offset="0"
id="stop5062" />
<stop
style="stop-color:black;stop-opacity:0;"
offset="1"
id="stop5064" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient5060"
id="radialGradient5029"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
cx="605.71429"
cy="486.64789"
fx="605.71429"
fy="486.64789"
r="117.14286" />
<linearGradient
id="linearGradient5048">
<stop
style="stop-color:black;stop-opacity:0;"
offset="0"
id="stop5050" />
<stop
id="stop5056"
offset="0.5"
style="stop-color:black;stop-opacity:1;" />
<stop
style="stop-color:black;stop-opacity:0;"
offset="1"
id="stop5052" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5048"
id="linearGradient5027"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
x1="302.85715"
y1="366.64789"
x2="302.85715"
y2="609.50507" />
<linearGradient
id="linearGradient7636"
inkscape:collect="always">
<stop
id="stop7638"
offset="0"
style="stop-color:#000000;stop-opacity:1;" />
<stop
id="stop7640"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient7614">
<stop
id="stop7616"
offset="0.0000000"
style="stop-color:#ffffff;stop-opacity:1.0000000;" />
<stop
style="stop-color:#ffffff;stop-opacity:1.0000000;"
offset="0.21590909"
id="stop7649" />
<stop
style="stop-color:#838383;stop-opacity:1.0000000;"
offset="0.50000000"
id="stop7632" />
<stop
id="stop7618"
offset="1"
style="stop-color:#838383;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient7608">
<stop
style="stop-color:#ffffff;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop7610" />
<stop
id="stop7622"
offset="0.46022728"
style="stop-color:#e3e3e3;stop-opacity:1.0000000;" />
<stop
style="stop-color:#dadada;stop-opacity:0.67058824;"
offset="0.61970556"
id="stop7624" />
<stop
style="stop-color:#d1d1d1;stop-opacity:0.34285715;"
offset="1.0000000"
id="stop7612" />
</linearGradient>
<linearGradient
id="linearGradient7586">
<stop
id="stop7588"
offset="0.0000000"
style="stop-color:#525252;stop-opacity:1.0000000;" />
<stop
id="stop7590"
offset="1.0000000"
style="stop-color:#000000;stop-opacity:1.0000000;" />
</linearGradient>
<linearGradient
id="linearGradient11594">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop11596" />
<stop
style="stop-color:#d1d1d1;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop11598" />
</linearGradient>
<linearGradient
id="linearGradient11520">
<stop
style="stop-color:#fbfbfb;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop11522" />
<stop
style="stop-color:#dcdcdc;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop11524" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient11508">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop11510" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop11512" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient11520"
id="radialGradient11526"
cx="24.445690"
cy="35.878170"
fx="24.445690"
fy="35.878170"
r="20.530962"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.995058,-1.535926e-32,0.000000,1.855412,-24.37145,-30.20430)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient11508"
id="radialGradient11532"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.338462,-5.168001e-14,29.48178)"
cx="30.203562"
cy="44.565483"
fx="30.203562"
fy="44.565483"
r="6.5659914" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient11594"
id="linearGradient11600"
x1="20.092352"
y1="8.9471626"
x2="31.799011"
y2="38.947163"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.045319,0.000000,0.000000,0.957884,-1.154429,1.415543)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient11520"
id="linearGradient11608"
x1="24.445671"
y1="0.49847093"
x2="24.445671"
y2="39.447163"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.984324,0.000000,0.000000,0.957884,0.336637,1.415543)" />
<linearGradient
y2="21.067410"
x2="24.445690"
y1="33.447811"
x1="31.597168"
gradientTransform="matrix(0.476329,0.000000,0.000000,0.627721,12.75490,9.156933)"
gradientUnits="userSpaceOnUse"
id="linearGradient7584"
xlink:href="#linearGradient11594"
inkscape:collect="always" />
<radialGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.407878,2.776254e-16,-5.900875e-16,1.861050,-34.35094,-20.55775)"
r="6.0270013"
fy="29.099535"
fx="24.399090"
cy="29.099535"
cx="24.399090"
id="radialGradient7592"
xlink:href="#linearGradient7586"
inkscape:collect="always" />
<linearGradient
y2="11.042997"
x2="22.585604"
y1="34.149513"
x1="22.585604"
gradientTransform="matrix(1.059222,0.000000,0.000000,0.808101,-1.234132,4.001391)"
gradientUnits="userSpaceOnUse"
id="linearGradient7596"
xlink:href="#linearGradient7608"
inkscape:collect="always" />
<linearGradient
gradientUnits="userSpaceOnUse"
y2="38.454056"
x2="28.284273"
y1="28.554562"
x1="25.279068"
id="linearGradient7642"
xlink:href="#linearGradient7636"
inkscape:collect="always" />
<radialGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.777122,-8.126449e-2,6.891211e-2,2.223012,-45.28558,-33.24798)"
r="4.4774761"
fy="29.609560"
fx="24.483574"
cy="29.609560"
cx="24.483574"
id="radialGradient7647"
xlink:href="#linearGradient7614"
inkscape:collect="always" />
</defs>
<sodipodi:namedview
inkscape:window-y="94"
inkscape:window-x="268"
inkscape:window-height="754"
inkscape:window-width="872"
inkscape:showpageshadow="false"
inkscape:document-units="px"
inkscape:grid-bbox="true"
showgrid="false"
inkscape:current-layer="layer1"
inkscape:cy="17.878701"
inkscape:cx="-112.52652"
inkscape:zoom="1"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
borderopacity="0.25490196"
bordercolor="#666666"
pagecolor="#ffffff"
id="base"
fill="#fce94f"
stroke="#ef2929" />
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Steiner</dc:title>
</cc:Agent>
</dc:creator>
<dc:source>http://jimmac.musichall.cz</dc:source>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
<dc:title>System Shutdown</dc:title>
<dc:subject>
<rdf:Bag>
<rdf:li>poweroff</rdf:li>
<rdf:li>shutdown</rdf:li>
<rdf:li>halt</rdf:li>
<rdf:li>system</rdf:li>
</rdf:Bag>
</dc:subject>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
inkscape:label="Layer 1"
id="layer1">
<g
style="display:inline"
id="g5022"
transform="matrix(2.312904e-2,0,0,1.818338e-2,45.14375,40.29231)">
<rect
y="-150.69685"
x="-1559.2523"
height="478.35718"
width="1339.6335"
id="rect4173"
style="opacity:0.40206185;color:black;fill:url(#linearGradient5027);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
<path
sodipodi:nodetypes="cccc"
id="path5058"
d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
style="opacity:0.40206185;color:black;fill:url(#radialGradient5029);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
<path
style="opacity:0.40206185;color:black;fill:url(#radialGradient5031);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
id="path5018"
sodipodi:nodetypes="cccc" />
</g>
<rect
style="opacity:1.0000000;color:#000000;fill:url(#radialGradient11526);fill-opacity:1.0000000;fill-rule:evenodd;stroke:#9b9b9b;stroke-width:0.99999982;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
id="rect11518"
width="40.061924"
height="39.914883"
x="4.3681555"
y="3.6171863"
rx="5.4548240"
ry="5.4548221" />
<rect
ry="4.2426381"
rx="4.2426391"
y="4.6506371"
x="5.5508161"
height="37.781532"
width="37.696587"
id="rect11528"
style="opacity:1.0000000;color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
<rect
style="opacity:1.0000000;color:#000000;fill:url(#linearGradient11608);fill-opacity:1.0000000;fill-rule:evenodd;stroke:url(#linearGradient11600);stroke-width:0.99999964;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
id="rect11592"
width="24.258368"
height="32.706299"
x="12.269927"
y="7.5220733"
rx="2.2980957"
ry="2.2980950" />
<rect
ry="1.5909867"
rx="1.5909867"
y="13.865772"
x="18.518534"
height="20.902771"
width="12.114655"
id="rect7580"
style="opacity:1.0000000;color:#000000;fill:url(#radialGradient7592);fill-opacity:1.0000000;fill-rule:evenodd;stroke:url(#linearGradient7584);stroke-width:0.99999881;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
<path
sodipodi:nodetypes="ccccccc"
id="path7634"
d="M 19.975767,34.034641 L 22.627417,36.686292 L 33.764349,36.509516 C 33.764349,36.509516 30.935922,27.140350 30.935922,27.140350 C 30.935922,27.140350 30.228815,17.771184 30.228815,17.771184 L 29.521708,33.681088 L 19.975767,34.034641 z "
style="overflow:visible;display:inline;visibility:visible;stroke-opacity:1.0000000;stroke-dashoffset:0.0000000;stroke-dasharray:none;stroke-miterlimit:10.000000;marker-end:none;marker-mid:none;marker-start:none;marker:none;stroke-linejoin:bevel;stroke-linecap:butt;stroke-width:0.99999923;stroke:none;fill-rule:evenodd;fill-opacity:1.0;fill:url(#linearGradient7642);color:#000000;opacity:0.31550802" />
<rect
style="opacity:1.0000000;color:#000000;fill:#8a8a8a;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#595959;stroke-width:0.99999839;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
id="rect7626"
width="8.9714193"
height="4.3154969"
x="20.019962"
y="29.217876"
rx="1.0606545"
ry="1.0606545" />
<rect
ry="0.88388008"
rx="0.88388008"
y="15.230613"
x="20.049574"
height="15.812397"
width="8.9121952"
id="rect7594"
style="opacity:1.0000000;color:#000000;fill:url(#linearGradient7596);fill-opacity:1.0000000;fill-rule:evenodd;stroke:url(#radialGradient7647);stroke-width:0.99999917;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
</g>
</svg>
<svg height="43.133282" width="46.961987" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><radialGradient id="a" cx="605.71399" cy="486.64801" gradientTransform="matrix(-.06416895 0 0 .03581591 46.660868 21.303303)" gradientUnits="userSpaceOnUse" r="117.143" xlink:href="#b"/><linearGradient id="b"><stop offset="0"/><stop offset="1" stop-opacity="0"/></linearGradient><radialGradient id="c" cx="605.71399" cy="486.64801" gradientTransform="matrix(.06416895 0 0 .03581591 .301129 21.303303)" gradientUnits="userSpaceOnUse" r="117.143" xlink:href="#b"/><linearGradient id="d" gradientTransform="matrix(.06416895 0 0 .03581591 .2885 21.303303)" gradientUnits="userSpaceOnUse" x1="302.85699" x2="302.85699" y1="366.64801" y2="609.505"><stop offset="0" stop-opacity="0"/><stop offset=".5"/><stop offset="1" stop-opacity="0"/></linearGradient><linearGradient id="e"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#d1d1d1"/></linearGradient><linearGradient id="f"><stop offset="0" stop-color="#fbfbfb"/><stop offset="1" stop-color="#dcdcdc"/></linearGradient><radialGradient id="g" cx="24.445999" cy="35.877998" gradientTransform="matrix(1.995058 0 0 1.855412 -25.462416 -33.3213)" gradientUnits="userSpaceOnUse" r="20.531" xlink:href="#f"/><linearGradient id="h" gradientTransform="matrix(1.045319 0 0 .957884 -1.154429 1.415543)" gradientUnits="userSpaceOnUse" x1="20.091999" x2="31.799" xlink:href="#e" y1="8.947" y2="38.946999"/><linearGradient id="i" gradientTransform="matrix(.984324 0 0 .957884 .336637 1.415543)" gradientUnits="userSpaceOnUse" x1="24.445999" x2="24.445999" xlink:href="#f" y1=".498" y2="39.446999"/><linearGradient id="j" gradientTransform="matrix(.476329 0 0 .627721 12.7549 9.156933)" gradientUnits="userSpaceOnUse" x1="31.597" x2="24.445999" xlink:href="#e" y1="33.448002" y2="21.066999"/><radialGradient id="k" cx="24.399" cy="29.1" gradientTransform="matrix(2.407878 0 0 1.86105 -34.35094 -20.55775)" gradientUnits="userSpaceOnUse" r="6.027"><stop offset="0" stop-color="#525252"/><stop offset="1"/></radialGradient><linearGradient id="l" gradientTransform="matrix(1.059222 0 0 .808101 -1.234132 4.001391)" gradientUnits="userSpaceOnUse" x1="22.586" x2="22.586" y1="34.150002" y2="11.043"><stop offset="0" stop-color="#fff"/><stop offset=".46" stop-color="#e3e3e3"/><stop offset=".62" stop-color="#dadada" stop-opacity=".671"/><stop offset="1" stop-color="#d1d1d1" stop-opacity=".343"/></linearGradient><linearGradient id="m" gradientUnits="userSpaceOnUse" x1="25.278999" x2="28.284" xlink:href="#b" y1="28.555" y2="38.453999"/><radialGradient id="n" cx="24.483999" cy="29.610001" gradientTransform="matrix(2.777122 -.08126449 .06891211 2.223012 -45.28558 -33.24798)" gradientUnits="userSpaceOnUse" r="4.477"><stop offset="0" stop-color="#fff"/><stop offset=".216" stop-color="#fff"/><stop offset=".5" stop-color="#838383"/><stop offset="1" stop-color="#838383" stop-opacity="0"/></radialGradient><g stroke-width=".020508"><path d="m7.988775 34.435132h30.984437v8.69815h-30.984437z" fill="url(#d)" opacity=".402"/><path d="m38.973213 34.435431v8.697671c3.304542.01637 7.988775-1.948707 7.988773-4.349395 0-2.400689-3.68762-4.348275-7.988773-4.348276z" fill="url(#c)" opacity=".402"/><path d="m7.988775 34.435431v8.697671c-3.304543.016373-7.988775-1.948707-7.988775-4.349395 0-2.400689 3.6876201-4.348275 7.988775-4.348276z" fill="url(#a)" opacity=".402"/></g><rect fill="url(#g)" fill-rule="evenodd" height="39.915001" rx="5.455" stroke="#9b9b9b" stroke-linejoin="bevel" stroke-miterlimit="10" width="40.062" x="3.277034" y=".5"/><rect fill="none" height="37.782001" rx="4.243" stroke="#fff" stroke-linejoin="bevel" stroke-miterlimit="10" width="37.696999" x="4.460034" y="1.534"/><g fill-rule="evenodd" transform="translate(-1.090966 -3.117)"><rect fill="url(#i)" height="32.706001" rx="2.298" stroke="url(#h)" stroke-linejoin="bevel" stroke-miterlimit="10" width="24.257999" x="12.27" y="7.522"/><rect fill="url(#k)" height="20.903" rx="1.591" stroke="url(#j)" stroke-linejoin="bevel" stroke-miterlimit="10" width="12.115" x="18.518999" y="13.866"/><path d="m19.975767 34.034641 2.65165 2.651651 11.136932-.176776s-2.828427-9.369166-2.828427-9.369166-.707107-9.369166-.707107-9.369166l-.707107 15.909904z" fill="url(#m)" opacity=".316"/><g stroke-linejoin="bevel" stroke-miterlimit="10"><rect fill="#8a8a8a" height="4.315" rx="1.061" stroke="#595959" width="8.971" x="20.02" y="29.218"/><rect fill="url(#l)" height="15.812" rx=".884" stroke="url(#n)" width="8.912" x="20.049999" y="15.231"/></g></g></svg>

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

@@ -1,192 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
sodipodi:docname="go-next.svg"
sodipodi:docbase="/home/tigert/cvs/freedesktop.org/tango-icon-theme/scalable/actions"
inkscape:version="0.46"
sodipodi:version="0.32"
id="svg11300"
height="48"
width="48"
inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
inkscape:export-xdpi="90.000000"
inkscape:export-ydpi="90.000000"
version="1.0"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs3">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 24 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="48 : 24 : 1"
inkscape:persp3d-origin="24 : 16 : 1"
id="perspective23" />
<linearGradient
id="linearGradient2591">
<stop
style="stop-color:#73d216"
offset="0"
id="stop2593" />
<stop
style="stop-color:#4e9a06"
offset="1.0000000"
id="stop2595" />
</linearGradient>
<linearGradient
id="linearGradient8662"
inkscape:collect="always">
<stop
id="stop8664"
offset="0"
style="stop-color:#000000;stop-opacity:1;" />
<stop
id="stop8666"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient8650"
inkscape:collect="always">
<stop
id="stop8652"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop8654"
offset="1"
style="stop-color:#ffffff;stop-opacity:0;" />
</linearGradient>
<radialGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.046729,-3.749427e-16,2.853404e-16,1.557610,-19.51799,3.452086)"
r="17.171415"
fy="2.8969381"
fx="19.701141"
cy="2.8969381"
cx="19.701141"
id="radialGradient8656"
xlink:href="#linearGradient8650"
inkscape:collect="always" />
<radialGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.536723,2.511012e-15,16.87306)"
r="15.644737"
fy="36.421127"
fx="24.837126"
cy="36.421127"
cx="24.837126"
id="radialGradient8668"
xlink:href="#linearGradient8662"
inkscape:collect="always" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2591"
id="radialGradient2597"
cx="22.291636"
cy="32.797512"
fx="22.291636"
fy="32.797512"
r="16.9562"
gradientTransform="matrix(0.843022,1.871885e-16,-2.265228e-16,1.020168,4.499298,1.381992)"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
inkscape:window-y="30"
inkscape:window-x="0"
inkscape:window-height="818"
inkscape:window-width="1280"
inkscape:showpageshadow="false"
inkscape:document-units="px"
inkscape:grid-bbox="true"
showgrid="false"
inkscape:current-layer="layer1"
inkscape:cy="27.398876"
inkscape:cx="20.508639"
inkscape:zoom="11.313708"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
borderopacity="0.25490196"
bordercolor="#666666"
pagecolor="#ffffff"
id="base"
fill="#4e9a06"
stroke="#4e9a06" />
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Steiner</dc:title>
</cc:Agent>
</dc:creator>
<dc:source>http://jimmac.musichall.cz</dc:source>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
<dc:title>Go Next</dc:title>
<dc:subject>
<rdf:Bag>
<rdf:li>go</rdf:li>
<rdf:li>next</rdf:li>
<rdf:li>right</rdf:li>
<rdf:li>arrow</rdf:li>
<rdf:li>pointer</rdf:li>
<rdf:li>&gt;</rdf:li>
</rdf:Bag>
</dc:subject>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
inkscape:label="Layer 1"
id="layer1">
<path
transform="matrix(1.271186,0.000000,0.000000,1.271186,-8.119376,-15.10179)"
d="M 40.481863 36.421127 A 15.644737 8.3968935 0 1 1 9.1923885,36.421127 A 15.644737 8.3968935 0 1 1 40.481863 36.421127 z"
sodipodi:ry="8.3968935"
sodipodi:rx="15.644737"
sodipodi:cy="36.421127"
sodipodi:cx="24.837126"
id="path8660"
style="opacity:0.29946522;color:#000000;fill:url(#radialGradient8668);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
sodipodi:type="arc" />
<path
sodipodi:nodetypes="cccccccc"
id="path8643"
d="M 8.5541875,15.517348 L 8.5541875,32.511768 L 21.538,32.511768 L 21.538,41.056806 L 41.497835,24.150365 L 21.41919,7.1251168 L 21.41919,15.522652 L 8.5541875,15.517348 z "
style="opacity:1;color:#000000;fill:url(#radialGradient2597);fill-opacity:1;fill-rule:evenodd;stroke:#3a7304;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
<path
sodipodi:nodetypes="cccccc"
id="path8645"
d="M 21.962385,8.2485033 L 21.962385,16.054978 L 9.1452151,16.054978 L 9.1452151,25.095691 C 26.895215,27.095691 25.778752,17.640403 40.528752,24.140403 L 21.962385,8.2485033 z "
style="opacity:0.5080214;color:#000000;fill:url(#radialGradient8656);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
<path
style="opacity:0.48128339;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00000036;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
d="M 9.537702,16.561892 L 9.537702,31.546332 L 22.523069,31.546332 L 22.523069,38.941498 L 40.001083,24.145807 L 22.507108,9.3654066 L 22.507108,16.566789 L 9.537702,16.561892 z "
id="path8658"
sodipodi:nodetypes="cccccccc" />
</g>
</svg>
<svg height="35.245075" width="39.774742" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><radialGradient id="a" cx="19.701141" cy="2.896938" gradientTransform="matrix(2.046729 0 0 1.55761 -19.51799 3.452086)" gradientUnits="userSpaceOnUse" r="17.171415"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></radialGradient><radialGradient id="b" cx="24.837126" cy="36.421127" gradientTransform="matrix(1 0 0 .536723 0 16.87306)" gradientUnits="userSpaceOnUse" r="15.644737"><stop offset="0"/><stop offset="1" stop-opacity="0"/></radialGradient><radialGradient id="c" cx="22.291636" cy="32.797512" gradientTransform="matrix(.843022 0 0 1.020168 4.499298 1.381992)" gradientUnits="userSpaceOnUse" r="16.9562"><stop offset="0" stop-color="#73d216"/><stop offset="1" stop-color="#4e9a06"/></radialGradient><g fill-rule="evenodd" transform="translate(-3.56586 -6.625175)"><path d="m40.481863 36.421127a15.644737 8.3968937 0 1 1 -31.2894745 0 15.644737 8.3968937 0 1 1 31.2894745 0z" fill="url(#b)" opacity=".299465" transform="matrix(1.271186 0 0 1.271186 -8.119376 -15.10179)"/><path d="m8.5541875 15.517348v16.99442h12.9838125v8.545038l19.959835-16.906441-20.078645-17.0252482v8.3975352z" fill="url(#c)" stroke="#3a7304" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="m21.962385 8.2485033v7.8064747h-12.8171699v9.040713c17.7499999 2 16.6335369-7.455288 31.3835369-.955288z" fill="url(#a)" opacity=".508021"/></g><path d="m5.9718424 9.9367173v14.9844397h12.9853666v7.395166l17.478014-14.795691-17.493975-14.7804001v7.2013824z" fill="none" opacity=".481283" stroke="#fff" stroke-miterlimit="10"/></svg>

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -0,0 +1 @@
<svg height="47.857918" width="45.125" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><radialGradient id="a" cx="25.455999" cy="39.160999" gradientTransform="matrix(1 0 0 .315315 -2.727635 29.322619)" gradientUnits="userSpaceOnUse" r="19.622"><stop offset="0"/><stop offset="1" stop-opacity="0"/></radialGradient><linearGradient id="b" gradientUnits="userSpaceOnUse" x1="11.09025" x2="36.01825" y1="8.082695" y2="42.111695"><stop offset="0" stop-color="#c9c9c9"/><stop offset=".25" stop-color="#f8f8f8"/><stop offset=".5" stop-color="#e2e2e2"/><stop offset=".75" stop-color="#b0b0b0"/><stop offset="1" stop-color="#c9c9c9"/></linearGradient><path d="m42.350423 41.670732a19.622213 6.1871845 0 1 1 -39.2444265 0 19.622213 6.1871845 0 1 1 39.2444265 0z" fill="url(#a)" opacity=".409"/><path d="m21.40625.50344454c-.465439.0318463-.917834.10393469-1.375.15625h-.03125l-1.09375 5.96874996c-1.782725.4059899-3.459909 1.0949915-4.96875 2.03125l-4.90625-3.53125c-1.3262882 1.0296906-2.5331984 2.2305953-3.59375 3.53125l3.40625 4.9687505c-1.0342329 1.580515-1.8119683 3.385224-2.25 5.28125-.000075.009-.0000609.02969 0 .03125l-5.9375.9375c-.1085533.886633-.15625 1.802939-.15625 2.71875.0000001.7493.020689 1.488589.09375 2.21875l5.9375 1.0625c.422279 2.061892 1.2244587 3.987512 2.34375 5.6875l-3.53125 4.84375c1.0113261 1.255518 2.1788917 2.398616 3.4375 3.40625l5-3.4375c1.747433 1.114717 3.698083 1.896374 5.8125 2.28125l.9375 5.90625c.666183.06064 1.349349.0625 2.03125.0625.962685-.000001 1.882237-.03648 2.8125-.15625l1.125-6.03125c2.007561-.499601 3.893469-1.36629 5.53125-2.53125l4.8125 3.5c1.248028-1.061797 2.389277-2.282256 3.375-3.59375l-3.5-5.0625c.947853-1.63699 1.604629-3.443141 1.9375-5.375l5.90625-.9375c.05179-.616346.0625-1.214087.0625-1.84375 0-1.094214-.127182-2.167084-.28125-3.21875l-6-1.09375c-.470194-1.736224-1.241676-3.356102-2.21875-4.8125l3.53125-4.8437505c-1.094573-1.3386071-2.343178-2.5751812-3.71875-3.625l-5.09375 3.5c-1.463996-.8658374-3.039463-1.5301821-4.75-1.90625l-.9375-5.93749996c-.853299-.10037539-1.713621-.15625-2.59375-.15625-.237872.00000001-.482684-.007485-.71875 0-.115083.003649-.228966-.006695-.34375 0-.03109.001813-.06272-.002123-.09375 0zm.8125 15.18750046c.114166-.0058.228152 0 .34375 0 3.699127 0 6.71875 3.019624 6.71875 6.71875.000001 3.699126-3.019624 6.6875-6.71875 6.6875-3.699125.000001-6.6875-2.988374-6.6875-6.6875.000001-3.583527 2.8046-6.539158 6.34375-6.71875z" fill="url(#b)" stroke="#808080"/><g fill="none" stroke="#fff" transform="translate(-1.84375 .034695)"><path d="m36.239223 23.781593a12.727922 12.727922 0 1 1 -25.455844 0 12.727922 12.727922 0 1 1 25.455844 0z" opacity=".648" stroke-width="1.649" transform="matrix(.606518 0 0 .606518 10.15021 7.936835)"/><path d="m22.557788 1.6501132-.878189 5.7790101c-1.670998.3805456-4.744725 1.5444111-6.159004 2.4219929l-4.672033-3.4871869c-1.2431682.965158-1.3284229 1.0306101-2.3225076 2.2497511l3.3780526 5.0099536c-.969415 1.481461-2.1338039 4.121495-2.5518734 6.008088 0 0-5.9194088.997841-5.9194088.997841-.1017499.831066-.05285 2.609798.015632 3.294198l5.6542436 1.018588c.395814 1.932669 1.8770306 5.043588 2.9261736 6.637034l-3.575576 4.724044c.9479445 1.176832 1.1376642 1.284521 2.317393 2.229005l4.781168-3.50282c1.637918 1.044855 4.889033 2.315886 6.870935 2.676641l.784687 5.706254c.624432.05684 2.349481.216281 3.221443.10402l.878188-5.940154c1.881743-.468289 5.13316-1.80296 6.668298-2.89491l4.776055 3.450808c1.169811-.995251 1.180292-1.145216 2.104238-2.374516l-3.539198-5.030701c.888449-1.534398 2.037228-4.535223 2.349237-6.346009l5.794642-.961463c.04855-.577719.05091-2.188789-.0935-3.174545l-5.903779-1.018588c-.440727-1.627411-1.953211-4.559982-2.869049-5.925104l3.752352-4.7240431c-1.025972-1.2547143-1.407444-1.4268709-2.696806-2.4108954l-4.942313 3.5391967c-1.372246-.8115728-4.108614-2.0487474-5.711948-2.4012464l-.873075-5.6542436c-.799821-.094085-3.107395-.052306-3.564478 0z" opacity=".347"/></g></svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -1,350 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
id="svg2"
sodipodi:version="0.32"
inkscape:version="0.46"
version="1.0"
sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/devices"
sodipodi:docname="media-floppy.svg"
inkscape:export-filename="/home/jimmac/gfx/ximian/tango-icon-theme/scalable/devices/media-floppy.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs4">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 24 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="48 : 24 : 1"
inkscape:persp3d-origin="24 : 16 : 1"
id="perspective48" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient5060"
id="radialGradient6719"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
cx="605.71429"
cy="486.64789"
fx="605.71429"
fy="486.64789"
r="117.14286" />
<linearGradient
inkscape:collect="always"
id="linearGradient5060">
<stop
style="stop-color:black;stop-opacity:1;"
offset="0"
id="stop5062" />
<stop
style="stop-color:black;stop-opacity:0;"
offset="1"
id="stop5064" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient5060"
id="radialGradient6717"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
cx="605.71429"
cy="486.64789"
fx="605.71429"
fy="486.64789"
r="117.14286" />
<linearGradient
id="linearGradient5048">
<stop
style="stop-color:black;stop-opacity:0;"
offset="0"
id="stop5050" />
<stop
id="stop5056"
offset="0.5"
style="stop-color:black;stop-opacity:1;" />
<stop
style="stop-color:black;stop-opacity:0;"
offset="1"
id="stop5052" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5048"
id="linearGradient6715"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
x1="302.85715"
y1="366.64789"
x2="302.85715"
y2="609.50507" />
<linearGradient
inkscape:collect="always"
id="linearGradient2371">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop2373" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop2375" />
</linearGradient>
<linearGradient
id="linearGradient2350">
<stop
id="stop2352"
offset="0"
style="stop-color:#858585;stop-opacity:1;" />
<stop
style="stop-color:#cbcbcb;stop-opacity:1;"
offset="0.5"
id="stop2356" />
<stop
id="stop2354"
offset="1"
style="stop-color:#6b6b6b;stop-opacity:1;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient2277">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop2279" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop2281" />
</linearGradient>
<linearGradient
id="linearGradient2263">
<stop
style="stop-color:#1e2d69;stop-opacity:1;"
offset="0"
id="stop2265" />
<stop
style="stop-color:#78a7e0;stop-opacity:1;"
offset="1"
id="stop2267" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2263"
id="linearGradient2269"
x1="40.884724"
y1="71.869133"
x2="16.879831"
y2="-0.38931385"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.976612,0.000000,0.000000,1.139789,0.564215,-3.271158)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2277"
id="linearGradient2283"
x1="13.783585"
y1="-0.99672896"
x2="33.074715"
y2="55.701546"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.985432,0.000000,0.000000,1.148179,0.641070,-2.933883)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2350"
id="linearGradient2348"
x1="20.125"
y1="21.84375"
x2="28.5625"
y2="42.46875"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.067698,0.000000,0.000000,1.121532,-1.368937,-5.574460)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2371"
id="radialGradient2377"
cx="24.3125"
cy="41.15625"
fx="24.3125"
fy="41.15625"
r="22.875"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.269126,-1.352272e-16,30.08005)"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#efefef"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="-125.27386"
inkscape:cy="9.8398597"
inkscape:document-units="px"
inkscape:current-layer="layer1"
inkscape:showpageshadow="false"
showborder="true"
borderlayer="top"
showgrid="false"
inkscape:grid-points="false"
inkscape:window-width="872"
inkscape:window-height="693"
inkscape:window-x="502"
inkscape:window-y="155">
<inkscape:grid
id="GridFromPre046Settings"
type="xygrid"
originx="0px"
originy="0px"
spacingx="1px"
spacingy="1px"
color="#9f9f9f"
empcolor="#9f9f9f"
opacity="0.10196078"
empopacity="0.25490196"
empspacing="10" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Media Floppy</dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Tuomas Kuosmanen</dc:title>
</cc:Agent>
</dc:creator>
<dc:source>http://www.tango-project.org</dc:source>
<dc:subject>
<rdf:Bag>
<rdf:li>save</rdf:li>
<rdf:li>document</rdf:li>
<rdf:li>store</rdf:li>
<rdf:li>file</rdf:li>
<rdf:li>io</rdf:li>
<rdf:li>floppy</rdf:li>
<rdf:li>media</rdf:li>
</rdf:Bag>
</dc:subject>
<dc:contributor>
<cc:Agent>
<dc:title>Jakub Steiner</dc:title>
</cc:Agent>
</dc:contributor>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<g
transform="matrix(2.415802e-2,0,0,2.086758e-2,45.237,41.6536)"
id="g6707">
<rect
style="opacity:0.40206185;color:black;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
id="rect6709"
width="1339.6335"
height="478.35718"
x="-1559.2523"
y="-150.69685" />
<path
style="opacity:0.40206185;color:black;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
id="path6711"
sodipodi:nodetypes="cccc" />
<path
sodipodi:nodetypes="cccc"
id="path6713"
d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
style="opacity:0.40206185;color:black;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
</g>
<path
style="fill:url(#linearGradient2269);fill-opacity:1;stroke:#25375f;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
d="M 4.5577604,3.5675797 L 43.448063,3.5675797 C 44.037357,3.5675797 44.511771,4.0419938 44.511771,4.6312883 L 44.511771,42.396499 C 44.511771,42.985793 44.037357,43.460207 43.448063,43.460207 L 6.5577604,43.460207 C 6.5577604,43.460207 3.4940519,40.396499 3.4940519,40.396499 L 3.4940519,4.6312883 C 3.4940519,4.0419938 3.9684659,3.5675797 4.5577604,3.5675797 z "
id="rect2259"
sodipodi:nodetypes="ccccccccc" />
<rect
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect2328"
width="30"
height="23"
x="9"
y="4" />
<rect
ry="0.12620771"
rx="0.12620772"
y="4"
x="9"
height="4"
width="30"
id="rect2330"
style="opacity:1;fill:#d31c00;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
style="opacity:0.73863639;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect2332"
width="2"
height="2"
x="6"
y="6"
rx="0.12620772"
ry="0.12620771" />
<path
style="opacity:0.13068182;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="M 11,12.5 L 37,12.5"
id="path2334" />
<path
id="path2336"
d="M 11,17.5 L 37,17.5"
style="opacity:0.13068182;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<path
style="opacity:0.13068182;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="M 11,22.5 L 37,22.5"
id="path2338" />
<path
style="opacity:0.59659095;fill:none;fill-opacity:1;stroke:url(#linearGradient2283);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
d="M 4.6189226,4.5276647 L 43.387404,4.5276647 C 43.457323,4.5276647 43.513612,4.5839533 43.513612,4.6538724 L 43.513612,42.302111 C 43.513612,42.37203 43.457323,42.428319 43.387404,42.428319 L 6.9282818,42.428319 C 6.9282818,42.428319 4.4927149,40.036946 4.4927149,40.036946 L 4.4927149,4.6538724 C 4.4927149,4.5839533 4.5490035,4.5276647 4.6189226,4.5276647 z "
id="rect2273"
sodipodi:nodetypes="ccccccccc" />
<path
style="fill:url(#linearGradient2348);fill-opacity:1;stroke:#525252;stroke-width:0.99999946;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
d="M 14.113967,28.562183 L 33.863791,28.562183 C 34.751762,28.562183 35.466627,29.313093 35.466627,30.245836 L 35.466627,43.447387 C 35.466627,43.447387 12.511131,43.447387 12.511131,43.447387 L 12.511131,30.245836 C 12.511131,29.313093 13.225996,28.562183 14.113967,28.562183 z "
id="rect2340"
sodipodi:nodetypes="ccccccc" />
<rect
style="opacity:1;fill:#4967a2;fill-opacity:1;stroke:#525252;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect2359"
width="5.0297527"
height="10.06597"
x="16.464279"
y="30.4566"
rx="0.75120711"
ry="0.75120765" />
</g>
</svg>
<svg height="45.4235" width="49.051262" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><radialGradient id="a" cx="605.71429" cy="486.64789" gradientTransform="matrix(-2.774389 0 0 1.969706 112.7623 -872.8854)" gradientUnits="userSpaceOnUse" r="117.14286" xlink:href="#b"/><linearGradient id="b"><stop offset="0"/><stop offset="1" stop-opacity="0"/></linearGradient><radialGradient id="c" cx="605.71429" cy="486.64789" gradientTransform="matrix(2.774389 0 0 1.969706 -1891.633 -872.8854)" gradientUnits="userSpaceOnUse" r="117.14286" xlink:href="#b"/><linearGradient id="d" gradientTransform="matrix(2.774389 0 0 1.969706 -1892.179 -872.8854)" gradientUnits="userSpaceOnUse" x1="302.85715" x2="302.85715" y1="366.64789" y2="609.50507"><stop offset="0" stop-opacity="0"/><stop offset=".5"/><stop offset="1" stop-opacity="0"/></linearGradient><linearGradient id="e" gradientTransform="matrix(.976612 0 0 1.139789 1.339848 -6.338738)" gradientUnits="userSpaceOnUse" x1="40.884724" x2="16.879831" y1="71.869133" y2="-.389314"><stop offset="0" stop-color="#1e2d69"/><stop offset="1" stop-color="#78a7e0"/></linearGradient><linearGradient id="f" gradientTransform="matrix(.985432 0 0 1.148179 1.416703 -6.001463)" gradientUnits="userSpaceOnUse" x1="13.783585" x2="33.074715" y1="-.996729" y2="55.701546"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></linearGradient><linearGradient id="g" gradientTransform="matrix(1.067698 0 0 1.121532 -1.368937 -5.57446)" gradientUnits="userSpaceOnUse" x1="20.125" x2="28.5625" y1="21.84375" y2="42.46875"><stop offset="0" stop-color="#858585"/><stop offset=".5" stop-color="#cbcbcb"/><stop offset="1" stop-color="#6b6b6b"/></linearGradient><g transform="matrix(.02415802 0 0 .02086758 46.012633 38.58602)"><path d="m-1559.2523-150.69685h1339.6335v478.35718h-1339.6335z" fill="url(#d)" opacity=".402062"/><path d="m-219.61876-150.68038v478.33079c142.874166.90045 345.40022-107.16966 345.40014-239.196175 0-132.026537-159.436816-239.134595-345.40014-239.134615z" fill="url(#c)" opacity=".402062"/><path d="m-1559.2523-150.68038v478.33079c-142.8742.90045-345.4002-107.16966-345.4002-239.196175 0-132.026537 159.4368-239.134595 345.4002-239.134615z" fill="url(#a)" opacity=".402062"/></g><path d="m5.3333936.5h38.8903024c.589294 0 1.063708.4744141 1.063708 1.0637086v37.7652104c0 .589294-.474414 1.063708-1.063708 1.063708h-36.8903024s-3.0637085-3.063708-3.0637085-3.063708v-35.7652104c0-.5892945.474414-1.0637086 1.0637085-1.0637086z" fill="url(#e)" stroke="#25375f" stroke-linecap="round" stroke-linejoin="round"/><path d="m9.7756332.9324203h29.9999998v22.9999997h-29.9999998z" fill="#fff"/><rect fill="#d31c00" height="4" rx=".126208" width="30" x="9.775633" y=".93242"/><rect height="2" opacity=".738636" rx=".126208" width="2" x="6.775633" y="2.93242"/><g stroke="#000" transform="translate(.775633 -3.06758)"><path d="m11 12.5h26" opacity=".130682"/><path d="m11 17.5h26" opacity=".130682"/><path d="m11 22.5h26" opacity=".130682"/></g><path d="m5.3945558 1.460085h38.7684812c.06992 0 .126208.056289.126208.1262077v37.6482383c0 .06992-.05629.126208-.126208.126208h-36.459122s-2.4355669-2.391373-2.4355669-2.391373v-35.3830733c0-.069919.056289-.1262077.1262077-.1262077z" fill="none" opacity=".596591" stroke="url(#f)" stroke-linecap="round"/><g stroke="#525252" transform="translate(.775633 -3.06758)"><path d="m14.113967 28.562183h19.749824c.887971 0 1.602836.75091 1.602836 1.683653v13.201551h-22.955496v-13.201551c0-.932743.714865-1.683653 1.602836-1.683653z" fill="url(#g)" stroke-width=".999999"/><rect fill="#4967a2" height="10.06597" rx=".751207" ry=".751208" width="5.029753" x="16.464279" y="30.4566"/></g></svg>

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@@ -1,651 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
id="svg1307"
sodipodi:version="0.32"
inkscape:version="0.46"
sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/actions"
sodipodi:docname="media-playback-stop.svg"
inkscape:export-filename="/home/lapo/Desktop/Grafica/Icone/media-actions-outlines.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
version="1.0"
inkscape:r_cx="true"
inkscape:r_cy="true"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs1309">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 24 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="48 : 24 : 1"
inkscape:persp3d-origin="24 : 16 : 1"
id="perspective82" />
<linearGradient
id="linearGradient2817">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop2819" />
<stop
style="stop-color:#ffffff;stop-opacity:0.48453608;"
offset="1"
id="stop2821" />
</linearGradient>
<linearGradient
id="linearGradient2584">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop2586" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop2588" />
</linearGradient>
<linearGradient
id="linearGradient2697">
<stop
id="stop2699"
offset="0"
style="stop-color:#babdb6" />
<stop
id="stop2701"
offset="1"
style="stop-color:#555753" />
</linearGradient>
<linearGradient
id="linearGradient2679"
inkscape:collect="always">
<stop
id="stop2681"
offset="0"
style="stop-color:#f7f7f7;stop-opacity:1" />
<stop
id="stop2683"
offset="1"
style="stop-color:#ccd0c7;stop-opacity:1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient3081">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3083" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop3085" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient8662">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop8664" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop8666" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2679"
id="radialGradient2112"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-42.61165,283.7891)"
cx="169.77171"
cy="100.20107"
fx="169.77171"
fy="100.20107"
r="11" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2697"
id="linearGradient2122"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-12,0)"
x1="169"
y1="110.33805"
x2="169"
y2="93.204849" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3081"
id="linearGradient2124"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(133,70.99999)"
x1="15.089521"
y1="15.291994"
x2="14"
y2="52.510574" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8662"
id="radialGradient2137"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.536723,4.473733e-13,16.87306)"
cx="24.837126"
cy="36.421127"
fx="24.837126"
fy="36.421127"
r="15.644737" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8662"
id="radialGradient2139"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.536723,-1.416456e-12,16.87306)"
cx="24.837126"
cy="36.421127"
fx="24.837126"
fy="36.421127"
r="15.644737" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8662"
id="radialGradient2725"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.536723,4.526469e-13,16.87306)"
cx="24.837126"
cy="36.421127"
fx="24.837126"
fy="36.421127"
r="15.644737" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8662"
id="radialGradient2727"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.536723,-1.432388e-12,16.87306)"
cx="24.837126"
cy="36.421127"
fx="24.837126"
fy="36.421127"
r="15.644737" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2679"
id="radialGradient2729"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-42.61165,283.7891)"
cx="169.77171"
cy="100.20107"
fx="169.77171"
fy="100.20107"
r="11" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2697"
id="linearGradient2731"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-12,0)"
x1="169"
y1="110.33805"
x2="169"
y2="93.204849" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3081"
id="linearGradient2733"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(133,70.99999)"
x1="15.089521"
y1="15.291994"
x2="14"
y2="52.510574" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8662"
id="radialGradient2745"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.536723,4.579205e-13,16.87306)"
cx="24.837126"
cy="36.421127"
fx="24.837126"
fy="36.421127"
r="15.644737" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8662"
id="radialGradient2747"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.536723,-1.44832e-12,16.87306)"
cx="24.837126"
cy="36.421127"
fx="24.837126"
fy="36.421127"
r="15.644737" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2679"
id="radialGradient2749"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-42.61165,283.7891)"
cx="169.77171"
cy="100.20107"
fx="169.77171"
fy="100.20107"
r="11" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2697"
id="linearGradient2751"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-12,0)"
x1="169"
y1="110.33805"
x2="169"
y2="93.204849" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3081"
id="linearGradient2753"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(133,70.99999)"
x1="15.089521"
y1="15.291994"
x2="14"
y2="52.510574" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2679"
id="radialGradient2791"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-42.61165,283.7891)"
cx="169.77171"
cy="100.20107"
fx="169.77171"
fy="100.20107"
r="11" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2697"
id="linearGradient2793"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-12,0)"
x1="169"
y1="110.33805"
x2="169"
y2="93.204849" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2697"
id="linearGradient2795"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-12,0)"
x1="169"
y1="110.33805"
x2="169"
y2="93.204849" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3081"
id="linearGradient2797"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(133,70.99999)"
x1="15.089521"
y1="15.291994"
x2="14"
y2="52.510574" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3081"
id="linearGradient2800"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-4e-4,-9.426e-2)"
x1="15.089521"
y1="15.291994"
x2="14"
y2="52.510574" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2697"
id="linearGradient2803"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,1.004384,-145.0004,-71.4625)"
x1="169"
y1="110.33805"
x2="169"
y2="93.204849" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2697"
id="linearGradient2806"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-145.0004,-97.0943)"
x1="169"
y1="110.33805"
x2="169"
y2="93.204849" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2679"
id="radialGradient2809"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-175.6121,212.6949)"
cx="169.77171"
cy="100.20107"
fx="169.77171"
fy="100.20107"
r="11" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2817"
id="linearGradient2823"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.103262,0,0,1.054917,-163.1228,-76.31138)"
x1="174.83363"
y1="84.263489"
x2="174.74524"
y2="105.49083" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3081"
id="linearGradient2825"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-4e-4,-26.09426)"
x1="15.089521"
y1="15.291994"
x2="14"
y2="52.510574" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2679"
id="radialGradient2831"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-175.6121,186.6949)"
cx="169.77171"
cy="100.20107"
fx="169.77171"
fy="100.20107"
r="11" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2817"
id="linearGradient2858"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.103262,0,0,1.054917,-163.1228,-76.31138)"
x1="174.83363"
y1="84.263489"
x2="174.74524"
y2="105.49083" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2679"
id="radialGradient2860"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-175.6121,212.6949)"
cx="169.77171"
cy="100.20107"
fx="169.77171"
fy="100.20107"
r="11" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2697"
id="linearGradient2862"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,1.004384,-145.0004,-71.4625)"
x1="169"
y1="110.33805"
x2="169"
y2="93.204849" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3081"
id="linearGradient2864"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-4e-4,-9.426e-2)"
x1="15.089521"
y1="15.291994"
x2="14"
y2="52.510574" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3081"
id="linearGradient3421"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(3.000198,0,0,1,-67.006,-9.426e-2)"
x1="15.089521"
y1="15.291994"
x2="14"
y2="52.510574" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2697"
id="linearGradient3424"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.498884,0,0,1.004384,-414.0618,-71.4625)"
x1="169"
y1="110.33805"
x2="169"
y2="93.204849" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2679"
id="radialGradient3427"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(8.905772e-6,-1.07205,4.98026,-1.250658e-6,-490.7792,212.6949)"
cx="169.77171"
cy="100.20107"
fx="169.77171"
fy="100.20107"
r="11" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2817"
id="linearGradient3430"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.624525,0,0,1.054917,-436.1019,-76.31138)"
x1="174.83363"
y1="84.263489"
x2="174.74524"
y2="105.49083" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="0.19607843"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="4"
inkscape:cx="-0.153018"
inkscape:cy="25.719637"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:grid-points="true"
fill="#fcaf3e"
showguides="false"
inkscape:guide-bbox="true"
guidetolerance="1px"
stroke="#729fcf"
inkscape:window-width="872"
inkscape:window-height="688"
inkscape:window-x="0"
inkscape:window-y="160"
showborder="true"
inkscape:showpageshadow="false">
<sodipodi:guide
orientation="horizontal"
position="38.996647"
id="guide2194" />
<sodipodi:guide
orientation="horizontal"
position="9.0140845"
id="guide2196" />
<sodipodi:guide
orientation="vertical"
position="9.0140845"
id="guide2198" />
<sodipodi:guide
orientation="vertical"
position="38.975184"
id="guide2200" />
<sodipodi:guide
orientation="horizontal"
position="22.988281"
id="guide2202" />
<sodipodi:guide
orientation="vertical"
position="23.908786"
id="guide2204" />
<sodipodi:guide
orientation="vertical"
position="157.99417"
id="guide4332" />
<sodipodi:guide
orientation="horizontal"
position="-36.062446"
id="guide4334" />
<sodipodi:guide
orientation="horizontal"
position="-58.02695"
id="guide4336" />
<sodipodi:guide
orientation="vertical"
position="180.00287"
id="guide4338" />
<sodipodi:guide
orientation="vertical"
position="107.92217"
id="guide4417" />
<sodipodi:guide
orientation="vertical"
position="129.93087"
id="guide4419" />
<sodipodi:guide
orientation="horizontal"
position="19.996875"
id="guide5106" />
<sodipodi:guide
orientation="horizontal"
position="63.039674"
id="guide5119" />
<sodipodi:guide
orientation="horizontal"
position="49.066305"
id="guide5121" />
<sodipodi:guide
orientation="horizontal"
position="-86.007168"
id="guide5307" />
<sodipodi:guide
orientation="horizontal"
position="-108.09009"
id="guide5309" />
<sodipodi:guide
orientation="horizontal"
position="-100.15429"
id="guide3111" />
<inkscape:grid
id="GridFromPre046Settings"
type="xygrid"
originx="0px"
originy="0px"
spacingx="0.5px"
spacingy="0.5px"
color="#0000ff"
empcolor="#0000ff"
opacity="0.2"
empopacity="0.4"
empspacing="2" />
</sodipodi:namedview>
<metadata
id="metadata1312">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Media Playback Pause</dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Lapo Calamandrei</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
<dc:subject>
<rdf:Bag>
<rdf:li>media</rdf:li>
<rdf:li>stop</rdf:li>
<rdf:li>playback</rdf:li>
<rdf:li>video</rdf:li>
<rdf:li>music</rdf:li>
</rdf:Bag>
</dc:subject>
<dc:contributor>
<cc:Agent>
<dc:title>Jakub Steiner</dc:title>
</cc:Agent>
</dc:contributor>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer"
style="display:inline"
inkscape:r_cx="true"
inkscape:r_cy="true">
<path
style="opacity:0.15;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3430);stroke-width:1.99999952;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
d="M 14.00382,12.829103 L 14.00382,34.982359 L 35.000004,34.982359 L 35.000004,12.829103 L 14.00382,12.829103 z "
id="path2815"
inkscape:r_cx="true"
inkscape:r_cy="true" />
<path
inkscape:r_cy="true"
inkscape:r_cx="true"
style="color:#000000;fill:url(#radialGradient3427);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
d="M 14.5,13.40575 L 14.5,34.40575 L 34.5,34.40575 L 34.5,13.40575 L 14.5,13.40575 z "
id="path2827" />
<path
inkscape:r_cy="true"
inkscape:r_cx="true"
id="path2762"
d="M 14.496737,13.407946 L 14.496737,34.50001 L 34.487808,34.50001 L 34.487808,13.407946 L 14.496737,13.407946 z "
style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3424);stroke-width:0.99999952;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
<path
inkscape:r_cy="true"
inkscape:r_cx="true"
style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3421);stroke-width:0.99999976;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
d="M 15.499412,14.40575 L 15.499412,33.40575 L 33.500595,33.40575 L 33.500595,14.40575 L 15.499412,14.40575 z "
id="path2811" />
<path
style="opacity:0.5;color:#000000;fill:#f7f7f7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
d="M 16,14.942758 L 16,25.5 L 33,22.70967 L 33,14.85437 L 16,14.942758 z "
id="path2479"
inkscape:r_cx="true"
inkscape:r_cy="true"
sodipodi:nodetypes="ccccc" />
</g>
</svg>
<svg height="24.153255" width="22.996183" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientTransform="matrix(3.000198 0 0 1 -80.00982 -11.923363)" gradientUnits="userSpaceOnUse" x1="15.089521" x2="14" y1="15.291994" y2="52.510574"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></linearGradient><linearGradient id="b" gradientTransform="matrix(2.498884 0 0 1.004384 -427.06562 -83.291603)" gradientUnits="userSpaceOnUse" x1="169" x2="169" y1="110.33805" y2="93.204849"><stop offset="0" stop-color="#babdb6"/><stop offset="1" stop-color="#555753"/></linearGradient><radialGradient id="c" cx="169.77171" cy="100.20107" gradientTransform="matrix(.00000891 -1.07205 4.98026 -.00000125 -503.78302 200.8658)" gradientUnits="userSpaceOnUse" r="11"><stop offset="0" stop-color="#f7f7f7"/><stop offset="1" stop-color="#ccd0c7"/></radialGradient><linearGradient id="d" gradientTransform="matrix(2.624525 0 0 1.054917 -449.10572 -88.140483)" gradientUnits="userSpaceOnUse" x1="174.83363" x2="174.74524" y1="84.263489" y2="105.49083"><stop offset="0"/><stop offset="1" stop-color="#fff" stop-opacity=".484536"/></linearGradient><path d="m1 1v22.153256h20.996184v-22.153256z" style="opacity:.15;fill:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke:url(#d)"/><path d="m1.49618 1.576647v21h20v-21z" fill="url(#c)" fill-rule="evenodd"/><path d="m1.492917 1.578843v21.092064h19.991071v-21.092064z" fill="none" stroke="url(#b)" stroke-linecap="square" stroke-linejoin="round"/><path d="m2.495592 2.576647v19h18.001183v-19z" fill="none" stroke="url(#a)" stroke-linecap="square"/><path d="m2.99618 3.113655v10.557242l17-2.79033v-7.8553z" display="block" fill="#f7f7f7" opacity=".5"/></svg>

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -1,271 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48px"
height="48px"
id="svg4198"
sodipodi:version="0.32"
inkscape:version="0.46"
sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/actions"
sodipodi:docname="format-justify-left.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs4200">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 24 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="48 : 24 : 1"
inkscape:persp3d-origin="24 : 16 : 1"
id="perspective37" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient5060"
id="radialGradient5031"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
cx="605.71429"
cy="486.64789"
fx="605.71429"
fy="486.64789"
r="117.14286" />
<linearGradient
inkscape:collect="always"
id="linearGradient5060">
<stop
style="stop-color:black;stop-opacity:1;"
offset="0"
id="stop5062" />
<stop
style="stop-color:black;stop-opacity:0;"
offset="1"
id="stop5064" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient5060"
id="radialGradient5029"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
cx="605.71429"
cy="486.64789"
fx="605.71429"
fy="486.64789"
r="117.14286" />
<linearGradient
id="linearGradient5048">
<stop
style="stop-color:black;stop-opacity:0;"
offset="0"
id="stop5050" />
<stop
id="stop5056"
offset="0.5"
style="stop-color:black;stop-opacity:1;" />
<stop
style="stop-color:black;stop-opacity:0;"
offset="1"
id="stop5052" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5048"
id="linearGradient5027"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
x1="302.85715"
y1="366.64789"
x2="302.85715"
y2="609.50507" />
<linearGradient
inkscape:collect="always"
id="linearGradient3558">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop3560" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop3562" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3558"
id="radialGradient3564"
cx="22.571428"
cy="30.857143"
fx="22.571428"
fy="30.857143"
r="15.571428"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.651376,4.638648e-15,10.75754)"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient15218">
<stop
style="stop-color:#f8f8f7;stop-opacity:1;"
offset="0"
id="stop15220" />
<stop
id="stop2269"
offset="0.59928656"
style="stop-color:#e8e8e8;stop-opacity:1;" />
<stop
style="stop-color:#e2e2de;stop-opacity:1;"
offset="1"
id="stop15222" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient15218"
id="linearGradient2240"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.342704,0.000000,0.000000,1.235378,-8.219611,-6.577189)"
x1="20.794008"
y1="18.378813"
x2="35.596001"
y2="39.60046" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#bebebe"
borderopacity="1.0000000"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.313708"
inkscape:cx="25.107118"
inkscape:cy="27.632093"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="1280"
inkscape:window-height="818"
inkscape:window-x="0"
inkscape:window-y="30"
inkscape:showpageshadow="false" />
<metadata
id="metadata4203">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Justify Left</dc:title>
<dc:date>2005-10-29</dc:date>
<dc:creator>
<cc:Agent>
<dc:title>Andreas Nilsson</dc:title>
</cc:Agent>
</dc:creator>
<dc:subject>
<rdf:Bag>
<rdf:li>justify</rdf:li>
<rdf:li>left</rdf:li>
</rdf:Bag>
</dc:subject>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<g
style="display:inline"
id="g5022"
transform="matrix(2.330573e-2,0,0,1.227058e-2,44.47891,44.41691)">
<rect
y="-150.69685"
x="-1559.2523"
height="478.35718"
width="1339.6335"
id="rect4173"
style="opacity:0.40206185;color:black;fill:url(#linearGradient5027);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
<path
sodipodi:nodetypes="cccc"
id="path5058"
d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
style="opacity:0.40206185;color:black;fill:url(#radialGradient5029);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
<path
style="opacity:0.40206185;color:black;fill:url(#radialGradient5031);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
id="path5018"
sodipodi:nodetypes="cccc" />
</g>
<rect
style="opacity:1;fill:url(#linearGradient2240);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4238"
width="38.996792"
height="45.003101"
x="4.5016017"
y="1.4968988"
rx="0.56650788"
ry="0.56650823" />
<rect
style="opacity:1;color:#000000;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
id="rect4248"
width="27"
height="2"
x="9"
y="10" />
<rect
y="16"
x="9"
height="2"
width="25"
id="rect4250"
style="opacity:1;color:#000000;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
<rect
style="opacity:1;color:#000000;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
id="rect4252"
width="22.971531"
height="2"
x="9"
y="22" />
<rect
y="28"
x="9"
height="2"
width="27"
id="rect4254"
style="opacity:1;color:#000000;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
<rect
style="opacity:1;color:#000000;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
id="rect4256"
width="17"
height="2"
x="9"
y="34" />
<rect
style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect2245"
width="37.025566"
height="43.022316"
x="5.4997125"
y="2.4997177"
rx="0"
ry="0" />
</g>
</svg>
<svg height="47.440594" width="47.320744" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><radialGradient id="a" cx="605.71429" cy="486.64789" gradientTransform="matrix(-2.774389 0 0 1.969706 112.7623 -872.8854)" gradientUnits="userSpaceOnUse" r="117.14286" xlink:href="#b"/><linearGradient id="b"><stop offset="0"/><stop offset="1" stop-opacity="0"/></linearGradient><radialGradient id="c" cx="605.71429" cy="486.64789" gradientTransform="matrix(2.774389 0 0 1.969706 -1891.633 -872.8854)" gradientUnits="userSpaceOnUse" r="117.14286" xlink:href="#b"/><linearGradient id="d" gradientTransform="matrix(2.774389 0 0 1.969706 -1892.179 -872.8854)" gradientUnits="userSpaceOnUse" x1="302.85715" x2="302.85715" y1="366.64789" y2="609.50507"><stop offset="0" stop-opacity="0"/><stop offset=".5"/><stop offset="1" stop-opacity="0"/></linearGradient><linearGradient id="e" gradientTransform="matrix(1.342704 0 0 1.235378 -8.219611 -6.577189)" gradientUnits="userSpaceOnUse" x1="20.794008" x2="35.596001" y1="18.378813" y2="39.60046"><stop offset="0" stop-color="#f8f8f7"/><stop offset=".59928656" stop-color="#e8e8e8"/><stop offset="1" stop-color="#e2e2de"/></linearGradient><g transform="matrix(.02330573 0 0 .01227058 44.389317 43.420011)"><path d="m-1559.2523-150.69685h1339.6335v478.35718h-1339.6335z" fill="url(#d)" opacity=".402062"/><path d="m-219.61876-150.68038v478.33079c142.874166.90045 345.40022-107.16966 345.40014-239.196175 0-132.026537-159.436816-239.134595-345.40014-239.134615z" fill="url(#c)" opacity=".402062"/><path d="m-1559.2523-150.68038v478.33079c-142.8742.90045-345.4002-107.16966-345.4002-239.196175 0-132.026537 159.4368-239.134595 345.4002-239.134615z" fill="url(#a)" opacity=".402062"/></g><g fill-rule="evenodd" transform="translate(-.089593 -.996899)"><rect fill="url(#e)" height="45.003101" rx=".566508" stroke="#888a85" width="38.996792" x="4.501602" y="1.496899"/><g fill="#999"><path d="m9 10h27v2h-27z"/><path d="m9 16h25v2h-25z"/><path d="m9 22h22.971531v2h-22.971531z"/><path d="m9 28h27v2h-27z"/><path d="m9 34h17v2h-17z"/></g></g><path d="m5.4101199 1.502819h37.0255661v43.022316h-37.0255661z" fill="none" stroke="#fff"/></svg>

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -1,196 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
sodipodi:docname="go-up.svg"
sodipodi:docbase="/home/tigert/cvs/freedesktop.org/tango-icon-theme/scalable/actions"
inkscape:version="0.46"
sodipodi:version="0.32"
id="svg11300"
height="48px"
width="48px"
inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
inkscape:export-xdpi="90.000000"
inkscape:export-ydpi="90.000000"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs3">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 24 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="48 : 24 : 1"
inkscape:persp3d-origin="24 : 16 : 1"
id="perspective23" />
<linearGradient
id="linearGradient2304">
<stop
id="stop2306"
offset="0"
style="stop-color:#73d216" />
<stop
id="stop2308"
offset="1.0000000"
style="stop-color:#4e9a06" />
</linearGradient>
<linearGradient
id="linearGradient8662"
inkscape:collect="always">
<stop
id="stop8664"
offset="0"
style="stop-color:#000000;stop-opacity:1;" />
<stop
id="stop8666"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient8650"
inkscape:collect="always">
<stop
id="stop8652"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop8654"
offset="1"
style="stop-color:#ffffff;stop-opacity:0;" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8650"
id="radialGradient1438"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-3.749427e-16,-2.046729,1.557610,-2.853404e-16,2.767009,66.93275)"
cx="24.53788"
cy="0.40010813"
fx="24.53788"
fy="0.40010813"
r="17.171415" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2304"
id="radialGradient1441"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.871885e-16,-0.843022,1.020168,2.265228e-16,0.606436,42.58614)"
cx="11.319205"
cy="22.454971"
fx="11.319205"
fy="22.454971"
r="16.956199" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8662"
id="radialGradient1444"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.536723,1.614716e-15,16.87306)"
cx="24.837126"
cy="36.421127"
fx="24.837126"
fy="36.421127"
r="15.644737" />
</defs>
<sodipodi:namedview
inkscape:window-y="30"
inkscape:window-x="0"
inkscape:window-height="818"
inkscape:window-width="1280"
inkscape:showpageshadow="false"
inkscape:document-units="px"
inkscape:grid-bbox="true"
showgrid="false"
inkscape:current-layer="layer1"
inkscape:cy="25.620377"
inkscape:cx="9.6380363"
inkscape:zoom="13.059378"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
borderopacity="0.25490196"
bordercolor="#666666"
pagecolor="#ffffff"
id="base"
fill="#73d216"
stroke="#73d216" />
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Steiner</dc:title>
</cc:Agent>
</dc:creator>
<dc:source>http://jimmac.musichall.cz</dc:source>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
<dc:title>Go Up</dc:title>
<dc:subject>
<rdf:Bag>
<rdf:li>go</rdf:li>
<rdf:li>higher</rdf:li>
<rdf:li>up</rdf:li>
<rdf:li>arrow</rdf:li>
<rdf:li>pointer</rdf:li>
<rdf:li>&gt;</rdf:li>
</rdf:Bag>
</dc:subject>
<dc:contributor>
<cc:Agent>
<dc:title>Andreas Nilsson</dc:title>
</cc:Agent>
</dc:contributor>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
inkscape:label="Layer 1"
id="layer1">
<path
transform="matrix(1.214466,0.000000,0.000000,0.595458,-6.163846,16.31275)"
d="M 40.481863 36.421127 A 15.644737 8.3968935 0 1 1 9.1923885,36.421127 A 15.644737 8.3968935 0 1 1 40.481863 36.421127 z"
sodipodi:ry="8.3968935"
sodipodi:rx="15.644737"
sodipodi:cy="36.421127"
sodipodi:cx="24.837126"
id="path8660"
style="opacity:0.29946521;color:#000000;fill:url(#radialGradient1444);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
sodipodi:type="arc" />
<path
sodipodi:nodetypes="cccccccc"
id="path8643"
d="M 14.491792,38.500000 L 32.469477,38.500000 L 32.469477,25.547437 L 40.500000,25.547437 L 23.374809,5.4992135 L 6.5285585,25.489471 L 14.497096,25.555762 L 14.491792,38.500000 z "
style="opacity:1.0000000;color:#000000;fill:url(#radialGradient1441);fill-opacity:1.0000000;fill-rule:evenodd;stroke:#3a7304;stroke-width:1.0000004;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
<path
sodipodi:nodetypes="cccscc"
id="path8645"
d="M 7.5855237,25.03253 L 14.995821,25.03253 L 15.062422,31.594339 C 20.718034,20.593878 31.055517,22.749928 31.656768,15.966674 C 31.656768,15.966674 23.366938,6.4219692 23.366938,6.4219692 L 7.5855237,25.03253 z "
style="opacity:0.50802141;color:#000000;fill:url(#radialGradient1438);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
<path
style="opacity:0.48128340;color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.0000004;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
d="M 15.602735,37.500000 L 31.502578,37.500000 L 31.502578,24.507050 L 38.311576,24.507050 L 23.361206,7.0700896 L 8.6546798,24.550470 L 15.475049,24.528373 L 15.602735,37.500000 z "
id="path8658"
sodipodi:nodetypes="cccccccc" />
</g>
</svg>
<svg height="38.000759" width="38.000004" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><radialGradient id="a" cx="24.53788" cy=".400108" gradientTransform="matrix(0 -2.046729 1.55761 0 2.767009 66.93275)" gradientUnits="userSpaceOnUse" r="17.171415"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></radialGradient><radialGradient id="b" cx="11.319205" cy="22.454971" gradientTransform="matrix(0 -.843022 1.020168 0 .606436 42.58614)" gradientUnits="userSpaceOnUse" r="16.9562"><stop offset="0" stop-color="#73d216"/><stop offset="1" stop-color="#4e9a06"/></radialGradient><radialGradient id="c" cx="24.837126" cy="36.421127" gradientTransform="matrix(1 0 0 .536723 0 16.87306)" gradientUnits="userSpaceOnUse" r="15.644737"><stop offset="0"/><stop offset="1" stop-opacity="0"/></radialGradient><g fill-rule="evenodd" transform="translate(-4.999997 -4.999241)"><path d="m40.481863 36.421127a15.644737 8.3968937 0 1 1 -31.2894745 0 15.644737 8.3968937 0 1 1 31.2894745 0z" fill="url(#c)" opacity=".299465" transform="matrix(1.214466 0 0 .595458 -6.163846 16.31275)"/><path d="m14.491792 38.5h17.977685v-12.952563h8.030523l-17.125191-20.0482235-16.8462505 19.9902575 7.9685375.06629z" fill="url(#b)" stroke="#3a7304" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="m7.5855237 25.03253h7.4102973l.0666 6.561809c5.655612-11.000461 15.993095-8.844411 16.594346-15.627665 0 0-8.28983-9.5447048-8.28983-9.5447048z" fill="url(#a)" opacity=".508021"/></g><path d="m10.602738 32.500759h15.899843v-12.99295h6.808998l-14.95037-17.4369602-14.7065265 17.4803802 6.8203695-.0221z" fill="none" opacity=".481283" stroke="#fff" stroke-miterlimit="10"/></svg>

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 42 KiB

View File

@@ -13,48 +13,21 @@
#include <QEvent>
#include <QKeyEvent>
#include <QGraphicsScene>
#include <QPixmap>
#include <QCoreApplication>
#include <QAudioOutput>
#include <QAudioFormat>
#include <stdint.h>
#include "debugviewer.h"
#include "settingsmanager.h"
#include "statemanager.h"
/*
#if defined(Q_OS_ANDROID)
#include <android/log.h>
#endif
void printLastRun(){
static int64_t lastTime = 0;
struct timespec tms;
clock_gettime(CLOCK_REALTIME, &tms);
int64_t micros = tms.tv_sec * 1000000;
micros += tms.tv_nsec / 1000;
if(tms.tv_nsec % 1000 >= 500)
micros++;
#if defined(Q_OS_ANDROID)
__android_log_print(ANDROID_LOG_DEBUG, "Mu", "Microseconds:%lld\n", micros - lastTime);
#else
printf("Microseconds:%lld\n", micros - lastTime);
#endif
lastTime = micros;
}
*/
MainWindow::MainWindow(QWidget* parent) :
QMainWindow(parent),
ui(new Ui::MainWindow){
QAudioFormat format;
QString resourceDirPath;
//audio output
format.setSampleRate(AUDIO_SAMPLE_RATE);
@@ -70,29 +43,45 @@ MainWindow::MainWindow(QWidget* parent) :
//submodules
settings = new QSettings(QDir::homePath() + "/MuCfg.txt", QSettings::IniFormat);//settings is public, create it first
settingsManager = new SettingsManager(this);
stateManager = new StateManager(this);
emuDebugger = new DebugViewer(this);
refreshDisplay = new QTimer(this);
audioDevice = new QAudioOutput(format, this);
audioOut = audioDevice->start();
//resource directory
resourceDirPath = settings->value("resourceDirectory", "").toString();
//get default path if path not set
if(resourceDirPath == ""){
//set variables to there default if its the first boot
if(settings->value("firstBootCompleted", "").toString() == ""){
//resource dir
#if defined(Q_OS_ANDROID)
resourceDirPath = "/sdcard/Mu";
settings->setValue("resourceDirectory", "/sdcard/Mu");
#elif defined(Q_OS_IOS)
resourceDirPath = "/var/mobile/Media/Mu";
settings->setValue("resourceDirectory", "/var/mobile/Media/Mu");
#else
resourceDirPath = QDir::homePath() + "/Mu";
settings->setValue("resourceDirectory", QDir::homePath() + "/Mu");
#endif
settings->setValue("resourceDirectory", resourceDirPath);
createHomeDirectoryTree(settings->value("resourceDirectory", "").toString());
//onscreen keys
#if defined(Q_OS_ANDROID) && defined(Q_OS_IOS)
settings->setValue("hideOnscreenKeys", false);
#else
//not a mobile device disable the on screen buttons
settings->setValue("hideOnscreenKeys", true);
#endif
//skip boot screen, most users dont want to wait 5 seconds on boot
settings->setValue("fastBoot", true);
settings->setValue("palmOsVersion", 4);
//dont run this function again unless the config is deleted
settings->setValue("firstBootCompleted", true);
}
//create directory tree, in case someone deleted it since the emu was last run or it was never created
createHomeDirectoryTree(resourceDirPath);
//keyboard
for(uint8_t index = 0; index < EmuWrapper::BUTTON_TOTAL_COUNT; index++)
keyForButton[index] = settings->value("palmButton" + QString::number(index) + "Key", '\0').toInt();
//GUI
ui->setupUi(this);
@@ -101,26 +90,33 @@ MainWindow::MainWindow(QWidget* parent) :
ui->centralWidget->installEventFilter(this);
ui->centralWidget->setObjectName("centralWidget");
ui->calendar->installEventFilter(this);
ui->addressBook->installEventFilter(this);
ui->todo->installEventFilter(this);
ui->notes->installEventFilter(this);
ui->up->installEventFilter(this);
ui->down->installEventFilter(this);
ui->left->installEventFilter(this);
ui->right->installEventFilter(this);
ui->center->installEventFilter(this);
ui->calendar->installEventFilter(this);
ui->addressBook->installEventFilter(this);
ui->todo->installEventFilter(this);
ui->notes->installEventFilter(this);
ui->voiceMemo->installEventFilter(this);
ui->power->installEventFilter(this);
ui->ctrlBtn->installEventFilter(this);
ui->reset->installEventFilter(this);
ui->stateManager->installEventFilter(this);
ui->screenshot->installEventFilter(this);
ui->settings->installEventFilter(this);
ui->install->installEventFilter(this);
ui->debugger->installEventFilter(this);
ui->screenshot->installEventFilter(this);
ui->stateManager->installEventFilter(this);
ui->bootApp->installEventFilter(this);
redraw();
#if !defined(EMU_DEBUG) || defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
//doesnt support debug tools
ui->debugger->hide();
#endif
connect(refreshDisplay, SIGNAL(timeout()), this, SLOT(updateDisplay()));
@@ -137,35 +133,20 @@ MainWindow::~MainWindow(){
delete ui;
}
bool MainWindow::eventFilter(QObject* object, QEvent* event){
if(event->type() == QEvent::Resize){
if(QString(object->metaObject()->className()) == "QPushButton"){
QPushButton* button = (QPushButton*)object;
void MainWindow::keyPressEvent(QKeyEvent* event){
int key = event->key();
button->setIconSize(QSize(button->size().width() / 1.7, button->size().height() / 1.7));
}
for(uint8_t index = 0; index < EmuWrapper::BUTTON_TOTAL_COUNT; index++)
if(keyForButton[index] == key)
emu.setKeyValue(index, true);
}
if(object->objectName() == "centralWidget"){
float smallestRatio;
void MainWindow::keyReleaseEvent(QKeyEvent* event){
int key = event->key();
//update displayContainer first, make the display occupy the top 2/3 of the screen
ui->displayContainer->setFixedHeight(ui->centralWidget->height() * 0.66);
smallestRatio = qMin(ui->displayContainer->size().width() * 0.98 / 3.0 , ui->displayContainer->size().height() * 0.98 / 4.0);
//the 0.98 above allows the display to shrink, without it the displayContainer couldent shrink because of the fixed size of the display
//set new size
ui->display->setFixedSize(smallestRatio * 3.0, smallestRatio * 4.0);
//scale framebuffer to new size and refresh
if(emu.isInited()){
ui->display->setPixmap(emu.getFramebuffer().scaled(QSize(ui->display->size().width(), ui->display->size().height()), Qt::KeepAspectRatio, Qt::SmoothTransformation));
ui->display->update();
}
}
}
return QMainWindow::eventFilter(object, event);
for(uint8_t index = 0; index < EmuWrapper::BUTTON_TOTAL_COUNT; index++)
if(keyForButton[index] == key)
emu.setKeyValue(index, false);
}
void MainWindow::createHomeDirectoryTree(const QString& path){
@@ -173,7 +154,6 @@ void MainWindow::createHomeDirectoryTree(const QString& path){
//creates directorys if not present, does nothing if they exist already
homeDir.mkpath(".");
homeDir.mkpath("./saveStates");
homeDir.mkpath("./screenshots");
homeDir.mkpath("./debugDumps");
}
@@ -186,18 +166,64 @@ void MainWindow::popupInformationDialog(const QString& info){
QMessageBox::information(this, "Mu", info, QMessageBox::Ok);
}
void MainWindow::selectHomePath(){
QString homeDirPath = QFileDialog::getOpenFileName(this, "New Home Directory(\"~/Mu\" is default)", QDir::root().path(), nullptr);
void MainWindow::redraw(){
bool hideOnscreenKeys = settings->value("hideOnscreenKeys", false).toBool();
QResizeEvent* resizeEvent = new QResizeEvent(ui->centralWidget->size(), ui->centralWidget->size());
createHomeDirectoryTree(homeDirPath);
settings->setValue("resourceDirectory", homeDirPath);
//update current keys
ui->up->setHidden(hideOnscreenKeys);
ui->down->setHidden(hideOnscreenKeys);
ui->left->setHidden(hideOnscreenKeys);
ui->right->setHidden(hideOnscreenKeys);
ui->center->setHidden(hideOnscreenKeys);
ui->calendar->setHidden(hideOnscreenKeys);
ui->addressBook->setHidden(hideOnscreenKeys);
ui->todo->setHidden(hideOnscreenKeys);
ui->notes->setHidden(hideOnscreenKeys);
ui->voiceMemo->setHidden(hideOnscreenKeys);
ui->power->setHidden(hideOnscreenKeys);
//update current size
QCoreApplication::postEvent(ui->centralWidget, resizeEvent);
}
bool MainWindow::eventFilter(QObject* object, QEvent* event){
if(event->type() == QEvent::Resize){
if(QString(object->metaObject()->className()) == "QPushButton"){
QPushButton* button = (QPushButton*)object;
button->setIconSize(QSize(button->size().width() / 1.7, button->size().height() / 1.7));
}
if(object->objectName() == "centralWidget"){
float smallestRatio;
bool hideOnscreenKeys = settings->value("hideOnscreenKeys", false).toBool();
//update displayContainer first, make the display occupy the top 3/5 of the screen if there are Palm keys or 4/5 if theres not
ui->displayContainer->setFixedHeight(ui->centralWidget->height() * (hideOnscreenKeys ? 0.80 : 0.60));
smallestRatio = qMin(ui->displayContainer->size().width() * 0.98 / 3.0 , ui->displayContainer->size().height() * 0.98 / 4.0);
//the 0.98 above allows the display to shrink, without it the displayContainer couldnt shrink because of the fixed size of the display
//set new size
ui->display->setFixedSize(smallestRatio * 3.0, smallestRatio * 4.0);
//scale framebuffer to new size and refresh
if(emu.isInited())
ui->display->repaint();
}
}
return QMainWindow::eventFilter(object, event);
}
//display
void MainWindow::updateDisplay(){
if(emu.newFrameReady()){
//video, this is doing bilinear filitering in software, this is why the Qt port is broken on Android, move this to a new thread if possible
ui->display->setPixmap(emu.getFramebuffer().scaled(ui->display->size().width(), ui->display->size().height(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
//video
ui->display->repaint();
//audio
audioOut->write((const char*)emu.getAudioSamples(), AUDIO_SAMPLES_PER_FRAME * 2/*channels*/ * sizeof(int16_t));
@@ -207,115 +233,132 @@ void MainWindow::updateDisplay(){
//allow next frame to start
emu.frameHandled();
//update GUI
ui->display->repaint();
ui->powerButtonLed->repaint();
}
//printLastRun();
}
//Palm buttons
void MainWindow::on_power_pressed(){
emu.emuInput.buttonPower = true;
emu.setKeyValue(EmuWrapper::BUTTON_POWER, true);
}
void MainWindow::on_power_released(){
emu.emuInput.buttonPower = false;
emu.setKeyValue(EmuWrapper::BUTTON_POWER, false);
}
void MainWindow::on_calendar_pressed(){
emu.emuInput.buttonCalendar = true;
emu.setKeyValue(EmuWrapper::BUTTON_CALENDAR, true);
}
void MainWindow::on_calendar_released(){
emu.emuInput.buttonCalendar = false;
emu.setKeyValue(EmuWrapper::BUTTON_CALENDAR, false);
}
void MainWindow::on_addressBook_pressed(){
emu.emuInput.buttonAddress = true;
emu.setKeyValue(EmuWrapper::BUTTON_ADDRESS, true);
}
void MainWindow::on_addressBook_released(){
emu.emuInput.buttonAddress = false;
emu.setKeyValue(EmuWrapper::BUTTON_ADDRESS, false);
}
void MainWindow::on_todo_pressed(){
emu.emuInput.buttonTodo = true;
emu.setKeyValue(EmuWrapper::BUTTON_TODO, true);
}
void MainWindow::on_todo_released(){
emu.emuInput.buttonTodo = false;
emu.setKeyValue(EmuWrapper::BUTTON_TODO, false);
}
void MainWindow::on_voiceMemo_pressed(){
emu.setKeyValue(EmuWrapper::BUTTON_VOICE_MEMO, false);
}
void MainWindow::on_voiceMemo_released(){
emu.setKeyValue(EmuWrapper::BUTTON_VOICE_MEMO, false);
}
void MainWindow::on_notes_pressed(){
emu.emuInput.buttonNotes = true;
emu.setKeyValue(EmuWrapper::BUTTON_NOTES, true);
}
void MainWindow::on_notes_released(){
emu.emuInput.buttonNotes = false;
emu.setKeyValue(EmuWrapper::BUTTON_NOTES, false);
}
void MainWindow::on_up_pressed(){
emu.emuInput.buttonUp = true;
emu.setKeyValue(EmuWrapper::BUTTON_UP, true);
}
void MainWindow::on_up_released(){
emu.emuInput.buttonUp = false;
emu.setKeyValue(EmuWrapper::BUTTON_UP, false);
}
void MainWindow::on_down_pressed(){
emu.emuInput.buttonDown = true;
emu.setKeyValue(EmuWrapper::BUTTON_DOWN, true);
}
void MainWindow::on_down_released(){
emu.emuInput.buttonDown = false;
emu.setKeyValue(EmuWrapper::BUTTON_DOWN, false);
}
void MainWindow::on_left_pressed(){
emu.emuInput.buttonLeft = true;
emu.setKeyValue(EmuWrapper::BUTTON_LEFT, true);
}
void MainWindow::on_left_released(){
emu.emuInput.buttonLeft = false;
emu.setKeyValue(EmuWrapper::BUTTON_LEFT, false);
}
void MainWindow::on_right_pressed(){
emu.emuInput.buttonRight = true;
emu.setKeyValue(EmuWrapper::BUTTON_RIGHT, true);
}
void MainWindow::on_right_released(){
emu.emuInput.buttonRight = false;
emu.setKeyValue(EmuWrapper::BUTTON_RIGHT, false);
}
void MainWindow::on_center_pressed(){
emu.setKeyValue(EmuWrapper::BUTTON_CENTER, true);
}
void MainWindow::on_center_released(){
emu.setKeyValue(EmuWrapper::BUTTON_CENTER, false);
}
//emu control
void MainWindow::on_ctrlBtn_clicked(){
if(!emu.isInited()){
QString sysDir = settings->value("resourceDirectory", "").toString();
uint32_t error = emu.init(sysDir + "/palmos41-en-m515.rom", QFile(sysDir + "/bootloader-en-m515.rom").exists() ? sysDir + "/bootloader-en-m515.rom" : "", sysDir + "/userdata-en-m515.ram", sysDir + "/sd-en-m515.img", FEATURE_CUSTOM_FB | FEATURE_DEBUG);
uint32_t error = emu.init(sysDir, settings->value("palmOsVersion", false).toInt(), settings->value("featureSyncedRtc", false).toBool(), settings->value("featureDurable", false).toBool(), settings->value("fastBoot", false).toBool());
if(error == EMU_ERROR_NONE){
emu.setCpuSpeed(settings->value("cpuSpeed", 1.00).toDouble());
ui->up->setEnabled(true);
ui->down->setEnabled(true);
if(settings->value("palmOsVersion", false).toInt() > 4){
ui->left->setEnabled(true);
ui->right->setEnabled(true);
ui->center->setEnabled(true);
}
ui->calendar->setEnabled(true);
ui->addressBook->setEnabled(true);
ui->todo->setEnabled(true);
ui->notes->setEnabled(true);
ui->up->setEnabled(true);
ui->down->setEnabled(true);
if(settings->value("palmOsVersion", false).toInt() > 4)
ui->voiceMemo->setEnabled(true);
ui->power->setEnabled(true);
/*
//if FEATURE_EXT_KEYS enabled add OS 5 buttons
ui->left->setEnabled(true);
ui->right->setEnabled(true);
ui->center->setEnabled(true);
*/
ui->screenshot->setEnabled(true);
ui->install->setEnabled(true);
ui->stateManager->setEnabled(true);
ui->debugger->setEnabled(true);
ui->reset->setEnabled(true);
ui->bootApp->setEnabled(true);
ui->ctrlBtn->setIcon(QIcon(":/buttons/images/pause.svg"));
}
@@ -331,20 +374,29 @@ void MainWindow::on_ctrlBtn_clicked(){
emu.resume();
ui->ctrlBtn->setIcon(QIcon(":/buttons/images/pause.svg"));
}
ui->ctrlBtn->repaint();
}
void MainWindow::on_install_clicked(){
if(emu.isInited()){
QString app = QFileDialog::getOpenFileName(this, "Open *.prc/pdb/pqa", QDir::root().path(), nullptr);
QString app;
bool loadedNewApp = false;
bool wasPaused = emu.isPaused();
if(!wasPaused)
emu.pause();
app = QFileDialog::getOpenFileName(this, "Select File", QDir::root().path(), "Palm OS File (*.prc *.pdb *.pqa)");
if(app != ""){
uint32_t error = emu.installApplication(app);
if(error != EMU_ERROR_NONE)
if(error == EMU_ERROR_NONE)
loadedNewApp = true;
else
popupErrorDialog("Could not install app, Error:" + QString::number(error));
}
if(!wasPaused || loadedNewApp)
emu.resume();
}
}
@@ -352,7 +404,6 @@ void MainWindow::on_debugger_clicked(){
if(emu.isInited()){
emu.pause();
ui->ctrlBtn->setIcon(QIcon(":/buttons/images/play.svg"));
ui->ctrlBtn->repaint();
emuDebugger->exec();
}
}
@@ -362,7 +413,7 @@ void MainWindow::on_screenshot_clicked(){
qlonglong screenshotNumber = settings->value("screenshotNum", 0).toLongLong();
QString screenshotPath = settings->value("resourceDirectory", "").toString() + "/screenshots/screenshot" + QString::number(screenshotNumber, 10) + ".png";
emu.getFramebuffer().save(screenshotPath, "PNG", 100);
emu.getFramebufferImage().save(screenshotPath, "PNG", 100);
screenshotNumber++;
settings->setValue("screenshotNum", screenshotNumber);
}
@@ -381,3 +432,51 @@ void MainWindow::on_stateManager_clicked(){
emu.resume();
}
}
void MainWindow::on_reset_clicked(){
emu.reset(false);
}
void MainWindow::on_settings_clicked(){
bool wasInited = emu.isInited();
bool wasPaused = emu.isPaused();
if(wasInited && !wasPaused)
emu.pause();
settingsManager->exec();
//redraw the main window
redraw();
//update keyboard settings too
for(uint8_t index = 0; index < EmuWrapper::BUTTON_TOTAL_COUNT; index++)
keyForButton[index] = settings->value("palmButton" + QString::number(index) + "Key", '\0').toInt();
if(wasInited && !wasPaused)
emu.resume();
}
void MainWindow::on_bootApp_clicked(){
if(emu.isInited()){
QString app;
bool loadedNewApp = false;
bool wasPaused = emu.isPaused();
if(!wasPaused)
emu.pause();
app = QFileDialog::getOpenFileName(this, "Select File", QDir::root().path(), "Palm OS File (*.prc *.pqa *.img)");
if(app != ""){
uint32_t error = emu.bootFromFile(app);
if(error == EMU_ERROR_NONE)
loadedNewApp = true;
else
popupErrorDialog("Could not boot app, Error:" + QString::number(error));
}
if(!wasPaused || loadedNewApp)
emu.resume();
}
}

View File

@@ -9,8 +9,10 @@
#include <QSettings>
#include <QAudioOutput>
#include <QIODevice>
#include <QKeyEvent>
#include "emuwrapper.h"
#include "settingsmanager.h"
#include "statemanager.h"
#include "debugviewer.h"
@@ -28,14 +30,20 @@ public:
explicit MainWindow(QWidget* parent = nullptr);
~MainWindow();
private:
protected:
void keyPressEvent(QKeyEvent* event);
void keyReleaseEvent(QKeyEvent* event);
public:
void createHomeDirectoryTree(const QString& path);
private:
void popupErrorDialog(const QString& error);
void popupInformationDialog(const QString& info);
void redraw();
private slots:
bool eventFilter(QObject* object, QEvent* event);
void popupErrorDialog(const QString& error);
void popupInformationDialog(const QString& info);
void selectHomePath();
//display
void updateDisplay();
@@ -51,6 +59,8 @@ private slots:
void on_todo_released();
void on_notes_pressed();
void on_notes_released();
void on_voiceMemo_pressed();
void on_voiceMemo_released();
void on_up_pressed();
void on_up_released();
void on_down_pressed();
@@ -59,6 +69,8 @@ private slots:
void on_left_released();
void on_right_pressed();
void on_right_released();
void on_center_pressed();
void on_center_released();
//frontend buttons
void on_ctrlBtn_clicked();
@@ -66,12 +78,17 @@ private slots:
void on_debugger_clicked();
void on_screenshot_clicked();
void on_stateManager_clicked();
void on_reset_clicked();
void on_settings_clicked();
void on_bootApp_clicked();
private:
StateManager* stateManager;
DebugViewer* emuDebugger;
QTimer* refreshDisplay;
QAudioOutput* audioDevice;
QIODevice* audioOut;
Ui::MainWindow* ui;
SettingsManager* settingsManager;
StateManager* stateManager;
DebugViewer* emuDebugger;
QTimer* refreshDisplay;
QAudioOutput* audioDevice;
QIODevice* audioOut;
Ui::MainWindow* ui;
int keyForButton[EmuWrapper::BUTTON_TOTAL_COUNT];
};

View File

@@ -2,20 +2,24 @@
<qresource prefix="/buttons">
<file>images/addressBook.svg</file>
<file>images/calendar.svg</file>
<file>images/center.svg</file>
<file>images/debugger.svg</file>
<file>images/down.svg</file>
<file>images/install.svg</file>
<file>images/left.svg</file>
<file>images/notes.svg</file>
<file>images/pause.svg</file>
<file>images/play.svg</file>
<file>images/power.svg</file>
<file>images/right.svg</file>
<file>images/screenshot.svg</file>
<file>images/stateManager.svg</file>
<file>images/stop.svg</file>
<file>images/todo.svg</file>
<file>images/up.svg</file>
<file>images/reset.svg</file>
<file>images/settingsManager.svg</file>
<file>images/center.svg</file>
<file>images/left.svg</file>
<file>images/right.svg</file>
<file>images/boot.svg</file>
<file>images/voiceMemo.svg</file>
</qresource>
</RCC>

View File

@@ -43,7 +43,7 @@
<number>0</number>
</property>
<item>
<widget class="TouchScreen" name="display">
<widget class="TouchScreen" name="display" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
@@ -56,12 +56,6 @@
<height>220</height>
</size>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="indent">
<number>0</number>
</property>
</widget>
</item>
</layout>
@@ -105,31 +99,40 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/calendar.svg</normaloff>:/buttons/images/calendar.svg</iconset>
</property>
</widget>
</item>
<item row="6" column="4">
<widget class="QPushButton" name="down">
<property name="enabled">
<bool>false</bool>
</property>
<item row="0" column="0">
<widget class="QPushButton" name="ctrlBtn">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="toolTip">
<string>Run/Pause</string>
</property>
<property name="styleSheet">
<string notr="true"/>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/down.svg</normaloff>:/buttons/images/down.svg</iconset>
<normaloff>:/buttons/images/play.svg</normaloff>:/buttons/images/play.svg</iconset>
</property>
</widget>
</item>
<item row="1" column="4">
<widget class="QPushButton" name="up">
<item row="0" column="2">
<widget class="QPushButton" name="reset">
<property name="enabled">
<bool>false</bool>
</property>
@@ -139,9 +142,166 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="toolTip">
<string>Reset</string>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/up.svg</normaloff>:/buttons/images/up.svg</iconset>
<normaloff>:/buttons/images/reset.svg</normaloff>:/buttons/images/reset.svg</iconset>
</property>
</widget>
</item>
<item row="0" column="5">
<widget class="QPushButton" name="stateManager">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="toolTip">
<string>Save/Load State</string>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/stateManager.svg</normaloff>:/buttons/images/stateManager.svg</iconset>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QPushButton" name="settings">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="toolTip">
<string>Settings</string>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/settingsManager.svg</normaloff>:/buttons/images/settingsManager.svg</iconset>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QPushButton" name="power">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/power.svg</normaloff>:/buttons/images/power.svg</iconset>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="bootApp">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="toolTip">
<string>Boot App</string>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/boot.svg</normaloff>:/buttons/images/boot.svg</iconset>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QPushButton" name="install">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="toolTip">
<string>Install App</string>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/install.svg</normaloff>:/buttons/images/install.svg</iconset>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="screenshot">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="toolTip">
<string>Snapshot</string>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/screenshot.svg</normaloff>:/buttons/images/screenshot.svg</iconset>
</property>
</widget>
</item>
<item row="0" column="6">
<widget class="QLabel" name="powerButtonLed">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="toolTip">
<string>This is an LED not a button.😜</string>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
@@ -156,12 +316,101 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/addressBook.svg</normaloff>:/buttons/images/addressBook.svg</iconset>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QPushButton" name="left">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/left.svg</normaloff>:/buttons/images/left.svg</iconset>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QPushButton" name="up">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/up.svg</normaloff>:/buttons/images/up.svg</iconset>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QPushButton" name="center">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/center.svg</normaloff>:/buttons/images/center.svg</iconset>
</property>
</widget>
</item>
<item row="6" column="2">
<widget class="QPushButton" name="down">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/down.svg</normaloff>:/buttons/images/down.svg</iconset>
</property>
</widget>
</item>
<item row="3" column="5">
<widget class="QPushButton" name="right">
<property name="enabled">
@@ -173,29 +422,18 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/right.svg</normaloff>:/buttons/images/right.svg</iconset>
</property>
</widget>
</item>
<item row="3" column="4">
<widget class="QPushButton" name="center">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/center.svg</normaloff>:/buttons/images/center.svg</iconset>
</property>
</widget>
</item>
<item row="6" column="5">
<widget class="QPushButton" name="todo">
<property name="enabled">
@@ -219,30 +457,16 @@
<height>0</height>
</size>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/todo.svg</normaloff>:/buttons/images/todo.svg</iconset>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QPushButton" name="power">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/power.svg</normaloff>:/buttons/images/power.svg</iconset>
</property>
</widget>
</item>
<item row="6" column="7">
<item row="6" column="6">
<widget class="QPushButton" name="notes">
<property name="enabled">
<bool>false</bool>
@@ -253,64 +477,16 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/notes.svg</normaloff>:/buttons/images/notes.svg</iconset>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QPushButton" name="left">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/left.svg</normaloff>:/buttons/images/left.svg</iconset>
</property>
</widget>
</item>
<item row="1" column="7">
<widget class="QPushButton" name="ctrlBtn">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="styleSheet">
<string notr="true"/>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/play.svg</normaloff>:/buttons/images/play.svg</iconset>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QPushButton" name="screenshot">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/screenshot.svg</normaloff>:/buttons/images/screenshot.svg</iconset>
</property>
</widget>
</item>
<item row="0" column="7">
<item row="1" column="5">
<widget class="QPushButton" name="debugger">
<property name="enabled">
<bool>false</bool>
@@ -321,14 +497,20 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="toolTip">
<string>Debugger</string>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/debugger.svg</normaloff>:/buttons/images/debugger.svg</iconset>
</property>
</widget>
</item>
<item row="0" column="5">
<widget class="QPushButton" name="install">
<item row="2" column="1">
<widget class="QPushButton" name="voiceMemo">
<property name="enabled">
<bool>false</bool>
</property>
@@ -340,40 +522,7 @@
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/install.svg</normaloff>:/buttons/images/install.svg</iconset>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="powerButtonLed">
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string>LED</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="1" column="5">
<widget class="QPushButton" name="stateManager">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/stateManager.svg</normaloff>:/buttons/images/stateManager.svg</iconset>
<normaloff>:/buttons/images/voiceMemo.svg</normaloff>:/buttons/images/voiceMemo.svg</iconset>
</property>
</widget>
</item>
@@ -387,8 +536,9 @@
<customwidgets>
<customwidget>
<class>TouchScreen</class>
<extends>QLabel</extends>
<extends>QWidget</extends>
<header>touchscreen.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources>

View File

@@ -0,0 +1,166 @@
#include "settingsmanager.h"
#include "ui_settingsmanager.h"
#include <QString>
#include <QFileDialog>
#include <QKeySequence>
#include <QDir>
#include <QSettings>
#include <QKeyEvent>
#include "mainwindow.h"
#include "emuwrapper.h"
SettingsManager::SettingsManager(QWidget* parent) :
QDialog(parent),
ui(new Ui::SettingsManager){
settings = ((MainWindow*)parent)->settings;
//init GUI
ui->setupUi(this);
//set all GUI items to current config values
ui->homeDirectory->setText(settings->value("resourceDirectory", "").toString());
ui->showOnscreenKeys->setChecked(!settings->value("hideOnscreenKeys", false).toBool());
ui->fastBoot->setChecked(settings->value("fastBoot", false).toBool());
ui->palmOsVersion->setValue(settings->value("palmOsVersion", false).toInt());
ui->featureSyncedRtc->setChecked(settings->value("featureSyncedRtc", false).toBool());
ui->featureDurable->setChecked(settings->value("featureDurable", false).toBool());
setKeySelectorState(-1);
updateButtonKeys();
}
SettingsManager::~SettingsManager(){
delete ui;
}
void SettingsManager::keyPressEvent(QKeyEvent* event){
//nothing, all keys are handled at the end of a press in keyReleaseEvent()
}
void SettingsManager::keyReleaseEvent(QKeyEvent* event){
if(waitingOnKeyForButton != -1){
settings->setValue("palmButton" + QString::number(waitingOnKeyForButton) + "Key", event->key());
setKeySelectorState(-1);
updateButtonKeys();
}
}
void SettingsManager::setKeySelectorState(int8_t key){
waitingOnKeyForButton = key;
if(key != -1)
ui->keySelectorState->setText("Press a new key!");
else
ui->keySelectorState->setText("");
}
void SettingsManager::updateButtonKeys(){
ui->selectUpKey->setText(QKeySequence(settings->value("palmButton" + QString::number(EmuWrapper::BUTTON_UP) + "Key", '\0').toInt()).toString());
ui->selectDownKey->setText(QKeySequence(settings->value("palmButton" + QString::number(EmuWrapper::BUTTON_DOWN) + "Key", '\0').toInt()).toString());
ui->selectLeftKey->setText(QKeySequence(settings->value("palmButton" + QString::number(EmuWrapper::BUTTON_LEFT) + "Key", '\0').toInt()).toString());
ui->selectRightKey->setText(QKeySequence(settings->value("palmButton" + QString::number(EmuWrapper::BUTTON_RIGHT) + "Key", '\0').toInt()).toString());
ui->selectCenterKey->setText(QKeySequence(settings->value("palmButton" + QString::number(EmuWrapper::BUTTON_CENTER) + "Key", '\0').toInt()).toString());
ui->selectCalendarKey->setText(QKeySequence(settings->value("palmButton" + QString::number(EmuWrapper::BUTTON_CALENDAR) + "Key", '\0').toInt()).toString());
ui->selectAddressBookKey->setText(QKeySequence(settings->value("palmButton" + QString::number(EmuWrapper::BUTTON_ADDRESS) + "Key", '\0').toInt()).toString());
ui->selectTodoKey->setText(QKeySequence(settings->value("palmButton" + QString::number(EmuWrapper::BUTTON_TODO) + "Key", '\0').toInt()).toString());
ui->selectNotesKey->setText(QKeySequence(settings->value("palmButton" + QString::number(EmuWrapper::BUTTON_NOTES) + "Key", '\0').toInt()).toString());
ui->selectVoiceMemoKey->setText(QKeySequence(settings->value("palmButton" + QString::number(EmuWrapper::BUTTON_VOICE_MEMO) + "Key", '\0').toInt()).toString());
ui->selectPowerKey->setText(QKeySequence(settings->value("palmButton" + QString::number(EmuWrapper::BUTTON_POWER) + "Key", '\0').toInt()).toString());
}
void SettingsManager::on_showOnscreenKeys_toggled(bool checked){
settings->setValue("hideOnscreenKeys", !checked);
}
void SettingsManager::on_pickHomeDirectory_clicked(){
MainWindow* mainWindow = (MainWindow*)parentWidget();
QString newHomeDir = QFileDialog::getExistingDirectory(this, "Select Home Directory", QDir::root().path(), QFileDialog::ShowDirsOnly);
if(newHomeDir != ""){
mainWindow->createHomeDirectoryTree(newHomeDir);
settings->setValue("resourceDirectory", newHomeDir);
ui->homeDirectory->setText(newHomeDir);
}
}
void SettingsManager::on_selectUpKey_clicked(){
setKeySelectorState(EmuWrapper::BUTTON_UP);
}
void SettingsManager::on_selectDownKey_clicked(){
setKeySelectorState(EmuWrapper::BUTTON_DOWN);
}
void SettingsManager::on_selectLeftKey_clicked(){
setKeySelectorState(EmuWrapper::BUTTON_LEFT);
}
void SettingsManager::on_selectRightKey_clicked(){
setKeySelectorState(EmuWrapper::BUTTON_RIGHT);
}
void SettingsManager::on_selectCenterKey_clicked(){
setKeySelectorState(EmuWrapper::BUTTON_CENTER);
}
void SettingsManager::on_selectCalendarKey_clicked(){
setKeySelectorState(EmuWrapper::BUTTON_CALENDAR);
}
void SettingsManager::on_selectAddressBookKey_clicked(){
setKeySelectorState(EmuWrapper::BUTTON_ADDRESS);
}
void SettingsManager::on_selectTodoKey_clicked(){
setKeySelectorState(EmuWrapper::BUTTON_TODO);
}
void SettingsManager::on_selectNotesKey_clicked(){
setKeySelectorState(EmuWrapper::BUTTON_NOTES);
}
void SettingsManager::on_selectVoiceMemoKey_clicked(){
setKeySelectorState(EmuWrapper::BUTTON_VOICE_MEMO);
}
void SettingsManager::on_selectPowerKey_clicked(){
setKeySelectorState(EmuWrapper::BUTTON_POWER);
}
void SettingsManager::on_clearKeyBind_clicked(){
if(waitingOnKeyForButton != -1){
settings->setValue("palmButton" + QString::number(waitingOnKeyForButton) + "Key", '\0');
setKeySelectorState(-1);
updateButtonKeys();
}
}
void SettingsManager::on_featureSyncedRtc_toggled(bool checked){
settings->setValue("featureSyncedRtc", checked);
}
void SettingsManager::on_featureDurable_toggled(bool checked){
settings->setValue("featureDurable", checked);
}
void SettingsManager::on_fastBoot_toggled(bool checked){
settings->setValue("fastBoot", checked);
}
void SettingsManager::on_cpuSpeed_valueChanged(double arg1){
EmuWrapper& emu = ((MainWindow*)parentWidget())->emu;
settings->setValue("cpuSpeed", arg1);
if(emu.isInited())
emu.setCpuSpeed(arg1);
}
void SettingsManager::on_palmOsVersion_valueChanged(int arg1){
settings->setValue("palmOsVersion", arg1);
}

View File

@@ -0,0 +1,58 @@
#pragma once
#include <QDialog>
#include <QString>
#include <QKeyEvent>
#include <QSettings>
#include "emuwrapper.h"
namespace Ui {
class SettingsManager;
}
class SettingsManager : public QDialog
{
Q_OBJECT
public:
explicit SettingsManager(QWidget* parent = nullptr);
~SettingsManager();
protected:
void keyPressEvent(QKeyEvent* event);
void keyReleaseEvent(QKeyEvent* event);
private:
void setKeySelectorState(int8_t key);
void updateButtonKeys();
private slots:
void on_showOnscreenKeys_toggled(bool checked);
void on_pickHomeDirectory_clicked();
void on_selectUpKey_clicked();
void on_selectDownKey_clicked();
void on_selectLeftKey_clicked();
void on_selectRightKey_clicked();
void on_selectCenterKey_clicked();
void on_selectCalendarKey_clicked();
void on_selectAddressBookKey_clicked();
void on_selectTodoKey_clicked();
void on_selectNotesKey_clicked();
void on_selectVoiceMemoKey_clicked();
void on_selectPowerKey_clicked();
void on_clearKeyBind_clicked();
void on_featureSyncedRtc_toggled(bool checked);
void on_featureDurable_toggled(bool checked);
void on_fastBoot_toggled(bool checked);
void on_cpuSpeed_valueChanged(double arg1);
void on_palmOsVersion_valueChanged(int arg1);
private:
Ui::SettingsManager* ui;
QSettings* settings;
int8_t waitingOnKeyForButton;
};

View File

@@ -0,0 +1,439 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>SettingsManager</class>
<widget class="QDialog" name="SettingsManager">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>650</width>
<height>437</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>650</width>
<height>0</height>
</size>
</property>
<property name="windowTitle">
<string>Settings</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QScrollArea" name="scrollArea">
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>613</width>
<height>444</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QLineEdit" name="homeDirectory">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pickHomeDirectory">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string>Pick Home Directory</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="showOnscreenKeys">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string>Show Onscreen Keys</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string>Set Palm Button Map:</string>
</property>
</widget>
</item>
<item>
<widget class="QWidget" name="gridWidget" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="2" column="4">
<widget class="QPushButton" name="selectNotesKey">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string>MAXSIZE</string>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/notes.svg</normaloff>:/buttons/images/notes.svg</iconset>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QPushButton" name="selectCalendarKey">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string>MAXSIZE</string>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/calendar.svg</normaloff>:/buttons/images/calendar.svg</iconset>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QPushButton" name="selectDownKey">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string>MAXSIZE</string>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/down.svg</normaloff>:/buttons/images/down.svg</iconset>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QPushButton" name="selectTodoKey">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string>MAXSIZE</string>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/todo.svg</normaloff>:/buttons/images/todo.svg</iconset>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QPushButton" name="selectPowerKey">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string>MAXSIZE</string>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/power.svg</normaloff>:/buttons/images/power.svg</iconset>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QPushButton" name="selectUpKey">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string>MAXSIZE</string>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/up.svg</normaloff>:/buttons/images/up.svg</iconset>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QPushButton" name="selectAddressBookKey">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string>MAXSIZE</string>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/addressBook.svg</normaloff>:/buttons/images/addressBook.svg</iconset>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="selectCenterKey">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string>MAXSIZE</string>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/center.svg</normaloff>:/buttons/images/center.svg</iconset>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="selectLeftKey">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string>MAXSIZE</string>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/left.svg</normaloff>:/buttons/images/left.svg</iconset>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QPushButton" name="selectRightKey">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string>MAXSIZE</string>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/right.svg</normaloff>:/buttons/images/right.svg</iconset>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QPushButton" name="selectVoiceMemoKey">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>MAXSIZE</string>
</property>
<property name="icon">
<iconset resource="mainwindow.qrc">
<normaloff>:/buttons/images/voiceMemo.svg</normaloff>:/buttons/images/voiceMemo.svg</iconset>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QLabel" name="keySelectorState">
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="clearKeyBind">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string>Clear Key Bind</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="palmOsVersionLabel">
<property name="text">
<string>Palm OS Version:</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="palmOsVersion">
<property name="minimum">
<number>4</number>
</property>
<property name="maximum">
<number>6</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>CPU Speed:</string>
</property>
</widget>
</item>
<item>
<widget class="QDoubleSpinBox" name="cpuSpeed">
<property name="minimum">
<double>0.010000000000000</double>
</property>
<property name="maximum">
<double>100.000000000000000</double>
</property>
<property name="singleStep">
<double>0.010000000000000</double>
</property>
<property name="value">
<double>1.000000000000000</double>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="fastBoot">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string>Fast Boot(Fastforwards Through The Boot Screen)</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_2">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string>Set Emulator Features(Restart Required):</string>
</property>
</widget>
</item>
<item>
<widget class="QWidget" name="gridWidget_2" native="true">
<layout class="QGridLayout" name="gridLayout_2">
<item row="2" column="1">
<widget class="QCheckBox" name="featureDurable">
<property name="text">
<string>Ignore Invalid Behavior</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="featureSyncedRtc">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string>Sync Real Time Clock</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<resources>
<include location="mainwindow.qrc"/>
</resources>
<connections/>
</ui>

View File

@@ -8,6 +8,8 @@
#include <QFile>
#include <QDir>
#include <QListWidgetItem>
#include <QRegExp>
#include <QRegExpValidator>
#include "mainwindow.h"
@@ -15,20 +17,30 @@
StateManager::StateManager(QWidget* parent) :
QDialog(parent),
ui(new Ui::StateManager){
emu = &((MainWindow*)parent)->emu;
//init GUI
ui->setupUi(this);
//this allows resizing the screenshot of the savestate
this->installEventFilter(this);
ui->statePreview->installEventFilter(this);
ui->statePreview->setObjectName("statePreview");
updateStateList();
noBadPaths = new QRegExpValidator(QRegExp("[a-z0-9_()-\\s]*"));
ui->newStateName->setValidator(noBadPaths);
}
StateManager::~StateManager(){
delete noBadPaths;
delete ui;
}
bool StateManager::eventFilter(QObject* object, QEvent* event){
if(object->objectName() == "StateManager" && event->type() == QEvent::WindowActivate){
updateStateList();
ui->states->setCurrentRow(0);
}
if(object->objectName() == "statePreview" && event->type() == QEvent::Resize)
updateStatePreview();
@@ -36,9 +48,7 @@ bool StateManager::eventFilter(QObject* object, QEvent* event){
}
void StateManager::updateStateList(){
MainWindow* parent = (MainWindow*)parentWidget();
QString saveDirPath = parent->settings->value("resourceDirectory", "").toString() + "/saveStates";
QDir saveDir(saveDirPath);
QDir saveDir(emu->getStatePath());
QStringList saveStateNames;
QStringList filter;
@@ -58,8 +68,7 @@ void StateManager::updateStateList(){
void StateManager::updateStatePreview(){
if(ui->states->currentItem()){
MainWindow* parent = (MainWindow*)parentWidget();
QString statePath = parent->settings->value("resourceDirectory", "").toString() + "/saveStates/" + ui->states->currentItem()->text();
QString statePath = emu->getStatePath() + "/" + ui->states->currentItem()->text();
ui->statePreview->setPixmap(QPixmap(statePath + ".png").scaled(ui->statePreview->width() * 0.98, ui->statePreview->height() * 0.98, Qt::KeepAspectRatio, Qt::SmoothTransformation));
}
@@ -67,8 +76,6 @@ void StateManager::updateStatePreview(){
//remove outdated image
ui->statePreview->clear();
}
ui->statePreview->update();
}
int StateManager::getStateIndexRowByName(const QString& name){
@@ -82,10 +89,10 @@ int StateManager::getStateIndexRowByName(const QString& name){
void StateManager::on_saveState_clicked(){
if(ui->newStateName->text() != ""){
MainWindow* parent = (MainWindow*)parentWidget();
QString statePath = parent->settings->value("resourceDirectory", "").toString() + "/saveStates/" + ui->newStateName->text();
QString statePath = emu->getStatePath() + "/" + ui->newStateName->text();
parent->emu.saveState(statePath + ".state");
parent->emu.getFramebuffer().save(statePath + ".png");
parent->emu.saveState(ui->newStateName->text());
parent->emu.getFramebufferImage().save(statePath + ".png");
updateStateList();
ui->states->setCurrentRow(getStateIndexRowByName(ui->newStateName->text()));//this also updates the preview image
@@ -95,16 +102,15 @@ void StateManager::on_saveState_clicked(){
void StateManager::on_loadState_clicked(){
if(ui->states->currentItem()){
MainWindow* parent = (MainWindow*)parentWidget();
QString statePath = parent->settings->value("resourceDirectory", "").toString() + "/saveStates/" + ui->states->currentItem()->text();
QString statePath = emu->getStatePath() + "/" + ui->states->currentItem()->text();
parent->emu.loadState(statePath + ".state");
parent->emu.loadState(ui->states->currentItem()->text());
}
}
void StateManager::on_deleteState_clicked(){
if(ui->states->currentItem()){
MainWindow* parent = (MainWindow*)parentWidget();
QString statePath = parent->settings->value("resourceDirectory", "").toString() + "/saveStates/" + ui->states->currentItem()->text();
QString statePath = emu->getStatePath() + "/" + ui->states->currentItem()->text();
QFile(statePath + ".state").remove();
QFile(statePath + ".png").remove();
@@ -116,6 +122,4 @@ void StateManager::on_deleteState_clicked(){
void StateManager::on_states_currentItemChanged(QListWidgetItem* current, QListWidgetItem* previous){
updateStatePreview();
ui->states->repaint();
ui->statePreview->repaint();
}

View File

@@ -4,6 +4,10 @@
#include <QObject>
#include <QEvent>
#include <QListWidgetItem>
#include <QString>
#include <QRegExpValidator>
#include "emuwrapper.h"
namespace Ui{
class StateManager;
@@ -31,4 +35,6 @@ private slots:
private:
Ui::StateManager* ui;
EmuWrapper* emu;
QRegExpValidator* noBadPaths;
};

View File

@@ -1,6 +1,7 @@
#include "touchscreen.h"
#include <QLabel>
#include <QWidget>
#include <QPainter>
#include <QMouseEvent>
#include <stdint.h>
@@ -10,7 +11,7 @@
TouchScreen::TouchScreen(QWidget* parent)
: QLabel(parent){
: QWidget(parent){
}
@@ -22,13 +23,22 @@ float TouchScreen::rangeSwap(float newRange, float oldRange, float value){
return value / oldRange * newRange;
}
void TouchScreen::paintEvent(QPaintEvent* ev){
EmuWrapper& emu = ((MainWindow*)(parentWidget()->parentWidget()->parentWidget()))->emu;
if(emu.isInited()){
QPainter painter(this);
QImage image = emu.getFramebufferImage().scaled(painter.window().size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
painter.drawImage((painter.window().width() - image.width()) / 2, (painter.window().height() - image.height()) / 2, image);
}
}
void TouchScreen::mousePressEvent(QMouseEvent* ev){
if(ev->x() >= 0 && ev->x() < this->width() && ev->y() >= 0 && ev->y() < this->height()){
EmuWrapper& emu = ((MainWindow*)(parentWidget()->parentWidget()->parentWidget()))->emu;
emu.emuInput.touchscreenX = (float)ev->x() / this->width();
emu.emuInput.touchscreenY = (float)ev->y() / this->height();
emu.emuInput.touchscreenTouched = true;
emu.setPenValue((float)ev->x() / (this->width() - 1), (float)ev->y() / (this->height() - 1), true);
}
}
@@ -36,13 +46,12 @@ void TouchScreen::mouseMoveEvent(QMouseEvent* ev){
if(ev->x() >= 0 && ev->x() < this->width() && ev->y() >= 0 && ev->y() < this->height()){
EmuWrapper& emu = ((MainWindow*)(parentWidget()->parentWidget()->parentWidget()))->emu;
emu.emuInput.touchscreenX = (float)ev->x() / (this->width() - 1);
emu.emuInput.touchscreenY = (float)ev->y() / (this->height() - 1);
emu.setPenValue((float)ev->x() / (this->width() - 1), (float)ev->y() / (this->height() - 1), true);
}
}
void TouchScreen::mouseReleaseEvent(QMouseEvent* ev){
EmuWrapper& emu = ((MainWindow*)(parentWidget()->parentWidget()->parentWidget()))->emu;
emu.emuInput.touchscreenTouched = false;
emu.setPenValue(0.0, 0.0, false);
}

View File

@@ -1,9 +1,10 @@
#pragma once
#include <QLabel>
#include <QWidget>
#include <QPaintEvent>
#include <QMouseEvent>
class TouchScreen : public QLabel{
class TouchScreen : public QWidget{
Q_OBJECT
private:
@@ -14,6 +15,7 @@ public:
~TouchScreen();
protected:
void paintEvent(QPaintEvent* ev);
void mousePressEvent(QMouseEvent* ev);
void mouseMoveEvent(QMouseEvent* ev);
void mouseReleaseEvent(QMouseEvent* ev);

View File

@@ -1,4 +1,4 @@
# Palm m515/OS 4.1 emulator(Mu)
# Palm OS emulator(Mu)
This is a complete restart of my Palm OS emulator, with the last one the code got too messy and the goal too ambitious(to emulate every palm API in software and for compatibility with all Palm OS versions and devices).
@@ -17,41 +17,17 @@ It is the best Palm brand OS 4 device that has no special hardware builtin(cellp
The Palm keyboard attachment will likely be emulated later on so the PC keyboard can be used on text fields.
## OS improvements
## What about OS 5?
If there is something the OS does not support(like an OS 5 API) I may add it manually, this will be in the form of a custom firmware as a ROM image or a .bps patch, not a patch to the emulator with only 1 exception "sysTrapPceNativeCall" which would require an ARM interpreter, it would also be an option to not apply this patch leaving you with an accurately emulated stock Palm m515.
These patches will not be worked on until the emulator is actually running.
## But you shouldnt waste your time on OS 4, OS 5 can do more.
I have made a video of OS 5 doing that "more", it is extremely incompatible with OS 4 games which most games are, very few games used the ARM CPU and those that did are available on other platforms, some used the 320x320 display mode.
On Clie PEG-SL10:
ArgonV: Normal
Galax: Normal
Zap!20XX: Normal
Invaders: Normal
Platypus: No ARM CPU, Cant Run
On Palm T|X:
ArgonV: Runs At Warpspeed
Galax: Audio Cuts Out
Zap!20XX: Audio Cuts Out
Invaders: Reboots System
Platypus: Normal, Used To Prove Speaker Isnt Defective
Bonus: Has Adware(Addit)
[Palm T|X vs OS 4 Games](https://youtu.be/ithVLI_M6i0)
The lack of ARM CPU will be fixed in my emulator see "OS improvements".
I am planning on adding Tungsten T3 support as soon as possible.
## Credits
Musashi v3.4 (last version that builds outside of MAME)(68k Core)
Cyclone 68000 (68k Core)
blip_buf 1.1.0 (Audio Resampler)
http://www.iconarchive.com/show/crystal-clear-icons-by-everaldo/App-palm-icon.html (Desktop Icon)
http://tango.freedesktop.org/Tango_Icon_Library (Palm Action Buttons, All UI buttons)
[Firebird Emu](https://github.com/nspire-emus/firebird) (ARMv5TE Core)
[uARM](https://dmitry.gr/?r=05.Projects&proj=07.%20Linux%20on%208bit) (PXA260 CPU Peripherals)
[Musashi v3.4](https://github.com/kstenerud/Musashi) (last version that builds outside of MAME)(68k Core)
[blip_buf 1.1.0](https://github.com/TASVideos/BizHawk/tree/master/blip_buf) (Audio Resampler)
https://www.iconarchive.com/show/crystal-clear-icons-by-everaldo/App-palm-icon.html (Desktop Icon)
https://tango.freedesktop.org/Tango_Icon_Library (Palm Action Buttons, All UI buttons)
https://www.iconfinder.com/icons/2317746/chip_computer_cpu_device_frequency_microchip_processor_icon (hwTestSuite Icon)
https://www.flaticon.com/free-icon/cow_235371#term=cow&page=1&position=13 (muExpDriver Icon)
https://findicons.com/icon/164302/cursor (Libretro Port Joystick Cursor)
@@ -67,7 +43,7 @@ Make sure you have done all the steps here https://docs.libretro.com/ under "For
Install Qt 5.11.1 and Qt Creator(optional) if not installed
Open the .pro file in Qt Creator and click "Run" or build from command line
##### To build without Qt Creator
##### To build without Qt Creator(untested)
cd ./qtBuildSystem/Mu
qmake
@@ -76,13 +52,20 @@ Open the .pro file in Qt Creator and click "Run" or build from command line
#### TestSuite for Palm OS
Install prc-tools from the below link(self compiled or prepackaged VM)
cd ./hwTestSuite
cd ./tools/palm/hwTestSuite
./make.sh
#### MuExpDriver for Palm OS
Install prc-tools from the below link(self compiled or prepackaged VM)
cd ./tools/palm/muExpansionDriver
./make.sh
## Running
#### Files
palmos41-en-m515.rom(all euro languages, from Palm dev program): 412557a221933a8be12622de7a21320a (MD5)
palmos41-en-m515.rom(English only, verified authentic from device): 83cb1d1c76e568b916dc2e7c0bf669f6 (MD5)
palmos52-en-t3.rom: de46ec84d9aabf655eabdf9b00a3845d (MD5)
bootloader-en-m515.rom(v1): 9da101cd2317830649a31f8fa46debec (MD5)
bootloader-en-m515.rom(v2): e64c755205bc3e79d1bc5b70128f688d (MD5)
@@ -91,14 +74,16 @@ I understand not everyone speaks English so I list both ROMs, I do all my testin
#### For Qt
1. Run once to create the directory tree
2. Copy "palmos41-en-m515.rom" to "~/Mu"
3. Copy "bootloader-en-m515.rom" to "~/Mu"
2. Copy "palmos41-en-m515.rom" and "palmos52-en-t3.rom" to "~/Mu"
3. (Optional)Copy "bootloader-en-m515.rom" to "~/Mu"
4. Run emu and press start button
#### For RetroArch
1. Download "Palm OS(Mu)" from "Online Updater->Core Updater"
2. Go back, select "Load Core", select "Palm OS(Mu)"
3. Run "palmos41-en-m515.rom"
3. Copy "palmos41-en-m515.rom" and "palmos52-en-t3.rom" to the RetroArch system directory
4. (Optional)Copy "bootloader-en-m515.rom" to the RetroArch system directory
5. Run a .prc or .img file
## Tools
[Prc-tools, Palm OS SDKs, pilrc, pilot-link](https://github.com/meepingsnesroms/prc-tools-remix)
@@ -107,6 +92,7 @@ I understand not everyone speaks English so I list both ROMs, I do all my testin
<a rel="license" href="http://creativecommons.org/licenses/by-nc/3.0/us/"><img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by-nc/3.0/us/88x31.png" /></a><br />This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc/3.0/us/">Creative Commons Attribution-NonCommercial 3.0 United States License</a>.
## Links
[Website](https://meepingsnesroms.github.io/)
[Discord](https://discord.gg/hWSz8VN)
## Also see Mu's sister project

View File

@@ -2,37 +2,58 @@
The end???
------------------------------------------
v2.5.0 to v3.2.0(*** ** 2019 - *** ** 2020)
v3.2.0 to v4.0.0(*** ** 2020 - *** ** 2020)
Core:
*allow direct 320x320 bitmap rendered over the 160x160 framebuffer expanded 2x in both directions, black pixels will be transparent showing what's on the 160x160 framebuffer
Emu Hwr Driver:
*set fake display framebuffer for 320x320 mode
add Dragonball OG/EZ/VZ CPU builtin LCD controller support too muExpDriver, some Palm OS 1<->3 games write directly to these registers to display their video and they won't work(with the exception of LSSA since the OS monitors that one)
------------------------------------------
v2.0.0 to v2.5.0(*** ** 2019 - *** ** 2019)
v1.1.0 to v3.2.0(*** ** 2020 - *** ** 2020)
RetroArch GUI:
//TODO: allow adding more content after boot
//TODO: get EMU_MANAGE_HOST_CPU_PIPELINE working on other platforms then the main 4
//TODO: get OpenMP working with RetroArch(already works but breaks the no external libs rule)
//TODO: switch to high contrast and top left corner aligned mouse cursors
//FIXED: when compiling with "make platform=windows_x86_64" the dll wont load(theres a really good chance its because "libgomp-1.dll"(the OpenMP handler library) is missing from the RetroArch folder)(fixed by disableing OpenMP :( )
Qt GUI:
//TODO: get circleci builds for QT port on Win/Mac/Linux
//TODO: allow reiniting the emu without closing the program
//FAIL: render with OpenGL widget(should be a major speed boost)(switched to the method from firebird instead and it changed nothing)
Core:
*add single 16 bit PCM sound stream, mixed with PWM1
Emu Hwr Driver:
*OS 5.1.* sound stream API support(possibly can use PRC file dumped from an OS 5.1.1 device as long as I still add the extra sound stream for it to write to)
//TODO: thumb mode supposedly dosent work with ARM dynarec, test this and fix mode switches if it does
add Palm Tungsten T3 support
------------------------------------------
v1.0.0 to v2.0.0(*** ** 2019 - *** ** 2019)
v1.0.0 to v1.1.0(Feb 25 2019 - Easter 2019)
RetroArch GUI:
*allow mouse cursor to be rendered with multiple CPUs(removed for now)
*now launches content like cartridge based systems
*make default button layout match default controller layout better
*allow disabling the silkscreen area
*booting without game works again
*add multithreading and pipeline speedups(disabled for now because of compiling issues)
Qt GUI:
//TODO: allow using host serial ports in Palm OS
//TODO: saving states isn't working on Mac OS, it won't create the directory, don't know why(its not the . in the path either already tested), QDir returns false so it is failing?
*fixed state manager not loading until a state is saved
*boot button uses install button icon now, changed install button to icon a "+"
*put back left/right/center keys
*added install and boot buttons to both modes, content loaded with the boot button has separate save paths just like cartridge systems
*added instant boot option, no longer have to wait for the 5 second boot up if you dont want to(instant boot is always on for loading games)
*can now set the feature bits
*can now set the resource directory
*keyboard mapping support
Core:
*ARM opcode support, most apps that use ARM code work, as long as no OS 5.1.* APIs are used
Emu Hwr Driver:
*ARM CPU is exported to OS 4 with custom PceNativeCall
*can set fake version number to prevent tripping compatibility checks
------------------------------------------
v(1/3*3) to v1.0.0(Christmas 2018 - *** ** 2019)
Core:
*SD card support
*fix power button double press bug
*FAME 68k core
*implement UART1/2 to fix crashing when beaming or hotsyncing
*PLLFSR timing hack is gone, CLK32 bit now just toggles properly mid CLK32
*SD card access routines are now 6<->7X faster
*add a launcher to load prc/pdb/pqa files
*add frameskip for really low power devices and when video is not needed
*added host CPU pipeline control for another speed up
*implement FEATURE_SYNCED_RTC to make the Palm clock always match the host system clock

View File

@@ -3,11 +3,13 @@
#include "emulator.h"
#include "portability.h"
#include "dbvz.h"
bool ads7846PenIrqEnabled;
static const uint16_t ads7846DockResistorValues[PORT_END] = {0xFFF/*none*/, 0x1EB/*USB cradle*/, 0x000/*serial cradle, unknown*/, 0x000/*USB peripheral, unknown*/, 0x000/*serial peripheral, unknown*/};
static const uint16_t ads7846DockResistorValues[EMU_PORT_END] = {0xFFF/*none*/, 0x1EB/*USB cradle*/, 0x000/*serial cradle, unknown*/, 0x000/*USB peripheral, unknown*/, 0x000/*serial peripheral, unknown*/};
static uint8_t ads7846BitsToNextControl;
static uint8_t ads7846ControlByte;
static uint16_t ads7846OutputValue;
@@ -29,11 +31,14 @@ void ads7846Reset(void){
ads7846ControlByte = 0x00;
ads7846PenIrqEnabled = true;
ads7846OutputValue = 0x0000;
ads7846ChipSelect = false;
ads7846ChipSelect = true;
#if !defined(EMU_NO_SAFETY)
m515RefreshTouchState();
#endif
}
uint64_t ads7846StateSize(void){
uint64_t size = 0;
uint32_t ads7846StateSize(void){
uint32_t size = 0;
size += sizeof(uint8_t) * 4;
size += sizeof(uint16_t);
@@ -42,7 +47,7 @@ uint64_t ads7846StateSize(void){
}
void ads7846SaveState(uint8_t* data){
uint64_t offset = 0;
uint32_t offset = 0;
writeStateValue8(data + offset, ads7846PenIrqEnabled);
offset += sizeof(uint8_t);
@@ -57,7 +62,7 @@ void ads7846SaveState(uint8_t* data){
}
void ads7846LoadState(uint8_t* data){
uint64_t offset = 0;
uint32_t offset = 0;
ads7846PenIrqEnabled = readStateValue8(data + offset);
offset += sizeof(uint8_t);
@@ -78,7 +83,11 @@ void ads7846SetChipSelect(bool value){
ads7846ControlByte = 0x00;
ads7846PenIrqEnabled = true;
ads7846OutputValue = 0x0000;
#if !defined(EMU_NO_SAFETY)
m515RefreshTouchState();
#endif
}
ads7846ChipSelect = value;
}
bool ads7846ExchangeBit(bool bitIn){
@@ -106,17 +115,22 @@ bool ads7846ExchangeBit(bool bitIn){
else if(ads7846BitsToNextControl == 6){
//control byte and busy cycle finished, get output value
bool bitMode = !!(ads7846ControlByte & 0x08);
//bool differentialMode = !(ads7846ControlByte & 0x04);
uint8_t channel = (ads7846ControlByte & 0x70) >> 4;
bool differentialMode = !(ads7846ControlByte & 0x04);
uint8_t channel = ads7846ControlByte >> 4 & 0x07;
uint8_t powerSave = ads7846ControlByte & 0x03;
//debugLog("Accessed ADS7846 Ch:%d, %d bits, %s Mode, Power Save:%d, PC:0x%08X.\n", channel, bitMode ? 8 : 12, differentialMode ? "Diff" : "Normal", ads7846ControlByte & 0x03, flx68000GetPc());
//check if ADC is on, PENIRQ is handled in refreshInputState() in hardwareRegisters.c
switch(powerSave){
case 0:
case 1:
//touchscreen data only
//reference disabled currently isnt emulated, I dont know what the proper behavior for that would be
#if !defined(EMU_NO_SAFETY)
//trigger fake IRQs
ads7846OverridePenState(!(channel == 1 || channel == 3 || channel == 4 || channel == 5));
#endif
if(powerSave != 2){
//ADC enabled, get analog value
if(differentialMode){
switch(channel){
case 0:
//temperature 0, wrong mode
@@ -170,18 +184,8 @@ bool ads7846ExchangeBit(bool bitIn){
ads7846OutputValue = 0xDFF;
break;
}
break;
case 2:
//ADC is off, return invalid data
if((channel == 3 || channel == 5) && !palmInput.touchscreenTouched)
ads7846OutputValue = 0x000;
else
ads7846OutputValue = 0xFFF;
break;
case 3:
//all data
}
else{
if(!palmInput.touchscreenTouched){
switch(channel){
case 0:
@@ -198,15 +202,15 @@ bool ads7846ExchangeBit(bool bitIn){
break;
case 2:
//battery, unknown hasent gotten low enough to test yet
//battery
//ads7846OutputValue = 0x600;//5%
//ads7846OutputValue = 0x61C;//30%
//ads7846OutputValue = 0x63C;//40%
//ads7846OutputValue = 0x65C;//60%
//ads7846OutputValue = 0x67C;//80%
//ads7846OutputValue = 0x68C;//100%
ads7846OutputValue = 0x69C;//100%
//ads7846OutputValue = ads7846RangeMap(0, 100, palmMisc.batteryLevel, 0x000, 0x7F8);
//ads7846OutputValue = 0x69C;//100%
ads7846OutputValue = ads7846RangeMap(0, 100, palmMisc.batteryLevel, 0x5FD, 0x68C);
break;
case 3:
@@ -248,7 +252,14 @@ bool ads7846ExchangeBit(bool bitIn){
//crosses lines with REF+(unverified)
ads7846OutputValue = 0xF80;
}
break;
}
}
else{
//ADC disabled, return invalid data
if((channel == 3 || channel == 5) && !palmInput.touchscreenTouched)
ads7846OutputValue = 0x000;
else
ads7846OutputValue = 0xFFF;
}
//move to output position
@@ -261,6 +272,9 @@ bool ads7846ExchangeBit(bool bitIn){
}
ads7846PenIrqEnabled = !(powerSave & 0x01);
#if !defined(EMU_NO_SAFETY)
m515RefreshTouchState();
#endif
}
return ads7846GetAdcBit();

View File

@@ -7,7 +7,7 @@
extern bool ads7846PenIrqEnabled;
void ads7846Reset(void);
uint64_t ads7846StateSize(void);
uint32_t ads7846StateSize(void);
void ads7846SaveState(uint8_t* data);
void ads7846LoadState(uint8_t* data);

View File

@@ -0,0 +1,539 @@
#include <assert.h>
#include "asmcode.h"
#include "cpu.h"
#include "cpudefs.h"
#include "debug.h"
#include "mmu.h"
// Detect overflow after an addition or subtraction
#define ADD_OVERFLOW(left, right, sum) ((int32_t)(((left) ^ (sum)) & ((right) ^ (sum))) < 0)
#define SUB_OVERFLOW(left, right, sum) ((int32_t)(((left) ^ (right)) & ((left) ^ (sum))) < 0)
static uint32_t add(uint32_t left, uint32_t right, int carry, int setcc) {
uint32_t sum = left + right + carry;
if (!setcc)
return sum;
if (sum < left) carry = 1;
if (sum > left) carry = 0;
arm.cpsr_c = carry;
arm.cpsr_v = ADD_OVERFLOW(left, right, sum);
return sum;
}
// "uint8_t shift_val" is correct here. If it is a shift by register, only the bottom 8 bits are looked at.
static uint32_t shift(uint32_t value, uint8_t shift_type, uint8_t shift_val, bool setcc, bool has_rs)
{
if(shift_val == 0)
{
if(unlikely(!has_rs))
{
switch(shift_type)
{
case SH_ROR:
{
// RRX
bool carry = arm.cpsr_c;
if(setcc) arm.cpsr_c = value & 1;
return value >> 1 | uint32_t(carry) << 31;
}
case SH_ASR:
case SH_LSR: // #32 is encoded as LSR #0
return shift(value, shift_type, 32, setcc, false);
}
}
return value;
}
else if(likely(shift_val < 32))
{
switch(shift_type)
{
case SH_LSL:
if(setcc) arm.cpsr_c = (value >> (32 - shift_val)) & 1;
return value << shift_val;
case SH_LSR:
if(setcc) arm.cpsr_c = (value >> (shift_val - 1)) & 1;
return value >> shift_val;
case SH_ASR:
if(setcc) arm.cpsr_c = (value >> (shift_val - 1)) & 1;
if(value & (1u << 31)) //TODO: Verify!
return ~((~value) >> shift_val);
else
return value >> shift_val;
case SH_ROR:
if(setcc) arm.cpsr_c = (value >> (shift_val - 1)) & 1;
return value >> shift_val | (value << (32 - shift_val));
}
}
else if(shift_val == 32 || shift_type == SH_ASR || shift_type == SH_ROR)
{
switch(shift_type)
{
case SH_LSL: if(setcc) arm.cpsr_c = value & 1; return 0;
case SH_LSR: if(setcc) arm.cpsr_c = !!(value & (1u << 31)); return 0;
case SH_ASR: if(setcc) arm.cpsr_c = !!(value & (1u << 31));
if(value & (1u << 31))
return 0xFFFFFFFF;
else
return 0x00000000;
case SH_ROR: return shift(value, SH_ROR, shift_val & 0b11111, setcc, false);
}
}
else // shift_val > 32
{
if(setcc)
arm.cpsr_c = 0;
return 0;
}
return 0;
}
static uint32_t addr_mode_2(Instruction i)
{
if(!i.mem_proc.not_imm)
return i.mem_proc.immed;
return shift(reg_pc(i.mem_proc.rm), i.mem_proc.shift, i.mem_proc.shift_imm, false, false);
}
static uint32_t rotated_imm(Instruction i, bool setcc)
{
uint32_t imm = i.data_proc.immed_8;
uint8_t count = i.data_proc.rotate_imm << 1;
if(count == 0)
return imm;
imm = (imm >> count) | (imm << (32 - count));
if(setcc)
arm.cpsr_c = !!(imm & (1u << 31));
return imm;
}
static uint32_t addr_mode_1(Instruction i, bool setcc)
{
if(i.data_proc.imm)
return rotated_imm(i, setcc);
if(i.data_proc.reg_shift)
return shift(reg_pc(i.data_proc.rm), i.data_proc.shift, reg(i.data_proc.rs), setcc, true);
else
return shift(reg_pc(i.data_proc.rm), i.data_proc.shift, i.data_proc.shift_imm, setcc, false);
}
static inline void set_nz_flags(uint32_t value) {
arm.cpsr_n = value >> 31;
arm.cpsr_z = value == 0;
}
static inline void set_nz_flags_64(uint64_t value) {
arm.cpsr_n = value >> 63;
arm.cpsr_z = value == 0;
}
void do_arm_instruction(Instruction i)
{
bool exec = true;
// Shortcut for unconditional instructions
if(likely(i.cond == CC_AL))
goto always;
switch(i.cond)
{
case CC_EQ: case CC_NE: exec = arm.cpsr_z; break;
case CC_CS: case CC_CC: exec = arm.cpsr_c; break;
case CC_MI: case CC_PL: exec = arm.cpsr_n; break;
case CC_VS: case CC_VC: exec = arm.cpsr_v; break;
case CC_HI: case CC_LS: exec = !arm.cpsr_z && arm.cpsr_c; break;
case CC_GE: case CC_LT: exec = arm.cpsr_n == arm.cpsr_v; break;
case CC_GT: case CC_LE: exec = !arm.cpsr_z && arm.cpsr_n == arm.cpsr_v; break;
case CC_NV:
if((i.raw & 0xFD70F000) == 0xF550F000)
return;
else if((i.raw & 0xFE000000) == 0xFA000000)
{
// BLX
arm.reg[14] = arm.reg[15];
arm.reg[15] += 4 + ((int32_t) (i.raw << 8) >> 6) + (i.raw >> 23 & 2);
arm.cpsr_low28 |= 0x20; // Enter Thumb mode
return;
}
else
undefined_instruction();
return;
}
exec ^= i.cond & 1;
if(!exec)
return;
always:
uint32_t insn = i.raw;
if((insn & 0xE000090) == 0x0000090)
{
// MUL, SWP, etc.
// LDRH, STRSH, etc.
int type = insn >> 5 & 3;
if (type == 0) {
if ((insn & 0xFC000F0) == 0x0000090) {
/* MUL, MLA: 32x32 to 32 multiplications */
uint32_t res = reg(insn & 15)
* reg(insn >> 8 & 15);
if (insn & 0x0200000)
res += reg(insn >> 12 & 15);
set_reg(insn >> 16 & 15, res);
if (insn & 0x0100000) set_nz_flags(res);
} else if ((insn & 0xF8000F0) == 0x0800090) {
/* UMULL, UMLAL, SMULL, SMLAL: 32x32 to 64 multiplications */
uint32_t left = reg(insn & 15);
uint32_t right = reg(insn >> 8 & 15);
uint32_t reg_lo = insn >> 12 & 15;
uint32_t reg_hi = insn >> 16 & 15;
if (reg_lo == reg_hi)
error("RdLo and RdHi cannot be same for 64-bit multiply");
uint64_t res;
if (insn & 0x0400000) res = (int64_t)(int32_t)left * (int32_t)right;
else res = (uint64_t)left * right;
if (insn & 0x0200000) {
/* Accumulate */
res += (uint64_t)reg(reg_hi) << 32 | reg(reg_lo);
}
set_reg(reg_lo, res);
set_reg(reg_hi, res >> 32);
if (insn & 0x0100000) set_nz_flags_64(res);
} else if ((insn & 0xFB00FF0) == 0x1000090) {
/* SWP, SWPB */
uint32_t addr = reg(insn >> 16 & 15);
uint32_t ld, st = reg(insn & 15);
if (insn & 0x0400000) {
ld = read_byte(addr); write_byte(addr, st);
} else {
ld = read_word(addr); write_word(addr, st);
}
set_reg(insn >> 12 & 15, ld);
} else {
undefined_instruction();
}
} else {
/* Load/store halfword, signed byte/halfword, or doubleword */
int base_reg = insn >> 16 & 15;
int data_reg = insn >> 12 & 15;
int offset = (insn & (1 << 22))
? (insn & 0x0F) | (insn >> 4 & 0xF0)
: reg(insn & 15);
bool writeback = false;
uint32_t addr = reg_pc(base_reg);
if (!(insn & (1 << 23))) // Subtracted offset
offset = -offset;
if (insn & (1 << 24)) { // Offset or pre-indexed addressing
addr += offset;
offset = 0;
writeback = insn & (1 << 21);
} else {
if(insn & (1 << 21))
mmu_check_priv(addr, !((insn & (1 << 20)) || type == 2));
writeback = true;
}
if (insn & (1 << 20)) {
uint32_t data;
if (base_reg == data_reg && writeback)
error("Load instruction modifies base register twice");
if (type == 1) data = read_half(addr); /* LDRH */
else if (type == 2) data = (int8_t) read_byte(addr); /* LDRSB */
else data = (int16_t)read_half(addr); /* LDRSH */
set_reg(data_reg, data);
} else if (type == 1) { /* STRH */
write_half(addr, reg(data_reg));
} else {
if (data_reg & 1) error("LDRD/STRD with odd-numbered data register");
if (type == 2) { /* LDRD */
if ((base_reg & ~1) == data_reg && writeback)
error("Load instruction modifies base register twice");
uint32_t low = read_word(addr);
uint32_t high = read_word(addr + 4);
set_reg(data_reg, low);
set_reg(data_reg + 1, high);
} else { /* STRD */
write_word(addr, reg(data_reg));
write_word(addr + 4, reg(data_reg + 1));
}
}
if (writeback)
set_reg(base_reg, addr + offset);
}
}
else if((insn & 0xD900000) == 0x1000000)
{
// BLX, MRS, MSR, SMUL, etc.
if ((insn & 0xFFFFFD0) == 0x12FFF10) {
/* B(L)X: Branch(, link,) and exchange T bit */
uint32_t target = reg_pc(insn & 15);
if (insn & 0x20)
arm.reg[14] = arm.reg[15];
set_reg_bx(15, target);
} else if ((insn & 0xFBF0FFF) == 0x10F0000) {
/* MRS: Move reg <- status */
set_reg(insn >> 12 & 15, (insn & 0x0400000) ? get_spsr() : get_cpsr());
} else if ((insn & 0xFB0FFF0) == 0x120F000 ||
(insn & 0xFB0F000) == 0x320F000) {
/* MSR: Move status <- reg/imm */
uint32_t val, mask = 0;
if (insn & 0x2000000)
val = rotated_imm(i, false);
else
val = reg(insn & 15);
if (insn & 0x0080000) mask |= 0xFF000000;
if (insn & 0x0040000) mask |= 0x00FF0000;
if (insn & 0x0020000) mask |= 0x0000FF00;
if (insn & 0x0010000) mask |= 0x000000FF;
if (insn & 0x0400000)
set_spsr(val, mask);
else
set_cpsr(val, mask);
} else if ((insn & 0xF900090) == 0x1000080) {
int32_t left = reg(insn & 15);
int16_t right = reg((insn >> 8) & 15) >> ((insn & 0x40) ? 16 : 0);
int32_t product;
int type = insn >> 21 & 3;
if (type == 1) {
/* SMULW<y>, SMLAW<y>: Signed 32x16 to 48 multiply, uses only top 32 bits */
product = (int64_t)left * right >> 16;
if (!(insn & 0x20))
goto accumulate;
} else {
/* SMUL<x><y>, SMLA<x><y>, SMLAL<x><y>: Signed 16x16 to 32 multiply */
product = (int16_t)(left >> ((insn & 0x20) ? 16 : 0)) * right;
}
if (type == 2) {
/* SMLAL<x><y>: 64-bit accumulate */
uint32_t reg_lo = insn >> 12 & 15;
uint32_t reg_hi = insn >> 16 & 15;
int64_t sum;
if (reg_lo == reg_hi)
error("RdLo and RdHi cannot be same for 64-bit accumulate");
sum = product + ((uint64_t)reg(reg_hi) << 32 | reg(reg_lo));
set_reg(reg_lo, sum);
set_reg(reg_hi, sum >> 32);
} else if (type == 0) accumulate: {
/* SMLA<x><y>, SMLAW<y>: 32-bit accumulate */
int32_t acc = reg(insn >> 12 & 15);
int32_t sum = product + acc;
/* Set Q flag on overflow */
arm.cpsr_low28 |= ADD_OVERFLOW(product, acc, sum) << 27;
set_reg(insn >> 16 & 15, sum);
} else {
/* SMUL<x><y>, SMULW<y>: No accumulate */
set_reg(insn >> 16 & 15, product);
}
} else if ((insn & 0xF900FF0) == 0x1000050) {
/* QADD, QSUB, QDADD, QDSUB: Saturated arithmetic */
int32_t left = reg(insn & 15);
int32_t right = reg(insn >> 16 & 15);
int32_t res, overflow;
if (insn & 0x400000) {
/* Doubled right operand */
res = right << 1;
if (ADD_OVERFLOW(right, right, res)) {
/* Overflow, set Q flag and saturate */
arm.cpsr_low28 |= 1 << 27;
res = (res < 0) ? 0x7FFFFFFF : 0x80000000;
}
right = res;
}
if (!(insn & 0x200000)) {
res = left + right;
overflow = ADD_OVERFLOW(left, right, res);
} else {
res = left - right;
overflow = SUB_OVERFLOW(left, right, res);
}
if (overflow) {
/* Set Q flag and saturate */
arm.cpsr_low28 |= 1 << 27;
res = (res < 0) ? 0x7FFFFFFF : 0x80000000;
}
set_reg(insn >> 12 & 15, res);
} else if ((insn & 0xFFF0FF0) == 0x16F0F10) {
/* CLZ: Count leading zeros */
int32_t value = reg(insn & 15);
uint32_t zeros;
for (zeros = 0; zeros < 32 && value >= 0; zeros++)
value <<= 1;
set_reg(insn >> 12 & 15, zeros);
} else if ((insn & 0xFFF000F0) == 0xE1200070) {
gui_debug_printf("Software breakpoint at %08x (%04x)\n",
arm.reg[15], (insn >> 4 & 0xFFF0) | (insn & 0xF));
debugger(DBG_EXEC_BREAKPOINT, 0);
} else
undefined_instruction();
}
else if(likely((insn & 0xC000000) == 0x0000000))
{
// Data processing
bool carry = arm.cpsr_c,
setcc = i.data_proc.s;
uint32_t left = reg_pc(i.data_proc.rn),
right = addr_mode_1(i, setcc),
res = 0;
switch(i.data_proc.op)
{
case OP_AND: res = left & right; break;
case OP_EOR: res = left ^ right; break;
case OP_SUB: res = add( left, ~right, 1, setcc); break;
case OP_RSB: res = add(~left, right, 1, setcc); break;
case OP_ADD: res = add( left, right, 0, setcc); break;
case OP_ADC: res = add( left, right, carry, setcc); break;
case OP_SBC: res = add( left, ~right, carry, setcc); break;
case OP_RSC: res = add(~left, right, carry, setcc); break;
case OP_TST: res = left & right; break;
case OP_TEQ: res = left ^ right; break;
case OP_CMP: res = add( left, ~right, 1, setcc); break;
case OP_CMN: res = add( left, right, 0, setcc); break;
case OP_ORR: res = left | right; break;
case OP_MOV: res = right; break;
case OP_BIC: res = left & ~right; break;
case OP_MVN: res = ~right; break;
}
if(i.data_proc.op < OP_TST || i.data_proc.op > OP_CMN)
set_reg_pc(i.data_proc.rd, res);
if(setcc)
{
// Used for returning from exceptions, for instance
if(i.data_proc.rd == 15)
set_cpsr_full(get_spsr());
else
{
arm.cpsr_n = res >> 31;
arm.cpsr_z = res == 0;
}
}
}
else if((insn & 0xFF000F0) == 0x7F000F0)
undefined_instruction();
else if((insn & 0xC000000) == 0x4000000)
{
// LDR, STRB, etc.
uint32_t base = reg_pc(i.mem_proc.rn),
offset = addr_mode_2(i);
if(!i.mem_proc.u)
offset = -offset;
// Pre-indexed or offset
if(i.mem_proc.p)
base += offset; // Writeback for pre-indexed handled after access
else if(i.mem_proc.w) // Usermode Access
mmu_check_priv(base, !i.mem_proc.l);
// Byte access
if(i.mem_proc.b)
{
if(i.mem_proc.l) set_reg_bx(i.mem_proc.rd, read_byte(base));
else write_byte(base, reg_pc_mem(i.mem_proc.rd));
}
else
{
if(i.mem_proc.l) set_reg_bx(i.mem_proc.rd, read_word(base));
else write_word(base, reg_pc_mem(i.mem_proc.rd));
}
// Post-indexed addressing
if(!i.mem_proc.p)
base += offset;
// Writeback
if(!i.mem_proc.p || i.mem_proc.w)
set_reg(i.mem_proc.rn, base);
}
else if((insn & 0xE000000) == 0x8000000)
{
// LDM, STM, etc.
int base_reg = insn >> 16 & 15;
uint32_t addr = reg(base_reg);
uint32_t new_base = addr;
int count = __builtin_popcount(i.mem_multi.reglist);
if (i.mem_multi.u) { // Increasing
if (i.mem_multi.w) // Writeback
new_base += count * 4;
if (i.mem_multi.p) // Preincrement
addr += 4;
} else { // Decreasing
addr -= count * 4;
if (i.mem_multi.w) // Writeback
new_base = addr;
if (!i.mem_multi.p) // Postdecrement
addr += 4;
}
for (unsigned reg = 0, reglist = i.mem_multi.reglist; reglist && reg < 15; reglist >>= 1, reg++) {
if ((reglist & 1) == 0)
continue;
uint32_t *reg_ptr = &arm.reg[reg];
if (i.mem_multi.s && !i.mem_multi.w && !(i.mem_multi.reglist & (1<<15))) {
// User-mode registers
int mode = arm.cpsr_low28 & 0x1F;
if (reg >= 13) {
if (mode != MODE_USR && mode != MODE_SYS) reg_ptr = &arm.r13_usr[reg - 13];
} else if (reg >= 8) {
if (mode == MODE_FIQ) reg_ptr = &arm.r8_usr[reg - 8];
}
}
if (i.mem_multi.l) { // Load
if (reg_ptr == &arm.reg[base_reg]) {
if (i.mem_multi.w) // Writeback
error("Load instruction modifies base register twice");
reg_ptr = &new_base;
}
*reg_ptr = read_word(addr);
} else { // Store
write_word(addr, *reg_ptr);
}
addr += 4;
}
if (i.mem_multi.reglist & (1 << 15)) {
if (i.mem_multi.l) // Load
set_reg_bx(15, read_word(addr));
else // Store
write_word(addr, reg_pc_mem(15));
}
arm.reg[base_reg] = new_base;
if (i.mem_multi.l && i.mem_multi.s && i.mem_multi.reglist & (1<<15))
set_cpsr_full(get_spsr());
}
else if((insn & 0xE000000) == 0xA000000)
{
// B and BL
if(i.branch.l)
arm.reg[14] = arm.reg[15];
arm.reg[15] += (int32_t) (i.branch.immed << 8) >> 6;
arm.reg[15] += 4;
}
else if((insn & 0xF000F10) == 0xE000F10)
do_cp15_instruction(i);
else if((insn & 0xF000F10) == 0xE000E10)
do_cp14_instruction(i);
else if((insn & 0xF000000) == 0xF000000)
cpu_exception(EX_SWI);
else
undefined_instruction();
}

11
src/armv5te/armsnippets.h Normal file
View File

@@ -0,0 +1,11 @@
/* Declarations for armsnippets */
#ifndef _H_ARMSNIPPETS
#define _H_ARMSNIPPETS
//#include <stdbool.h>
#define armloader_cb()
//bool armloader_load_snippet(enum SNIPPETS snippet, struct armloader_load_params params[], unsigned params_num, void (*callback)(struct arm_state *));
#endif

167
src/armv5te/asmcode.c Normal file
View File

@@ -0,0 +1,167 @@
#include "asmcode.h"
#include "debug.h"
#include "mmu.h"
#include "mem.h"
//TODO: Read breakpoints, alignment checks
#if defined(NO_TRANSLATION)
void flush_translations() {}
#endif
uint32_t FASTCALL read_word(uint32_t addr)
{
uintptr_t entry = *(uintptr_t*)(addr_cache + ((addr >> 10) << 1));
//If the sum doesn't contain the address directly
if(unlikely(entry & AC_FLAGS))
{
if(entry & AC_INVALID) //Invalid entry
{
addr_cache_miss(addr, false, data_abort);
return read_word(addr);
}
else //Physical address
{
entry &= ~AC_FLAGS;
entry += addr;
return mmio_read_word(entry);
}
}
entry += addr;
return *(uint32_t*)entry;
}
uint32_t FASTCALL read_byte(uint32_t addr)
{
uintptr_t entry = *(uintptr_t*)(addr_cache + ((addr >> 10) << 1));
//If the sum doesn't contain the address directly
if(unlikely(entry & AC_FLAGS))
{
if(entry & AC_INVALID) //Invalid entry
{
addr_cache_miss(addr, false, data_abort);
return read_byte(addr);
}
else //Physical address
{
entry &= ~AC_FLAGS;
entry += addr;
return mmio_read_byte(entry);
}
}
entry += addr;
return *(uint8_t*)entry;
}
uint32_t FASTCALL read_half(uint32_t addr)
{
addr &= ~1;
uintptr_t entry = *(uintptr_t*)(addr_cache + ((addr >> 10) << 1));
//If the sum doesn't contain the address directly
if(unlikely(entry & AC_FLAGS))
{
if(entry & AC_INVALID) //Invalid entry
{
addr_cache_miss(addr, false, data_abort);
return read_half(addr);
}
else //Physical address
{
entry &= ~AC_FLAGS;
entry += addr;
return mmio_read_half(entry);
}
}
entry += addr;
return *(uint16_t*)entry;
}
void FASTCALL write_byte(uint32_t addr, uint32_t value)
{
uintptr_t entry = *(uintptr_t*)(addr_cache + ((addr >> 10) << 1) + 1);
//If the sum doesn't contain the address directly
if(unlikely(entry & AC_FLAGS))
{
if(entry & AC_INVALID) //Invalid entry
{
addr_cache_miss(addr, true, data_abort);
return write_byte(addr, value);
}
else //Physical address
{
entry &= ~AC_FLAGS;
entry += addr;
return mmio_write_byte(entry, value);
}
}
entry += addr;
if(RAM_FLAGS(entry & ~3) & DO_WRITE_ACTION)
write_action((void*) entry);
*(uint8_t*)entry = value;
}
void FASTCALL write_half(uint32_t addr, uint32_t value)
{
addr &= ~1;
uintptr_t entry = *(uintptr_t*)(addr_cache + ((addr >> 10) << 1) + 1);
//If the sum doesn't contain the address directly
if(unlikely(entry & AC_FLAGS))
{
if(entry & AC_INVALID) //Invalid entry
{
addr_cache_miss(addr, true, data_abort);
return write_half(addr, value);
}
else //Physical address
{
entry &= ~AC_FLAGS;
entry += addr;
return mmio_write_half(entry, value);
}
}
entry += addr;
if(RAM_FLAGS(entry & ~3) & DO_WRITE_ACTION)
write_action((void*) entry);
*(uint16_t*)entry = value;
}
void FASTCALL write_word(uint32_t addr, uint32_t value)
{
uintptr_t entry = *(uintptr_t*)(addr_cache + ((addr >> 10) << 1) + 1);
//If the sum doesn't contain the address directly
if(unlikely(entry & AC_FLAGS))
{
if(entry & AC_INVALID) //Invalid entry
{
addr_cache_miss(addr, true, data_abort);
return write_word(addr, value);
}
else //Physical address
{
entry &= ~AC_FLAGS;
entry += addr;
return mmio_write_word(entry, value);
}
}
entry += addr;
if(RAM_FLAGS(entry & ~3) & DO_WRITE_ACTION)
write_action((void*) entry);
*(uint32_t*)entry = value;
}

50
src/armv5te/asmcode.h Normal file
View File

@@ -0,0 +1,50 @@
/* Declarations for asmcode.S */
#ifndef _H_ASMCODE
#define _H_ASMCODE
#include "emu.h"
#ifdef __cplusplus
extern "C" {
#endif
#if defined(__arm__) || defined(__aarch64__)
// Supply the pointer to the instruction directly to avoid read_instruction
void translation_enter(void *ptr) __asm__("translation_enter");
#define TRANSLATION_ENTER_HAS_PTR 1
#else
void translation_enter() __asm__("translation_enter");
#define TRANSLATION_ENTER_HAS_PTR 0
#endif
// Jump to the translated code starting at ptr.
// Checks for cycle_count_delta and exits if necessary.
void translation_jmp(void *ptr) __asm__("translation_jmp");
// Checks whether code at ptr is now translated and if so, jumps to it
void translation_jmp_ptr(void *ptr) __asm__("translation_jmp_ptr");
void * FASTCALL read_instruction(uint32_t addr) __asm__("read_instruction");
uint32_t FASTCALL read_byte(uint32_t addr) __asm__("read_byte");
uint32_t FASTCALL read_half(uint32_t addr) __asm__("read_half");
uint32_t FASTCALL read_word(uint32_t addr) __asm__("read_word");
void FASTCALL write_byte(uint32_t addr, uint32_t value) __asm__("write_byte");
void FASTCALL write_half(uint32_t addr, uint32_t value) __asm__("write_half");
void FASTCALL write_word(uint32_t addr, uint32_t value) __asm__("write_word");
#if defined(__arm__) || defined(__aarch64__) || defined(__x86_64__)
// For some JITs there's in internal version called by JIT'ed code that can't be called
// from outside the JIT'ed code
uint32_t FASTCALL read_byte_asm(uint32_t addr) __asm__("read_byte_asm");
uint32_t FASTCALL read_half_asm(uint32_t addr) __asm__("read_half_asm");
uint32_t FASTCALL read_word_asm(uint32_t addr) __asm__("read_word_asm");
void FASTCALL write_byte_asm(uint32_t addr, uint32_t value) __asm__("write_byte_asm");
void FASTCALL write_half_asm(uint32_t addr, uint32_t value) __asm__("write_half_asm");
void FASTCALL write_word_asm(uint32_t addr, uint32_t value) __asm__("write_word_asm");
#endif
#ifdef __cplusplus
}
#endif
#endif

View File

@@ -0,0 +1,400 @@
.macro loadsym reg, name
#ifdef __clang__
adrp \reg, \name\()@PAGE
add \reg, \reg, \name\()@PAGEOFF
#else
adrp \reg, \name
add \reg, \reg, #:lo12:\name
#endif
.endm
.data
.align 3
.global arm
.global cycle_count_delta
.global cpu_events
.global addr_cache
translation_sp: .global translation_sp
.xword 0
.text
.align 2
.global data_abort
translation_enter: .global translation_enter
stp x19, x30, [sp, #-16]!
stp x21, x22, [sp, #-16]!
stp x23, x24, [sp, #-16]!
stp x25, x26, [sp, #-16]!
// Store s into translation_sp
mov x1, sp
loadsym x2, translation_sp
str x1, [x2]
loadsym x19, arm
loadsym x26, addr_cache
ldr x26, [x26]
bl load_virt
b translation_next_enter
// Enter translation, check for thumb
translation_next_bx: .global translation_next_bx
tbnz w0, #0, to_thumb // if(pc & 1) goto to_thumb;
// Enter translation; sets arm.reg[15] = w0
translation_next: .global translation_next
mrs x17, nzcv
str w0, [x19, #15*4]
mov w1, w0
lsr x0, x0, #10
lsl x0, x0, #4
ldr x0, [x26, x0] // x0 = addr_cache[(x0 >> 10) << 1]
tbnz x0, #0, save_return // if(x0 & 1) goto save_return;
// Load RAM_FLAGS
add x0, x0, x1 // x0 = pointer to memory at x0
// Enter translation at x0 (has to be ptr to arm.reg[15]'s memory)
translation_next_enter:
loadsym x23, cpu_events
ldr w23, [x23]
cbnz w23, save_return // if(cpu_events) goto save_return;
mov x21, #80*1024*1024
ldr w21, [x0, x21] // w21 = RAM_FLAGS(x0)
tbz w21, #5, save_return // if((RAM_FLAGS(x0) & RF_CODE_TRANSLATED) == 0) goto save_return;
lsr w21, w21, #9 // w21 = w21 >> RFS_TRANSLATION_INDEX
loadsym x23, translation_table
add x23, x23, x21, lsl #5 // x23 = &translation_table[RAM_FLAGS(x0) >> RFS_TRANSLATION_INDEX]
ldr x24, [x23, #1*8] // x24 = x3->jump_table
ldp x25, x21, [x23, #2*8] // x25 = x23->start_ptr; x21 = x23->end_ptr
sub x21, x21, x0 // x21 = end_ptr - insn_ptr
lsr x21, x21, #2 // x21: number of instructions until the end
sub x25, x0, x25 // x25 = insn_ptr - start_ptr
//lsr x25, x25, #2 // x25 = count of instructions
//lsl x25, x25, #3
lsl x25, x25, #1
ldr x0, [x24, x25] // x0 = jump_table[(insn_ptr - start_ptr) / 4]
// add number of instructions to cycle_count_delta
loadsym x24, cycle_count_delta
ldr w25, [x24]
add w25, w25, w21
str w25, [x24]
cmp w25, #0
bpl save_return // if(cycle_count_delta > 0) goto save_return;
msr nzcv, x17
br x0
translation_jmp_ptr: .global translation_jmp_ptr
mrs x17, nzcv
b translation_next_enter
translation_jmp: .global translation_jmp
mrs x17, nzcv
// add number of instructions to cycle_count_delta
loadsym x24, cycle_count_delta
ldr w25, [x24]
adds w25, w25, #4 // We don't know how much will be executed, so use a possible number
bpl save_return
str w25, [x24]
msr nzcv, x17
br x0
to_thumb:
mrs x17, nzcv
sub w0, w0, #1
str w0, [x19, #15*4] // arm.reg[15] = w0 - 1
ldr w1, [x19, #16*4]
orr w1, w1, #0x20
str w1, [x19, #16*4] // arm.cpsr_low28 |= 0x20
save_return:
loadsym x0, translation_sp
mov x1, #0
str x1, [x0]
bl save_virt
ldp x25, x26, [sp], #16
ldp x23, x24, [sp], #16
ldp x21, x22, [sp], #16
ldp x19, x30, [sp], #16
ret
// Saves the virtual CPU state
save_virt:
stp w2, w3, [x19, #0*4]
stp w4, w5, [x19, #2*4]
stp w6, w7, [x19, #4*4]
stp w8, w9, [x19, #6*4]
stp w10, w11, [x19, #8*4]
stp w12, w13, [x19, #10*4]
stp w14, w15, [x19, #12*4]
str w16, [x19, #14*4]
// Save nzcv (in x17) to struct arm_state again
ubfx x2, x17, #31, #1
ubfx x3, x17, #30, #1
ubfx x4, x17, #29, #1
ubfx x5, x17, #28, #1
strb w2, [x19, #17*4+0]
strb w3, [x19, #17*4+1]
strb w4, [x19, #17*4+2]
strb w5, [x19, #17*4+3]
ret
// Loads the virtual CPU state
// x19 has to be a pointer to the arm_state
load_virt:
// Assemble virtual cpsr_nzcv in x17
ldrb w17, [x19, #17*4+0] // x17 = bit 31
ldrb w3, [x19, #17*4+1] // w3 = bit 30
ldrb w4, [x19, #17*4+2] // w4 = bit 29
ldrb w5, [x19, #17*4+3] // w5 = bit 28
lsl w17, w17, #31
bfi w17, w3, #30, #1
bfi w17, w4, #29, #1
bfi w17, w5, #28, #1
ldp w2, w3, [x19, #0*4]
ldp w4, w5, [x19, #2*4]
ldp w6, w7, [x19, #4*4]
ldp w8, w9, [x19, #6*4]
ldp w10, w11, [x19, #8*4]
ldp w12, w13, [x19, #10*4]
ldp w14, w15, [x19, #12*4]
ldr w16, [x19, #14*4]
ret
read_word_asm: .global read_word_asm
lsr w22, w0, #10
add x21, x26, x22, lsl #4 // x21 = &addr_cache[(x0 >> 10) << 1]
0: ldr x22, [x21] // x22 = *x21
tbnz x22, #0, 1f
ldr w0, [x22, x0]
ret
// Not cached
1: tbnz x22, #1, 2f
// MMIO
bic x22, x22, #3
stp x30, x23, [sp, #-16]!
add x0, x0, x22
mrs x17, nzcv
bl save_virt
bl mmio_read_word
bl load_virt
ldp x30, x23, [sp], #16
msr nzcv, x17
ret
// Invalid
2: stp x30, x23, [sp, #-16]!
stp x0, x1, [sp, #-16]!
mrs x17, nzcv
bl save_virt
mov x1, #0
loadsym x2, data_abort
bl addr_cache_miss
bl load_virt
ldp x0, x1, [sp], #16
ldp x30, x23, [sp], #16
msr nzcv, x17
b 0b // Try again
read_half_asm: .global read_half_asm
bic w22, w22, #1
lsr w22, w0, #10
add x21, x26, x22, lsl #4 // x21 = &addr_cache[(x0 >> 10) << 1]
0: ldr x22, [x21] // x22 = *x21
tbnz x22, #0, 1f
ldrh w0, [x22, x0]
ret
// Not cached
1: tbnz x22, #1, 2f
// MMIO
bic x22, x22, #3
stp x30, x23, [sp, #-16]!
add x0, x0, x22
mrs x17, nzcv
bl save_virt
bl mmio_read_half
bl load_virt
ldp x30, x23, [sp], #16
msr nzcv, x17
ret
// Invalid
2: stp x30, x23, [sp, #-16]!
stp x0, x1, [sp, #-16]!
mrs x17, nzcv
bl save_virt
mov x1, #0
loadsym x2, data_abort
bl addr_cache_miss
bl load_virt
ldp x0, x1, [sp], #16
ldp x30, x23, [sp], #16
msr nzcv, x17
b 0b // Try again
read_byte_asm: .global read_byte_asm
lsr w22, w0, #10
add x21, x26, x22, lsl #4 // x21 = &addr_cache[(x0 >> 10) << 1]
0: ldr x22, [x21] // x22 = *x21
tbnz x22, #0, 1f
ldrb w0, [x22, x0]
ret
// Not cached
1: tbnz x22, #1, 2f
// MMIO
bic x22, x22, #3
stp x30, x23, [sp, #-16]!
add x0, x0, x22
mrs x17, nzcv
bl save_virt
bl mmio_read_byte
bl load_virt
ldp x30, x23, [sp], #16
msr nzcv, x17
ret
// Invalid
2: stp x30, x23, [sp, #-16]!
stp x0, x1, [sp, #-16]!
mrs x17, nzcv
bl save_virt
mov x1, #0
loadsym x2, data_abort
bl addr_cache_miss
bl load_virt
ldp x0, x1, [sp], #16
ldp x30, x23, [sp], #16
msr nzcv, x17
b 0b // Try again
write_word_asm: .global write_word_asm
lsr w22, w0, #10
add x21, x26, x22, lsl #4 // x21 = &addr_cache[(x0 >> 10) << 1]
0: ldr x22, [x21, #8] // x22 = *(x21+1)
tbnz x22, #0, 1f
str w1, [x22, x0]
ret
// Not cached
1: tbnz x22, #1, 2f
// MMIO
bic x22, x22, #3
stp x30, x23, [sp, #-16]!
add x0, x0, x22
mrs x17, nzcv
bl save_virt
bl mmio_write_word
bl load_virt
ldp x30, x23, [sp], #16
msr nzcv, x17
ret
// Invalid
2: stp x30, x23, [sp, #-16]!
stp x0, x1, [sp, #-16]!
mrs x17, nzcv
bl save_virt
mov x1, #1
loadsym x2, data_abort
bl addr_cache_miss
bl load_virt
ldp x0, x1, [sp], #16
ldp x30, x23, [sp], #16
msr nzcv, x17
b 0b // Try again
write_half_asm: .global write_half_asm
bic w22, w22, #1
lsr w22, w0, #10
add x21, x26, x22, lsl #4 // x21 = &addr_cache[(x0 >> 10) << 1]
0: ldr x22, [x21, #8] // x22 = *(x21+1)
tbnz x22, #0, 1f
strh w1, [x22, x0]
ret
// Not cached
1: tbnz x22, #1, 2f
// MMIO
bic x22, x22, #3
stp x30, x23, [sp, #-16]!
add x0, x0, x22
mrs x17, nzcv
bl save_virt
bl mmio_write_half
bl load_virt
ldp x30, x23, [sp], #16
msr nzcv, x17
ret
// Invalid
2: stp x30, x23, [sp, #-16]!
stp x0, x1, [sp, #-16]!
mrs x17, nzcv
bl save_virt
mov x1, #1
loadsym x2, data_abort
bl addr_cache_miss
bl load_virt
ldp x0, x1, [sp], #16
ldp x30, x23, [sp], #16
msr nzcv, x17
b 0b // Try again
write_byte_asm: .global write_byte_asm
lsr w22, w0, #10
add x21, x26, x22, lsl #4 // x21 = &addr_cache[(x0 >> 10) << 1]
0: ldr x22, [x21, #8] // x22 = *(x21+1)
tbnz x22, #0, 1f
strb w1, [x22, x0]
ret
// Not cached
1: tbnz x22, #1, 2f
// MMIO
bic x22, x22, #3
stp x30, x23, [sp, #-16]!
add x0, x0, x22
mrs x17, nzcv
bl save_virt
bl mmio_write_byte
bl load_virt
ldp x30, x23, [sp], #16
msr nzcv, x17
ret
// Invalid
2: stp x30, x23, [sp, #-16]!
stp x0, x1, [sp, #-16]!
mrs x17, nzcv
bl save_virt
mov x1, #1
loadsym x2, data_abort
bl addr_cache_miss
bl load_virt
ldp x0, x1, [sp], #16
ldp x30, x23, [sp], #16
msr nzcv, x17
b 0b // Try again

334
src/armv5te/asmcode_arm.S Normal file
View File

@@ -0,0 +1,334 @@
.data
translation_sp: .global translation_sp
.word 0
.global arm
.global get_cpsr_flags
.global set_cpsr_flags
.global cycle_count_delta
.global cpu_events
.global read_instruction
.text
#ifdef __clang__
#define streqh strheq
#define streqb strbeq
#define ldreqh ldrheq
#define ldreqb ldrbeq
#endif
#define RF_CODE_TRANSLATED 32
#define RFS_TRANSLATION_INDEX 9
#define AC_INVALID 0b10
#define AC_NOT_PTR 0b01
#define AC_FLAGS (AC_INVALID|AC_NOT_PTR)
#if defined(__clang__)
/* On iOS, .text relocations are permitted and due to
a bug it's unable to handle our way of
avoiding them anyway... */
.macro sym name, no=1
.endm
.macro loadsym reg, name, no=1
ldr \reg, =\name
.endm
#else
/* What you can see here is a really bad way of avoiding
relocations in the .text section.
For each use of an external symbol, you need to insert
a sym (name), (number) here, which generates a word containing the
distance to the symbol relative to pc.
To use it, use loadsym (reg), (name), (number).
The whole process is a way of working around
https://sourceware.org/bugzilla/show_bug.cgi?id=18009
*/
.macro sym name, no=1
addr_\name\()_\no\(): .word \name - _tmp_\name\()_\no - 8
.endm
.macro loadsym reg, name, no=1
ldr \reg, addr_\name\()_\no
_tmp_\name\()_\no: add \reg, \reg, pc
.endm
sym translation_sp
sym arm
sym cpu_events
sym translation_table
sym cycle_count_delta, 2
sym translation_sp, 2
//sym cpu_events, 2
sym cycle_count_delta, 3
sym addr_cache
sym data_abort
sym addr_cache, 2
sym data_abort, 2
sym addr_cache, 3
sym data_abort, 3
sym addr_cache, 4
sym data_abort, 4
sym addr_cache, 5
sym data_abort, 5
sym addr_cache, 6
sym data_abort, 6
#endif
// r0: pointer to the instruction
translation_enter: .global translation_enter
push {r4-r11, lr}
mov r4, r0
loadsym r0, translation_sp
str sp, [r0]
bl get_cpsr
mov r11, r0 // r11 = cpsr
mov r0, r4
add r1, r0, #80*1024*1024 // r1 = &(RAM_FLAGS(r0))
ldr r1, [r1]
loadsym r10, arm // r10 is a pointer to the global arm_state
b translation_next_enter
// r0: pc
translation_next_bx: .global translation_next_bx
tst r0, #1
bne to_thumb
// r0: pc
translation_next: .global translation_next
str r0, [r10, #15*4] // save to arm.reg[15]
bl read_instruction // r0 = pointer to ARM code
cmp r0, #0
beq save_return
translation_jmp_ptr: .global translation_jmp_ptr
add r1, r0, #80*1024*1024 // r1 = &(RAM_FLAGS(r0))
ldr r1, [r1]
tst r1, #RF_CODE_TRANSLATED
beq save_return // not translated
// r0: pointer to instruction
// r1: RAM_FLAGS(r0)
translation_next_enter:
loadsym r2, cpu_events
ldr r2, [r2]
cmp r2, #0
bne save_return
mov r1, r1, lsr #RFS_TRANSLATION_INDEX // r1 is translation index
mov r1, r1, lsl #4
loadsym r2, translation_table
add r1, r2, r1 // r1 points to struct translation now
ldr r2, [r1, #1*4] // load translation.jump_table
ldr r3, [r1, #2*4] // load translation.start_ptr
ldr r4, [r1, #3*4] // load translation.end_ptr
sub r4, r4, r0 // r4 = end_ptr - pc_ptr
mov r4, r4, lsr #2 // r4 = number of instructions to the end
loadsym r6, cycle_count_delta, 2
ldr r5, [r6]
add r5, r5, r4 // add r4 to cycle_count_delta
str r5, [r6]
cmp r5, #0
bpl save_return
sub r0, r0, r3 // r0 = pc_ptr - start_ptr
msr cpsr_f, r11
ldr pc, [r2, r0] // jump to jump_table[r0]
to_thumb:
sub r0, r0, #1
str r0, [r10, #15*4] // arm.reg[PC] = r0
ldr r1, [r10, #16*4]
orr r1, r1, #0x20 // Set thumb bit
str r1, [r10, #16*4]
b save_return
// Invoked from within translated code to jump to other, already translated code
// Target address of translated code is in r0 - only r10 and r11 have to be preserved
// This is used to check for events and leave the translation to process them.
// arm.reg[15] must be set already!
translation_jmp: .global translation_jmp
/* loadsym r1, cpu_events, 2
ldr r2, [r1]
cmp r2, #0
bne save_return*/
loadsym r1, cycle_count_delta, 3
ldr r2, [r1]
add r2, #4 // We don't know how much will be executed, so use a possible number
str r2, [r1]
cmp r2, #0
bpl save_return
msr cpsr_f, r11
bx r0 // Jump to the target
// Save flags and leave, arm.reg[15] must be set already!
save_return:
loadsym r1, translation_sp, 2
mov r0, #0
str r0, [r1]
str r11, [r10, #18*4] // save to arm.cpsr_flags
mov r0, r11 // apply arm.cpsr_flags to arm.cpsr_*
pop {r4-r11, lr}
b set_cpsr_flags
// Below is basically a handcoded assembly version of asmcode.c
//TODO: Invoke write_action for translation invalidation!
write_word_asm: .global write_word_asm
// r0 is address, r1 is value
loadsym r2, addr_cache
ldr r2, [r2]
mov r3, r0, lsr #9
orr r3, r3, #1
ldr r3, [r2, r3, lsl #2] // r3 contains ac_entry
tst r3, #AC_FLAGS
streq r1, [r3, r0]
bxeq lr
str r11, [r10, #18*4] // save to arm.cpsr_flags
tst r3, #AC_INVALID
bne write_word_invalid
bic r3, #AC_FLAGS
add r0, r3, r0
b mmio_write_word
write_word_invalid:
push {r0, r1, r2, lr} //r2 for stack alignment
mov r1, #1
loadsym r2, data_abort
bl addr_cache_miss
pop {r0, r1, r2, lr}
b write_word_asm
write_half_asm: .global write_half_asm
// r0 is address, r1 is value
loadsym r2, addr_cache, 2
bic r0, r0, #1
ldr r2, [r2]
mov r3, r0, lsr #9
orr r3, r3, #1
ldr r3, [r2, r3, lsl #2] // r3 contains ac_entry
tst r3, #AC_FLAGS
streqh r1, [r3, r0]
bxeq lr
str r11, [r10, #18*4] // save to arm.cpsr_flags
tst r3, #AC_INVALID
bne write_half_invalid
bic r3, #AC_FLAGS
add r0, r3, r0
b mmio_write_half
write_half_invalid:
push {r0, r1, r2, lr} //r2 for stack alignment
mov r1, #1
loadsym r2, data_abort, 2
bl addr_cache_miss
pop {r0, r1, r2, lr}
b write_half_asm
write_byte_asm: .global write_byte_asm
// r0 is address, r1 is value
loadsym r2, addr_cache, 3
ldr r2, [r2]
mov r3, r0, lsr #9
orr r3, r3, #1
ldr r3, [r2, r3, lsl #2] // r3 contains ac_entry
tst r3, #AC_FLAGS
streqb r1, [r3, r0]
bxeq lr
str r11, [r10, #18*4] // save to arm.cpsr_flags
tst r3, #AC_INVALID
bne write_byte_invalid
bic r3, #AC_FLAGS
add r0, r3, r0
b mmio_write_byte
write_byte_invalid:
push {r0, r1, r2, lr} //r2 for stack alignment
mov r1, #1
loadsym r2, data_abort, 3
bl addr_cache_miss
pop {r0, r1, r2, lr}
b write_byte_asm
read_word_asm: .global read_word_asm
// r0 is address
loadsym r2, addr_cache, 4
ldr r2, [r2]
mov r3, r0, lsr #10
ldr r3, [r2, r3, lsl #3] // r3 contains ac_entry
tst r3, #AC_FLAGS
ldreq r0, [r3, r0]
bxeq lr
str r11, [r10, #18*4] // save to arm.cpsr_flags
tst r3, #AC_INVALID
bne read_word_invalid
bic r3, #AC_FLAGS
add r0, r3, r0
b mmio_read_word
read_word_invalid:
push {r0, lr}
mov r1, #0
loadsym r2, data_abort, 4
bl addr_cache_miss
pop {r0, lr}
b read_word_asm
read_half_asm: .global read_half_asm
// r0 is address
loadsym r2, addr_cache, 5
bic r0, r0, #1
ldr r2, [r2]
mov r3, r0, lsr #10
ldr r3, [r2, r3, lsl #3] // r3 contains ac_entry
tst r3, #AC_FLAGS
ldreqh r0, [r3, r0]
bxeq lr
str r11, [r10, #18*4] // save to arm.cpsr_flags
tst r3, #AC_INVALID
bne read_half_invalid
bic r3, #AC_FLAGS
add r0, r3, r0
b mmio_read_half
read_half_invalid:
push {r0, lr}
mov r1, #0
loadsym r2, data_abort, 5
bl addr_cache_miss
pop {r0, lr}
b read_half_asm
read_byte_asm: .global read_byte_asm
// r0 is address
loadsym r2, addr_cache, 6
ldr r2, [r2]
mov r3, r0, lsr #10
ldr r3, [r2, r3, lsl #3] // r3 contains ac_entry
tst r3, #AC_FLAGS
ldreqb r0, [r3, r0]
bxeq lr
str r11, [r10, #18*4] // save to arm.cpsr_flags
tst r3, #AC_INVALID
bne read_byte_invalid
bic r3, #AC_FLAGS
add r0, r3, r0
b mmio_read_byte
read_byte_invalid:
push {r0, lr}
mov r1, #0
loadsym r2, data_abort, 6
bl addr_cache_miss
pop {r0, lr}
b read_byte_asm

496
src/armv5te/asmcode_x86.S Normal file
View File

@@ -0,0 +1,496 @@
// arm_state structure offsets
#define ARM_PC 60
#define ARM_CPSR 64
#define ARM_FLAG_C 70
#define ARM_CONTROL 72
// translation structure offsets
#define TRANS_JUMP_TABLE 4
#define TRANS_END_PTR 12
#define RAM_FLAGS (80*1024*1024) // = MEM_MAXSIZE
#define RF_READ_BREAKPOINT 1
#define RF_WRITE_BREAKPOINT 2
#define RF_EXEC_BREAKPOINT 4
#define RF_EXEC_DEBUG_NEXT 8
#define RF_CODE_TRANSLATED 32
#define RF_CODE_NO_TRANSLATE 64
#define RF_READ_ONLY 128
#define RF_ARMLOADER_CB 256
#define RFS_TRANSLATION_INDEX 9
#define WRITE_SPECIAL_FLAGS 2+32+64
// List of locations of addresses which need to be relocated to addr_cache
// (necessary since it's now allocated at runtime)
.data
.globl ac_reloc_start
ac_reloc_start:
.macro AC_RELOC; 0: .data; .long 0b - 4; .text; .endm
.text
.globl translation_enter
translation_enter:
pushl %ebp
movl %esp, %ebp
pushl %ebx
pushl %esi
pushl %edi
movl %esp, in_translation_esp
movl $arm, %ebx
movl ARM_PC(%ebx), %eax
jmp translation_next
.globl translation_next_bx
translation_next_bx:
testb $1, %al
jne switch_to_thumb
.globl translation_next
translation_next:
movl %eax, ARM_PC(%ebx)
cmpl $0, cycle_count_delta
jns return
cmpl $0, cpu_events
jnz return
// eax = VM_MEM_PTR(eax)
movl %eax, %ecx
shrl $10, %ecx
addl 0(, %ecx, 8), %eax
AC_RELOC
testl $0x80000003, %eax
jnz return
addr_ok:
movl RAM_FLAGS(%eax), %edx
testb $RF_CODE_TRANSLATED, %dl
jz return // Not translated
movl %eax, in_translation_pc_ptr
shrl $RFS_TRANSLATION_INDEX, %edx
shll $4, %edx
addl $translation_table, %edx
// Add one cycle for each instruction from this point to the end
movl TRANS_END_PTR(%edx), %ecx
subl %eax, %ecx
shrl $2, %ecx
addl %ecx, cycle_count_delta
movl TRANS_JUMP_TABLE(%edx), %edx
jmp *(%edx, %eax)
return:
andl $0, in_translation_esp
popl %edi
popl %esi
popl %ebx
popl %ebp
ret
switch_to_thumb:
decl %eax
movl %eax, ARM_PC(%ebx)
orb $0x20, ARM_CPSR(%ebx)
jmp return
// These shift procedures are called only from translated code,
// so they may assume that %ebx == _arm
.align 4
.globl arm_shift_proc
arm_shift_proc:
.long lsl
.long lsr
.long asr
.long 0
.long lsl_carry
.long lsr_carry
.long asr_carry
.long ror_carry
.text
lsl:
cmpb $32, %cl
jae ls_32
shll %cl, %eax
ret
lsr:
cmpb $32, %cl
jae ls_32
shrl %cl, %eax
ret
ls_32:
xorl %eax, %eax
ret
asr:
cmpb $32, %cl
jae asr_32
sarl %cl, %eax
ret
asr_32:
sarl $31, %eax
ret
lsl_carry:
cmpb $32, %cl
jae lsl_carry_32
testb %cl, %cl
je lsl_carry_zero
shll %cl, %eax
setc ARM_FLAG_C(%ebx)
lsl_carry_zero:
ret
lsl_carry_32:
jne ls_carry_33
shrl $1, %eax
setc ARM_FLAG_C(%ebx)
xorl %eax, %eax
ret
lsr_carry:
cmpb $32, %cl
jae lsr_carry_32
testb %cl, %cl
je lsr_carry_zero
shrl %cl, %eax
setc ARM_FLAG_C(%ebx)
lsr_carry_zero:
ret
lsr_carry_32:
jne ls_carry_33
shll $1, %eax
setc ARM_FLAG_C(%ebx)
xorl %eax, %eax
ret
ls_carry_33:
xorl %eax, %eax
movb %al, ARM_FLAG_C(%ebx)
ret
asr_carry:
cmpb $32, %cl
jae asr_carry_32
testb %cl, %cl
je asr_carry_zero
sarl %cl, %eax
setc ARM_FLAG_C(%ebx)
asr_carry_zero:
ret
asr_carry_32:
sarl $31, %eax
sets ARM_FLAG_C(%ebx)
ret
ror_carry:
testb $31, %cl
jz ror_carry_mult_32
rorl %cl, %eax
setc ARM_FLAG_C(%ebx)
ror_carry_zero:
ret
ror_carry_mult_32:
testb %cl, %cl
je ror_carry_zero
testl %eax, %eax
sets ARM_FLAG_C(%ebx)
ret
// uint32_t FASTCALL read_byte(uint32_t addr);
.globl read_byte
.align 16
read_byte:
movl %ecx, %eax
shrl $10, %eax
addl 0(, %eax, 8), %ecx
AC_RELOC
js rb_slow
movl %ecx, %edx
andl $-4, %edx
testb $RF_READ_BREAKPOINT, RAM_FLAGS(%edx)
jnz rb_special
rb_fast:
movzbl (%ecx), %eax
ret
rb_special:
call read_special
jmp rb_fast
rb_slow:
movl 0(, %eax, 8), %eax
AC_RELOC
subl %eax, %ecx
shll $10, %eax
jc rb_miss
addl %eax, %ecx
jmp mmio_read_byte
rb_miss:
call read_miss
jmp read_byte
// uint32_t FASTCALL read_half(uint32_t addr);
.globl read_half
.align 16
read_half:
movl %ecx, %eax
shrl $10, %eax
addl 0(, %eax, 8), %ecx
AC_RELOC
testl $0x80000001, %ecx
jnz rh_slow
movl %ecx, %edx
andl $-4, %edx
testb $RF_READ_BREAKPOINT, RAM_FLAGS(%edx)
jnz rh_special
rh_fast:
movzwl (%ecx), %eax
ret
rh_special:
call read_special
jmp rh_fast
rh_slow:
movl 0(, %eax, 8), %eax
AC_RELOC
subl %eax, %ecx
testl $1, %ecx
jnz rh_unaligned
shll $10, %eax
jc rh_miss
addl %eax, %ecx
jmp mmio_read_half
rh_miss:
call read_miss
jmp read_half
rh_unaligned:
call align_fault
decl %ecx
jmp read_half
// uint32_t FASTCALL read_word(uint32_t addr);
.globl read_word
.align 16
read_word:
movl %ecx, %eax
shrl $10, %eax
addl 0(, %eax, 8), %ecx
AC_RELOC
testl $0x80000003, %ecx
jnz rw_slow
testb $RF_READ_BREAKPOINT, RAM_FLAGS(%ecx)
jnz rw_special
rw_fast:
movl (%ecx), %eax
ret
rw_special:
call read_special
jmp rw_fast
rw_slow:
movl 0(, %eax, 8), %eax
AC_RELOC
subl %eax, %ecx
testl $3, %ecx
jnz rw_unaligned
shll $10, %eax
jc rw_miss
addl %eax, %ecx
jmp mmio_read_word
rw_miss:
call read_miss
jmp read_word
rw_unaligned:
call align_fault
andl $-4, %ecx
jmp read_word
// uint32_t FASTCALL read_word_ldr(uint32_t addr);
.globl read_word_ldr
.align 16
read_word_ldr:
movl %ecx, %eax
shrl $10, %eax
addl 0(, %eax, 8), %ecx
AC_RELOC
testl $0x80000003, %ecx
jnz rwl_slow
testb $RF_READ_BREAKPOINT, RAM_FLAGS(%ecx)
jnz rw_special
movl (%ecx), %eax
ret
rwl_slow:
movl 0(, %eax, 8), %eax
AC_RELOC
subl %eax, %ecx
testl $3, %ecx
jnz rwl_unaligned
shll $10, %eax
jc rw_miss
addl %eax, %ecx
jmp mmio_read_word
rwl_unaligned:
pushl %ecx
call rw_unaligned
popl %ecx
shll $3, %ecx // Unaligned ldr rotates the word so that
rorl %cl, %eax // addressed byte ends up in low position
ret
read_special:
pushl %ecx
pushl %ecx
call read_action
popl %ecx
popl %ecx
ret
read_miss:
pushl %ecx
pushl $data_abort
pushl $0
pushl %ecx
call addr_cache_miss
addl $12, %esp
popl %ecx
ret
// void FASTCALL write_byte(uint32_t addr, uint8_t value);
.globl write_byte
.align 16
write_byte:
movl %ecx, %eax
shrl $10, %eax
addl 4(, %eax, 8), %ecx
AC_RELOC
js wb_slow
movl %ecx, %eax
andl $-4, %eax
testb $WRITE_SPECIAL_FLAGS, RAM_FLAGS(%eax)
jnz wb_special
wb_fast:
movb %dl, (%ecx)
ret
wb_special:
call write_special
jmp wb_fast
wb_slow:
movl 4(, %eax, 8), %eax
AC_RELOC
subl %eax, %ecx
shll $10, %eax
jc wb_miss
addl %eax, %ecx
jmp mmio_write_byte
wb_miss:
call write_miss
jmp write_byte
// void FASTCALL write_half(uint32_t addr, uint16_t value);
.globl write_half
.align 16
write_half:
movl %ecx, %eax
shrl $10, %eax
addl 4(, %eax, 8), %ecx
AC_RELOC
testl $0x80000001, %ecx
jnz wh_slow
movl %ecx, %eax
andl $-4, %eax
testb $WRITE_SPECIAL_FLAGS, RAM_FLAGS(%eax)
jnz wh_special
wh_fast:
movw %dx, (%ecx)
ret
wh_special:
call write_special
jmp wh_fast
wh_slow:
movl 4(, %eax, 8), %eax
AC_RELOC
subl %eax, %ecx
testl $1, %ecx
jnz wh_unaligned
shll $10, %eax
jc wh_miss
addl %eax, %ecx
jmp mmio_write_half
wh_miss:
call write_miss
jmp write_half
wh_unaligned:
call align_fault
decl %ecx
jmp write_half
// void FASTCALL write_word(uint32_t addr, uint32_t value);
.globl write_word
.align 16
write_word:
movl %ecx, %eax
shrl $10, %eax
addl 4(, %eax, 8), %ecx
AC_RELOC
testl $0x80000003, %ecx
jnz ww_slow
testb $WRITE_SPECIAL_FLAGS, RAM_FLAGS(%ecx)
jnz ww_special
ww_fast:
movl %edx, (%ecx)
ret
ww_special:
call write_special
jmp ww_fast
ww_slow:
movl 4(, %eax, 8), %eax
AC_RELOC
subl %eax, %ecx
testl $3, %ecx
jnz ww_unaligned
shll $10, %eax
jc ww_miss
addl %eax, %ecx
jmp mmio_write_word
ww_miss:
call write_miss
jmp write_word
ww_unaligned:
call align_fault
andl $-4, %ecx
jmp write_word
write_special:
pushl %edx
pushl %ecx
pushl %ecx
call write_action
popl %ecx
popl %ecx
popl %edx
ret
write_miss:
pushl %edx
pushl %ecx
pushl $data_abort
pushl $1
pushl %ecx
call addr_cache_miss
addl $12, %esp
popl %ecx
popl %edx
ret
align_fault:
testb $2, arm+ARM_CONTROL
jz 1f
pushl $1
pushl %ecx
call data_abort
1: ret
.data
.globl ac_reloc_end
ac_reloc_end:

View File

@@ -0,0 +1,335 @@
// arm_state structure offsets
#define ARM_PC 60
#define ARM_CPSR 64
#define ARM_FLAG_C 70
#define ARM_CONTROL 72
// translation structure offsets
#define TRANS_JUMP_TABLE 0x08
#define TRANS_START_PTR 0x10
#define TRANS_END_PTR 0x18
// RAM_FLAGS used to have "// = MEM_MAXSIZE" at the end but the clang assembler copys the "//" into the macro, commenting out the arguments of the opcodes that use it
#define RAM_FLAGS (80*1024*1024)
#define RF_READ_BREAKPOINT 1
#define RF_WRITE_BREAKPOINT 2
#define RF_EXEC_BREAKPOINT 4
#define RF_EXEC_DEBUG_NEXT 8
#define RF_CODE_TRANSLATED 32
#define RF_CODE_NO_TRANSLATE 64
#define RF_READ_ONLY 128
#define RF_ARMLOADER_CB 256
#define RFS_TRANSLATION_INDEX 9
#define DO_READ_ACTION (RF_READ_BREAKPOINT)
#define DO_WRITE_ACTION (RF_WRITE_BREAKPOINT | RF_CODE_TRANSLATED | RF_CODE_NO_TRANSLATE)
translation_enter: .global translation_enter
push %rbp
mov %rsp, %rbp
push %rbx
push %rsi
push %rdi
mov %rsp, in_translation_rsp(%rip)
lea arm(%rip), %rbx
mov ARM_PC(%rbx), %eax
jmp translation_next
translation_next_bx: .global translation_next_bx
testb $1, %al
jne switch_to_thumb
translation_next: .global translation_next
mov %eax, ARM_PC(%rbx)
lea cycle_count_delta(%rip), %r8
cmpl $0, (%r8)
jns return
lea cpu_events(%rip), %r8
cmpl $0, (%r8)
jnz return
mov ARM_PC(%rbx), %edi
push %rdi // For 16 byte stack alignment (call pushes 8 itself)
call read_instruction
pop %rdi
cmp $0, %rax
jz return
addr_ok:
movl RAM_FLAGS(%rax), %edx
testb $RF_CODE_TRANSLATED, %dl
jz return // Not translated
lea in_translation_pc_ptr(%rip), %r8
mov %rax, (%r8)
shr $RFS_TRANSLATION_INDEX, %rdx
shl $5, %rdx
lea translation_table(%rip), %r8
add %r8, %rdx
// Add one cycle for each instruction from this point to the end
mov TRANS_END_PTR(%rdx), %rcx
sub %rax, %rcx
shr $2, %rcx
lea cycle_count_delta(%rip), %r8
add %ecx, (%r8)
mov %rax, %rcx
sub TRANS_START_PTR(%rdx), %rcx
mov TRANS_JUMP_TABLE(%rdx), %rdx
jmp *(%rdx, %rcx, 2)
//That is the same as
//shr $2, %rcx
//jmp *(%rdx, %rcx, 8)
return:
lea in_translation_rsp(%rip), %r8
movq $0, (%r8)
pop %rdi
pop %rsi
pop %rbx
pop %rbp
ret
switch_to_thumb:
dec %eax
mov %eax, ARM_PC(%rbx)
orb $0x20, ARM_CPSR(%rbx)
jmp return
.data
// These shift procedures are called only from translated code,
// so they may assume that %rbx == _arm
.align 4
arm_shift_proc: .global arm_shift_proc
.quad lsl
.quad lsr
.quad asr
.quad 0
.quad lsl_carry
.quad lsr_carry
.quad asr_carry
.quad ror_carry
.text
lsl:
cmpb $32, %cl
jae ls_32
shl %cl, %eax
ret
lsr:
cmpb $32, %cl
jae ls_32
shr %cl, %eax
ret
ls_32:
xor %eax, %eax
ret
asr:
cmpb $32, %cl
jae asr_32
sar %cl, %eax
ret
asr_32:
sar $31, %eax
ret
lsl_carry:
cmpb $32, %cl
jae lsl_carry_32
testb %cl, %cl
je lsl_carry_zero
shl %cl, %eax
setc ARM_FLAG_C(%rbx)
lsl_carry_zero:
ret
lsl_carry_32:
jne ls_carry_33
shr $1, %eax
setc ARM_FLAG_C(%rbx)
xor %eax, %eax
ret
lsr_carry:
cmpb $32, %cl
jae lsr_carry_32
testb %cl, %cl
je lsr_carry_zero
shr %cl, %eax
setc ARM_FLAG_C(%rbx)
lsr_carry_zero:
ret
lsr_carry_32:
jne ls_carry_33
shl $1, %eax
setc ARM_FLAG_C(%rbx)
xor %eax, %eax
ret
ls_carry_33:
xor %eax, %eax
movb %al, ARM_FLAG_C(%rbx)
ret
asr_carry:
cmpb $32, %cl
jae asr_carry_32
testb %cl, %cl
je asr_carry_zero
sar %cl, %eax
setc ARM_FLAG_C(%rbx)
asr_carry_zero:
ret
asr_carry_32:
sar $31, %eax
sets ARM_FLAG_C(%rbx)
ret
ror_carry:
testb $31, %cl
jz ror_carry_mult_32
ror %cl, %eax
setc ARM_FLAG_C(%rbx)
ror_carry_zero:
ret
ror_carry_mult_32:
testb %cl, %cl
je ror_carry_zero
test %eax, %eax
sets ARM_FLAG_C(%rbx)
ret
read_word_asm: .global read_word_asm
mov %rdi, %rax
shr $10, %rax
shl $1, %rax
mov addr_cache(%rip), %r8
mov (%r8, %rax, 8), %rax
test $3, %rax
jnz rwa_miss
movl (%rax, %rdi), %eax
ret
rwa_miss:
push %rdx
push %rcx
call read_word
pop %rcx
pop %rdx
ret
write_word_asm: .global write_word_asm
mov %rdi, %rax
shr $10, %rax
shl $1, %rax
add $1, %rax
mov addr_cache(%rip), %r8
mov (%r8, %rax, 8), %rax
test $3, %rax
jnz wwa_miss
movl %esi, (%rax, %rdi)
testq $DO_WRITE_ACTION, RAM_FLAGS(%rax, %rdi)
jnz write_action_asm
ret
wwa_miss:
push %rdx
push %rcx
call write_word
pop %rcx
pop %rdx
ret
read_half_asm: .global read_half_asm
and $-2, %rdi
mov %rdi, %rax
shr $10, %rax
shl $1, %rax
mov addr_cache(%rip), %r8
mov (%r8, %rax, 8), %rax
test $3, %rax
jnz rha_miss
movzwl (%rax, %rdi), %eax
ret
rha_miss:
push %rdx
push %rcx
call read_half
pop %rcx
pop %rdx
ret
write_half_asm: .global write_half_asm
and $-2, %rdi
mov %rdi, %rax
shr $10, %rax
shl $1, %rax
add $1, %rax
mov addr_cache(%rip), %r8
mov (%r8, %rax, 8), %rax
test $3, %rax
jnz wha_miss
movw %si, (%rax, %rdi)
testq $DO_WRITE_ACTION, RAM_FLAGS(%rax, %rdi)
jnz write_action_asm
ret
wha_miss:
push %rdx
push %rcx
call write_half
pop %rcx
pop %rdx
ret
read_byte_asm: .global read_byte_asm
mov %rdi, %rax
shr $10, %rax
shl $1, %rax
mov addr_cache(%rip), %r8
mov (%r8, %rax, 8), %rax
test $3, %rax
jnz rba_miss
movzb (%rax, %rdi), %rax
ret
rba_miss:
push %rdx
push %rcx
call read_byte
pop %rcx
pop %rdx
ret
write_byte_asm: .global write_byte_asm
mov %rdi, %rax
shr $10, %rax
shl $1, %rax
add $1, %rax
mov addr_cache(%rip), %r8
mov (%r8, %rax, 8), %rax
test $3, %rax
jnz wba_miss
xchg %rsi, %rdx // Can't use %rsi directly
movb %dl, (%rax, %rdi)
xchg %rsi, %rdx
testq $DO_WRITE_ACTION, RAM_FLAGS(%rax, %rdi)
jnz write_action_asm
ret
wba_miss:
push %rdx
push %rcx
call write_byte
pop %rcx
pop %rdx
ret
write_action_asm:
add %rax, %rdi
push %rdx
push %rcx
call write_action
pop %rcx
pop %rdx
ret

81
src/armv5te/bitfield.h Normal file
View File

@@ -0,0 +1,81 @@
#ifndef BITFIELD_H
#define BITFIELD_H
/* Portable and safe implementation of C bitfields
Source: http://blog.codef00.com/2014/12/06/portable-bitfields-using-c11/ */
#include <stdint.h>
#include <stddef.h>
//Mac OS RetroArch port is lacking <type_traits>
template<bool B, class T, class F>
struct typeConditional { typedef T type; };
template<class T, class F>
struct typeConditional<false, T, F> { typedef F type; };
template <size_t LastBit>
struct MinimumTypeHelper {
typedef
typename typeConditional<LastBit == 0 , void,
typename typeConditional<LastBit <= 8 , uint8_t,
typename typeConditional<LastBit <= 16, uint16_t,
typename typeConditional<LastBit <= 32, uint32_t,
typename typeConditional<LastBit <= 64, uint64_t,
void>::type>::type>::type>::type>::type type;
};
template <size_t Index, size_t Bits = 1>
class BitField {
private:
enum {
Mask = (1u << Bits) - 1u
};
typedef typename MinimumTypeHelper<Index + Bits>::type T;
public:
template <class T2>
BitField &operator=(T2 value) {
value_ = (value_ & ~(Mask << Index)) | ((value & Mask) << Index);
return *this;
}
template <typename T2>
T2 as() { return (value_ >> Index) & Mask; }
operator T() const { return (value_ >> Index) & Mask; }
explicit operator bool() const { return value_ & (Mask << Index); }
BitField &operator++() { return *this = *this + 1; }
T operator++(int) { T r = *this; ++*this; return r; }
BitField &operator--() { return *this = *this - 1; }
T operator--(int) { T r = *this; ++*this; return r; }
private:
T value_;
};
template <size_t Index>
class BitField<Index, 1> {
private:
enum {
Bits = 1,
Mask = 0x01
};
typedef typename MinimumTypeHelper<Index + Bits>::type T;
public:
template <typename T2>
T2 as() { return (value_ >> Index) & Mask; }
BitField &operator=(bool value) {
value_ = (value_ & ~(Mask << Index)) | (value << Index);
return *this;
}
operator bool() const { return value_ & (Mask << Index); }
private:
T value_;
};
#endif // BITFIELD_H

170
src/armv5te/coproc.cpp Normal file
View File

@@ -0,0 +1,170 @@
#include "cpu.h"
#include "cpudefs.h"
#include "mmu.h"
extern "C" {
#include "../pxa260/pxa260.h"
#include "../pxa260/pxa260_PwrClk.h"
}
void do_cp15_mrc(uint32_t insn)
{
uint32_t value;
switch (insn & 0xEF00EF) {
case 0x000000: /* MRC p15, 0, <Rd>, c0, c0, 0: ID Code Register */
//value = 0x41069264; /* ARM926EJ-S revision 4 */
//value = 0x69052100;//Intel PXA260 "01101001000001010010000100000000"
value = 0x69052D05;//Intel PXA261 "01101001000001010010110100000101"
break;
case 0x000010: /* MRC p15, 0, <Rd>, c0, c0, 1: Cache Type Register */
value = 0x1D112152; /* ICache: 16KB 4-way 8 word, DCache: 8KB 4-way 8 word */
break;
case 0x000020: /* MRC p15, 0, <Rd>, c0, c0, 2: TCM Status Register */
value = 0;
break;
case 0x010000: /* MRC p15, 0, <Rd>, c1, c0, 0: Control Register */
value = arm.control;
break;
case 0x020000: /* MRC p15, 0, <Rd>, c2, c0, 0: Translation Table Base Register */
value = arm.translation_table_base;
break;
case 0x030000: /* MRC p15, 0, <Rd>, c3, c0, 0: Domain Access Control Register */
value = arm.domain_access_control;
break;
case 0x050000: /* MRC p15, 0, <Rd>, c5, c0, 0: Data Fault Status Register */
value = arm.data_fault_status;
break;
case 0x050020: /* MRC p15, 0, <Rd>, c5, c0, 1: Instruction Fault Status Register */
value = arm.instruction_fault_status;
break;
case 0x060000: /* MRC p15, 0, <Rd>, c6, c0, 0: Fault Address Register */
value = arm.fault_address;
break;
case 0x07006A: /* MRC p15, 0, <Rd>, c7, c10, 3: Test and clean DCache */
value = 1 << 30;
break;
case 0x07006E: /* MRC p15, 0, <Rd>, c7, c14, 3: Test, clean, and invalidate DCache */
value = 1 << 30;
break;
case 0x0D0000: /* MRC p15, 0, <Rd>, c13, c0, 0: Read FCSE PID */
value = 0;
break;
case 0x0F0000: /* MRC p15, 0, <Rd>, c15, c0, 0: Debug Override Register */
// Unimplemented
value = 0;
break;
case 0x0F0001: /* MRC p15, 0, <Rd>, c15, c1, 0: Unknown */
//TODO: Unknown(implmentation defined cp15 register)
value = 0;
break;
default:
warn("Unknown coprocessor instruction MRC %08X", insn);
value = 0;
break;
}
if ((insn >> 12 & 15) == 15) {
arm.cpsr_n = value >> 31 & 1;
arm.cpsr_z = value >> 30 & 1;
arm.cpsr_c = value >> 29 & 1;
arm.cpsr_v = value >> 28 & 1;
} else
arm.reg[insn >> 12 & 15] = value;
}
void do_cp15_mcr(uint32_t insn)
{
uint32_t value = reg(insn >> 12 & 15);
switch (insn & 0xEF00EF) {
case 0x010000: { /* MCR p15, 0, <Rd>, c1, c0, 0: Control Register */
uint32_t change = value ^ arm.control;
//TODO: actually implement this register fully
/*
if ((value & 0xFFFF8CF0) != 0x00050070)
error("Bad or unimplemented control register value: %x (unsupported: %x)\n", value, (value & 0xFFFF8CF8) ^ 0x00050078);
*/
arm.control = value;
if (change & 1){
// MMU is being turned on or off
addr_cache_flush();
emuprintf("Turned MMU %s\n", value & 1 ? "on" : "off");
}
break;
}
case 0x020000: /* MCR p15, 0, <Rd>, c2, c0, 0: Translation Table Base Register */
arm.translation_table_base = value & ~0x3FFF;
addr_cache_flush();
break;
case 0x030000: /* MCR p15, 0, <Rd>, c3, c0, 0: Domain Access Control Register */
arm.domain_access_control = value;
addr_cache_flush();
break;
case 0x050000: /* MCR p15, 0, <Rd>, c5, c0, 0: Data Fault Status Register */
arm.data_fault_status = value;
break;
case 0x050020: /* MCR p15, 0, <Rd>, c5, c0, 1: Instruction Fault Status Register */
arm.instruction_fault_status = value;
break;
case 0x060000: /* MCR p15, 0, <Rd>, c6, c0, 0: Fault Address Register */
arm.fault_address = value;
break;
case 0x070080: /* MCR p15, 0, <Rd>, c7, c0, 4: Wait for interrupt */
cycle_count_delta = 0;
if (arm.interrupts == 0) {
arm.reg[15] -= 4;
cpu_events |= EVENT_WAITING;
}
break;
case 0x080005: /* MCR p15, 0, <Rd>, c8, c5, 0: Invalidate instruction TLB */
case 0x080007: /* MCR p15, 0, <Rd>, c8, c7, 0: Invalidate TLB */
case 0x080025: /* MCR p15, 0, <Rd>, c8, c5, 1: Invalidate instruction TLB entry */
case 0x080027: /* MCR p15, 0, <Rd>, c8, c7, 1: Invalidate TLB (used by polydumper) */
case 0x070005: /* MCR p15, 0, <Rd>, c7, c5, 0: Invalidate ICache */
case 0x070025: /* MCR p15, 0, <Rd>, c7, c5, 1: Invalidate ICache line */
case 0x070007: /* MCR p15, 0, <Rd>, c7, c7, 0: Invalidate ICache and DCache */
addr_cache_flush();
break;
case 0x080006: /* MCR p15, 0, <Rd>, c8, c6, 0: Invalidate data TLB */
case 0x080026: /* MCR p15, 0, <Rd>, c8, c6, 1: Invalidate data TLB entry */
case 0x070026: /* MCR p15, 0, <Rd>, c7, c6, 1: Invalidate single DCache entry */
case 0x07002A: /* MCR p15, 0, <Rd>, c7, c10, 1: Clean DCache line */
case 0x07002E: /* MCR p15, 0, <Rd>, c7, c14, 1: Clean and invalidate single DCache entry */
case 0x07008A: /* MCR p15, 0, <Rd>, c7, c10, 4: Drain write buffer */
case 0x0F0000: /* MCR p15, 0, <Rd>, c15, c0, 0: Debug Override Register */
#ifdef SUPPORT_LINUX
// Normally ignored, but somehow needed for linux to boot correctly
addr_cache_flush();
#endif
break;
case 0x0F0001: /* MCR p15, 0, <Rd>, c15, c1, 0: Unknown */
//TODO: Unknown(implmentation defined cp15 register)
break;
default:
warn("Unknown coprocessor instruction MCR %08X", insn);
break;
}
}
void do_cp15_instruction(Instruction i)
{
uint32_t insn = i.raw;
if(insn & 0x00100000)
return do_cp15_mrc(insn);
else
return do_cp15_mcr(insn);
}
void do_cp14_instruction(Instruction i)
{
uint32_t instr = i.raw;
bool specialInstr = i.cond == 0xF;
bool success;
success = pxa260pwrClkPrvCoprocRegXferFunc(&pxa260PwrClk, specialInstr, (instr & 0x00100000) != 0, (instr >> 21) & 0x07, (instr >> 12) & 0x0F, (instr >> 16) & 0x0F, instr & 0x0F, (instr >> 5) & 0x07);
//fail if instr dosent actully exist
if(!success)
undefined_instruction();
}

428
src/armv5te/cpu.cpp Normal file
View File

@@ -0,0 +1,428 @@
#include <algorithm>
//#include <mutex>
#include <assert.h>
#include <setjmp.h>
// Uncomment the following line to measure the time until the OS is loaded
// #define BENCHMARK
#ifdef BENCHMARK
#include <time.h>
#endif
#include "armsnippets.h"
#include "asmcode.h"
#include "cpu.h"
#include "cpudefs.h"
#include "debug.h"
#include "emu.h"
#include "mem.h"
#include "mmu.h"
#include "translate.h"
// Global CPU state
struct arm_state arm;
void cpu_arm_loop()
{
while (!exiting && cycle_count_delta < 0 && current_instr_size == 4)
{
arm.reg[15] &= ~0x3; // Align PC
Instruction *p = static_cast<Instruction*>(read_instruction(arm.reg[15]));
#ifdef BENCHMARK
static clock_t start = 0;
if(arm.reg[15] == 0)
{
start = clock();
turbo_mode = true;
}
else if(arm.reg[15] == 0x10000000 || arm.reg[15] == 0x11800000)
{
clock_t diff = clock() - start;
printf("%ld ms\n", diff / 1000);
}
#endif
uint32_t *flags_ptr = &RAM_FLAGS(p);
// Check for pending events
if(cpu_events)
{
// Events other than DEBUG_STEP are handled outside
if(cpu_events & ~EVENT_DEBUG_STEP)
break;
goto enter_debugger;
}
// TODO: Other flags
if(*flags_ptr & (RF_EXEC_BREAKPOINT | RF_EXEC_DEBUG_NEXT | RF_ARMLOADER_CB))
{
if(*flags_ptr & RF_ARMLOADER_CB)
{
*flags_ptr &= ~RF_ARMLOADER_CB;
armloader_cb();
}
else
{
if(*flags_ptr & RF_EXEC_BREAKPOINT)
gui_debug_printf("Breakpoint at 0x%08x\n", arm.reg[15]);
enter_debugger:
uint32_t pc = arm.reg[15];
debugger(DBG_EXEC_BREAKPOINT, 0);
if(arm.reg[15] != pc)
continue; // Debugger changed PC
}
}
#ifndef NO_TRANSLATION
else if(do_translate && !(*flags_ptr & DONT_TRANSLATE) && (*flags_ptr & RF_CODE_EXECUTED))
translate(arm.reg[15], &p->raw);
// If the instruction is translated, use the translation
if((~cpu_events & EVENT_DEBUG_STEP) && *flags_ptr & RF_CODE_TRANSLATED)
{
#if TRANSLATION_ENTER_HAS_PTR
translation_enter(p);
#else
translation_enter();
#endif
continue;
}
*flags_ptr |= RF_CODE_EXECUTED;
#endif
/*
//TODO: remove this, causes slowdown
if(arm.reg[15] == 0x200AC088)
emuprintf("HAL state set:%d\n", arm.reg[0]);
*/
arm.reg[15] += 4; // Increment now to account for the pipeline
++cycle_count_delta;
do_arm_instruction(*p);
}
}
// Makes arm.reg[15] point to the current instruction
void fix_pc_for_fault()
{
#ifndef NO_TRANSLATION
translate_fix_pc();
#endif
arm.reg[15] -= current_instr_size;
}
void prefetch_abort(uint32_t mva, uint8_t status)
{
warn("Prefetch abort: address=%08x status=%02x\n", mva, status);
arm.reg[15] += 4;
// Fault address register not changed
arm.instruction_fault_status = status;
cpu_exception(EX_PREFETCH_ABORT);
if (mva == arm.reg[15])
error("Abort occurred with exception vectors unmapped");
longjmp(restart_after_exception, 1);
}
void data_abort(uint32_t mva, uint8_t status)
{
fix_pc_for_fault();
warn("Data abort: address=%08x status=%02x instruction at %08x\n", mva, status, arm.reg[15]);
arm.reg[15] += 8;
arm.fault_address = mva;
arm.data_fault_status = status;
cpu_exception(EX_DATA_ABORT);
longjmp(restart_after_exception, 1);
}
void undefined_instruction()
{
fix_pc_for_fault();
if(current_instr_size == 4)
warn("Undefined instruction 0x%08X at 0x%08X\n", read_word(arm.reg[15]), arm.reg[15]);
else
warn("Undefined instruction 0x%04X at 0x%08X\n", read_half(arm.reg[15]), arm.reg[15]);
arm.reg[15] += current_instr_size;
cpu_exception(EX_UNDEFINED);
longjmp(restart_after_exception, 1);
}
void *try_ptr(uint32_t addr)
{
//There are two different addr_cache formats...
#ifdef AC_FLAGS
uintptr_t entry = *(uintptr_t*)(addr_cache + ((addr >> 10) << 1));
if(unlikely(entry & AC_FLAGS))
{
if(entry & AC_INVALID)
return addr_cache_miss(addr, false, nullptr);
else // MMIO stuff
return nullptr;
}
entry += addr;
return (void*)entry;
#else
void *ptr = &addr_cache[(addr >> 10) << 1][addr];
if(unlikely((uintptr_t)ptr & AC_NOT_PTR))
ptr = addr_cache_miss(addr, false, nullptr);
return ptr;
#endif
}
void * FASTCALL read_instruction(uint32_t addr)
{
//There are two different addr_cache formats...
#ifdef AC_FLAGS
uintptr_t entry = *(uintptr_t*)(addr_cache + ((addr >> 10) << 1));
if(unlikely(entry & AC_FLAGS))
{
if(entry & AC_INVALID)
return addr_cache_miss(addr, false, prefetch_abort);
else // Executing MMIO stuff
error("PC in MMIO range: 0x%x\n", addr);
}
entry += addr;
return (void*)entry;
#else
void *ptr = &addr_cache[(addr >> 10) << 1][addr];
if(unlikely((uintptr_t)ptr & AC_NOT_PTR))
{
ptr = addr_cache_miss(addr, false, prefetch_abort);
if (!ptr)
error("Bad PC: %08x\n", addr);
}
return ptr;
#endif
}
// Update cpu_events
void cpu_int_check()
{
//events arnt threaded like this in Mu, plus this breaks the RetroArch build, some undefined reference thing
//static std::mutex mut;
//std::lock_guard<std::mutex> lg(mut);
if (arm.interrupts & ~arm.cpsr_low28 & 0x80)
cpu_events |= EVENT_IRQ;
else
cpu_events &= ~EVENT_IRQ;
if (arm.interrupts & ~arm.cpsr_low28 & 0x40)
cpu_events |= EVENT_FIQ;
else
cpu_events &= ~EVENT_FIQ;
}
static const constexpr uint8_t exc_flags[] = {
MODE_SVC | 0xC0, /* Reset */
MODE_UND | 0x80, /* Undefined instruction */
MODE_SVC | 0x80, /* Software interrupt */
MODE_ABT | 0x80, /* Prefetch abort */
MODE_ABT | 0x80, /* Data abort */
0, /* Reserved */
MODE_IRQ | 0x80, /* IRQ */
MODE_FIQ | 0xC0, /* FIQ */
};
void cpu_exception(int type)
{
/* Switch mode, disable interrupts */
uint32_t old_cpsr = get_cpsr();
set_cpsr_full((old_cpsr & ~0x3F) | exc_flags[type]);
*ptr_spsr() = old_cpsr;
/* Branch-and-link to exception handler */
arm.reg[14] = arm.reg[15];
arm.reg[15] = type << 2;
if (arm.control & 0x2000) /* High vectors */
arm.reg[15] += 0xFFFF0000;
}
uint32_t get_cpsr_flags()
{
return arm.cpsr_n << 31
| arm.cpsr_z << 30
| arm.cpsr_c << 29
| arm.cpsr_v << 28;
}
void set_cpsr_flags(uint32_t flags)
{
arm.cpsr_n = (flags >> 31) & 1;
arm.cpsr_z = (flags >> 30) & 1;
arm.cpsr_c = (flags >> 29) & 1;
arm.cpsr_v = (flags >> 28) & 1;
}
// Get full CPSR register
uint32_t get_cpsr()
{
return arm.cpsr_n << 31
| arm.cpsr_z << 30
| arm.cpsr_c << 29
| arm.cpsr_v << 28
| arm.cpsr_low28;
}
void set_cpsr_full(uint32_t cpsr)
{
uint8_t old_mode = arm.cpsr_low28 & 0x1F,
new_mode = cpsr & 0x1F;
if(old_mode == new_mode)
goto same_mode;
// Only FIQ mode has more than 2 regs banked
if(old_mode == MODE_FIQ)
std::copy(arm.reg + 8, arm.reg + 13, arm.r8_fiq);
else
std::copy(arm.reg + 8, arm.reg + 13, arm.r8_usr);
switch(old_mode)
{
case MODE_USR: case MODE_SYS:
std::copy(arm.reg + 13, arm.reg + 15, arm.r13_usr);
break;
case MODE_FIQ:
std::copy(arm.reg + 13, arm.reg + 15, arm.r13_fiq);
break;
case MODE_IRQ:
std::copy(arm.reg + 13, arm.reg + 15, arm.r13_irq);
break;
case MODE_SVC:
std::copy(arm.reg + 13, arm.reg + 15, arm.r13_svc);
break;
case MODE_ABT:
std::copy(arm.reg + 13, arm.reg + 15, arm.r13_abt);
break;
case MODE_UND:
std::copy(arm.reg + 13, arm.reg + 15, arm.r13_und);
break;
default: assert(false);
}
if(new_mode == MODE_FIQ)
std::copy(arm.r8_fiq, arm.r8_fiq + 5, arm.reg + 8);
else
std::copy(arm.r8_usr, arm.r8_usr + 5, arm.reg + 8);
switch(new_mode)
{
case MODE_USR: case MODE_SYS:
std::copy(arm.r13_usr, arm.r13_usr + 2, arm.reg + 13);
break;
case MODE_FIQ:
std::copy(arm.r13_fiq, arm.r13_fiq + 2, arm.reg + 13);
break;
case MODE_IRQ:
std::copy(arm.r13_irq, arm.r13_irq + 2, arm.reg + 13);
break;
case MODE_SVC:
std::copy(arm.r13_svc, arm.r13_svc + 2, arm.reg + 13);
break;
case MODE_ABT:
std::copy(arm.r13_abt, arm.r13_abt + 2, arm.reg + 13);
break;
case MODE_UND:
std::copy(arm.r13_und, arm.r13_und + 2, arm.reg + 13);
break;
default: error("Invalid mode 0x%x\n", new_mode);
}
// Access permissions are different
if((old_mode == MODE_USR) ^ (new_mode == MODE_USR))
addr_cache_flush();
same_mode:
if(cpsr & 0x01000000)
error("Jazelle not implemented!");
arm.cpsr_n = (cpsr >> 31) & 1;
arm.cpsr_z = (cpsr >> 30) & 1;
arm.cpsr_c = (cpsr >> 29) & 1;
arm.cpsr_v = (cpsr >> 28) & 1;
arm.cpsr_low28 = cpsr & 0x090000FF; // Mask off reserved bits
cpu_int_check();
}
void FASTCALL set_cpsr(uint32_t cpsr, uint32_t mask) {
if (!(arm.cpsr_low28 & 0x0F)) {
/* User mode. Don't change privileged or execution state bits */
mask &= ~0x010000FF;
}
cpsr = (cpsr & mask) | (get_cpsr() & ~mask);
if (cpsr & 0x20)
error("Cannot set T bit with MSR instruction");
set_cpsr_full(cpsr);
}
uint32_t *ptr_spsr()
{
switch (arm.cpsr_low28 & 0x1F)
{
case MODE_FIQ: return &arm.spsr_fiq;
case MODE_IRQ: return &arm.spsr_irq;
case MODE_SVC: return &arm.spsr_svc;
case MODE_ABT: return &arm.spsr_abt;
case MODE_UND: return &arm.spsr_und;
}
error("Attempted to access SPSR from user or system mode");
}
uint32_t get_spsr() {
return *ptr_spsr();
}
void FASTCALL set_spsr(uint32_t spsr, uint32_t mask) {
*ptr_spsr() ^= (*ptr_spsr() ^ spsr) & mask;
}
uint32_t reg(uint8_t i)
{
if(unlikely(i == 15))
error("PC invalid in this context!\n");
return arm.reg[i];
}
uint32_t reg_pc(uint8_t i)
{
if(unlikely(i == 15))
return arm.reg[15] + 4;
return arm.reg[i];
}
uint32_t reg_pc_mem(uint8_t i)
{
if(unlikely(i == 15))
return arm.reg[15] + 8;
return arm.reg[i];
}
void set_reg(uint8_t i, uint32_t value)
{
if(unlikely(i == 15))
error("PC invalid in this context!\n");
arm.reg[i] = value;
}
void set_reg_pc(uint8_t i, uint32_t value)
{
arm.reg[i] = value;
}
void set_reg_bx(uint8_t i, uint32_t value)
{
arm.reg[i] = value;
if(i == 15 && (value & 1))
{
arm.cpsr_low28 |= 0x20; // Enter Thumb mode
arm.reg[15] -= 1;
}
}

110
src/armv5te/cpu.h Normal file
View File

@@ -0,0 +1,110 @@
/* Declarations for cpu.c */
#ifndef CPU_H
#define CPU_H
#include <stdbool.h>
#include <stdint.h>
#include <string.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct arm_state { // Remember to update asmcode.S if this gets rearranged
uint32_t reg[16]; // Registers for current mode.
uint32_t cpsr_low28; // CPSR bits 0-27
uint8_t cpsr_n; // CPSR bit 31
uint8_t cpsr_z; // CPSR bit 30
uint8_t cpsr_c; // CPSR bit 29
uint8_t cpsr_v; // CPSR bit 28
#if defined(__arm__)
uint32_t cpsr_flags; // Only used in ARM translations
#endif
/* CP15 registers */
uint32_t control;
uint32_t translation_table_base;
uint32_t domain_access_control;
uint8_t data_fault_status, instruction_fault_status, pad1, pad2; // pad1 and pad2 for better alignment
uint32_t fault_address;
uint32_t r8_usr[5], r13_usr[2];
uint32_t r8_fiq[5], r13_fiq[2], spsr_fiq;
uint32_t r13_irq[2], spsr_irq;
uint32_t r13_svc[2], spsr_svc;
uint32_t r13_abt[2], spsr_abt;
uint32_t r13_und[2], spsr_und;
uint8_t interrupts;
uint32_t cpu_events_state; // Only used for suspend and resume!
}
#ifndef __EMSCRIPTEN__
__attribute__((packed))
#endif
arm_state;
extern struct arm_state arm __asm__("arm");
#define MODE_USR 0x10
#define MODE_FIQ 0x11
#define MODE_IRQ 0x12
#define MODE_SVC 0x13
#define MODE_ABT 0x17
#define MODE_UND 0x1B
#define MODE_SYS 0x1F
#define PRIVILEGED_MODE() (arm.cpsr_low28 & 3)
#define USER_MODE() (!(arm.cpsr_low28 & 3))
#define EX_RESET 0
#define EX_UNDEFINED 1
#define EX_SWI 2
#define EX_PREFETCH_ABORT 3
#define EX_DATA_ABORT 4
#define EX_IRQ 6
#define EX_FIQ 7
#define current_instr_size ((arm.cpsr_low28 & 0x20) ? 2 /* thumb */ : 4)
// Needed for the assembler calling convention
#ifdef __i386__
#ifdef FASTCALL
#undef FASTCALL
#endif
#define FASTCALL __attribute__((fastcall))
#else
#define FASTCALL
#endif
void cpu_int_check();
uint32_t get_cpsr() __asm__("get_cpsr");
void set_cpsr_full(uint32_t cpsr);
void FASTCALL set_cpsr(uint32_t cpsr, uint32_t mask);
uint32_t get_spsr();
void FASTCALL set_spsr(uint32_t cpsr, uint32_t mask);
uint32_t *ptr_spsr();
uint32_t get_cpsr_flags();
void set_cpsr_flags(uint32_t flags) __asm__("set_cpsr_flags");
void cpu_exception(int type);
void fix_pc_for_fault();
void *try_ptr(uint32_t addr);
void cpu_interpret_instruction(uint32_t insn);
void cpu_arm_loop();
void cpu_thumb_loop();
typedef void fault_proc(uint32_t mva, uint8_t status);
fault_proc prefetch_abort, data_abort __asm__("data_abort");
void undefined_instruction();
uint32_t reg(uint8_t i);
uint32_t reg_pc(uint8_t i);
uint32_t reg_pc_mem(uint8_t i);
void set_reg(uint8_t i, uint32_t value);
void set_reg_pc(uint8_t i, uint32_t value);
void set_reg_bx(uint8_t i, uint32_t value);
#ifdef __cplusplus
}
#endif
#endif

157
src/armv5te/cpudefs.h Normal file
View File

@@ -0,0 +1,157 @@
#ifndef CPUDEFS_H
#define CPUDEFS_H
#include "bitfield.h"
// Structure of instructions, enums etc.
union Instruction {
uint32_t raw;
BitField<28, 4> cond;
BitField<0, 28> rest;
union {
BitField<24> l;
BitField<0, 24> immed;
} branch;
union {
BitField<0, 4> rm;
BitField<5> l;
} bx;
union {
BitField<21, 4> op;
BitField<20> s;
BitField<16, 4> rn;
BitField<12, 4> rd;
BitField<25> imm;
// If imm
BitField<0, 8> immed_8;
BitField<8, 4> rotate_imm;
// else
BitField<4> reg_shift;
BitField<0, 4> rm;
BitField<5, 2> shift;
// If reg_shift
BitField<8, 4> rs;
// else
BitField<7, 5> shift_imm;
} data_proc; // ADD, MOV, etc.
union {
BitField<25> not_imm;
BitField<24> p;
BitField<23> u;
BitField<22> b;
BitField<21> w;
BitField<20> l;
BitField<16, 4> rn;
BitField<12, 4> rd;
// If not_imm == 0
BitField<0, 12> immed;
// else
BitField<0, 4> rm;
BitField<5, 2> shift;
BitField<7, 5> shift_imm;
} mem_proc; // LDR, STRB, etc.
union {
BitField<24> p;
BitField<23> u;
BitField<22> i;
BitField<21> w;
BitField<20> l;
BitField<16, 4> rn;
BitField<12, 4> rd;
BitField<6> s;
BitField<5> h;
// If i
BitField<8, 4> immed_h;
BitField<0, 4> immed_l;
// else
BitField<0, 4> rm;
} mem_proc2; // LDRH, STRSH, etc.
union {
BitField<23> l;
BitField<21> a;
BitField<20> s;
BitField<8, 4> rs;
BitField<0, 4> rm;
// If l
BitField<16, 4> rdhi;
BitField<12, 4> rdlo;
// else
BitField<16, 4> rd;
BitField<12, 4> rn;
} mult;
union {
BitField<22> r;
BitField<12, 4> rd;
} mrs;
union {
BitField<24> p;
BitField<23> u;
BitField<22> s;
BitField<21> w;
BitField<20> l;
BitField<16, 4> rn;
BitField<0, 16> reglist;
} mem_multi;
};
enum Condition {
CC_EQ=0, CC_NE,
CC_CS, CC_CC,
CC_MI, CC_PL,
CC_VS, CC_VC,
CC_HI, CC_LS,
CC_GE, CC_LT,
CC_GT, CC_LE,
CC_AL, CC_NV
};
enum ShiftType {
SH_LSL=0,
SH_LSR,
SH_ASR,
SH_ROR // RRX if count == 0
};
enum DataOp {
OP_AND=0,
OP_EOR,
OP_SUB,
OP_RSB,
OP_ADD,
OP_ADC,
OP_SBC,
OP_RSC,
OP_TST,
OP_TEQ,
OP_CMP,
OP_CMN,
OP_ORR,
OP_MOV,
OP_BIC,
OP_MVN
};
// Defined in arm_interpreter.cpp
void do_arm_instruction(Instruction i);
// Defined in coproc.cpp
void do_cp15_instruction(Instruction i);
void do_cp14_instruction(Instruction i);
#endif // CPUDEFS_H

58
src/armv5te/debug.h Normal file
View File

@@ -0,0 +1,58 @@
/* Declarations for debug.c */
#ifndef _H_DEBUG
#define _H_DEBUG
#include <stdbool.h>
#include <stdint.h>
#include <stddef.h>
#include <stdio.h>
#ifdef __cplusplus
#include <string>
//extern std::string ln_target_folder;
extern "C" {
#endif
extern FILE *debugger_input;
/*
extern bool gdb_connected;
extern bool in_debugger;
extern int rdbg_port;
*/
#define gdb_connected false
#define in_debugger false
#define rdbg_port 0
enum DBG_REASON {
DBG_USER,
DBG_EXCEPTION,
DBG_EXEC_BREAKPOINT,
DBG_READ_BREAKPOINT,
DBG_WRITE_BREAKPOINT,
};
/*
void *virt_mem_ptr(uint32_t addr, uint32_t size);
void backtrace(uint32_t fp);
int process_debug_cmd(char *cmdline);
void debugger(enum DBG_REASON reason, uint32_t addr);
void rdebug_recv(void);
bool rdebug_bind(unsigned int port);
void rdebug_quit();
*/
#define virt_mem_ptr(x, y) NULL
#define backtrace(x)
#define process_debug_cmd(x) 0
#define debugger(x, y)
#define rdebug_recv()
#define rdebug_bind(x) false
#define rdebug_quit()
#ifdef __cplusplus
}
#endif
#endif

551
src/armv5te/disasm.c Normal file
View File

@@ -0,0 +1,551 @@
#include <stdio.h>
#include "debug.h"
#include "disasm.h"
#include "emu.h"
static char *strcpy2(char *dest, const char *src) {
while ((*dest = *src)) { dest++; src++; }
return dest;
}
const char reg_name[16][4] = {
"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
"r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc"
};
static const char condcode[16][3] = {
"eq", "ne", "cs", "cc", "mi", "pl", "vs", "vc",
"hi", "ls", "ge", "lt", "gt", "le", "", "2"
};
enum suffix {
none_,
XY, // halfword signed mul
Y, // halfword signed mul
S, // Bit 20 S: alu, MUL etc
B, // Bit 22 B: LDR/STR, SWP
BT, // Bit 21 T: LDR/STR with postindex (bit 24=0)
M, // Bit 23-24 DA/IA/DB/IB
H, // H/SB/SH
D, // double-word insn
L, // Bit 22 L: LDC/STC
};
enum operand {
none,
REG0, // Bits 0-3 specify register
REG8, // Bits 8-11 specify register
REG12, // Bits 12-15 specify register
REG16, // Bits 16-19 specify register
PSR,
SHFOP, // Bits 0-11 specify shifted reg or immediate
IMMED, // Bits 0-11 specify rotated immediate
MEM,
MEMH,
MEM16,
MULTI,
BRCH, // Bits 0-23 specify branch target
BRCHT, // Bits 0-24 specify branch target for THUMB code
COPR, // Bits 8-11 specify coprocessor number
CDP, MRC, MRRC, MEMC,
BKPT, SWI,
};
static const struct arm_insn {
uint32_t mask;
uint32_t value;
char name[7];
uint8_t suffix;
uint8_t op1, op2, op3, op4;
} table[] = {
{0xFD70F000,0xF550F000, "pld", 0, MEM, none, none, none },
{0xFE000000,0xFA000000, "blx", 0, BRCHT, none, none, none },
/* Coprocessor instructions may have any condition field */
{ 0xFF00000, 0xC400000, "mcrr", 0, COPR, MRRC, none, none },
{ 0xFF00000, 0xC500000, "mrrc", 0, COPR, MRRC, none, none },
{ 0xE100000, 0xC000000, "stc", L, COPR, MEMC, none, none },
{ 0xE100000, 0xC100000, "ldc", L, COPR, MEMC, none, none },
{ 0xF000010, 0xE000000, "cdp", 0, COPR, CDP, none, none },
{ 0xF100010, 0xE000010, "mcr", 0, COPR, MRC, none, none },
{ 0xF100010, 0xE100010, "mrc", 0, COPR, MRC, none, none },
/* No other instructions are valid with condition field 1111 */
{0xF0000000,0xF0000000, "???", 0, none, none, none, none },
{ 0xFE0F0F0, 0x0000090, "mul", S, REG16, REG0, REG8, none },
{ 0xFE000F0, 0x0200090, "mla", S, REG16, REG0, REG8, REG12 },
{ 0xFE000F0, 0x0800090, "umull", S, REG12, REG16, REG0, REG8 },
{ 0xFE000F0, 0x0A00090, "umlal", S, REG12, REG16, REG0, REG8 },
{ 0xFE000F0, 0x0C00090, "smull", S, REG12, REG16, REG0, REG8 },
{ 0xFE000F0, 0x0E00090, "smlal", S, REG12, REG16, REG0, REG8 },
{ 0xFB00FF0, 0x1000090, "swp", B, REG12, REG0, MEM16, none },
{ 0xE0000F0, 0x0000090, "???", 0, none, none, none, none },
{ 0xE1000F0, 0x00000B0, "str", H, REG12, MEMH, none, none },
{ 0xE1010F0, 0x00000D0, "ldr", D, REG12, MEMH, none, none },
{ 0xE1010F0, 0x00000F0, "str", D, REG12, MEMH, none, none },
{ 0xE1000F0, 0x01000B0, "ldr", H, REG12, MEMH, none, none },
{ 0xE1000F0, 0x01000D0, "ldr", H, REG12, MEMH, none, none },
{ 0xE1000F0, 0x01000F0, "ldr", H, REG12, MEMH, none, none },
{ 0xFBF0FFF, 0x10F0000, "mrs", 0, REG12, PSR, none, none },
{ 0xFB0FFF0, 0x120F000, "msr", 0, PSR, REG0, none, none },
{ 0xFF00FF0, 0x1000050, "qadd", 0, REG12, REG0, REG16, none },
{ 0xFF00FF0, 0x1200050, "qsub", 0, REG12, REG0, REG16, none },
{ 0xFF00FF0, 0x1400050, "qdadd", 0, REG12, REG0, REG16, none },
{ 0xFF00FF0, 0x1600050, "qdsub", 0, REG12, REG0, REG16, none },
{0xFFF000F0,0xE1200070, "bkpt", 0, BKPT, none, none, none },
{ 0xFB0F000, 0x320F000, "msr", 0, PSR, IMMED, none, none },
{ 0xFF00090, 0x1000080, "smla", XY,REG16, REG0, REG8, REG12 },
{ 0xFF000B0, 0x1200080, "smlaw", Y, REG16, REG0, REG8, REG12 },
{ 0xFF0F0B0, 0x12000A0, "smulw", Y, REG16, REG0, REG8, none },
{ 0xFF00090, 0x1400080, "smlal", XY,REG12, REG16, REG0, REG8 },
{ 0xFF0F090, 0x1600080, "smul", XY,REG16, REG0, REG8, none },
{ 0xFFFFFF0, 0x12FFF10, "bx", 0, REG0, none, none, none },
{ 0xFFFFFF0, 0x12FFF20, "bxj", 0, REG0, none, none, none },
{ 0xFFFFFF0, 0x12FFF30, "blx", 0, REG0, none, none, none },
{ 0xFFF0FF0, 0x16F0F10, "clz", 0, REG12, REG0, none, none },
{ 0xDE00000, 0x0000000, "and", S, REG12, REG16, SHFOP, none },
{ 0xDE00000, 0x0200000, "eor", S, REG12, REG16, SHFOP, none },
{ 0xDE00000, 0x0400000, "sub", S, REG12, REG16, SHFOP, none },
{ 0xDE00000, 0x0600000, "rsb", S, REG12, REG16, SHFOP, none },
{ 0xDE00000, 0x0800000, "add", S, REG12, REG16, SHFOP, none },
{ 0xDE00000, 0x0A00000, "adc", S, REG12, REG16, SHFOP, none },
{ 0xDE00000, 0x0C00000, "sbc", S, REG12, REG16, SHFOP, none },
{ 0xDE00000, 0x0E00000, "rsc", S, REG12, REG16, SHFOP, none },
{ 0xDF0F000, 0x1100000, "tst", 0, REG16, SHFOP, none, none },
{ 0xDF0F000, 0x1300000, "teq", 0, REG16, SHFOP, none, none },
{ 0xDF0F000, 0x1500000, "cmp", 0, REG16, SHFOP, none, none },
{ 0xDF0F000, 0x1700000, "cmn", 0, REG16, SHFOP, none, none },
{ 0xDE00000, 0x1800000, "orr", S, REG12, REG16, SHFOP, none },
{ 0xDEF0000, 0x1A00000, "mov", S, REG12, SHFOP, none, none },
{ 0xDE00000, 0x1C00000, "bic", S, REG12, REG16, SHFOP, none },
{ 0xDEF0000, 0x1E00000, "mvn", S, REG12, SHFOP, none, none },
/* 4000000-9FFFFFF: word-sized memory accesses */
{ 0xD100000, 0x4000000, "str", BT,REG12, MEM, none, none },
{ 0xD100000, 0x4100000, "ldr", BT,REG12, MEM, none, none },
{ 0xD100000, 0x5000000, "str", B, REG12, MEM, none, none },
{ 0xD100000, 0x5100000, "ldr", B, REG12, MEM, none, none },
{ 0xE100000, 0x8000000, "stm", M, MULTI, none, none, none },
{ 0xE100000, 0x8100000, "ldm", M, MULTI, none, none, none },
/* A000000-BFFFFFF: branches */
{ 0xF000000, 0xA000000, "b", 0, BRCH, none, none, none },
{ 0xF000000, 0xB000000, "bl", 0, BRCH, none, none, none },
/* F000000-FFFFFFF: software interrupt */
{ 0xF000000, 0xF000000, "swi", 0, SWI, none, none, none },
/* Catch-all */
{ 0x0000000, 0x0000000, "???", 0, none, none, none, none },
};
static char *do_shift(char *out, uint32_t insn) {
static const char shifts[4][4] = { "lsl", "lsr", "asr", "ror" };
int shift = insn >> 7 & 31;
int stype = insn >> 5 & 3;
out = strcpy2(out, reg_name[insn & 15]);
if (insn & 0x10) {
// shift by register (for data processing only, not load/store)
if (shift & 1) {
*out++ = '?';
return out;
}
out += sprintf(out, " %s %s", shifts[stype], reg_name[shift >> 1]);
} else {
// shift by immediate
int shift = insn >> 7 & 31;
int stype = insn >> 5 & 3;
if (shift == 0) {
if (stype == 0) {
// lsl #0 is a no-op
return out;
} else if (stype == 3) {
// ror #0
return strcpy2(out, " rrx");
} else {
// lsr #0 and asr #0 act like shift of 32
shift = 32;
}
}
out += sprintf(out, " %s #%d", shifts[stype], shift);
}
return out;
}
static char *do_reglist(char *out, int regs) {
int i;
*out++ = '{';
for (i = 0; i < 16; i++) {
if (regs >> i & 1) {
out = strcpy2(out, reg_name[i]);
if (regs >> i & 2) {
*out++ = '-';
while (regs >> ++i & 1);
out = strcpy2(out, reg_name[i-1]);
}
*out++ = ',';
}
}
out[-1] = '}';
*out = '\0';
return out;
}
uint32_t disasm_arm_insn(uint32_t pc) {
uint32_t *pc_ptr = virt_mem_ptr(pc, 4);
if(!pc_ptr)
return 0;
return disasm_arm_insn2(pc, pc_ptr);
}
uint32_t disasm_arm_insn2(uint32_t pc, uint32_t *pc_ptr) {
char buf[80];
uint32_t insn = *pc_ptr;
char *out = buf + sprintf(buf, "%08x: %08x\t", pc, insn);
int i;
const struct arm_insn *t = table;
while ((insn & t->mask) != t->value)
t++;
out = strcpy2(out, t->name);
switch (t->suffix) {
case XY:
*out++ = (insn & (1 << 5)) ? 't' : 'b';
/* fallthrough */
case Y:
*out++ = (insn & (1 << 6)) ? 't' : 'b';
}
if (!(t->mask & 0xF0000000))
out = strcpy2(out, condcode[insn >> 28]);
switch (t->suffix) {
case S:
if (insn & (1 << 20)) *out++ = 's';
break;
case B:
if (insn & (1 << 22)) *out++ = 'b';
break;
case BT:
if (insn & (1 << 22)) *out++ = 'b';
if (insn & (1 << 21)) *out++ = 't';
break;
case M:
*out++ = (insn & (1 << 23)) ? 'i' : 'd';
*out++ = (insn & (1 << 24)) ? 'b' : 'a';
break;
case H:
if (insn & (1 << 6)) *out++ = 's';
*out++ = (insn & (1 << 5)) ? 'h' : 'b';
break;
case D:
*out++ = 'd';
break;
case L:
if (insn & (1 << 22)) *out++ = 'l';
break;
}
for (i = 0; i < 4 && (&t->op1)[i] != none; i++) {
*out++ = i ? ',' : '\t';
switch ((&t->op1)[i]) {
case REG0: out = strcpy2(out, reg_name[insn & 15]); break;
case REG8: out = strcpy2(out, reg_name[insn >> 8 & 15]); break;
case REG12: out = strcpy2(out, reg_name[insn >> 12 & 15]); break;
case REG16: out = strcpy2(out, reg_name[insn >> 16 & 15]); break;
case SHFOP:
if (!(insn & (1 << 25))) {
out = do_shift(out, insn);
break;
}
/* fallthrough */
case IMMED: {
uint32_t imm = insn & 255, shift = insn >> 7 & 30;
out += sprintf(out, "%08x", imm >> shift | imm << (32 - shift));
break;
}
case PSR:
*out++ = (insn & (1 << 22)) ? 's' : 'c';
*out++ = 'p'; *out++ = 's'; *out++ = 'r';
if (~insn >> 16 & 15) {
*out++ = '_';
if (insn & (1 << 19)) *out++ = 'f';
if (insn & (1 << 18)) *out++ = 's';
if (insn & (1 << 17)) *out++ = 'x';
if (insn & (1 << 16)) *out++ = 'c';
}
break;
case MEM:
*out++ = '[';
out = strcpy2(out, reg_name[insn >> 16 & 15]);
if ((insn & 0x32F0000) == 0x10F0000) {
// immediate, offset mode, PC relative
int addr = insn & 0xFFF;
if (!(insn & (1 << 23))) addr = -addr;
addr += pc + 8;
out -= 2;
out += sprintf(out, "%08x]", addr);
uint32_t *ptr = virt_mem_ptr(addr, 4);
if (ptr)
out += sprintf(out, " = %08x", *ptr);
} else {
if (!(insn & (1 << 24))) // post-index
*out++ = ']';
*out++ = ' ';
*out++ = (insn & (1 << 23)) ? '+' : '-';
*out++ = ' ';
if (insn & (1 << 25)) {
// register offset
if (insn & 0x10) {
// register shifted by register not allowed
*out++ = '?';
} else {
out = do_shift(out, insn);
}
} else {
// immediate offset
if ((insn & 0xFFF) || !(insn & (1 << 23)))
out += sprintf(out, "%03x", insn & 0xFFF);
else
// don't display an added offset of 0
out -= 3;
}
if (insn & (1 << 24)) { // pre-index
*out++ = ']';
if (insn & (1 << 21)) // writeback
*out++ = '!';
}
}
break;
case MEMH:
*out++ = '[';
out = strcpy2(out, reg_name[insn >> 16 & 15]);
if (!(insn & (1 << 24))) // post-index
*out++ = ']';
*out++ = ' ';
*out++ = (insn & (1 << 23)) ? '+' : '-';
*out++ = ' ';
if (insn & (1 << 22)) {
// immediate offset
uint32_t imm = (insn & 0x0F) | (insn >> 4 & 0xF0);
if (imm || !(insn & (1 << 23)))
out += sprintf(out, "%03x", imm);
else
// don't display an added offset of 0
out -= 3;
} else {
// register offset
out = strcpy2(out, reg_name[insn & 15]);
}
if (insn & (1 << 24)) { // pre-index
*out++ = ']';
if (insn & (1 << 21)) // writeback
*out++ = '!';
} else { // post-index
// writeback assumed, setting W bit is invalid.
if (insn & (1 << 21))
*out++ = '?';
}
break;
case MEM16:
out += sprintf(out, "[%s]", reg_name[insn >> 16 & 15]);
break;
case MULTI:
out = strcpy2(out, reg_name[insn >> 16 & 15]);
if (insn & (1 << 21)) // Writeback
*out++ = '!';
*out++ = ',';
out = do_reglist(out, insn & 0xFFFF);
if (insn & (1 << 22)) // Load PSR or force user mode
*out++ = '^';
break;
case BRCH:
out += sprintf(out, "%08x", pc + 8 + ((int)insn << 8 >> 6));
break;
case BRCHT:
out += sprintf(out, "%08x", pc + 8 + ((int)insn << 8 >> 6 | (insn >> 23 & 2)));
break;
case COPR:
out += sprintf(out, "p%d", insn >> 8 & 15);
break;
case CDP:
out += sprintf(out, "%d,c%d,c%d,c%d,%d", insn >> 20 & 15,
insn >> 12 & 15, insn >> 16 & 15, insn & 15, insn >> 5 & 7);
break;
case MRC:
out += sprintf(out, "%d,%s,c%d,c%d,%d", insn >> 21 & 7,
reg_name[insn >> 12 & 15], insn >> 16 & 15, insn & 15, insn >> 5 & 7);
break;
case MRRC:
out += sprintf(out, "%d,%s,%s,c%d", insn >> 4 & 15,
reg_name[insn >> 12 & 15], reg_name[insn >> 16 & 15], insn & 15);
break;
case MEMC:
out += sprintf(out, "c%d,[%s", insn >> 12 & 15,
reg_name[insn >> 16 & 15]);
if (!(insn & (1 << 24))) { // Post-indexed or unindexed
*out++ = ']';
if (!(insn & (1 << 21))) {
// Unindexed addressing
if (!(insn & (1 << 23)))
*out++ = '?';
out += sprintf(out, ",{%02x}", insn & 0xFF);
break;
}
}
if (!(insn & (1 << 23)) || insn & 0xFF)
out += sprintf(out, " %c %03x",
(insn & (1 << 23)) ? '+' : '-',
(insn & 0xFF) << 2);
if (insn & (1 << 24)) { // Pre-indexed or offset
*out++ = ']';
if (insn & (1 << 21)) // Writeback (pre-indexed)
*out++ = '!';
}
break;
case BKPT:
out += sprintf(out, "%04x", (insn >> 4 & 0xFFF0) | (insn & 0x0F));
break;
case SWI:
out += sprintf(out, "%06x", insn & 0xFFFFFF);
break;
}
}
*out = '\0';
gui_debug_printf(buf);
gui_debug_printf("\n");
return 4;
}
uint32_t disasm_thumb_insn(uint32_t pc) {
char buf[80];
uint16_t *pc_ptr = virt_mem_ptr(pc, 2);
if (!pc_ptr)
return 0;
uint16_t insn = *pc_ptr;
char *out = buf + sprintf(buf, "%08x: %04x \t", pc, insn);
if (insn < 0x1800) {
static const char name[][4] = { "lsl", "lsr", "asr" };
sprintf(out, "%s\tr%d,r%d,%02x", name[insn >> 11],
insn & 7, insn >> 3 & 7, insn >> 6 & 31);
} else if (insn < 0x2000) {
sprintf(out, "%s\tr%d,r%d,%s%d",
(insn & 0x0200) ? "sub" : "add",
insn & 7, insn >> 3 & 7,
(insn & 0x400) ? "" : "r", insn >> 6 & 7);
} else if (insn < 0x4000) {
static const char name[][4] = { "mov", "cmp", "add", "sub" };
sprintf(out, "%s\tr%d,%02x", name[insn >> 11 & 3],
insn >> 8 & 7, insn & 0xFF);
} else if (insn < 0x4400) {
static const char name[][4] = {
"and", "eor", "lsl", "lsr", "asr", "adc", "sbc", "ror",
"tst", "neg", "cmp", "cmn", "orr", "mul", "bic", "mvn"
};
sprintf(out, "%s\tr%d,r%d", name[insn >> 6 & 15], insn & 7, insn >> 3 & 7);
} else if (insn < 0x4700) {
static const char name[][4] = { "add", "cmp", "mov" };
int rd = (insn & 7) | (insn >> 4 & 8);
int rn = insn >> 3 & 15;
if (!((rd | rn) & 8))
goto invalid;
sprintf(out, "%s\t%s,%s", name[insn >> 8 & 3], reg_name[rd], reg_name[rn]);
} else if (insn < 0x4800) {
if (insn & 7)
goto invalid;
sprintf(out, "%s\t%s", (insn & 0x80) ? "blx" : "bx", reg_name[insn >> 3 & 15]);
} else if (insn < 0x5000) {
int addr = ((pc + 4) & -4) + ((insn & 0xFF) << 2);
out += sprintf(out, "ldr\tr%d,[%08x]", insn >> 8 & 7, addr);
uint32_t *ptr = virt_mem_ptr(addr, 4);
if (ptr)
sprintf(out, " = %08x", *ptr);
} else if (insn < 0x6000) {
static const char name[][6] = {
"str", "strh", "strb", "ldrsb",
"ldr", "ldrh", "ldrb", "ldrsh"
};
sprintf(out, "%s\tr%d,[r%d + r%d]", name[insn >> 9 & 7],
insn & 7, insn >> 3 & 7, insn >> 6 & 7);
} else if (insn < 0x9000) {
static const char name[][5] = { "str", "ldr", "strb", "ldrb", "strh", "ldrh" };
int type = (insn - 0x6000) >> 11;
sprintf(out, "%s\tr%d,[r%d + %03x]", name[type],
insn & 7, insn >> 3 & 7,
(insn >> 6 & 31) << (0x12 >> (type & 6) & 3));
} else if (insn < 0xA000) {
sprintf(out, "%s\tr%d,[sp + %03x]",
(insn & 0x800) ? "ldr" : "str",
insn >> 8 & 7, (insn & 0xFF) << 2);
} else if (insn < 0xB000) {
sprintf(out, "add\tr%d,%s,%03x",
insn >> 8 & 7,
(insn & 0x800) ? "sp" : "pc", (insn & 0xFF) << 2);
} else if (insn < 0xB100) {
sprintf(out, "%s\tsp,%03x",
(insn & 0x80) ? "sub" : "add", (insn & 0x7F) << 2);
} else if (insn < 0xB400) {
goto invalid;
} else if (insn < 0xB600) {
out = strcpy2(out, "push\t");
do_reglist(out, (insn & 0xFF) | (insn & 0x100) << (14 - 8));
} else if (insn < 0xBC00) {
goto invalid;
} else if (insn < 0xBE00) {
out = strcpy2(out, "pop\t");
do_reglist(out, (insn & 0xFF) | (insn & 0x100) << (15 - 8));
} else if (insn < 0xBF00) {
sprintf(out, "bkpt\t%02x", insn & 0xFF);
} else if (insn < 0xC000) {
goto invalid;
} else if (insn < 0xD000) {
out += sprintf(out, "%smia\tr%d!,", (insn & 0x800) ? "ld" : "st", insn >> 8 & 7);
do_reglist(out, insn & 0xFF);
} else if (insn < 0xDE00) {
sprintf(out, "b%s\t%08x", condcode[insn >> 8 & 15], pc + 4 + ((int8_t)insn << 1));
} else if (insn < 0xDF00) {
invalid:
sprintf(out, "???");
} else if (insn < 0xE000) {
sprintf(out, "swi\t%02x", insn & 0xFF);
} else if (insn < 0xE800) {
sprintf(out, "b\t%08x", pc + 4 + ((int32_t)insn << 21 >> 20));
} else if (insn < 0xF000) {
sprintf(out, "(blx\tlr + %03x)", (insn & 0x7FF) << 1);
} else if (insn < 0xF800) {
int32_t target = (int32_t)insn << 21 >> 9;
/* Check next instruction to see if this is part of a BL or BLX pair */
pc_ptr = virt_mem_ptr(pc + 2, 2);
if (pc_ptr && ((insn = *pc_ptr) & 0xE800) == 0xE800) {
/* It is; show both instructions combined as one */
target += pc + 4 + ((insn & 0x7FF) << 1);
if (!(insn & 0x1000)) target &= ~3;
sprintf(out - 5, "%04x\t%s\t%08x", insn,
(insn & 0x1000) ? "bl" : "blx", target);
gui_debug_printf("%s\n", buf);
return 4;
}
sprintf(out, "(add\tlr,pc,%08x)", target);
} else {
sprintf(out, "(bl\tlr + %03x)", (insn & 0x7FF) << 1);
}
gui_debug_printf("%s\n", buf);
return 2;
}

18
src/armv5te/disasm.h Normal file
View File

@@ -0,0 +1,18 @@
#ifndef _H_DISASM
#define _H_DISASM
#ifdef __cplusplus
extern "C" {
#endif
extern const char reg_name[16][4];
uint32_t disasm_arm_insn(uint32_t pc);
uint32_t disasm_arm_insn2(uint32_t pc, uint32_t *pc_ptr);
uint32_t disasm_thumb_insn(uint32_t pc);
#ifdef __cplusplus
}
#endif
#endif

56
src/armv5te/emu.h Normal file
View File

@@ -0,0 +1,56 @@
#ifndef _H_EMU
#define _H_EMU
#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include <setjmp.h>
#include "cpu.h"
#include "mem.h"
#include "../emulator.h"
#include "../portability.h"
#ifdef __cplusplus
extern "C" {
#endif
static inline uint16_t BSWAP16(uint16_t x) { return x << 8 | x >> 8; }
#define BSWAP32(x) __builtin_bswap32(x)
extern int cycle_count_delta __asm__("cycle_count_delta");
extern uint32_t cpu_events __asm__("cpu_events");
#define EVENT_IRQ 1
#define EVENT_FIQ 2
#define EVENT_RESET 4
#define EVENT_DEBUG_STEP 8
#define EVENT_WAITING 16
// Settings
extern bool exiting;
extern bool do_translate;
enum { LOG_CPU, LOG_IO, LOG_FLASH, LOG_INTS, LOG_ICOUNT, LOG_USB, LOG_GDB, MAX_LOG };
#define LOG_TYPE_TBL "CIFQ#UG"
//void logprintf(int type, const char *str, ...);
//void emuprintf(const char *format, ...);
#define logprintf(type, ...) debugLog(__VA_ARGS__)
#define emuprintf(...) debugLog(__VA_ARGS__)
//void warn(const char *fmt, ...);
//__attribute__((noreturn)) void error(const char *fmt, ...);
#define warn(...) debugLog(__VA_ARGS__)
#define error(...) abort()
extern jmp_buf restart_after_exception;
// GUI callbacks
#define gui_debug_printf(...) debugLog(__VA_ARGS__)
#ifdef __cplusplus
}
#endif
#endif

Some files were not shown because too many files have changed in this diff Show More