Slide 1

Slide 1 text

k-kohey ήʔϜϘʔΠΞυόϯεͰ 4XJGUΛಈ͔ͦ͏ J04%$+BQBO5SBDL%ϨΪϡϥʔτʔΫʢ෼ʣ

Slide 2

Slide 2 text

4XJGUΛԿʹ͔͍ͭͬͯ·͔͢

Slide 3

Slide 3 text

4XJGUΛԿʹ͔͍ͭͬͯ·͔͢ iPhone iPad Apple Watch

Slide 4

Slide 4 text

4XJGUΛԿʹ͔͍ͭͬͯ·͔͢ iPhone iPad Apple Watch Linux Windows

Slide 5

Slide 5 text

iPhone iPad Apple Watch Linux Windows 4XJGUΛԿʹ͔͍ͭͬͯ·͔͢ ૊ΈࠐΈ։ൃ

Slide 6

Slide 6 text

4XJGUͰ૊ΈࠐΈ։ൃʁ

Slide 7

Slide 7 text

എܠc4XJGUΛ࢖ͬͨ૊ΈࠐΈ։ൃͷࣄྫ w TXJGUPSHʹ༷ͯʑͳϚΠίϯ্Ͱ 4XJGUίʔυΛಈ͔͢ࣄྫͷ঺հ͕͞Εͨ<> w 4XJGUΛ࢖ͬͯ૊ΈࠐΈ։ൃΛߦ͏ηογϣϯ͕ 88%$Ͱެ։͞Εͨ<> w "QQMF͸4FDVSF&ODMBWFϓϩηοαͷ։ൃʹ 4XJGUΛ༻͍͍ͯΔ<> <>IUUQTXXXTXJGUPSHCMPHFNCFEEFETXJGUFYBNQMFT<>IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED<>IUUQT XXXTXJGUPSHCMPHFNCFEEFETXJGUFYBNQMFT<>IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED <>ʹެ։͞Εͨ4XJGUΛ࢖ͬͨ૊ΈࠐΈ։ൃͷ༷ࢠ

Slide 8

Slide 8 text

എܠc4XJGUΛ࢖ͬͨ૊ΈࠐΈ։ൃͷࣄྫ w TXJGUPSHʹ༷ͯʑͳϚΠίϯ্Ͱ 4XJGUίʔυΛಈ͔͢ࣄྫͷ঺հ͕͞Εͨ<> w 4XJGUΛ࢖ͬͯ૊ΈࠐΈ։ൃΛߦ͏ηογϣϯ͕ 88%$Ͱެ։͞Εͨ<> w "QQMF͸4FDVSF&ODMBWFϓϩηοαͷ։ൃʹ 4XJGUΛ༻͍͍ͯΔ<> <>IUUQTXXXTXJGUPSHCMPHFNCFEEFETXJGUFYBNQMFT<>IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED<>IUUQT XXXTXJGUPSHCMPHFNCFEEFETXJGUFYBNQMFT<>IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED <>ʹެ։͞Εͨ4XJGUΛ࢖ͬͨ૊ΈࠐΈ։ൃͷ༷ࢠ ࠓ೥ಛʹ੝Γ্͕͍ͬͯΔٕज़

Slide 9

Slide 9 text

