paradist/FULLMEGA.S

510 lines
8.9 KiB
ArmAsm

; 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
go:
move.l y-x+$10000,d0 ;length
move.l $80000-(y-x+$10000),d0 ;memory left on ST with half-a-meg
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 #26,$fffffc02.w
bsr waitvbl
move.b #18,$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
bsr waitvbl
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
x:
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)
move.l screenad1,a6
movem.l black,d1-a2
movem.l d1-a2,(a6)
movem.l d1-a2,40(a6)
movem.l d1-a2,80(a6)
movem.l d1-a2,120(a6)
lea 160(a6),a6
lea graphic,a5
movem.l (a5),d1-d2
movem.l (a5),d3-d4
movem.l (a5),d5-d6
movem.l (a5),d7-a0
movem.l (a5),a1-a2
move.w #290,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
lea farbtab,a0
lea hsin,a1
moveq #0,d1
move.w #599,d0
fill_loop:
move.b (a1)+,d1
move.w d1,(a0)+
cmp.l #hsinend,a1
bne.s fill_ok
lea hsin,a1
fill_ok:
dbf d0,fill_loop
move.l a1,aktinhsin
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,188+6
loop:
lea $ffff8260.w,sp
move.b #0,$ffff820a.w
lea coltab,a2
codmodvsin equ *+2
add.w #0,a2
lea farbtab,a1
move.b #2,$ffff820a.w
codmodhsin equ *+2
add.w #0,a1
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,24+24+1
move.w (a1)+,d2
movem.l 0(a2,d2.w),d2-d5
moveq #48,d0
lo0001:
dcb $4e71,5
move.b #1,$ffff8260.w
move.b #0,$ffff8260.w
movem.l d2-d5,$ffff8250.w
move.b #2,(sp)
move.b #0,(sp)
dcb $4e71,46+24
lea 32(a2),a2
move.w (a1)+,d2
movem.l 0(a2,d2.w),d2-d5
move.b #0,$ffff820a.w
move.b #2,$ffff820a.w
dbf d0,lo0001
dcb $4e71,4
move.b #1,$ffff8260.w
move.b #0,$ffff8260.w
movem.l d2-d5,$ffff8250.w
move.b #2,(sp)
move.b #0,(sp)
dcb $4e71,46+24
lea 32(a2),a2
move.w (a1)+,d2
movem.l 0(a2,d2.w),d2-d5
move.b #0,$ffff820a.w
move.b #2,$ffff820a.w
dcb $4e71,1
move.w #110+50,d0
lo0004:
dcb $4e71,5
move.b #1,$ffff8260.w
move.b #0,$ffff8260.w
movem.l d2-d5,$ffff8250.w
move.b #2,(sp)
move.b #0,(sp)
dcb $4e71,46+24
lea 32(a2),a2
move.w (a1)+,d2
movem.l 0(a2,d2.w),d2-d5
move.b #0,$ffff820a.w
move.b #2,$ffff820a.w
dbf d0,lo0004
dcb $4e71,4
move.b #1,$ffff8260.w
move.b #0,$ffff8260.w
movem.l d2-d5,$ffff8250.w
move.b #2,(sp)
move.b #0,(sp)
dcb $4e71,59-11+24
move.w (a1)+,d2
movem.l 32(a2,d2.w),d2-d5
move.b #0,$ffff820a.w
lea 64(a2),a2
dcb $4e71,10
move.b #1,$ffff8260.w
move.b #0,$ffff8260.w
movem.l d2-d5,$ffff8250.w
move.b #2,(sp)
move.b #0,(sp)
move.b #2,$ffff820a.w
dcb $4e71,44+24
move.w (a1)+,d2
movem.l 0(a2,d2.w),d2-d5
move.b #0,$ffff820a.w
move.b #2,$ffff820a.w
dcb $4e71,2
moveq #13,d0
lo0002:
dcb $4e71,5
move.b #1,$ffff8260.w
move.b #0,$ffff8260.w
movem.l d2-d5,$ffff8250.w
move.b #2,(sp)
move.b #0,(sp)
dcb $4e71,46+24
lea 32(a2),a2
move.w (a1)+,d2
movem.l 0(a2,d2.w),d2-d5
move.b #0,$ffff820a.w
move.b #2,$ffff820a.w
dbf d0,lo0002
dcb $4e71,4
move.b #1,$ffff8260.w
move.b #0,$ffff8260.w
movem.l d2-d5,$ffff8250.w
move.b #2,(sp)
move.b #0,(sp)
dcb $4e71,48+24
move.w (a1)+,d2
movem.l 32(a2,d2.w),d2-d5
move.b #0,$ffff820a.w
lea 64(a2),a2
dcb $4e71,10
move.b #1,$ffff8260.w
move.b #0,$ffff8260.w
movem.l d2-d5,$ffff8250.w
move.b #2,(sp)
move.b #0,(sp)
move.b #2,$ffff820a.w
dcb $4e71,44+24
move.w (a1)+,d2
movem.l 0(a2,d2.w),d2-d5
move.b #0,$ffff820a.w
move.b #2,$ffff820a.w
dcb $4e71,2
moveq #43,d0
lo0003:
dcb $4e71,5
move.b #1,$ffff8260.w
move.b #0,$ffff8260.w
movem.l d2-d5,$ffff8250.w
move.b #2,(sp)
move.b #0,(sp)
dcb $4e71,46+24
lea 32(a2),a2
move.w (a1)+,d2
movem.l 0(a2,d2.w),d2-d5
move.b #0,$ffff820a.w
move.b #2,$ffff820a.w
dbf d0,lo0003
dcb $4e71,4
move.b #1,$ffff8260.w
move.b #0,$ffff8260.w
move.w #137,d0
wait_border3:
dcb $4e71,32
dbf d0,wait_border3
dcb $4e71,25
move.w pointdist,d0
move.w d0,d1
addq.w #4,d0
cmp.w #300*4,d0
bne.s pointdis_ok
moveq #0,d0
pointdis_ok:
move.w d0,pointdist
move.w d0,codmodhsin
moveq #0,d0
move.l aktinhsin,a0
move.b (a0)+,d0
swap d0
move.b (a0)+,d0
cmp.l #hsinend+2,a0
bne.s hsin_ok
lea hsin,a0
move.b (a0)+,d0
swap d0
move.b (a0)+,d0
bra.s hsin_nok
hsin_ok:
dcb $4e71,11
hsin_nok:
move.l a0,aktinhsin
lea farbtab,a0
add.w d1,a0
move.l d0,(a0)
move.l d0,1200(a0)
move.l aktinvsin,a0
move.w (a0)+,d0
move.w (a0)+,d1
cmp.l #vsinend+4,a0
bne.s vsin_ok
lea vsin,a0
move.w (a0)+,d0
move.w (a0)+,d1
bra.s vsin_nok
vsin_ok:
dcb $4e71,10
vsin_nok:
move.w d0,codmodvsin
move.l a0,aktinvsin
add.w d1,codmodhsin
move.l $604.w,sp
move.w #1911,$ffff8240.w
move.w #$00,$ffff8240.w
dcb $4e71,16
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
;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,$221,$332,$443,$554,$665,$110,$020
hsin:
incbin 'c:\includes\hsin.bin'
hsinend:
aktinvsin:
dc.l vsin
vsin:
incbin 'c:\includes\vsin.bin'
vsinend:
coltab:
incbin 'c:\includes\coltab.bin'
incbin 'c:\includes\coltab.bin'
incbin 'c:\includes\coltab.bin'
incbin 'c:\includes\coltab.bin'
incbin 'c:\includes\coltab.bin'
incbin 'c:\includes\coltab.bin'
;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
pointdist: ds.w 1
aktinhsin: ds.l 1
farbtab: ds.l 600
screenmem:
ds.l $2000
ds.l $2000
ds.l $500
bss_end: ;here ends the bss
y:
end