O0 Bitzp - Disk formatted with Bitzcopy. ---Parameters--- 2 sides DD 9 sectors 80 tracks - Code: Pierrot Van Malderen. - (c) Bitz 1992 -0O /@`! #@%`')+-/1 3@5`79;=?A C@E`GIKMOQ S@U`W[]_a c@e`gikmoq s@uy{} @` o @ @ ` @ ` ǀ @ ` ׀  @` @`!Aa   /a/#A%a')+-/1!3A5a79;=?A!CAEaGIMOQ!SAUaWY[]_a!cAeagikmoq!sAuawy{}!Aa!Aa!Aa!Aa!AaǁQO /@`! #@%`')+-/1 3@5`79;=?A C@E`GIKMOQ S@U`W[]_a c@e`gikmoq s@uy{} @` o @ @ ` @ ` ǀ @ ` ׀  @` @`!Aa   /a/#A%a')+-/1!3A5a79;=?A!CAEaGIMOQ!SAUaWY[]_a!cAeagikmoq!sAuawy{}!Aa!Aa!Aa!Aa!AaǁQMADMAC 1  9WMANUEL DOC /MADMAC 2  rWSID_PLUS  WS .  :W.. BUG PRG I CLS PRG L7D BAT NEDIT PRG PFONT FNT T hKILL BAT VM PRG YMAC PRG aMAD BAT iYgME TTP mZlRESET PRG rvNSID TOS vwpVIR PRG {"`` 0 B?< NA\#X9` gt g8A| #A2 #p3L0<3P3 `6A #Aj #p3L0<3P3 G`A`#L#P xV#\C!I/9X?< NA\?</<?<1NA 9@ м,@ @$yP&yLNSyVfR#P#L3VyTf4#`L#`P09| @Nop33T/ y\gN,_9 l @ 9lC` NpNNuC`p"PQ Np"&*ʁ PQp"PQNu PQNuC`p""Q Np"&:(AC1E:(AC1EHAHC:AC0:(AC1EQp"hhHAPhQNu !YQNuC`p"""" Q Np"&:(AC1E:( AC1E :( AC1E :(AC1EBABC,.HAHC*ʁ *(ʁ!EQp"hh h hHAPhhhQNu !Y!Y!Y QNu @p h0`0xx ppx9vy<>no}<<31aa @p 7 `00`p @``vxx 0px|x8|l69vy< ><>>&??? ? ??DEBUTANC_PILEXOK_INITOK_MOY^AFFBAS|MODIF0EFFABAS2MODIF3MODIF1JMODIF2NMODIF01AFFMOYEFFAMOYjDES_PANE`DES_MASK`PT_DES_MLPT_DES_PPROUT_VBL\ROUTINEFIN_PROG`COMPTEURAFFMONOTEMPOVETIQ2dDECALETNOT_RECOVSORT_GESvSAUT4SAUT1EFFA_BUF`EFFAMONOSAUVMONORBOUCLE0RBOUCLE1SAUVMOYMBOUCLE0 MBOUCLE1LSAUVBASBBOUCLE0BBOUCLE1     6* N&` /<?< NA\OBgNAJE mfpGEMDOSPlowtpaPhitpaPtbasePtlen PdbasePdlenPbbasePblenPxdta Pparent$DTA_attrDTA_timeDTA_dateDTA_sizeDTA_name.Clscls sid %1.prg `6  ,|2B90/<?< NA\O?<?<NAXOJ@g|gj| g^<gR90 90bV??<NAXO` 90m>S90<?<?<NAXO?< ?<NAXO?<?<NAXO`a`haBgNAJ?<?<NAXO`j/<?< NA\O?<?<NAXO?<p?<NAXOB/<2?< NA\O?<?<NAXO?<q?<NAXO?< ?<NAXO?< ?<NAXONu * Chaine entree: @mfpGEMDOSPlowtpaPhitpaPtbasePtlen PdbasePdlenPbbasePblenPxdta Pparent$DTA_attrDTA_timeDTA_dateDTA_sizeDTA_nameMaxTxtBCKSPCDebTxtBuf2PromptWaitKeyAbortEnterBackspacZBipReprintEntree0N( FontDat: dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.b 0,0,24,24,24,24,24,24,24,24,0,0,24,24,0,0 dc.b 0,0,102,102,102,102,102,102,0,0,0,0,0,0,0,0 dc.b 0,0,102,102,255,255,102,102,255,255,102,102,0,0,0,0 dc.b 24,24,62,126,96,96,124,62,6,6,126,124,24,24,0,0 dc.b 0,0,102,102,108,12,24,24,48,54,102,102,0,0,0,0 dc.b 56,124,108,108,56,56,112,112,222,222,204,204,254,118,0,0 dc.b 0,0,24,24,24,24,24,24,0,0,0,0,0,0,0,0 dc.b 0,0,6,12,28,24,24,24,24,24,24,28,12,6,0,0 dc.b 0,0,96,48,56,24,24,24,24,24,24,56,48,96,0,0 dc.b 0,0,102,102,60,60,255,255,60,60,102,102,0,0,0,0 dc.b 0,0,0,24,24,24,126,126,24,24,24,0,0,0,0,0 dc.b 0,0,0,0,0,0,0,0,0,0,24,24,24,24,48,32 dc.b 0,0,0,0,0,0,126,126,0,0,0,0,0,0,0,0 dc.b 0,0,0,0,0,0,0,0,0,0,24,24,24,24,0,0 dc.b 0,0,6,6,6,12,12,24,24,48,48,96,96,96,0,0 dc.b 0,0,60,126,102,102,102,110,118,102,102,102,126,60,0,0 dc.b 0,0,24,24,56,56,24,24,24,24,24,24,126,126,0,0 dc.b 0,0,60,126,102,102,12,12,24,24,48,48,126,126,0,0 dc.b 0,0,126,126,12,12,24,24,12,12,102,102,126,60,0,0 dc.b 0,0,12,12,28,28,60,60,108,108,126,126,12,12,0,0 dc.b 0,0,126,126,96,96,124,126,6,6,6,102,126,60,0,0 dc.b 0,0,28,60,112,96,96,124,126,102,102,102,126,60,0,0 dc.b 0,0,126,126,6,6,12,12,24,24,48,48,48,48,0,0 dc.b 0,0,60,126,102,102,60,60,102,102,102,102,126,60,0,0 dc.b 0,0,60,126,102,102,126,62,6,6,6,14,60,56,0,0 dc.b 0,0,0,0,24,24,24,24,0,0,24,24,24,24,0,0 dc.b 0,0,0,0,24,24,24,24,0,0,24,24,24,24,48,32 dc.b 0,0,0,14,28,56,112,224,112,56,28,14,0,0,0,0 dc.b 0,0,0,0,126,126,0,0,126,126,0,0,0,0,0,0 dc.b 0,0,0,224,112,56,28,14,28,56,112,224,0,0,0,0 dc.b 0,0,60,126,102,102,12,12,24,24,24,0,24,24,0,0 dc.b 0,0,56,124,230,194,218,214,214,220,192,226,126,60,0,0 dc.b 0,0,24,60,126,102,102,102,126,126,102,102,102,102,0,0 dc.b 0,0,124,126,102,102,126,124,102,102,102,102,126,124,0,0 dc.b 0,0,60,126,102,102,96,96,96,96,102,102,126,60,0,0 dc.b 0,0,120,124,110,102,102,102,102,102,102,110,124,120,0,0 dc.b 0,0,126,126,96,96,124,124,96,96,96,96,126,126,0,0 dc.b 0,0,126,126,96,96,124,124,96,96,96,96,96,96,0,0 dc.b 0,0,62,126,96,96,110,110,102,102,102,102,126,60,0,0 dc.b 0,0,102,102,102,102,126,126,102,102,102,102,102,102,0,0 dc.b 0,0,126,126,24,24,24,24,24,24,24,24,126,126,0,0 dc.b 0,0,6,6,6,6,6,6,6,6,102,102,126,60,0,0 dc.b 0,0,204,204,216,216,240,240,216,216,204,204,198,198,0,0 dc.b 0,0,96,96,96,96,96,96,96,96,96,96,126,126,0,0 dc.b 0,0,198,198,238,238,254,214,214,198,198,198,198,198,0,0 dc.b 0,0,102,102,102,118,118,126,126,110,110,102,102,102,0,0 dc.b 0,0,60,126,102,102,102,102,102,102,102,102,126,60,0,0 dc.b 0,0,124,126,102,102,102,102,126,124,96,96,96,96,0,0 dc.b 0,0,60,126,102,102,102,102,102,102,102,106,124,54,0,0 dc.b 0,0,248,252,204,204,204,252,248,216,204,204,198,198,0,0 dc.b 0,0,62,126,96,96,112,56,28,14,6,6,126,124,0,0 dc.b 0,0,126,126,24,24,24,24,24,24,24,24,24,24,0,0 dc.b 0,0,102,102,102,102,102,102,102,102,102,102,126,60,0,0 dc.b 0,0,102,102,102,102,102,102,102,102,60,60,24,24,0,0 dc.b 0,0,198,198,198,198,198,214,214,254,254,238,198,130,0,0 dc.b 0,0,102,102,102,60,60,24,24,60,60,102,102,102,0,0 dc.b 0,0,102,102,102,102,60,60,24,24,24,24,24,24,0,0 dc.b 0,0,126,126,12,12,24,24,48,48,96,96,126,126,0,0 dc.b 0,0,30,30,24,24,24,24,24,24,24,24,30,30,0,0 dc.b 0,0,96,96,96,48,48,24,24,12,12,6,6,6,0,0 dc.b 0,0,120,120,24,24,24,24,24,24,24,24,120,120,0,0 dc.b 0,16,16,56,56,108,108,198,198,0,0,0,0,0,0,0 dc.b 0,0,0,0,0,0,0,0,0,0,0,0,254,254,0,0 dc.b 64,96,112,56,28,12,4,0,0,0,0,0,0,0,0,0 dc.b 0,0,0,0,0,60,62,6,62,126,102,102,126,62,0,0 dc.b 0,0,96,96,96,124,126,102,102,102,102,102,126,124,0,0 dc.b 0,0,0,0,0,60,124,96,96,96,96,96,126,62,0,0 dc.b 0,0,6,6,6,62,126,102,102,102,102,102,126,62,0,0 dc.b 0,0,0,0,0,60,126,102,102,126,96,96,126,62,0,0 dc.b 0,0,14,30,24,24,126,126,24,24,24,24,24,24,0,0 dc.b 0,0,0,0,0,62,126,102,102,102,102,126,62,6,126,124 dc.b 0,0,96,96,96,124,126,102,102,102,102,102,102,102,0,0 dc.b 0,0,24,24,0,56,56,24,24,24,24,24,60,60,0,0 dc.b 0,0,12,12,0,12,12,12,12,12,12,12,12,12,124,120 dc.b 0,0,192,192,192,204,220,248,240,248,216,204,206,198,0,0 dc.b 0,0,56,56,24,24,24,24,24,24,24,24,60,60,0,0 dc.b 0,0,0,0,0,108,254,254,214,214,214,198,198,198,0,0 dc.b 0,0,0,0,0,60,126,102,102,102,102,102,102,102,0,0 dc.b 0,0,0,0,0,60,126,102,102,102,102,102,126,60,0,0 dc.b 0,0,0,0,0,124,126,102,102,102,102,102,126,124,96,96 dc.b 0,0,0,0,0,62,126,102,102,102,102,102,126,62,6,6 dc.b 0,0,0,0,0,124,126,102,96,96,96,96,96,96,0,0 dc.b 0,0,0,0,0,62,126,96,112,60,14,6,126,124,0,0 dc.b 0,0,0,24,24,126,126,24,24,24,24,24,30,14,0,0 dc.b 0,0,0,0,0,102,102,102,102,102,102,102,126,62,0,0 dc.b 0,0,0,0,0,102,102,102,102,102,60,60,24,24,0,0 dc.b 0,0,0,0,0,198,198,214,214,254,254,238,198,130,0,0 dc.b 0,0,0,0,0,102,102,60,60,24,60,60,102,102,0,0 dc.b 0,0,0,0,0,102,102,102,102,102,102,126,62,6,126,124 dc.b 0,0,0,0,0,126,126,12,24,24,48,48,126,126,0,0 dc.b 0,14,24,24,24,24,56,240,240,56,24,24,24,24,14,0 dc.b 0,24,24,24,24,24,24,24,24,24,24,24,24,24,24,0 dc.b 0,224,48,48,48,48,56,30,30,56,48,48,48,48,224,0 dc.b 0,0,0,0,0,98,242,190,156,0,0,0,0,0,0,0 dc.b 0,0,0,0,0,24,24,60,36,102,66,195,255,0,0,0 del %1.* del s\%1.s `B?< NA\O/?< LNA\O f f/+Nu/<L?< NA\O?<?<LNAJMADMAC not installed; use "MADMAC -Q" to install it 4\`F% oJg.y# (Ш#pB0"HrtM`$JrtM I`HzHW?NBgNAJg4< g< gRBJAkS/XAg< g< fJAkB(`N 9$"/gRԁ"m#NupNu#Nu XXXX-123456789**XXXX-123456789**NVBy)>N0 no. X?.SWaNZN^NuNVH*|J./<iNX./</<ɨNP3).N|8.8?< NT> NK8.9H|`0SFJ@fBBGK8`vHHм L @(gR`Z|dm.N`z0G!MRG`RJgHHм L @(gHHм L @(gBJfJGgN-@.?aTJy3g, y3o.`.?93/<N\N-@/< /</.NP/NP./</.NP/?9+ м8мr / 9)мr //</8N.8N`:JL N^NuNVH B+B) B(B(32jB(By+By(By3By)By)By(By(By(By2l3)(By.\By(By)3)BWN0NvNN"VN.N~N hN_~N,NBG`$ n 2G p -fp n 2G p(H`> n 2G pJ(g n 2H 0T#(`0RG0nm.&NRy3` 0G #(` n 2H 0T#(` n 2H 0T#) 3)3)Ry3` n 2H.TN3 y  l.=NRy3`p`jJ+f #+BW/<RNX<.W?NxTN `, n 2H 0T#(`32l3(`N3(`0G *PT` =fB-`Jf n 2G pJ(f.^NRy3` n 2H.TN(@ f"BWBg n 2H/0TN\(@B9| Jg.N)@`B`> n 2G p(H`nBy(`|3( n 2G p(H`3)`"` .pN`J@g|Ugܰ|ug``..ʆNRy3``H |2rW hN` n 2G p(H`,3(`43(`*.ʫNRy3``J@gа|Sg԰|sg``H3(`>`< n 2H./<ʽNXRy3``H |brW hpN`J+f0G #+ n 2H./NXBW/</N|PBW/NX<JFl./<NXRy3`.?NxTN RGnmN0>az>ar>ajJ(f\J+f #+.+/NX>Jy(g/<`/</N|PA#(N3NJy3fzBW/9(NX<l .(aJy(g.Jy(g <` <*@.(/ /<NP>N>N,Jy3g .(NJy)g&Jy(g .NN>(N,Jy(g >2jN,093JL0N^NuNV./<2NX>NZN^NuNV>N/NNBN0N^NuNVH >. *n(y( f.GNp(@ fB@`.` Jg ;f0SGJ@fJfB@``Jg ;fBpJL0N^NuNVBy#,LB##ByN^NuNVHBnN||ff.Jy)g JngNb y,LJg .]N`Jy)g6JngNbJyg>-` 9,JH>N=|By)~BB(B-y.^#$,F y.^ egX y.^ cg.N`: y.^ (<|=g|gg |Sg|Rf y.^-h=F .^`|:g|hfX y.^-h y.^ (=@ .^Jy2lg,Bn y.^ cf y.^ :f =|` y.^ eg y.^ c@X.^Dg.N`\ y.^*P-MX.^./<͠/<X/<P/ N.>=| y.^ Wf=|X.^`6 y.^ Lf=|X.^` y.^ Bf =|X.^|mN|lF0`(a`aZ`a`Jyf.///<)N" J@fb0.|f.\N`H y.^ ,@X.^Dg.N` Jg`JyfJg .NN_`JyfJg .NNd`JyfJg .NNeJ`Jyf .N``|| b@0@ PNJyflJgRBF n .f<93>Bg/.N\-@JfD>Bg/.N\-@ nBh ngfJFg.N` n1|@ `0 n0( |g" nSg n./<N X` nRf*.N!bJ@m0.-@=|`0.///<)N" J@fb0.|f.\N`H0.|"nԁi n!nJy)g .N,a `JgBF n .f<93>Bg/.N\-@Jf>Bg/.N\-@ nBh `$ n0( |g./<N X` n!y$09)|"nԁi #(JFfRy3 nhfJFg.N`R nh@ Jy2lgJnfN|g0Jy.\gJJGm|m@.ߺ/<*/</</.N.>|m>W0N`JGl@BW?</.N\-@g>/.NbX`./<N X`|l?.0G"|b pNT`x93g.N`^9$gN9 9(2dBN0|0|мd-@ n0|g?. n?( n hNX`>NJ@m y.^ eg .N0y+-P0y+-P nf$ y+g y+f.N`x n02.Ag8 n (g* n (g?. n?( n hNX`2 n0( мd-@`JL N^NuNV y.^ eg ./NN^NuNVH*y f.Nf*@`#*,L#,LJyfP./U/]/<)N" J@f20.|f.\N`JgB@`p3;yJL N^NuNVH*y,LJf.y(`4y(`*y(` ` D`|g԰|gа|g԰|g` y.^ )@X.^Df ``6 y.^ [f` ` ..b/<$/<$/<.jN" J@gp` y.^ ,@X.^Df y.^ el y.^ b^ y.^ 3(X.^ y.^ ,f30+` `& y.^ )f3(+X.^``` 0`\ y.^ fJX.^ y.^ ,f3;+``& y.^ )f3:+X.^`T`````D y.^ -fl y.^ (f\ y.^ eL y.^ b< y.^ ) f,3 + y.^ (3(.^` y.^ f3H+X.^`` y.^ f3G+X.^`` y.^ f3F+X.^`b`^..b/<$/<$/<.jN" J@gp` y.^ WfX.^38+``b y.^ (gT39+09$||f 9$мd38+ y.^ LfX.^39+`X.^ y.^ eT y.^ bF y.^ 3(X.^ y.^ )f3(+X.^`P30+``> y.^ f0X.^ y.^ )f3:+X.^`3;+`D`32Jng y.^ ,gp`X.^ y.^ e2 y.^ b$By+ y.^ 3(X.^` y.^ e4 y.^ b&3+ y.^ 3(X.^` y.^ #f@X.^..f/<$/<$/<0jN" J@gp`3<+` y.^ (f8X.^ y.^ ev y.^ bf y.^ 3(X.^ y.^ )f0X.^ y.^ +fX.^3+`3+`30+`"` y.^ ffX.^3;+B$3$ y.^ ,@X.^Df y.^ e y.^ b y.^ 3$X.^ y.^ `$X.^By(`*3(X.^``N`|Bg|Lgް|Wg` y.^ *fX.^ y.^ a@X.^Df y.^ b y.^ X.^`&`>y(`4y(`*y(` ``|g԰|gа|g԰|g` y.^ )@X.^Df`~`6 y.^ [f`` ..f/<$/<$/<0jN" J@gp`\ y.^ ,@X.^Df( y.^ el y.^ b^ y.^ 3(X.^ y.^ ,f30+` `& y.^ )f3(+X.^````\ y.^ fJX.^ y.^ ,f3;+``& y.^ )f3:+X.^`R``X``R`B y.^ -fl y.^ (f\ y.^ eL y.^ b< y.^ ) f,3 + y.^ (3(.^` y.^ f3H+X.^`` y.^ f3G+X.^`` y.^ f3F+X.^```\..f/<$/<$/<0jN" J@gp`T y.^ WfX.^38+``b y.^ (gT39+09$||f 9$мd38+ y.^ LfX.^39+`X.^ y.^ eT y.^ bF y.^ 3(X.^ y.^ )f3(+X.^`N30+``> y.^ f0X.^ y.^ )f3:+X.^`3;+`D` 32p`.N` .NN^NuNVHBG y.^ e& y.^ b y.^ <X.^`` y.^ -f^X.^ y.^ e& y.^ b y.^ :X.^`.N`RFl.N`@F`BE`0F`0@RF0SEJ@l y.^ /f X.^`* n0B@JLN^NuNVHBG` 0GBRG|mBG*|`JfRG`0HHҼ"AR fJL N^NuNVH*n# y.^ ag y.^ cf0 y.^ h l y.^ afH y aX y.^ ("n ""y"X n0Jg nB` y.^&hBG .f>93>Bg/ N\(@ f>Bg/ N\(@l y cX y X0, |g n ` n B0, |"n20, ||@f Jg n P.^ y EXB@`4a`& y.^.X.^a6J@gp`$ y X y.^ P lB@JLN^NuNVH y.^ P"<0H> y.^ -g|f8 y.^,X.^aJ@gp`漼-f|n y X`Ⱦ|f y.^ X.^` y aXN/ y X`| y aXN/ y X`P y.^ c@X.^Dg.nN`0 y.^-PX.^BW?</.N\JfBn`=| y aX0."y"X`=|`=| y.^ c@X.^Dg.nN` y.^-PX.^Bn n .f=y3>Bg/.N\-@g n0( 2.Ag=|`Bn y aX0."y"X` y.^ cg y.^ bg.~N` y.^-hP.^ y.^ ,@X.^Dg.N` y.^ cg y.^ bg.~N` y.^-hP.^./.NXJ@gB@`p=@ y aX0."y"X``|p| b@0@ PN`a`B@JLN^NuNVH y.^ X.^` y aX y"y.^ X.^X` y.^*PX.^BG .f>93>Bg/ N\(@ f>Bg/ N\(@ y cX y X`\ y aX y.^.a/ y X.^X`$aJ@gp` y.^ )@X.^Dg.N``aHJ@gp` y.^ ]@X.^Dg.N`` y AX y $X09)|"y"X`j y AX y ,FX09)|"y"X`&./N``H |rW hNB@JL0N^NuNVH(|L*|LB`. n X` n&PXk 0+ |f4+ f nBP n BB@` Jg.PN` -K0+ |gX(`XBT0+ |:`X n(XT:`X n(XT n :X`xYU ,є0|f:`0-|g.PN`z`BYU ,>|JGf:`*0-|g 0-2Af.PN`8`U`0|g .PN D(:`0|g .PNJgB@`p(:`0|g .PN F(:`UY0|2-|Ag .PN: cB@`p(`NUY0|2-|Ag .PN: dB@`p(`UY0|2-|Ag .PN: bB@`p(`UY0|2-|Ag .PN: eB@`p(`UY0|2-|Ag .PN: fB@`p(`NUY0|2-|Ag .PN: gB@`p(`0|f0%|g .PN: n (`Y/,/NdP(`YJf.>N`/,/NP(`YJf.MN`/,/NP(`\Y", (`NY", (`@Y ,`6Y ,`,Y ,`">N`H |rW h N`H |brW h8N n EfJgUJg n n0 n B@JL8N^NuNVH*nB`H|RJf JL N^NuNVHBG` BW?aTTRG|m>BgaBT>?<a6T>?<a*T>?<aT>?<aT>aHJLN^NuNVH0.*@#0: BB+@+@ B+@+@JL N^NuNVH ngB@`p3.\3)0.*@#033#$# ,B#$(y,B g"# (#2 ,й2#.X`B#2#((y$ g"# (#( ,й(#2`B#(#(JL0N^NuNVH 09)*@#0:3+y$J,Bg y,B!y2J$g y$!y(JL0N^NuNVH ..93fJf~ 9(2cd.<09)(@#0.Nf*@J,Bf B)M`+y,B y,B y,B!y2+y$B +@ #(B+@#2A+H #.X )@ #,BJL0N^NuNVH n cf n Ef~`Pn B`( Ю @ ag Ю @ cfRR Ю @ EfR.޼ 9(Ɛ(c09)(@#0.Nf*@J$f B)M`+y$ y$ y$!y(B <+@ #(B+@#(A+H #2 )@#$ y20T2 y2 X2 y20(T2 y20)T2. g2 "y22T2` y2"n XX2 SJf` y2"n X2߹(JL0N^NuNVHJy(gNt>a>a>a JLN^NuNVH 0.м#0-@ n-hJg n-hJg nf n"n!i  n-h n*h` n>T n-PX n3(T n3)TB n (b n ("n")ЁbP n-h`. n (b n ("n")Ёb n-PJfJf >N n(h ."n")g^ n=PT.///.N) J@g0.Ѯ`0.Ѯ`D n-PX n=h 0.|g n-h`B0.||@f-n0.|=@0.|fJf.\N`,g0.|gX0.ڰnf .쑮`Jng.N`Jy(g$g .мd .N` y(f .쑮Bnn0|`z0.|f.N`U .мd^Jf.N`TR .H`8R0.|f.N`*Jng.N`g .мdg .мd` d .H`0.|f,g><`BG.?Bg/.?.N `LJngBBg?./.?.N g .мlH` .谼d8 ng .H .H` .H .H`0.|f .?<Bg/.?.N `$JngB?<?./.?.N .rH .rH .H .H`0.|f.1N`| ed bZ .H`F .R .мd, .H` >N`|b@0@^ PN` .JNb8 n-PJfJL0N^NuNVH N0.м#0 @*h`-m(n` n>T n,0| @"<0H܀XX f0| @"<~0H`6g n>T0Ѯ`Xbz*U f`B@JL0N^NuNV.^NN^NuNVB/U/./<)N" J@lp`20.|f.\N`0.|g.TN`B@N^NuNV y)g>93gR$` y.XBR.XR$R2J(g y(RN^NuNVH*|v y.^ cg .N`J y.^/( nNXJ@f4P.^ y.^ eg y.^ ,g .N`X.^`JL N^NuNVH y.^ bfX.^ y.^*P`Z y.^ cflBF`b.N4>JGo$0GSH (\g./NXX./NXXBW/NX>l0RF.?/<N \J@f./<N X` .?NxTJL0N^NuNV`@0.|f.N`NJf. N`: y.^ ,f&X.^B/U/]/<)N" J@gNN^NuNVJy.\g. JN` .N/NN^NuNVJy.\g. JN` y)gN0>N/NN^NuNVJy.\g. JN` y)gN0>N/NN^NuNVH>. y)g6Jy2lf93f.3N`|g9$ga.Ya,J@f93f y)fL.N,0//.NdP-@ .ѹ$ y)f .ѹ.X3)`B?<B?/.a NJLN^NuNVH>.93g.MN` y)g|g9$ga|f y.^ bf y.^ ,g y.^ eff y.^.N4( 9(2c.N0| y.^*h` y.XR.XR$R2RJfP.^`B/U/]/<)N" J@f<.|:.| 9(2d .N0|0`JEf4.)/9$?< N1T\ y.XBR.XR$R2`VJFg.oN` .мe.HN`v .H"y.XR.XR$R2`4JEfD.)/9$?< N1T\ y.XBR.X y.XBR.XT$T2`JFgBBg?/9$?9)N .мm.HN` y)g8 .H"y.XR.X .H"y.XR.XT$T2`6 .H"y.XR.X .H"y.XR.XT$T2`,Jy.\g. JN`2JEf`.)/9$?<N1T\ y.XBR.X y.XBR.X y.XBR.X y.XBR.XX$X2`JFg B?<?/9$?9)N .rH"y.XR.X .rH"y.XR.X .H"y.XR.X .H"y.XR.XX$X2`"` |gV|g|g|g y.^ ,f X.^`0NJL N^NuNVJy.\g. JN`69$g,93f y.XBR.XR$R2`R$N^NuNV93g.N`.YaJ@f y.^ ,@X.^Dg.N`dB//Q/<)N" J@m@ y)g ng9$ga.)?./.?./.aD N^NuNVH>.93g.N` y.^ #f>X.^.Ya(J@f y.^ ,@X.^Dg.N``-|B//Q/<)N" J@m y.^ X.^`|`(|`$|` <Y.^``|Bg|Lg|Wg`.)?./.?/.aF y.^ ``*X.^`.N``|,g|eg``JLN^NuNVH..<.|:.|` 9(2d .N0|0. `JEf2./9$?< N1T\ y.XBR.XR$R2`RJFg.N`n мe.HN`N H"y.XR.XR$R2`JEfB./9$?< N1T\ y.XBR.X y.XBR.XT$T2`JFgBBg?/9$?9)N <Їe.HN` y)g4 H"y.XR.X H"y.XR.XT$T2`2 H"y.XR.X H"y.XR.XT$T2`"Jy.\g. JN`JEf^./9$?<N1T\ y.XBR.X y.XBR.X y.XBR.X y.XBR.XX$X2`JFg B?<?/9$?9)N rH"y.XR.X rH"y.XR.X H"y.XR.X H"y.XR.XX$X2`"` |gr|g|g|g .SJf$JLN^NuNVH Jy.\g. JN` y.^ cg.N` y.^(hP.^ .f.N`BWBg/ N\*@ fBWBg/ N\*@`0- |g.N`D;|` y.^ ,@X.^Dg.N`.]aTJ@f +nNJL0N^NuNVJy)gRy)N^NuNVJy)gSy)N^NuNVN0>N/NN^NuNVH y.^ #f*X.^.YaJ@f| y.^ ,fX.^`-| y.^ cf y.^(h .f>93`BG>Bg/ N\*@ f>Bg/ N\*@Bm `0- |g./<N X`;| +nP.^ y.^ ` TX.^`|Bg|Lg|WgT` y.^ e@ y.^ b2.]N!bJ@m~BF`.gX|@RFDm`B y.^ `"TTX.^`(`>.9N`0`H |&rW hN y.^ ,fX.^`JL0N^NuNV.K@aN^NuNVHBW?</.N\*@ g|B@JL N^NuNV.nNN^NuNV.NN^NuNV0.H|"y.XR.X0.|"y.XR.XT$T2N^NuNVH>.<|g0.  @ 0@g,g0y(0@`0y(0@g`09+y(@0H|"y.XR.X0|"y.XR.XT$T2g > Nfd> Nn`^09+y(@0H|"y.XR.X0|"y.XR.XT$T2> Nfdg > NnJLN^NuNVH>.<. gSG0 @ 0@0y("<00y(@0H|"y.XR.X0|"y.XR.XT$T2JLN^NuNVH>.<. 0 @"<.002y(2Ay+y(@0H|"y.XR.X0|"y.XR.XT$T2>NfdJLN^NuNVH>.<. g0 @ 0@g0y(0@|y(0H|"y.XR.X0|"y.XR.XT$T2JLN^NuNVH>.<. 0H|"y.XR.X0|"y.XR.XT$T2>NfdJLN^NuNVH>.<. 0H|"y.XR.X0|"y.XR.XT$T2>NfdJLN^NuNVH>.<. 0y("<002"A 2Ay(@0H|"y.XR.X0|"y.XR.XT$T2JLN^NuNVH>.<. 0 @"< 00y(@09$|gf $c.HN` 9$r 㨎@0H|"y.XR.X0|"y.XR.XT$T2`L..j/9$BgN1T\0H|"y.XR.X0|"y.XR.XT$T2JLN^NuNVH>.<. Jy+f0|g.XN``0|g.XN`09+y(@ y<+fB0H|"y.XR.X0|"y.XR.XT$T2>Nfd`H0y(0@0H|"y.XR.X0|"y.XR.XT$T2>NnJLN^NuNVH>.<. y(0H|"y.XR.X0|"y.XR.XT$T209$|g09$|y)g.TN`*9$$ <Ѕc.HN`t H"y.XR.X H"y.XR.XT$T2`@.0j/9$?<N1T\ y.XBR.X y.XBR.XT$T2JLN^NuNVH>.<. Jy+f Jy+fz@`< y+f y+fzH`$ y+f:9(3((3(:<0y("<00y(E@0H|"y.XR.X0|"y.XR.XT$T2JLN^NuNVH>.<. y(0H|"y.XR.X0|"y.XR.XT$T2>NnJLN^NuNVH>.<. |fF y<+fNfd y(+m>NnJLN^NuNVH>.<. yF+fy(`y(0H|"y.XR.X0|"y.XR.XT$T2JLN^NuNVH>.<. 09$|f"..j/9$R?< N1T\B$`" 9$мe.HN`^0y("<00"9$¼@0H|"y.XR.X0|"y.XR.XT$T2JLN^NuNVH>.<. |f|@Jy+f0y("<00y(@0H|"y.XR.X0|"y.XR.XT$T2 y+f* y.XBR.X y.XBR.XT$T2`>Nn`0y("<00y(@0H|"y.XR.X0|"y.XR.XT$T2 y+f* y.XBR.X y.XBR.XT$T2`>NfdJLN^NuNVH>.<. 09$|g09$|y)g.TN`*9$ 9$T|fJgX мdH @0H|"y.XR.X0|"y.XR.XT$T2``` <Ѕc.HN`<0H|"y.XR.X0|"y.XR.XT$T2 H"y.XR.X H"y.XR.XT$T2`м|fd мe.HN` @0H|"y.XR.X0|"y.XR.XT$T2` <Ѕe.HN`F0H|"y.XR.X0|"y.XR.XT$T2 H"y.XR.X H"y.XR.XT$T2``|f||fR..j/9$?<N1T\0H|"y.XR.X0|"y.XR.XT$T2`x`v0H|"y.XR.X0|"y.XR.XT$T2..j/9$?<@N1T\ y.XBR.X y.XBR.XT$T2JLN^NuNVH>.<. 0 @"< 00y+y(@09$|gn $bJ$f.HN` 9$r 㨎@0H|"y.XR.X0|"y.XR.XT$T2`L..j/9$BgN1T\0H|"y.XR.X0|"y.XR.XT$T2>NnJLN^NuNVH>.<. 09$|gv09$|g.LN`f $e.HN`L 9$@0H|"y.XR.X0|"y.XR.XT$T2` .\NJLN^NuNVH>.. g.N`t n f|@ y.^ #f NfdJLN^NuNVH>.<. 0y("<002"A.2Ay(@0H|"y.XR.X0|"y.XR.XT$T2JLN^NuNVB3B#,N^NuNV y.^ c@X.^Dg.N` y.^-PX.^BW?</.N\Jg.N`./<͠/<X/<P/.N.J@m.)N`tBW?</.N\-@# nB n1y Ry y.^ egB.`N:"NB.`/<aaXN^NuNVH *n y> ?</ N\Jg.fN`* y> ?</ N\(@)yRB@JL0N^NuNVJy)gNb>.NJn gj.N4Z@-@.Nf-@ nB./.XNXJf y!n` y #p``B@N^NuNVHJgRy3N||ff. /<N X.N~ y.^ cfF y.^ :g y.^ hf y.^ c f y.^*h` y.^*h g .fR. / a:X>Jg?/<,P nN\>JGg`HJgSy3JL N^NuNVH *n Bn`H(n<Am <Zn< < f Jf0.`&f``RJg  f  fRRnJfpJL0N^NuNVH>Nw&@(k9n Bn-y.^~#.^`JGgRn` n X` y.^ \f y.^ egX.^ y.^ `@JGg XnX.^` y.^*X.^JGg XnX.^` y.^*X.^``|Ag|ag|cg` y.^ ,g y.^ efbJGgXn`*e y.^ ,fX.^ y.^ efJGgLJng0..N*@0.R@H.N-@ n #,X##,``SG`9n)n n)h)y+ R#+B@` .NJL8N^NuNVH `NyJ)g y) PfJ)f .N y)*h# +Jmg y#,.NY#,(y#, y#,##,.NNyJL0N^NuNVH .YN9tJ@gp`NBB3./<ea$XJg >Nw*@(m(B)nJL0N^NuNVHJy)gNb>#N0. `lSyfB@`l`Ry.N4Z@..N*@B./ XNXJf#` y #09`` J@g|g`JL N^NuNVH,9$>9$|:9$|09+``JGgvJEgBBg?/9$?9)N <Іe.HN` H"y.XR.X H"y.XR.XT$T2`@..j/9$?< N1T\ y.XBR.X y.XBR.XT$T2`$JGg09$|y)f$`09$|g .TN <Іe.HN` H"y.XR.X H"y.XR.XT$T2`@..j/9$?<N1T\ y.XBR.X y.XBR.XT$T2`T>9$p oy(09$|gvJEg.LN`& мe.HN` @0H|"y.XR.X0|"y.XR.XT$T2`P..j/9$R?< N1T\0H|"y.XR.X0|"y.XR.XT$T2`n>9$p oy(09$|g09$|y)f$`09$|g .TN мe.HN` @0H|"y.XR.X0|"y.XR.XT$T2`N..j/9$?<N1T\0H|"y.XR.X0|"y.XR.XT$T2`j0.`fJGghJEg.bN`L мe.HN`, H"y.XR.X H"y.XR.XT$T2`B..j/9$R?< N1T\ y.XBR.X y.XBR.XT$T2`JGgvJEgBBg?/9$?9)N <Іe.HN`l H"y.XR.X H"y.XR.XT$T2`@..j/9$?< N1T\ y.XBR.X y.XBR.XT$T2`JGgJEg B?<?/9$?9)N rH"y.XR.X rH"y.XR.X H"y.XR.X H"y.XR.XX$X2`\..j/9$?<N1T\ y.XBR.X y.XBR.X y.XBR.X y.XBR.XX$X2`.>N`"|g|g@|g|g0``JGgvJEgBBg?/9$?9)N <Іe.HN` H"y.XR.X H"y.XR.XT$T2`@..j/9$?< N1T\ y.XBR.X y.XBR.XT$T2`JGgJEg B?<?/9$?9)N rH"y.XR.X rH"y.XR.X H"y.XR.X H"y.XR.XX$X2`\..j/9$?<N1T\ y.XBR.X y.XBR.X y.XBR.X y.XBR.XX$X2`0.N`$>N`H |rW hXNB@JLN^NuNVH,9$>9$|:9$|09+``JGgvJEgBBg?/9$?9)N <Іe.HN` H"y.XR.X H"y.XR.XT$T2`@.0j/9$?< N1T\ y.XBR.X y.XBR.XT$T2`$JGg09$|y)f$`09$|g .TN <Іe.HN` H"y.XR.X H"y.XR.XT$T2`@.0j/9$?<N1T\ y.XBR.X y.XBR.XT$T2`T>9$p oy(09$|gvJEg.LN`& мe.HN` @0H|"y.XR.X0|"y.XR.XT$T2`P.0j/9$R?< N1T\0H|"y.XR.X0|"y.XR.XT$T2`n>9$p oy(09$|g09$|y)f$`09$|g .TN мe.HN` @0H|"y.XR.X0|"y.XR.XT$T2`N.0j/9$?<N1T\0H|"y.XR.X0|"y.XR.XT$T2`j0.`fJGghJEg.N`L мe.HN`, H"y.XR.X H"y.XR.XT$T2`B.0j/9$R?< N1T\ y.XBR.X y.XBR.XT$T2`JGgvJEgBBg?/9$?9)N <Іe.HN`l H"y.XR.X H"y.XR.XT$T2`@.0j/9$?< N1T\ y.XBR.X y.XBR.XT$T2`JGgJEg B?<?/9$?9)N rH"y.XR.X rH"y.XR.X H"y.XR.X H"y.XR.XX$X2`\.0j/9$?<N1T\ y.XBR.X y.XBR.X y.XBR.X y.XBR.XX$X2`.>N`"|g|g@|g|g0``JGgvJEgBBg?/9$?9)N <Іe.HN` H"y.XR.X H"y.XR.XT$T2`@.0j/9$?< N1T\ y.XBR.X y.XBR.XT$T2`JGgJEg B?<?/9$?9)N rH"y.XR.X rH"y.XR.X H"y.XR.X H"y.XR.XX$X2`\.0j/9$?<N1T\ y.XBR.X y.XBR.X y.XBR.X y.XBR.XX$X2`0.N`$>N`H |rW hXNB@JLN^NuNVH-|,By3#C(3(3(By)By+#$BBBB)B(B( ,JBG`$0G2n0G)B02G+RG|mBG`&|l0`0]@2GHHҼ2n"ARG0GJf~A`0G+ RG|ZoB)zB)ZB)B)kW)W)oL)L)dJLN^NuNVHJf.Nf*@`*y y#0.`vJf. Nf(@`(y y#+L`TJf.Nf&@`&y y#+K`$. N+@``J@g|g|g+y,L:+y.^ +y$+y)#) JL8N^NuNVHJy(g. /<DNXBWa(@*l;nB@;@ ;@ ;y)+y(;y(Ry(3((. N#(By).Nf&@B'y(J(f#(` y( #(B@JL8N^NuNVH*y) g`N -,Lf# .^#$0`Jy(g.(/<UNX(m(#>N,#(3)3(`Z&m&#`H m-P` n-P.N-nJf.N``J@gd|g|g#)+y#JL8N^NuNVH*y(`*U g 0.SnJ@f f #d(`#(JL N^NuNVH=| y)*hBG<- 6m (K`6  g  f&RG  fFl" , fRGBm m `RGRFmJnfJm g Bm BB`0- Hm&0m SHB(Bm 0- HЍм`Jm g:8m 0- |H&@BG`RGm m0- |;@ .0- H2- HЁЍ/?-NL\=@lB`0.m Jm fB``JL8N^NuNVH y)*h(m fB`"+T>/ / XaP мJL0N^NuNVH y)*h(m f+U -SJfB`"(m.X/<-PNX+T <-PJL0N^NuNVHJ)fpf` y)0`ha*@ fa`Ry) ,JJy2lg.a `Ha *@ fNd`@,J`,a8*@ faP`#,J``J@g|g|gJy3g./<,PNX#.^&y$BnRy+ *g ;g``RHHмd @fJg| ;gtHHмd @gdJng nBB=| -@(@R|`RRFHHмd @f .fBBnHH @"<d0HB@fHHм) @Jn.lN`HH @"<)0H(HHмd @g.N`|nbBG`XHH @"<+0H<0G0@0FdPg|`&Jgf0Fd<`0Fd>JGl`|JFmJGl &c&`0&BnJg&Jng-M`gH&`g|H`^ =f &kR`&!`m&b&(M`<\fvH`X.N`<`X< `R<`L< `F< `@< `:<"`4<'`.<\`(.NS``H |r W h(NJg .ft.g.N`B`HHмd @g>B`HH @"<2n0H؀HHм2n @Jl&a&`&$`H`0&mR`&kR`z&jR`n&<`d`|g` :f &hR`&:`4 =f &gR`&=`H`$&lR`&iR`&>``|=g|>g` 0m 1o &%`B`H؀ؼ 0m 1o&a&` 0m 7o &@`B`H؀ؼ 0m 7o&a&`V ^g &^`FRHHмd @f.N` (MR`RHHмd @fBG`VH|Am |Zn| 0G0@0FdPg|`&Jgf0Fd<`0Fd>JGlJFmJGl.N`0&`>N`r`H |@r W h,NgFB`$/< /NdP(H؀ؼHHмd @f&a&`.0N`$Jfj#$.^Jng nB&eB@JL8N^NuNVVH y)-hj nj h=h rSn&n 0.HЮ -@*n` \gd`BnRH`ʷd`R=|` nj>/</VNP`b nj0( `"(|`2(|`*(|`"(|``|g|g|g|g` .+/</VNPIVR` d Jf`.N``H |rW hNHHмd @gH|=@Jnl=| `It {gHHмd @f`*R`Jg }f }g.N`n`RB>r?</tN\-@nf.t/<N X`0` nn (=@B nj0(nc0n#,-PJng.Jg n efBnd0.|0H`Jg` n e" n P(PX`Z`R n X`, n(PX`6 n(PXdP"` dBJfd4"`` n./</VNPXIV`(|`(|`(|`(|`(|`(|`(|`(|`(|`z(|`p(|`f(|`^(|`V(|`N(|`F(|`>(|!`6(|*`.dT n (H``|:|?b@0@, PN g`d Jf n efbJf2BB@`B.4NJL8N^NuNVH*n `g ~fB`` *fB`RJfJL N^NuNVHBG`0G8BRG|m33B3B)JL N^NuNVH.Nf*@.N+@0. H@;n Bm B>/.aX>0G8*0G8 J3f#3` y)!MB#) JL N^NuNVH*n>. <.BE&M8`|@REDf H@@`H@Jf0|0@8(P`2,@@f$l f lHf./ NXJ@g(T f JL8N^NuNVH*nBF>. `|@RFDf H@@`H@RJf0|JL N^NuNVHBG`80G8*P`"J-fJm f0- ||fm@ *U fRG|mJL N^NuNVHBF*y3`J-f0- ||g0- |P|Pg- g(;F RFJg?</ /. n N -@`TJ-fNJy)gF0- |g< m Lg20- ||g$;F RFJgBg/ /. n N -@*m fR0JL N^NuNVH09 [@=@.Nf-@BG`0GBRG|mBG`~0G8(P`f-T lH<J,fL0F*P`./,NXJ@m&M*U f f0F(0F `(&(n fRG|m~BG`*0G&P g f*K`*`*UJf f(KRG|mN.j/<3NX`BG` 0G!LBF` g (TRFnmRG|mBG`RB.RJgNBF`(0F*h g0F!U=m | | .g|c`$0.||@f|x`.g|g0.|мb @P .xf.w/NX`&./</NP.a.H>.H?.g?<e`?< //-/</N./RNXXRF|m.RNRGnmN fnJL8N^NuNVH*n` am zn RJfJL N^NuNVB#2#)B#2#(By+N^NuNVJ2g y+0 y2!y2 N^NuNVH 9(А2da>.n0.y+g|Jg|@Jy(g.f .NJg n./<N X\2 y+0T+ y+ X+0|g y+0T+3+T2g y+ X+X2JLN^NuNVH.Nf*@B+|A+HJ2g& y+0 T+ y2!y2 y2 J)f#)#2 |+"MXr0Q#(B2JL N^NuNVH *nJng. / NXBn-y)` NQ"nXr0Q n>T fB n-PX0|g n=PTg n-PX nf .Ѯ .Ѝ-@Jngg n|TJg8Jng. g~`~ n0( H@0H"nR0"n`|Jng n2Ҽ"AQ`Jy(g0|g(nH|r-@H|r㨁H|ሁH| 9#HѮ|f 9#^Ѯ(n .rH .rH .H .H`l n-PJfJJngJy(g=|-M(MB` n(H||frJng0 .rH .rH .H .HBn`, .-@`  b .HX-nX`TT . ehJnfB`Bn`BRn nm -@ .` . JL0N^NuNVB)JngBN#3 ` .3 NB>N^NuNVH..gR߹).N*@f .N JL N^NuNVH*nB`RJ5xf.Ra&@(K`JfB JL8N^NuNVH /</.ZNP.R(y> f(|8 #>#8By<*T`X0-b40-f(` m0- ;@#> \`>f.a*@ fB`(M*U fJL0N^NuNVH ..޼/</NdP.N*@fB`(M 9@.\a 9>JL0N^NuNVH *n](y>`ebe (Tcd0-Ѝf T0(m T*`*0,Ќf 0-l(`(#>JL0N^NuNVH *n(n ..` SJf JL0N^NuNV4a`. /.?9)/9(/< /8N.8N4./8?92jNP\>EN&Ry3pN^NuNVla. /./8NP. /8?9)/9(/< "/pN.pN4./p?92jNP\>EN&Ry3pN^NuNV4aP. /.?9)/9(/< 6/8N.8N4./8?92jNP\>WN&B@N^NuNV4a. /.?9)/9(/< S/8N.8N4./8?92jNP\>NZN^NuNV4aj. ?.?9)/9(/< t/8N.8N4./8?92jNP\>NZN^NuNV|>(NzJ(g.(/NXJ.f0.+/NX>/< /N|PB(BW/NX32jl.N 3(N^NuNVH>N09(`BBNX:>/9#/9#^/9#H?.N`B y(g&/<BBNP/NdP-@,9#Hܹ#^.d...Nf(@A#.X y.X`R.X y.XR.XT$T2.9#H rH"y.XR.X rH"y.XR.X H"y.XR.X H"y.XR.XX$X2.9#^ rH"y.XR.X rH"y.XR.X H"y.XR.X H"y.XR.XX$X2.9# rH"y.XR.X rH"y.XR.X H"y.XR.X H"y.XR.XX$X2 .rH"y.XR.X .rH"y.XR.X .H"y.XR.X .H"y.XR.XX$X2 y.XBR.X y.XBR.X y.XBR.X y.XBR.XX$X2 y.XBR.X y.XBR.X y.XBR.X y.XBR.XX$X2 y.XBR.X y.XBR.XT$T2&Lz`20м#0 @*h`./-/ NfP*U fRE|oJy(gBW/9#H// NN ./ ?.NP\ y(g"./ NX./ ?.NP\>/9#H// NN ,./ ?.NP\``J@gL|gJL8N^NuNVH *n n (hBG`RG|lJf`B|@RGDm n 8( 0| @ <| g|@ g |(|`0|g Jng| `|0HH n *(Jy(g|JDgڹ#Hgڹ#^ rH rH H JL0N^NuNVHBWBaX-@0.-@ . Ю-@.d.. .㈾d..093.Nf#3.0Nf*@0 .Ѝ#)A#.X y.XR.X y.XR.XT$T2 y.XR.X y.XBR.XT$T2 y.X R.X y.XBR.XT$T2 y.X0R.X y.XBR.XT$T2 . rH"y.XR.X . rH"y.XR.X . H"y.XR.X . H"y.XR.XX$X2 y.XBR.X y.XBR.X y.XBR.X y.XBR.XX$X2 y.XBR.X y.XBR.X y.XBR.X y.XBR.XX$X2 .rH"y.XR.X .rH"y.XR.X .H"y.XR.X .H"y.XR.XX$X2 y.XBR.X y.XBR.X y.XBR.X y.XBR.XX$X2 .rH"y.XR.X .rH"y.XR.X .H"y.XR.X .H"y.XR.XX$X2 y.XBR.X y.XBR.X y.XBR.X y.XBR.XX$X2 .rH"y.XR.X .rH"y.XR.X .H"y.XR.X .H"y.XR.XX$X2 .rH"y.XR.X .rH"y.XR.X .H"y.XR.X .H"y.XR.XX$X2(M|`20м#0 @&h`./+/ NfP&S fRF|o>/ arX-@.0/ ?.NP\.$/ NX./ ?.NP\BW/ a&Xav./9)?.NP\JL8N^NuNVH*nBBE-y3By3-y)` N"nXr0Q n<T fRy3 n(X0|g n:T0|м @g n(PX<TZg<@`<  g<gع#HJn g0|gg&DH|r-@H|r㨁H|ሁH| 9#HѮg 9#^Ѯ&D .rH .rH .H .H`Z&DH|-@H| 9#HѮg 9#^Ѯ&D .H .H`L gH n X rH rH H H g0, |0, H|` n-PJf .JL8N^NuNVH.`?<?93/93N@P&y)*y3>93` (]H||fSGJGfJL8N^NuNVH n*P n (P-@|r`-A|taA-A|AA-A|A.,@|r`,A|taA,A|AA,A|A,cp`` dp``B@JL0N^NuNVH *nBn n (h _fJy)g=|RBG`RG|lJf|l Jng_RG`B|@RGDm n :(  g|`20| @ <Jng|0|f|| 0|0H| n ((0|gع#Hgع#^ rH rH H H JL0N^NuNVByLByHByF3= 3J. /<NX. /<3NXN./<NpXN./<NXN^NuNVH #$.P3)B3)D> ?<(/<Nap\ t(|v*|,P`"  l  f`^H|@HRJfBJL0N^NuNV./< /<NP> /</<^aPN^NuNVH 9.P$g0..P/< /<NP>/</<UavP09Dy)g0>D/< /<NP>/</<Na8PN009By)f09Bм#0 @f 9.P$gJy)f09Bм#0 @*h yBg$` -.Pb -Э.Pb*U f f >N(y.P=|Bn 9$.P-@` n%m^=|.Na.Na6> ?<(/<Nap\..P/< /<NP>/</<Ua P yBg -Э.Pb *U gD(mJnf..P?9BN8T=@JngSn. /<NX`H>W/< /<NP>/<0.HмN/ajPTnR.P .SJf no.Na.Na`.Na.Na JL0N^NuNVHJy)o09 S@yFnaJyFfRyH. a. /</</<?9H/9(/</< /<N.a.3/< /<NP.a. az3F.ajRyFJLN^NuNVH~`. n2H0H|am<fnH|2GRG|(mJLN^NuNV uN^NuNVH*nJ) gaD.N4./ ?9(NP\./< ?9(NP\JL N^NuNV|.) /NXJ.f0.+/NX>/< #/N|PB) BW/NX3(l.N N^NuNVJy)o. (aByFN^NuNV y.^ bg. *N`> y.^./<NXP.^ yHo. 9/<3NXaN^NuNVH~ y.^ -fBGX.^ y.^ bg. :N`@ y.^./<3NXP.^JGgJyLf yHoa 3LJLN^NuNVH (n*n >.JGl><`0SGJ@gJfJL0N^NuNVH*n>. .`0SGJ@fBJL N^NuNVH .N4H(@S :gP` \fR`SbJng*L`RJg .fB*L`Jf. / NXX`R .f .JL0N^NuNVHB?< NT.,8.?< NT JLN^NuHLpr<Zn <Am< @4qB62 CCf g03 jLpNu o00 LNu/<R?<&NN\O/<?< NA\O/<?< NA\O/< ?< NA\O y <Ш ШШBg/?<1NA/<j?<&NN\O/<.?< NA\O?<?<LNAJMADMAC version installed. Terminate error: cannot install. < y!! NuBNup$o"y"i,Jg&r1RA<=g 2gJf`J2fC NuNVH*| nBG`&BF`0 2HЁм v @RF| mRG|8mBG`H|0 2HЁм v @0 2HЁм @ fL0 м v @0 м @0 м v @| 0 м @m T fpRRG|8mdJL N^NuNV3.\N0>N/NJ(f .N0|. y#/(NXN^NuNVHB2Bn y.^ `F~`dX.^B/]/Y/<)N" J@mH~`6X.^B/]/Y/<)N" J@m y.^ )fZX.^ y.^ ,fBX.^ y.^*h y.^ cfJ-fH| |yf~P.^~`~`n y.^ ,f\X.^ y.^*h y.^ cfBJ-f:H| |xf*P.^ y.^ )@X.^Df ~```4X.^B/]/Y/<)N" J@m y.^ (fX.^ y.^*h y.^ cfJ-f y.^ )f y.^ e fzH| |xf~`|yf~``Z .^=|` y.^ ef~``2`d y.^*h y.^ cf~J-fv y.^ ,fd .^H| |xf~` |yf~``0. 2HЁ @"< v0H`P y.X2. 4H҂Ҽ"AR.XR$R2`2 y.X2. 4H҂Ҽ"AR.XR$R20.|f.)/9$?<N1T\B` e.HNB .H"y.XR.XR$R2` y.X2. 4H҂Ҽ"AR.XR$R20.|gP 9$R .мe.HNB .H"y.XR.XR$R2`2.)/9$?<N1T\ y.XBR.XR$R2` y.X2. 4H҂Ҽ"AR.XR$R20.|f.)/9$?<N1T\B .H"y.XR.X .H"y.XR.XT$T2`LBF` y.XR.XR$R2RF|m. uN`H | r W h4N y.^ eg .NJL N^NuNVJy.\f. N`X.YN9tJ@mJ .e.HN`0B2 .#$#.P y,B (Ю#.XNN^NuNVH *y# gJ gBB`6 GB( (@,<`Jg G|z` SJfRmJgn./?.NP\(mB`D FJ(g8*R`Rl EJ(f . Ќ/?.NP\,RmJL0N^Nu o"oHrtvxz|~&G g g,A$HHHHHHHHHSfܳg`LNuNVH n oP3###09#@3#09#3#0. #Ю-@ n m ./.aX09#HЮ-@`-n&n(K`/ / y#NPJ@o(K# e޹g"*n09#HЮ-@`ǻe-n`j/.09#H/. y#NPJ@n09#HѮ .g26y#`(K*L`*L# dS d09#HѮ .-@e|JL8N^NuNVH . -@09#H//.N4P/0y#/NP*@-M09#H".n|/ &n/ y#NPJ@o ` (@ . 29#H-@// y#NPJ@o$f ` (@/./ y#NPJ@l(ng<9#SFf*n(n #`#d/./ y#NPJ@o`B/ /. y#NPJ@n#`&09#HЍ-@f&L-K`&L#`$bf`.`&n -@-@#<9#SFf*n``(n:y# -@". -An(09#H".n ./.a@X-M-n` 09#H".n . / aX-L 09#H".oJL8N^NuNVH>*N. JL N^NuNVH>,N. JL N^NuNVH.. r <| o| -| `-| . ? ???/< /.NJLN^NuNVH.. r м>  @"< /0 ?/< B/.NJLN^NuXXXX-123456789**## WaJ@j?<=NATO y# N## WarJ@j?<<`## Wa\J@j?<A`## 0|l ?<>NATO y# Np?`p@ O/(/( ?( Pl ?NA Nuar NuC20k*$Y/<Am<Zn< fJ(f _fNucon:aux:prn:mid:H6/|6;0&o(/ gp???<NM\OSfLNu"_0H@??9 ?<NM\OL< f< `NNV. H>NN^NuX?<LNAJ2/0/ 4 B4/g0/gBH@B@ЈNuJolDRIJolDSI2/0/ 4 B4/g0/gBH@B@Ј2 gDNu C"D"/&/f r`@pe:fpr`2t(ȼf 0BAHA`Ԃed`ef&( Nu C"/lD&/nm <"`\Df r`:pmn2pr`,tl 0BAHA`Ԃփd`efJojDDJojD#.T&Nu////NP Nu////N4P NuNVH *n(n ` gSS`JfHHAJL0N^NuNVH*n(n &Mf JL8N^NuNVH*nBG`RGRJf0JL N^NuNVH*n(n &MJfSf JL8N^NuNVH*n`R  g  g  g| +g -f +fp`p<BG` H@|R 0m 9o0JL N^NuNVH /?.?./ /. nN*@ мfB(n ` %H| l|0`Jngp7`pW@ мfB JL0N^NuNVH*n<.H n0H.JngJl D. n P-"n R`μ`./N4XH. 9.THJf JL N^NuNVH *n:.H n., nf x` HSDJgJDf` nf*x ` HSDJgJDfJDf-`Jng\Jl2 n P-"n Rf(| 0HfS `R D.`//NPH//N4P.Jf`$`//NPH//NP,Jf JL0N^NuNVHIBBn .RdRn-\ fRn-\*\&L`"(K<%gH>/?.a"\`BnH|-fRn| <0fG=|`"JnlBn0. HA|=@<0m<9o=|<.fBn`0. HA|=@<0m<9oBn<lfRnA-HH`JJng -|`-|lBW/.?<?< // NTJngT`BW/<lBg?< // NT`Jng -|`-|lBW/.Bg?<// NTJngT`Jng -|`-|l<XgBW`>/.Bg?<// NTJngT`R-\&L`J=[0.H@B.`6H>/?.a&\``|C|5b@0@ PN.N4=@0.nl Jnm=n0.n=@Jnf^ . g. n -f$Sn nH>/?.a\R`.H>/?.a\0.SnJ@n` nH>/?.aV\R0.SnJ@f`.H>/?.a,\0.SnJ@nf nf nBJL8N^NuNV0.`<.H>N`< n ..H?NDT`$ n P"n R``J@g|gʰ|g.HN^Nu##$/BCQMDNEF?OHRPIJTSZUV[W]^\_`akbcdlemfghiyjzno}~{|      !"#$%&'rs(&      !""#$ &'  %   *.+0% 1 3+56/7,829/(,(()22-4):;=)?>@->A)--<4<<<<CDE<<<F<F<G<B<HBI<JFKLMNJOPQNRSTPUVWXYXWZ[\Z]^_[`abcd[e\\fgab^h`bbijklmnodpqtuhvwxpyz{|}~      !"#$%&'`X       "    *9 =4">ABCE I\^eb_gw|~kxy|}}~A"  $')+-%12.&3*-5)(,(/07826: D&MY[Z]ozs0 &0 ./T'f, .U/VX',--@!!8  **- */)+46(#>2B66H8;LMNFLMPPJDcd  " $%&!('-*#)+.,/0        !"#$%&'*,(++)(+.&')""--/0,,/Dextra (unexpected) text found after addressing mode(5O @@@@@@@@ @  ,, missing commasyntax errorcannot GLOBL local symbollabel ignoredhit EOF without finding matching .endifmis-nested .endrmultiple equate to '%s'multiply-defined label '%s'unknown op '%s'cannot initialize non-storage (BSS) sectioncannot use '.b' with an address registersyntax errormismatched .elsemismatched .endif @ @addressing mode syntaxunimplemented addressing moderegister list syntaxregister list order   missing symbolac([{)]}pqvwyx!~n*/%+-mlji<>k=&^|&& ''''&%|%$%P$(*[abc)6()z('((&)%&*/^lm|---X-n-----!+-<=>Aacijkn~+b**,l,,,***++,+@+-,missing symbol or stringmissing close parenthesis ')'missing close parenthesis ']'bad expressiondivide by zeromod (%) by zero76(66&7Z58<8PC-relative expr across sectionsunoptimized short branchexternal short branchillegal bra.s with zero offsetexternal byte referencenon-absolute byte referenceExternal quick referenceexpression out of rangeBIh===N<HLD I9`>=K.9`9`CR9`9`9`9`9`9`K N" TQ UQ WQ QQ \Q ^Q RQ _Q SQ ]Q [Q VQ ZQ PQ XQ YQ K KRK SK  <TO  |N R  HWN" HN" JK NK NK AKNPS(^Ob_O `K N"(bObcO dK N"fT@gT FhK @iK DjK NhkU N`U@T H\^$oVH$VH pU K K  HK DK @K NqK FKyKzK{K <|O |N  H@K NpK8ObO K N"8ObO K N"0ObO K N"0ObO K N" NsK NwK NuK M M  TK  UK  WK  QK  \K  ^K  RK  _K  SK  ]K  [K  VK  ZK  PK  XK  YK NrNKKMKQZM  M  H@N"  JK N@[ NvK JK NXN"Kr @@0 0 @@@@@ @ @@   @@@@ @ @ @@  expression out of rangeillegal absolute expressionbad (section) expressionillegal relative addressbad size specifiedundefined expressionforward or undefined expressionunimplemented mnemonicinappropriate addressing modebad size suffixmissing commainvalid addressing modemissing commainvalid addressing modemissing symbolmultiple macro definitionmacro definition cannot override directive or mnemonicendm multiple formal argument definitionencountered end-of-file looking for '%s'cannot continuemacro stack overflowtoo many ENDMsendr rept  (089:;<@ABCDEFGHIffffffh"lm\gRij nDnDnDnDnDnDffffnR (089:;<@ABCDEFGHInnnnnnp>tuxonq$r(v`v`v`v`v`v`nnnnvnillegal byte-sized relative referenceunsupported 68020 addressing modeillegal byte-sized relative referenceunsupported 68020 addressing modeHR^f;q 387=<QNTTUVNXLO\\_aXdce\6  %()*&' "+,#$-./012345678!  !!   "#$%& '()*+,-./ 012 345678BRLW=SB LRW=Syxvwpql  @@H@@ @ @   @    e"'\befnrt!"$%':<=>@^b|<N|BEHKNQTWZ]`cfiloruy}!#?\~t>~Lt0123456789abcdefABCDEF[Including: %s] [Leaving: %s] (*top*)[bwsl] must follow `.' in symbolmisuse of `.', not allowed in symbolsunterminated stringbad backslash code in stringunterminated stringinvalid symbol following ^^unknown symbol following ^^illegal characterd0d1d2d3d4d5d6d7a0a1a2a3a4a5a6a7pcsspuspsrccr%d.b.w.lM%ldmissing argument namemissing '}'undefined argument: '%s'$%lx==set:::>=<=<>>><<.b.w.l^^date^^time^^defined ^^referenced ^^streq ^^macdef line too long as a result of macro expansionatd!b Symbol Tableexternal%08lx %16s %s %c%c%cillegal word relocatable (in .PRG mode)illegal external reference (in .PRG mode) to '%s'memory exhausted "%s", line %d: %s%s"%s", line %d: %s%s"%s", line %d: warning: %s%s"%s", line %d: Fatal error: %s%s"%s", line %d: Internal error number %d%s.err  ==%08lx%08lx%5d%08lxxx%02x%-40s%-20s Page %-4d %s %s Madmac %s (%s)Atari ST%s .prn missing stringmissing stringdirective illegal in .6502 sectionim eaq u}y)- %!1 5=9  0Pp, $X    IM EAQ U]Y Ll      N FJ V^  Hh(. &* 6>n fj v~@`  8x     ,,,,,,bad 6502 addressing modeillegal 6502 addressing mode.org permitted only in .6502 section       # ' + / 3 7 ; ? @ Apmam%d:%02d:%02d %sJanFebMarAprMayJunJulAugSepOctNovDec%d-%s-%d   AB **********t****J**ż********************t****J**ż 6F"6 4    4&     ^   > 0  0 "         L     $    4"       4:$ "(    6   \            "  (                "  (           *(    H  <         *       $          (V<"*:::::4J B                2x~L6  .($$&DZ 0@0R    " ,"               "        *    2  " F           J    ".   $0     4   ,   2 ( (    ,                        ((      "    *         8             ,        $      6                      * " & &    "  (                         <      (                         <      ( .      $         :J0    $">$ @,|* &",|$"<& 6fp ,8Z 8Z.vLbl.6~BJ     ( jT^ @ F "ZD  $                       rP            > $6.Fvd fD 8B                 `      ~P.B"b>64    ( ( 6 .$ *>,(              nH $$*:  & ( (&8 & > *lb,^ @   *`8 @x. l4 $(@0 ^` 4 F `5[del %1.prg del %1.err me s\%1.s m -e%1.err -is -ps -s -v -o%1.prg s\%1.s type %1.err dir %1.* -l  `^f  9й.@#iNPB@NB` _HgNALgNNVNAN^NuNV ygBhpN^NuNVH>. JGlp0D@??.NXO`f ygJhfF$yg"yg i "((A fB@`8 yg!L yg1l  yg(` ygSh0SGJ@fpLN^NuNV"yg i 0( yg1@pN^NuNVH>. JGl0D@??.N`XO`v yg"h yg0(i fH"yg yg ( fB@`B"yg i  yg!@ ygBh yg(` ygRh0SGJ@fpLN^NuNV"yg i  yg!@ ygBh yg(pN^NuNV yg ( yg!@ ygBh yg(pN^NuNVHJn l0. D@??.NXO`r09g@f 3ggyg yg ( (@0. Sn J@g ygйg(T` yg!L / NlXO yg1@ yg(pLN^NuNVHJn l0. D@??.N&XO`x09g@f 3ggyg yg ( (@0. Sn J@g yg ,g(l` yg!L / NlXO yg1@ yg(pLN^NuNVH(nBFBDl g<0D( H@>: G fE` G m GfREREygn<RD`0LN^NuNVH>. Jnf yg(HU@>JGn.~`*JGl0D@??.NxXO`b yg(H0> yg ((@0SGJ@g ygйg(T` yg!L yg!L ygBh yg(pLN^NuNVH>. Jnf yg(HU@>JGn.~`*JGl0D@??.NXO`h yg(H0> yg ((@0SGJ@g yg ,g(l` yg!L yg!L ygBh yg(pLN^NuNV yg ( yg!@ yg0( yg1@/<^N XOpN^NuNVH ygJf/<^N XOB@`b yg ( (@ yg0(> yg ( yg!@ yg0( yg1@ yg!L yg1G yg(pLN^NuNVHp?Hn/<^NO > @g0`6Bgp?HnN PO(@ fB@` ygS(fP yg ( yg!@ yg0( yg1@ yg ( yg!@ yg0( yg1@#g yg!L yg!l yg(,HR,J@f2 yg!l yg1l yg!l  yg1l`P&yg gFgg: +f2 yg!k yg1k yg!k yg1k`&S`pLN^NuNVHp?Hn/<_NO > @f@BgBgHnN PO(@ gfJ,g/<_N XOB@`P/ N XO> @g0`:/,NWrXO$ygصg&J$R`$R f#g`&/ NWrXOpLN^NuNVHN> @g0` ygJ(fFNJ (@ fB@`&lS+f'l 7l'l 7l)yg ygR((yg gB ,gf2"yg i )@"yg i )@ BlBBl,(T`pLN^NuNVXH yg(/9gN XO: @g0`8/<_) 9g/0<Hї /NYvPO/<_*N XOJ@g/<_IN XOJ@g$yg g*H@g$R`It*H@gp*`p p BF j -@ .g n0( R@@ n`?p?HnN PPOGH>g`p GfH>g`GJg4 /0<rH cp ` /0< H cH>fBHntN XOJ@f4B@`pLXN^NuNVH(n>. <.0GB F m$SG00@0H H@@00H <`SG00@0@0JGg SG00@p `LN^NuNVH/.NYXO<?N"TO(@ fB@`vBG`0G2GQ RGGn yg"h i "yg i ()@"yg i!L yg (("yg yg (f yg!LpLN^NuNVH(yg g ,H@f,H@gp`(T`B@LN^NuNVH(n&yg g2Hkf/ NYBPOJ@f+H@g/<_hN `6&S`Jn gpv?NVpTO&@ gBgN"TO$@ f/ NWrXOB`T&g#g'JBkB Bk0.@B+'J/<_HkNYvPO/ HkfNYvPO$%J LN^NuNVH(n,H@f&,H@g/<_NXO> @g0`6, l"&A g / N#LXO`)lBlB BlpLN^NuNVH yeN09eH?NVpTO#gJgfNPT09eH?NVpTO#gJgfNPTBG`^09eT@?NVpTO(@ fNPT0H @g 09eT@?NVpTO(@ fNPT0H @g RGyemLN^NuNVBg?9eNXO yeN yeNN^NuNV3_3 _N^NuNVH>.29_H Ag (@09_yem09eS@0@p$@`^ G fp ?NTO09_@f`> G m Gfp^?NTO0 @@?NTO`09_Ry_0@GLN^NuNVH29_H Ag (@09_yel09_Ry_0@p @`LN^NuNVH&yg gJ+g+H@f&(kBG` g kg (TRG0+m+H>JGoSG0+m,+HS@` JGl+H@JGlBG`+HH>(k JGg k ,gSG(l`'L+(k+H>+H@ @fX gRG(T`0H"@g QPBg?N XOBF`0F( H@?NTORFl mN`x+H@ gl+H+HAGoZ0H"@g QPBg?N XO kg&BF`0F( H@?NTORFl m(TNRG`+H@g / NXOB+B+&S`H yg ((@ yg(H3g ygԹ g Ryg(T`BygBG ygԾhl>0RG0@( H@: E f yg` E m EfRygRyg`09gưyem09eS@3gJy_glBG`@0H"@g QP2H Ag $@BF` 0Fp @RFyemRGyemBgBgNXO yeNBy_By_BG`V2H Ag $@0@g:R2H Ag -@ ./0<Hї /Hj?NrO RGyem?9g?9gNXO yeNLN^NuNVH(n &n . /09eHї gHfRR` . /09eHї gBG . /09eHї $@ ./09eHї -@ n*H(fSS  g~`-JJGf* .g n ( fS` @n-J ??.NXOgH? yeNTORy_` .g yeNg`LN^NuNVH(n,H,HA<0H"@g QPBg?N XOp-?NTO$l*H@gp*`p-?NTO|&|_H>g?NTORF`GfH>g?NTORF`p ?NTORFJ*gD&|_H>g?NTORF`GH>g?NTORF`p ?NTORFyelp-`LN^NuNV0.y_f 0. y_g"3_3 _?. ?. yeNXON^NuNVBg?9eNXO yeN yeNBy_N^NuNVH/.HnNYvPO/<_HnNYPOp@?HnHnNO > Gfp`*JGg .yg .Yfp` .ng .NfB@LN^NuNVHBGJgg, ygTg0:g0RG0@ `0G B`/.N XO yeN:0`0RG0@ BJgg60Hйg c4btBF`"ygTg0F H2RFFnp ? yeNTOBy_ yeN n JfB@`p`p^? yeNTOpG? yeNTOTy_BgBgN3^XO yeNp`dJGg6p? yeNTOp ? yeNTOp? yeNTOSy_SG00@  l0p? yeNTOp ? yeNTOp? yeNTOSy_ yeN`p? yeNTOp ? yeNTOp? yeNTOSy_SG00@  l0p? yeNTOp ? yeNTOp? yeNTOSy_JGf`~0.S@Go60RG0@  E lp^? yeNTORy_ E@? yeNTORy_`2 |^f2<`XHXW PN`LN^NuNVHBg?9eNXOI nRH>g G%g? yeNTORy_` nRH>0`8p ??NXOT`p`p`p ?/N\OX`/NXO` |^2<`XHXW PN`p yeN yeNp3_LN^NuNVH(nH>g? yeNTORy_`LN^NuNVHJnl0.D@=@p-? yeNTO0.H >JGg?. ?NXO0.H H@0@_H? yeNTORy_LN^NuNVHJl .D-@p-? yeNTO0. H//.NUPO.Jg?. /N\O0. H//.NUPO@0? yeNTORy_LN^NuNVHpP?Hn/<_NO > @g0` HnN*XOLN^NuNVHpP?Hn/<_NO < @f(yg`,H@f|HnHlNYBPOJ@ff ygS(fP yg ( yg!@ yg0( yg1@ yg ( yg!@ yg0( yg1@#g yg!L,HR,J@f2 yg!l yg1l yg!l  yg1l`P&yg gFgg: +f2 yg!k yg1k yg!k yg1k`&S` yg ( $@ yg(HH>0SGJ@g yg *g$j` yg!J yg(/<_N XOp`(T frHnHnNPOBgBgHnN PO(@ g:p?Hn/<_NO < Ff0`JFfHnHnNPO f,Bgp?HnN PO(@ f/<` N XOB@` ygS(fP yg ( yg!@ yg0( yg1@ yg ( yg!@ yg0( yg1@#g yg!L ygR(HnN*XOLN^NuNVH-yg/.N XO< @g0`n n(/. ./0<Hї /NYvPO/.N!pXO< @g Ff /<`!`/<`,N XOBD?<HnN"\\O<fpHnNYXO:?N"TO(@ f|`N"yg i (&@& yg (()K"yg i!LBG`0G2Gi RGGnRD`~N! Ff& Df/<`;N XO`?/<`IN \O$yg`@ *gf2"yg i %@"yg i %@ BjBBj*$R f FfB@`pLN^NuNVH(n JgR` ,:gS f&n ./0<Hї gJg ;g`BLN^NuNVHpP?Hn/<`YNO > @f`HnN LXO> @fLHn 9g/0<Hї /NYvPO yg((yg g ,gf,(T`0LN^NuNVH yg(H@fp`p ygJ(f/<`fN XOB@`R 9g/0<Hї /N LXO> @f, yg((yg g ,gf,(T`0LN^NuNVH/.N!XO>fx"yg i (@BF ygйg?, Hl N!\O>fRF(T`JGf4N!>JGf. Ff/<`sN XO`?/<`N \O`N!JGgB@`pLN^NuNVHpP?Hn/<`NO > @f0`NJGf/<``Hn 9g/0<Hї /NYvPO(yg g ,gf,(T`pLN^NuNV/<`/.NTfPO#gfp`B@N^NuNV/<`/.NTfPO#gf/<`N XOp`B@N^NuNV/9gNQXOB@N^NuNVH(nBG`/9g0GH@?NT\ORGn m/9gp ?NT\O yg(H@g/<`N XOp`B@LN^NuNVH(nBF/9gNRXO> @g$ G g0. S@Fn/<``60RF0@` Gf4 yg(H@g/<`` JFg/<`N XOp` p`0FBB@LN^NuNVH>.0@@<JFf|0@ ?NVpTO(@ f?/<aN \OB` 9F9G LN^NuNVH(n$yg g0 *f%T * f%T Bj *f%TBj$R`&yg g*J+f +f'TBk + f'T Bk&S` l T!l/ NWrXOLN^NuNVH>. yg (g~ yg(H@fG yg((yg g ,gf,(T`LN^NuNVHp?N#TO yg ( $@ ygеf ygJhg/<a-N XO`?.N"TO-@g-j n n %n n!nBF`0F0. @ RFnm yg!n yg1n` yg0(>0* njo0.j ?N"TO-@fB@`I ./0< Hї &@0HЊ/0< Hї g` /0* Hї /0< Hї g` j n R!n n!j/ NWrXO`V-J n0.h /0* Hї /0< Hї &@ /0.H (@0HЊ/0< Hї g$`BF`0F0@0. @ RFnm-ygJg n (f n!n n ( f, n!n .gg nhl n0.h n (f n!n nhl n0.h n -@`rpLN^NuNVHp?N#TO yg ( $@ yg0(>?N"TO-@fB@`I ./0< Hї &@0HЊ/0< Hї g`G /0* Hї /0< Hї g`ޟj n!j%n"n i n -ygJgv n (f n!n n ( f nho n!n ` nh n (f nho n!n` nh n -@`pLN^NuNVHJngz yg ( $@ yg0(> ygеg0* G<no<.JFf2p?N#TON)J@g`Jn gp ?N,TOJ@gJSn`p?N#TO0HЊ/0< Hї (@0HЌ&@Jn g4gH?N,TOJ@fB@`R`0HЊ/0< Hї (@ /0* Hї /0< Hї g`ޝj -ygJgl n ( f$ nhn nh nho n1G n (f$ nhn nh nho n1G n -@`n`pLN^NuNVH yg ( $@-R yg .fJj f/ N#L` n0*j h m /0* Hї /0< Hї (@ ./0< Hї &@ n ./0( Hї /0< Hї g`-ygJgf n (f n!J n ( f n!J n0* h n (f n!J n0* h n -@` n0( j n $"n Q!J` n0* h ?N"TO-@fB@`pI ./0< Hї &@ /0* Hї /0< Hї g` ./0< Hї (@ n ./0( Hї /0< Hї g` j n  n "n Q!n n!j-ygJg n (g n (f n!n n ( f n!n `$ n ( f n!n n0* h n (f n!n`$ n (f n!n n0* h n -@`P/ NWrXO/.NWrXOpLN^NuNVJa g /9a NWrXOBa ByaByaN^NuNVH09ayaf^09a@?NVpTO(@ fB@`\BG`0G2Ga RGyamJa g/9a NWrXO#a ya09aRya0@a 0.pLN^NuNV0.yamp` ya H@N^NuNVH/<dHnNYvPO no n /(HnNPOHnN/PXON  noN n /(N*XOBygN N0>Jy_gNN G gBFz GUf|zBD/<dN XON0> @0m G9o GUg G-fZ GUf0H`& G-f JDfDBEx`JDfBEx2 0A@0:JDm?`JEg0D@`p?/<dN \O` Df JEfRE0D@: GXf N1P@>JggR G)g c.gcBgBgN3^XO`JFg ygTg0U ygTg0 ygTg0???N0\O`LN^NuNVHBgp?/.N PO(@p?p?/<dN PO#gp?NVpTO&@ g gJgfNPT#g#g#gB'Lp@'l'l BkBBkB+09eS@@B+p@LN^NuNVH(|c:dd"0nfByg?. ?. lN`|\` n f&JygoJn mBgN4fTOygoNJR n m n~o nmD nn3gg0`BygB@LN^NuNVH yeN> GfN1P>0@`D GfN1P>0@`. GfN1P>0@`JGm Gn 0@@@>0LN^NuNVH yeN> Gam GznG JGm Gn 0@@@>0LN^NuNV yg(H@g" yg(H@f?. ?.NXO?. ?.N1XON^NuNVHJnf N hJ@g/<dNXO> @fN BgNQ|TO0LN^NuNVJgfJgg/<dN XOB@`/<eN XO#a:gpN^NuNVJgf/<eN XOB@`/<eN XOBgpN^NuNVHJgfJgg/<e(N XOB@`Jn np`x#a:gBFz ygTg0> @Uf"| ygTg0: ygTg0>x G)g???N0\O8 @gBg DfSn f0LN^NuNV yeNJgg3)a:BgpN^NuNV3 gpN^NuNVH"yg i (@BFB ygԹ f( ygԼhf*l fx `0F( H@8l f ygйg (TBF`RFR`BgN4fTO4BCJg/pd//NU\PO/NUPO6/?/?09gR@?0R@?/<e0N OpLN^NuNVHBEBF`H"yg0F ( H@> G g G gJnf* G fE` G m GfRERERF ygԼhm0LN^NuNVH yg ( (@ yg0(>l fSGm0G( H@:SGlB@`20G( H@<0GE 0R@0@F p?N#TOpLN^NuNVH yeN<Jn lB@`6Jn fp`, F fN&> GfSn f0`??. N$NXOLN^NuNVJn lB@`VJn g n o 3 h. N&< FfSGf Ff?. ?.N`XO<0LN^NuNVHJn lVB@`` yg ( (@ yg0, hf$ ygйg TJh fp?BgNXO`N&> @g0`0. Sn J@fpLN^NuNVH yg ( (@Jl f yg&l g(K`&LBG yg&S g Jk fRG`JGfp` yg!T ygBh?N(*TOLN^NuNVHJn lB@`BGBE`2"yg0E ( H@< F g F f F fGRGRE"yg i h mN&J@g0H:gp ??N$NXOJ@g0HH@:gp ??N$NXOJ@gj0. Sn J@fbpLN^NuNVJn l0. D@??.N8z`.Jng09g@fN,yg?.?. N(*XON^NuNVHJn l0. D@??.N8(XO`LJng09g@fN,yg?. ?.N`XO> @f?.?. N(*XO>0LN^NuNVH09g@fN,ygJnf$$yg"yg i 0( j>JGf~`~Jn f yg0(> ygBh``Jn oH$yg"yg i 0( jR@>"yg i (@Sn g* ygйg0, R@@(T`/<eTN XOB@`p??N(*XOLN^NuNVHJn l@`6BF?N-^TO>m. G fp?BgN6l` ?p?N$NXOJ@fB@`RF`0. Sn J@fpLN^NuNVHHnN @g0`B09g@fN,yg yg!n yg1np??.N(*XOLN^NuNVHHnN.0.SnJ@gHl fp ?N,TO< @f&(TBG`0G( H@?N,TO< @g0`RG`pLN^NuNVHHnN.0.SnJ@g:l f(TBG`0G( H@< FAm FZn0G0@ @ RG`pLN^NuNVHHnN.0.SnJ@g:l f(TBG`0G( H@< Fam Fzn0G0@ @ RG`pLN^NuNVH(n ygJf /<e^`x"yg yg ( fn yg ( ("yg yg0(il& yg0(9@"yg yg0(i` yg0(9@"yg yg0(i` yg ( $@ yg0(< yg ( &@ yg0+ hR@> ygзf yg *g ygзg>&S ygԷf( yg ( ( yg0(9@ yg0h`N0+ R@@ yg *g$j0* R@@ ygԵfp( yg0(9@ yg0h9@p`/<eyN XOB@LN^NuNVH/<eN@XO8 @g0` yg ( (@ yg0(> ygйgl f(TBGz `0RG0@( H@:9gH??N@\XOJ@g&L<$|gJgF ygзgk f&SBFz `0RF0@( H@:H??N@\XOJ@f`f yg!K yg1F yg(p`/<eN XOB@LN^NuNVH/<eN@XO8 @g0`$|g`RJ*f yg ( (@ yg0(>JGf,(l ygйf/<eN XOB@`0, R@>SG0l fz `0G( H@:H??N@\XOJ@g&L<-J gg\JFf&k ygзgx0+ R@<SF0k fz `0F( H@:S nH??N@\XOJ@f`2 yg!K yg1F yg(pLN^NuNVH>.<. Gam GznG Fam FznF Gfp`B@LN^NuNVHI&nH>g`J9ggNp p[&|gH>g4 /0<H c G m Gf p^ G@` G%f`p]p:p BpP?HnHnNO < FfHn/<gNYvPO`JFf J9gg|0LN^NuNV/<eN XON^NuNVH/<eN XOB@LN^NuNVN^NuNVN^NuNV?.p?N(XON^NuNVN^NuNVHp?N(TO. `p`(p`$p` p`0`@H @bH0@^ PNLN^NuNVp?NATOpY?NATO0.@ ?NATO0. @ ?NATON^NuNVp?NATOpK?NATON^NuNVp?NATOpJ?NATON^NuNVp?NATONAN^NuNVNAN^NuNV0. yg@ yg(pN^NuNVJnf p3_` ygB( yg(pN^NuNVH yg"(A f(yg#g#gpLN^NuNVH(yg&ygԹf g(T`#g#gpLN^NuNVH>. 0D@??.NCXOLN^NuNVH>. yg ((@JGl,0RGJ@g, ygйg (T` yg ,g (l0SGJ@f yg!L yg(BF` ygԹ gj ygйg(TRF yg0(m yg ((@ yg(HH<0SFJ@g ygйg(T` yg!L ygBhpLN^NuNVH 9gܰgg(yg#g lS(f( l!l  l1l l!l l1l/ NWrXO` yg (@ yg lS(f( l!l  l1l l!l l1l/ NWrXO ygJf yg (&@ yg(H>JGg yg +gSG&k` ygB(09eS@ yg@ yg!K yg(pLN^NuNVH yg (l yg(H?/<eN \O` p?NVpTO(@ f/<fN XOB@`x ygR()yg yg ( )@ yg0(9@ yg ()@ yg0(9@B,B, yg(HS@H> yg(HS@G< yg (&@BE ygԷ gRE&S` yg (&@Em>Ef&S ygG yg ( yg yg(H0AR@@F`l-yg .gg$n n -@` f#g`$(g yghGRG yg( ygF0SGJ@g&S` yg!K)K yg(,pLN^NuNVHJn l0. D@??.NHXO` ygJf/<f1`4 yg"(A f(yg gg(T`,Hn n/<fAN XOB@` yg f*&lBG` lg &SRGn m)K0. ,`D yg (&@BG` yg +g &kRGn m yg!K yg0. ( yg0. (0. , yg(,pLN^NuNVHJn l0. D@??.NGXO` ygJf/<fS`: yg"(A f(yg gg(T` yg(Hn n/<fcN XOB@` yg f0&lBG` l +g &kRGn m)K0. ,`> yg (&@BG` ygзg &SRGn m yg!K yg0. ( yg0. (0. , yg(,pLN^NuNVH ygJfBgBgNEXOJ@fB`(yg g gf(T` LN^NuNVH yg ( -@~RGp?BN`\OJ@gNOJ@gp?BNK\OJ@gf yg . f0 ygJhg$p?BN8z\OJ@g8p?BN6l\OJ@g&p?BNK\OJ@g?BN\OJ@gp`B@LN^NuNVJn l0. D@??.NK`hp?BgN`XOJ@f>`8p?BgN`XOJ@g&NOJ@gNOJ@gp?BgN`XOJ@fB@`0. Sn J@fp?BgNXON^NuNVJn lR0. D@??.NKXO`Jp?BgNXOJ@g&NOJ@gNOJ@gp?BgNXOJ@fB@`0. Sn J@fpN^NuNVHJn l`p?BgNXOJ@g~NOJ@gNOJ@gn yg ( "yg @( H@> Gam0 Gzn*G yg ( "yg @G p?N#TOp?BgNXOJ@fB@`0. Sn J@frpLN^NuNVHJn l`p?BgNXOJ@g~NOJ@gNOJ@gn yg ( "yg @( H@> GAm0 GZn*G yg ( "yg @G p?N#TOp?BgNXOJ@fB@`0. Sn J@frpLN^NuNVHJn l`p?BgNXOJ@gNOJ@gNOJ@g yg ( "yg @( H@> Gam0 Gzn*G yg ( "yg @G p?N#TOp?BgNXOJ@f8B@`N yg ( "yg @( H@> GAm GZnG `NOJ@f0. Sn J@f2pLN^NuNVHJn mb yg ( (@ yg0(<BG0. Sn J@gDNOJ@fp?BgNXOJ@g RG`NOJ@gp?BgNXOJ@fB@`&RG` yg!L yg1Fp??N(*XOLN^NuNVHJn mrp?BgN`XOJ@g`BG0. Sn J@g@NOJ@fp?BgN`XOJ@g6RG`NOJ@gp?BgN`XOJ@gRG`p?BgNXOJ@fB@`p??N(*XOLN^NuNVH yg"h yg0(i gV yg ( "yg @( H@> Gam Gzo$ GAm GZo G0m G9o G$g G_fp`B@LN^NuNVH..|`0Ff "@fvSFJfp?/<fp?NXPOp?N TOLN^NuNVH9H<(|BG0RGH @h@ f0SFJ@g\  g  fB`HgJ,f: GOm"p?/<fp?NXPOp?NQ|TO0RGH @h@ R`B0H @h@B/<h@?N-\O?NQ|TOLN^NuNVNT4?.N TON^NuNVH(n,H@fp`@/ NQXO>,H?NXHTOJg,H@f /,NWrXOB,0LN^NuNVH(nBl Byh>,H@fd >o(?/,,H?NXPO20Ag yh>f,JGm$ ,/0<Hї f ,()@`)TB@`,pLN^NuNVH(nRl o / lNXO` TRB@> @ f ,H@f0LN^NuNVH(nJfP,H@f2J,m ,np`B@>ggLf?<NVpTO)@f)|Z)|]`^,H@f"JGggLf)|Z)|] ,`&)|Z)|\,H?NSTOHЬ()@Bl LN^NuNVHp?B?.NXPO. fB@` 0HH@LN^NuNVH(n/ NRXO/ lNXOLN^NuNVH>.(n / NRXO/ ? lN\OLN^NuNVH(|g.`Jg /NQXOYfdLN^NuNVH(|f`0Jg T(H@fp?//. /.N[@O(` Xg2eBLN^NuNVH>.(n G f,H@g/ p ?NT\OSl l/ ? lN\O` TR0LN^Nu"o`CH0"/ jD$jDANYJ/ j JgRJk`JjDL Nu o"`"/H8(jD$/jDFANYJjDLNu"o`CH0$jD"/ ANY g J/ j L NuNVH0.@@>ne?NWTO(@ff #ff`jJff$L #f#f`( 9fްf ]\G$l`&yf] K ($@'L0@@80H@B@H@Ќ#f&@] KBP'JLN^NuNVH0.V@@<ne(yf g0>@gX g0@S0>(KGd>F0 @d 0@8`80H@B@H@Ќ#f yf0 /0<Hї `p&L`JGg0@H@B@H@Ќ(@`(lffz g#fRyf09f @e SyfB` ?NUTO?.NVpTO(@Syf LN^NuNVH ./0<H (@JTf(/<fNYXO?/<fp?NXPONPTTLN^NuNVH>.0R@@>(yi" c0H@B@H@Ё&@e <`#i LN^NuNVBg/.p?N(XON^NuNV/. 0.H/?.p??N(O N^NuNV/. 0.H/?.p@?N(O N^NuNV?.pA?N(XON^NuNV?.?./. pB?N(O N^NuNV?.pE?N(XON^NuNV?.?. pF?N(\ON^NuNVH(n &nJfSf .LN^NuNVH(n&n B@fJfB@` BA#B@ALN^NuNVH(n &nf .LN^NuNVH(n&LJf S@LN^NupJfpNd⒲ed`<dFN0&HCHCBCЃ&HCHCBCЃNNVH(n/ NQXOJ@fx ]g^f/<gLNQXOByh> ,/0<Hї ?/,,H?NX`POD@9@ @f yh>g,Bl ` Jl f ,@p`0, Rl l)H TRB@LN^NuNVH(n ]g^f/<gLNQXOBl Byh>p?Hn,H?NX`PO`" yh>g$,`,@`B@.` @gJ@g`pLN^NuNVH(n>.|BnBnp=@ n R pr@H @rf BFpw@` H @wfRn`H @afRn n gDH @bfBn`H @+g H.f|R n gH @bfBnJGlJnf?/.NX,\O>JGl@JnfJng4?</.NX\O>m Fg?NXHTO?/.NX,\O>JGm6Jngp?B?NXPO f p?NVpTO(@ f?NXHTOB`8p@Jng,B)@()@Bl )|S)|TG LN^NuNVH(n / N]XOJ@gp`$ ,/0<Hї S@9@ TR0.LN^NuNVH>.(n GBl Byh>,H@f@/ N]XOJ@f2p?Hn,H?NXPO @f0` yh>g,pLN^NuNVH(n Bl ,/0<Hї f/ NQXOJ@f TR0. @ f/ NQXOJ@gp`0.LN^NuNVH(n,H@g / lNXO ,b / NQXO`4p? H/,H?NXPO fp` )TBl B@LN^Nud Ddfoxsx|D@AAAAAAAAA[Mark set]No mark in this windowUse buffer: Kill buffer: Buffer is being displayedC Size Buffer File- ---- - ----Cannot select builtin bufferDiscard changes0123456789ABCDEF MicroEMACS -- -- File: [y/n]? Read file: Visit file: [Old buffer]Buffer name: Cannot create buffer[New file][Reading file][Read 1 line][Read %d lines]Write file: No file name[Wrote 1 line][Wrote %d lines]Name: rwCannot open file for writingWrite I/O errorFile has long lineFile read errorFile has funny line at EOF Cannot allocate %d bytesbug: linsert)@,ALB`CAhD8(EFG3^H8zI5J7fK8LBM6lN&O6PQ5RR?S=T4VW:<Y9Z1BC1F L;FO6NCPCRSU;VJW XlZH!A~=3(2*)2n1D2EBE2F3KjNC$PCZZGHO4!B.,><BKCMDNFKLLQ5RR?S=ULVxW:O48zmainArg: 4Arg: %d[List]QuitNot now[Start macro]Not now[End macro]Not nowX=%d Y=%d CH=0x%x .=%D (%d%% of %D)neg killNo mark set in this windowBug: lost markSearchNot foundReverse searchNot foundNot in GEMDOSNot in GEMDOSPBAAAAB$BhBBCannot split a %d line windowCannot allocate WINDOW blockOnly one windowImpossible changeOnly one windowImpossible change0123456789ABCDEFUser abort at 0 Command line overflow Bad pointer in free. g2gLgfTST ST ST  *  ",  "  ,   2   \,&  *&     ("     .   4 : jn * B & >,0        $.&  ( $ ($n >    T*        0 0&   & .  , "       $   6   ,   &   *   * "   &  H,:D &  N &~@p  (4Pt      j"   ( .( n",  :@     "  . $H V$0   , (  2" .2 > &   $ &8   $&0nn      0  6   <D x\0 4     (     : <        8 6 8  < &  2 "" < ( D ( D (  *2  &  j     *(* 48.& (. /.NX`*./.N"DX`.N#`.N`./|/. /.N$ `.N%`>//<q/.N( `BW//<q/.N( `v.|/.N,\X`^.|/.N,X`H.q/.N4X`4.KN..LN.``|C|b@0@K PN`JLN^NuNV.LLN..LN..LN..LN..M!N. nJ(g,././././. /./.aNN^NuNVH *n.MWN.R.?< NT> N.\-HJFg M2FB(I` am zn H|`HRJfIBG`RRG  o mFmFfB@` JL0N^NuNVN^NuNVv./PN.XJ@f N1B@`Bn`0.H"N4n#@Rn n mBn`Rn n l2.PN2>J@g$ 2.AHЁ./PN.XJ@fBn`D N2n2nq!i. N2n2nq!iRn nm-yq-yq-yq=yq-n|/./././././././././. n|N(-@.M[N..NF.MmN.Bn`D0nq"N4n!i.0nq"N4n!iRn nm#q#q#q3qN^NuNV.PN2=@R n @fVR n 0m8 n 7n. nH|0@q-h. .м-@` N1B@`J`S.]/PN.XJ@f$.N2 J@g n -P` N1B@` ng .gR.PN2>J@g$./PN.XJ@f N1`` .м-@.N2 J@f N1` .2.HR-@`jN3J@f|.N1P> N.\> N.\=| B?< NT-@-n .мd .м` .-@`h0.`0 nH>N1~`0 n>N1f`" n.N1P``|gʰ|gְ|g> N.\0.@R@n0.HѮ .c` > N.\ n<@RnDm-n .мd .м` .-@` nH>N1R .c.?< NT> N.\ .c .2.HЁ"n "N^NuNV`R n  g-n`R n  g n  g nJf nB.?<=NT=@n.MpN.`./<?.?<?NPg .MN.>?<>NT`z>?<>NT-nJg.?<HNT#KBB/.?<?<KN -@d.MN.` n0 n"n!i n"n!i  n"n!i n"n!i n"n!i n"n!i n!n n-h n"n Y n Y n n!n n!n n!nJ nBh n"n  n"n NJg n./.NXX3r`3r.N38N^NuNVH.PN2>.Y/PN.XJ@g` N1B@`|g.g N1B@`.PN2>J@g.Q/PN.XJ@g` N1B@`b.PN2>J@g./PN.XJ@g` N1B@`..N2 J@f N1` .b.|f nJm|f .nJl N1B@`B?< NT-@`0`x .H"n nH".H@|g .N1`Z ."n2 n0H".g .N1`4 n n g .N1``|g|g|g0HѮ0HЮ".RcX.?< NTJLN^NuNVH.?<=NT=@./<?.?<?NP yK!n  yK"yK!i ."yKѩ yK"yK!i ."yKѩ -|Jf.MN.3qp` .ЮѮBW?./.?<BNP 9Kм$-@-n./.?.?<?NP/</.NIP=@Bn`8 n2.B@00|g yK2.Ү"A (ѩ Rn0.no0.JLN^NuNVH?>. BFv`.> N.\>N1f>(N.\ n2B@00=@|g >TN.\`2.g >DN.\`.g >BN.\` >AN.\.MN..g >HN.\` >VN.\.MN. n2. N1P.MN..gav`6BE`,0E2gH>N.\` > N.\RE|mζ|fv`0H H@J@fa66RFGnJCf> N.\JLN^NuNV.MN.N^NuNVH.MN.BW?<NTH<am<zn H|`H> N.\<NfB@`pJLN^NuNVHBnBG` n 2 0 f0Ю @:( .mf B@0|gfga .Hf >.N.\BF`.H>N.\RF|l0F2 Pf .Hg >:N.\ .Hg .hf > N.\` > N.\RnJnf RGyro(Jng .hf > N.\0.JLN^NuNVN^NuNVHBG`0Ю @=h.H`*B@0.|g`.B@0.|f``p``|Ag|Bg|Mg`.f.ga`BFz`pnl 0F `BH2F4 am,2F4 zn2F4H|`2F4HAgBERF|lJEfJEg n0 n2Ү"A p`RGyroB@JLN^NuNVpN^NuNV 9Kм$-@.N2 J@g.N N..N1P.NN.. N1P>HN.\> N.\Jyrl8.N/N.JKg.N:N..KN1P> N.\` .NNN..N1P> N.\`.PN2R nP.H`@.N2 J@gN1`L`\09rH"9q m.NaN.`&.PN2R nP .,f N1`RyrBn`B09rЮ2.HЁ @R n ,gJ.g nP`B.Rn nmS.PN2>J@g./PN.XJ@fSyrN1`n09rЮ @!n .PN2>J@g"./PN.XJ@g .=@`=|.N2 J@fSyrN1`09rЮ @1n`.?9r/.a\=@Jnl N1``0.Ю @h@`.N2 J@g,Bn`0.Ю @hRn0.yro`:.?9r/.a`\=@Jnl N1`H`0.Ю @h`&N1`(``|Ag|Hg.|Rgh`> N.\N^NuNV=|.N2 J@g =yq`.PN2 n (*f0R.Q/PN.XJ@g.N2 J@g .=@`X.Q/PN.XJ@gD.N2 J@g6Bn` n2. 0 f=nRn0.n nJnm0.n o=|0.N^NuNV-|.N2 =@ft./PN.XJ@g.g.NuN.`.PN2>J@g$./PN.XJ@gJyqf.N2 J@gJgzJyqgjJnga`ZBn`B0n"|rJpg,0n"|rZ 0f0nrBPByqRn n mJyqf `JngBn=|`0n"|rJpgRyq09q|o n la=@ByqJng> N.\0n"|r>N1f.NN.0n"|rZ.N1P.NN.Jyrm6>H?<m?9r/9K$0n"|rZ/0a Rn n lJnf> N.\`Bn`p0n"|rJpgZ0n"|rZ 0fB0n"|rB@00H@B@H@f.NN.` .2nr2`Rn n m3qBn`F0n"|rJpf0 .2nr20nrZ =| ByqRn n mJyqg.NN..NN.`N1N^NuNV m ~oB@`(>'N.\ .>?<NT>'N.\pN^NuNV nR n PH. fp` nSB@N^NuNVBn`0nrBPRn n mN^NuNV.PN2 n -P./PN.XJ@g-nBn`N n m N1``:./PN.XJ@g N2n!nRn` N1`D.PN2>J@f.N2 J@f N1B@` n . NJ@f=|`aBn`. N2n2n"v1Q0n v0JRn0.nm. NBn`0n v"N4n0Rn0.nma n -PBnBn`<0nrZ-P0n"|rJpg .f =|SnRn n lJng-n n PJf. N62.NN.`Jng0nr PgJyqf>a \. N620nq PNBg0nq PNCg . N`, .T-@ n=P n0J. N n0 n -P0nr Pc0nrSP`Bn. N62`Bn. N62Jng N3J@g n"n N^NuNV.PN2.N2 J@g4Jyrm>r/9K$NX` .NN.` .Y/PN.XJ@g~.N2 J@gn> N.\.N1P> N.\.N8J@g > N.\>h?<b?9r/9K$/.N > N.\`x.PN2>J@gb.Q/PN.XJ@gN.N2 J@g@> N.\ .Ю.N1P> N.\ ..N1P> N.\`N1N^NuNVH n PgN1`$ n &h*nRIB`RJfGJL8N^NuNVH.PN2.Y/PN.XJ@f$.N2 J@g n -P` N1B@`L.g N1B@`8.PN2>J@g&.Q/PN.XJ@gBG` N1B@``-n~.N2 J@g .c N1B@`BF`N3J@fB?< NT-@JKg,>v?<m?9r/9K$/.N @> N.\> N.\.N1P> N.\#qN:.?< NT> N.\09qHѮRF n .c>JGg| m2JLN^NuNV.PN2.Y/PN.XJ@g` N1B@`.PN2>J@g.Q/PN.XJ@g` N1B@`.PN2>J@g./PN.XJ@g` N1B@`b.N2 J@g .c N1B@`@B?< NT-@` n"nRR .c.?< NTN^NuNV.PN2R.?<=NT=@l.ON.`.'?<HNT-@Bn>?.B?<BNP-@BW?.B?<BNP./.?.?<?NP-@g .ON.>?<>NT n0 n!n n!n.N38 n N^NuNVH.PN2>.Y/PN.XJ@g` N1B@`|g.g N1B@`|.N2 J@f N1B@`b.N1P> N.\B?< NT-@0`0 nH>N1~`0 n>N1f`" n.N1P``|gʰ|gְ|g.?< NT> N.\|S.?< NT> N.\ N.H=AHB(Jno ..fB@`A-H`0 n am n zn nH|` nH"nR nJfA-H.Q/N.XJ@g` N1B@`R n  g nJf.|f nJm|f .nJl N1B@`B?< NT-@0` .H"n nHH".g .N1`d ."n2 n0H".g .N1`8 n n ".g .N1``|gz|g|g.?< NT0HѮ`JLN^NuNVH=yr.PN2>W/PNX>./PN.XJ@f-|.N2 J@f N1`RJngJyqg3r` n * E<|Jf. N62.O;N.`0||N@fT E< E0J. N E0`JGgx0||ag 0||Nf^0|f=|`L0||af=|`8|?|8m|9f=|`=|`|8|f=|`=|`Bn-EBnBn`80n"|rJpg"0n"|rZ 0f =|SnRn n lJngJngL0nr Pc0nrSP`BJgJnfJyqf>a. N62JngT0.Hڀ E< E0J. N=@=|`a. Na n -@fBn`BnBn`80n"|rJpg"0n"|rZ 0f =|SnRn n lJngJng"0nr Pc0nrSP`BnB n PJf. N62.OaN. E0`JgJnfJyqf>az. N62. N=@N3J@g BnBBnJnf E0`. N=@Jng . N62N3J@fJngB .SJfJnf . N62 n"n 3rJLN^NuNV.N2 J@g . N38`N1N^NuNV.PN2R n PgN1`V.?<ANTBW/.?<?<>NTN^NuNV.ON..N..ON.N^NuNV> N.\0n"|r>N1f.ON.0n"|rZ.N1P> N.\N^NuNVBn`J0n"|rJpg40nq2nrZ"Q00n"|rZ p0JRn n mN^NuNVBn`60n"|rJpg 0n"|rZ p2nq0Rn n mN^NuNV n g n g n g n gB@`pN^NuNVH. H>?<NT< f> ?<NTJLN^NuNVH*nBG` H>aRGJf0JL N^NuNVH n Ph ..g .=g .@g .!f nR *@ nRR Mg$< g<,g<+g<-g </g<*fJyrmB.q/?<B/9K$ n/ "n"?N|gB@`p>Gg .=g ..g .gBG`dB.H`:-n`J-n nP`:-n n=P`*-n n-P``|!g|.g|=g|@g-n`6BBG n*P`RGH>anH".Ё-@RH>a J@fS n n 0JL N^NuNVH. <0m<9o<Am<FoB@`pJLN^NuNVH. <0m<9n H|` `H|JLN^NuNVH. < l H|0`H|7JLN^NuNVH..<. :.`0YF 2H>a<0gBEJEgJFf H>a|lJLN^NuNVBW?< /.a\N^NuNVBW?<0n/a\N^NuNVBW?<. HH/af\N^NuNVH. B.< m<~op.`H@.UaJLN^NuNV.OaN^NuNV.Oa.aT> aXN^NuNVR` nH>aJ@fB@``R nJfpN^NuNVH *n(UR  g ,gB@`2`R  gJfB@` ,gS*p`R`R  gS*pJL0N^NuNVH*nR`R UH>axJ@fSJL N^NuNVH *n(UR L Wf~` Lf~`~S*.a0JL0N^NuNVB?< NTgB?<NTp``B@N^NuNVH *n0`.OaH`BG`I0@HBF`0`&.Oa`*.Oa`.Oa``J@gְ|gܰ|g0`.Pa`.Pa` ` J@g|g.Pa.apP.PaRF|mz> a^RG|mV.Pa.a6.P-av.a$`D.PMab.a.PVaP -Э.Sa``J@g|g|g> aJL0N^NuNV.azJ@g. a```./<PbaXJ@g. /<PeadX`8./<PhaXJ@g4. X/<Pla:XJ@g n ( f n "n !iJ`./<PpaXXJ@g4. P/<PtaXJ@g n ( g n "n !iJ`./<PxaXJ@gB.  /<P{aX n ( g n "n !iJ` n "n !iJ`PR n Df. /.?<Da\`( n Af. ./.?<Aa\`a n ( g n "n !iJ` n "n !iJN^NuNVH*n.P~aT.a> a.Pa<.a> a.Pa".a> a.Pa>- >a.Pa0|g .Pa g .Pa.Pa0|@>W0axg .Pag .Pag .Pag .Pavg .Paf> a .?<DaT..?<AaT#qB?< NT-@>h?<m?9r/9K$/N N:.?< NT> aJL N^NuNVH*n R M 0m< 7n6.a J@g,n UB.H@HЮ.@/YaX`aJL N^NuNV>/. /.a4PN^NuNVBW/. /.aPN^NuNV>/. /.aPN^NuNVH *n(n >.BE.a>=a0`.BW?</aX\`4H>a`(>a` .a``J@gΰ|gذ|gް|g> az|S.?< NT> aX.Ho0FB(A-H`0 n am n zn nH|` nH"nR nJfA-H./aLXJ@g^.aJ@gR0`4 .(`< .H`, .8`(``J@gȰ|gа|gڰ|gz`.a"J@fa0JL0N^NuNVH. H>aL> aDBG`&> a8 n .a"X |f> aRG|m> a JLN^NuNVH *n(n ahJL0N^NuNVH *n(n Jg RHgJf.ajJ@gp``B@JL0N^NuNVHB9q 9qT#q3q yq3q*|P`0yq԰mg `.N..bnN.Jmm4 mn*Jmg0-`a*`a6`a`a8`a`a`ap`a`a`a0`al`|a`ta`la.`da`\a`Ta`LaJ`Fa`@a4`:a`4a`.a`(a`"a2`a``|b@0@[2 PNJ9qg<> N.\>H9qH??9r/9K$/9qN ` >?N.\JL N^NuNV.bqN.N^NuNVH>9q|p g9qg >qWa >,N.\>a `>qWa ">,N.\>a JLN^NuNVH>9q|p g09q||f|09q||f|PG` <9q|F|n 9qf$>?9qW?a ,T>,N.\>a `">a >,N.\>?9qW?a TJLN^NuNVH>9q|G>a ~>,N.\09q`0.bN.`8.bN.`*>?9qW?ma T`H |[rW hNJLN^NuNVH>9q|p gJGf~.bN.0H>a>,N.\>?9qW?a "TJLN^NuNVH>9q|JGf.bN.`|f .bN.>?9qW?a T|f.bN.`|f .bN.JLN^NuNVH>9q|p g9qg>a`JGf~>#N.\0H>a>,N.\>qWaJLN^NuNV>?9qW?a "TN^NuNVH9qHJGg :Gq` yq0H*@qTqTyq.bN..aJL N^NuNVH>?9qW?aT>,N.\>9q|p g>aJLN^NuNV9qg09q|r `>a`>a>,N.\>?9qW?a8TN^NuNVH>qWa2>,N.\>9q|p g>aJLN^NuNVH>qWaP>,N.\ yq0H*@qTqTyq.aJL N^NuNVH>9q|p g<9q|:9q||HfPGPF`|fPF>a>,N.\>aJLN^NuNVH>9q|>aJLN^NuNV>qWa.bN. yq>aVTqTyqN^NuNVH<9q|0|fBG`|0f~`| f~`aR>?9qW?aT>,N.\<9q|p f09q|@@>?axTJLN^NuNVH>9q|9qg.bN.>a`>a.bN.JLN^NuNVH yq>TqTyq9qg.>?9qW?aT>,N.\>/<[aX`L09q|8| f>/<[aX`>/<[aX>,N.\>?9qW?aTJLN^NuNVH>9q||f09q|r `>a>,N.\ yq<>a>qWa|f>,N.\09q|r `>aTqTyqJLN^NuNV.bN.09q|H>a@>,N.\09q|r `>aXN^NuNV>aFN^NuNV>qWa2N^NuNV.bN.09q|H>aN^NuNVH yq:TqTyq>|<|p f|9qg>a>,N.\0`H.bN.`R.bN.`D.bN.`6.bN.`(.bN.``J@g|g|gİ|g`9qf>,N.\>a@JLN^NuNVH<9q| yq:TqTyq>|p g| g>a>,N.\>?9qW?a.T9qf>,N.\>aJLN^NuNVH<. *nzBG`@0]g(JEf >/N.\|g>a>-N.\z`|f >SWadBERG|m|f .bN.JL N^NuNV>DN.\>N0>N.\N^NuNV>AN.\>N0>N.\N^NuNV>(N.\>a>)N.\N^NuNV>(N.\>a>)N.\N^NuNV>-N.\>aN^NuNV>a>+N.\N^NuNV#qmq>?< /.N0\N^NuNV>?<0n/N0\N^NuNV>?<. HH/N0\N^NuNV.bN.N^NuNVH>.|o >QWa`>aJLN^NuNVH yq>TqTyq>$N.\>aVJLN^NuNVH yq>TqTyq>$N.\0|H>a6>(N.\ nf.cN.`>a,>,N.\0r `>Wa* g .c N.>)N.\JLN^NuNVB nf yq=PTqTyq yq=PTqTyq.cN..a4N^NuNVH<.|8F>.|0`>aN`>ah`>a`>a`>a`a>a`>a`B0` yq0H( gTqTyq.a`~ yq=PTqTyq yq=PTqTyq>$N.\.aL`a` > a``|b@0@\ PN``|b@0@\& PNJLN^NuNVH?BCB..,. f#q^ <`hlDRCJlDRCn8fzB`0l :HGH`xe`Jge`|fD#q^ D`#q^ JLN^NuBus ErrorAddress ErrorIllegal InstructionDivide by Zero'CHK' Exception'TRAPV' ExceptionPrivilege ViolationTrace ExceptionLine 1010 EmulatorLine 1111 Emulator at Bye 0J\JfJtJJJJJJJNNNNNNNNNN&F>RjFFxF2Available commands are: C, D, E, F, G, H, I, K, L, M, P, R, S, T, U, V, W, X *3 SID-68K for GEMDOS 3/22/85 Version 0.1 Serial #XXXX-0000-654321 All Rights Reserved Copyright 1982,1983,1984,1985 Digital Research Inc. *3 -Return value --> h Cannot open program file Can not read program file. program load error No symbols )(): = ** Long COBOL-style symbol ** Continue listing? (y/n)SID begins at H with basepage at No symbols; file header at: Symbol table at: Symbol table full No change--Address must be even! Already set Too many pass points--limit is: 32 Encountered the ILLEGAL instruction No symbols Cannot open file File too big -- read truncated. Encountered the ILLEGAL instruction Encountered the ILLEGAL instruction Unimplemented Function: PASS ? Bad or non-existent RAM at ERROR, no program or file loaded.text data bss base length = base page address = initial stack pointer = Start = End = PCPCUSPUSPSSPSSPSTSTPC=USP=SSP=ST==>TR SUP IM= EXT NEG ZER OFL CRY<\F|\M <\T |\[J\bJ\jJ\rNq\z<\~|\Np\Nt\Ns\Nw\Nu\Nr\Nv\Nz\P \Q \R \S \T \U \V \W \X \Y \Z \[ \\ \] \^ \_ \H\H]NP] N`]Nh]H@]NX]#N@](]-@]4];]B@]I]P]W][@ ]_ ]d ]i ]nB]sB@]yB] ] @] ] ] @] ]N]N]]]B]D]F]@]L]L]H]H]]@^^ H^D^D@^D^$@^*@@^1@^8F^?F@^EF^K^Q@^W^]H@^c^g^k^o^tP^yQ^|R^S^T^U^V^W^X^Y^Z^[^\^]^^^_^^@^^J^J^J@^J^b^c^d^e^f^g^h^i_j_k_l_ m_n_o_`_a_ _$_)_.@_5р_<_CH_Jш_Q@ _XH _\ _`_d@_j_p _v`_|__@__ _`__ _H _ __H__(_h___H__(_h_`` H```!`)X`/`58`;x`A`G`MX`S`Y8`_x`e`k`qP`x`0`p```P``0`p`````@```H```@`Ѐaa @aрaaa$Pa+P@a2Pa9a@@aFaLaR@aXa^@ ad ai an asA axa|@aaaa a aa@aaAa0@a @a a aa@aaa@aaa@abb@b bbbQb&Q@b-Qb4pb;bC0bJ bQbX;>;F;N;V;^;f;n;v;~;;;;;;;;;;;;;;;;;<|<| < |=======؀@ @  @ @HI I`IrI|HHHHHHHHandi.bandi.weori.beori.willegalillegalillegalnopori.bori.wresetrtdrtertrrtsstoptrapvmovecdbtdbfdbhidblsdbccdbcsdbnedbeqdbvcdbvsdbpldbmidbgedbltdbgtdbleext.wext.llinkmove.lmove.lswapunlktrapaddi.baddi.waddi.landi.bandi.wandi.laslasrbchgbclrbsetbtstclr.bclr.wclr.lcmpi.bcmpi.wcmpi.leori.beori.weori.ljmpjsrlsllsrmove.wmove.wmove.wmove.wmovem.wmovem.lmovem.wmovem.lmoves.bmoves.wmoves.lnbcdneg.bneg.wneg.lnegx.bnegx.wnegx.lnot.bnot.wnot.lori.bori.wori.lpearolrorroxlroxrstsfshislssccscssneseqsvcsvssplsmisgesltsgtslesubi.bsubi.wsubi.ltas.btst.btst.wtst.lbhiblsbccbcsbnebeqbvcbvsbplbmibgebltbgtblebrabsrabcdabcdaddx.baddx.waddx.laddx.baddx.waddx.lexgexgexgasl.basl.wasl.lasl.basl.wasl.lasr.basr.wasr.lasr.basr.wasr.lcmpm.bcmpm.wcmpm.llsl.blsl.wlsl.llsl.blsl.wlsl.llsr.blsr.wlsr.llsr.blsr.wlsr.lmovep.wmovep.lmovep.wmovep.lrol.brol.wrol.lrol.brol.wrol.lror.bror.wror.lror.bror.wror.lroxl.broxl.wroxl.lroxl.broxl.wroxl.lroxr.broxr.wroxr.lroxr.broxr.wroxr.lsbcdsbcdsubx.bsubx.wsubx.lsubx.bsubx.wsubx.ladd.badd.wadd.ladd.badd.wadd.ladda.wadda.laddq.baddq.waddq.land.band.wand.land.band.wand.lbchgbclrbsetbtstchkcmp.bcmp.wcmp.lcmpa.wcmpa.ldivsdivueor.beor.weor.lleamovea.wmovea.lmulsmuluor.bor.wor.l or.bor.wor.lsub.bsub.wsub.lsub.bsub.wsub.lsuba.wsuba.lsubq.bsubq.wsubq.lmoveq.lmove.bmove.wmove.l*unknown instruction* illegal instruction format # SRCCR#$SR,CCR,,CCR,SR$,#$USP,,USP#$#$SFCDFCUSPVBRillegal Control RegisterA7 ** illegal size field ** PC,.l#$(PC)_SIDSTRT_GO_STEP_BDOS_trap_caputK_mainV_init_readcom_callrt_display _loadpgm D_fillmemn_clean_simzX_deluge_kobold _pause4_spell_roam_indica_trek_koax_findsnD_passpt_zappas_qotbyt8_vecina_gocmd_stick-_yank-_shopas-,_hexmath _incomtl!_disasm"D_movemem#_readfl$_setmem%_trace(_vcmd,\_wrtfile,_dummy-_isspace.._putchar.\_stout._gethex._hexval0_ishex0b_hexchar0_puthex0_puthexl1P_puthexw1f_puthexb1~_putbyte1_bad1_badram1_nomore2 _getsep2>_deblank2_getform2_keyhit3_showval38_examine4_showsta62_cmp:z_pregl8*_pregw8X_pdareg7_preglro9_preg8p_pregn8B_tryflag:\_optabP_pinstr:_noin _inf5>f_inf6>_inf7?D_inf8?`_inf9?_inf10?_inf11@J_inf12@_inf13@_inf14A4_inf15AV_inf16A_inf17B_inf18B\_inf19C_inf20C_inf21C_inf22C_inf23C_inf24D"_inf25D_paripdFx_pdrE_prtopHz_prtregG(_primmH&_hexbzsF_hexlzsF_paripiF_parF_hexwzsF_badsizeG_regmsk0[_regmsk1[_putrlisEt_pariFV_pdriF4_prdispGT_prindexG_ldivIldivI_HMSYMSq _stateq_ldivrq^_ssvalqb_lbufqd_minusq_ancienq_symptrq_symctq_instrq_sdotq_nomoq_esymbufq_tdotq_fsymbolq_refq_inhaltq_errflgq_dotincq_ssymflgq_dotq_ssymbolq_omegar_tsymr_ssymvalr_symbufr_pkawntr_plocusrZ_symlenr_sefaflgr_scoper_seffadrr_textsymr84          4 &6 T4 "    L J"& F  &B$   H ,L z "  B<& @""  &&*P $  0 : ,. B$       R    (, * h *  ,* F  $ \RF  & "     B   @2(  $  P:,"&&   &8$08  (,$   .\p$&* " &h22 "6  H    " & "   "$" &  ( .*   ", $  $ :(  ">       (.f      D `  B?< NA\#?<NNTO##' |.|:<??<NAXQ xV#Cx!I/9?< NA\/<?<1NA 9Sf y <@ Qp # ygNNumfpPlowtpaPhitpaPtbasePtlen PdbasePdlenPbbasePblenPxdta Pparent$DTA_attrDTA_timeDTA_dateDTA_sizeDTA_nameDebStckSavScreenWaitBin..bin12VblVirusxFinAttendsVas_y.BoucleTermine  & xMANUEL.DOC Version 1.1 Ce manuel n'est pas un manuel au sens propre, il est l pour vous aider, vous rappeler les extensions de fichiers que vous rencontrerez sur les disquettes de la STATION en particulier, sur toutes les disquettes ATARI ST 3.5 pouces en gnral. Ce manuel est remis jour ds qu'une nouvelle explication parat ncessaire. Nous vous remercions de nous communiquer vos ventuelles  observations et remarques afin de lui apporter les amliorations indispensables . Principe des extensions des noms de fichier : -Ne pas confondre le mot "fichier" (DOC, PRG ou autre) avec le mot "dossier". Un fichier contient des donnes, un dossier contient zro, un, ou plusieurs fichiers. L'extension d'un nom de fichier se trouve aprs le point du nom du fichier. Exemple: MONFICHI.DOC --- 'MONFICHI' est le nom du fichier ( maxi 8 lettres ). 'DOC' est l'extension ( maxi 3 lettres ). *C ACC Programme en accessoire de bureau. Il doit obligatoirement se trouver au niveau 0 de la disquette ( donc pas dans un dossier! ). La disquette en place, il se charge l'allumage de l'Atari ST et est disponible depuis la barre des menus dans le menu le plus gauche. Attention, GEM ne peut charger que six accessoires au maximum ! A Compilation de fichiers ralise sous ARC.TTP APP Programme GEM. ( APPlication ). ASM Fichier listable source en assembleur. BAS Fichier basic. BAT Fichier commande batch. Gnralement, fonctionne avec un programme type DOS. C Fichier listable source en C. DEF Fichier datas. DFN Fichier datas. DOC Fichier de documentation. Listable. Parfois, Extension utilise pour dsigner des fichiers FIRST WORD. DOO Fichier image utilisable avec DOODLE.PRG. FIL Fichier datas. LIB Fichier librairie ( souvent pour un linker ) d'un langage. LOG Fichier Logo. NEO Fichier Neochrome. O Fichier objet, produit par un assembleur ou compilateur. OBJ Idem. OVR fichier overlay charg par un autre programme. PAS Fichier Pascal. PIC Fichier image. PI1 Fichier image Degas. PI2 " " " PI3 " " " PC1 " " " PC2 " " " PC3 " " " PRG Programme. Cliquez, a marche.Certains doivent tre placs dans un dossier AUTO ( charg l'allumage de l'Atari ST ).  RSC Fichier Ressource d'un programme.Lorsque vous rencontrerez un fichier possdant ce type d'extension, il devra toujours se trouver avec le programme du mme nom ( ses cts ). Ce fichier contient des donnes qui permettent au programme d'affcher des icones, des images, des boutons, etc... TOS Programme excutable sous TOS.C'est dire pas sous GEM ! Vous n'aurez ni fentre, ni souris. TTP idem TOS, avec transmission de paramtres. Cliquez deux fois, une fentre s'ouvre et vous demande une ligne de caractres ( ligne de commande ) avant de lancer le programme dsign. *A Pour toute correspondance : STATION INFORMATIQUE +  2 rue Pimontsi PARIS 75018 France Tl : 42 55 14 26 de 14 19 Heures. du Lundi au samedi. *A .  sW.. SOURCES  tWMANUEL  WJ.  tW..  rWACCSTARTS APSTART S ATARI S UBUG S a6BUGS S y:CLS S GCODE S 6@CODE65 S EDIT S LENTETE S EXAMPLE S "EXAMPLE1S %EXAMPLE2S 'IGEMSTARTS +^IMAGES S 0` INSTMAC S 4b LARGE S 7kRESET S :TXT S =VIR S BWIZ S G!H"* ACCSTART.S 4/30/85 MIKE SCHMAL * * DESK ACCESSORY STARTUP PROGRAM * * This version only contains what is necessary for a desk accessory to run * All other garbage has been removed as not to waste memory. * .text .globl _main .globl _crystal .globl _ctrl_cnts * * Must be first object file in link statement * move.l #ustk,a7 * get program stack jsr _main * go to program move.l #0,(a7) * back to gemdos trap #1 * * necessary for the binds to work, everyone gets one * _crystal: move.l 4(a7),d1 move.w #200,d0 trap #2 rts * * * * .bss .even retsav: .ds.l 1 .ds.l 256 ustk: .ds.l 1 * .data .even _ctrl_cnts: * Application Manager .dc.b 0, 1, 0 * func 010  .dc.b 2, 1, 1 * func 011  .dc.b 2, 1, 1 * func 012 .dc.b 0, 1, 1 * func 013 .dc.b 2, 1, 1 * func 014 .dc.b 1, 1, 1 * func 015 .dc.b 0, 0, 0 * func 016 .dc.b 0, 0, 0 * func 017 .dc.b 0, 0, 0 * func 008 .dc.b 0, 1, 0 * func 019 *  Event Manager .dc.b 0, 1, 0 * func 020 .dc.b 3, 5, 0 * func 021 .dc.b 5, 5, 0 * func 022 .dc.b 0, 1, 1 * func 023 .dc.b 2, 1, 0 * func 024 .dc.b 16, 7, 1 * func 025 .dc.b 2, 1, 0 * func 026 .dc.b 0, 0, 0 * func 027 .dc.b 0, 0, 0 * func 028 .dc.b 0, 0, 0 * func 009 *  Menu Manager .dc.b 1, 1, 1 * func 030 .dc.b 2, 1, 1 * func 031 .dc.b 2, 1, 1 * func 032 .dc.b 2, 1, 1 * func 033 .dc.b 1, 1, 2 * func 034 .dc.b 1, 1, 1 * func 005 .dc.b 0, 0, 0 * func 006 .dc.b 0, 0, 0 * func 007 .dc.b 0, 0, 0 * func 008 .dc.b 0, 0, 0 * func 009 *  Object Manager .dc.b 2, 1, 1 * func 040 .dc.b 1, 1, 1 * func 041 .dc.b 6, 1, 1 * func 042 .dc.b 4, 1, 1 * func 043 .dc.b 1, 3, 1 * func 044 .dc.b 2, 1, 1 * func 045 .dc.b 4, 2, 1 * func 046 .dc.b 8, 1, 1 * func 047 .dc.b 0, 0, 0 * func 048 .dc.b 0, 0, 0 * func 049 *  Form Manager .dc.b 1, 1, 1 * func 050 .dc.b 9, 1, 1 * func 051 .dc.b 1, 1, 1 * func 002 .dc.b 1, 1, 0 * func 003 .dc.b 0, 5, 1 * func 004 .dc.b 0, 0, 0 * func 005 .dc.b 0, 0, 0 * func 006 .dc.b 0, 0, 0 * func 007 .dc.b 0, 0, 0 * func 008 .dc.b 0, 0, 0 * func 009 *  Dialog Manager .dc.b 0, 0, 0 * func 060 .dc.b 0, 0, 0 * func 061 .dc.b 0, 0, 0 * func 062 .dc.b 0, 0, 0 * func 003 .dc.b 0, 0, 0 * func 004 .dc.b 0, 0, 0 * func 005 .dc.b 0, 0, 0 * func 006 .dc.b 0, 0, 0 * func 007 .dc.b 0, 0, 0 * func 008 .dc.b 0, 0, 0 * func 009 * Graphics Manager .dc.b 4, 3, 0 * func 070 .dc.b 8, 3, 0 * func 071 .dc.b 6, 1, 0 * func 072 .dc.b 8, 1, 0 * func 073 .dc.b 8, 1, 0 * func 074 .dc.b 4, 1, 1 * func 075 .dc.b 3, 1, 1 * func 076 .dc.b 0, 5, 0 * func 077 .dc.b 1, 1, 1 * func 078 .dc.b 0, 5, 0 * func 009 * Scrap Manager .dc.b 0, 1, 1 * func 080 .dc.b 0, 1, 1 * func 081 .dc.b 0, 0, 0 * func 082 .dc.b 0, 0, 0 * func 083 .dc.b 0, 0, 0 * func 084 .dc.b 0, 0, 0 * func 005 .dc.b 0, 0, 0 * func 006 .dc.b 0, 0, 0 * func 007 .dc.b 0, 0, 0 * func 008 .dc.b 0, 0, 0 * func 009 * fseler Manager .dc.b 0, 2, 2 * func 090 .dc.b 0, 0, 0 * func 091 .dc.b 0, 0, 0 * func 092 .dc.b 0, 0, 0 * func 003 .dc.b 0, 0, 0 * func 004 .dc.b 0, 0, 0 * func 005 .dc.b 0, 0, 0 * func 006 .dc.b 0, 0, 0 * func 007 .dc.b 0, 0, 0 * func 008 .dc.b 0, 0, 0 * func 009 * Window Manager .dc.b 5, 1, 0 * func 100 .dc.b 5, 1, 0 * func 101 .dc.b 1, 1, 0 * func 102 .dc.b 1, 1, 0 * func 103 .dc.b 2, 5, 0 * func 104 .dc.b 6, 1, 0 * func 105 .dc.b 2, 1, 0 * func 106 .dc.b 1, 1, 0 * func 107 .dc.b 6, 5, 0 * func 108 .dc.b 0, 0, 0 * func 009 * Resource Manger .dc.b 0, 1, 1 * func 110 .dc.b 0, 1, 0 * func 111 .dc.b 2, 1, 0 * func 112 .dc.b 2, 1, 1 * func 113 .dc.b 1, 1, 1 * func 114 .dc.b 0, 0, 0 * func 115 .dc.b 0, 0, 0 * func 006 .dc.b 0, 0, 0 * func 007 .dc.b 0, 0, 0 * func 008 .dc.b 0, 0, 0 * func 009 * Shell Manager .dc.b 0, 1, 2 * func 120 .dc.b 3, 1, 2 * func 121 .dc.b 1, 1, 1 * func 122 .dc.b 1, 1, 1 * func 123 .dc.b 0, 1, 1 * func 124 .dc.b 0, 1, 2 * func 125 .end * APSTART.S 4/30/85 MIKE SCHMAL * * APPLICATION STARTUP PROGRAM * * This version only contains what is necessary for a application to run * All other garbage has been removed as not to waste memory. * * Sample application startup code. This must be the first object file in * the link statement so that the base page address can be accessed. * When a program is executed, GEMDOS gives all available memory to it. * If this program needs to do any memory management, then one must first * free unused memory by a setblock call. All "segment" lengths in the base * page are totaled and 0x100 is added for the base page length for the setblock * call. * .text .globl _main .globl _crystal .globl _ctrl_cnts * * Must be first object file in link statement * move.l a7,a5 * save a7 so we can get the base page address move.l #ustk,a7 * set local stack move.l 4(a5),a5 * basepage address move.l $c(a5),d0 add.l $14(a5),d0 add.l $1c(a5),d0 add.l #$100,d0 * skip los pageos baseos move.l d0,-(sp) move.l a5,-(sp) move d0,-(sp) * junk word move #$4a,-(sp) trap #1 add.l #12,sp * jsr _main * go to program move.l #0,-(a7) * back to gemdos trap #1 * * For GEMAES calls from AESBIND.ARC or cryslib.o * _crystal: move.l 4(a7),d1 move.w #200,d0 trap #2 rts * * .bss .even .ds.l 256 ustk: .ds.l 1 * .data .even _ctrl_cnts: * Application Manager .dc.b 0, 1, 0 * func 010 .dc.b 2, 1, 1 * func 011 .dc.b 2, 1, 1 * func 012  .dc.b 0, 1, 1 * func 013 .dc.b 2, 1, 1 * func 014 .dc.b 1, 1, 1 * func 015 .dc.b 0, 0, 0 * func 016 .dc.b 0, 0, 0 * func 017 .dc.b 0, 0, 0 * func 008 .dc.b 0, 1, 0 * func 019 *  Event Manager .dc.b 0, 1, 0 * func 020 .dc.b 3, 5, 0 * func 021 .dc.b 5, 5, 0 * func 022 .dc.b 0, 1, 1 * func 023 .dc.b 2, 1, 0 * func 024 .dc.b 16, 7, 1 * func 025 .dc.b 2, 1, 0 * func 026 .dc.b 0, 0, 0 * func 027 .dc.b 0, 0, 0 * func 028 .dc.b 0, 0, 0 * func 009 *  Menu Manager .dc.b 1, 1, 1 * func 030 .dc.b 2, 1, 1 * func 031 .dc.b 2, 1, 1 * func 032 .dc.b 2, 1, 1 * func 033 .dc.b 1, 1, 2 * func 034 .dc.b 1, 1, 1 * func 005 .dc.b 0, 0, 0 * func 006 .dc.b 0, 0, 0 * func 007 .dc.b 0, 0, 0 * func 008 .dc.b 0, 0, 0 * func 009 *  Object Manager .dc.b 2, 1, 1 * func 040 .dc.b 1, 1, 1 * func 041 .dc.b 6, 1, 1 * func 042 .dc.b 4, 1, 1 * func 043 .dc.b 1, 3, 1 * func 044 .dc.b 2, 1, 1 * func 045 .dc.b 4, 2, 1 * func 046 .dc.b 8, 1, 1 * func 047 .dc.b 0, 0, 0 * func 048 .dc.b 0, 0, 0 * func 049 *  Form Manager .dc.b 1, 1, 1 * func 050 .dc.b 9, 1, 1 * func 051 .dc.b 1, 1, 1 * func 002 .dc.b 1, 1, 0 * func 003 .dc.b 0, 5, 1 * func 004 .dc.b 0, 0, 0 * func 005 .dc.b 0, 0, 0 * func 006 .dc.b 0, 0, 0 * func 007 .dc.b 0, 0, 0 * func 008 .dc.b 0, 0, 0 * func 009 *  Dialog Manager .dc.b 0, 0, 0 * func 060 .dc.b 0, 0, 0 * func 061 .dc.b 0, 0, 0 * func 062 .dc.b 0, 0, 0 * func 003 .dc.b 0, 0, 0 * func 004 .dc.b 0, 0, 0 * func 005 .dc.b 0, 0, 0 * func 006 .dc.b 0, 0, 0 * func 007 .dc.b 0, 0, 0 * func 008 .dc.b 0, 0, 0 * func 009 * Graphics Manager .dc.b 4, 3, 0 * func 070 .dc.b 8, 3, 0 * func 071 .dc.b 6, 1, 0 * func 072 .dc.b 8, 1, 0 * func 073 .dc.b 8, 1, 0 * func 074 .dc.b 4, 1, 1 * func 075 .dc.b 3, 1, 1 * func 076 .dc.b 0, 5, 0 * func 077 .dc.b 1, 1, 1 * func 078 .dc.b 0, 5, 0 * func 009 * Scrap Manager .dc.b 0, 1, 1 * func 080 .dc.b 0, 1, 1 * func 081 .dc.b 0, 0, 0 * func 082 .dc.b 0, 0, 0 * func 083 .dc.b 0, 0, 0 * func 084 .dc.b 0, 0, 0 * func 005 .dc.b 0, 0, 0 * func 006 .dc.b 0, 0, 0 * func 007 .dc.b 0, 0, 0 * func 008 .dc.b 0, 0, 0 * func 009 * fseler Manager .dc.b 0, 2, 2 * func 090 .dc.b 0, 0, 0 * func 091 .dc.b 0, 0, 0 * func 092 .dc.b 0, 0, 0 * func 003 .dc.b 0, 0, 0 * func 004 .dc.b 0, 0, 0 * func 005 .dc.b 0, 0, 0 * func 006 .dc.b 0, 0, 0 * func 007 .dc.b 0, 0, 0 * func 008 .dc.b 0, 0, 0 * func 009 * Window Manager .dc.b 5, 1, 0 * func 100 .dc.b 5, 1, 0 * func 101 .dc.b 1, 1, 0 * func 102 .dc.b 1, 1, 0 * func 103 .dc.b 2, 5, 0 * func 104 .dc.b 6, 1, 0 * func 105 .dc.b 2, 1, 0 * func 106 .dc.b 1, 1, 0 * func 107 .dc.b 6, 5, 0 * func 108 .dc.b 0, 0, 0 * func 009 * Resource Manger .dc.b 0, 1, 1 * func 110 .dc.b 0, 1, 0 * func 111 .dc.b 2, 1, 0 * func 112 .dc.b 2, 1, 1 * func 113 .dc.b 1, 1, 1 * func 114 .dc.b 0, 0, 0 * func 115 .dc.b 0, 0, 0 * func 006 .dc.b 0, 0, 0 * func 007 .dc.b 0, 0, 0 * func 008 .dc.b 0, 0, 0 * func 009 * Shell Manager .dc.b 0, 1, 2 * func 120 .dc.b 3, 1, 2 * func 121 .dc.b 1, 1, 1 * func 122 .dc.b 1, 1, 1 * func 123 .dc.b 0, 1, 1 * func 124 .dc.b 0, 1, 2 * func 125 .end P .nlist ; 21-Jul-1987 lmd ; N *< ; O **** PRELIMINARY ATARI ST EQUATES AND MACROS. **** ; T **** THIS FILE IS STILL MISSING DEFINITIONS, AND **** ; E **** MAY HAVE BUGS WE HAVEN'T CAUGHT YET. **** ; !!! *< .subttl 'Hardware Locations' ; ; Atari ST hardware locations ; memconf = $ffff8001 ; memory controller dbaseh = $ffff8201 dbasel = $ffff8203 ; display base low, high vcounthi = $ffff8205 ; display counter low, medium, high vcountmid = $ffff8207 vcountlow = $ffff8209 syncmode = $ffff820a ; video sync mode color0 = $ffff8240 ; color registers 0..15 color1 = $ffff8242 color2 = $ffff8244 color3 = $ffff8246 color4 = $ffff8248 color5 = $ffff824a color6 = $ffff824c color7 = $ffff824e color8 = $ffff8250 color9 = $ffff8252 color10 = $ffff8254 color11 = $ffff8256 color12 = $ffff8258 color13 = $ffff825a color14 = $ffff825c color15 = $ffff825e shiftmd = $ffff8260 ; shifter mode (resolution) ;--- DMA chip ; diskctl = $ffff8604 ; disk controller data access fifo = $ffff8606 ; DMA mode control dmahigh = $ffff8609 ; DMA base high, medium, low dmamid = $ffff860b dmalow = $ffff860d ;--- 1770 registers ; cmdreg = $80 ; 1770/FIFO command register select trkreg = $82 ; 1770/FIFO track register select secreg = $84 ; 1770/FIFO sector register select datareg = $86 ; 1770/FIFO data register select ;--- Sound Chip ; giselect = $ffff8800 ; (W) sound chip register select giread = $ffff8800 ; (R) sound chip read-data giwrite = $ffff8802 ; (W) sound chip write-data gitoneaf = 0 ; channel A fine/coarse tune gitoneac = 1 gitonebf = 2 ; channel B gitonebc = 3 gitonecf = 4 ; channel C gitonecc = 5 ginoise = 6 ; noise generator control gimixer = 7 ; I/O control/volume control register giaamp = 8 ; channel A, B, C amplitude gibamp = 9 gicamp = $a gifienvlp = $b ; envelope period fine, coarse tune gicrnvlp = $c giporta = $e ; GI register# for I/O port A giportb = $f ; Centronics output register ;--- Bits in "giporta": ; xrts = 8 ; RTS output dtr = $10 ; DTR output strobe = $20 ; Centronics strobe output gpo = $40 ; "general purpose" output ;--- 68901 (MFP) ; mfp = $fa00 ; mfp base gpip = mfp+1 ; general purpose I/O aer = mfp+3 ; active edge reg ddr = mfp+5 ; data direction reg iera = mfp+7 ; interrupt enable A & B ierb = mfp+9 ipra = mfp+$b ; interrupt pending A & B iprb = mfp+$d isra = mfp+$f ; interrupt inService A & B isrb = mfp+$11 imra = mfp+$13 ; interrupt mask A & B imrb = mfp+$15 vr = mfp+$17 ; interrupt vector base tacr = mfp+$19 ; timer A control tbcr = mfp+$1b ; timer B control tcdcr = mfp+$1d ; timer C & D control tadr = mfp+$1f ; timer A data tbdr = mfp+$21 ; timer B data tcdr = mfp+$23 ; timer C data tddr = mfp+$25 ; timer D data scr = mfp+$27 ; sync char ucr = mfp+$29 ; USART control reg rsr = mfp+$2b ; receiver status tsr = mfp+$2d ; transmit status udr = mfp+$2f ; USART data ;--- 6850s ; keyctl = $fc00 ; keyboard ACIA control keybd = $fc02 ; keyboard data midictl = $fc04 ; MIDI ACIA control midi = $fc06 ; MIDI data .subttl 'BIOS Variables' ; ; BIOS Variables ; etv_timer = $400 ; vector for timer interrupt chain etv_critic = $404 ; vector for critical error chain etv_term % = $408 ; vector for process terminate etv_xtra = $40c ; 5 reserved vectors memvalid = $420 ; indicates system state on RESET memcntlr = $424 ; mem controller config nibble resvalid = $426 ; validates 'resvector' resvector = $42a ; [RESET] bailout vector phystop = $42e ; physical top of RAM _membot = $432 ; bottom of available memory; _memtop = $436 ; top of available memory; memval2 = $43a ; validates 'memcntlr' and 'memconf' flock = $43e ; floppy disk/FIFO lock variable seekrate = $440 ; default floppy seek rate _timr_ms = $442 ; system timer calibration (in ms) _fverify = $444 ; nonzero: verify on floppy write _bootdev = $446 ; default boot device palmode = $448 ; nonzero ==> PAL mode defshiftmd = $44a ; default video rez (first byte) sshiftmd = $44c ; shadow for 'shiftmd' register _v_bas_ad = $44e ; pointer to base of screen memory vblsem = $452 ; semaphore to enforce mutex in vbl nvbls = $454 ; number of deferred vectors _vblqueue = $456 ; pointer to vector of deferred vfuncs colorptr = $45a ; pointer to palette setup (or NULL) screenpt = $45e ; pointer to screen base setup (|NULL) _vbclock = $462 ; count of unblocked vblanks _frclock = $466 ; count of every vblank hdv_init = $46a ; hard disk initialization swv_vec = $46e ; video change-resolution bailout hdv_bpb = $472 ; disk "get BPB" hdv_rw = $476 ; disk read/write hdv_boot = $47a ; disk "get boot sector" hdv_mediach = $47e ; disk media change detect _cmdload = $482 ; nonzero: load COMMAND.COM from boot conterm = $484 ; console/vt52 bitSwitches (%%0..%%2) trp14ret = $486 ; saved return addr for _trap14 criticret = $48a ; saved return addr for _critic themd = $48e ; memory descriptor (MD) _md = $49e ; (more MD) savptr = $4a2 ; pointer to register save area _nflops = $4a6 ; number of disks attached (0, 1+) con_state = $4a8 ; state of conout() parser save_row = $4ac ; saved row# for cursor X-Y addressing sav_context = $4ae ; pointer to saved processor context _bufl = $4b2 ; two buffer-list headers _hz_200 = $4ba ; 200hz raw system timer tick _drvbits = $4c2 ; bit vector of "live" block devices _dskbufp = $4c6 ; pointer to common disk buffer _autopath = $4ca ; pointer to autoexec path (or NULL) _vbl_list = $4ce ; initial _vblqueue (to $4ee) _dumpflg = $4ee ; screen-dump flag _prtabt = $4f0 ; printer abort flag _sysbase = $4f2 ; -> base of OS _shell_p = $4f6 ; -> global shell info end_os = $4fa ; -> end of OS memory usage exec_os = $4fe ; -> address of shell to exec on startup scr_dump = $502 ; -> screen dump code prv_lsto = $506 ; -> _lstostat() prv_lst = $50a ; -> _lstout() prv_auxo = $50e ; -> _auxostat() prv_aux = $512 ; -> _auxout() .subttl '"Line A" Equates' ; ; "Line A" Equates ; VPLANES = 0 VWRAP = 2 CONTRL = 4 INTIN = 8 PTSIN = 12 INTOUT = 16 PTSOUT = 20 COLBIT0 = 24 COLBIT1 = 26 COLBIT2 = 28 COLBIT3 = 30 LSTLIN = 32 LNMASK = 34 WMODE = 36 X1 = 38 Y1 = 40 X2 = 42 Y2 = 44 PATPTR = 46 PATMSK = 50 MFILL = 52 CLIP = 54 XMINCL = 56 YMINCL = 58 XMAXCL = 60 YMAXCL = 62 XDDA = 64 DDAINC = 66 SCALDIR = 68 MONO = 70 SRCX = 72 SRCY = 74 DSTX = 76 DSTY = 78 DELX = 80 DELY = 82 FBASE = 84 FWIDTH = 88 STYLE = 90 LITEMSK = 92 SKEWMSK = 94 WEIGHT = 96 ROFF = 98 LOFF = 100 SCALE = 102 +CHUP = 104 TEXTFG = 106 SCRTCHP = 108 SCRPT2 = 112 TEXTBG = 114 COPYTRAN = 116 SEEDABORT = 118 .subttl '"Line A" Macros' ; ; "Line A" macros ; .macro A_init dc.w $a000 .endm .macro A_putpix dc.w $a001 .endm .macro A_getpix dc.w $a002 .endm .macro A_abline dc.w $a003 .endm .macro A_habline dc.w $a004 .endm .macro A_rectfill dc.w $a005 .endm .macro A_polyfill dc.w $a006 .endm .macro A_bitblt dc.w $a007 .endm .macro A_textblt dc.w $a008 .endm .macro A_showcur dc.w $a009 .endm .macro A_hidecur dc.w $a00a .endm .macro A_chgcur dc.w $a00b .endm .macro A_drsprite dc.w $a00c .endm .macro A_unsprite dc.w $a00d .endm .macro A_copyrstr dc.w $a00e .endm .macro A_seedfill dc.w $a00f .endm .subttl 'Operating System Macros' .macro Bios trpno, clean ; trap to BIOS move.w #\trpno,-(sp) trap #13 .if \clean <= 8 addq #\clean,sp .else add.w #\clean,sp .endif .endm .macro Xbios trpno, clean ; trap to XBIOS move.w #\trpno,-(sp) trap #14 .if \clean <= 8 addq #\clean,sp .else add.w #\clean,sp endif .endm .iif !(^^defined GEMDOS), GEMDOS = 1 .macro Gemdos trpno, clean ; trap to GEMDOS move.w #\trpno,-(sp) trap #GEMDOS .if \clean <= 8 addq #\clean,sp .else add.w #\clean,sp .endif .endm .macro Cls ; Clear Screen move.w #27,-(sp) Gemdos 2,4 move.w #'E',-(sp) Gemdos 2,4 .endm .macro Curson ; Cursor ON move.w #27,-(sp) Gemdos 2,4 move.w #'e',-(sp) Gemdos 2,4 .endm .macro Cursoff ; Cursor OFF move.w #27,-(sp) Gemdos 2,4 move.w #'f',-(sp) Gemdos 2,4 .endm .macro Inv ; INverse Video move.w #27,-(sp) Gemdos 2,4 move.w #'p',-(sp) Gemdos 2,4 .endm .macro Normv ; NORMal Video move.w #27,-(sp) Gemdos 2,4 move.w #'q',-(sp) Gemdos 2,4 .endm .macro Crlf ; Carriage Return+Line Feed move.w #$0D,-(sp) Gemdos 2,4 move.w #$0A,-(sp) Gemdos 2,4 .endm ; ; String "foobar" (push onto stack) ; String "foobar",a0 move address of string somewhere ; .macro String str,loc .if \?loc move.l #.\~,\loc else pea .\~ endif .data .\~: dc.b \str,0 .text .endm .subttl 'Bios Traps' ;--- Character Device Numbers ; PRT = 0 ; printer AUX = 1 ; RS-232 CON = 2 ; console (vt-52 emulator) MIDI = 3 ; MIDI port IKBD = 4 ; ikbd (out only) RAWCON = 5 ; console (raw characters) .macro Getmbp ptr move.l \ptr,-(sp) Bios 0,4 .endm .macro Bconstat dev move.w \dev,-(sp) Bios 1,4 .endm .macro Bconin dev move.w \dev,-(sp) Bios 2,4 .endm .macro Bconout dev, char move.w \char,-(sp) move.w \dev,-(sp) Bios 3,6 .endm .macro Rwabs rwflag, buf, count, recno, dev move.w \dev,-(sp) move.w \recno,-(sp) move.w \count,-(sp) move.l \buf,-(sp) move.w \rwflag,-(sp) Bios 4,14 .endm .macro Setexc vecnum, vec move.l \vec,-(sp) move.w \vecnum,-(sp) Bios 5,8 .endm .macro Tickcal Bios 6,2 .endm .macro Getbpb devno move.w \devno,-(sp) Bios 7,4 .endm .macro Bcostat devno move.w \devno,-(sp) Bios 8,4 .endm .macro Mediach devno move.w \devno,-(sp) Bios 9,4 .endm .macro Drvmap Bios 10,2 .endm .macro Kbshift mode move.w \mode,-(sp) Bios 11,4 .endm .subttl 'Extended BIOS Traps' .macro Initmous type, param, vec move.l \vec,-(sp) move.l \param,-(sp) move.w \type,-(sp) Xbios 0,12 .endm .macro Physbase Xbios 2,2 .endm .macro Logbase Xbios 3,2 .endm .macro Getrez Xbios 4,2 .endm .macro Setscreen logloc, physloc, rez move.w \rez,-(sp) move.l \physloc,-(sp) move.l \logloc,-(sp) Xbios 5,12 .endm .macro Setpallete ptr move.l \ptr,-(sp) Xbios 6,6 .endm .macro Setcolor colnum, color move.w \color,-(sp) move.w \colnum,-(sp) Xbios 7,6 .endm .macro Floprd buf, devno, sectno, trackno, sideno, count move.w \count,-(sp) move.w \sideno,-(sp) move.w \trackno,-(sp) move.w \sectno,-(sp) move.w \devno,-(sp) clr.l -(sp) ; (filler) move.l \buf,-(sp) Xbios 8,20 .endm .macro Flopwr buf, devno, sectno, trackno, sideno, count move.w \count,-(sp) move.w \sideno,-(sp) move.w \trackno,-(sp) move.w \sectno,-(sp) move.w \devno,-(sp) clr.l -(sp) ; (filler) move.l \buf,-(sp) Xbios 9,20 .endm .macro Flopfmt buf,devno,spt,trackno,sideno,interlv,magic,virgin move.w \virgin,-(sp) move.l \magic,-(sp) move.w \interlv,-(sp) move.w \sideno,-(sp) move.w \trackno,-(sp) move.w \spt,-(sp) move.w \devno,-(sp) clr.l -(sp) ; (filler) move.l \buf,-(sp) Xbios $a,26 .endm .macro Midiws cnt1,ptr move.l \ptr,-(sp) move.w \cnt1,-(sp) Xbios $c,8 .endm .macro Random Xbios $11,2 .endm .macro Protobt buf,serialno,disktype,execflag move.w \execflag,-(sp) move.w \disktype,-(sp) move.l \serialno,-(sp) move.l \buf,-(sp) Xbios $12,14 .endm .macro Flopver buf, devno, sectno, trackno, sideno, count move.w \count,-(sp) move.w \sideno,-(sp) move.w \trackno,-(sp) move.w \sectno,-(sp) move.w \devno,-(sp) clr.l -(sp) ; (filler) move.l \buf,-(sp) Xbios $13,20 .endm CURS_HIDE = 0 CURS_SHOW = 1 CURS_BLINK = 2 CURS_NOBLINK = 3 CURS_SETRATE = 4 CURS_GETRATE = 5 .macro Cursconf func,op move.w \op,-(sp) move.w \func,-(sp) Xbios $15,6 .endm .macro Settime datetime move.l \datetime,-(sp) Xbios $16,6 .endm .macro Gettime Xbios $17,2 .endm .macro Kbdvbase Xbios $22,2 .endm .macro Vsync Xbios $24,2 .endm .macro Supexec where move.l \where,-(sp) Xbios $26,6 .endm .subttl 'Gemdos Traps' .macro Dsetdrv drive move.w \drive,-(sp) Gemdos $e,4 .endm .macro Pterm0 clr.w -(sp) trap #GEMDOS illegal .endm .macro Pterm code .if \?code move.w \code,-(sp) .else clr.w -(sp) .endif move.w #$4c,-(sp) trap #GEMDOS illegal .endm .macro Super clr.l -(sp) move.w #$20,-(sp) trap #GEMDOS addq #6,sp move.l d0,-(sp) move.w #$20,-(sp) .endm .macro User trap #GEMDOS addq #6,sp .endm .macro Puts string move.l \string,-(sp) Gemdos 9,6  z .endm .macro Tgetdate Gemdos $2a,2 .endm .macro Tsetdate date move.w \date,-(sp) Gemdos $2b,4 .endm .macro Tgettime Gemdos $2c,2 .endm .macro Tsettime time move.w \time,-(sp) Gemdos $2d,4 .endm .macro Fgetdta Gemdos $2f,0 .endm .macro Sversion Gemdos $30,2 .endm .macro Dfree buf,drive move.w \drive,-(sp) move.l \buf,-(sp) Gemdos $36,8 .endm .macro Fopen file, mode move.w \mode,-(sp) move.l \file,-(sp) Gemdos $3d,8 .endm .macro Fcreate file, mode move.w \mode,-(sp) move.l \file,-(sp) Gemdos $3c,8 .endm .macro Fread handle, count, buf move.l \buf,-(sp) move.l \count,-(sp) move.w \handle,-(sp) Gemdos $3f,12 .endm .macro Fwrite handle, count, buf move.l \buf,-(sp) move.l \count,-(sp) move.w \handle,-(sp) Gemdos $40,12 .endm .macro Fclose handle move.w \handle,-(sp) Gemdos $3e,4 .endm .macro Fdelete file move.l \file,-(sp) Gemdos $41,6 .endm .macro Fseek offset, handle, mode move.w \mode,-(sp) move.w \handle,-(sp) move.l \offset,-(sp) Gemdos $42,10 .endm .macro Fsetdta addr move.l \addr,-(sp) Gemdos $1a,6 .endm .macro Ptermres count, retcode move.w \retcode,-(sp) move.l \count,-(sp) Gemdos $31,8 .endm .macro Mshrink block, newsiz move.l \newsiz,-(sp) move.l \block,-(sp) clr.w -(sp) Gemdos $4a,12 .endm .macro Malloc amount move.l \amount,-(sp) Gemdos $48,6 .endm .macro Mfree addr move.l \addr,-(sp) Gemdos $49,6 .endm .macro Pexec mode, p1, p2, p3 move.l \p3,-(sp) move.l \p2,-(sp) move.l \p1,-(sp) move.w \mode,-(sp) Gemdos $4b,16 .endm .macro Fsfirst fspec, attr move.w \attr,-(sp) move.l \fspec,-(sp) Gemdos $4e,8 .endm .macro Fsnext Gemdos $4f,2 .endm .subttl 'Structures' ; ; Basepage Format ; .ABS Plowtpa: ds.l 1 Phitpa: ds.l 1 Ptbase: ds.l 1 Ptlen: ds.l 1 Pdbase: ds.l 1 Pdlen: ds.l 1 Pbbase: ds.l 1 Pblen: ds.l 1 Pxdta: ds.l 1 Pparent: ds.l 1 ; ; Searchfirst/Searchnext DTA structure ; .ABS ds.b 21 DTA_attr: ds.b 1 DTA_time: ds.w 1 DTA_date: ds.w 1 DTA_size: ds.l 1 DTA_name: ds.b 14 .TEXT .eject .list ; ;-$ ; INITIALISATION ;-$ ; DEBUT: CLR.L -(SP) MOVE.W #$20,-(SP) TRAP #1 ; MODE SUPERVISEUR ADDQ.L #6,SP MOVE.L D0,ANC_PILE ; ANCIENNE PILE MOVE.B $FF8260,D0 ; RESOLUTION ECRAN ? ANDI.B #%011,D0 CMPI.B #2,D0 BEQ.S OK_INIT CMPI.B #1,D0 BEQ.S O!K_MOY LEA AFFBAS,A0 MOVE.L A0,D0 MOVE.L D0,MODIF0+2 LEA EFFABAS,A0 MOVE.L A0,D0 MOVE.L D0,MODIF3+2 MOVEQ #8,D0 MOVE.W D0,MODIF1+2 MOVE.W #156,D0 MOVE.W D0,MODIF2+2 MOVE.W #4,MODIF01+2 BRA.S OK_INIT OK_MOY: LEA AFFMOY,A0 MOVE.L A0,D0 MOVE.L D0,MODIF0+2 LEA EFFAMOY,A0 MOVE.L A0,D0 MOVE.L D0,MODIF3+2 MOVEQ #4,D0 MOVE.W D0,MODIF1+2 MOVE.W #156,D0 MOVE.W D0,MODIF2+2 MOVE.W #4,MODIF01+2 OK_INIT: LEA DES_PANEAU,A3 LEA DES_MASK,A0 MOVE.L A0,PT_DES_MASK MOVE.L A3,PT_DES_PRE MOVEA.L $456,A0 MOVE.L 4(A0),ROUT_VBL LEA ROUTINE,A1 MOVE.L A1,4(A0) ; MET EN PLACE VBL MOVE.L ANC_PILE,-(SP) MOVE.W #$20,-(SP) ; RESTAURE PILE TRAP #1 ADDQ.L #6,SP MOVE.W #0,-(SP) MOVE.L #FIN_PROG-DEBUT+$100+16*25,-(SP) MOVE.W #$31,-(SP) TRAP #1 ; ;-# ; DEBUT DE TRAITEMENT ;-# ; ROUTINE: MOVE.L $FF8200,D0 ASL.W #8,D0 ADDI.L #2800,D0 COMPTEUR: ADD.L #00,D0 MOVE.L D0,A6 MOVE.L D0,A0 MOVEA.L PT_DES_PRE,A2 MOVEA.L PT_DES_MASK,A3 MODIF0: JSR AFFMONO SUBQ.W #1,TEMPO BNE.S ETIQ2 MOVE.L A2,PT_DES_PRE MOVE.L A3,PT_DES_MASK MODIF01: MOVE.W #6,TEMPO SUB.W #1,DECALE BNE.S ETIQ2 MOVE.L #DES_MASK,PT_DES_MASK MOVE.L #DES_PANEAU,PT_DES_PRE MOVE.W COMPTEUR+4,D0 MODIF1: ADD.W #2,D0 MODIF2: CMPI.W #78,D0 BLE.S NOT_RECOM MOVEQ #0,D0 NOT_RECOM: MOVE.W D0,COMPTEUR+4 MOVE.W #8,DECALE ETIQ2: MOVE.L A6,-(SP) MOVEA.L ROUT_VBL,A0 CMPA.L #0,A0 BEQ.S SORT_GESTION JSR (A0) SORT_GESTION: MOVE.L (SP)+,A6 MOVE.B $FF8203,D0 CMPI.B #-$20,D0 BGE.S SAUT4 ADDI.W #$20,D0 SAUT1: CMP.B $FF8207,D0 BGE.S SAUT1 SAUT4: LEA EFFA_BUFF,A1 MOVEA.L A6,A0 MOVEQ #23,D0 MODIF3: JSR EFFAMONO RTS ; ;-$ ; GESTION DU MONOCHROME ;-$ ; AFFMONO: LEA EFFA_BUFF,A1 MOVEQ #23,D0 SAUVMONO: MOVE.L (A0),(A1)+ ADDA.L #80,A0 DBRA D0,SAUVMONO MOVEA.L A6,A0 MOVEQ #7,D0 RBOUCLE01: MOVE.L (A3)+,D1 MOVE.L (A2)+,D3 MOVE.L (A0),D5 AND.L D1,D5 OR.L D3,D5 MOVE.L D5,(A0) ADDA.L #80,A0 DBRA D0,RBOUCLE01 MOVEQ #15,D0 RBOUCLE1: MOVE.L (A2)+,D1 OR.L D1,(A0) ADDA.L #80,A0 DBRA D0,RBOUCLE1 RTS EFFAMONO: MOVE.L (A1)+,(A0) ADDA.L #80,A0 DBRA D0,EFFAMONO RTS ; ;-$ ; GESTION DE LA MOYENNE RESOLUTION ;-$ ; AFFMOY: LEA EFFA_BUFF,A1 MOVEQ #23,D0 SAUVMOY: MOVE.L (A0),(A1)+ MOVE.L 4(A0),(A1)+ ADDA.L #160,A0 DBRA D0,SAUVMOY MOVEA.L A6,A0 MOVEQ #7,D0 MBOUCLE01: MOVE.L (A3)+,D1 MOVE.L (A2)+,D3 MOVE.W 4(A0),D5 AND.W D1,D5 OR.W D3,D5 MOVE.W D5,4(A0) MOVE.W 6(A0),D5 AND.W D1,D5 OR.W D3,D5 MOVE.W D5,6(A0) SWAP D1 SWAP D3 MOVE.W (A0),D5 AND.W D1,D5 OR.W D3,D5 MOVE.W D5,(A0) MOVE.W 2(A0),D5 AND.W D1,D5 OR.W D3,D5 MOVE.W D5,2(A0) ADDA.L #160,A0 DBRA D0,MBOUCLE01 MOVEQ # v15,D0 MBOUCLE1: MOVE.L (A2)+,D1 OR.W D1,4(A0) OR.W D1,6(A0) SWAP D1 OR.W D1,(A0) OR.W D1,2(A0) ADDA.L #160,A0 DBRA D0,MBOUCLE1 RTS EFFAMOY: MOVE.L (A1)+,(A0) MOVE.L (A1)+,4(A0) ADDA.L #160,A0 DBRA D0,EFFAMOY RTS ; ;-$ ; GESTION DE LA BASSE RESOLUTION ;-$ ; AFFBAS: LEA EFFA_BUFF,A1 MOVEQ #23,D0 SAUVBAS: MOVE.L (A0),(A1)+ MOVE.L 4(A0),(A1)+ MOVE.L 8(A0),(A1)+ MOVE.L 12(A0),(A1)+ ADDA.L #160,A0 DBRA D0,SAUVBAS MOVEA.L A6,A0 MOVEQ #7,D0 BBOUCLE01: MOVE.L (A3)+,D1 MOVE.L (A2)+,D3 MOVE.W 8(A0),D5 AND.W D1,D5 OR.W D3,D5 MOVE.W D5,8(A0) MOVE.W 10(A0),D5 AND.W D1,D5 OR.W D3,D5 MOVE.W D5,10(A0) MOVE.W 12(A0),D5 AND.W D1,D5 OR.W D3,D5 MOVE.W D5,12(A0) MOVE.W 14(A0),D5 AND.W D1,D5 OR.W D3,D5 MOVE.W D5,14(A0) CLR.W D1 CLR.W D3 MOVE.L D1,D6 MOVE.L D3,D7 SWAP D1 SWAP D3 OR.L D6,D1 OR.L D7,D3 MOVE.L (A0),D5 AND.L D1,D5 OR.L D3,D5 MOVE.L D5,(A0) MOVE.L 4(A0),D5 AND.L D1,D5 OR.L D3,D5 MOVE.L D5,4(A0) ADDA.L #160,A0 DBRA D0,BBOUCLE01 MOVEQ #15,D0 BBOUCLE1: MOVE.L (A2)+,D1 OR.W D1,8(A0) OR.W D1,10(A0) OR.W D1,12(A0) OR.W D1,14(A0) SWAP D1 OR.W D1,(A0) OR.W D1,2(A0) OR.W D1,4(A0) OR.W D1,6(A0) ADDA.L #160,A0 DBRA D0,BBOUCLE1 RTS EFFABAS: MOVE.L (A1)+,(A0) MOVE.L (A1)+,4(A0) MOVE.L (A1)+,8(A0) MOVE.L (A1)+,12(A0) ADDA.L #160,A0 DBRA D0,EFFABAS RTS ; ;-$ ; DONNEES ;-$ ; PT_DES_MASK: DC.L 0 PT_DES_PRE: DC.L 0 DECALE: DC.W 8 TEMPO: DC.W 6 ANC_PILE: DC.L 0 ROUT_VBL: DC.L 0 ; ;-$ ; DESSINS ;-$ ; DES_PANEAU: DC.L $780 DC.L $E40 DC.L $1DA0 DC.L $1E70 DC.L $1FF0 DC.L $F20 DC.L $780 DC.L $20 DC.L $30 DC.L $70 DC.L $780 DC.L $780 DC.L $780 DC.L $780 DC.L $F0 DC.L $F0 DC.L $F0 DC.L $70 DC.L $70 DC.L $70 DC.L $E0 DC.L $E0 DC.L $F0 DC.L $780 DC.L $1E0 DC.L $390 DC.L $7680000 DC.L $79C0000 DC.L $7FC0000 DC.L $3C80000 DC.L $1E0 DC.L $80 DC.L $C0 DC.L $1C0 DC.L $3E0 DC.L $7E0 DC.L $6F0 DC.L $3F0 DC.L $3F0 DC.L $3C0 DC.L $1C0 DC.L $1C0 DC.L $1E0 DC.L $1E0 DC.L $1B0 DC.L $330 DC.L $660 DC.L $730 DC.L $0 DC.L $780000 DC.L $E40000 DC.L $1DA0000 DC.L $1E70000 DC.L $1FF0000 DC.L $F20000 DC.L $780000 DC.L $20 DC.L $70 DC.L $F80000 DC.L $1B80000 DC.L $1BC0000 DC.L $1F60000 DC.L $F0 DC.L $F0 DC.L $70 DC.L $780000 DC.L $CC0000 DC.L $C60000 DC.L $18C0000 DC.L $1980000 DC.L $31C0000 DC.L $380 DC.L $0 DC.L $1E0000  DC.L $390000 DC.L $768000 DC.L $79C000 DC.L $7FC000 DC.L $3C8000 DC.L $1E0000 DC.L $80000 DC.L $1C0000 DC.L $3E0000 DC.L $6E0000 DC.L $6F0000 DC.L $7D8000 DC.L $3C0000 DC.L $3C0000 DC.L $1C0000 DC.L $1E0000 DC.L $330000 DC.L $318000 DC.L $618000 DC.L $618000 DC.L $C1C000 DC.L $E0 DC.L $0 DC.L $0 DC.L $78000 DC.L $E4000 DC.L $1DA000 DC.L $1E7000 DC.L $1FF000 DC.L $F2000 DC.L $78000 DC.L $20000 DC.L $30000 DC.L $1F1000 DC.L $37F000 DC.L $1FC000 DC.L $1F8000 DC.L $70000 DC.L $70000 DC.L $38000 DC.L $7C000 DC.L $C6000 DC.L $183000 DC.L $301C00 DC.L $601800 DC.L $70 DC.L $0 DC.L $0 DC.L $F000 DC.L $1C800 DC.L $3B400 DC.L $3CE00 DC.L $3FE00 DC.L $1E400 DC.L $F000 DC.L $4000 DC.L $6000 DC.L $6000 DC.L $1F000 DC.L $37600 DC.L $1FE00 DC.L $1E000 DC.L $1E000 DC.L $F000 DC.L $F800 DC.L $18C00 DC.L $78600 DC.L $70600 DC.L $40380 DC.L $300 DC.L $0 DC.L $7800 DC.L $E400 DC.L $1DA00 DC.L $1E700 DC.L $1FF00 DC.L $F200 DC.L $7800 DC.L $2000 DC.L $3000 DC.L $7000 DC.L $7800 DC.L $F800 DC.L $F800 DC.L $7C00 DC.L $7800 DC.L $3800 DC.L $7C00 DC.L $6C00 DC.L $3600 DC.L $1F600 DC.L $1E600 DC.L $10600 DC.L $700 DC.L $0 DC.L $1E00 DC.L $3900 DC.L $7680 DC.L $79C0 DC.L $7FC0 DC.L $3C80 DC.L $1E00 DC.L $800 DC.L $C00 DC.L $1C00 DC.L $1E00 DC.L $1E00 DC.L $1E00 DC.L $3E00 DC.L $3C00 DC.L $1C00 DC.L $1E00 DC.L $E00 DC.L $3E00 DC.L $3E00 DC.L $2600 DC.L $600 DC.L $700 DES_MASK: DC.L $F87F DC.L $F03F DC.L $E01F DC.L $E00F DC.L $E00F DC.L $F01F DC.L $F87F DC.L $FDF DC.L $FE1F DC.L $FC0F DC.L $F807FFFF DC.L $F803FFFF DC.L $F803FFFF DC.L $FC07FFFF DC.L $FE1F DC.L $FF7F DC.L $F DC.L $FF87FFFF DC.L $FF03FFFF DC.L $FE01FFFF DC.L $FE00FFFF DC.L $FE00FFFF DC.L $FF01FFFF DC.L $FF87FFFF DC.L $F DC.L $FFE1FFFF DC.L $FFC0FFFF DC.L $FF807FFF DC.L $FF803FFF DC.L $FF803FFF DC.L $FFC07FFF DC.L $FFE1FFFF DC.L $F DC.L $F DC.L $FFF87FFF DC.L $FFF03FFF DC.L $FFE01FFF DC.L $FFE00FFF DC.L $FFE00FFF DC.L $FFF01FFF DC.L $F DC.L $F DC.L $FFFF0FFF DC.L $FFFE07FF DC.L $FFFC03FF DC.L $FFFC01FF DC.L $FFFC01FF DC.L $FFFE03FF DC.L $F DC.L $FFFF87FF DC.L $FFFF03FF DC.L $FFFE01FF DC.L $FFFE00FF DC.L $FFFE00FF DC.L $FFFF01FF DC.L $FFFF87FF DC.L $F DC.L $FFFFE1FF DC.L $FFFFC0FF DC.L $FFFF807F DC.L $FFFF803F DC.L $FFFF803F DC.L $FFFFC07F DC.L $FFFFE1FF FIN_PROG: EFFA_BUFF: END  ;-G: ; : ; Silly Bugs Demo : ; : ;---- : ; 30-Nov-1986 lmd Hacked it up. : ; : ;-G: .include "atari.s" ; get ST equates and macros ;- ; ; Imports ; .globl _images ; -> table of images (->) .globl _masks ; -> table of masks (->) .globl mksh ; construct shifted images ;- ; ; Exports ; .globl draw ; draw an image .globl undraw ; undraw (erase) an image .globl upd_gravity ; update an image, with gravity ;- ; ; Bug structure ; .abs BGcritno: ds.b 1 ; critter number (0=dead) BGstate: ds.b 1 ; critter state BGxpos: ds.l 1 ; int+frac X and Y positions BGypos: ds.l 1 BGxvel: ds.l 1 ; int+frac Y and Y velocities BGyvel: ds.l 1 BGtimer: ds.w 1 ; timer BGimage: ds.w 1 ; image number BGscraddr: ds.l 1 ; starting address on screen BGimgaddr: ds.l 1 ; -> image BGmskaddr: ds.l 1 ; -> mask BGimgsize: ds.l 1 ; = image size (0, 4, 8 ...) BGSIZE: ds.l 1 ; (size of bug structure) ;- ; ; Global variables ; NBUGS equ 16 ; number of bugs .bss screen: ds.l 1 ; -> screen memory mode: ds.w 1 ; screen resolution (0, 2, 4) modex4: ds.w 1 ; screen resolution (0, 4, 8) width: ds.w 1 ; = screen width maxx: ds.w 1 ; max X position for 16-wide sprite maxy: ds.w 1 ; max Y position for 16-high sprite linshft: ds.w 1 ; shift amount for X index computation linmask: ds.w 1 ; mask for X index computation gravity: ds.l 1 ; int+frac gravity oldrez: ds.w 1 ; old screen resolution savedColors: ds.w 16 ; saved pallette freemem: ds.b $8000 ; space for shifted images ["enough" space] bugs: ds.b BGSIZE*NBUGS ; bugs database .data ourColors: dc.w $000,$700,$070,$770 ; our pallette dc.w $007,$707,$077,$555 dc.w $333,$733,$373,$773 dc.w $337,$737,$377,$654 .text ;- ; ; Top level ; move.l #$00004000,gravity ; set force of gravity bsr inivideo ; initialize video parameters lea freemem,a1 ; a1 -> free memory bsr mksh ; make shifted fonts ;---- setup initial positions and velocities from ; a list of initial values. ; lea bugs,a5 lea i_xpos,a0 lea i_ypos,a1 lea i_xvel,a2 lea i_img,a3 moveq #NBUGS-1,d0 ilp1: clr.l BGxpos(a5) clr.l BGypos(a5) move.w (a0)+,BGxpos(a5) move.w (a1)+,BGypos(a5) move.l (a2)+,BGxvel(a5) move.w (a3)+,BGimage(a5) clr.l BGscraddr(a5) ; clobber screen addr (never drawn) lea BGSIZE(a5),a5 dbra d0,ilp1 ;--- Bugs loop: ; o refresh all bugs ; o sync with vblank ; o test for a keypress, punt on any keystroke ; loop: moveq #NBUGS-1,d6 ; d6 = #bugs-1 lea bugs,a5 loop1: bsr upd_gravity ; update a bug lea BGSIZE(a5),a5 ; advance to next one dbra d6,loop1 ; (loop for more) move.w #$25,-(sp) ; Vsync() trap #14 addq #2,sp Bconstat #CON ; key ready? tst.w d0 beq loop ; (no --- loop) Bconin #CON ; eat the keypress bsr restore_video ; restore video Pterm0 ; and terminate ;--- initial image numbers i_img: dc.w 0,1,2,0 dc.w 0,1,2,0 dc.w 0,1,2,0 dc.w 0,1,2,0 ;--- initial X and Y posititions i_xpos: dc.w $00,$10,$20,$30 dc.w $40,$50,$60,$70 dc.w $80,$90,$a0,$b0 dc.w $c0,$d0,$e0,$f0 i_ypos: dc.w $00,$08,$10,$18 dc.w $20,$28,$30,$38 dc.w $40,$48,$30,$38 dc.w $20,$28,$10,$18 ;--- Initial X velocities i_xvel: dc.l $00008000 dc.l $0000c000 dc.l $00010000 dc.l $00014000 dc.l $00008000 dc.l $0000c000 dc.l $00010000 dc.l $00008000 dc.l $00014000 dc.l $0000c000 dc.l $00010000 dc.l $00008000 dc.l $0000c000 dc.l $00014000 dc.l $00010000 dc.l $00014000 ;- ; ; Video parameter setup ; inivideo: Physbase ; screen = Physbase() move.l d0,screen Supexec #saveColors ; save pallette Supexec #setColors ; initialize pallette with our colors Getrez ; mode = Getrez() << 1 move.w d0,oldrez ; save old resolution cmp.w #1,d0 ; medium rez? bne.s .1 ; (no) moveq #0,d0 bsr setRez ; set rez to low moveq #0,d0 .1: add.w d0,d0 move.w d0,mode move.w d0,modex4 ; mode4 = Getrez() << 2 add.w d0,modex4 move.w xwidth(pc,d0.w),width move.w xmaxx(pc,d0.w),maxx move.w xmaxy(pc,d0.w),maxy move.w xlinshft(pc,d0.w),linshft move.w xlinmask(pc,d0.w),linmask rts saveColors: lea color0,a0 lea savedColors,a1 move.w #16-1,d0 .1: move.w (a0)+,(a1)+ dbra d0,.1  rts setColors: lea ourColors,a0 lea color0,a1 move.w #16-1,d0 .1: move.w (a0)+,(a1)+ dbra d0,.1 rts ;+ ; Resolution-dependent parameter tables ; ;- xwidth: dc.w 160,160,80 ; screen width (bytes) xmaxx: dc.w 303,623,623 ; max X position for 16-wide sprite xmaxy: dc.w 183,183,383 ; max Y position for 16-high sprite xlinshft: dc.w 1,2,3 ; shifts for X index computation xlinmask: dc.w $ffff-7,$ffff-3,$ffff-1 ; masks for X index computation ;- ; ; Restore original screen resolution ; restore_video: Supexec #restoreColors ; restore pallette cmp.w #1,oldrez ; was in medium? bne.s .ret ; (no --- leave it alone) move.w oldrez,d0 ; set rez back to medium bsr setRez .ret: rts setRez: move.b d0,.temp Supexec #.1 rts .1: move.b .temp,shiftmd rts bss .temp: ds.w 1 .text restoreColors: lea savedColors,a0 lea color0,a1 move.w #16-1,d0 .1: move.w (a0)+,(a1)+ dbra d0,.1 rts ;---- general-purpose return instruction return: rts ;- ; ; Draw bug; ; - compute addresses of things and fill-in bug structure ; - setup registers for drawing ; - do drawing ; ; Passed: a5 -> bug ; Returns: nothing ; Fills-in: BGscraddr(a5) ; BGimgaddr(a5) ; BGmskaddr(a5) ; BGimgsize(a5) ; Uses: a0-a4/d0-d4 ; draw:: move.w BGypos(a5),d0 ; d0 = ypos * width mulu width,d0 move.w BGxpos(a5),d1 ; d1 = (xpos >> linshft) & linmask move.w d1,d2 ; (save xpos for later) move.w linshft,d3 lsr.w d3,d1 and.w linmask,d1 add.w d1,d0 ; d0 += d1 move.l screen,a0 ; a0 = screen + (ypos * width) + add.w d0,a0 ; (xpos >> linshft) & linmask move.l a0,BGscraddr(a5) ; save screen addr for cmp and undraw moveq #0,d3 ; assume 1x and.w #$000f,d2 ; see if on 16-pixel boundary beq.s .1 ; (yes --- it's 1x) moveq #4,d3 ; no --- it's 2x .1: move.w d3,BGimgsize(a5) ; set image size, keep d3=image size move.w BGimage(a5),d0 ; d0 = image number to draw lsl.w #2,d0 ; turn into longword index move.w BGxpos(a5),d1 ; d1 = (x_position & 15) << 2 and.w #15,d1 lsl.w #2,d1 lea _images,a1 move.l (a1,d0.w),a1 ; a1 -> image base move.l (a1,d1.w),a1 ; a1 -> image move.l a1,BGimgaddr(a5) ; save image addr for cmp and undraw lea _masks,a2 move.l (a2,d0.w),a2 ; a2 -> image's mask base move.l (a2,d1.w),a2 ; a2 -> image's mask move.l a2,BGmskaddr(a5) ; save mask addr for cmp and undraw move.w width,d1 ; d1 = screen width move.w modex4,d0 ; d0 = longword rez index move.l axdraw(pc,d0.w),a4 ; a4 -> vector of drawing routines move.l (a4,d3.w),a4 ; a4 -> drawing routine jmp (a4) ;+ ; Table of ptrs to drawing routines ; ;- axdraw: dc.l lxdraw,hxdraw,mxdraw lxdraw: dc.l ld1x16,ld2x16 hxdraw: dc.l return,return mxdraw: dc.l md1x16,md2x16 ;+ ; Draw a 1x16 image in low-rez ; ; a0 -> screen base ; a1 -> image base ; a2 -> mask base ; d1 = screen width ; ;- ld1x16: moveq #16-1,d2 ; d2 = scanline count .1: move.w (a2)+,d4 ; d4 = mask ;--- plane 0 move.w (a0),d0 ; d0 = screen and.w d4,d0 ; clobber bits in mask or.w (a1)+,d0 ; or-in bits from image move.w d0,(a0) ; stuff result onto screen ;--- plane 1 move.w 2(a0),d0 ; d0 = screen and.w d4,d0 ; clobber bits in mask or.w (a1)+,d0 ; or-in bits from image move.w d0,2(a0) ; stuff result onto screen ;--- plane 2 move.w 4(a0),d0 ; d0 = screen and.w d4,d0 ; clobber bits in mask or.w (a1)+,d0 ; or-in bits from image move.w d0,4(a0) ; stuff result onto screen ;--- plane 3 move.w 6(a0),d0 ; d0 = screen and.w d4,d0 ; clobber bits in mask or.w (a1)+,d0 ; or-in bits from image move.w d0,6(a0) ; stuff result onto screen add.w d1,a0 ; bump screen ptr to next scanline dbra d2,.1 ; loop for more lines rts ;+ ; Draw a 2x16 image in low-rez ; ; a0 -> screen base ; a1 -> image base ; a2 -> mask base ; d1 = screen width ; ;- ld2x16: sub.w #16,d1 ; adjust screen width for image stride moveq #16-1,d2 ; d2 = scanline count ld2_1: move.w (a2)+,d4 ; d4 = mask ;--- plane 0 part 0 move.w (a0),d0 ; d0 = screen and.w d4,d0 ; clobber bits in mask or.w (a1)+,d0 ; or-in bits from image move.w d0,(a0)+ ; stuff result onto screen ;--- plane 1 part 0 move.w (a0),d0 ; d0 = screen and.w d4,d0 ; clobber bits in mask or.w (a1)+,d0 ; or-in bits from image move.w d0,(a0)+ ; stuff result onto screen ;--- plane 2 part 0 move.w (a0),d0 ; d0 = screen and.w d4,d0 ; clobber bits in mask or.w (a1)+,d0 ; or-in bits from image move.w d0,(a0)+ ; stuff result onto screen ;--- plane 3 part 0 move.w (a0),d0 ; d0 = screen and.w d4,d0 ; clobber bits in mask or.w (a1)+,d0 ; or-in bits from image move.w d0,(a0)+ ; stuff result onto screen move.w (a2)+,d4 ; d4 = mask ;--- plane 0 part 1 move.w (a0),d0 ; d0 = screen and.w d4,d0 ; clobber bits in mask or.w (a1)+,d0 ; or-in bits from image move.w d0,(a0)+ ; stuff result onto screen ;--- plane 1 part 1 move.w (a0),d0 ; d0 = screen and.w d4,d0 ; clobber bits in mask or.w (a1)+,d0 ; or-in bits from image move.w d0,(a0)+ ; stuff result onto screen ;--- plane 2 part 1 move.w (a0),d0 ; d0 = screen and.w d4,d0 ; clobber bits in mask or.w (a1)+,d0 ; or-in bits from image move.w d0,(a0)+ ; stuff result onto screen ;--- plane 3 part 1 move.w (a0),d0 ; d0 = screen and.w d4,d0 ; clobber bits in mask or.w (a1)+,d0 ; or-in bits from image move.w d0,(a0)+ ; stuff result onto screen add.w d1,a0 ; bump screen ptr to next scanline dbra d2,ld2_1 ; loop for more lines rts ;+ ; Draw a 1x16 image in monochrome ; ; a0 -> screen base ; a1 -> image base ; a2 -> mask base ; d1 = screen width ; ;- md1x16: moveq #16-1,d2 ; d2 = scanline count md1_1: move.w (a0),d0 ; d0 = screen and.w (a2)+,d0 ; clobber bits in mask or.w (a1)+,d0 ; or-in bits from image move.w d0,(a0) ; stuff result onto screen addq.w #6,a1 ; bump past color planes add.w d1,a0 ; bump screen ptr to next scanline dbra d2,md1_1 ; loop for more lines rts ;+ ; Draw a 2x16 image in monochrome ; ; a0 -> screen base ; a1 -> image base ; a2 -> mask base ; d1 = screen width ; ;- md2x16: moveq #16-1,d2 ; d2 = scanline count md2_1: move.w (a0),d0 ; d0 = screen and.w (a2)+,d0 ; clobber bits in mask or.w (a1)+,d0 ; or-in bits from image move.w d0,(a0) ; stuff result onto screen addq.w #6,a1 ; bump past color planes move.w 2(a0),d0 ; d0 = screen and.w (a2)+,d0 ; clobber bits in mask or.w (a1)+,d0 ; or-in bits from image move.w d0,2(a0) ; stuff result onto screen addq.w #6,a1 ; bump past color planes add.w d1,a0 ; bump screen ptr to next scanline dbra d2,md2_1 ; loop for more lines rts ;- ; ; Undraw bug ; ; Passed: a5 -> bug ; Returns: nothing ; Uses: a0-a4/d0-d4 ; undraw:: move.l BGscraddr(a5),d0 ; if BGscraddr == NULL beq.s .ret ; then return; move.l d0,a0 move.l BGmskaddr(a5),a2 move.w width,d1 move.w BGimgsize(a5),d0 move.w modex4,d2 move.l axundraw(pc,d2.w),a4 move.l (a4,d0.w),a4 jmp (a4) .ret: rts ;+ ; Table of ptrs to undraw routines ; ;- axundraw: dc.l lxundraw,hxundraw,mxundraw lxundraw: dc.l lu1x16,lu2x16 hxundraw: dc.l return,return mxundraw: dc.l mu1x16,mu2x16 ;+ ; Undraw a 1x16 image in low rez ; ; a0 -> screen base ; a2 -> mask base ; d1 = screen width ; ;- lu1x16: sub.w #8,d1 ; adjust screen width for image stride moveq #16-1,d2 ; d2 = scanline count .1: move.w (a2)+,d0 ; d0 = mask and.w d0,(a0)+ and.w d0,(a0)+ and.w d0,(a0)+ and.w d0,(a0)+ add.w d1,a0 ; bump to next screen location dbra d2,.1 ; loop for more scanlines rts ;+ ; Undraw a 2x16 image in low rez ; ; a0 -> screen base ; a2 -> mask base ; d1 = screen width ; ; Uses: ; d4 = ~mask ; d5 = mask ; ; ; ;- lu2x16: sub.w #16,d1 ; adjust screen width for image stride moveq #16-1,d2 ; d2 = scanline count .1: .rept 2 move.w (a2)+,d0 ; d5 = mask and.w d0,(a0)+ and.w d0,(a0)+ and.w d0,(a0)+ and.w d0,(a0)+ .endr add.w d1,a0 ; bump to next screen location dbra d2,.1 ; loop for more scanlines rts ;+ ; Undraw a 1x16 image in monochrome ; ; a0 -> screen base ; a2 -> mask base ; d1 = screen width ; ;- mu1x16: .rept 16 move.w (a2)+,d0 and.w d0,(a0) add.w d1,a0 .endr rts ;+ ; Undraw a 2x16 image in monochrome ; ; a0 -> screen base ; a2 -> mask base ; d1 = screen width ; ;- mu2x16: .rept 16 move.l (a2)+,d0 and.l d0,(a0) add.w d1,a0 .endr rts ;- ; ; Update position (with gravity) ; ; Passed: a5 -> bug ; Returns: nothing ; Uses: d0-d4/a0-a4 ; upd_gravity: moveq #0,d2 ; MovedFlag := FALSE ;--- update Y position (with gravity) move.w BGypos(a5),d3 ; save old position (for comparison) move.l BGyvel(a5),d0 ; bump velocity with gravity add.l gravity,d0 .y: move.l d0,BGyvel(a5) add.l d0,BGypos(a5) ; bump position with new velocity move.w BGypos(a5),d0 ; get significant part of position bpl.s .1 ; if (pos < 0) bra.s .2 ; reverse velocity (bounce) .1: cmp.w maxy,d0 ; if (pos > maxy) blt.s .3 .2: move.l BGyvel(a5),d0 ; reverse velocity neg.l d0 bra .y ; recompute position .3: cmp.w BGypos(a5),d3 ; if (newpos != oldpos) beq.s .4 st d2 ; MovedFlag := TRUE .4: move.w BGxpos(a5),d3 ; save old position (for comparison) move.l BGxvel(a5),d0 ; d0 = velocity .7: add.l BGxpos(a5),d0 ; d0 = position + velocity move.l d0,BGxpos(a5) bmi.s .5 ; if (position < 0) then bounce swap d0 cmp.w maxx,d0 ; if (position <= maxx) then OK blt.s .6 .5: move.l BGxvel(a5),d0 ; d0 = -velocity neg.l d0 move.l d0,BGxvel(a5) ; velocity = -velocity bra.s .7 ; move again (other direction) .6: cmp.w BGxpos(a5),d3 ; if (newpos != oldpos) bne.s .8 ; then redraw tst.b d2 ; if (MovedFlag == TRUE) beq.s .r ; (no, so exit) .8: bsr undraw ; undraw old image (in old position) bsr draw ; draw new image in new position .r: rts  include Atari Puts #.Cls Pterm0 .Cls: dc.b 27,'E',13,10,0 ;- ; ; 68000 Opcodes ; abs = $0ab5 abcd:: abcd d1,d2 abcd -(a3),-(a4) nop add:: add d1,d2 add a2,d3 add (a3),d4 add (a4)+,d5 add -(a5),d6 add $1234(a6),d7 add $12(a1,a2),d2 add abs.w,d3 add abs,d4 add .1(pc),d5 add .1(pc,a2),d6 add #$1234,d7 .1: nop add d1,(a2) add d2,(a3)+ add d3,-(a4) add d4,$1234(a5) add d5,$12(a6,a7) add d6,abs.w add d7,abs nop adda:: add d1,a2 adda d1,a2 adda a2,a3 adda (a3),a4 adda (a4)+,a5 adda -(a5),a6 adda $1234(a6),a7 adda $12(a1,a2),a2 adda abs.w,a3 adda abs,a4 adda .1(pc),a5 adda .1(pc,a2),a6 adda #$1234,a7 .1: nop addi:: add #$1234,d1 addi #$1234,d1 addi #$1234,(a3) addi #$1234,(a4)+ addi #$1234,-(a5) addi #$1234,$1234(a6) addi #$1234,$12(a1,a2) addi #$1234,abs.w addi #$1234,abs .1: nop addq:: addq #1,d1 addq #2,a2 addq #3,(a3) addq #4,(a4)+ addq #5,-(a5) addq #6,$1234(a6) addq #7,$12(a1,a2) addq #8,abs.w addq #1,abs .1: nop addx:: addx d1,d2 addx d3,d4 addx -(a1),-(a2) addx -(a3),-(a4) and:: and d1,d2 and (a3),d4 and (a4)+,d5 and -(a5),d6 and $1234(a6),d7 and $12(a1,a2),d2 and abs.w,d3 and abs,d4 and .1(pc),d5 and .1(pc,a2),d6 and #$1234,d7 .1: nop and d1,(a2) and d2,(a3)+ and d3,-(a4) and d4,$1234(a5) and d5,$12(a6,a7) and d6,abs.w and d7,abs nop andi:: and #$1234,d1 andi #$1234,d1 andi #$1234,(a3) andi #$1234,(a4)+ andi #$1234,-(a5) andi #$1234,$1234(a6) andi #$1234,$12(a1,a2) andi #$1234,abs.w andi #$1234,abs .1: nop andi #$ff,ccr andi #$ffff,sr asl:: asl.b d1,d2 asl d2,d3 asl.w d3,d4 asl.l d4,d5 asl.b #2,d1 asl #3,d2 asl.w #4,d3 asl.l #5,d4 asl d5 asl (a3) asl (a4)+ asl -(a5) asl $1234(a6) asl $12(a1,a2) asl abs.w asl abs .1: nop asr:: asr.b d1,d2 asr d2,d3 asr.w d3,d4 asr.l d4,d5 asr.b #2,d1 asr #3,d2 asr.w #4,d3 asr.l #5,d4 asr d5 asr (a3) asr (a4)+ asr -(a5) asr $1234(a6) asr $12(a1,a2) asr abs.w asr abs .1: nop bra:: bra targ1 bcc targ1 bcs targ1 beq targ1 bge targ1 bgt targ1 bhi targ1 ble targ1 bls targ1 blt targ1 bmi targ1 bne targ1 bpl targ1 bvc targ1 bvs targ1 nop bra.s targ1 bcc.s targ1 bcs.s targ1 beq.s targ1 bge.s targ1 bgt.s targ1 bhi.s targ1 ble.s targ1 bls.s targ1 blt.s targ1 bmi.s targ1 bne.s targ1 bpl.s targ1 bvc.s targ1 bvs.s targ1 nop targ1:: nop nop bra.s targ1 bcc.s targ1 bcs.s targ1 beq.s targ1 bge.s targ1 bgt.s targ1 bhi.s targ1 ble.s targ1 bls.s targ1 blt.s targ1 bmi.s targ1 bne.s targ1 bpl.s targ1 bvc.s targ1 bvs.s targ1 nop bra targ1 bcc targ1 bcs targ1 beq targ1 bge targ1 bgt targ1 bhi targ1 ble targ1 bls targ1 blt targ1 bmi targ1 bne targ1 bpl targ1 bvc targ1 bvs targ1 nop bra.w targ1 bcc.w targ1 bcs.w targ1 beq.w targ1 bge.w targ1 bgt.w targ1 bhi.w targ1 ble.w targ1 bls.w targ1 blt.w targ1 bmi.w targ1 bne.w targ1 bpl.w targ1 bvc.w targ1 bvs.w targ1 bchg:: bchg d1,d2 bchg d2,(a3) bchg d3,(a4)+ bchg d4,-(a5) bchg d5,$1234(a6) bchg d6,$12(a1,a2) bchg d7,abs.w bchg d1,abs bchg #1,d2 bchg #2,(a3) bchg #3,(a4)+ bchg #4,-(a5) bchg #5,$1234(a6) bchg #6,$12(a1,a2) bchg #7,abs.w bchg #1,abs bclr:: bclr d1,d2 bclr d2,(a3) bclr d3,(a4)+ bclr d4,-(a5) bclr d5,$1234(a6) bclr d6,$12(a1,a2) bclr d7,abs.w bclr d1,abs bclr #1,d2 bclr #2,(a3) bclr #3,(a4)+ bclr #4,-(a5) bclr #5,$1234(a6) bclr #6,$12(a1,a2) bclr #7,abs.w bclr #1,abs bset:: bset d1,d2 bset d2,(a3) bset d3,(a4)+ bset d4,-(a5) bset d5,$1234(a6) bset d6,$12(a1,a2) bset d7,abs.w bset d1,abs bset #1,d2 bset #2,(a3) bset #3,(a4)+ bset #4,-(a5) bset #5,$1234(a6) bset #6,$12(a1,a2) bset #7,abs.w bset #1,abs btst:: btst d1,d2 btst d2,(a3) btst d3,(a4)+ btst d4,-(a5) btst d5,$1234(a6) btst d6,$12(a1,a2) btst d7,abs.w btst d1,abs btst d2,.1(pc) btst d3,.1(pc,a3) btst d4,#$12 btst #1,d2 btst #2,(a3) btst #3,(a4)+ btst #4,-(a5) btst #5,$1234(a6) btst #6,$12(a1,a2) btst #7,abs.w btst #1,abs btst #2,.1(pc) btst #3,.1(pc,a3) .1: nop chk:: chk d1,d2 chk (a3),d4 chk (a4)+,d5 chk -(a5),d6 chk $1234(a6),d7 chk $12(a1,a2),d2 chk abs.w,d3 chk abs,d4 chk .1(pc),d5 chk .1(pc,a2),d6 chk #$1234,d7 .1: nop clr:: clr d1 clr (a3) clr (a4)+ clr -(a5) clr $1234(a6) clr $12(a1,a2) clr abs.w clr abs clr a1 .1: nop cmp:: cmp d1,d2 cmp a2,d3 cmp (a3),d4 cmp (a4)+,d5 cmp -(a5),d6 cmp $1234(a6),d7 cmp $12(a1,a2),d2 cmp abs.w,d3 cmp abs,d4 cmp .1(pc),d5 cmp .1(pc,a2),d6 cmp #$1234,d7 cmp.w a2,d3 cmp.l a2,d3 .1: nop cmpa:: cmpa d1,a2 cmpa a2,a3 cmpa (a3),a4 cmpa (a4)+,a5 cmpa -(a5),a6 cmpa $1234(a6),a7 cmpa $12(a1,a2),a2 cmpa abs.w,a3 cmpa abs,a4 cmpa .1(pc),a5 cmpa .1(pc,a2),a6 cmpa #$1234,a7 .1: nop cmpi:: cmpi #$1234,d1 cmpi #$1234,(a3) cmpi #$1234,(a4)+ cmpi #$1234,-(a5) cmpi #$1234,$1234(a6) cmpi #$1234,$12(a1,a2) cmpi #$1234,abs.w cmpi #$1234,abs .1: nop cmpm:: cmpm.b (a1)+,(a2)+ cmpm (a3)+,(a4)+ cmpm.w (a5)+,(a6)+ cmpm.l (a7)+,(a0)+ nop dbcc:: dbcc d1,targ2 dbcs d2,targ2 dbeq d3,targ2 dbf d4,targ2 dbge d5,targ2 dbgt d6,targ2 dbhi d1,targ2 dble d2,targ2 dbls d3,targ2 dblt d4,targ2 dbmi d5,targ2 dbne d6,targ2 dbpl d1,targ2 dbt d2,targ2 dbvc d3,targ2 dbvs d4,targ2 dbra d5,targ2 nop targ2:: nop nop dbcc d1,targ2 dbcs d2,targ2 dbeq d3,targ2 dbf d4,targ2 dbge d5,targ2 dbgt d6,targ2 dbhi d1,targ2 dble d2,targ2 dbls d3,targ2 dblt d4,targ2 dbmi d5,targ2 dbne d6,targ2 dbpl d1,targ2 dbt d2,targ2 dbvc d3,targ2 dbvs d4,targ2 dbra d5,targ2 nop divs:: divs d1,d2 divs (a3),d4 divs (a4)+,d5 divs -(a5),d6 divs $1234(a6),d7 divs $12(a1,a2),d2 divs abs.w,d3 divs abs,d4 divs .1(pc),d5 divs .1(pc,a2),d6 divs #$1234,d7 .1: nop divu:: divu d1,d2 divu (a3),d4 divu (a4)+,d5 divu -(a5),d6 divu $1234(a6),d7 divu $12(a1,a2),d2 divu abs.w,d3 divu abs,d4 divu .1(pc),d5 divu .1(pc,a2),d6 divu #$1234,d7 .1: nop eor:: eor d1,(a2) eor d2,(a3)+ eor d3,-(a4) eor d4,$1234(a5) eor d5,$12(a6,a7) eor d6,abs.w eor d7,abs nop eori:: eor #$1234,d1 eori #$1234,d1 eori #$1234,(a3) eori #$1234,(a4)+ eori #$1234,-(a5) eori #$1234,$1234(a6) eori #$1234,$12(a1,a2) eori #$1234,abs.w eori #$1234,abs eori #$ff,ccr eori #$ffff,sr nop exg:: exg d1,d2 exg d2,a3 exg a3,d4 exg a4,a5 ext:: ext.w d1 ext.l d2 illegal:: illegal jmp:: jmp (a1) jmp $1234(a2) jmp $12(a3,a4) jmp abs.w jmp abs jmp $1234(pc) jmp $12(pc,a3) jmp targ3(pc) jmp targ3(pc,a4) nop targ3:: nop nop jsr:: jsr (a1) jsr $1234(a2) jsr $12(a3,a4) jsr abs.w jsr abs jsr $1234(pc) jsr $12(pc,a3) jsr targ4(pc) jsr targ4(pc,a4) nop targ4:: nop nop lea:: lea (a1),a2 lea $1234(a2),a3 lea $12(a3,a5),a4 lea abs.w,a5 lea abs,a6 lea targ5(pc),a1 lea targ5(pc,a6),a2 targ5:: nop link:: link a1,#$1234 link a2,#-1 link a3,#$ffff link a3,#0 lsl:: lsl.b d1,d2 lsl d2,d3 lsl.w d3,d4 lsl.l d4,d5 lsl.b #2,d1 lsl #3,d2 lsl.w #4,d3 lsl.l #5,d4 lsl d5 lsl (a3) lsl (a4)+ lsl -(a5) lsl $1234(a6) lsl $12(a1,a2) lsl abs.w lsl abs .1: nop lsr:: lsr.b d1,d2 lsr d2,d3 lsr.w d3,d4 lsr.l d4,d5 lsr.b #2,d1 lsr #3,d2 lsr.w #4,d3 lsr.l #5,d4 lsr d5 lsr (a3) lsr (a4)+ lsr -(a5) lsr $1234(a6) lsr $12(a1,a2) lsr abs.w lsr abs .1: nop move:: move d1,d1 move a2,d2 move (a3),d3 move (a4)+,d4 move -(a5),d5 move $1234(a6),d6 move $12(a1,a2),d1 move abs.w,d2 move abs,d3 move .1(pc),d4 move .1(pc,a2),d5 move #$1234,d6 .1: nop move d1,(a1) move a2,(a2) move (a3),(a3) move (a4)+,(a4) move -(a5),(a5) move $1234(a6),(a6) move $12(a1,a2),(a1) move abs.w,(a2) move abs,(a3) move .2(pc),(a4) move .2(pc,a2),(a5) move #$1234,(a6) .2: nop move d1,(a1)+ move a2,(a2)+ move (a3),(a3)+ move (a4)+,(a4)+ move -(a5),(a5)+ move $1234(a6),(a6)+ move $12(a1,a2),(a1)+ move abs.w,(a2)+ move abs,(a3)+ move .3(pc),(a4)+ move .3(pc,a2),(a5)+ move #$1234,(a6)+ .3: nop move d1,-(a1) move a2,-(a2) move (a3),-(a3) move (a4)+,-(a4) move -(a5),-(a5) move $1234(a6),-(a6) move $12(a1,a2),-(a1) move abs.w,-(a2) move abs,-(a3) move .4(pc),-(a4) move .4(pc,a2),-(a5) move #$1234,-(a6) .4: nop move d1,$1234(a1) move a2,$1234(a2) move (a3),$1234(a3) move (a4)+,$1234(a4) move -(a5),$1234(a5) move $1234(a6),$1234(a6) move $12(a1,a2),$1234(a1) move abs.w,$1234(a2) move abs,$1234(a3) move .5(pc),$1234(a4) move .5(pc,a2),$1234(a5) move #$1234,$1234(a6) .5: nop move d1,$12(a1,a5) move a2,$12(a2,a5) move (a3),$12(a3,a5) move (a4)+,$12(a4,a5) move -(a5),$12(a5,a5) move $1234(a6),$12(a6,a5) move $12(a1,a2),$12(a1,a5) move abs.w,$12(a2,a5) move abs,$12(a3,a5) move .6(pc),$12(a4,a5) move .6(pc,a2),$12(a5,a5) move #$1234,$12(a6,a5) .6: nop move d1,abs.w move a2,abs.w move (a3),abs.w move (a4)+,abs.w move -(a5),abs.w move $1234(a6),abs.w move $12(a1,a2),abs.w move abs.w,abs.w move abs,abs.w move .7(pc),abs.w move .7(pc,a2),abs.w move #$1234,abs.w .7: nop move d1,abs move a2,abs move (a3),abs move (a4)+,abs move -(a5),abs move $1234(a6),abs move $12(a1,a2),abs move abs.w,abs move abs,abs move .8(pc),abs move .8(pc,a2),abs move #$1234,abs .8: nop _ccr:: move d1,ccr move (a3),ccr move (a4)+,ccr move -(a5),ccr move $1234(a6),ccr move $12(a1,a2),ccr move abs.w,ccr move abs,ccr move .1(pc),ccr move .1(pc,a2),ccr move #$1234,ccr .1: nop _sr:: move sr,d1 move sr,(a2) move sr,(a3)+ move sr,-(a4) move sr,$1234(a5) move sr,$12(a6,a3) move sr,abs.w move sr,abs nop move d1,sr move (a3),sr move (a4)+,sr move -(a5),sr move $1234(a6),sr move $12(a1,a2),sr move abs.w,sr move abs,sr move .1(pc),sr move .1(pc,a2),sr move #$1234,sr .1: nop _usp:: move usp,a1 move usp,a2 move a3,usp move a4,usp movea:: move d1,a2 move a2,a3 move (a3),a4 move (a4)+,a5 move -(a5),a6 move $1234(a6),a1 move $12(a1,a2),a2 move abs.w,a3 move abs,a4 move .0(pc),a5 move .0(pc,a2),a6 move #$1234,a7 .0: nop movem:: movem d1-d6/a3-a7,(a1) movem d1-d6/a3-a7,-(a2) movem d1-d6/a3-a7,$1234(a3) movem d1-d6/a3-a7,$12(a4,a5) movem d1-d6/a3-a7,abs.w movem d1-d6/a3-a7,abs nop movem (a1),d1-d6/a3-a7 movem (a2)+,d1-d6/a3-a7 movem $1234(a3),d1-d6/a3-a7 movem $12(a4,a5),d1-d6/a3-a7 movem abs.w,d1-d6/a3-a7 movem abs,d1-d6/a3-a7 nop nop movem.w d1-d6/a3-a7,(a1) movem.w d1-d6/a3-a7,-(a2) movem.w d1-d6/a3-a7,$1234(a3) movem.w d1-d6/a3-a7,$12(a4,a5) movem.w d1-d6/a3-a7,abs.w movem.w d1-d6/a3-a7,abs nop movem.w (a1),d1-d6/a3-a7 movem.w (a2)+,d1-d6/a3-a7 movem.w $1234(a3),d1-d6/a3-a7 movem.w $12(a4,a5),d1-d6/a3-a7 movem.w abs.w,d1-d6/a3-a7 movem.w abs,d1-d6/a3-a7 nop nop movem.l d1-d6/a3-a7,(a1) movem.l d1-d6/a3-a7,-(a2) movem.l d1-d6/a3-a7,$1234(a3) movem.l d1-d6/a3-a7,$12(a4,a5) movem.l d1-d6/a3-a7,abs.w movem.l d1-d6/a3-a7,abs nop movem.l (a1),d1-d6/a3-a7 movem.l (a2)+,d1-d6/a3-a7 movem.l $1234(a3),d1-d6/a3-a7 movem.l $12(a4,a5),d1-d6/a3-a7 movem.l abs.w,d1-d6/a3-a7 movem.l abs,d1-d6/a3-a7 nop movep:: movep d1,$1234(a2) movep d2,(a3) movep $1234(a3),d4 movep (a4),d5 movep.w d1,$1234(a2) movep.w d2,(a3) movep.w $1234(a3),d4 movep.w (a4),d5 movep.l d1,$1234(a2) movep.l d2,(a3) movep.l $1234(a3),d4 movep.l (a4),d5 moveq:: moveq #0,d0 moveq #$ff,d0 moveq #$7f,d0 moveq #1,d0 muls:: muls d1,d2 muls (a3),d4 muls (a4)+,d5 muls -(a5),d6 muls $1234(a6),d7 muls $12(a1,a2),d2 muls abs.w,d3 muls abs,d4 muls .1(pc),d5 muls .1(pc,a2),d6 muls #$1234,d7 .1: nop mulu:: mulu d1,d2 mulu (a3),d4 mulu (a4)+,d5 mulu -(a5),d6 mulu $1234(a6),d7 mulu $12(a1,a2),d2 mulu abs.w,d3 mulu abs,d4 mulu .1(pc),d5 mulu .1(pc,a2),d6 mulu #$1234,d7 .1: nop nbcd:: nbcd d1 nbcd (a3) nbcd (a4)+ nbcd -(a5) nbcd $1234(a6) nbcd $12(a1,a2) nbcd abs.w nbcd abs nop neg:: neg d1 neg (a3) neg (a4)+ neg -(a5) neg $1234(a6) neg $12(a1,a2) neg abs.w neg abs nop negx:: negx d1 negx (a3) negx (a4)+ negx -(a5) negx $1234(a6) negx $12(a1,a2) negx abs.w negx abs nop nop:: nop nop not:: not d1 not (a3) not (a4)+ not -(a5) not $1234(a6) not $12(a1,a2) not abs.w not abs nop or:: or d1,d2 or (a3),d4 or (a4)+,d5 or -(a5),d6 or $1234(a6),d7 or $12(a1,a2),d2 or abs.w,d3 or abs,d4 or .1(pc),d5 or .1(pc,a2),d6 or #$1234,d7 .1: nop or d1,(a2) or d2,(a3)+ or d3,-(a4) or d4,$1234(a5) or d5,$12(a6,a7) or d6,abs.w or d7,abs nop ori:: ori #$1234,d1 ori #$1234,(a3) ori #$1234,(a4)+ ori #$1234,-(a5) ori #$1234,$1234(a6) ori #$1234,$12(a1,a2) ori #$1234,abs.w ori #$1234,abs nop or #$1234,d1 or #$1234,(a3) or #$1234,(a4)+ or #$1234,-(a5) or #$1234,$1234(a6) or #$1234,$12(a1,a2) or #$1234,abs.w or #$1234,abs nop or #$ff,ccr or #$ffff,sr ori #$ff,ccr ori #$ffff,sr nop pea:: pea (a3) pea $1234(a6) pea $12(a1,a2) pea abs.w pea abs pea .0(pc) pea .0(pc,a2) .0: nop reset:: reset nop rol:: rol.b d1,d2 rol d2,d3 rol.w d3,d4 rol.l d4,d5 rol.b #2,d1 rol #3,d2 rol.w #4,d3 rol.l #5,d4 rol d5 rol (a3) rol (a4)+ rol -(a5) rol $1234(a6) rol $12(a1,a2) rol abs.w rol abs .1: nop ror:: ror.b d1,d2 ror d2,d3 ror.w d3,d4 ror.l d4,d5 ror.b #2,d1 ror #3,d2 ror.w #4,d3 ror.l #5,d4 ror d5 ror (a3) ror (a4)+ ror -(a5) ror $1234(a6) ror $12(a1,a2) ror abs.w ror abs .1: nop roxl:: roxl.b d1,d2 roxl d2,d3 roxl.w d3,d4 roxl.l d4,d5 roxl.b #2,d1 roxl #3,d2 roxl.w #4,d3 roxl.l #5,d4 roxl d5 roxl (a3) roxl (a4)+ roxl -(a5) roxl $1234(a6) roxl $12(a1,a2) roxl abs.w roxl abs .1: nop roxr:: roxr.b d1,d2 roxr d2,d3 roxr.w d3,d4 roxr.l d4,d5 roxr.b #2,d1 roxr #3,d2 roxr.w #4,d3 roxr.l #5,d4 roxr d5 roxr (a3) roxr (a4)+ roxr -(a5) roxr $1234(a6) roxr $12(a1,a2) roxr abs.w roxr abs .1: nop rte:: rte rtr:: rtr rts:: rts nop sbcd:: sbcd d1,d2 sbcd d3,d4 sbcd -(a1),-(a2) sbcd -(a3),-(a4) scc:: scc d1 scs (a2) seq (a3)+ sf -(a4) sge $1234(a5) sgt $12(a6,a1) shi abs.w sle abs sls d1 slt (a2) smi (a3)+ sne -(a4) spl $1234(a5) st $12(a6,a2) svc abs.w svs abs nop stop:: stop #$1234 stop #$2700 stop #$0000 nop sub:: sub d1,d2 sub a2,d3 sub (a3),d4 sub (a4)+,d5 sub -(a5),d6 sub $1234(a6),d7 sub $12(a1,a2),d2 sub abs.w,d3 sub abs,d4 sub .1(pc),d5 sub .1(pc,a2),d6 sub #$1234,d7 .1: nop sub d1,(a2) sub d2,(a3)+ sub d3,-(a4) sub d4,$1234(a5) sub d5,$12(a6,a7) sub d6,abs.w sub d7,abs nop suba:: sub d1,a2 suba d1,a2 suba a2,a3 suba (a3),a4 suba (a4)+,a5 suba -(a5),a6 suba $1234(a6),a7 suba $12(a1,a2),a2 suba abs.w,a3 suba abs,a4 suba .1(pc),a5 suba .1(pc,a2),a6 suba #$1234,a7 .1: nop subi:: sub #$1234,d1 subi #$1234,d1 subi #$1234,(a3) subi #$1234,(a4)+ subi #$1234,-(a5) subi #$1234,$1234(a6) subi #$1234,$12(a1,a2) subi #$1234,abs.w subi #$1234,abs .1: nop subq:: subq #1,d1 subq #2,a2 subq #3,(a3) subq #4,(a4)+ subq #5,-(a5) subq #6,$1234(a6) subq #7,$12(a1,a2) subq #8,abs.w subq #1,abs .1: nop subx:: subx d1,d2 subx d3,d4 subx -(a1),-(a2) subx -(a3),-(a4) nop swap:: swap d1 swap d2 swap d3 swap d7 nop tas:: tas d1 tas (a3) tas (a4)+ tas -(a5) tas $1234(a6) tas $12(a1,a2) tas abs.w tas abs nop trap:: trap #1 trap #2 trap #15 trap #$f nop trapv:: trapv tst:: tst d1 tst (a3) tst (a4)+ tst -(a5) tst $1234(a6) tst $12(a1,a2) tst abs.w tst abs nop unlk: unlk a1 unlk a2 unlk a6 unlk a7 ;- ; ; 6502 Opcodes ; ; .6502 .org $f0 tmp: ds.b 1 tmph: ds.b 1 tmp1: ds.b 1 tmp1h: ds.b 1 .org $8000 dc.w $1234 dc.b 12,34,56,78 dc.b 'This is a test of the...',0 dc.w $1234,$5678,$9abc,@777 adc #immed adc abs adc tmp adc (tmp,x) adc (tmp),y adc tmp,x adc abs,x adc abs,y and #immed and abs and tmp and (tmp,x) and (tmp),y and tmp,x and abs,x and abs,y asl abs asl tmp asl asl tmp,x asl abs,x bcc where bcs where beq where bne where bmi where bpl where bvc where bvs where where: bit abs bit tmp brk clc cld cli clv cmp #immed cmp abs cmp tmp cmp (tmp,x) cmp (tmp),y cmp tmp,x cmp abs,x cmp abs,y cpx #immed cpx abs cpx tmp cpy #immed cpy abs cpy tmp dec abs dec tmp dec tmp,x dec abs,x dex dey eor #immed eor abs eor tmp eor (tmp,x) eor (tmp),y eor tmp,x eor abs,x eor abs,y inc abs inc tmp inc tmp,x inc abs,x inx iny jmp abs jmp (abs) jsr abs lda #immed lda abs lda tmp lda (tmp,x) lda (tmp),y lda tmp,x lda abs,x lda abs,y ldx #immed ldx abs ldx tmp ldx abs,y ldx tmp,y ldy #immed ldy abs ldy tmp ldy abs,x ldy tmp,x lsr abs lsr tmp lsr lsr tmp,x lsr abs,x nop ora #immed ora abs ora tmp ora (tmp,x) ora (tmp),y ora tmp,x ora abs,x ora abs,y pha php pla plp rol abs rol tmp rol rol tmp,x rol abs,x ror abs ror tmp ror ror tmp,x ror abs,x rti rts sbc #immed sbc abs sbc tmp sbc (tmp,x) sbc (tmp),y sbc tmp,x sbc abs,x sbc abs,y sec sed sei sta abs sta tmp sta (tmp,x) sta (tmp),y sta tmp,x sta abs,x sta abs,y stx abs stx tmp stx tmp,y sty abs sty tmp sty tmp,x tax tay tsx txa txs tya abs = $5ba immed = $11 s include Atari MaxTxt =$fe ; longueur max. de la ligne ; ; Definition des codes ASCII ; BELL =$07 BCKSPC =$08 CR =$0D LF =$0A Deb: move.l #TxtBuf,a6 ; pointeur sur le buffer clr.b Lenght ; longueur du texte Puts #Prompt WaitKey: move.w #$ff,-(sp) Gemdos 6,4 tst.w d0 beq.s WaitKey ; cmp.w #27,d0 beq.s Abort cmp.w #13,d0 beq.s Enter ; cmp.b #BCKSPC,d0 beq.s Backspace ; addq.b #1,Lenght cmp.b #MaxTxt,Lenght bhi.s Bip move.b d0,(a6)+ move.w d0,-(sp) Gemdos 2,4 bra.s WaitKey ; Backspace: cmp.b #1,Lenght blt.s Bip subq.b #1,Lenght move.b #$0,-(a6) move.w #$8,-(sp) Gemdos 2,4 move.w #$20,-(sp) Gemdos 2,4 move.w #$8,-(sp) Gemdos 2,4 bra.s WaitKey ; Enter: bsr.s Reprint bra.w Deb ; Abort: bsr.s Reprint Pterm0 ; Bip: move.w #7,-(sp) Gemdos 6,4 bra.w WaitKey ; Reprint: Puts #Entree Inv clr.b (a6)+ move.l #TxtBuf,-(sp) Gemdos 9,6 Normv Crlf Rts ; Prompt: dc.b 13,10,"*",0 Entree: dc.b 13 ,10,"Chaine entree: ",0 Lenght: dc.w 0 TxtBuf: dc.l 64 ; 256 octets *N * * ma routine de depart du C * *N * htpa=4 * High TPA address lbss=24 * Bss segment start bsslen=28 * Bss segment length .text start: move.l htpa(a7),a0 * a0 -> Base page move.l lbss(a0),a1 * a1 -> bss region adda.l bsslen(a0),a1 * a1 -> 1st heap loc xclear: * Clear heap area move.l a1,__break * Put in "break" loc clr.l a6 * Clear frame pointer jsr _main * call main routine jmp _fin * __break: .ds.l 1 * Break function * * _fin: move.w #0,d0 * fin trap #2 * rts 8 .title 'Example Program' ;-H ; : ; Silly Example Program : ; : ;---- : ; 30-Nov-1986 lmd Hacked it up from previous brontos. : ; : ;-H .include atari ; include Atari ST equates and macros ;- ; ; Display a message, ; display an interesting icon, ; wait for a keypress, ; and then exit. ; ; Puts #.message ; print message Super ; get into supervisor mode lea icon(pc),a0 ; a0 -> form lea .ret(pc),a6 ; a6 -> return address moveq #26,d6 ; horizontal offset (/2) bra monoicon .ret: User ; back to user mode Bconin #CON ; wait for a keystroke Pterm0 ; and terminate .message: dc.b $1b,'E','Press any key to exit...',13,10,0 .even ;- ; ; A cute icon ; (This is a monochrome mask, generated by NEO and ; massaged by hand somewhat). ; ; icon: dc.w $3f-1 dc.w ($12/2)-1 dc.w $FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFC dc.w $0000,$8000,$0000,$0000,$0000,$0000,$0000,$0000 dc.w $0004,$0000,$8000,$0000,$0000,$0000,$0000,$0000 dc.w $0000,$0007,$8000,$8000,$0000,$0000,$0000,$0000 dc.w $0000,$0000,$0006,$8000,$8000,$0000,$0000,$0000 dc.w $0000,$0000,$0000,$0005,$8000,$8000,$0000,$0000 dc.w $0000,$0000,$0000,$0000,$0006,$8000,$8000,$0000 dc.w $0000,$0000,$0000,$0000,$0000,$0005,$8000,$8000 dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0006,$8000 dc.w $8000,$0000,$0000,$0000,$0000,$0000,$0000,$0005 dc.w $8000,$8000,$0000,$0000,$0000,$0000,$0000,$0000 dc.w $0006,$8000,$8000,$0000,$0000,$0000,$0000,$0000 dc.w $0000,$0005,$8000,$8000,$0000,$0000,$0000,$0000 dc.w $0000,$0000,$0006,$8000,$8000,$0000,$0000,$0000 dc.w $0000,$0000,$0000,$0005,$8000,$8000,$0000,$0000 dc.w $0000,$0000,$0000,$F000,$0006,$8000,$8000,$0000 dc.w $0000,$0000,$0000,$0001,$8800,$0005,$8000,$8000 dc.w $0000,$0000,$0000,$0000,$0002,$0400,$0006,$8000 dc.w $8000,$0000,$0000,$0000,$0000,$0004,$4400,$0005 dc.w $8000,$8000,$0000,$0000,$0000,$0000,$0008,$B800 dc.w $0006,$8000,$8000,$0000,$0000,$0000,$0000,$0011 dc.w $0000,$0005,$8000,$8000,$0000,$0000,$0000,$0000 dc.w $0022,$0000,$0006,$8000,$8000,$0000,$0000,$0000 dc.w $0000,$0044,$0000,$0005,$8000,$8000,$0000,$0000 dc.w $0000,$0000,$0088,$0000,$0006,$8000,$8000,$0000 dc.w $0000,$0000,$0000,$0110,$0000,$0005,$8000,$8000 dc.w $0000,$0000,$0000,$0000,$0210,$0000,$0006,$8000 dc.w $8000,$0000,$0000,$0000,$0000,$1C20,$000C,$7005 dc.w $8000,$8000,$0000,$0000,$000F,$FFFF,$E020,$0002 dc.w $8006,$8000,$8000,$0000,$0000,$07F0,$0000,$0040 dc.w $0009,$2005,$8000,$8000,$0000,$0000,$3800,$0000 dc.w $0040,$0015,$5006,$8000,$8000,$0000,$0000,$4000 dc.w $0000,$0080,$0022,$8805,$8000,$8000,$0000,$0001 dc.w $8000,$0000,$0100,$0024,$C806,$8000,$8000,$0000 dc.w $0002,$0000,$0000,$0200,$0009,$2005,$8000,$8000 dc.w $0000,$0004,$0000,$0000,$0400,$0011,$1006,$8000 dc.w $8000,$0000,$0008,$0000,$0000,$0400,$0012,$9005 dc.w $8000,$8000,$0000,$0030,$0000,$0000,$0200,$0001 dc.w $0006,$8000,$8000,$0000,$01C0,$0000,$0000,$0E00 dc.w $0002,$8005,$8000,$8000,$0000,$1E01,$FC1F,$00FA dc.w $3100,$0001,$0006,$8000,$8000,$000F,$E00F,$0220 dc.w $FF04,$4880,$0002,$8005,$8000,$8000,$07F0,$01F0 dc.w $0B20,$0004,$4580,$0001,$0006,$8000,$8000,$7800 dc.w $3E00,$1990,$0008,$8300,$0002,$8005,$8000,$800F dc.w $FFFF,$E000,$1CF0,$000F,$8000,$0005,$4006,$8000 dc.w $BFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFF5 dc.w $8000,$8000,$0000,$0000,$0000,$0000,$0000,$0000 dc.w $0006,$8000,$8000,$0000,$0000,$0000,$0000,$0000 dc.w $0000,$0005,$8000,$8000,$0000,$0000,$0000,$0000 dc.w $0000,$0000,$0006,$8000,$8000,$0000,$0000,$0000 dc.w $0000,$0000,$0000,$0005,$8000,$8000,$0000,$0000 dc.w $0000,$0000,$0000,$0000,$0006,$8000,$8000,$0000 dc.w $1E00,$0004,$01E3,$8F00,$0000,$0005,$8000,$8000 dc.w $0000,$1138,$E78E,$3914,$5000,$0000,$0006,$8000 dc.w $8000,$003F,$9E25,$1444,$4514,$4E3F,$8000,$0005 dc.w $8000,$8000,$0000,$1121,$1444,$4514,$4100,$0000 dc.w $0006,$8000,$8000,$0000,$1E20,$E442,$39E3,$9E00 dc.w $0000,$0005,$8000,$8000,$0000,$0000,$0000,$0000 dc.w $0000,$0000,$0006,$8000,$8000,$0000,$0000,$0000 dc.w $0000,$0000,$0000,$0005,$8000,$8000,$0000,$0000 dc.w $0000,$0000,$0000,$0000,$0006,$8000,$8000,$0000 dc.w $0000,$0000,$0000,$0000,$0000,$0005,$8000,$8000 dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0006,$8000 dc.w $8000,$0000,$0000,$0000,$0000,$0000,$0000,$0005 dc.w $8000,$8000,$0000,$0000,$0000,$0000,$0000,$0000 dc.w $0006,$8000,$8000,$0000,$0000,$0000,$0000,$0000 dc.w $0000,$0005,$8000,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF dc.w $FFFF,$FFFF,$FFFE,$8000,$3555,$5555,$5555,$5555 dc.w $5555,$5555,$5555,$5555,$8000,$2AAA,$AAAA,$AAAA dc.w $AAAA,$AAAA,$AAAA,$AAAA,$AAAA,$8000,$3FFF,$FFFF dc.w $FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$8000 ;- ; ; Monochrome-image icon draw ; [This is probably slow, but it doesn't HAVE to be fast] ; ; Passed: a0 -> icon form (see below) ; d6 = horizontal offset (in source word) ; a6 -> return address ; processor in supervisor mode ; ; Uses: d0-d5/a0-a2 ; ; An icon form has the simple structure: ; ; dc.w lineCount-1 ; "DBRA" number of scanlines ; dc.w widthCount-1 ; "DBRA" number of words/line ; dc.w ...data... ; image data (by scanline) ; monoicon:: move.w (a0)+,d4 ; d4 = height of form - 1 move.w (a0)+,d3 ; d3 = width of form - 1 move.b shiftmd,d7 ; get video resolution and.w #$0003,d7 ; (strip naughty bits) add.w d7,d7 ; d7 = rez index moveq #0,d0 ; compute base address move.b dbaseh,d0 ; dbaseh<<16 + dbasel<<8 lsl.w #8,d0 ; + middle_of_screen move.b dbasel,d0 lsl.l #8,d0 move.l d0,a2 add.w .middle(pc,d7.w),a2 ; a2 -> base of mem to draw at move.w d6,d0 ; d0 = hoffset * dest width mulu.w .wmult(pc,d7.w),d0 add.w d0,a2 ; adjust horizontal position .3: move.w d3,d2 ; d2 = width - 1 (loop count) move.l a2,a1 ; a1 -> start of line .2: move.w (a0)+,d0 ; get form word move.w .nplanes(pc,d7.w),d1 ; d1 = #planes - 1 .1: move.w d0,(a1)+ ; dump a form word in dbra d1,.1 ; (do more planes) dbra d2,.2 ; (loop for entire line) add.w .width(pc,d7.w),a2 ; a2 -> start of next line dbra d4,.3 ; (loop for entire form) jmp (a6) ; "return" to caller .middle: dc.w 100*160,100*160,200*80,200*80 .nplanes: dc.w 3,1,0,0 .width: dc.w 160,160,80,80 .wmult: dc.w 8,4,2,2 J  ;-H ; : ; Example #1 : ; : ;-H pea string(pc) ; Cconws(&string) move.w #9,-(sp) trap #1 addq #6,sp clr.w -(sp) ; Pterm0() trap #1 illegal ; "cannot return" string: dc.b "Hello, world!\r\n",0 { ;-H ; : ; Example #2 : ; : ;-H .include atari ; include "atari.s" ST definitions Puts #string Pterm0 string: dc.b "Hello again, world!\r\n",0 *N * * gemstart.s -startup code for the C runtime library, aesbind, vdibind * * IMPORTANT: SEE THE DESCRIPTION OF THE "STACK" VARIABLE, BELOW. * * This is the startup code for any application running on the Atari ST. * This includes gemlib, vdi, and the aes bindings. * * Look carefully at the comments below; they will determine the nature * of this startup code (stack size, AES & VDI usage, etc.). * * This must be the first object file in a LINK command. When the * operating system gives it control, our process has ALL of memory * allocated to it, and our stack pointer is at the top. * This code (conditionally) gives some of that memory back * to the operating system, places its stack pointer at the top * of the memory it still owns, sets up some global variables, * and calls __main, the run-time library startup routine (which * parses the command line into argc/argv, opens stdin and stdout, * etc., before calling the programmer's _main). * * This object file also includes __exit, which is the procedure the * runtime library calls to exit back to the operating system. * As a new feature with this release, the argument passed to __exit * is NOT ignored; it is passed to the operating system using the Pterm * function call, which returns it as the value of the Pexec() call * which invoked this process. * *N * * CONFIGUING THIS STARTUP FILE * * There are several memory models which this startup file will * assemble for, selected by the assembly variable STACK. * * When your process gets control, it owns its basepage, its text * (program) segment, its data segment, its bss segment (uninitialized * data), and all the "free memory" from there to the top of the TPA. * A process can choose to keep all that free memory for its stack * (used by function calls and local variables) and heap (used by * malloc()), or it can return some or all of that space to the * operating system. * * The memory between the top of your bss segment and your stack pointer * is used both for a heap and for the stack. The line between heap * and stack is called the "break". When malloc() uses up all the * memory below the break, it calls _brk() (in this file) to move the * break up. If the break gets too close to the stack, _brk() returns * an error code, and malloc() will return NULL because it couldn't * satisfy the request. If the stack act?ually overflows the break, * _brk() prints an error message and exits, returning 1 to its parent. * * If you are using the AES or VDI, you must return at least a little of * the free memory to the operating system, because they need it. * About 8K should be enough. The AES uses this memory for blt buffers, * and the VDI uses it for virtual workstation data. * Also, if your program uses the Pexec() call, you will need to return * some space to make room for the child process. * * It is usually a good idea to keep only as much memory as you will * use, because some programs depend on processes returning some * memory to the operating system. * *I * * Here are the memory models you can set up with the STACK variable: * * STACK * value Meaning * - -9 * -1 Keep all the memory for this process. Return NONE of it * to the operating system. This model gives you the most * memory. * * WARNING: IF YOU REQUEST ALL OF MEMORY (with STACK = -1), * YOU MUST NOT USE THE AES, THE VDI, OR THE BIOS PEXEC() * FUNCTION. PEXEC WILL RETURN A CORRECT ERROR CODE (-39, * ENSMEM), BUT IT WILL ALSO BREAK THE MEMORY MANAGEMENT SYSTEM. * * 0 Return all but a minimal amount (MINSTACK) of the free * space to the operating system. This is a good idea if * you know you won't be using malloc() much, or if you * will be using Pexec() and your program doesn't need much * stack space. Remember, though, that some library functions, * especially fopen(), use malloc() and will use your heap * space. * * 1 Keep 1/4 of the free space. This is a good model if * you will be using malloc() a lot, but also want to use * Pexec() to spawn subprocesses. * * 2 Keep 2/4 (1/2) of the free space. This is good if you * use malloc() a lot, but don't want to be too much of a * memory hog. * * 3 Keep 3/4 of the free space. This is a good choice for * programs which use the AES or VDI, because it gives you plenty * of room for using malloc(), but leaves enough for the * AES and VDI to allocate their buffers, too. * * 4 This is a special value which means "Keep the number of * bytes in the LONG global variable __STKSIZ." You must declare * a variable in your program called "_STKSIZ" and initialize * it to the number of bytes you want for your stack and heap. * If __STKSIZ is negative, it means "Keep all BUT the number * of bytes in __STKSIZ." As a safeguard, if __STKSIZ is * undefined, you will get MINSTACK bytes of stack/heap. * * An example using __STKSIZ this in C is: * * /* outside all function blocks */ * unsigned long _STKSIZ = 32767; /* 32K stack+heap */ * or * unsigned long _STKSIZ = -8192; /* keep all but 8K */ * * Note that in C, all variables get an underscore stuck on * the front, so you just use one underscore in your program. * Note also that it has to be all upper-case. * * Any other POSITIVE value of STACK will be taken as the number of * bytes you want to KEEP for your stack and heap. * * Any other NEGATIVE value of STACK will be taken as the number of * bytes you want to give back to the operating system. * * Note that if you give back less than 512 bytes, you still shouldn't * use Pexec(), and if you give back less than (about) 4K, you shouldn't * use the AES or VDI. * * In all cases, a minimum stack size is enforced. This minimum is * set by the variable MINSTACK in this assembly file. This value * should be at least 256 bytes, but should be more like 4K. If * the stack size from the STACK model you choose or the _STKSIZ * variable in your program is less than MINSTACK, you'll get * MINSTACK bytes. If there aren't MINSTACK bytes free past the end * of your BSS, the program will abort with an error message. * *I * * STACK variable summary: * -1=keep all * 0=keep MINSTACK bytes * 1=keep 1/4 of free memory * 2=keep 2/4 * 3=keep 3/4 * 4=use _STKSIZ: keep (if >0) or give up (if <0) _STKSIZ bytes. * other=keep that many bytes (positive) or give back that many (negative) STACK=-8192 * CHANGE THIS VARIABLE TO CHOOSE A MEMORY MODEL MINSTACK=4096 * minimum stack+heap size. FUDGE=512 * minimum space to leave ABOVE our stack * BASEPAGE ADDRESSES: p_lowtpa=$0 * Low TPA address (basepage address) p_hitpa=$4 * High TPA address (and initial stack pointer) p_tbase=$8 * ptr to Code segment start p_tlen=$c * Code segment length p_dbase=$10 * ptr to Data segment start p_dlen=$14 * Data segment length p_bbase=$18 * ptr to Bss segment start p_blen=$1c * Bss segment length p_dta=$20 * ptr to process's initial DTA p_parent=$24 * ptr to process's parent's basepage p_reserved=$28 * reserved pointer p_env=$2c * ptr to environment string for process p_cmdlin=$80 * Command line image * * CONTROL VARIABLES (used in stack computations) * * GOTSTACK: a boolean which is set TRUE if STACK in [-1..4], meaning "don't * assemble the code keeping or returning STACK bytes." * * DOSHRINK: a boolean which is set FALSE if STACK is -1, meaning "don't * shrink any memory back to the operating system." * gotstack .equ 0 * set to 1 if STACK in [-1..4] doshrink .equ 1 * default is 1; set to 0 if STACK = -1 * GEMDOS functions: cconws=$09 * Cconws(string): write to console mshrink=$4a * Mshrink(newsize): shrink a block to a new size pterm=$4c * Pterm(code): exit, return code to parent .globl __start .globl __main .globl __exit .globl _brk .globl __break .globl ___cpmrv .globl __base .globl __sovf .globl _crystal .globl _ctrl_cnts .text * * Must be first object file in link statement * __start: move.l sp,a1 * save our initial sp (used by ABORT) move.l 4(sp),a0 * a0 = basepage address move.l a0,__base * base = a0 move.l p_bbase(a0),d0 * d0 = bss seg start add.l p_blen(a0),d0 * d0 += bss length (d0 now = start of heap) move.l d0,__break * __break = first byte of heap *I * * * Compute stack size based on MINSTACK, p_hitpa(a0), STACK, * * and __STKSIZ, as appropriate. Place the SP where you want * * your stack to be. Note that a0 == __base, d0 == __break * * * * At most one of the STACK code fragments will be assembled. * * If none of them are, then `gotstack' will still be 0, and * * the final block, saving STACK bytes, is used. Finally, if * * STACK wasn't -1 (meaning don't shrink at all), DOSHRINK * * gets control. See doshrink for more. * * * *I *I * STACK = -1: keep all of memory * *I .ifeq STACK+1 * if (STACK == -1) gotstack .equ 1 doshrink .equ 0 * this PREVENTS doshrink from assembling. move.l p_hitpa(a0),sp * place stack at top of tpa. move.l d0,d1 * check against MINSTACK add.l #MINSTACK,d1 * d1 = __break + MINSTACK; cmp.l sp,d1 * if (sp < __break + MINSTACK) bhi abort * goto abort; .endc * (this falls through to the __main call) *I * STACK = 0: keep only MINSTACK bytes * *I .ifeq STACK gotstack .equ 1 move.l #MINSTACK,sp * sp = __break+MINSTACK; add.l d0,sp .endc * (this falls through to doshrink) *I * STACK = 1: keep 1/4 of available memory * *I .ifeq STACK-1 gotstack .equ 1 * /* keep 1/4 of available RAM */ move.l p_hitpa(a0),d1 * d1 = p_hitpa; sub.l d0,d1 * d1 -= __break; /* d1 = free ram size */ lsr.l #2,d1 * d1 /= 4; add.l d0,d1 * d1 += __break; /* d1 = new sp */ move.l d1,sp * sp = d1; .endc * } (this falls through to doshrink) *I * STACK = 2: keep 2/4 of available memory * *I .ifeq STACK-2 * if (STACK == 2) { /* keep 1/2 */ gotstack .equ 1 move.l p_hitpa(a0),d1 * d1 = p_hitpa; sub.l d0,d1 * d1 -= __break; /* d1 = free ram size */ lsr.l #1,d1 * d1 /= 2; add.l d0,d1 * d1 += __break; /* d1 = new sp */ move.l d1,sp * sp = d1; .endc * this falls through to doshrink *I * STACK = 3: keep 3/4 of available memory * *I .ifeq STACK-3 * if (STACK == 3) { /* keep 3/4 */ gotstack .equ 1 move.l p_hitpa(a0),d1 * d1 = p_hitpa; sub.l d0,d1 * d1 -= __break; /* d1 = free ram size */ lsr.l #2,d1 * d1 /= 4; move.l d1,d2 * d2 = d1 add.l d2,d1 * d1 += d2; add.l d2,d1 * d1 += d2; /* now d1 = 3*(d1/4) */ add.l d0,d1 * d1 += __break; /* d1 = new sp */ move.l d1,sp * sp = d1; .endc * this falls through to doshrink *I * STACK = 4: keep or give up __STKSIZ bytes of memory. * *I .ifeq STACK-4 * if (STACK == 4) { /* keep __STKSIZ */ .globl __STKSIZ * global variable holding stack size gotstack .equ 1 move.l #__STKSIZ,a1 * Check to see if __STKSIZ was undefined. beq keepmin * if it's zero, keep the minimum stack. move.l (a1),d1 bmi giveback * if (__STKSIZ < 0) goto giveback; add.l d0,d1 * d1 = __base+__STKSIZ; /* new sp */ bra gotd1 keepmin: * __STKSIZ was undefined; keep minimum. move.l #MINSTACK,d1 add.l d0,d1 * d1 = __base + MINSTACK; bra gotd1 * goto gotd1; giveback: add.l p_hitpa(a0),d1 * d1 += hitpa; gotd1: move.l d1,sp * gotd1: sp = d1; .endc *I * STACK is something else: keep (if STACK>0) or give * * back (if STACK<0) STACK bytes * *I .ifeq gotstack * it's a constant stack value (+ or -) move.l #STACK,d1 * /* if neg, give back STACK bytes */ bmi giveback * if (STACK < 0) goto giveback; add.l d0,d1 * d1 = __STKSIZ + __base; /* new sp */ bra gotd1 * goto gotd1; giveback: * giveback: add.l p_hitpa(a0),d1 * d1 += hitpa; /* d1 = new sp */ gotd1: * gotd1: move.l d1,sp * sp = d1; .endc *I * * * DOSHRINK: take SP as a requested stack pointer. Place it * * between (__break+MINSTACK) and (p_hitpa(a0)-FUDGE). If we can't, * * abort. Otherwise, we return the remaining memory back to the o.s. * * The reason we always shrink by at least FUDGE bytes is to work around * * a bug in the XBIOS Malloc() routine: when there are fewer than 512 * * bytes in the largest free block, attempting a Pexec() breaks the * * memory management system. Since all models except -1 permit Pexec() * * calls, we have to make sure they don't break, even if the Pexec() * * fails. Thus, FUDGE must be at least 512. * * * *I * * PSEUDOCODE: * doshrink(sp) * { * /* if too low, bump it up */ * if (sp < (__break + MINSTACK)) * sp = (__break + MINSTACK); * * /* if too high, bump it down */ * if (sp > (hitpa - FUDGE)) { * sp = (hitpa - FUDGE); * * /* if now too low, there's not enough memory */ * if (sp < (__break + MINSTACK)) * goto abort; * } * Mshrink(0,__base,(sp - __base)); * } * *I .ifne doshrink * assemble this only if STACK != -1 move.l d0,d1 * d1 = __break; add.l #MINSTACK,d1 * d1 += MINSTACK; cmp.l d1,sp * if ((__break+MINSTACK) < sp) bhi minok * goto minok; move.l d1,sp * else sp = (__break+MINSTACK) minok: * minok: move.l p_hitpa(a0),d2 * d2 = hitpa; sub.l #FUDGE,d2 * d2 -= FUDGE; cmp.l d2,sp * if ((hitpa - FUDGE) > sp) bcs maxok * goto maxok; * * else { move.l d2,sp * sp = (hitpa - FUDGE); cmp.l d1,d2 * if ((__break+MINSTACK) > (hitpa-FUDGE)) bcs abort * goto abort; /* BAD NEWS */ * * } maxok: *I * STACK LOCATION HAS BEEN DETERMINED. Return unused memory to the o.s. * *I move.l sp,d1 * d1 = sp; and.l #-2,d1 * /* ensure d1 is even */ move.l d1,sp * sp = d1; sub.l a0,d1 * d1 -= __base; /* d1 == size to keep */ move.l d1,-(sp) * push the size to keep move.l a0,-(sp) * and start of this block (our basepage) clr.w -(sp) * and a junk word move #mshrink,-(sp) * and the function code trap #1 * Mshrink(0,__base,(sp-base)) add.l #12,sp * clean the stack after ourselves .endc *I * * * Finally, the stack is set up. Now call _main(cmdline, length). * * * *I move.l __base,a0 * set up _main(cmdline,length) lea.l p_cmdlin(a0),a2 * a2 now points to command line move.b (a2)+,d0 * d0 = length; a2++; ext.w d0 * extend byte count into d0.w move.w d0,-(a7) * push length move.l a2,-(a7) * Push commnd clr.l a6 * Clear frame pointer jsr __main * call main routine NEVER RETURNS *G * * _exit(code) Terminate process, return code to the parent. * *G __exit: tst.l (a7)+ * drop return PC off the stack, leaving code move.w #pterm,-(a7) * push function number trap #1 * and trap. * * abort: used if the stack setup above fails. Restores the initial sp, * prints a message, and quits with the error ENSMEM. * abort: * print an abortive message and quit move.l a1,sp * restore initial sp pea.l abortmsg * push string address move.w #cconws,-(a7) * and function code trap #1 * and trap to print message addq.l #6,a7 * clean off stack move.w #-39,-(a7) * push error number -39: ENSMEM jsr __exit * and exit with it. * * _brk: cmp.l __break,sp * compare current break with current stack bcs __sovf * actual stack overflow! movea.l 4(sp),a0 * get new break move.l a0,d0 * compare with stack, including 256-byte adda.l #$100,a0 * chicken factor cmpa.l a0,sp * if (sp < a0+256) bcs badbrk * bad break; move.l d0,__break * OK break: save the break clr.l d0 * Set OK return rts * return badbrk: move.l #-1,d0 * Load return reg rts * Return * * .globl ___BDOS ___BDOS: link a6,#0 * link move.w 8(sp),d0 * Load func code move.l 10(sp),d1 * Load Paramter trap #2 * Enter BDOS cmpa.l __break,sp * Check for stack ovf bcs __sovf * overflow! print msg and abort unlk a6 * no error; return rts * Back to caller * * stack overflow! This external is called by salloc in gemlib as well as above * __sovf: move.l #ovf,-(sp) * push message address move.w #cconws,-(sp) * push fn code trap #1 * Issue message move.w #1,-(a7) * push return code (1) move.w #pterm,d0 * push function code (Pterm) trap #1 * call Pterm(1) (never returns) * * Block Fill function: * * blkfill(dest,char,cnt); * * BYTE *dest; * -> area to be filled * BYTE char; * = char to fill * WORD cnt; * = # bytes to fill * .globl _blkfill _blkfill: move.l 4(a7),a0 * -> Output area move.w 8(a7),d1 * = output char move.w 10(a7),d0 * = output count ext.l d0 * make it long subq.l #1,d0 * decrement ble filldone * Done if le fillit: move.b d1,(a0)+ * move a byte dbra d0,fillit * Continue filldone: clr.l d0 * always return 0 rts * * * Index function to find out if a particular character is in a string. * .globl _index .globl _strchr _index: _strchr: move.l 4(a7),a0 * a0 -> String move.w 8(a7),d0 * D0 = desired character xindex: tst.b (a0) * EOS? bne notend * No, continue to look clr.l d0 * Not found rts * Quit notend: cmp.b (a0)+,d0 * check for character bne xindex * move.l a0,d0 * Found it subq.l #1,d0 * set return pointer rts * * For GEMAES calls from AESBIND.ARC or cryslib.o * _crystal: move.l 4(a7),d1 move.w #200,d0 trap #2 rts * * Data area * .data .globl ___pname * Program Name .globl ___tname * Terminal Name .globl ___lname * List device name .globl ___xeof * ^Z byte ovf: .dc.b 'Stack Overflow',13,10,0 * Overflow message ___pname: .dc.b 'runtime',0 * Program name ___tname: .dc.b 'CON:',0 * Console name ___lname: .dc.b 'LST:',0 * List device name ___xeof: .dc.b $1a * Control-Z abortmsg: .dc.b 'Cannot initialize stack',13,10,0 * abort message *F * * BSS AREA *F .bss .even __base: .ds.l 1 * -> Base Page __break: .ds.l 1 * Break location ___cpmrv: .ds.w 1 * Last CP/M return val * * control array for vdibind * .data .even _ctrl_cnts: * Application Manager .dc.b 0, 1, 0 * func 010 .dc.b 2, 1, 1 * func 011 .dc.b 2, 1, 1 * func 012 .dc.b 0, 1, 1 * func 013 .dc.b 2, 1, 1 * func 014 .dc.b 1, 1, 1 * func 015 .dc.b 0, 0, 0 * func 016 .dc.b 0, 0, 0 * func 017 .dc.b 0, 0, 0 * func 008 .dc.b 0, 1, 0 * func 019 *  Event Manager .dc.b 0, 1, 0 * func 020 .dc.b 3, 5, 0 * func 021 .dc.b 5, 5, 0 * func 022 .dc.b 0, 1, 1 * func 023 .dc.b 2, 1, 0 * func 024 .dc.b 16, 7, 1 * func 025 .dc.b 2, 1, 0 * func 026 .dc.b 0, 0, 0 * func 027 .dc.b 0, 0, 0 * func 028  .dc.b 0, 0, 0 * func 009 *  Menu Manager .dc.b 1, 1, 1 * func 030 .dc.b 2, 1, 1 * func 031 .dc.b 2, 1, 1 * func 032 .dc.b 2, 1, 1 * func 033 .dc.b 1, 1, 2 * func 034 .dc.b 1, 1, 1 * func 005 .dc.b 0, 0, 0 * func 006 .dc.b 0, 0, 0 * func 007 .dc.b 0, 0, 0 * func 008 .dc.b 0, 0, 0 * func 009 *  Object Manager .dc.b 2, 1, 1 * func 040 .dc.b 1, 1, 1 * func 041 .dc.b 6, 1, 1 * func 042 .dc.b 4, 1, 1 * func 043 .dc.b 1, 3, 1 * func 044 .dc.b 2, 1, 1 * func 045 .dc.b 4, 2, 1 * func 046 .dc.b 8, 1, 1 * func 047 .dc.b 0, 0, 0 * func 048 .dc.b 0, 0, 0 * func 049 *  Form Manager .dc.b 1, 1, 1 * func 050 .dc.b 9, 1, 1 * func 051 .dc.b 1, 1, 1 * func 002 .dc.b 1, 1, 0 * func 003 .dc.b 0, 5, 1 * func 004 .dc.b 0, 0, 0 * func 005 .dc.b 0, 0, 0 * func 006 .dc.b 0, 0, 0 * func 007 .dc.b 0, 0, 0 * func 008 .dc.b 0, 0, 0 * func 009 *  Dialog Manager .dc.b 0, 0, 0 * func 060 .dc.b 0, 0, 0 * func 061 .dc.b 0, 0, 0 * func 062 .dc.b 0, 0, 0 * func 003 .dc.b 0, 0, 0 * func 004 .dc.b 0, 0, 0 * func 005 .dc.b 0, 0, 0 * func 006 .dc.b 0, 0, 0 * func 007 .dc.b 0, 0, 0 * func 008 .dc.b 0, 0, 0 * func 009 * Graphics Manager .dc.b 4, 3, 0 * func 070 .dc.b 8, 3, 0 * func 071 .dc.b 6, 1, 0 * func 072 .dc.b 8, 1, 0 * func 073 .dc.b 8, 1, 0 * func 074 .dc.b 4, 1, 1 * func 075 .dc.b 3, 1, 1 * func 076 .dc.b 0, 5, 0 * func 077 .dc.b 1, 1, 1 * func 078 .dc.b 0, 5, 0 * func 009 * Scrap Manager .dc.b 0, 1, 1 * func 080 .dc.b 0, 1, 1 * func 081 .dc.b 0, 0, 0 * func 082 .dc.b 0, 0, 0 * func 083 .dc.b 0, 0, 0 * func 084 .dc.b 0, 0, 0 * func 005 .dc.b 0, 0, 0 * func 006 .dc.b 0, 0, 0 * func 007 .dc.b 0, 0, 0 * func 008 .dc.b 0, 0, 0 * func 009 * fseler Manager .dc.b 0, 2, 2 * func 090 .dc.b 0, 0, 0 * func 091 .dc.b 0, 0, 0 * func 092 .dc.b 0, 0, 0 * func 003 .dc.b 0, 0, 0 * func 004 .dc.b 0, 0, 0 * func 005 .dc.b 0, 0, 0 * func 006 .dc.b 0, 0, 0 * func 007 .dc.b 0, 0, 0 * func 008 .dc.b 0, 0, 0 * func 009 * Window Manager .dc.b 5, 1, 0 * func 100 .dc.b 5, 1, 0 * func 101 .dc.b 1, 1, 0 * func 102 .dc.b 1, 1, 0 * func 103 .dc.b 2, 5, 0 * func 104 .dc.b 6, 1, 0 * func 105 .dc.b 2, 1, 0 * func 106 .dc.b 1, 1, 0 * func 107 .dc.b 6, 5, 0 * func 108 .dc.b 0, 0, 0 * func 009 * Resource Manger .dc.b 0, 1, 1 * func 110 .dc.b 0, 1, 0 * func 111 .dc.b 2, 1, 0 * func 112 .dc.b 2, 1, 1 * func 113 .dc.b 1, 1, 1 * func 114 .dc.b 0, 0, 0 * func 115 .dc.b 0, 0, 0 * func 006 .dc.b 0, 0, 0 * func 007 .dc.b 0, 0, 0 * func 008 .dc.b 0, 0, 0 * func 009 * Shell Manager .dc.b 0, 1, 2 * func 120 .dc.b 3, 1, 2 * func 121 .dc.b 1, 1, 1 * func 122 .dc.b 1, 1, 1 * func 123 .dc.b 0, 1, 1 * func 124 .dc.b 0, 1, 2 * func 125 .end V* images.s .globl _images .globl _masks _images: dc.l a_i2 dc.l a_i1 dc.l a_i0 dc.l 0 ; end of table _masks: dc.l a_m2 dc.l a_m1 dc.l a_m0 dc.l 0 ; end of table a_i0: dc.l i0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 a_m0: dc.l m0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 a_i1: dc.l i1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 a_m1: dc.l m1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 a_i2: dc.l i2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 a_m2: dc.l m2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 i0: dc.w $ffff,$ffff,$ffff,$ffff dc.w $ffff,$ffff,$ffff,$ffff dc.w $ffff,$ffff,$ffff,$ffff dc.w $ffff,$ffff,$ffff,$ffff dc.w $ffff,$ffff,$ffff,$ffff dc.w $ffff,$ffff,$ffff,$ffff dc.w $ffff,$ffff,$ffff,$ffff dc.w $ffff,$ffff,$ffff,$ffff dc.w $ffff,$ffff,$ffff,$ffff dc.w $ffff,$ffff,$ffff,$ffff dc.w $ffff,$ffff,$ffff,$ffff dc.w $ffff,$ffff,$ffff,$ffff dc.w $ffff,$ffff,$ffff,$ffff dc.w $ffff,$ffff,$ffff,$ffff dc.w $ffff,$ffff,$ffff,$ffff dc.w $ffff,$ffff,$ffff,$ffff m0: dc.w 0,0,0,0,0,0,0,0 dc.w 0,0,0,0,0,0,0,0 i1: .dc.w $07E0,$07E0,$07E0,$0000,$1FF8,$1FF8,$1FF8,$0000 .dc.w $0FF0,$0FF0,$0FF0,$0000,$47E2,$47E2,$47E2,$0000 .dc.w $63C6,$63C6,$63C6,$0000,$F5AF,$F5AF,$F5AF,$0000 .dc.w $DA51,$DA51,$DA51,$0000,$9DB5,$9DB5,$9DB5,$0000 .dc.w $DDB5,$DDB5,$DDB5,$0000,$DA51,$DA51,$DA51,$0000 .dc.w $F5AF,$F5AF,$F5AF,$0000,$63C6,$63C6,$63C6,$0000 .dc.w $47E2,$47E2,$47E2,$0000,$0FF0,$0FF0,$0FF0,$0000 .dc.w $1FF8,$1FF8,$1FF8,$0000,$07E0,$07E0,$07E0,$0000 m1: .dc.w $ffff-$07E0,$ffff-$1FF8,$ffff-$0FF0,$ffff-$47E2 .dc.w $ffff-$63C6,$ffff-$F5AF,$ffff-$DA51,$ffff-$9DB5 .dc.w $ffff-$DDB5,$ffff-$DA51,$ffff-$F5AF,$ffff-$63C6 .dc.w $ffff-$47E2,$ffff-$0FF0,$ffff-$1FF8,$ffff-$07E0 i2: .dc.w $0000,$0000,$0000,$0000,$0180,$0000,$0000,$0000 .dc.w $0180,$0000,$0000,$0240,$0180,$0000,$0000,$0000 .dc.w $07E0,$0000,$0000,$0000,$1FF8,$1818,$1B18,$0000 .dc.w $2FF4,$2004,$2304,$0000,$4FD2,$4002,$4602,$0000 .dc.w $3FDC,$300C,$360C,$0000,$4FD2,$4002,$4602,$0000 .dc.w $4FB2,$4812,$4812,$0000,$1768,$1008,$1008,$0000 .dc.w $13C8,$1008,$1008,$0000,$1008,$1008,$1008,$0000 .dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 m2: .dc.w $ffff-$0000,$ffff-$0180,$ffff-$03C0,$ffff-$0180 .dc.w $ffff-$07E0,$ffff-$1FF8,$ffff-$2FF4,$ffff-$4FD2 .dc.w $ffff-$3FDC,$ffff-$4FD2,$ffff-$4FB2,$ffff-$1768 .dc.w $ffff-$13C8,$ffff-$1008,$ffff-$0000,$ffff-$0000  .title 'Install MADMAC From AUTO Folder' ;- ; ; 2-Nov-1986 lmd Hacked it up (we need example programs, right?) ; ;- ; ; Shrink as small as possible (by relocating to the commandline ; part of the basepage) and exec MAC.PRG from the root of the ; boot disk.This example program is for floppy disk users who ; don't like installing MADMAC manually every time they boot. ; ; This leaves a *small* memory fragment, less than $100 bytes. ; ; The coding style here is, er . . . bizarre. I suggest the reader ; treat it as an excercise in paranoia, and not as an example ; of good coding practice. As jwt sez, "this should only be ; attempted by experienced software engineers." Or madpersons. ; ; bra.w movedown ; branch to shrinker BEGIN: lea END(pc),sp ; then come back here and init stack move.l d0,-(sp) ; = amount to keep move.l a1,-(sp) ; -> basepage move.l d1,-(sp) ; push WORD 0x0000 and function number trap #1 ; do Mshrink() add.w #12,sp ; (cleanup) clr.l -(sp) ; null enviroment string pea progtail(pc) ; -Q switch pea progpath(pc) ; -> program to exec move.l d7,-(sp) ; subfunc=0, function=Pexec() trap #1 clr.w -(sp) ; terminate, return code = OK trap #1 illegal ; "cannot happen" progpath: dc.b '\\MAC.PRG',0 ; program to exec, in the root dir progtail: dc.b '*-q',0 ; command tail (the '*' gets clobbered) dcb.b 64,0 ; 64 bytes of user stack END: ; end of kept part ;- ; ; Copy code from BEGIN to END into commandline area of basepage; ; this code (and everything beyond it) is thrown away by an ; Mshrink() in the kept portion. ; ; Returns: d0 = amount of memory to keep; ; d1 = Mshrink code + word of zero ; d7 = Pexec code + subfunction zero ; a1 -> process's basepage ; ; movedown: move.l 4(sp),a1 ; a1 -> basepage lea $80(a1),a2 ; a2 -> basepage's command tail area lea BEGIN(pc),a0 ; a0 -> start kept portion (right now) move.w #END-BEGIN+1,d0 ; d0 = size (bytes-1) of kept portion .1: move.b (a0)+,(a2)+ ; copy a byte dbra d0,.1 ; until we're done move.l #$80+END-BEGIN,d0 ; d0 = amount to keep on Mshrink move.l #$004a0000,d1 ; d1 = Mshrink + word of zero move.l #$004b0000,d7 ; d7 = Pexec + subfunction zero jmp $80(a1) ; jump back to kept portion *S *** *** *** *** *** LARGE.S *** *** Copyright 1986 by Atari Corp. "all rights reserved" *** *** *** *O * * 10/26/84 Dan Oliver author * 1/31/85 - 03/21/85 Lowell Webster * 05/10/85 Jim Eisenstein * 03/04/86 John Feagans cleanup for developers * * Subroutines used by IBM PC GEM APPLICATIONS. * * .text * .globl _LSTRLEN .globl _LBCOPY .globl _LWFILL .globl _LBDSKIP .globl _LWCOPY .globl _LBFILL .globl _LSTCPY .globl _LBWMOV * * copy from src to dest until and including a null in the * source string, return the length not including the null. * len = LSTCPY(src,dst) * BYTE *src,dst; * _LSTCPY: move.l 8(a7),a0 * source move.l 4(a7),a1 * destination clr.l d0 lst1: addq.b #1,d0 move.b (a0)+,(a1)+ * get and store a byte bne lst1 * test for 0 subq #1,d0 rts * * * expand from bytes to words until a null, return * number of bytes moved (don't transfer null) * * len = LBWMOV(dst,src) * BYTE *dst,src; * _LBWMOV: move.l 8(a7),a0 * source move.l 4(a7),a1 * destination clr.l d0 clr.l d1 lbw1: move.b (a0)+,d1 * get a byte beq lbw2 ; quit if null **jde*10-may-85 move.w d1,(a1)+ * store a word addq.b #1,d0 ; count a character bra lbw1 * test for 0 lbw2: rts * * =0 * == Word fill foreward at given address == * * IN: Address to start storing. * Number of words to store. * Word to store. * *OUT: Word stored number of times given at given address. * * == == * =0 * * _LWFILL: * move.l 4(a7),a0 * Get starting address off stack. move.w 10(a7),d1 * Get value of word to store. move.w 8(a7),d0 * Get number of words to store. beq lwfend * get out if 0 * lop103 move.w d1,(a0)+ * Store given word. subq #1,d0 * Decrement word counter. bne lop103 * lwfend: rts * * =0 * == Unpack Byte memory into Word Memory == * * IN: Address of Word memory (destination). * Address of Byte memory (source). * Number of bytes to unpack. * *OUT: Unpacked data. * * == == * =0 * * _LBDSKIP: * move.l 4(a7),a0 * Get destination address. move.l 8(a7),a1 * Get source address. move.w 12(a7),d0 * Get number of bytes to unpack. * clr.w d1 lop104 move.b (a1)+,d1 * Get byte. move.w d1,(a0)+ * Storw byte as word. subq #1,d0 * Decrement byte counter. bne lop104 * rts * * * * =0 * == Copy block of words == * * IN: Address of destination block. * Address of source block. * Number of words to copy. * *OUT: Source block duplicated at Destination. * * == == * =0 * * _LWCOPY: * move.l 4(a7),a0 * Get address of destination. move.l 8(a7),a1 * Get address of source. move.w 12(a7),d0 * Get number of words to copy. beq lwend * get out if none * lop105 move.w (a1)+,(a0)+ * Copy word. subq #1,d0 bne lop105 * lwend: rts * * * * =0 * == Fill block with given byte == * * IN: Address of destination block. * Number of bytes to store. * Byte to store. * *OUT: Filled block with given byte. * * == == * =0 * * _LBFILL: * move.l 4(a7),a0 * Get address of destination. move.w 8(a7),d0 * Get number of bytes to store. move.w 10(a7),d1 * Get byte to store. beq lbend * get out if 0 * lop106 move.w d1,(a0)+ * Store given byte. subq #1,d0 * Decrement byte counter. bne lop106 * lbend: rts * * * =0 * == Get length of string == * * IN: Address of first character in sting shall be on the stack just be low * the return address. * * The string will terminate with a zero. * * String will always have at least a zero. * *OUT: Length will be returned in D0. * * D0 will equal the number of characters in string. * EX: * T = 1 * THE = 3 * == == * =0 * * move.l #strg,-(a7) Push string's address on stack before call. * _LSTRLEN: * move.l 4(a7),a0 * Get string's address off stack. clr d0 * Initialize character counter. * lop100 addq #1,d0 * Increment character counter. cmpi.b #0,(a0)+ * Find first zero, bne lop100 * loop until zero found. * subq #1,d0 * Adjust character counter, always one too many. * rts * * * =0 * == == * == Move block of memory == * == == * Moves one block of memory to a new location. Used mainly to move * a square of screen data to a new position on the screen. Considers * if the new block overlaps the old. * * IN: Destination address LONG. * Source address LONG. * Number of bytes to move WORD. * *OUT: No value returned. * * Screen will show duplication of selected area in new choosen location. * * _LBCOPY: * movem.l 4(a7),a0-a1 * A0 = Destination A1 = Source. clr.l d0 move.w 12(a7),d0 * D0 = Number of bytes to moves. beq lbcend * get out if 0 * * Move from source starting at top or bottom? * cmp.l a0,a1 * If A1 < A0 then start from bottom of source blt backward * and go backward. * * Start at beginning of source and move to end of source. * lop101: move.b (a1)+,(a0)+ subq.w #1,d0 bne lop101 rts * * Start at end of source and move backward to begnning of source. * backward: * add.l d0,a1 add.l d0,a0 subq.w #1,d0 * lop102: move.b -(a1),-(a0) ent100 subq.w #1,d0 bpl lop102 lbcend: rts * .end  Reset =$fc0030 Deb: move.w #0,-(sp) ; mode super move.w #$20,-(sp) trap #1 addq.l #4,sp jmp Reset ; saut au RESET .end t Include Atari  Include Atari Deb: clr.l -(sp) ; mode superviseur move.w #$20,-(sp) trap #1 addq.l #6,sp move.l d0,StckSav ; sauve ancienne pile Physbase move.l d0,Screen move.l #10000,Wait ; initialise le compteur move.l #Wait,a0 Bin: move.l a0,d7 ; sortie binaire de Wait move.l #31,d6 .bin1: move.w #$18,d5 lsl.l #1,d7 addx.b d5,d5 move.w d5,-(sp) move.w #2,-(sp) trap #1 addq.l #4,sp dbf d6,.bin1 move.l $456,a0 ; VBL queue move.l 4(a0),Vbl ; sauve adresse 1er saut lea Virus,a1 move.l a1,4(a0) ; nouveau saut move.l StckSav,-(sp) ; retour mode utilisateur move.w #$20,-(sp) trap #1 addq.l #6,sp move.l #Fin-Deb+$100,-(sp) ; longueur du programme move.w #$31,-(sp) ; reste resident trap #1 Virus: move.l Wait,d0 subq.l #1,d0 cmp.l #$0,d0 bne.s Attends Vas_y: movea.l Screen,a0 ; dans a0 move.l #8000,d0 .Boucle: eor.l #$f,(a0)+ ; inverse l'ecran dbra d0,.Boucle move.l #10,d0 ; restaure compteur Attends: move.l d0,Wait movea.l Vbl,a0 ; ancienne routine VBL cmpa.l #0,a0 ; 0 ? beq.s Termine jsr (a0) ; non, donc on l'execute Termine: rts Wait: dc.l 0 Vbl: dc.l 0 StckSav: dc.l 0 Screen: dc.l 0 Fin: .end  ;0= WIZ ;1= CAT ;2= ;3= ;6= SCORE ;7= TUBING ;8-15= BACKGROUND OBJECTS CODE=$58000 ORG code LOAD code BRA.L START EVEN expand :EQU $80000 sprites:EQU $40000 palette:EQU sprites-32 ainit: EQU $A000 atext: EQU $A008 mpos: EQU $26E0 mbut: EQU $26E7 phys: DC.L $78000 log: DC.L $60000 phys2: DC.L $70000 OJOYVECT:DC.L 0 VECTOR:DC.L 0 PALREG: EQU $FF8240 ; BACK ,CAT ,WIZ SRCE: DC.L $48000,$40078,$412C0 ; PEARL ,TRANS ,TRANS ,TRANS ,TRANS ,SPACE, POD DC.L $43200,$41C78,$41C70,$41C68,$41C60,$41C28,$41C20 ; GLOB ANIMATION 10-13 DROPLETS 14-17 DC.L $28508,$28D28,$29548,$28D28,$285C8,$28DE8,$29608,$28DE8 ; SPLASH 18-19 DC.L $29E28,$2A648 BLK SRCE+128-* ;chars 32-55 miscellaneous items ; SLAPUP,SLAPDN,LOGO ,HORIZON,SCENE,ICONS ,TUBE DC.L $41C88,$41CA0,$450A0,$40000,$30000,$46360,$40008  ; SCORE DC.L $28000 BLK SRCE+224-* ;chars 56-63 are background DC.L $0,$F00,$1E00,$2D00,$3C00,$4B00,$5A00,$6900 BLK SRCE+256-* WID: DC.L 7,3,3 DC.L 3,3,3,3,3,3,3 DC.L 3,3,3,3,3,3,3,3 DC.L 3,3 BLK WID+128-* DC.L 3,3,35,3,100,55,3 DC.L 3 BLK WID+224-* DC.L 7,7,7,7,7,7,7 BLK WID+256-* HEI: DC.L 199,10,14 DC.L 14,14,15,15,16,16,16 DC.L 12,12,12,12,12,12,12,12 DC.L 12,12 BLK HEI+128-* DC.L 10,10,25,24,71,24,24 DC.L 6 BLK HEI+224-* DC.L 23,23,23,23,23,23,23 BLK HEI+256-* MASK: DC.L $0,$40098,$41340 DC.L $43208,$42718,$42710,$42708,$42700,$426C8,$426C0 DC.L $28500,$28D20,$29540,$28D20,$285C0,$28DE0,$29600,$28DE0 DC.L $29E20,$2A640 BLK MASK+128-* DC.L $42368,$42380,FF,FF,FF,FF,FF DC.L $28050 BLK MASK+224-* DC.L 0,0,0,0,0,0,0 BLK MASK+256-* BACKS: BLK.L 32,$F BACKW: BLK.L 32,3 BACKH: BLK.L 32,15 BACKCOP:BLK.L 96,$F BULA: BLK.L 8,-1 BULC: BLK.L 8,0 ICONST: DC.L 0 SVSP: DC.L 0 TPTR: DC.L 0 TPTR2: DC.L 0 TSTART: DC.L 0 TSTART2:DC.L 0 RANVAL: DC.L $12345678 EDGE: DC.L 1 DETECT1:DC.L 0 DETECT2:DC.L 0 DETECT3:DC.L 0 DETECT4:DC.L 0 DETECT5:DC.L 0 MAPREAD:DC.L 0 ;CURRENT MAP MAPOFSET:DC.L LEVEL1,LEVEL2,LEVEL1,LEVEL2 TARGETI:DC.L 0 ;ICON TO DISPLAY AFTER FLIP FLIPST:DC.L 0 ;ADDRESS OF FLIPPING ICON FLIPI:DC.L 0 ;CURRENT SPRITE DURING FLIP PICTURE:DC.L $30000,$32D00,$30000,$32D00 X: BLK.W 16,0 Y: BLK.W 16,0 C: BLK.W 16,$FFFF XDRCT: BLK.W 16,0 YDRCT: BLK.W 16,0 POSITION:BLK.W 16,0 SUBWAVES:DC.W 0 BADTYPE:DC.W 0 SUCKCNTR:DC.W 0 READER:DC.W 0 SCORFLG :DC.W 0 CATLIVES:DC.W 0 WORK:DC.W 1 TUBECNT:DC.W 0 LAST: DC.W 0 ;LAST DIRN FIRED BY WIZ CLAST: DC.W 0 ;LAST BY CAT FIREDRN:DC.W 0 ;CURRENT FIRE DIRECTION CFIREDRN:DC.W 0 ;CAT FIREDRN BADCNT: DC.W 0 ;BADDIES LEFT IN A WAVE FIRETIM:DC.W 0 ;TIME SINCE LAST SHOT OPOSITION:DC.W 0 NUPOSITION:DC.W 0 OY: DC.W 0 OHEIGHT:DC.W 0 LIVES: DC.W 0 LEVEL: DC.W 0 EVEN BULX: BLK.W 8,0 BULY: BLK.W 8,0 BULXD: BLK.W 8,0 BULYD: BLK.W 8,0 BBACK: BLK.L 8,-1 OBBACK: BLK.L 8,-1 BULR: BLK.W 8,0 FIN: DC.W 0 ;AS ALWAYS ANIMATE:DC.W 3 ;COUNTER TO TIME ANIMATION OF SPRITES HEIGHT: DC.W 0 ;HEIGHT OF WIZBALL (*2) ROLL: DC.W 0 CNTR: DC.W 1 TEMP: DC.W 1 FF: BLK.W $1400,$FFFF SYNC: DC.W 0 SPIN: DC.W 0 SPINLO: DC.W 0 OSPINLO: DC.W 0 SPEED: DC.W 0 ROTATE: DC.W 0 ICONNO: DC.W 0 WAGCNT: DC.W 0 ;COUNTS WAGGLES WAGNO: DC.W 0 ;Do. BUTTON: DC.W 0 ;TIMES FIRE BUTTON PRESS FLIPC:DC.W 0 ;ICON FLIPCNT GREYCOL:DC.W $000,$222,$111,$555,$222,$333,$444,$555 DC.W $666,$444,$444,$666,$333,$333,$333,$777 TITCOL: DC.W $000,$400,$300,$654,$023,$333,$056,$555 DC.W $461,$540,$150,$670,$040,$236,$500,$777 TARGET: DC.W 0,$411,$513,$755 DC.W 0,$410,$530,$764 ZEROS: BLK.W 16,0 CURRENT:BLK.W 16,0 DMASK:DC.W $5555,$1111,$0101,$0001 ;USED FOR RES & DERES NOTES: dc.w 3822,3608,3405,3214,3034,2863,2703,2551,2408,2273,2145,2025 dc.w 1911,1804,1703,1607,1517,1432,1351,1276,1204,1136,1073,1012 dc.w 956,902,851,804,758,716,676,638,602,568,536,506 dc.w 478,451,426,402,379,358,338,319,301,284,268,253 dc.w 239,225,213,201,190,179,169,159,150,142,134,127 dc.w 119,113,106,100,95,89,84,80,75,71,67,63 dc.w 60,56,53,50,47,45,42,40,38,36,34,32 dc.w 30,28,27,25,24,22,21,20,19,18,17,16 player1:BLK.B 7,48 DC.B 0 player2:BLK.B 7,48 DC.B 0 MAP: LEVEL1: DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 1,2,2,3 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,1,2,3 DC.B 0,0,0,0 DC.B 0,0,0,5 DC.B 4,0,0,134 DC.B 0,0,0,7 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,1 DC.B 0,8,2,3 DC.B 0,0,0,0 DC.B 0,0,0,5 DC.B 4,0,0,134 DC.B 0,0,0,7 DC.B 0,0,0,0 DC.B 0,0,1,3 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,1,3 DC.B 0,0,0,0 DC.B 0,0,0,5 DC.B 4,0,0,134 DC.B 0,0,0,7 DC.B 0,0,0,0 DC.B 1,2,2,3 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 LEVEL2: DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,132 DC.B 0,0,0,3 DC.B 0,0,0,0 DC.B 0,0,130,8 DC.B 0,0,6,0 DC.B 0,1,7,5 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 1,0,130,8 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,3 DC.B 0,0,0,132 DC.B 0,0,0,0 DC.B 0,1,5,5 DC.B 0,1,0,0 DC.B 0,1,5,5 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,7 DC.B 0,7,5,7 DC.B 0,6,0,6 DC.B 5,7,5,7 DC.B 0,0,0,0 DC.B 0,0,0,0 DC.B 0,0,0,0 ICON: DC.B 0 ;FILLER ITHRUST:DC.B 2 IFIRE: DC.B 2 ICAT: DC.B 1 IBLAZ: DC.B 1 ISPRAY: DC.B 4 IBOMB: DC.B 16 ISHIELD:DC.B 16 IINIT:DC.B 0,2,2,1,1,4,16,16 PIT1:DC.B 0 PIT2:DC.B 0 PIT3:DC.B 0 PRIORTIM:DC.B 0 XTR :DC.B 0 OXTR:DC.B 0 JOYPORT0:DC.B 0 JOYPORT1:DC.B 0,0,0 SUPERUSER:DC.B 1 TUNFLG: DC.B 0 PRIORITY:DC.B 0 TIMER: DC.B 0 TIMER2: DC.B 0 SONCNTR: DC.B 0 ; sounds are preceded by PRIORITY and PRIORTIM values. E1: DC.B 5,4, 0,$40, 1,1, 2,$38, 3,1, 8,16, 9,16, 12,20, 13,0, 11,20 DC.B 7,%100, $FF,0 ;PEARL CAUGHT E2: DC.B 5,4, 0,$40, 1,0, 2,$78, 3,0, 8,16, 9,16, 12,20, 13,0, 11,20 DC.B 7,%100, $FF,0 ;ICON SELECTED E99: DC.B 5,4, 0,$56, 1,0, 2,$56, 3,0, 8,16, 9,15, 12,1 DC.B 13,10, 11,50, 7,%100, $80,16, $81,9,-1,0 DC.B $FF,0,8,0, $FF,0 ;brikhit E3: DC.B 5,8, 0,2, 1,15, 2,2, 3,15, 8,16, 9,16, 12,20, 13,10, DC.B 11,20, 7,%100 DC.B $80,240, $81,1,-16,0, $FF,10, 8,0, 9,0, $FF,0 ;BOUNCE E4: DC.B 40,3, 0,2, 1,0, 2,2, 3,16, 8,13, 9,13, 7,%11110100 DC.B $80,15, $81,6,-1,0, $FF,5, 8,5, 9,5, $FF,0 ;ZAP E5: DC.B 40,3, 0,0, 1,15, 8,15, 12,0, 13,4, 11,20, 7,%10 DC.B $80,0, $81,1,1,15, $FF,1, 8,0, $FF,0 ;FIRE E6: DC.B 5,4, 0,8, 1,2, 2,12, 3,4, 8,16, 9,16, 12,20, 13,9 DC.B 11,20, 7,%100 DC.B $80,200, $81,0,-20,0, $FF,1, 8,0, 9,0, $FF,0 ;BOUNCE OBJECT E7: DC.B 100,50, 0,0, 1,0, 8,16, 12,70, 13,0, 11,20, 7,%10 DC.B $80,0, $81,1,1,255, $FF,0 ;DEAD E8: DC.B 250,15, 0,100, 1,4, 2,101, 3,4, 8,15, 9,15 DC.B 11,0, 12,30, 7,%100 DC.B $FF,5, 1,3, 3,3, $FF,5, 1,2, 3,2, $FF,5, 1,1, 3,1, DC.B $FF,5, 1,0, 3,0 DC.B $FF,5, 13,0, 8,16, 9,16, $FF,0 ;XTRA E9: DC.B 30,10, 0,8, 1,2, 8,16, 12,25, 13,9, 11,20, 7,%10 DC.B $80,0, $81,1,1,15, $80,0, $81,1,1,15, $FF,50 DC.B 8,0, 9,0, $FF,0 ;BADHIT E10: DC.B 5,5, 0,32, 1,0, 2,80, 3,0, 8,15, 9,16, 12,1 DC.B 13,10, 11,100, 7,%100, $80,16, $81,8,-1,0 DC.B $FF,12,9,0, $FF,0 E11: DC.B 5,5, 0,20, 1,0, 2,48, 3,0, 8,15, 9,16, 12,1 DC.B 13,10, 11,50, 7,%100, $80,16, $81,8,-1,0 DC.B $FF,10,9,0, $FF,0 ; FACEHIT E12: DC.B 105,5, 0,27, 1,0, 2,48, 3,0, 8,16, 9,16, 12,10 DC.B 13,10, 11,0, 6,30, 7,%100, $FF,40 DC.B $80,15, $81,8,-1,0, 7,%11110100, DC.B $FF,10,9,0, $FF,0 ; FADER E13: DC.B 200,1, 0,100, 1,5, 2,80, 3,1, 8,15, 11,0, 12,70, 7,%11110110 DC.B $80,0, $81,6,1,31, $FF,3, 12,40, 13,0, 8,16,$FF,0 ;DERES E14: DC.B 200,1, 0,100, 1,5, 2,80, 3,1, 8,15, 11,0, 12,70, 7,%11110110 DC.B $80,31, $81,6,-1,0, $FF,3, 12,40, 13,0, 8,16,$FF,0 ;RES E15: DC.B 200,1, 1,0, 8,16, 13,14, 11,0, 12,10 DC.B 7,%10, $80,70, $81,0,-2,50 DC.B $80,50, $81,0,2,100, 8,0, $FF,0 T0: DC.B 5,0, 8,0, 9,0, 10,0, 11,20, 12,30, 7,%1000, $FF,0 T1: DC.B 5,0, 0 tpitchl:DC.B 100, 1 tpitchh:DC.B 0, 8 tenv: DC.B 16 T2: DC.B 2 tpitchl2:DC.B 100, 3 tpitchh2:DC.B 0, 9 tenv2: DC.B 16 T3: DC.B 4 tpitchl3:DC.B 100,5 tpitchh3:DC.B 0, 10 tenv3: DC.B 16, 13,9, 11,20, 12,20, 7,%1000, $FF,0 TE: DC.B 5,0, 8,0, 9,0, 10,0, 7,255, $FF,0 SEQ: DC.B 5,5, 0,0, 1,0, 8,16, 12,70, 13,0, 11,20, 7,%10 DC.B $80,0, $81,1,3,255, $FF,0 EVEN T: START: MOVE SR,D0 CMP #$22FF,D0 BGT.S OKSUP BSR.L super OKSUP: MOVE.B #6,$484 ;KEYCLICK OFF- SHIFT USED BSR.L SETINT NUGAME: BSR.L initscrn BSR.L initjoy BSR.L dark ; LEA TITLEPIC,A0 ; BSR load MOVE.L #$50000,A0 MOVE.L #$78000,A1 BSR.L copy TST WORK BEQ TITPASS LEA GREYCOL+2,A1 BSR FADEIN MOVE #25,D0 BSR.L WAIT LEA PALREG+2,A0 LEA TITCOL+2,A1 TRAND: BSR.L randsub BSR.L randsub AND #3,D0 BEQ.S TMOD CMP #1,D0 BEQ.L TMOD2 CMP #2,D0 BEQ.L TFLICK CMP #3,D0 BEQ.S TFLASH CMP #4,D0 BEQ TRAND STRIPE: MOVE #14,D1 TIT22: MOVE (A1)+,D7 MOVE #6,D6 TIT2: BSR.L randsub AND #$777,D0 MOVE D0,(A0) CMP.W D0,D7 BNE.S TIT2 DBRA D6,TIT2 ADDQ #2,A0 DBRA D1,TIT22 BRA.L TITJN TFLASH: BSR.L randsub MOVE D0,D2 OR #$444,D2 MOVE #14,D1 TITC: MOVE D2,(A0);SET PALREG TO RANDOM NO. BSR.L owvbl BSR.L owvbl MOVE #$777,(A0) BSR.L owvbl BSR.L owvbl MOVE (A1)+,(A0)+; SET PALREG TO TARGET COLOUR DBRA D1,TITC BRA.L TITJN TMOD: MOVE #14,D7 TITM: MOVE #2,D6 TITM2: BSR.L OWVBL BSR.S MODIFY DBRA D6,TITM2 ADDQ #2,A0 ADDQ #2,A1 DBRA D7,TITM BRA.L TITJN TMOD2: MOVE #2,D6 TIT3: LEA PALREG+2,A0 LEA TITCOL+2,A1 MOVE #14,D7 TIT32: BSR.L OWVBL BSR.S MODIFY ADDQ #2,A0 ADDQ #2,A1 DBRA D7,TIT32 MOVE #20,D0 BSR.L WAIT DBRA D6,TIT3 BRA.L TITJN TFLICK: MOVE #16,D1 TFLKLP: BSR.L GREY MOVE D1,D0 BSR.L WAIT BSR.L COLOUR MOVE #16,D0 SUB D1,D0 BSR.L WAIT SUBQ #2,D1 BNE.S TFLKLP BRA.S TITJN MODIFY: MOVE (A0),D0 ;PALREG MOVE (A1),D1 ;TARGET MOVE D0,D4 ;NEW COL MOVE D0,D2 MOVE D1,D3 AND #$7,D2 AND #$7,D3 CMP D2,D3 BEQ.S MOK1 BMI.S MDN1 ADDQ #1,D4 BRA.S MOK1 MDN1: SUBQ #1,D4 MOK1: MOVE D0,D2 MOVE D1,D3 AND #$70,D2 AND #$70,D3 CMP D2,D3 BEQ.S MOK2 BMI.S MDN2 ADD #$10,D4 BRA.S MOK2 MDN2: SUB #$10,D4 MOK2: MOVE D0,D2 MOVE D1,D3 AND #$700,D2 AND #$700,D3 CMP D2,D3 BEQ.S MOK3 BMI.S MDN3 ADD #$100,D4 BRA.S MOK3 MDN3: SUB #$100,D4 MOK3: MOVE D4,(A0) RTS copy: MOVE.W #$1F40,D0 CPLOOP: MOVE.L (A0)+,(A1)+ DBRA D0,CPLOOP RTS TITJN: BSR.L colour TITWAIT:BTST #7,JOYPORT1 BEQ.S TITWAIT TITPASS:MOVE #-1,LEVEL MOVE #6,D0 LEA player1,A0 PLAYLP: MOVE.B #48,8(A0) MOVE.B #48,(A0)+ DBRA D0,PLAYLP BSR NEWLEVEL MOVE #3,LIVES BRA NULIFE NULEVEL:BSR NEWLEVEL BSR FIRSTPRNT MOVE.L #$78000,phys MOVE.L #$38000,A0 MOVE.L #$78000,A1 BSR.L copy LEA CURRENT+2,A1 BSR FADEIN MOVE #28,TUBECNT MOVE.L #0,HEI+152 MOVE.L #$410F8,SRCE+152 MOVE #38,C+14 MOVE #160,X+14 MOVE #54,Y+14 BRA ALWAYS NEWLEVEL:MOVE #15,D0 LEA palette,A1 MOVE.L #CURRENT,A0 CURRSET:MOVE (A1)+,(A0)+ DBRA D0,CURRSET MOVE LEVEL,D0 ADDQ #1,D0 AND.L #1,D0 MOVE D0,LEVEL ASL #2,D0 LEA MAPOFSET,A5 MOVE.L (A5,D0.W),D0 MOVE.L D0,MAPREAD MOVE LEVEL,D0 ASL #2,D0 LEA PICTURE,A0 MOVE.L (A0,D0.W),SRCE+144 MOVE.W #$8000,D0 MOVE.L #expand,A0 MOVE.L A0,phys BPLOOP: CLR.L (A0)+ DBRA D0,BPLOOP CLR C CLR X CLR Y CLR.L D6 MOVE LEVEL,D6 ASL #4,D6 ADD.L #$48000,D6 MOVE.L D6,SRCE MOVE #3,D6 EXPLP16:MOVE #3,D7 EXPLP4: BSR.L rprnt ADD #49,X DBRA D7,EXPLP4 ADD.L #$8000,phys MOVE X,D0 AND #15,D0 MOVE D0,X DBRA D6,EXPLP16 RTS NULIFE: CLR ICONNO MOVE #7,D0 LEA ICON,A0 LEA IINIT,A1 ICSET: MOVE.B (A1)+,(A0)+ DBRA D0,ICSET MOVE.L #$79228,ICONST MOVE.L #$38000,phys MOVE #48,X MOVE #29,Y MOVE #37,C BSR PRNT0 ;ICON STRIP BSR FIRSTPRNT BSR light MOVE.l #$78000,phys BSR SETSCRN BSR.L deres MOVE.L #$38000,A0 MOVE.L #$78000,A1 BSR.L copy MOVE #9,CATLIVES MOVE #8,BADCNT MOVE #10,BADTYPE CLR SUBWAVES BRA ALWAYS FIRSTPRNT:BSR.L initscrn MOVE.L #$38000,phys LEA BACKS,A0 MOVE #380,D0 NOBACKS:MOVE.W #-1,(A0)+ DBRA D0,NOBACKS LEA BBACK,A0 LEA BULA,A1 LEA BULX,A2 MOVE #15,D0 NOBBAK: MOVE.L #-1,(A0)+ MOVE.W #-1,(A1)+ MOVE.W #-1,(A2)+ DBRA D0,NOBBAK BSR prepare CLR.B PRIORTIM MOVE #60, POSITION MOVE POSITION,NUPOSITION MOVE POSITION,OPOSITION MOVE POSITION,D0 AND #15,D0 MOVE D0,ROTATE BSR.L BACKLINE BSR.L objects BSR.L edges RTS ALWAYS: bsr.L light MOVE.L #$70000,A1 MOVE.L #$38000,A0 BSR.L copy BSR prepare MOVE.l #$78000,phys LEA Y+16,A0 LEA YDRCT+16,a1 MOVE BADCNT,D0 SUBQ #1,D0 BMI NOBADS SETBADLP:MOVE.w BADTYPE,32(A0);C MOVE.W #90,(A0)+;Y CLR.w (A1)+ DBRA D0,SETBADLP MOVE #260,POSITION+16 MOVE #200,POSITION+18 MOVE #460,POSITION+20 MOVE #480,POSITION+22 MOVE #560,POSITION+24 MOVE #680,POSITION+26 MOVE #470,POSITION+28 MOVE #464,POSITION+30 NOBADS: MOVE #34,C MOVE #84,X MOVE #0,Y BSR.L prnt0; sparkle logo MOVE #1,C+2; CAT CLR X+2 MOVE #40,Y+2 MOVE #2,C; wizball MOVE.L #14,HEI+8 MOVE #160,X MOVE #66,Y MOVE #66*4,HEIGHT CLR YDRCT CLR SPIN CLR SPEED CLR FLIPC CLR ROLL CLR SPINLO CLR FIN CLR WAGCNT CLR WAGNO CLR FIRETIM CLR SCORFLG MOVE #1,FIREDRN BSR scoreset TST ICONNO BEQ LOOPER BSR IFLASH LOOPER: bsr.L owvbl SUBQ.B #1,PRIORTIM BPL.S TIMYES CLR.B PRIORTIM TIMYES: BSR.L swapscrn BSR scoreprnt BSR TUBEREP BSR.L wizreplace BSR.L replacer BSR.L replace BSR.L breplace MOVE POSITION,D0 MOVE D0,OPOSITION ADD SPEED,D0 BPL.S POSNMI CLR SPEED CLR D0 POSNMI: CMP #$4F0,D0 BMI.S POSOK MOVE #$4F0,D0 CLR SPEED POSOK: MOVE D0,POSITION MOVE D0,NUPOSITION AND #15,D0 MOVE D0,ROTATE BSR.L BACKLINE BSR TUBE BSR.L wiz BSR.L BULLETS BSR.L objects BSR.L bprnt; print bullets BSR.L owvbl BSR.L wizprnt BSR.L baddies BSR.L edges BSR.L FLIP BSR.L setscrn TST FIN BEQ.L NOFIN CMP #2,FIN BNE DEAD MOVE #14,SUCKCNTR SUCKLP: BSR swapscrn BSR owvbl BSR wizreplace BSR replace BSR replacer BSR breplace BSR BACKLINE BSR objects ADDQ #1,Y SUBQ.L #1,HEI+8 BSR prnt0 BSR baddies BSR edges BSR setscrn BSR owvbl SUBQ #1,SUCKCNTR BNE SUCKLP BSR scoreset ; CLR.L D0 ; MOVE LEVEL,D0 ; ASL #3,D0 ; ADD.L #TARGET+2,D0 ; MOVE.L D0,A3 ; MOVE (A3)+,CURRENT+2 ; LEA CURRENT+2,A1 ; BSR FADEIN ; MOVE (A3)+,CURRENT+4 ; LEA CURRENT+2,A1 ; BSR FADEIN ; MOVE (A3)+,CURRENT+6 ; LEA CURRENT+2,A1 ; BSR FADEIN LEA ZEROS+2,A1 BSR FADEIN MOVE.L #$38000,A1 MOVE.L #$70000,A0 BSR.L copy BRA NULEVEL DEAD: BSR scoreset MOVE.L #$38000,A1 MOVE.L #$70000,A0 BSR.L copy BSR.L res BSR DARK SUBQ #1,LIVES BNE NULIFE JMP NUGAME NOFIN: BTST #7,JOYPORT0 BEQ.L LOOPER FLUSH: MOVE.B JOYPORT1,D0 TST.B D0 BNE.S FLUSH BSR.L resmouse BSR.L owvbl BSR.L owvbl BSR.L owvbl BRA.L H TUBE: TST TUBECNT BEQ TUBERET SUBQ #1,TUBECNT BEQ TUBERET CMP #14,TUBECNT BCS TUBEUP TUBEDN: ADDQ.L #2,HEI+152 SUB.L #$140,SRCE+152 BRA TUBEJN TUBEUP: SUBQ.L #2,HEI+152 ADD.L #$140,SRCE+152 TUBEJN:MOVE #7,D0 BSR PRNT TUBERET:RTS TUBEREP:TST.L BACKS+28 BMI TUBERET MOVE.L BACKS+28,A0 MOVE.L HEI+152,D0 ADDQ #2,D0 TUBECLR:CLR.L (A0)+ CLR.L (A0) LEA $9C(A0),A0 DBRA D0,TUBECLR MOVE.L #-1,BACKS+28 RTS objects:MOVE ROTATE,D0 EOR #15,D0 MOVE D0,D5 AND.L #12,D5 SWAP D5 LSR.L #3,D5 MOVE.L D5,A6 AND.L #3,D0 ASL #3,D0 ADD D0,A6 ASL #1,D0 ADD D0,A6 ADD.L #expand,a6 ;start of shifted sprite data MOVE.L phys,A5 ADD #$2760,A5 LEA BACKS+64,A3 MOVE NUPOSITION,D2 MOVE D2,D0 AND #16,D0 LSR #1,D0 SUB D0,A5 AND #-31,D2 LSR #3,D2 MOVE D2,READER CLR.L D6 MOVE.L MAPREAD,A4 MOVE #9,D6 HPLOOP: MOVE #3,D7 VPLOOP: CLR D0 MOVE.B (A4,D2.W),D0; read map BEQ.S NOBJ AND #15,D0 ;FILTER EXTRAS ADD #55,D0 ;GET CHARACTER NO ASL #2,D0 MOVE.L D0,A0 ADD.L #SRCE,A0 MOVE.L (A0),A1 ; SPRITE ADD.L A6,A1 ; ADD SHIFT MOVE.L A5,A0 ; SCREEN MOVE.L A5,(A3)+; STORE TO BACKS MOVE.L #23,D4 ;HEIGHT PHLOOP: MOVE.L (A1)+,D1 MOVE.W (A1),D0; MASK EOR #-1,D0 AND D0,2(A0) OR D1,2(A0) SWAP D1 AND D0,(A0) OR D1,(A0) ADDQ #4,A1 ADDQ #8,A0 MOVE.L (A1)+,D1 MOVE.W (A1),D0; MASK EOR #-1,D0 AND D0,2(A0) OR D1,2(A0) SWAP D1 AND D0,(A0) OR D1,(A0) ADDQ #4,A1 ADDQ #8,A0 MOVE.L (A1)+,D1 MOVE.W (A1),D0; MASK EOR #-1,D0 AND D0,2(A0) OR D1,2(A0) SWAP D1 AND D0,(A0) OR D1,(A0) LEA $90(A0),A0 LEA $8C(A1),A1 DBRA D4,PHLOOP NOBJ: LEA $F00(A5),A5 ;UPDATE SCREEN ADDRESS ADDQ #1,D2 ; FETCH NEXT POSITION DBRA D7,VPLOOP LEA -$3BF0(A5),A5 DBRA D6,HPLOOP BACKRST:CMP.L #BACKS+124,A3 BCC.S BACKRST1 MOVE.L #-1,(A3)+ BRA.S BACKRST BACKRST1:RTS baddies:SUBQ #1,ANIMATE BNE.L NANIM MOVE #2,ANIMATE MOVE.L SRCE+36,D0 ;ANIMATE PODS ADDQ #8,D0 CMP.L #$41C60,D0 BCS.S NWRAPB MOVE.L #$41C20,D0 NWRAPB: MOVE.L D0,SRCE+36 ADD #$AA0,D0 MOVE.L D0,MASK+36 CMP #2,IFIRE BEQ.S NWRAPC2 CMP.L #14,BACKH BEQ.S WRAPC MOVE.L SRCE+128,D0 ADDQ #8,D0 CMP.L #$41CA0,D0 BCS.S NWRAPC WRAPC: MOVE.L #$41C80,D0 NWRAPC: MOVE.L D0,SRCE+128 ADD.L #$20,D0 MOVE.L D0,SRCE+132 ADD.L #$6E0,D0 MOVE.L D0,MASK+132 SUB.L #$20,D0 MOVE.L D0,MASK+128 NWRAPC2: MOVE.L SRCE+4,D0 ADDQ #8,D0 CMP.L #$40098,D0 BCS.S NWRAPD MOVE.L #$40078,D0 NWRAPD: MOVE.L D0,SRCE+4 NANIM: MOVE #7,D1 MOVE #16,D2 MOVE #32,D3 LEA POSITION,A1 LEA X,A2 LEA BACKS,A3 BADDLP: MOVE 64(A2,D2.w),D6 TST D6 BEQ.L NOAN CMP #9,D6 BEQ.S NTRANS BCC BADMOVE CMP #3,D6 BEQ.S NTRANS CMP #2,ANIMATE BNE.S NTRANS SUBQ #1,D6 MOVE D6,64(A2,D2.W) BRA NTRANS BADMOVE:MOVE 128(A2,D2.W),D0 ;YDRCT ADDQ #1,D0 MOVE 32(A2,D2.W),D7 ;Y ADD D0,D7 CMP #140,D7 BCS NTRN1 MOVE #140,D7 NEG D0 SUBQ #1,D0 NTRN1: MOVE D0,128(A2,D2.W) MOVE D7,32(A2,D2.W) TST.W D0 BPL NTRANS CMP #2,ANIMATE BNE NTRANS MOVE 64(A2,D2.W),D0 ADDQ #1,D0 CMP #14,D0 BCS NTRN MOVE #10,D0 NTRN: MOVE D0,64(A2,D2.W) NTRANS: MOVE (A1,D2.W),D0 ;POSITION OF BADDY SUB NUPOSITION,D0 ;SUBTRACT SCREEN POSITION MOVE D0,(a2,d2.W) ;SET X CORD CMP #300,D0 ;CHECK ON-SCREEN BCC.L OFFCHK SUB #146,D0 CMP #28,D0 BCC.L BADNWIZ MOVE 32(A2,D2.W),D0 SUB Y,D0 ADD #15,D0 CMP #30,D0 BCC.S BADNWIZ CLR 64(A2,D2.W) ;CLEAR C CMP #9,D6 BCS.S ICONADD MOVE #9,64(A2,D2.W) MOVE #1,FIN BRA.S BADNWIZ ICONADD:BSR.L IREPL ADD.L #16,ICONST ADDQ #1,ICONNO CMP #8,ICONNO BCS IKOK MOVE #1,ICONNO MOVE.L #$79238,ICONST IKOK: BSR.S IFLASH LEA PLAYER1+4,A0 BSR score MOVE.L #E1,D7 BSR.L son deduct: SUBQ #1,BADCNT NWAVEND:BRA.S NOAN BADNWIZ:MOVE D2,D0 LSR #1,D0 BSR.L PRNT NNP: ADDQ #2,D2 ADDQ #4,D3 DBRA D1,BADDLP RTS OFFCHK: CMP #9,D6 BCC.S NOAN CLR 64(A2,D2.W) SUBQ #1,BADCNT NOAN: MOVE.L #-1,(A3,D3.W) BRA.S NNP IFLASH: MOVE.L ICONST,A0 MOVE #22,D0 IFLP: CLR.L (A0)+ CLR.L (A0)+ CLR.L (A0)+ CLR.L (A0)+ LEA $90(A0),A0 DBRA D0,IFLP RTS IPRNT: MOVE.L FLIPST,D0 AND.L #$7FFF,D0 ADD.L phys,D0 MOVE.L D0,A0 BRA.S IRJN IBOTH: MOVE.L ICONST,D0 EOR.L #$8000,D0 MOVE.L D0,A0 BSR.S IRJN IREPL: MOVE.L ICONST,A0 MOVE.L A0,D0 EOR.L #$8000,D0 MOVE.L D0,A4 IRJN: MOVE #22,D0 IRLP: MOVE.L (A4)+,(A0)+ MOVE.L (A4)+,(A0)+ MOVE.L (A4)+,(A0)+ MOVE.L (A4)+,(A0)+ LEA $90(A0),A0 LEA $90(A4),A4 DBRA D0,IRLP RTS edges: MOVE.L phys,A0 ADD #$24d8,A0 MOVE #100,D0 edgelp: CLR.L (A0)+ CLR.L (A0)+ CLR.L (A0)+ CLR.L (A0)+ LEA $90(A0),A0 DBRA D0,edgelp RTS prepare:MOVE.L #$38000,phys MOVE.L #$3A120,A0 MOVE #136*$20,D0 bwipe: CLR.L (A0)+ DBRA D0,BWIPE MOVE #16,X MOVE #35,C MOVE #139,Y MOVE #17,D5 GROUND: BSR prnt0 ADD #16,X DBRA D5,GROUND CLR X MOVE #67,Y MOVE #36,C BSR prnt0 MOVE #3,SCORFLG BSR scoreprnt RTS wiz: CMP #14,TUBECNT BCC wizret ADDQ #1,WAGCNT TST SPIN BEQ.S SPINSAME BMI.S SPINEG MOVE #1,FIREDRN BRA.S SPINSAME ;SETS FIRE DIRECTION SPINEG: CLR FIREDRN SPINSAME:MOVE SPINLO,OSPINLO MOVE.B JOYPORT1,D7 TST.B ICAT BNE.S NCATCNT CMP #6,BUTTON BPL.S NEITHER NCATCNT:BTST #2,D7 BNE.S LEFT BTST #3,D7 BNE.S RIGHT NEITHER:TST.B ITHRUST BNE.S NOSPIN TST SPINLO BEQ.S NOSPIN BMI.S RIGHT LEFT: SUBQ #1,SPINLO CMP #-24,SPINLO BPL.S NOSPIN MOVE #-24,SPINLO BRA.S NOSPIN RIGHT: ADDQ #1,SPINLO CMP #24,SPINLO BMI.S NOSPIN MOVE #24,SPINLO NOSPIN: MOVE SPINLO,D0 ADD #24,D0 LSR #2,D0 SUBQ #6,D0 MOVE D0,SPIN ADD ROLL,D0 AND.L #63,D0 MOVE D0,ROLL ASL #1,D0 AND #248,D0 ADD.L #$412C0,D0 MOVE.L D0,SRCE+8 MOVE Y,D1 MOVE D1,OY CMP.B #2,ITHRUST BCC.S NSTEER MOVE SPIN,D0 MOVE D0,SPEED NSTEER: TST.B ITHRUST BNE.S BONCE MOVE YDRCT,D2 TST.B ICAT BNE.S STEER CMP #6,BUTTON BPL.S NEETHER STEER: BTST #0,D7 BNE.S UP BTST #1,D7 BNE.S DOWN NEETHER:CMP.W #0,D2 BEQ.S NDOWN BPL.S UP DOWN: ADDQ #1,D2 CMP #6,D2 BMI.S NDOWN MOVE #6,D2 BRA.S NDOWN UP: SUBQ #1,D2 CMP #-6,D2 BPL.S NDOWN MOVE #-6,D2 NDOWN: MOVE D2,YDRCT ADD D2,D1 CMP #58,D1 BCC.S NUPL MOVE #58,D1 NUPL: CMP #140,D1 BCS.S NDOWNL MOVE #140,D1 NDOWNL: MOVE D1,Y BRA.S WCHECK BONCE: MOVE YDRCT,D0 ADDQ #1,D0 MOVE HEIGHT,D1 MOVE D1,OHEIGHT ADD D0,D1 CMP #140*4,D1 BCS.S NBOUNCE MOVE #140*4,D1 MOVE #-25,D0 MOVE SPIN,D2 MOVE D2,SPEED NBOUNCE:MOVE D0,YDRCT MOVE D1,HEIGHT LSR #2,D1 MOVE D1,Y WCHECK: MOVE Y,D7 MOVE X,D6 BSR.L cord MOVE.L A0,BACKS MOVE.L (A0),DETECT1 MOVE.L $280(A0),DETECT2 MOVE.L $500(A0),DETECT3 MOVE.L $780(A0),DETECT4 MOVE.L $960(A0),DETECT5 TST FIRETIM BEQ.S FTOK SUBQ #1,FIRETIM FTOK: BTST #7,JOYPORT1 BEQ.L nfirebut ADDQ #1,BUTTON TST FIRETIM BNE.L WIZNF LEA BULX,A0 MOVE #1,D0 BULFND: TST (A0) BMI.S BULF ADDQ #2,A0 DBRA D0,BULFND BRA.S WIZNF BULF: MOVE #4,FIRETIM BULFOUND:LEA X,A1 MOVE 32(A1),D0 ;wizy ADD #7,D0 CMP #138,D0 BCC wiznfire MOVE D0,16(A0) ;y CLR 48(A0) ;ydrct MOVE.L #E5,D7 BSR.L son MOVE (A1),D0 ;wizx ADDQ #6,D0 MOVE D0,(A0) MOVE #10,32(A0) TST.B IFIRE BNE.S NBIDI; NOT BI-DIRECTIONAL MOVE LAST,D0 EOR #1,D0 MOVE D0,LAST BNE.S wiznjn BRA.S wiznfire NBIDI: MOVE FIREDRN,LAST TST FIREDRN BNE.S wiznfire wiznjn: NEG 32(A0) BRA.S wiznfire wiznfire: WIZNF:BRA WIZNF2 nfirebut:CLR BUTTON WIZNF2: CMP #7,WAGNO BCS.L wiznsel TST ICONNO BEQ.L wiznsel LEA ICON,A0 MOVE ICONNO,D0 MOVE.B (A0,D0.W),D1 TST.B D1 BEQ.L wiznsel SUBQ.B #1,D1 MOVE.B D1,(A0,D0.W) BNE.S NARROW CMP #1,D0 BNE.S ICNT CLR YDRCT ICNT: MOVE.L #$43B60,A4 ;ARROW CHARACTER MOVE.L #$43BA0,FLIPI BRA.S ICJN NARROW: CMP #5,D0 BNE.S NSPRAY MOVE.L #$463F0,A4 BRA.S ICJN1 NSPRAY: MOVE.L #$463C0,A4 ASL #4,D0 ADD D0,A4 ICJN1: MOVE.L #$43B60,FLIPI ICJN: MOVE.L A4,TARGETI MOVE.L ICONST,FLIPST MOVE #6,FLIPC CLR WAGNO MOVE.L #E2,D7 BSR.L son CLR ICONNO MOVE.L #$79228,ICONST ;RESET TO START wiznsel: wizret:RTS CATELITE: MOVEM.L A0-A2,-(SP) TST.B ICAT BNE.L CATRET MOVE.B JOYPORT1,D7 CMP #10,BUTTON BMI.S CATAUTO MOVE.B D7,D0 AND.B #15,D0 BEQ.S CATAUTO MOVE X+2,D1 MOVE Y+2,D2 BTST #1,D7 BEQ.S CATU CMP #150,D2 BCC.S CATD ADDQ #4,D2 CATU: BTST #0,D7 BEQ.S CATD CMP #56,D2 BCS.S CATD SUBQ #4,D2 CATD: BTST #3,D7 BEQ.S CATR MOVE #1,CFIREDRN CMP #284,D1 BCC.S CATL ADDQ #4,D1 CATR: BTST #2,D7 BEQ.S CATL CLR CFIREDRN CMP #20,D1 BCS.S CATL SUBQ #4,D1 CATL: MOVE D1,X+2 MOVE D2,Y+2 BRA.S CATOK2 CATAUTO:MOVE FIREDRN,CFIREDRN MOVE Y+2,D0 SUB Y,D0 SUBQ #2,D0 BEQ.S CATOK BMI.S CATUP LSR #2,D0 ADDQ #1,D0 SUB D0,Y+2 BRA.S CATOK CATUP: NEG D0 LSR #2,D0 ADDQ #1,D0 ADD D0,Y+2 CATOK: MOVE X+2,D0 CMP #139,D0 BCC.S CATC2 ADDQ #4,X+2 BRA.S CATOK2 CATC2: CMP #182,D0 BCS.S CATMOV SUBQ #4,X+2 BRA.S CATOK2 CATMOV: MOVE #140,D0 TST FIREDRN BNE.S CATLEFT MOVE #180,D0 CATLEFT:CMP X+2,D0 BEQ.S CATOK2 BCC.S CATINC SUBQ #4,X+2 BRA.S CATOK2 CATINC: ADDQ #4,X+2 CATOK2: MOVE #1,D0 BSR.L prnt BTST #7,D7 BEQ catnfire TST BULX+4 BPL.S catnfire catfire:MOVE Y+2,D0 ADD #5,D0 CMP #138,D0 BCC catnfire MOVE D0,BULY+4 CLR BULYD+4 MOVE.L #E5,D7 BSR.L son MOVE X+2,D0 ;catx ADDQ #6,D0 MOVE D0,BULX+4 MOVE #10,BULXD+4 TST.B IFIRE BNE.L NCBIDI; NOT BI-DIRECTIONAL MOVE CLAST,D0 EOR #1,D0 MOVE D0,CLAST BNE.S catfnjn BRA.S catnfire NCBIDI: MOVE CFIREDRN,CLAST TST CFIREDRN BNE.S catnfire catfnjn:NEG BULXD+4 catnfire:LEA X,A0 MOVE #16,D2 MOVE #7,D1 CATHITLP:MOVE.W 64(A0,D2.W),D6 CMP #9,D6 BCS CATHITNXT MOVE.W (A0,D2.W),D0 SUB X+2,D0 ADD #16,D0 CMP #32,D0 BCC CATHITNXT MOVE.W 32(A0,D2.W),D0 SUB Y+2,D0 ADD #16,D0 CMP #22,D0 BCC CATHITNXT MOVE D6,D0 BSR BADHIT MOVE.W D0,64(A0,D2.W) SUBQ #1,CATLIVES MOVE #E15,D7 BSR son TST CATLIVES BNE CATHITNXT MOVE.B #1,ICAT MOVE #9,CATLIVES CATHITNXT:ADDQ #2,D2 DBRA D1,CATHITLP CATRET: MOVEM.L (SP)+,A0-A2 RTS FLIP: TST FLIPC ;FLIPS ICONS BEQ.S FLIPRET SUBQ #1,FLIPC CMP #2,FLIPC BCC.S FLIPPER MOVE.L TARGETI,A4 BRA.S FLIPJN FLIPPER:ADD.L #$10,FLIPI MOVE.L FLIPI,A4 FLIPJN: BSR.L IPRNT FLIPRET:RTS BACKLINE:CLR.L D0 MOVE POSITION,D3 ASR #1,D3 MOVE D3,D2 ASR #1,D2 MOVE D2,D4 MOVE.L #$40140,A0 MOVE.L phys,A2 ADD #$5828,A2 ;BACKGRND LINE IN A2 MOVE #0,D1 BSR.S BACKSCROL MOVE D3,D2 MOVE #1,D1 BSR.S BACKSCROL ADD D4,D2 MOVE #1,D1 BSR.S BACKSCROL MOVE ROTATE,D2 MOVE #2,D1 BSR.S BACKSCROL ADD #$8C0,A2 ADD #$820,A0 ADD D3,D2 MOVE #5,D1 BSR.S BACKSCROL RTS BACKSCROL:AND #15,D2 CHRLP: MOVE (A0),D6 ROL D2,D6 SWAP D6 MOVE 2(A0),D7 ROL D2,D7 MOVE D7,D6 MOVE.L #17,D0 LINLP: MOVE.L D6,(A2)+ ADDQ #4,A2 DBRA D0,LINLP LEA $10(A2),A2 LEA $A0(A0),A0 DBRA D1,CHRLP RTS CLEARPLAY:MOVE.L phys2,A0 ADD #$6A40,A0 MOVE #4096,D7 CLEARLP:MOVE.L #0,-(A0) DBRA D7,CLEARLP RTS replacer:LEA BACKS+64,A6 reploop:MOVE.L (A6)+,A0 CMP.L #0,A0 BMI.S repret MOVE #23,D4 MOVE.L A0,D0 AND.L #$7FFF,D0 ADD.L #$38000,D0 MOVE.L D0,A1 BHLOOP: MOVE.L (A1),(A0) MOVE.L 8(A1),8(A0) MOVE.L 16(A1),16(A0) LEA $A0(A0),A0 LEA $A0(A1),A1 DBRA D4,BHLOOP BRA.S reploop repret: RTS replace:LEA BACKS+4,A6 replop:MOVE.L (A6)+,A0 CMP.L #0,A0 BMI.S repnxt MOVE #16,D4 MOVE.L A0,D0 AND.L #$7FFF,D0 ADD.L #$38000,D0 MOVE.L D0,A1 RPLOOP: MOVE.L (A1)+,(A0)+ MOVE.L (A1)+,(A0)+ MOVE.L (A1)+,(A0)+ MOVE.L (A1),(A0) LEA $94(A0),A0 LEA $94(A1),A1 DBRA D4,RpLOOP repnxt: CMP.L #BACKS+64,A6 BCS.S replop RTS rprnt: CLR.L D0 MOVEM.L A0-A5/D0-D7,-(SP) LEA X,A3 MOVE (A3),D6 MOVE 32(A3),D7 MOVE 64(A3),D0 TST.W D0 BMI.L rpret ASL #2,D0 MOVE.L D0,A0 ADD.L #SRCE,A0 MOVE.L (A0),A1 MOVE.L #1,D3; wid MOVE.L #199,D4; height BSR.L cord ;POKE SPRITE ONTO PLANES 0 & 1 AND POKE MASK ONTO PLANE 3 YRPOT: MOVE.W D3,D1 ;D3 WID MOVE.L A0,A3 ;A0 SCREEN MOVE.L A1,A4 ;A1 SPRITE ;D4 HEI XRPOT: CLR.L D6 MOVE (A4)+,D6 ; spr ROR.L D0,D6 MOVE.L D6,D5; COPY TO MASK OR D6,(A3)+ SWAP D6 OR D6,6(A3) CLR.L D6 MOVE (A4)+,D6 ; spr ROR.L D0,D6 OR.L D6,D5; ADD TO MASK OR D6,(A3)+ SWAP D6 OR D6,6(A3) CLR.L D6 MOVE (A4)+,D6 ; spr ROR.L D0,D6 OR.L D5,D6; ADD OTHERS TO FORM COMBINED MASK OR D6,(A3)+ SWAP D6 OR D6,6(A3) ADDQ #2,A3 ADDQ #2,A4 DBRA D1,XRPOT LEA $A0(A0),A0 LEA $A0(A1),A1 DBRA D4,YRPOT rpret2: MOVEM.L (SP)+,D0-D7/A0-A5 RTS rpret: MOVE.L #$F,(A4) BRA.S rpret2 wizprnt:CMP #14,TUBECNT BCC wprret MOVE C,D0 TST.W D0 BMI.L wprret ASL #2,D0 LEA SRCE,A0 ADD D0,A0 MOVE.L (A0),A1 MOVE.L MASK-SRCE(A0),A2 MOVE.L BACKS,A0 MOVE.L DETECT3,D0 CMP.L $500(A0),D0 BEQ.S NOCOLLISION COLLISION:MOVE OPOSITION,POSITION MOVE OHEIGHT,HEIGHT MOVE OY,Y TST.B ITHRUST BNE.S NHOVER CLR SPINLO CLR OSPINLO CLR SPIN BRA.S HOVJN NHOVER: NEG SPINLO NEG SPIN HOVJN: MOVE SPIN,SPEED BRA.L NOCOLLISION2 NOCOLLISION:MOVE.L (A0),D0 MOVE.L DETECT1,D1 EOR.L D1,D0 AND.L #$3C003C0,D0 BNE.S COLLISION2 MOVE.L $960(A0),D0 MOVE.L DETECT5,D1 EOR.L D1,D0 AND.L #$3C003C0,D0 BEQ.L NOCOLLISION2 COLLISION2:TST YDRCT BLE NHOLE MOVE POSITION,D2 AND #31,D2 CMP #27,D2 BCC NHOLE CMP #21,D2 BCS NHOLE MOVE.W READER,D2 MOVE.L MAPREAD,A6 MOVE Y,D0 SUB #51,D0 YFI: ADDQ #1,D2 SUB #24,D0 BPL YFI MOVE.B 19(A6,D2.W),D1 BPL NHOLE MOVE #2,FIN NHOLE: MOVE OHEIGHT,HEIGHT MOVE OY,Y TST.B ITHRUST BNE.S NHOVER2 CLR YDRCT MOVE POSITION,OPOSITION BRA.S HOVJN2 NHOVER2:NEG YDRCT HOVJN2: MOVE SPIN,SPEED NOCOLLISION2:MOVE.L #14,D4 MOVE.L D4,BACKH BSR.L CATELITE BSR.L DIRECT TST BUTTON BEQ.S wprret2 CMP.B #2,IFIRE BEQ.S wprret2 MOVE.L SRCE+132,A1 MOVE.L MASK+132,A2 MOVE #10,D4 BSR.S DIRECT SUB.L #$1720,A0 MOVE.L SRCE+128,A1 MOVE.L MASK+128,A2 MOVE #10,D4 CMP #62,Y BCC NOVERLAP MOVE #62,D0 SUB Y,D0 OVERLOOP:LEA $A0(A0),A0 LEA $A0(A1),A1 LEA $A0(A2),A2 SUBQ #1,D4 DBRA D0,OVERLOOP NOVERLAP:MOVE.L A0,BACKS BSR.S DIRECT MOVE.L #36,BACKH wprret2:RTS wprret: MOVE.L #-1,BACKS BRA.S wprret2 DIRECT: MOVE.L (A2)+,D0 EOR.L #-1,d0 MOVE.L (A0),D1 AND.L D0,D1 OR.L (A1)+,D1 MOVE.L D1,(A0)+ MOVE.L (A0),D1 AND.L D0,D1 OR.L (A1),D1 MOVE.L D1,(A0) LEA $9c(A0),A0 LEA $9c(A1),A1 LEA $9c(A2),A2 DBRA D4,DIRECT RTS wizreplace:MOVE.L BACKS,A0 CMP.L #0,A0 BMI.S repret0 MOVE.L A0,D0 AND.L #$7FFF,D0 ADD.L #$38000,D0 MOVE.L D0,A1 MOVE.L BACKH,D4 RHLOOP: MOVE.L (A1)+,(A0)+ MOVE.L (A1),(A0) LEA $9C(A0),A0 LEA $9C(A1),A1 DBRA D4,RHLOOP repret0:RTS prnt0: CLR.L D0 prnt: setup: MOVEM.L A0-A5/D0-D7,-(SP) AND.L #255,D0 ASL #1,D0 MOVE.L D0,A3 ADD.L #X,A3 ASL #1,D0 MOVE D0,A4 ADD.L #BACKS,A4 MOVE (A3),D6 MOVE 32(A3),D7 MOVE 64(A3),D0 TST.W D0 BMI.L prret ASL #2,D0 MOVE.L D0,A0 ADD.L #SRCE,A0 MOVE.L (A0),A1 MOVE.L WID-SRCE(A0),D3 MOVE.L D3,128(A4) LSR.B #2,D3 MOVE.L HEI-SRCE(A0),D4 MOVE.L D4,256(A4) MOVE.L MASK-SRCE(A0),A2 BSR.L cord MOVE.L A0,(A4) rotpoke: YROT: MOVE.W D3,D1 ;D3 WID MOVE.L A0,A3 ;A0 SCREEN MOVE.L A1,A4 ;A1 SPRITE MOVE.L A2,A5 ;A2 MASK ;D4 HEI XROT: CLR.L D7 MOVE (A5),D7 ; mask EOR.L #-1,D7 ROR.L D0,D7 MOVE.L D7,D2; D2=OTHER HALF OF MASK SWAP D2 CLR.L D6 MOVE (A4)+,D6 ; spr ROR.L D0,D6 AND D7,(A3) OR D6,(A3)+ SWAP D6 AND D2,6(A3) OR D6,6(A3) CLR.L D6 MOVE (A4)+,D6 ; spr ROR.L D0,D6 AND D7,(A3) OR D6,(A3)+ SWAP D6 AND D2,6(A3) OR D6,6(A3) CLR.L D6 MOVE (A4)+,D6 ; spr ROR.L D0,D6 AND D7,(A3) OR D6,(A3)+ SWAP D6 AND D2,6(A3) OR D6,6(A3) CLR.L D6 MOVE (A4)+,D6 ROR.L D0,D6 AND D7,(A3) OR D6,(A3)+ SWAP D6 AND D2,6(A3) OR D6,6(A3) ADDQ #8,A5 DBRA D1,XROT LEA $A0(A0),A0 LEA $A0(A1),A1 LEA $A0(A2),A2 DBRA D4,YROT MOVEM.L (SP)+,D0-D7/A0-A5 RTS prret: MOVE.L #$F,(A4) prret2: MOVEM.L (SP)+,A0-A5/D0-D7 RTS res: MOVE.L #E14,D7 BSR.L son CLR D6 reslp: BSR.S dres ADDQ #1,D6 CMP #4,d6 BCS.S reslp RTS deres: MOVE.L #E13,D7 BSR.L son MOVE #3,D6 drlp: BSR.S dres SUBQ #1,d6 BPL DRLP RTS dres: MOVE D6,D2 ASL #1,D2 LEA DMASK,A0 MOVE (A0,D2.W),D7; MASK BSR.L swapscrn MOVE.L #1,D3 ASL D6,D3; VERTICAL COPIES ASL #1,D3 SUBQ #1,D3 MOVE.L #$38000,A0; FROM MOVE.L phys,A1; TO vertlp: MOVE #$4F,D4 ;LINE LENGTH MOVE.L A1,A2; COPY OF TO DERLP: MOVE (A0)+,D1 AND D7,D1 BEQ.S NDRT MOVE #1,D5; START ROT MOVE D6,D2 DRTLP: MOVE D1,D0 ASL D5,D1 ADD D0,D1 ASL #1,D5 DBRA D2,DRTLP NDRT: MOVE D1,(A1)+ DBRA D4,DERLP MOVE.w D3,D2 VLOP2: MOVE.w #$4F,D4 VLOP: MOVE.W (A2)+,(A1)+ DBRA D4,VLOP LEA $A0(A0),A0 DBRA D2,VLOP2 CMP.l #$3FB00,A0 BCS.S vertlp BSR.L setscrn BSr.L owvbl BSr.L owvbl RTS BULLETS:LEA BULX,A2 LEA X,A1 LEA BULA,A3 LEA BULR,A4 BULLP: MOVE (A2),D6 ;X TST D6 BMI.S BULNXT MOVE 16(A2),D7 ;Y ADD 32(A2),D6 ;+XDRCT CMP #300,D6 BCC.S BULDED ADD 48(A2),D7 ;+YDRCT CMP #138,D7 BCC.S BULDED MOVE D6,(A2) MOVE D7,16(A2) MOVE #7,D2 MOVE #16,D1 BADCHK: TST 64(A1,D1.W) BEQ.S BADNXT MOVE (A1,D1.W),D0 SUB D6,D0 ADD #16,D0 CMP #20,D0 BCC.S BADNXT MOVE 32(A1,D1.W),D0 SUB D7,D0 ADD #14,D0 CMP #18,D0 BCS.S BADBULD BADNXT: ADDQ #2,D1 DBRA D2,BADCHK BSR.L cord MOVE.L A0,(A3); BULA MOVE.L (A0),32(A3); BULC MOVE D0,(A4);BULR BULNXT: ADDQ #4,A3 ADDQ #2,A4 ADDQ #2,A2 CMP.L #BULX+6,A2 BCS.S BULLP RTS BADBULD:MOVE.W 64(A1,D1.W),D0 BSR BADHIT MOVE D0,64(A1,D1.W) BULDED: MOVE #-1,(A2) MOVE.L #-1,(A3) BRA.S BULNXT BADHIT: CMP.W #9,D0 BEQ.S POD BCS.S BADHRET CLR.W D0 BRA.S BADHRET POD: MOVE.W #8,D0 BADHRET:RTS bprnt: LEA BULA,A0 LEA BULR,A2 LEA BBACK,A3 LEA BULX,A4 BPLP: MOVE.L (A0),A1 CMP.L #0,A1 BMI.S BPNXT MOVE (A2),D0 MOVE.L #$FF0,D3 LSR.L D0,D3 SWAP D3 MOVE.L 32(A0),D1 ;BULC MOVE.L (A1),D2 EOR.L D2,D1 AND.W D3,D1 BNE.S BULDED2 SWAP D1 AND.W D3,D1 BNE.S BULDED2 ADDQ.L #6,A1 MOVE.L A1,(A3) ;BBACK MOVE (A1),D1 OR D3,D1 MOVE D1,(A1) MOVE $A0(A1),D1 OR D3,D1 MOVE D1,$A0(A1) SWAP D3 MOVE 8(A1),D1 OR D3,D1 MOVE D1,8(A1) MOVE $A8(A1),D1 OR D3,D1 MOVE D1,$A8(A1) BRA.S BPNXT BULDED2:MOVE.L #-1,(A0) MOVE #-1,(A4) BPNXT: ADDQ.L #2,A2 ADDQ.L #2,A4 ADDQ.L #4,A0 ADDQ.L #4,A3 CMP.L #BULA+16,A0 BCS.S BPLP ZAPPER: CMP.L #14,BACKH BEQ.S ZAPRET LEA X,A1 MOVE #7,D2 MOVE #16,D1 ZAPCHK: TST 64(A1,D1.W) ;BAD C BEQ.S ZAPNXT MOVE (A1,D1.W),D0 ;BAD X SUB #144,D0 CMP #32,D0 BCC.S ZAPNXT MOVE 32(A1,D1.W),D0; BAD Y SUB Y,D0 BMI.S ABOVE SUB #15,D0 CMP #11,D0 BCC.S ZAPNXT BRA.S BADZAP ABOVE: ADD #26,D0 BCC.S ZAPNXT BADZAP: MOVE.W 64(A1,D1.W),D0 CMP.W #9,D0 BEQ.S ZPOD BCS.S ZAPNXT CLR.W 64(A1,D1.W) BRA.S ZAPNXT ZPOD: MOVE.W #8,64(A1,D1.W) ZAPNXT: ADDQ #2,D1 DBRA D2,ZAPCHK ZAPRET: RTS breplace:LEA BBACK,A0 BRLP: MOVE.L (A0),D1 MOVE.L D1,A2 TST.L D1 BMI.S brnxt AND.L #$7FFF,D1 ADD.L #$38000,D1 MOVE.L D1,A1 MOVE (A1),(A2) MOVE 8(A1),8(A2) MOVE $A0(A1),$A0(A2) MOVE $A8(A1),$A8(A2) brnxt: ADDQ.L #4,A0 CMP.L #BBACK+32,A0 BCS.S BRLP RTS INITPHYS:MOVE.L #$78000,phys MOVE.L #$70000,phys2 BRA.L SETSCRN dark: LEA ZEROS,A0 BRA.S PALJZ colour: LEA TITCOL,A0 BRA.S PALJZ grey: LEA GREYCOL,A0 BRA.S PALJZ light: LEA palette,A0 PALJZ: LEA PALREG,A1 MOVE #$F,D0 PALJN: MOVE.W (A0)+,(A1)+ DBRA D0,PALJN RTS FADEIN: MOVE #6,D6 MOVE.L A1,A2 FADEIN1:LEA PALREG+2,A0; TARGET IN A1 MOVE #14,D7 FADEIN2:BSR.L MODIFY ADDQ #2,A0 ADDQ #2,A1 DBRA D7,FADEIN2 MOVE #4,D0 BSR.L WAIT MOVE.L A2,A1 DBRA D6,FADEIN1 RTS randsub: MOVE.L D1,-(SP) TST.L RANVAL BNE.S NZRAN MOVE.L $4BA,D0 MOVE.L #16,D1 ASL.L D1,D0 OR.L $4BA,D0 MOVE.L D0,RANVAL NZRAN: MOVE.L #$BB40E62D,D0 MOVE.L RANVAL,D1 MULU D0,D1 MOVE.L D1,RANVAL ASR.L #8,D1 AND.L #$FFF,D1 MOVE.L D1,D0 MOVE.L (SP)+,D1 RTS inkey: MOVE.W #$FF,-(SP) MOVE.W #6,-(SP) TRAP #1 ADDQ.L #4,SP RTS initjoy:MOVE #$14,-(SP) MOVE #4,-(SP) MOVE #3,-(SP) TRAP #13 ADDQ.L #6,SP MOVE #34,-(SP) TRAP #14 ADDQ.L #2,SP MOVE.L D0,A0 ADD.L #24,A0 LEA OJOYVECT,A1 MOVE.L (A0),(A1) LEA joyevent,A1 MOVE.L A1,(A0) CLR.B JOYPORT0 CLR.B JOYPORT1 RTS joyevent:MOVEM.L A0/A1,-(SP) LEA joyport0,A1 MOVE.B (A1),D0 MOVE.B 1(A0),(A1) MOVE.B 1(A1),D1 MOVE.B 2(A0),1(A1) EOR.B D1,D0 AND #12,D0 BEQ.S NOWAG CMP #4,WAGCNT BCC.S WAGRESET ADDQ #1,WAGNO BRA.S WAGRST WAGRESET:CLR WAGNO WAGRST: CLR WAGCNT NOWAG: MOVEM.L (SP)+,A0/A1 RTS resmouse:MOVE #34,-(SP) TRAP #14 ADDQ.L #2,SP MOVE.L D0,A0 ADD.L #24,A0 MOVE.L OJOYVECT,(A0) MOVE #128,-(SP) MOVE #4,-(SP) MOVE #3,-(SP) TRAP #13 ADDQ.L #6,SP MOVE #1,-(SP) MOVE #4,-(SP) MOVE #3,-(SP) TRAP #13 ADDQ.L #6,SP RTS cord: MOVE D6,D0 AND #15,D0 AND #$FFF0,D6 ASR #1,D6 ASL #5,D7 MOVE.L phys,A0 ADD D7,A0 ASL #2,D7 ADD D7,A0 ADD D6,A0 RTS initscrn:MOVE.L #$78000,phys MOVE.l #$70000,phys2 csetscrn:MOVE.W #0,-(SP) MOVE.L phys,-(SP) MOVE.L phys,-(SP) MOVE #5,-(SP) TRAP #14 ADD.L #12,SP RTS H: MOVEM.L A0-A6/D0-D7,-(SP) MOVE.W #1,-(SP) move.l #$78000,-(sp) move.l #$78000,-(sp) move #5,-(sp) trap #14 add.l #12,sp MOVE.W #$000,PALREG+6 MOVE.W #$666,PALREG MOVE.B #7,$484 BSR INTOFF MOVEM.L (SP)+,A0-A6/D0-D7 RTS swapscrn:MOVE.L phys,D0 MOVE.L phys2,phys MOVE.L D0,phys2 MOVE #95,D0 LEA BACKS,A0 ;swap replace data LEA BACKCOP,A1 BACKERLP:MOVE.L (A1),D1 MOVE.L (A0),(A1)+ MOVE.L D1,(A0)+ DBRA D0,BACKERLP MOVE #7,D0 LEA BBACK,A0 LEA OBBACK,A1 BBACKL: MOVE.L (A1),D1 MOVE.L (A0),(A1)+ MOVE.L D1,(A0)+ DBRA D0,BBACKL RTS ss: move.l #$48000,phys MOVE.B #0,$FF8260 setscrn:MOVE.B phys+2,$FF8203 MOVE.B phys+1,$FF8201 RTS WAIT: BSR.S owvbl DBRA D0,WAIT RTS owvbl: MOVEM.L D0-D2/A0-A2,-(SP) MOVE.W #37,-(sp) TRAP #14 ADDQ.L #2,SP MOVEM.L (SP)+,D0-D2/A0-A2 RTS wvbl: CMP #2,SYNC BLT.S wvbl CLR SYNC RTS interrupt:;ADDQ #1,PALREG+10 ;addq #1,palreg+18 ; CLR.W PALREG ADDQ #1,SYNC CONIN: JMP $F event: ADDQ.W #1,PALREG RTS SETINT: MOVE.L VECTOR,D0 BNE.S SETINT2 MOVE.L $70,VECTOR SETINT2:MOVE.L VECTOR,CONIN+2 ;set return vector at end of new routine MOVE.L #INTERRUPT,$70 ;redirect vector to new routine MOVE.L #EVENT,$78 MOVE.B #3,$FFFA21 MOVE.B #8,$FFFA19; OP MODE BSET #0,$FFFA07 RTS INTOFF: MOVE.L VECTOR,$70 ;replace old vector address (UNTRIED) ; MOVE.W #8,-(SP); TIMER B ; MOVE.W #26,-(SP); jdisint p.189 ; TRAP #14 ; SWITCH OFF TIMER ; ADDQ.L #4,SP RTS score: MOVE #1,D0 scorev: ADD.B (A0),D0 MOVE.B D0,(A0) CMP #58,D0 BCS SCRET SUB.B #10,D0 MOVE.B D0,(A0) SUBQ.L #1,A0 BRA score SCRET: CMP.L #player1+2,A0 BNE SCRET2 SUBQ.B #1,XTR BGT SCRET2 MOVE.B #5,XTR ADDQ.B #1,LIVES SCRET2: MOVE #3,SCORFLG RTS scoreset:MOVE #3,SCORFLG scorstlp:BSR scoreprnt SUBQ #1,SCORFLG BNE SCORSTLP RTS scoreprnt:TST SCORFLG BEQ SCORET CMP #3,SCORFLG BNE SCOREPRNT2 MOVE.L phys,-(SP) MOVE.L #$38000,phys ;print to background MOVE #0,X+12 MOVE #42,Y+12 MOVE #39,C+12 MOVE.L #player1+1,A4 BSR.L numbers MOVE.L #-1,BACKS+24 ;PREVENT REPLACEMENT SUBQ #1,SCORFLG MOVE.L (SP)+,phys SCORET: RTS SCOREPRNT2:LEA $39A40,A0 ;copies from background MOVE.L phys,A1 LEA $1A40(A1),A1 MOVE #6,D0 SCORLP: MOVE.L (A0)+,(A1)+ MOVE.L (A0)+,(A1)+ MOVE.L (A0)+,(A1)+ MOVE.L (A0)+,(A1)+ MOVE.L (A0)+,(A1)+ MOVE.L (A0),(A1) LEA $8C(A0),A0 LEA $8C(A1),A1 DBRA D0,SCORLP RTS numbers:;A4 HOLDS STRING numlp: CLR.L D0 MOVE.B (A4)+,D0 TST.B D0 BEQ.S numex BSR.L numprnt BRA.S numlp numex: RTS numprnt:SUB #48,D0 ASL.W #3,D0 ADD.L #$28000,D0 MOVE.L D0,SRCE+156 MOVE #6,D0 BSR.L prnt ADDQ.W #8,X+12 RTS super: CLR.L -(SP) MOVE.W #$20,-(SP) TRAP #1 ADDQ.L #6,SP MOVE.L D0,SVSP RTS unsuper:MOVE.L SVSP,-(SP) MOVE.W #$20,-(SP) TRAP #1 ADD.L #6,SP RTS sclr: MOVE.L #$78000,A0 MOVE.L #$7000,D0 SCLRLP:MOVE.L #0,(A0)+ DBRA D0,SCLRLP RTS son: MOVEM.L A0-A2/D0-D2,-(SP) MOVE.L D7,A0 TST.B PRIORTIM BEQ.S SONOK MOVE.B PRIORITY,D0 CMP.B (A0),D0 BCC.S SONRET SONOK: MOVE.B (A0),PRIORITY MOVE.B 1(A0),PRIORTIM ADDQ.L #2,D7 MOVE.L D7,-(SP) MOVE.W #32,-(SP) TRAP #14 ADDQ.L #6,SP SONRET:MOVEM.L (SP)+,A0-A2/D0-D2 RTS wayter: MOVE.L D0,-(SP) BSR.L wvbl MOVE.L (SP)+,D0 DBRA D0,wayter RTS L: MOVE.L #F1,A0 BSR.S LOAD MOVE.L #F2,A0 BSR.S LOAD MOVE.L #F3,A0 BSR.S LOAD MOVE.L #TITLEPIC,A0 BSR.S LOAD MOVE.L #WBACKS,A0 BSR.S LOAD MOVE.L #TEXT,A0 BSR.S LOAD MOVE SR,D0 CMP #$22FF,D0 BGT.S OKSUP2 BSR.L super OKSUP2: MOVE.L $70,VECTOR RTS LOAD: ;A0=FILENAME MOVE.L (A0)+,LADD MOVE #2,-(SP) MOVE.L A0,-(SP) MOVE #$3D,-(SP) TRAP #1 ADDQ.L #8,SP TST.W D0 BMI.S OUCH MOVE D0,HANDLE MOVE.L LADD,-(SP) MOVE.L #32128,-(SP) MOVE D0,-(SP) MOVE #$3F,-(SP) TRAP #1 ADD.L #12,SP TST.L D0 BMI.S OUCH MOVE.W HANDLE,-(SP) MOVE #$3E,-(SP) TRAP #1 ADDQ.L #4,SP TST.W D0 BMI.S OUCH RTS OUCH: NEG.L D0 ILLEGAL HANDLE: DC.W 0 LADD: DC.L 0 F1: DC.L $38000-34 DC "wiz.pi1",0 EVEN F2: DC.L $40000-34 DC "wizsprit.pi1",0 EVEN F3: DC.L $48000-34 DC "wizobj.pi1",0 EVEN TITLEPIC:DC.L $50000-34 DC"WIZTIT.PI1",0 EVEN WBACKS:DC.L $30000-34 DC"WBACKS.PI1",0 EVEN TEXT:DC.L $28000-34 DC"TEXT.PI1",0 even eror: illegal .  WJ..  rWMAC MAN עKt **** **** **** * ** ** ** ** ** ** ** ** ** Atari Corporation MADMAC 68000 MACRO ASSEMBLER REFERENCE MANUAL Beta Version 0.13 Copyright 1986, 1987 Atari Corporation All Rights Reserved _T_A_B_L_E _O_F _C_O_N_T_E_N_T_S Introduction . . . . . . . . . . . . . . . . . . 4 How to Tell Us About Bugs . . . . . . . . . . . 4 Getting Started . . . . . . . . . . . . . . . . 5 The Command Line . . . . . . . . . . . . . . . . 6 Using MADMAC . . . . . . . . . . . . . . . . . . 10 Example Command Lines . . . . . . . . . . . . . 10 Interactive Mode . . . . . . . . . . . . . . . . 11 Things You Should Be Aware Of . . . . . . . . . 11 Forward Branches . . . . . . . . . . . . . . . . 12 Notes for AS68 users . . . . . . . . . . . . . 12 Notes for Mark Williams C Users . . . . . . . . 13 Using MADMAC as a Back-End to Alcyon C. . . . . 14 Text File Format . . . . . . . . . . . . . . . . 14 Source Format . . . . . . . . . . . . . . . . . 16 Statements . . . . . . . . . . . . . . . . . . . 16 Equates . . . . . . . . . . . . . . . . . . . . 16 Symbols and Scope . . . . . . . . . . . . . . . 17 Keywords . . . . . . . . . . . . . . . . . . . 18 Constants . . . . . . . . . . . . . . . . . . . 18 Strings . . . . . . . . . . . . . . . . . . . . 19 Register Lists . . . . . . . . . . . . . . . . . 20 Directives . . . . . . . . . . . . . . . . . . . 21 Expressions . . . . . . . . . . . . . . . . . . 26 Order of Evaluation . . . . . . . . . . . . . . 26 Types . . . . . . . . . . . . . . . . . . . . . 26 Unary Operators . . . . . . . . . . . . . . . . 27 Binary Operators . . . . . . . . . . . . . . . 28 Example Expressions . . . . . . . . . . . . . . 28 68000 Mnemonics . . . . . . . . . . . . . . . . . 30 Macros . . . . . . . . . . . . . . . . . . . . . 32 Macro Declaration . . . . . . . . . . . . . . . 32 Parameter Substitution . . . . . . . . . . . . 32 Macro Invocation . . . . . . . . . . . . . . . . 33 Example Macros . . . . . . . . . . . . . . . . 34 Repeat Blocks . . . . . . . . . . . . . . . . . 36 6502 Support . . . . . . . . . . . . . . . . . . 37 Addressing Modes . . . . . . . . . . . . . . . 37 6502 Directives . . . . . . . . . . . . . . . . 37 Object Code Format . . . . . . . . . . . . . . 38 Error Messages . . . . . . . . . . . . . . . . . 40 mac/intro Introduction ( 4 ) _I_N_T_R_O_D_U_C_T_I_O_N This document describes MADMAC, a fast macro assembler for the 68000. MADMAC currently runs on the Atari ST and under 4.2 BSD VAX UNIX. It was written at Atari Corporation by programmers who needed a high performance assembler for their work. MADMAC is intended to be used by programmers who write mostly in assembly language. It was not originally a back- end to a C compiler, therefore it has creature comforts that are usually neglected in such back-end assemblers. It sup- ports include files, macros, symbols with limited scope, some limited control structures, and other features. MADMAC is also blindingly fast, another feature often sadly and obviously missing in today's assemblers. MADMAC is not entirely compatible with the AS68 assembler provided with the original Atari ST Developer's Kit, but most changes are minor and a few minutes with an editor should allow you to assemble your current source files. If you are an AS68 user, before you leap into the unknown please read the section on "Notes for AS68 Users". This manual was originally typeset with TeX and the Computer Modern fonts, and printed on the Atari SLM-804 laser printer with a MEGA ST. This "nroff" version of the manual is a conversion of the original, much prettier manual. (The TeX version of the manual is not available electronically, but can be obtained from Atari Technical Support). Except for 200 lines of assembly language, the assembler is written entirely in C. _H_O_W _T_O _T_E_L_L _U_S _A_B_O_U_T _B_U_G_S This is the beta release of the assembler, and it will definitely contain bugs, possibly even serious show- stoppers. As a beta test site, you are requested to report any bugs in the assembler and any problems with the documen- tation. We are also interested in your suggestions for improvements. Please send your bug reports and suggestions to: Landon Dyer (Attn: Madmac) Atari Corporation 1196 Borregas Avenue Sunnyvale, CA 94088 usenet: {sun,imagen,amdcad}!atari!dyer bix: ldyer 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/intro Introduction ( 5 ) GETTING STARTED o If the dog hasn't already eaten your distribution disk, write protect the disk and make a backup of it now. Put the original disk in a safe place away from EMP, stray cosmic rays and Fido. o The distribution disk contains a file called README that you should read. This file contains important news about the contents of the distribution disk and summarizes the most recent changes to the tools. o Hard disk users can simply copy the executable files to their work or bin directories. People with floppy disks can copy the executables to ramdisks, install the assem- bler with the -q option, or even work right off of the floppies. o You will need an editor that can produce ``normal'' for- mat text files. Micro Emacs will work well, as will most other commercial program editors, but not most word pro- cessors (such as First Word or Microsoft Write). o You will probably want to examine or get a listing of the file ``ATARI.S''. It contains lots of definitions for the Atari ST, including BIOS variables, most BIOS, XBIOS and GEMDOS traps, and line-A equates. We (or you) could split the file up into pieces (a file for line-A equates, a file for hardware and BIOS variables and so on), but MADMAC is so fast that it doesn't matter much. o Read the rest of the manual, especially the first two chapters on ``The Command Line'' and ``Using MADMAC''. The distribution disk contains example programs that you can look at, assemble and modify. 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/switches The Command Line ( 6 ) _T_H_E _C_O_M_M_A_N_D _L_I_N_E The assembler is called `mac' on UNIX systems, and `mac.prg' on the Atari ST. The command line takes the form: mac [ switches ] [ files ] A command line consists of any number of switches followed by the names of files to assemble. A switch is specified with a dash (-) followed immediately by a key character. Key characters are not case-sensitive, so `-d' is the same as `-D'. Some switches accept (or require) arguments to immediately follow the key character, with no spaces in between. Switch order is important. Command lines are processed from left to right in one pass, and switches usually take effect when they are encountered. In general it is best to specify all switches before the names of any input files. If the command line is entirely empty then MADMAC prints a copyright message and enters an `interactive' mode, prompt- ing for successive command lines with a star (*). An empty command line will exit (See the examples in the chapter on `Using MADMAC'). After each assembly in interactive mode, the assembler will print a summary of the amount of memory used, the amount of memory left, the number of lines pro- cessed, and the number of seconds the assembly took. Input files are assumed to have the extension `.s'; if a filename has no extension (i.e. no dot) then `.s' will be appended to it. More than one source filename may be speci- fied; the files are assembled into one object file, as if they were concatenated. On UNIX, if the input filename is `-', the standard input is used, and an object file called `noname.o' is produced. MADMAC normally produces object code in `file.o' if `file.s' is the first input filename. If the first input file is the standard input or a special character device, the output name is `noname.o'. The `-o' switch (see below) can be used change the output file name. 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/switches The Command Line ( 7 ) _S_W_I_T_C_H_E_S -dname[=value] The `-d' switch permits symbols to be defined on the command line. The name of the symbol to be defined immediately follows the switch (no spaces). The symbol name may optionally be followed by an equals sign (=) and a decimal number. If no value is specified the symbol's value is zero. The symbol attributes are `defined, not referenced, and absolute'. This switch is most useful for enabling conditionally-assembled debugging code on the commandline; for example: -dDEBUG -dLoopCount=999 -dDebugLevel=55 -e[file[.err]] The `-e' switch causes MADMAC to send error messages to a file, instead of the console. If a filename immedi- ately follows the switch character, error messages are written to the specified filge. If no filename is specified, a file is created with the default extension `.err' and with the root name taken from the first input file name (e.g. error messages are written to `file.err' if `file' or `file.s' is the first input file name). If no errors are encountered, then no error listing file is created. -fm -fmu The `-fm' and `-fmu' switches cause MADMAC to generate Mark Williams style object files instead of Alcyon object files. These files may be linked with the Mark Williams linker. The `-fmu' switch causes underscores on the first character of a global symbol name to be moved to the end of the name, as per the Mark Williams C compiler naming convention. That is, `_main' will become `main_' and `__main' will become `_main_'. -ipathlist The `-i' switch allows automatic directory searching for include files. A list of semi-colon seperated directory search paths may be mentioned immediately following the switch (with no spaces anywhere). For example: -im:;c:include;c:include\sys will cause the assembler to search the current direc- tory of device `M' , and the directories `include' and `include\sys' on drive `C'. If `-i' is not specified, and the enviroment variable `MACPATH' exists, its value is used in the same manner. For example, users of the Mark Williams shell could put the following line in their profile script to achieve the same result as the 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/switches The Command Line ( 8 ) `-i' example above: setenv MACPATH="m:;c:include;c:include\sys" -l[file[.prn]] The `-l' switch causes MADMAC to generate an assembly listing file. If a filename immediately follows the switch character, the listing is written to the speci- fied file. If no filename is specified, then a listing file is created with the default extension `.prn' and with the root name taken from the first input file name (e.g. the listing is written to `file.prn' if `file' or `file.s' is the first input file name). -ofile[.o] -o file[.o] The `-o' switch causes MADMAC to write object code on the specified file. No default extension is applied to the filename. For historical reasons the filename can also be seperated from the switch with a space (e.g. `-o file'). -p -ps The `-p' and `-ps' switches cause MADMAC to produce an Atari ST executable file with the default extension of `.prg'. If there are any external references at the end of the assembly, an error message is emitted and no executable file is generated. The `-p' switch does not write symbols to the executable file. The `-ps' switch writes Alcyon-format symbols to the executable file. -q The `-q' switch is implemented only on the Atari ST, and is aimed primarily at users of floppy disk only systems. It causes MADMAC to install itself in memory, like a RAMdisk. Then the program m.prg (which is very short --- less than a sector) can be used instead of `mac.prg', which can take ten or twelve seconds to load. -s The `-s' switch causes MADMAC to generate a list of unoptimized forward branches in the form of warning statements. This is used to point out branches that could have been short. -u The -u switch takes effect at the end of the assembly. It forces all referenced and undefined symbols to be global, exactly as if they had been made global with a .extern or .globl directive. This can be used if you have a lot of external symbols, and you don't feel like declaring them all external. -v The `-v' switch turns on a `verbose' mode in which MAD- MAC prints out (for example) the names of the files it 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/switches The Command Line ( 9 ) is currently visiting. Verbose mode is automatically entered when MADMAC prompts for input with a star. -yN The `-y' switch, followed immediately by a decimal number, sets the number of lines in a page. MADMAC will produce `N' lines before emitting a form-feed. If `N' is missing or less than 10 an error message is generated. -6 The '-6' switch takes effect when it is mentioned. It allows MADMAC to be used as a back end to the Alcyon C compiler. This switch is NOT a compatibility mode for AS68 --- it has been carefully tailored to accept the output of the Alcyon C compiler. Note: the assembler will produce code that is typically ten percent larger and ten percent slower than the output of the Alcyon assembler, therefore use of this switch for production code is discouraged. _S_U_M_M_A_R_Y _O_F _S_W_I_T_C_H_E_S Switch Description - -* -dname[=value] Define symbol (with optional value). -e[file[.err]] Redirect error messages to a file. -fm, -fmu Generate Mark Williams style object files. -ipathlist Set include-file directory search path. -l[file[.prn]] Direct assembly listing to a file. -ofile[.o] Redirect object code to specified file. -p, -ps Generate executable (.PRG) file. -q Make MADMAC resident in memory (ST only). -s Warn about unoptimized long branches. -u Assume all undefined symbols are external. -v Verbose mode (silly running dialouge). -yN Set listing page size to N lines. -6 `Back end' mode for Alcyon C68. 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/using Using MadMAC ( 10 ) _U_S_I_N_G _M_A_D_M_A_C Let's assemble and link some example programs. These pro- grams are included on the distribution disk in the `EXAM- PLES' directory --- you should copy them to your work area before you try the examples out. If you have been reading carefully, you know that MADMAC can generate an executable file without linking. This is useful for making small, standalone programs that don't require externals or library routines. For example, the following two commands (the shell prompts with a percent (%) here): % mac example.s % aln -s example.o could be replaced by the single command: % mac -ps example.s since you don't need the linker for stand-alone object files. Successive source files named in the command line are are concatenated, as in this example, which assembles three files into a single executable, as if they were one big file: % mac -p bugs shift images Of course you can get the same effect by using the `.include' directive, but sometimes it is convenient to do the concatenation from the command line. Here we have an unbelievably complex command line: mac -lzorf -y95 -o tmp -ehack -im: -Ddebug=123 -ps example This monster produces a listing on the file called ` zorf.prn' with 95 lines per page, writes the executable code (with symbols) to a file called `tmp.prg', writes an error listing to the file `hack.err', specifies an include-file path that includes the current directory on the drive `M:', defines the symbol `debug' to have the value 123, and assem- bles the file `example.s'. One last thing. If there are any assembly errors, MADMAC will terminate with an exit code of 1. If the assembly succeeds (no errors, although there may be warnings) the exit code will be 0. This is primarily for use with `make' utilities. 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/using Using MadMAC ( 11 ) _I_N_T_E_R_A_C_T_I_V_E _M_O_D_E If you invoke MADMAC with an empty command line it will print a copyright message and prompt for more commands with a star (*). This is useful if you are used to working directly from the desktop, or if you want to assemble several files in succession without having to reload the assembler from disk for each assembly. In interactive mode, the assembler is also in verbose mode (just as if you had specified `-v' on each command line): % mac - y MADMAC Atari Macro Assembler Copyright 1987 Atari Corporation Beta version X.XX Zzz YYYY lmd - * -ps example [Including: example.s] [Including: atari.s] [Leaving: atari.s] [Leaving: example.s] [Writing executable file: example.prg] 36K used, 3658K left, 850 lines, 2.0 seconds * You can see that the assembler gave a `blow-by-blow' account of the files it processed, as well as a summary of the assembly's memory usage, the number of lines processed (including macro and repeat-block expansion), and how long the assembly took. The assembler prompts for another command with the star. At this point you can either type a new command line for the assembler to process, or you can exit by typing control-C or an empty line. _T_H_I_N_G_S _Y_O_U _S_H_O_U_L_D _B_E _A_W_A_R_E _O_F MADMAC is a `one pass' assembler. This means that it gets all of its work done by reading each source file exactly once and then `back-patching' to fix up forward references. This one-pass nature is usually transparent to the program- mer, with the following important exceptions: o In listings, the object code for forward references is not shown. Instead, lower-case `xx's are displayed for each undefined byte, as in the following example: 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/using Using MadMAC ( 12 ) 60xx .1: bra.s .2 ; forward branch x dc.l .2 ; forward reference 60FE .2: bra.s .2 ; backward reference o Forward branches (including BSR instructions) are never optimized to their short forms. To get a short forward branch it is necessary to explicitly use the `.s' suffix in the source code. o Error messages may appear at the end of the assembly, refering to earlier source lines that contained undefined symbols. That is, error messages are not necessarily in order by line number. o All object code generated must fit in memory. Running out of memory is a fatal error that you must deal with by splitting up your source files, re-sizing or eliminating memory-using programs such as ramdisks and desk acces- sories, or buying more RAM. (If you are completely out of space then you should seriously consider buying a Cray.) _F_O_R_W_A_R_D _B_R_A_N_C_H_E_S MADMAC does not optimize forward branches for you, but it will tell you about them if you use the `-s' (short branch) switch: % mac -s example.s "example.s", line 20: warning: unoptimized short branch With the `-e' switch you can redirect the error output to a file, and determine by hand (or with editor macros) which forward branches are safe to explicitly declare short. _N_O_T_E_S _F_O_R _A_S_6_8 _U_S_E_R_S MADMAC is not entirely compatible with the Alcyon assembler, AS68. This section outlines the major differences. In practice, we have found that very few changes are necessary to make AS68 source code assemble. o A semicolon (;) must be used to introduce a comment, except that a star (*) may be used in the first column. AS68 treated anything following the operand field, pre- ceeded by whitespace, as a comment. (MADMAC treats a star that is not in column 1 as a multiplication opera- tor). 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/using Using MadMAC ( 13 ) o Labels require colons (even labels that begin in column 1). o Conditional assembly directives are called `if', `else' and `endif'. AS68 called these `ifne', `ifeq' (etc.), and `endc'. o The tilde (~) character is an operator, and back-quote (`) is an illegal character. AS68 permitted the tilde and back-quote characters in symbols. o There are no equivalents to AS68's `org' or `section' directives. AS68's `page' directive has become `eject'. The AS68 `.xdef' and `.xref' directives are not imple- mented, but `.globl' makes these unnecessary anyway. The directives `.comline', `mask2', `idnt' and `opt', which were unimplemented and ignored in AS68, are not legal in MADMAC. o The location counter cannot be manipulated with a state- ment of the form: * = expression o The `ds' directive is not permitted in the text or data segments (except in `-6' mode); an error message is issued. Use `dcb' instead to reserve large blocks of initialized storage. o Back-slashes in strings are `electric' characters that are used to escape C-like character codes. Watch out for GEMDOS path names in ASCII constants --- you will have to convert them to double-backslashes. _N_O_T_E_S _F_O_R _M_A_R_K _W_I_L_L_I_A_M_S _C _U_S_E_R_S MADMAC will generate object code that the Mark Williams C linker, `ld', will accept. This has been tested only with version 2.0 of the Mark Williams package. Some notable differences between MADMAC and the Mark Williams assembler, `as', are: o MWC permits 16-character symbol names in the object file, and MADMAC supports this; o MWC object files can contain more code and data sections than the MADMAC (Alcyon) object code format. MADMAC maps its code sections as follows: 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/using Using MadMAC ( 14 ) MWC Space MADMAC Space - - shri text prvi unsupported bssi unsupported shrd data prvd unsupported bssd bss debug unsupported symbols symbols absolute abs, equates, etc. o It is not possible for MADMAC to generate code in the Mark Williams private instruction, private data or unini- tialized instruction spaces. o None of the Mark Williams assembler directives (e.g. `.long' and `.odd') are supported. None of the MWC non- standard addressing modes are supported. o The Mark Williams debugger, `db', does not grok the Alcyon-format symbols produced with the `-ps' switch; it complains about the format of the executable file and aborts. But you can use SID or the Atari debugger. o MADMAC does not comprehend the method by which the Mark Williams shell passes long command lines to programs. Command lines are silently truncated to 127 characters. _U_S_I_N_G _M_A_D_M_A_C _A_S _A _B_A_C_K-_E_N_D _T_O _T_H_E _A_L_C_Y_O_N _C _C_O_M_P_I_L_E_R MADMAC can be used in place of the AS68 assembler as a back-end for the Alcyon version 4.14 C compiler. The `-6' switch turns on a mode that warps and perverts MADMAC's ordinary syntax into accepting what the Alcyon compiler dishes out. This can be used in a batch file (for instance) with a line that looks like: mac -6 -o %1.o m:%1 (Assuming that device `M:' is where the source was put by compiler phase `c168'). You should be aware that AS68 gen- erally produces better and faster code than MADMAC, although it is slower to assemble. _T_E_X_T _F_I_L_E _F_O_R_M_A_T For those using editors other than the `Emacs' style ones (Micro-Emacs, Mince, etc.) this section documents the source file format that MADMAC expects. 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/using Using MadMAC ( 15 ) o Files must contain characters with ASCII values less than 128; it is not permissable to have characters with their high bits set unless those characters are contained in strings (i.e. between single or double quotes) or in com- ments. o Lines of text are terminated with carriage-return/line- feed, linefeed alone, or carriage-return alone. o The file is assumed to end with the last terminated line. If there is text beyond the last line terminator (e.g. control-Z) it is ignored. 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/source Source Format ( 16 ) _S_T_A_T_E_M_E_N_T_S A statement may conta8in up to four fields which are identi- fied by order of appearance and terminating characters. The general form of an assembler statement is: label: operator operand(s) ; comment The label and comment fields are optional. An operand field may not appear without an operator field. Operands are seperated with commas. Blank lines are legal. If the first character on a line is an asterisk (*) or semicolon (;) then the entire line is a comment. A semicolon anywhere on the line (except in a string) begins a comment field which extends to the end of the line. The label, if it appears, must be terminated with a single or double colon. If it is terminated with a double colon it is automatically declared global. It is illegal to declare a confined symbol global (see: `Symbols and Scope'). _E_Q_U_A_T_E_S A statement may also take one of these special forms: symbol equ expression symbol = expression symbol == expression symbol set expression symbol reg register list The first two forms are identical; they equate the symbol to the value of an expression, which must be defined (no for- ward references). The third form, double-equals (==), is just like an equate except that it also makes the symbol global. (As with labels, it is illegal to make a confined equate global.) The fourth form allows a symbol to be set to a value any number of times, like a variable. The last form equates the symbol to a 16-bit register mask specified by a register list. It is possible to equate confined symbols (see: `Symbols and Scope'). For example: cr equ 13 ; carriage-return lf = 10 ; line-feed DEBUG == 1 ; global debug flag count set 0 ; variable count set count + 1 ; increment variable .regs reg d3-d7/a3-a6 ; register list .cr = 13 ; confined equate 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/source Source Format ( 17 ) _S_Y_M_B_O_L_S _A_N_D _S_C_O_P_E Symbols may start with an uppercase or lowercase letter (A-Z a-z), an underscore (_), a question mark (?) or a period (.). Each remaining character may be an upper or lowercase letter, a digit (0-9), an underscore, a dollar sign ($), or a question mark. (Periods can only begin a symbol, they cannot appear as a symbol continuation character). Symbols are terminated with a character that is not a symbol con- tinuation character (e.g. a period or comma, whitespace, etc.). Case is significant for user-defined symbols, but not for 68000 mnemonics, assembler directives and register names. Symbols are limited to 100 characters. When symbols are written to the object file they are silently truncated to eight (or sixteen) characters --- depending on the object file format --- with no check for (or warnings about) colli- sions. For example, all of the following symbols are legal and unique: reallyLongSymbolName .reallyLongConfinedSymbolName a10 ret move dc frog aa6 a9 ???? .a1 .ret .move .dc .frog .a9 .9 .???? .0 .00 .000 .1 .11 .111 . ._ _frog ?zippo? sys$system atari Atari ATARI aTaRi while all of the following symbols are illegal: 12days dc.10 dc.z 'quote .right.here @work hi.there $money$ ~tilde Symbols beginning with a period (.) are confined; their scope is between two normal labels. Confined symbols may be labels or equates. It is illegal to make a confined symbol global (with the `.globl' directive, a double colon, or a double equals). Only unconfined labels delimit a confined symbol's scope; equates (of any kind) do not count. For example, all symbols are unique and have unique values in the following: zero:: subq.w #1,d1 bmi.s .ret .loop: clr.w (a0)+ dbra d0,.loop .ret: rts FF:: subq.w #1,d1 bmi.s .99 FOO = * .loop: move.w #-1,(a0)+ dbra d0,.loop .99: rts 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/source  Source Format ( 18 ) Confined symbols are useful since the programmer has to be much less inventive about finding small, unique names that also have meaning. It is legal to define symbols that have the same names as processor mnemonics (such as `move' or `rts') or assembler directives (such as `.even'). Indeed, one should be careful to avoid typographical errors, such as this classic (in 6502 mode): .6502 .org = $8000 which equates a confined symbol to a hexadecimal value, rather than setting the location counter, which the `.org' directive is responsible for. _K_E_Y_W_O_R_D_S The following names, in all combinations of uppercase and lowercase, are keywords and may not be used as symbols (e.g. labels, equates, or the names of macros): equ set reg sr ccr pc sp ssp usp d0 d1 d2 d3 d4 d5 d6 d7 a0 a1 a2 a3 a4 a5 a6 a7 r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 _C_O_N_S_T_A_N_T_S Numbers may be decimal, hexadecimal, octal, binary or con- catenated ASCII. The default radix is decimal, and it may not be changed. Decimal numbers are specified with a string of digits (0-9). Hexadecimal numbers are specified with a leading dollar sign ($) followed by a string of digits and uppercase or lowercase letters (A-F a-f). Octal numbers are specified with a leading at-sign (@) followed by a string of octal digits (0-7). Binary numbers are specified with a leading percent sign (%) followed by a string of binary digits (0-1). Concatenated ASCII constants are specified by enclosing one or more characters in single or double quotes. For example: 1234 decimal $1234 hexadecimal @777 octal %10111 binary "z" ASCII 'frog' ASCII Negative numbers are specified with a unary minus (-). For 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/source Source Format ( 19 ) example: -5678 -@334 -$4e71 -%11011 -'z' -"WIND" _S_T_R_I_N_G_S Strings are contained between double (") or single (') quote marks. Strings may contain non-printable characters by specifying `backslash' escapes, similar to the ones used in the C programming language. MADMAC will generate a warning if a backslash is followed by a character not appearing below: Code Value Meaning ---- - - \ $5c backslash $0a line-feed (newline) $08 backspace $$009d tcaabrriage-return $0c form-feed \ $1b escape ' $27 single-quote It is possible for strings (but NOT symbols) to contain characters with their high bits set (i.e. character codes $80..$FF). You should be aware that backslash characters are popular in GEMDOS path names, and that you may have to escape backslash characters in your existing source code. For example, to get the file "\c:\auto\ahdi.s" you would specify the string "c:\\auto\\ahdi.s". _R_E_G_I_S_T_E_R _L_I_S_T_S Register lists are special forms used with the MOVEM mnemonic and the `reg' directive. They are 16-bit values, with bits 0 through 15 corresponding to registers D0 through A7. A register list consists of a series of register names or register ranges seperated by slashes. A register range consists of two register names, Rn and Rm, n < m, seperated by a dash. For example: 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/source Source Format ( 20 ) Register List Value - - d0-d7/a0-a7 $FFFF d2-d7/a0/a3-a5 $39FC d0/d1/a0-a3/d7/a6-a7 $CF83 d0 $0001 r0-r15 $FFFF Register lists and register equates may be used in conjunc- tion with the MOVEM mnemonic. The key is to specify the register list constant with a `#' sign (otherwise the regis- ter list is treated like an ordinary absolute value, i.e. an address). For example: temps reg d0-d2/a0-a2 ; temp registers keeps reg d3-d7/d3-a6 ; registers to9 preserve allregs reg d0-d7/a0-a7 ; all registers movem.l #temps,-(sp) ; these two lines ... movem.l d0-d2/a0-a2,-(sp) ; ... are identical movem.l #keeps,-(sp) ; save "keep" registers movem.l (sp)+,#keeps ; restore "keep" registers 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/direct Directives ( 21 ) _D_I_R_E_C_T_I_V_E_S Assembler directives may be any mix of upper or lowercase. The leading periods are optional, though they are shown here and their use is encouraged. Directives may be preceeded by a label; the label is defined before the directive is exe- cuted. Some directives accept size suffixes (`.b', `.s', `.w' or `.l'); the default is word (`.w') if no size is specified. The `.s' suffix is identical to `.b'. Direc- tives relating to the 6502 are described in the chapter on `6502 Support'. .even If the location counter for the current section is odd, make it even by adding one to it. In text and data sections a zero byte is deposited. .assert expression [, expression ...] Assert that the conditions are true (non-zero). If any of the comma-seperated expressions evaluates to zero an assembler warning is issued. For example: .assert *-start = $76 .assert stacksize >= $400 .bss .data .text Switch to the BSS, data or text segments. Instructions and data may not be assembled into the BSS segment, but symbols may be defined and storage may be reserved with the `.ds' directive. Each assembly starts out in the text segment. .abs [location] Start an absolute section, beginning with the specified location (or zero, if no location is specified). An absolute section is much like BSS, except that loca- tions (labels) are absolute, not relative to the base of BSS. This directive is useful for declaring struc- tures or hardware locations with the `ds' directive. For example, the following equates: VPLANES = 0 VWRAP = 2 CONTRL = 4 INTIN = 8 PTSIN = 12 could be as easily (and more readably) defined as: 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/direct Directives ( 22 ) .ABS VPLANES: ds.w 1 VWRAP: ds.w 1 CONTRL: ds.l 1 INTIN: ds.l 1 PTSIN: ds.l 1 .comm symbol, expression Specifies a label and the size of a common region. The label is made global, thus confined symbols cannot be made common. The linker groups all common regions of the same name; the largest size determines the real size of the common region. .dc.b expression [, expression ...] .dc.w expression [, expression ...] .dc.l expression [, expression ...] Deposit initialized storage in the current section. If the specified size is word or long, the assembler will execute a `.even' before depositing data. If the size is `.b', then strings that are not part of arithmetic expressions (e.g. strings along) are deposited byte- by-byte. If no size is specified, the default is `.w'. This directive cannot be used in the BSS section. .dcb.b expression1, expression2 .dcb.w expression1, expression2 .dcb.l expression1, expression2 Generate an initialized block of `expression1' bytes, words or longwords of the value `expression2'. If the specified size is word or long, the assembler will exe- cute `.even' before generating data. If no size is specified, the default is `.w'. This directive cannot be used in the BSS section. .ds.b expression .ds.w expression .ds.l expression Reserve space in the current segment for the appropri- ate number of bytes, words or longwords. If no size is specified, the default size is `.w'. If the size is word or long, the assembler will execute `.even' before reserving space. This directive can only be used in the BSS or ABS sections (in text or data, use `.dcb' to reserve large chunks of initialized storage.) .init.b [#expression] expression[.size] [, ...] .init.w [#expression] expression[.size] [, ...] .init.l [#expression] expression[.size] [, ...] Generalized initialization directive. The size speci- fied on the directive becomes the default size for the rest of the line. (The `default' default size is 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/direct Directives ( 23 ) `.w'.) A comma-seperated list of expressions follows the directive; an expression may be followed by a size to override the default size. An expression may be preceeded by a # (sharp) sign, an expression and a comma, which specifies a repeat count to be applied to the next expression. For example: .init.l -1, 0.w, #16,'z'.b, #3,0, 11.b will deposit a longword of -1, a word of zero, sixteen bytes of lower-case `z', three longwords of zero, and a byte of 11. No auto-alignment is performed within the line, but a `.even' is done once (before the first value is depo- sited) if the default size is word or long. This directive is particularly useful for initializing structures that contain mixtures of bytes, words, long- words and strings. .cargs [#expression,] symbol[.size] [, symbol[.size] ...] Compute stack offsets to C (and other language) argu- ments. Each symbol is assigned an absolute value (effectively an equate) which starts at `expression' and increases by the size of each symbol, for each sym- bol. If the `expression' is not supplied, the default starting value is 4. For example: .cargs #8, .fileName.l, .openMode, .bufPointer.l could be used to declare offsets from A6 to a pointer to a filename, a word containing an open mode, and a pointer to a buffer. (Note that the symbols used here are confined). Another example, a C-style `string- length' function, could be written as: strlen:: .cargs .string ; declare arg move.l .string(sp),a0 ; a0 -> string moveq #-1,d0 ; initial size = -1 .1: addq.l 1,d0 ; bump size tst.b (a0)+ ; at end of string? bne .1 ; (no -- try again) rts ; return string length .end End the assembly. In an include file, end the include file and resume assembling the superior file. This statement is not required, nor are warning messages generated if it is missing at the end of a file. This directive may be used inside conditional assembly, mac- ros or repeat blocks. 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/direct Directives ( 24 ) .if expression .else .endif Start a block of conditional assembly. If the expres- sion is true (non-zero) then assemble the statements between the `.if' and the matching `.endif' or `.else'. If the expression is false, ignore the statements unless a matching `.else' is encountered. Conditional assembly may be nested to any depth. It is possible to exit a conditional assembly block early from within an include file (with `.end') or a macro (with `.endm'). .iif expression, statement Immediate version of `.if'. If the expression is true (non-zero) then the statement, which may be an instruc- tion, a directive or a macro (or even another `.iif'), is executed. If the expression is false, the statement is ignored. No `.endif' is required. For example: .iif age < 18, canDrive = 0 .iif weight > 500, dangerFlag = 1 .iif !(^^defined DEBUG), .include dbsrc .macro name [formal, formal ...] .endm .exitm Define a macro called `name' with the specified formal arguments. The macro definition is terminated with a `.endm' statement. A macro may be exited early with the `.exitm' directive. See the chapter on `Macros' for more information. .undefmac macroName [, macroName ...] Remo@ve the macro-definition for the specified macro names. If reference is made to a macro that is not defined, no error message is printed and the name is ignored. .rept expression .endr The statements between the `.rept' and `.endr' direc- tives will be repeated `expression' times. If the expression is zero or negative, no statements will be assembled. No label may appear on a line containing either of these directives. .globl symbol [, symbol ...] .extern symbol [, symbol ...] Each symbol is made global. None of the symbols may be confined symbols (those starting with a period). If 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/direct Directives ( 25 ) the symbol is defined in the assembly, the symbol is exported in the object file. If the symbol is unde- fined at the end of the assembly, and it was referenced (i.e. used in an expression), then the symbol value is imported as an external reference that must be resolved by the linker. The `.extern' directive is merely a synonym for `.globl'. Note: Symbols are silently truncated to 8 or 16 charac- ters when they are written to the object file. .include "file" Include a file. If the filename is not enclosed in quotes, then a default extension of `.s' is applied to it. If the filename is quoted, then the name is not changed in any way. Note: If the filename is not a valid symbol, then the assembler will generate an error message. You should enclose filenames such as `atari.s' in quotes, because such names are not symbols (note the `.' in the filename). If the include file cannot be found in the current directory, then the directory search path, as specified by -d on the command line, or by the `MACPATH' enviroment string, is traversed. .eject Issue a page eject in the listing file. .title "string" .subttl [-] "string" Set the title or subtitle on the listing page. The title should be specified on the the first line of the source program in order to take effect on the first page. The second and subsequent uses of `.title' will cause page ejects. The second and subsequent uses of `.subttl' will cause page ejects unless the subtitle string is preceeded by a dash (-). .list .nlist Enable or disable source code listing. These direc- tives increment and decrement an internal counter, so they may be appropriately nested. They have no effect if the `-l' switch is not specified on the command line. 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/expr Expressions ( 26 ) _E_X_P_R_E_S_S_I_O_N_S All values are computed with 32-bit 2's complement arithmetic. For boolean operations (such as `if' or `assert') zero is considered false, and non-zero is considered true. Note: EXPRESSIONS ARE EVALUATED STRICTLY LEFT-TO-RIGHT, WITH NO REGARD FOR OPERATOR PRECEDENCE. Thus the expression `1+2*3' evaluates to 9, not 7. However, precedence may be forced with parenthesis (()) or square-brackets ([]). _T_Y_P_E_S Expressions belong to one of three classes: undefined, absolute or relocatable. An expression is undefined if it involves an undefined symbol (e.g. an undeclared symbol, or a forward reference). An expression is absolute if its value will not change if the program were to be relocated (for instance, the number 0, all labels declared in an `abs' section, and all Atari ST hardware register locations are absolute values). An expression is relocatable if it involves exactly one symbol that is contained in a text, data or BSS sec- tion. Only absolute values may be used with operators other than addition (+) or subtraction (-) --- it is illegal, for instance, to multiply or divide by a relocatable or undefined value. Subtracting a relocatable value from another relocatable value in the same section results in an absolute value (the distance between them, posi- tive or negative). Adding (or subtracting) an absolute value to or from a relocatable value yeilds a relocat- able value (an offset from the relocatable address). It is important to realize that relocatable values belong to the sections they are defined in (e.g. text, data or BSS), and it is not permissible to mix and match sections. For example, in this code: line1: dc.l line2, line1+8 line2: dc.l line1, line2-8 line3: dc.l line2-line1, 8 error: dc.l line1+line2, line2 >> 1, line3/4 Line 1 deposits two longwords that point to line 2. Line 2 deposits two longwords that point to line 1. Line 3 deposits two longwords that have the absolute value eight. The fourth line will result in an 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/expr Expressions ( 27 ) assembly error, since the expressions (respectively) attempt to add two relocatable values, shift a relocat- able value right by one, and divide a relocatable value by four. The pseudo-symbol `*' (star) has the value that the current section's location counter had at the beginning of the current source line. For example, these two statements deposit three pointers to the label `bar': foo: dc.l *+4 bar: dc.l *,* Similarly, the pseudo-symbol `$' has the value that the current section's location counter has, and it is kept up to date as the assembler deposits information `across' a line of source code. For example, these two statements deposit four pointers to the label `zop': zip: dc.l $+8, $+4 zop: dc.l $, $-4 _U_N_A_R_Y _O_P_E_R_A_T_O_R_S - Unary minus (2's complement). ! Logical (boolean) NOT. ~ Tilde: bitwise NOT (1's complement). ^^defined True if symbol defined. ^^reference True if symbol referenced ^^streq string,string True if strings are equal. ^^macdef True if macro is defined. The boolean operators generate the value `0' if the expression is true, and `1' if it is not. A symbol is referenced if it is involved in an expres- sion. A symbol may have any combination of attributes: undefined and unreferenced, defined and unreferenced (declared but never used), undefined and referenced (in the case of a forward or external reference), or defined and referenced. _B_I_N_A_R_Y _O_P_E_R_A_T_O_R_S 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/expr Expressions ( 28 ) + - * / The usual arithmetic operators. % Modulo & | ^ AND, OR and Exclusive-OR. << >> Bit-wise shift left and shift right. < <= >= > Boolean magnitude comparisons. = Boolean equality. <> != Boolean inequality. All binary operators have the same precedence: expres- sions are evaluated strictly left to right. o Division or modulo by zero yields an assembly error. o The `<>' and `!=' operators are synonyms. o Note that the modulo operator (%) is also used to introduce binary constants (see: `Constants'). A percent sign should be followed by at least one space if it is meant to be a modulo operator, and is followed by a `0' or ``1''. _S_P_E_C_I_A_L _F_O_R_M_S ^^date The current system date (Gemdos format). ^^time The current system time (Gemdos format). The `date' special form expands to the current system date, in Gemdos format. The format is a 16-bit word with bits 0..4 indicating the day of the month (1..31), bits 5..8 indicating the month (1..12), and bits 9..15 indicating the year since 1980, in the range 0..119. The `time' special form expands to the current system time, in Gemdos format. The format is a 16-bit word with bits 0..4 indicating the current second divided by 2, bits 5..10 indicating the current minute (0..59), and bits 11.15 indicating the current hour (0..23). _E_X_A_M_P_L_E _E_X_P_R_E_S_S_I_O_N_S line address contents source code ---- - - - 1 0 4480 lab1: neg.l d0 2 02 42790 lab2: clr.w lab1 3 =064 equ1 = 100 4 =096 equ2 = equ1 + 50 5 08 064 dc.l lab1 + equ1 6 0C 7FE6 dc.l (equ1 + ~equ2) >> 1 7 010 0001 dc.w ^^defined equ1 8 012 0000 dc.w ^^referenced lab2 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/expr Expressions ( 29 ) 9 014 02 dc.l lab2 10 018 0001 dc.w ^^referenced lab2 11 01A 0001 dc.w lab1 = (lab2 - 6) Lines 1 through four here are used to set up the rest of the example. Line 5 deposits a relocatable pointer to the location 100 bytes beyond the label `lab1'. Line 6 is a nonsensical expression that uses the `~' and right-shift operators. Line 7 deposits a word of 1 because the symbol `equ1' is defined (in line 3). Line 8 deposits a word of 0 because the symbol `lab2', defined in line 2, has not been referenced. But the expression in line 9 references the symbol `lab2', so line 10 (which is a copy of line 8) deposits a word of 1. Finally, line 11 deposits a word of 1 because the boolean equality operator evaluates to true. The operators `^^defined' and `^^referenced' are par- ticularly useful in conditional assembly. For instance, it is possible to automatically include debugging code if the debugging code is referenced, as in: lea string,a0 ; A0 -> message jsr debug ; print a message rts ; and return string: dc.b "Help me, Spock!",0 .iif ^^defined debug, .include "debug.s" The JSR statement references the symbol `debug'. Near the end of the source file, the `.iif' statement includes the file `debug.s' if the symbol `debug' was referenced. In production code, presumably all refer- ences to the debug symbol will be removed, and the debug source file will not be included. (We could have as easily made the symbol `debug' external, instead of including another source file). 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/assembly 68000 Mnemonics ( 30 ) _6_8_0_0_0 _M_N_E_M_O_N_I_C_S All of the standard Motorola 68000 mnemonics and addressing modes are supported; you should refer to Motorola's `68000 PROGRAMMER'S REFERENCE MANUAL' for a description of the instruction set and the allowable addressing modes for each instruction. With one major exception (forward branches) the assembler performs all the reasonable optimizations of instructions to their short or address register forms. Register names may be in upper or lower case. The alternate forms `R0' through `R15' may be used to specify `D0' through `A7'. All register names are key- words, and may not be used as labels or symbols. None of the 68010 or 68020 register names are keywords (but they may become keywords in the future). _A_D_D_R_E_S_S_I_N_G _M_O_D_E_S Syntax Description - - Dn Data register direct An Address register direct (An) Address register indirect (An)+ Address register postincrement -(An) Address register predecrement disp(An) IndirEect with displacement bdisp(An,Xi) Indirect indexed abs.W Absolute, forced short abs Short or long absolute abs.L Absolute, forced long disp(PC) Program counter relative disp(PC, Xi) Program counter indexed #immed Immediate _B_R_A_N_C_H_E_S Since MADMAC is a one pass assembler, forward branches cannot be automatically optimized to their short form. Instead, unsized forward branches are assumed to be long. Backward branches are always optimized to the short form if possible. A table that lists `extra' branch mnemonics (common synonyms for the Motorola defined mnemonics) appears below. 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/assembly 68000 Mnemonics ( 31 ) BRANCH SYNONYMS Synonym: Is really: - - bhs bcc blo bcs bze, bz beq bnz bne dblo dbcs dbze dbeq dbra dbf dbhs dbhi dbnz dbne _L_I_N_K_E_R _C_O_N_S_T_R_A_I_N_T_S It is not possible to make an external reference that will fix up a byte. For example: .extern frog move.l frog(pc,d0),d1 is illegal (and generates an assembly error) when frog is external, because the displacement occupies a byte field in the 68000 offset word, which the object file cannot represent. _O_P_T_I_M_I_Z_A_T_I_O_N_S _A_N_D _T_R_A_N_S_L_A_T_I_O_N_S The assembler provides `creature comforts' when it processes 68000 mnemonics: o "CLR.x An" will really generate "SUB.x An,An". o ADD, SUB and CMP with an address register will really generate ADDA, SUBA and CMPA. o The ADD, AND, CMP, EOR, OR and SUB mnemonics with immediate first operands will generate the `I' forms of their instructions (ADDI, etc.) if the second operand is NOT register direct. o All shift instructions with only one operand assume a count of one. o MOVE.L is optimized to MOVEQ if the immediate operand is defined and in the range -128..127. How- ever, ADD and SUB are never translated to their quick forms; ADDQ and SUBQ must be explicit. 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/macro #Macros ( 32 ) _M_A_C_R_O_S A macro definition is a series of statements of the form: .macro name [ formal-arg, ...] : : statements making up the macro body : .endm The name of the macro may be any valid symbol that is not also a 68000 instruction or an assembler directive. (The name may begin with a period, but macros cannot be made confined the way labels or equated symbols can be). The formal argument list is optional; it is specified with a comma-seperated list of valid symbol names. Note that there is no comma between the name of the macro and the name of the first formal argument A macro body begins on the line after the `.macro' directive. All instructions and directives, except other macro definitions, are legal inside the body. The macro ends with the `.endm' statement. If a label appears on the line with this directive, the label is ignored and a warning is generated. _P_A_R_A_M_E_T_E_R _S_U_B_S_T_I_T_U_T_I_O_N Within the body, formal parameters may be expanded with the special forms: \name \{name} The second form (enclosed in braces) can be used in situations where the characters following the formal parameter name are valid symbol continuation charac- ters. This is usually used to force concatentation, as in: \{frog}star \{godzilla}vs\{reagan} Thep formal parameter name is terminated with a charac- ter that is not valid in a symbol (e.g. whitespace or punctuation); optionally, the name may be enclosed in curly-braces. The names must be symbols appearing on the formal argument list, or a single decimal digit (\1 corresponds to the first argument, \2 to the second, \9 to the ninth, and \0 to the tenth). It is possible for 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/macro #Macros ( 33 ) a macro to have more than ten formal arguments, but arguments 11 and on must be referenced by name, not by number. Other special forms are: Form Description - -+ \\ Replaced by single `\' \~ a unique symbol of the form "Mn" \# the number of arguments actually specified \! the `dot-size' used on the macro invocation \?name conditional expansion \?{name} conditional expansion The last two forms are identical: if the argument is specified and is non-empty, the form expands to a `1', otherwise (if the argument is missing or empty) the form expands to a `0'. The form `\!' expands to the `dot-size' that was speci- fied when the macro was invoked. This can be used to write macros that behave differently depending on the size suffix they are given, as in this macro which pro- vides a synonym for the `dc' directive: .macro deposit value dc\! value .endm deposit.b 1 ; byte of 1 deposit.w 2 ; word of 2 deposit.l 3 ; longword of 3 _M_A_C_R_O _I_N_V_O_C_A_T_I_O_N A previously-defined macro is called when its name appears in the operation field of a statement. Argu- ments may be specified following the macro name; each argument is seperated by a comma. Arguments may be empty. Arguments are stored for substitution in the macro body in the following manner: o Numbers are converted to hexadecimal (they also acquire a leading `$'). o All spaces outside strings are removed. o Keywords (such as register names, dot sizes and `^^' operators) are converted to lowercase. o Strings are enclosed in double-quote marks ("). 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/macro #Macros ( 34 ) For example, a hypothetical call to the macro `mymacro', of the form: mymacro A0, , 'Zorch' / 32, ^^DEFINED foo, , , tick tock will result in the translations: Arg# Expansion Comment ---- - -# 1 a0 "A0" converted to lowercase 2 empty 3 "Zorch"/$20 "Zorch" in double quotes, 32 in hex 4 ^^defined foo "^^DEFINED" in lowercase 5 empty 6 empty 7 ticktock spaces removed (concatenation) The `.exitm' directive will cause an immediate exit from a macro body. Thus the macro definition: .macro foo source .iif !\?source, .exitm ; exit if source is empty move source,d0 ; otherwise, deposit source .endm will not generate the move instruction if the argument `source' is missing from the macro invocation. The `.end', `.endif' and `.exitm' directives all pop- out of their include levels appropriately. That is, if a macro performs a `.include' to include a source file, an executed `.exitm' directive within the include-file will pop out of both the include-file and the macro. Macros may be recursive or mutually recursive to any level, subject only to the availability of memory. When writing recursive macros, take care in the coding of the termination condition(s). A macro that repeat- edly calls itself will cause the assembler to exhaust its memory and abort the assembly. _E_X_A_M_P_L_E _M_A_C_R_O_S The `Gemdos' macro is used to make file system calls. It has two parameters, a function number and the number of bytes to clean off the stack after the call. The macro pushes the function number onto the stack and does the trap to the file system. After the trap returns, conditional assembly is used to choose an ADDQ or an ADD.W to remove the arguments that were pushed. 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/macro #Macros ( 35 ) .macro Gemdos trpno, clean move.w #\trpno,-(sp) ; push trap number trap !1 ; do GEMDOS trap .if \clean <= 8 ; addq #\clean,sp ; clean-up up to 8 bytes .else ; add.w #\clean,sp ; clean-up more than 8 bytes .endif ; .endm The `Fopen' macro is supplied two arguments; the address of a filename, and the open mode. Note that plain MOVE instructions are used, and that the caller of the macro must supply an appropriate addressing mode (e.g. immediate) for each argument. .macro Fopen file, mode move.w #\mode,-(sp) ; push open mode move.l #\file,-(sp) ; push address of file name Gemdos $3d,8 ; do the GEMDOS call .endm The `String' macro is used to allocate storage for a string, and to place the string's address somewhere. The first argument should be a string or other expres- sion acceptable in a `dc.b' directive. The second argument is optional; it specifies where the address of the string should be placed. If the second argument is omitted, the string's address is pushed onto the stack. The string data itself is kept in the data segment. .macro String str,loc .if \?loc ; if loc is defined move.l #.\~,\loc ; put string's address there .else ; otherwise pea #.\~ ; push the string's address .endif ; .data ; put the string data .\~: dc.b r,0 ; in the data segment .text ; switch back to TEXT .endm The construction `.\~' will expand to a label of the form `.Mn' (where `n' is a unique number for every macro invocation), which is used to tag the location of the string. The label should be confined because the macro may be used along with other confined symbols. Unique symbol generation plays an important part in the art of writing fine macros. For instance, if we needed three unique symbols, we might write `.\~a' `.\~b' and 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/macro #Macros ( 36 ) `.\~c'. _R_E_P_E_A_T _B_L_O_C_K_S Repeat-blocks provide a simple iteration capability. A repeat block allows a range of statements to be repeated a specified number of times. For instance, to generate a table consisting of the numbers 255 through 0 (counting backwards) you could write: .count set 255 ; initialize counter .rept 256 ; repeat 256 times: dc.b .count ; deposit counter .count set .count - 1 ; and decrement it .endr ; (end of repeat block) Repeat blocks can also be used to duplicate identical pieces of code (which are common in bitmap-graphics routines). For example: .rept 16 ; clear 16 words clr.w (a0)+ ; starting at A0 .endr ; 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/6502 !6502 Mode ( 37 ) _6_5_0_2 _S_U_P_P_O_R_T MADMAC will generate code for the 6502 microprocessor. This chapter describes extra addressing modes and directives used to support the 6502. As the 6502 object code is not linkable (currently there is no linker) external references may not be made. Nevertheless, MADMAC may reasonably be used for large assemblies because of its performance. All standard 6502 addressing modes are supported, with the exception of the accumulator addressing form, which must be omitted (e.g. `ROR A' must be written as `ROR'). Five extra modes, synonyms for existing ones, are included for compatibility with the Atari Coinop assembler (MAC65). _A_D_D_R_E_S_S_I_N_G _M_O_D_E_S Syntax Description - -$ empty implied or accumulator (tsx, ror...) expr absolute or zero-page #expr immediate (expr,X) indirect X (expr),Y indirect Y (expr) indirect expr,X indexed X expr,Y indexed Y @expr(X) indirect X, same as "(expr,X)" @expr(Y) indirect Y, same as "(expr),Y" @expr indirect, same as "(expr)" X,expr indexed X, same as "expr,X" Y,expr indexed X, same as "expr,Y" While MADMAC lacks `high' and `low' operators, high bytes of words may be extracted with the shift (>>) or divide (/) operators, and low bytes may be extracted with the bitwise AND (&) operator. _D_I_R_E_C_T_I_V_E_S .6502 This directive enters the 6502 section. The loca- tion counter is undefined, and must be set with `.org' before any code can be generated. The `dc.w' directive will produce 6502-format words (low byte first). The 68000's reserved key- words (D0-D7/A0-A7/SSP/USP and so on) remain 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/6502 !6502 Mode ( 38 ) reserved (and thus unusable) while in the 6502 section. The directives GLOBL, DC.L, DCB.L, TEXT DATA, BSS, ABS, EVEN and COMM are illegal in the 6502 section. It is permitted, though probably not useful, to generate both 6502 and 68000 code in the same object file. .68000 This directive leaves the 6502 segment and returns to the 68000's text segment. 68000 instructions may be assembled as normal. .org location This directive is only legal in the 6502 section. It sets the value of the location counter to loca- tion an expression that must be defined, absolute, and less than $10000 . WARNING It is possible to assemble `beyond' the microprocessor's 64K address space, but attempting to do so will probably screw the assembler. DO NOT attempt to generate code like this: .org $fffe nop ; $FFFE nop ; $FFFF nop ; $10000 (boom!) as the third NOP in this example, at location $10000, may cause the assembler to crash or exhibit spectacular schizophrenia. In any case, MADMAC will give no warning before flak- ing out. _O_B_J_E_C_T _C_O_D_E _F_O_R_M_A_T This is a little bit of a kludge. An object file con- sists of a page map, followed by one or more page images, followed by a normal Alcyon 68000 object file. If the page map is all zero, it is not written. The page map contains a byte for each of the 256 256- byte pages in the 6502's 64K address space. The byte is zero ($00) if the page contained only zero bytes, or one ($01) if the page contained any non-zero bytes. If a page is flagged with a one, then it is written (in order) following the page map. The following code: 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/6502 !6502 Mode ( 39 ) .6502 .org $8000 .dc.b 1 .org $8100 .dc.b 1 .org $8300 .dc.b 1 .end will generate a page map that looks (to a programmer) something like: <$80 bytes of zero> $01 $01 $00 $01 <$7c more bytes of zero, for $100 total> Following the last page image is an Alcyon-format object file, starting with the magic number $601A. It may contain 68000 code (although that is probably use- less), but the symbol table is valid and available for debugging purposes. 6502 symbols will be absolute (not in text, data or bss). 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/errors Error Messages ( 40 ) _E_R_R_O_R _M_E_S_S_A_G_E_S Most of MADMAC's error messages are self-explanatory. They fall into four classes: warnings about situations that you (or the assembler) may not be happy about, errors that cause the assembler to not generate object files, fatal errors that cause the assembler to abort immediately, and internal errors that should never hap- pen. If you come across an internal error, we would appreciate it if you would contact Atari Technical Sup- port and let us know about the problem. You can write editor macros (or sed or awk scripts) to parse the error messages MADMAC generates. When a mes- sage is printed, it is of the form: "filename", line : message The first element, a filename enclosed in double quotes, indicates the file that generated the error. The filename is followed by a comma, the word `line', and a line number, and finally a colon and the text of the message. The filename "(*top*)" indicates that the assembler could not determine which file had the prob- lem. On UNIX, the filename "(stdin)" indicates the standard input file. The following sections list warnings, errors and fatal errors in alphabetical order, along with a short description of what may have caused the problem. _W_A_R_N_I_N_G_S bad backslash code in string You tried to follow a backslash in a string with a character that the assembler didn't recognize. Remember that MADMAC uses a C-style escape system in strings. label ignored You specified a label before a `macro', `rept' or `endm' directive. The assembler is warning you that the label will not be defined in the assem- bly. unoptimized short branch This warning is only generated if the `-s' switch is specified on the commandline. The message refers to a forward, unsized long branch that you could have made short (.s). 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/errors Error Messages ( 41 ) _F_A_T_A_L _E_R_R_O_R_S cannot continue As a result of previous errors, the assembler can- not continue processing. The assembly is aborted. line too long as a result of macro expansion When a source line within a macro was expanded, the resultant line was too long for MADMAC (longer than 200 characters or so). memory exhausted The assembler ran out of memory. You should (1) split up your source files and assemble them seperately, or (2) if you have any ramdisks or RAM-resident programs (like desk accessories) decrease their size so that the assembler has more RAM to work with. As a rule of thumb, pure 68000 code will use up to twice the number of bytes con- tained in the source files, whereas 6502 code will use 64K of ram right away, plus the size of the source files. The assembler itself uses about 80K bytes. Get out your calculator... too many ENDMs The assembler ran across an endm directive when it wasn't expecting to see one. The assembly is aborted. Check the nesting of your macro defini- tions --- you probably have an extra `endm'. _E_R_R_O_R_S .cargs syntax Syntax error in `.cargs' directive. .comm symbol already defined You tried to `.comm' a symbol that was already defined. .ds permitted only in BSS You tried to use `.ds' in the text or data sec- tion. .init not permitted in BSS or ABS You tried to use `.init' in the BSS or ABS sec- tion. .org permitted only in .6502 section You tried to use `.org' in a 68000 section. Cannot create: The assembler could not create the indicated 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/errors Error Messages ( 42 ) filename. External quick reference You tried to make the immediate operand of a MOVEQ, SUBQ or ADDQ instruction external. PC-relative expr across sections You tried to make a PC-relative reference to a location contained in another section. [bwsl] must follow `.' in symbol You tried to follow a dot in a symbol name with something other than one of the four characters `B', `W', `S' or `L'. addressing mode syntax You made a syntax error in an addressing mode. assert failure One of your `.assert' directives failed! bad (section) expression You tried to mix and match sections in an expres- sion. bad 6502 addressing mode The 6502 mnemonic will not work with the address- ing mode you specified. bad expression There's a syntax error in the expression you typed. bad size specified You tried to use an inappropriate size suffix for the instruction. Check your 68000 manual for allowable sizes. bad size suffix You can't use `.b' (byte) mode with the MOVEM instruction. cannot .globl local symbol You tried to make a confined symbol global or com- mon. cannot initialize non-storage (BSS) section You tried to generate instructions (or data, with `dc') in the BSS or ABS section. cannot use '.b' with an address register You tried to use a byte-size suffix with an address register. The 68000 does not perform 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/errors Error Messages ( 43 ) byte-sized address register operations. directive illegal in .6502 section You tried to use a 68000-oriented directive in the 6502 section. divide by zero The expression you typed involves a division by zero. expression out of range The expression you typed is out of range for its application. external byte reference You tried to make a byte-sized reference to an external symbol, which the object file format will not allow. external short branch You tried to make a short branch to an external symbol, which the linker cannot handle. extra (unexpected) text found after addressing mode MADMAC thought it was done processing a line, but it ran up against `extra' stuff. Check for dan- gling commas, etc. forward or undefined .assert The expression you typed after a `.assert' direc- tive had an undefined value. Remember that MADMAC is one-pass. hit EOF without finding matching .endif The assembler fell off the end of last input file without finding a `.endif' to match an `.if'. You probably forgot an `.endif' somewhere. illegal 6502 addressing mode The 6502 instruction you typed doesn't work with the addressing mode you specified. illegal absolute expression You can't use an absolute-valued expression here. illegal bra.s with zero offset You can't do a short branch to the very next instruction (read your 68000 manual). illegal byte-sized relative reference The object file format does not permit bytes con- tain relocatable values; you tried to use a byte- sized relocatable expression in an immediate 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/errors Error Messages ( 44 ) addressing mode. illegal character Your source file contains a character that MADMAC doesn't like (most control characters fall into this category). illegal initialization of section You tried to use `.dc' or `.dcb' in the BSS or ABS sections. illegal relative address The relative address you specified is illegal because it belongs to a different section. illegal word relocatable (in .PRG mode) You can't have anything other than long relocat- able values when you're generating a `.PRG' file. inappropriate addressing mode The mnemonic you typed doesn't work with the addressing modes you specified. Check your 68000 manual for allowable combinations. invalid addressing mode The combination of addressing modes you picked for the movem instruction are not implemented by the 68000. Check your 68000 reference manual for details. invalid symbol following ^^ What followed the `^^' wasn't a valid symbol at all. mis-nested .endr The assembler found a .endr directive when it wasn't prepared to find one. Check your repeat- block nesting. mismatched .else The assembler found a `.else' directive when it wasn't prepared to find one. Check your condi- tional assembly nesting. mismatched .endif The assembler found a `.endif' directive when it wasn't prepared to find one. Check your condi- tional assembly nesting. missing '=' missing '}' missing argument name missing close parenthesis ')' 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/errors Error Messages ( 45 ) missing close parenthesis ']' missing comma missing filename missing string missing symbol missing symbol or string The assembler expected to see a symbol/filename/string (etc), but found something else instead. In most cases the problem should be obvious. misuse of `.', not allowed in symbols You tried to use a dot (.) in the middle of a sym- bol name. mod (%) by zero The expression you typed involves a modulo by zero. multiple formal argument definition The list of formal parameter names you supplied for a macro definition includes two identical names. multiple macro definition You tried to define a macro which already had a definition. non-absolute byte reference You tried to make a byte reference to a relocat- able value, which the object file format does not allow. non-absolute byte value You tried to `dc.b' or `dcb.b' a relocatable value. Byte relocatable values are not permitted by the object file format. register list order You tried to specify a register list like D7-D0, which is illegal. Remember that the first regis- ter number must be less than or equal to the second register number. register list syntax You made an error in specifying a register list for a `.REG' directive or a `.MOVEM' instruction. symbol list syntax You probably forgot a comma between the names of two symbols in a symbol list, or you left a comma dangling on the end of the line. 8/12/87 Dyer MadMAC Reference Manual 0.13 mac/ terrors Error Messages ( 46 ) syntax error This is a `catch-all' error. undefined expression The expression has an undefined value because of a forward reference, or an undefined or external symbol. unimplemented addressing mode You tried to use 68020 `square-bracket' notation for a 68020 addressing mode. MADMAC does not sup- port 68020 addressing modes. unimplemented directive You have found a directive that didn't appear in the documentation. It doesn't work. unimplemented mnemonic You've found an assembler (or documentation) bug. unknown symbol following ^^ You followed a `^^' with a name the assembler didn't recognize. unsupported 68020 addressing mode The assembler saw a 68020-type addressing mode. MADMAC does not assemble code for the 68020 or 68010. unterminated string You specified a string starting with a single or double quote, but forgot to type the closing quote. write error The assembler had a problem writing an object file. This is usually caused by a full disk, or a bad sector on the media. 8/12/87 Dyer MadMAC Reference Manual 0.13 .  W.. SID+ DOC SID+ PRG gbcE About The 68000 Symbolic Interactive Debugger Plus Version 1.0 -? This is a new version of the well known the old SID68, the Digital Research Developpement Kit Debugger. This debugger is one of the best, there are little, hackers can use on their Atari ST, but there are a number of lacks, direct assembly, search function, extended mathematical and logical functions. SID suffer also of dirty line editor largely due to GEMDOS limits. This is why I decide do improve it a little for now. I add a search function, multiply, divide, and, or, eor, not, modify the dump memory and disassembly functions. The editor is always a line editor but with few adds-on. We'll see together SID Plus functions including original from the god father SID68... SID Plus functions - Let me first explain some details about these functions. I give the function name, the function synthax and then a litt:le commentary. LONG is for a long value of 32 bits, WORD for a word value of 16 bits, BYTE for a byte value of 8 bits. These values doesn't need to be written with full 8, 4, or 2 chars and are HEX value without $: i.e: LONG could be 42E12, WORD 356, BYTE 4... The size indicator is append to the function char and could be L for long operation, W for word operation, default is byte operation: i.e: SW 42563 or DL 456 896... Brackets, [], indicates facultatives parameters, s indicate the size indicator is working with this function, FILENAME is a string without ' or " nor wildcards. Function name Synthax About... - - - Call subroutine C LONG Execute the subroutine at LONG, on return display the value in the D0 register. i.e: C FC0020 Dump memory Ds [LONG1] [LONG2] Dump the memory in hex and ASCII [from LONG1] [to LONG2] Size indicator set the hex dump to byte/word/long. Add-on: ASCII chars from $20 to $FF are now displayed. i.e: DL 1000 Enter program E FILENAME Load a GEMDOS program, like TOS or GEM applications and prepare it to run. i.e: E SID+.PRG Fill memory Fs LONG1 LONG2 PATTERN Fill memory from LONG1 to LONG2 with a byte/word/long pattern following size id. i.e: FW F8000 F9000 124 Go G [LONG] Start execution from current PC value or at LONG. i.e: G FC0004 Hex math H [LONG1] [LONG2] List symbol table or exec math&logical functions. If neither LONG1, LONG2 are present list symbol table if in memory (it is part of some GEMDOS applications !!!). If LONG1 only present, return LONG, NOT LONG and ASCII of the low 8 bits of LONG1. IF LONG1 and LONG2, return LONG1 + LONG2, LONG1 - LONG2, LONG1 * LONG2, LONG1 / LONG2, LONG1 & LONG2, LONG1 | LONG2, LONG1 ^ LONG2. (* get low 16 bits of LONG1, LONG2, / get 16 bits of LONG2 give no error message for /0, return remainder in high 16 bits, quotient in low 16 bits. Add-on: *,/,&,|,^,~. i.e: H 123 456 Initialise Parameters I XXX Some applications, like TTP, need parameters. Edit them before launch the application. i.e: I SID.68K SID.PRG Junk Search Js LONG1 LONG2 PATTERN The long awaited search tool Search byte/word/long PATTERN from LONG1 to LONG2. i.e: JW FC0000 FC1000 4E71 Kiss SID Plus Position K Return the position of SID+ in memory. i.e: K List in mnemonics L [LONG1] [LONG2] Disassemble [from LONG1] ... Add-on: the object code is also displayed, ST LineA is now implemented. i.e: L FC0020 Move block M LONG1 LONG2 LONG3 Move block LONG1 to LONG2 at LONG3. Beware of overlapping. i.e: M F8000 F9000 FA000 Pass point P[LONG] Show if no LONG specified the list of passpoint sets. Else set passpoint to LONG. The breakpoint use allow you to stop program run anywhere. Do not put spaces between P and LONG. i.e: P2000 Quit Q Return to Desktop. Add-on: Avoid accidental use of the ^C keystroke to exit. i.e: Q Read file R FILENAME Read in memory a file. SID+ don't prepare it to run, it see it as a block of bytes. But you can modify this block and then save it with the Write File command. i.e: R SID.PRG Set memory Ss LONG Modify the memory, display old byte/word/long value and wait for a new. Enter . to exit. i.e: S FA000 Trace T [LONG] Trace, run program step by step. If LONG is present then made LONG step. Display the 68000 Registers and future instruction to be executed. i.e: T Untrace U [LONG] Like Trace but show the 68000 Registers and instruction after execution. i.e: U 10 View file position V Display the file loaded position in memory, and if it is a program info like TEXT,DATA,BSS position and length. i.e: V Write file W FILENAME Write a previously read file Do not write a program loaded with the Enter command. i.e: W SID.TOS eXamine registers X[REG] Set/Display a 68000 register X alone show all 68000 regs and the instruction to be executed. i.e: XD0 SID Plus line editsor - This new line editor is like the original SID68 line editor, GEMDOS C_CONRS function, but stop controls like ^C, ^Q, unimplemented keys like cursors or functions. You can now clear the screen with Shift-Clr, Homing the cursor with Home, clear the current line with Undo. I hope you do a good work with this debugger, The Wox y`JKj+/.M3rjB?< NA\ /0|CKEKhH/ ??<NMPL$RH\ g`RH\ mn0|CNHyp?< NA\a3rh#rd|_B?< NA\0|EKh"ZH/ ??<NMPLRH g`RH mn0|`Hyp?< NA\ HyK]?< NABgNA`#pNA/9pNuBrH?rHrB?< NA.@#rT yr h#rd3 rh"hNa.hL/9rdyrh?9rhByrjNsBrH?rHrB?< NA.@#rT yr h#rd0( @3rh"hNa.hL/9rd?9rhByrjNsJyrjf3rj#q3rh#rd#rX.yrT#r`Nh#r\ yr`|_Hr.yr ,o,rd-yr\-yrX=yrh n H?-yrF-yrJ9rhg-yrXJ,yrL?r 9rNu#r#q#pOrH"9qK‚ AlPpK A/?< NA\HyKX?< NA\ yp/(a/XHyKb?< NA\L.ypJyrjg#qNNNV|H3s:3sfByt> n ( "n ")Ё"n ")Ё./. Bg?<JatPBG`"0GrpB0GrpB.RG GmBrp#rt#rtr#rxByr|BBBn|a8. ///|Hyrp/. a O` .aR-@g n -f3rR`Byr nH`.a`./.aX`. ///|Hyrp/. R/.aO`n.a `b.a `V.Hyrp/.a`P`:.a`..|/.aX`. /.aX`./.aX`.a $`.az``./|/. /.a O `.a!`>/Hyrp/.a$O `BW/Hyrp/.a#O `b.|/.a'|X`L.|/.a'X`8.rp/.a/FX`&HyLda)```@A @b@0@K PN`JLN^NuNVHyLa)( nJ(g*././././. /./.a&ON^NuNVH *nHyMJa(R/ a~X> a(-HJFg M2FB(I` am zn H@`HRJfIBG`RRG  o mFmFfB@` JL0N^NuNVN^NuH J(o*L|T?<aTH@@ @bf`p @af`j @Gf H@ @7g`t @Rf` @Sf` @f`H@ @ f`m` m??<aVXRF`JL0Nu`v|(MTHyMya'HyMJa'`X|(MTHyMsa'HyMJa'`:|(MTHyMpa'lHyMJa'b```JFgSFSHyMva'BHyMza'8`FB`hNVv./Pa'DXJ@f a*8B@`Bn`0.H"N4n#@Rn n mBn`Rn n l..Pa*XJ@g" 2.AHЁ./Pa&XJ@fBn`D N2n2nrp!i. N2n2nrp!iRn nm-yrp-yrt-yrx=yr|-n|/./././././././././. n|NO(-@HyM}a%.a=HyMa%Bn`D0nrp"N4n!i.0nrp"N4n!iRn nm#rp#rt#rx3r|N^NuNV.Pa)p=@R n @fTR n 0m8 n 7n. nH@0@rp-h. .-@` a("B@``S.]/Pa% XJ@f .a(.J@g n -P` a'B@` ng .gR.Pa(.J@g ./Pa$XJ@fa'`` .-@.a'J@fa'`~ .2.HR-@`Ja(J@f^.a&HyMOa$"=| B?< aT-@-n .d .` .-@``0.`* nH>a&`, n>a&` n.a&j`` @g @g @g> a#\0.@R@n0.HѮ .c`> a#2 n<@RnDm-n .d .` .-@` nH>a&$R .c.?< aT> a" .c .2.HЁ"n "N^NuNV`R n  g-n`R n  g n  g nJf nB.?<=aT=@nHyMa"t`./<?.?<?aP gHyMa"B>?<>aT`f>?<>aT-nJg.?<HaT#KBB/.?<?<KatO -@dHyMa!` n0 n"n!i n"n!i  n"n!i n"n!i n"n!i n"n!i n!n n-h n"n Y n Y nB n!n n!n n!nJ nBh n"n  n"n aJg n./.aX3sf`3sf.a%VN^NuNVH.Pa$>.Y/Pa XJ@g` a#B@` Gg.g a#B@`v.Pa$ J@g.Q/Pa XJ@g` a#B@`L.Pa#J@g./Pa hXJ@g` a#ZB@`.a#J@fa#D` .b. Gf nJm Gf . nJl a#B@`B?< aTT-@`0`r .H"n nH".H@@g.a"`V ."n2 n0H".g.a"`2 n n g.a"`` @g @g @g0HѮ0HЮ".Rc^.?< aTJLN^NuNVH.Pa#>.Y/PaXJ@g` a"B@` Gg.g a!B@`.Pa"FJ@g.Q/PaXJ@g` a!B@`.Pa"J@g./PaXJ@g` a!B@`.a!J@fa!~` .b. Gf nJm Gf . nJl a!>B@`HB?< aT-@ .b -n-@ Gg& GgV Gg.?< aTTJLN^Nua"J@f n"n0.gRb`.R-Ha F> aN`nna!J@f n"nH(ngRb`.T-Ha> a`nna!J@fV n"n .H(H@(H(g Rb`$.R-Ha> a`NVH.?<=aXT=@./<?.?<?a8P yK!n  yK"yK!i ."yKѩ yK"yK!i ."yKѩ -|JfHyMaF3s:p` .ЮѮBW?./.?<BaP 9K$-@-n./.?.?<?azP/</.a6P=@Bn`8 n2.B@00@g yK2.Ү"A (ѩ Rn0.no0.JLN^NuNVH?>. BFv`> a,>a,>(a n2B@00=@@g >Ta`,.g >Da`.g >Ba`>AaHyMa.g >Ha`>VaHyMa n2. a~HyMa.gap`2BE`(0E2g H>aV`> aLRE Em Cfv`0H H@J@fa26RFGnJCf> aJLN^NuNVHyMa6N^NuNVHHyNa BW?<aTH am zn H@`H> a NfB@`pJLN^NuNVHBnBG` n 2 0 f0Ю @:( .mf B@0@gfga .Hf>.a.BF`.H>aRF Fl0F2 Pf .Hg>:a .Hg .hf > a`> aRnJnf RGysfo2Jng .hf> a0.JLN^NuNVN^NuNVHBG`0Ю @=h.H`*B@0.@g`.B@0.@f``p`` @Ag @Bg @Mg`.f.ga`BFz`pnl 0F `BH2F4 am,2F4 zn2F4HA`2F4HAgBERF FlJEfJEg n0 n2Ү"A p`RGysfoB@JLN^NuNVpN^NuNV 9K$-@.aJ@gHyNaX.aHyN-aD. a>Ha> aJysfl0HyNAaJKgHyNLa.Ka> a`HyN]a.a> a``.PaR nP.H` .aJ@g a`.`H09sfH"9rlmHyNoa` .PahR nP .,fa`RysfBn`B09sfЮ2.HЁ @R n ,gJ.g nP`B.Rn nmS.PaJ@g./PaXJ@fSysfa`\09sfЮ @!n .PaHJ@g ./PaXJ@g .=@`=|.aJ@fSysfa`09sfЮ @1n`.?9sf/.a\=@Jnl a```0.Ю @h@`.anJ@g,Bn`0.Ю @hRn0.ysfo`8.?9sf/.aZ\=@Jnla`D`0.Ю @h`$a`&`` @Ag @Hg6 @Rgn`> a>N^NuNV=|.aJ@g =ys:`.Pa: n (*f,R.Q/Pa\XJ@g.aJ@g .=@`T.Q/Pa4XJ@gB.aXJ@g6Bn` n2. 0 f=nRn0.n nJnm0.n o=|0.N^NuNV-|.a=@fj./PaXJ@g.gHyNab`.PaJ@g"./PapXJ@gJyrf|.aJ@gnJgfJyrgjJnga`ZBn`B0n"|szJpg,0n"|s 0f0nszBPByrRn n mJyrf`JngBn=|`0n"|szJpgRyr09r @o n la0=@ByrJng> a 0n"|sz>aHyNa(0n"|s.aHyNaJysfm4>H?<m?9t>/9K$0n"|s/0aO Rn n lJnf(> av`Bn`n0n"|szJpgX0n"|s 0f@0n"|szB@00H@B@H@f HyNaT` .2nsz2`Rn n m3rBn`F0n"|szJpf0 .2nsz20ns =| ByrRn n mJyrgHyNaHyNa`aN^NuNV lB@`">'aZ .>?<aT>'aBpN^NuNV nR n PH. fp` nSB@N^NuNVBn`0nszBPRn n mN^NuNV.Pa n -P./Pa.XJ@g-nBn`H n m a`b`6./PaXJ@g N2n!nRn`a`*.Pa2J@f.aJ@f aB@` n . azJ@f=|`aLBn`. N2n2n"v1Q0n v0JRn0.nm. aBn`0n v"N4n0Rn0.nma4 n -PBnBn`<0ns-P0n"|szJpg .f =|SnRn n lJng-n n PJf. aHyNaj`Jng0nsz PgJyrf>a . a0nr PNBg0nr PNCg . a`* .T-@ n=P n0J. a߀ n0 n -P0nsz Pc0nszSP` Bn. a*` Bn. aJng aJ@g& n"n N^NuNV.Pa^.aJ@g0Jysfm>sf/9K$aX` HyOa 6`x.Y/Pa TXJ@g~.avJ@gp> a .a> a .Fa> a .a4J@g> a >h?<b?9t>/9K$/.aO > a l`.Pa.J@g.Q/Pa XJ@g.aJ@g> a 0 .Ю.a> a  ..a> a 0..a> a B .Jg Jng.a> a ..a> a ..a> a ..a> a `aN^NuNVH n Pga`$ n &h*nRIB`RJfGJL8N^NuNVH.PaR.Y/Pa XJ@f .aJ@g n -P` abB@` .g aPB@`.PaJ@g".Q/Pa 4XJ@gBG` a$B@``-n~.a@J@g .c a B@`BF`aJ@fB?< a:T-@JKg(>v?<m?9t>/9K$/.aO @.a &HyMTa f#sZaa^.?< aT> a 09sVHѮRF n .c^JGg F mRJLN^NuNV.Pa .Y/Pa XJ@g` a B@`.Pa jJ@g.Q/Pa XJ@g` a B@`.Pa @J@g./Pa XJ@g`a B@`Z.a J@g .ca B@`?.B?<BaZP-@BW?.B?<BaDP./.?.?<?a.P-@g HyO&a>?<>a T n0 n!n n!n.a n N^NuNVH.Pa \>.Y/Pa^XJ@g` a PB@`f Gg.g a 8B@`N.a ^J@f a "B@`8.a > aB?< abT-@0`* nH>a `, n>a ~` n.a \`` @g @g @g.?< aT> a@|S/aX> a$ N.H=AHB(Jno~ ..fB@`|A-H`0 n am n zn nH@` nH"nR nJfA-H.Q/aXJ@g` a B@` R n  g nJf. Gf nJm Gf . nJl a B@`B?< aT-@0`| .H"n nHH".g.a r`^ ."n2 n0H".g.a H`4 n n ".g.a (`` @g @g @g.?< aTT0HѮ`JLN^NuNVH=ysf.Pa >W/PaX>./PaXJ@f-|.aJ@fa`4JngJyrg3sf` n * E< FJf. a HyOHa`0@ @N@fT E< E0J. a֒ E0`~JGgx0@ @ag 0@ @Nf^0@f=|`L0@ @af=|`8F? F8m F9f=|`=|`F8 Ff=|`=|`Bn-EBnBn`80n"|szJpg"0n"|s 0f =|SnRn n lJngJngJ0nsz Pc0nszSP`BJgJnfJyrf>ar. a NJngF0.Hڀ E< E0J. aծ=@=|`a. a*a n -@fBn`BnBn`80n"|szJpg"0n"|s 0f =|SnRn n lJngJng"0nsz Pc0nszSP`BnB n PJf. a fHyOna E0`JgJnfJyrf>aT. a 0. aԪ=@aJ@g BnBBnJnf E0` . a|=@Jng. a aJ@fJngB .SJf Jnf. a n"n 3sfJLN^NuNV.anJ@g . a`a(N^NuNV.PaR n Pga`N.?<AaXTBW/.?<?<>aTN^NuNVHyOax/.apHyOafN^NuNV> a0n"|sz>aHyOa80n"|s.a> aN^NuNVBn`J0n"|szJpg40nr2ns"Q00n"|s p0JRn n mN^NuNVBn`60n"|szJpg 0n"|s p2nr0Rn n mN^NuNV n g n g n g n gB@`pN^NuNVH. H>?<aѮT  f> ?<aњTJLN^NuNVH*nBG` H>aRGJf0JL N^ _.NNVH n Ph ..g .=g .@g .!f nR *@ nRR Mg$  g ,g +g -g /g *fJysfm>.s:/?<B/9K$ n/ "n"?a`O @gB@`p>Gg .=g ..g .gBG`dB.H`:-n`J-n nP`:-n n=P`*-n n-P`` @!g @.g @=g @@g-n`6BBG n*P`RGH>anH".Ё-@RH>a J@fS n n 0JL N^NuNVH. 0m 9o Am FoB@`pJLN^NuNVH. 0m 9n H@` `H@JLN^NuNVH.  l H@0`H@7JLN^NuNVH..<. :.`0YF 2H>a 0gBEJEgJFf H>a" FlJLN^NuNVBW?< /.a\N^NuNVBW?<0n/a\N^NuNVBW?<. HH/af\N^NuNVH~. B. b~.>aJLN^NuNVHyOaN^NuNVHyOa.ad> alN^NuNVR` nH>a"J@fB@``R nJfpN^NuNVH *n(UR  g ,gB@`2`R  gJfB@` ,gS*p`R`R  gS*pJL0N^NuNVH*nR`R UH>aJ@fSJL N^NuNVH *n(UR L Wf~` Lf~`~S*.a0JL0N^NuNVB?< a&TgB?<aTp``B@N^NuNVH *n0`HyOa\`BG`I0@HBF`0`&HyOa2`*HyPa&`HyPa``J@g @g @g0`HyP a`HyPa` ` J@g @gHyPa.aPHyP aRF Fmz> avRG GmVHyP$a.aJHyP9a.a8`DHyPYav.a$HyPbad -Э.Sa ``J@g @g @g> aJL0N^NuNV.a~J@g. a```.HyPnaXJ@g. HyPqahX`8.HyPtaXJ@g4. XHyPxa>XJ@g n ( f n "n !iJ`.HyP|aVXJ@g4. PHyPaXJ@g n ( g n "n !iJ`.HyPaXJ@gB.  HyPaX n ( g n "n !iJ` n "n !iJ`PR n Df. /.?<Da\`( n Af. ./.?<Aa\`a n ( g n "n !iJ` n "n !iJN^NuNVH*nHyPah.a> a HyPaP.a> aHyPa6.a> aHyPa>- >aHyPa0@g HyPa g HyPaHyPa0@@>W0ag HyPag HyPag HyPag HyPag HyPaz> a8.?<DaT..?<AaT#sZB?< aT-@>h?<m?9t>/9K$/aO HyMTa a aJL N^NuNVH*n R M 0m< 7n6.a J@g,n UB.H@HЮ.@/YaX`aJL N^NuNV>/. /.a4PN^NuNVBW/. /.aPN^NuNV>/. /.aPN^NuNVH *n(n >.BE/ a >=a0`.BW?</ah\`4H>a`(>a` .a``J@g @g @g @g> a|S/adX> ar.Ho0FB(A-H`0 n am n zn nH@` nH"nR nJfA-H./afXJ@g^.aJ@gR0`4 .(`< .H`, .8`(``J@g @g @g @gz`.a(J@fa0JL0N^NuNVH. H>af> a^BG`&> aR n .a8X Gf> a6RG Gm> a&JLN^NuNVH *n(n anJL0N^NuNVH *n(n Jg RHgJf.apJ@gp``B@JL0N^NuHJHyM]a*ysZ<9sV>aUFfJL @NuNVHB9sN 9sZT#s63sV ysZ3s4*|P`0ys4mgK `/-axHycanJmm4 mn*Jmg0-`a(`a2`a`a,`a`a`aR`a`a`a `aF`a`za`ra`jaV`bap`Za`Ra`LaZ`Fa`@a|`:a`4a`.a`(a`"a`a "`` @b@0@[ PNJ9sNg6> a*>H9sNH??9t>/9K$/9sPafO `>?aJL N^NuNVHycaN^NuNVH>9s4Gp g9s5g>s4Wa l>,a>a ^`>s4Wa>,a>aJLN^NuNVH>9s4Gp g09s4@ @f|09s4@ @f|PG` <9s4FF Gn 9s4f">?9s4W?a T>,a>a `` >a X>,a>?9s4W?a TJLN^NuNVH>9s4GG>a >,a09s4`,Hyca`6Hyca`*>?9s4W?a $T`H |\`rW hNJLN^NuNVH>9s4Gp gJGf~Hycaj0H>a\>,a>?9s4W?a TJLN^NuNVH>9s4GJGf Hyca` Gf Hyda>?9s4W?a fT Gf Hyda` Gf Hyd aJLN^NuNVH>9s4Gp g9s5g>a`JGf~>#aX0H>a>,aF>s4WaJLN^NuNV>?9s4W?aTN^NuNVH9s5HJGg :Gs6` ys60H*@s6Ts6TysVHyda.aJL N^NuNVH>?9s4W?aLT>,a>9s4Gp g>aJLN^NuNV9s4g09s4@r `>a`>a>,aF>?9s4W?aTN^NuNVH>s4Wa>,a>9s4Gp g>aJLN^NuNVH>s4Wa<>,a ys60H*@s6Ts6TysV.aJL N^NuNVH>9s4Gp g<9s4F:9s4E EHfPGPF` EfPF>a>,aZ>aJLN^NuNVH>9s4G>aJLN^NuNV>s4WaHydaF ys6>aTs6TysVN^NuNVH<9s4F0 FfBG` F0f~` F f~`a>?9s4W?aVT>,a<9s4Fp f09s4@@@>?a(TJLN^NuNVH>9s4G9s5gHyda>a`>aHydanJLN^NuNVH ys6>Ts6TysV9s4g,>?9s4W?aT>,a>/<\aX`J09s4@8 @ f>/<\aX`>/<\aX>,a>?9s4W?a:TJLN^NuNVH>9s4G Gf09s4@r `>a>,aP ys6<>a\>s4Wa Gf>,a&09s4@r `>azTs6TysVJLN^NuNVHyd a(09s4@H>a>,a09s4@r `>a(N^NuNV>aN^NuNV>s4WaN^NuNVHyd#a09s4@H>aN^NuNVH ys6:Ts6TysV>G<Fp fF9s5g>a>,a*0`>Hyd&aV`JHyd*aJ`>Hyd.a>`2Hyd2a2`&Hyd6a&``J@g @g @g @g`9s5f>,a>a JLN^NuNVH<9s4F ys6:Ts6TysV>Gp gG g>a>,af>?9s4W?aT9s4f>,aB>aJLN^NuJHyca`>s4WaJNuNVH<. *nzBG`<0]g$JEf>/a Eg>aH>-az` Ef >SWa.BERG Gm Ef HydOaJL N^NuNV>D`NV>Aa>a>a~N^NuNV>(an>a>)a`N^NuNV>(aP>a>)aBN^NuNV>-a2>aN^NuNV>a>+aN^NuNV#sPmsN>?< /.a\N^NuNV>?<0n/al\N^NuNV>?<. HH/aL\N^NuNVHydRaN^NuNVH>. Go >QWa`>aJLN^NuNVH ys6>Ts6TysV>$aJ>a^JLN^NuNVH ys6>Ts6TysV>$a0@H>a>>(a nf Hydga(`>aN>,a0r `>Wa4 g Hydka>)aJLN^NuNVB nf ys6=PTs6TysV ys6=PTs6TysVHydna.aLN^NuNVH<.F8F>.G0`>a`>a`>a`>a`>a`a>a`>a`B0` ys60H( gTs6TysV.a`z ys6=PTs6TysV ys6=PTs6TysV>$a~.af`:aHydqa`*>a$` > a`` @b@0@\ PN`` @b@0@\ PNJLN^NuNVH?BCB..,. f#r <`hlDRCJlDRCn8fzB`0 l :HGH`xe`Jge` CfD#r D`#r JLN^NuBus ErrorAddress ErrorIllegal InstructionZero DivideCHK ExceptionTRAPV ExceptionPrivilege ViolationTrace ExceptionLine 1010 EmulatorLine 1111 Emulator at f 2JJJJJJKK"K2KENNNNNNNNNN\h~$:FRVzAvailable commands are C, D, E, F, G, H, I, J, K, L, M, P, Q, R, S, T, U, V, W, X bcEe68000 Symbolic Interactive Debugger Plus Version 1.0 (C) Copyright 1984-1985 Digital Research Inc. (P) Public Domain 1987 The Wox Ok  CCCCCCCC EHD KReturn value h Cannot open program file Can not read program file program load error No symbols )() = Long COBOL-style symbol Continue listing? (y/n)SID begins at H with basepage at No symbolsfile header at Symbol table at Symbol table full No change--Address must be even! Already set Too many pass points--limit is 32 Encountered the ILLEGAL instruction No symbols Cannot open file File too big -- read truncated. Encountered the ILLEGAL instruction Encountered the ILLEGAL instruction Unimplemented Function PASS ? Bad or non-existent RAM at ERROR, no program or file loaded.text data bss base length = base page address = initial stack pointer = Start = End = PCPCUSPUSPSSPSSPSTSTPC=USP=SSP=ST==>TR SUP IM= EXT NEG ZER OFL CRY<] |] <] |]!J](J]0J]8Nq]@<]D|]JNp]PNt]VNs]ZNw]^Nu]bNr]fNv]kNz]qP ]wQ ]{R ]S ]T ]U ]V ]W ]X ]Y ]Z ][ ]\ ]] ]^ ]_ ]H]H]NP]N`]Nh]H@]NX]N@]]@]^^@^^^^!@ ^% ^* ^/ ^4B^9B@^?B^E ^K @^R ^Y ^` @^g ^nN^uN^y^}^B^D^F^@^L^L^H^H^^@^^H^D^D@^D^@^@@^@^F_F@_ F__@__#H@_)_-_1_5_:P_?Q_BR_ES_IT_MU_QV_UW_YX_]Y_aZ_e[_i\_m]_q^_u__y_}@__J_J_J@_J_b_c_d_e_f_g_h_i_j_k_l_m_n_o_`_a____@_р`` H`ш`@ `H `" `&`*@`0`6 `<``B`H`N@`T`Z ````f`l `rH `y ``H``(`h```H``(`h```H````X``8axaa aXaa8a%xa+a1a7Pa>aE0aLpaSaZaaPahao0avpa}aaaa@aaaHaaa@aЀaa@aрaaaPaP@aPab@b bb@bb$@ b* b/ b4 b9A b>bB@bHbNbTb[ bb bgbl@brbxAb~0@b @b b bb@bbb@bbb@bbb@bbbbQbQ@bQbpcc 0c ccc#c,c5c>cHcQcZca ci cs c} c cccccc< <(<0<8<@>>>>>>@ @  @ @INIIIIHIIII"I,I:IDandi.bandi.weori.beori.willegalillegalillegalnopori.bori.wresetrtdrtertrrtsstoptrapvmovecdbtdbfdbhidblsdbccdbcsdbnedbeqdbvcdbvsdbpldbmidbgedbltdbgtdbleext.wext.llinkmove.lmove.lswapunlktrapaddi.baddi.waddi.landi.bandi.wandi.laslasrbchgbclrbsetbtstclr.bclr.wclr.lcmpi.bcmpi.wcmpi.leori.beori.weori.ljmpbsrlsllsrmove.wmove.wmove.wmove.wmovem.wmovem.lmovem.wmovem.lmoves.bmoves.wmoves.lnbcdneg.bneg.wneg.lnegx.bnegx.wnegx.lnot.bnot.wnot.lori.bori.wori.lpearolrorroxlroxrstsfshislssccscssneseqsvcsvssplsmisgesltsgtslesubi.bsubi.wsubi.ltas.btst.btst.wtst.lbhiblsbccbcsbnebeqbvcbvsbplbmibgebltbgtblebrabsrabcdabcdaddx.baddx.waddx.laddx.baddx.waddx.lexgexgexgasl.basl.wasl.lasl.basl.wasl.lasr.basr.wasr.lasr.basr.wasr.lcmpm.bcmpm.wcmpm.llsl.blsl.wlsl.llsl.blsl.wlsl.llsr.blsr.wlsr.llsr.blsr.wlsr.lmovep.wmovep.lmovep.wmovep.lrol.brol.wrol.lrol.brol.wrol.lror.bror.wror.lror.bror.wror.lroxl.broxl.wroxl.lroxl.broxl.wroxl.lroxr.broxr.wroxr.lroxr.broxr.wroxr.lsbcdsbcdsubx.bsubx.wsubx.lsubx.bsubx.wsubx.ladd.badd.wadd.ladd.badd.wadd.ladda.wadda.laddq.baddq.waddq.land.band.wand.land.band.wand.lbchgbclrbsetbtstchkcmp.bcmp.wcmp.lcmpa.wcmpa.ldivsdivueor.beor.weor.lleamovea.wmovea.lmulsmuluor.bor.wor.lor.bor.wor.lsub.bsub.wsub.lsub.bsub.wsub.lsuba.wsuba.lsubq.bsubq.wsubq.lmoveq.lmove.bmove.wmove.lInitPutPixelGetPixelDrawLineDrawHLineDrawFRecDrawFPolBitBltTextBltShowMouseHideMouseTransMouseEraseSpriteDrawSpriteCopyRasterSeedFilllinealinefunknown instruction illegal instruction format # SRCCR#$SR,CCR,,CCR,SR$,#$USP,,USP#$#$SFCDFCUSPVBRillegal Control RegisterA7 illegal size field PC,.l#$(PC)8 6         D 64 T> >N4   D &R2J$ 8   ,^$.\$ "  T 2 pTj|2 * > pJ NZt"" $