fred@cbmvax.cbm.UUCP (Fred Bowen) (12/13/86)
C/128 SYSTEM ROM RELEASE NOTES Commodore Electronics, LTD. 7 November 1986 C128 ROM RELEASE NOTES: 318018-04, 318019-04, 318020-05 318022-02, 318023-02 THE FOLLOWING MODIFICATIONS HAVE BEEN MADE TO THE 318018-02, 318019-02, AND 318020-03 CODE TO CREATE A NEW ROM SET RELEASED ON 11/07/86. THIS RELEASE IS MADE TO CREATE MASKED ROMS FOR PRODUCTION. THESE ROMS ARE TO BE USED AS A SET, REPLACING THE PREVIOUS ROM SET ENTIRELY. THEY ARE NOT TO BE MIXED. THIS RELEASE IS MADE SIMULTANEOUSLY IN THE FORM OF 16KB AND 32KB ROMS, FOR USE IN THE FOLLOWING SYSTEMS: C128, C128D, C128CR, C128DCR, AS APPROPRIATE. PLEASE NOTE: AN 11/18/85 ENGINEERING RELEASE OF A C128 ROM SET WAS NEVER RELEASED TO PRODUCTION, AND ACCOUNTS FOR THE APPARENT JUMP IN ROM REVISION NUMBERS. THE FOLLOWING INFORMATION INCLUDES THOSE DIFFERENCES AS WELL. The following information represents a filtered condensation of all known problems, complaints, and suggestions that pertain to the C/128 system software to date (exclusive of CP/M). The current ("original" ROMs) system software consists of: 1. Part No. 318018-02 --> BASIC LOW ($4000-$7FFF) 2. Part No. 318019-02 --> BASIC HIGH, MONITOR ($8000-$BFFF) 3. Part No. 318020-03 --> EDITOR, KERNEL, CP/M ($C000-$FFFF) 4. Part No. 315078-02 --> DIN ED, KERNEL, CP/M ($C000-$FFFF) 5. Part No. 318022-01 --> BASIC, MONITOR ($4000-$BFFF) (includes 1+2 above) 6. Part No. 318023-01 --> ED, KERN, CP/M, C64 ($C000-$FFFF) (includes 3+4 above) The updated C/128 16KB ROM set bears the following part numbers. (The PCB socket number is valid only for original PCBs). 1. # 318018-04 --> BASIC LOW ($4000-$7FFF, U33) cksum= 9A40 2. # 318019-04 --> BASIC HIGH, MONITOR ($8000-$BFFF, U34) cksum= 6F80 3. # 318020-05 --> EDITOR, KERNEL, CP/M ($C000-$FFFF, U35) cksum= EEC4 4. # 315078-03 --> DIN ED, KERNEL, CP/M ($C000-$FFFF, U35) cksum= E4C4 5. # 318022-02 --> BASIC, MONITOR ($4000-$BFFF, U34) cksum= 09C0 6. # 318023-02 --> EDITOR, KERNEL, CP/M ($C000-$FFFF, U32) cksum= F324 (Note that #6 above also contains the C/64 ROM code.) Each 16KB ROM block contains a small patch area for changes, and all patches described below have been accomplished such that any particular change will never affect more than one ROM. Similarly each ROM contains a revision status byte (at $7FFE, $BFFE, and $CFFE) which software can test to determine the version of the host system. The "original" ROMs contain $00 in these locations and the "update" ROMs described herein contain $01. Each ROM has had several changes, as summarized on the following pages. Part Number 318018-04 --> BASIC LOW ($4000-$7FFF) 1. LIST and DELETE commands. Previously they did not report as errors certain non-numeric characters passed as arguments, such as 'LIST A'. This has been corrected totally in-line by adjusting an erroneous relative branch in the 'RANGE' subroutine. 2. CIRCLE command. Previously an unspecified Y-radius defaulted to the X-radius (as it should), but the X-radius value had already been scaled for the X-axis and not the Y-axis. This has been corrected totally in-line by scaling the radii after the defaults have been established. 3. RS-232 STatus. Previously accessing ST after RS-232 I/O resulted in an incorrect status being returned from, and a zero written to, location $10A14, possibly corrupting the BASIC variable area. This was a result of BASIC calling the Kernel routine 'READSS' with the incorrect RAM bank in context. This has been corrected totally in-line by substituting the correct BASIC subroutine call. 4. CHAR command. Previously using CHAR with the 80-column text screen (GRAPHIC mode 5) resulted in RAM corruption at locations $D600 and $D601 of RAM bank 0 (the BASIC text bank) due to BASIC calling the Editor PLOT routine without the I/O block in context. This has been corrected utilizing two patch subroutines. 5. RENUMBER command. Previously the pass 2 routine, which was to pre-scan BASIC text and report 'out of memory' errors prior to actually changing anything, was seriously flawed. This has been corrected utilizing a patch subroutine. 6. DELETE command. Previously did not limit-check itself when moving down BASIC text, therefore it was possible to crash when DELETEing lines at or near the top of memory (near the MMU configuration registers). This has been corrected utilizing a patch subroutine. Also, DELETE previously exited to MAIN via 'JMP', effectively ending the evaluation of the current command string. This has been corrected by substituting an 'RTS', allowing direct commands like 'DELETE 10: PRINT"DELETED LINE 10"' to work correctly. 7. PLAY command. Previously the SID frequency tables were not exactly NTSC concert pitch. Also, there was no provision for adjusting the frequency for PAL systems. This has been corrected by changing the (NTSC) frequency tables, creating new PAL tables, and utilizing patch code to select from the appropriate table as determined by the Kernel PAL_NTSC flag. 8. The BASIC ERROR handler previously failed to clear pending string temporaries when an error was TRAPed. This has been corrected via patch code to reset TEMPT to TEMPST. 9. The powerup copyright notice has been updated to 1986, which will serve as an immediate visual indication of the ROM update status. Also, a new notice has been placed at $7FC0. 10. The ROM signature at location $7FFC and $7FFD (lo/hi) is $8DEF. (new since last release). 11. The ROM revision byte at location $7FFE, has incremented from $00 to $01. 12. The ROM checksum byte at location $7FFF, has changed from $4C to $61. Part Number 318019-04 --> BASIC HIGH, MONITOR ($8000-$BFFF) 13. RSPRITE and RSPPOS functions. Previously they accepted as parameters sprite numbers in the range 1-16, which is incorrect. This has been corrected totally in-line by limiting the range check to 1-8, and reporting an illegal quantity error for sprite numbers outside this range. 14. PRINT USING command. Previously there was an anomaly involving the use of floating money symbols ('$') and commas. The command 'PRINT USING "#,##$.##"; 123.45', for example, resulted in the output '$,123.45', which is incorrect. This has been fixed utilizing a patch subroutine which checks specifically for the '$,' occurrence and substitutes a '_$' ('_' = fill character) whenever found. 15. Relative Coordinates for all graphic commands (except MOVSPR) were incorrectly processed. The problem was apparent when negative relative coordinates were used, which resulted in an illegal quantity error. This has been corrected totally in-line by substituting a different subroutine call to pre-existing code. This change affects the BASIC commands LOCATE, DRAW, PAINT, BOX, CIRCLE, GSHAPE, and SSHAPE. This change also allows negative absolute coordinates to be accepted (previously they resulted in an illegal quantity error), although the legal range remains a 16-bit value: 0-65535 (unsigned) or -32768 to 32767 (signed: i.e., -1 is equivalent to 65535). 16. DOPEN and APPEND commands. Previously it was possible to open two or more disk channels with the same logical file number without incurring an error report. This has been corrected totally in-line. 17. MATH package. An original bug fix (ref: double zero bug) to the (F)MULT routine has been found to result in small errors (such as 2^15 = 32768.0001). This has been corrected totally in line by fixing the original (dbl-0) problem in a different way. 18. A copyright notice has been placed, starting at $BFC0. 19. The ROM signature at location $BFFC and $BFFD (lo/hi) is $CDC8. (new since last release). 20. The ROM revision byte at location $BFFE, has incremented from $00 to $01. 21. The ROM checksum byte at location $BFFF, has changed from $3A to $C5. Part number 318020-05 --> EDITOR, KERNEL, CP/M ($C000-$FFFF) 22. CAPS LOCK Q. Previously an error in a key matrix decode table caused a lower-case 'Q' to be passed when the keyboard is in CAPS LOCK mode. The table has been corrected by substituting the correct value for upper-case 'Q'. 23. FUNCTION KEYs. Previously the funcion key handler, part of the SCNKEY routine at CKIT2, failed to detect a funtion key string pending. This has been corrected via patch routine, which will ignore new function key depressions until the string in progress has been output (i.e., KYNDX = 0). Also, DOPFKY now exits via SCNRTS, instead of simply RTSing. 24. IOINIT system initialization. Previously the RS-232 pseudo-6551 registers were not initialized because these values are expected to be given by the user whenever RS-232 channels are OPENed. Apparently many C64 users have taken advantage of the fact the C64 'happened' to clear these locations and fail to specify critical parameters. These RS-232 registers are now initialized to default to: no parity, full duplex, 3-line, 1-stop bit, 8-bit words and 300 baud, via a patch subroutine. 25. IOINIT PAL system initialization. Adjustments have been made to the 8563 initialization values for PAL systems. The PAL horizontal total (register 0) changes from $7E to $7F. The PAL vertical total (register 4) changes from $27 to $26. These changes shift the cycle time from 20.320us to 20.032us. The patch required a patch subroutine, as well as a change to VDCTBL. 26. BASIN system call. Previously attempting input from a logical channel to the screen (e.g., via INPUT#) resulted in line too long errors. This has been corrected utilizing a subroutine patch to preserve bit-7 of CRSW, which serves as a flag to the Editor that a (pseudo) end-of-line has been reached. Also, TBLX is copied to LINTMP to correctly locate the current cursor line for the Editor. Please note that switching between the 40 and 80-column text screens, opening and closing windows, or clearing text screens can confuse logical screen channels. The Editor variable LINTMP ($A30) is a global, not local, variable as it should have been. Users can POKE LINTMP with the logical screen line number before INPUT#'s as a work-around. 27. OPEN RS-232 system call. Previously it was possible to receive a carry-set status, normally indicating a error, when no error existed after OPENing an RS-232 channel. This has been corrected totally in-line by a modification to the code which checks for the proper X-line hardware states. 28. LOAD system call. Previously the normal (a.k.a. SLOW) load mechanism did not preserve the starting address of any LOADs, which made the BASIC 'BOOT "file"' command form malfunction unpredictably. This is apparent only when used with 1541 drives. This has been corrected via a patch subroutine, which saves the starting address of all LOADed files at SAL and SAH, the same place the fast (a.k.a. BURST) load mechanism does. 29. DMA system call. Previously the Kernel forced the I/O block into the user's memory configuration at all times, which is no longer necessary and, in fact, seriously limits the functionality of the RAM expansion cartridge. This has been corrected by a ROM patch routine, which affects all Kernel DMA system calls as well as the BASIC FETCH, STASH, and SWAP commands. Also, previously it was possible for an IRQ to occur between the 'arm DMA' and 'trigger DMA' sequences, resulting in a DMA operation with the system configuration in context regardless of desired configuration. This has been corrected by adding 'PHP/SEI...PLP' instructions around the JSR to DMA RAM code at $3F0. Applications using the DMA RAM code at $3F0 should do likewise. Finally, in this patch changes were made to enable DMA operations to all RAM banks by correctly using the VIC bank pointer found in the MMU RAM configuration register ($D506, VA16=bit-6 and VA17=bit-7). Applications using the Kernel routine at $FF50 will inherit these changes automatically. Please note that NMI interrupts can screw-up DMA operations, as they cannot be masked. 30. A copyright notice has been placed, starting at $CFC0. 31. The ROM location $CFF8 is reserved for national character ROM checksums. This does not apply to US ROMs, which contain $FF here. (new since last release). 32. The ROM location $CFF9 is now reserved for country codes. The US ROMs contain $FF here. (new since last release). 33. The ROM location $CFFA and $CFFB (lo/hi) contain the national character set signature. This does not apply to US ROMs, which contain $FFFF here. (new since last release). 34. The ROM signature at location $CFFC and $CFFD (lo/hi) is $8F76. (new since last release). 35. The ROM revision byte at location $CFFE, has incremented from $00 to $01. 36. The ROM checksum byte at location $CFFF, has changed from $C3 to $3C. 37. The Kernel revision byte at location $FF80 has incremented from $00 to $01. Part number 315078-03 --> DIN ED, KERNEL, CP/M ($C000-$FFFF) There have been no revisions to the national portions of the many national Kernel/Editor ROMs. All revisions described above for the US version have also been made to the national versions. 38. A copyright notice has been placed, starting at $CFC0. 39. The ROM location $CFF8 is reserved for national character ROM checksums. The German/Austrian (DIN) ROMs contain a $FF here (that really is the checksum!). 40. The ROM location $CFF9 is now reserved for country codes. The German/Austrian (DIN) ROMs contain $00 here. US ROMs contain $FF here. 41. The ROM location $CFFA and $CFFB (lo/hi) contain the national character set signature. The DIN ROMs contain $91F3 here. This is unused ($FFFF) for US ROMs. 42. The ROM signature at location $CFFC and $CFFD (lo/hi) is $EA3B. 43. The ROM revision byte at location $CFFE, has incremented from $00 to $01. 44. The ROM checksum byte at location $CFFF, has changed from $C3 to $4C. 45. The Kernel revision byte at location $FF80 has incremented from $00 to $01. C/128 developer and documentation notes There were quite a few items that, for one reason or another, I categorized as un-fixable as the fix would compromise compatibility or be too radical given the work-around or relative severity of the problem. They are included here to document them along with any implications, work-arounds, etc. 1. DMA interface. It should also be noted that DMA hardware is unreliable at 2MHz clock speeds and consequently the user must insure 1MHz (SLOW) mode is used before any DMA operations are performed. NMI interrupts will also cause problems, and should be disabled or somehow avoided. RS-232 operations use NMIs; the remote should be XOFFed or the channel disabled before DMA operations are performed. 2. IRQ handler. It is possible for the Kernel IRQ handler to perform a keyscan when the IRQ was not the Kernel's. While the fix is trivial, I did not include it because it might cause problems with existing software which may be taking advantage of the unintentional keyscans. 3. IRQ and NMI handlers. The Kernel forces the system bank into context before taking the RAM indirect vectors to the actual interrupt handler. Much flexibility can be added to the mechanism if the memory bank to be brought into context at interrupt time could be read from a variable instead of a ROM constant. I am reluctant to include this change because the RAM variable would have to be located in a previously 'free' location, which may be used by existing applications. 4. SAVE-to-disk. It is not possible to SAVE the last byte of any memory bank (e.g., RAM at $FFFF), because the SAVE routine requires you to specify the end of the area to be SAVEd as the ending address PLUS ONE ($FFFF+1 -> $0000). This is a problem found on all CBM 65xx systems. 5. SAVE-to-cassette. It is not possible to save the last page of any memory bank (e.g., RAM at $FF00-$FFFF) to tape. The tape handler hangs with the motor running until the user STOPs it. This is a problem found on all CBM 65xx systems except the Plus-4. 6. SAVE and LOAD. While program SAVEs correctly save the 16-bit starting address for future LOADs, the existing formats do not save the memory bank. This cannot be accommodated without the creation of special C128 program headers for disk and tape, which is undesirable and non-trivial. 7. STOP/RESET monitor entry. It is not possible to enter the Monitor directly via the STOP/RESET sequence from BASIC and then eXit back to BASIC without incurring a 'cold' BASIC initialization. The alternative, taking the BASIC 'warm' start route, would result in a system crash if BASIC had not been properly initialized and is therefore not a recommended fix. The work-around, assuming BASIC was running before STOP/RESET, is for the user to place the value $C1 into location $A04 (INITSTATUS) and then eXit. 8. Monitor 'H' (hunt) command. Because the editor performs various translations on data read from the screen, it is not possible to Hunt for certain CBM characters, such as pi and all reverse-field characters. 9. BOX command. BOX, because of the particular algorithm utilized, has a restricted range of -16384 to +16383 (unscaled). The algorithm uses parameters that are twice those given for calculations and divides down the result before plotting. Thus it is possible for very large (unscaled) positive coordinates to result in large negative plots. The work-around is to use SCALEing, user range-checking, or avoid BOX and use either DRAW or CIRCLE commands instead. 10. RDOT, PEN, and RSPPOS functions. These BASIC functions return the current pixel cursor, lightpen and sprite positions, respectively, but the values they return are unSCALEd. Correcting this is trivial, but would result in problems for existing applications as well as being incompatible with C64 VSP and the PLUS-4. 11. FNDEF and GRAPHIC modes. After defining a user function, anything that results in program relocation must be avoided, such as GRAPHIC 'n' or GRAPHIC CLR. There is no fix planned. The work-around is a general rule: define GRAPHIC screens first (then SCALE), then define functions. 12. HELP command. HELP does not completely identify two type of syntax errors: 'RUN n' where 'n' is an undefined statement, and 'XXXX n' where 'XXXX' is any BASIC command which expects no argument. In the RUN case, TXTPTR had already been reset, but not OLDLIN, thus the correct line is displayed but without any highlighting. In the other case, because XEQCM exits via CHRGET, TXTPTR is incremented before the error is caught, resulting in part of the error not being highlighted. The fix would be too complex, especially considering the fact that the line containing the error is reported, albeit without highlighting. 13. GETKEY function. In the form 'GETKEY A', this BASIC function should wait until a numeric key is pressed, but certain non-numeric keys are accepted, such as 'E', colon, comma, period, '+', and '-'. The same anomaly occurs with 'GET A' for the same reason, as is a known CBM quirk. 14. PUDEF and PRINT USING commands. There is poor documentation of the fact that USING format fields such as "$,###.##", the leading '$' or commas are not interpreted per the PUDEFs as they are considered not part of the numeric field. This is found to occur in all versions of CBM BASIC 3.5 or higher. 15. RENUMBER command. Because of the routine's use of LINNUM to fetch from BASIC text the statement number of an object, it is possible to get a 'syntax error' when none existed within the RENUMBER command line itself. LINNUM itself reports any line numbers it reads that are out of range (>63999). Actually, you could use this to 'protect' a program from RENUMBERing. Also note that RENUMBER can not renumber line ranges. Therefore, LIST and DELETE statements within a program are NOT changed nor will they generate any errors. 16. OUT of MEMORY ERROR. It is possible to hang the system with this error from a running program when there is insufficient memory to contain the string representation of the original line number where the error occurred. One must STOP/RESTORE the system and type CLR to recover. This problem is found on most CBM 65xx systems. 17. BASIN ($FFCF) calls return <space><return> to <return> input (i.e., null input line). The culprit is an unnecessary BEQ test in LOOP4, which was left in for compatibility with the C64 and PLUS-4 editors, which behave in a similar manner. 18. MATH package. The binding of operators is such that unary minuses are evaluated after powers. This results in NO error when equations of the form (-4^.5) are evaluated (square root of a negative number). Of course, the error is given if the sign of the number is known when the power is applied (eg., X=-4 :PRINT X^.5). This is a known CBM quirk. 19. BASIC DOS commands, such as DOPEN and APPEND, limit filenames to 16 characters maximum. However, when the name string includes the filetype, such as "LONGLONGLONGLONG,P", BASIC reports a FILENAME TOO LONG error when, in fact, it is valid. This is a problem on all CBM systems > DOS 3.0. 20. DCLOSE accepts both LFN and UNIT parameters simultaneously, which it should not (they should be mutually exclusive). The LFN is always used, and the UNIT ignored, if both are given. 21. AUTO command puts next line number into the KEY buffer. It should probably just print it. This only causes a problem when used with function key strings containing <return>s. 22. INSERT Editor mode is not canceled by specific ESCAPE sequences which move the cursor. For example, <INS><INS><INS> <ESC>K <CRSR><CRSR><CRSR> illustrates that staying in INSERT mode after moving the cursor to the EOL is undesirable. 23. CIRCLE command in multicolor mode calculates default Y-radius based upon twice the X-radius. This is undesirable, but maintained to preserve compatibility among C64 VSP, PLUS-4, and C128. 24. TAPEs written in FAST mode are occasionally hard to read in SLOW mode. While I would not be surprised by this, I could not repeat the problem. The complaint comes from PAL/50Hz environments, but that may be the only place tapes are used! Users should take care to use tapes only in SLOW (1MHz) mode so that the tapes can be read on PETs, 8032s, C64s, etc. 25. VERIFY and DVERIFY will report 'verify error' when, in fact, the programs are identical. This occurs when the LOADed version of the BASIC program has been relocated since it was SAVEd, usually the result of the GRAPHIC command. In such cases, the MSB of line links differ, and (D)VERIFY fails. Try GRAPHIC <n|CLR> as appropriate and try again. -- Fred Bowen uucp: {ihnp4|seismo|caip}!cbmvax!fred arpa: cbmvax!fred@seismo.css.GOV tele: 215 431-9100 Commodore Electronics, Ltd., 1200 Wilson Drive, West Chester, PA, 19380