Jump to content
IGNORED

Classic99 versus Classic99 head to head turn based game DEMO


Sinphaltimus

Recommended Posts

EDIT1: - before reading all of this below, you can find Version two of the demo further down at this link - http://atariage.com/forums/topic/273950-classic99-versus-classic99-head-to-head-turn-based-game-demo/?p=3928868
I can confirm it works classic99 vs classic99 (over a network share) as well as classic99 vs Real Iron TI-99/4a equipped with TiPi.

EDIT2: Video of DEMO2 here: Classic 99 vs Classic99 and also Classic99 vs TI-99/4a TiPi Console



EDIT3: Slightly optimized code available HERE.

 

EDIT4: Latest and probably last version Number Guessing Console Vs Console Demo 2 v 3 (NGCVCD23) with updates and information can be found HERE.

Hi!

 

In chatting it up with the TiPi crew I decided to jump the gun and try something out. My basic understanding of TiPi is that it allows real iron consoles to use shared folders on a raspberry pi to use as DSKx. That's virtual disk drives on a network share. The team is hard at work to bring better capabilities and more options than I am going to demo here (when ever the video is done processing so I can upload it someplace. EDIT: WMV Video attached in this zip file = ngcvc-1.zip(NO AUDIO - Something went wrong - but video yes). But I thought, well, classic99 can use network shares as well. Now this demo is not using network shares but it easily can.

For simplicity this is what I did.

DISCLAIMER: My code is ugly and not optimized at all - if you destroy planet earth running it, I deny any responsibility, use at your own risk.
It's just a demo after all to illustrate where my ideas are in turn based head to head gaming we can all enjoy in emulation right now. And on Real Iron once TiPi becomes available sometime in the next year or two (hey, I'm not putting any undue pressure on these guys, I think it'll be out sooner that but i also don't want to make enemies of them). Anyway -

I created a simple number guessing game that you run in two different classic99 sessions. For the time being I used a local folder but it can easily be done with a shared network folder on two different computers. But for simplicity, do this:

 

Step 1: Create a folder on your computer.

Step 2: Download the attached ngcvc XB file (Number Game Console Vs Console) and save it in that folder you created in step 1.

Step 3: Open a classic99 TI-99/4a v1 emulation session and point DSK1 to the file in the folder using FIAD.

Step 4: Open another classic 99 emulation session just like before (while leaving the other up and running) and make suere DSK1 is configured to look at the same file/folder using FIAD.

Step 5: place the two screens side by side and resize as needed.

Step 6: Type the following line on one screen then press enter. OLD DSK1.NGCVC

Step 7: Once the game asks if you are player 1 or not (DO NOT ANSWER YET) - repeat step 6 on the other screen.

Step 8: Decide which one will be player 1 and type Y then hit enter. On the player 2 side type N and hit enter. Don't forget you have to click on the appropriate screen to activate it.

Step 9: play the game going back and forth between screens.

If you want, try it over your LAN making sure both computers running classic99 are configured for the same exact DSK1 location (a shared folder someplace) and give it a go.

 

THIS IS ONLY A DEMO: What I'm doing is creating a file with only a single record in each file. There are 6 files altogether. They contain the only information that needs to be shared between the console and they are access via Disk IO functions. I think this is a pretty good way to make simple turn based head to head games NOW via classic99 and more robust games later using TiPi and better functions that may or may not be implemented. (see disclaimer and fill in the blanks)

 

Here is the DEMO: NGCVC.zip

Here is the Original buggy Source Code:

 

 

// player select

CALL CLEAR

_RANDOMIZER:

RANDOMIZE

PRIZE=INT(RND*100) + 1

//PRIZE = 50 **FOR TESTING**

_DEL1:

ON ERROR _DEL2

OPEN #1:"DSK1.PCTRL",INPUT,INTERNAL,FIXED

ON ERROR STOP

RESTORE #1

DELETE "DSK1.PCTRL"

_DEL2:

ON ERROR _DEL3

OPEN #1:"DSK1.P1R",INPUT,INTERNAL,FIXED

ON ERROR STOP

RESTORE #1

DELETE "DSK1.P1R"

_DEL3:

ON ERROR _DEL4

OPEN #1:"DSK1.P2R",INPUT,INTERNAL,FIXED

ON ERROR STOP

RESTORE #1

DELETE "DSK1.P2R"

