{"id":5070,"date":"2022-02-07T13:16:47","date_gmt":"2022-02-07T12:16:47","guid":{"rendered":"https:\/\/ceo.oric.org\/?p=5070"},"modified":"2022-02-07T13:16:47","modified_gmt":"2022-02-07T12:16:47","slug":"rom-atmos-pour-twilighte-board-demystification","status":"publish","type":"post","link":"https:\/\/oric.bqtt.net\/index.php\/2022\/02\/07\/rom-atmos-pour-twilighte-board-demystification\/","title":{"rendered":"Rom Atmos\/Oric-1 etc pour Twilighte board : D\u00e9mystification"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Comment la rom basic sur la Twilighte board permet de d\u00e9marrer beaucoup de soft atmos, mapper sans aucune configuration les joysticks et d\u00e9marrer des softs qui sont cens\u00e9s d\u00e9marrer uniquement avec un microdisc ? C&#8217;est ce que nous allons voir dans cet article.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"definitions\">D\u00e9finitions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Une <strong>banque<\/strong> est un emplacement m\u00e9moire en EEPROM ou en RAM qui est annonc\u00e9 en $C000 \u00e0 $FFFF<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nous appelerons &#8220;ROM&#8221; une <strong>ROM<\/strong> sous un format .rom stock\u00e9e sur le stockage de la twilighte board qui est charg\u00e9 dans une banque.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La <strong>commande basic11<\/strong> est une commande <strong>Orix<\/strong> qui va charger en <strong>banque<\/strong> un <strong>.rom<\/strong> et lancer cette <strong>ROM<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"credits\">Cr\u00e9dits<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Les ROMS atmos, Oric-1 supportant les joysticks, et faisant le hook vers les storages de la Twilighte board ont \u00e9t\u00e9 r\u00e9alis\u00e9s par Assinie. Les d\u00e9tails du code sont donc explicables par Assinie pour cette partie. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La commande basic11 a \u00e9t\u00e9 \u00e9crite par moi m\u00eame et ne fait que passer des &#8220;arguments&#8221; \u00e0 la ROM pour lui dire comment se comporter. C&#8217;est surtout cette partie qui est d\u00e9crite ici, car c&#8217;est celle que je connais le mieux et c&#8217;est aussi la partie la plus simple \u00e0 r\u00e9aliser au niveau code, par rapport \u00e0 la ROM atmos o\u00f9 il a fallu composer avec les contraintes de softs. Les fonctionnalit\u00e9s d\u00e9crites dans cet article ont \u00e9t\u00e9 pr\u00e9sent\u00e9es en janvier 2020 \u00e0 la visu online. Cela a fait l&#8217;objet de d\u00e9mos des fonctionnalit\u00e9s, mais aucune explication a \u00e9t\u00e9 fournies par manque de temps. Voici les concepts.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"concepts-de-la-carte-twilighte-board-et-d-orix\">Concepts de la carte &#8216;Twilighte board&#8217; et d&#8217;Orix<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Cela fait de nombreuses ann\u00e9es que je voulais \u00e0 la fois avoir un Oric plus puissant, un OS type Linux\/Unix, et la possibilit\u00e9 de tout d\u00e9marrer sans avoir la table remplie de fils d&#8217;extensions ajout\u00e9e sur l&#8217;oric avec en plus son lot d&#8217;incompatibilit\u00e9s. A vrai dire, c&#8217;est au moins depuis les ann\u00e9es 1999\/2000 de mon cot\u00e9 que je voulais un oric plus puissant ! <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La carte et l&#8217;OS sont donc une convergence de plusieurs projets (plut\u00f4t des tentatives) : <\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>En 2006, d\u00e9marrage d&#8217;un OS type unix : Le device de la disquette \u00e9tait un mauvais choix, car j&#8217;avais commenc\u00e9 un formatage type Minix, mais ce n&#8217;\u00e9tait pas viable pour la lenteur, et le fait de voir &#8220;Lunix&#8221; sur disquette a montr\u00e9 que cela pouvait \u00eatre long<\/li><li>En 2009, d\u00e9marrage de la lecture sdcard en SPI, trop long, non viable sur l&#8217;oric pour le m\u00eame probl\u00e8me de lenteur.<\/li><li>En 2012, une interface joysticks : oui mais pourquoi faire ? Les jeux ne sont pas compatibles pour la plupart, et si on collait \u00e0 une interface particuli\u00e8re, il faudrait patcher tous les softs.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Finalement, la volont\u00e9 de vouloir tout d\u00e9marrer sur l&#8217;atmos sans rentrer dans toutes les contraintes techniques a donc dirig\u00e9 ce choix : avoir un OS &#8220;chapeau&#8221; qui est capable de tout piloter et \u00e9viter d&#8217;avoir une rom atmos standalone, avec toutes les contraintes associ\u00e9es.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"un-mode-rom-atmos-normale\">Un mode rom Atmos &#8220;normale&#8221;<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Quand on lance en ligne de commande, la commande <strong>basic11<\/strong> sans argument, le code va lancer la banque 6 qui contient une rom &#8220;normale&#8221; atmos modifi\u00e9e pour avoir des hooks de la lecture cassette soit sur cl\u00e9 usb ou soit sur sdcard. Ce mode a aussi des hooks par d\u00e9faut de joysticks qui va en fonction des directions appuy\u00e9es va donner \u00e0 la ROM des informations sur ce qui a \u00e9t\u00e9 appuy\u00e9, et donc le curseur peut ainsi bouger simplement sans aucun code avec les joysticks. Le fonctionnement est identique \u00e0 <strong>basic10<\/strong> (qui lance la rom oric-1)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un hook de lecture K7 va prendre toutes les actions de <strong>cload<\/strong> et <strong>csave<\/strong>, et au lieu d&#8217;aller lire sur le VIA6522, le code va aller lire et \u00e9crire les .tap qui se trouvent dans \/home\/basic11\/ (ou \/home\/basic10 dans le cas de la rom oric-1).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sur oric.org, chaque download a un flag indiquant ce que c&#8217;est. Si c&#8217;est un .tap pour atmos, nous avons les flags &#8216;A&#8217; pour atmos, et &#8216;K&#8217; pour K7. Si le .tap est uniquement Oric-1 alors, nous aurons les flags &#8216;OK&#8217;<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/oric.bqtt.net\/wp-content\/uploads\/wpforo\/default_attachments\/1643468057-money_picture.png\" alt=\"\" class=\"wp-image-5150\"\/><figcaption>La d\u00e9finition du flag pour le download du support<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"mode-rom-atmos-jeu\">Mode ROM atmos &#8220;jeu&#8221;<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La ROM jeu n&#8217;est pas v\u00e9ritablement accessible en ligne de commande. Elle peut \u00eatre charg\u00e9e dans une banque en RAM ou en ROM par exemple avec orixcfg (outil qui permet de programmer les banques eeprom ou ram), mais elle est surtout lanc\u00e9e <strong>\u00e0 la vol\u00e9e<\/strong> de deux mani\u00e8res (c&#8217;est \u00e0 dire que les 16KB de la ROM sont charg\u00e9s en $C000 \u00e0 $FFFF: <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">lancement avec un argument de .tap : <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/#basic11 \"MYTAPE<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Quand un param\u00e8tre avec un .tap est fourni (sans l&#8217;extension), la commande basic11 va trouver sur le device un fichier dans \/var\/cache\/basic11\/[lettre]\/MYTAPE.db. C&#8217;est le fichier &#8220;db&#8221; unitaire au soft qui est g\u00e9n\u00e9r\u00e9 dynamiquement avec www.oric.org puis ins\u00e9r\u00e9 dans l&#8217;archive software.tgz par une moulinette quotidienne.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si ce fichier existe, celui ci va \u00eatre charg\u00e9 et va charger un mapping joystick configur\u00e9 s&#8217;il est pr\u00e9sent : c&#8217;est \u00e0 dire que si &#8220;MYTAPE&#8221;, qui est un jeu, qui utilise aussi la touche A pour aller \u00e0 gauche, ce mapping va dire \u00e0 la ROM que la gauche sur le joystick, c&#8217;est A qui est press\u00e9.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ce fichier MYTAPE.db contient aussi l&#8217;information de la ROM basic \u00e0 lancer. Le cas le plus fr\u00e9quent est la ROM jeu car elle est plus &#8220;compatible&#8221; que la ROM normale. A partir du moment o\u00f9 un fichier .db est trouv\u00e9, basic11 consid\u00e8re que le .tap est connu (et donc issu d&#8217;oric.org). Il va donc aller chercher le .tap dans<em> \/usr\/share\/[Lettre]\/MYTAPE.tap<\/em>. Ce path est g\u00e9n\u00e9r\u00e9 \u00e0 la vol\u00e9e par basic11 pour le fournir \u00e0 la ROM jeu : La rom jeu est charg\u00e9e dans une banque RAM, et \u00e0 un offset particulier, le path est \u00e9crit pour que le cload (ou le mode auto de la ROM) d\u00e9marre le bon .tap du bon path : La rom atmos a bien le path <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Et si le fichier MYTAPE.db n&#8217;est pas trouv\u00e9 ? Dans ce cas, basic11 va d\u00e9marrer la rom normale basic, et charger MYTAPE.tap qui se trouve dans <strong>\/home\/basic11\/<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"rom-hobbit\">Rom &#8220;hobbit&#8221;<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;objectif du fonctionnement de l&#8217;atmos sur la carte n&#8217;est pas de modifier les .tap pour qu&#8217;ils fonctionnent sur le device concern\u00e9. L&#8217;id\u00e9e est de pr\u00e9senter au .tap une ROM pour laquelle les \u00e9ventuels appels \u00e0 certains vecteurs en ROM de ce programme n&#8217;\u00e9chouent pas. En effet, pour remplacer la lecture\/\u00e9criture sur sdcard et cl\u00e9 USB, il a fallu faire des concessions, et couper des bouts de codes. Seulement, certains .tap prennent certaines libert\u00e9s sur les vecteurs appel\u00e9s, et peuvent donc appeler un vecteur touch\u00e9 par la modification de lecture sur sdcard. La plupart des cas, cela se r\u00e9soud sur la ROM &#8220;jeu&#8221;. Mais pas tous &#8230;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The Hobbit pose un probl\u00e8me difficilement r\u00e9sorbable. C&#8217;est pourquoi il y a une ROM appel\u00e9e &#8216;The hobbit&#8217; qui peut d\u00e9marrer &#8216;The hobbit&#8217; sans modification. Cette Rom ne sert pas qu&#8217;\u00e0 quelques softs tels &#8216;The hobbit&#8217;, &#8216;fireflash&#8217; d&#8217;autres softs peuvent l&#8217;utiliser.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Quelle est la contrainte majeur de la rom &#8220;The hobbit&#8221; ? La contrainte est qu&#8217;il a fallu mettre le .tap de &#8216;the hobbit&#8217; \u00e0 la racine des devices pour qu&#8217;il soit chargeable car il n&#8217;est pas possible de forger le path dans la ROM atmos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"pourquoi-je-peux-charger-des-tap-de-plus-de-46kb-en-une-seconde\">Pourquoi je peux charger des .tap de plus de 46KB en une seconde ?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Le chargement se fait en 46KB\/sec, cela peut \u00eatre plus long dans les cas des softs qui font du calcul juste apr\u00e8s le d\u00e9marrage. C&#8217;est \u00e0 dire que le contr\u00f4leur usb a charg\u00e9 40 KB en 1 seconde, mais le programme se lance et peut par exemple faire une copie de DATA en RAM pour des routines asm par exemple. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;id\u00e9e aussi est que le contr\u00f4leur USB a des facilit\u00e9s de lecture de FAT32. A la base, c&#8217;est un vrai contr\u00f4leur USB, mais une partie de ses commandes servent \u00e0 taper sur de la FAT32 en hardware. La ROM a du code tr\u00e8s compact pour la lecture des fichiers sur la FAT32 et lit un bloc complet au lieu de lire octet par octet : c&#8217;est pour cette raison que le chargement est tr\u00e8s rapide. Il n&#8217;est donc pas rare de charger les 16KB de la rom atmos, la copier ensuite en $C000 , et charger 48KB de jeu\/d\u00e9mo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"comment-est-fait-le-mapping-des-joysticks\">Comment est fait le mapping des joysticks ?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ce mapping est issu d&#8217;oric.org. Chaque fiche jeu dans la partie admin d&#8217;oric.org contient des champs pour demander quel est le code ascii qu&#8217;il faut presser pour aller sur la droite, la gauche etc.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si les joysticks ne fonctionnent pas, les raisons les plus communes sont : <\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Le jeu n&#8217;appelle par la ROM pour sa gestion clavier<\/li><li>Le mapping du joystick n&#8217;est pas fait sur oric.org<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Donc, une modification sur oric.org influe directement le comportement du jeu sur la twilighte board.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/oric.bqtt.net\/wp-content\/uploads\/wpforo\/default_attachments\/1643288379-mapping.png\" alt=\"\" class=\"wp-image-5141\"\/><figcaption>Le mapping de joystick sur www.oric.org<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"pourquoi-est-il-possible-de-demarrer-des-softs-demos-osid-etc-qui-ne-peuvent-fonctionner-qu-avec-un-microdisc-alors-que-le-microdisc-n-est-pas-connecte\">Pourquoi est il possible de d\u00e9marrer des softs (d\u00e9mos, osid etc) qui ne peuvent fonctionner qu&#8217;avec un microdisc, alors que le microdisc n&#8217;est pas connect\u00e9 ?<\/h2>\n\n\n\n<figure class=\"wp-block-image alignleft size-full\"><img decoding=\"async\" src=\"https:\/\/oric.bqtt.net\/wp-content\/uploads\/2021\/12\/ripped_1.png\" alt=\"\" class=\"wp-image-5092\"\/><figcaption>Ripped d\u00e9marrant sur la twilighte board<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Certaines d\u00e9mos ont besoin de prendre les 16KB de la RAM overlay, mais ne font pas d&#8217;acc\u00e8s disque. Le firmware 2 de la Twilighte board d\u00e9finit un miroir du registre $314. Quand un code appelle donc le registre $314 pour passer en RAM overlay, le registre $314 miroir cot\u00e9 Twilighte board, va basculer sur sa RAM interne en banque 0 pour permettre le code de s\u2019ex\u00e9cuter en RAM. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">C&#8217;est pourquoi les d\u00e9mos &#8220;ripped&#8221;, et les fichiers OSID d\u00e9marrent avec la ROM basic11 : une petite routine va se charger en page 4 \u00e0 la vol\u00e9e au d\u00e9marrage de basic11 : les quelques octets de swap en ram overlay, et les codes de musiques osid ou &#8216;ripped&#8217; appellent ce vecteur en standard, pour d\u00e9marrer sans probl\u00e8mes !<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"comment-les-fichiers-db-sont-generes\">Comment les fichiers .db sont g\u00e9n\u00e9r\u00e9s ?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Une moulinette quotidienne est lanc\u00e9e : une pipeline github va interroger oric.org, et g\u00e9n\u00e9rer tous les fichiers.db et tous les fichiers.tap disponibles, pour les rendre \u00e0 disposition.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"j-ai-bien-compris-le-fonctionnement-mais-comment-fait-on-pour-simplifier-le-chargement-des-tap-dispos-sur-oric-org\">J&#8217;ai bien compris le fonctionnement, mais comment fait on pour simplifier le chargement des .tap dispos sur oric.org ?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En tapant le menu &#8220;basic11 -g&#8221;, un menu va d\u00e9marrer. Cela affiche tous les softs atmos disponibles issus d&#8217;oric.org, et en s\u00e9lectionnant l&#8217;un d&#8217;entre eux, tout va \u00eatre charg\u00e9 automatiquement : la bonne ROM, le bon mapping joysticks etc<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"dans-quels-cas-les-tap-ne-se-lancent-pas\">Dans quels cas, les .tap ne se lancent pas ?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Il y a eu un important travail \u00e0 la fois dans la ROM mais aussi dans oric.org,  pour r\u00e9gler beaucoup de probl\u00e8mes, n\u00e9anmoins certains jeux n&#8217;ont pas \u00e9t\u00e9 trait\u00e9s. Il est techniquement possible de d\u00e9marrer tous les .tap, mais il faut pour chaque cas r\u00e9calcitrant trouver le facteur commun pour releaser une ROM compatible.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Le fichier .tap n&#8217;est pas en autoexec  : cela arrive sur certains .tap sur oric.org<\/li><li>Le multipart fonctionne mais pas sur tous les cas de figure (certains fonctionnent n\u00e9anmoins)<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"que-faut-il-faire-pour-ajouter-plus-de-mapping-joysticks-sur-les-jeux-qui-ne-fonctionnent-pas-avec-les-joysticks\">Que faut il faire pour ajouter plus de mapping joysticks sur les jeux qui ne fonctionnent pas avec les joysticks ?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Il faut des volontaires qui vont aller sur le jeu :), noter les touches clavier pour les directions, pour les reporter sur la fiche jeu d&#8217;oric.org. Par d\u00e9faut, certaines touches sont configur\u00e9es : la fl\u00e8che du haut pour haut, la fl\u00e8che du bas pour bas, mais beaucoup de jeux n&#8217;utilisent pas ces fl\u00e8ches.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"est-ce-techniquement-possible-de-demarrer-tous-les-tap-sur-oric-org-sans-changer-le-hardware\">Est ce techniquement possible de d\u00e9marrer tous les .tap sur oric.org sans changer le hardware ?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Oui, c&#8217;est possible. La condition \u00e9tant de trouver un compromis pour \u00e9viter de sortir une ROM par jeu. Et donc, si une nouvelle ROM permet de corriger 10 jeux, celle ci serait d\u00e9clar\u00e9e sur oric.org, et les fichiers .db y feraient r\u00e9f\u00e9rence aussi.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"j-ai-bien-compris-que-basic11-etait-capable-de-lire-sur-sdcard-ou-usbdrive-automatiquement-mais-comment-fait-il\">J&#8217;ai bien compris que basic11 \u00e9tait capable de lire sur sdcard ou usbdrive automatiquement, mais comment fait il ?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Orix sait quel est son device par d\u00e9faut. Si le kernel est build\u00e9 pour avoir la sdcard en device par d\u00e9faut, l&#8217;appel de basic11 sera sur sdcard, car basic11 donnera l&#8217;info \u00e0 la rom atmos que le device par d\u00e9faut est la sdcard. Si la commande &#8220;twil -u&#8221; est lanc\u00e9e, alors le kernel a connaissance que le device par d\u00e9faut est la cl\u00e9 USB, et donc passera l&#8217;information \u00e0 basic11 qui passera l&#8217;info \u00e0 la ROM basic.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"mais-au-final-qu-est-ce-qui-est-preferable-de-lancer\">Mais au final qu&#8217;est ce qui est pr\u00e9f\u00e9rable de lancer ? <\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Si c&#8217;est pour jouer aux jeux Oric, ou tester des softs, il suffit de lance &#8220;basic11 -g&#8221; ou &#8220;funct + G&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si c&#8217;est pour programmer, faire des tests de code, il suffit de taper &#8220;basic11&#8221;  ou &#8220;funct + B&#8221; : toutes les sauvegardes seront dans le r\u00e9pertoire \/home\/basic11.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Enfin, si le but est de d\u00e9marrer tout ce qu&#8217;on veut sans trop se poser de question, il faut d\u00e9marrer le <strong>loader <\/strong>avec &#8220;funct + L&#8221;<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/oric.bqtt.net\/wp-content\/uploads\/wpforo\/default_attachments\/1640648657-20211227_233608.jpg\" alt=\"\" class=\"wp-image-5096\"\/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Comment la rom basic sur la Twilighte board permet de d\u00e9marrer beaucoup de soft atmos, mapper sans aucune configuration les joysticks et d\u00e9marrer des softs qui sont cens\u00e9s d\u00e9marrer uniquement avec un microdisc ? C&#8217;est ce que nous allons voir dans cet article. D\u00e9finitions Une banque est un emplacement m\u00e9moire en EEPROM ou en RAM [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":5092,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[340,22,302],"tags":[],"class_list":["post-5070","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-340","category-ceomag","category-hardware"],"_links":{"self":[{"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/posts\/5070","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/comments?post=5070"}],"version-history":[{"count":0,"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/posts\/5070\/revisions"}],"wp:attachment":[{"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/media?parent=5070"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/categories?post=5070"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/tags?post=5070"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}