എܠc4XJGUΛ࢖ͬͨϨτϩήʔϜ։ൃ w ϨτϩήʔϜ։ൃ͸૊ΈࠐΈ։ൃͷҰछ w ։ൃࣄྫ w 1MBZEBUFʢൃϨτϩήʔϜ෩ܞଳήʔϜػʣ w 4XJGUΛ࢖ͬͨαϯϓϧίʔυͱղઆهࣄ͕ެ։͞Ε͍ͯΔ<> w ήʔϜϘʔΠΞυόϯεʢҎ߱ɼ(#"ʣ w 9ʹͯ4XJGUΛ(#"Ͱಈ͔ͨ͠ใࠂ͕͋ͬͨ<> w ͨͩ͠۩ମతͳݪཧ΍ํ๏ͷݴٴ͸ͳ͔ͬͨ w ʢϓϩϙʔβϧక੾࣌఺ʣʹͯଞʹ4XJGUΛ࢖ͬͯ (#"։ൃΛߦͬͨࣄྫ΍ղઆهࣄ͸ݟ౰ͨΒͳ͔ͬͨ<> <>IUUQTXXXTXJGUPSHCMPHCZUFTJ[FETXJGUUJOZHBNFTQMBZEBUF <>IUUQTYDPNIBSMBOIBTLJOTTUBUVT <>ࣗ෼ௐ΂ (#"ͷᝑମ IUUQTXXXOJOUFOEPDPKQOIBSEXBSFHCBJOEFYIUNM 1MBZEBUFͷᝑମ IUUQTQMBZEBUFTIPQ

Slide 10

Slide 10 text

എܠc4XJGUΛ࢖ͬͨϨτϩήʔϜ։ൃ w ϨτϩήʔϜ։ൃ͸૊ΈࠐΈ։ൃͷҰछ w ։ൃࣄྫ w 1MBZEBUFʢൃϨτϩήʔϜ෩ܞଳήʔϜػʣ w 4XJGUΛ࢖ͬͨαϯϓϧίʔυͱղઆهࣄ͕ެ։͞Ε͍ͯΔ<> w ήʔϜϘʔΠΞυόϯεʢҎ߱ɼ(#"ʣ w 9ʹͯ4XJGUΛ(#"Ͱಈ͔ͨ͠ใࠂ͕͋ͬͨ<> w ͨͩ͠۩ମతͳݪཧ΍ํ๏ͷݴٴ͸ͳ͔ͬͨ w ʢϓϩϙʔβϧక೔࣌఺ʣʹͯଞʹ4XJGUΛ࢖ͬͯ (#"։ൃΛߦͬͨࣄྫ΍ղઆهࣄ͸ݟ౰ͨΒͳ͔ͬͨ<> <>IUUQTXXXTXJGUPSHCMPHCZUFTJ[FETXJGUUJOZHBNFTQMBZEBUF <>IUUQTYDPNIBSMBOIBTLJOTTUBUVT <>ࣗ෼ௐ΂ (#"ͷᝑମ IUUQTXXXOJOUFOEPDPKQOIBSEXBSFHCBJOEFYIUNM 1MBZEBUFͷᝑମ IUUQTQMBZEBUFTIPQ 4XJGUͰ(#"։ൃͷ৘ใ͸গͳ͍

Slide 11

Slide 11 text

എܠc"QQ4UPSFͱΤϛϡϨʔλ w ʹ"QQ4UPSFͷΨΠυϥΠϯ͕ ߋ৽͞ΕϨτϩήʔϜػͷΤϛϡϨʔλͷ ެ։͕ڐՄ͞Εͨ<> w طʹ"QQ4UPSFͰ͸ϨτϩήʔϜػͷ ΤϛϡϨʔλ͕ެ։͞Ε޿͘࢖ΘΕ͍ͯ Δ<> <>IUUQTEFWFMPQFSBQQMFDPNOFXT JELKMJP<>IUUQTBQQTBQQMFDPNKQBQQEFMUBHBNFFNVMBUPSJE ਓʹ୆(#"ঢ়ଶ

Slide 12

Slide 12 text

͜ͷ··ͩͱJ04ք۾ͷ (#"։ൃͷڙڅ͕धཁʹؒʹ߹Θͳ͍͔΋͠Εͳ͍ʜ

Slide 13

Slide 13 text

໨తcຊൃදͷΰʔϧ w ࢼߦࡨޡͷ຤ʹ4XJGU͔Β(#"ͷ30.Λ࡞੒͢Δ͜ͱʹ੒ޭͨ͠ w ୭Ͱ΋4XJGUΛ࢖ͬͯ(#"։ൃʹऔΓ૊ΊΔΑ͏ʹͳΔ৘ใΛڞ༗͢Δ

Slide 14

Slide 14 text

໨తc໨࣍ w എܠ w ໨త w ࣗݾ঺հ w ൃදͷείʔϓ w ಈ࡞ݪཧ w ։ൃ؀ڥߏங w αϯϓϧίʔυ w ·ͱΊ

Slide 15

Slide 15 text

ࣗݾ঺հ w ιʔγϟϧΞΧ΢ϯτ w (JU)VCɿLLPIFZ w 9ɿL@LPIFZJ w ॴଐ w גࣜձࣾϦΫϧʔτ w J04ΤϯδχΞ w (#"ͷιϑτ͸։ൃ͍ͯ͠ͳ͍

Slide 16

Slide 16 text

ൃදͷείʔϓ w ࿩͢͜ͱ w 4XJGUΛ(#"޲͚ʹίϯύΠϧ͢Δݪཧͱํ๏ w ίϯύΠϧ͢Δࡍʹର໘͢ΔΤϥʔͷղܾํ๏ w ը໘ඳը΍ϘλϯೖྗͳͲͷ(#"ͷجຊతͳ࢓༷ͱ࣮૷ํ๏ w ࿩͞ͳ͍͜ͱ w ήʔϜ։ൃͷϊ΢ϋ΢ w 4XJGUίϯύΠϥͷ಺෦࣮૷΍मਖ਼ํ๏ʹ͍ͭͯ w طଘͷπʔϧνΣʔϯͷΈͰ࣮૷͕Մೳ

Slide 17

Slide 17 text

ಈ࡞ݪཧc(#"ͷΞʔΩςΫνϟ޲͚ʹίϯύΠϧ w --7. w 4XJGUͷ։ൃʹར༻͞Ε͍ͯΔίϯύΠϥج൫ w େผͯͭ͠ͷ޻ఔΛܦͯιʔείʔυΛίϯύΠϧ͢Δ ϑϩϯτΤϯυ ࣈ۟ղੳ΍ߏจղੳ౳ όοΫΤϯυ ΞηϯϒϦ΍ΦϒδΣ ΫτϑΝΠϧͷੜ੒ --7.*3 ͷ࠷దԽ

Slide 18

Slide 18 text

ಈ࡞ݪཧc(#"ͷΞʔΩςΫνϟ޲͚ʹίϯύΠϧ w όοΫΤϯυ w όοΫΤϯυ͸༷ʑͳ΋ͷ͕ଘࡏ͢Δ w όοΫΤϯυΛมߋ͢Δ͜ͱͰରԠ͢ΔΞʔΩςΫνϟʹ޲͚ͯίϯύΠϧͰ͖Δ ϑϩϯτΤϯυ Y --7.*3 3*4$7 "3. Y όοΫΤϯυ 3*4$7 όοΫΤϯυ "3. όοΫΤϯυ

Slide 19

Slide 19 text

ಈ࡞ݪཧc(#"ͷΞʔΩςΫνϟ޲͚ʹίϯύΠϧ w --7.͸"3.WUʹ޲͚ʹग़ྗͰ͖ΔόοΫΤϯυΛ͍࣋ͬͯΔ w (#"͸"3.WUΞʔΩςΫνϟΛ࠾༻͍ͯ͠Δ 4XJGU ϑϩϯτΤϯυ Y --7.*3 3*4$7 "3.WU Y όοΫΤϯυ 3*4$7 όοΫΤϯυ "3. όοΫΤϯυ

Slide 20

Slide 20 text

ಈ࡞ݪཧc(#"ͷΞʔΩςΫνϟ޲͚ʹίϯύΠϧ w --7.͸"3.WUʹ޲͚ʹग़ྗͰ͖ΔόοΫΤϯυΛ͍࣋ͬͯΔ w (#"͸"3.WUΞʔΩςΫνϟΛ࠾༻͍ͯ͠Δ 4XJGU ϑϩϯτΤϯυ Y --7.*3 3*4$7 "3.WU Y όοΫΤϯυ 3*4$7 όοΫΤϯυ "3. όοΫΤϯυ --7.όοΫΤϯυͷ࢓૊ΈʹΑͬͯ 4XJGUΛ(#"ͷΞʔΩςΫνϟʹ޲͚ʹ ίϯύΠϧ͢Δࣄ͕Մೳ

Slide 21

Slide 21 text

ಈ࡞ݪཧc(#"ͷ30.Λੜ੒ w (JU)VCʹެ։͞Ε͍ͯΔ--7.ϕʔεͷ(#"։ൃ༻ͷπʔϧνΣʔϯ HCBMMWNEFWLJUΛ࢖͏ w (#"Ͱಈ࡞͢Δ30.Λੜ੒͢Δͷʹඞཁͳ ҎԼͷΑ͏ͳπʔϧ͕ఏڙ͞Ε͍ͯΔ w ελʔτΞοϓίʔυ w ϓϩάϥϜ࣮ߦ։࢝લͷॳظԽॲཧ౳ w ϦϯΧεΫϦϓτ w ϦϯΫ࣌ͷγϯϘϧͷ഑ஔ౳ w HCB fi Y w ϔομʔ৘ใͷमਖ਼΍ݕূɽϔομʔ͕ؒҧ͍ͬͯΔͱ࣮ػͰىಈͰ͖ͳ͍<> <>IUUQTBLLFSBTBLVSBOFKQHCBEFW '"2WE

Slide 22

Slide 22 text

ಈ࡞ݪཧc(#"ͷ30.Λੜ੒ w (JU)VCʹެ։͞Ε͍ͯΔ--7.ϕʔεͷ(#"։ൃ༻ͷπʔϧνΣʔϯ HCBMMWNEFWLJUΛ࢖͏ w (#"Ͱಈ࡞͢Δ30.Λੜ੒͢Δͷʹඞཁͳ ҎԼͷΑ͏ͳπʔϧ͕ఏڙ͞Ε͍ͯΔ w ελʔτΞοϓίʔυ w ϓϩάϥϜ࣮ߦ։࢝લͷॳظԽॲཧ౳ w ϦϯΧεΫϦϓτ w ϦϯΫ࣌ͷγϯϘϧͷ഑ஔ౳ w HCB fi Y w ϔομʔ৘ใͷमਖ਼΍ݕূɽϔομʔ͕ؒҧ͍ͬͯΔͱ࣮ػͰىಈͰ͖ͳ͍<> <>IUUQTBLLFSBTBLVSBOFKQHCBEFW '"2WE "3.WU޲͚ʹίϯύΠϧ͢Δઃఆͱ ͜ΕΒͷ(#"ͷ30.Λਖ਼͘͠ੜ੒͢ΔͨΊͷ ޻෉Λ૊Έ߹ΘͤΔ

Slide 23

Slide 23 text

ಈ࡞ݪཧc&NCFEEFE4XJGU w ૊ΈࠐΈ։ൃ޲͚ʹ࡞ΒΕͨ4XJGUͷαϒηοτ w ૊ΈࠐΈػث্Ͱ΋΄ͱΜͲͷඪ४ϥΠϒϥϦͷػೳΛѻ͑Δ w ඪ४ϥΠϒϥϦʹ͸*OU΍"SSBZͷΑ͏ͳجຊతͳσʔλߏ଄ͱ BCTͷΑ͏ͳάϩʔόϧؔ਺ؚ͕·ΕΔ w BOZʢ&YJTUFOUJBMUZQFʣ΍ϦϑϨΫγϣϯ͸࢖͑ͳ͍ w ௨ৗͷ4XJGUʹൺ΂ͯখ͍͞αΠζͷ੒Ռ෺ʹίϯύΠϧͰ͖Δ

Slide 24

Slide 24 text

։ൃ؀ڥߏஙc։ൃπʔϧͷΠϯετʔϧ w TXJGUͷUPPMDIBJO w NBJOCSBODIͰ։ൃதͷTXJGUΛTXJGUPSH͔ΒΛೖखͰ͖Δ<> w TXJGU%&7&-01.&/54/"14)05BΛ࢖༻ w HCBMMWNEFWLJU w (JU)VCͷ3FMFBTFT͔ΒೖखͰ͖Δ<> w SFMFBTFWΛ࢖༻ w ΤϛϡϨʔλ w N(#"Λ࢖༻<> <>IUUQTXXXTXJGUPSHEPXOMPBE <>IUUQTHJUIVCDPNTUVJKHCBMMWNEFWLJUSFMFBTFTUBHSFMFBTFW <>IUUQTNHCBJP

Slide 25

Slide 25 text

։ൃ؀ڥߏஙc(#"޲͚ʹίϯύΠϧ w TXJGUDίϚϯυΛ࢖ͬͯ(#"ͷΞʔΩςΫνϟΛࢦఆ͢Δ w swiftc -o my_game.elf EntryPoint.swift -target armv4t-none-none-eabi w &NCFEEFE4XJGUΛ༗ޮ w swiftc -o my_game.elf EntryPoint.swift -wmo -enable-experimental-feature Embedded -target armv4t-none-none-eabi

Slide 26

Slide 26 text

։ൃ؀ڥߏஙc(#"޲͚ʹίϯύΠϧ w HCBMMWNEFWLJUͷ3&"%.&ʹॻ͔ΕͨDMBOH޲͚ͷΦϓγϣϯ<> w clang --config armv4t-gba.cfg -Wl,-T,gba_cart.ld program.c -o program.elf w ্هͷΦϓγϣϯΛTXJGUDʹ௥Ճ w swiftc -o my_game.elf EntryPoint.swift -wmo -enable-experimental- feature Embedded -target armv4t-none-none-eabi -parse-as-library -Xcc -mthumb -Xcc -mfpu=none -Xcc -fno-exceptions -Xcc -fno-rtti -Xcc -D_LIBCPP_AVAILABILITY_HAS_NO_VERBOSE_ABORT -Xcc -fshort-enums -Xlinker -lcrt0-gba -Xclang-linker -T -Xclang-linker gba_cart.ld -Xclang-linker --sysroot -Xclang-linker path/to/gba-llvm-devkit-1- Darwin-arm64/lib/clang-runtimes/arm-none-eabi/armv4t <>IUUQTHJUIVCDPNTUVJKHCBMMWNEFWLJUCMPCF ff EDGBBCBGEECDFGFCDED3&"%.&NE QMBJO-

Slide 27

Slide 27 text

։ൃ؀ڥߏஙc(#"޲͚ʹίϯύΠϧ w ແݶϧʔϓ͔͠ߦΘͳ͍ϑΝΠϧ&OUSZ1PJOUTXJGUΛ࡞੒ @main struct EntryPoint { static func main() { while true {} } }

Slide 28

Slide 28 text

ίϯύΠϧͯ͠ΈΔ

Slide 29

Slide 29 text

։ൃ؀ڥߏஙcίϯύΠϧΤϥʔͷղܾ w ϦϯΧHPME͕ݟ͔ͭΒͳ͍ͱ͍͏Τϥʔ͕ൃੜ w ίϯύΠϧͷΦϓγϣϯʹϦϯΧͷࢦఆ͸ߦ͍ͬͯͳ͍͕ HPME͕બ୒͞Ε͍ͯͨ w HPMEͰ͸ͳ͘MMEΛར༻͢ΔΑ͏ʹࢦఆͯ͠ΈΔ w -fuse-ld=lld FSSPSMJOLDPNNBOEGBJMFEXJUIFYJUDPEF VTFWUPTFFJOWPDBUJPO DMBOHFSSPSJOWBMJEMJOLFSOBNFJOBSHVNFOUGVTFMEHPME

Slide 30

Slide 30 text

։ൃ؀ڥߏஙcίϯύΠϧΤϥʔͷղܾ w ҎԼͷΤϥʔͰϦϯΫʹࣦഊʢϦϯΫ·Ͱ͸੒ޭͨ͠ʣ w @@BUPNJD@@γϯϘϧ͕͍͔ͭ͘ݟ͔ͭΒͳ͍ MEMMEFSSPSVOEF fi OFETZNCPM@@BUPNJD@MPBE@ SFGFSFODFECZNZ@HBNFP WBSGPMEFSTLI[@TDEURZY@RSINHO55FNQPSBSZ%JSFDUPSZQRP1NZ@HBNFP TTTXJGU@SFUBJOPCKFDU#Q#Q@U' SFGFSFODFECZNZ@HBNFP WBSGPMEFSTLI[@TDEURZY@RSINHO55FNQPSBSZ%JSFDUPSZQRP1NZ@HBNFP TTTXJGU@SFMFBTFPCKFDUZ#Q@U' SFGFSFODFECZNZ@HBNFP WBSGPMEFSTLI[@TDEURZY@RSINHO55FNQPSBSZ%JSFDUPSZQRP1NZ@HBNFP TTTXJGU@SFUBJO@OPCKFDUO#Q#Q@T6*OU7U' SFGFSFODFENPSFUJNFT MEMMEFSSPSVOEF fi OFETZNCPM@@BUPNJD@GFUDI@BEE@ SFGFSFODFECZNZ@HBNFP WBSGPMEFSTLI[@TDEURZY@RSINHO55FNQPSBSZ%JSFDUPSZQRP1NZ@HBNFP TTTXJGU@SFUBJOPCKFDU#Q#Q@U' SFGFSFODFECZNZ@HBNFP WBSGPMEFSTLI[@TDEURZY@RSINHO55FNQPSBSZ%JSFDUPSZQRP1NZ@HBNFP TTTXJGU@SFUBJO@OPCKFDUO#Q#Q@T6*OU7U' ҎԼུ

Slide 31

Slide 31 text

։ൃ؀ڥߏஙcίϯύΠϧΤϥʔͷղܾ w ҎԼͷΤϥʔͰϦϯΫʹࣦഊʢϦϯΫ·Ͱ͸੒ޭͨ͠ʣ w @@BUPNJD@@γϯϘϧ͕͍͔ͭ͘ݟ͔ͭΒͳ͍ w "UPNJDܥͷؔ਺͸࢖༻͍ͯ͠ͳ͍ͷͰ࠷దԽͰফͯ͠ΈΔ<> w -Xfrontend -internalize-at-link -lto=llvm-thin <>IUUQTTQFBLFSEFDLDPNLBUFJOPJHBLVLVOVUJMJ[JOHMMWNMUPGPSTXJGU TMJEF

Slide 32

Slide 32 text

։ൃ؀ڥߏஙcίϯύΠϧΤϥʔͷղܾ w TUEPVU΋γϯϘϧ͕ݟ͔ͭΒͳ͍ͱΤϥʔʹͳ͍ͬͯͨ w MJCDͷQVUDIBSD͔Βࢀর͞Ε͍ͯΔ w ҰํͰ(#"্Ͱඪ४ग़ྗ͸࢖Θͳ͍ͷͰҎԼͷΑ͏ʹۭ࣮૷Λ௥Ճ w !@TJMHFO@OBNF<>Λ࢖ͬͯϚϯάϦϯάΛճආ͢Δ @_silgen_name("stdout") let stdout: UnsafeMutableRawPointer? = nil <>IUUQTHJUIVCDPNTXJGUMBOHTXJGUCMPCNBJOEPDT3FGFSFODF(VJEFT6OEFSTDPSFE"UUSJCVUFTNE@TJMHFO@OBNFSBXDOBNF

Slide 33

Slide 33 text

ίϯύΠϧ੒ޭʂ ϲ݄͘Β͍͔͔ͬͨ

Slide 34

Slide 34 text

։ൃ؀ڥߏஙc.BLFGJMFͱ1BDLBHFTXJGUͷ௥Ճ w Ұ࿈ͷεΫϦϓτΛ.BLF fi MFʹ·ͱΊΔ w ͋Δ4XJGUϑΝΠϧ͔ΒଞͷϑΝΠϧͷγϯϘϧ Λίʔυิ׬͔Β ࢀরͰ͖ΔΑ͏ʹ4XJGU1BDLBHFʹϑΝΠϧΛ ·ͱΊΔ w 1BDLHFTXJGUʹॻ͘ίϯύΠϧͷઃఆ͸.BLF fi MFͱ େମಉ͡Α͏ʹ͢Δ $(NAME).gba: $(NAME).elf $(BIN)/llvm-objcopy -O binary $^ $@ $(BIN)/gbafix $@ $(NAME).elf: $(SWIFT_FILES) $(SC) -o $@ $(SWIFT_FILES) \ $(SWIFT_FLAGS) $(addprefix -Xcc , $(CFLAGS)) \ $(addprefix -Xlinker , $(LFLAGS)) \ $(addprefix -Xclang-linker , $(CLANG_LINKER_FLAGS)) run: $(NAME).gba make mGBA $< .PHONY: all clean run clean: rm -f *.o *.elf *.gba *.bc let package = Package( name: "my_game", platforms: [.macOS(.v14)], products: [ .library( name: "my_game", targets: ["my_game"] ) ], dependencies: [], targets: [ .target( name: "my_game", dependencies: [], publicHeadersPath: "include", cSettings: [ .define("_LIBCPP_AVAILABILITY_HAS_NO_VERBOSE _ABORT"), .unsafeFlags(["-O3", "-mthumb", "- mfpu=none", "-fno-exceptions", "-fno-rtti", "-fshort- enums"]) ಺༰͸Ұ෦ൈਮͨ͠΋ͷ

Slide 35

Slide 35 text

αϯϓϧίʔυc֓ཁ w (#"ʹ͸#JUNBQ.PEFͱ5JMF.PEFͱ͍͏ඳըํ๏͕͋Δ w ͦΕͧͷඳըํ๏Λ༻͍ͨαϯϓϧίʔυΛ঺հ͢Δ w αϯϓϧɿ#JUNBQ.PEFΛར༻ w ࢢদ໛༷Λදࣔ͢Δ w αϯϓϧɿ5JMF.PEFΛར༻ w ΩʔೖྗʹΑͬͯඳըͨ͠ΩϟϥΫλʔΛҠಈ͢Δ

Slide 36

Slide 36 text

αϯϓϧc#JUNBQ.PEFͷ࢓༷ w 7JEFP3".ʢҎ߱73".ʣͱ͍͏ϝϞϦྖҬʹ CJUͷ৭৘ใΛॻ͖ࠐΉͱΞυϨεʹ ରԠ͢Δը໘্ͷϐΫηϧʹ৭͕ඳը͞ΕΔ w 73".ͷઌ಄ΞυϨεʢIʣ͸ ը໘ࠨ্ͷϐΫηϧʹ֘౰͢Δ w ΞυϨεΛCJUͣͭਐΊΔ͝ͱʹ ϐΫηϧͣͭඳըର৅͕ӈଆʹҠಈ͢Δ w ઌ಄ΞυϨε͔ΒCJUQYʢԣ෯ʣ ਐΊΔ͝ͱʹϐΫηϧԼଆʹҠಈ͢ΔʢંΓฦ͢ʣ ԣ෯QY ॎ ෯ Q Y I %&I

Slide 37

Slide 37 text

αϯϓϧcॲཧͷྲྀΕ w ࢢদ໛༷ͷࠇͱ྘ͷྖҬͷॎԣΛͦΕͧΕQYͱͯ͠ɼ ը໘ͷࠨ্͔ΒӈԼʹ޲͚֤ͯྖҬຖʹ4DSFFO8SJUFSΛհͯ͠৭Λॻ͖ࠐΉ let screenWriter = ScreenWriter() let rectSize = Size(width: 10, height: 10) for y in 0..<(Screen.height / rectSize.height) { for x in 0..<(Screen.width / rectSize.width) { let color: Color = (x + y) % 2 == 0 ? .black : .green screenWriter.draw( color, at: .init( x: x * rectSize.width, y: y * rectSize.height), size: rectSize ) } } QY QY QY ࢢদ໛༷ͷࠇͱ྘ͷྖҬ

Slide 38

Slide 38 text

αϯϓϧc73".΁ͷॻ͖ࠐΈํ w 73".Λࢀর͢Δʹ͸6OTBGF.VUBCMF1PJOUFSΛ࢖͏ w ࢦఆͨ͠ΞυϨεΛࢀর͢Δࣄ͕Մೳ w *OJUʹ73".ͷΞυϨεΛࢦఆ w JOJUJBMJ[Fϝιου΍QPJOUFFΛ࢖ͬͯ৭Λॻ͖ࠐΉ let vram = UnsafeMutablePointer(bitPattern: 0x6000000)! vram.initialize(repeating: color16, count: count) vram.pointee = color16

Slide 39

Slide 39 text

αϯϓϧc73".ʹॻ͖ࠐΉϝιου w 4DSFFO8SJUFSͷESBXϝιου಺ʹͯߦͣͭCJUͷ৭Λॻ͖ࠐΜͰ͍͘ func draw(_ color: Color, at origin: Position, size: Size) { let color16 = color.to16Bit() //தུ for y in startY..

Slide 40

Slide 40 text

αϯϓϧcඳըํ๏Λࢦఆ w #JUNBQ.PEFͷଞʹ΋༷ʑͳඳըํ๏͕͋ΔͨΊɼͲͷ.PEFΛ࢖ͬͯ ඳը͢Δ͔Λ(#"ʹ఻͑Δඞཁ͕͋Δ w .PEFʹΑͬͯ73".ʹॻ͖ࠐΜͩ஋͕Ͳ͏ղऍ͞ΕΔ͔ҟͳΔͷͰॏཁ w 73".ͱಉ͘͡1PJOUFSΛ࢖ͬͯ *03".ʹ#JUNBQ.PEFΛར༻͢Δ͜ͱΛࣔ͢஋Λॻ͖ࠐΉ let displayControl = UnsafeMutablePointer(bitPattern: 0x4000000)! et displayMode3: UInt32 = 0x3 let enableBackground2: UInt32 = 0x400 displayControl.pointee = displayMode3 | enableBackground2

Slide 41

Slide 41 text

αϯϓϧc࣮ߦ݁Ռ

Slide 42

Slide 42 text

αϯϓϧc5JMF.PEFͷ࢓༷ w 5JMFͱ͍͏ཻ౓ʹ෼ׂͨ͠ը૾σʔλΛϝϞϦ্ʹ഑ஔ͠ ը໘ΛϨΠΞ΢τ͢Δํ๏ w ͜ͷΑ͏ʹඳը͞ΕΔΦϒδΣΫτΛ4QSJUFͱݺͿ w #JUNBQ.PEFͱҟͳΓ௚઀Ґஔͱ৭Λࢦఆ͠ͳ͘ͱ΋ ϋʔυ΢ΣΞ͕ޮ཰Α͘ϨϯμϦϯάͯ͘͠ΕΔ ϝϞϦ্ʹଘࡏ͢Δը૾σʔλʢ5JMFʣ (#"σΟεϓϨΠ ܨ͕ͬͯͯ૲X 4QSJUF

Slide 43

Slide 43 text

αϯϓϧc5JMF.PEFͷ࢓༷ w 4QSJUF͸ཁૉʹ෼͚ͯϝϞϦʹॻ͖ࠐΉʹΑͬͯඳը͞ΕΔ w 1BMFUUF3".ʢYʣ w ࢖༻͢Δ৭Λهड़ w 73".ʢYʣ w #JUNBQ.PEFͱҟͳΓ۩ମతͳ3(#ͷ஋͸࣋ͨͳ͍ w 1BMFUUFͰఆٛ͞Εͨ৭Λ5JMF্ͷͲ͜ʹ഑ஔ͞ΕΔ͔Λهड़ w 0CKFDU"UUSJCVUF.FNPSZʢYʣ w Ґஔ΍େ͖͞౳ͷඳ͔ΕํΛهड़

Slide 44

Slide 44 text

αϯϓϧc4QSJUFσʔλͷ࡞੒ w 4QSJUF͸όΠφϦͱͯ͠ιʔείʔυ্ʹఆٛ͢Δ w HSJUίϚϯυΛ࢖͏͜ͱʹΑͬͯը૾͔Β όΠφϦͷఆ͕ٛ͞Εͨ$ϑΝΠϧΛੜ੒Ͱ͖Δ Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y HSJUDIBSBDUFSQOH H#.X.IGUD DIBSBDUFSQOH DIBSBDUFSD

Slide 45

Slide 45 text

αϯϓϧc4QSJUFͷಡΈࠐΈ w $Ͱੜ੒͞Εͨ5JMFΛ4XJGUͰఆٛͨ͠.FNUJMF<>ʢ73".ʣʹॻ͖ࠐΉ w .FNUJMF<>d.FNUJMF<>ʹରԠ͢ΔΞυϨε͸എܠ༻ͷ5JMFʹ࢖ΘΕΔ w $Ͱੜ੒͞Εͨ5JMFͷ৭৘ใΛهड़ͨ͠1BMFUUFΛ .FNQBMʢ1BMFUUF3".ʣʹॻ͖ࠐΉ withUnsafePointer(to: characterTiles) { characterTilesPointer in characterTilesPointer.withMemoryRebound(to: CHARBLOCK.self, capacity: 1) { source in Mem.tile[4] = source.pointee } } withUnsafePointer(to: characterPal) { pointer in pointer.withMemoryRebound(to: UInt16.self, capacity: 256) { uint16Pointer in Mem.pal.update(from: uint16Pointer, count: 256) } }

Slide 46

Slide 46 text

αϯϓϧcΩʔೖྗ w UPODͷ"1*ʢޙड़ʣΛհͯ͠ΩʔೖྗΛϙʔϦϯάͯ͠ ਫฏͱਨ௚ํ޲ͷҠಈྔΛऔಘ͢Δ w LFZ@QPMM͸ΩʔೖྗΛϙʔϦϯά͢Δ w LFZ@USJ@IPS[ʢWFSUʣ͸ेࣈΩʔͷਫฏʢਨ௚ʣํ޲ͷೖྗΛऔಘ͢Δ key_poll() character.move( tx: 2 * key_tri_horz(), ty: 2 * key_tri_vert() )

Slide 47

Slide 47 text

αϯϓϧcUPODͷར༻ w 5PODʢUPODʣ͸(#"։ൃʹؔ͢ΔςΩετ͓ΑͼϥΠϒϥϦ<> w ࣮૷Λ؆୯ʹ͢ΔͨΊʹUPODΛར༻͢Δ w UPODΛϦϯΫ͢Δ w -Xlinker -ltonc w UPODͷϔομʔϑΝΠϧͷ৔ॴΛ఻͑Δ w -I$path/to/include w 4XJGU͔Βར༻Ͱ͖ΔΑ͏ʹ#SJEHJOH)FBEFSΛॻ͘ w -import-objc-header Bridging-Header.h <>IUUQTXXXDPSBOBDDPNUPODUFYU

Slide 48

Slide 48 text

αϯϓϧc4QSJUFͷҠಈ w طଘͷҐஔʹΩʔೖྗ͔Βಘͨ஋Λ଍͠߹Θͤͯ 0CKFDU"UUSJCVUFΛࣔ͢PCK#V ff FS<>Λߋ৽͢Δ w 0CKFDU"UUSJCVUFΛ.FNPBNʢ0CKFDU"UUSJCVUF.FNPSZʣʹॻ͖ࠐΉ func move(tx: Int32, ty: Int32) { x += tx y += ty obj_set_pos(&objBuffer[0], x, y) oam_copy(Mem.oam, objBuffer, 1) }

Slide 49

Slide 49 text

αϯϓϧc࣮ߦ݁Ռ

Slide 50

Slide 50 text

αϯϓϧίʔυͷશจ͸(JU)VCʹ 👉IUUQTHJUIVCDPNLLPIFZTXJGUHCBTBNQMFT

Slide 51

Slide 51 text

·ͱΊ w (#"։ൃͷ৘ใ͸·ͩগͳ͘धڅόϥϯεͷ่յ͕ݒ೦͞ΕΔ w ଞͷݴޠ͸࢖Θͣʹ4XJGUͷίʔυ͚ͩ΋(#"ͷιϑτ͸࡞ΕΔ w (#"ͷ੍ޚ͸1PJOUFSΛ࢖ͬͯϝϞϦΛಡΈॻ͖͢ΔࣄʹΑͬͯߦ͏ w ΤϛϡϨʔλ͚ͩͰ͸ͳ࣮͘ػͰͷಈ࡞֬ೝ΋ߦ͍͍ͨ