_DEL4:

ON ERROR _DEL5

OPEN #1:"DSK1.P1G",INPUT,INTERNAL,FIXED

ON ERROR STOP

RESTORE #1

DELETE "DSK1.P1G"

_DEL5:

ON ERROR _DEL6

OPEN #1:"DSK1.P2G",INPUT,INTERNAL,FIXED

RESTORE #1

DELETE "DSK1.P2G"

_DEL6:

ON ERROR _CREATEFILES

OPEN #1:"DSK1.PRIZE",INPUT,INTERNAL,FIXED

RESTORE #1

DELETE "DSK1.PRIZE"

_CREATEFILES:

OPEN #1:"DSK1.P1R",UPDATE,DISPLAY,FIXED 80

PRINT #1:9

RESTORE #1

CLOSE #1

OPEN #1:"DSK1.P2R",UPDATE,DISPLAY,FIXED 80

PRINT #1:9

RESTORE #1

CLOSE #1

OPEN #1:"DSK1.PCTRL",UPDATE,DISPLAY,FIXED 80

PRINT #1:1

RESTORE #1

CLOSE #1

POGUESS = 200

PTGUESS = 200

OPEN #1:"DSK1.P1G",UPDATE,DISPLAY,FIXED 80

PRINT #1:POGUESS

RESTORE #1

CLOSE #1

OPEN #1:"DSK1.P2G",UPDATE,DISPLAY,FIXED 80

PRINT #1:PTGUESS

RESTORE #1

CLOSE #1

OPEN #1:"DSK1.PRIZE",UPDATE,DISPLAY,FIXED 80

PRINT #1:PRIZE

RESTORE #1

CLOSE #1

 

_PSELECT: //IDENTIFY WHO IS PLAYING

DISPLAY AT (1,1): "Are you player 1? (Y/N)"

INPUT PLAYER$

IF PLAYER$ = "Y" THEN GOTO _PLAYERONEREADY

IF PLAYER$ = "N" THEN GOTO _PLAYERTWOREADY

GOTO _PSELECT

 

_PLAYERONEREADY: //PLAYER 1 READY

IAM = 1

OPEN #1:"DSK1.P1R",UPDATE,DISPLAY,FIXED 80

PRINT #1:IAM

RESTORE #1

CLOSE #1

 

_WAITP2: //WAIT FOR PLAYER 2 TO BE READY

DISPLAY AT (2,1): "WAITING FOR PLAYER 2"

DISPLAY AT (3,1): "TO BE READY"

OPEN #1:"DSK1.P2R",UPDATE,DISPLAY,FIXED 80

INPUT #1:Q

RESTORE #1

CLOSE #1

IF Q = 2 THEN _STARTGAME ELSE _WAITP2

 

_PLAYERTWOREADY: // PLAYER 2 READY

IAM = 2

OPEN #1:"DSK1.P2R",UPDATE,DISPLAY,FIXED 80

PRINT #1:IAM

RESTORE #1

CLOSE #1

 

_WAITP1: //WAIT FOR PLAYER 1 TO BE READY

DISPLAY AT (2,1): "WAITING FOR PLAYER 1"

DISPLAY AT (3,1): "TO START GAME"

OPEN #1:"DSK1.P1R",UPDATE,DISPLAY,FIXED 80

INPUT #1:P

RESTORE #1

CLOSE #1

IF P = 1 THEN _STARTGAME ELSE _WAITP1

 

_STARTGAME: //INITALIZE EVERYTHING TO PLAY THE GAME

CALL CLEAR

OPEN #1:"DSK1.PCTRL",UPDATE,DISPLAY,FIXED 80 //TRACKS WHOSE TURN IT IS.

PRINT #1:1

RESTORE #1

CLOSE #1

OPEN #1:"DSK1.PRIZE",UPDATE,DISPLAY,FIXED 80

INPUT #1:PRIZE

RESTORE #1

CLOSE #1

 

_PLAYERTURN:

OPEN #1:"DSK1.PCTRL",UPDATE,DISPLAY,FIXED 80 //TRACKS WHOSE TURN IT IS.

INPUT #1:C

RESTORE #1

CLOSE #1

IF C = 1 THEN _P1TURN ELSE _P2TURN

 

_P1TURN:

