Jump to content

Photo

SPECTRA2 development thread


107 replies to this topic

#51 Willsy ONLINE  

Willsy

    Stargunner

  • 1,930 posts
  • Location:Uzbekistan (no, really!)

Posted Sun Oct 24, 2010 3:10 AM

HA HA HA HA HA!!!!!!

Spectra 2 just rocked my world!

Awesome job!

#52 rocky007 OFFLINE  

rocky007

    Moonsweeper

  • 395 posts
  • Location:Belgium

Posted Sun Oct 24, 2010 5:14 AM

Here's a little speech demo I did. I recorded my own voice using Audacity and then followed Marks' instructions to generate the required LPC data with QBOX.
Didn't spend too much time on it and it sounds rather rough :lol:
Then spectra2 was used for playing the speech sample.

Spoiler


Here's the ROM image for classic99 and MESS.
Again this comes without warranties.
It was tested on classic99 and on a real TI-99/4A with speech synth.



i made nightare with this devilish voice ;)

#53 retroclouds OFFLINE  

retroclouds

    Stargunner

  • Topic Starter
  • 1,366 posts
  • Location:Germany

Posted Mon Oct 25, 2010 12:30 PM

Here's the latest update on what I've been working on lately:

* Introduction of a 'kernel' thread. It does things like reading the keyboard & running the sound player. Can be turned of by setting a flag.
* Introduction of a user hook that runs after kernel thread, also controleable by a flag
* Exit code and FCTN-QUIT support for returning to TI title screen (also in regards to discussion in Y! group)
* vchar, hchar and some low-level utilities
* virual keyboard with support for 2nd joystick
* Speech splayer implemented
* Code for testing if PAL or NTSC.
* Automatically adjusting of timer scheduler based on PAL/NTSC flag.

I want to have the initial relase out in 2010. Really want to get back to game development.


What is currently missing is:

