{"id":558,"date":"2026-06-26T20:53:35","date_gmt":"2026-06-26T20:53:35","guid":{"rendered":"https:\/\/www.r3tr0.net\/?p=558"},"modified":"2026-06-26T20:53:35","modified_gmt":"2026-06-26T20:53:35","slug":"wondermca-gone-before-we-looked-the-model-57s-early-cd-setup-and-the-pos-register-that-never-answered","status":"publish","type":"post","link":"https:\/\/www.r3tr0.net\/index.php\/2026\/06\/26\/wondermca-gone-before-we-looked-the-model-57s-early-cd-setup-and-the-pos-register-that-never-answered\/","title":{"rendered":"WonderMCA: Gone before we looked, the Model 57&#8217;s early \/CD-SETUP and the POS register that never answered"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">The card that vanished from setup<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">WonderMCA had been enumerating cleanly across the PS\/2 matrix for weeks. POST passed, the option ROM checksummed, the adapter ID showed up in the reference-diskette setup. Then I sat down at the IBM PS\/2&nbsp;<strong>Model 57<\/strong>&nbsp;\u2014 the 8557, a 386SX desktop \u2014 booted it, and the card was simply&nbsp;<strong>not there<\/strong>. No adapter, no slot, nothing. POST didn&#8217;t even complain; from the chassis&#8217;s point of view there was no WonderMCA in the bus at all.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That&#8217;s a particular kind of frustrating. A crash gives you a code. A&nbsp;<em>disappearance<\/em>&nbsp;gives you nothing. The card was clearly alive \u2014 the screenpad lit up, Core 0 was running, the UART banner printed \u2014 but the one thing it had to do during the first second of POST,&nbsp;<strong>answer the POS scan<\/strong>, it wasn&#8217;t doing.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What the card is supposed to do<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A quick refresher on Micro Channel&#8217;s Programmable Option Select. When a PS\/2 powers on, the planar walks the slots one at a time. For each slot it asserts that slot&#8217;s dedicated&nbsp;<strong>\/CD SETUP<\/strong>&nbsp;line and reads the eight POS bytes at I\/O&nbsp;<code class=\"\" data-line=\"\">0x100<\/code>\u2013<code class=\"\" data-line=\"\">0x107<\/code>. Adapter ID, enable bit, ROM base \u2014 all of it comes back over those eight reads, but&nbsp;<em>only<\/em>&nbsp;while \/CD SETUP is asserted to that slot. Outside setup,&nbsp;<code class=\"\" data-line=\"\">0x100<\/code>\u2013<code class=\"\" data-line=\"\">0x107<\/code>&nbsp;belongs to nobody and reads back as float.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So WonderMCA&#8217;s job is dead simple in principle: when the chassis reads&nbsp;<code class=\"\" data-line=\"\">0x100<\/code>\u2013<code class=\"\" data-line=\"\">0x107<\/code>&nbsp;<strong>and our \/CD SETUP is asserted<\/strong>, put the right POS byte on the data bus. Miss that, and the chassis decides the slot is empty.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On WonderMCA the bus is handled entirely by Core 1 of the RP2350B, running a tight hand-written loop out of SCRATCH_X. \/CD SETUP arrives on&nbsp;<strong>GPIO 45<\/strong>, buffered (and inverted) by a U8 SN74LVC240, so at the pin it reads&nbsp;<strong>active HIGH<\/strong>&nbsp;= asserted. The POS gate was, on the face of it, trivial:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\" data-line=\"\">if (io_device == DEV_MCA_POS) {\n    if (gpio_get(PIN_CD_SETUP))            &lt;em&gt;\/\/ asserted?&lt;\/em&gt;\n        dev_mca_pos_ior(addr_lo, &amp;MCA_Data);\n    else\n        MCA_Read = 0;                      &lt;em&gt;\/\/ not our setup cycle&lt;\/em&gt;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Read the pin. If high, answer. What could go wrong?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The first wrong turn: blame the UART<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The very first thing I noticed looked damning. On WonderMCA, GPIO 45 does double duty: it&#8217;s&nbsp;<code class=\"\" data-line=\"\">PIN_CD_SETUP<\/code>, but the build also had it declared as&nbsp;<code class=\"\" data-line=\"\">PICO_DEFAULT_UART_RX_PIN=45<\/code>. The SDK&#8217;s&nbsp;<code class=\"\" data-line=\"\">stdio_uart<\/code>&nbsp;<em>requires<\/em>&nbsp;a real UART-RX-capable pin, and there&#8217;s no spare GPIO on this board, so the console RX had been parked on the CD-SETUP pin.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That smelled like the whole bug.&nbsp;<code class=\"\" data-line=\"\">stdio_init_all()<\/code>&nbsp;configures the default UART pins \u2014 if it grabbed GPIO 45 as UART RX,&nbsp;<code class=\"\" data-line=\"\">gpio_get()<\/code>&nbsp;on the POS gate would be reading a pin owned by the wrong peripheral. And worse,&nbsp;<code class=\"\" data-line=\"\">stdio_init_all()<\/code>&nbsp;was being called&nbsp;<em>three times<\/em>, one of them&nbsp;<strong>after<\/strong>&nbsp;<code class=\"\" data-line=\"\">multicore_launch_core1()<\/code>&nbsp;\u2014 i.e. after Core 1 had already reclaimed GPIO 45 as a plain input.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I fixed all that, and it needed fixing: stdio now initialises exactly&nbsp;<strong>once, before the launch<\/strong>, Core 1 reclaims GPIO 45 as SIO with a pull-down, and the redundant post-launch&nbsp;<code class=\"\" data-line=\"\">stdio_init_all()<\/code>&nbsp;is skipped on WonderMCA. I even left a rule in&nbsp;<code class=\"\" data-line=\"\">CMakeLists.txt<\/code>: never add a post-launch&nbsp;<code class=\"\" data-line=\"\">stdio_init_all()<\/code>&nbsp;on this board.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And the card still wasn&#8217;t detected.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That&#8217;s the part worth dwelling on, because it&#8217;s a trap I fall into constantly: the first plausible cause that&nbsp;<em>is genuinely wrong<\/em>&nbsp;and&nbsp;<em>does<\/em>&nbsp;deserve a fix is not necessarily&nbsp;<em>the<\/em>&nbsp;cause. The UART collision was real. It just wasn&#8217;t why the Model 57 couldn&#8217;t see the card.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Instrumenting the gate<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When a theory dies, stop guessing and count things. I added three counters to the POS path and a rate-limited heartbeat from Core 0:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">pos_ior_count<\/code>\u00a0\u2014 POS reads we actually\u00a0<strong>served<\/strong><\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">pos_iow_count<\/code>\u00a0\u2014 POS writes served<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">pos_cd_low_count<\/code>\u00a0\u2014\u00a0<code class=\"\" data-line=\"\">0x100<\/code>\u2013<code class=\"\" data-line=\"\">0x107<\/code>\u00a0cycles that\u00a0<strong>reached Core 1<\/strong>\u00a0but were gated off because the CD-SETUP read came back LOW<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The whole point was to split three failure modes that look identical from the outside:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">ior &gt; 0<\/code>\u00a0\u2192 POST is reading our POS regs, gate open, we&#8217;re fine.<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">cd_low &gt; 0<\/code>\u00a0with\u00a0<code class=\"\" data-line=\"\">ior = 0<\/code>\u00a0\u2192 cycles reach us, but the gate is shut.<\/li>\n\n\n\n<li>all zero \u2192 the cycle never even arrives \u2014 a decode\/CPLD problem, not the gate.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">I flashed it, booted the Model 57, and watched the serial console:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\" data-line=\"\">&#091;mca_pos] ior=1 iow=0 cd_low=345 cd_setup=0\n&#091;mca_pos] ior=1 iow=0 cd_low=365 cd_setup=0\n&#091;mca_pos] ior=1 iow=0 cd_low=380 cd_setup=0\n&#091;mca_pos] ior=1 iow=0 cd_low=407 cd_setup=0\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">There it was, in three numbers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The cycles&nbsp;<strong>were arriving<\/strong>&nbsp;\u2014&nbsp;<code class=\"\" data-line=\"\">cd_low<\/code>&nbsp;climbing into the hundreds means the chassis was hammering&nbsp;<code class=\"\" data-line=\"\">0x100<\/code>\u2013<code class=\"\" data-line=\"\">0x107<\/code>&nbsp;and the address decode was routing every one of them to our POS handler. So the decode was fine. But&nbsp;<code class=\"\" data-line=\"\">gpio_get(PIN_CD_SETUP)<\/code>&nbsp;read&nbsp;<strong>LOW on every single one<\/strong>. We served exactly&nbsp;<strong>one<\/strong>&nbsp;POS read, ever (<code class=\"\" data-line=\"\">ior=1<\/code>, almost certainly a fluke), and rejected the other 345+.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The gate was slamming the door on every POS read the Model 57 sent us.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">&#8220;It&#8217;s inverted&#8221; \u2014 and then the real timing<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">My first reaction was polarity. If the buffer wasn&#8217;t inverting the way I thought, asserted would read LOW and the gate would be backwards. I nearly flipped it. But the comments, the pull-down, and a quick check all said the same thing: U8&nbsp;<em>does<\/em>&nbsp;invert, asserted&nbsp;<em>is<\/em>&nbsp;HIGH at GPIO 45, and the gate sense was correct.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So I put the logic analyzer on the actual \/CD SETUP line and the GPIO, and that&#8217;s when the Model 57 showed its hand:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>On the Model 57, \/CD SETUP asserts&nbsp;<em>very<\/em>&nbsp;early \u2014 before \/ADL \u2014 and deasserts in the&nbsp;<em>middle<\/em>&nbsp;of \/CMD.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"284\" src=\"https:\/\/www.r3tr0.net\/wp-content\/uploads\/2026\/06\/Screen-Shot-2026-06-26-at-22.51.55-1024x284.png\" alt=\"\" class=\"wp-image-559\" srcset=\"https:\/\/www.r3tr0.net\/wp-content\/uploads\/2026\/06\/Screen-Shot-2026-06-26-at-22.51.55-1024x284.png 1024w, https:\/\/www.r3tr0.net\/wp-content\/uploads\/2026\/06\/Screen-Shot-2026-06-26-at-22.51.55-300x83.png 300w, https:\/\/www.r3tr0.net\/wp-content\/uploads\/2026\/06\/Screen-Shot-2026-06-26-at-22.51.55-768x213.png 768w, https:\/\/www.r3tr0.net\/wp-content\/uploads\/2026\/06\/Screen-Shot-2026-06-26-at-22.51.55-1536x426.png 1536w, https:\/\/www.r3tr0.net\/wp-content\/uploads\/2026\/06\/Screen-Shot-2026-06-26-at-22.51.55-600x166.png 600w, https:\/\/www.r3tr0.net\/wp-content\/uploads\/2026\/06\/Screen-Shot-2026-06-26-at-22.51.55.png 1754w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Read that again, because it&#8217;s the whole bug. \/CD SETUP is not held for the duration of the command phase on this chassis. It goes active before the address strobe and is&nbsp;<strong>already gone halfway through the command<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now look at&nbsp;<em>when<\/em>&nbsp;our gate read it. The Core 1 loop polls for \/ADL, latches the address the instant \/ADL fires (call that T=0), then runs through a FIFO wait, the&nbsp;<code class=\"\" data-line=\"\">IO_Index_T<\/code>&nbsp;lookup, the A_AB mux restore, and finally branches into the C-level IOR handler \u2014 where&nbsp;<code class=\"\" data-line=\"\">gpio_get(PIN_CD_SETUP)<\/code>&nbsp;lived. That read happens somewhere around&nbsp;<strong>T+20 cycles and beyond<\/strong>, deep into \/CMD.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On a well-behaved chassis that holds \/CD SETUP flat across the whole cycle, reading it at T+20 is fine. On the Model 57, by T+20&nbsp;<strong>it had already deasserted.<\/strong>&nbsp;We were reading the pin a clean ~70 ns&nbsp;<em>after<\/em>&nbsp;the signal we cared about had vanished. The card wasn&#8217;t broken, the gate wasn&#8217;t backwards, the polarity was right. We were just&nbsp;<strong>looking too late.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The fix: catch it on the way past<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The address is already captured early \u2014 the ASM grabs it right at \/ADL. The answer was to grab \/CD SETUP at the&nbsp;<em>same<\/em>&nbsp;moment, while it&#8217;s still asserted, instead of re-reading the live pin 70 ns later.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">GPIO 45 sits in the RP2350&#8217;s high GPIO bank (32\u201347), which you read in one shot with&nbsp;<code class=\"\" data-line=\"\">mrc p0, #0, Rd, c0, c9<\/code>. GPIO 45 is&nbsp;<strong>bit 13<\/strong>&nbsp;of that word. So right in the I\/O dispatch path, at roughly&nbsp;<strong>T+8<\/strong>&nbsp;\u2014 early in \/CMD, while \/CD SETUP is still solidly asserted \u2014 I take a single high-bank snapshot and carry it out of the ASM:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\" data-line=\"\">&quot;5:&quot;\n&quot;   mrc  p0, #0, r0,      c0, c8   &quot;   \/\/ address (low bank)      T+7\n&quot;   mrc  p0, #0, %&#091;iohi], c0, c9   &quot;   \/\/ RAW high-bank snapshot   T+8  &lt;-- \/CD SETUP still asserted\n&quot;   ubfx r0, r0, #DBASE, #12       &quot;   \/\/ addr_lo\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The C handler then just decodes the bit out of the frozen snapshot instead of touching the pin:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\" data-line=\"\">bool io_cd_setup = (io_hi &gt;&gt; (PIN_CD_SETUP - 32)) &amp; 1u;  &lt;em&gt;\/\/ latched at T+8, not re-read mid-\/CMD&lt;\/em&gt;\nif (io_device == DEV_MCA_POS &amp;&amp; io_cd_setup)\n    dev_mca_pos_ior(addr_lo, &amp;MCA_Data);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">It&#8217;s a couple of instructions on the I\/O path \u2014 which is CHRDY-extended, so there&#8217;s budget to spare \u2014 and it changes nothing about the address or data timing. It just samples the signal&nbsp;<em>when it&#8217;s there<\/em>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Confirmation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Same console, next boot:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\" data-line=\"\">&#091;mca_pos] ior=28 iow=9  cd_low=520 cd_setup=0\n&#091;mca_pos] ior=34 iow=11 cd_low=566 cd_setup=0\n&#091;mca_pos] ior=42 iow=38 cd_low=600 cd_setup=0\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code class=\"\" data-line=\"\">ior<\/code>&nbsp;climbing in steps as the chassis walks our eight POS bytes \u2014 and&nbsp;<code class=\"\" data-line=\"\">iow<\/code>&nbsp;climbing too, which is even better: that&#8217;s the BIOS not just&nbsp;<em>reading<\/em>&nbsp;our adapter ID but&nbsp;<strong>writing<\/strong>&nbsp;the POS option bytes, enabling the card and programming its ROM base. The Model 57 saw WonderMCA in the slot, configured it, and moved on. (<code class=\"\" data-line=\"\">cd_low<\/code>&nbsp;keeps rising because it counts every&nbsp;<code class=\"\" data-line=\"\">0x100<\/code>&nbsp;cycle for the&nbsp;<em>other<\/em>&nbsp;slots, where our \/CD SETUP is correctly deasserted \u2014 that&#8217;s expected, not an error. And&nbsp;<code class=\"\" data-line=\"\">cd_setup=0<\/code>&nbsp;in the print is just the Core 0 heartbeat sampling the pin asynchronously, nowhere near our brief selection window \u2014 the&nbsp;<code class=\"\" data-line=\"\">ior<\/code>\/<code class=\"\" data-line=\"\">iow<\/code>&nbsp;counters are the real measure.)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Card detected.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The same trap, two more signals<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Once you&#8217;ve been bitten by &#8220;the signal was gone before the C code looked,&#8221; you start seeing it everywhere \u2014 and rightly so. Two more bus qualifiers live in that exact same high-bank snapshot, and both had the same latent risk:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\/TC<\/strong>\u00a0(terminal count, end-of-DMA) on\u00a0<strong>GPIO 39<\/strong>\u00a0= bit 7. On the scope it asserts\u00a0<strong>+10 ns after \/ADL<\/strong>\u00a0\u2014 so our T+8-ish snapshot catches it cleanly, while the old\u00a0<code class=\"\" data-line=\"\">gpio_get(PIN_R_TC)<\/code>\u00a0deep in the DMA consume path was reading it ~90 ns later, right at its deassert edge. That late read was almost certainly part of why the real \/TC EOT had always been flaky enough that we&#8217;d fallen back to a byte-count.<\/li>\n\n\n\n<li><strong>DMA grant<\/strong>\u00a0on\u00a0<strong>GPIO 38<\/strong>\u00a0= bit 6. Grant can drop\u00a0<em>as the transfer ends<\/em>, so a late read risks missing the capture on exactly the\u00a0<strong>last (\/TC) byte<\/strong>\u00a0\u2014 the one that matters most.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Both now come from the same&nbsp;<code class=\"\" data-line=\"\">mrc \u2026 c9<\/code>&nbsp;word, sampled the instant they&#8217;re valid. One register read, three signals, all frozen at the moment the cycle begins instead of whenever the C handler happens to get around to them.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What I took away<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>A signal you can read is not a signal that&#8217;s still there.<\/strong>\u00a0On a bus,\u00a0<em>when<\/em>\u00a0you sample is as much a part of correctness as\u00a0<em>what<\/em>\u00a0you sample. The Model 57 holds \/CD SETUP for a narrower window than the chassis I&#8217;d been developing against, and 70 ns of handler latency was the whole difference between a card and an empty slot.<\/li>\n\n\n\n<li><strong>Latch at the edge, decode at leisure.<\/strong>\u00a0The address was already captured early; the qualifiers should have been too. Grabbing one high-bank GPIO word the moment \/ADL fires, and pulling the bits out in C later, costs almost nothing and removes an entire class of &#8220;deasserted-before-we-looked&#8221; bugs.<\/li>\n\n\n\n<li><strong>A necessary fix is not always the fix.<\/strong>\u00a0The UART-on-GPIO-45 collision was real and got cleaned up \u2014 but it wasn&#8217;t the reason. Counting beats guessing: three counters turned an invisible disappearance into &#8220;the cycle arrives, the pin reads low, every time,&#8221; and that sentence wrote the fix.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Different MCA chassis assert the same signals with surprisingly different timing, all of it legal under the IBM spec. WonderMCA now samples the bus qualifiers when they&#8217;re guaranteed valid, not when it&#8217;s convenient \u2014 and the Model 57, at last, knows the card is there.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The card that vanished from setup WonderMCA had been enumerating cleanly across the PS\/2 matrix for weeks. POST passed, the option ROM checksummed, the adapter ID showed up in the reference-diskette setup. Then I sat down at the IBM PS\/2&nbsp;Model 57&nbsp;\u2014 the 8557, a 386SX desktop \u2014 booted it, and the card was simply&nbsp;not there. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[20],"tags":[],"class_list":["post-558","post","type-post","status-publish","format-standard","hentry","category-ibm-ps-2"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.r3tr0.net\/index.php\/wp-json\/wp\/v2\/posts\/558","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.r3tr0.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.r3tr0.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.r3tr0.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.r3tr0.net\/index.php\/wp-json\/wp\/v2\/comments?post=558"}],"version-history":[{"count":1,"href":"https:\/\/www.r3tr0.net\/index.php\/wp-json\/wp\/v2\/posts\/558\/revisions"}],"predecessor-version":[{"id":560,"href":"https:\/\/www.r3tr0.net\/index.php\/wp-json\/wp\/v2\/posts\/558\/revisions\/560"}],"wp:attachment":[{"href":"https:\/\/www.r3tr0.net\/index.php\/wp-json\/wp\/v2\/media?parent=558"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.r3tr0.net\/index.php\/wp-json\/wp\/v2\/categories?post=558"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.r3tr0.net\/index.php\/wp-json\/wp\/v2\/tags?post=558"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}