OPEN #1:"DSK1.PCTRL",UPDATE,DISPLAY,FIXED 80 //TRACKS WHOSE TURN IT IS.

PRINT #1:1

RESTORE #1

CLOSE #1

IF IAM = 2 THEN _P2DISPLAY

DISPLAY AT (1,1): "I AM THINKING OF A"

DISPLAY AT (2,1): "NUMBER FROM 1 THRU 100"

DISPLAY AT (3,1): "PLEASE MAKE YOUR GUESS"

DISPLAY AT (4,1): "PLAYER 1"

GOTO _P1INPUT

 

_P2DISPLAY:

DISPLAY AT (1,1): "I AM THINKING OF A"

DISPLAY AT (2,1): "NUMBER FROM 1 THRU 100"

DISPLAY AT (3,1): "WAITING FOR PLAYER 1"

DISPLAY AT (4,1): "TO MAKE A GUESS."

OPEN #2:"DSK1.PCTRL",UPDATE,DISPLAY,FIXED 80 //TRACKS WHOSE TURN IT IS.

INPUT #2:C

RESTORE #2

CLOSE #2

OPEN #5:"DSK1.P1G",UPDATE,DISPLAY,FIXED 80

INPUT #5:F

RESTORE #5

CLOSE #5

IF C = 1 AND IAM = 2 THEN _P2DISPLAY

IF C = 1 AND IAM = 1 THEN _P1INPUT ELSE _P1RESULT

IF C = 6 THEN _P1RESULT

_P1INPUT:

INPUT POGUESS

OPEN #1:"DSK1.P1G",UPDATE,DISPLAY,FIXED 80

PRINT #1:POGUESS

RESTORE #1

CLOSE #1

OPEN #1:"DSK1.PCTRL",UPDATE,DISPLAY,FIXED 80 //TRACKS WHOSE TURN IT IS.

PRINT #1:6

RESTORE #1

CLOSE #1

 

_P1RESULT:

OPEN #1:"DSK1.P1G",UPDATE,DISPLAY,FIXED 80

INPUT #1:POGUESS

RESTORE #1

CLOSE #1

CALL CLEAR

IF POGUESS = PRIZE THEN _P1WINS

IF POGUESS < PRIZE THEN _P12LOW

IF POGUESS > PRIZE THEN _P12HI

 

_P2TURN:

OPEN #1:"DSK1.PCTRL",UPDATE,DISPLAY,FIXED 80 //TRACKS WHOSE TURN IT IS.

PRINT #1:2

RESTORE #1

CLOSE #1

IF IAM = 1 THEN _P1DISPLAY

DISPLAY AT (1,1): "I AM THINKING OF A"

DISPLAY AT (2,1): "NUMBER FROM 1 THRU 100"

DISPLAY AT (3,1): "PLEASE MAKE YOUR GUESS"

DISPLAY AT (4,1): "PLAYER 2"

GOTO _P2INPUT

 

_P1DISPLAY:

DISPLAY AT (1,1): "I AM THINKING OF A"

DISPLAY AT (2,1): "NUMBER FROM 1 THRU 100"

DISPLAY AT (3,1): "WAITING FOR PLAYER 2"

DISPLAY AT (4,1): "TO MAKE A GUESS."

OPEN #3:"DSK1.PCTRL",UPDATE,DISPLAY,FIXED 80 //TRACKS WHOSE TURN IT IS.

INPUT #3:C

RESTORE #3

CLOSE #3

OPEN #4:"DSK1.P2G",UPDATE,DISPLAY,FIXED 80

INPUT #4:PTGUESS

RESTORE #4

CLOSE #4

IF C = 2 AND IAM = 1 THEN _P1DISPLAY

IF C = 2 AND IAM = 2 THEN _P2INPUT ELSE _P2RESULT

IF C = 6 THEN _P2RESULT

 

_P2INPUT:

INPUT PTGUESS

OPEN #1:"DSK1.P2G",UPDATE,DISPLAY,FIXED 80

PRINT #1:PTGUESS

RESTORE #1

CLOSE #1

OPEN #1:"DSK1.PCTRL",UPDATE,DISPLAY,FIXED 80 //TRACKS WHOSE TURN IT IS.

PRINT #1:6

RESTORE #1

CLOSE #1

 

 

_P2RESULT:

OPEN #1:"DSK1.P2G",UPDATE,DISPLAY,FIXED 80