* Random function, I think there was a discussion about random functions on Atariage just a while ago. Have to check on that.
* code for turning memory word into string of digits (e.g. for displaying score)
* bank-switching code (but that's real easy)
* A few more graphic routines (display string in box, fill box)
* Keyboard scan routine (typewriter style)
* Speech player enhancement for using resident voice

Dunno if I'll have all this in the initial release. Some of it might appear in a 1.1 release.
All in all, I'm quite pleased with the way things have turned out, especially in terms of memory requirement & register usage.

Still have a lot of documentation to do. But I really want to start using spectra2 for doing actual game development :D

#54 retroclouds OFFLINE  

retroclouds

    Stargunner

  • Topic Starter
  • 1,366 posts
  • Location:Germany

Posted Mon Nov 1, 2010 12:33 PM

Time for an update: Memory and register usage has finally stabilized since the last two weeks.

I did a few more tweaks to the config register.
Basically I use state flags in some of the subroutines.

* Equates for CONFIG register
*--------------------------------------------------------------
* Configuration flags
* ===================
* 
* ; 15  Sound player: tune source       1=ROM/RAM      0=VDP MEMORY
* ; 14  Sound player: loop tune         1=yes          0=no
* ; 13  Sound player: on                1=yes          0=no (or pause)
* ; 12  Keyboard: mode                  1=real         0=virtual
* ; 11  Keyboard: ANY key pressed       1=yes          0=no
* ; 10  Keyboard: <<reserved>>          1=yes          0=no
* ; 09  Timer: Kernel thread enabled    1=yes          0=no
* ; 08  Timer: Block kernel thread      1=yes          0=no	
* ; 07  Timer: User hook enabled        1=yes          0=no	
* ; 06  Timer: Block user hook          1=yes          0=no
* ; 05  speech player: external voice   1=yes          0=no
* ; 04  Speech player: busy             1=yes          0=no
* ; 03  Speech player: on               1=yes          0=no
* ; 02  VDP9918 PAL version             1=yes(50)      0=no(60)
* ; 01  Subroutine state flag 1         1=on           0=off
* ; 00  Subroutine state flag 0         1=on           0=off
********@*****@*********************@**************************
PALON   EQU   >2000                 ; bit 2=1   (VDP9918 PAL version)
ENUSR   EQU   >0100                 ; bit 7=1   (Enable user hook)
ENKNL   EQU   >0040                 ; bit 9=1   (Enable kernel thread)


It's good to see that the pieces do actually fit together. I'm heading for a 1.0 release by the end of November.
The last few days I've been working on some VDP tile functions I really want to have in place.
The library code size is now at 1841 bytes. That's good because the goal is that library size is max. 2000 bytes for the 1.0 release.
That leaves 6000 bytes of game code in an 8K rom and due to the available functionality, game code will get a lot shorter.

As usual, the documentation currently is way behind, so I really have to do something about that :roll:

Edited by retroclouds, Mon Nov 1, 2010 12:34 PM.


#55 Opry99er OFFLINE  

Opry99er

    River Patroller

  • 3,616 posts
  • Location:Denver, CO

Posted Mon Nov 1, 2010 12:54 PM

Great stuff man!! I'm pretty excited. This looks VERY slick, and I'm positive it will make coding in assembly a breeze and a blast for many of us who dabble but haven't yet completed any projects in TMS9900. Thanks again!!

#56 retroclouds OFFLINE  

retroclouds

    Stargunner

  • Topic Starter
  • 1,366 posts
  • Location:Germany

Posted Tue Nov 9, 2010 12:57 PM

Work on spectra2 is coming along nicely. I did plenty of updates in the last week.
I completed the work on the runtime library initialisation and on most of the graphic routines.

It's now feature complete for the initial release.
Still not sure if the remaining features on my list will be implemented.
Guess it'll depend on the feedback and how I move along with further game development.

Today I started the work on the manual, pickung up the pieces where a left off with the initial spectra release.
Most likely I'll be doing a few tutorials to bring the ideas accross.

Here's my latest try on the "Hello World!" program.

********@*****@*********************@**************************
        AORG  >6000
*--------------------------------------------------------------
* Cartridge header
*--------------------------------------------------------------
GRMHDR  BYTE  >AA,1,1,0,0,0
        DATA  PROG
        BYTE  0,0,0,0,0,0,0,0
PROG    DATA  0
        DATA  RUNLIB
HW      BYTE  12
        TEXT  'HELLO WORLD!'
*--------------------------------------------------------------
* Include required files
*--------------------------------------------------------------
        COPY  "D:\Projekte\spectra2\tms9900\runlib.a99"        
*--------------------------------------------------------------
* SPECTRA2 startup options
*--------------------------------------------------------------
SPVMOD  EQU   GRAPH1                ; Video mode.   See VIDTAB for details.
SPFONT  EQU   FNOPT7                ; Font to load. See LDFONT for details.
SPFCLR  EQU   >F0                   ; Foreground/Background color for font.
SPFBCK  EQU   >08                   ; Screen background color.
***************************************************************
* Main 
********@*****@*********************@**************************
MAIN    BL    @PUTYX
        DATA  >0B0A,HW              ; Show "Hello World!" message on row >0B, column >0A
        B     @TMGR                 ; Handle FCTN-QUIT key, etc.
        END  

It might not be a big deal, but I'm pretty pleased with how short the actual assembly program is :)
There's actually quite a few things going on in the background upon program startup.

Looking at the cartridge header you see the label "RUNLIB".
That's the address of the routine that gets executed when option 2 is selected from the TI menu screen.

RUNLIB does the below steps:

  • Clear scratch-pad memory (256 bytes)
  • Determine if VDP is a PAL or NTSC
  • Copy some machine code into scratchpad
  • Determine TI-99/4A operating system version
  • Setup video (load video table, clear 16K of VRAM, load color table, load specified font from GROM)
  • Initialize registers, set some flags
  • Jump to MAIN (start of our program)

Here's what it looks like:

Posted Image

EDIT:
Looking at the screenshot you'll notice the different font used for the "HELLO WORLD!" message.
There is no font included in spectra2, it's the "FAT" special effect applied to the default TI font.
This is handled by the LDFONT subroutine that is called during the library initialisation.

I didn't plan on including any special effects, however sometimes99er's idea is just so plain brilliant
that I had to give it a shot. The nice thing is that it allows for a different font look and basically only requires
3 additional assembly instructions. Great job sometimes99er!

Here are the equates valid for SPFONT (see SPECTRA2 startup options)

FNOPT1  EQU   >0000                 ; LDFONT => Load TI title screen font
FNOPT2  EQU   >0006                 ; LDFONT => Load upper case font
FNOPT3  EQU   >000C                 ; LDFONT => Load upper/lower case font
FNOPT4  EQU   >0012                 ; LDFONT => Load lower case font
FNOPT5  EQU   >8000                 ; LDFONT => Load TI title screen font  & make fat
FNOPT6  EQU   >8006                 ; LDFONT => Load upper case font       & make fat
FNOPT7  EQU   >800C                 ; LDFONT => Load upper/lower case font & make fat
FNOPT8  EQU   >8012                 ; LDFONT => Load lower case font       & make fat


#57 Vorticon OFFLINE  

Vorticon

    Stargunner

  • 1,208 posts
  • Location:Eagan, MN, USA

Posted Tue Nov 9, 2010 1:35 PM

Work on spectra2 is coming along nicely. I did plenty of updates in the last week.
I completed the work on the runtime library initialisation and on most of the graphic routines.

It's now feature complete for the initial release.
Still not sure if the remaining features on my list will be implemented.
Guess it'll depend on the feedback and how I move along with further game development.

Excellent work! Are you going to make available a complete finalized package with documentation?

#58 sometimes99er OFFLINE  

sometimes99er

    River Patroller

  • 2,749 posts

Posted Tue Nov 9, 2010 3:41 PM

Hehe, very nice.

At first I thought it impossible to make any new or modify font with just a few instructions like that. Then I suddenly had a few ideas. Some dotted versions using also only 3 instructions in the loop (MOVB, SZCB and SWPB). Some shaky fonts. And some with something like wind traces. They were all more or less recognizable as fonts, not quite readable, and a few characters here and there really went belly up. Here's an example

Posted Image

#59 Opry99er OFFLINE  

Opry99er

    River Patroller

  • 3,616 posts
  • Location:Denver, CO

Posted Tue Nov 9, 2010 3:54 PM

Man am I impressed!!!! Wow!

You guys are really talented!!!

Filip, I still don't know how to run cartridge ROMs in Classic99... Could you give a detailed instruction set for how to make this happen?

#60 Tursi OFFLINE  

Tursi

    River Patroller

  • 2,574 posts
  • Location:BUR

Posted Wed Nov 10, 2010 5:24 AM

Owen, just two steps:

1) Make sure that the file(s) end with either C.BIN, D.BIN, or G.BIN (or any combination of that depending on how many files are in the cartridge). If they are in a zip file, unzip them.
2) Select Cartridge->User->Open, and select any of the files in the group. Classic99 will automatically find and load the rest of them.

