rtrevino@cpocd5.intel.com (Roy Trevino) (11/02/90)
Several people have requested the source to syzygy, so here it is. Actually it's the listing file. It would have been posted sooner, but I wanted to add *some* comments at least, etc. Hopefully whoever sent mail to me will see it. Anyways, I guess we can all expect to see tons more chip-48 programs posted now, as there is so much interest in source code! :-) They are actually quite easy to write. Roy PS - has anyone used the shift instructions in chip48? The documentation does not correlate with the "opcodes". How do they really work? ====================================================================== --> PASS 1 ****** 0 error(s) detected in pass 1 ****** --> PASS 2 ; ; SYZYGY is (c) copyright 1990 by Roy Trevino (RTT) ; ; Noncommercial distribution allowed, provided that this ; copyright message is preserved, and any modified versions ; are clearly marked as such. ; ; SYZYGY, via CHIP-48, makes use of undocumented low-level features ; of the HP48SX calculator, and may or may not cause loss of data, ; excessive battery drainage, and/or damage to the calculator ; hardware. The Author takes no responsibility whatsoever for ; any damage caused by the use of this program. ; ; THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR ; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ; PURPOSE. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; Register usage (primary usage, may be others): ; ; v0 - scratch ; v1 - x position of head ; v2 - y position of head ; v3 - current direction of head ; v4 - pointer to segment table entry for head ; v5 - previous direction of head ; v6 - x position of tail ; v7 - y position of tail ; v8 - direction of tail ; v9 - pointer to segment table entry for tail ; va - count of points being added to length ; vb - x position of target ; vc - y position of target ; vd - flags if target is on or off ; ve - random on time for target ; vf - carry/borrow/collision detect ; ==== 0003 up: equ #3 ; (9) key for up ==== 0006 down: equ #6 ; (6) key for down ==== 0007 left: equ #7 ; (1) key for left ==== 0008 right: equ #8 ; (2) key for right ; ; Start of a circular table to track each segment of the syzygy, ; which consists of a direction and a length. ; ; The start of the table is at #800 instead of a label at the bottom ; of the program (ie. base: end) because it seems to run faster ; that way. ; ==== 0800 base: equ #800 ; base of segment table 0200 copyright: ; copyright notice 0200 1212 jp _start 0202 8d8d dw #8d8d ; -> 0204 20a9 dw #20a9 ; (c) 0206 3139 dw #3139 ; 19 0208 3930 dw #3930 ; 90 020a 2052 dw #2052 ; R 020c 5454 dw #5454 ; TT 020e 208e dw #208e ; <- 0210 8e00 dw #8e00 0212 start: 0212 24b6 call _drawbord 0214 24da call _drawtitle 0216 waitkp1: 0216 600f ld v0,#f ; wait for (+) (keep border) 0218 e0a1 sknp v0 021a 1224 jp _starty 021c 600e ld v0,#e ; wait for (-) (borderless) 021e e0a1 sknp v0 0220 1228 jp _startn 0222 1216 jp _waitkp1 0224 starty: 0224 24da call _drawtitle ; erase title (keep border) 0226 122c jp _initgame 0228 startn: 0228 00e0 cls ; erase everything (borderless) 022a 122c jp _initgame ; ; initialization routines ; 022c initgame: ; ; initial head position near middle of screen ; 022c c11f rnd v1,#1f ; x-pos = rnd(16,47) 022e 7110 add v1,#10 0230 c20f rnd v2,#f ; y-pos = rnd(8,23) 0232 7208 add v2,#8 0234 c303 rnd v3,#3 ; direction = rnd(0,3) 0236 8530 ld v5,v3 ; last head direction ; ; compute initial tail position ; 0238 8610 ld v6,v1 ; start out same as head 023a 8720 ld v7,v2 023c 8830 ld v8,v3 ; tail direction 023e 4800 sne v8,#0 ; up 0240 7701 add v7,#1 0242 4801 sne v8,#1 ; down 0244 77ff add v7,#ff 0246 4802 sne v8,#2 ; left 0248 7601 add v6,#1 024a 4803 sne v8,#3 ; right 024c 76ff add v6,#ff ; ; draw initial syzygy, save initial segment to table ; 024e a54c ld i,_dot 0250 d121 drw v1,v2,#1 ; draw head 0252 d671 drw v6,v7,#1 ; draw tail 0254 64f0 ld v4,#f0 ; init ptr to head vector 0256 69f1 ld v9,#f1 ; init ptr to tail vector 0258 a800 ld i,_base ; save direction 025a f41e add i,v4 025c 8030 ld v0,v3 025e f055 ld [i],v0 0260 7401 add v4,#1 ; increment head ptr 0262 a800 ld i,_base ; save segment count 0264 f41e add i,v4 0266 6001 ld v0,#1 0268 f055 ld [i],v0 ; ; compute coordinates and value of first target ; plus set up flag and time until target ; 026a 2522 call _rndtarg 026c 6a00 ld va,#0 ; additional length ; ; initial addition to syzygy for test purposes ; 026e 7a00 add va,#0 ; ; main loop begins here ; 0270 loop: 0270 chktarg: 0270 f007 ld v0,dt ; check if a target is due 0272 3000 se v0,#0 0274 129c jp _endtarg 0276 3d00 se vd,#0 0278 1294 jp _targoff 027a 6000 ld v0,#0 ; draw target 027c f029 ld f,v0 027e dbc5 drw vb,vc,#5 0280 3f01 se vf,#1 ; if on body, erase immediately 0282 128c jp _targon 0284 dbc5 drw vb,vc,#5 0286 2522 call _rndtarg ; set up new target 0288 f015 ld dt,v0 ; no delay though 028a 129c jp _endtarg ; process at least one move 028c targon: 028c fe15 ld dt,ve ; set up on-time 028e 6d01 ld vd,#1 ; set flag to denote on 0290 6e00 ld ve,#0 ; number of points unless hit 0292 129c jp _endtarg 0294 targoff: 0294 80e0 ld v0,ve ; erase old target 0296 f029 ld f,v0 0298 dbc5 drw vb,vc,#5 029a 2522 call _rndtarg ; set up new target 029c endtarg: 029c chkkeys: 029c 6003 ld v0,_up ; check for user input 029e e0a1 sknp v0 02a0 6300 ld v3,#0 ; new direction 02a2 6006 ld v0,_down 02a4 e0a1 sknp v0 02a6 6301 ld v3,#1 02a8 6007 ld v0,_left 02aa e0a1 sknp v0 02ac 6302 ld v3,#2 02ae 6008 ld v0,_right 02b0 e0a1 sknp v0 02b2 6303 ld v3,#3 ; ; compute next head position ; 02b4 4300 sne v3,#0 ; up 02b6 72ff add v2,#ff 02b8 4301 sne v3,#1 ; down 02ba 7201 add v2,#1 02bc 4302 sne v3,#2 ; left 02be 71ff add v1,#ff 02c0 4303 sne v3,#3 ; right 02c2 7101 add v1,#1 ; ; draw next head position ; 02c4 a54c ld i,_dot 02c6 d121 drw v1,v2,#1 ; ; check for collision ; 02c8 chkcoll: 02c8 3f01 se vf,#1 02ca 1324 jp _chkhead ; ; if collision is due to target, add points (else die) ; this also means no doubling back on self ; 02cc 3d01 se vd,#1 ; check if target is even on 02ce 1388 jp _endgame 02d0 603f ld v0,#3f ; mask off extra x and y bits 02d2 8102 and v1,v0 02d4 601f ld v0,#1f 02d6 8202 and v2,v0 02d8 80b0 ld v0,vb ; check if < target on left 02da 8017 subn v0,v1 02dc 3f01 se vf,#1 02de 1388 jp _endgame 02e0 80b0 ld v0,vb ; check if > target on right 02e2 7003 add v0,#3 02e4 8015 sub v0,v1 02e6 3f01 se vf,#1 02e8 1388 jp _endgame 02ea 80c0 ld v0,vc ; check if < target on top 02ec 8027 subn v0,v2 02ee 3f01 se vf,#1 02f0 1388 jp _endgame 02f2 80c0 ld v0,vc ; check if > target on bottom 02f4 7004 add v0,#4 02f6 8025 sub v0,v2 02f8 3f01 se vf,#1 02fa 1388 jp _endgame ; ; if made it this far, add points, erase target, etc ; 02fc 6004 ld v0,#4 ; beep (actually, a "bip") 02fe f018 ld st,v0 0300 ce07 rnd ve,#7 ; award rnd(2,9) points 0302 7e02 add ve,#2 ; 0304 8ae4 add va,ve ; add points 0306 a54c ld i,_dot ; temporarily erase head 0308 d121 drw v1,v2,#1 030a 6000 ld v0,#0 ; erase target 030c f029 ld f,v0 030e dbc5 drw vb,vc,#5 0310 80e0 ld v0,ve ; draw points instead 0312 f029 ld f,v0 0314 dbc5 drw vb,vc,#5 0316 6030 ld v0,#30 ; delay for a while 0318 f015 ld dt,v0 031a targwait: 031a f007 ld v0,dt 031c 3000 se v0,#0 031e 131a jp _targwait 0320 a54c ld i,_dot 0322 d121 drw v1,v2,#1 ; redraw head ; ; if direction changed, create a new segment record ; 0324 chkhead: 0324 9350 sne v3,v5 0326 133e jp _conthead 0328 7401 add v4,#1 ; new segment record 032a a800 ld i,_base 032c f41e add i,v4 032e 8030 ld v0,v3 ; save direction 0330 f055 ld [i],v0 0332 7401 add v4,#1 ; point to counter 0334 a800 ld i,_base ; initialize segment count to 0 0336 f41e add i,v4 0338 6000 ld v0,#0 033a f055 ld [i],v0 033c 8530 ld v5,v3 ; reset previous direction 033e conthead: 033e a800 ld i,_base ; simply add to current record 0340 f41e add i,v4 0342 f065 ld v0,[i] 0344 7001 add v0,#1 ; increment head count 0346 f055 ld [i],v0 ; ; don't erase tail if adding points to length ; 0348 chkpts: 0348 4a00 sne va,#0 034a 1358 jp _contpts ; if pts = 0, continue normally 034c 600c ld v0,#c ; delay just a little to compensate 034e delhead: 034e 70ff add v0,#ff 0350 3000 se v0,#0 0352 134e jp _delhead 0354 7aff add va,#ff ; decrement and loop 0356 1270 jp _loop 0358 contpts: ; ; erase last tail position ; 0358 a54c ld i,_dot 035a d671 drw v6,v7,#1 ; ; compute next tail position ; 035c 4800 sne v8,#0 ; up 035e 77ff add v7,#ff 0360 4801 sne v8,#1 ; down 0362 7701 add v7,#1 0364 4802 sne v8,#2 ; left 0366 76ff add v6,#ff 0368 4803 sne v8,#3 ; right 036a 7601 add v6,#1 036c chktail: 036c a800 ld i,_base ; get tail segment record 036e f91e add i,v9 0370 f065 ld v0,[i] 0372 70ff add v0,#ff ; decrement tail count 0374 f055 ld [i],v0 ; save 0376 3000 se v0,#0 ; if zero, get new record 0378 1270 jp _loop 037a 7901 add v9,#1 ; new segment record 037c a800 ld i,_base ; get new direction 037e f91e add i,v9 0380 f065 ld v0,[i] 0382 8800 ld v8,v0 0384 7901 add v9,#1 ; point to new count ; ; end of main loop ; 0386 1270 jp _loop ; ; endgame routines ; 0388 endgame: 0388 600d ld v0,#d ; beep 038a f018 ld st,v0 038c 600b ld v0,#b ; wait for (space) keypress 038e e09e endkp: skp v0 0390 138e jp _endkp ; ; finish up tail to count points: digits are in vd:vc:vb format ; note that it is theoretically possible to get 64*32=2048 points, ; while three digits will only hold 999. Unlikely but possible. ; 0392 6b01 ld vb,#1 ; one's digit 0394 6c00 ld vc,#0 ; ten's digit 0396 6d00 ld vd,#0 ; hundred's digit 0398 endtail: ; ; increment score ; 0398 7b01 add vb,#1 039a 3b0a se vb,#a 039c 13aa jp _endtailcont 039e 6b00 ld vb,#0 03a0 7c01 add vc,#1 03a2 3c0a se vc,#a 03a4 13aa jp _endtailcont 03a6 6c00 ld vc,#0 03a8 7d01 add vd,#1 ; ; compute next tail position to add up score ; 03aa endtailcont: 03aa a54c ld i,_dot ; erase last tail position 03ac d671 drw v6,v7,#1 03ae 4800 sne v8,#0 ; up 03b0 77ff add v7,#ff 03b2 4801 sne v8,#1 ; down 03b4 7701 add v7,#1 03b6 4802 sne v8,#2 ; left 03b8 76ff add v6,#ff 03ba 4803 sne v8,#3 ; right 03bc 7601 add v6,#1 03be a800 ld i,_base ; get tail segment record 03c0 f91e add i,v9 03c2 f065 ld v0,[i] 03c4 70ff add v0,#ff ; decrement tail count 03c6 f055 ld [i],v0 ; save 03c8 3000 se v0,#0 ; if zero, get new record 03ca 1398 jp _endtail 03cc 9940 sne v9,v4 ; done when pointers are equal 03ce 13de jp _drawscore 03d0 7901 add v9,#1 ; new segment record 03d2 a800 ld i,_base ; get new direction 03d4 f91e add i,v9 03d6 f065 ld v0,[i] 03d8 8800 ld v8,v0 03da 7901 add v9,#1 ; point to new count 03dc 1398 jp _endtail ; ; draw score ; 03de drawscore: 03de 00e0 cls 03e0 6611 ld v6,#11 ; draw border 03e2 6709 ld v7,#9 03e4 682f ld v8,#2f 03e6 6917 ld v9,#17 03e8 a552 ld i,_vbar 03ea d67e drw v6,v7,#e 03ec d87e drw v8,v7,#e 03ee 77ff add v7,#ff 03f0 a54e ld i,_hbar 03f2 d671 drw v6,v7,#1 03f4 d691 drw v6,v9,#1 03f6 7608 add v6,#8 03f8 d671 drw v6,v7,#1 03fa d691 drw v6,v9,#1 03fc 7608 add v6,#8 03fe d671 drw v6,v7,#1 0400 d691 drw v6,v9,#1 0402 7608 add v6,#8 0404 a550 ld i,_hbar2 0406 d671 drw v6,v7,#1 0408 d691 drw v6,v9,#1 040a a59e ld i,_sc ; show score (not high score yet) 040c 6613 ld v6,#13 040e 6711 ld v7,#11 0410 249a call _showscore ; ; figure out if it's the high score, save it if it is ; 0412 checkhigh: 0412 a5ae ld i,_high ; recover old high score into v3v2v1 0414 f365 ld v3,[i] 0416 93d0 sne v3,vd ; if =, check next digit 0418 1424 jp _conthigh1 041a 8030 ld v0,v3 ; if borrow, it's a new high score! 041c 80d5 sub v0,vd 041e 3f01 se vf,#1 0420 143a jp _savehigh 0422 1444 jp _drawhigh 0424 conthigh1: 0424 92c0 sne v2,vc ; etc. as above for other digits 0426 1432 jp _conthigh2 0428 8020 ld v0,v2 042a 80c5 sub v0,vc 042c 3f01 se vf,#1 042e 143a jp _savehigh 0430 1444 jp _drawhigh 0432 conthigh2: 0432 8010 ld v0,v1 0434 80b5 sub v0,vb 0436 3f00 se vf,#0 0438 1444 jp _drawhigh 043a savehigh: 043a a5ae ld i,_high 043c 83d0 ld v3,vd ; save new high score 043e 82c0 ld v2,vc 0440 81b0 ld v1,vb 0442 f355 ld [i],v3 ; ; draw the high score ; 0444 drawhigh: 0444 a5ae ld i,_high 0446 f365 ld v3,[i] 0448 6613 ld v6,#13 044a 77f9 add v7,#f9 044c 8d30 ld vd,v3 044e 8c20 ld vc,v2 0450 8b10 ld vb,v1 0452 a5a4 ld i,_hi 0454 249a call _showscore ; ; random memory wasting stuff goes here ; 0456 waitkp2: 0456 c13f rnd v1,#3f ; get random position 0458 c21f rnd v2,#1f 045a 600d ld v0,#d ; check left 045c 8015 sub v0,v1 045e 3f00 se vf,#0 0460 147c jp _drawrand 0462 6030 ld v0,#30 ; check right 0464 8017 subn v0,v1 0466 3f00 se vf,#0 0468 147c jp _drawrand 046a 6003 ld v0,#3 ; check top 046c 8025 sub v0,v2 046e 3f00 se vf,#0 0470 147c jp _drawrand 0472 6018 ld v0,#18 ; check bottom 0474 8027 subn v0,v2 0476 3f00 se vf,#0 0478 147c jp _drawrand 047a 1482 jp _chkkp2 047c drawrand: 047c c30f rnd v3,#0f ; draw random number 047e f329 ld f,v3 0480 d125 drw v1,v2,#5 0482 chkkp2: 0482 600f ld v0,#f ; check for keypress 0484 e0a1 sknp v0 0486 1490 jp _conty 0488 600e ld v0,#e 048a e0a1 sknp v0 048c 1496 jp _contn 048e 1456 jp _waitkp2 0490 00e0 conty: cls 0492 24b6 call _drawbord 0494 122c jp _initgame 0496 00e0 contn: cls 0498 122c jp _initgame ; ; function showscore: ; digits in vd:vc:vb, descriptor in i, initial coords in v6,v7 ; 049a showscore: 049a d675 drw v6,v7,#5 049c a5aa ld i,_col 049e 7602 add v6,#2 04a0 d674 drw v6,v7,#4 04a2 fd29 ld f,vd 04a4 760a add v6,#a 04a6 d675 drw v6,v7,#5 04a8 fc29 ld f,vc 04aa 7605 add v6,#5 04ac d675 drw v6,v7,#5 04ae fb29 ld f,vb 04b0 7605 add v6,#5 04b2 d675 drw v6,v7,#5 04b4 00ee ret ; ; function drawbord: ; draw border, try to do it fast ; 04b6 drawbord: 04b6 horiz: 04b6 a54e ld i,_hbar 04b8 6100 ld v1,#0 ; left 04ba 6200 ld v2,#0 ; right 04bc 661f ld v6,#1f ; lower 04be horiz1: 04be d121 drw v1,v2,#1 ; draw x,0 04c0 d161 drw v1,v6,#1 ; draw x,31 04c2 7108 add v1,#8 04c4 3140 se v1,#40 ; same as 0 04c6 14be jp _horiz1 04c8 vert: 04c8 a552 ld i,_vbar 04ca 6201 ld v2,#1 04cc 653f ld v5,#3f 04ce d12f drw v1,v2,#f 04d0 d52f drw v5,v2,#f 04d2 720f add v2,#f 04d4 d12f drw v1,v2,#f 04d6 d52f drw v5,v2,#f 04d8 00ee ret ; ; function drawtitle: draws game title ; 04da drawtitle: 04da 610c ld v1,#c 04dc 6207 ld v2,#7 04de a562 ld i,_s 04e0 d12a drw v1,v2,#a 04e2 a56c ld i,_y 04e4 7106 add v1,#6 04e6 d12a drw v1,v2,#a 04e8 a576 ld i,_z 04ea 7106 add v1,#6 04ec d12a drw v1,v2,#a 04ee a56c ld i,_y 04f0 7106 add v1,#6 04f2 d12a drw v1,v2,#a 04f4 a580 ld i,_g 04f6 7106 add v1,#6 04f8 d12a drw v1,v2,#a 04fa a56c ld i,_y 04fc 7106 add v1,#6 04fe d12a drw v1,v2,#a 0500 610e ld v1,#e 0502 6218 ld v2,#18 0504 a58a ld i,_v 0506 d123 drw v1,v2,#3 0508 a58e ld i,_vers 050a 7108 add v1,#8 050c 72ff add v2,#ff 050e d124 drw v1,v2,#4 0510 7109 add v1,#9 0512 72fe add v2,#fe 0514 a592 ld i,_r 0516 d126 drw v1,v2,#6 0518 7106 add v1,#6 051a 7201 add v2,#1 051c a598 ld i,_tt 051e d125 drw v1,v2,#5 0520 00ee ret ; ; function rndtarg: ; returns coords as (vb,vc) ; 0 in vd ; time until target in dt ; on-time value ve ; 0522 rndtarg: ; ; x-pos = rnd(1,59) ; 0522 6dc5 ld vd,#c5 ; -#3b (-59d) 0524 cb3f rndx: rnd vb,#3f ; rnd (0,63) 0526 8eb0 ld ve,vb 0528 8ed4 add ve,vd ; check if > 58 052a 4f01 sne vf,#1 052c 1524 jp _rndx ; try again if too big 052e 7b01 add vb,#1 ; ; y-pos = rnd(1,26) ; 0530 6de6 ld vd,#e6 ; -#1a (-26d) 0532 cc1f rndy: rnd vc,#1f 0534 8ec0 ld ve,vc 0536 8ed4 add ve,vd 0538 4f01 sne vf,#1 053a 1532 jp _rndy 053c 7c01 add vc,#1 053e rndf: 053e 6d00 ld vd,#0 ; flag marking new target 0540 rndd: 0540 ce3f rnd ve,#3f ; random off delay (64 - 127) 0542 7e40 add ve,#40 0544 fe15 ld dt,ve 0546 ce3f rnd ve,#3f ; random on delay (64 - 127) 0548 7e40 add ve,#40 054a 00ee ret 054c 8000 dot: dw #8000 ; dot for syzygy 054e ff00 hbar: dw #ff00 ; horizontal border segment 0550 fe00 hbar2: dw #fe00 0552 8080 vbar: dw #8080 ; vertical border segment 0554 8080 dw #8080 0556 8080 dw #8080 0558 8080 dw #8080 055a 8080 dw #8080 055c 8080 dw #8080 055e 8080 dw #8080 0560 8080 dw #8080 ; ; True memory wasting stuff goes here (but why not?) ; 0562 1f10 s: dw #1f10 ; s character 0564 1010 dw #1010 0566 1f01 dw #1f01 0568 0101 dw #0101 056a 011f dw #011f 056c 1111 y: dw #1111 ; y character 056e 1111 dw #1111 0570 1f04 dw #1f04 0572 0404 dw #0404 0574 0404 dw #0404 0576 1f01 z: dw #1f01 ; z character 0578 0202 dw #0202 057a 0404 dw #0404 057c 0808 dw #0808 057e 101f dw #101f 0580 1f11 g: dw #1f11 ; g character 0582 1010 dw #1010 0584 1013 dw #1013 0586 1111 dw #1111 0588 111f dw #111f 058a 0505 v: dw #0505 ; v character for version 058c 0200 dw #0200 058e 7151 vers: dw #7151 ; version number characters 0590 5175 dw #5175 0592 0c12 r: dw #0c12 ; R character for signature 0594 1e14 dw #1e14 0596 1209 dw #1209 0598 143e tt: dw #143e ; tt characters for signature 059a 1515 dw #1515 059c 2a00 dw #2a00 059e 7744 sc: dw #7744 ; sc characters for score 05a0 2414 dw #2414 05a2 7700 dw #7700 05a4 5752 hi: dw #5752 ; hi character for high score 05a6 7252 dw #7252 05a8 5700 dw #5700 05aa 0001 col: dw #0001 ; : character for scores 05ac 0001 dw #0001 05ae 0000 high: dw #0000 ; high score storage 05b0 0000 dw #0000 05b2 end ; end at last ****** 0 error(s) detected in pass 2 ****** --> LABEL XRF label value ------------ ------- up 3h down 6h left 7h right 8h base 800h copyright 200h start 212h waitkp1 216h starty 224h startn 228h initgame 22ch loop 270h chktarg 270h targon 28ch targoff 294h endtarg 29ch chkkeys 29ch chkcoll 2c8h targwait 31ah chkhead 324h conthead 33eh chkpts 348h delhead 34eh contpts 358h chktail 36ch endgame 388h endkp 38eh endtail 398h endtailcont 3aah drawscore 3deh checkhigh 412h conthigh1 424h conthigh2 432h savehigh 43ah drawhigh 444h waitkp2 456h drawrand 47ch chkkp2 482h conty 490h contn 496h showscore 49ah drawbord 4b6h horiz 4b6h horiz1 4beh vert 4c8h drawtitle 4dah rndtarg 522h rndx 524h rndy 532h rndf 53eh rndd 540h dot 54ch hbar 54eh hbar2 550h vbar 552h s 562h y 56ch z 576h g 580h v 58ah vers 58eh r 592h tt 598h sc 59eh hi 5a4h col 5aah high 5aeh -- -------------------------------------------------------------- Roy Trevino Intel Corp. E-mail: rtrevino@sedona.intel.com Tel: (602) 554 2816 UUCP: decwrl!apple!oliveb!orc!inews!rtrevino@sedona.intel.com