diff --git a/.Docs/Acosx Words.md b/.Docs/Acosx Words.md index 71207049..70a6ae7c 100644 --- a/.Docs/Acosx Words.md +++ b/.Docs/Acosx Words.md @@ -26,8 +26,8 @@ This document lists all of the **ACOS Words** supported in the A2osX implementat | FOR | FOR *numvar*=*startvalue* TO *targetvalue* [STEP *number*]
...
NEXT | Not Yet Implemented | Program loop iteration declaration. | Creates a loop in program execution that sets a variable *numvar* to initially *startvalue* and increments its value with each iteration and will repeat until that variable reaches *targetvalue*. The STEP keyword is optional, but allows you to specify *number* which overrides the typical +1 increment of the loop, i.e. you can count by 2 by specifying STEP 2 or you can *decrement* by specifying a negative step number. In general, operates much the same way as AppleSoft FOR-NEXT loops, However, you can only have ONE for loop active at a time, i.e. the NEXT command does not allow for a variable, it only operates on the currently active FOR loop. | | | FREE | FREE | Not Yet Implemented | Return amount of free memory. | Has the same function as the AppleSoft FRE(0) command, in that it returns the amount of free memory. REMY TODO: Does this garbage collect? | | | GET | GET *varstr* | Not Yet Implemented | Get a single character from user. | The GET statement is used to get a single keypress from the user. This is a blocking call in that the system will wait until a key is pressed. The key will be returned in *varstr*. Control characters will not be filtered out as they are with INPUT. | | -| GOSUB | GOSUB *label* | In Development | Call subroutine at specified label. | Calls subroutine *label* in the program and sets the point in code so that when a RETURN function is encountered, execution will resume after the GOSUB statement. While behaves the same way as AppleSoft basic, it is worth pointing out that ACOS uses labels as targets instead of line numbers. | | -| GOTO | GOTO *label* | Working | Redirect program execution to specified label. | Redirects program execution to continue from *label*. Unlike GOSUB, no record of where the GOTO call occurred. As with GOSUB, it is worth pointing out that ACOS uses labels as targets intead of line number. | | +| GOSUB | GOSUB *label* | Impl. | Call subroutine at specified label. | Calls subroutine *label* in the program and sets the point in code so that when a RETURN function is encountered, execution will resume after the GOSUB statement. While behaves the same way as AppleSoft basic, it is worth pointing out that ACOS uses labels as targets instead of line numbers. | | +| GOTO | GOTO *label* | Impl. | Redirect program execution to specified label. | Redirects program execution to continue from *label*. Unlike GOSUB, no record of where the GOTO call occurred. As with GOSUB, it is worth pointing out that ACOS uses labels as targets intead of line number. | | | HOME | HOME | Not Yet Implemented | Clear screen. | Clears the screen and positions the cursor at the top left. REMY TODO: Does this clear the remote session as well? | | | IF | IF *condition* [THEN] *statement1* [ELSE] *statement2* | In Development | Logical condition test and execution. | Evaluate *condition* and if true (or greater than zero), execute *statement1*. If optional ELSE keyword is specified, then a false condition will execute *statement2*. If ELSE is used, it must appear on the same line as the IF statement, i.e. there is no multi-line if/then/else construct like some other languages. Logical constructs for *condition* supports parenthesis, AND, and OR.

THEN is optional (as it is in AppleSoft BASIC) but if you use THEN, it cannot be followed by a label directly.(use IF arg THEN GOTO label). | | | INFO | *expression*=INFO(*optional*)
INFO(*optional*)=*expression* | Not Yet Implemented | Byte-level data manipulation function, specific to ACOS internals. | INFO can be used as either a statement or as a function. It is really a 'catch-all' of ACOS state value functions in nature in that many values that are more or less unrelated are accessible through it. The following table gives the meanings of all the INFO data.