If you have a different extension then you need a little more effort... the above naming convention is for V9T9 style ROMs. MESS now uses the RPK format, which you can rename to .ZIP and then extract the files from. If the file is a bank switched ROM then there's no default extension for that, so this approach doesn't work, and you have to add the cartridge to the INI file. But it would be easier to give a solid example of that, as you have to know exactly what the cartridge is to do it.

#61 Opry99er OFFLINE  

Opry99er

    River Patroller

  • 3,616 posts
  • Location:Denver, CO

Posted Wed Nov 10, 2010 1:04 PM

Thanks Tursi!! I'll try it out today. :)

#62 retroclouds OFFLINE  

retroclouds

    Stargunner

  • Topic Starter
  • 1,366 posts
  • Location:Germany

Posted Wed Nov 10, 2010 2:22 PM


Work on spectra2 is coming along nicely. I did plenty of updates in the last week.
I completed the work on the runtime library initialisation and on most of the graphic routines.

It's now feature complete for the initial release.
Still not sure if the remaining features on my list will be implemented.
Guess it'll depend on the feedback and how I move along with further game development.

Excellent work! Are you going to make available a complete finalized package with documentation?


Yes, that's the plan. To get a rough idea you might want to check the documentation on my previous version of the library.
http://spectra99.sou...ence_manual.pdf

#63 retroclouds OFFLINE  

retroclouds

    Stargunner

  • Topic Starter
  • 1,366 posts
  • Location:Germany

Posted Fri Nov 12, 2010 2:31 PM

ok, here's another spectra2 example program. This time we want to control a sprite using the keyboard or joystick 1.

http://www.youtube.com/watch?v=Ui1RFtNqBOs



Here's the code:

********@*****@*********************@**************************
        AORG  >6000
*--------------------------------------------------------------
* Cartridge header
*--------------------------------------------------------------
GRMHDR  BYTE  >AA,1,1,0,0,0
        DATA  PROG
        BYTE  0,0,0,0,0,0,0,0