INPUT #1:PTGUESS

RESTORE #1

CLOSE #1

CALL CLEAR

IF PTGUESS = PRIZE THEN _P2WINS

IF PTGUESS < PRIZE THEN _P22LOW

IF PTGUESS > PRIZE THEN _P22HI

 

_P1WINS:

DISPLAY AT (11,1): "PLAYER ONE GUESSED ";POGUESS

DISPLAY AT (12,1): " WHICH IS CORRECT!"

DISPLAY AT (13,1): "PLAYER ONE WINS!!"

GOTO _GAMEOVER

_P12LOW:

DISPLAY AT (11,1): "PLAYER ONE GUESSED ";POGUESS

DISPLAY AT (12,1): " WHICH IS TOO LOW!"

GOTO _P2TURN

_P12HI:

DISPLAY AT (11,1): "PLAYER ONE GUESSED ";POGUESS

DISPLAY AT (12,1): "WHICH IS TOO HIGH!"

GOTO _P2TURN

_P2WINS:

DISPLAY AT (11,1): "PLAYER TWO GUESSED ";PTGUESS

DISPLAY AT (12,1): "WHICH IS CORRECT!"

DISPLAY AT (13,1): "PLAYER TWO WINS!!"

GOTO _GAMEOVER

_P22LOW:

DISPLAY AT (11,1): "PLAYER TWO GUESSED ";PTGUESS

DISPLAY AT (12,1): " WHICH IS TOO LOW!"

GOTO _P1TURN

_P22HI:

DISPLAY AT (11,1): "PLAYER TWO GUESSED ";PTGUESS

DISPLAY AT (12,1): "WHICH IS TOO HIGH!"

GOTO _P1TURN

_GAMEOVER:

DISPLAY AT (14,1): "PLAY AGAIN?(Y/N)"

INPUT PAGAIN$

CALL CLEAR

IF PAGAIN$ = "Y" THEN GOTO _RANDOMIZER

END

 

 

 

 

...

Edited by Sinphaltimus
  • Like 6
Link to comment
Share on other sites

Ah, be careful.

​Remember what was said earlier on another topic. TIPI is somehow loading an image of the file and if two different users are trying to access the same file simultaneously, things will go to crap. This may be able to be resolved writing some kind of filename.bsy files so only one person can have the file open at a time.

 

But yes, I think you have a good idea. I think the more we float these kinds of ideas out there, the more ideas get generated about new possibilities of use for the TIPI project.

​Beery

  • Like 1
Link to comment
Share on other sites

So maybe we just can just establish a private "Unique Config File" per User and per App on that web-driven DSK,

in the format like "#AppId #UserId" (IDs have to be managed/negotiated once),

so that every User/App can store any conditon/data in its own file, that other users (or the "server", see below) can read/write/use later.

 

Also, maybe another unique "Central Config File", one for each App could exist, to store common things (HighScores, saved games....)

 

For exclusive Read/Write-access, an App could be programmed in that way,

that it first checks if a (central or user) control file exists (R/W request), what would mean "file is in use",

so that it just has to wait for re-check (or do other things or write a temp file to be nerged by the server later..)

If "free" (controlfile does not exist), the app could (temporarily) generate a control file (to prevent from other users access at this moment),

and then read/write to the wanted data file inside the DSK, and then to delete the control file (release data file for next user)

 

In addition, a "24/7-TI-99-Server" with a special App to manage/maintain these files, could check for orphaned files or whatever,

or, if you store personal highscores in the user-file only, to merge that data into the central file.

 

Or something like this ? :)

  • Like 1
Link to comment
Share on other sites

So maybe we just can just establish a private "Unique Config File" per User and per App on that web-driven DSK,

in the format like "#AppId #UserId" (IDs have to be managed/negotiated once),

so that every User/App can store any conditon/data in its own file, that other users (or the "server", see below) can read/write/use later.

 

Also, maybe another unique "Central Config File", one for each App could exist, to store common things (HighScores, saved games....)

 

For exclusive Read/Write-access, an App could be programmed in that way,

that it first checks if a (central or user) control file exists (R/W request), what would mean "file is in use",

so that it just has to wait for re-check (or do other things or write a temp file to be nerged by the server later..)

If "free" (controlfile does not exist), the app could (temporarily) generate a control file (to prevent from other users access at this moment),

