creada la primer entrada

This commit is contained in:
ghostie 2025-09-25 19:38:27 -05:00
commit 95432e80f0
15 changed files with 791 additions and 0 deletions

34
.gitignore vendored Normal file
View File

@ -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

4
.gitmodules vendored Normal file
View File

@ -0,0 +1,4 @@
[submodule "themes/blowfish"]
path = themes/blowfish
url = https://github.com/nunocoracao/blowfish.git
branch = main

69
config/_default/hugo.toml Normal file
View File

@ -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

View File

@ -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"},
]

View File

@ -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

View File

@ -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

177
config/_default/params.toml Normal file
View File

@ -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 = ""

9
content/_index.org Normal file
View File

@ -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!

View File

@ -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.

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

View File

@ -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]]./

Binary file not shown.

After

Width:  |  Height:  |  Size: 440 B

View File

@ -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~.

View File

@ -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:

1
themes/blowfish Submodule

@ -0,0 +1 @@
Subproject commit 3e652b3749f3f46b26258662599649d10dba2708