PROG    DATA  0
        DATA  RUNLIB
MSG     BYTE  15
        TEXT  'MOVE THE SPRITE'
*--------------------------------------------------------------
* Include required files
*--------------------------------------------------------------
        COPY  "D:\Projekte\spectra2\tms9900\runlib.a99"        
*--------------------------------------------------------------
* SPECTRA2 startup options
*--------------------------------------------------------------
SPVMOD  EQU   GRAPH1                ; Video mode.   See VIDTAB for details.
SPFONT  EQU   FNOPT7                ; Font to load. See LDFONT for details.
SPFCLR  EQU   >A0                   ; Foreground/Background color for font.
SPFBCK  EQU   >01                   ; Screen background color.
*--------------------------------------------------------------
* Our constans and variables in scratchpad memory
*--------------------------------------------------------------
RAMSAT  EQU   >8340                 ; Copy of mini-SAT in RAM memory (6 bytes)
RAMTAB  EQU   >8346                 ; Timer table (4 bytes)
***************************************************************
* Main 
********@*****@*********************@**************************
MAIN    BL    @CPYM2M
        DATA  SPRITE,RAMSAT,6       ; Copy 6 bytes from ROM into scratchpad RAM
        BL    @CPYM2V
        DATA  >1000,PAT1,8          ; Dump sprite pattern
        BL    @PUTBOX
        DATA  >1503,>1A02,MSG1,EOL  ; Show text in box on row >15, col >03 with width >1A, height >02.
        MOV   @MYTAB,@WTITAB        ; Setup address of timer table
        BL    @MKSLOT
        DATA  >0002,MVBOX,EOL       ; Create new timer slot
        B     @TMGR                 ; Handle FCTN-QUIT key, timers, etc.        
***************************************************************
* Move sprite: This routine is called as timer slot from TMGR
********@*****@*********************@**************************
MVBOX   MOV   R11,R0                ; Save R11 in R0
        COC   @WBIT11,CONFIG        ; ANY key pressed ?
        JNE   MVBOX5                ; No, so exit
        MOV   @WVRTKB,R1            ; Get keyboard flags        
MVBOX1  COC   @KEY1,R1              ; Left ?
        JNE   MVBOX2
        SB    @BD2,@RAMSAT+1        ; X=X-2        
MVBOX2  COC   @KEY2,R1              ; Right ?
        JNE   MVBOX3
        AB    @BD2,@RAMSAT+1        ; X=X+2
MVBOX3  COC   @KEY3,R1              ; Up ?
        JNE   MVBOX4
        SB    @BD2,@RAMSAT          ; Y=Y-2        
MVBOX4  COC   @KEY4,R1              ; Down
        JNE   MVBOX5
        AB    @BD2,@RAMSAT          ; Y=Y+2
MVBOX5  BL    @CPYM2V               ; Dump copy of SAT to VDP SAT
        DATA  >0300,RAMSAT,6        ; ... R11 is overwritten 
        B     *R0                   ; ... so return using copy in R0
KEY1    DATA  K1LF                  ; Left
KEY2    DATA  K1RG                  ; Right
KEY3    DATA  K1UP                  ; Up
KEY4    DATA  K1DN                  ; Down        
***************************************************************
* Our constants
********@*****@*********************@**************************
MYTAB   DATA  RAMTAB                ; Location of timer table in scratchpad memory
SPRITE  DATA  >2020,>000F           ; Row >20, col >20, pattern >00, color white
        DATA  >0D00                 ; No more sprites
PAT1    DATA  >FF81,>8181,>8181,>81FF
MSG1    BYTE  52
        TEXT  'Use joystick 1 or keys    E,S,D,X for moving sprite'        
        END  


After the library has initialized the TI-99/4A (memory, VDP registers, etc), it automatically branches to MAIN.

This is what happens when MAIN is entered:


1) Copy 6 bytes from ROM into scratchpad memory location >8340.
This is our work copy of the SAT (Sprite Attribute Table), the table that keeps the sprite information.
2) Dump the sprite pattern from ROM to VDP RAM >1000. That is where the Sprite Pattern Table is located.
3) Put the message 'Use joystick 1 or keys ...' on screen
4) Setup a timer table in scratchpad memory at @>8346 and allocate timer slot >00 by using the MKSLOT routine.
The routine MVBOX should be called by the timer manager on every second tick. (That is 30 times per second on NTSC, 25 times per second on PAL).
5) Branch to TMGR, the thread scheduler.


Once the thread scheduler has taken over, it will continiously do the below steps:


1) Call the "kernel" thread that is responsible for keyboard scanning, running sound player, etc.
FYI: All options of the kernel thread can be controlled by various bits in the CONFIG register (R12).

2) Call our thread (MVBOX) in slot 0 on every second tick.


The MVBOX thread itself is really quite simple:


* It first checks if any key was pressed at all. It does that by checking a certain bit in the CONFIG register (R12).
If no key was pressed, then it just dumps the work copy of the SAT table to the real SAT table in VDP memory and exits.

* If a key was pressed, it verifies if it's one of the known keys (ESDX),
if it matches, it updates the Y & X positions in the SAT work copy and then dumps the work copy into the real SAT table in VDP memory.


Note: In spectra2 the joysticks automatically map to the corresponding keys. That is why we don't need any extra logic for scanning joysticks.

#64 Opry99er OFFLINE  

Opry99er

    River Patroller

  • 3,616 posts
  • Location:Denver, CO

Posted Fri Nov 12, 2010 4:32 PM

Wow!! :). Nice video Filip!!! This is so freaking cool. :)

Can't wait to get my hands on this package. :)

#65 Opry99er OFFLINE  

Opry99er

    River Patroller

  • 3,616 posts
  • Location:Denver, CO

Posted Fri Nov 12, 2010 4:37 PM

Question--- is this the entire source code for this program? It looks like a custom font and I didn't see any new fonts designed in the source.

Is "runlib" a set of routines outside this source code--- perhaps used during the assembly process....

#66 sometimes99er OFFLINE  

sometimes99er

    River Patroller

  • 2,749 posts

Posted Sat Nov 13, 2010 12:01 AM

It looks like a custom font and I didn't see any new fonts designed in the source.

SPFONT  EQU   FNOPT7                ; Font to load. See LDFONT for details.
See post #56 (at the bottom).

Is "runlib" a set of routines outside this source code--- perhaps used during the assembly process....

        COPY  "D:\Projekte\spectra2\tms9900\runlib.a99"    
Yep.

;)

#67 Opry99er OFFLINE  

Opry99er

    River Patroller

  • 3,616 posts
  • Location:Denver, CO

Posted Sat Nov 13, 2010 1:26 AM

Super exciting stuff. :) what will the TI world do when a floodgate of cart games comes streaming out of Spectra2?? :)

#68 retroclouds OFFLINE  

retroclouds

    Stargunner

  • Topic Starter
  • 1,366 posts
  • Location:Germany

Posted Sat Nov 13, 2010 3:46 AM

Super exciting stuff. :) what will the TI world do when a floodgate of cart games comes streaming out of Spectra2?? :)


Thanks, glad you like it ;)

If I'm honest I don't expect that many new cart games to appear though. Then again, you never know :)
Who could have dreamed the many great things that happened this year ??

The library is basically just providing a framework. You still have to do the actual game implementation,
but yes it does show that writing ROM based games running from scratchpad memory is not that difficult.
Currently I'm only bug-fixing the library. I could put it in the wild but I also realize that a lot
of the excitement depends on the quality of the manual and the tutorials. There is still a lot of work needed for that.

So, what do you guys think?

Should spectra2 be released after documentation is ready or would you guys prefer a work-in-progress version,
without a proper documentation ?

I still have many plans for spectra2. It would be cool if some kind of higher-level language could be used for writing
the actual game code. The current memory requirements leave enough space in scratchpad for making this possible.
Thinking about Strawberry here, hint hint.

I've also been toying with the idea for writing a small interpreter myself, just for the fun of it. But I have way too many stuff
going and not enough time.

ok, enough rambling for now. Trying to take one step at a time :)

EDIT: Thinking about the manual. Perhaps for starters it's enough to describe memory, register usage,
startup flags, etc. and give some examples. For an assembler coder, the routines itself shouldn't
be that hard to understand. I tried to comment as good as I can :rolling:

Edited by retroclouds, Sat Nov 13, 2010 3:50 AM.


#69 Opry99er OFFLINE  

Opry99er

    River Patroller

  • 3,616 posts
  • Location:Denver, CO

Posted Sat Nov 13, 2010 8:43 AM

I'd like to get a working BETA copy--- whatever docs you have. :)

I'd love to just get familiar with your layout and libraries. :).

#70 sometimes99er OFFLINE  

sometimes99er

    River Patroller

  • 2,749 posts

Posted Sat Nov 13, 2010 1:12 PM

Super exciting stuff. :) what will the TI world do when a floodgate of cart games comes streaming out of Spectra2?? :)

As I see, and I may be wrong, but no hardware or software has ever opened any floodgate of games on the TI since they left it in 1984.

Sometimes I too get caught up in a dream about more colors, more sprites, more RAM, faster CPU etc., but then I already got all that on later (Amiga) or present machine (PC), and more importantly - it wouldn't be the TI-99/4A format/config I once knew/fell in love with.

:)

Edited by sometimes99er, Sat Nov 13, 2010 1:37 PM.


#71 sometimes99er OFFLINE  

sometimes99er

    River Patroller

  • 2,749 posts

Posted Sat Nov 13, 2010 1:29 PM

I still have many plans for spectra2. It would be cool if some kind of higher-level language could be used for writing
the actual game code. The current memory requirements leave enough space in scratchpad for making this possible.
Thinking about Strawberry here, hint hint.

I would like Strawberry to do the compile process automatically. Does WinAsm99 allow for that ? Right now I'm almost coding and wiring 9900 routines by hand. There's a smell of spaghetti bolognese.

:party:

#72 retroclouds OFFLINE  

retroclouds

    Stargunner

  • Topic Starter
  • 1,366 posts
  • Location:Germany

Posted Sat Nov 13, 2010 1:44 PM


I still have many plans for spectra2. It would be cool if some kind of higher-level language could be used for writing
the actual game code. The current memory requirements leave enough space in scratchpad for making this possible.
Thinking about Strawberry here, hint hint.

I would like Strawberry to do the compile process automatically. Does WinAsm99 allow for that ? Right now I'm almost coding and wiring 9900 routines by hand. There's a smell of spaghetti bolognese.

:party:


Yeah, that's what I'd like to see too. In that case you would need an assembler working in the background as part of Strawberry.
Don't think that Winasm99 takes command line parameters. I seem to recall that Tursi built an executable file for simulating a click on the assemble button. But I could be mistaking...

However you could work in small steps. An in-between version of Strawberry that generates assembler source code.
In a later revision you could then include your own assembler.
Writing an assembler is a bigger task, but it's not impossible. I started working on an assembler written in Perl (see the "booster" thread). I Already got pretty far, but then I got distracted again with Tutankham, Spectra2 and a million other things.
That's actually a project I want to pickup again. Dunno if I would do the final version in Perl, but it's great for hacking.

oh, you also might want to take a look at the AS macro assembler. It also targets the TMS9900
Check here: http://john.ccac.rwt...0/as/as_EN.html

#73 Opry99er OFFLINE  

Opry99er

    River Patroller

  • 3,616 posts
  • Location:Denver, CO

Posted Sat Nov 13, 2010 2:27 PM

Well, as long as you're only using symbolic addressing, wouldn't it be possible to just add AORG >6000 to the top of your source code to make it cartridge-compatible?

That's way over-simplifying, I'm sure... Just curious. :)

#74 sometimes99er OFFLINE  

sometimes99er

    River Patroller

  • 2,749 posts

Posted Sat Nov 13, 2010 2:52 PM

oh, you also might want to take a look at the AS macro assembler. It also targets the TMS9900
Check here: http://john.ccac.rwt...0/as/as_EN.html

Forgot all about it. Thanks for reminding me ! :)

Edited by sometimes99er, Sat Nov 13, 2010 3:36 PM.


#75 sometimes99er OFFLINE  

sometimes99er

    River Patroller

  • 2,749 posts

Posted Sat Nov 13, 2010 2:55 PM

Well, as long as you're only using symbolic addressing, wouldn't it be possible to just add AORG >6000 to the top of your source code to make it cartridge-compatible?

That's way over-simplifying, I'm sure... Just curious. :)

I'm not sure what you're commenting. Besides AORG >6000, there has to be a cartridge header. :)




0 user(s) are browsing this forum

0 members, 0 guests, 0 anonymous users