and then read/write to the wanted data file inside the DSK, and then to delete the control file (release data file for next user)

 

In addition, a "24/7-TI-99-Server" with a special App to manage/maintain these files, could check for orphaned files or whatever,

or, if you store personal highscores in the user-file only, to merge that data into the central file.

 

Or something like this ? :)

 

I can tell you that one of the developer's is working on a solution (currently in alpha) to handle such server side requests.

  • Like 1
Link to comment
Share on other sites

Ah, be careful.

​Remember what was said earlier on another topic. TIPI is somehow loading an image of the file and if two different users are trying to access the same file simultaneously, things will go to crap. This may be able to be resolved writing some kind of filename.bsy files so only one person can have the file open at a time.

 

But yes, I think you have a good idea. I think the more we float these kinds of ideas out there, the more ideas get generated about new possibilities of use for the TIPI project.

​Beery

I've been notified by my handlers that I have successfully completed my NDA obligations and can now publicly state that I have been part of the TiPi beta as of December 3rd when it arrived at my location.

 

The DEMO I posted is the first step towards me working out a simple way for the basic hobbyist to take advantage of TiPi's most basic features. It is not in and of itself TiPi ready. I have tried using this DEMO as-is with classic99 using the TiPi samba share and I ran into many issues which i was warned about and learned about beforehand. Mainly being exactly what you posted - random write protect errors, random attempting to read past end of file errors, etc... So without a doubt, this game demo as is will not work with TiPi.

 

My next step is to make it work with TiPi this weekend if I can. And I definitely want to use a similar method as has been mentioned by creating a "filebusy" file to help play traffic cop with the disk IO read/writes. Using On Error (thanks Casey) I can do something like Open a file, if this file doesn't exist (On error) then go ahead and open that other file instead. If i can open the file in question (it does exist) then close it and do not attempt to do any disk functions to that other file yet.

 

It's very tricky because no two console are the same, you can't really sync them up via file IO and adding a sort of Delay loop might work, for a time. I would still have to contend with one console checking to see if the file exists (and it does for a millisecond) but the other console tries to delete it at the same time. There isn't any kind of RETRY function that I know of for errors. So possibly some creative use of the ON ERROR function (Thank you again Casey).

 

I think the biggest point I wanted to make here is - has anyone else ever done this in emulation? Surely there are many users here who love and use their TI emulation to develop and play but do not actually own a real console at all. Why aren't we flooded with Emulation Console vs emulation console turn based games today after all these years? So with or without TiPi and a real console, we really can start making games in this way. I already have a head to head submarine hunt game I want to make using this method. (A dumbed down version of battleship). I can't wrap my head around it just yet but theoretically the number of players is endless. But more grounded in reality; something like 4 player card games could be made. I'm sticking with 2 player games for now and working more towards TiPi compatible games. But the initial version of these games will be classic99 vs classic99 (CvC) games first and then have a TiPi compatible version made by adding in whatever extra code I have to if only to handle IO timing, and lucky for me CvC works not matter how you cut it (c99 vs c99, c99 vs console, console vs console) :)

 

So later today I will prove out this game over a network share instead of a local file using classic99 and then I will start on the TiPi stuff. I want to make sure there isn't any TCP/IP latency or file share permission thing going on in windows that might generate some of the same errors I witnessed trying to use the TiPi samba share.

 

  • Like 3
Link to comment
Share on other sites

Ok so trying this over a network share (Windows) using just classic99 vs classic99 and I was getting a lot of IO errors (just like when I tried the samba shares on the Pi from from windows).

So I added ON ERROR checks at every OPEN statement. There is a performance hit but NO MORE *GAME STOPPING* ERRORS!

So this version here will work (and perform better) on a local drive and will work (less performance) over a network share (classic99):
Source code included in TXT file within zip, follow the same instructions as in the original post except for the shared folder location.

NumberGame_cVc_DEMO2.zip

Edited by Sinphaltimus
  • Like 1
Link to comment
Share on other sites

So, JediM@42 suggested trying this with dropbox. So i did. I shared my TiPi folder in my personal dropbox with my work dropbox and successfully played the number guessing game between two classic99 session on two different computers over the internet. IT WORKS!

Multiplayer turn based gaming is possible (and has been for a while) over the internet today! GET DEVELOPING FOLKS!!!!

