home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
100.lha
/
stars68.asm
< prev
next >
Wrap
Assembly Source File
|
1986-11-20
|
14KB
|
547 lines
* stars.asm - by A. Tuline
* revised for the Gibbs A68k Assembler by Tom Eshelman
* This assembler demands labels in column 1 - period!
INCLUDE "exec/types.i"
INCLUDE "intuition/intuition.i"
INCLUDE "graphics/rastport.i"
INCLUDE "exec/ports.i"
* Macros
SYS MACRO
JSR _LVO\1
ENDM
* exec calls
EXTERN_LIB OpenLibrary ; (libName,version)(A1,D0)
EXTERN_LIB CloseLibrary ; (libbNode)(A1)
EXTERN_LIB GetMsg ; (msgPort)(D0)
EXTERN_LIB ReplyMsg ; (message)(A1)
EXTERN_LIB Wait ; (signalSet)(D0)
* intuition calls
EXTERN_LIB OpenWindow ; (newWindow)(A0)
EXTERN_LIB CloseWindow ; (Window)(A0)
EXTERN_LIB OpenScreen ; (newScreen)(A0)
EXTERN_LIB CloseScreen ; (Screen)(A0)
EXTERN_LIB ShowTitle ; (Screen,ShowIt)(A0,D0)
* graphics calls
EXTERN_LIB Draw ; (rp,x,y)(A1,D0,D1)
EXTERN_LIB Move ; (rp,x,y)(A1,D0,D1)
EXTERN_LIB ReadPixel ; (rp,x,y)(A1,D0,D1)
EXTERN_LIB SetAPen ; (rp,pennum)(A1,D0)
EXTERN_LIB SetDrMd ; (rp,drawmode)(A1,D0)
EXTERN_LIB SetRGB4 ;(viewPort,register,r,g,b)(A0,D0/D1/D2/D3)
EXTERN_LIB WritePixel ; (rp,x,y)(A1,D0,D1)
EXTERN_LIB SetRast ; (rp,pennum)(A1,D0)
* externally defined variables
XREF _AbsExecBase ; see amiga.lib
******************************
* Start of Code *
******************************
startup:
move.l a7,savesp ;save present stack ptr for return.
movea.l _AbsExecBase,a6 ;move into Sysbase
lea.l IntLibArgs,a1 ;args into a1
moveq #0,d0 ;any version
SYS OpenLibrary(a6) ;open Intuition Library
move.l d0,IntBase ;save this library base
beq openerr
* Open Graphics Library
movea.l _AbsExecBase,a6
lea.l GrafLibArgs,a1
moveq #0,d0
SYS OpenLibrary(a6)
move.l d0,GrafBase ;save this library base too.
beq openerr
* Open a screen
movea.l IntBase,a6
lea screenvars,a0
SYS OpenScreen(a6)
move.l d0,newscreenptr ;save the ptr to our screen
beq openerr
add.l #sc_RastPort,d0 ;find rastport offset
move.l d0,myraster ;save a pointer to the rastport
sub.l #sc_RastPort,d0 ;return to the screen ptr.
add.l #sc_ViewPort,d0 ;find viewport offset
move.l d0,myview ;save pointer to the viewport
movea.l IntBase,a6 ;hide the screentitle routine
move.l newscreenptr,a0
move.l #0,d0 ;cause it to be hidden
SYS ShowTitle(a6)
* Open a window
movea.l IntBase,a6
lea windowvars,a0
SYS OpenWindow(a6)
move.l d0,newwindowptr ;save ptr to our new window
beq openerr
setcolours:
* Set the background to black and the other to blue.
movea.l GrafBase,a6
movea.l myview,a0
move.l #0,d0 ; set color register 0 to:
moveq #0,d1 ; red +
moveq #0,d2 ; green +----> black
moveq #0,d3 ; blue +
SYS SetRGB4(a6)
move.l GrafBase,a6
move.l myview,a0
move.l #1,d0 ; set color register 1 to:
move.b #10,d1 ; red +
move.b #10,d2 ; green +----> blue
move.b #15,d3 ; blue +
SYS SetRGB4(a6)
* Set the drawing mode
movea.l GrafBase,a6
movea.l myraster,a1
move.b RP_JAM1,d0
SYS SetDrMd(a6)
* At this point, at least the screen and window are set up well enough
* to work without too much fuss. TJE 1/12/88
* I don't like unusual jsr calls. Hence, the revision.
starinstall:
lea pont,a3 ;an array of 1024 data bytes
lea pontend,a4 ;a4 holds address of 1 byte of data
redostars:
jsr starun
jsr getmsg ; d0 has pointer to message
; jsr replymsg
tst.l d0
beq redostars ; jump back if no message pointer
move.l d0,a0
move.l im_Class(a0),d0
andi.l #CLOSEWINDOW,d0
beq redostars ; jump back if not CLOSEWINDOW msg
* jsr replymsg ; should be right after getmsg
stopprog:
jsr closeall
exitprog:
movea.l savesp,a7
rts
**********************************
* End of program. 'main'.
**********************************
newstars:
jsr point_maker
add.w #lenth,a3
cmpa.l a4,a3
blt newstars ;infinite loop.
move.b #1,speed ; initialize various parmeters
move.w #160*64,x_centre
move.w #99*64,y_centre
move.w #0,x_abs
move.w #0,y_abs
rts
starun:
lea pont,a3
lea pontend,a4
starup:
move.b speed,d4
move.w xold_st(a3),d2
move.w d2,d5
sub.w x_centre,d5
asr.w d4,d5 ; shift delx by speed factor
move.b dx_st(a3),d4
asr.w d4,d5 ; distance across factor
add.w d5,d2
sub.w x_abs,d2
sub.w x_abs,d2
cmp.w #x_rang,d2
bcc str_out_rang
cmp.w #xlower,d2
bls str_out_rang
move.w d2,xnew_st(a3)
move.b speed,d4
move.w yold_st(a3),d2 ; d2 <- yold
move.w d2,d5
sub.w y_centre,d5
asr.w d4,d5
move.b dx_st(a3),d4
asr.w d4,d5
add.w d5,d2
sub.w y_abs,d2
sub.w y_abs,d2
cmp.w #y_rang,d2
bcc str_out_rang
cmp.w #ylower,d2
bls str_out_rang
move.w d2,ynew_st(a3)
move.w xold_st(a3),d0 ; preset old point
move.w yold_st(a3),d1
bsr preset
move.w xnew_st(a3),d0 ; pset new point
move.w ynew_st(a3),d1
bsr pset
move.w xnew_st(a3),xold_st(a3)
move.w ynew_st(a3),yold_st(a3)
bra next_star
str_out_rang:
move.w xold_st(a3),d0
move.w yold_st(a3),d1
bsr preset
bsr point_maker
next_star:
add.w #lenth,a3
cmpa.l a4,a3
blt starup
starend:
rts
preset:
move.l d0,d3
move.l d1,d4
move.b #0,d0 ; 0 = black
move.l myraster,a1
move.l GrafBase,a6
SYS SetAPen(a6)
move.l d3,d0
move.l d4,d1
lsr.w #6,d0
lsr.w #6,d1
and.l #$ffff,d0
and.l #$ffff,d1
SYS WritePixel(a6)
rts
pset:
move.l d0,d3
move.l d1,d4
move.b #1,d0 ; 1 = white
move.l GrafBase,a6
move.l myraster,a1
SYS SetAPen(a6)
move.l d3,d0
move.l d4,d1
lsr.l #6,d0
lsr.l #6,d1
and.l #$ffff,d0
and.l #$ffff,d1
SYS WritePixel(a6)
rts
point_maker:
jsr rando ; x values
move.w d0,d2
and.w #x_and,d0
add.w #xlower,d0
move.w d0,xold_st(a3)
jsr rando ; y values
and.w #y_and,d0
add.w #ylower,d0
cmp.w #y_rang,d0
bls rep_y
asr.w #1,d0
rep_y:
move.w d0,yold_st(a3)
and.b #3,d2 ; side distance factor
add.b #1,d2
move.b d2,dx_st(a3)
rts
* Random number generator with d0 returning the number (others saved)
randomize:
move.w #91,d0 ; the seed
move.w d0,rndsav
move.b #91,d0
move.b d0,rndlow
rts
rando:
move.l a0,-(sp)
move.l d1,-(sp)
lea rndsav,a0
move.w #$4321,d0
mulu (a0),d0
add.l #1,d0
move.w d0,(a0)
move.b (a0),d1
eor.b d0,d1
move.b d1,rndlow
move.l (sp)+,d1
move.l (sp)+,a0
rts
* get message to see if user closed the window
getmsg:
movea.l _AbsExecBase,a6
movea.l newwindowptr,a0
movea.l wd_UserPort(a0),a0
SYS GetMsg(a6)
rts
* reply to the current message
replymsg:
movea.l d0,a1
movea.l _AbsExecBase,a6
SYS ReplyMsg(a6)
rts
* Wait for user to close the window
waitforbutton:
move.l _AbsExecBase,a6
move.l newwindowptr,a0
move.l wd_UserPort(a0),a1
move.l #0,d3
move.b MP_SIGBIT(a1),d3
move.l #1,d0
asl.l d3,d0
SYS Wait(a6)
rts
* Close a window
closeall:
move.l IntBase,a6
move.l newwindowptr,a0
SYS CloseWindow(a6)
* Close a screen
move.l IntBase,a6
move.l newscreenptr,a0
SYS CloseScreen(a6)
* Close the graphics library
move.l GrafBase,a1
move.l _AbsExecBase,a6
SYS CloseLibrary(a6)
* Close the intuition library
move.l IntBase,a1
move.l _AbsExecBase,a6
SYS CloseLibrary(a6)
rts
openerr:
moveq #-1,d1 ; return code=bad
move.l d1,d0
bra exitprog
* Data section. I prefer zeroing these things out when practical in the
* style of Jake Commander. I also found you avoid pitfalls by NOT using
* SECTION directives needlessly. With small code, you only ask for trouble.
savesp dc.l 0
IntBase dc.l 0 ; base addr. for intuit. calls
GrafBase dc.l 0 ; base addr. for graphics calls
myraster dc.l 0 ; pointer to new screen raster
myview dc.l 0 ; pointer to new screen viewport
newwindowptr dc.l 0 ; pointer to new window
newscreenptr dc.l 0 ; pointer to new screen
windowvars
dc.w 0 ; nw_LeftEdge
dc.w 0 ; nw_TopEdge
dc.w 320 ; nw_Width
dc.w 200 ; nw_Height
dc.b 0 ; nw_DetailPen
dc.b 1 ; nw_BlockPen
dc.l IDCMP_FLAGS ; nw_IDCMPFlags
dc.l ANDREWSGADGETS ; nw_FLAGS
dc.l 0 ; nw_FirstGadget
dc.l 0 ; nw_CheckMark
dc.l andrews_window ; nw_Title
dc.l 0 ; nw_Screen
dc.l 0 ; nw_BitMap
dc.w 0 ; nw_Minwidth
dc.w 0 ; nw_MinHeight
dc.w 320 ; nw_MaxWidth
dc.w 200 ; nw_MaxHeight
dc.w WBENCHSCREEN ; nw_Type
screenvars
dc.w 0 ; ns_LeftEdge
dc.w 0 ; ns_TopEdge
dc.w 320 ; ns_Width
dc.w 200 ; ns_Height
dc.w 3 ; ns_Depth
dc.b 3 ; ns_DetailPen
dc.b 1 ; ns_BlockPen
dc.w 0 ; ns_ViewModes
dc.w WBENCHSCREEN ; ns_Type
dc.l 0 ; ns_Font
dc.l andrews_screen ; ns_DefaultTitle
dc.l 0 ; ns_Gadgets
dc.l 0 ; ns_CustomBitMap
* Library definitions
IntLibArgs dc.b 'intuition.library',0
GrafLibArgs dc.b 'graphics.library',0
* Andrew's Title definitions
andrews_window dc.b '3D Stars V 1.1',0
andrews_screen dc.b 'Andrew',39,'s Screen',0
numb equ $40
lenth equ $10
xnew_st equ 0
ynew_st equ 2
dx_st equ 4
dy_st equ 6
xold_st equ 8
yold_st equ $a
viaddr equ $c
vidata equ $e
x_and equ 254*$40
x_rang equ 318*64
zero equ 0
y_and equ 254*$40
y_rang equ 197*64
xlower equ 3*$40
ylower equ 11*$40
ANDREWSGADGETS equ ACTIVATE!WINDOWCLOSE!BACKDROP
IDCMP_FLAGS equ CLOSEWINDOW!RAWKEY
rndsav ds.w 2
rndlow ds.b 4
* star variables
speed ds.b 2
pont ds.b numb*lenth ;intended to be an array of 1024 bytes
pontend ds.b 1 ;allocate one byte. Name its spot pontend
x_centre ds.w 1
y_centre ds.w 1
x_abs ds.w 1
y_abs ds.w 1
END ; Boy, these assembler types have no flair. How 'bout:
; Th- Th- Th- Th- That's All Folks!! -TJE