@L}5 _$% l0$)$$Hȱ$ UhL" `e$$%`$%`  R@W!( L(1   Y I`  d  Ld M * @  $ % CC$$)%1 Udߥ$9%: !0 S$% DD˙`  }J)Lr  PAIRS by RASSILON Copyright (c) 1988 Rassilon Software, RD #1 Indian Hil}l Road, Shrub Oak, NY 10588-9728, (914) 528-1743. All rights reserved. No duplication, in whole or in part, of this }documenta- tion or companion software program without the express written consent of Rassilon Software. PAIRS is a simp}le puzzle. All that has to be done is to arrange the pieces so that they are no longer in alternating sequence, but} grouped by type. The diagram at the bottom of the screen gives you a simple repre- sentation of the final pattern needed } to solve the puzzle. Use your joystick in Port #1 to move the cursor. Select the pieces to be moved by pressing the f }irebutton. Markers can only be moved in pairs. This is a binary load file. You can run it from the DOS 'L' menu option }or name it AUTORUN.SYS so that it will boot directly from the disk. If you would like my small diversions from reality a }nd would like to see more of my mind puzzles, drop me some EMAIL at PPN 70057,674 This program placed here for the ex- c }lusive use of SIG*ATARI users.  N   Lm E  ,  [ `LQ ,/ 8 ~/  Ơ? ѩ &hBX:7iBA=:W&&X&Y&Z& L+ 5V&&&&b& &c&© s2 -LS*V&˜ $' ;5&0}& s2&& a+LS*Ņ& & s2 -ԅ& & s2 - n- *`RUNTIME ERROR AT LINE &&L*B,} Q,L&` $'' &L&PROGRAM STOPPED&&Ńł ȱ`iL.'HH *L/ * $/ }) }. s2 }.8ȱ 'hhL}.ʥ`'i'88冕8冕憘 Ɔ`}Ɔ`u`Huh` L*L( L*L( ) k. +( }k. ' * }.L* ) k. ' w, +( k. ' + ' * ' + s2 w, }. *L* ) ' ' w, +( }k. ' + ' * ' + s2 w, k. C( }. *L* ' * .L/` ) * k.Lk. ) $/ k. + ( k. ' w},L( ) ' w, ' k. + (L( . 4/ s2b&i b&c&ic&L}.W&X&Y& * s2 s2},Y&eW&iX&`Y&8Ld& k. .Y&`ʔȱȱȱ *Șe惠 }惨7r*7s* LS*jemI6mJ6 k.вHHhh```}L*ʱ` L++ &JL&J *HHl JLw TO BOOT FOR DOS TO RERUNp B V8}B,` p+ȱL*&&8I6J68凅刐SJj)ee`ффii}L+8L+ Ld&uuuL*8` Q,L*iL*豂Hȱh`p B,L*C},HB, BHIC, .5 |-Z&h`8` w,L, w,#` w,0 w,0L, w,0` w,0L-L,}`޵` `Ȕ`ʔ惥u`B, BHI }DEH .5 |-HyZ&Z&hL* Q, |-Z&`B,JJJJ`Q-,- ,- -0 -L* -L*` -H -h 0 -`}LQ,8 0ƅ`66&L-HH` B VhH)Kh)0 IJ'D.EB .5hL*S:D,L*TUVL* 1.`B},D,LQ, |-Z&8ɰɅ Q,`ʱȱȱ`ȵȵL*L* . }. }.ʥ }. k. . } }.L4 . k. $/ $/ *uȱuȱu * * k.0 ,L4 ȱL* ,L/ʵ`ee!}Ld&HHhh`ؐHH *L/ *HH $/ $/6 + )hh }. }. 'hh }"}.`HH *% *HH 2L/ * . Ld& $/6 + k. +` * .ޠ k. 2 +L/ L0HB, #}B Vh`ҩ2ҵ ҵ  *L*HB,BHI .5C,hC,Ls2B,DuEu *B,IH$}KJBH VCLd&h *L* 1.D,H`B .5h`!1!1Ls2L*L*%} ,`H *hLs21HH eHHƆeiH .lꦆ s2Օ`0  L-`8&}`1ԍ-1- - s201Ls2101`q2 * .p2r2 s29 Ɔ채+K-p2L]280r2 .9'}q22q2Ld& r2C, 2 $/ 2 2 +C, s2 +Ɔеp2 ,`ʕ`66`HHH6666(}6uuuhhhL* ,愵 ' , (I s2 '380/)}66&&&`uuu` '3 43Ј 43 * ,`/4h3i3 4/g3h3g3h3i3 Ld&ȥ*}i3ig3h3/4`La+4h3 4`Ld&i38g3ƅ4 ȱi3g3h3` 4L34L3H/+}4 m3h`1+ %  88L04 * *` * *`  * *` 04$,}' 04"0 040 4L, 4L, 4L,Ls2Ls275 s2 . 4/6575:5:5`HB,? Q,B,HI65D8575E95-}B .5H:5h` VLd&:5` 485 s295:5:5 s2L;5 4:5Ld&8595, :5:585 s2958e85.}95:5 s2q2L1  (L*hh iL* 5Lj3 5La+75h3&&ȱ0 =6L6 =6I6J6/}&& L6&&`i`W&&X&Y&` p+ȱ&&%8e慱Hȱ0}hױY&iW&iX&L*B, BH Vh s2L*B,&BH .5hN s2 *L s2ML*B,%BNLMH .51}hL*/******22+w,2,,,,,,,,,,*a+,,6,E, -5-n-N.--).1.@...m/// 0j331 1"1%121)D0$040:1i0044442}440&Y'[(((,)D)q)A5[5;5J1551154K6Y6'6661 X:[:`:(m:2n:<r:F:P:Z:d:n:x::::::3}::;;;;*;3;B;Q;Z;"j;,m;6y;@;J;T;^;h;r;|;;;<<<(<C<I<M<W<4}r<x<|<<<<&<0<:S> X5}>*>4>>?H/?RH?\a?fm?p|?z?????????#@5@D@W@@@@@$@.@8ABALAV.A6}`CAjXAtmA~AAAAAAAAAAB"B(B-B BBGBPB(dBhB7}2m:+*8} " :*" "96 "96! # :d9HH 9}"-- "--*"3;< "96 "96! #j;, ":}9D "9D; "9D; "9D; "9D; "9D " 9;}"*<99<: <$ ":6C<9! #<%%<$ ":6`r<9<}! #<%<9+<:xM<+ < :  : < : : <=} <N<$9*<%: :9 :9 **R}">}Ӡ㩠"Ӡ "%& | | | | | |?} | | | |& | | | | | | | | | |&          "`Move ad@}jacent pairs until the ` markers occupy the 4 right most points and the markers occupy the next 4 points.!A} START: ` ` ` `  ! FINAL:   ` ` ` `>?:2?$W?:B}K?$ "9D "9DK?%2?%+:hhhԩ`.9@9@9@9 `A9 C}A9 |    A": Ԙ:j  ":/.o:D}%::J(::J +::J.: 1::J4: LR<O<$7E}:1,<%<O<$7:1,<%:9 9+.A255,255,255,2551ACA128,128,128,128FAXA128,128,128F},128[AmA128,128,128,128pAA255,255,255,255AA255,255,255,255AA1,1,1,1AA1,1,1,1AA1,1,1,1AA255,255,255,2G}55 "ŠҠ"PRESS FIRE BUTTON TO PLAY AGAIN99::BB:M9H}*dB*<&uuuuuuuuuuu 28/L!/) 2 Π 2 0 ξ. DOS 2.5 patch for HomePak ------------------------- PATCH.OBJ will patch a copy of your master HJ}omePak disk to fully support DOS 2.5 and its Ramdisk software. Note that the programs as supplied will read anK}d write files to drive 8. The only thing you can't do is get directories, and that is what these patches entail. L} The programs that need to be patched are HOMETERM and HOMETEXT. (There are no directories in HOMEFIND so it'M}s okay as is.) First thing you need to do is to make a "J" copy of your master HomePak disk. If you've previoN}usly made changes to any of the files (such as via the HomeTerm Customizer, or by copying any of the HomePak files O} to another disk) this patch utility might not work. In that case, see the appendix for an alternate patching methP}od. PATCH.OBJ is a binary load file. (Portions of PATCH.OBJ use the Action! run-time package, copyright Q}ACS.) Load the program by using the "L" option from the DUP.SYS menu. Once the program has loaded, you'lR}l be prompted to put a of your master HomePak disk in drive 1. Once you've done so, press the [RETURN] S}key, and when it says "Done!" you're all finished. Boot the new disk as normal and you now have directories for driveT}s 1-8. If you get the error message: Expected byte incorrect-nothing done. then PATCH.U}OBJ didn't find the bytes it was looking to patch. In that case: APPENDIXV} -------- If PATCH.OBJ gives you errors, or you've modified the HomePak proW}grams as described above, then you'll be reduced to patching the files directly using a sector editor, such as SHERLOCX}K or DISKEY. -1- DOS 2.5Y} patch for HomePak ------------------------- HomeTerm -------- Search for: 70Z} 4C C9 70 15 B1 2D B4 ^^ change to $B8----|| Search for: 4C 78 [}79 AD E1 71 C9 35 ^^ change to $39----|| Search for: 4C 73 82 A\}D EF 7B C9 35 ^^ change to $39----|| HomeText -------- ]} Search for: BB 45 60 FF 15 B1 2D B4 ^^ change to $B8----|| S^}earch for: 4C 23 93 AD 50 8D C9 35 ^^ change to $39----|| _} -2- 4-1 D 6-%-%$/(>:%N@bG (c)1983 Action Computer Services  B JKIHiDiELV`L9@ a} 9@ BLV`EL@@l L@ &` Fj`8冨凪` @EӅӥ b} @`ʆǪƩ Ɛee` @ƦʆǢ &Ɛeǐ A AL@ @'&&&8儨児 c}祂*L@&&*ń8&&L@ WA`hihiHHȱȱL@c !#3` d}L@JJJJ`H @h`Hȩh n@LA w@LA !@LA )@LA /@H8 e}`HhHh [BLA BHI V䅠LA LB 9@LAԆ ؠPIPP` f} BP )@LA BLB BLB CLBH- B8塪墨hLC CLB "CLB BȹP` g}텠8堨塪 B芨Oȩ-`PP BP棩 Ѥģ0-ģ6000:,80H h}& &ehe&eģ0ʥ 8堅塅`$ B&*i0:0i BƦ`¢ 护 i}°ڱ%ȱ%E BL\D担CS NBL\DI CL\DH DL\D BL\D &B V ANLMȑ j}` MLN%B VLAD3E?(Y9955oL%E AE!EEAEAE!ELF!E mE*(mE k}Em!EEi D B E E!E]ELELE&Expected byte incorrect-Nothing done.E ;BLF!E mE l}*(mEEm!EEi D!EE B!EL6E`LFLMF*}Insert of HomePak master disk inF" ; m}BLsF drive 1 and press RETURN.FW ;BI LzFLFF ;B HBLFD:HOMETERM.OBJ F n} BEEE "ELGF ;B HBL!GD:HOMETEXT.OBJ G BE E E "E HB B o} BLZGDone!GS ;B``Fooooooooooooooooo@43AV'AVEAR@e(CREATING HIDDEN SCREEN -SRECMOCOROCLERPLTCHR ..DEMO PROG FOR PLOT CHARq}ACTERS SUBROUTINE-;@ , A -SETUP SUBROUTINE$!(}ϠҠ$(((( (GRAPHICS MODE NUr}MBER$(+2$(TYPE COLUMN,ROW$-<( COLOR CODEF%!(CHARACTERS TO BE PLOTTED:%P'6-?:C:,<s}1 Standard Atari I/O error code. DEMONSTRATION PLTCHR.BIN is a simple tokenized BASIC (b}inary) program which will demonstrate the PLTCHR subroutine. As a first test, try "7" for the graphics mode, "12,12" for th}e column,row, and "2" for the color code; then type any short text string that you like. Experiment with the demo to learn h}ow to use the subroutine. USE To use the subroutine, just transfer the statements 900-905 to your own program (}you could do a LIST "D:TEMP",900,905 from the demo followed by an ENTER "D:TEMP" into your own program); of course, you can }renumber the statements as necessary. Remember to call the subroutine once at the beginning of your program to set it up. } -John Navas [72645,1070] , +͑А Сh 67A,. hН5 KYAN PASCAL PLAYER/MISSILE DEMO 20 March, 1987 _______________________________ This program, when executed, demonstrates pl}ayer/missile graphics by showing a few sprites moving around the screen in various directions. This demo gives you an idea o}f what the Player/Missile graphics routines of the Advanced Graphics Toolkit can do. Check out KP3DEM.OBJ in this Data Libra}ry to see what the three-dimensional routines can do. This program is the compiled result of the PLAYDEMO.P Kyan Pascal demo} program on the Advanced Graphics Toolkit disk. It has not been appended to AUTOMAKE, and, as such, it must be executed from} the KIX prompt (%); it can not be binary loaded from DOS. 4Π>H]]62,18,0,63,19,0,92,18,1,93,19,1<(9: -(*6(7::  /L: (G () (4 () (!D(E BHI VL(B} D)EHI V08) )H))I )D)E V0 (`BD)EJK V` B V`error loading pasca}l libraryD8:lib h$7)%8)/9)Lk h*. ԠL);/ / Щ}*#**$*****L)/ / Щ*!**"*****- \*L7*Ѝ Ѝ}ЍЍЭ9)/ԩ7)8) \L7*(ʔFLk h F O  n|* L F}  8L* F  8* !"# $%&'ݩ*Lk h*Hh.**} Lk h*Hȱh 2** Lk h*Hȱh** Lk hЩL}k hHh&* Lk hHh** Lk h*ȱȱH ii }*",e,eL,+e+eh* Lk h*Hȱhy3*3** Lk} h*ȱȱH m*m* h=,=,* Lk? 0 h F } 8Р F O Lk h F  8 Р F O Lk h F  8}Р F O Lk h F  8Р F O Lk h--Lk h}ЩLk*Lb* &*Ј..3*..-Lb䎊. *,i,i LZ.+i+i }*.*.*.3*L'.}} h}   "  t/ L/This is a demo }of smooth movement  "! ! } t0 L(0of players in both horizontal and  "! ! } tM0 La0}vertical directions.  "  } t  " t0 L0one moment please...  "  } t } 8 IuuB  5  8 Iuu詁  5}  8 Iuu詙  5  8 Iuu}  5  8 Iuu  5  8 Iu}u詙  5  8 Iuu詁  5  8} IuuB  5b   D M   8Z  A(10 M  O3  C5 L 2 }b  J . G _ S 8R F b  J G _ M2   O8c I6uu}x   O 8j   O8c I6uux R  J S  82 }  O2  8c I6uux   O  8j   O2  8}c I6uux R  J G Y A Y S 8b b  JZ  J Y M  } O  8L3 )   8 :)   8 @*  8 }  8 (+   8 }  8 (+   8  8 (+   8  8 (+  8 x  8 }  8  8 +   8 x  8   8  8 +   8 }x  8   8  8 +   8 x  8   8  8 + }  8   8   8 x  8 m+  Oe  : L j   O  }8c I6uu Oj   O8c I6uu O  8}  8 2   O8c I6uu O 8 m+   8 } 2   O8c I6uu O  8 m+   8 2   O8}c I6uu O 8 m+  8  O 8 3, -   8 } O 8 3,   O  8  O   Oe  n R: L   O  8 }  8Le7  8 :)Lk::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::֥ o09Ph ih!iHH !"` *Ƅ`JjƄ`HhƣĢ` }ƥĤ`MD(0,IFL,15)00 FIXIT(IFL)0%0 Close(INO) Open(INO,IFL,4,0)00 IF ERR THEN0 }1 Close(INO)0031) PrintF("%CCANNOT OPEN FILE!%E",BUZZER)1E1 ELSE EXIT31 P1 FIE1 Z1 ODP1 d1 DOZ1r1 ERR= }0d1$1 Print("Output FILE SPEC?1$ I'd 1,1L1 0111ŤLS2 m1*(m1 }01Š1塰L281堍11塍1L1I0IILN2梠1e1iL111`pLj2 }0d2e2f2f2e2d2 1`egmeL2 02222222 1`PrinL2 0222逐L222 }L*3222i2i-2I22I2222222 1` LA3=3<3<3=3L3 }<3=3<3=3I-L3ȄL3I L3L38L]3L40L49ťL4&&&ee80 }ei8<3=3<3=3L3L*4II棥`IOL8444344434 >3` LQ4M4L4M4L4 > }3`Ll4IL~4Ll4l \@Error: 4L444i4i4 g24i4i 4i4i 4 }i4i4ȑ44i4iȑ V i4`EN EXIT L"5 055#####@e#5i55i5i5 }5i5i5ȑ55i5i5ȑ5#5 V$5i5i##IL551L5#IL5# 4$` }T FI5.6L5 055 @e5i55i 5i55i 5i55i5i5555 5` L }U6Q6P6Q6 P6 5`ILw6s6s6 1 5`L6 1 5`L66 6 5`6L6 } 066i6i66 6 5`staL 7 07777 67 6` FL(7$7#7$7#71 6`%HL@7<7;7<7;7 }1 7`U%ELY7 0S70U7T7 20S7 6`TIOL7 0y7{7z7y7 V7y7 6`HEL777771 V7`ALL777771 |7`7 }L77777 V7` L77777 |7`L777 7`NL 888 7` L8 08088 208 6` LB8 0<8 }>8=8<8 8<8 6`R=L`8\8[8\8[81 8` ELx8t8s8t8s81 ?8`, CAN'T COMPRESS")x8L8 08 8888Ȍ88 }L:888888L:8I%L8% t6L:8IL98888Ll98IL.98888Ll98ILG9888 }8Ll98IL`98888Ll9888888IEL9 t6L:8ICL98 t6L:8ISL988 %7L:8IIL988 ]8L }:8IUL988 7L:8IHL:$ t6͗88L98L:88͞8L: 88 8088.88.88.88.8 }88 8ILy:88 Ll:8i0 t6Ly:8i7 t68L:8L:8I%L:8 t6L:Ȍ8888L8`EL:: }: 5`BUZZER):L: 0:::::::m::m:::i:i::: 5: }@e:i::::i:i8:m::m::` PL; 0;;;; :`ZCL;;;;; }1 :`)L;;0; :0 >3`L;1 ;`IL;;; ;`L <1 ;` L<<< ;`L-< }1 ;` ELL@< 08<:<;<<<9<8< 5` Lm>>=`CP^)=L> 0> }>m>>m>8>>=> ==ILk>==`> ==IL>==`>>>> }==IL>==`X=L>>>>> ŠLJ?iLJ?>i>iIDLJ?>i>iI:* }>i>iI:LJ?1LJ?4šLJ?>>L?>e>iaL?zšL?8 >e> }i88LZ?L?>i>iD>i>i:`? L????????? : }??J ELS@8??0ȄŦLALz@ILw@LA?e?i8 }0L@9ţL@80L@AL@FţL@87L@aL@fţL@8WL@LAeLZ@IL A }ILAL>A?e?iLS@ILZA??LA R6LmAINVALID!Ad 7LA RE-TRY: $Ay 6L }@?i?iLA`LBILA`LB -0?i?iqi` ELLB 0 }BBBLBBBBLLB)BB8BBLTBFFFF LnBi0 R6L|Bi7 R6BIBLB` }LB :IY IyLBLBYESB =7LBLBNOB =7`>PROC LOOP()>BBYTE ARRAY MFL(16)B C BY }TE R,O,TB+C=0LCB4>4= >4 >4=LPCInput FILE SPEC? C= %7Bԩ :B > j<Bԩ =< }=LC j j<B =<=LMD j4=4 6BB C CCC1BB1BL }EL E FILE: %S%E%EBԢD 8BC  <B ==ILlE===ILiEBI CILiE=LEBI C }ILELEHEADER AT SCTR %U, BYTE %U%E CB CE 8=LELEBLEB C CLELE=LE NO DOS HEADERE } =7LELE=L FLLCiCiBE CELBFL8F CONTIGUOUS:F, =7LyFBLqF C CLqF C CCC >=LqFL }L C CC ==ILF=ILF=LF==LLLFSEG %H-%H AT SCTR %U, BYTE %U%ECCC C C }BBF 8CBCCL=LGLL C C>m C C>m C CCC C C ==ILEH===ɀLEHLL8 CB C CC C=B >4 } >4BL3JBILH=LHZAP address? (or RETURN) $H 6BB ?C C=LHBLHBLHBLH } R6BIL0J CBCCL-JC CCCL-J8C CCCiCiCCCLJICC Cm CCCm CC }=LoI Verify: $Ie 6CCC B R6LI ZAP: $I 6BB ?BB=L*JBLIBL*J8B Ce }CiCŬC子LJ R6LJ WON'T FIT!I 7L*JBBCC l0L0JL3JLjHB=>4=4BCLJC }CLJ CiC CiCLJ INITAD=%H%ECCJw 8BCLJCCLJ CiC CiCLJ } RUNAD=%H%ECCJ 8BLKL*KRemove this segment? (Y/N) K 6 :BBIY BIyLp }KBLdKREMOVED!K[ 7LKBL{KNOKx 7LKȌBBL L C CLKBLKBLKC ==ILK== }LLBCCBCCCCCBL L CmC C CmC C=LEBLQL C CLQL=B C CCC >BI=LQL }B=BL_L 6 6B1BILLLLZAP ADDRESS NOT FOUND!Lr =7=ILLM R6=ILMBC  TLMMM8>=>=} t6LWNPROBJ 1.0 - Written }in ACTION!(tm)(C)1984 John Navas II%EInput must be a standard DOS objectLoad file. Output will be a RAM mapand an optiona }l compressed Load file.M 8LNcIndividual segments may be removedfrom and bytes may be "ZAP" changedin the output Load }file.%ENa 8LNBuffer size = %H%E==N 8 j4 >4 j<Mt =<>4=4=LO >4 >4 j<>4=4LO }%CCANNOT OPEN FILE!%EO 8LOMLOLOLOLO 6M CLP%EAnother file? (Y/N) O 8 BLO j<} t6ML8P } j<``M -@@($&Š堪((堠(*( EX,EY,EZ, PROBJ 1.0 PRocess OBJect (Load) files. Compiled in ACTION!(tm) (c)1984 John Navas II No comme$}rcial use without permission. OVERVIEW: PROBJ is a general purpose utility for processing Atari DOS object Load fi$}les. It's principal capabilities are: * To produce a RAM address map of the segments in the load file, together with t$}he disk address of the start of each segment. * To produce a new load file with contiguous segments "compressed" into $}a longer segment (which can save disk space and speed loading). * To allow one or more segment(s) to be deleted from th$}e new load file. (Thus a single load file may be broken into pieces.) * To ZAP (change) bytes in the new load file. (A$}ll changes are verified, allowing bytes to be examined even if no changes are to be made.) MINIMUM SYSTEM REQUIREMENTS: $} * 24K RAM (48-64K is preferred). * Disk Drive. FEATURES: * PROBJ is in binary Load file form (to be run f%}rom DOS with OR WITHOUT any cartridges). THIS MEANS THAT IT MUST BE DOWNLOADED WITH A PROGRAM SUPPORTING CIS ERROR-CHECKIN%}G, SUCH AS TSCOPE. * Dynamic buffer uses all of available RAM (buffer size displayed). * Extensive error trapping. %} * Accepts responses in upper or lower case. * Interactive execution with helps and prompts. * RAM map may be di%}rected to any valid file specification. * RAM map identifies DOS initialize and run vectors. * Both RAM addresses a%}nd data displayed and accepted in hexadecimal format. * Disk addresses in decimal format. * Generation of the outpu%}t file is optional. NOTES: * Loads in RAM at $3000 (12K). Program size is approximately 8K bytes. * Should wo%}rk with any compatible DOS and disk drives. * Will NOT accept tokenized Atari BASIC (Saved) programs. * Will not ac%}cept ATASCII text files. COMPRESSING OBJECT LOAD FILES: All DOS object load files must begin with a 2-byte "header%}" of $FFFF. Since one load file can be Appended to another with DOS Copy, there can be unnecessary headers embedded in a % }file. PROBJ automatically removes embedded headers from any output file. An object load file consists of one or more lo% }ad segments. Each segment consists of two 2-byte addresses giving the beginning and ending RAM address for the segment (in% } 6502 low-high byte format), followed by the data for that segment. Each time DOS encounters the end of one segment and t% }he beginning of another segment, the extra processing required results in a delay long enough for the disk drive to take a% }n extra revolution. As a result, a file containing a number of short segments will Load much more slowly than a file of eq%}ual length consisting of a single segment. The problem is that some program development tools, most notably the Atari %}Macro Assembler, generate object files containing only short segments, even if the segments load in contiguous RAM address%}es. PROBJ will combine these contiguous segments into a longer segment (buffer size permitting), creating a new file which%} should Load faster and may also save disk space by the elimination of unnecessary 2-byte addresses (and headers). GET%}TING STARTED: For maximum buffer size it is recommended that any cartridges be removed from your machine. However, a%}dequate RAM should be available for most object load files even with a cartridge installed. (If a buffer error message is %}encountered with a cartridge installed during program execution on a 48-64K system, remove the cartridge and re-try the o%}peration!) From your DOS menu, Load PROBJ.BIN (unless you've given it a different name). As soon as the program Loads, %} the following screen is displayed: *********************************** PROBJ 1.0 - Written in ACTION!(tm) (C)1984 Joh%}n Navas II Input must be a standard DOS object Load file. Output will be a RAM map and an optional compressed Load file.%} Individual segments may be removed from and bytes may be "ZAP" changed in the output Load file. Buffer size = $hhhh %} *********************************** The actual buffer size appears in place of "hhhh". The buffer limits the maximum%} size of a compressed output object file segment (see "error messages" below). It also limits the maximum size of any inpu%}t object file segment which can be processed; if an input segment is encountered which exceeds the buffer, processing is %}abandoned with an error message (see below). PROBJ first asks: FILE SPEC for RAM map? (E:) If you want your %}map to appear on your screen, merely press . You may direct it to your printer by typing P. In fact you ma%}y type any valid file specification (although interactive operation can be difficult if the map is not visible!). If the %}file cannot be opened successfully, PROBJ responds "CANNOT OPEN FILE!" and prompts you to try again. If the file is opened% } to a device other than the screen editor (E:), a title with the input file name will be placed before the map. Next P%!}ROBJ prompts you with: Input FILE SPEC? First, make sure that the disk containing the input file is in your dis%"}k drive! Then type the file specification of the input file you wish to process. (If your file is on disk drive #1, you ma%#}y omit the "D:".) Again, you will get an error message and be prompted to try again if the file cannot be opened. Next%$} you will see: Output FILE SPEC? If you want only a RAM map, and not an output file, merely press . Oth%%}erwise, first make sure that you have a disk in your drive with sufficient room to accomodate the output file! Then type t%&}he file specification of the output file to be created. (If your file is on disk drive #1, you may omit the "D:".) Again,%'} you will get an error message and be prompted to try again if the file cannot be opened. If (and only if) you are crea%(}ting an output file, PROBJ will next give the following two prompts: Remove output segments? (Y/N) ZAP (change) b%)}ytes? (Y/N) In each case, only press a key to give your answer (do NOT press ). PROBJ will confirm your choi%*}ce by displaying "YES" or "NO". Processing now begins. PROBJ first looks for the DOS $FFFF header in the input file and%+} abandons processing with an error message if one is not found (see "error messages" below). Any time a DOS header is %,}encountered, PROBJ will display: HEADER AT SCTR 88, BYTE 99 88 and 99 will of course be replaced with the actual%-} disk address (in decimal) of the first byte of the header. Any time a segment is encountered, PROBJ first checks to s%.}ee if the segment is contiguous with the last segment. If it is, PROBJ will display: CONTIGUOUS: Next, PROBJ wi%/}ll map the segment by displaying: SEG $hhhh-$iiii AT SCTR 88, BYTE 99 $hhhh will be replaced with the actual be%0}ginning RAM address and $iiii will be replaced with the actual ending RAM address. As before, 88 and 99 will be replaced w%1}ith the actual disk address (in decimal) of the first (low) byte of the first address. If the segment is contiguous, PR%2}OBJ then checks to see if it will fit in the remaining buffer space. If it won't, this particular segment won't be compre%3}ssed, but processing will continue after the message: WON'T FIT IN BUFFER, CAN'T COMPRESS If the segment contain%4}ed a DOS initialize and/or run vector, the vector HEXADECIMAL address will be displayed on the map. (INITAD is the initia%5}lize address; RUNAD is the run address.) At the completion of successful processing, PROBJ displays the message: %6} File processed OK! However, if an error occurred, PROBJ will display (in addition to the error message): PROCE%7}SSING FAILED! Note: Even though processing fails, PROBJ may still have created an output file, but the file will usua%8}lly not be valid! Finally, PROBJ will ask: Another file? (Y/N) As before, press a key (not ). If %9}you press anything other than "Y", PROBJ will return to DOS. Note that if you continue with another file, the RAM map will%:} continue to go to the file specified at the beginning of the program! Also note that the RAM map file is not CLOSEd until%;} the end of the program, so be SURE to press "N" at the end of processing or a RAM map sent to disk will be lost! ZAPPI%<}NG (CHANGING) BYTES: If you are creating an output file and have chosen to ZAP bytes, PROBJ will prompt you for the f%=}irst RAM address (all addresses must be processed in the order encountered in the input file!) with: ZAP address? (o%>}r RETURN) $ Press if you have no more addresses to ZAP. Otherwise, type the HEXADECIMAL address. (If you mak%?}e an error, PROBJ will respond "INVALID!" and give you another chance with "RE-TRY: $". Note that you do NOT need to type%@} a "$"!) Once the address is located, PROBJ will allow you to verify the current contents of the location with: V%A}erify: $h...h "h...h" will be replaced by the HEXADECIMAL digits presently at that address. Then PROBJ will display: %B} ZAP: $ (Note that the "$" is aligned with Verify for easy typing.) If you wish to make no (further) changes,%C} merely press . (Note that this is a handy way to DISPLAY ANY ADDRESS even if you don't want to make any changes!%D}) Otherwise, type up to 16 HEXADECIMAL digits. (If more bytes are to be ZAPped, you must enter another ZAP address!) As be%E}fore, you will be notified and given another chance if you make an error. When the entry is correct, PROBJ will return to %F}the "Verify" display so that you may verify your ZAP and make a further ZAP at the same address if desired. When your %G}ZAP at that address is completed, PROBJ will prompt you for the next ZAP address. Enter the next address, even if it is no%H}t in the current segment! (PROBJ will remember the address and continue scanning.) DELETING SEGMENTS: If you are c%I}reating an output file and have chosen to delete segments, after each segment is mapped, PROBJ will ask: Remove this%J} segment? (Y/N) As usual, press only a key to indicate your answer (don't press ). PROBJ will confirm your a%K}nswer by displaying "REMOVED!" or "NO". Note that the segment is only removed from the output file; the input file is left%L} intact! Of course, any ZAPs you have made in a removed segment are lost! ERROR MESSAGES: If PROBJ does not find a%M} standard DOS $FFFF header at the beginning of the input file, processing is abandoned with the error message: NO DOS %N}HEADER You may have typed an incorrect input file specification. Remember that PROBJ will not accept tokenized BASIC o%O}r text files. If PROBJ encounters an input segment which exceeds the buffer, processing is abandoned with the error %P}message: WON'T FIT IN BUFFER If any cartridges were installed on a 48-64K system, remove the cartridge and re-try t%Q}he operation. If a segment is encountered in which the ending RAM address is LESS than the beginning RAM address, pr%R}ocessing is abandoned with the error message immediately following the segment map: INVALID ADDRESS RANGE Be sure t%S}hat you are trying to process a valid object file! If you try to type more ZAP bytes (hexadecimal digits) than will f%T}it in the current segment, PROBJ will display: WON'T FIT! You will then be given another chance to enter ZAP bytes%U}. If the input file is exhausted without locating your ZAP address, PROBJ will display: ZAP ADDRESS NOT FOUND! %V} Check to be sure that you are processing the correct file! If the input file ends other than at the normal end of a%W} segment or header, PROBJ will display: UNEXPECTED E-O-F AT SCTR 88, BYTE 99 As usual, 88 and 99 will be replaced %X}by the disk address (in decimal) where the end of file occurred. Check to be sure that you are processing the correct file%Y}! If an unrecoverable I/O error occurs, PROBJ will display: I/O ERROR: 999 999 will be replaced by the Atari %Z}DOS error code (in decimal). Refer to the Atari DOS manual for explanations and corrective action. X A`b$f PSPIC.XMO by Mike )\}Collins [74005,475] SYSTEM REQUIREMENTS: ATARI 400/800/XL/XE 48K Ram Disk Drive Print Sho)]}p, by Broderbund Software ACTION! Cartridge INTRODUCTION PSPIC.XMO is a graphics utili)^}ty written in ACTION!. Its purpose is to give you access Print Shop's fancy hi-resolution text and graphics. PSPIC.XMO wi)_}ll load a Print Shop SCREEN MAGIC file into memory as a graphics mode 8 screen. It will then let you overlay Print Shop GRAPH)`}IC files anywhere on that screen. The resulting screen can then be saved as a 62 sector picture file, which can be accesse)a}d by any standard graphics utility such as Graphics Master, Koala Painter, etc.. COMPI)b}LING PSPIC.XMO Since PSPIC.XMO is ACTION! source code, you must have the ACTION! cartridge to use it. Before compiling)c}, set the case sensitive mode from the options menu(see ACTION! manual). After compilation is completed, type 'R'(run) an)d}d you will see the main menu. USING PSPIC.XMO Files can be loaded from Print Shop data)e} disks or from Print Shop GRAPHICS LIBRARY disks. Insert a disk which contains Print Shop files into drive 1 and press 'L')f}(load). You will see the first filename in the directory. Use the space bar to step through the files. As the filen)g}ames are printed on the screen, the file type(screen magic/graphic) will be indicated. When you see the file you want, pres)q}7B PAIRS DOCB;PAIRS OBJBIPATCH DOCB`PATCH XMOBpPLTCHR BINBwPLTCHR DOCBPMDEMO DOCB&PMDEMO OBJBCPROBJ BINBcPROBJ DOCB[PSPIC DOCB>PSPIC XMOBKPSPIC3 COMB! PSPIC3 DOCBo*PSPIC3 XMOs . LOADING SCREEN MAGIC FILES When you load a screen magic file, the screen wil)r}l be cleared and the picture will be loaded into memory. Press any key to go back to the main menu. )s} LOADING PRINT SHOP GRAPHIC FILES When you load a Print Shop graphic file, the following things will happen. 1. You wi)t}ll be asked for the X and Y coordinates which will be used to place the graphic on the screen. Typing in respons)u}e to either prompt will set that coordinate to zero. 2. If you have already loaded one or more files into memory, you will)v} see the following prompt. "Clear or Existing screen?" Typing 'C' will erase the screen in memory while typing 'E' will no)w}t. 3. If you respond with 'E', you will see another prompt. "Overlay(Y/N)?" Responding with 'N' will erase the area unde)x}r the graphic when the graphic is loaded. Typing 'Y' will not. 4. The graphic will be placed on the screen at the spec)y}ified coordinates. Press any key to return to the main menu. SAVING FILES To save a sc)z}reen, type 'S' from the main menu. Make sure you have a disk that has been formatted with Atari DOS in drive 1. The nam){}e of the last file you have loaded will be printed on the screen. You can enter a new filename or type to use the )|}name of the last file loaded. CAUTION! Print Shop file names may contain characters which are not allowed in Atari filenames)}}. Make sure to delete any such characters. I hope you enjoy using this program. If you have any questions or comments, )~}please leave me a message. mike )} 74005,475 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF(x;Print Shop Screen Magic;and Graphic Library ;File conversion utility;by Mike Collins;ver. 2;8/20/85;ŠΠŠ-}ŠŮBYTE ramtop=106, hitop, lotop,clear=[0], intact=[1], picflag=[0],overBYTE ARRAY fname, filenameCARD smem=88-}, screen, dlhi, xpos, yposTYPE directory=[BYTE n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,na,nb,nc,nd,ne,nfCARD startsec, PA, bytes]di-}rectory POINTER file;************************************;Burst (Block) I/O routines to do;quick disk I/O, utilizing a cal-}l 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,b-}len BYTE a1,a2,a3,a4,a5,a6] IOCB POINTER iptr chan==&$07 iptr=$340+(chan LSH 4) iptr.cmd=mode iptr.b-}len=buflen iptr.badr=addr CIO(0,chan LSH 4)RETURN(iptr.stat);************************************BYTE FUNC BPut(BYTE-} chan CARD addr,len)BYTE stat stat=Burst(chan,11,addr,len)RETURN(stat);*******************************-}*****PROC DISKINV=$E453();************************************BYTE FUNC resdisk(BYTE drv, cmd CARD buf, -}sec)TYPE DCB=[BYTE sbi, dnum, com, stat CARD addr, to, cnt, secnum]DCB POINTER diskdisk=$300disk.dnum=drvdis-}k.com=cmddisk.addr=bufdisk.secnum=secDISKINV() RETURN(disk.stat) ;*******************************-}*****BYTE FUNC GetSec(BYTE drv CARD buf, sec)BYTE statstat=resdisk(drv, 'R, buf, sec)RETURN(stat);*****-}*******************************PROC shift(CARD buffer)PokeC($CB,buffer)[24 160 0 8 40 177 203 106 145 203 8 200 19-}2 12 208 244 40]RETURN;************************************PROC overlay(CARD to, from, length)BYTE POINTER pointto, po-}intfromCARD countFOR count=0 TO length-1DOpointto=count+to pointfrom=count+frompointto^=pointto^ OR pointfrom^ODRETURN-};************************************PROC vdelay()BYTE jiffy, clock=20jiffy=clock ;This loop ensuresDO -} ;that 1 vbl interuptUNTIL jiffy#clock;will occur. All OD ;hardware registersRETURN ;will be upda-}ted.;************************************BYTE FUNC uppercase(BYTE chr)IF chr>='a AND chr<='z THEN RETURN(chr-$20)FIRE-}TURN(chr);************************************PROC nobreak() ;disable break keyPoke(16,64) Poke(53774,64)RETURN;********-}****************************PROC ercheck(BYTE ernum)IF ernum#1 ;error check routineTHEN ;if ernum<>1 then reportr-}amtop=lotop ;error to userGraphics(0) nobreak()vdelay()Position(8,11) Print("ERROR #")PrintBE(ernum)Position(8,13) Print-}("Press any key")ernum=1GetD(7)FIRETURN;************************************PROC init()hitop=ramtopGraphics(24) nobre-}ak()screen=smemlotop=Peek(561)-1 dlhi=PeekC(560)Error=ercheckfilename="D1: "RETURN;*************************-}***********BYTE FUNC menu()BYTE selectionramtop=lotop ;put menu under screenGraphics(0) nobreak()Position(9,8) PrintE("-}oad Print Shop File")Position(9,10) PrintE("ave File(Atari DOS)") DOPosition(9,12) Print("Make Selection:")selection=Get-}D(7) selection==&127selection=uppercase(selection)Put(selection)UNTIL selection='L OR selection='SODRETURN(selection);*-}***********************************PROC showscreen(BYTE option)BYTE mode, jiffy, clock=20;clear screen if option=0ramtop=-}hitop ;set ramtop for gr.8IF option=clear THEN Graphics(24) nobreak() picflag=0 ;erase pictureELSEPokeC(560,dlhi)FIvd-}elay()RETURN;************************************CARD FUNC psdir()BYTE x, stat BYTE ARRAY dirbuf(129)CARD sectorr-}amtop=lotopGraphics(0) nobreak() PrintE(" for next file, to load") PutE() Poke(85,6) PrintE("Filename -} File Type") PutE() FOR sector=362 TO 392 DO ;read stat=GetSec(1,dirbuf+1,sector);directory IF st-}at#1 THEN ercheck(stat) EXIT FI fname=dirbuf FOR x=1 TO 4 DO IF fname(1)=0 THEN RETURN(0) FI fname-}(0)=15 file=fname+1 Poke(85,6) Print(fname) ;print filenames Print(" ") IF file.bytes<641 THEN PrintE("Graph-}ic") ELSE PrintE("Screen Magic") FI IF GetD(7)=155 THEN Poke(filename(1),'D) Poke(filename(3),':) -} filename(0)=15 MoveBlock(filename+4,fname+1,8) RETURN(file.startsec) FI fname==+32 OD ODRETURN(0);*-}***********************************BYTE FUNC getcoord()BYTE optionramtop=lotopGraphics(0) nobreak()xpos=0 ypos=0Positio-}n(8,5) Print("This is a graphic file.")DOPosition(6,7) Print("Enter X coordinate(0-232): ~~~~~~")xpos=InputC()UNTIL -}xpos<233ODDOPosition(6,9) Print("Enter Y coordinate(0-140): ~~~~~~")ypos=InputC()UNTIL ypos<141OD IF picflag=1 T-}HEN DO Position(6,11) Print("lear or xisting Screen?: ~~~~") option=GetD(7) option==&127 option=uppercase(option) U-}NTIL option='C OR option='E OD Put(option) IF option='E THEN DO Position(6,13) Print("Overlay(Y/N)?:") over=GetD(7-}) over==&127 over=uppercase(over) UNTIL over='Y OR over='N OD Put(over) FI ELSE option='C over='N FI IF option-}='C THEN option=clear ELSE option=intact FIRETURN(option);************************************BYTE FUNC psload(CA-}RD sector) ;return error #BYTE statCARD offset, seccntoffset=0showscreen(clear)FOR seccnt=1 TO 61DOstat=GetSec(1,scree-}n+offset,sector) IF stat#1 THEN EXIT FIoffset==+126sector=PeekC(screen+offset);sector linkIF sector=0 OR sector>720THEN-} EXIT FIODercheck(stat)picflag=1RETURN(stat);************************************BYTE FUNC gfxload(CARD sector, option)-} ;return error #BYTE stat, wait, bak=710, point=709, i, bitsBYTE ARRAY gfxbuf(640), shiftbuf(12)CARD offset, seccnto-}ffset=0showscreen(option) bak=8 point=0vdelay()FOR seccnt=1 TO 5DO stat=GetSec(1,gfxbuf+offset,sector) IF stat#1 THEN -}EXIT FI offset==+126 sector=PeekC(gfxbuf+offset);sector link IF sector=0 OR sector>720 THEN EXIT FIODercheck(stat)-}picflag=1bits=xpos&7 xpos== RSH 3 FOR offset=0 TO 51 DO IF bits#0 THEN shiftbuf(11)=0 MoveBlock(shiftbuf,gfxbuf+offs-}et*11,11) FOR i=1 TO bits DO shift(shiftbuf) OD IF over='Y THEN overlay(screen+offset*40+xpos+40*ypos,-}shiftbuf,12) ELSE MoveBlock(screen+offset*40+xpos+40*ypos,shiftbuf,12) FI ELSE IF over='Y THEN overlay(-}screen+offset*40+xpos+40*ypos,gfxbuf+offset*11,11) ELSE MoveBlock(screen+offset*40+xpos+40*ypos,gfxbuf+offset*11,11)-} FI FI ODGetD(7) ;wait for keypressRETURN(stat);************************************PROC saveit()BYTE statramtop=-}lotopGraphics(0) nobreak()IF picflag THEN Position(15,8) Print("Save Screen") Position(8,10) Print("Insert disk with Ata-}ri DOS") Position(8,12) Print("Enter filename or .") Position(8,14) Print(filename) Position(8,14) Print("") Input-}S(filename) showscreen(intact) Close(2) ;just in case Open(2,filename,8,0) stat=BPut(2,screen,7680) IF stat#136 THEN er-}check(stat) FI Close(2) ELSE Put(253) Position(8,10) Print("No Picture in Memory!") Position(11,12) Print("Press-} any key") GetD(7)FIRETURN;************************************PROC main()BYTE choice, statCARD start, optioninit()-}DO choice=menu() IF choice='L THEN start=psdir() ;get first sector IF start#0 THEN IF file.bytes<641 -}THEN option=getcoord() gfxload(start,option);load graphic ELSE psload(start);load picture FI FI EL-}SEIF choice='S THEN saveit() FI ODRETURNyyyyyyy-%7-@@"M(chord off W A a A%X ,7 HD (c)1983 Action Computer Services  B JKIHiDiELV`L9 1} 9 BLV`L l L &` Fj`8冨凪` EӅӥ1} `ʆǪƩ Ɛee` ƦʆǢ &Ɛeǐ ! !L '&&&8儨児1}祂*L &&*ń8&&L W!`hihiHHȱȱL c !#3`1}L JJJJ`H h`Hȩh n L! w L! ! L! ) L! / H81}`HhHh ["L! BHI V䅠L! L" 9 L!Ԇ ؠPIPP`1} "P ) L! "L" "L" #L"H- "8塪墨hL# #L" "#L" "ȹP`1}텠8堨塪 "芨Oȩ-`PP "P棩 Ѥģ0-ģ6000:,80H 1}& &ehe&eģ0ʥ 8堅塅`$ "&*i0:0i "Ʀ`¢ 护1}°ڱ%ȱ%E "L\$担CS N"L\$I #L\$H $L\$ "L\$ &B V !NLMȑ1}` MLN%B VL!S:$E:%H H" %% " H"h)0I%%L"[\ZUVT` <%%%1}` C%L" 6%L" <%L") ` C%L" "!` 0d ҥ `2)21}ҩ`p`0)9%`@0)ӈJJJJ)`Ѕ`ȱ`` 1&ȥ`Hh1}ƣĢ`ƥĤ`Ѣ &`ȱѢĦ`膡`1}`ťƤe8夰L& Ƥ8`ŦeѠe桊L&1}1}@ '1}PRI[(Lu( !j(j()j(j( @ep(iq(p(iq(ik(p(iq(io(1}n(p(iq(im(ȑl(j( Vp(iq(i`L) !)))))) r()1})))`LY) !P)R)T)S)Q) P) r(U)U)`L) !))))i)i))i1})i))i)i)ȑ))i )i)ȑ) S)i)i`L!* !*****R1}* )**`LU* !L*N*P*O*M*WL* )Q*Q*`L***** ;&(j (`1}L* !***8*****Ͷ***LD+*m***m***m***m********1}*М*L*`LI+E+E+ELN+`L]+Y+Y+aL}+zY+L}+8Y+ `Y+`L+@ 1&@ҩ 1&`L+++IL,G'j 1}% + F+  6%L+ERROR #+ N"+ "  6%L+ Press any key+ N"+ "`L ,G'j % + " 6%LH,Please1} remove disk from drive 1,( N"  6%L|, and insert PRINT SHOP data disk.,[ N" 6%L,, ;" "`L1},G'j % + " 6%L,Please remove disk from drive 1, N" 6%L-and insert .PIC disk., N" 6%L7-1}-( ;" "`LG-''n' H"L\-K:-Y "jF' % +Ya(X`(1 !&8G'0 !&c(b(1}+ + L-D1: -M'L'`L--F'j-L- % +H'L.c(b(0 ;& F+`L.....1}.i.iD.i.i:.i.i.i.i.i .i.i .i.i .i1}.i .i.i .i.i .i.Ȍ . .LL/.m ..iI LF/ . . .LC/.m ..i1} .i.e.i .L/L. .L. . .L/.m ..iIL/..8 . .LQ/..1}.q.iI.L/..8.i .iI.L0.i .iI L0.. `L 0i'ک1} *00IL000`00Li0^(m0_(i0'QLc0`0L50`Lr0G'j % + R 6%L01}0 N" 6%L0򮠳0 N" 6%L0ͮǮ0 N" 6%L11}1 ;" TL011. Load PS File1 ;"LM12. Load Atari File1: ;"Lg13. Save PS File1W ;"L14. Save Atari File1q ;"1}TRUL1 Select(1-4):1 N" "n0n0)n0n0 "0n0L1n05L1Rn0`L1 011IL4G'j % +L.2#1} for next file, to load2 ;" "ULY2Filename File Type2? ;" "1j111L411'1}۩ *11IL21 +L4'K'ڍJ'11L 4J'iK'iL2`J'K'J'ih(K'ii(1}UK'J' N"L3 3 N"h(ii(iɁȱLO3LE3Graphic3= ;"Lf3L_3 Screen Magic3R ;" "IL3L'iM'i1}DL'iM'i:L'M'L'iM'iJ'iK'i m&h(ii(i`J'i J'K1}'iK'1L211Lm2L-41L'4 ,L-41 +`LN4 06464L4 % +L4# for next fil1}e, to load4i ;" " H"L4D:*.*4 "47 v"E4IOL4L4 U47 ;" "IL447 .L4L4 H"L1}564IL 5 ,L564 +47`L5G'j % +e(d(g(f( 6%L\5This is a graphic file.5D N" 6%L5&Enter 1}X coordinate(0-232): ~~~~~~5o N" #e(d(d(e(Lc5  6%L5&Enter Y coordinate(0-140): ~~~~~~5 N"1} #g(f(f(ɍg(L5H'IL6  6%LH6"lear or xisting Screen?: ~~~~6% N" "55)55 Z+55I1}C 5IEL65 "5IEL6  6%L6Overlay(Y/N)?:6 N" "I'I')I'I' Z+I'I'IY I'INL6I' "L6C5N1}I'5ICL75L755`L77 777 -7Ȍ7=77L7`(m7a(m77 7 *1}77ILx7L77i~77i7`(m7a(m7 !&7 7 7 7 77L7L777L377 +H' "7`1}ID7 L8 !7777 - F+8Ȍ888L87m77m777 *1}77ILt8L87i~77i77m77m7 !&777 777L8L888L/87 +H'd()7Ne1}(nd(Ne(nd(Ne(nd(77377L;7LZ:7 77 "!7e7e 7 m&77b9b971}Lp97 *7LW9I'IYL9(77 "!`(ea(emd(me(g(f(( "!ee71} 򦡥 *LW:(77 "!`(ea(emd(me(g(f(( "!ee7 򦡥 m&L1};I'IYL:(77 "!`(ea(emd(me(g(f(( "!ee 77 "!1}7e7e *L;(77 "!`(ea(emd(me(g(f(( "!ee1} 77 "!7e7e m&77L8 "7`L;;; - H";; "a(1}`( ) H"H' "`L;;j;;;Lq<;;'ک *'i(ڍh(;;Lf====`71}7L>G'j % +H1}'LA 0ILAL'M' >M' >L'> &8 >> 6%L?Print Shop Save? N"  6%LL?Insert Pr1}int Shop Data Disk?0 N"  6%Ly?Enter filename or .?_ N" 6%> N" 6%L?? N"> o"i'1}N * <=L? +` ;>>> >L? + -a(>`( > =>> >= >L@ =>>>2}~ >> m&>> E= =>>>>> ;&>>> R* > >IL@ > +` >i~ >>i> >L@^'2}i'N R* > >IL@ > +` i(h( J&h(ii(iAP> >> >i(h( m&h(ii(i2}>>h(ii(iȑ>>'ک R* > >IL|A > +`LA ,LA "  6%LANo Picture in Memory2}!A N" 6%LA Press any keyA N" "`LAG'j % +H'LB 0LB 6%LB Save ScreenB N"  6%LCB2}Insert disk with Atari DOSB( N"  6%LpBEnter filename or .BV N" 6%M'L' N" 6%LBB N"M'L'2} o" - H"M'L' "a(`( V)AAILBA + H"LB ,LOC "  6%L"CNo Picture in Memory!2}C N" 6%LCC Press any keyC5 N" "`LYC D- o0PCPCI1LC 1SCRCRC SCLCh(ii(iɁȱ2}LC 5UCTCUCTCSCRC 8LCSCRC 7LDDPCI2L'D K4M'L'L'iM'iIOL$DL'iM'iIDL$D2}M'L' ;LDDPCI3L7D >LDDPCI4LDD AL\C``VC`,"0^ Print Shop File Converter version 3.0 6 } by Mike Collins [74005,475] SYSTEM REQUIREMENTS: ATARI 400/800/XL/XE 48K Ram Disk 6 }Drive Print Shop, by Broderbund Software ACTION! Cartridge INTRODUCTION The Print Shop6 } File Converter is a graphics utility written in ACTION!. It will allow you to convert Print Shop's SCREEN MAGIG files 6 }into standard 62 sector DOS files and vice versa. With the Print Shop File Converter, you can use Print Shop's fancy text6} and graphics with other programs, or use Print Shop to dump any 62 sector picture to your favorite printer. There is 6} also a provision which allows you to overlay any hi-resolution screen with files from Print Shop's GRAPHIC LIBRARY. 6} COMPILING THE PRINT SHOP FILE CONVERTER Since the Print Shop File Converter is ACTION! source code, you6} must have the ACTION! cartridge to use it. The source code must be compiled directly from disk and the ACTION! compiler mus6}t be in the case-sensitive mode(see ACTION! manual). After compilation is completed, type 'R'(run) and you will see the6} menu. LOADING FILES There are three types of files that can be load into memory: 1. 6}Print Shop SCREEN MAGIC files. 2. Print Shop GRAPHIC files. 3. 62 sector picture files(Graphic Master, Micro Painter, etc..6}) To load a file, insert the appropriate files disk into drive 1 and press either <1>(Print Shop load) or <2>(Atari DOS load6}), depending on the type of file you wish to load. The program will inform you if you try to load a Print Shop file from a 6}DOS disk or vice versa. You can use the space bar to step through the files. When you step through the files on a Print Sh6}op disk, each file will be identified as either a SCREEN MAGIC file or a GRAPHIC file. When you see the file you want, pr6}ess , and the file will be loaded into memory. When you load a Print Shop graphic file, the following things will 6}happen. 1. You will be asked for the X and Y coordinates which will be used to place the graphic on the screen. Typing <6}RETURN> in response to either prompt will set that coordinate to zero. 2. If you have already loaded one or more files in6}to memory, you will see the following prompt. "Clear or Existing screen?" Typing 'C' will erase the screen in memory while6} typing 'E' will not. 3. If you respond with 'E', you will see another prompt. "Overlay(Y/N)?" Responding with 'N' will e6}rase the area under the graphic when the graphic is loaded. Typing 'Y' will not. 4. The graphic will be placed on the s6}creen at the specified coordinates. Press any key to return to the menu. SAVING FILES 6 } To save a screen, type <3>(Print Shop) or <4>(Atari) from the menu. Make sure you have the correct data disk in drive 16!}. Again, you will be informed if you have inserted the wrong data disk. The name of the last file you have loaded will6"} be positioned under the cursor. You can enter a new filename or type to use the name of the last file loaded. 6#} SOME TIPS Print Shop file names may contain characters which are not allowed in Atari6$} filenames. Make sure to delete any such characters when saving files under Atari DOS. Also, the Print Shop File Conve6%}rter does not check for duplicate file names on Print Shop disks, so be careful when naming your files. Print Shop file6&}s with duplicate names can be accessed by the Print Shop File Converter, but not by Print Shop. I hope you fin6'}d this program as useful as I have. If you have any or comments or suggestions, please leave me a message. 6(} Mike 6)} 74005,475 @0'/@@@P34',@0@P'/@P@P69/@P@`'/4DEFINE clear="0", intact="1", is="=", free="0", taken="1", adisk="0", pdisk="1";Print Shop Screen Magic;and G:+}raphic Library ;File conversion utility;by Mike Collins;ver. 3;10/13/85;Š٠͠ˮ;ŠΠ:,}ŠŮBYTE ramtop=106, hitop, lotop,picflag=[0], over, margin=82, vtab=84,htab=85BYTE ARRAY fname, filename, :-} vtocsec(128), vtoc, mask=[128 64 32 16 8 4 2 1], dirbuf(129), psid=['P 'R 'I]CARD smem=88, screen, :.}dlhi, xpos, yposTYPE directory=[BYTE n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,na,nb,nc,nd,ne,nfCARD startsec, PA, bytes]directory PO:/}INTER file;************************************;Burst (Block) I/O routines to do;quick disk I/O, utilizing a call to;CIO:0};************************************PROC CIO=$E456(BYTE areg,xreg);************************************CARD FUNC Burst:1}(BYTE chan,mode, CARD addr,buflen) TYPE IOCB=[BYTE id,num,cmd,stat CARD badr,padr,blen :2} BYTE a1,a2,a3,a4,a5,a6] IOCB POINTER iptr chan==&$07 iptr=$340+(chan LSH 4) iptr.cmd=mode iptr.blen=buflen:3} iptr.badr=addr CIO(0,chan LSH 4)RETURN(iptr.stat);************************************CARD FUNC BGet(BYTE chan :4} CARD addr,len) CARD temp temp=Burst(chan,7,addr,len)RETURN (temp);************************************BYTE FU:5}NC BPut(BYTE chan CARD addr,len)BYTE stat stat=Burst(chan,11,addr,len)RETURN(stat);********************:6}****************PROC DISKINV=$E453();************************************BYTE FUNC resdisk(BYTE drv, cmd :7} CARD buf, sec)TYPE DCB=[BYTE sbi, dnum, com, stat CARD addr, to, cnt, secnum]DCB POINTER diskdisk=$300disk.dn:8}um=drvdisk.com=cmddisk.addr=bufdisk.secnum=secDISKINV() RETURN(disk.stat) ;*********************:9}***************BYTE FUNC GetSec(BYTE drv CARD buf, sec)BYTE statstat=resdisk(drv, 'R, buf, sec)RETURN(st::}at);************************************BYTE FUNC PutSec(BYTE drv CARD buf, sec)BYTE statstat=resdisk(dr:;}v, 'W, buf, sec)RETURN(stat);************************************PROC shift(CARD buffer)PokeC($CB,buffer)[24 160 0 8 :<} 40 177 203 106 145 203 8 200 192 12 208 244 40]RETURN;************************************PROC overlay(CARD to, fr:=}om, length)BYTE POINTER pointto, pointfromCARD countFOR count=0 TO length-1DOpointto=count+to pointfrom=count+frompoint:>}to^=pointto^ OR pointfrom^ODRETURN;************************************PROC vdelay()BYTE jiffy, clock=20jiffy=clock :?} ;This loop ensuresDO ;that 1 vbl interuptUNTIL jiffy#clock;will occur. All OD ;hardware regi:@}stersRETURN ;will be updated.;************************************BYTE FUNC uppercase(BYTE chr)IF chr>='a AND c:A}hr<='z THEN RETURN(chr-$20)FIRETURN(chr);************************************PROC nobreak() ;disable break keyPoke(16:B},64) Poke(53774,64)RETURN;************************************PROC ercheck(BYTE ernum)IF ernum#1 ;error check routineTH:C}EN ;if ernum<>1 then reportramtop=lotop ;error to userGraphics(0) nobreak()vdelay()Position(8,11) Print("ERROR #"):D}PrintBE(ernum)Position(8,13) Print("Press any key")ernum=1GetD(7)FIRETURN;************************************PROC pr:E}omptps()ramtop=lotopGraphics(0) nobreak()Put(253) ;bellPosition(4,8) Print("Please remove disk from drive 1")Position(4,:F}10) Print("and insert PRINT SHOP data disk.")Position(12,12) PrintE("")GetD(7)RETURN;**********************:G}**************PROC promptpic()ramtop=lotopGraphics(0) nobreak()Put(253) ;bellPosition(4,8) Print("Please remove disk fro:H}m drive 1")Position(9,10) Print("and insert .PIC disk.")Position(12,12) PrintE("")GetD(7)RETURN;**********:I}**************************PROC init()vtoc=vtocsec+32Close(7)Open(7,"K:",4,0)hitop=ramtopGraphics(24) nobreak()screen=s:J}memlotop=Peek(561)-1 dlhi=PeekC(560)Error=ercheckfilename="D1: "RETURN;************************************P:K}ROC showscreen(BYTE option)BYTE mode, jiffy, clock=20;clear screen if option=0ramtop=hitop ;set ramtop for gr.8IF option=:L}clear THEN Graphics(24) nobreak() picflag=0 ;erase pictureELSEPokeC(560,dlhi)FIvdelay()RETURN;**********************:M}**************PROC makename(BYTE ARRAY name)BYTE x, i, tempname(0)=14name(1)='D name(2)=':name(15)=155name(14)=name(13):N}name(13)=name(12)name(12)=name(11)name(11)='.FOR x=1 TO 10 DO WHILE name(x)=' DO FOR i=x TO 15 DO n:O}ame(i)=name(i+1) OD OD ODFOR x=1 TO 14DO IF name(x)=155 THEN name(0)=x-1 FIOD IF name(name(0))='. THEN name(:P}0)==-1 FI IF name(10)='. AND name(11)=' THEN name(0)=9 FIRETURN;************************************BYTE FUNC data:Q}_disk()BYTE xx=GetSec(1,dirbuf,361)IF x#1THEN RETURN(x)FI FOR x=0 TO 2 DO IF dirbuf(x)#psid(x) THEN RETURN(adisk):R} FI ODRETURN(pdisk);************************************BYTE FUNC menu()BYTE selectionramtop=lotop ;put menu under scr:S}eenGraphics(0) nobreak()margin=11Position(8,0)Print("")Position(13,1)Print("򮠳"):T}Position(13,2)Print("ͮǮ")Position(13,3)PrintE("")vtab=9PrintE("1. Load PS File")PrintE("2. :U}Load Atari File")PrintE("3. Save PS File")PrintE("4. Save Atari File")DOvtab=14 htab=marginPrint("Select(1-4):")selecti:V}on=GetD(7) selection==&127Put(selection)UNTIL selection>'0 AND selection<'5ODmargin=2RETURN(selection);****************:W}********************CARD FUNC psdir()BYTE x, stat, dstat CARD sectordstat=data_disk()IF dstat=pdiskTHENramtop=lotop:X}Graphics(0) nobreak()PrintE(" for next file, to load") PutE() htab=6 PrintE("Filename File Type") Put:Y}E() FOR sector=362 TO 393 DO ;read stat=GetSec(1,dirbuf+1,sector);directory IF stat#1 THEN erc:Z}heck(stat) EXIT FI fname=dirbuf FOR x=1 TO 4 DO IF fname(1)=0 THEN RETURN(0) FI fname(0)=15 file=fname:[}+1 htab=6 Print(fname) ;print filenames Print(" ") IF file.bytes<641 THEN PrintE("Graphic") ELSE PrintE(:\}"Screen Magic") FI IF GetD(7)=155 THEN filename(1)='D filename(2)=': filename(0)=15 MoveBlock(fi:]}lename+3,fname+1,8) RETURN(file.startsec) FI fname==+32 OD ODELSEIF dstat=adiskTHENpromptps()ELSE erchec:^}k(dstat)FIRETURN(0);************************************CARD FUNC dir()BYTE dstatBYTE ARRAY name(20)dstat=data_disk():_}IF dstat=adiskTHENGraphics(0) nobreak()PrintE(" for next file, to load") PutE()Close(1)Open(1,"D:*.*",6,0) :`};read directoryDOInputSD(1,name) IF name(14)='O THEN EXIT FIhtab=10PrintE(name) IF GetD(7)=155 THEN makename(name) E:a}XIT FIODClose(1)ELSEIF dstat=pdiskTHENpromptpic()ELSE ercheck(dstat)FIRETURN(name);*********************************:b}***BYTE FUNC getcoord()BYTE optionramtop=lotopGraphics(0) nobreak()xpos=0 ypos=0Position(8,5) Print("This is a graphic :c}file.")DOPosition(6,7) Print("Enter X coordinate(0-232): ~~~~~~")xpos=InputC()UNTIL xpos<233ODDOPosition(6,9) Pri:d}nt("Enter Y coordinate(0-140): ~~~~~~")ypos=InputC()UNTIL ypos<141OD IF picflag=1 THEN DO Position(6,11) Print(":e}lear or xisting Screen?: ~~~~") option=GetD(7) option==&127 option=uppercase(option) UNTIL option='C OR option='E OD :f}Put(option) IF option='E THEN DO Position(6,13) Print("Overlay(Y/N)?:") over=GetD(7) over==&127 over=uppercase(ov:g}er) UNTIL over='Y OR over='N OD Put(over) FI ELSE option='C over='N FI IF option='C THEN option=clear ELSE:h} option=intact FIRETURN(option);************************************BYTE FUNC loadps(CARD sector) ;return error #BYTE :i}statCARD offset, seccntoffset=0showscreen(clear)FOR seccnt=1 TO 61DOstat=GetSec(1,screen+offset,sector) IF stat#1 THE:j}N EXIT FIoffset==+126sector=PeekC(screen+offset);sector linkIF sector=0 OR sector>720THEN EXIT FIODercheck(stat)picfla:k}g=1GetD(7)RETURN(stat);************************************BYTE FUNC gfxload(CARD sector, option) ;return error #BYTE st:l}at, wait, bak=710, point=709, i, bitsBYTE ARRAY gfxbuf(640), shiftbuf(12)CARD offset, seccntoffset=0showscreen(optio:m}n) bak=8 point=0vdelay()FOR seccnt=1 TO 5DO stat=GetSec(1,gfxbuf+offset,sector) IF stat#1 THEN EXIT FI offset==+126 s:n}ector=PeekC(gfxbuf+offset);sector link IF sector=0 OR sector>720 THEN EXIT FIODercheck(stat)picflag=1bits=xpos&7 xp:o}os== RSH 3 FOR offset=0 TO 51 DO IF bits#0 THEN shiftbuf(11)=0 MoveBlock(shiftbuf,gfxbuf+offset*11,11) FOR i=1 TO :p}bits DO shift(shiftbuf) OD IF over='Y THEN overlay(screen+offset*40+xpos+40*ypos,shiftbuf,12) ELSE :q} MoveBlock(screen+offset*40+xpos+40*ypos,shiftbuf,12) FI ELSE IF over='Y THEN overlay(screen+offset*40+xpos+40:r}*ypos,gfxbuf+offset*11,11) ELSE MoveBlock(screen+offset*40+xpos+40*ypos,gfxbuf+offset*11,11) FI FI ODGetD(7) :s};wait for keypressRETURN(stat);************************************PROC loadpic(BYTE ARRAY name)showscreen(clear)Close(3:t})Open(3,name,4,0)BGet(3,screen,7680)Close(3)picflag=1GetD(7)RETURN;************************************CARD FUNC get_:u}directory_sector()BYTE xCARD index FOR index=362 TO 393 ;start DO ;reading GetSec(1,dirbuf,index) :v};directory file=dirbuf FOR x=1 TO 4 ;search name field DO ;of each sector IF file.n0=0 ;for a zero:w} THEN RETURN(index) FI file==+32 OD ODRETURN(0) ;directory full;************************************BYTE FUNC s:x}ec_stat(CARD sector)BYTE status ;return sector statusBYTE POINTER memmem=vtoc+(sector RSH 3)status=mask(sector&7) AND mem:y}^ IF status#free THEN status=taken FIRETURN(status);************************************CARD FUNC free_sectors()CARD se:z}ctors, xsectors=0FOR x=1 TO 720DO IF sec_stat(x)=free THEN sectors==+1 FIODRETURN(sectors);*************************:{}***********PROC take_sector(CARD sector)BYTE POINTER memmem=vtoc+(sector RSH 3)mem^=mask(sector&7) OR mem^RETURN;******:|}******************************CARD FUNC next_free_sector()CARD numFOR num=1 TO 721DO IF sec_stat(num) is free THEN EXIT:}} FIOD IF num=721 THEN num=0 FIRETURN(num);************************************PROC saveps() ;save in print shopBY:~}TE x, status ;formatCARD mem, firstsec, sector, sector_link, dirsecBYTE ARRAY secbuf(128), psname(20)ramtop=lotopGr:}aphics(0) nobreak()IF picflag THEN IF data_disk()=pdisk THEN x=filename(0) SCopyS(psname,filename,3,x) psname(0)=x-2 :}Position(15,8) Print("Print Shop Save") Position(8,10) Print("Insert Print Shop Data Disk") Position(8,12) Print("Enter fil:}ename or .") Position(8,14) Print(psname) Position(8,14) Print("") InputS(psname);this is the start of the save :};routine;************************************;check vtoc and make sure there are;at least 61 available sectors GetSec(1:},vtocsec,361) ;read vtoc IF free_sectors()<61 THEN ercheck(162) ;disk full RETURN FI ;******************************:}******;find first free entry in ps directory dirsec=get_directory_sector() IF dirsec=0 THEN ercheck(169) ; directory:} full FI;************************************ showscreen(intact);this is the main loop to write;the data sectors and V:}TOC mem=screen firstsec=next_free_sector() ;first FOR x=1 TO 61 ;sector DO sector=next_free_sector() :};main MoveBlock(secbuf,mem,126) ;loop take_sector(sector) sector_link=next_free_sector() PokeC(secbuf+126,sector:}_link)status=PutSec(1,secbuf,sector) IF status#1 THEN ercheck(status) RETURN FI mem==+126 OD:} vtocsec(16)=$E0status=PutSec(1,vtocsec,361) ;write VTOC IF status#1 THEN ercheck(status) RETURN FI;**:}**********************************;enter filename into directory SetBlock(file,16,32) ;fill with spaces file.PA=$4150 x=p:}sname(0) MoveBlock(file,psname+1,x) file.startsec=firstsec file.bytes=7680status=PutSec(1,dirbuf,dirsec) IF status#:}1 THEN ercheck(status) RETURN FI;************************************ ELSE promptps() FIELSEPut(253:})Position(8,10) Print("No Picture in Memory!")Position(11,12) Print("Press any key")GetD(7)FIRETURN;*******************:}*****************PROC savepic()BYTE statramtop=lotopGraphics(0) nobreak()IF picflagTHEN IF data_disk()=adisk THEN P:}osition(15,8) Print("Save Screen") Position(8,10) Print("Insert disk with Atari DOS") Position(8,12) Print("Enter filename :}or .") Position(8,14) Print(filename) Position(8,14) Print("") InputS(filename) showscreen(intact) Close(2) ;just:} in case Open(2,filename,8,0) stat=BPut(2,screen,7680) IF stat#136 THEN ercheck(stat) FI Close(2) ELSE promptpic() FI:} ELSE Put(253) Position(8,10) Print("No Picture in Memory!") Position(11,12) Print("Press any key") GetD(7)FI:}RETURN;************************************PROC main()BYTE choice, statCARD start, optioninit()DO choice=menu() IF c:}hoice='1 THEN start=psdir() ;get first sector IF start#0 THEN IF file.bytes<641 THEN option=getcoord() :} gfxload(start,option);load graphic ELSE loadps(start);load picture FI FI ELSEIF choice='2 THEN f:}ilename=dir() ;get file name IF filename(14)#'O AND filename(1)='D THEN loadpic(filename) FI ELSEIF choice=:}'3 THEN saveps() ELSEIF choice='4 THEN savepic() FI ODRETURN:}8J