Obviously - you can only share your folder with your opponent so it's not elegant. You'd have to share the folder with anyone you'd want to play with and they would obviously need a dropbox account. But it can be done. I've done it and will have a video later on if not sometime during the week demonstrating that.

  • Like 2
Link to comment
Share on other sites

Here is a video demonstrating the number guessing game being played over the internet using classic99 and dropbox - Again, sorry no audio. I don't know what's up with ShadowPlay when recording desktop. I'll fix eventually and probably do a recording using my GoPro before the end of the week. But for now - there is this: DropBox.zip

 

Also, take note of the dropbox notifications popping up during gameplay. *not faked* - LOL :)

  • Like 2
Link to comment
Share on other sites

So I optimized the Number Guessing game a little bit - and there is a performance boost obviously.

I added the delete file functions at the beginning of the code as I was trouble shooting issues, I also had RESTORE lines for every Disk IO function, as part of a misunderstanding.

Thanks to Tursi for letting me know that DELETE isn't supported (doesn't actually delete) when DSK1 is configured as FIAD in classic99.
And to M@ for letting me know that RESTORE is not needed unless I'm using APPEND in the OPEN statement.

I left all of these lines in the SOURCE code and just commented them out in TidBit so they are not transferred to the XB code when translated via TidBit.

Tested, still works as intended....

Get Source, XB program in TXT and ready to run XB program here:NumberGuesscVcDEMO2v2.zip

  • Like 1
Link to comment
Share on other sites

I'm not certain how those work but if you just point them to a directory to use as DSK1 then it should work fine. The program itself (number game) takes care of the error checking for access to the file(s).

But, with emulation, it's not TiPi related - I answer your question from the TiPi topic here (http://atariage.com/forums/topic/265136-tipi-ti-994a-to-raspberry-pi-interface-development/?p=3930351)


Beery Miller Wrote:

Sounds great.

"I would assume this would NOT work for something like MAME or MESS since I do not think two different emulators could access the same file at the same time???

Beery"

Sounds great.

I would assume this would NOT work for something like MAME or MESS since I do not think two different emulators could access the same file at the same time???

Beery

Link to comment
Share on other sites

I already answered in the other thread. Keep in mind that disk image processing is a significant feature of the emulation in MAME, so MAME cannot see files on the host as done in Classic 99. You cannot point MAME to single files or directories on the host. Moreover, all changes within dsk image files happen in memory and are committed to the host file system when you exit the emulation.

  • Like 2
Link to comment
Share on other sites

I already answered in the other thread. Keep in mind that disk image processing is a significant feature of the emulation in MAME, so MAME cannot see files on the host as done in Classic 99. You cannot point MAME to single files or directories on the host. Moreover, all changes within dsk image files happen in memory and are committed to the host file system when you exit the emulation.

Ah, I had no idea. so I guess this doesn't work with MAME. Thanks for answering.

 

I should probably add - "Works with Emulators that support FIAD" only.

Edited by Sinphaltimus
Link to comment
Share on other sites

I already answered in the other thread. Keep in mind that disk image processing is a significant feature of the emulation in MAME, so MAME cannot see files on the host as done in Classic 99. You cannot point MAME to single files or directories on the host. Moreover, all changes within dsk image files happen in memory and are committed to the host file system when you exit the emulation.

 

hmmm, maybe one can "flush" that on demand, with a special trick or so ? (without exiting the Mame)

Link to comment
Share on other sites

hmmm, maybe one can "flush" that on demand, with a special trick or so ? (without exiting the Mame)

 

I could elaborate with quite some lines on that, but for now suffice it to say: I guess you don't want to think about questions like how to trigger a flush, how to detect an external change that requires a refresh, and foremost: How to work with a single image file that may be changed at different locations, possibly by different agents. ;)

  • Like 1
Link to comment
Share on other sites

I already answered in the other thread. Keep in mind that disk image processing is a significant feature of the emulation in MAME, so MAME cannot see files on the host as done in Classic 99. You cannot point MAME to single files or directories on the host. Moreover, all changes within dsk image files happen in memory and are committed to the host file system when you exit the emulation.

 

Really? When you exit the emulation? What happens to the changes on the DSK or HD image if the emulation crashes and you have to reboot the whole computer or have to do a Windows CTRL-ALT-DELETE to end the task? I would have swore those changes were committed to the original files?

 

Beery

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...