Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!watmath!clyde!caip!cbmvax!amiga!pyramid!decwrl!decvax!cwruecmp!bammi From: bammi@cwruecmp.UUCP Newsgroups: net.micro.atari16 Subject: Re: (none) Message-ID: <1556@cwruecmp.UUCP> Date: Sun, 17-Aug-86 00:02:41 EDT Article-I.D.: cwruecmp.1556 Posted: Sun Aug 17 00:02:41 1986 Date-Received: Tue, 19-Aug-86 07:47:08 EDT References: <8608161503.AA07385@ucbvax.Berkeley.EDU> Reply-To: bammi@cwruecmp.UUCP (Jwahar R. Bammi) Organization: CWRU Dept. Comp. Eng., Cleveland OH Lines: 489 In article <8608161503.AA07385@ucbvax.Berkeley.EDU> TAYLOR@NOCMI.BITNET writes: >I am having some problems using the line a sprite definition. I can draw and >undraw the things, but getting the pointers to the definition block appears >to have eluded me. No matter what I do to the listed registers, the sprite >is never my sprite | Can anyone help with a little more info on these functions >please ? > > thanks in anticipation > > aRTy Here is a little example from this months issue of STuser magazine that i hope will help. The parameters are set up for a monochrome monitor, but it should be trivial to convert to color (see comments). You will also need asmstart.s that i am also including. Assemble both using the developers system, and link as follows: link68 sprite.68k=asmstart,sprite relmod sprite ---- #!/bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #!/bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # asmstart.s # sprite.s # This archive created: Sat Aug 16 23:59:52 1986 # By: Jwahar R. Bammi () export PATH; PATH=/bin:$PATH echo shar: extracting "'asmstart.s'" '(1959 characters)' if test -f 'asmstart.s' then echo shar: over-writing existing file "'asmstart.s'" fi sed 's/^X//' << \SHAR_EOF > 'asmstart.s' X****************************************************************************** X* X* Assembler runtime startup for CP/M-68k. X* Adapted from C runtime startup from Atari. X* X****************************************************************************** X* Xltpa=0 * Low TPA address Xhtpa=4 * High TPA address Xlcode=8 * Code segment start Xcodelen=12 * Code segment length Xldata=16 * Data segment start Xdatalen=20 * Data segment length Xlbss=24 * Bss segment start Xbsslen=28 * Bss segment length Xfreelen=32 * free segment length Xresvd=36 * Reserved Xfcb2=56 * 2nd parsed fcb Xfcb1=92 * 1st parsed fcb Xcommand=128 * Command tail Xprtstr=9 * Print string BDOS Call Xexit=0 * BDOS exit call X.globl __main X.globl __exit X.globl __base X X .text X* X* Must be first object file in link statement X* X move.l a7,a5 * save a7 so we can get the base page address X move.l 4(a5),a5 * a5=basepage address X move.l a5,__base * save for C startup X move.l $c(a5),d0 X add.l $14(a5),d0 X add.l $1c(a5),d0 X add.l #$500,d0 * d0=basepage+textlen+datalen+bsslen X* (plus 1K of user stack) X move.l d0,d1 X add.l a5,d1 * compute stack top X and.l #-2,d1 * ensure even byte boundary X move.l d1,a7 * setup user stack, 1K above end of BSS X X move.l d0,-(sp) X move.l a5,-(sp) X clr.w -(sp) * junk word X move #$4a,-(sp) * return excess storage X trap #1 X add.l #12,sp X X X move.l __base,a0 * Load C external X move.l lbss(a0),a1 * a1 -> bss region X adda.l bsslen(a0),a1 * a1 -> 1st heap loc X X move.l a1,__break * Put in "break" loc X lea.l command(a0),a2 * a2 -> command line X move.b (a2)+,d0 * d0 = byte count X andi.l #$ff,d0 * clear junk X move.w d0,-(a7) * push length X move.l a2,-(a7) * Push commnd X clr.l a6 * Clear frame pointer X jsr __main * call main routine X* No Need to jmp __exit call "exit" X X__exit: move.w #exit,d0 * Exit X trap #2 * now X X .bss X .even X__base: .ds.l 1 * -> Base Page X__break .ds.l 1 * first break location X X .end SHAR_EOF if test 1959 -ne "`wc -c 'asmstart.s'`" then echo shar: error transmitting "'asmstart.s'" '(should have been 1959 characters)' fi echo shar: extracting "'sprite.s'" '(5512 characters)' if test -f 'sprite.s' then echo shar: over-writing existing file "'sprite.s'" fi sed 's/^X//' << \SHAR_EOF > 'sprite.s' X* X* sprite demonstarator X* X X* Aline Equates Xinit equ $A000 ; init line a Xdrsprite equ init+13 ; draw sprite Xunsprite equ init+12 ; undraw sprite Xshow_mou equ init+9 ; show mouse Xhide_mou equ init+10 ; hide mouse X Xv_x_max equ -12 ; max x pixel value X X* Gemdos Equate Xc_conin equ 1 X X* Bios eqautes Xbconout equ 3 Xconsole equ 2 X X* General equates XCR equ 13 XNULL equ 0 XESC equ 27 X X .text ; now that all the BS is out of the way X X* Get a Key Xkey: X move.w #c_conin,-(sp) X trap #1 X addq.l #2,sp X rts X X* Write string in a4 - 1st byte is (count - 1) Xwstring: X clr.l d4 X clr.l d5 X move.b (a4),d4 X_wloop: X add.l #1,a4 X move.b (a4),d5 X move.w d5,-(sp) X move.w #console,-(sp) X move.w #bconout,-(sp) X trap #13 X addq.l #6,sp X dbra d4,_wloop X rts X X* Read a string into text Xrstring: X lea text,a3 X_rloop: X move.w #c_conin,-(sp) X trap #1 X addq.l #2,sp X cmp.b #CR,d0 X beq _rend ; the end? X move.b d0,(a3)+ X bra _rloop X_rend: X move.b #NULL,(a3) ; terminate string X rts X X .globl __main X X__main: X lea sprite,a5 X X lea scdat,a4 X bsr wstring X bsr rstring ; get paper color X bsr xint ; to int X move.w d5,6(a5) ; into sprite block X X lea data1,a4 X bsr wstring X bsr rstring ; get int color X bsr xint ; to int X move.w d5,8(a5) ; into sprite block X X lea data2,a4 X bsr wstring X bsr key_v_x ; get format X X lea data3,a4 X bsr wstring X bsr key_d_v ; read delay type X X lea data4,a4 X bsr wstring X bsr rstring ; get step size X bsr xint ; to int X lea step_siz,a3 X move.w d5,(a3) X beq __main ; step size of 0? let him have it X X lea data5,a4 X bsr wstring X X .dc.w init ; Init Aline d0,a0 = addr of Aline vars X X move.w v_x_max(a0),a5 X sub.w #9,a5 ; xlimit X X .dc.w hide_mou ; hide the critter X Xsproff: X move.w #0,d0 X move.w #16,d1 X lea sprite,a0 X lea saveblk,a2 X Xloop: X movem.l d0-d2/a0-a4,-(sp) X X .dc.w drsprite X X lea hold,a4 X move.w (a4),d0 X bne do_vblnk ; wait for Vblank X X move.w #2000,d0 Xwait: X dbra d0,wait X bra no_wait X Xdo_vblnk: X move.w #37,-(sp) X trap #14 X addq.l #2,sp X Xno_wait: X lea saveblk,a2 X X .dc.w unsprite X X movem.l (sp)+,d0-d2/a0-a4 X lea step_siz,a3 X add.w (a3),d0 X cmp.w a5,d0 X ble loop X X bsr key X cmp.b #CR,d0 ; CR start all over again X beq __main X cmp.b #'q',d0 ; quit X beq exit X bra sproff ; do again with same parameters X Xexit: X .dc.w show_mou X move.w #0,-(sp) X trap #1 X addq.l #2,sp X rts X X* extract 2 digit integer in text Xxint: X lea text,a3 X clr.l d4 X clr.l d5 X move.w (a3),d4 X tst.b d4 X bne digit2 X lsr #8,d4 Xdigit2: X sub #48,d4 X move.b d4,d5 X lsr #8,d4 X beq digit ; isnt one X add.l #10,d5 ; assume its a '1' Xdigit: X cmp #15,d5 ; too high ? X bgt error X rts X X* general error, make him restart Xerror: X addq.l #4,sp ; pop return address X jmp __main X X* get format (V)di or (X)or Xkey_v_x: X bsr key X lea sprite,a3 X cmp.b #'x',d0 X beq key_x X cmp.b #'v',d0 X beq key_v X lea err,a4 X bsr wstring X bra error Xkey_v: X lea Vdi,a4 X bsr wstring X move.w #1,4(a3) X rts Xkey_x: X lea Xor,a4 X bsr wstring X move.w #-1,4(a3) X rts X X* Get delay type (d)elay or (v)blank Xkey_d_v: X bsr key X lea hold,a5 X cmp.b #'d',d0 X beq key_d X cmp.b #'v',d0 X beq key_vv X lea err,a4 X bsr wstring X bra error X Xkey_vv: X lea Vblnk,a4 X bsr wstring X move.w #1,(a5) X rts Xkey_d: X lea Delay,a4 X bsr wstring X move.w #0,(a5) X rts X X X .data X .even XVdi: dc.b 3 X dc.b 8,'Vdi' X X .even XXor: dc.b 3 X dc.b 8,'Xor' X X .even XDelay: dc.b 5 X dc.b 8,'Delay' X X .even XVblnk: dc.b 6 X dc.b 8,'Vblank' X Xerr: dc.b 6 X dc.b 8,'Error!' X .even X X .even X* sprite block Xsprite: X dc.w 0,0 ; x,y X dc.w -1 ; 1 = vdi -1=xor X dc.w 0 ; background color X dc.w 0 ; foreground color X Xpattern: dc.w $ffff X dc.w $03c0 X dc.w $ffff X dc.w $0ff0 X dc.w $ffff X dc.w $1ff8 X dc.w $ffff X dc.w $3ffc X dc.w $ffff X dc.w $73ce X dc.w $ffff X dc.w $73ce X dc.w $ffff X dc.w $ffff X dc.w $ffff X dc.w $ffff X dc.w $ffff X dc.w $fbdf X dc.w $ffff X dc.w $f81f X dc.w $ffff X dc.w $ffff X dc.w $ffff X dc.w $67e6 X dc.w $ffff X dc.w $300c X dc.w $ffff X dc.w $1ff8 X dc.w $ffff X dc.w $0420 X dc.w $ffff X dc.w $1818 X X .even Xscdat: X dc.b 131 ; unsigned of course X dc.b ESC,'E' ; cls X dc.b ESC,'b',1 ; black ink X dc.b ESC,'c',0 ; white paper X dc.b ESC,'Y!*' ; goto 1,10 X dc.b ESC,'p' ; inv video X dc.b 'Sprite demonstrator' X dc.b ESC,'Y%%pap_col(0-15)' ; at 5,5 X dc.b ESC,'q' ; normal X dc.b ESC,'Y)%ink_col(0-15)' ; at 9,5 X dc.b ESC,'Y-%format(XOR/VDI)' ; at 13,5 X dc.b ESC,'Y1%sync(delay/vblnk)' ; at 17,5 X dc.b ESC,'Y5%step_size(1-15)' ; at 21,5 X dc.b ESC,'Y&&' ; cursor to 6,6 X Xdata1: X dc.b 41 X dc.b ESC,'Y%%pap_col(0-15)' ; at 5,5 X dc.b ESC,'p' ; inverse X dc.b ESC,'Y)%ink_col(0-15)' ; at 9,5 X dc.b ESC,'q' ; normal X dc.b ESC,'Y*&' ; 10, 6 X Xdata2: X dc.b 43 X dc.b ESC,'Y)%ink_col(0-15)' ; at 9,5 X dc.b ESC,'p' ; inverse X dc.b ESC,'Y-%format(XOR/VDI)' ; at 13,5 X dc.b ESC,'q' ; normal X dc.b ESC,'Y.&' ; 14, 6 X Xdata3: X dc.b 47 X dc.b ESC,'Y-%format(XOR/VDI)' ; at 13,5 X dc.b ESC,'p' ; inverse X dc.b ESC,'Y1%sync(delay/vblnk)' ; at 17,5 X dc.b ESC,'q' ; normal X dc.b ESC,'Y2&' ; X Xdata4: X dc.b 47 X dc.b ESC,'Y1%sync(delay/vblnk)' ; at 17,5 X dc.b ESC,'p' ; inverse X dc.b ESC,'Y5%step_size(1-15)' ; at 21,5 X dc.b ESC,'q' ; normal X dc.b ESC,'Y6&' ; X Xdata5: X dc.b 22 X dc.b ESC,'Y5%step_size(1-15)' ; at 21,5 X dc.b ESC,'Y ' ; X* vars X .bss X .even Xsaveblk: ds.b 74 ; for mono X* saveblk: ds.b 266 ; for color X Xstep_siz: ds.w 1 Xhold: ds.w 1 Xtext: ds.w 8 X X end SHAR_EOF if test 5512 -ne "`wc -c 'sprite.s'`" then echo shar: error transmitting "'sprite.s'" '(should have been 5512 characters)' fi # End of shell archive exit 0 -- Jwahar R. Bammi Usenet: .....!decvax!cwruecmp!bammi CSnet: bammi@case Arpa: bammi%case@csnet-relay CompuServe: 71515,155