Compare commits
368 Commits
fameExperi
...
musashiUpg
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
df927c1e45 | ||
|
|
a06d013f33 | ||
|
|
c08bdd573a | ||
|
|
4712e77413 | ||
|
|
57d19df30d | ||
|
|
dd09261b53 | ||
|
|
c72edbfa1b | ||
|
|
20348abf85 | ||
|
|
6b1e293c44 | ||
|
|
d0292b312f | ||
|
|
2b982cee22 | ||
|
|
2c072ded8a | ||
|
|
309f91312f | ||
|
|
4450ac9402 | ||
|
|
01bebf5418 | ||
|
|
4c7d34facf | ||
|
|
16924bb811 | ||
|
|
e9d6d21625 | ||
|
|
6b351c67fd | ||
|
|
7be8825f96 | ||
|
|
02778eeb08 | ||
|
|
f76abf87a1 | ||
|
|
0bb3287d6d | ||
|
|
64950ac431 | ||
|
|
85e9a03796 | ||
|
|
14e0d66101 | ||
|
|
eea4c328d2 | ||
|
|
9143759c29 | ||
|
|
9289232dd0 | ||
|
|
a2dbb98d88 | ||
|
|
fd572858e2 | ||
|
|
d5b6664c73 | ||
|
|
ff46e40ded | ||
|
|
f00cfd057b | ||
|
|
12ed98e68b | ||
|
|
e277ae8a3b | ||
|
|
80850117e6 | ||
|
|
09ae1544e4 | ||
|
|
c4e9edf702 | ||
|
|
dbf1341597 | ||
|
|
5af248eaef | ||
|
|
afa5b13d14 | ||
|
|
68c9e28c08 | ||
|
|
7962bee8bf | ||
|
|
e6535b546c | ||
|
|
696874b42a | ||
|
|
ab608e1d78 | ||
|
|
7ccef9020c | ||
|
|
65e12a2b7b | ||
|
|
7ab964efcb | ||
|
|
4129e74af0 | ||
|
|
8dcf19d2e1 | ||
|
|
aa196cb87f | ||
|
|
136cdca5d7 | ||
|
|
d4b9997d43 | ||
|
|
8de283a87d | ||
|
|
c860faa9e7 | ||
|
|
0d87bf2610 | ||
|
|
99da94a143 | ||
|
|
ca89c58c1a | ||
|
|
771856944b | ||
|
|
814d180642 | ||
|
|
ad53041077 | ||
|
|
6bfae8fcb2 | ||
|
|
9eb415c4ac | ||
|
|
632a57a38f | ||
|
|
430ebc01a0 | ||
|
|
cc882d2141 | ||
|
|
5ad9760c52 | ||
|
|
d67233cc8e | ||
|
|
07d8ee95f1 | ||
|
|
a6f3ec5c1f | ||
|
|
631111ce25 | ||
|
|
4237ae0eb8 | ||
|
|
07b4aa53a8 | ||
|
|
81bbcd20f0 | ||
|
|
58d59a9964 | ||
|
|
e601bf1e15 | ||
|
|
369b2ebaf4 | ||
|
|
bc47eee5c0 | ||
|
|
943dfb3b09 | ||
|
|
a23df8f79a | ||
|
|
e0c1cb9d6b | ||
|
|
7b6fcdb0e1 | ||
|
|
e70d84fac4 | ||
|
|
d67b44130a | ||
|
|
1567cbce67 | ||
|
|
3059dfda06 | ||
|
|
94f4c09d54 | ||
|
|
452d5030a1 | ||
|
|
1bb71d8aec | ||
|
|
0337882c4f | ||
|
|
33f7cb8948 | ||
|
|
51e405fc84 | ||
|
|
d0ccc7115f | ||
|
|
61602de392 | ||
|
|
29ca09302f | ||
|
|
4c8649da4e | ||
|
|
9723c83381 | ||
|
|
37f4b859aa | ||
|
|
7ba0cb5dca | ||
|
|
c95792b146 | ||
|
|
c111be3f64 | ||
|
|
b145a329c0 | ||
|
|
0ca5627ee3 | ||
|
|
a1fd0799be | ||
|
|
4fb3bed984 | ||
|
|
9ed1d0c21d | ||
|
|
1405e2a681 | ||
|
|
55013870ca | ||
|
|
912210695d | ||
|
|
5c89783ea0 | ||
|
|
c68fac77cc | ||
|
|
d0ca2655bb | ||
|
|
5c1547467b | ||
|
|
8e9ef22f42 | ||
|
|
892359f226 | ||
|
|
d46e146ae7 | ||
|
|
fc6b32d065 | ||
|
|
66f32cdb94 | ||
|
|
3601c471cf | ||
|
|
9384fc37a8 | ||
|
|
02fe7809ff | ||
|
|
5f3ace9b6b | ||
|
|
967c2f3ec1 | ||
|
|
99dfc62823 | ||
|
|
f0b9d524a6 | ||
|
|
80026cb33e | ||
|
|
5f1e8a53c1 | ||
|
|
b068d6ed53 | ||
|
|
b222b23bd0 | ||
|
|
7e0399ad17 | ||
|
|
f355c82d0b | ||
|
|
535c9254f6 | ||
|
|
4476697b4b | ||
|
|
92d6a857a8 | ||
|
|
6e8005cf56 | ||
|
|
eb4a241ef4 | ||
|
|
ec66577b53 | ||
|
|
41a305f0bd | ||
|
|
e9f7a40c53 | ||
|
|
b1914d9586 | ||
|
|
a63000884f | ||
|
|
5a38b67708 | ||
|
|
97e00aaef2 | ||
|
|
82c767a7a0 | ||
|
|
ab4788c921 | ||
|
|
c4eec6864b | ||
|
|
9b09d19e19 | ||
|
|
3de2c67cae | ||
|
|
1d693ae10d | ||
|
|
1b3336c9af | ||
|
|
4d88e893e0 | ||
|
|
2238274f51 | ||
|
|
5b93a54b2b | ||
|
|
c89da48739 | ||
|
|
b6093dc8ca | ||
|
|
48ba518086 | ||
|
|
372d23e534 | ||
|
|
125e85d73b | ||
|
|
d70e2b02b9 | ||
|
|
a2058e2d73 | ||
|
|
c7f8816541 | ||
|
|
6c53ade08b | ||
|
|
d8abf3643d | ||
|
|
a80b783c71 | ||
|
|
06acab1345 | ||
|
|
8482c98010 | ||
|
|
3c645bd0bd | ||
|
|
368757023c | ||
|
|
4d803c6fc0 | ||
|
|
cb9093c5f4 | ||
|
|
fa5f85e77c | ||
|
|
1b5f4d215f | ||
|
|
55a2e97bc5 | ||
|
|
0a58122f4b | ||
|
|
5a7191cd47 | ||
|
|
cee653b1a0 | ||
|
|
0bf5f9f981 | ||
|
|
23f943ce8b | ||
|
|
9e98f29215 | ||
|
|
ee7fd8e676 | ||
|
|
34e4b9ce7c | ||
|
|
4e7a08e6df | ||
|
|
ae6efb6b7b | ||
|
|
f1d1c3f051 | ||
|
|
03101a5214 | ||
|
|
f4a6d6c1b0 | ||
|
|
bb2698b498 | ||
|
|
48ff83d3af | ||
|
|
48d3983b72 | ||
|
|
f7f7b9d2d9 | ||
|
|
2244a1edd8 | ||
|
|
f7c1dacba4 | ||
|
|
47ba41fdc5 | ||
|
|
6df973a77c | ||
|
|
180a8ba97f | ||
|
|
84c0c40f36 | ||
|
|
8eae0b1ddd | ||
|
|
efc3b9ca77 | ||
|
|
4c27b1abb1 | ||
|
|
e1a9162cc9 | ||
|
|
71af4b89a5 | ||
|
|
65db73b129 | ||
|
|
2270e8f112 | ||
|
|
1b538a0bfe | ||
|
|
8cd5dcb446 | ||
|
|
1ec53c904a | ||
|
|
f2233197e4 | ||
|
|
432233d8f1 | ||
|
|
07af2b45ec | ||
|
|
d3540e3f77 | ||
|
|
6c144a3e85 | ||
|
|
f166dd173b | ||
|
|
f11fdcdf18 | ||
|
|
1b407a4497 | ||
|
|
81f0521165 | ||
|
|
79af40b61f | ||
|
|
182a188cda | ||
|
|
d34b0a0694 | ||
|
|
a40b29dca4 | ||
|
|
e6262335d9 | ||
|
|
c6174d335b | ||
|
|
c9138ec32a | ||
|
|
15d7d2dd54 | ||
|
|
424d07ce60 | ||
|
|
857b4bbed3 | ||
|
|
90ed900001 | ||
|
|
20400675fa | ||
|
|
850064d498 | ||
|
|
089090486c | ||
|
|
dc200683e2 | ||
|
|
33002e9fb3 | ||
|
|
992e1cda84 | ||
|
|
6ca82f22cc | ||
|
|
bdb445fb72 | ||
|
|
806c95b20b | ||
|
|
6b488b8817 | ||
|
|
e579e67b19 | ||
|
|
d31862b435 | ||
|
|
ea8a4fd618 | ||
|
|
68d45bb396 | ||
|
|
6b81ca4cc0 | ||
|
|
9b39360288 | ||
|
|
111220a17f | ||
|
|
f6bee9c9cf | ||
|
|
5f5ea20c66 | ||
|
|
60389c9a0e | ||
|
|
df49ff3a4c | ||
|
|
017797509e | ||
|
|
96919e3458 | ||
|
|
968cafda58 | ||
|
|
1b1346fa7e | ||
|
|
eb159b1e02 | ||
|
|
a1ee77c9a5 | ||
|
|
7f5c14baee | ||
|
|
89f50f88c5 | ||
|
|
419b18f170 | ||
|
|
930e4f314c | ||
|
|
89e193a091 | ||
|
|
fa98647959 | ||
|
|
11c392f8b6 | ||
|
|
dd8e8d2141 | ||
|
|
c5a094620a | ||
|
|
53b5ea1e6b | ||
|
|
e3dbfaf369 | ||
|
|
d936c13205 | ||
|
|
8d19f91487 | ||
|
|
f0d2b992da | ||
|
|
afa7462733 | ||
|
|
e034878ee0 | ||
|
|
b637a6495f | ||
|
|
97cd9bc543 | ||
|
|
7660f2e64b | ||
|
|
cd3acf4c98 | ||
|
|
338aa7ed4e | ||
|
|
d43d9c637f | ||
|
|
a51a549ecd | ||
|
|
7c0a2b0dde | ||
|
|
1543c35f49 | ||
|
|
0710c2cf26 | ||
|
|
31fbd559f5 | ||
|
|
57c24f55d6 | ||
|
|
0290174a7e | ||
|
|
5cc6f229c1 | ||
|
|
ff04a096b9 | ||
|
|
fb9bd5243d | ||
|
|
915e7d3247 | ||
|
|
42852dc331 | ||
|
|
1662655786 | ||
|
|
3f0e0baca0 | ||
|
|
d802e93681 | ||
|
|
142b8152d8 | ||
|
|
8dbc416bfd | ||
|
|
0cdf24711b | ||
|
|
3cb346bbbb | ||
|
|
a57d45862e | ||
|
|
c7dc657de5 | ||
|
|
a1dba7bb9f | ||
|
|
d39eb886f1 | ||
|
|
afb43ff3eb | ||
|
|
7c585bd242 | ||
|
|
d305fe4dfc | ||
|
|
fac89d59bb | ||
|
|
f9229590f5 | ||
|
|
64ec6f6e91 | ||
|
|
133484b0dc | ||
|
|
7b39db4782 | ||
|
|
8a990b2839 | ||
|
|
4f96b53bb1 | ||
|
|
6ba1e42926 | ||
|
|
424a0cb5a5 | ||
|
|
8304eb33f9 | ||
|
|
0b645f8d7e | ||
|
|
f02bba3755 | ||
|
|
1282d1b2b7 | ||
|
|
23b5fc6456 | ||
|
|
60b14cf79b | ||
|
|
def07b53d0 | ||
|
|
e885942603 | ||
|
|
bf2163b21d | ||
|
|
02033457de | ||
|
|
7e17a5a3e8 | ||
|
|
5d4df87b7c | ||
|
|
d16f495f1c | ||
|
|
7581114be6 | ||
|
|
84d96c29d7 | ||
|
|
fa7194f1f5 | ||
|
|
fad58ee6f3 | ||
|
|
32f440a26d | ||
|
|
6d2466cf3b | ||
|
|
e4625f1233 | ||
|
|
512dd785f6 | ||
|
|
e1ef2fe5a1 | ||
|
|
7238544735 | ||
|
|
b3c2d4c09b | ||
|
|
2d1fcbdfb9 | ||
|
|
bf65ad9b38 | ||
|
|
b39797da21 | ||
|
|
8b008aa575 | ||
|
|
20f1e8b2ed | ||
|
|
1ce59ac0f6 | ||
|
|
9761b9baca | ||
|
|
cdc74a654e | ||
|
|
4144f7c8b6 | ||
|
|
a9fbe45d52 | ||
|
|
6829ed6f81 | ||
|
|
f34256ba69 | ||
|
|
97397d49ee | ||
|
|
adbd803dc9 | ||
|
|
1fb14b6675 | ||
|
|
91995814dd | ||
|
|
ba9e6f2a6e | ||
|
|
c49889b030 | ||
|
|
6cdfec1fd9 | ||
|
|
17d0df1bc9 | ||
|
|
1a2993df55 | ||
|
|
8f5a6d1279 | ||
|
|
4ba20d67e2 | ||
|
|
9f701da401 | ||
|
|
fcb56ff523 | ||
|
|
274b5f6e6f | ||
|
|
f9fe7b69dc | ||
|
|
f6d688987c | ||
|
|
406bf692ee | ||
|
|
a4142a25e1 | ||
|
|
8059920bfb | ||
|
|
7081547823 |
15
.circleci/config.yml
Normal 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
@@ -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
@@ -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
@@ -0,0 +1 @@
|
||||
T3 locks up endlessly checking TSC2101 interrupts
|
||||
@@ -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
|
||||
@@ -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
@@ -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.
|
||||
14
bugs/fixed/sdCardImplementation/possibleCauses.txt
Normal 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
|
||||
1614
bugs/fixed/sdCardImplementation/sdCardFullAccessLogGood.txt
Normal file
2453
bugs/fixed/sdCardImplementation/sdCardWriteTransferLogGood.txt
Normal 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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
BIN
bugs/shadowTheifBug/Screenshot_20190426-220702.png
Normal file
|
After Width: | Height: | Size: 123 KiB |
4
bugs/shadowTheifBug/text.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
Whenever I register ShadowThief, this happens:
|
||||
|
||||
It happens on any version of Mu
|
||||
PHEM/ST is fine
|
||||
@@ -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])
|
||||
|
||||
@@ -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
|
||||
|
||||
|
Before Width: | Height: | Size: 13 KiB |
@@ -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)$@ $<
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
101
libretroBuildSystem/build/Makefile.windows_msvc2008_x86
Normal 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
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
|
||||
@@ -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){
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 \
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 7.6 KiB |
1
qtBuildSystem/Mu/images/boot.svg
Normal file
|
After Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 9.4 KiB |
@@ -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 |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 9.3 KiB |
@@ -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>></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 |
@@ -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 |
@@ -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><</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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
1
qtBuildSystem/Mu/images/reset.svg
Normal file
|
After Width: | Height: | Size: 5.2 KiB |
@@ -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>></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 |
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 10 KiB |
1
qtBuildSystem/Mu/images/settingsManager.svg
Normal 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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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>></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 |
501
qtBuildSystem/Mu/images/voiceMemo.svg
Normal file
|
After Width: | Height: | Size: 42 KiB |
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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];
|
||||
};
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
166
qtBuildSystem/Mu/settingsmanager.cpp
Normal 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);
|
||||
}
|
||||
58
qtBuildSystem/Mu/settingsmanager.h
Normal 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;
|
||||
};
|
||||
439
qtBuildSystem/Mu/settingsmanager.ui
Normal 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>
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
62
readme.md
@@ -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
|
||||
|
||||
69
roadmap.txt
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
539
src/armv5te/arm_interpreter.cpp
Normal 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
@@ -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
@@ -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
@@ -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
|
||||
400
src/armv5te/asmcode_aarch64.S
Normal 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
@@ -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
@@ -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:
|
||||
335
src/armv5te/asmcode_x86_64.S
Normal 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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
|
||||