Jump to content
IGNORED

xdt99: New TI 99 cross-development tools available


ralphb

Recommended Posts

  • 2 weeks later...

OK, just slightly overdue, but I finally managed to release a new version of xdt99.

 

The release adds the xbas99 tool as another piece of the puzzle. xbas99 can list TI BASIC and TI Extended BASIC programs and conversely create program files from BASIC listings. (It was surprisingly difficult to re-create the exact output of the BASIC LIST command in terms of spacing -- not that this would be strictly required, but it added some fun.)

 

Other minor improvements include more flexible E/A5 image generation in xas99 and simplified handling of multiple files in xdm99/xvm99.

 

Download is available on GitHub.

  • Like 2
Link to comment
Share on other sites

OK, just slightly overdue, but I finally managed to release a new version of xdt99.

 

The release adds the xbas99 tool as another piece of the puzzle. xbas99 can list TI BASIC and TI Extended BASIC programs and conversely create program files from BASIC listings. (It was surprisingly difficult to re-create the exact output of the BASIC LIST command in terms of spacing -- not that this would be strictly required, but it added some fun.)

 

Other minor improvements include more flexible E/A5 image generation in xas99 and simplified handling of multiple files in xdm99/xvm99.

 

Download is available on GitHub.

This is very fascinating as a project tool. Why is the GPL command SLL reversed?

 

Also in my RXB GPL Source code I use AORG often as I always hated filling in zeros to pad that area.

Many address in the XB Cart must use the same address as the ROMs are hard coded for those address.

 

It sucks that they can not be changed and have to be patched, but that is why I use AORG so much.

 

So if I use this tool I will have to make some major changes to the GPL Source code?

Link to comment
Share on other sites

Rich, I suspect the most important question here is: which GPL assembler does the code conform to? Code written for the original TI GPL assembler doesn't work fully with the third party GPL assemblers without some modification. The same applies here--if it isn't using the same GPL assembler syntax as the one you are comfortable with, some changes would be necessary to get your code to work on it. How many different versions of GPL assemblers are out there? I know there was the one from TI (for which we have a fully documented manual but no assembler), the one from Ryte Data (also sold in Germany as the Weiand GPL assembler), the RAG GPL assembler, and at least one other I can't remember the name of right now.

  • Like 1
Link to comment
Share on other sites

Rich, I suspect the most important question here is: which GPL assembler does the code conform to? Code written for the original TI GPL assembler doesn't work fully with the third party GPL assemblers without some modification. The same applies here--if it isn't using the same GPL assembler syntax as the one you are comfortable with, some changes would be necessary to get your code to work on it. How many different versions of GPL assemblers are out there? I know there was the one from TI (for which we have a fully documented manual but no assembler), the one from Ryte Data (also sold in Germany as the Weiand GPL assembler), the RAG GPL assembler, and at least one other I can't remember the name of right now.

Well I do use the Ryte Data one almost exclusively but there is also besides the ones you listed the Swedish GPL Assember (Nouspikel version)

 

I just need to practice with your new tool.

Edited by RXB
Link to comment
Share on other sites

This diversity of GPL specifications was the reason that I did not care about compatibility in TIImageTool but invented my own format. :) However, I already thought about an option to choose between different dialects.

Well think about this.

The Object Code is always the same except for the loaders.

Compressed is normally the standard loader and from there they are pretty much the same.

Link to comment
Share on other sites

Preferable format? Ryte? RAG?

 

The TI GPL Assembler allowed for some interesting degree of structured programming. I'm not sure whether it really relied on that style, or whether it was possible to write pure assembly-like GPL code. Anyway, no one has TI's GPL assembler, right?

Link to comment
Share on other sites

I suspect that most post-TI GPL code is in the Ryte Data (Weiand) GPL assmebler format. I asked Dave Pitts whether he had ever seen a copy of the TI GPL assembler out in the wild--he had not. With that, we only have the manual. I haven't seen a lot done in the RAG format, although it may be out there and I just haven't seen it.

 

The SDS MAC Assembler, on the other hand, is out there. So it is still possible to work directly with the 990 assembly source code generated internally by TI for the /4A, although some of their later source code was done in TI Editor Assembler format.

Link to comment
Share on other sites

Preferable format? Ryte? RAG?

 

The TI GPL Assembler allowed for some interesting degree of structured programming. I'm not sure whether it really relied on that style, or whether it was possible to write pure assembly-like GPL code. Anyway, no one has TI's GPL assembler, right?

Yea the TI GPL Assember only worked on the 990 as I saw a copy on Don Blazer's one he had in his basement.

He also had the blank TI GROM boards to make Carts, but not the Burners needed for the GROMs they used.

Link to comment
Share on other sites

Rich, I suspect the most important question here is: which GPL assembler does the code conform to?

 

Well, I wasn't sure which syntax style is most commonly used either, so I decided to support those variants that I could find. The default is Ryte Data, but you can also select RAG and mizapf style with the -s option (sorry, Michael, you're canon now). They're all fairly similar, the biggest differences being FMT statements and address formats.

 

Another option I looked at is the Heiner Martin style. Maybe I'll add support for it eventually as some kind of tribute to Heiner's work. And I opted not to support the original TI assembler style as specified in the GPL Guide, as the format seemed rather arcane.

 

 

This is very fascinating as a project tool. Why is the GPL command SLL reversed?

Also in my RXB GPL Source code I use AORG often as I always hated filling in zeros to pad that area.

 

The AORG directive should be supported in all styles. Isn't it working for you?

As for the SLL statement -- You're absolutely correct that I reversed the arguments for the shift operations compared to the GPL Guide. I was under the impression that all available GPL assemblers do that -- also note that it is more consistent with all the other instructions, which are always SOURCE, DEST rather than DEST, SOURCE.

 

But maybe that was a fluke, and only one (dis)assembler actually reverses the order -- I'm looking at you, TI Image Tool! ;-) Anyway, thanks for the hint, I'll check and update xga99. After all, you should be able to assemble existing sources with the new tool with hardly any modifications.

Link to comment
Share on other sites

I followed the TI GPL assembler which has <operation> <src> <dest> order (which is consistent with our 9900 assembler). However, this introduces one inconsistency, namely with some compare instructions (e.g. CGE) where the operands are compared in the reverse order of the 9900 architecture.

 

I actually did not plan to create code that shall be put into a GPL assembler again, as I was not sure about symbolic addressing and some more.

Link to comment
Share on other sites

However, this introduces one inconsistency, namely with some compare instructions (e.g. CGE) where the operands are compared in the reverse order of the 9900 architecture.

 

Oh, I didn't even notice that, but you're right. That's the business of the interpreter, though; for the assembler, it's still Cxx <src>,<dest>.

 

But for SLL et al. the original syntax specifies SLL <dest>,<src>, and at least the Ryte Data assembler took the liberty of swapping the arguments. That's what xga99 does as well; I was actually motivated by Ryte Data about this change.

 

So, as an example, the snippet

CEQ 1,@>8300
SLL 1,@>8300

is assembled to

 

00000000  d6 00 01 e2 00 01                                 |......|

by both xga99 and Ryte Data. The TI Image Tool disassembles it back to

 

0000: CEQ   >01,@>8300
0003: SLL   >01,@>8300
so I don't actually see any mismatch in syntax or semantics between the three tools.
Link to comment
Share on other sites

 

Well, I wasn't sure which syntax style is most commonly used either, so I decided to support those variants that I could find. The default is Ryte Data, but you can also select RAG and mizapf style with the -s option (sorry, Michael, you're canon now). They're all fairly similar, the biggest differences being FMT statements and address formats.

 

Another option I looked at is the Heiner Martin style. Maybe I'll add support for it eventually as some kind of tribute to Heiner's work. And I opted not to support the original TI assembler style as specified in the GPL Guide, as the format seemed rather arcane.

 

 

 

The AORG directive should be supported in all styles. Isn't it working for you?

As for the SLL statement -- You're absolutely correct that I reversed the arguments for the shift operations compared to the GPL Guide. I was under the impression that all available GPL assemblers do that -- also note that it is more consistent with all the other instructions, which are always SOURCE, DEST rather than DEST, SOURCE.

 

But maybe that was a fluke, and only one (dis)assembler actually reverses the order -- I'm looking at you, TI Image Tool! ;-) Anyway, thanks for the hint, I'll check and update xga99. After all, you should be able to assemble existing sources with the new tool with hardly any modifications.

Hnmm that is backwards. You are thinking the Heiner Martin GPL Disassembly as all of those are backwards.

 

