diff --git a/html/subx/011direct_addressing.cc.html b/html/subx/011direct_addressing.cc.html
index ba7a1e3b..7c348d47 100644
--- a/html/subx/011direct_addressing.cc.html
+++ b/html/subx/011direct_addressing.cc.html
@@ -287,59 +287,65 @@ if ('onhashchange' in window) {
222 % Reg[EBX].i = 0x0000000a;
223
224 53
-225 +run: push reg 3
-226 +run: pushing value 0x0000000a
-227 +run: ESP is now 0x00000060
-228 +run: contents at ESP: 0x0000000a
-229
-230 :(before "End Single-Byte Opcodes")
-231 case 0x50:
-232 case 0x51:
-233 case 0x52:
-234 case 0x53:
-235 case 0x54:
-236 case 0x55:
-237 case 0x56:
-238 case 0x57: {
-239 uint8_t reg = op & 0x7;
-240 trace(2, "run") << "push reg " << NUM(reg) << end();
-241 const int32_t val = Reg[reg].u;
-242 trace(2, "run") << "pushing value 0x" << HEXWORD << val << end();
-243 Reg[ESP].u -= 4;
-244 *reinterpret_cast<uint32_t*>(&Mem.at(Reg[ESP].u)) = val;
-245 trace(2, "run") << "ESP is now 0x" << HEXWORD << Reg[ESP].u << end();
-246 trace(2, "run") << "contents at ESP: 0x" << HEXWORD << *reinterpret_cast<uint32_t*>(&Mem.at(Reg[ESP].u)) << end();
-247 break;
-248 }
-249
-250
-251
-252 :(scenario pop_r32)
-253 % Reg[ESP].u = 0x60;
-254 % SET_WORD_IN_MEM(0x60, 0x0000000a);
-255
-256 5b
-257 +run: pop into reg 3
-258 +run: popping value 0x0000000a
-259 +run: ESP is now 0x00000064
-260
-261 :(before "End Single-Byte Opcodes")
-262 case 0x58:
-263 case 0x59:
-264 case 0x5a:
-265 case 0x5b:
-266 case 0x5c:
-267 case 0x5d:
-268 case 0x5e:
-269 case 0x5f: {
-270 uint8_t reg = op & 0x7;
-271 trace(2, "run") << "pop into reg " << NUM(reg) << end();
-272 Reg[reg].u = *reinterpret_cast<uint32_t*>(&Mem.at(Reg[ESP].u));
-273 trace(2, "run") << "popping value 0x" << HEXWORD << Reg[reg].u << end();
-274 Reg[ESP].u += 4;
-275 trace(2, "run") << "ESP is now 0x" << HEXWORD << Reg[ESP].u << end();
-276 break;
-277 }
+225 +run: push reg 3
+226 +run: decrementing ESP to 0x00000060
+227 +run: pushing value 0x0000000a
+228
+229 :(before "End Single-Byte Opcodes")
+230 case 0x50:
+231 case 0x51:
+232 case 0x52:
+233 case 0x53:
+234 case 0x54:
+235 case 0x55:
+236 case 0x56:
+237 case 0x57: {
+238 uint8_t reg = op & 0x7;
+239 trace(2, "run") << "push reg " << NUM(reg) << end();
+240 push(Reg[reg].u);
+241 break;
+242 }
+243 :(code)
+244 void push(uint32_t val) {
+245 Reg[ESP].u -= 4;
+246 trace(2, "run") << "decrementing ESP to 0x" << HEXWORD << Reg[ESP].u << end();
+247 trace(2, "run") << "pushing value 0x" << HEXWORD << val << end();
+248 *reinterpret_cast<uint32_t*>(&Mem.at(Reg[ESP].u)) = val;
+249 }
+250
+251
+252
+253 :(scenario pop_r32)
+254 % Reg[ESP].u = 0x60;
+255 % SET_WORD_IN_MEM(0x60, 0x0000000a);
+256
+257 5b
+258 +run: pop into reg 3
+259 +run: popping value 0x0000000a
+260 +run: incrementing ESP to 0x00000064
+261
+262 :(before "End Single-Byte Opcodes")
+263 case 0x58:
+264 case 0x59:
+265 case 0x5a:
+266 case 0x5b:
+267 case 0x5c:
+268 case 0x5d:
+269 case 0x5e:
+270 case 0x5f: {
+271 uint8_t reg = op & 0x7;
+272 trace(2, "run") << "pop into reg " << NUM(reg) << end();
+273 Reg[reg].u = pop();
+274 break;
+275 }
+276 :(code)
+277 uint32_t pop() {
+278 uint32_t result = *reinterpret_cast<uint32_t*>(&Mem.at(Reg[ESP].u));
+279 trace(2, "run") << "popping value 0x" << HEXWORD << result << end();
+280 Reg[ESP].u += 4;
+281 trace(2, "run") << "incrementing ESP to 0x" << HEXWORD << Reg[ESP].u << end();
+282 return result;
+283 }