Comments (13)
A lot of locations have changed in the repo after r33, not the SYS ones though. They are a part of the $0300 vectors and will not change.
The SYS syntax with extra arguments will make it impossible to write helper tools callable using SYS that parse their own arguments, so I'm not a fan of that.
Close?
from x16-rom.
Is this actually a real world issue? During my C64 years, I never encountered this situation and I did quite a lot of BASIC/assembly mix code. I wasn't aware that this option actually exists. I only recently came across one program that used this and therefor, it failed to compile properly because I didn't support this A/X/Y with SYS in my compiler (because, as said, it never occured to me that this is supported by BASIC). None of my dozens of other BASIC test programs made use of this.
I think, there are more important things to tackle than making the SYS syntax more approachable. As long as the memory locations stay at a fixed position, I'm happy to poke into them (or peek from them) for the very few times that this is actually needed.
from x16-rom.
A lot of locations have changed in the repo after r33, not the SYS ones though. They are a part of the $0300 vectors and will not change.
Close?
Although the side discussion would then be in the closed section, the main topic is resolved. This could be closed.
Regarding the side discussion:
The SYS syntax with extra arguments will make it impossible to write helper tools callable using SYS that parse their own arguments, so I'm not a fan of that.
I would propose:
(1) SYS remain V2 SYS. If a RAMBANK specification keyword is put into place, it should be inherited by SYS, any call within $A000-$BFFF calling into the specified RAMBANK and any other routine having the specified RAMBANK available for data or support routines. This should also be understood to have the Basic ROM in scope, for the use of Basic Helper routines relying on SYS and it's flexibility in adding additional parameters after the address.
(2) The far call Kernel routine be exported to Basic as FARSYS, using V7 parameters:
FARSYS rombank, address [, A [, X [, Y [, P]]]]
This means that there is no need to set aside any additional "FARSYS register values" ... available temporary storage can be used during the parsing of parameters.
IIUC, the farjsr Kernel call leaves the registers untouched, so the FARSYS can fill them with default values before parsing any optional parameters, and then just load them up before calling the RAM based snippet to execute the farjsr: ... "LDA tp: PHA: LDA ta: LDX tx: LDY ty: PLP: JMP callfarjsr"
(this assumes callfarjsr is the RAM code to make the call with the following ROM bank parameter already set up, which was stored directly when the rombank parameter address was parsed).
from x16-rom.
I prefer that the X16 implements the C128/Plus4 versions of the SYS and RREG statements:
SYS PC, A, X, Y, PSW
RREG AV, XV, YV, PV
from x16-rom.
I was under the impression that it's the same on the X16. At least up to r33, they seem to be at the location you've mentioned.
from x16-rom.
They actually might be but they're dynamically allocated as far as I can see.
from x16-rom.
Utilities that have their own parameters simply could skip the four register arguments, then parse their things:
SYS PC,,,,, "FIRST UTILITY ARG", "SECOND ARG", "THIRD ARG"
from x16-rom.
Utilities that have their own parameters simply could skip the four register arguments, then parse their things:
SYS PC,,,,, "FIRST UTILITY ARG", "SECOND ARG", "THIRD ARG"
How exactly does the ordinary machine language routine know where those "utility arguments" are to be found, and how many to look for? A, X and Y would normally be used to pass utility arguments, or a pointer+len/count for their location, to the file.
The order of the register parameters then guide the writing of the ML program ... if there is one piece of information to pay, pass it in A if it is one byte, in A/X if it is 16bits, to pass two integers, have A refer to a ZP location and X/Y hold the other one (like Kernel SAVE), if there are more than three arguments or a variable number, have A hold a count of how many arguments and X/Y point to the first item in a linked list.
An approach that is not incompatible with CBMv7 would be a new keyword that passes a reference to a set of arguments in Basic IN A, X, Y in a set format that a utility Basic helper routine can use to find the information in the tokenized Basic program, and then call SYS without touching A,X,Y:
430 ARG "FIRST UTILITY ARG", "SECOND ARG", "THIRD ARG": SYS PC
The v7 SYS won't modify the contents of the shadow A, X or Y locations if the sys does not modify them.
from x16-rom.
SYS PC,,,,, "FIRST UTILITY ARG", "SECOND ARG", "THIRD ARG"
The utility subroutine acts as a BASIC extension. It uses a variation of the "wedge" method to hook into the interpreter. It calls the CHARGET
function (in the zero-page) to read the rest of the SYS
statement. On Commodore computers (where we know the contents of the ROM), it can call functions within the interpreter to help it parse that statement.
from x16-rom.
Just my 2cts:
what about having some variations of SYS like:
- SYS
cbm basic v2
SYS address - SYS7
cbm basic v7
SYS7 address , < registers > [, < parameters >] - SYS7P
SYS7P address , < parameters >
All this to compensate the fact we cannot name our parameters as with:
SYS $3000, A:0, Y:$FF, "parm1"
Or we can have something more C-like as a format string for printf.....
SYS "%PC%A%Y%P", $3000,255,0,"hello"
SYS "%PC%P", $3000,,"hello"
but I definitively prefer the former.
from x16-rom.
Th C64 design makes you POKE780+ with A/X/Y/P to run arbitrary machine code that is not aware of BASIC. To get the state back, PEEK780+. Pretty simple, super flexible. It also allows assembly helper code that is meant to be called only by BASIC that can use CHKCOM, GETBYT etc. to get extra arguments, in any syntax.
The proposed solutions (including the BASIC7 one) allow passing and retrieving A/X/Y/P with less syntax, but make the BASIC helper code case more verbose.
I'm still not convinced, but I am not saying I can't be convinced. :)
from x16-rom.
Yes, the Assembly code would be more verbose; but, so what?! Assembly code is verbose anyway. Adding some more jsr
instructions to skip stuff that the helper doesn't need isn't a burden -- it's just a normal part of designing machine language subroutines.
The point is that the BASIC code would be less verbose. And, the special use of POKE780+
and PEEK(780+)
is harder to remember than the extended -- but simpler -- syntax of SYS
and RREG
.
from x16-rom.
Is this actually a real world issue? During my C64 years, I never encountered this situation and I did quite a lot of BASIC/assembly mix code. I wasn't aware that this option actually exists. I only recently came across one program that used this and therefor, it failed to compile properly because I didn't support this A/X/Y with SYS in my compiler (because, as said, it never occured to me that this is supported by BASIC). None of my dozens of other BASIC test programs made use of this.
I think, there are more important things to tackle than making the SYS syntax more approachable. As long as the memory locations stay at a fixed position, I'm happy to poke into them (or peek from them) for the very few times that this is actually needed.
It wouldn't be an issue in C64 code, it was a later extension (not sure if C128 V7 Basic introduced it or V3.5 introduced it). It's an issue if pulls from V7 are preferred to proposals for new routines. The V7 version of SYS focuses on making it easier to call KERNAL routines, and the existence of KERNAL routines that use the Carry flag as an input is surely why it extends to the flags register.
SYS PC,,,,, "FIRST UTILITY ARG", "SECOND ARG", "THIRD ARG"
The utility subroutine acts as a BASIC extension. It uses a variation of the "wedge" method to hook into the interpreter. It calls the
CHARGET
function (in the zero-page) to read the rest of theSYS
statement. On Commodore computers (where we know the contents of the ROM), it can call functions within the interpreter to help it parse that statement.
So the issue is that unlike C128 SYS, C64 SYS takes no additional parameters, so ignores what you put after it, and then people have taken advantage of that to add utility arguments which they can use some of Basic's mechanisms to help parse?
[Edit] Seems like there isn't a conflict in that case. Just have the helper utility scan for a print token, and consume the following arguments, so the print is never executed:
100 LOOKUP = $BFE8
...
450 SYS LOOKUP,1 :?"/[A-Za-z]+/"
If the utility helper is hacking the Basic mechanisms, all you need is a keyword that doesn't take a lot of space and that the Basic parser is happy to have followed by an arbitrary set of parameters ... the V7 SYS parsing is halted by the end of the statement.
from x16-rom.
Related Issues (20)
- LOAD and SAVE should respect current BANK HOT 3
- DOS unit tests 07 and 08 (C: copy/concatenate) are broken HOT 4
- BASIC overflow/hang in SQR() HOT 4
- Screen editor changes colors when deleting across line boundary HOT 3
- GEOS won't start HOT 3
- CMDR-DOS: Input corruption when programmatically reading from a directory listing "$" (SA 0) and another file (SA 2) HOT 4
- LOG(2) inaccurate (slightly) HOT 4
- To match official Perixx keyboard keycaps, treat scroll lock as 40/80 switch in BASIC instead of (or in addition to) F4 HOT 1
- memory_decompress not working when decompressing to VRAM HOT 2
- RFE: method for fetching the current working directory HOT 4
- Cursor not cleared in the BASIC editor on startup HOT 1
- [DOS] Rename across directories on FAT32 has incorrect and possibly undefined behavior HOT 1
- The future of X16 NMI behavior HOT 1
- Changes to basic\token2.s doesn't cause a build HOT 4
- Given SPI_CTRL_AUTOTX doesn't work on hardware it should be removed HOT 1
- Fat32 implementation doesn't understand 0xffffffff in the Free Count field in FSInfo
- Saving a file doesn't update the free space HOT 2
- Overwriting a file doesn't appear to work HOT 1
- Add ELSE and END IF to BASIC
- would like a way to adjust key repeat parameters on the system HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from x16-rom.