mlemmert11
Member
- Joined
- Oct 28, 2015
- Messages
- 40
I’m working on a project to generate disk images for Ultima III and donate them to the user community (for backup purposes only) because the current images out there (with the exception of the ProDOS version only playable on a CFFA card) has some bugs that make the game almost unwinnable (i.e. crash upon encountering gremlins). This is the only version Apple II users who don’t own a CFFA card have available right now (i.e. this buggy version is the only one that can be written directly to floppies via ADTPro), at least that I can find and I spent many hours searching and downloading.
I’ve tracked down and purchased an original copy of the game that has a player master that hasn’t been ruined by previous owners playing on it directly (another big problem, but solved). Now the challenge is to create the disk images. From what I’ve read this requires removing the copy protection from the original disk before creating a disk image for backup purposes. I found an article on how to do so in the magazine Softkeys Volume III (ftp://ftp.apple.asimov.net/pub/appl.../hardcore_computist/book.of.softkeys.vol3.pdf)
The article makes use of a piece of software called Super IOB, downloadable from Apple2Online, Asmiov etc., which crashes when following the instructions in the article. When the crash occurs the display jumps to the system monitor and displaying a bunch of hex values.
After several days of hacking on this I narrowed down the problem to a source that was very surprising to me.
Super IOB is written, at least mostly, in Applesoft Basic. The program crashes at line 80 due to a return without gosub statement. Line 80 is accessed via a goto statement in line 520. Upon the error it jumps to the system monitor instead of displaying the usual “return without gosub” error I think because some poke calls modified some memory addresses which create that behavior for some reason (I don’t know much about the mode known as the “system monitor”).
There are about a zillion things I could have done wrong following the instructions of the article, but I know enough basic programming to strongly suspect that it wouldn’t have mattered what I did. A return without gosub is going to crash the program. Yet this is the basic code that exists on the disk image for Super IOB, and it was in a location in the program that it would have affected any software title, not just Ultima III. Additionally, I found a listing of the Super IOB source code in Softkeys Volume II and the same issue exists, which strongly implies to me the code is correct but I can't comprehend how the program can function as written.
I’m writing this post just in case somebody has encountered this problem with Super IOB , knows anybody who might who I can try to contact, or has any ideas in general to help move the project forward?
If there is any additional information that would be helpful, just let me know.
Thanks!
=====UPDATE TO ORIGINAL POST====
I misstated the source of the crash in SuperIOB. It's crashing on line 100, which pokes some addresses based on the value of the variables for track, sector etc. How the program gets to line 100 blows my mind. There are return statements without gosubs statements in this code, which should crash it way before it gets to line 100. But I'm not going to worry about that for now and will try focusing on how the variables in line 100 are set, and their values when the program crashes to try to sheet some light on why the program is crashing.
I’ve tracked down and purchased an original copy of the game that has a player master that hasn’t been ruined by previous owners playing on it directly (another big problem, but solved). Now the challenge is to create the disk images. From what I’ve read this requires removing the copy protection from the original disk before creating a disk image for backup purposes. I found an article on how to do so in the magazine Softkeys Volume III (ftp://ftp.apple.asimov.net/pub/appl.../hardcore_computist/book.of.softkeys.vol3.pdf)
The article makes use of a piece of software called Super IOB, downloadable from Apple2Online, Asmiov etc., which crashes when following the instructions in the article. When the crash occurs the display jumps to the system monitor and displaying a bunch of hex values.
After several days of hacking on this I narrowed down the problem to a source that was very surprising to me.
Super IOB is written, at least mostly, in Applesoft Basic. The program crashes at line 80 due to a return without gosub statement. Line 80 is accessed via a goto statement in line 520. Upon the error it jumps to the system monitor instead of displaying the usual “return without gosub” error I think because some poke calls modified some memory addresses which create that behavior for some reason (I don’t know much about the mode known as the “system monitor”).
There are about a zillion things I could have done wrong following the instructions of the article, but I know enough basic programming to strongly suspect that it wouldn’t have mattered what I did. A return without gosub is going to crash the program. Yet this is the basic code that exists on the disk image for Super IOB, and it was in a location in the program that it would have affected any software title, not just Ultima III. Additionally, I found a listing of the Super IOB source code in Softkeys Volume II and the same issue exists, which strongly implies to me the code is correct but I can't comprehend how the program can function as written.
I’m writing this post just in case somebody has encountered this problem with Super IOB , knows anybody who might who I can try to contact, or has any ideas in general to help move the project forward?
If there is any additional information that would be helpful, just let me know.
Thanks!
=====UPDATE TO ORIGINAL POST====
I misstated the source of the crash in SuperIOB. It's crashing on line 100, which pokes some addresses based on the value of the variables for track, sector etc. How the program gets to line 100 blows my mind. There are return statements without gosubs statements in this code, which should crash it way before it gets to line 100. But I'm not going to worry about that for now and will try focusing on how the variables in line 100 are set, and their values when the program crashes to try to sheet some light on why the program is crashing.
Last edited: