Civilization 1 version: 474.05 Dos-Box-X version: 0.83.22
Civilization 1 enters this very time costly loop.
It keeps running/jumping from LOOP SECTION 1 to LOOP SECTION 2 and then from LOOP SECTION 2 to LOOP SECTION 1 and it keeps
doing this over and over and over again.
The registers seem to flip flop between certain values. Perhaps the code is trying to search through something. I suspect it might
be the AI that is trying to find some kind of path. As a young kid back in 199x I also witnessed this costly time loop, it could
maybe take 14 hours before it might exit it on a 80486, it might even never exit, not sure.
Thanks to modern day DosBox-X software it is now possible to easily debug it.
There is a SR command, "set register" that might be used to set/overwrite one of the register so that maybe civilization 1 can break
out of this loop, more easy.
I have copy & pasted both loop sections below, basically the debugger will run through it from the top instruction to the bottom instruction
and then jump to the other loop section, back and forth.
This code is currently running on a toshiba laptop 2.6 GHz but still running for a very long.
This assembly code was produced/acquire from dos-box-x by Skybuck Flying on 22 april 2022 !
Enjoy, and if you spot any point where you think a register can be overwritten for safe exit, let us all know ! =D
// LOOP SECTION 1:
1E1E:000016B9 8B4608 mov ax,[bp+08] ss:[F006]=0057
1E1E:000016BC 3946E0 cmp [bp-20],ax ss:[EFDE]=0075
1E1E:000016BF 7503 jne 000016C4 ($+3) (down)
1E1E:000016C1 E98E00 jmp 00001752 ($+8e) (down)
1E1E:000016C4 B80006 mov ax,0600
1E1E:000016C7 F76E06 imul word [bp+06] ss:[F004]=0004
1E1E:000016CA 8BF0 mov si,ax
1E1E:000016CC B80C00 mov ax,000C
1E1E:000016CF F76EE0 imul word [bp-20] ss:[EFDE]=0075
1E1E:000016D2 03F0 add si,ax
1E1E:000016D4 F684D48108 test byte [si-7E2C],08 ds:[FFFF99D4]=C48
1E1E:000016D9 751D jne 000016F8 ($+1d) (down)
1E1E:000016DB B022 mov al,22
1E1E:000016DD F6ACD781 imul byte [si-7E29] ds:[FFFF9F53]=7500
1E1E:000016E1 8BF8 mov di,ax
1E1E:000016E3 B80100 mov ax,0001
1E1E:000016E6 8A8D4811 mov cl,[di+1148] ds:[12BE]=0001
1E1E:000016EA D3E0 shl ax,cl
1E1E:000016EC 0946E2 or [bp-1E],ax ss:[EFE0]=0007
1E1E:000016EF 83BD381100 cmp word [di+1138],0000 ds:[12AE]=0000
1E1E:000016F4 753C jne 00001732 ($+3c) (down)
1E1E:000016F6 EB37 jmp short 0000172F ($+37) (down)
// LOOP SECTION 2:
1E1E:0000172F FF46AC inc word [bp-54] ss:[EFAA]=29A5
1E1E:00001732 B80C00 mov ax,000C
1E1E:00001735 F76EE0 imul word [bp-20] ss:[EFDE]=0075
1E1E:00001738 8BD8 mov bx,ax
1E1E:0000173A B80006 mov ax,0600
1E1E:0000173D F76E06 imul word [bp+06] ss:[F004]=0004
1E1E:00001740 8BF0 mov si,ax
1E1E:00001742 8A80DE81 mov al,[bx+si-7E22] ds:[FFFF9F8A]=B802
1E1E:00001746 98 cbw
1E1E:00001747 8946E0 mov [bp-20],ax ss:[EFDE]=0075
1E1E:0000174A 3DFFFF cmp ax,FFFF
1E1E:0000174D 7403 je 00001752 ($+3) (no jmp)
1E1E:0000174F E967FF jmp 000016B9 ($-99) (up)
// REGISTER OUTPUT FOR LOOP SECTION 1, WHEN INSTRUCTION POINT ON THE BEGIN OF IT:
----Register Overview-----------------------------------------------------------
EAX=00000004 ESI=00001800 DS=3324 ES=625D FS=0000 GS=0000 SS=3324 Real
EBX=000004D4 EDI=00000000 CS=1E1E EIP=000016B9 C1 Z0 S0 O0 A1 P1 D0 I1 T0
ECX=00000000 EBP=0000EFFE NOPG IOPL3 CPL0
EDX=00000000 ESP=0000EF9C 3082409161
ST0=00000.00 ST1=00000.00 ST2=00000.00 ST3=00000.00
ST4=00000.00 ST5=00000.00 ST6=00000.00 ST7=00000.00
// REGISTER OUTPUT FOR LOOP SECTION 1, WHEN INSTRUCTION POINT ON THE END OF IT:
----Register Overview-----------------------------------------------------------
EAX=00000002 ESI=00001830 DS=3324 ES=625D FS=0000 GS=0000 SS=3324 Real
EBX=000004D4 EDI=00000176 CS=1E1E EIP=000016F6 C0 Z1 S0 O0 A0 P1 D0 I1 T0
ECX=00000001 EBP=0000EFFE NOPG IOPL3 CPL0
EDX=00000000 ESP=0000EF9C 3082409181
ST0=00000.00 ST1=00000.00 ST2=00000.00 ST3=00000.00
ST4=00000.00 ST5=00000.00 ST6=00000.00 ST7=00000.00
// REGISTER OUTPUT FOR LOOP SECTION 2, WHEN INSTRUCTION POINT ON THE BEGIN OF IT:
----Register Overview-----------------------------------------------------------
EAX=00000002 ESI=00001830 DS=3324 ES=625D FS=0000 GS=0000 SS=3324 Real
EBX=000004D4 EDI=00000176 CS=1E1E EIP=0000172F C0 Z1 S0 O0 A0 P1 D0 I1 T0
ECX=00000001 EBP=0000EFFE NOPG IOPL3 CPL0
EDX=00000000 ESP=0000EF9C 3082409182
ST0=00000.00 ST1=00000.00 ST2=00000.00 ST3=00000.00
ST4=00000.00 ST5=00000.00 ST6=00000.00 ST7=00000.00
// REGISTER OUTPUT FOR LOOP SECTION 2, WHEN INSTRUCTION POINT ON THE END OF IT:
----Register Overview-----------------------------------------------------------
EAX=00000075 ESI=00001800 DS=3324 ES=625D FS=0000 GS=0000 SS=3324 Real
EBX=00000030 EDI=00000176 CS=1E1E EIP=0000174F C1 Z0 S0 O0 A1 P0 D0 I1 T0
ECX=00000001 EBP=0000EFFE NOPG IOPL3 CPL0
EDX=00000000 ESP=0000EF9C 3082409194
ST0=00000.00 ST1=00000.00 ST2=00000.00 ST3=00000.00
ST4=00000.00 ST5=00000.00 ST6=00000.00 ST7=00000.00
YOU CAN SEE MY GAME AND MY ATTEMPT TO FIX IT ON THIS YOUTUBE STREAM =D:
Civilization 1 enters this very time costly loop.
It keeps running/jumping from LOOP SECTION 1 to LOOP SECTION 2 and then from LOOP SECTION 2 to LOOP SECTION 1 and it keeps
doing this over and over and over again.
The registers seem to flip flop between certain values. Perhaps the code is trying to search through something. I suspect it might
be the AI that is trying to find some kind of path. As a young kid back in 199x I also witnessed this costly time loop, it could
maybe take 14 hours before it might exit it on a 80486, it might even never exit, not sure.
Thanks to modern day DosBox-X software it is now possible to easily debug it.
There is a SR command, "set register" that might be used to set/overwrite one of the register so that maybe civilization 1 can break
out of this loop, more easy.
I have copy & pasted both loop sections below, basically the debugger will run through it from the top instruction to the bottom instruction
and then jump to the other loop section, back and forth.
This code is currently running on a toshiba laptop 2.6 GHz but still running for a very long.
This assembly code was produced/acquire from dos-box-x by Skybuck Flying on 22 april 2022 !
Enjoy, and if you spot any point where you think a register can be overwritten for safe exit, let us all know ! =D
// LOOP SECTION 1:
1E1E:000016B9 8B4608 mov ax,[bp+08] ss:[F006]=0057
1E1E:000016BC 3946E0 cmp [bp-20],ax ss:[EFDE]=0075
1E1E:000016BF 7503 jne 000016C4 ($+3) (down)
1E1E:000016C1 E98E00 jmp 00001752 ($+8e) (down)
1E1E:000016C4 B80006 mov ax,0600
1E1E:000016C7 F76E06 imul word [bp+06] ss:[F004]=0004
1E1E:000016CA 8BF0 mov si,ax
1E1E:000016CC B80C00 mov ax,000C
1E1E:000016CF F76EE0 imul word [bp-20] ss:[EFDE]=0075
1E1E:000016D2 03F0 add si,ax
1E1E:000016D4 F684D48108 test byte [si-7E2C],08 ds:[FFFF99D4]=C48
1E1E:000016D9 751D jne 000016F8 ($+1d) (down)
1E1E:000016DB B022 mov al,22
1E1E:000016DD F6ACD781 imul byte [si-7E29] ds:[FFFF9F53]=7500
1E1E:000016E1 8BF8 mov di,ax
1E1E:000016E3 B80100 mov ax,0001
1E1E:000016E6 8A8D4811 mov cl,[di+1148] ds:[12BE]=0001
1E1E:000016EA D3E0 shl ax,cl
1E1E:000016EC 0946E2 or [bp-1E],ax ss:[EFE0]=0007
1E1E:000016EF 83BD381100 cmp word [di+1138],0000 ds:[12AE]=0000
1E1E:000016F4 753C jne 00001732 ($+3c) (down)
1E1E:000016F6 EB37 jmp short 0000172F ($+37) (down)
// LOOP SECTION 2:
1E1E:0000172F FF46AC inc word [bp-54] ss:[EFAA]=29A5
1E1E:00001732 B80C00 mov ax,000C
1E1E:00001735 F76EE0 imul word [bp-20] ss:[EFDE]=0075
1E1E:00001738 8BD8 mov bx,ax
1E1E:0000173A B80006 mov ax,0600
1E1E:0000173D F76E06 imul word [bp+06] ss:[F004]=0004
1E1E:00001740 8BF0 mov si,ax
1E1E:00001742 8A80DE81 mov al,[bx+si-7E22] ds:[FFFF9F8A]=B802
1E1E:00001746 98 cbw
1E1E:00001747 8946E0 mov [bp-20],ax ss:[EFDE]=0075
1E1E:0000174A 3DFFFF cmp ax,FFFF
1E1E:0000174D 7403 je 00001752 ($+3) (no jmp)
1E1E:0000174F E967FF jmp 000016B9 ($-99) (up)
// REGISTER OUTPUT FOR LOOP SECTION 1, WHEN INSTRUCTION POINT ON THE BEGIN OF IT:
----Register Overview-----------------------------------------------------------
EAX=00000004 ESI=00001800 DS=3324 ES=625D FS=0000 GS=0000 SS=3324 Real
EBX=000004D4 EDI=00000000 CS=1E1E EIP=000016B9 C1 Z0 S0 O0 A1 P1 D0 I1 T0
ECX=00000000 EBP=0000EFFE NOPG IOPL3 CPL0
EDX=00000000 ESP=0000EF9C 3082409161
ST0=00000.00 ST1=00000.00 ST2=00000.00 ST3=00000.00
ST4=00000.00 ST5=00000.00 ST6=00000.00 ST7=00000.00
// REGISTER OUTPUT FOR LOOP SECTION 1, WHEN INSTRUCTION POINT ON THE END OF IT:
----Register Overview-----------------------------------------------------------
EAX=00000002 ESI=00001830 DS=3324 ES=625D FS=0000 GS=0000 SS=3324 Real
EBX=000004D4 EDI=00000176 CS=1E1E EIP=000016F6 C0 Z1 S0 O0 A0 P1 D0 I1 T0
ECX=00000001 EBP=0000EFFE NOPG IOPL3 CPL0
EDX=00000000 ESP=0000EF9C 3082409181
ST0=00000.00 ST1=00000.00 ST2=00000.00 ST3=00000.00
ST4=00000.00 ST5=00000.00 ST6=00000.00 ST7=00000.00
// REGISTER OUTPUT FOR LOOP SECTION 2, WHEN INSTRUCTION POINT ON THE BEGIN OF IT:
----Register Overview-----------------------------------------------------------
EAX=00000002 ESI=00001830 DS=3324 ES=625D FS=0000 GS=0000 SS=3324 Real
EBX=000004D4 EDI=00000176 CS=1E1E EIP=0000172F C0 Z1 S0 O0 A0 P1 D0 I1 T0
ECX=00000001 EBP=0000EFFE NOPG IOPL3 CPL0
EDX=00000000 ESP=0000EF9C 3082409182
ST0=00000.00 ST1=00000.00 ST2=00000.00 ST3=00000.00
ST4=00000.00 ST5=00000.00 ST6=00000.00 ST7=00000.00
// REGISTER OUTPUT FOR LOOP SECTION 2, WHEN INSTRUCTION POINT ON THE END OF IT:
----Register Overview-----------------------------------------------------------
EAX=00000075 ESI=00001800 DS=3324 ES=625D FS=0000 GS=0000 SS=3324 Real
EBX=00000030 EDI=00000176 CS=1E1E EIP=0000174F C1 Z0 S0 O0 A1 P0 D0 I1 T0
ECX=00000001 EBP=0000EFFE NOPG IOPL3 CPL0
EDX=00000000 ESP=0000EF9C 3082409194
ST0=00000.00 ST1=00000.00 ST2=00000.00 ST3=00000.00
ST4=00000.00 ST5=00000.00 ST6=00000.00 ST7=00000.00
YOU CAN SEE MY GAME AND MY ATTEMPT TO FIX IT ON THIS YOUTUBE STREAM =D:
Last edited: