; screen # by The Fate of ULM (c) 1989 and for all eternity... demo: equ 10 ;demo = 0 => assemble for demo ;demo <> 0 => assemble for devpack test: equ 10 ifne demo ;please leave all section indications unchanged... ;simple loader to get into supervisor-mode ;this part can be removed when started from bootsector x: pea start move.w #38,-(sp) trap #14 addq.l #6,sp clr.w -(sp) trap #1 start: move sr,in_oldsr move #$2700,sr move.b $ffff8260.w,in_oldres bsr waitvbl move.b #0,$ffff8260.w movem.l $ffff8240.w,d0-d7 movem.l d0-d7,in_oldpal movem.l black,d0-d7 movem.l d0-d7,$ffff8240.w lea $ffff8201.w,a0 movep.w 0(a0),d0 move.w d0,in_screenad move.b #18,$fffffc02.w bsr waitvbl move.b #26,$fffffc02.w bsr in_psginit move.l $0604.w,in_old604 move.l sp,$0604.w move usp,a0 move.l a0,in_oldusp move.l sp,in_oldsp move.l $0600.w,in_old600 move.l #back,$0600.w ;here we go... to the real screen... jmp screen back: move.l in_old600,$0600.w move.l in_old604,$0604.w movea.l in_oldusp,a0 move a0,usp movea.l in_oldsp,sp movem.l black,d0-d7 movem.l d0-d7,$ffff8240.w move.b #2,$ffff820a.w bsr waitvbl move.b #0,$ffff820a.w bsr waitvbl move.b #2,$ffff820a.w movem.l in_oldpal,d0-d7 movem.l d0-d7,$ffff8240.w move.b in_oldres,$ffff8260.w lea $ffff8201.w,a0 move.w in_screenad,d0 movep.w d0,0(a0) bsr.s in_psginit move.b #20,$fffffc02.w bsr waitvbl move.b #8,$fffffc02.w move in_oldsr,sr rts in_psginit: lea in_psginittab,a0 in_nextinit: move.b (a0)+,d0 cmp.b #$ff,d0 beq.s in_initend move.b (a0)+,d1 move.b d0,$ffff8800.w move.b d1,$ffff8802.w bra.s in_nextinit in_initend: rts in_psginittab: dc.b 0,$ff,1,$ff,2,$ff,3,$ff,4,$ff,5,$ff,6,0 dc.b 7,$7f,8,7,9,7,10,7,$ff,0 even in_screenad: ds.w 1 in_oldpal: ds.l 16 in_oldres: ds.w 1 in_old600: ds.l 1 in_old604: ds.l 1 in_oldsr: ds.w 1 in_oldsp: ds.l 1 in_oldusp: ds.l 1 endc ; ; systemadresses: $600.w = return address (see exit) ; $604.w = stackpointer (copy to sp if needed ; ex. move.l $604.w,sp) ; ; from here on, no stackpointer is present, if you need one, just ; get the address of space for stack in $604.w (see also sys. $604.w) ; ; you can use all registers, even usp (move an,usp or move usp,an) ; ; sr is set to $2700 and must (!!!!) be $2700 when returning to main menu ; ; waitvbl can be used to wait for the end of the displayed(!!!!) screen ; normal mode and overscan (with opened lowr border...) ; waitvbl uses d0-d1/a0 ; ;this part is the real screen... ifeq demo org $010000 endc screen: lea bss_start,a0 lea bss_end,a1 movem.l black,d1-d7/a2-a6 clear_loop: movem.l d1-d7/a2-a6,(a0) movem.l d1-d7/a2-a6,12*4(a0) movem.l d1-d7/a2-a6,24*4(a0) lea 36*4(a0),a0 cmpa.l a0,a1 bpl.s clear_loop move.l #screenmem,d0 add.l #255,d0 and.l #$ffff00,d0 move.l d0,screenad1 ror.l #8,d0 lea $ffff8201.w,a0 movep.w d0,0(a0) lea graphic,a6 movem.l (a6),d1-d2 movem.l (a6),d3-d4 movem.l (a6),d5-d6 movem.l (a6),d7-a0 movem.l (a6),a1-a2 movea.l screenad1,a6 lea 160(a6),a6 move.w #299,d0 graphiccop: movem.l d1-a2,(a6) movem.l d1-a2,40(a6) movem.l d1-a2,80(a6) movem.l d1-a2,120(a6) movem.l d1-a2,160(a6) movem.l d1-a2,200(a6) lea 230(a6),a6 dbra d0,graphiccop movem.l pal,d0-d3 movem.l d0-d3,$ffff8240+4*4.w movea.l $0604.w,sp testl: bsr waitvbl lea $ffff8209.w,a0 moveq #0,d0 moveq #20,d2 sync2: move.b (a0),d0 beq.s sync2 sub.w d0,d2 lsl.l d2,d2 bsr waitvbl move.w #1500,d0 wait_border: dbf d0,wait_border dcb $4e71,196 loop: move.b #0,$ffff820a.w dcb $4e71,8 move.b #2,$ffff820a.w btst #6,$fffffa0d.w bne exit lea $ffff8209.w,a0 moveq #0,d0 moveq #30,d2 sync: move.b (a0),d0 beq.s sync sub.w d0,d2 lsl.l d2,d2 dcb $4e71,79 move.w #210,d0 lo0001: dcb $4e71,6 move.b #2,$ffff8260.w move.b #0,$ffff8260.w dcb $4e71,87 move.b #0,$ffff820a.w move.b #2,$ffff820a.w dcb $4e71,8 move.b #1,$ffff8260.w move.b #0,$ffff8260.w dbf d0,lo0001 dcb $4e71,5 move.b #2,$ffff8260.w move.b #0,$ffff8260.w dcb $4e71,87 move.b #0,$ffff820a.w dcb $4e71,12 move.b #1,$ffff8260.w move.b #0,$ffff8260.w dcb $4e71,9 move.b #2,$ffff8260.w move.b #0,$ffff8260.w move.b #2,$ffff820a.w dcb $4e71,83 move.b #0,$ffff820a.w move.b #2,$ffff820a.w dcb $4e71,8 move.b #1,$ffff8260.w move.b #0,$ffff8260.w dcb $4e71,2 moveq #13,d0 lo0002: dcb $4e71,6 move.b #2,$ffff8260.w move.b #0,$ffff8260.w dcb $4e71,87 move.b #0,$ffff820a.w move.b #2,$ffff820a.w dcb $4e71,8 move.b #1,$ffff8260.w move.b #0,$ffff8260.w dbf d0,lo0002 dcb $4e71,5 move.b #2,$ffff8260.w move.b #0,$ffff8260.w dcb $4e71,87 move.b #0,$ffff820a.w dcb $4e71,12 move.b #1,$ffff8260.w move.b #0,$ffff8260.w dcb $4e71,9 move.b #2,$ffff8260.w move.b #0,$ffff8260.w move.b #2,$ffff820a.w dcb $4e71,83 move.b #0,$ffff820a.w move.b #2,$ffff820a.w dcb $4e71,8 move.b #1,$ffff8260.w move.b #0,$ffff8260.w dcb $4e71,2 moveq #43,d0 lo0003: dcb $4e71,6 move.b #2,$ffff8260.w move.b #0,$ffff8260.w dcb $4e71,87 move.b #0,$ffff820a.w move.b #2,$ffff820a.w dcb $4e71,8 move.b #1,$ffff8260.w move.b #0,$ffff8260.w dbf d0,lo0003 bsr waitvbl move.w #1488,d0 wait_border2: dbf d0,wait_border2 dcb $4e71,194 move.w #1911,$ffff8240.w move.w #$00,$ffff8240.w dcb $4e71,23 bra loop exit: movea.l $0600.w,a0 jmp (a0) waitvbl: move.b $ffff8203.w,d0 lsl.w #8,d0 lea $ffff8207.w,a0 no_vbl: movep.w 0(a0),d1 cmp.w d0,d1 bne.s no_vbl rts ;please leave all section indications unchanged... ;here starts the data section black: dc.l 0,0,0,0,0,0,0,0 dc.l 0,0,0,0,0,0,0,0 graphic: dc.l %01010101010101010011001100110011 dc.l %00001111000011111111111111111111 pal: dc.w $000,$0221,$0332,$0443,$0554,$0665,$0110,$20 ;end of data section section bss ;please leave all section indications unchanged... bss_start: ;here starts the bss stack: ds.l 1 screenad1: ds.l 1 screenmem: ds.l 14300 bss_end: ;here ends the bss end