File: JAGMAND.S - Tab length: 1 2 4 8 - Lines: on off - No wrap: on off

001: 
002:   .include "jaguar.inc"
003: 
004:   .text
005: 
006: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
007: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
008: 
009: ; .extern Mandle    ; Do mandelbrot picture...
010:   .extern start_mandGPU
011:   .extern end_mandGPU
012:   .extern mandGPU
013: 
014:   .extern olp2set   ; objectlist pointer...
015:   .extern gSetOLP   ; routine for setting OLP
016:   .extern ticks   ; video stuff...
017:   .extern a_vdb
018:   .extern a_vde
019:   .extern a_hdb
020:   .extern a_hde
021:   .extern width
022:   .extern height
023: 
024: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
025: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
026: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
027: 
028: bitmap_addr   .equ  $20000  ; Buffer in main memory
029: BM_WIDTH    .equ  640 ; Bitmap width in pixels
030: BM_HEIGHT   .equ  480 ; Bitmap height in pixels
031: BM_DEPTH    .equ  8 ; 8 bits per pixel
032: BM_PHRASES    .equ  ((BM_WIDTH*BM_DEPTH)/64)  ; phrase = 64 bits
033: BM_OFFSET     .equ    (2*8) ; Two Phrases = offset to bitmap object
034: 
035: MY_LISTSIZE .equ  5 ; List size in phrases:  
036:               ; branch (1)
037:               ; branch (1)
038:               ; bitmap (2)
039:               ; stop (1)
040: 
041: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
042: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
043: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
044: ; This is where we get control after the startup code...
045: 
046: _start::
047:   move.l  ticks,d0  ; get the VB counter
048: .2:
049:   move.l  ticks,d1
050:   sub.l d0,d1
051:   cmp.l #100,d1   ; Wait for 5-6 seconds (300 vb ticks)
052:   ble .2
053: 
054: ; Go make a new object list for our pictures...
055: 
056:   bsr make_list
057: 
058: ;;; Borrow Scott's Sneaky trick to cause display to popup at first VB
059: ;;; (Change the bitmap to a STOP object, until the VB kicks in and updates it)
060: 
061:   move.l  #$0,my_objlist+BM_OFFSET
062:   move.l  #$C,my_objlist+BM_OFFSET+4
063: 
064: ; OK, now we stick in our new object list pointer.
065: 
066:   move.l  d0,olp2set        ; D0 is swapped OLP from InitLister
067:   move.l  #gSetOLP,G_PC     ; Set GPU PC
068:   move.l  #RISCGO,G_CTRL    ; Go!
069: .1:
070:   move.l  G_CTRL,d0       ; Wait for write.
071:   andi.l  #$1,d0
072:   bne   .1
073: 
074: ; Now we stick in our new VB routine.  This
075: ; is OK because the move.l is atomic.
076: 
077:   move.l  #my_UpdateList,LEVEL0 ; Install 68K LEVEL0 handler
078: 
079: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
080: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
081: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
082: 
083: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
084: ; Copy over the GPU program
085: 
086:   move.l  #mandGPU,a0   ; Get the address of the GPU code
087:   move.l  #start_mandGPU,a1 ; Get destination address
088:   move.l  #end_mandGPU,d0   ; and calculate length of GPU code
089:   sub.l #start_mandGPU,d0
090:   asr.l #2,d0     ; divide by 4 since we're copying longs
091: .loop:
092:   move.l  (a0)+,(a1)+ ; actually copy the code...
093:   dbra  d0,.loop
094: 
095: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
096: ; Copy the palette into the chip
097: 
098:   move.l  #256,d0
099:   move.l  #CLUT,a0
100:   move.l  #cry_data,a1
101: 
102: .cloop:
103:   move.w  (a1)+,(a0)+
104:   dbra  d0,.cloop
105: 
106: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
107: ; Now set the proper Vmode...
108: 
109:   move.w  #$2C1,VMODE ; Set 16 bit CRY; 640 overscanned
110: 
111: ; bsr clearpic
112: 
113: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
114: ; Draw the fractal, then just bail out to an illegal instruction...
115: 
116:   move.l  #G_RAM,G_PC   ; GPU Program counter gets $00f03000
117: 
118:   move.l  #$1,G_CTRL    ; Set the GPU going
119: ; jsr Mandle
120: prout:
121:   bra.s   prout
122: 
123: 
124: 
125: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
126: ; Use the blitter to clear the bitmap for our fractal picture...
127: ; Just set up enough Blitter stuff to do a block draw.  Set A1_FLAGS to:
128: ;
129: ; Contiguous data
130: ; 16 bit per pixel
131: ; width of 56 pixels
132: ; add increment
133: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
134: 
135: clearpic:
136:   move.l  #PITCH1|PIXEL8|WID256|XADDPIX,d0
137:   move.l  d0,A1_FLAGS
138: 
139: ; Point A1BASE to the data
140: 
141:   move.l  #$20000,d0
142:   move.l  d0,A1_BASE
143: 
144: ; Set the pixel point to 0,0
145: 
146:   move.w  #0,d0     ; y
147:   swap  d0
148:   move.w  #0,d0     ; x
149:   move.l  d0,A1_PIXEL
150: 
151: ; Set up the step size to -256 in x, 1 in y
152: ; The x step requires that the pixel pointer by
153: 
154:   move.w  #1,d0     ; y
155:   swap  d0
156:   move.w  #(-256),d0    ; x
157:   move.l  d0,A1_STEP
158: 
159:   move.l  #0,A1_CLIP
160: 
161: ; Set up Counters register to 256 in x write long to clear upper
162: ; 256 in y, or in y as a word
163: 
164:   move.w  #200,d0     ; y
165:   swap  d0
166:   move.w  #256,d0     ; x
167:   move.l  d0,B_COUNT
168: 
169: ; Put some data in the blitter for it to write.
170: 
171:   move.l  #0,d0
172:   move.l  d0,B_PATD
173:   move.l  #0,d0
174:   move.l  d0,B_PATD+4
175: 
176: ; Now Turn IT ON !!!!!!!!!!!!!
177: 
178: ; NO SOURCE DATA, NO OUTER LOOP, Turn on pattern data, Allow outer loop update
179: 
180:   move.l  #PATDSEL|UPDA1,d0
181:   move.l  d0,B_CMD
182:   rts
183: 
184: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
185: ; make_list: Create my Object List Processor List
186: ;
187: ;    Returns: Pre-word-swapped address of current object list in d0.l
188: ;
189: ;  Registers: d0.l/d1.l - Phrase being built
190: ;             d2.l/d3.l - Link address overlays
191: ;             d4.l      - Work register
192: ;             a0.l      - Roving object list pointer
193: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
194: 
195: make_list:
196:     movem.l d1-d4/a0,-(sp)    ; Save registers
197:      
198:     lea     my_objlist,a0
199:     move.l  a0,d2             ; Copy
200: 
201:     add.l   #(MY_LISTSIZE-1)*8,d2   ; Address of STOP object
202:     move.l  d2,d3     ; Copy for low half
203: 
204:     lsr.l #8,d2     ; Shift high half into place
205:     lsr.l #3,d2
206:    
207:     swap  d3      ; Place low half correctly
208:     clr.w d3
209:     lsl.l #5,d3
210: 
211: ; Write first BRANCH object (branch if YPOS > a_vde )
212: 
213:     clr.l   d0
214:     move.l  #(BRANCHOBJ|O_BRLT),d1  ; $4000 = VC < YPOS
215:     or.l  d2,d0     ; Do LINK overlay
216:     or.l  d3,d1
217:                
218:     move.w  a_vde,d4                ; for YPOS
219:     lsl.w   #3,d4                   ; Make it bits 13-3
220:     or.w    d4,d1
221: 
222:     move.l  d0,(a0)+
223:     move.l  d1,(a0)+
224: 
225: ; Write second branch object (branch if YPOS < a_vdb)  
226: ; Note: LINK address is the same so preserve it
227: 
228:     andi.l  #$FF000007,d1           ; Mask off CC and YPOS
229:     ori.l   #O_BRGT,d1        ; $8000 = VC > YPOS
230:     move.w  a_vdb,d4                ; for YPOS
231:     lsl.w   #3,d4                   ; Make it bits 13-3
232:     or.w    d4,d1
233: 
234:     move.l  d0,(a0)+
235:     move.l  d1,(a0)+
236: 
237: ; Write a standard BITMAP object
238: 
239:     move.l  d2,d0
240:     move.l  d3,d1
241: 
242:     ori.l  #BM_HEIGHT/2<<14,d1       ; Height of image
243: 
244:     move.w  #0,d4
245: ;   move.w  height,d4             ; Center bitmap vertically
246: ;   sub.w   #BM_HEIGHT/2,d4
247: ;   add.w   a_vdb,d4
248: ;   andi.w  #$FFFE,d4               ; Must be even
249:    
250:     lsl.w   #3,d4
251:     or.w    d4,d1                   ; Stuff YPOS in low phrase
252: 
253: 
254:     move.l  #bitmap_addr,d4
255:    
256:     lsl.l #8,d4
257:     or.l  d4,d0
258:    
259:     move.l  d0,(a0)+
260:     move.l  d1,(a0)+
261:     movem.l d0-d1,ol_update
262: 
263: ; Second Phrase of Bitmap
264: 
265:     move.l  #BM_PHRASES>>4,d0 ; Only part of top LONG is IWIDTH
266:     move.l  #O_DEPTH8|O_NOGAP,d1  ; Bit Depth = 8-bit, Contiguous data
267: 
268:     move.w  #32,d4
269: ;   move.w  width,d4              ; Get width in clocks
270: ;   lsr.w   #1,d4                 ; /2 Pixel Divisor
271: ;   sub.w   #BM_WIDTH,d4
272: ;   lsr.w   #1,d4
273:     or.w    d4,d1
274: 
275:     ori.l #((BM_PHRASES*2)<<18)|(BM_PHRASES<<28),d1 ; DWIDTH|IWIDTH
276: 
277:     move.l  d0,(a0)+
278:     move.l  d1,(a0)+
279: 
280: ; Write a STOP object at end of list
281: 
282:     clr.l   (a0)+
283:     move.l  #(STOPOBJ|O_STOPINTS),(a0)+
284: 
285: ; Now return swapped list pointer in D0                      
286: 
287:     move.l  #my_objlist,d0
288:     swap    d0
289: 
290:     movem.l (sp)+,d1-d4/a0
291:     rts
292: 
293: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
294: ; Procedure: my_UpdateList
295: ;        Handle Video Interrupt and update object list fields
296: ;        destroyed by the object processor.
297: 
298: my_UpdateList:
299:     move.l  a0,-(sp)
300: 
301:     move.l  #my_objlist+BM_OFFSET,a0
302: 
303:     move.l  ol_update,(a0)        ; Phrase = d1.l/d0.l
304:     move.l  ol_update+4,4(a0)
305: 
306:     add.l #1,ticks    ; Increment ticks semaphore
307: 
308:     move.w  #$101,INT1        ; Signal we're done
309:     move.w  #$0,INT2
310:    
311:     btst.b  #(11-8),VC    ; we're testing bit 11 (the 12th bit) of VC but...
312:     bne .bottom     ; btst only works on bytes when operating on memory
313: 
314:     ; top field
315:     ori.w #1,vi_line2   ; set line next VI will occur on
316:     move.w  vi_line2,VI   ; and set it (VI is write-only)
317: 
318:     bra .done
319: 
320: .bottom:            ; bottom field
321:     andi.w  #$fffe,vi_line2   ; set line next VI will occur on
322:     move.w  vi_line2,VI   ; and set it (VI is write-only)
323: 
324:     add.l #((BM_PHRASES)<<11),(a0) ; add IWIDTH to DATA to start one line lower
325: 
326: .done:  
327: 
328:     move.l  (sp)+,a0
329:     rte
330: 
331: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
332: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
333: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
334: 
335:   .data
336: 
337: ; This file has a label cry_data that has, in 68k format the top level
338: ; of cry for 8 bits
339:        
340:   .include "cry.pal"
341: 
342: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
343: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
344: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
345: 
346:   .phrase
347:   .bss
348:   .dphrase
349: 
350: my_objlist:
351:   .ds.l 16
352: 
353: ol_update:
354:   .ds.l 2
355: 
356: vi_line2: .ds.w 1     ; VI is write only, so cache it