home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / genie-commodore-file-library / GEOSApps / G128TECHREF.TXT < prev    next >
Text File  |  2019-04-13  |  14KB  |  374 lines

  1. GEOS Technical Reference Notes
  2. December, 1987
  3.  
  4. This document provides some preliminary information about the differences
  5. between C64 GEOS and C128 GEOS. It is not intended to be comprehensive;
  6.  
  7. Compatibility with C64 GEOS software
  8. ------------------------------------
  9. Most C64 GEOS software will run under the C128 GEOS in 40 column mode.
  10.  
  11. All data files, scraps, fonts, & printer drivers are identical under
  12. C64 and C128 GEOS.
  13.  
  14. Input drivers are located at different addresses in the two machines, and
  15. hence are incompatible.  We have added a new file type, INPUT128, for C128
  16. input drivers.
  17.  
  18. As the deskTop is heavily tied into each OS, we've decided to give the 128
  19. it's own desktop filename, "128 DESKTOP", so as to avoid confusion with the 64's
  20. "DESK TOP" file.  (The deskTop is of file type "SYSTEM", and can't be renamed
  21. by the user).
  22.  
  23.  
  24. 128 Flags for Applications & Desk Accessories
  25. ---------------------------------------------
  26. In order for the 128 DESKTOP & other applications to know what files run in
  27. what mode, we've adopted a standard that should be used on ALL applications,
  28. desk accessories, & auto-execution programs.  This flag is located in the
  29. header block of each of these programs.  Since permanent file names are only
  30. 16 bytes long, we have left over 4 bytes that have been unused till now, but
  31. we've constantly been setting them to all 0's.  The last of these bytes
  32. (see OFF128FLAGS) now has meaning to the 128 OS & DeskTop:
  33.  
  34. B7 B6
  35.  0  0  runs under 128 GEOS, but in 40 column mode only
  36.  0  1  runs under 128 GEOS in 40 and 80 column modes
  37.  1  0  DOES NOT RUN under 128 GEOS (deskTop will display dialog box)
  38.  1  1  runs under 128 GEOS in 80 column mode only
  39.  
  40. Bits 5 through 0 are unused and should be 0. The 128 GEOS routines LdApplic
  41. and LdDeskAcc will return the error #INCOMPATIBLE if these flags in the header
  42. block do not allow running in the current mode.
  43.  
  44.  
  45. Converting 64 GEOS software to run on the C128
  46. ----------------------------------------------
  47. First, you need to decide whether your software is simply going to be able
  48. to run in 40 col. mode, or whether it is to run in 40/80 column on the 128 only.
  49.  
  50. 40 col. mode only on 128:
  51.  
  52. 1) Chances are quite good your software already does.
  53.  
  54. 2) If it doesn't, it's probably becuase you access BASIC -- the 128 has a
  55. different BASIC, so you'll need to re-write that section of code to first see
  56. which OS you're running under, & then use the appropriate BASIC variables &
  57. jump entries.
  58.  
  59. 40/80 col. on the C128 only:
  60.  
  61. 1) Set the 128 flag as mentioned above in the save file to $40
  62.  
  63. 2) In 80 column mode, you'll need to widen your menus to accomodate the wider
  64. system font.  We typically stuff these "right edge" values into the menu
  65. structure itself based on the current graphicsMode
  66. ($80 is 80 column, $00 is 40)
  67.  
  68. 3) Most of the graphic changes you'll need to make can be accomplished by
  69. setting the high bit of every X position or width that you pass to the operating
  70. system. The 128 GEOS will ignore this bit if in 40 column mode, and double the
  71. value if in 80 column mode, thus automatically retaining the same sized image
  72. on the screen. Hence, 50+$8000 is 50 pixels in 40 column mode and 100 pixels in 
  73. 80 column mode.
  74.  
  75. 4) If you're writing an application, add a "switch 40/80" option under the
  76. geos menu.  The action for this should be to EOR graphicsMode with $80,
  77. store it back, and call the routine SetNewMode. You'll then need to redraw the
  78. screen, now in the new graphics mode.
  79.  
  80. 5) Nearly all x positions passed to the C128 GEOS can have the high bit set
  81. causing the position to automatically be doubled in 80 column mode.  It has
  82. been noted that this always results in the low bit of the resulting word being
  83. a 0.  This can make life difficult, if you desire to fill a pattern to the
  84. right edge of the screen, for instance.  To solve this problem, I've modified
  85. the normalization routine:  The 15th bit of the word continues to be the same
  86. "double me if 80 col." flag, but the 14th bit now has significance in 80 col.
  87. mode only -- it becomes the low bit of the doubled word.  So, if you want the
  88. right edge of the screen, use the value $C000+319.
  89.  
  90.  
  91. Sprites
  92. -------
  93. The C64 contains a chip to handle sprites in hardware. Unfortunately, this chip
  94. is not available on the 128, so the functions of that chip have been simulated
  95. in software that is included in the 128 kernal.  Most of the capabilities of
  96. the VIC chip have been taken care of, and if you are not doing exotic things
  97. with sprites your code may work with one or two changes.  
  98.  
  99. The major changes include: sprite 0 (the cursor) is treated differently than
  100. any other sprite.  The code for this beast has been optimized to get reasonably
  101. fast mouse response, with a resulting loss in functionality.  You cannot double
  102. the cursor's size in either x or y.  You cannot change the color of the cursor.
  103. The size of the cursor is limited to 16-pixels wide and 8 lines high.  One
  104. added feature is the ability to add a white outline to the picture that is used
  105. for the cursor.  This allows it to be seen while moving over a black
  106. background.
  107.  
  108. For the other 7 sprites, all the capabilities have been emulated except for
  109. color and collision detection.  In addition, the 64th byte of the sprite
  110. picture definition (previously unused) is now used to provide some size info
  111. about the sprite.  This is used to optimize the drawing code. Here are some
  112. problem areas to watch out for:
  113.  
  114. Writing directly to the screen:
  115.  
  116. Since the old sprite were handled with hardware, writing to the screen wasn't
  117. a problem.  If you do it (system calls NOT included), then call "TempHideMouse"
  118. before the write.  This will erase the cursor and any sprites you have enabled.
  119. You don't have to do anything to get them back, this is done automatically 
  120. during the next main loop.
  121.  
  122. All sprite picture data:
  123.  
  124. All picture data should be adjusted to include the 64th byte.  This byte has
  125. size information that is read by the software sprite routines, even if they
  126. are garbage values.  The format of this byte is: high bit set means that the
  127. sprite is no more that 9 pixels wide (this means it can be shifted 7 times
  128. and still be contained in 2 bytes).  The rest of the byte is a count of the
  129. scan lines in the sprite.   You can either include this info as part of the
  130. picture definition, or stuff it into the right place with some special code.
  131.  
  132. Writing directly to the VIC chip:
  133.  
  134. This is generally ok, since the sprite emulation routines take the position
  135. and doubling info from the registers on the VIC chip, with the exception of the
  136. x position.  The VIC chip allows 9 bits for x positions, which is not enough
  137.  640-wide screen.  You should write the x position to the global variables
  138. "reqXpos0, reqXpos1..." (request x pos).  These are full words, in consecutive
  139. locations.  Better yet, use the "PosSprite" call in the kernel.  
  140.  
  141. Reading values from the VIC chip:
  142.  
  143. This is also ok for the status values and for the y position.  The x position
  144. can be useful also, if you use the PosSprite call.  In addition to filling 
  145. the global variables reqXpos0, etc., this call divides the x position by two
  146. and stuffs it into the VIC chip.
  147.  
  148. Using VIC chip collision detection:
  149.  
  150. This is iffy.  The chip continues to operate, so if you are using the
  151. PosSprite call (see above) collisions should be detected with some loss of
  152. accuracy (the low bit).  This has not been tested, so if you try it -- report
  153. the results here.
  154.  
  155. Writing to the VIC chip (or calling PosSprite, EnablSprite, DisablSprite)
  156. at interrupt level:
  157.  
  158. Don't do it.  Since the mouse and the sprites are drawn at main loop, this
  159. causes subtle, irreproducable timing bugs that are impossible to get out.
  160.  
  161. Known bugs in release 1 of GEOS 128
  162. -----------------------------------
  163.  
  164. 1) If location $1300 in application space is zero, then sprites in 80 column
  165. mode go haywire.  All of our current applications that run in 80 column
  166. mode have put in a patch for this.  Bug is in sprite code.
  167.  
  168. 2) Doubling bitmaps through BitmapClip doesn't work.
  169.  
  170. 3) iBitmapClip needs call to TempHideMouse before being called. 
  171.  
  172.  
  173. ;**************************************************************************
  174. ;This file contains additional memory map definitions for applications which
  175. ;will run under the GEOS 128 kernal. 12/11/87.
  176. ;**************************************************************************
  177.  
  178. ;Memory-management unit in C-128
  179.  
  180. mmu= $D500
  181. VDC= $D600
  182.  
  183. ;Address of memory-map configuration register in C-128
  184.  
  185. config= $FF00
  186.  
  187. ;Misc addresses:
  188.  
  189. keyreg= $d02f;C-128 keyboard register for # pad & other keys
  190. clkreg= $d030;C-128 clock speed register
  191.  
  192. ;Address of input driver
  193.  
  194. MOUSEBASE= $FD00
  195. ENDMOUSE= $FE80
  196.  
  197. ;Note that the jump table entries for input driver routines have not moved;
  198. ;They are still at MOUSEJMP ($FE80). In 128 GEOS, there is one additional
  199. ;vector:
  200.  
  201. SetMouse= MOUSEJMP+9;($FE89)
  202.  
  203. ;Jump addresses within disk drivers -- these are only valid for non-1541
  204. ;disk drive types, and for the 128 version of the 1541 driver:
  205.  
  206. Get1stDirEntry= $9030;returns first dir entry
  207. GetNxtDirEntry= $9033;returns next dir entry
  208. AllocateBlock= $9048;allocates specific block
  209. ReadLink= $904B;like ReadBlock, but returns only 1st two bytes
  210.  
  211. ;The following address holds info about the current 128 graphics mode:
  212. ;$00 for VIC, $80 for VDC 640*200, and $C0 for VDC 640*400 (not yet supported).
  213.  
  214. graphicsMode= $003f;holds current 128 graphics mode
  215.  
  216. ;Misc vectors:
  217.  
  218. JmpIndX= $9D80;address of routine used by 128 kernal
  219.  
  220. ;-----------------------------------------------------------------------------
  221. ;This is a second GLOBAL memory area for GEOS. It is here so that these
  222. ;variables may be in the same place in V1.3 as they are running V1.2 with
  223. ;the V1.3 deskTop. This allows other input drivers to be auto-booted by
  224. ;those who have a V1.2 GEOS KERNAL, but have gotten the V1.3 deskTop via
  225. ;a download or up-grade disk. They are EQUATED to be past the local GEOS
  226. ;variables, in fact at the end of the GEOS RAM space. Here they must
  227. ;permanently reside, for the sake of compatibility.
  228.  
  229.  
  230. ;Saved value of moby2 for context saving done in dlg boxes & desk accessories.
  231. ;Left out of original GEOS save code, put here so we don't screw up desk
  232. ;accessories, etc, that know the size of TOTSRAMSAVED above.
  233.  
  234. savedmoby2= $88bb
  235.  
  236. ;copy of reg 24 in VDC for C128
  237.  
  238. screen80polarity= $88bc
  239.  
  240. ;Screen colors for 80 column mode on C128. Copy of reg 26 in VDC
  241.  
  242. screen80colors= $88bd
  243.  
  244. ;Holds current color mode for C128 color routines.
  245.  
  246. vdcClrMode= $88be
  247.  
  248. ;(4 bytes) 1 byte each reserved for disk drivers about each device
  249. ;(each driver may use differently)
  250.  
  251. driveData= $88bf
  252.  
  253. ;Number of 64K ram banks available in Ram Expansion Unit. 0 if none available.
  254. ramExpSize= $88c3
  255.  
  256. ;If RAM expansion is in, Bank 0 is reserved for the kernal's use. This byte
  257. ;contains flags designating its usage:
  258. ;
  259. ; Bit 7:  if 1, $0000-$78FF used by MoveData routine
  260. ; Bit 6:  if 1, $8300-$B8FF holds disk drivers for drives A through C
  261. ; Bit 5:  if 1, $7900-$7DFF is loaded with GEOS ram area $8400-$88FF by ToBasic
  262. ;routine when going to BASIC
  263. ; Bit 4:  if 1, $7E00-$82FF is loaded with reboot code by a setup AUTO-EXEC
  264. ;file, which is loaded by the restart code in GEOS at $C000 if
  265. ;this flag is set, at $6000, instead of loading GEOSBOOT.
  266. ;Also, in the area $B900-$FC3F is saved the kernal for fast
  267. ;re-boot without system disk (depending on setup file).
  268. ;This area should be updated when input devices are changed
  269. ;(implemented in V1.3 deskTop)
  270.  
  271. sysRAMFlg= $88c4
  272.  
  273. ;This flag is changed from 0 to $FF after deskTop comes up for the first time
  274. ;after booting.
  275.  
  276. firstBoot= $88c5
  277.  
  278. ;(4 bytes) Current disk type for each drive (copied from diskType)
  279.  
  280. curType= $88c6
  281.  
  282. ;(4 bytes) RAM bank for each disk drive to use if drive type is RAM DISK
  283. ;or Shadowed Drive
  284.  
  285. ramBase= $88c7
  286.  
  287. ;(17 bytes) Holds name of current input device
  288.  
  289. inputDevName= $88cb
  290.  
  291. ;(18 bytes) Disk name of disk in drive C. (Padded with $a0)
  292. DrCCurDkNm= $88dc
  293.  
  294. ;(18 bytes) Disk name of disk in drive D. (Padded with $a0)
  295. DrDCurDkNm= $88ee
  296.  
  297. ;(256 bytes) 2nd directory header block, for larger disk capacity drives
  298. ;(such as 1571)
  299. dir2Head= $8900
  300.  
  301. ;-----------------------------------------------------------------------------
  302.  
  303.  
  304. ;**************************************************************************
  305. ;This file contains additional jump-table entries for applications which
  306. ;will run under the GEOS 128 kernal. 12/11/87.
  307. ;**************************************************************************
  308.  
  309. TempHideMouse= $c2d7
  310. SetMousePicture= $c2da
  311. SetNewMode= $c2dd
  312. NormalizeX= $c2e0
  313. MoveBData= $c2e3
  314. SwapBData= $c2e6
  315. VerifyBData= $c2e9
  316. DoBOp= $c2ec
  317. AccessCache= $c2ef
  318. HideOnlyMouse= $c2f2
  319. SetColorMode= $c2f5
  320. ColorCard= $c2f8
  321. ColorRectangle= $c2fb
  322.  
  323.  
  324. ;**************************************************************************
  325. ;This file contains additional constant definitions for applications which
  326. ;will run under the GEOS 128 kernal. 12/11/87
  327. ;**************************************************************************
  328.  
  329. ;The following equates define the numbers written to the "config"
  330. ;register (location $FF00 in C-128). This register controls the memory map
  331. ;of the C-128.
  332. CIOIN= $7E;60K RAM, 4K I/O space in
  333. CRAM64K= $7F;64K RAM
  334. CKRNLBASIOIN= $40;kernal, I/O and basic ROM's mapped into memory
  335. CKRNLIOIN= $4E;Kernal ROM and I/O space mapped in
  336.  
  337. ;Keyboard equates
  338. KEYHELP= 25
  339. KEYALT= 26
  340. KEYESC= 27
  341. KEYNOSCRL= 7
  342. KEYENTER= 11
  343.  
  344. ;128 screen size constants
  345. SCREENBYTEWIDTH= 80
  346. SCREENPIXELWIDTH= 640
  347.  
  348. ;New GEOS file types:
  349. INPUT128= 15;128 Input driver
  350.  
  351. ;New # of file types, including NONGEOS (=0)
  352. NUMFILETYPES= 16
  353.  
  354. ;The following equate can be used as an offset into a file's header block.
  355. ;It points to the byte which contains flags which indicate if the program
  356. ;will run under C-128 GEOS in 40 and/or 80 column modes. These flags are valid
  357. ;for applications, desk accessories, and auto-exec files.
  358. ;
  359. ;B7 B6
  360. ; 0  0  runs under 128 GEOS, but in 40 column mode only
  361. ; 0  1  runs under 128 GEOS in 40 and 80 column modes
  362. ; 1  0  DOES NOT RUN under 128 GEOS (deskTop will display dialog box)
  363. ; 1  1  runs under 128 GEOS in 80 column mode only
  364. OFF128FLAGS= 96
  365.  
  366. ;disk equates
  367. DIR1581TRACK= 40;track # reserved on 1581 disk for directory
  368. DRV1581= 3;Drive type Commodore 1581
  369. DRVNETWORK= 15;Drive type for GEOS geoNet "drive"
  370.  
  371. ;equate for error value which indicates an attempt has been made to load
  372. ;an application which cannot be run under the current C128 graphics mode.
  373. INCOMPATIBLE= 14
  374.