argument r/w       function
-------- ---- -----------------
INFO(0) r is there a caller online? (0=no)
INFO(1) r capacity of current message file.
INFO(2) r callers baud rate /300 (1=300)
INFO(3) r/w current number of nulls.
INFO(4) w top screen stats. (1=chat, 2=exec)
INFO(5) r/w executive user online? (1=yes)
INFO(6) r checks bit map for mail/msg bases for room.
| | @@ -35,8 +35,8 @@ This document lists all of the **ACOS Words** supported in the A2osX implementat | INSTR | *expression*=INSTR(*match*, *source*) | Not Yet Implemented | Find a string within another and return offset if found. | The INSTR function is used to search within a *source* string for the existence of the specified *match* string. The search is case insensitive. The function will return the numerical position of the first character in the *source* string where the *match* was found. Note that the first character in *source* string starts at 1, not 0 like many other languages. So in other words, if the function returns zero, no match was found. | | | KEY | *expression*=KEY(0)
*expression*=KEY(1)
*expression*=KEY(2) | Not Yet Implemented | Return what key from the interrupt table was caught. | The KEY function is used to check and see what if any keys have been pressed. It is generally used to check to see if a routine needs to be interrupted and is used in conjunction with the SETINT and ADDINT statements. This routine is not blocking and does not wait for a key; it returns either a zero for no key or the ASCII value of the key. In the KEY(1) form, a non-zero byte will be returned if the key pressed was the 'file stop' character. In the KEY(2) form, a non-zero byte will be returned if the pressed key is the 'file next' key defined in config. | | | KILL | KILL *filename*
KILL #MSG(*expression*) | Not Yet Implemented | Delete a file or message. | The KILL statement can be used in two different ways. In both ways it is used to delete data. In the first form, with the *filename,* it will delete the file from disk. In its second form, it will delete a message within the currently active message base. After using KILL on a message, it is always a good idea to follow it with an UPDATE to make sure the modified message database is persisted to disk. | | -| LEFT$ | *string*=LEFT$(*source*, *length*) | Not Yet Implemented | Return a number of characters from the start of a string. | Returns the first *length* characters of *source* string. | | -| LEN | *expression*=LEN(*string*) | Not Yet Implemented | Return the length of a string. | Returns the length of the supplied *string*. A result of zero means the string is empty. | | +| LEFT$ | *string*=LEFT$(*source*, *length*) |Impl. | Return a number of characters from the start of a string. | Returns the first *length* characters of *source* string. | | +| LEN | *expression*=LEN(*string*) | Impl. | Return the length of a string. | Returns the length of the supplied *string*. A result of zero means the string is empty. | | | LINK | LINK *filename* [,*label*] | Not Yet Implemented | Load and execute another ACOS script. | The LINK statement allows you to load a different program segment and execute that one, optionally starting at a specified *label*. The purpose of this is to allow for your code to be split up into multiple segments, but also to support additional code to be used without modifying the other. The *filename* argument is mandatory and is in the standard filename syntax. If you wish the execution to begin at a point other than the beginning of the module, then the *label* argument can be specified in string form (e.g. LINK "A:MSG.SEG","BULLETINS"). The label must be enclosed in quotes or must be in a string variable. Note that for the label to be usable by the LINK command, the label must be declared as PUBLIC in the target file. | | | LOG | LOG *drivespec* | Not Yet Implemented | Change current filesystem drive. | The LOG statement simply changes the default disk drive to the *drivespec* drive. If the drive is not legal, a BAD DRIVE SPECIFIER error will occur. | | | MARK | *expression*=MARK(*device*)
MARK(*device*)=*number* | Not Yet Implemented | Set/get current file position offset. | The MARK function will allow you to either set or check the offset within the current file I/O. If you want to go to the beginning of a file, you would issue a MARK(1)=0 assuming it was file device #1. MARK has a second function in that it can be used to see if a file exists. Normally ACOS will not generate an error if a file exists, so it can be hard to tell if there is one. To see if a file exists:

OPEN #1,filename
IF MARK(1) PRINT "FILE EXISTS"
CLOSE #1
| | @@ -54,7 +54,7 @@ This document lists all of the **ACOS Words** supported in the A2osX implementat | POKE | POKE *address*, *value* | Not Yet Implemented | Set the value for a specified memory location. | Sets the value of the memory location specified at *address* with *value*. REMY TODO: Does this work in A2osX? Perhaps limit it to $C000-CFFF? | | | POP | POP | Not Yet Implemented | Remove the most recent address from the return stack. | Removes the last execution address from the stack, i.e. if a PUSH or GOSUB was called which put an execution address on the stack, the POP command can be used to remove it (and render that PUSH or GOSUB 'forgotten'). Works the same as the AppleSoft POP statement with the exception of it also can be used with the ACOS PUSH command. | | | POSITION | POSITION #*device,* *record_length,* *record_number* [,*offset*] | Not Yet Implemented | Set the file position offset for a device. | The POSITION statement is used to position within a random access file. The *device* argument is the disk device channel number that was used to open the file. The *record_length* argument is the length of each record. The *record_number* argument is the record number to be positioned to. The optional *offset* argument is the offset within the record that is to be positioned to. Note that there is no check to see if files actually conform to *record_length*; it along with the other *record_number* and *offset* arguments simply form a means of providing a calculation for a byte offset in the file as a while. For example, POSITION #1, 1000, 3, 50 would result in seeking file device #1 to the 3050'th byte in the file. | | -| PRINT | PRINT [#*device*,] [*expression*] [,*expression*] [;] | In Development | Output data to a device, session, or screen. | Sends/displays text or data to the screen, remote user, or specified device handler. There are a few rules for PRINT:

| | +| PRINT | PRINT [#*device*,] [*expression*] [,*expression*] [;] | Impl. | Output data to a device, session, or screen. | Sends/displays text or data to the screen, remote user, or specified device handler. There are a few rules for PRINT:

| | | PUBLIC | PUBLIC *label* | Not Yet Implemented | Declare a label to be accessible via the LINK command. | The PUBLIC statement is used to make a label within a program module available to other modules to LINK to. If you wish to link to another program module, and start execution at a point other than the beginning of the module, you will need to make that point public. You can have a maximum of 8 public labels within a program module. | | | PUSH | PUSH *label* | Not Yet Implemented | Push the current execution address to the return stack. | The PUSH statement is a subset of the GOSUB statement. It does not actually change the current point of execution, but places a return address on the stack so that the next time a RETURN statement is encountered, control will return to this present point. A POP statement will remove the last address added to the return table. | | | RAM | RAM | Not Yet Implemented | Keyword representing the primary 64-byte scratch RAM. | The RAM function is really just a constant pointer. It just points to a free 64 bytes of memory that has been set aside for program use. | | @@ -62,7 +62,7 @@ This document lists all of the **ACOS Words** supported in the A2osX implementat | RANDOM | *expression*=RANDOM(*number*) | Not Yet Implemented | Returns a random number between 0 and specified number. | The RANDOM function is used to generate a random number within the range 0-*number*. It is important to note that the random number generator only runs when the system goes to get input. In other words, if you take two random numbers in a row without some kind of user input in the middle, the random numbers will always be the same. If you need more than one, use the RND$ string between. The RND$ string will cause the random number generator to re-random. REMY TODO: Is there an A2osX random number service that would be used instead? | | | READ | READ #*device*, *memloc*, *number* | Not Yet Implemented | Reads binary data. | The READ statement is used to load data from a file into memory in its binary form without any processing or changing. The input does not have to come from a file, it can come from the editor or a message file. It is similar to an Apple DOS BLOAD command. BJB TODO: Need to improve this to describe memloc, number. | | | READY | READY *filename*
READY #MSG(*number*) | Not Yet Implemented | Prepare a message database for use. | The READY statement is used to make a message file ready for use. It is similar to an OPEN statement being used before a file is accessed. After a message file is ready, all the following references to MSG will be directed to that file. Once a message file has been made ready, it can also be used in its second syntax to ready a specific message within the file. This is generally used if further references to the file will use the device channel associated with the message base. | | -| RETURN | RETURN | In Development | Return from a subroutine. | Return from a subroutine. More specifically, it retrieves the last execution point off the stack and continues program execution from that point. Used in conjunction with GOSUB and PUSH statements. | | +| RETURN | RETURN | Impl. | Return from a subroutine. | Return from a subroutine. More specifically, it retrieves the last execution point off the stack and continues program execution from that point. Used in conjunction with GOSUB and PUSH statements. | | | REWIND | REWIND | Not Yet Implemented | Set file position to a previously set location. | The REWIND statement is to change the pointer within a message file to some previously accessed point within the file. Normally this is used in conjunction with the READY MSG(x):COPY #7 statements. Using REWIND will put the internal pointer back to where it was before the last message operation took place. This is generally used for doing a 're-read' function of sorts. | | | RIGHT$ | *string*=RIGHT$(*source*, *length*) | Not Yet Implemented | Return a number of characters from the end of a string. | Returns the last *length* number of characters from the *source*. | | | RND$ | *char*=RND$ | Not Yet Implemented | Returns a random character. | The RND$ function is used to generate random characters. Each time RND$ is accessed a new random character will be returned. Be warned: the random number is generated from timing how long a user takes to enter his input. This is really a pretty random number since it is based on the users typing skill and speed. The only problem is that the random character generator can start repeating patterns after about 15-20 characters have been generated and before another input has taken place. REMY TODO: Is this how your implementation works or are you using an A2osX random generator? | | diff --git a/.Docs/KERNEL.md b/.Docs/KERNEL.md index 6fc7cd45..31af695c 100644 --- a/.Docs/KERNEL.md +++ b/.Docs/KERNEL.md @@ -716,7 +716,7 @@ CS : not found # SListFree ## ASM -`>PUSHB hSList` +`lda hSList` `>SYSCALL SListFree` ## RETURN VALUE diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index 2d7bd969..1120fdce 100644 Binary files a/.Floppies/A2OSX.BUILD.po and b/.Floppies/A2OSX.BUILD.po differ diff --git a/BIN/ACOS.S.CODE.txt b/BIN/ACOS.S.CODE.txt index 182bd67a..5e511558 100644 --- a/BIN/ACOS.S.CODE.txt +++ b/BIN/ACOS.S.CODE.txt @@ -149,20 +149,6 @@ CODE.PUSHA ldx #0 rts *-------------------------------------- -CODE.PULLYA jsr CODE.PULLA - lda #$A8 tay - jsr CODE.EmitByte -*-------------------------------------- -CODE.PULLA ldx #0 - -.1 lda CCODE.PULLA,x - jsr CODE.EmitByte - inx - cpx #CCODE.PULLA.LEN - bne .1 - - rts -*-------------------------------------- CODE.FPRINTSTR ldx #0 .1 lda CCODE.FPRINTSTR,x diff --git a/BIN/ACOS.S.CORE.txt b/BIN/ACOS.S.CORE.txt index 018860ed..eb44b3eb 100644 --- a/BIN/ACOS.S.CORE.txt +++ b/BIN/ACOS.S.CORE.txt @@ -2,7 +2,10 @@ NEW AUTO 3,1 .LIST OFF *-------------------------------------- -CORE.Init >LDYAI CODESEG +CORE.Init ldy #CCS.MAX + sty pCCS + + >LDYAI CODESEG >SYSCALL GetMem bcs .9 @@ -86,7 +89,6 @@ CORE.Cleanup ldy #hFWRefBuf >LDA.G hVars beq .1 - >PUSHA >SYSCALL SListFree >STZ.G hVars @@ -94,7 +96,6 @@ CORE.Cleanup ldy #hFWRefBuf .1 >LDA.G hLabels beq .8 - >PUSHA >SYSCALL SListFree >STZ.G hLabels @@ -122,13 +123,15 @@ CORE.Compile jsr CORE.GetChar beq .80 #/bin/acos.... cmp #';' - beq .80 Comment: skip line... + bne .1 - cmp #C.CR +.80 jmp CORE.SkipLine Comment: skip line... + +.1 cmp #C.CR beq .88 EOL jsr CORE.CheckCharNB - bcs .1 CS=SPACE -> go check VAR or KW + bcs .2 CS=SPACE -> go check VAR or KW jsr CORE.IsLetter LABEL must start with a letter bcs .99 @@ -138,20 +141,23 @@ CORE.Compile jsr CORE.GetChar bra .8 *-------------------------------------- -.1 jsr CORE.GetNextCharNB skip SPACE(s) or ":" +.2 jsr CORE.GetNextCharNB skip SPACE(s) or ":" bcs .99 - cmp #C.CR +.21 cmp #C.CR beq .88 EOL jsr CORE.IsLetter bcs .90 >LDYA L.ACOS.KW - jsr CORE.Lookup + jsr CORE.LookupSkip bcs .3 - jmp (J.ACOS.KW,x) + jsr CORE.KW.JMP + bcs .99 + + bra .8 *-------------------------------------- .3 jsr CORE.CreateOrGetVar bcs .90 @@ -181,20 +187,23 @@ CORE.Compile jsr CORE.GetChar .4 jsr CODE.INTSET Store Int16 result in DATASEG *-------------------------------------- .8 jsr CORE.GetCharNB - bcs .99 + bcs .88 cmp #':' - beq .1 + beq .2 go skip : and continue - cmp #C.CR - bne .90 + bra .21 -.88 clc +.88 ldy pCCS + bmi .89 + + jsr KW.ENDIF + bcs .99 + +.89 clc jmp CORE.GetNextChar skip char -.80 jmp CORE.SkipLine - .90 lda #E.CSYN sec .99 rts @@ -203,6 +212,8 @@ CORE.Compile jsr CORE.GetChar sec rts *-------------------------------------- +CORE.KW.JMP jmp (J.ACOS.KW,x) +*-------------------------------------- CORE.FWREF >LDA.G hFWRefBuf >SYSCALL GetMemPtr >STYA ZPInputBufPtr @@ -337,7 +348,12 @@ CORE.LookupOPS lda (ZPInputBufPtr) .19 sec .99 rts *-------------------------------------- -CORE.Lookup >STYA ZPPtr1 +CORE.LookupSkip sec + .HS 90 BCC +CORE.Lookup clc + php + + >STYA ZPPtr1 ldx #0 @@ -356,7 +372,10 @@ CORE.Lookup >STYA ZPPtr1 jsr .10 next char in text... bcc .4 valid....failed -.3 tya Keyword Len +.3 plp + bcc .8 + + tya Keyword Len jmp CORE.SkipA @@ -377,8 +396,10 @@ CORE.Lookup >STYA ZPPtr1 lda (ZPPtr1) Array Ending 0, lookup failed bne .1 + plp + .9 sec - rts +.8 rts *-------------------------------------- .10 iny lda (ZPInputBufPtr),y Get Src text char... @@ -603,7 +624,15 @@ CORE.IsOPSChar phx clc rts *-------------------------------------- -CORE.IsEndExp cmp #')' +CORE.IsKW jsr CORE.IsLetter + bcs .9 + + >LDYA L.ACOS.KW + jmp CORE.Lookup + +.9 rts +*-------------------------------------- +CORE.IsEndExp cmp #')' CS = true beq CORE.ToUpperCase.RTS cmp #',' @@ -612,9 +641,9 @@ CORE.IsEndExp cmp #')' cmp #';' beq CORE.ToUpperCase.RTS -CORE.IsEndInst cmp #':' CS=TRUE +CORE.IsEndInst cmp #':' CS = true beq .8 - + cmp #C.CR beq .8 @@ -630,7 +659,7 @@ CORE.IsLetterOrDigit jsr CORE.IsDigit10 bcc CORE.IsLetterRTS *--------------------------------------- -CORE.IsLetter cmp #'_' +CORE.IsLetter cmp #'_' CC = true bne .1 clc diff --git a/BIN/ACOS.S.EXP.txt b/BIN/ACOS.S.EXP.txt index da09795a..8d17ac1f 100644 --- a/BIN/ACOS.S.EXP.txt +++ b/BIN/ACOS.S.EXP.txt @@ -3,7 +3,7 @@ NEW .LIST OFF *-------------------------------------- * In: A = current CHAR -* Out: CC, longint on stack or pSTR in stack +* Out: CC, int16 on stack or pSTR in stack *-------------------------------------- EXP.Eval stz EXP.TYPE @@ -39,16 +39,19 @@ EXP.Eval.R lda EXP.AOPS bne .20 jsr EXP.CreateStrConst - bcs .99 + bcs .37 bra .40 *-------------------------------------- .20 jsr CORE.IsLetter - bcs .30 FN or VAR + bcs .30 No, go check for number... + + >LDYA L.ACOS.KW Yes, KW, FN or VAR ? + jsr CORE.Lookup + bcc .80 KW, end of exp >LDYA L.ACOS.FN - jsr CORE.Lookup - + jsr CORE.LookupSkip bcs .21 jsr EXP.FNjmpX @@ -74,35 +77,38 @@ EXP.Eval.R lda EXP.AOPS .39 bcs .90 jsr EXP.Int16 - bcs .99 +.37 bcs .99 *-------------------------------------- .40 jsr CORE.GetCharNB .41 bcs .80 .50 jsr CORE.IsEndExp bcs .80 - + + jsr CORE.IsKW + bcc .80 + jsr CORE.LookupOPS bcs .90 stx EXP.AOPS -.61 lda (pStack) get op context - bmi .62 no prev op, go get arg2 + lda (pStack) get op context + bmi .60 no prev op, go get arg2 cmp EXP.AOPS we have arg1 A=op1 arg2 X=op2 - bcc .62 + bcc .60 inc pStack prev op has precedence tay - ldx ACOS.OPS.MAP-1,y + ldx ACOS.OPS2FPU,y jsr CODE.FPUCALL go compute (arg1 op1 arg2) -.62 lda EXP.AOPS we must compute arg2 op2 arg3 before +.60 lda EXP.AOPS we must compute arg2 op2 arg3 before >PUSHA -.63 jsr CORE.GetNextCharNB + jsr CORE.GetCharNB bcs .90 jmp .11 *-------------------------------------- @@ -110,7 +116,7 @@ EXP.Eval.R lda EXP.AOPS tay bmi .88 nothing to do - ldx ACOS.OPS.MAP-1,y + ldx ACOS.OPS2FPU,y jsr CODE.FPUCALL bra .80 diff --git a/BIN/ACOS.S.KW.txt b/BIN/ACOS.S.KW.txt index 5963ce85..33035307 100644 --- a/BIN/ACOS.S.KW.txt +++ b/BIN/ACOS.S.KW.txt @@ -12,6 +12,10 @@ KW.COPY KW.CREATE KW.ECHO KW.EDIT + lda #E.CSYN + sec + rts +*-------------------------------------- *KW.END KW.FILL KW.FLAG @@ -54,10 +58,125 @@ KW.HOME *-------------------------------------- * IP exp THEN st1 ELSE st2 *-------------------------------------- -KW.IF +KW.IF jsr EXP.Eval + bcs .99 + + lda EXP.TYPE + bne .91 - lda #E.CSYN + ldx #0 + +.1 lda CCODE.TESTTRUE,x + jsr CODE.EmitByte + inx + cpx #CCODE.TESTTRUE.LEN + bne .1 + + lda #$4C JMP abs + jsr CODE.EmitByte + + ldy pCCS + + dey + lda ZPCodeBufPtr+1 + sta (pData),y + + dey + lda ZPCodeBufPtr + sta (pData),y + + dey + lda #KWID.IF + sta (pData),y + + sty pCCS + + lda ZPCodeBufPtr + clc + adc #2 + sta ZPCodeBufPtr + bcc .8 + + inc ZPCodeBufPtr+1 + +.8 clc + rts + +.90 lda #E.CSYN + sec + rts + +.91 lda #E.TMISMATCH + sec +.99 rts +*-------------------------------------- +KW.ENDIF sec + .HS 90 BCC +*-------------------------------------- +KW.ELSE clc + + ldy pCCS + lda (pData),y + eor #KWID.IF + bne .9 + + iny + lda (pData),y + sta ZPPtr1 + + iny + lda (pData),y + sta ZPPtr1+1 ZPPtr1 = JMP if FALSE + + bcs .5 ENDIF + + lda #$4C JMP abs + jsr CODE.EmitByte + + ldy pCCS + iny + + lda ZPCodeBufPtr + sta (pData),y + iny + lda ZPCodeBufPtr+1 + sta (pData),y + + lda ZPCodeBufPtr + clc + adc #2 + sta ZPCodeBufPtr + bcc .1 + + inc ZPCodeBufPtr+1 + +.1 lda ZPCodeBufPtr + sta (ZPPtr1) + + lda ZPCodeBufPtr+1 + ldy #1 + sta (ZPPtr1),y + + clc + rts + +.5 lda ZPCodeBufPtr + sta (ZPPtr1) + + ldy #1 + lda ZPCodeBufPtr+1 + sta (ZPPtr1),y + + lda pCCS + clc + adc #3 + sta pCCS + + clc + rts + +.9 lda #E.NOIF sec rts *-------------------------------------- @@ -85,33 +204,34 @@ KW.POSITION *-------------------------------------- KW.PRINT stz hOut reset to hStdOut - + stz ZPPtr2 put ending CR + * ldy #S.PS.hStdOut * lda (pPS),y * sta hOut Default to screen - .10 jsr CORE.GetNextCharNB bcs .8 .11 jsr CORE.IsEndInst bcs .8 + + jsr CORE.IsKW + bcc .8 - stz bFlag put ending CR -*-------------------------------------- -.5 jsr EXP.Eval + stz ZPPtr2 put ending CR + + jsr EXP.Eval bcs .99 lda EXP.TYPE beq .6 - jsr CODE.PULLYA jsr CODE.FPRINTSTR bra .7 -.6 jsr CODE.PULLYA - jsr CODE.FPRINTINT +.6 jsr CODE.FPRINTINT *-------------------------------------- .7 jsr CORE.GetCharNB bcs .8 @@ -119,6 +239,10 @@ KW.PRINT stz hOut reset to hStdOut .70 jsr CORE.IsEndInst bcs .8 + jsr CORE.IsKW + bcc .8 + + lda (ZPInputBufPtr) cmp #',' bne .71 @@ -129,13 +253,13 @@ KW.PRINT stz hOut reset to hStdOut .71 cmp #';' bne .90 - - dec bFlag suppress ending CR + + ror ZPPtr2 suppress ending CR jsr CORE.GetNextCharNB skip ; bcc .11 -.8 bit bFlag +.8 bit ZPPtr2 bmi .80 jsr CODE.FPRINTCRLF diff --git a/BIN/ACOS.S.txt b/BIN/ACOS.S.txt index f65b9c75..1808718d 100644 --- a/BIN/ACOS.S.txt +++ b/BIN/ACOS.S.txt @@ -11,6 +11,7 @@ DATASEG .EQ 256 STRVSEG .EQ 2048 FWREF .EQ 1024 EXP.DEPTH.MAX .EQ 16 +CCS.MAX .EQ 128 *-------------------------------------- .INB inc/macros.i .INB inc/a2osx.i @@ -33,7 +34,8 @@ ZPStrBuf .BS 2 ZPPtr1 .BS 2 ZPPtr2 .BS 2 -ArgIndex .BS 1 +ArgIndex .EQ * +pCCS .BS 1 bFlag .BS 1 ZPCodeBufPtr .BS 2 @@ -96,6 +98,7 @@ J.ACOS.KW .DA KW.ADDINT .DA KW.CREATE .DA KW.ECHO .DA KW.EDIT + .DA KW.ELSE .DA KW.END .DA KW.FILL .DA KW.FLAG @@ -105,6 +108,7 @@ J.ACOS.KW .DA KW.ADDINT .DA KW.GOSUB .DA KW.GOTO .DA KW.HOME +KWID.IF .EQ *-J.ACOS.KW .DA KW.IF .DA KW.INFO .DA KW.INPUT @@ -336,10 +340,12 @@ PrintDebugMsg >LDYA pStack >STYA ZPPtr2 >PUSHW L.MSG.DEBUG - >PUSHW ZPPtr2 >PUSHW ZPCodeBufPtr + >PUSHW ZPConstBufPtr + >PUSHW ZPDataBufPtr + >PUSHW ZPPtr2 - >PUSHBI 4 + >PUSHBI 8 >SYSCALL PrintF rts *-------------------------------------- @@ -365,7 +371,7 @@ PrintErrorMsg >LDA.G bTrace sec >SBC.G InputBufPtr tax - bcc * + >LDYA.G InputBufPtr >STYA ZPInputBufPtr @@ -429,24 +435,37 @@ CCODE.PUSHA.LEN .EQ *-CCODE.PUSHA CCODE.PULLA >PULLA CCODE.PULLA.LEN .EQ *-CCODE.PULLA *-------------------------------------- -CCODE.FPRINTSTR pha - >PUSHW L.MSG.STR - pla +CCODE.TESTTRUE lda (pStack) + inc pStack + ora (pStack) + php + inc pStack + plp +.1 bne .1+5 +CCODE.TESTTRUE.LEN .EQ *-CCODE.TESTTRUE +*-------------------------------------- +CCODE.FPRINTSTR >PUSHW L.MSG.STR + ldy #3 + lda (pStack),y >PUSHA - tya + lda (pStack),y >PUSHA >PUSHBI 2 >SYSCALL PrintF + inc pStack + inc pStack CCODE.FPRINTSTR.LEN .EQ *-CCODE.FPRINTSTR *-------------------------------------- -CCODE.FPRINTINT pha - >PUSHW L.MSG.INT16 - pla +CCODE.FPRINTINT >PUSHW L.MSG.INT16 + ldy #3 + lda (pStack),y >PUSHA - tya + lda (pStack),y >PUSHA >PUSHBI 2 >SYSCALL PrintF + inc pStack + inc pStack CCODE.FPRINTINT.LEN .EQ *-CCODE.FPRINTINT *-------------------------------------- CCODE.LEN >PULLW ZPPtr1 @@ -498,7 +517,7 @@ MSG.USAGE .AS "Usage : ACOS