ACTION! BUG SHEET #3 - part 4 ------------------------------------- PROBLEMS WITH PAD We will list the problems (and solutions) regarding the Programmer's Aid Disk here in reasonably compact form. 1. BGET/BPUT PROBLEMS -- The BGet and BPut routines in the IO.ACT file do not work properly under certain conditions. To fix this bug, replace the BGet and BPut routines with the following ACTION! code: ;******************************** ;Burst (Block) I/O routines to do ;quick disk I/O, utilizing a call ; to CIO ;******************************** PROC CIO=$E456( BYTE areg, xreg ) ;******************************** CARD FUNC Burst( BYTE chan, mode, CARD addr, buflen ) TYPE IOCB=[BYTE id,num,cmd,stat CARD badr,padr,blen BYTE a1,a2,a3, a4,a5,a6] IOCB POINTER iptr chan ==& $07 iptr = $340+(chan LSH 4) iptr.cmd = mode iptr.blen = buflen iptr.badr = addr CIO( 0, chan LSH 4 ) RETURN( iptr.blen ) ;******************************** CARD FUNC BGet( BYTE chan, CARD addr, len ) CARD temp temp = Burst(chan,7,addr,len) RETURN( temp ) ;******************************** PROC BPut(BYTE chan, CARD addr,len) Burst( chan, 11, addr, len ) RETURN 2. PRINTF -- The PRINTF routine has a bug which was reported and fixed in the Spring, 1984 newsletter. In the file PRINTF.ACT, use the ACTION! editor to find args ==+ s and change it to args ==+ 2 3. PLAYER/MISSILE GRAPHICS -- Because S: uses some memory just below the display list (undocumented), our method of finding the base address for Player/Missile Graphics needs a slight revision. Use the ACTION! editor with the file PMG.ACT to find PM_BaseAdr=(HiMem- PM_MemSize(mode)) &PM_AdrMask(mode) and change it to PM_BaseAdr=(HiMem- PM_MemSize(mode)-$80) &PM_AdrMask(mode) 4. If you use the PMMove procedure and specify a vertical movement of zero, the horizontal movement does not take place (it should). To fix this, change the lines in PMG.ACT which read IF deltay=0 THEN RETURN ; do nothing FI to the following: IF deltay=0 THEN ; do horizontal anyway PMHpos(n)=x RETURN FI 5. PLAYER/MISSILE GRAPHICS -- The documentation for PMG.ACT states that you may read the contents of PMHpos to find the horizontal position of a player or missile. This is simply not true. PMHpos is a set of write-only hardware registers. (Note that in the ToolKit we have added a shadow array and changed the name of the hardware registers, so this works correctly. If you wish, you could consider doing something similar on your PAD.) 6. REAL NUMBER ROUTINES -- There are two discrepancies in PROCedure names in the REAL.ACT library as compared to the REAL.DOC documentation, as follow: Name in .DOC Name in .ACT StrR RealToStr ValR StrToReal We suggest that you change the source code in REAL.ACT to reflect the names given in the documentation (rather than vice versa), since this makes the names appear compatibile with the library's other number-string conversion routines. 7. REAL NUMBER ROUTINES -- In that same area, the routine RealToStr (or should that be StrR?) needs to change the line which reads ptr=LBuff to the following: ptr=InBuff 8. ALLOC.ACT -- The free list pointer may not be set up properly. Also, when freeing a block, right adjacency is not handled properly if left adjacency has already been found. Fix these problems as follows: In the PROCedure Free, after the line reading: last.size==+nBytes insert the line: target=last Also, in the same procedure, change the line reading: IF target+nBytes=current THEN to read: IF target+target.size =current THEN In the PROCedure AllocInit, replace the line reading: FreeList.next=p with the following lines: FreeList=p p==+4 FreeList.next=p ------------------------------------- TOOLKIT TROUBLES It's hard to believe that a product as new as the ACTION! ToolKit can already have bug reports. Sigh. Anyway, there are already three versions of the ToolKit. Version 1 has 31 free sectors (when you list its directory). Version 2 has fewer free sectors and the second line of the file MUSIC.DEM reads ";Version 2". On version 3, the file ABS.ACT starts with the version number. This last convention will be followed in future versions. The comments here are organized by affected version(s). VERSION 1 ONLY 1. I/O ROUTINES -- The manual describes a routine called Format (in the IO.ACT library), but no such procedure exists on the disk. However, the routine is there--it's just called Init instead. You should change your disk to match your manual. 2. MUSIC.DEM -- The program called MUSIC.DEM will not work as is on older 400/800 machines. This is because it uses a call to Graphics(15), which is only available on XL machines. You may change the program to use Graphics(8) with no effect except that the true colors of mode 15 become artifact colors in mode 8 instead. VERSIONS 1 AND 2 1. REAL ROUTINES -- There are two discrepancies in PROCedure names in the REAL.ACT library as compared to the REAL.DOC documentation, as follow: Name in .DOC Name in .ACT StrR RealToStr ValR StrToReal We suggest that you change the source code in REAL.ACT to reflect the names given in the documentation (rather than vice versa), since this makes the names appear compatibile with the library's other number-string conversion routines. 2. SORT ROUTINES -- There are four discrepancies in PROCecure names in the SORT.ACT library as compared to the SORT.ACT documentation, as follows: Name in .DOC Name in .ACT SortB BSort SortC CSort SortI ISort SortS SSort Please change your disk file to agree with your manual. 3. PRINTF -- The PRINTF routine has a bug which was reported and fixed in the Sprint, 1984 newsletter. In the file PRINTF.ACT, use the ACTION! editor to find args ==+ s and change it to args ==+ 2 VERSIONS 1, 2, AND 3. 1. ALLOC ROUTINES -- The manual in- dicates that the procedure AllocInit requires that you pass it the address of the first free byte of memory (because Alloc "dispenses" memory from the first free byte through the top of memory, as correctly described in the manual). However, since you MUST follow the procedure described in the introduction to ALLOCATE.ACT (that is, you must declare in your program a CARD called EndProg and use the command SET EndProg=* after compiling), the parameter to AllocInit is not really needed and so has been eliminated. (AllocInit uses EndProg just as Alloc does.) If you pass a parameter to AllocInit, it will be ignored. 2. WARP.DEM -- No mention is made in the Toolkit manual that this file can only be run when compiled from disk (unless you are using DOS XL to gain extra memory). WARP.DEM is just too big for ACTION! to hold both the source and object in memory at one time. 3. ALLOCATE.ACT -- The free list pointer may not be set up properly. Also, when freeing a block, right adjacency is not handled properly if left adjacency has already been found. Fix these problems as follows: In the PROCedure Free, after the line reading: last.size==+nBytes insert the line: target=last Also, in the same procedure, change the line reading: IF target+nBytes=current THEN to read: IF target+target.size =current THEN In the PROCedure AllocInit, replace the line reading: p=EndProg with the following lines: FreeList=EndProg p=EndProg+4