Ultimate Amiga

Please login or register.

Login with username, password and session length
Advanced search  
Pages: [1] 2   Go Down

Author Topic: Amiga Resource Tips  (Read 17293 times)

0 Members and 1 Guest are viewing this topic.

bruceuncle

  • AMOS Dev
  • A500
  • *****
  • Karma: 6
  • Offline Offline
  • Gender: Male
  • Posts: 425
  • WINUAE Amiga User
Amiga Resource Tips
« on: May 22, 2014, 05:03:45 AM »

Quote from: Hungry Horace
The main problem here, is not knowing exactly what each champion data item is used for, or what the other subroutines being called do.
Quote from: Hungry Horace
This seems to load the monsters from the .monsters setup section (the files we know and love from the editing process) and loads them into an allocated space in memory ($16B7C in memory) - this address also has a "count" at the start of it....    lbW0167DA seems to be the reference to that space.
I think it would pay you guys to invest some time in learning enough about Resource to do the things you're itching to get going with.  The disassembly was done with Resource V6.06.  So first question is, have you got a copy?  If not, let me know.

First and foremost, Resource is not infallible.  And it's very easy to stuff up what you're trying to do with a single keystroke (it's far easier to use when you know a few keyboard shortcuts).  With no Undo facility!  I usually save multiple copies of the *.RS files with _nnn tacked on the end.  That disassembly was pass 11 through the results looking for obvious code-versus-data stuff ups and formatting data.  Hence it had a name of Bloodwych_011.RS.  Teaching grandma to suck eggs, I know!  But it's essential to stick with good backup and regression habits with Resource or you can waste an awful lot of time.

Ok.  The basics are:
  • Start Resource and load the *.RS file of your choice.  If you script a startup for Resource, you can specify a work directory or an assign, which it will use when you select a file to load - saves looking around for it all the time.  eg. Resource RS_WORK: will use whatever's currently assigned to RS_WORK:.
  • The current line in Resource is always the one at the top of the screen.  Everything you do operates on that line except for a few block operations (which you really don't want to know about yet).
  • [up arrow] and [down arrow] move up and down one line at a time.
  • [shift]+[up arrow] and [shift]+[down arrow] move up and down approximately one screen at a time.
  • [ctrl]+[shift]+[up arrow] and [ctrl]+[shift]+[down arrow] move to the previous and next label respectively.
  • [alt]+[up arrow] and [alt]+[down arrow] move to start and end respectively.  Note that this cursor movement will wreck any remembered positions (see below).
  • [right arrow] - forward reference - If you're positioned over a line containing a label as an operand, takes you to that label and REMEMBERS "WHERE YOU CAME FROM".  You can now move around in the code and see what's there without affecting "where you came from".  However, DO NOT use any absolute cursor positioning (start, end, go to offset, etc.) or you will lose "where you came from"!
  • [left arrow] - previous location - if you've used a few of the [right arrow] moves, this will take you back one step at a time.  I don't know what the limit is, but I've never run out yet.  If you want to get fancy about it, you can also manipulate the stack it uses for this!
  • [shift]+[right arrow] moves one byte forwards.  This may seem silly in the resulting assembler code but it's essential for getting rid of a left over label that's pointing to the middle of an instruction!  Also brilliant for moving through multiple constants on a line to insert a label at exactly the right spot (for example, labelling the $4A byte in the middle of a line like dc.b $01,$02,$03,$4A,$30) and for tidying up text with embedded non-printing characters (all those scroll strings with $FC line terminators and the final $FF scroll terminator).
  • [shift]+[left arrow] moves one byte backwards.
  • You can change the type for a line using [left Amiga]+
         [C] = Code
         [B] = Byte
         [W] = Word
         [Z] = Long
         [A] = ASCII (text)
    Take great care doing this as Resource will ripple that change through until it finds its next "certain" data type.  This will usually be a label.  So this is one of those occasions where a single keystroke can wreck everything...  For example, you find a few bytes of data at the start of some code, so you use [left Amiga]+[B] and the whole lot changes to byte data from there on.  Now try finding where that code started again >:(
    Note that this doesn't happen if you've already told Resource what some of the code is by inserting labels or one of the other data type changes.
  • When you enter the string or pattern for a search, you MUST hit [Enter] before you try the search.  This is a big gotcha in Resource!
  • [F9] repeats the last normal search.  [ctrl]+[F9] repeats the last patterns search.  These do not affect the "repeat last command" operation.
  • Whilst on searching, this is a big file and it takes a long time to search from start to end.  As only the roughly first 15% of the executable is actual code, it's a pain to have to sit waiting for it to finish when you know what you were looking for was in the code bit.  Just use [right Amiga]+[A] to abort any long running process.
  • So you've found a position in the code that you want to label.  Resource may already have put on there in the lbXnnnnnn format.  Just press [numeric keyboard 9] to get a requester where you can type in your own.  Must start with an alpha or underscore, can contain alphanumerics, dot and undersore.  As soon as you define it, all references to it will change to the new name.  Piece of cake!
  • If you want to change a symbol, use [v].  Note that on lines where there is potential for more than one symbol in the operands, use [1], [2], etc. first to tell Resource which one to change.  As you discover more about the data structures used in Bloodwych, you may want to have some sets of symbols already defined, so you can tidy up references like ($000A,a4).  Look at Help for SYM/Custom Bases for a couple of sets you can define that also get saved with the *.RS file.  If you start finding many of them, let me know and I'll assemble up the Resource Symbol files for them.  But we'll go into that when you get there...
  • [spacebar] repeats the last instruction.  This does not include any of the variations on repeat searches or most cursor movements, so you can repeatedly search and repeat with just two key presses.
  • Don't forget that all those labels generated by Resource itself represent offsets from the start of the code, not addresses!  For Bloodwych, you need to add $3A4 bytes to get the absolute address (see the comments at the start of the source for why).  These are offsets from the start of the code, not the start of the file.  For file offsets, add $20 bytes.  This is the size of the first hunk plus the size of the header for the second hunk.
  • There are a lot of word-length references to absolute addresses.  Resource cannot resolve these as it expects address references to be longword-length.  To get the offset in the file, subtract $3A4.
    Worked Example:
         00D4AC jsr ($41FA).w
    $41FA-$3A4=$3E56
    Now go to offset $003E56 and create a label [F9].  If you're not sure what the destination is, make it the same as one Resource would use to avoid any more confusion!  Eg. lbC003E56.
    Go back to offset $00D4AC and create a symbol [v].  The trick is to create the symbol with .w on the end.  So, in this case, you'd enter lbC003E56.w.  It now looks like this:
         00D4AC jsr (lbC003E56.w).w
    Resource will now recognise the reference and you can use the forward reference and previous location functions as with any longword symbol.
  • For all those absolute addresses to resolve correctly, I've set the Origin as $3A4.  Make sure you don't change this if you're messing around trying out different commands!
  • The Resource manual is very useful.  The pirate docs with some versions have some useful info but are way out of date.  The best source is the built-in Help.  But it's a real pain to use as you have to know what you're looking for before you can find help on it (if you see what I mean - ever read a mobile 'phone manual if you've never had a mobile 'phone before?).  I've had a side project going for a while to turn the Resource Help (V6.06) into a PDF with all the hyperlinks in place.  Nearly there, but I really must get back to AMOS  ;) .

I'll finish the list there as that lot should get you what you need in that file I posted.  Just remember to Save often with incremental names so you can backtrack if you mess anything up.

This may well be an inappropriate place to post this lot, so feel free to move it Hungry Horace.  And have fun with it.  I'll be happy to take any Resource queries by PM if you need any more help or anything clarifying.
Logged
Repeat after me ...  "The AMOS Pro architecture is complex but it is not complicated."

Hungry Horace

  • Amorphous Blue-Blob Man
  • Site Admin
  • A4000T
  • ******
  • Karma: 307
  • Offline Offline
  • Gender: Male
  • Posts: 3,364
  • Don't forget... Ameboid's need love too!
    • AUW
Re: Amiga Resource Tips
« Reply #1 on: December 22, 2015, 07:22:23 PM »


  • So you've found a position in the code that you want to label.  Resource may already have put on there in the lbXnnnnnn format.  Just press [numeric keyboard 9] to get a requester where you can type in your own.  Must start with an alpha or underscore, can contain alphanumerics, dot and undersore.  As soon as you define it, all references to it will change to the new name.  Piece of cake!
  • If you want to change a symbol, use [v].  Note that on lines where there is potential for more than one symbol in the operands, use [1], [2], etc. first to tell Resource which one to change.  As you discover more about the data structures used in Bloodwych, you may want to have some sets of symbols already defined, so you can tidy up references like ($000A,a4).  Look at Help for SYM/Custom Bases for a couple of sets you can define that also get saved with the *.RS file.  If you start finding many of them, let me know and I'll assemble up the Resource Symbol files for them.  But we'll go into that when you get there...

right... here's a question.... the resource of Bloodwych has accidently assumed a reference to be to a label. It's not though, it's a longword fixed value. How do i change it back?

the code is showing as:

Code: [Select]
MOVE.L    #AUTOLABEL,D7
but should read:

Code: [Select]
MOVE.L     #00030009,D7
... i can't for the life of me work out how to fix this though!
Logged
Quote from: KillerGorilla
because winuae is made of code and your amiga is made of stuff

bruceuncle

  • AMOS Dev
  • A500
  • *****
  • Karma: 6
  • Offline Offline
  • Gender: Male
  • Posts: 425
  • WINUAE Amiga User
Re: Amiga Resource Tips
« Reply #2 on: December 24, 2015, 04:02:18 AM »

I like to make the change visible (and prevent Resource changing anything while I'm not looking) so I comment out the original line and add a new one.
To do that, get the cursor on the offending line and:
1. Add a label to it that consists of a single semi-colon.  Resource now regards the line as a comment.  You can use this trick on as many lines as you like.  Resource was designed that way.
2. Add a full line comment BUT begin it with a single semi-colon.  This is where you type the rest of the line as a replacement.  I'm not at my PC so I can't recall the details but I think you can use \t for the tabs.  Again, Resource does this by design to allow code lines to be added.

You can also use anything as a symbol in Resource, which is another way to do it.  But the change is hidden using that method.  Anything is 'legal' for a symbol.  Eg. I often substitute "-1" for "$FFFF" using that method if it makes better sense in context.
Hope this helps.

Sent from my Lumia 800 using Tapatalk
Logged
Repeat after me ...  "The AMOS Pro architecture is complex but it is not complicated."

Hungry Horace

  • Amorphous Blue-Blob Man
  • Site Admin
  • A4000T
  • ******
  • Karma: 307
  • Offline Offline
  • Gender: Male
  • Posts: 3,364
  • Don't forget... Ameboid's need love too!
    • AUW
Re: Amiga Resource Tips
« Reply #3 on: December 28, 2015, 10:51:14 PM »

Thanks BruceUncle, as always!

I managed to make the first method work fine... but i couldnt simply 'change' the symbol (the 'hidden' method)

I dont mind not having the change marked, because basically it's an error in the disassembly. I managed to delete the target label, but it instead changed the value to START+$X  ... i'd like to have the intended longword value there instead!
Logged
Quote from: KillerGorilla
because winuae is made of code and your amiga is made of stuff

copse

  • A600
  • *
  • Karma: 0
  • Offline Offline
  • Posts: 30
Re: Amiga Resource Tips
« Reply #4 on: December 29, 2015, 08:23:43 PM »

I think I used to do something like change the code to data, look at the raw value (if possible given the instruction) and then change it back to code, and edit the operand value to be that value.  Or knowing START, just calculate the value and set it manually.

I don't recall it being that big a deal working around this.  Maybe there was an easier way.
Logged

Hungry Horace

  • Amorphous Blue-Blob Man
  • Site Admin
  • A4000T
  • ******
  • Karma: 307
  • Offline Offline
  • Gender: Male
  • Posts: 3,364
  • Don't forget... Ameboid's need love too!
    • AUW
Re: Amiga Resource Tips
« Reply #5 on: December 29, 2015, 09:04:59 PM »

Sounds right,  just can't work out what the control is to "edit the operand value"... I've trawled through some help docs etc but to no avail so far!

I did exactly what you said though and got the data came by switching "back" to data temporarily
Logged
Quote from: KillerGorilla
because winuae is made of code and your amiga is made of stuff

bruceuncle

  • AMOS Dev
  • A500
  • *****
  • Karma: 6
  • Offline Offline
  • Gender: Male
  • Posts: 425
  • WINUAE Amiga User
Re: Amiga Resource Tips
« Reply #6 on: December 29, 2015, 11:55:49 PM »

right... here's a question.... the resource of Bloodwych has accidently assumed a reference to be to a label. It's not though, it's a longword fixed value. How do i change it back?

the code is showing as:

Code: [Select]
MOVE.L    #AUTOLABEL,D7
but should read:

Code: [Select]
MOVE.L     #00030009,D7
... i can't for the life of me work out how to fix this though!
Okay, I just refreshed my memory of how to do it.  For the example you gave, simply press [v] to create a symbol and type in the value you want for the literal.  So you would enter $00030009 (note, no # needed but remember the $  ;) ).  It should now display as:

Code: [Select]
MOVE.L     #$00030009,D7
Note that you can do this for any literal operand.  The action always defaults to the first operand.  If you need to change the second operand, press [2] first then [v] (and [3] for the third operand, [4] for the fourth operand if it's a 68020 instruction with a complex effective address).

If Resource objects to changing a symbol, just use Label/Remove Single/Symbol from the menu first (can't recall the keyboard shortcut).  Have you got the PDF of the help file I put together?  It's cheap and cheerful but worth wading through as the Resource Help system has some major bugs and there's a few essential bits that you can't get to.  The PDF has the General Information topics first then the commands in (roughly) the order they appear in the menu.
Logged
Repeat after me ...  "The AMOS Pro architecture is complex but it is not complicated."

copse

  • A600
  • *
  • Karma: 0
  • Offline Offline
  • Posts: 30
Re: Amiga Resource Tips
« Reply #7 on: January 16, 2016, 07:24:40 PM »

I don't seem to be able to get the edit symbol dialog box (6.06) to take copy and paste.  I can copy and paste in the newshell window in workbench, but if I right-amiga+c or right-amiga+v in the resource edit dialog box, it just puts c or v.

This would be a huge speed up, as a lot of what I am doing is searching for -$222(a6) and then editing the symbol to be something like DosDelay-JTD1_02A890.

Any ideas?
Logged

bruceuncle

  • AMOS Dev
  • A500
  • *****
  • Karma: 6
  • Offline Offline
  • Gender: Male
  • Posts: 425
  • WINUAE Amiga User
Re: Amiga Resource Tips
« Reply #8 on: January 16, 2016, 09:32:29 PM »

I don't seem to be able to get the edit symbol dialog box (6.06) to take copy and paste.  I can copy and paste in the newshell window in workbench, but if I right-amiga+c or right-amiga+v in the resource edit dialog box, it just puts c or v.

This would be a huge speed up, as a lot of what I am doing is searching for -$222(a6) and then editing the symbol to be something like DosDelay-JTD1_02A890.

Any ideas?
Time to learn all about macros and the accumulator.
The simple approach is to define your replacement symbol in the accumulator.  Then use "\e\e" in the requester for the symbol.
The more complex way is to write a looping macro to do it through the whole file (seach, define symbol, loop).  And learn keyboard shortcuts.
.Check out the macros I wrote for the AMOS Pro extensions for some examples to get started with.  It's a steep lsearning curve but the only way to get things done in Resource.
I can't go into any detail here as replying on the smartphone is tedious.  I'll do a more comprehensive post when I get back to my PC.
Logged
Repeat after me ...  "The AMOS Pro architecture is complex but it is not complicated."

copse

  • A600
  • *
  • Karma: 0
  • Offline Offline
  • Posts: 30
Re: Amiga Resource Tips
« Reply #9 on: January 17, 2016, 02:35:29 AM »

Here's another one. SOLVED BELOW

Let's say some program refers to it's code/data via an address register.  It might use negative and positive offsets.

So you go to the address in the disassembly view the offset would reference, and you give it a label.  Let's say JTD1_022222.  Then you go to the places that use that offset, and set the symbol to JTD1_022222-JTD1_Base.  Then you can follow the reference to the label.

But let's say, you decide that JTD1_022222 actually shows a dialog on failure to open a library, and you want to name it ShowLibOpenFailDialog.  So you change the label, and the references do not change.

Is there a way to get the dynamic symbols, like JTD1_022222-JTD1_Base, to automatically update with label changes?
« Last Edit: January 18, 2016, 02:54:25 AM by copse »
Logged

copse

  • A600
  • *
  • Karma: 0
  • Offline Offline
  • Posts: 30
Re: Amiga Resource Tips
« Reply #10 on: January 17, 2016, 09:22:35 PM »

Hmm, just occurred to me, maybe I should also learn the intricacies of the Convert to (xx,An) EA menu option.
Logged

copse

  • A600
  • *
  • Karma: 0
  • Offline Offline
  • Posts: 30
Re: Amiga Resource Tips
« Reply #11 on: January 17, 2016, 10:54:46 PM »

Alright, here's my partially read the docs interpretation.  The An register conversions are global, and are only really used for C programs, or assembler programs with constant global use of the same address register.

So, that leaves the string expressions.  That is, you can refer to a label at a resource address as \e0$2A890\e in, for instance, the symbol entry text field you get when you press 'v'.  And let's say $2A890 is in A5, and you have an offset you want to handle (e.g. $2000 or -$184).  First you need to go to the address the offset corresponds to, and make a label - it doesn't matter what.  Then you can refer to the address for the offset and have it automatically pick up the label, and therefore any changes to the label.

e.g. $2000(A5) where A5 = $2A890 (with label JTD1_02A890).  So the actual referenced address is, $2C890.  So you 'F10' to remember the current position, then 'CTRL+n' and enter $2C890.  Then you hit 'SHIFT+KPENTER' and enter a label name, e.g. 'SomePtr'.  Then hit 'RIGHT CURSOR' to return to the original location, and hit 'v' and enter as the symbol value '\e0$2C890\e-\e0$2A890\e' and you then see 'SomePtr-JTD1_02A890(A5)' as the operand.

And there it is.  Now I just need to come up with some way to automate it.  I'm going to go back to reading the manual, which despite being generated from in-program data, isn't half bad.
Logged

copse

  • A600
  • *
  • Karma: 0
  • Offline Offline
  • Posts: 30
Re: Amiga Resource Tips
« Reply #12 on: January 18, 2016, 02:53:40 AM »

And here is my macro.  Now the question is, how do I undo all the damage I've done by not having this  :)

BUGS: Probably does not work for OFFSET = 0

Add base address to buffer B.

$2A890

Automating the creation of labels for instructions that use $v(An), requires base address in buffer B.

1. Remember current cursor position.
   C/CURSOR/Remember $002C [F10]
      "Push" the current cursor location on ReSource's location stack.
2. Get symbol value from the selected field on the current line to the accumulator.
   S/STRINGS/Get/Symbol value $020E
      Copy the symbol value from the selected field on the current line to the
      accumulator.
3. Add the base offset to the accumulator to get the label address which should be referenced.
   ... adding a negative offset will fail, so we drop out of the conditional to handle that
   ... otherwise, we skip the handling
   MACROS 1/Directives/Start conditional
      ... add the address from buffer B to the accumulator.
      S/STRINGS/Maths functions/Add $022E
         STORE "\eB"
         You will be asked for a number, to be added to the accumulator. If a carry
         results, a macro 'fail' will occur.
      MACROS 1/Next macro label/#1
   MACROS 1/Directives/End conditional
   ... Can't add the negative offset, so negate it, and subtract it from the address.
   ... a) the failed add clobbers the offset with the address
      S/STRINGS/Get/Symbol value $020E
   ... b) negate the offset
      S/STRINGS/Maths functions/Negate
   ... c) store for subtraction in buffer C
      S/STRINGS/Swap with buffer/C
   ... d) put base address in accumulator
      S/STRINGS/Define string/Acm
         STORE "\eB"
   ... d) subtract offset (buffer C) from base address (accumulator)
      S/STRINGS/Maths functions/Subtract
         STORE "\eC"
   MACROS 1/Set macro label/#1
   
4. Go to the desired label address.
   C/CURSOR/Absolute/Specify offset $01AD [ctl]+[n]
      STORE "\e\e"      
      You will be asked to supply an offset representing how far from the start of
      the file, the cursor location should be. The number may be specified in
      hexadecimal, decimal, or binary. If hexadecimal, the string must start with
      "$", if binary, it must start with "%".3. Make a label if one does not currently exist.
5. Store the accumulator value in buffer A.   
   S/STRINGS/Swap with buffer/A
6. Create a "shop" label if one does not exist.
   MACROS 1/Directives/Start conditional
      S/STRINGS/Get/Label $0209
         -- Note that this does nothing.  It should fail and bail out to the replace label, but I dont't think it does.
         If there is a label defined at the cursor location, it will be copied to the
         accumulator.         
      L/LABELS/Create single/Label - fwd ref $0034 [F6]
         The current line of code will be searched for references to positions within
         the current file. If any are found, ReSource will make a decision on which
         type of data is at the position referenced. It will then set the
         data type (unless it has already been set), and create a label at that offset
         (unless a label has already been defined for that location). This new label
         will be immediately used for all references to that location, which of course
         includes the reference within the current line. If there are no references,
         or there is a reference, but it is outside of the range of the current file,
         then this function will do nothing. Normally, this function will only be
         used within macros, as the "PROJECT/Disassemble" normally will create all
         necessary labels.
      MACROS 1/Next macro label/#2
   MACROS 1/Directives/End conditional
7. If there is no label we arrived here.  So create a generic one OR ask the user.
   L/LABELS/Replace single/Label $0184 [F4]
      Create a "shop" label at the cursor position. A "shop" label is one that is
      9 characters long, begins with "lb", has the data type immediately following,
      and ends with the code offset. It may also be of some other length, and end
      with ".MSG".
      The "data type known" attribute will be set also.
8. Allow skipping replacing the label if there already is one.
   MACROS 1/Set macro label/#2
7. Return to last stored location on the stack.
   C/CURSOR/Absolute/Previous location $8x3F [leftarrow]
      "Pop" the cursor location from the top of the cursor location stack. If the
      stack is empty, a macro "fail" will result.
6. Build the symbol to put in the selected field on the current line in the accumulator.
   S/STRINGS/Define string/Acm
      STORE "\e0"
   S/STRINGS/Edit functions/Append $0208
      STORE "\eA"
      You will be asked to supply a string, which will be appended to (added to the
      end of) the accumulator, providing that the resulting string is no longer
      than 240 characters
   S/STRINGS/Edit functions/Append $0208
      STORE "\e-\e0"
   S/STRINGS/Edit functions/Append $0208
      STORE "\eB"
   S/STRINGS/Edit functions/Append $0208
      STORE "\e"
7. Put the accumulator as the symbol for the selected field on the current line.
   L/LABELS/Create single/Symbol $0359
      STORE "\e\e"
      You will be asked to supply a string, which will replace one of the numbers
      on the current line. A symbol may be created for the first, second, third of
      fourth number on the current line.

« Last Edit: January 18, 2016, 05:57:40 AM by copse »
Logged

bruceuncle

  • AMOS Dev
  • A500
  • *****
  • Karma: 6
  • Offline Offline
  • Gender: Male
  • Posts: 425
  • WINUAE Amiga User
Re: Amiga Resource Tips
« Reply #13 on: January 18, 2016, 12:54:50 PM »

Hey Copse, you've got the hang of it and you're writing macros.  Good stuff!
Resource calls it something like "dynamic string indirection".  It's important to understand that Resource will accept any string as a symbol but it doesn't attach any meaning to it other than plonking it into the symbol table.  The embedded escape-delimited offsets are effectively just markups that it knows it has to substitute stuff for.  The resulting symbol is only important to an assembler, not to Resource.
The easy way to do word or longword jump tables is to set the EA base address from the "*" menu (special functions).  Use one of the three available (#1, #2 or #3).  Then, for each offset in the table, select the corresponding"Use" command.  This does the same thing all in one stroke and creates the auto labels at the target addresses.  And don't forget that [spacebar] repeats the last command but ignores any relative cursor movement key strokes.  So when you've done the first entry in the table it's simply repeating [down arrow], [spacebar] to do the rest.
The EA address commands can give the impression that you're limited to just three jump tables.  But this is not the case.  Once the embedded symbol strings have been created, that's all they are, just strings.  The three sets of EA commands can be reset to new base addresses without disturbing anything you've already used them for.
The address register EA conversions are useful too.  They can also be restricted in scope to just apply to a defined part of the code.
If you haven't discovered them already, try switching the Ref Recognition, Auto Labels and Data Comments on and off in the Options 1 dialogue and watch what it does to the display.
I'm running off the bottom of Tapatalk, so to be continued when I'm next on my PC.

Sent from my Lumia 800 using Tapatalk
Logged
Repeat after me ...  "The AMOS Pro architecture is complex but it is not complicated."

bruceuncle

  • AMOS Dev
  • A500
  • *****
  • Karma: 6
  • Offline Offline
  • Gender: Male
  • Posts: 425
  • WINUAE Amiga User
Re: Amiga Resource Tips
« Reply #14 on: January 18, 2016, 01:11:20 PM »

And why does Tapatalk not log me  out properly?  So I have to go to the web site and log out there ( or more accurately here  ;) ).  Grrr!
Logged
Repeat after me ...  "The AMOS Pro architecture is complex but it is not complicated."
Pages: [1] 2   Go Up
 

TinyPortal 2.2.2 © 2005-2022