RXB is the ORIGINAL XB GPL Source code here is a sample of the RXB GROM 5 (>A000)

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0001 
Version 2.0 (Weiand 1985)     Options : LCSFPF                                  
[0001]               ***********************************************************
[0002]                      TITL 'RXB 2015'
[0003]               ***********************************************************
[0004]                      GROM >A000
[0005]               ***********************************************************
[0006]                      TITL 'EQUATES EXEC-359'
[0007]               ***********************************************************
[0008]               *           GROM ADDRESSES
[0009]               ***********************************************************
[0010]               *    EQUATES FOR ROUTINES FROM OTHER GROM SECTIONS
[0011]               * GROM >0000
[0012] 0022          GRINT  EQU  >0022             Greatest integer
[0013]               * GROM >6000 EQUATES
[0014] 6016          SPRINT EQU  >6016             Initialize sprites
[0015] 6018          CHRTBL EQU  >6018             RXB CALL CHRTBL load char set
[0016] 601A          TOPL10 EQU  >601A             Return to main and re-init
[0017] 601C          CHRTAB EQU  >601C             Load default character set
[0018] 601E          SZRUN  EQU  >601E
[0019] 6022          KILSYM EQU  >6022             KILL SYMBOL TABLE ROUTINE
[0020] 602E          AUTO1  EQU  >602E             Get arguments for LIST comman
[0021] 6030          TOPL02 EQU  >6030             RTN address for failing AUTOL
[0022] 6032          EDITLN EQU  >6032             Edit a line into the program
[0023] 6034          GRSUB1 EQU  >6034             Read data (2 bytes) from ERAM
[0024] 6036          GWSUB  EQU  >6036             Write a few bytes of data to
[0025] 6048          MSGBRK EQU  >6048             * BREAKPOINT
[0026] 6053          MSGTA  EQU  >6053             Message "try again"
[0027] 6372          TOPLEV EQU  >6372             RXB CALL USER branch
[0028] 6A78          CHKEND EQU  >6A78             Check end of statement
[0029] 6A7C          DISO   EQU  >6A7C
[0030] 6A7E          ENTER  EQU  >6A7E
[0031] 6A80          ENT09  EQU  >6A80
[0032] 6A82          WARNZZ EQU  >6A82             WARNING MESSAGE ROUTINE
[0033] 6A84          ERRZZ  EQU  >6A84             ERROR MESSAGE ROUTINE
[0034] 6A84          ERRZ   EQU  >6A84             ERRor routine
[0035] 6A86          READL1 EQU  >6A86             Read a line from keyboard
[0036] 63A5          SZNEW  EQU  >63A5             RXB CALL NEW branch
[0037] 63DD          TOPL15 EQU  >63DD             RXB CALL USER branch
[0038] 65C9          SZSIZE EQU  >65C9             RXB CALL SIZE branch
[0039]               * GROM >8000
[0040] 8000          DISPL1 EQU  >8000
[0041] 8002          DELET  EQU  >8002
[0042] 8004          PRINT  EQU  >8004
[0043] 8006          INPUT  EQU  >8006
[0044] 8008          OPEN   EQU  >8008
[0045] 800A          CLOSE  EQU  >800A
[0046] 800C          RESTOR EQU  >800C
[0047] 800E          NREAD  EQU  >800E
[0048] 8012          CLSALL EQU  >8012             RXB branch
[0049] 801C          EOF    EQU  >801C
[0050] 801E          ACCEPT EQU  >801E
[0051] 8020          SRDATA EQU  >8020
[0052] 8022          REC    EQU  >8022
[0053] 802C          GRSUB2 EQU  >802C
[0054] 802E          GRSUB3 EQU  >802E
[0055] 8030          LINPUT EQU  >8030
[0056] 9CEA          CHARS  EQU  >9CEA             RXB Character Definitions
[0057]               * GROM >E000
[0058] E025          GE025  EQU  >E025             RXB branch EA module
[0059]               ***********************************************************
[0060]               *    Equates for XMLs
[0061] 0000          SYNCHK EQU  >00               SYNCHK XML selector
[0062] 0001          FILSPC EQU  >01               Fill-space utility
[0063] 0001          PARCOM EQU  >01               PARse to a COMma selector
[0064] 0002          CSTRIN EQU  >02               Copy-string utility
[0065] 0002          RANGE  EQU  >02               RANGE selector

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0002 
EQUATES EXEC-359
[0066] 0003          SEETWO EQU  >03               SEETWO XML selector
[0067] 0006          FADD   EQU  >06               Floating ADD
[0068] 0008          FMUL   EQU  >08               Floating MULtiply
[0069] 0009          FDIV   EQU  >09               Floating DIVide
[0070] 000A          FCOMP  EQU  >0A               Floating COMPare
[0071] 000B          SADD   EQU  >0B               Stack ADD
[0072] 000C          SSUB   EQU  >0C               Stack SUBtract
[0073] 0010          CSNUM  EQU  >10               Convert String to Number
[0074] 0012          CFI    EQU  >12               Convert to two byte integer
[0075] 0012          FLTINT EQU  >12               Convert floating to integer
[0076] 0070          COMPCT EQU  >70               PREFORM A GARBAGE COLLECTION
[0077] 0071          GETSTR EQU  >71               SYSTEM GET STRING
[0078] 0072          MEMCHK EQU  >72               MEMORY check routine: VDP
[0079] 0073          XCNS   EQU  >73               Convert number to string
[0080]               * Warning Defualt changfd in >0079
[0081] 0074          PARSE  EQU  >74               Parse a value
[0082] 0075          CONT   EQU  >75               Continue parsing
[0083] 0076          EXECG  EQU  >76               Execute a XB stmt or program
[0084] 0077          VPUSH  EQU  >77               Push on value stack
[0085] 0078          VPOP   EQU  >78               Pop off value stack
[0086] 0079          PGMCHR EQU  >79               GET PROGRAM CHARACTER
[0087] 007A          SYM    EQU  >7A               Find SYMBOL entry
[0088] 007B          SMB    EQU  >7B               Find symbol table entry
[0089] 007C          ASSGNV EQU  >7C               Assign VARIABLE
[0090] 007D          SCHSYM EQU  >7D               Search symbol table
[0091] 007E          SPEED  EQU  >7E               SPEED UP XML
[0092] 007F          CRUNCH EQU  >7F               Crunch an input line
[0093] 0080          CIF    EQU  >80               Convert INTEGER to FLOATING P
[0094] 0082          RTNB   EQU  >82               Return
[0095] 0083          SCROLL EQU  >83               SCROLL THE SCREEN
[0096] 0084          IO     EQU  >84               IO utility (KW table search)
[0097] 0085          GREAD  EQU  >85               READ DATA FROM ERAM
[0098] 0086          GWRITE EQU  >86               WRITE DATA TO ERAM
[0099] 0087          DELREP EQU  >87               REMOVE CONTENT FROM VDP/ERAM
[0100] 0088          MVDN   EQU  >88               MOVE DATA IN VDP/ERAM
[0101] 0089          MVUP   EQU  >89               MOVE DATA IN VDP/ERAM
[0102] 008A          VGWITE EQU  >8A               MOVE DATA FROM VDP TO ERAM
[0103] 008B          GVWITE EQU  >8B               WRITE DATA FROM GRAM TO VRAM
[0104] 008C          GREAD1 EQU  >8C               READ DATA FROM ERAM
[0105] 008E          GDTECT EQU  >8E               ERAM DETECT&ROM PAGE 1 ENABLE
[0106] 008F          SCNSMT EQU  >8F               SCAN STATEMENT FOR PRESCAN
[0107]               ***********************************************************
[0108]               *    Temporary workspaces in EDIT
[0109] 8300          VAR0   EQU  >8300            TEMPORARY
[0110] 8300          SP00   EQU  >8300            SPRITE value
[0111] 8300          PTFBSL EQU  >8300            Ptr to 1st byte in SPEAK list
[0112] 8300          PHLEN  EQU  >8300            PHrom data LENgth
[0113] 8301          VARV   EQU  >8301            TEMPORARY
[0114] 8301          PHRADD EQU  >8301            PHRom ADDress
[0115] 8302          ACCUM  EQU  >8302            # OF BYTES ACCUMULATOR (4 BYTE
[0116] 8302          STPT   EQU  >8302            TWO BYTES
[0117] 8302          MNUM   EQU  >8302            Ussually a counter
[0118] 8302          AAA1   EQU  >8302
[0119] 8302          SP02   EQU  >8302            SPRITE value
[0120] 8302          PTLBSL EQU  >8302            Ptr to last byte in SPEAK list
[0121] 8304          VARY   EQU  >8304
[0122] 8304          PABPTR EQU  >8304            Pointer to current PAB
[0123] 8304          SP04   EQU  >8304            SPRITE value
[0124] 8304          PTEBSL EQU  >8304            Ptr to end byte in SPEAK list
[0125]               * NOTE: PTEBSL points to the end of the temporary speak lis
[0126]               *       whereas PTLBSL points to the last byte actually use
[0127]               *       i.e.    PTFBSL <= PTLBSL <= PTEBSL
[0128] 8306          VARY2  EQU  >8306            Use in MVDN only
[0129] 8306          DFLTLM EQU  >8306            Default array limit (10)

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0003 
EQUATES EXEC-359
[0130] 8306          CCPPTR EQU  >8306            OFFSET WITHIN RECORED (1)
[0131]               *                             or Pointer to current column
[0132] 8306          SP06   EQU  >8306            SPRITE value
[0133] 8306          PTFCIS EQU  >8306            Ptr to 1st character in string
[0134] 8307          RECLEN EQU  >8307            LENGTH OF CURRENT RECORD (1)
[0135] 8308          CCPADR EQU  >8308            RAM address of current refs
[0136]               *                             or Actual buffer address or c
[0137] 8308          VARC   EQU  >8308
[0138] 8308          CCPADD EQU  >8308            RAM address of current color
[0139] 8308          CCC1   EQU  >8308
[0140] 8308          SPSAL  EQU  >8308            Location of sprite attribute l
[0141] 8308          PTCCIS EQU  >8308            Ptr to current character in st
[0142] 830A          CALIST EQU  >830A            Call list for resolving refs
[0143] 830A          RAMPTR EQU  >830A            Pointer for crunching
[0144] 830A          STADDR EQU  >830A            Start address - usually for co
[0145] 830A          SPTMP  EQU  >830A            Temporary variable
[0146] 830A          PTLCIS EQU  >830A            Ptr to last character in strin
[0147] 830B          VAR2   EQU  >830B
[0148] 830C          BYTES  EQU  >830C            BYTE COUNTER
[0149]               *                             or String length for GETSTR
[0150] 830C          NMPTR  EQU  >830C            Pointer save for pscan
[0151] 830C          BBB1   EQU  >830C
[0152] 830C          PTFCIP EQU  >830C            Ptr to 1st character in phrase
[0153] 830E          CHSAV  EQU  >830E
[0154] 830E          CURINC EQU  >830E            Increment for auto-num mode
[0155] 830E          VAR4   EQU  >830E
[0156] 830E          PTCCIP EQU  >830E            Ptr to current character in ph
[0157] 8310          TOPSTK EQU  >8310            Top of data stack pointer
[0158] 8310          VAR5   EQU  >8310            VAR5 through VAR5+3 used in RA
[0159] 8310          PTLCIP EQU  >8310            Ptr to last character in phras
[0160] 8311          VAR6   EQU  >8311
[0161] 8312          LINUM  EQU  >8312            Used to determine end of scan
[0162] 8312          PTFBPH EQU  >8312            Ptr to 1st byte in PHrom
[0163] 8312          VAR7   EQU  >8312            Used in CHARLY
[0164] 8312          STRPTR EQU  >8312            RXB PATCH CODE
[0165] 8314          NMLEN  EQU  >8314            Current line for auto-num
[0166] 8314          CURLIN EQU  >8314            Current line for auto-num
[0167]               *                             or Starting line number for L
[0168] 8314          PTCCPH EQU  >8314            Ptr to current byte in PHrom
[0169] 8314          VAR9   EQU  >8314             Used in CHARLY
[0170] 8316          XFLAG  EQU  >8316            SCAN FLAG-BITS USED AS BELOW
[0171] 8316          PTLCPH EQU  >8316            Ptr to last byte in PHrom
[0172] 8317          DSRFLG EQU  >8317            INTERNAL =60, EXTERNAL =0 (1)
[0173] 8317          OPTFLG EQU  >8317            Option flag byte during OPEN
[0174] 8317          FORNET EQU  >8317            Nesting level of for/next
[0175] 8317          FNUM   EQU  >8317            Current file number for search
[0176]               ***********************************************************
[0177]               *    Permanent workspace variables
[0178] 8318          STRSP  EQU  >8318            String space begining
[0179] 831A          STREND EQU  >831A            String space ending
[0180] 831C          SREF   EQU  >831C            Temporary string pointer
[0181] 831E          SMTSRT EQU  >831E            Start of current statement
[0182] 8320          VARW   EQU  >8320            Screen address (CURSOR)
[0183] 8322          ERRCOD EQU  >8322            Return error code from ALC
[0184] 8324          STVSPT EQU  >8324            Value-stack base
[0185] 8326          RTNG   EQU  >8326            Return vector from 9900 code
[0186] 8328          NUDTAB EQU  >8328            Start of NUD table
[0187] 832A          VARA   EQU  >832A            Ending display location
[0188] 832C          PGMPTR EQU  >832C            Program text pointer (TOKEN)
[0189] 832E          EXTRAM EQU  >832E            Line number table pointer
[0190] 8330          STLN   EQU  >8330            Start of line number table
[0191] 8332          ENLN   EQU  >8332            End of line number table
[0192] 8334          DATA   EQU  >8334            Data pointer for READ
[0193] 8336          LNBUF  EQU  >8336            Line table pointer for READ

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0004 
EQUATES EXEC-359
[0194] 8338          INTRIN EQU  >8338            Add of intrinsic poly constant
[0195] 833A          SUBTAB EQU  >833A            Subprogram symbol table
[0196] 833C          IOSTRT EQU  >833C            PAB list/Start of I/O chain
[0197] 833E          SYMTAB EQU  >833E            Symbol table pointer
[0198] 8340          FREPTR EQU  >8340            Free space pointer
[0199] 8342          CHAT   EQU  >8342            Current charater/token
[0200] 8343          BASE   EQU  >8343            OPTION BASE value
[0201] 8344          PRGFLG EQU  >8344            Program/imperative flag
[0202] 8345          FLAG   EQU  >8345            General 8-bit flag
[0203] 8346          BUFLEV EQU  >8346            Crunch-buffer destruction leve
[0204] 8348          LSUBP  EQU  >8348            Last subprogram block on stack
[0205]               * FAC  EQU  >834A            Floating-point ACcurmulator
[0206] 834A          CCHAR  EQU  >834A            Current character
[0207] 834B          FAC1   EQU  FAC+1
[0208] 834B          SPLFLG EQU  >834B            SPelL out phrase FLaG
[0209] 834C          FAC2   EQU  FAC+2
[0210] 834C          AAA    EQU  FAC+2
[0211] 834C          TOTTIM EQU  >834C            TOTal wait TIMe
[0212]               * NOTE: DATAD must follow immediately after TOTTIM. The
[0213]               *       routine STDATA is counting on this fact!
[0214] 834D          FAC3   EQU  FAC+3
[0215] 834D          DATAAD EQU  >834D            Speech DATA ADdress
[0216] 834E          FAC4   EQU  FAC+4
[0217] 834E          CCC    EQU  FAC+4
[0218] 834E          FFF    EQU  FAC+4
[0219] 834F          FAC5   EQU  FAC+5
[0220] 834F          PTLCIL EQU  >834F            Pointer To Last Character In L
[0221] 8350          FAC6   EQU  FAC+6
[0222] 8350          BBB    EQU  FAC+6
[0223] 8350          EEE    EQU  FAC+6
[0224] 8351          FAC7   EQU  FAC+7
[0225] 8351          TIMLEN EQU  >8351             TIMe LENgth of timing charact
[0226] 8352          FAC8   EQU  FAC+8
[0227] 8352          PHADDR EQU  >8352             PHrom ADDRess
[0228] 8353          FAC9   EQU  FAC+9
[0229] 8354          FAC10  EQU  FAC+10
[0230] 8354          DDD1   EQU  FAC+10
[0231] 8354          TEMP1  EQU  >8354            TEMPorary CPU location 1
[0232] 8355          FAC11  EQU  FAC+11
[0233] 8356          FAC12  EQU  FAC+12
[0234] 8356          FFF1   EQU  FAC+12
[0235] 8356          TEMP2  EQU  >8356            TEMPorary CPU location 2
[0236] 8357          FAC13  EQU  FAC+13
[0237] 8358          FAC14  EQU  FAC+14
[0238] 8358          EEE1   EQU  FAC+14
[0239] 8358          READ   EQU  >8358            Address of speech peripheral
[0240]               *                             READ byte interface
[0241] 8359          FAC15  EQU  FAC+15
[0242] 835A          FAC16  EQU  FAC+16
[0243] 835A          WRITE  EQU  >835A            Address of speech peripheral
[0244]               *                             WRITE byte interface
[0245] 835B          FAC17  EQU  FAC+17
[0246]               * ARG  EQU  >835C            Floating-point ARGument
[0247] 835D          ARG1   EQU  ARG+1
[0248] 835D          PHDATA EQU  >835D            PHrom DATA
[0249] 835E          ARG2   EQU  ARG+2
[0250] 835E          PTCBED EQU  >835E            Ptr To Current Byte Ext Data
[0251] 835F          ARG3   EQU  ARG+3
[0252] 8360          ARG4   EQU  ARG+4
[0253] 8360          LENCST EQU  >8360            LEN of Current ext data STring
[0254] 8361          ARG5   EQU  ARG+5
[0255] 8362          ARG6   EQU  ARG+6
[0256] 8362          LENWST EQU  >8362            LEN of Whole ext data STring
[0257] 8363          ARG7   EQU  ARG+7

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0005 
EQUATES EXEC-359
[0258] 8364          ARG8   EQU  ARG+8
[0259] 8364          STRLEN EQU  >8364            STRing LENgth
[0260] 8364          TEMP4  EQU  >8364
[0261] 8366          TEMP5  EQU  >8366
[0262]               * NOTE: BYTE1, BYTE2, and BYTE3 must be in consecutive memo
[0263]               *       locations, and in the following order for SPGET to
[0264]               *       work!
[0265] 8366          BYTE1  EQU  >8366            BYTE 1
[0266] 8367          BYTE2  EQU  >8367            BYTE 2
[0267] 8368          BYTE3  EQU  >8368            BYTE 3
[0268] 8368          TEMP6  EQU  >8368
[0269] 8369          SPKSTS EQU  >8369            SPeaK StaTus
[0270]               * FPERAD EQU  >836C          Value stack pointer
[0271] 8367          ARG11  EQU  ARG+11
[0272] 836B          ARG15  EQU  ARG+15
[0273] 836C          ARG16  EQU  ARG+16
[0274]               * VSPTR  EQU  >836E          Value stack pointer
[0275]               ***********************************************************
[0276]               *    GPL Status Block
[0277] 8370          HIVDP  EQU  >8370             Highest VDP Available
[0278]               * SUBSTK EQU  >8373           SUBROUTINE STACK
[0279] 8374          KEYBD  EQU  >8374             KEYBOARD SELCTION
[0280] 8375          RKEY   EQU  >8375             KEY CODE
[0281] 8376          EXPZ   EQU  >8376             Exponent in floating-point
[0282] 8376          JOYY   EQU  >8376             JOYSTICK Y POSITION
[0283] 8377          JOYX   EQU  >8377             JOYSTICK X POSITION
[0284] 8378          RANDOM EQU  >8378             RANDOM NUMBER GENERATOR
[0285] 8379          TIMER  EQU  >8379             TIMING REGISTER
[0286] 837A          MOTION EQU  >837A             NUMBER OF MOVING SPRITES
[0287] 837B          VDPSTS EQU  >837B             VDP STATUS REGISTER
[0288] 837B          VDPSTT EQU  >837B             VDP STATUS REGISTER
[0289] 837C          ERCODE EQU  >837C             STATUS REGISTER
[0290] 837D          CB     EQU  >837D             Character Buffer
[0291]               ***********************************************************
[0292] 8384          RAMTOP EQU  >8384            Highest address in ERAM
[0293] 8386          RAMFRE EQU  >8386            Free pointer in the ERAM
[0294] 8388          RSTK   EQU  >8388            Subroutine stack base
[0295]               *                             (Starts at >8A)
[0296] 8389          RAMFLG EQU  >8389            ERAM flag
[0297] 8389          GRAMFL EQU  >8389            GRAM / VDP flag
[0298] 83AF          STKMIN EQU  >83AF            Base of data stack
[0299] 83BD          STKMAX EQU  >83BD            Top of data stack
[0300] 83CE          PRTNFN EQU  >83CE            Sound - previous tone finished
[0301]               ***********************************************************
[0302]               *    VDP addresses
[0303] 02E0          SCRNBS EQU  >02E0             Screen base addr for last lin
[0304] 02E2          NLNADD EQU  >02E2             New LiNe ADDress
[0305] 02FE          ENDSCR EQU  >02FE             END of SCReen address
[0306] 0300          SPRSAL EQU  >0300             Sprite attribute list
[0307] 0371          LODFLG EQU  >0371             Auto-boot flag
[0308] 0372          START  EQU  >0372             Line to start execution at
[0309]               * Temporary
[0310] 0374          NOTONE EQU  >0374             NO-TONE for SIZE in ACCEPT us
[0311]               *                              in FLMGRS (4 bytes used)
[0312] 0376          SYMBOL EQU  >0376             Saved symbol table pointer
[0313] 0378          ONECHR EQU  >0378             Used for CHRZ
[0314] 0379          VRMSND EQU  >0379             Sound blocks
[0315] 0382          SPGMPT EQU  >0382             Saved PGMPTR for continue
[0316] 0384          SBUFLV EQU  >0384             Saved BUFLEV for contiue
[0317] 0386          SEXTRM EQU  >0386             Saved EXTRAM for continue
[0318] 0388          SAVEVP EQU  >0388             Saved VSPRT for continue
[0319] 038A          ERRLN  EQU  >038A             On-error line pointer
[0320] 0390          CSNTMP EQU  >0390             Use as temporary stored place
[0321]               *                          or CSN TEMPORARY FOR FAC12

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0006 
EQUATES EXEC-359
[0322] 0392          TABSAV EQU  >0392             Saved main symbol table ponte
[0323] 0394          AUTTMP EQU  >0394             AUTOLD TEMPORARY IN SIDE ERRZ
[0324] 0396          SLSUBP EQU  >0396             Saved LSUBP for continue
[0325] 0398          SFLAG  EQU  >0398             Saved on-warning/break bits
[0326] 039A          SSTEMP EQU  >039A             To save subprogram program ta
[0327] 039C          SSTMP2 EQU  >039C             Same as above. Used in SUBPRO
[0328] 039E          MRGPAB EQU  >039E             MERGEd temporary for pab ptr
[0329] 03A0          RNDX2  EQU  >03A0             Random number generator seed
[0330] 03A5          RNDX1  EQU  >03A5             Random number generator seed
[0331] 03AA          INPUTP EQU  >03AA             INPUT TEMPORARY FOR PTR TO PR
[0332] 03AA          SPNUM  EQU  >03AA             Sprite number temporary, also
[0333]               *                              in INPUTP in FLMGR
[0334] 03AC          ACCVRW EQU  >03AC             Temoporary used in ERRZZ, als
[0335]               *                              used in FLMGRS
[0336]               *                             or temporary for @VARW, @VARA
[0337] 03AE          ACCVRA EQU  >03AE             TRY AGAIN
[0338] 03B0          VALIDP EQU  >03B0             Use as two values passing fro
[0339]               *                          or PTR TO STANDARD STRING IN VAL
[0340] 03B2          VALIDL EQU  >03B2             VALIDATE code to READL1
[0341]               *                          or Length of string in validate
[0342] 03B4          SIZCCP EQU  >03B4             SIZE TEMPORARY FOR CCPADR
[0343] 03B6          SIZREC EQU  >03B6             SIZE TEMPORARY FOR RECLEN
[0344]               *
[0345] 03B7          ACCTRY EQU  >03B7             ACCEPT "TRY AGAIN" FLAG
[0346] 03B8          SIZXPT EQU  >03B8             Save XPT in SIZE when "try ag
[0347] 03BA          CSNTP1 EQU  >03BA             CSN TEMPORARY FOR FAC10
[0348]               *
[0349] 03BC          OLDTOP EQU  >03BC             Temporary used in ERRZZ, also
[0350]               *                          or Old top of memory for RELOCA
[0351] 03BC          CPTEMP EQU  >03BC             CCPPTR, RECLEN temp in INPUT
[0352] 03BE          NEWTOP EQU  >03BE             New top of memory for RELOCA
[0353] 03C0          VROAZ  EQU  >03C0             Temporary roll-out area
[0354] 07FF          SPRVB  EQU  >07FF             Sprite velocity block.
[0355] 0820          CRNBUF EQU  >0820             CRuNch BUFfer address
[0356] 08BE          CRNEND EQU  >08BE             CRuNch buffer END
[0357] 0958          VRAMVS EQU  >0958             Default base of value stack
[0358]               ***********************************************************
[0359]               *    IMMEDITATE VALUES
[0360] 0000          NUMBR  EQU  >00               NUMERIC validate
[0361] 0002          LISTZ  EQU  >02
[0362] 0003          X2     EQU  >03
[0363] 0005          OLDZ   EQU  >05
[0364] 0006          RESEQZ EQU  >06
[0365] 0007          SAVEZ  EQU  >07
[0366] 0008          MERGEZ EQU  >08
[0367] 000A          DWNARR EQU  >0A
[0368] 000B          UPARR  EQU  >0B
[0369] 000D          CHRTN  EQU  >0D
[0370] 0020          BKGD   EQU  >20               BACKGROUND CHARACTER
[0371] 0060          OFFSET EQU  >60               OFFSET FOR VIDEO TABLES
[0372] 0065          STRVAL EQU  >65               Value in accum. is string val
[0373]               ***********************************************************
[0374]               * Editting command equates & keys or symbols
[0375] 0002          BREAK  EQU  >02               Break key
[0376] 0003          DLETE  EQU  >03               Delete key
[0377] 0004          INSRT  EQU  >04               Insert key
[0378] 0006          RECALL EQU  >06               Edit-buffer recall
[0379] 0007          CLRLN  EQU  >07               Clear-line key
[0380] 0008          BACK   EQU  >08               Back-space key
[0381] 0009          FORW   EQU  >09               Forward-space key
[0382] 000A          DOWN   EQU  >0A               Down-arrow key
[0383] 000B          UPMV   EQU  >0B               Up-arrow key
[0384] 001C          VWIDTH EQU  >1C               Screen width (PRINT)
[0385] 0020          SPACE  EQU  >20               Space key

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0007 
EQUATES EXEC-359
[0386] 0022          QUOTE  EQU  >22               "
[0387] 0023          NUMBER EQU  >23               #
[0388] 0024          DOLLAR EQU  >24               $
[0389] 007E          CURSOR EQU  >1E+OFFSET        CURSOR
[0390] 007F          EDGECH EQU  >1F+OFFSET        EDGE character
[0391] 002B          PLUS   EQU  >2B               +
[0392] 002C          COMMAT EQU  >2C               ,
[0393] 002D          MINUS  EQU  >2D               -
[0394] 002D          HYPEN  EQU  >2D               +
[0395] 002E          PERIOD EQU  >2E               .
[0396] 0030          ZERO   EQU  >30               0
[0397] 0039          NINE   EQU  >39               9
[0398] 003A          COLON  EQU  >3A               :
[0399] 003B          SEMICO EQU  >3B               ;
[0400] 003C          LESS   EQU  >3C               <
[0401] 003E          GREAT  EQU  >3E               >
[0402] 0041          A      EQU  >41               A
[0403] 0046          F      EQU  >46               F
[0404]               ***********************************************************
[0405]               *    BASIC TOKEN TABLE
[0406]               *      EQU  >80               spare token
[0407] 0081          ELSEZ  EQU  >81               ELSE
[0408] 0082          SSEPZ  EQU  >82               ::
[0409] 0083          TREMZ  EQU  >83               $
[0410] 0084          IFZ    EQU  >84               IF
[0411] 0085          GOZ    EQU  >85               GO
[0412] 0086          GOTOZ  EQU  >86               GOTO
[0413] 0087          GOSUBZ EQU  >87               GOSUB
[0414] 0088          RETURZ EQU  >88               RETURN
[0415] 0089          DEFZ   EQU  >89               DEF
[0416] 008A          DIMZ   EQU  >8A               DIM
[0417] 008B          ENDZ   EQU  >8B               END
[0418] 008C          FORZ   EQU  >8C               FOR
[0419] 008D          LETZ   EQU  >8D               LET
[0420] 008E          BREAKZ EQU  >8E               BREAK
[0421] 008F          UNBREZ EQU  >8F               UNBREAK
[0422] 0090          TRACEZ EQU  >90               TRACE
[0423] 0091          UNTRAZ EQU  >91               UNTRACE
[0424] 0092          INPUTZ EQU  >92               INPUT
[0425] 0093          DATAZ  EQU  >93               DATA
[0426] 0094          RESTOZ EQU  >94               RESTORE
[0427] 0095          RANDOZ EQU  >95               RANDOMIZE
[0428] 0096          NEXTZ  EQU  >96               NEXT
[0429] 0097          READZ  EQU  >97               READ
[0430] 0098          STOPZ  EQU  >98               STOP
[0431] 0099          DELETZ EQU  >99               DELETE
[0432] 009A          REMZ   EQU  >9A               REM
[0433] 009B          ONZ    EQU  >9B               ON
[0434] 009C          PRINTZ EQU  >9C               PRINT
[0435] 009D          CALLZ  EQU  >9D               CALL
[0436] 009E          OPTIOZ EQU  >9E               OPTION
[0437] 009F          OPENZ  EQU  >9F               OPEN
[0438] 00A0          CLOSEZ EQU  >A0               CLOSE
[0439] 00A1          SUBZ   EQU  >A1               SUB
[0440] 00A2          DISPLZ EQU  >A2               DISPLAY
[0441] 00A3          IMAGEZ EQU  >A3               IMAGE
[0442] 00A4          ACCEPZ EQU  >A4               ACCEPT
[0443] 00A5          ERRORZ EQU  >A5               ERROR
[0444] 00A6          WARNZ  EQU  >A6               WARNING
[0445] 00A7          SUBXTZ EQU  >A7               SUBEXIT
[0446] 00A8          SUBNDZ EQU  >A8               SUBEND
[0447] 00A9          RUNZ   EQU  >A9               RUN
[0448] 00AA          LINPUZ EQU  >AA               LINPUT
[0449]               *      EQU  >AB               spare token (LIBRARY)

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0008 
EQUATES EXEC-359
[0450]               *      EQU  >AC               spare token (REAL)
[0451]               *      EQU  >AD               spare token (INTEGER)
[0452]               *      EQU  >AE               spare token (SCRATCH)
[0453]               *      EQU  >AF               spare token
[0454] 00B0          THENZ  EQU  >B0               THEN
[0455] 00B1          TOZ    EQU  >B1               TO
[0456] 00B2          STEPZ  EQU  >B2               STEP
[0457] 00B3          COMMAZ EQU  >B3               ,
[0458] 00B4          SEMICZ EQU  >B4               ;
[0459] 00B5          COLONZ EQU  >B5               :
[0460] 00B6          RPARZ  EQU  >B6               )
[0461] 00B7          LPARZ  EQU  >B7               (
[0462] 00B8          CONCZ  EQU  >B8               &          (CONCATENATE)
[0463]               *      EQU  >B9               spare token
[0464] 00BA          ORZ    EQU  >BA               OR
[0465] 00BB          ANDZ   EQU  >BB               AND
[0466] 00BC          XORZ   EQU  >BC               XOR
[0467] 00BD          NOTZ   EQU  >BD               NOT
[0468] 00BE          EQUALZ EQU  >BE               =
[0469] 00BF          LESSZ  EQU  >BF               <
[0470] 00C0          GREATZ EQU  >C0               >
[0471] 00C1          PLUSZ  EQU  >C1               +
[0472] 00C2          MINUSZ EQU  >C2               -
[0473] 00C3          MULTZ  EQU  >C3               *
[0474] 00C4          DIVIZ  EQU  >C4               /
[0475] 00C5          CIRCUZ EQU  >C5               ^
[0476]               *      EQU  >C6               spare token
[0477] 00C7          STRINZ EQU  >C7               QUOTED STRING
[0478] 00C8          UNQSTZ EQU  >C8               UNQUOTED STRING
[0479] 00C8          NUMZ   EQU  >C8               ALSO NUMERICAL STRING
[0480] 00C8          NUMCOZ EQU  >C8               ALSO UNQUOTED STRING
[0481] 00C9          LNZ    EQU  >C9               LINE NUMBER CONSTANT
[0482]               *      EQU  >CA               spare token
[0483] 00CB          ABSZ   EQU  >CB               ABS
[0484] 00CC          ATNZ   EQU  >CC               ATN
[0485] 00CD          COSZ   EQU  >CD               COS
[0486] 00CE          EXPZZ  EQU  >CE               EXP
[0487] 00CF          INTZ   EQU  >CF               INT
[0488] 00D0          LOGZ   EQU  >D0               LOG
[0489] 00D1          SGNZZ  EQU  >D1               SGN
[0490] 00D2          SINZ   EQU  >D2               SIN
[0491] 00D3          SQRZ   EQU  >D3               SQR
[0492] 00D4          TANZ   EQU  >D4               TAN
[0493] 00D5          LENZ   EQU  >D5               LEN
[0494] 00D6          CHRZZ  EQU  >D6               CHR$
[0495] 00D7          RNDZ   EQU  >D7               RND
[0496] 00D8          SEGZZ  EQU  >D8               SEG$
[0497] 00D9          POSZ   EQU  >D9               POS
[0498] 00DA          VAL    EQU  >DA               VAL
[0499] 00DB          STRZZ  EQU  >DB               STR$
[0500] 00DC          ASCZ   EQU  >DC               ASC
[0501] 00DD          PIZ    EQU  >DD               PI
[0502] 00DE          RECZ   EQU  >DE               REC
[0503] 00DF          MAXZ   EQU  >DF               MAX
[0504] 00E0          MINZ   EQU  >E0               MIN
[0505] 00E1          RPTZZ  EQU  >E1               RPT$
[0506]               *      EQU  >E2               unused
[0507]               *      EQU  >E2               unused
[0508]               *      EQU  >E3               unused
[0509]               *      EQU  >E4               unused
[0510]               *      EQU  >E5               unused
[0511]               *      EQU  >E6               unused
[0512]               *      EQU  >E7               unused
[0513] 00E8          NUMERZ EQU  >E8               NUMERIC

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0009 
EQUATES EXEC-359
[0514] 00E9          DIGITZ EQU  >E9               DIGIT
[0515] 00EA          UALPHZ EQU  >EA               UALPHA
[0516] 00EB          SIZEZ  EQU  >EB               SIZE
[0517] 00EC          ALLZ   EQU  >EC               ALL
[0518] 00ED          USINGZ EQU  >ED               USING
[0519] 00EE          BEEPZ  EQU  >EE               BEEP
[0520] 00EF          ERASEZ EQU  >EF               ERASE
[0521] 00F0          ATZ    EQU  >F0               AT
[0522] 00F1          BASEZ  EQU  >F1               BASE
[0523]               *      EQU  >F2               spare token (TEMPORARY)
[0524] 00F3          VARIAZ EQU  >F3               VARIABLE
[0525] 00F4          RELATZ EQU  >F4               RELATIVE
[0526] 00F5          INTERZ EQU  >F5               INTERNAL
[0527] 00F6          SEQUEZ EQU  >F6               SEQUENTIAL
[0528] 00F7          OUTPUZ EQU  >F7               OUTPUT
[0529] 00F8          UPDATZ EQU  >F8               UPDATE
[0530] 00F9          APPENZ EQU  >F9               APPEND
[0531] 00FA          FIXEDZ EQU  >FA               FIXED
[0532] 00FB          PERMAZ EQU  >FB               PERMANENT
[0533] 00FC          TABZ   EQU  >FC               TAB
[0534] 00FD          NUMBEZ EQU  >FD               #
[0535] 00FE          VALIDZ EQU  >FE               VALIDATE
[0536]               *      EQU  >FF               ILLEGAL VALUE
[0537]               *****************************************************
[0538]               ***********************************************************
[0539]               * NOTE: FILES EXECSD, SUBS AND PART OF PSCANS ARE IN GROM 5
[0540]               *       AS BELOW:
[0541]               *-------NAME------------------ADDRESS---------BYTES LEFT---
[0542]               *      EXECS                  >A000 - >AD92        5
[0543]               *      SUBS                   >AD98 - >B4DC        2
[0544]               *      PSCANS                 >B4E0 - >B7FA        5
[0545]               *
[0546]               * Some of the error calls at the end of EXECS file are
[0547]               * shared and directly addressed by SUBS file. Any change in
[0548]               * EXECS file which affects the address of error calls will
[0549]               * affect error reference in SUBS file. Make sure to edit
[0550]               * SUBS file in that situation.
[0551]               ***********************************************************
[0552] A000 0F,75           XML  CONT              XML CONT used by subprogram
[0553] A002 43,FB           BR   LITS05            Build FAC entry and GETSTR
[0554] A004 40,9C           BR   EXEC              Execute a program
[0555] A006 48,D3           BR   LINE
[0556] A008 48,6E           BR   DATAST
[0557] A00A 48,8A           BR   ASC
[0558] A00C 40,A9           BR   EXEC1
[0559] A00E 41,2B           BR   EXEC6D            Save information on a break
[0560] A010 48,0A           BR   DELINK            Delink symbol table entry
[0561] A012 48,E5           BR   CONV1
[0562] A014 49,FC           BR   SQUISH            Called in error routine in PS
[0563] A016 45,71           BR   VALCD
[0564] A018 42,8D           BR   INTRND
[0565] A01A 40,1A           BR   $
[0566] A01C 4B,1A    GA01C  BR   LNKRTN            Routine to go back to XB prog
[0567] A01E 49,89    GA01E  BR   SPCOL             Clear breakpoint in line # ro
[0568] A020 46,FC           BR   UBSUB             Spare
[0569] A022 40,22           BR   $
[0570] A024 40,24           BR   $         ***     Please let me know it you add
[0571]               *                     ***     branches here since it will a
[0572]               *                     ***     the address of link list. Sum
[0573] A026 A0,30    LINK1  DATA LINK2
[0574] A028 05,53,4F        STRI 'SOUND'           SOUND
       A02B 55,4E,44
[0575] A02E AA,3E           DATA XSOUND
[0576] A030 A0,3A    LINK2  DATA LINK3

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0010 
EQUATES EXEC-359
[0577] A032 05,43,4C        STRI 'CLEAR'           CLEAR
       A035 45,41,52
[0578] A038 AA,18           DATA CLEAR
[0579] A03A A0,44    LINK3  DATA LINK4
[0580] A03C 05,43,4F        STRI 'COLOR'           COLOR
       A03F 4C,4F,52
[0581] A042 A9,1D           DATA COLOR
[0582] A044 A0,4E    LINK4  DATA LINK5
[0583] A046 05,47,43        STRI 'GCHAR'           GCHAR 
       A049 48,41,52
[0584] A04C A8,FA           DATA GCHAR
[0585] A04E A0,58    LINK5  DATA LINK6
[0586] A050 05,48,43        STRI 'HCHAR'           HCHAR
       A053 48,41,52
[0587] A056 AB,03           DATA HCHAR
[0588] A058 A0,62    LINK6  DATA LINK7
[0589] A05A 05,56,43        STRI 'VCHAR'           VCHAR 
       A05D 48,41,52
[0590] A060 AB,26           DATA VCHAR
[0591] A062 A0,6B    LINK7  DATA LINKA
[0592] A064 04,43,48        STRI 'CHAR'            CHAR 
       A067 41,52
[0593] A069 AB,46           DATA CHARLY
[0594] A06B A0,73    LINKA  DATA LINKB
[0595] A06D 03,4B,45        STRI 'KEY'             KEY
       A070 59
[0596] A071 BC,FD           DATA ZKEY
[0597] A073 A0,7D    LINKB  DATA LINKC
[0598] A075 05,4A,4F        STRI 'JOYST'           JOYST
       A078 59,53,54
[0599] A07B BE,15           DATA ZJOYST
[0600] A07D A0,88    LINKC  DATA LINKD
[0601] A07F 06,53,43        STRI 'SCREEN'          KEY
       A082 52,45,45
       A085 4E
[0602] A086 AC,C9           DATA BORDER
[0603] A088 A0,94    LINKD  DATA LINKE
[0604] A08A 07,56,45        STRI 'VERSION'         VERSION
       A08D 52,53,49
       A090 4F,4E
[0605] A092 AA,1F           DATA VERS
[0606] A094 AE,00    LINKE  DATA LINKS1
[0607] A096 03,45,52        STRI 'ERR'             ERR
       A099 52
[0608] A09A AC,F9           DATA ERRWXY
[0609]               ***********************************************************
[0610]               *        START EXECUTION OF A PROGRAM OR STATEMENT
[0611]               * DATA:
[0612]               *      RAM(START) points into line number table at the
[0613]               *      first line to execute
[0614]               *      @PGMFLG contains >FF if executing a program or zero
[0615]               *      if imperative statement
[0616]               ***********************************************************
[0617] A09C 8E,44    EXEC   CZ   @PRGFLG           If program
[0618] A09E 60,AE           BS   GA0AE
[0619] A0A0 BD,2E,A3        DST  V@START,@EXTRAM   Line to start execution at
       A0A3 72
[0620] A0A4 95,2E           DINCT @EXTRAM          Pointer to text pointer
[0621] A0A6 06,A2,8D        CALL INTRND            Initialize random number
[0622] A0A9 BE,7F,03 EXEC1  ST   X2,@XPT           Initialize screen display
[0623] A0AC 40,B2           BR   GA0B2
[0624] A0AE BF,2C,08 GA0AE  DST  CRNBUF,@PGMPTR    Executing out of crunch buffe
       A0B1 20
[0625] A0B2 BF,26,A0 GA0B2  DST  EXEC20,@RTNG      Address of return from ALC

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0011 
EQUATES EXEC-359
       A0B5 BC
[0626] A0B6 BF,28,A1        DST  NUDTB,@NUDTAB     NUD table address for ALC
       A0B9 47
[0627] A0BA 0F,76           XML  EXECG             Execute XB
[0628] A0BC 8A,23    EXEC20 CASE @ERRCOD+1         Check type of return
[0629] A0BE 40,DF           BR   EXECND            0 - NORMAL END
[0630] A0C0 41,1A           BR   EXECBK            1 - BREAKPOINT
[0631] A0C2 40,ED           BR   EXECTR            2 - TRACE
[0632] A0C4 48,AB           BR   ERORZ             3 - ERROR
[0633] A0C6 40,D4           BR   WARNGZ            4 - WARNING
[0634] A0C8 41,DA           BR   ONERR             5 - ON ERROR
[0635] A0CA 47,17           BR   UDF               6 - FUNCTION
[0636] A0CC 42,18           BR   ONBRK             7 - ON BREAK
[0637] A0CE 44,38           BR   CONCAT            8 - CONCATENATE STRINGS "&"
[0638] A0D0 41,AA           BR   ONWARN            9 - ON WARNING
[0639] A0D2 42,2F           BR   GPLCAL            A - CALL STATEMENT
[0640] A0D4 C6,73,B0 WARNGZ CH   >B0,@SUBSTK
[0641] A0D7 6D,CA           BS   ERRSO
[0642]               * Stack overflow
[0643]               *                    ALLOW ROOM ON STACK FOR WARNING CALLS
[0644] A0D9 06,6A,82 WRNN01 CALL WARNZZ        ONLY WARNING MSG FROM XB SUPPORT
[0645] A0DC 02              BYTE 2       *         NUMERIC OVERFLOW
[0646] A0DD 41,16           BR   CLRRTN            Clear ERRCOD and return
[0647]               *                    NORMAL END OF EXECUTION
[0648] A0DF 8E,44    EXECND CZ   @PRGFLG           If imperative mode
[0649] A0E1 40,E9           BR   ERRRDY
[0650] A0E3 06,60,1C        CALL CHRTAB            Load the default character se
[0651] A0E6 05,63,DD        B    TOPL15            Return to top-level
[0652] A0E9 06,6A,84 ERRRDY CALL ERRZZ             Display * READY *
[0653] A0EC 00              BYTE 0
[0654]               * TRACE-MODE turned on - display line number
[0655] A0ED 86,20    EXECTR CLR  @VARW             Clear upper address byte
[0656] A0EF BC,21,7F        ST   @XPT,@VARW+1      Get current x-pointer
[0657] A0F2 A3,20,02        DADD NLNADD-3,@VARW    Make a valid screen address
       A0F5 DF
[0658] A0F6 C7,20,02        DCH  NLNADD+22,@VARW   If might go off screen
       A0F9 F8
[0659] A0FA 41,02           BR   GA102
[0660] A0FC 0F,83           XML  SCROLL            SCROLL to next line
[0661] A0FE BF,20,02        DST  NLNADD,@VARW      Re-initialize screen address
       A101 E2
[0662] A102 BE,B0,20 GA102  ST   LESS+OFFSET,V*VARW Display open bracket "("
       A105 9C
[0663] A106 91,20           DINC @VARW             Increment screen address
[0664] A108 06,A8,8A        CALL ASC               Convert line # into ASCII
[0665] A10B BE,B0,20        ST   GREAT+OFFSET,V*VARW Display close bracket ")"
       A10E 9E
[0666] A10F A7,20,02        DSUB NLNADD-4,@VARW    Update the x-pointer
       A112 DE
[0667] A113 BC,7F,21        ST   @VARW+1,@XPT
[0668] A116 87,22    CLRRTN DCLR @ERRCOD           Clear the return vector
[0669] A118 0F,82           XML  RTNB              Return to ALC
[0670]               * BREAKPOINT OR BREAK-KEY RECIEVED
[0671] A11A 8E,44    EXECBK CZ   @PRGFLG           If break or program
[0672] A11C 61,43           BS   ERRBRK
[0673] A11E BD,52,2E        DST  @EXTRAM,@FAC8     @FAC8 : Source addr in ERAM
[0674] A121 97,52           DDECT @FAC8            Point to the line #
[0675] A123 06,A7,0C        CALL UBSUB1            Reset the breakpoint
[0676] A126 03              SCAN                   Get break key out of queue
[0677] A127 BD,A3,82 EXEC6C DST  @PGMPTR,V@SPGMPT  Save text pointer
       A12A 2C
[0678] A12B BD,A3,86 EXEC6D DST  @EXTRAM,V@SEXTRM  Save line number table pointe
       A12E 2E
[0679] A12F BD,A3,88        DST  @VSPTR,V@SAVEVP   Save value stack pointer

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0012 
EQUATES EXEC-359
       A132 6E
[0680] A133 BD,A3,84        DST  @BUFLEV,V@SBUFLV  Save crunch buffer level
       A136 46
[0681] A137 BD,A3,96        DST  @LSUBP,V@SLSUBP   Save last subprogram on stack
       A13A 48
[0682] A13B BC,A3,98        ST   @FLAG,V@SFLAG     Save FLAG for continue
       A13E 45
[0683] A13F B2,A3,98        AND  >63,V@SFLAG       Only warning and break bits
       A142 63
[0684] A143 06,6A,84 ERRBRK CALL ERRZZ             * BREAKPOINT
[0685] A146 01              BYTE 1
[0686]               ***********************************************************
[0687]               *               NUD / STATEMENT BRANCH TABLE
[0688]               ***********************************************************
[0689] A147 41,89    NUDTB  BR   RECX              'RECORD'              0
[0690] A149 46,8B           BR   NBREAK            'BREAK'               0
[0691] A14B 46,9D           BR   NUNBRK            'UNBREAK'             0
[0692] A14D 46,81           BR   NTRACE            'TRACE'               0
[0693] A14F 46,86           BR   NUNTRC            'UNTRACE'             0
[0694] A151 41,8C           BR   NREADX            'READ'                0
[0695] A153 41,8F           BR   PRINTX            'PRINT'               0
[0696] A155 41,86           BR   SZRUNX            'RUN'                 0
[0697] A157 41,A7           BR   LINPUX            Reserved for LINPUT   1
[0698] A159 41,92           BR   RESTOX            'RESTORE'             1
[0699] A15B 43,7F           BR   NRNDMZ            'RANDOMIZE'           1
[0700] A15D 41,95           BR   INPUTX            'INPUT'               1
[0701] A15F 41,98           BR   OPENX             'OPEN'                1
[0702] A161 41,9B           BR   CLOSEX            'CLOSE'               1
[0703] A163 42,48           BR   NPI               'PI'                  1
[0704] A165 42,58           BR   NMAX              'MAX'                 1
[0705] A167 42,65           BR   NMIN              'MIN'                 2
[0706] A169 46,28           BR   RPTZ01            'RPT$'                2
[0707] A16B 41,9E           BR   ACCEPX            'ACCEPT'              2
[0708] A16D 41,83           BR   EOFX              'EOF'                 2
[0709] A16F 45,1A           BR   ASC01             'ASC'                 2
[0710] A171 45,BD           BR   POS01             'POS'                 2
[0711] A173 45,55           BR   VAL01             'VAL'                 2
[0712] A175 45,2B           BR   STRZ01            'STR$'                2
[0713] A177 44,90           BR   SEGZ01            'SEG$'                3
[0714] A179 41,A4           BR   DELETX            'DELETE'              3
[0715] A17B 41,A1           BR   DISPLX            'DISPLAY'             3
[0716] A17D 44,F3           BR   LEN01             'LEN'                 3
[0717] A17F 44,FF           BR   CHRZ01            'CHR$'                3
[0718]               *RXB PATCH CODE FOR BASIC RND REPLACEMENT ***********
[0719] A181 42,AF           BR   NRND              'RND'                 3      
[0720]               * The following are long branches to another GROM
[0721] A183 05,80,1C EOFX   B    EOF
[0722] A186 05,60,1E SZRUNX B    SZRUN
[0723] A189 05,80,22 RECX   B    REC
[0724] A18C 05,80,0E NREADX B    NREAD
[0725] A18F 05,80,04 PRINTX B    PRINT
[0726] A192 05,80,0C RESTOX B    RESTOR
[0727] A195 05,80,06 INPUTX B    INPUT
[0728] A198 05,80,08 OPENX  B    OPEN
[0729] A19B 05,80,0A CLOSEX B    CLOSE
[0730] A19E 05,80,1E ACCEPX B    ACCEPT
[0731] A1A1 05,80,00 DISPLX B    DISPL1
[0732] A1A4 05,80,02 DELETX B    DELET
[0733] A1A7 05,80,30 LINPUX B    LINPUT
[0734]               ***********************************************************
[0735]               * FLAGS USED IN EXECUTION MODE:    this needs to be checked
[0736]               *  @FLAG   BIT   RESET               SET
[0737]               *           0
[0738]               *           1    Warning PRINT       PRINT off

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0013 
EQUATES EXEC-359
[0739]               *           2    Warning NEXT        STOP
[0740]               *           3    Not in UDF          Executing a UDF
[0741]               *           4    TRACE mode          Normal mode
[0742]               *           5
[0743]               *           6    BREAK allowed       BREAK not allowed
[0744]               *           7    No LST/EDT protect  LIST/EDIT protected
[0745]               ***********************************************************
[0746]               * ON WARNING {NEXT | STOP | PRINT}
[0747]               * ON WARNING NEXT  - Causes warning messages to be ignored
[0748]               *                    and execution to continue as if a
[0749]               *                    warning never occurred
[0750]               * ON WARNING STOP  - Causes a warning to be treated as an
[0751]               *                    error - i.e. the message is displayed
[0752]               *                    and execution is halted
[0753]               * ON WARNING PRINT - Causes the default warning handling to
[0754]               *                    be in effect, i.e. any warning
[0755]               *                    messages are printed and execution
[0756]               *                    continues
[0757]               ***********************************************************
[0758] A1AA 0F,79    ONWARN XML  PGMCHR            GET OPTION
[0759] A1AC D6,42,9C        CEQ  PRINTZ,@CHAT      If print
[0760] A1AF 41,B7           BR   GA1B7
[0761] A1B1 B2,45,F9        AND  >F9,@FLAG         Turn on print and contiue
[0762] A1B4 05,A1,CF        B    ONWRN5
[0763] A1B7 D6,42,98 GA1B7  CEQ  STOPZ,@CHAT
[0764] A1BA 41,C4           BR   GA1C4
[0765] A1BC B2,45,FD        AND  >FD,@FLAG         Turn on print
[0766] A1BF B6,45,04        OR   >04,@FLAG         Turn on stop
[0767] A1C2 41,CF           BR   ONWRN5
[0768] A1C4 D6,42,96 GA1C4  CEQ  NEXTZ,@CHAT       * SYNTAX ERROR
[0769] A1C7 4D,BA           BR   ERRSYN
[0770] A1C9 B6,45,02        OR   >02,@FLAG         Turn off print
[0771] A1CC B2,45,FB        AND  >FB,@FLAG         Turn off stop
[0772] A1CF 0F,79    ONWRN5 XML  PGMCHR            Check for EOS
[0773] A1D1 06,6A,78 ONWRN7 CALL CHKEND            Error if not EOS
[0774] A1D4 4D,BA           BR   ERRSYN            If not EOS
[0775] A1D6 87,22           DCLR @ERRCOD
[0776] A1D8 0F,75           XML  CONT              Continue
[0777]               ***********************************************************
[0778]               * ON ERROR {line number | STOP}
[0779]               * ON ERROR line number - causes the error routine to build
[0780]               *                        an error stack entry and pass
[0781]               *                        control to the line specified in
[0782]               *                        the most-recently executed
[0783]               *                        on-error-statement
[0784]               * ON ERROR STOP - causes the default error handling
[0785]               *                 conditions to be in effect. i.e. any
[0786]               *                 errors that occur cause execution to halt
[0787]               *                 an a message to be displayed
[0788]               ***********************************************************
[0789] A1DA 0F,79    ONERR  XML  PGMCHR            Get option
[0790] A1DC D6,42,C9        CEQ  LNZ,@CHAT         If line # then find the line
[0791] A1DF 42,0E           BR   GA20E
[0792] A1E1 0F,79           XML  PGMCHR            Get upper byte
[0793] A1E3 BC,4A,42        ST   @CHAT,@FAC
[0794] A1E6 0F,79           XML  PGMCHR            Get lower byte
[0795] A1E8 BC,4B,42        ST   @CHAT,@FAC1
[0796] A1EB BD,4C,32        DST  @ENLN,@FAC2
[0797] A1EE A7,4C,00        DSUB 3,@FAC2           Pointing to 1st line #
       A1F1 03
[0798]               * Consider both ERAM and RAM cases to get line # from the
[0799]               * line number table. Also reset the break bit.
[0800] A1F2 06,80,2E ONERR2 CALL GRSUB3            Get 2 bytes from either RAM/E
[0801] A1F5 4C              BYTE FAC2            * FAC2 has the address

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0014 
EQUATES EXEC-359
[0802] A1F6 D5,4A,58        DCEQ @EEE1,@FAC        If found
[0803] A1F9 62,06           BS   ONERR4
[0804] A1FB C5,4C,30        DCH  @STLN,@FAC2       Not found
[0805] A1FE 4D,E6           BR   ERRLNF
[0806] A200 A7,4C,00        DSUB 4,@FAC2           Goto next line
       A203 04
[0807] A204 41,F2           BR   ONERR2
[0808] A206 95,4C    ONERR4 DINCT @FAC2
[0809] A208 BD,A3,8A        DST  @FAC2,V@ERRLN
       A20B 4C
[0810] A20C 42,16           BR   GA216
[0811] A20E D6,42,98 GA20E  CEQ  STOPZ,@CHAT       * SYNTAX ERROR
[0812] A211 4D,BA           BR   ERRSYN
[0813] A213 87,A3,8A        DCLR V@ERRLN           Back to default error handlin
[0814] A216 41,CF    GA216  BR   ONWRN5            Finish up same as ON WARNING
[0815]               ***********************************************************
[0816]               * ON BREAK {NEXT | STOP}
[0817]               * ON BREAK NEXT - Causes any breakpoints which have been
[0818]               *                 set on statements to be ignored when the
[0819]               *                 statement is encountered and also masks
[0820]               *                 the shift-C key so that it is ignored
[0821]               * ON BREAK STOP - Causes the default break handling to be
[0822]               *                 in force., i.e. execution is halted and
[0823]               *                 the BREAKPOINT message is displayed on
[0824]               *                 the screen
[0825]               ***********************************************************
[0826] A218 0F,79    ONBRK  XML  PGMCHR            Get next char to find option
[0827] A21A D6,42,98        CEQ  STOPZ,@CHAT       If stop option specified
[0828] A21D 42,25           BR   GA225
[0829] A21F B2,45,BF        AND  >BF,@FLAG         break allowed
[0830] A222 05,A2,2D        B    GA22D             Don't change this to BR GA22D
[0831] A225 D6,42,96 GA225  CEQ  NEXTZ,@CHAT       If next option number
[0832] A228 4D,BA           BR   ERRSYN            specified then syntax error
[0833] A22A B6,45,40        OR   >40,@FLAG         If next option specified then
[0834]               *                              break NOT allowed
[0835] A22D 41,CF    GA22D  BR   ONWRN5            Finish up same as ON WARNING
[0836]               ***********************************************************
[0837]               * GPLCAL - If a call is made to a subprogram that does not
[0838]               *  not exist either in the BASIC program itself or in the
[0839]               *  internal GPL subprogram list then one final attempt is
[0840]               *  made to find the subprogram at execution time by
[0841]               *  searching for the subprogram in the console or a
[0842]               *  peripheral. If not found there, then a
[0843]               *  *SUBPROGRAM NOT FOUND error occurs
[0844]               *
[0845]               *  Input: the subprogram name is in the FAC and the length
[0846]               *         of the name is in FAC15
[0847]               ***********************************************************
[0848] A22F 8E,80,89 GPLCAL CZ   @RAMFLG           Can't try if CPU program
[0849] A232 4D,F6           BR   ERRSNF
[0850] A234 E7,59,00        DSRL 8,@FAC15          Make name length a double
       A237 08
[0851] A238 A5,2C,59        DSUB @FAC15,@PGMPTR    Point back at name
[0852] A23B 93,2C           DDEC @PGMPTR           Point at name length
[0853] A23D BD,56,2C        DST  @PGMPTR,@FAC12    Set pointer to name
[0854] A240 06,00,10        CALL LINK              Issue 'Call Program Link'
[0855] A243 0A              BYTE 10              * Search subprogram lists
[0856] A244 41,D1           BR   ONWRN7            If all ok, check-end and rtn
[0857] A246 4D,F6           BR   ERRSNF            If not found, error
[0858]               ***********************************************************
[0859]               *                     NUD FOR PI
[0860]               ***********************************************************
[0861] A248 31,00,08 NPI    MOVE 8,G@CONPI,@FAC    Load constant PI
       A24B 4A,A2,50

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0015 
EQUATES EXEC-359
[0862] A24E 0F,75           XML  CONT
[0863] A250 40,03,0E CONPI  BYTE >40,3,14,15,92,65,35,90
       A253 0F,5C,41
       A256 23,5A
[0864]               * 3.1415992653590E+00
[0865]               ***********************************************************
[0866]               *                     NUD FOR MAX
[0867]               ***********************************************************
[0868] A258 06,A2,6D NMAX   CALL MAXMIN            Combine MAX and MIN
[0869] A25B 0A              GT
[0870] A25C 42,63           BR   GA263
[0871] A25E 35,00,08 NMAXZ1 MOVE 8,@ARG,@FAC
       A261 4A,5C
[0872] A263 0F,75    GA263  XML  CONT
[0873]               ***********************************************************
[0874]               *                     NUD FOR MIN
[0875]               ***********************************************************
[0876] A265 06,A2,6D NMIN   CALL MAXMIN            Combine MAX and MIN again
[0877] A268 0A              GT
[0878] A269 42,5E           BR   NMAXZ1
[0879] A26B 0F,75           XML  CONT
[0880]               ***********************************************************
[0881]               *                COMMON MAX / MIN ROUTINE
[0882]               ***********************************************************
[0883] A26D 06,AC,89 MAXMIN CALL LPAR              Skip "(" parse, and insure ,
[0884] A270 C6,4C,63        CH   >63,@FAC2         Must be numeric
[0885] A273 6D,BE           BS   ERRSNM
[0886] A275 0F,77           XML  VPUSH             Push l.h. arg on stack
[0887] A277 0F,74           XML  PARSE             PARSE up to ")"
[0888] A279 B6              BYTE RPARZ
[0889] A27A C6,4C,63        CH   >63,@FAC2         Must be numeric
[0890] A27D 6D,BE           BS   ERRSNM
[0891] A27F 0F,7E           XML  SPEED             Must be
[0892] A281 00              BYTE SYNCHK        *    at a
[0893] A282 B6              BYTE RPARZ         *      right parenthesis
[0894] A283 35,00,08        MOVE 8,@FAC,@ARG       Save in ARG for compare
       A286 5C,4A
[0895] A288 0F,78           XML  VPOP              Get l.h. arg back
[0896] A28A 0F,0A           XML  FCOMP             Compare operands
[0897] A28C 00              RTN
[0898]               * Initialize random number generator 
[0899] A28D 31,00,0A INTRND MOVE 10,G@X2SEED,V@RNDX2
       A290 A3,A0,A2
       A293 95
[0900] A294 00              RTN
[0901] A295 42,03,23 X2SEED BYTE >42,>03,>23,>15,>00 * =   33521, X2 INITIAL VAL
       A298 15,00
[0902] A29A 43,02,3E X1SEED BYTE >43,>02,>3E,>2A,>17 * = 2624223, X1 INITIAL VAL
       A29D 2A,17
[0903]               ***********************************************************
[0904]               *                                                         *
[0905]               * RXB PATCH REPLACEMENT CODE FOR RND WITH TI BASIC RND    *
[0906]               *                                                         *
[0907]               ***********************************************************
[0908]               *           PSEUDO-RANDOM NUMBER GENERATOR
[0909]               *      X(N+1) = (A*X(N)+C) MOD M;  RND = X/M
[0910]               *    WHERE:                 X = X2 * 1E7 + X1
[0911]               *                           A = A2 * 1E7 + A1
[0912]               *                           C = C2 * 1E7 + C1
[0913]               *                           M = 1E14
[0914]               * ASSUMPTIONS:
[0915]               *  (1) All numbers are integers; fractional parts are
[0916]               *      truncated
[0917]               *  (2) If the variables listed below start in the ranges

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0016 
EQUATES EXEC-359
[0918]               *     specified. They will also end in the ranges specified
[0919]               *
[0920]               * CONSTANTS: 0 <= A2 < 5E6 ; 0 <= C2 < 1E7
[0921]               *            0 <= A1 < 5E6 ; 0 <= C1 < 1E7
[0922]               * VARIABLES: 0 <= X2 < 1E7 ; 0 <= T1 <= 1E14 ; 0 <= T2 < 1E
[0923]               *            0 <= X1 < 1E7 ; 0 <= T3 <= 1E14 ; 0 <= T4 < 1E
[0924]               *
[0925]               *        STACK USAGE:
[0926]               *            CONSTANT REFS      CONTANT REFS    CONTANT REF
[0927]               * +---------+      IN/OUT            IN/OUT          IN/OUT
[0928]               * | STACK+4 | X2*A1(F)(H)       --    ----      --    ----
[0929]               * +---------+
[0930]               * | STACK+3 |   T2 (C)(J)       --    ----      --    ----
[0931]               * +---------+
[0932]               * | STACK+2 |   T1 (B)(D)   new X1   (E)(N)     --    ----
[0933]               * +---------+
[0934]               * | STACK+1 |old X1(A)(G)       T3   (K)(L) new X2   (M)(P)
[0935]               * +---------+
[0936]               ***********************************************************
[0937]               * COMPUTE NEW VALUE FOR X1, SAVE IT IN V@RNDX1
[0938]               *                             STACK
[0939]               *                               SREFS   FAC CONTENTS
[0940]               * NRND   MOVE 5,V@RNDX1,@FAC        FAC = X1
[0941]               *        MOVE 5,V@RNDX1,@FAC        fAC = X1
[0942]               *        CLR  @FAC5                 FAC = CLR
[0943]               *        DCLR @FAC6                 FAC = CLR
[0944]               *        XML  VPUSH          (A)    FAC = X1
[0945]               *        MOVE 8,G@RNDA1,@ARG        ARG = A1
[0946]               *        XML  FMUL                  FAC = X1*A1
[0947]               *        MOVE 8,G@RNDC1,@ARG        ARG = C1
[0948]               *        XML  FADD               T1=FAC = X1*A1+C1
[0949]               *        XML  VPUSH          (B)    FAC = T1
[0950]               *        MOVE 8,G@RNDEM,@ARG        ARG = 1/1E7
[0951]               *        XML  FMUL                  FAC = T1/1E7
[0952]               *        CALL GRINT              T2=FAC = INT(T1/1E7)
[0953]               *        XML  VPUSH          (C)    FAC = T2
[0954]               *        MOVE 8,G@RNDEP,@ARG        ARG = 1E7
[0955]               *        XML  FMUL                  FAC = T2*1E7
[0956]               *        DSUB 8,@VSPTR
[0957]               *        XML  SSUB           (D) X1=FAC = T1-T2*1E7
[0958]               *        MOVE 5,@FAC,V@RNDX1        FAC = X1 (new)
[0959]               *        XML  VPUSH          (E)    FAC = X1
[0960]               * COMPUTE NEW VALUE FOR X2, SAVE IT IN V@RNDX2
[0961]               *        MOVE 5,V@RNDX2,@FAC        FAC = X2
[0962]               *        CLR  @FAC5                 FAC = CLR
[0963]               *        DCLR @FAC6                 FAC = CLR
[0964]               *        MOVE 8,G@RNDA1,@ARG        ARG = A1
[0965]               *        XML  FMUL                  FAC = X2*A1
[0966]               *        DADD 8,@VSPTR
[0967]               *        XML  VPUSH          (F)    FAC = X2*A1
[0968]               *        DSUB 24,@VSPTR
[0969]               *        XML  VPOP           (G)    FAC = X1
[0970]               *        DADD 32,@VSPTR
[0971]               *        MOVE 8,G@RNDA2,@ARG        ARG = A2
[0972]               *        XML  FMUL                  FAC = X1*A2
[0973]               *        XML  SADD           (H)    FAC = X2*A1+X1*A2
[0974]               *        MOVE 8,G@RNDC2,@ARG        ARG = C2
[0975]               *        XML  FADD                  FAC = X2*A1+X1*A2
[0976]               *        XML  SADD           (J) T3=FAC = X2*A1+X1*A2
[0977]               *        DSUB 16,@VSPTR
[0978]               *        XML  VPUSH          (K)    FAC = T3
[0979]               *        MOVE 8,G@RNDEM,@ARG        ARG = 1/1E7
[0980]               *        XML  FMUL                  FAC = T3/1E7
[0981]               *        CALL GRINT              T4=FAC = INT(T3/1E7)

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0017 
EQUATES EXEC-359
[0982]               *        MOVE 8,G@RNDEP,@ARG        ARG = 1E7
[0983]               *        XML  FMUL                  FAC = T4*1E7
[0984]               *        XML  SSUB           (L) X2=FAC = T3-T4*1E7
[0985]               *        MOVE 5,@FAC,V@RNDX2        FAC = X2 (new)
[0986]               * COMPUTE NEW VALUE FOR RND, LEAVE IT IN FAC
[0987]               *        MOVE 8,G@RNDEM,@ARG        ARG = 1/1E7
[0988]               *        XML  FMUL                  FAC = X2/1E7
[0989]               *       XML  VPUSH          (M)    FAC = X2/1E7
[0990]               *        DADD 8,@VSPTR
[0991]               *        XML  VPOP           (N)    FAC = X1
[0992]               *        XML  FMUL                  FAC = X1/1E7
[0993]               *        XML  FMUL                  FAC = X1/1E14
[0994]               *        XML  SADD           (P)RND=FAC = (X2/1E7)+(X1/1E14
[0995]               *        XML  CONT
[0996]               ***********************************************************
[0997]               * CONSTANTS FOR THE RANDOM NUMBER ROUTINE
[0998]               * RNDA2  BYTE >43,>01,>2B,>59,>52,>00,>00,>00 * = 1438982
[0999]               * RNDA1  BYTE >42,>2A,>08,>15,>00,>00,>00,>00 * = 0420821
[1000]               * RNDC2  BYTE >43,>02,>0B,>20,>30,>00,>00,>00 * = 2113248
[1001]               * RNDC1  BYTE >43,>06,>36,>05,>13,>00,>00,>00 * = 6540519
[1002] A29F 43,0A,00 RNDEP  BYTE >43,>0A,>00,>00,>00,>00,>00,>00 * = 1E7
       A2A2 00,00,00
       A2A5 00,00
[1003] A2A7 3C,0A,00 RNDEM  BYTE >3C,>0A,>00,>00,>00,>00,>00,>00 * = 1/1E7
       A2AA 00,00,00
       A2AD 00,00
[1004]               ***********************************************************
[1005]               * RXB BASIC RND REPLACEMENT FROM TI BASIC
[1006] A2AF BE,4A,3F NRND   ST   >3F,@FAC       * Exponent    
[1007] A2B2 BE,10,4B        ST   >4B,@VAR5      * Loop counter
[1008] A2B5 02,63    NRND1  RAND >63            * 0?
[1009] A2B7 8E,78           CZ   @RANDOM        * No, go on
[1010] A2B9 42,C5           BR   NRND3     
[1011] A2BB 92,4A           DEC  @FAC           * 0?
[1012] A2BD 8E,4A           CZ   @FAC           * End with 0
[1013] A2BF 62,D2           BS   NRND4          * Go on
[1014] A2C1 42,B5           BR   NRND1
[1015] A2C3 02,63    NRND2  RAND >63            * Till 100
[1016] A2C5 BC,90,10 NRND3  ST   @RANDOM,*VAR5  * All digits
       A2C8 78
[1017] A2C9 D6,10,51        CEQ  >51,@VAR5      * Till >8351
[1018] A2CC 62,D4           BS   NRND5 
[1019] A2CE 90,10           INC  @VAR5          * Increase loop counter
[1020] A2D0 42,C3           BR   NRND2 
[1021] A2D2 86,4B    NRND4  CLR  @FAC1          * Set 0
[1022] A2D4 0F,75    NRND5  XML  CONT
[1023]               ***********************************************************
[1024] A2D6 0F,79    STRFCH XML  PGMCHR
[1025] A2D8 0F,74           XML  PARSE
[1026] A2DA B6              BYTE RPARZ
[1027] A2DB 00              RTN
[1028] A2DC 06,A2,D6 STRGET CALL STRFCH
[1029] A2DF D6,4C,65        CEQ  >65,@FAC2
[1030] A2E2 4D,BE           BR   ERRSNM      * STRING NUM MISMATCH
[1031] A2E4 00              RTN
[1032] A2E5 06,A2,D6 NUMFCH CALL STRFCH
[1033] A2E8 D6,4C,65        CEQ  >65,@FAC2
[1034] A2EB 6D,BE           BS   ERRSNM      * STRING NUM MISMATCH
[1035] A2ED 00              RTN
[1036] A2EE 0F,12    CFIFCH XML  CFI
[1037] A2F0 D6,54,03        CEQ  >03,@FAC+10
[1038] A2F3 6D,EE           BS   ERRBV       * NUMERIC OVERFLOW
[1039] A2F5 00              RTN
[1040] A2F6 06,A3,6D GETNUM CALL SUBLP3

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0018 
EQUATES EXEC-359
[1041] A2F9 D6,42,B3        CEQ  >B3,@CHAT
[1042] A2FC 4D,BA           BR   ERRSYN
[1043] A2FE 00              RTN
[1044] A2FF 06,A2,F6 ROWCOL CALL GETNUM
[1045] A302 CF,4A,00        DCGT 24,@FAC
       A305 18
[1046] A306 6D,EE           BS   ERRBV
[1047] A308 93,4A           DDEC @FAC
[1048] A30A BC,02,7F        ST   @XPT,@MNUM
[1049] A30D BC,7E,4B        ST   @FAC1,@YPT
[1050] A310 06,A2,F6        CALL GETNUM
[1051] A313 CF,4A,00        DCGT 32,@FAC
       A316 20
[1052] A317 6D,EE           BS   ERRBV
[1053] A319 93,4A           DDEC @FAC
[1054] A31B BC,7F,4B        ST   @FAC1,@XPT
[1055] A31E 00              RTN
[1056] A31F 0F,79    NGOOD  XML  PGMCHR
[1057] A321 CA,42,80 NGOOD1 CHE  >80,@CHAT
[1058] A324 6D,BA           BS   ERRSYN         * ?
[1059] A326 06,A3,3A        CALL SNDER
[1060] A329 D6,4C,65        CEQ  >65,@FAC2
[1061] A32C 4D,BE           BR   ERRSNM         * STRING NUMBER MISMATCH
[1062] A32E BF,4A,00        DST  >001C,@FAC
       A331 1C
[1063] A332 BD,4E,1C        DST  @SREF,@FAC4
[1064] A335 BD,50,0C        DST  @BYTES,@FAC6
[1065] A338 43,43           BR   SNDASS
[1066] A33A 0F,7A    SNDER  XML  SYM
[1067] A33C 0F,7B           XML  SMB
[1068] A33E 0F,77           XML  VPUSH
[1069] A340 00              RTN
[1070] A341 0F,80    CIFSND XML  CIF
[1071] A343 0F,7C    SNDASS XML  ASSGNV
[1072] A345 00              RTN
[1073] A346 BC,00,7D GETLP  ST   @CB,@VAR0
[1074] A349 BC,01,7D        ST   @CB,@VARV
[1075] A34C A6,01,60        SUB  OFFSET,@VARV
[1076] A34F BC,E0,00        ST   @VARV,V@0(@STRPTR)
       A352 12,01
[1077] A354 91,12           DINC @STRPTR
[1078] A356 00              RTN
[1079] A357 BC,00,E0 PUTLP  ST   V@0(@FAC4),@VAR0
       A35A 00,4E
[1080] A35C A2,00,60        ADD  OFFSET,@VAR0
[1081] A35F 91,4E           DINC @FAC4
[1082] A361 00              RTN
[1083] A362 08       HFMT   FMT
[1084] A363 E0,00           DATA >E000
[1085] A365 FB              FEND
[1086] A366 00              RTN
[1087] A367 08       VFMT   FMT
[1088] A368 E0,00           DATA >E000
[1089] A36A 9E              BYTE >9E
[1090] A36B FB              FEND
[1091] A36C 00              RTN
[1092] A36D 06,A2,E5 SUBLP3 CALL NUMFCH
[1093] A370 06,A2,EE        CALL CFIFCH
[1094] A373 00              RTN
[1095] A374 86,4A    CLRFAC CLR  @FAC
[1096] A376 35,00,07        MOVE 7,@FAC,@FAC1
       A379 4B,4A
[1097] A37B 00              RTN
[1098]               ***********************************************************

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0019 
EQUATES EXEC-359
[1099]               *
[1100]               * RXB PATCH CODE TO RESET ADDRESS FOR NRNDMZ **************
[1101] A37C 05,A3,7F        B    NRNDMZ
[1102]               ***********************************************************
[1103]               *                   RANDOMIZE STATEMENT
[1104]               ***********************************************************
[1105] A37F 06,6A,78 NRNDMZ CALL CHKEND            Seed provider?
[1106] A382 63,C0           BS   RNDM1             No
[1107]               * RANDOMIZE given a see value
[1108]               * (99,000,000,000,001 possible starting positions)
[1109]               * (Place-value is ignored in the input number)
[1110] A384 0F,74           XML  PARSE             Parse the seed
[1111] A386 83              BYTE TREMZ           * Up to end of statement
[1112] A387 06,A3,ED        CALL CKSTNM
[1113] A38A 8F,4A           DCZ  @FAC              Check FAC for zero
[1114] A38C 63,B6           BS   GA3B6
[1115] A38E BE,4A,46        ST   >46,@FAC          0 < FAC < 1E14
[1116] A391 0F,77           XML  VPUSH             Let FAC = X2*1E7+X1
[1117] A393 31,00,08        MOVE 8,G@RNDEM,@ARG        ARG = 1/1E7
       A396 5C,A2,A7
[1118] A399 0F,08           XML  FMUL                  FAC = X2+X1/1E7
[1119] A39B 06,00,22        CALL GRINT                 FAC = X2
[1120] A39E 35,00,05        MOVE 5,@FAC,V@RNDX2        FAC = X2
       A3A1 A3,A0,4A
[1121] A3A4 31,00,08        MOVE 8,G@RNDEP,@ARG        ARG = 1E7
       A3A7 5C,A2,9F
[1122] A3AA 0F,08           XML  FMUL                  FAC = X2*1E7
[1123] A3AC 0F,0C           XML  SSUB                  FAC = X1
[1124] A3AE 35,00,05        MOVE 5,@FAC,V@RNDX1        FAC = X1
       A3B1 A3,A5,4A
[1125] A3B4 0F,75           XML  CONT                  FAC = X1
[1126] A3B6 BD,A3,A0 GA3B6  DST  @FAC,V@RNDX2          FAC = 0
       A3B9 4A
[1127] A3BA BD,A3,A5        DST  @FAC,V@RNDX1          FAC = 0
       A3BD 4A
[1128] A3BE 0F,75           XML  CONT
[1129]               * RANDOMIZE given number seed value (use GPL RAND function)
[1130]               * (16K possible starting positions)
[1131] A3C0 BF,4A,42 RNDM1  DST  >4201,@FAC            FAC = >4201
       A3C3 01
[1132] A3C4 86,4E           CLR  @FAC4                 FAC4= >00
[1133] A3C6 06,A3,D2        CALL RNDMZ
[1134] A3C9 03,A5           DATA RNDX1
[1135] A3CB 06,A3,D2        CALL RNDMZ             Set up seed
[1136] A3CE 03,A0           DATA RNDX2
[1137] A3D0 0F,75           XML  CONT              Continue on
[1138] A3D2 88,52    RNDMZ  FETCH @FAC8            Fetch address of seed (high b
[1139] A3D4 88,53           FETCH @FAC9            Fetch address of seed (low by
[1140] A3D6 02,63           RAND 99                GPL Randomize
[1141] A3D8 BC,4C,78        ST   @RANDOM,@FAC2     >00<=FAC+2<=FF
[1142] A3DB E6,4C,02        SRL  2,@FAC2           >00<=FAC+2<=3F
[1143] A3DE 02,63           RAND 99                GPL Randomize
[1144] A3E0 BC,4D,78        ST   @RANDOM,@FAC3     >00<=FAC+3<=FF
[1145] A3E3 E6,4D,02        SRL  2,@FAC3           >00<=FAC+3<=3F
[1146] A3E6 35,00,05        MOVE 5,@FAC,V*FAC8     Put in seed
       A3E9 B0,52,4A
[1147] A3EC 00              RTN
[1148] A3ED D6,4C,65 CKSTNM CEQ  >65,@FAC2
[1149] A3F0 6D,BE           BS   ERRSNM
[1150] A3F2 00              RTN
[1151] A3F3 40,01,00 FLT1   BYTE >40,>01,>00,>00,>00,>00,>00,>00
       A3F6 00,00,00
       A3F9 00,00
[1152]               ***********************************************************

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0020 
EQUATES EXEC-359
[1153]               *                 EXTENDED STRING PACKAGE
[1154]               * THE ROUTINES ARE:
[1155]               *  LITS05 - Move a string literal from the program to the
[1156]               *            string space
[1157]               *  INTARG - Checks that an argument is a numeric and
[1158]               *            converts it from floating point to an integer
[1159]               *  PUSSTR - Checks that an argument is a string and pushes
[1160]               *            it on the stack
[1161]               *  CONCAT - Concatenates 2 strings together
[1162]               *  SEG$   - Segments a string
[1163]               *  LEN    - Puts the length of a string in the FAC
[1164]               *  CHR$   - Converts an integer into its ASCII character
[1165]               *  STR$   - Converts a number into its string equivalent
[1166]               *  VAL    - Converts a string into its numeric equivalent
[1167]               *  POS    - Gives the position of one string within another
[1168]               *  RPT$   - Generates a single string with multiple copies
[1169]               *            of the original string
[1170]               *
[1171]               *      AN ENTRY IN THE FAC LOOKS LIKE:
[1172]               * +------------+-----+----+-------------+-----------------+
[1173]               * |addr of ptr | >65 | xx | addr of str | length of str   |
[1174]               * +------------+-----+----+-------------+-----------------+
[1175]               *     FAC       FAC2  FAC3   FAC4           FAC6
[1176]               ***********************************************************
[1177]               * Support routine for functions to build FAC entry
[1178] A3FB 86,50    LITS05 CLR  @FAC6             Need as a double-byte value
[1179] A3FD BD,0C,50        DST  @FAC6,@BYTES      LENGTH FOR GETSTR
[1180] A400 BC,52,80        ST   @RAMTOP,@FAC8     Copy ERAM flag for later
       A403 84
[1181] A404 0F,71    LITS07 XML  GETSTR            ALLOCATE STRING SPACE
[1182] A406 BF,4A,00 LITS08 DST  >001C,@FAC        SAVE ADDR OF STRING  (SREF)
       A409 1C
[1183] A40A BD,4E,1C        DST  @SREF,@FAC4       SAVE ADDR OF STRING
[1184] A40D BF,4C,65        DST  >6500,@FAC2       INDICATES A STRING CONSTANT
       A410 00
[1185]               *********** COPY STRING INTO STRING SPACE *****************
[1186] A411 8F,0C    LITS09 DCZ  @BYTES            If non-null string
[1187] A413 64,2B           BS   GA42B
[1188] A415 8E,52           CZ   @FAC8
[1189] A417 44,20           BR   GA420
[1190] A419 34,0C,B0        MOVE @BYTES,V*TEMP5,V*SREF
       A41C 1C,B0,66
[1191] A41F 00              RTN
[1192]               *                             Else source string in ERAM
[1193] A420 BD,56,0C GA420  DST  @BYTES,@FFF1      FFF1 : BYTE COUNT
[1194] A423 BD,58,1C        DST  @SREF,@EEE1       EEE1 : DESTINATION ADDR ON VD
[1195] A426 BD,54,66        DST  @TEMP5,@DDD1      DDD1 : Source addr in ERAM
[1196] A429 0F,8B           XML  GVWITE            Move data from ERAM to VDP
[1197] A42B 00       GA42B  RTN
[1198] A42C 86,52    LITS06 CLR  @FAC8             SET FLAG TO VDP
[1199] A42E 44,04           BR   LITS07            JUMP INTO CODE
[1200]               ***********************************************************
[1201]               * PUSSTR - Insures that the entry in the FAC is a string
[1202]               *           and pushes it onto the stack.
[1203]               ***********************************************************
[1204] A430 D6,4C,65 PUSSTR CEQ  >65,@FAC2
[1205] A433 4D,BE           BR   ERRSNM
[1206] A435 0F,77           XML  VPUSH             PUSH THE ARGUMENT
[1207] A437 00              RTN
[1208]               ***********************************************************
[1209]               * CONCAT - CONCATENATES TWO STRINGS TOGETHER
[1210]               *         INPUT  : FLOATING POINT ACCUMULATOR ENTRIES
[1211]               *         OUTPUT : CONCATENATED STRING AND (POSSIBLE)
[1212]               *                  ZEROED BACK-POINTERS FOR THE OLD STRINGS

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0021 
EQUATES EXEC-359
[1213]               *         USES   : TEMP2, TEMP4 AND TEMP5 AS TEMPORARIES
[1214]               ***********************************************************
[1215] A438 86,23    CONCAT CLR  @ERRCOD+1         CLEAR THE ERROR CODE
[1216] A43A 06,A4,30        CALL PUSSTR            Push the string & get next to
[1217] A43D 0F,74           XML  PARSE             GET THE R.H. ARGUMENT
[1218] A43F B8              BYTE CONCZ
[1219] A440 D6,4C,65        CEQ  >65,@FAC2         If not string - error
[1220] A443 4D,BE           BR   ERRSNM
[1221] A445 BD,0C,50        DST  @FAC6,@BYTES      GET R.H. LENGTH
[1222] A448 A1,0C,E0        DADD V@6(@VSPTR),@BYTES    ADD IN L.H. LENGTH
       A44B 06,6E
[1223] A44D C7,0C,00        DCH  255,@BYTES
       A450 FF
[1224] A451 44,5B           BR   GA45B
[1225] A453 BF,0C,00        DST  255,@BYTES        TRUNCATE IF TOO LONG
       A456 FF
[1226] A457 06,6A,82 WRNST1 CALL WARNZZ            Display warning
[1227] A45A 13              BYTE 19                * STRING TRUNCATED message
[1228] A45B BD,68,0C GA45B  DST  @BYTES,@TEMP6     Keep length for later
[1229] A45E 0F,77           XML  VPUSH
[1230] A460 0F,71           XML  GETSTR            Alloccate the result string
[1231] A462 0F,78           XML  VPOP              Retrieve R.H.
[1232] A464 35,00,08        MOVE 8,@FAC,@ARG
       A467 5C,4A
[1233] A469 0F,78           XML  VPOP              Retrieve L.H.
[1234] A46B BD,66,4E        DST  @FAC4,@TEMP5      Set ptr to L.H. ARG(for FREST
[1235] A46E BD,0C,50        DST  @FAC6,@BYTES      Length of L.H. ARG
[1236] A471 86,52           CLR  @FAC8             Force VDP mode
[1237] A473 06,A4,06        CALL LITS08            Set up FAC & copy L.H. ARG in
[1238] A476 8F,62           DCZ  @ARG6             If R.H. =0 don't copy
[1239] A478 64,8E           BS   CONC06
[1240] A47A BD,64,1C        DST  @SREF,@TEMP4      Get ptr to new string
[1241] A47D A1,64,50        DADD @FAC6,@TEMP4      Ptr to where 2nd string begin
[1242] A480 A5,68,50        DSUB @FAC6,@TEMP6      Length of 2nd string
[1243]               *                                      (possibly truncated)
[1244] A483 64,8E           BS   CONC06
[1245] A485 34,68,B0        MOVE @TEMP6,V*ARG4,V*TEMP4     Copy in 2nd string
       A488 64,B0,60
[1246]                
[1247] A48B A1,50,68        DADD @TEMP6,@FAC6      Add in length of 2nd ARG
[1248]               * NOTE: FAC6 already contained length of 1st ARG from the
[1249]               *       parse that was done on it
[1250] A48E 0F,75    CONC06 XML  CONT              Done.
[1251]               ***********************************************************
[1252]               * SEG$(A$,X,Y) - Extracts the desiginated string from A$.
[1253]               *     X specifies the character position within A$ at
[1254]               *     which the extraction begins. Y specifies the number
[1255]               *     of characters to extract.
[1256]               *     If X or Y is negative an error occurs. If X=0 an
[1257]               *     error occurs. If Y=0 or X > Y then a null string is
[1258]               *     is returned. If the ramaining length in A$ starting
[1259]               *     at the postion specified by X is less than the length
[1260]               *     specified by Y, then the remainder of A$ starting at
[1261]               *     position X is returned.
[1262]               *   INPUT - Control is turned over to SEG$ from PARSE. The
[1263]               *     only requirement is that a SEG$ was encountered.
[1264]               *   OUTPUT - The Floating Point Accumulator is set up with
[1265]               *     the header for the segmented string.
[1266]               *   USES - TEMP2 (Others in calls to GETSTR and LITS08)
[1267]               ***********************************************************
[1268] A490 06,AC,89 SEGZ01 CALL LPAR              Insure "(" parse and check ",
[1269] A493 06,A4,30        CALL PUSSTR            Push string and get next toke
[1270] A496 0F,7E           XML  SPEED             Get the position
[1271] A498 01              BYTE PARCOM       *     within the source string

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0022 
EQUATES EXEC-359
[1272] A499 06,A9,95        CALL INTARG            CHECK & CONVERT ARG TO INTEGE
[1273] A49C 8F,4A           DCZ  @FAC               CAN'T HAVE VALUE OF 0
[1274] A49E 6D,EE           BS   ERRBV
[1275] A4A0 0F,77           XML  VPUSH             PUSH THE ARG
[1276] A4A2 0F,74           XML  PARSE             Get extraction length
[1277] A4A4 B6              BYTE RPARZ
[1278] A4A5 0F,7E           XML  SPEED             Must have
[1279] A4A7 00              BYTE SYNCHK       *     ended on
[1280] A4A8 B6              BYTE RPARZ        *      a right parenthesis
[1281] A4A9 06,A9,95        CALL INTARG            CHECK & CONVERT ARG TO INTEGE
[1282] A4AC BD,5C,4A        DST  @FAC,@ARG         Move extraction length
[1283] A4AF 0F,78           XML  VPOP              Get position back
[1284] A4B1 BD,5E,4A        DST  @FAC,@ARG2        Move position
[1285] A4B4 0F,78           XML  VPOP              Retrieve source string
[1286] A4B6 BD,56,5E        DST  @ARG2,@TEMP2      Get position within string
[1287] A4B9 C5,56,50        DCH  @FAC6,@TEMP2      If position > length =>null
[1288] A4BC 64,EF           BS   SEGZ08
[1289] A4BE A1,56,5C        DADD @ARG,@TEMP2       Compute end of substring
[1290] A4C1 A5,56,50        DSUB @FAC6,@TEMP2      Compute length beyond end
[1291] A4C4 93,56           DDEC @TEMP2             string
[1292] A4C6 D3,56,00        DCGE 0,@TEMP2
       A4C9 00
[1293] A4CA 44,D4           BR   SEGZ06            Fine if substring is shorter
[1294] A4CC BD,5C,50        DST  @FAC6,@ARG        Else, truncate length of
[1295]               *                              substring
[1296] A4CF A5,5C,5E        DSUB @ARG2,@ARG        Subtract position from source
[1297]               *                              length
[1298] A4D2 91,5C           DINC @ARG              Increment to include last cha
[1299] A4D4 BD,0C,5C SEGZ06 DST  @ARG,@BYTES       # of bytes needed for substri
[1300] A4D7 0F,77           XML  VPUSH             Save source string entry
[1301] A4D9 0F,71           XML  GETSTR            ALLOCATE RESULT STRING
[1302] A4DB 0F,78           XML  VPOP              Restore source string entry
[1303] A4DD BD,66,4E        DST  @FAC4,@TEMP5      Pointer to source for FRESTR
[1304]               *                              LITS08
[1305] A4E0 A1,66,5E        DADD @ARG2,@TEMP5      Pointer to start of substring
[1306] A4E3 93,66           DDEC @TEMP5            Decrement since zero-based
[1307] A4E5 BD,50,0C        DST  @BYTES,@FAC6      Set length of string
[1308] A4E8 86,52           CLR  @FAC8             FORCE VDP MODE
[1309] A4EA 06,A4,06        CALL LITS08            Copy in & set up FAC
[1310] A4ED 0F,75           XML  CONT
[1311] A4EF 87,5C    SEGZ08 DCLR @ARG              Extract a null string
[1312] A4F1 44,D4           BR   SEGZ06            >>>JUMP ALWAYS<<<
[1313]               ***********************************************************
[1314]               * LEN(A$) - Calculate the length of a string and leave the
[1315]               *           result in the FAC.
[1316]               *  CONTROL - Turned over to NLEN from the parser.
[1317]               *  USES    - No temporaries.
[1318]               ***********************************************************
[1319] A4F3 06,A5,65 LEN01  CALL PARFF             Insure left parenthesis & par
[1320] A4F6 4D,BE           BR   ERRSNM             If not string value
[1321] A4F8 BD,4A,50        DST  @FAC6,@FAC        Length
[1322] A4FB 0F,80    LEN02  XML  CIF               Convert integer to floating p
[1323] A4FD 0F,75           XML  CONT
[1324]               ***********************************************************
[1325]               * CHR$(X) - Takes integer value X and converts the number
[1326]               *           into the ASCII representation for that number.
[1327]               *  CONTROL - Turned over to NCHR by the parser.
[1328]               *  OUTPUT  - FAC is set up with the string entry
[1329]               *  USES    - Uses temproraries when invoking LITS06(LITSTR)
[1330]               ***********************************************************
[1331] A4FF 06,A5,65 CHRZ01 CALL PARFF             Insure left parenthesis & par
[1332] A502 06,A9,95        CALL INTARG            Convert into integer
[1333] A505 BF,0C,00        DST  1,@BYTES          Create a length 1 string
       A508 01

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0023 
EQUATES EXEC-359
[1334] A509 BC,A3,78        ST   @FAC1,V@ONECHR    Move the value to VDP(for LIT
       A50C 4B
[1335] A50D BF,66,03        DST  ONECHR,@TEMP5     Address of character
       A510 78
[1336] A511 06,A4,2C        CALL LITS06            Create string and set up FAC
[1337] A514 BF,50,00        DST  1,@FAC6           Length of string
       A517 01
[1338] A518 0F,75           XML  CONT
[1339]               ***********************************************************
[1340]               * ASC(A$) - Takes the numeric value of the first character
[1341]               *           in A$.
[1342]               ***********************************************************
[1343] A51A 06,A5,65 ASC01  CALL PARFF             Insure left parenthesis & par
[1344] A51D 4D,BE           BR   ERRSNM             If not string
[1345] A51F 8E,51           CZ   @FAC7             Bad Argument?
[1346] A521 6D,EA           BS   ERRBA
[1347] A523 BC,4B,B0        ST   V*FAC4,@FAC1      Get the first character
       A526 4E
[1348] A527 86,4A           CLR  @FAC
[1349] A529 44,FB           BR   LEN02             USE COMMON CODE >>>JUMP ALWAY
[1350]               ***********************************************************
[1351]               * STR$(X) - Takes as its imput an integer X and converts it
[1352]               *           to its string representation.
[1353]               *  CONTROL - Turned over to STR$ by the parser.
[1354]               *  USES    - The usual temporaries used by string function
[1355]               *            when it calls LITS06. Uses the Roll-out area
[1356]               *            for a temporary storage area when allocating
[1357]               *            the result string.
[1358]               *  OUTPUT  - FAC is set up in the usual manner for a string
[1359]               ***********************************************************
[1360] A52B 06,A5,65 STRZ01 CALL PARFF             Insure left parenthesis & par
[1361] A52E 6D,BE           BS   ERRSNM             If not numeric-error
[1362] A530 86,55           CLR  @FAC11            Select XB floating type
[1363] A532 0F,73           XML  XCNS              Convert the number to string
[1364] A534 D6,90,55        CEQ  SPACE,*FAC11      If leading space
       A537 20
[1365] A538 45,3E           BR   GA53E
[1366] A53A 90,55           INC  @FAC11            Suppress it out
[1367] A53C 92,56           DEC  @FAC12            Shorten the length
[1368] A53E 86,0C    GA53E  CLR  @BYTES            Prepare for 2-byte value
[1369] A540 BC,0D,56        ST   @FAC12,@BYTES+1   Get length of string
[1370] A543 34,0C,A3        MOVE @BYTES,*FAC11,V@VROAZ    Put the string in VDP
       A546 C0,90,55
[1371] A549 BF,66,03        DST  VROAZ,@TEMP5      Copy-from address(for LITSTR)
       A54C C0
[1372] A54D 06,A4,2C        CALL LITS06            Allocate and set up FAC
[1373] A550 BD,50,0C        DST  @BYTES,@FAC6      Put in the length
[1374] A553 0F,75           XML  CONT
[1375]               ***********************************************************
[1376]               * VAL(A$) - Takes as its input a string, A$, and converts
[1377]               *           the string into a number if the string is a
[1378]               *           valid representation of a number.
[1379]               *  CONTROL - From the parser.
[1380]               *  OUTPUT  - FAC contains the floating point number.
[1381]               ***********************************************************
[1382] A555 06,A5,65 VAL01  CALL PARFF             Insure left parenthesis & par
[1383] A558 4D,BE           BR   ERRSNM             If not string - error
[1384] A55A 8E,51           CZ   @FAC7             Can't have null string
[1385] A55C 6D,EA           BS   ERRBA
[1386] A55E 06,A5,71        CALL VALCD             So bad argument error
[1387] A561 6D,EA           BS   ERRBA
[1388] A563 0F,75           XML  CONT
[1389]               * Short routine to parse a single argument enclosed in
[1390]               *  parenthesis for a function or a subprogram and set

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0024 
EQUATES EXEC-359
[1391]               *  condition based upon whether the value parsed was a
[1392]               *  string or a numeric.
[1393] A565 D6,42,B7 PARFF  CEQ  LPARZ,@CHAT
[1394] A568 4D,BA           BR   ERRSYN
[1395] A56A 0F,74           XML  PARSE
[1396] A56C FF              BYTE >FF               *
[1397] A56D D6,4C,65        CEQ  >65,@FAC2
[1398] A570 01              RTNC
[1399] A571 BD,66,4E VALCD  DST  @FAC4,@TEMP5      Pointer to string
[1400] A574 A1,66,50        DADD @FAC6,@TEMP5      Pointer to trailing length by
[1401] A577 BD,0C,50        DST  @FAC6,@BYTES      For suppressing trailing blan
[1402] A57A 91,0C           DINC @BYTES            Prepare for undue subtraction
[1403] A57C 93,66    GA57C  DDEC @TEMP5            Keep track of end of string
[1404] A57E 93,0C           DDEC @BYTES            Decrease length of string
[1405] A580 65,B9           BS   RTNSET            End up with empty string,
[1406] A582 D6,B0,66        CEQ  SPACE,V*TEMP5     Wild trailing blanks
       A585 20
[1407] A586 65,7C           BS   GA57C
[1408] A588 91,0C           DINC @BYTES            Allow for terminator
[1409] A58A 0F,77           XML  VPUSH             Save the ptr to the string
[1410] A58C 0F,71           XML  GETSTR            Get a new string
[1411] A58E 0F,78           XML  VPOP              Retrieve the ptr to the strin
[1412] A590 BD,66,4E        DST  @FAC4,@TEMP5      Get the ptr to the string
[1413] A593 86,52           CLR  @FAC8             Force VDP mode
[1414] A595 06,A4,11        CALL LITS09            Copy the string and set up FA
[1415] A598 A1,0C,1C        DADD @SREF,@BYTES      Point to the trailing length
[1416] A59B 93,0C           DDEC @BYTES            Point at the last character
[1417] A59D BE,B0,0C        ST   SPACE,V*BYTES     Put in the terminator
       A5A0 20
[1418] A5A1 BD,56,1C        DST  @SREF,@FAC12      Address for the conversion
[1419] A5A4 D6,B0,56 GA5A4  CEQ  SPACE,V*FAC12     While leading spaces
       A5A7 20
[1420] A5A8 45,AE           BR   GA5AE
[1421] A5AA 91,56           DINC @FAC12            Skip leading blank
[1422] A5AC 45,A4           BR   GA5A4
[1423] A5AE 86,4C    GA5AE  CLR  @FAC2             Get rid of string (in case=0)
[1424] A5B0 86,54           CLR  @FAC10            Assume no error
[1425] A5B2 0F,10           XML  CSNUM             Convert it
[1426] A5B4 D5,56,0C        DCEQ @BYTES,@FAC12     Convert all of it?
[1427] A5B7 68,F1           BS   WRNNO             Yes, check overflow & return
[1428] A5B9 D4,00,00 RTNSET CEQ  @VAR0,@VAR0       No, return with condition set
[1429] A5BC 01              RTNC
[1430]               ***********************************************************
[1431]               * POS(A$,B$,X) - Attempts to match the string, B$, in A$
[1432]               *    beginning at character # X in A$. If X is > LEN(A$), a
[1433]               *    match is not found or A$ is the null string then the
[1434]               *    returned value is 0. If B$ is the null string then the
[1435]               *    returned value is 1. Otherwise, the returned value is
[1436]               *    the column # of the 1st character matched in A$
[1437]               *  CONTROL - Fromn the parser. Returned through common code
[1438]               *            IN LEN.
[1439]               *  USES    - Not temporaries - Utilizes FAC and ARG.
[1440]               ***********************************************************
[1441] A5BD 06,AC,89 POS01  CALL LPAR              Insure "(", parse , insure ",
[1442] A5C0 06,A4,30        CALL PUSSTR            STACK THE STRING AND GET TOKE
[1443] A5C3 0F,7E           XML  SPEED             Parse the match string and
[1444] A5C5 01              BYTE PARCOM      *      insure end on comma
[1445] A5C6 06,A4,30        CALL PUSSTR            STACK THE STRING AND GET TOKE
[1446] A5C9 0F,74           XML  PARSE             Get position
[1447] A5CB B6              BYTE RPARZ
[1448] A5CC 0F,7E           XML  SPEED             Must have
[1449] A5CE 00              BYTE SYNCHK          *  ended on a
[1450] A5CF B6              BYTE RPARZ           *   right parenthesis
[1451] A5D0 06,A9,95        CALL INTARG            Check and convert it

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0025 
EQUATES EXEC-359
[1452] A5D3 8F,4A           DCZ  @FAC              Value out of range
[1453] A5D5 6D,EE           BS   ERRBV
[1454] A5D7 BD,0C,4A        DST  @FAC,@BYTES       Keep the offset
[1455] A5DA 93,0C           DDEC @BYTES            Correct for position 0
[1456] A5DC 0F,78           XML  VPOP              Get match string back
[1457] A5DE 35,00,08        MOVE 8,@FAC,@ARG       Put match in ARG
       A5E1 5C,4A
[1458] A5E3 0F,78           XML  VPOP              Get source back
[1459] A5E5 8E,51           CZ   @FAC7             If source null
[1460] A5E7 66,24           BS   POS12
[1461] A5E9 C4,51,0D        CH   @BYTES+1,@FAC7    OFFSET > LENGTH?
[1462] A5EC 46,24           BR   POS12             Yes, no match possible
[1463] A5EE 8E,63           CZ   @ARG7             If null string
[1464] A5F0 66,15           BS   POS06
[1465] A5F2 A1,4E,0C        DADD @BYTES,@FAC4      Adjust ptr for offset
[1466] A5F5 A4,51,0D        SUB  @BYTES+1,@FAC7    Adjust length
[1467] A5F8 C8,51,63 POS02  CHE  @ARG7,@FAC7       Enough space left for a match
[1468] A5FB 46,24           BR   POS12             No, no match possible
[1469] A5FD BD,4A,4E        DST  @FAC4,@FAC        Get first ARG
[1470] A600 BD,5C,60        DST  @ARG4,@ARG        Get second ARG
[1471] A603 BC,64,63        ST   @ARG7,@ARG8       And length of second
[1472] A606 D4,B0,5C POS04  CEQ  V*FAC,V*ARG       Compare the characters
       A609 B0,4A
[1473] A60B 46,1C           BR   POS10             Didn't match
[1474] A60D 91,4A           DINC @FAC              Next in source
[1475] A60F 91,5C           DINC @ARG              Next in match
[1476] A611 92,64           DEC  @ARG8             Reached end of match?
[1477] A613 46,06           BR   POS04             Not yet, so loop
[1478] A615 90,0D    POS06  INC  @BYTES+1          Matched! Correct for 1 index
[1479] A617 BD,4A,0C POS08  DST  @BYTES,@FAC       Character position of match
[1480] A61A 44,FB           BR   LEN02             Convert to floating point
[1481]               * NOTE: Utilizes the LEN code to do the conversion and
[1482]               *       finish up.
[1483] A61C 90,0D    POS10  INC  @BYTES+1          Step index of match character
[1484] A61E 92,51           DEC  @FAC7             Move 1 position down 1st
[1485] A620 91,4E           DINC @FAC4              Argument
[1486] A622 45,F8           BR   POS02             Try to match again
[1487]               * JUMP ALWAYS
[1488] A624 86,0D    POS12  CLR  @BYTES+1          NO MATCH POSSIBLE
[1489] A626 46,17           BR   POS08
[1490]               ***********************************************************
[1491]               * RPT$(A$,X) - Creates a string consisting of X copies of
[1492]               *              A$. If X is negative or non-numeric, an
[1493]               *              exception occurs. If A$ is not a string, an
[1494]               *              exception occurs.
[1495]               ***********************************************************
[1496] A628 06,AC,89 RPTZ01 CALL LPAR              Insure "(", parse, insure ","
[1497] A62B 06,A4,30        CALL PUSSTR            Insure a string and push it
[1498] A62E 0F,74           XML  PARSE             Parse second argument
[1499] A630 B6              BYTE RPARZ
[1500] A631 0F,7E           XML  SPEED             Must have
[1501] A633 00              BYTE SYNCHK       *     ended on a
[1502] A634 B6              BYTE RPARZ        *      right parenthesis
[1503] A635 06,A9,95        CALL INTARG            Check numeric and convert
[1504] A638 A9,4A,E0        DMUL V@6(@VSPTR),@FAC  Compute result length
       A63B 06,6E
[1505] A63D 8F,4B           DCZ  @FAC1
[1506] A63F 66,49           BS   GA649
[1507] A641 06,6A,82 WRNST2 CALL WARNZZ            Give truncation message
[1508] A644 13              BYTE 19                * STRING TRUNCATED message
[1509] A645 BF,4C,00        DST  255,@FAC2         Make it a maximum string
       A648 FF
[1510] A649 BD,0C,4C GA649  DST  @FAC2,@BYTES      Copy requested string length
[1511] A64C 0F,71           XML  GETSTR            Get the new string

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0026 
EQUATES EXEC-359
[1512] A64E 0F,78           XML  VPOP              Retrieve the original string
[1513]               * At this point BYTES should still contain the length
[1514] A650 BD,5C,50        DST  @FAC6,@ARG        Copy original length in ARG
[1515] A653 8F,0C           DCZ  @BYTES            Zero copies requested
[1516] A655 46,59           BR   GA659
[1517] A657 87,5C           DCLR @ARG              So we copy zero!!!!!!!
[1518] A659 C1,0C,5C GA659  DEX  @ARG,@BYTES       Original length to BYTE
[1519] A65C BD,66,4E        DST  @FAC4,@TEMP5      And also original start addr
[1520] A65F 86,52           CLR  @FAC8             Clear flag for LITS08
[1521] A661 06,A4,06        CALL LITS08            Create FAC and copy on copy
[1522]               * ARG contains total length now.
[1523] A664 BD,50,5C        DST  @ARG,@FAC6        Store new length
[1524] A667 A5,5C,0C RPTZ02 DSUB @BYTES,@ARG       Subtract one copy
[1525] A66A 8F,5C           DCZ  @ARG              <<<<<THE WAY OUT
[1526] A66C 66,84           BS   XMLCON
[1527] A66E A1,1C,0C        DADD @BYTES,@SREF      Compute new start address
[1528] A671 C5,0C,5C        DCH  @ARG,@BYTES
[1529] A674 46,79           BR   GA679
[1530] A676 BD,0C,5C        DST  @ARG,@BYTES       Truncate string
[1531] A679 34,0C,B0 GA679  MOVE @BYTES,V*TEMP5,V*SREF
       A67C 1C,B0,66
[1532] A67F 46,67           BR   RPTZ02
[1533]               **********************************************************
[1534]               ***********************************************************
[1535]               *                   TRACE STATEMENT
[1536]               ***********************************************************
[1537] A681 B6,45,10 NTRACE OR   >10,@FLAG         Set the trace bit
[1538] A684 0F,75    XMLCON XML  CONT              Continue on
[1539]               ***********************************************************
[1540]               *                 UNTRACE STATEMENT
[1541]               ***********************************************************
[1542] A686 B2,45,EF NUNTRC AND  >EF,@FLAG         Reset the trace bit
[1543] A689 0F,75           XML  CONT              Continue on
[1544]               ***********************************************************
[1545]               *          BREAK AND UNBREAK STATEMENTS
[1546]               ***********************************************************
[1547] A68B BE,5C,FF NBREAK ST   >FF,@ARG          BREAK flag
[1548] A68E 06,6A,78        CALL CHKEND            Check for end of statement
[1549] A691 46,A4           BR   LINEGP            If not goto LINEGP
[1550] A693 93,2C           DDEC @PGMPTR           Back up so CON will rescan en
[1551] A695 8E,44           CZ   @PRGFLG           Rative without line #
[1552] A697 41,27           BR   EXEC6C
[1553] A699 06,6A,84 ERROLP CALL ERRZZ             Only legal in a program
[1554] A69C 1B              BYTE 27
[1555] A69D 86,5C    NUNBRK CLR  @ARG              UNBREAK flag for common
[1556] A69F 06,6A,78        CALL CHKEND            Check for end of statement
[1557] A6A2 66,F7           BS   UNBK01            If end then goto UNBK01
[1558] A6A4 06,A8,D3 LINEGP CALL LINE              Get line #
[1559] A6A7 BD,5E,32        DST  @ENLN,@ARG2
[1560] A6AA A7,5E,00        DSUB >03,@ARG2         1st line #
       A6AD 03
[1561] A6AE C9,5E,30 LNGP1  DCHE @STLN,@ARG2       If line not found
[1562] A6B1 46,F1           BR   WRNLNF
[1563] A6B3 06,80,2E        CALL GRSUB3            Read line # of data from ERAM
[1564] A6B6 5E              BYTE >5E           *   (use GREAD1) or VDP
[1565]               * @ARG2: Source addr in ERAM/VDP, reset possible breakpoint
[1566] A6B7 D5,58,4A        DCEQ @FAC,@EEE1        If line found
[1567] A6BA 66,C2           BS   LNGP2
[1568] A6BC A7,5E,00        DSUB 4,@ARG2           Next line in VDP or ERAM
       A6BF 04
[1569] A6C0 46,AE           BR   LNGP1
[1570]               * JUMP ALWAYS
[1571] A6C2 8E,80,84 LNGP2  CZ   @RAMTOP           If ERAM exists
[1572] A6C5 66,DA           BS   GA6DA

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0027 
EQUATES EXEC-359
[1573] A6C7 B2,58,7F        AND  >7F,@EEE1         Assume UNBREAK flag
[1574] A6CA 8E,5C           CZ   @ARG              If BREAK flag
[1575] A6CC 66,D1           BS   GA6D1
[1576] A6CE B6,58,80        OR   >80,@EEE1         Set the breakpoint
[1577] A6D1 06,60,36 GA6D1  CALL GWSUB             Write a few bytes of data to
[1578]               *                              ERAM (use GWRITE)
[1579] A6D4 5E,58,01        BYTE >5E,>58,>01     * ARG2,EEE1,1
[1580]               *                            @ARG2: Destination addr on ERA
[1581]               *                            @EEE1: Data
[1582]               *                            1    : Byte count
[1583] A6D7 05,A6,E6        B    LNGP2B
[1584] A6DA B2,B0,5E GA6DA  AND  >7F,V*ARG2        Assume UNBREAK flag first
       A6DD 7F
[1585] A6DE 8E,5C           CZ   @ARG              If BREAK flag
[1586] A6E0 66,E6           BS   LNGP2B
[1587] A6E2 B6,B0,5E        OR   >80,V*ARG2        Set the breakpoint
       A6E5 80
[1588] A6E6 06,6A,78 LNGP2B CALL CHKEND            Check for end of statement
[1589] A6E9 66,FA           BS   LNGP4             If end then continue
[1590] A6EB 0F,7E           XML  SPEED             Must be
[1591] A6ED 00              BYTE SYNCHK         *     at a
[1592] A6EE B3              BYTE COMMAZ         *       comma now
[1593] A6EF 46,A4           BR   LINEGP
[1594]               * JUMP ALWAYS
[1595] A6F1 06,6A,82 WRNLNF CALL WARNZZ            Note: warning not error
[1596] A6F4 26              BYTE 38             *  'LINE NOT FOUND'
[1597] A6F5 46,E6           BR   LNGP2B            And contiue on
[1598]               * JUMP ALWAYS
[1599] A6F7 06,A6,FC UNBK01 CALL UBSUB             Clear all bkpt in line # tabl
[1600] A6FA 0F,75    LNGP4  XML  CONT              Contiue
[1601]               *     CLEAR ALL BREAKPOINTS
[1602] A6FC BD,52,30 UBSUB  DST  @STLN,@FAC8       END OF LINE # BUFFER
[1603] A6FF 06,A7,0C GA6FF  CALL UBSUB1            Reset one line # at a time
[1604] A702 A3,52,00        DADD 4,@FAC8           Got to the next line
       A705 04
[1605] A706 C5,52,32        DCH  @ENLN,@FAC8       End of table
[1606] A709 46,FF           BR   GA6FF
[1607] A70B 00              RTN
[1608] A70C 06,80,2E UBSUB1 CALL GRSUB3            Read the line # from ERAM/VDP
[1609]               *                             Reset possible bkpt too
[1610] A70F 52              BYTE >52            *  @FAC8: Source addr on ERAM/VD
[1611] A710 06,60,36        CALL GWSUB             Write a few bytes of data to
[1612]               *                              ERAM(use GWRITE) or VDP
[1613] A713 52,58,01        BYTE >52,>58,>01    *  FAC8,EEE1,1
[1614]               *                          @FAC8: Destination adr in ERAM/V
[1615]               *                          @EEE1: Data
[1616]               *                          1    : Byte count
[1617] A716 00              RTN
[1618]               ***********************************************************
[1619]               *                USER DEFINED FUNCTIONS
[1620]               * Subroutine to store away the information of the tokens in
[1621]               * a function reference, go into the 'DEF' statement,
[1622]               * calculate the value of the expression and then resume
[1623]               * execution of the user's program after the reference.
[1624]               * An entry in the FAC and on the stack for a function
[1625]               * reference looks like:
[1626]               * +--------+-----+---------------------+--------+---------+
[1627]               * | PGMPTR | >68 | string/numeric flag | SYMTAB | FREPTR  |
[1628]               * +--------+-----+---------------------+--------+---------+
[1629]               *  FAC      FAC2  FAC3                  FAC4     FAC6
[1630]               *
[1631]               * The 'PGMPTR' is where execution resumes after evaluating
[1632]               * the function. String (80)/numeric(00) flag is function
[1633]               * type. SYMTAB is the old symbol table pointer and FREPTR

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0028 
EQUATES EXEC-359
[1634]               * is the old free space pointer. These are restored after
[1635]               * the function is evaluated.
[1636]               ***********************************************************
[1637] A717 8E,44    UDF    CZ   @PRGFLG           If imperative
[1638] A719 47,20           BR   GA720
[1639] A71B 8E,80,85        CZ   @RAMTOP+1         And ERAM, error
[1640] A71E 46,99           BR   ERROLP
[1641] A720 86,51    GA720  CLR  @FAC7             Assume no args
[1642] A722 87,22           DCLR @ERRCOD           Clear the error code for cont
[1643] A724 86,5E           CLR  @ARG2             Safety for VPUSH
[1644] A726 86,4C           CLR  @FAC2             Sagety for VPUSH
[1645] A728 D6,42,B7        CEQ  LPARZ,@CHAT
[1646] A72B 47,3B           BR   GA73B
[1647] A72D 0F,77           XML  VPUSH             Save ptr to function definiti
[1648] A72F 0F,74           XML  PARSE             PARSE to get arg value
[1649] A731 FF              BYTE >FF
[1650] A732 35,00,08        MOVE 8,@FAC,@ARG       Save PARSE result
       A735 5C,4A
[1651] A737 0F,78           XML  VPOP              Get S.T. ptr to function defi
[1652] A739 90,51           INC  @FAC7             Indicate theat we have an arg
[1653] A73B BC,66,51 GA73B  ST   @FAC7,@TEMP5      Move the parmeter count
[1654] A73E BD,64,4A        DST  @FAC,@TEMP4       S.T. ptr to definition
[1655] A741 0F,77           XML  VPUSH             Allow room for UDF result
[1656] A743 35,00,08        MOVE 8,@ARG,@FAC       Retrieve parse result
       A746 4A,5C
[1657] A748 0F,77           XML  VPUSH             Save parse result
[1658] A74A BC,4C,B0        ST   V*TEMP4,@FAC2     Get S.T. declarations
       A74D 64
[1659] A74E BC,4D,4C        ST   @FAC2,@FAC3       Do this to save string bit
[1660]               * NOTE: THIS IS TO ALLOW THE CHECKING AFTER THE FUNCTION HA
[1661]               *       BEEN EVALUATED TO MAKE SURE THE FUNCTION
[1662]               *       TYPE (STRING/NUMERIC) MATCHES THE RESULT IT PRODUCE
[1663] A751 B2,4C,07        AND  >07,@FAC2         Mask all but # of parameters
[1664] A754 D4,4C,66        CEQ  @TEMP5,@FAC2
[1665] A757 4D,F2           BR   ERRIAL
[1666]               * Incorrect argument list error above.
[1667] A759 BD,4A,2C        DST  @PGMPTR,@FAC      Will resume execution here
[1668] A75C BE,4C,70        ST   >70,@FAC2         Entering parameter into symbo
[1669]               *                    table while in UDF statement executing
[1670] A75F B2,4D,80        AND  >80,@FAC3         Mask all but string bit
[1671] A762 A7,6E,00        DSUB 16,@VSPTR         Get below parse result
       A765 10
[1672]                
[1673] A766 BD,4E,3E        DST  @SYMTAB,@FAC4     Save current symbol table ptr
[1674] A769 BD,50,40        DST  @FREPTR,@FAC6     Save current free space ptr
[1675] A76C 0F,77           XML  VPUSH             Save the return info
[1676] A76E A3,6E,00        DADD 8,@VSPTR          Get back to parse result
       A771 08
[1677]               *********** SHIFT EXECUTION TO FUNCTION DEFINITION ********
[1678] A772 BD,2C,E0        DST  V@6(@TEMP4),@PGMPTR    Set text ptr to definiti
       A775 06,64
[1679] A777 0F,79           XML  PGMCHR            Get 1st character in the defi
[1680] A779 C6,73,A4        CH   >A4,@SUBSTK       Stack overflow
[1681] A77C 6D,CA           BS   ERRSO
[1682] A77E 35,00,18        MOVE 24,@VAR0,V@VROAZ  Roll out temporaries
       A781 A3,C0,00
[1683] A784 B6,45,08        OR   >08,@FLAG         Set function flag for ENTER
[1684] A787 BE,16,80        ST   >80,@XFLAG        Make calls look like ENTERX
[1685] A78A D6,42,BE        CEQ  EQUALZ,@CHAT
[1686] A78D 47,9C           BR   GA79C
[1687]               * NOTE: This is to keep the global/local variables correct
[1688]               *       the event that a function uses another function in
[1689]               *       its evaluation.
[1690] A78F 86,59           CLR  @FAC15            Create a dummy entry in table

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0029 
EQUATES EXEC-359
[1691] A791 06,6A,80        CALL ENT09              for no-paremter function
[1692] A794 97,2C           DDECT @PGMPTR          Back up to equal sign
[1693] A796 86,E0,02        CLR  V@2(@VSPTR)       This is to keep ASSGNV(called
       A799 6E
[1694]               *                              below) not to screw up in
[1695]               *                              case FAC2 happens to have a
[1696]               *                              value (greater) >65
[1697] A79A 47,9F           BR   GA79F
[1698] A79C 06,6A,7E GA79C  CALL ENTER             Enter the parameter
[1699] A79F 0F,79    GA79F  XML  PGMCHR            Get the '=' (Checked in PSCAN
[1700] A7A1 B2,45,F7        AND  >F7,@FLAG         Reset to normal ENTERs
[1701] A7A4 35,00,18        MOVE 24,V@VROAZ,@>8300
       A7A7 00,A3,C0
[1702] A7AA BE,EF,FF        ST   >68,V@-6(@VSPTR)  Correct stack entry ID
       A7AD FA,6E,68
[1703] A7B0 BD,E0,02        DST  V@SYMBOL,V@2(@SYMTAB)  Fudge link to
       A7B3 3E,A3,76
[1704]               *                                   get global values
[1705] A7B6 BD,4A,3E        DST  @SYMTAB,@FAC      Set up for SMB
[1706] A7B9 0F,7B           XML  SMB               Get value space
[1707] A7BB 35,00,08        MOVE 8,@FAC,@FAC8      Destination
       A7BE 52,4A
[1708] A7C0 0F,78           XML  VPOP              Get arg back
[1709] A7C2 35,00,08        MOVE 8,@FAC,@ARG       Argument value
       A7C5 5C,4A
[1710] A7C7 35,00,08        MOVE 8,@FAC8,@FAC      Destination
       A7CA 4A,52
[1711] A7CC 0F,77           XML  VPUSH             Push to destination
[1712] A7CE 35,00,08        MOVE 8,@ARG,@FAC       Argument value
       A7D1 4A,5C
[1713] A7D3 D6,4C,65        CEQ  >65,@FAC2         If a string
[1714] A7D6 47,E2           BR   GA7E2
[1715] A7D8 D7,4A,00        DCEQ >001C,@FAC        If not temp
       A7DB 1C
[1716] A7DC 67,E2           BS   GA7E2
[1717] A7DE BD,4E,B0        DST  V*FAC,@FAC4       Get new location of string
       A7E1 4A
[1718]               *                             Parameter was allocated in S.
[1719] A7E2 0F,79    GA7E2  XML  PGMCHR            Skip the '='
[1720] A7E4 0F,7C           XML  ASSGNV            Assign the value to the param
[1721] A7E6 0F,74           XML  PARSE             PARSE to end of function defi
[1722] A7E8 83              BYTE TREMZ
[1723]               **** CHECK FOR TYPE MATCH (STRING/STRING OR NUM/NUM)*******
[1724]               **** BETWEEN THE RESULT AND THE FUNCTION TYPE *************
[1725] A7E9 D6,4C,65        CEQ  >65,@FAC2         If result string
[1726] A7EC 47,F6           BR   GA7F6
[1727] A7EE 8E,E0,03        CZ   V@3(@VSPTR)       If functional
       A7F1 6E
[1728] A7F2 6D,BE           BS   ERRSNM
[1729] A7F4 47,FC           BR   GA7FC              not a string
[1730] A7F6 8E,E0,03 GA7F6  CZ   V@3(@VSPTR)       If functional
       A7F9 6E
[1731] A7FA 4D,BE           BR   ERRSNM
[1732]               ***** NOW RESTORE SYMBOL TABLE AND RESUME *****************
[1733]               ***** EXECUTION AT THE ORIGINAL LINE **********************
[1734] A7FC 06,A8,0A GA7FC  CALL DELINK            Delink the parameter entry
[1735] A7FF BD,2C,E0        DST  V@8(@VSPTR),@PGMPTR Manual pop to get ptr back
       A802 08,6E
[1736] A804 93,2C           DDEC @PGMPTR           Back up text pointer
[1737] A806 0F,79           XML  PGMCHR            Get next token
[1738] A808 0F,75           XML  CONT
[1739] A80A BD,66,3E DELINK DST  @SYMTAB,@TEMP5    Save addr of S.T. entry just
[1740]               *                             in case entry is a string
[1741]               *                             (must free the string)

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0030 
EQUATES EXEC-359
[1742] A80D 35,00,04        MOVE 4,V@4(@VSPTR),@SYMTAB  Restore old symbol table
       A810 3E,E0,04
       A813 6E
[1743]               *                             pointer and free space pointe
[1744]               *                             This handles the freeing of t
[1745]               *                             string value which was assign
[1746]               *                             to the parameter.
[1747] A814 D2,B0,66        CGE  0,V*TEMP5         If string parmeter
       A817 00
[1748] A818 68,4C           BS   GA84C
[1749] A81A BD,66,E0        DST  V@6(@TEMP5),@TEMP5 Where the string is
       A81D 06,66
[1750] A81F 8F,66           DCZ  @TEMP5            If non-null string
[1751] A821 68,33           BS   GA833
[1752] A823 BD,56,EF        DST  V@-3(@TEMP5),@TEMP2 Get backpointer
       A826 FF,FD,66
[1753] A829 C9,56,3E        DCHE @SYMTAB,@TEMP2    If not used
[1754] A82C 68,33           BS   GA833
[1755] A82E 87,EF,FF        DCLR V@-3(@TEMP5)      Free up the string
       A831 FD,66
[1756]               * This handles the special case of F$(X$)=X$
[1757]               * The result, which was permanent, must be made a temp.
[1758] A833 D6,4C,65 GA833  CEQ  >65,@FAC2         If string result
[1759] A836 48,4A           BR   GA84A
[1760] A838 C9,4A,3E        DCHE @SYMTAB,@FAC      If came from argument
[1761] A83B 68,4A           BS   GA84A
[1762] A83D 8F,4E           DCZ  @FAC4             If non-null
[1763] A83F 68,46           BS   GA846
[1764] A841 87,EF,FF        DCLR V@-3(@FAC4)       Clear the backpointer
       A844 FD,4E
[1765] A846 BF,4A,00 GA846  DST  >001C,@FAC        Make it a temp
       A849 1C
[1766] A84A 48,56    GA84A  BR   GA856             If numeric parameter
[1767] A84C 8E,80,84 GA84C  CZ   @RAMTOP           If ERAM exist
[1768] A84F 68,56           BS   GA856
[1769] A851 A3,80,86        DADD 8,@RAMFRE         Remove 8 bytes of value
       A854 00,08
[1770] A856 A7,6E,00 GA856  DSUB 8,@VSPTR          Trash the stack entry
       A859 08
[1771] A85A 00              RTN                    And retrun
[1772] A85B 0F,74    ATTNUT XML  PARSE
[1773] A85D B6              BYTE RPARZ
[1774] A85E 06,A3,ED        CALL CKSTNM            CHECK FOR NUMERIC OR STRING
[1775] A861 0F,7E           XML  SPEED             Insure argument is in
[1776] A863 02              BYTE RANGE          *   range of 0-30
[1777] A864 00              BYTE 0
[1778] A865 00,1E           DATA 30
[1779] A867 E6,4B,01        SRL  1,@FAC1           0,1 : 0000        ATTENUATION
[1780]               *                             2,3 : 0001
[1781]               *                             4,5 : 0010
[1782]               *                             6,7 : 0011        ETC...
[1783] A86A B6,4B,F0        OR   >F0,@FAC1         REGISTER BITS
[1784] A86D 00              RTN
[1785]               ***********************************************************
[1786]               * SUBROUTINE TO SET POINTER TO EACH DATUM
[1787]               ***********************************************************
[1788] A86E 93,36    DATAST DDEC @LNBUF            Point to 1st byte of line ptr
[1789] A870 06,80,2C        CALL GRSUB2            Read 2 bytes from VDP or ERAM
[1790] A873 36              BYTE LNBUF           *  (use GREAD1), @LNBUF: Source
[1791]               *                           *  address in ERAM or VDP
[1792] A874 BD,34,58        DST  @EEE1,@DATA       Put it in @DATA
[1793] A877 06,80,20        CALL SRDATA            Look for 'DATA' on the line
[1794] A87A 48,89           BR   DATST1            OK, FOUND ANOTHER 'DATA' STMT
[1795] A87C 97,36           DDECT @LNBUF           NO

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0031 
EQUATES EXEC-359
[1796] A87E D5,36,30        DCEQ  @STLN,@LNBUF
[1797] A881 68,87           BS   GA887
[1798] A883 93,36           DDEC @LNBUF            Point to 1st token address
[1799] A885 48,6E           BR   DATAST
[1800] A887 86,34    GA887  CLR  @DATA             Indicate no data
[1801] A889 00       DATST1 RTN
[1802]               ***********************************************************
[1803]               * Subroutine to get line number and goto routine to display
[1804]               * it on the screen.
[1805]               ***********************************************************
[1806] A88A 8E,80,89 ASC    CZ   @RAMFLG
[1807] A88D 48,97           BR   GA897
[1808] A88F BD,5E,EF        DST  V@-2(@EXTRAM),@ARG2   Get line # in
       A892 FF,FE,2E
[1809] A895 48,A5           BR   GA8A5
[1810] A897 BF,56,00 GA897  DST  2,@FFF1           @FFF1 : Byte count
       A89A 02
[1811] A89B BD,54,2E        DST  @EXTRAM,@DDD1     @DDD1 : Source addr in ERAM
[1812] A89E 97,54           DDECT @DDD1
[1813] A8A0 0F,8C           XML  GREAD1            Read data from ERAM
[1814] A8A2 BD,5E,58        DST  @EEE1,@ARG2       @EEE1 : Destination addr on C
[1815] A8A5 B2,5E,7F GA8A5  AND  >7F,@ARG2         Reset the breakpoint if any
[1816] A8A8 05,6A,7C        B    DISO
[1817]               ***********************************************************
[1818]               * Code to decode error returned from ALC
[1819]               ***********************************************************
[1820] A8AB 8A,22    ERORZ  CASE @ERRCOD           DECODE ERROR FROM INTERPRETER
[1821] A8AD 4D,BA           BR   ERRSYN            0 SYNTAX ERROR
[1822] A8AF 4D,C6           BR   ERRMEM            1 MEMORY FULL
[1823] A8B1 4D,EE           BR   ERRBV             2 BAD VALUE
[1824] A8B3 4D,E6           BR   ERRLNF            3 LINE NOT FOUND
[1825] A8B5 4D,BA           BR   ERRSYN            4 SYNTAX
[1826] A8B7 4D,E2           BR   ERRBS             5 BAD SUBSCRIPT
[1827] A8B9 4D,BE           BR   ERRSNM            6 STRING-NUMBER MISMATCH
[1828] A8BB 4D,CA           BR   ERRSO             7 STACK OVERFLOW
[1829] A8BD 4D,EA           BR   ERRBA             8 BAD ARGUMENT
[1830] A8BF 4D,DE           BR   ERRRWG            9 RETURN WITHOUT GOSUB
[1831] A8C1 4D,F2           BR   ERRIAL            A INCORRECT ARGUMENT LIST
[1832] A8C3 4D,D2           BR   ERRFNN            B FOR/NEXT NESTING
[1833] A8C5 4D,CE           BR   ERRNWF            C NEXT WITHOUT FOR
[1834] A8C7 4D,C2           BR   ERRMUV            D IMPROPERLY USED NAME
[1835] A8C9 4D,F2           BR   ERRIAL            E INCORRECT ARGUMENT LIST
[1836] A8CB 4D,DA           BR   ERRRSC            F RECURSIVE SUBPROGRAM CALL
[1837] A8CD 4D,F6           BR   ERRSNF           10 SUBPROGRAM NOT FOUND
[1838] A8CF 46,99           BR   ERROLP           11 ONLY LEGAL IN A PROGRAM
[1839] A8D1 4D,D6           BR   ERRSNS           12 MUST BE IN SUBPROGRAM
[1840]               ***********************************************************
[1841]               * SUBROUTINE TO GET LINE # FOLLOWING 'BREAK', 'UNBREAK',
[1842]               * 'RESTORE'
[1843]               ***********************************************************
[1844] A8D3 D6,42,C9 LINE   CEQ  LNZ,@CHAT         Should be line # reference
[1845] A8D6 4D,BA           BR   ERRSYN
[1846] A8D8 0F,79           XML  PGMCHR            Get high order line #
[1847] A8DA BC,4A,42        ST   @CHAT,@FAC        Build result in FAC, FAC1
[1848] A8DD 0F,79           XML  PGMCHR
[1849] A8DF BC,4B,42        ST   @CHAT,@FAC1       Low order line #
[1850] A8E2 0F,79           XML  PGMCHR            Get token following line #
[1851] A8E4 00              RTN
[1852] A8E5 86,54    CONV1  CLR  @FAC10
[1853] A8E7 0F,10           XML  CSNUM             Convert String to Number
[1854]               ***********************************************************
[1855] A8E9 BC,A3,BA        ST   @FAC10,V@CSNTP1
       A8EC 54
[1856] A8ED BD,A3,90        DST  @FAC12,V@CSNTMP Save those in temporary, becaus

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0032 
EQUATES EXEC-359
       A8F0 56
[1857]               *                            in ERROV : WARNING routine hav
[1858]               *                            FAC12 and FAC10 values changed
[1859]               ***********************************************************
[1860] A8F1 8E,54    WRNNO  CZ   @FAC10            Numeric overflow
[1861] A8F3 68,F9           BS   GA8F9
[1862] A8F5 06,6A,82        CALL WARNZZ
[1863] A8F8 02              BYTE 2
[1864] A8F9 00       GA8F9  RTN
[1865]               ***********************************************************
[1866]               *                SUBROUTINE FOR 'GCHAR'
[1867]               ***********************************************************
[1868] A8FA 06,AC,A9 GCHAR  CALL GPHV              Get X,Y values
[1869] A8FD 06,A9,DD GCHAR2 CALL NUMVAR            Get pointer to return variabl
[1870] A900 31,00,08        MOVE 8,G@FLT1,@FAC     Clear FAC
       A903 4A,A3,F3
[1871] A906 BC,4B,7D        ST   @CB,@FAC1         Get the character
[1872] A909 A6,4B,60        SUB  OFFSET,@FAC1      Remove screen offset
[1873] A90C CA,4B,64        CHE  100,@FAC1
[1874] A90F 49,19           BR   GA919
[1875] A911 C0,4C,4B        EX   @FAC1,@FAC2
[1876] A914 AE,4B,64        DIV  100,@FAC1
[1877] A917 90,4A           INC  @FAC
[1878] A919 0F,7C    GA919  XML  ASSGNV            Assign the value to the symbo
[1879]               * RXB PATCH CODE
[1880] A91B 5E,4D           BR   GCHARA
[1881]               ***********************************************************
[1882]               *               SUBROUTINE FOR 'COLOR'
[1883]               ***********************************************************
[1884] A91D 0F,7E    COLOR  XML  SPEED             Must be
[1885] A91F 00              BYTE SYNCHK        *     at a
[1886] A920 B7              BYTE LPARZ         *       left parenthesis
[1887]               * RXB PATCH CODE
[1888] A921 87,00    COL08  DCLR @VAR0             Clear ALL pointer
[1889] A923 D6,42,EC        CEQ  ALLZ,@CHAT        ALL?
[1890] A926 49,34           BR   COL09             No.
[1891] A928 BE,00,EC        ST   ALLZ,@VAR0        Yes, store it in pointer
[1892] A92B 87,4A           DCLR @FAC              Set 0
[1893] A92D 0F,79           XML  PGMCHR            Skip ALL token.
[1894] A92F 06,B1,AD        CALL COMMA2            Skip comma.
[1895] A932 49,52           BR   COL21             Start ALL RXB routine
[1896] A934 D6,42,FD COL09  CEQ  NUMBEZ,@CHAT      If sprite number specified
[1897] A937 49,49           BR   COL20
[1898] A939 06,AD,FA        CALL CHAR1             Check sprite number (SPNUM3)
[1899] A93C 06,A9,89 COL10  CALL SPCOL             Put the color in SAL
[1900] A93F D6,42,B3        CEQ  COMMAZ,@CHAT      More color changes
[1901] A942 4B,1A           BR   LNKRTN
[1902] A944 06,AD,FC        CALL CHAR2             Skip and get sprite number (S
[1903] A947 49,3C           BR   COL10
[1904]               * This part for regular color change routine
[1905] A949 0F,7E    COL20  XML  SPEED             Parse the character
[1906] A94B 01              BYTE PARCOM         *   set and insure a comma
[1907] A94C 0F,7E           XML  SPEED             Insure in range of
[1908] A94E 02              BYTE RANGE          *   0<= x <= 14
[1909]               * RXB PATCH CODE
[1910]               *      BYTE 0,0,14
[1911] A94F 00,00,10        BYTE 0,0,16
[1912] A952 A3,4A,08 COL21  DADD >080F,@FAC        Color table addr(>0810 - >081
       A955 0F
[1913] A956 0F,77           XML  VPUSH             Push table set address
[1914] A958 0F,7E           XML  SPEED             Parse the foreground color
[1915] A95A 01              BYTE PARCOM         *   and insure a comma
[1916] A95B 06,AC,A0        CALL RAN16             Error if >16 or <1
[1917] A95E BC,0E,4B        ST   @FAC1,@VAR4       Save it

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0033 
EQUATES EXEC-359
[1918] A961 E2,0E,04        SLL  4,@VAR4           Foreground color in 4 MSBits
[1919] A964 0F,74           XML  PARSE             Get background color
[1920] A966 B6              BYTE RPARZ
[1921] A967 06,AC,A0        CALL RAN16             Error if >16 or <1
[1922] A96A B4,0E,4B        OR   @FAC1,@VAR4       Background color in 4 LSBits
[1923] A96D 0F,78           XML  VPOP              Get color table address
[1924] A96F BC,B0,4A        ST   @VAR4,V*FAC       Load the colors into the tabl
       A972 0E
[1925]               * RXB PATCH CODE
[1926] A973 D6,00,EC        CEQ  ALLZ,@VAR0        ALL in pointer.
[1927] A976 49,80           BR   COL22             No.
[1928] A978 35,00,0E        MOVE 14,V*FAC,V@1(@FAC) Fill color table with values
       A97B E0,01,4A
       A97E B0,4A
[1929] A980 D6,42,B3 COL22  CEQ  COMMAZ,@CHAT      End of call. Go back.
[1930] A983 4B,1A           BR   LNKRTN
[1931] A985 0F,79           XML  PGMCHR            Skip ","
[1932] A987 49,21           BR   COL08             Take care of the next set
[1933]               *      CALL SPCOL -- Changes color of sprite.
[1934]               *                    Called also from SPRITE.
[1935] A989 0F,74    SPCOL  XML  PARSE
[1936] A98B B6              BYTE RPARZ          *  Get the color number
[1937] A98C 06,AC,A0        CALL RAN16             Check range 1 - 16
[1938] A98F BC,E0,03        ST   @FAC1,V@3(@SPSAL) Store in SAL
       A992 08,4B
[1939] A994 00              RTN
[1940]               ***********************************************************
[1941]               * INTARG - Insures that the value in FAC is a numeric,
[1942]               *          converts it to integer, issues error message if
[1943]               *          necessary or returns.
[1944]               ***********************************************************
[1945] A995 C6,4C,63 INTARG CH   >63,@FAC2         If string - error
[1946] A998 6D,BE           BS   ERRSNM
[1947] A99A 86,54           CLR  @FAC10            ASSUME NO ERROR OR WARNING
[1948] A99C 87,6C           DCLR @FPERAD
[1949] A99E 0F,12           XML  FLTINT
[1950] A9A0 8E,54           CZ   @FAC10            If error
[1951] A9A2 4D,EE           BR   ERRBV
[1952] A9A4 D2,4A,00        CGE  0,@FAC            Can't be < zero
[1953] A9A7 4D,EE           BR   ERRBV
[1954] A9A9 00              RTN
[1955]               * FAC IS SET UP WITH F.P. 1
[1956] A9AA BC,4B,00 JOYXY  ST   @VAR0,@FAC1
[1957] A9AD 8E,00           CZ   @VAR0             If <>0
[1958] A9AF 49,B5           BR   GA995
[1959] A9B1 86,4A           CLR  @FAC              (>0000000000000000)
[1960] A9B3 49,BD           BR   GA99D
[1961] A9B5 D2,00,00 GA995  CGE  0,@VAR0
[1962] A9B8 69,BD           BS   GA99D
[1963] A9BA BE,4A,BF        ST   >BF,@FAC
[1964] A9BD 0F,7C    GA99D  XML  ASSGNV            Assign the value
[1965] A9BF 00              RTN
[1966] A9C0 BC,00,4B        ST   @FAC1,@VAR0       Keyboard selection
[1967] A9C3 06,A9,DD        CALL NUMVAR            Get variable for key-code
[1968] A9C6 D6,42,B3        CEQ  COMMAZ,@CHAT      If not comma - error
[1969] A9C9 4D,BA           BR   ERRSYN
[1970] A9CB 0F,79           XML  PGMCHR            Get next character
[1971] A9CD 06,A9,DD        CALL NUMVAR            Get variable for key-status
[1972] A9D0 BC,74,00        ST   @VAR0,@KEYBD      Keyboard selection
[1973] A9D3 31,00,08        MOVE 8,G@FLT1,@FAC     Set up float
       A9D6 4A,A3,F3
[1974] A9D9 03              SCAN                   SCAN the keyboard
[1975] A9DA 86,74           CLR  @KEYBD            Clear the code(No affect on s
[1976] A9DC 01              RTNC                   Return scan condition code

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0034 
EQUATES EXEC-359
[1977] A9DD 0F,7A    NUMVAR XML  SYM               Get the symbol name
[1978] A9DF DA,B0,4A        CLOG >C0,V*FAC         Can't be string or function
       A9E2 C0
[1979] A9E3 4D,C2           BR   ERRMUV            It is, IMPROPERLY USED NAME E
[1980] A9E5 0F,7B           XML  SMB               Get value pointer
[1981] A9E7 0F,77           XML  VPUSH             Put on stack for ASSGNV
[1982] A9E9 00              RTN                    And return
[1983] A9EA 80,00,A0 ATTREG DATA >8000,>A000,>C000,
       A9ED 00,C0,00
[1984] A9F0 9F,BF,DF        BYTE >9F,>BF,>DF,>FF,>00,>06
       A9F3 FF,00,06
[1985] A9F6 D6,42,B7 COMB   CEQ  LPARZ,@CHAT       If not '(' - error
[1986] A9F9 4D,BA           BR   ERRSYN
[1987] A9FB 00              RTN
[1988] A9FC 35,00,08 SQUISH MOVE 8,V*FAC8,@FAC     Sneak it out
       A9FF 4A,B0,52
[1989] AA02 BD,58,6E        DST  @VSPTR,@FAC14     Now move stack to squish it
[1990] AA05 A5,58,52        DSUB @FAC8,@FAC14        out - # of bytes to move
[1991] AA08 6A,13           BS   SQU05             If none to move
[1992] AA0A 34,58,EF        MOVE @FAC14,V@8(@FAC8),V@-16(@FAC8)
       AA0D FF,F0,52
       AA10 E0,08,52
[1993] AA13 A7,6E,00 SQU05  DSUB 8,@VSPTR
       AA16 08
[1994] AA17 00              RTN
[1995]               ***********************************************************
[1996]               *                 SUBPROGRAM FOR CLEAR
[1997]               ***********************************************************
[1998] AA18 07,80    CLEAR  ALL  SPACE+OFFSET      Clear the screen
[1999] AA1A BE,7F,03        ST   3,@XPT            Initialize screen pointer
[2000] AA1D 4B,1E           BR   LNKRT2            Return to caller
[2001]               ***********************************************************
[2002]               *               SUBPROGRAM FOR VERSION
[2003]               ***********************************************************
[2004] AA1F 06,A9,F6 VERS   CALL COMB              Insure have left parenthesis
[2005] AA22 06,AD,AF        CALL ERRC05            Get symbol information
[2006]               *----------------------------------------------------------
[2007]               * Change version number to 110     6/16/1981
[2008] AA25 BF,4A,07        DST  2015,@FAC              8/17/2014
       AA28 DF
[2009] AA29 0F,80           XML  CIF               Convert to floating point
[2010]               *----------------------------------------------------------
[2011] AA2B 51,B8           BR   ASSRTN            Assign and return to caller
[2012]               * INIALIZATION DATA FOR SOUND
[2013] AA2D 42,0B,12 FLTS   BYTE >42,>0B,>12,>22,>00,>00,>00,>00
       AA30 22,00,00
       AA33 00,00
[2014] AA35 01,FF,01 SNDREG BYTE >01,>FF,>01,>04,>9F,>BF,>DF,>FF,>00
       AA38 04,9F,BF
       AA3B DF,FF,00
[2015]               ***********************************************************
[2016]               *                SUBPROGRAM FOR 'SOUND'
[2017]               * Builds 2 blocks in VDP RAM
[2018]               * 1st BLOCK : >01,<ATTENUATION FOR NOISE>,<INTERRUPT COUNT>
[2019]               * 2nd BLOCK : >04,>9F,>BF,>DF,>FF,>00
[2020]               ***********************************************************
[2021] AA3E D7,80,CC XSOUND DCEQ VRMSND,@>83CC     Insure previous sound started
       AA41 03,79
[2022] AA43 6A,3E           BS   XSOUND
[2023] AA45 31,00,09        MOVE 9,G@SNDREG,V@VRMSND
       AA48 A3,79,AA
       AA4B 35
[2024] AA4C 06,AC,89        CALL LPAR              Duration in milliseconds
[2025] AA4F D2,4A,00        CGE  0,@FAC            Don't wait for completion

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0035 
EQUATES EXEC-359
[2026] AA52 6A,59           BS   GAA39
[2027] AA54 83,4A           DNEG @FAC                of previous sound
[2028] AA56 87,80,CE        DCLR @PRTNFN           Make GPL interpeters stop pre
[2029] AA59 0F,7E    GAA39  XML  SPEED             Insure duration
[2030] AA5B 02              BYTE RANGE           *  is in range
[2031] AA5C 01              BYTE 1               *   of 1 - 4250
[2032] AA5D 10,9A           DATA 4250
[2033]               * Convert duration into 1/60s of a second
[2034] AA5F AB,4A,00        DMUL 6,@FAC            Duration * 6
       AA62 06
[2035] AA63 AF,4A,00        DDIV 100,@FAC          (duration * 6) / 100
       AA66 64
[2036] AA67 8E,4B           CZ   @FAC1             If duration =0
[2037] AA69 4A,6D           BR   GAA4D
[2038] AA6B 90,4B           INC  @FAC1             Set it to 1/60th of a second
[2039] AA6D BC,A3,7B GAA4D  ST   @FAC1,V@VRMSND+2    3rd byte of the 1st block
       AA70 4B
[2040]               *                          | INTERUPT COUNT
[2041]               ***********************************************************
[2042]               *      SOUND TABLE OF 10 BYTES IN CPU RAM (>00 - >09)
[2043]               * >00 - >05 : FREQUENCY CONTROL
[2044]               * >06 - >08 : ATTENUATION CONTROL
[2045]               * >09       : NOISE CONTROL(non-zero = noise encountered)
[2046]               * >0A       : POINTER FOR CURRENT FREQENCY CONTROL
[2047]               * >0B       : POINTER FOR CURRENT ATTENUATION CONTROL
[2048]               *                    >00 , >01 FOR REG 0;
[2049]               *                    >02 , >03 FOR REG 1;
[2050]               *                    >04 , >05 FOR REG 2;
[2051]               * REG0 : >8000, REG1 : >A000, REG3 : >C000
[2052]               * INITIALIZE ATTENUATION CONTROL
[2053]               * REG0 : >9F, REG1 : >BF, REG2 : >DF
[2054]               ***********************************************************
[2055] AA71 31,00,0C        MOVE 12,G@ATTREG,@>8300
       AA74 00,A9,EA
[2056] AA77 0F,7E    SOUND1 XML  SPEED             Parse the frequency value
[2057] AA79 01              BYTE PARCOM         *   and insure a comma
[2058] AA7A 06,A3,ED        CALL CKSTNM            Must be a numeric
[2059] AA7D D2,4A,00        CGE  0,@FAC            Noise if negative
[2060] AA80 4A,BF           BR   SOUND2
[2061] AA82 31,00,08        MOVE 8,G@FLTS,@ARG     Constant 111834
       AA85 5C,AA,2D
[2062] AA88 0F,09           XML  FDIV              P = 111834/FREQUENCY
[2063] AA8A 0F,7E           XML  SPEED             Insure in range
[2064] AA8C 02              BYTE RANGE
[2065] AA8D 03              BYTE 3               * Range: 3 - 1023
[2066] AA8E 03,FF           DATA 1023
[2067]               * GET THE 4 L.S.Bits BITS AND 6 M.S.Bits OF 'P'
[2068] AA90 EB,4A,00        DSRC 4,@FAC
       AA93 04
[2069] AA94 E6,4A,04        SRL  4,@FAC
[2070] AA97 B5,90,0A        DOR  @FAC,*STADDR  1st byte of frequency control byt
       AA9A 4A
[2071]               *                         BIT   7   6   5   4   3   2   1
[2072]               *                               1  <REG>    0  <L.S.B. 4 OF
[2073]               *                         2nd byte of frequency control byt
[2074]               *                               0   0   <M.S.B. 6 of 'P'
[2075] AA9B 94,0A           INCT @STADDR           Advance ponter for next time
[2076] AA9D 06,A8,5B        CALL ATTNUT            Get attenuation
[2077]               *                        BIT    7   6   5   4   3   2   1
[2078]               *                               1   <REG>   1   0   0   0
[2079] AAA0 B0,90,0B        AND  @FAC1,*VAR2         1   <REG>   1   <ATTN/2 DB>
       AAA3 4B
[2080] AAA4 90,0B           INC  @VAR2             Advance pointer for next time
[2081]               * CHECK FOR END OF SOUND CALL

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0036 
EQUATES EXEC-359
[2082] AAA6 D6,42,B6 SOUND3 CEQ  RPARZ,@CHAT       End of statement?
[2083] AAA9 6A,DD           BS   SOUND5
[2084] AAAB 0F,7E           XML  SPEED             If not right parenthesis
[2085] AAAD 00              BYTE SYNCHK        *    then must be at
[2086] AAAE B3              BYTE COMMAZ        *      a comma
[2087] AAAF D6,0A,06        CEQ  6,@STADDR         If not 3 regs yet
[2088] AAB2 4A,77           BR   SOUND1
[2089]               * 3 sound regs already - so must be noise control
[2090] AAB4 0F,7E           XML  SPEED             Get frequency (should be nois
[2091] AAB6 01              BYTE PARCOM        *     and insure a comma
[2092] AAB7 06,A3,ED        CALL CKSTNM            Must be a numeric value
[2093] AABA D2,4A,00        CGE  0,@FAC            If not noise-error
[2094] AABD 6D,EE           BS   ERRBV
[2095]               * NOISE CONTROL
[2096] AABF D6,09,FF SOUND2 CEQ  >FF,@>8309        * BAD ARGUMENT ERROR
[2097] AAC2 4D,EA           BR   ERRBA
[2098] AAC4 83,4A           DNEG @FAC              -(FREQUENCY)
[2099] AAC6 0F,7E           XML  SPEED             Insure in range
[2100] AAC8 02              BYTE RANGE         *    of 1 - 8
[2101] AAC9 01              BYTE 1             *
[2102] AACA 00,08           DATA 8
[2103] AACC 92,4B           DEC  @FAC1             0 - 7 (2nd BIT: 'T')
[2104]               *                                           OTH, 1ST BITS:
[2105] AACE BC,09,4B        ST   @FAC1,@>8309
[2106] AAD1 B6,09,E0        OR   >E0,@>8309        Noise control byte:
[2107]               *                        BIT  7   6   5   4   3   2   1   0
[2108]               *                             1   1   1   0   0  <T>  < S >
[2109]               * PUT ATTENUATION IN THE 2ND BYTE OF 1ST BLOCK
[2110] AAD4 06,A8,5B        CALL ATTNUT
[2111] AAD7 BC,A3,7A        ST   @FAC1,V@VRMSND+1
       AADA 4B
[2112]               *                             1   1   1   1   < ATTN/2  DB>
[2113] AADB 4A,A6           BR   SOUND3            Go check for end of list
[2114] AADD 86,10    SOUND5 CLR  @VAR5             Pointer to sound table
[2115] AADF 8E,80,CE SND05  CZ   @PRTNFN           Wait untild previous
[2116] AAE2 6A,EE           BS   SOUND6
[2117] AAE4 03              SCAN                   Is finished and
[2118] AAE5 4A,DF           BR   SND05              look for a break-key
[2119] AAE7 D6,75,02        CEQ  BREAK,@RKEY       If not break-key
[2120] AAEA 4A,DF           BR   SND05
[2121] AAEC 41,27           BR   EXEC6C            If BREAK-KEY encountered
[2122]               * LOAD SOUND TABLE
[2123] AAEE BC,81,00 SOUND6 ST   *VAR5,@>8400      SOUND ADDRESS PORT
       AAF1 90,10
[2124] AAF3 90,10           INC  @VAR5             Next byte in table
[2125] AAF5 D6,10,0A        CEQ  >0A,@VAR5         If not finished
[2126] AAF8 4A,EE           BR   SOUND6
[2127] AAFA BF,4A,03        DST  VRMSND,@FAC       Where the 2 blocks are
       AAFD 79
[2128] AAFE F6,4A,01        I/O  1,@FAC            Start sound from VDP list
[2129] AB01 4B,1A           BR   LNKRTN            Return to caller
[2130]               ***********************************************************
[2131]               *                SUBPROGRAM FOR 'HCHAR'
[2132]               ***********************************************************
[2133] AB03 06,AC,D6 HCHAR  CALL HVCHR             Get X, Y values character, #
[2134] AB06 8F,4A           DCZ  @FAC              If 0 characters
[2135] AB08 6B,12           BS   HCHAR2
[2136] AB0A 08,E0,00 HCHAR1 BYTE >08,>E0,>00,>FB  * FMT '@VAR0'   Display horizo
       AB0D FB
[2137] AB0E 93,4A           DDEC @FAC              Done yet?
[2138] AB10 4B,0A           BR   HCHAR1            No, finish it
[2139]               * RXB PATCH CODE
[2140] AB12 D6,42,B3 HCHAR2 CEQ  COMMAZ,@CHAT
[2141] AB15 6B,03           BS   HCHAR

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0037 
EQUATES EXEC-359
[2142] AB17 BC,7F,02 XPTRTN ST   @MNUM,@XPT        Restore X-pointer
[2143] AB1A 0F,7E    LNKRTN XML  SPEED             Must be at
[2144] AB1C 00              BYTE SYNCHK        *     a right
[2145] AB1D B6              BYTE RPARZ         *      parenthesis
[2146] AB1E 06,6A,78 LNKRT2 CALL CHKEND            Check end of statement
[2147] AB21 4D,BA           BR   ERRSYN            If not end-of-stmt , error
[2148] AB23 06,00,12        CALL RETURN            Return to caller
[2149]               ***********************************************************
[2150]               *                SUBPROGRAM FOR 'VCHAR'
[2151]               ***********************************************************
[2152] AB26 06,AC,D6 VCHAR  CALL HVCHR             Get X, Y values character, #
[2153] AB29 8F,4A           DCZ  @FAC              If 0 characters
[2154] AB2B 6B,3F           BS   VCHAR2
[2155] AB2D 08,E0,00 VCHAR1 BYTE >08,>E0,>00,>9E,>FB * FMT '@VAR0',>31 Display v
       AB30 9E,FB
[2156] AB32 93,4A           DDEC @FAC              Done yet?
[2157] AB34 6B,3F           BS   VCHAR2            Yes, return
[2158] AB36 8E,7E           CZ   @YPT              If not at start of colunm
[2159] AB38 4B,2D           BR   VCHAR1
[2160] AB3A 90,7F           INC  @XPT              Move X-ptr to right one colun
[2161] AB3C 05,AB,2D        B    VCHAR1
[2162]               * RXB PATCH CODE
[2163] AB3F D6,42,B3 VCHAR2 CEQ  COMMAZ,@CHAT
[2164] AB42 6B,26           BS   VCHAR
[2165] AB44 4B,17           BR   XPTRTN
[2166]               ***********************************************************
[2167]               *               SUBPROGRAM FOR 'CHAR'
[2168]               ***********************************************************
[2169] AB46 06,A9,F6 CHARLY CALL COMB
[2170] AB49 0F,79    CHAR5  XML  PGMCHR            Skip "(" or ","
[2171]               * RXB PATCH CODE
[2172] AB4B D6,42,EC        CEQ  ALLZ,@CHAT
[2173] AB4E 4B,5E           BR   GAB1F
[2174] AB50 0F,79           XML  PGMCHR
[2175] AB52 06,B1,AD        CALL COMMA2
[2176] AB55 BE,00,EC        ST   ALLZ,@VAR0
[2177] AB58 BF,4A,00        DST  32,@FAC
       AB5B 20
[2178] AB5C 4B,67           BR   GAB28
[2179] AB5E 0F,7E    GAB1F  XML  SPEED             Get the first value
[2180] AB60 01              BYTE PARCOM         *    and insure a comma
[2181] AB61 0F,7E           XML  SPEED             Insure in range
[2182] AB63 02              BYTE RANGE          *   of 32 - 143
[2183]               * RXB PATCH CODE
[2184] AB64 1E              BYTE 30
[2185] AB65 00,9F           DATA 159
[2186] AB67 E3,4A,00 GAB28  DSLL 3,@FAC            Convert chr number to address
       AB6A 03
[2187] AB6B A3,4A,03        DADD >0300,@FAC        CORRECT FOR OFFSET
       AB6E 00
[2188] AB6F BD,04,4A        DST  @FAC,@VARY        Save it
[2189] AB72 0F,74           XML  PARSE             Get string
[2190] AB74 B6              BYTE RPARZ
[2191] AB75 D6,4C,65        CEQ  >65,@FAC2         MUST BE STRING
[2192] AB78 4D,BE           BR   ERRSNM
[2193] AB7A 35,00,04        MOVE 4,@FAC4,@VAR5     VAR5 pointer to string value
       AB7D 10,4E
[2194]               * Start defining character description.
[2195]               *    VARY    Address of RAM for character description.
[2196]               *    VAR5    Pointer to string value.
[2197]               *    VAR7    Length of string value.
[2198]               *    VAR9    Temporary counter.
[2199]               *    VAR9+1  Temporary counter.
[2200] AB7F C7,12,00        DCH  64,@VAR7          Max 4 characters at a time

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0038 
EQUATES EXEC-359
       AB82 40
[2201] AB83 4B,89           BR   CHAR40
[2202] AB85 BF,12,00        DST  64,@VAR7          IGNORE THE EXCESSES
       AB88 40
[2203] AB89 CB,04,07 CHAR40 DCHE SPRVB,@VARY       Don't have space for
       AB8C FF
[2204] AB8D 6C,1F           BS   CHARL4
[2205] AB8F BE,4A,30        ST   ZERO,@FAC         Floating Point Accumulator (>
[2206] AB92 35,00,0F        MOVE 15,@FAC,@FAC1
       AB95 4B,4A
[2207] AB97 8F,12           DCZ  @VAR7             Fill with zero
[2208] AB99 6B,B8           BS   CHAR50
[2209] AB9B CB,12,00        DCHE 16,@VAR7
       AB9E 10
[2210] AB9F 6B,AA           BS   GAB6B
[2211] ABA1 34,12,4A        MOVE @VAR7,V*VAR5,@FAC Move whatever
       ABA4 B0,10
[2212] ABA6 87,12           DCLR @VAR7
[2213] ABA8 4B,B8           BR   CHAR50
[2214] ABAA 35,00,10 GAB6B  MOVE 16,V*VAR5,@FAC    Move one character
       ABAD 4A,B0,10
[2215] ABB0 A7,12,00        DSUB 16,@VAR7          Less num of bytes to move
       ABB3 10
[2216] ABB4 A3,10,00        DADD 16,@VAR5          Move pointer
       ABB7 10
[2217] ABB8 BE,14,4A CHAR50 ST   >4A,@VAR9         Move pointer (>4A=FAC)
[2218] ABBB BE,15,01        ST   1,@VAR9+1
[2219] ABBE 05,AB,C3        B    GAB84
[2220] ABC1 90,15    GAB82  INC  @VAR9+1
[2221] ABC3 CE,15,08 GAB84  CGT  8,@VAR9+1
[2222] ABC6 6C,02           BS   GABC3
[2223] ABC8 86,0C           CLR  @BYTES            Clear dot-building byte
[2224] ABCA E2,0C,04 CHARL2 SLL  4,@BYTES          For loop(2 chars per byte)
[2225] ABCD BC,5C,90        ST   *VAR9,@ARG
       ABD0 14
[2226] ABD1 CA,5C,30        CHE  ZERO,@ARG         If < 0
[2227] ABD4 4D,EE           BR   ERRBV
[2228] ABD6 CE,5C,39        CGT  NINE,@ARG         If in 0-9
[2229] ABD9 4B,E5           BR   CHARL3
[2230] ABDB CA,5C,41        CHE  A,@ARG            If > 9 but < A
[2231] ABDE 4D,EE           BR   ERRBV
[2232] ABE0 C6,5C,46        CH   F,@ARG            If > F
[2233] ABE3 6D,EE           BS   ERRBV
[2234] ABE5 A6,5C,30 CHARL3 SUB  ZERO,@ARG         Character - >30
[2235] ABE8 C6,5C,0A        CH   10,@ARG           If in A-F
[2236] ABEB 4B,F0           BR   GABB1
[2237] ABED A6,5C,07        SUB  7,@ARG            Correct for that too
[2238] ABF0 B4,0C,5C GABB1  OR   @ARG,@BYTES       Dot expression
[2239] ABF3 90,14           INC  @VAR9
[2240] ABF5 DA,14,01        CLOG 1,@VAR9           1st half of row finished?
[2241] ABF8 4B,CA           BR   CHARL2            Yes, do 2nd half
[2242]               *                              (each takes half byte)
[2243] ABFA BC,B0,04        ST   @BYTES,V*VARY     Load characters
       ABFD 0C
[2244] ABFE 91,04           DINC @VARY
[2245] AC00 4B,C1           BR   GAB82             Load characters on next row
[2246] AC02 8F,12    GABC3  DCZ  @VAR7             More char to describe
[2247] AC04 4B,89           BR   CHAR40
[2248]               * RXB PATCH CODE
[2249] AC06 D6,00,EC        CEQ  ALLZ,@VAR0
[2250] AC09 4C,1F           BR   CHARL4
[2251] AC0B 87,00           DCLR @VAR0
[2252] AC0D 35,00,08 CHRFIL MOVE 8,V@>0400,V@>0408(@VAR0)
       AC10 E4,08,00

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0039 
EQUATES EXEC-359
       AC13 A4,00
[2253] AC15 A3,00,00        DADD 8,@VAR0
       AC18 08
[2254] AC19 D7,00,02        DCEQ 94*8,@VAR0
       AC1C F0
[2255] AC1D 4C,0D           BR   CHRFIL
[2256] AC1F D6,42,B3 CHARL4 CEQ  COMMAZ,@CHAT      More specified?
[2257] AC22 6B,49           BS   CHAR5
[2258] AC24 4B,1A           BR   LNKRTN            Return
[2259]               ***********************************************************
[2260]               *              SUBPROGRAM FOR 'KEY'
[2261]               ***********************************************************
[2262] AC26 06,BE,A6 KEY    CALL SPAR              GET KEY UNIT
[2263]               * RXB PATCH LABEL ************
[2264] AC29 0F,7E    GABD1  XML  SPEED             Insure in range
[2265] AC2B 02              BYTE RANGE          *   of 0 - 5
[2266] AC2C 00              BYTE 0
[2267] AC2D 00,05           DATA 5
[2268] AC2F 06,BD,07        CALL KEYJOY            Get variables for code and st
[2269]               *                              and scan keyboard
[2270]               *                             KEYJOY returns key status
[2271] AC32 6C,3D           BS   KEY1B             KEY STATUS = 1
[2272] AC34 83,4A           DNEG @FAC              Assume status = -1
[2273] AC36 D6,75,FF        CEQ  >FF,@RKEY         But correct if = 0
[2274] AC39 4C,3D           BR   KEY1B
[2275] AC3B 87,4A           DCLR @FAC              KEY STATUS = 0
[2276] AC3D 0F,7C    KEY1B  XML  ASSGNV            Assign value in variable
[2277] AC3F BF,4A,40        DST  >4001,@FAC        Re-store F.P. 1 in FAC
       AC42 01
[2278] AC43 8E,75           CZ   @RKEY             If key-code = 0
[2279] AC45 6C,65           BS   KEY2
[2280] AC47 D6,75,FF        CEQ  >FF,@RKEY         No key depressed,
[2281] AC4A 6C,61           BS   KEY1C              key code assigned to -1
[2282]               * FORMAT FOR KEYCODES ABOVE 99 ADDED FOR 99/4A HIGHEST
[2283]               * KEYCODE (OTHER THAN >FF) IS >C6=198
[2284]               * 5/7/81
[2285] AC4C CA,75,64        CHE  100,@RKEY
[2286] AC4F 4C,5C           BR   GAC04
[2287] AC51 90,4A           INC  @FAC
[2288] AC53 A6,75,64        SUB  100,@RKEY
[2289] AC56 BC,4C,75        ST   @RKEY,@FAC2       FLOATING FORMAT (>4001__00000
[2290] AC59 05,AC,5F        B    GAC07
[2291] AC5C BC,4B,75 GAC04  ST   @RKEY,@FAC1       FLOATING FORMAT (>40__0000000
[2292] AC5F 4C,67    GAC07  BR   KEY2A
[2293] AC61 83,4A    KEY1C  DNEG @FAC              KEY CODE ASSIGNED TO -1
[2294] AC63 4C,67           BR   KEY2A
[2295] AC65 87,4A    KEY2   DCLR @FAC              (>000000000000000)
[2296] AC67 0F,7C    KEY2A  XML  ASSGNV            ASSIGN VALUE TO VARIABLE
[2297]               * RXB PATCH CODE *************
[2298]               *      BR   LNKRTN
[2299] AC69 5E,25           BR   SUBRTN
[2300]               ***********************************************************
[2301]               * RXB PATCH WAS    SUBPROGRAM FOR 'JOYSTICK'
[2302]               ***********************************************************
[2303] AC6B 06,BE,A6        CALL SPAR              KEY UNIT
[2304] AC6E 0F,7E           XML  SPEED             Insure in range
[2305] AC70 02              BYTE RANGE          *   of 1 - 4
[2306] AC71 01              BYTE 1
[2307] AC72 00,04           DATA 4
[2308] AC74 06,BD,07        CALL KEYJOY            GET VARIABLES FOR X, Y
[2309]               *                              AND SCAN KEYBOARD
[2310] AC77 BC,00,76        ST   @JOYY,@VAR0       JOYSTICK Y POSITION
[2311] AC7A 06,A9,AA        CALL JOYXY             -4 to +4
[2312] AC7D BF,4A,40        DST  >4001,@FAC        Re-store F.P. 1 in FAC

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0040 
EQUATES EXEC-359
       AC80 01
[2313] AC81 BC,00,77        ST   @JOYX,@VAR0       JOYSTICK X POSITION
[2314] AC84 06,A9,AA        CALL JOYXY             -4 to +4
[2315] AC87 4B,1A           BR   LNKRTN
[2316]               ***********************************************************
[2317]               * INSURE LEFT PARENTHESIS AND THEN PARSE TO A COMMA
[2318]               ***********************************************************
[2319]               * RXB PATCH CODE
[2320] AC89 D6,42,B3 LPAR   CEQ  COMMAZ,@CHAT
[2321] AC8C 6C,94           BS   CPAR
[2322] AC8E 0F,7E           XML  SPEED             Must be
[2323] AC90 00              BYTE SYNCHK          *  at a
[2324] AC91 B7              BYTE LPARZ           *    left parenthesis
[2325] AC92 4C,98           BR   GAC35
[2326] AC94 0F,7E    CPAR   XML  SPEED
[2327] AC96 00              BYTE SYNCHK
[2328] AC97 B3              BYTE COMMAZ
[2329]               * RXB PATCH LABEL ***********
[2330] AC98 0F,74    GAC35  XML  PARSE             Do the parse
[2331] AC9A B3              BYTE COMMAZ          * Stop on a comma
[2332] AC9B 0F,7E           XML  SPEED             Must be
[2333] AC9D 00              BYTE SYNCHK          *  at a
[2334] AC9E B3              BYTE COMMAZ          *   comma
[2335] AC9F 00              RTN
[2336]               ***********************************************************
[2337]               * SUBROUTINE FOR 'RANGE' USED IN ALL SOUND AND GRAPHICS
[2338]               ***********************************************************
[2339] ACA0 0F,7E    RAN16  XML  SPEED             Insure in range
[2340] ACA2 02              BYTE RANGE          *   of 1 to 16
[2341] ACA3 01              BYTE 1
[2342] ACA4 00,10           DATA 16
[2343] ACA6 92,4B           DEC  @FAC1             Adjust to internal range
[2344] ACA8 00              RTN
[2345]               ***********************************************************
[2346]               * SUBROUTINE TO GET ROW, COLUMN VALUES
[2347]               ***********************************************************
[2348]               * RXB PATCH CODE
[2349] ACA9 06,AC,89 GPHV   CALL LPAR              Insure '(', parse, insure ','
[2350]               * RXB PATCH CODE
[2351] ACAC 0F,7E    GPHVRC XML  SPEED             Insure in range
[2352] ACAE 02              BYTE RANGE           *  of 1 - 24
[2353] ACAF 01              BYTE 1
[2354] ACB0 00,18           DATA 24
[2355] ACB2 92,4B           DEC  @FAC1             Adjust to internal range
[2356] ACB4 BC,02,7F        ST   @XPT,@MNUM
[2357] ACB7 BC,7E,4B        ST   @FAC1,@YPT        Set row pointer
[2358] ACBA 0F,7E           XML  SPEED             Get column value
[2359] ACBC 01              BYTE PARCOM          *  and insure a comma
[2360] ACBD 0F,7E           XML  SPEED             Insure in range
[2361] ACBF 02              BYTE RANGE           *  of 1 to 32
[2362] ACC0 01              BYTE 1
[2363] ACC1 00,20           DATA 32
[2364] ACC3 92,4B           DEC  @FAC1             Internal range: 0 - 31
[2365] ACC5 BC,7F,4B        ST   @FAC1,@XPT        Set column pointer
[2366] ACC8 00              RTN
[2367]               *  Subroutine to control border color
[2368]               * Character background is also affected since transparent
[2369]               *  is used.
[2370] ACC9 06,A5,65 BORDER CALL PARFF             Insure '(' , and parse
[2371] ACCC 06,AC,A0        CALL RAN16             Check 1 - 16 & put in interna
[2372] ACCF 3D,00,01        MOVE 1,@FAC1,#7        Load VDP register
       ACD2 07,4B
[2373] ACD4 4B,1E           BR   LNKRT2            Return to XB program
[2374]               * Get ROW, COLUMN VALUES AND NUMBER OF CHARACTERS

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0041 
EQUATES EXEC-359
[2375] ACD6 06,AC,A9 HVCHR  CALL GPHV              Get X, Y VALUES
[2376] ACD9 0F,74           XML  PARSE
[2377] ACDB B6              BYTE RPARZ
[2378] ACDC 06,A9,95        CALL INTARG
[2379] ACDF A2,4B,60        ADD  OFFSET,@FAC1
[2380] ACE2 BC,00,4B        ST   @FAC1,@VAR0       SAVE THE CHARACTER
[2381] ACE5 BF,4A,00        DST  1,@FAC            ASSUME 1 CHARACTER
       ACE8 01
[2382] ACE9 D6,42,B6        CEQ  RPARZ,@CHAT       If not right parenthesis
[2383] ACEC 6C,F8           BS   GAC95
[2384] ACEE 0F,7E           XML  SPEED             Must be
[2385] ACF0 00              BYTE SYNCHK          *   at a
[2386] ACF1 B3              BYTE COMMAZ          *    comma
[2387] ACF2 0F,74           XML  PARSE             # OF CHARACTERS
[2388] ACF4 B6              BYTE RPARZ
[2389] ACF5 06,A9,95        CALL INTARG            FLOATING TO INTEGER
[2390] ACF8 00       GAC95  RTN
[2391]               ***********************************************************
[2392]               * ERRWXY - Is the subroutine for CALL ERR(W,X,Y,Z)
[2393]               *  The parameters indicate:
[2394]               *   W - The error code # of the error
[2395]               *   X - Indicates whether execution(-1) error or
[2396]               *       I/O (0-255) error on LUNO 0-255
[2397]               *   Y - Indicates the severity code of the error
[2398]               *   Z - Line number of the error
[2399]               *   ERR Can be called with 2 forms:
[2400]               *       CALL ERR(W,X,Y,Z) and CALL ERR(W,X)
[2401]               *   If ERR is called and no error has occured then all
[2402]               *   values returned are zero.
[2403]               ***********************************************************
[2404] ACF9 BD,52,6E ERRWXY DST  @VSPTR,@FAC8      Get a temp VSPTR
[2405] ACFC C5,52,24 GAC99  DCH  @STVSPT,@FAC8     While not a bottom of stack
[2406] ACFF 4D,33           BR   GACD0
[2407] AD01 BC,5C,E0        ST   V@2(@FAC8),@ARG   Keep ID code in ARG area
       AD04 02,52
[2408] AD06 D6,5C,69        CEQ  >69,@ARG          *** ERROR entry
[2409] AD09 4D,12           BR   GACAF
[2410] AD0B 06,A9,FC        CALL SQUISH            Squish it out of the stack
[2411] AD0E 0F,77           XML  VPUSH             Put permanent copy of error
[2412]               *                              entry on stack
[2413] AD10 4D,3F           BR   ERR10             Jump out now
[2414]               * Jump always
[2415] AD12 D6,5C,67 GACAF  CEQ  >67,@ARG          *** FOR entry
[2416] AD15 4D,1D           BR   GACBA
[2417] AD17 A7,52,00        DSUB 32,@FAC8          Skip it
       AD1A 20
[2418] AD1B 4D,31           BR   GACCE
[2419] AD1D D6,5C,66 GACBA  CEQ  >66,@ARG          *** GOSUB entry
[2420] AD20 4D,28           BR   GACC5
[2421] AD22 A7,52,00        DSUB 8,@FAC8           Skip it
       AD25 08
[2422] AD26 4D,31           BR   GACCE
[2423] AD28 D6,5C,6A GACC5  CEQ  >6A,@ARG          * SYNTAX ERROR
[2424] AD2B 4D,BA           BR   ERRSYN
[2425] AD2D A7,52,00        DSUB 16,@FAC8          Skip it
       AD30 10
[2426] AD31 4C,FC    GACCE  BR   GAC99
[2427] AD33 BF,4A,00 GACD0  DST  >0080,@FAC        No error entry there so
       AD36 80
[2428] AD37 BF,4C,69        DST  >6900,@FAC2        fake one
       AD3A 00
[2429] AD3B 87,4E           DCLR @FAC4
[2430] AD3D 87,50           DCLR @FAC6
[2431] AD3F 0F,77    ERR10  XML  VPUSH             Push the temporary entry on

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0042 
EQUATES EXEC-359
[2432]               *                              top of stack
[2433]               * Code to get "W" in
[2434] AD41 06,A9,F6        CALL COMB              Check for left parenthesis
[2435] AD44 06,AD,AF        CALL ERRC05            Pick up user's symbol
[2436] AD47 BC,4B,EF        ST   V@-8(@VSPTR),@FAC1 Get error code
       AD4A FF,F8,6E
[2437] AD4D 0F,80           XML  CIF               Convert it to floating
[2438] AD4F 0F,7C           XML  ASSGNV            Assign it
[2439]               * Code to get "X" in
[2440] AD51 06,AD,AA        CALL ERRCOM            Check syntax & get user's sym
[2441] AD54 DA,EF,FF        CLOG >80,V@-7(@VSPTR)  If execution
       AD57 F9,6E,80
[2442] AD5A 4D,66           BR   GAD03
[2443] AD5C 31,00,08        MOVE 8,G@FLT1,@FAC     Make it such
       AD5F 4A,A3,F3
[2444] AD62 83,4A           DNEG @FAC              Make it a negative
[2445] AD64 4D,6E           BR   GAD0B
[2446] AD66 BC,4B,EF GAD03  ST   V@-5(@VSPTR),@FAC1 Get I/O LUNO number
       AD69 FF,FB,6E
[2447] AD6C 0F,80           XML  CIF               Convert it to floating
[2448] AD6E 0F,7C    GAD0B  XML  ASSGNV
[2449]               * Code to get "Y" in
[2450] AD70 D6,42,B6        CEQ  RPARZ,@CHAT       If long form of CALL ERR
[2451] AD73 6D,A5           BS   GAD42
[2452] AD75 06,AD,AA        CALL ERRCOM            Check syntax & get user's sym
[2453] AD78 BC,4B,EF        ST   V@-7(@VSPTR),@FAC1 Get severity code
       AD7B FF,F9,6E
[2454] AD7E B2,4B,7F        AND  >7F,@FAC1         Reset execution  /  I/O flag
[2455] AD81 0F,80           XML  CIF               Convert it
[2456] AD83 0F,7C           XML  ASSGNV            Assign it
[2457]               * Code to get "Z" in
[2458] AD85 06,AD,AA        CALL ERRCOM            Check syntax & get symbol
[2459] AD88 BD,4C,EF        DST  V@-2(@VSPTR),@FAC2 Get line pointer
       AD8B FF,FE,6E
[2460] AD8E BD,4A,4C        DST  @FAC2,@FAC
[2461] AD91 8F,4C           DCZ  @FAC2             If line number exists
[2462] AD93 6D,A1           BS   GAD3E
[2463] AD95 97,4C           DDECT @FAC2            Point to the line #
[2464] AD97 06,60,34        CALL GRSUB1            Read line # (2 bytes) from VD
[2465]               *                              or ERAM (use GREAD)
[2466] AD9A 4C              BYTE >4C             * @FAC2: Source addr on ERAM/VD
[2467] AD9B BD,4A,50        DST  @EEE,@FAC         Put the line # in FAC
[2468] AD9E B2,4A,7F        AND  >7F,@FAC          Reset the breakpoint if any
[2469] ADA1 0F,80    GAD3E  XML  CIF               Convert it
[2470] ADA3 0F,7C           XML  ASSGNV            Assign it
[2471] ADA5 0F,78    GAD42  XML  VPOP              Trash the temporary entry
[2472] ADA7 05,AB,1A        B    LNKRTN            Return from subprogram
[2473]               * Must be long branch because of AND above
[2474] ADAA D6,42,B3 ERRCOM CEQ  COMMAZ,@CHAT      Check for comma
[2475] ADAD 4D,BA           BR   ERRSYN
[2476] ADAF 0F,79    ERRC05 XML  PGMCHR            Get the next character
[2477] ADB1 0F,7A           XML  SYM               Collect name & s.t. entry
[2478] ADB3 0F,7B           XML  SMB               Get value space
[2479] ADB5 0F,77           XML  VPUSH             Push it
[2480] ADB7 86,4A           CLR  @FAC              Set up for conversion
[2481] ADB9 00              RTN
[2482]               * CHANGE IN ADDRESS OF THE ERROR CALLS WILL AFFECT
[2483]               * THE FILE SUBS.....
[2484]               *     ERROR messages called from this file
[2485] ADBA 06,6A,84 ERRSYN CALL ERRZZ             * SYNTAX ERROR
[2486] ADBD 03              BYTE 3             *   (shared by SUBS)
[2487] ADBE 06,6A,84 ERRSNM CALL ERRZZ             * STRING-NUMBER MISMATCH
[2488] ADC1 07              BYTE 7             *   (shared by SUBS)
[2489] ADC2 06,6A,84 ERRMUV CALL ERRZZ             * IMPROPERLY USED NAME

99/4 GPL-ASSEMBLER (Pass 3) correct                                   PAGE 0043 
EQUATES EXEC-359
[2490] ADC5 09              BYTE 9
[2491] ADC6 06,6A,84 ERRMEM CALL ERRZZ             * MEMORY FULL
[2492] ADC9 0B              BYTE 11
[2493] ADCA 06,6A,84 ERRSO  CALL ERRZZ             * STACK OVERFLOW
[2494] ADCD 0C              BYTE 12
[2495] ADCE 06,6A,84 ERRNWF CALL ERRZZ             * NEXT WITHOUT FOR
[2496] ADD1 0D              BYTE 13
[2497] ADD2 06,6A,84 ERRFNN CALL ERRZZ             * FOR/NEXT NESTING
[2498] ADD5 0E              BYTE 14
[2499] ADD6 06,6A,84 ERRSNS CALL ERRZZ             * MUST BE IN SUBPROGRAM
[2500] ADD9 0F              BYTE 15
[2501] ADDA 06,6A,84 ERRRSC CALL ERRZZ             * RECURSIVE SUBPROGRAM CALL
[2502] ADDD 10              BYTE 16
[2503] ADDE 06,6A,84 ERRRWG CALL ERRZZ             * RETURN WITHOUT GOSUB
[2504] ADE1 12              BYTE 18
[2505] ADE2 06,6A,84 ERRBS  CALL ERRZZ             * BAD SUBSCRIPT
[2506] ADE5 14              BYTE 20
[2507] ADE6 06,6A,84 ERRLNF CALL ERRZZ             * LINE NOT FOUND
[2508] ADE9 16              BYTE 22
[2509] ADEA 06,6A,84 ERRBA  CALL ERRZZ             * BAD ARGUMENTS
[2510] ADED 1C              BYTE 28
[2511] ADEE 06,6A,84 ERRBV  CALL ERRZZ             * BAD VALUE
[2512] ADF1 1E              BYTE 30            *   (shared by SUBS)
[2513] ADF2 06,6A,84 ERRIAL CALL ERRZZ             * INCORRECT ARGUMENT LIST
[2514] ADF5 1F              BYTE 31            *   (shared by SUBS)
[2515] ADF6 06,6A,84 ERRSNF CALL ERRZZ             * SUBPROGRAM NOT FOUND
[2516] ADF9 25              BYTE 37
[2517]               * Other error messages appear in this program
[2518]               * ERRRDY      * READY                        DATA 0
[2519]               * ERRBRK      * BREAK POINT                  DATA 1
[2520]               * ERROLP      * ONLY LEGAL IN A PROGRAM      DATA 27
[2521]               *
[2522]               * WRNN01      * NUMERIC OVERFLOW             DATA 2
[2523]               * WRNS02
[2524]               * WRNST1      * STRING TRUNCATED             DATA 19
[2525]               * WRNST2
[2526]               * WRNLNF      * LINE NOT FOUND               DATA 38
[2527]               *
[2528]               ***********************************************************

RXB is always marked with a * RXB PATCH CODE (notes) *

All the rest is original TI 990 GPL Source Code that runs on the Ryte Data GPL Assembler.

Link to comment
Share on other sites

  • 2 months later...

I've released a new version of the TI 99 Cross-Development Tools (xdt99), i.e., cross-assembler xas99, GPL assembler xga99, BASIC tool xbas99, disk manager xdm99, and CF-volume manager xvm99.

The suite now also includes the assembly and BASIC editor plugins for Emacs and IntelliJ IDEA previously discussed in this thread. Of course the plugins work with other assemblers as well.

Most updates in this release apply to the xas99 cross-assembler. The assembler now supports list file generation similar to option L of the original Editor/Assembler.

Local labels declutter programs by providing easy jump targets:

.

clear_screen:
    li r0, 769
    li r1, >2000
!   dec r0
    blwp @vsbw
    jne -!          ; jumps to previous ! label
    rt

.

Local labels can also be named, e.g., !loop, and need not be unique. (Thanks to Dexter for some suggestions!)

Macros allow you to define your own shorthand mnemonics for sequences of instructions:

.

    .defm hchari
    li r0, #1 * 32 + #2
    li r1, #3 << 8
    blwp @vsbw
    .endm
    .hchari 12, 16, '*'

.

The assembler can generate jumpstart disks that simplify and speed up the testing of the generated code in an emulator. For MESS, you'd type

.

> xas99.py --jumpstart myprog.a99
> mess64 ti99_4ae -cart jumpstart.rpk -flop1 myprog.dsk -peb ...

.

In the emulator, selecting the Jumpstart cartridge will automatically load and start the assembly program without any further interaction. This is very similar to using an XB-based loader, but more flexible and slightly faster in MESS (in Classic99 there is no real load time either way). You can also generate a classical XB-based loader.

Finally, a new Windows tutorial helps Windows users to setup xdt99 and guides you through working with assembly and BASIC programs using the command line.

You can download the latest release on GitHub.

  • Like 6
Link to comment
Share on other sites

Thanks for a great update. I just thought of a few things that could improve xas99 even further:

 

- A log2 function for keeping track of what your shift instructions do. E.g. if MAPWIDTH EQU 32 then SLA R1,LOG2(MAPWIDTH) would shift R1 left by log2(32)=5, i.e. multiply by 32.

- Support for the F18A GPU op-codes: CALL, RET, PUSH, POP, SLC, etc.

- The ability to assemble code at one address destined for execution at another address. E.g. if to assemble F18A GPU code that will be copied from CPU RAM to VDP RAM and executed, or for assembling code in cartridge space that will be copied to and executed in CPU RAM. I'm thinking of a new ORG directive, e.g. XORG >1000 would assemble code for execution at address >1000.

 

Thanks,

Rasmus

  • Like 3
Link to comment
Share on other sites

:thumbsup: Gonna use xas99 for my next project. I have a slightly different use case: Building multi-banked cartridges, but I already have some tools to convert a single object file (which has multiple AORG >6000 directives in it, one for each bank) into an appropriately padded totally raw binary file which is suitable for classic99/MESS rom cart images, or burning into an EPROM.

 

A nice feature would be a ROM_BANK <n> directive:

 

ROM_BANK 0

 

Internally, sets AORG to >6000

 

During the final file emit, ROM-BANK directives would pad the current memory image from the current PC address to 7FFF with zeros so that each rom bank is aligned on an 8K boundary. That's basically what my utilities do (that Tursi wrote for me years ago), but it does it by scanning the tags in the object file for an AORG.

 

Like I say, I have this issue covered, so it's not a big problem. But anything to shorten the toolchain is a good thing!

  • Like 2
Link to comment
Share on other sites

I think I may have found an issue with xas99: Look for the first occurrence of "PATTS" in the attached list files.

WinAsm:
-------
237  A170 0224            AI   R4,PATTS                        * Add patterns base address
237  A172 A818  

...

1068            PATTS
1069  A817 0000        EVEN     *>>> Assembler Auto-Generated <<<
1070  A818 0000 BOXPAT DATA >0000,>0000,>0001,>8000

Xas99:
------ 
0237 A170 0224  22   AI R4,PATTS * Add patterns base address      
     A172 A817 

...

1067               *   Block patterns
1068               PATTS
1069 A818 0000     BOXPAT DATA >0000,>0000,>0001,>8000
Now PATTS is not aligned on a word boundary in the code, so both assemblers have correctly moved it to an even address, but Xas99 seems to have maintained the odd address in the reference. This also seems to be reflected in the object file that fails to load correctly.

isometric.a99

isometric-winasm.lst

isometric-xas99.lst

isometric-winasm.obj

isometric-xas99.obj

Link to comment
Share on other sites

I think I may have found an issue with xas99: Look for the first occurrence of "PATTS" in the attached list files. ...

 

Now PATTS is not aligned on a word boundary in the code, so both assemblers have correctly moved it to an even address, but Xas99 seems to have maintained the odd address in the reference. This also seems to be reflected in the object file that fails to load correctly.

 

Hmm, unfortunately I cannot look into this right away, but I've written many tests for xas99 against the E/A assembler.

 

Try the attached assembly source that contains plenty of BYTEs and EVENs -- xas99 assembles just like the E/A assembler, whose output is on the disk image. What does Winasm yield in this case?

 

asdirs.asm

asmsrcs.dsk

Link to comment
Share on other sites

 

Hmm, unfortunately I cannot look into this right away, but I've written many tests for xas99 against the E/A assembler.

 

Try the attached assembly source that contains plenty of BYTEs and EVENs -- xas99 assembles just like the E/A assembler, whose output is on the disk image. What does Winasm yield in this case?

 

attachicon.gifasdirs.asm

attachicon.gifasmsrcs.dsk

 

Lots of errors :-)

asdirs.lst

Link to comment
Share on other sites

:thumbsup: Gonna use xas99 for my next project. I have a slightly different use case: Building multi-banked cartridges, but I already have some tools to convert a single object file (which has multiple AORG >6000 directives in it, one for each bank) into an appropriately padded totally raw binary file which is suitable for classic99/MESS rom cart images, or burning into an EPROM.

 

I know it's a bit off topic, cause this is a xdt99 thread, but I get shot of my thoughts...

 

We should think about develop tools for TI-99/4A (or Geneve too). These systems are the only common platform we have. Not those systems running this ugly Windoof, Linux or OS X (or the thousands variations of emulators) are our targets. The TI-99/4A is our Holy Grail.

I like all your (disk/development) tools, don't get me wrong. Those software is the precondition for progressing. But we don't have to forget the real machine. All the ideas of everybody have to be integrated into it!

 

I see Ralphb, Rasmus and Willsy recently has good ideas. So Willsy refer an use case that is good enough for an integration in the developmet environment on the TI! I think all ideas are useful features for the Editor/Assembler. Specially a ROM banking feature that also works for the DSR will be a great thing. Perhaps we can also extend the object loader to handle object code files which are assembled with the new banking directives.

 

But I see the problem... all of us lives on our own isle and there is no real collaboration.

So there came out the question, why do Ralphb his own E/A for a TI-System that doesn't run on a TI? Why can't he contribute his ideas to the REA project and work on that project, for example?

That makes me very unhappy.

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...