commit 95432e80f069749aee0ee733526d6399392ba55d Author: ghostie Date: Thu Sep 25 19:38:27 2025 -0500 creada la primer entrada diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b288580 --- /dev/null +++ b/.gitignore @@ -0,0 +1,34 @@ +# Hugo and Blowfish +public/ +resources/ +exampleSite/resources/ + +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Dependency directories (remove the comment below to include it) +# vendor/ + +#others +node_modules +.hugo_build.lock + +# OS generated files +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +.idea +.Ulysses-Group.plist +.Ulysses-Settings.plist \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..426d936 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "themes/blowfish"] + path = themes/blowfish + url = https://github.com/nunocoracao/blowfish.git + branch = main diff --git a/config/_default/hugo.toml b/config/_default/hugo.toml new file mode 100644 index 0000000..8adfd7f --- /dev/null +++ b/config/_default/hugo.toml @@ -0,0 +1,69 @@ +# -- Site Configuration -- +# Refer to the theme docs for more details about each of these parameters. +# https://blowfish.page/docs/getting-started/ + +theme = "blowfish" +baseURL = "https://ghostpacket.org/" +defaultContentLanguage = "es" + +pluralizeListTitles = "true" # hugo function useful for non-english languages, find out more in https://gohugo.io/getting-started/configuration/#pluralizelisttitles + +enableRobotsTXT = true +summaryLength = 0 + +buildDrafts = false +buildFuture = false + +enableEmoji = true + +# googleAnalytics = "G-XXXXXXXXX" + +[pagination] + pagerSize = 100 + +[imaging] + anchor = 'Center' + +[taxonomies] + tag = "tags" + categoria = "categorias" + autor = "autores" + series = "series" + +[sitemap] + changefreq = 'daily' + filename = 'sitemap.xml' + priority = 0.5 + +[outputs] + home = ["HTML", "RSS", "JSON"] + +[related] + threshold = 0 + toLower = false + + [[related.indices]] + name = "tags" + weight = 100 + + [[related.indices]] + name = "categories" + weight = 100 + + [[related.indices]] + name = "series" + weight = 50 + + [[related.indices]] + name = "authors" + weight = 20 + + [[related.indices]] + name = "date" + weight = 10 + + [[related.indices]] + applyFilter = false + name = 'fragmentrefs' + type = 'fragments' + weight = 10 diff --git a/config/_default/languages.es.toml b/config/_default/languages.es.toml new file mode 100644 index 0000000..93ec942 --- /dev/null +++ b/config/_default/languages.es.toml @@ -0,0 +1,76 @@ +disabled = false +languageCode = "es" +languageName = "Español" +weight = 1 +title = "GhostPacket" + +[params] + displayName = "ES" + isoCode = "es" + rtl = false + dateFormat = "January 2 2006" + # logo = "img/logo.png" + # secondaryLogo = "img/secondary-logo.png" + description = "Programación, política, hacktivismo y física" + copyright = "Todo el contenido de esta página está licenciado bajo CC-BY-SA 4.0 a menos que se indique lo contrario" + + [params.author] + name = "Ghostie" + email = "ghostie@ghostpacket.org" +# image = "img/blowfish_logo.png" +# imageQuality = 96 +# headline = "I'm only human" + bio = "Estudiante de física de la Universidad de Antioquia, amante de la programación de bajo nivel, buscando la excusa perfecta para poder quemarlo todo... pero unidxs, y de la mano siempre." + links = [ + { email = "mailto:ghostie@ghostpacket.org" }, +# { link = "https://link-to-some-website.com/" }, +# { amazon = "https://www.amazon.com/hz/wishlist/ls/wishlist-id" }, +# { apple = "https://www.apple.com" }, +# { blogger = "https://username.blogspot.com/" }, +# { bluesky = "https://bsky.app/profile/username" }, +# { codepen = "https://codepen.io/username" }, +# { dev = "https://dev.to/username" }, +# { discord = "https://discord.gg/invitecode" }, +# { dribbble = "https://dribbble.com/username" }, +# { facebook = "https://facebook.com/username" }, +# { flickr = "https://www.flickr.com/photos/username/" }, +# { foursquare = "https://foursquare.com/username" }, + { github = "https://git.ghostpacket.org/ghostie" }, +# { gitlab = "https://gitlab.com/username" }, +# { google = "https://www.google.com/" }, +# { hashnode = "https://username.hashnode.dev" }, +# { instagram = "https://instagram.com/username" }, +# { itch-io = "https://username.itch.io" }, +# { keybase = "https://keybase.io/username" }, +# { keyoxide = "https://keyoxide.org/URI" }, +# { kickstarter = "https://www.kickstarter.com/profile/username" }, +# { lastfm = "https://lastfm.com/user/username" }, +# { linkedin = "https://linkedin.com/in/username" }, + { mastodon = "https://social.ghostpacket.org/@ghostie" }, + { matrix = "https://matrix.to/#/@ghostie:matrix.ghostpacket.org" }, +# { medium = "https://medium.com/username" }, +# { microsoft = "https://www.microsoft.com/" }, +# { orcid = "https://orcid.org/userid" }, +# { patreon = "https://www.patreon.com/username" }, +# { pinterest = "https://pinterest.com/username" }, +# { reddit = "https://reddit.com/user/username" }, +# { researchgate = "https://www.researchgate.net/profile/username" }, +# { signal = "https://signal.me/#eu/userid" }, +# { slack = "https://workspace.url/team/userid" }, +# { snapchat = "https://snapchat.com/add/username" }, +# { soundcloud = "https://soundcloud.com/username" }, +# { spotify = "https://open.spotify.com/user/userid" }, +# { stack-overflow = "https://stackoverflow.com/users/userid/username" }, +# { steam = "https://steamcommunity.com/profiles/userid" }, +# { telegram = "https://t.me/username" }, +# { threads = "https://www.threads.net/@username" }, +# { tiktok = "https://tiktok.com/@username" }, +# { tumblr = "https://username.tumblr.com" }, +# { twitch = "https://twitch.tv/username" }, +# { twitter = "https://twitter.com/username" }, +# { x-twitter = "https://twitter.com/username" }, +# { whatsapp = "https://wa.me/phone-number" }, +# { youtube = "https://youtube.com/username" }, +# { ko-fi = "https://ko-fi.com/username" }, +# { codeberg = "https://codeberg.org/username"}, + ] diff --git a/config/_default/markup.toml b/config/_default/markup.toml new file mode 100644 index 0000000..fccbfcc --- /dev/null +++ b/config/_default/markup.toml @@ -0,0 +1,20 @@ +# -- Markup -- +# These settings are required for the theme to function. + +[goldmark] + [goldmark.renderer] + unsafe = true + + [goldmark.extensions] + [goldmark.extensions.passthrough] + enable = true + [goldmark.extensions.passthrough.delimiters] + block = [['\[', '\]'], ['$$', '$$']] + inline = [['\(', '\)']] + +[highlight] + noClasses = false + +[tableOfContents] + startLevel = 2 + endLevel = 4 diff --git a/config/_default/menus.es.toml b/config/_default/menus.es.toml new file mode 100644 index 0000000..d97252b --- /dev/null +++ b/config/_default/menus.es.toml @@ -0,0 +1,74 @@ +# -- Main Menu -- +# The main menu is displayed in the header at the top of the page. +# Acceptable parameters are name, pageRef, page, url, title, weight. +# +# The simplest menu configuration is to provide: +# name = The name to be displayed for this menu link +# pageRef = The identifier of the page or section to link to +# +# By default the menu is ordered alphabetically. This can be +# overridden by providing a weight value. The menu will then be +# ordered by weight from lowest to highest. + +[[main]] + name = "Programación" + pageRef = "programacion" + weight = 10 + +[[main]] + name = "No consumas X" + pageRef = "noconsumas" + weight = 20 + +#[[main]] +# name = "Parent" +# weight = 20 + +#[[main]] +# name = "example sub-menu 1" +# parent = "Parent" +# pageRef = "posts" +# weight = 20 + +#[[main]] +# name = "example sub-menu 2" +# parent = "Parent" +# pageRef = "posts" +# weight = 20 + +#[[subnavigation]] +# name = "An interesting topic" +# pageRef = "tags/interesting-topic" +# weight = 10 + +#[[subnavigation]] +# name = "My Awesome Category" +# pre = "github" +# pageRef = "categories/awesome" +# weight = 20 + +#[[main]] +# name = "Categories" +# pageRef = "categories" +# weight = 20 + +#[[main]] +# name = "Tags" +# pageRef = "tags" +# weight = 30 + + +# -- Footer Menu -- +# The footer menu is displayed at the bottom of the page, just before +# the copyright notice. Configure as per the main menu above. + + +# [[footer]] +# name = "Tags" +# pageRef = "tags" +# weight = 10 + +# [[footer]] +# name = "Categories" +# pageRef = "categories" +# weight = 20 diff --git a/config/_default/params.toml b/config/_default/params.toml new file mode 100644 index 0000000..4dd6025 --- /dev/null +++ b/config/_default/params.toml @@ -0,0 +1,177 @@ +# -- Theme Options -- +# These options control how the theme functions and allow you to +# customise the display of your website. +# +# Refer to the theme docs for more details about each of these parameters. +# https://blowfish.page/docs/configuration/#theme-parameters + +colorScheme = "congo" +defaultAppearance = "light" # valid options: light or dark +autoSwitchAppearance = true + +enableA11y = true +enableSearch = true +enableCodeCopy = true + +replyByEmail = false + +# mainSections = ["section1", "section2"] +# robots = "" + +disableImageOptimization = false +disableImageOptimizationMD = false +disableTextInHeader = false +# backgroundImageWidth = 1200 + +defaultBackgroundImage = "https://i.imgur.com/hR5wSzc.jpegṕ" +# defaultFeaturedImage = "IMAGE.jpg" # used as default for featured images in all articles +# defaultSocialImage = "/android-chrome-512x512.png" # used as default for social media sharing (Open Graph and Twitter) + +highlightCurrentMenuArea = true +smartTOC = true +# smartTOCHideUnfocusedChildren = true + +fingerprintAlgorithm = "sha512" # Valid values are "sha512" (default), "sha384", "sha256" + +giteaDefaultServer = "https://git.ghostpacket.org" +forgejoDefaultServer = "https://v11.next.forgejo.org" + +[header] + layout = "fixed" # valid options: basic, fixed, fixed-fill, fixed-gradient, fixed-fill-blur + +[footer] + showMenu = true + showCopyright = true + showThemeAttribution = true + showAppearanceSwitcher = true + showScrollToTop = true + +[homepage] + layout = "background" # valid options: page, profile, hero, card, background, custom + #homepageImage = "IMAGE.jpg" # used in: hero, and card + showRecent = false + showRecentItems = 10 + showMoreLink = false + showMoreLinkDest = "/posts/" + cardView = false + cardViewScreenWidth = false + layoutBackgroundBlur = true # only used when layout equals background + disableHeroImageFilter = false # only used when layout equals hero + +[article] + showDate = true + showViews = false + showLikes = false + showDateOnlyInArticle = false + showDateUpdated = true + showAuthor = true + showAuthorBottom = true + showHero = false + # heroStyle = "basic" # valid options: basic, big, background, thumbAndBackground + layoutBackgroundBlur = true # only used when heroStyle equals background or thumbAndBackground + layoutBackgroundHeaderSpace = true # only used when heroStyle equals background + showBreadcrumbs = false + showDraftLabel = true + showEdit = false + # editURL = "https://github.com/username/repo/" + editAppendPath = true + seriesOpened = false + showHeadingAnchors = true + showPagination = true + invertPagination = false + showReadingTime = true + showTableOfContents = true + showRelatedContent = false + #  relatedContentLimit = 3 + showTaxonomies = false # use showTaxonomies OR showCategoryOnly, not both + showCategoryOnly = false # use showTaxonomies OR showCategoryOnly, not both + showAuthorsBadges = false + showWordCount = true + sharingLinks = [ "linkedin", "twitter", "bluesky", "mastodon", "reddit", "pinterest", "facebook", "email", "whatsapp", "telegram", "line"] + showZenMode = false + +[list] + showHero = false + # heroStyle = "background" # valid options: basic, big, background, thumbAndBackground + layoutBackgroundBlur = true # only used when heroStyle equals background or thumbAndBackground + layoutBackgroundHeaderSpace = true # only used when heroStyle equals background + showBreadcrumbs = false + showSummary = true + showViews = false + showLikes = false + showTableOfContents = false + showCards = false + orderByWeight = false + groupByYear = true + cardView = false + cardViewScreenWidth = false + constrainItemsWidth = false + +[sitemap] + excludedKinds = ["taxonomy", "term"] + +[taxonomy] + showTermCount = true + showHero = false + # heroStyle = "background" # valid options: basic, big, background, thumbAndBackground + showBreadcrumbs = true + showViews = false + showLikes = false + showTableOfContents = false + cardView = false + +[term] + showHero = false + # heroStyle = "background" # valid options: basic, big, background, thumbAndBackground + showBreadcrumbs = true + showViews = false + showLikes = false + showTableOfContents = true + groupByYear = true + cardView = false + cardViewScreenWidth = false + +[firebase] + # apiKey = "XXXXXX" + # authDomain = "XXXXXX" + # projectId = "XXXXXX" + # storageBucket = "XXXXXX" + # messagingSenderId = "XXXXXX" + # appId = "XXXXXX" + # measurementId = "XXXXXX" + +[fathomAnalytics] + # site = "ABC12345" + # domain = "llama.yoursite.com" + +[umamiAnalytics] + # websiteid = "ABC12345" + # domain = "llama.yoursite.com" + # dataDomains = "yoursite.com,yoursite2.com" + # scriptName = "" + # enableTrackEvent = true + +[selineAnalytics] + # token = "XXXXXX" + # enableTrackEvent = true + +[buymeacoffee] + # identifier = "" + # globalWidget = true + # globalWidgetMessage = "Hello" + # globalWidgetColor = "#FFDD00" + # globalWidgetPosition = "Right" + +[verification] + # google = "" + # bing = "" + # pinterest = "" + # yandex = "" + # fediverse = "" + +[rssnext] + # feedId = "" + # userId = "" + +[advertisement] + # adsense = "" diff --git a/content/_index.org b/content/_index.org new file mode 100644 index 0000000..4ec086a --- /dev/null +++ b/content/_index.org @@ -0,0 +1,9 @@ +#+title: Inicio +#+description: Inicio de la página de GhostPacket + +¡Hola a todxs y bienvenidxs a GhostPacket! + +En esta página escribiré principalmente sobre política, programación, física y +algo de ciberseguridad. Espero que sea útil para todxs ustedes. + +¡Porque el conocimiento debe ser libre! diff --git a/content/noconsumas/_index.org b/content/noconsumas/_index.org new file mode 100644 index 0000000..8dd6bfb --- /dev/null +++ b/content/noconsumas/_index.org @@ -0,0 +1,7 @@ +#+title: ¿Por qué no consumir X? +#+description: Una sección donde hablo por qué boicoteo ciertas compañías, y una invitación abierta a todx aquellx que quiera unirse. + +Las siguientes son marcas/productos que he dejado de consumir por razones que +podrán encontradar detalladas y documentadas en cada una de las entradas. Lxs +invito a cada unx de ustedes que se unan a este lucha, que nuestras comodidades +no cuesten los derechos de muchxs. diff --git a/content/noconsumas/cocacola/featured.jpg b/content/noconsumas/cocacola/featured.jpg new file mode 100644 index 0000000..facb672 Binary files /dev/null and b/content/noconsumas/cocacola/featured.jpg differ diff --git a/content/noconsumas/cocacola/index.org b/content/noconsumas/cocacola/index.org new file mode 100644 index 0000000..4bdbd63 --- /dev/null +++ b/content/noconsumas/cocacola/index.org @@ -0,0 +1,124 @@ +#+title: ¿Por qué no consumir productos de Coca-Cola? +#+description: Razones por las que evito consumir productos de Coca-Cola +#+summary: Coca-Cola es una compañía podrida, que debe su riqueza a la explotación de recursos naturales, explotación laboral, y se ha visto envuelta en casos de persecusión sindical, secuestros, torturas, asesinato y vínculos con grupos paramilitares. Todo eso en varios países de Latinoamérica +#+categorias[]: noconsumas +#+date: 2025-09-25T23:51:49+0000 +#+LAST_MODIFIED: 2025-09-26T00:36:59+0000 + +Las siguientes son razones por las que evito consumir productos de +Coca-Cola. Para empezar, Coca-Cola es una compañía podrida, que debe su riqueza +a la explotación de recursos naturales, explotación laboral, y se ha visto +envuelta en casos de persecusión sindical, secuestros, torturas, asesinato y +vínculos con grupos paramilitares. Todo eso en varios países de Latinoamérica. + +* Crímenes y Abusos en América Latina + +** Colombia + +Coca-Cola en Colombia ha tenido varias víctimas, algunas de ellas son Isidro Segundo Gil (asesinado el 5 de diciembre de 1996), Adolfo de Jesús Múnera, entre otros[fn:1]. + +En Colombia, Coca-Cola ha estado presente en casos de asesinatos, amenazas y +desplazamientos de sindicalistas de SINALTRAINAL (Sindicato Nacional del Sistema +Agroalimentario de Colombia) por parte de paramilitares[fn:1] [fn:2] [fn:3]. + +** Guatemala + +En Guatemala Coca-Cola también ha sido protagonista de varios asesinatos, +algunos como el de Pedro Quevedo (asesinado el 12 de diciembre de 1978), Manuel +López Balán (5 de abril de 1979), Manuel Antonio Moscoso (24 de enero de 1979), +etc [fn:4]. + +En Guatemala, al igual que en Colombia, y la mayoría de países, han habido campañas de terror contra sindicalistas. Esto dio lugar a asesinatos, amenazas, secuestros, y represión militar[fn:5] + +** Nicaragua + +En 2005, el sindicato único de trabajadores de Coca-Cola denunció despidos +ilegales, amenazas, y negación al derecho de sindicalizarse por parte de +PANAMCO [fn:3]. + +** México + +En México, Coca-Cola ha realizado evasión fiscal masiva mediante empresas +fantasma como SIAAGSA[fn:6] [fn:8], ha negado el reparto de utilidades (PTU) a +empleados[fn:7], y entre muchos otros casos expuestos aquí[fn:8]. + +** Panamá + +En 2003, Coca-Cola fue multada por $300.000 dólares por contaminar el río +Matasnillo y la bahía de Panamá con tinte rojo usado en la producción de jugos[fn:9]. + +* Vínculos con Israel y Crímenes en Palestina + +Coca-Cola opera en el asentamiento ilegal de Atarot (Cisjordania) mediante su +franquicia Central Beverage Company [fn:10]. En cuanto a esto, la Corte +Internacional de Justicia[fn:11] declaró en 2024 que estos asentamientos son ilegales y constituyen crímenes de guerra. + +* Contaminación Ambiental Masiva + +Coca-Cola es uno de los mayores contaminantes de plástico del planeta[fn:12]. Se +estima que anualmente producen aproximadamente 110 mil millones de botellas de +plástico, la mayoría de un solo uso[fn:13]. + +* Marcas de The Coca-Cola Company + +Las siguientes son algunas de las marcas de The Coca-Cola Company: + +- Coca-Cola +- Sprite +- Fanta +- Powerade +- Dasani +- Schweppes +- Del Valle +- Monster +- Fuze Tea +- Quatro + +* Footnotes + +[fn:13] Wikipedia. (s. f.). /The Coca-Cola Company/. En /Wikipedia, la enciclopedia +libre/. Recuperado de [[https://es.wikipedia.org/wiki/The_Coca-Cola_Company]]. + +[fn:12] Morales, Y. (2025, 26 de marzo). /Coca-Cola es el mayor contaminante del mundo de residuos plásticos en los océanos. El Economista./ Recuperado de [[https://www.eleconomista.com.mx/empresas/coca-cola-mayor-contaminante-mundo-residuos-plasticos-oceanos-20250326-752107.html]] + +[fn:11] Noticias ONU. (2024, 19 de julio). /Corte Internacional de Justicia, +Israel, Gaza, virus del Oropouche... Las noticias del viernes/. Recuperado de +[[https://news.un.org/es/story/2024/07/1531371]] + +[fn:10] Who Profits. (s. f.). /The Central Bottling Company (Coca-Cola +Israel)/. Recuperado de +[[https://www.whoprofits.org/companies/company/4081?the-central-bottling-company-cbc-coca-cola-israel]] + +[fn:9] La Vanguardia. (2003, 8 de mayo). /Panamá multa a dos multinacionales de +EE.UU. por contaminación ambiental/. Recuperado de +[[https://www.lavanguardia.com/vida/20030508/51262774050/panama-multa-a-dos-multinacionales-de-ee-uu-por-contaminacion-ambiental.html]] + +[fn:8] Killer Coke. (s. f.) /Coke's Crimes in Mexico/. Recuperado de +[[https://killercoke.org/crimes_mexico.php]] + +[fn:7] Reyes, F. (2019, 25 de junio). /Ciudad de México: trabajadores de Coca +Cola levantan paros en cinco plantas distribuidoras./ La Izquierda Diario - Mundo +Obrero México. Recuperado de +[[https://www.laizquierdadiario.com/Ciudad-de-Mexico-trabajadores-de-Coca-Cola-levantan-paros-en-cinco-plantas-distribuidoras]] + +[fn:6] Proceso. (2009, 22 de agosto) . /Ante ilegalidades de Coca-Cola, el +silencio./ Recuperado de +[[https://www.proceso.com.mx/nacional/2009/8/22/ante-ilegalidades-de-coca-cola-el-silencio-18104.html]]. + +[fn:5] Comisión Interamericana de Derechos Humanos. (1980-1981). /Informe Anual: +Guatemala, caso 4425/. Recuperado de +[[https://www.cidh.oas.org/annualrep/80.81sp/Guatemala4425.htm]]. + +[fn:4] Killer Coke. (s. f.). /Coke's crimes in Guatemala/. Recuperado de +[[https://killercoke.org/crimes_guatemala.php?utm_source=chatgpt.com]]. + +[fn:3] Monasterio Martín, M. (2007, 26 de abril). /Coca-Cola es así: Abusos +laborales, atentados ecológicos y persecusión sindical/. OMAL - Observatorio de +Multinacionales en América Latina. [[https://omal.info/spip.php?article3995]] + +[fn:2] CETIM. (2014, 6 de junio). /Violaciones de derechos humanos por parte de +Coca Cola en Colombia./ Recuperado de +[[https://www.cetim.ch/violaciones-de-derechos-humanos-por-parte-de-coca-cola-en-colombia/][https://www.cetim.ch/violaciones-de-derechos-humanos-por-parte-de-coca-cola-en-colombia/]] + +[fn:1] Killer Coke. (s. f.). /Coke's Crimes in Colombia. Recuperado de +[[https://killercoke.org/crimes_colombia.php][https://killercoke.org/crimes_colombia.php]]./ diff --git a/content/programacion/2025/09/emulador-chip8/featured.png b/content/programacion/2025/09/emulador-chip8/featured.png new file mode 100644 index 0000000..b683721 Binary files /dev/null and b/content/programacion/2025/09/emulador-chip8/featured.png differ diff --git a/content/programacion/2025/09/emulador-chip8/index.org b/content/programacion/2025/09/emulador-chip8/index.org new file mode 100644 index 0000000..30f52bc --- /dev/null +++ b/content/programacion/2025/09/emulador-chip8/index.org @@ -0,0 +1,191 @@ +#+title: ¿Cómo escribir un emulador de Chip8 con C? +#+description: Una breve entrada de como iniciar en el desarrollo de emuladores con C +#+summary: Una pequeña guía para iniciar en el desarrollo de emuladores utilizando C como lenguaje de programación, y el Chip8 como proyecto a implementar. +#+categorias[]: C Programación +#+date: 2025-09-19T02:31:01+0000 +#+draft: true +#+LAST_MODIFIED: 2025-09-25T23:44:38+0000 + +¡Hola a todxs! + +En esta entrada vamos a ver como podemos escribir un emulador del chip8 en C. +Tengan en cuenta que esta va a ser solo una guía enumerando los pasos, +mostrando formas en que se podría hacer la implementación, pero mejorar ese +código, finalizarlo e incluso construir otros proyectos sobre el (como un +ensamblador, debugger y desensamblador) serían muy buenas cosas que estudiar +después. + +* El Chip8 + +El Chip8 es un lenguaje de programación desarrollado a mitad de los 70s por +Joseph Weisbecker. Chip8 fue diseñado para ser más fácil de programar y usar menos memoria que otros lenguajes de la época, como BASIC. + +Algunas aplicaciones hechas en Chip8 incluyen juegos originales, demos, y +recreaciones de juegos populares de otros sistemas. + +Hacer una implementación de Chip8 no es tan complicado, y es el lugar perfecto +para iniciar a desarrollar emuladores, ya que su set de instrucciones es +reducido, y es bastante fácil de implementar. + +Primero, vamos sobre los detalles técnicos de como funciona Chip8, antes de +empezar a pensar en la implementación para que así sepamos qué estamos +haciendo, y por qué. + +{{< alert "circle-info" >}} +*[[http://devernay.free.fr/hacks/chip8/C8TECH10.HTM][Aquí]]* podrás encontrar una especificación completa del Chip8. +{{< /alert >}} + +** Memoria + +El Chip8 tiene 4095 bytes de memoria, que pueden ser representados de la +siguiente forma: + +#+begin_src artist + +-----------------------+ + | | 0xFFF - Fin de la memoria + +-----------------------+ + | | + | | + | | + | 0x200/0xFFF | + | Datos del | + | programa | + | | + +-----------------------+ 0x200 - Inicio programas Chip8 + | | + | 0x00/0x1FF | + | Reservado | + | | + +-----------------------+ 0x00 - Inicio de la RAM +#+end_src + +La dirección ~0x00~ marca donde inicia la RAM, de la dirección ~0x00~ a la dirección +~0x1ff~ (511 bytes) hay un espacio reservado para el Chip8 donde almacena - por +ejemplo - el set de caracteres por defecto (vamos a ver esto a profundidad más +adelante). Todos los programas del chip8 se cargan en la dirección de memoria +~0x200~, y tienen desde ~0x200~ a ~0xfff~ para almacenar todas sus instrucciones y +sprites (ya también pasamos a esto). + +El stack del Chip8 es un array de 16 valores diferentes de 16 bits cada uno, +estos se utilizan para almacenar las direcciones a las que el chip8 debería +volver de una subrutina, lo que quiere decir, que tenemos un nivel máximo de +encadenamiento de 16 subrutinas. En otras palabras, cada que llamemos una +subrutina, se va a crear una entrada en el stack, y al ser terminada su +ejecicion será removida del stack, volviendo al punto de ejecución anterior. + +El stack es una estructura de datos tipo LIFO (Last In, First Out), lo que +significa que el último elemento, será siempre el primero en ser removido. + +** Set de caracteres + +El Chip8 viene con varios sprites por defecto, estos los llamamos /set de +caracteres/. Estos son un grupo de sprites representando los digitos desde el 0 +hasta la F. Son de 5 bytes (sprites de 8x5) y están almacenados en el área reservada del chip8 (0x00 - 0x1ff). + +Los siguientes, son ejemplos de estos caracteres: + +#+begin_src text ++----+--------+----+ +----+--------+----+ +|"0" |Binary |Hex | |"1" |Binary |Hex | ++----+--------+----| +----+--------+----+ +|****|11110000|0xF0| | 1 |00100000|0x20| +|* *|10010000|0x90| | 11 |01100000|0x60| +|* *|10010000|0x90| | 1 |00100000|0x20| +|* *|10010000|0x90| | 1 |00100000|0x20| +|****|11110000|0xF0| | 111|01110000|0x70| ++----+--------+----+ +----+--------+----+ +#+end_src + +** Registros + +El Chip8 tiene 16 registros que pueden almacenar valores de hasta 8 bits, es +decir, pueden almacenar un byte de información. Los registros son los +siguientes: + +| Registros | | | | | +|-----------+----+----+----+----| +| | V0 | V1 | V2 | V3 | +| | V4 | V4 | V6 | V7 | +| | V8 | V9 | VA | VB | +| | VC | VD | VE | VF | + +Es importante tener en cuenta que el registro ~VF~ no debe ser utilizado por un programa, ya que algunas instrucciones hacen uso de este registro, pero los otros 15 registros pueden ser utilizados sin problema. + +El Chip8 también tiene algunos registros extra: +- *I:* Usado para almacenar direcciones de memoria. +- *PC:* Apunta a la dirección de la instrucción que se está ejecutando + actualmente. Todas las instrucciones del Chip8 son de 2 bytes, por lo que este + registro debe ser incrementado por 2 cada vez que una instrucción es + ejecutada. +- *SP:* Stack pointer, apunta a la ubicación del stack. +- *ST (Sound Timer):* Este registro le permite al Chip8 reproducir el sonido de un + beep, ese sonido se ejecutará cuando este registro sea diferente de 0, va a + estar decreciendo a una velocidad de 70Hz. Si este registro es igual a 0, no + se reproducirá ningún sonido. +- *DT (Delay Timer):* Este registro se usa cuando queremos parar la ejecución de + un programa. Funciona similar a el *Sound Timer*, ya que cuando este registro es + diferente de cero, la ejecución del Chip8 se va a poner en pausa, y el valor + de este registro disminuirá a una velocidad de 60Hz. Cuando este timer sea 0 + de nuevo, la ejecución del programa será resumida. + +** La Pantalla + +La resolución del Chip8 es 64x32 pixeles, y es monocromático, lo que quiere +decir que solo puede mostrar blanco y negro, estos valores pueden ser +representados como booleanos, 0 para negro, 1 para blanco. Cuando dibujamos en +la pantalla estamos dibujando sprites, no pixeles individuales. Si un sprite se +mueve hacia un borde de la pantalla y excede la resolución de esta, será envíado +al lado opuesto de la pantalla. Los sprites pueden tener un máxico de 8 bits de +ancho, y 15 de alto. + + +** El teclado + +El teclado del Chip8 solamente tiene 16 teclas: los números del 0 a la F: + +| 1 | 2 | 3 | C | +| 4 | 5 | 6 | D | +| 7 | 8 | 9 | E | +| A | 0 | B | F | + +** Instrucciones + +El set de instrucciones del Chip8 es demasiado reducido, ya que solamente tiene +36 instrucciones. Hay instrucciones para realizar operaciones matemáticas, +dibujar, y manipular registros. + +* La Implementación + +Vamos a tomar como referencia este código: + +{{< gitea server="https://git.ghostpacket.org" repo="ghostie/Chip8Suite" >}} + +** La estructura del Chip8 + +El núcleo del emulador es una estructura llamada ~struct chip8~ definida en +~include/chip8~. Esa estructura es muy simple, luce de la siguiente forma: + +#+begin_src C + struct chip8 + { + struct chip8_memory memory; + struct chip8_registers registers; + struct chip8_stack stack; + struct chip8_keyboard keyboard; + struct chip8_screen screen; + }; +#+end_src + +Esa estructura contiene todos los elementos que se mencionaron anteriormente, la +memoria, los registros, el stack, el teclado y la pantalla. + +La estructura ~chip8_memory~ definida en ~include/mem.h~ es solo una estructura que +contiene una variable de 4095 bytes definida ~unsigned char memory~, y tiene +algunas funciones para modificar valores en cierto índica, para obtener algún +valores, y para obtener un short (dos bytes) en cierto índice. + +La estructura ~chip8_registers~ definida en ~include/registers.h~, contiene los +registros que se mencionaron anteriormente, es un array de ~unsigned char~ llamado +V con un tamaño de 16 elementos, al igual que algunos otros ~unsigned char~ para +el delay timer, sound timer, y stack pointer. Otros registros como el *I* y el *PC* +son de tipo ~unsigned short~. diff --git a/content/programacion/_index.org b/content/programacion/_index.org new file mode 100644 index 0000000..51be2d0 --- /dev/null +++ b/content/programacion/_index.org @@ -0,0 +1,5 @@ +#+title: Programación +#+description: Blog de GhostPacket + +Los siguientes son todos los posts que están disponibles en GhostPacket sobre +programación: diff --git a/themes/blowfish b/themes/blowfish new file mode 160000 index 0000000..3e652b3 --- /dev/null +++ b/themes/blowfish @@ -0,0 +1 @@ +Subproject commit 3e652b3749f3f46b26258662599649d10dba2708