home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Crawly Crypt Collection 1
/
crawlyvol1.bin
/
apps
/
misc
/
zx_sp207
/
source
/
midres.s
next >
Wrap
Text File
|
1993-07-18
|
24KB
|
671 lines
OPT A+ ; use (PC)-relativ adressing
OPT O3+ ; use short-word addressing
OPT O4+ ; use MOVEQ
OPT O5+ ; use ADDQ / SUBQ
;#####################################################################
;# BILDSCHIRM-TREIBER FÜR ZX-SPECTRUM VIDEO-EMULATION
;# Nur Mittlere Auflösung 640x400 Pixel x 2 Bitplanes
;#####################################################################
;# Zur Verwendung, das assemblierte Programm in ZXVID.TRB umbenennen
;# und in den Ordner von SPECCI.DAT kopieren.
;#####################################################################
;
;---------------------------------------
; Makro für S/W-Schirm-Transfer
;---------------------------------------
transm1 macro \1,\2
moveq #0,d0
IFEQ \1,0
move.b (a3)+,d0 ; Byte vom Spectrum-Screen
ELSEIF
move.b \1-1(a3),d0
ENDC
add.w d0,d0
add.w d0,d0
IFEQ \2,0
move.w 0(a0,d0.l),(a4)+
move.w -2(a4),(a4)+
ELSEIF
move.w 0(a0,d0.l),\2-4(a4) ; ST-Werte aus Tabelle
move.w \2-4(a4),\2-2(a4)
ENDC
endm
transm2 macro \1,\2
moveq #0,d0
IFEQ \1,0
move.b (a3)+,d0 ; Byte vom Spectrum-Screen
ELSEIF
move.b \1-1(a3),d0
ENDC
add.w d0,d0
add.w d0,d0
IFEQ \2,0
move.w 2(a0,d0.l),(a4)+
move.w -2(a4),(a4)+
ELSEIF
move.w 2(a0,d0.l),\2-4(a4) ; ST-Werte aus Tabelle
move.w \2-4(a4),\2-2(a4)
ENDC
endm
;---------------------------------------
; Makro für S/W-Schirm-Transfer Einzel
;---------------------------------------
transf1 macro \1,\2
moveq #0,d0
IFEQ \1,0
move.b (a2),d0
ELSEIF
move.b \1(a2),d0
ENDC
add.w d0,d0
add.w d0,d0
IFEQ \2,0
move.w 0(a0,d0.l),(a1)
move.w (a1),2(a1)
ELSEIF
move.w 0(a0,d0.l),\2(a1) ; ST-Werte aus Tabelle
move.w \2(a1),\2+2(a1)
ENDC
endm
transf2 macro \1,\2
moveq #0,d0
IFEQ \1,0
move.b (a2),d0
ELSEIF
move.b \1(a2),d0
ENDC
add.w d0,d0
add.w d0,d0
IFEQ \2,0
move.w 2(a0,d0.l),(a1)
move.w (a1),2(a1)
ELSEIF
move.w 2(a0,d0.l),\2(a1) ; ST-Werte aus Tabelle
move.w \2(a1),\2+2(a1)
ENDC
endm
xbios equ 14
clen equ 256*128*4 ; Länge Color-Translate-Table
llen equ 24*4 ; Länge Linearisierungs-Tabelle
svmlen equ 3*4*24 ; Länge Worktabelle
flen equ 256 ; Länge Flash-Revers-Tabelle
vdrv_hdr equ *
bra.w v_install ; Installierung +0
ds.l 1 ; De-Installierung +4
ds.l 1 ; Einzelbyte Attr. +8
ds.l 1 ; Einzelbyte Noattr. +12
ds.l 1 ; BORDER-Darstellung +16
ds.l 1 ; ganzen Schirm aufbauen +20
ds.l 1 ; VBL-Task +24
v_install:lea screen,a2
move.l a1,(a2)
lea flags,a2
lea -4(a4),a4 ; 0(a4)=attr_sw, 1(a4)=flash_sw
move.l a4,(a2) ; 2(a4)=fmode
lea ctab,a2
move.l a0,(a2)+ ; ctab
adda.l #clen,a0
move.l a0,(a2)+ ; svmtab
adda.l #svmlen,a0
move.l a0,(a2)+ ; lintab
adda.l #llen,a0
move.l a0,(a2) ; ftab
move.w #4,-(sp)
trap #xbios ; getrez()
addq.l #2,sp
cmpi.w #1,d0 ; Nur mittlere
beq.s valres ; ST-Auflösung!
moveq #1,d0 ; 'Auflösung nicht unterstützt'
rts
valres: lea v_deinst,a0
move.l a0,4(a5)
lea video_m1,a0
move.l a0,8(a5)
lea video_m2,a0
move.l a0,12(a5)
lea dborder,a0
move.l a0,16(a5)
lea buildpage,a0
move.l a0,20(a5)
lea vbltsk,a0
move.l a0,24(a5)
move.l lintab,a0 ; Linearisierungs-Tabelle
clr.w d0 ; für ZX-SCREEN
move.w #2,d6
iloo4: move.w d0,-(sp)
move.w #7,d5
iloo3: move.w d0,-(sp)
move.l screen,a1
add.w d0,a1
move.l a1,(a0)+
move.w (sp)+,d0
add.w #32,d0
dbf d5,iloo3
move.w (sp)+,d0
add.w #2048,d0
dbf d6,iloo4
move.l ctab,a0
lea grey_tab,a1
clr.b d0 ; Attribut 0 - 127
iloo11: clr.b d6 ; Pixelwert 0 - 255
move.b d0,d5 ; Attribut in Grauwert umrechnen
lsr.b #3,d5
andi.w #15,d5 ; d5 = Paper-Color 0..15
move.b d0,d4
andi.w #7,d4
btst #3,d5
beq.s ini_15
bset #3,d4 ; d4 = Ink-Color 0..15
ini_15: lsl.b #3,d4
lsl.b #3,d5
move.w 0(a1,d4.w),d2 ; d2 = Ink-Grauwert 1.Wort
move.w 4(a1,d4.w),d3 ; d3 = Ink-Grauwert 2.Wort
move.w 0(a1,d5.w),d4 ; d4 = Paper-Grauwert 1.Wort
move.w 4(a1,d5.w),d5 ; d5 = Paper-Grauwert 2.Wort
swap d0
iloo10: movem.l d2-d6,-(sp) ; Pixel-Wert über Graumaske
moveq #7,d7 ; von Byte auf Wort strecken
clr.w d0
moveq #0,d1
iloo8: roxr.b #1,d6
bcc.s ini_60 ; Paper-Pixel
roxr.w #1,d2 ; Ink-Pixel
roxr.w d0
roxr.w #1,d2
roxr.w d0
roxr.w #1,d3
roxr.w d1
roxr.w #1,d3
roxr.w d1
dbf d7,iloo8
bra.s ini_65
ini_60: roxr.w #1,d4
roxr.w d0
roxr.w #1,d4
roxr.w d0
roxr.w #1,d5
roxr.w d1
roxr.w #1,d5
roxr.w d1
dbf d7,iloo8
ini_65: move.w d0,(a0)+
move.w d1,(a0)+
movem.l (sp)+,d2-d6
addq.b #1,d6 ; nächster Pixelwert
bne.s iloo10
swap d0
addq.b #1,d0 ; nächstes Attribut
bpl.s iloo11
ini_50: move.w #2,-(sp)
trap #xbios
addq.l #2,sp
lea stscrn,a0
move.l d0,(a0)+
addi.l #4*160+16,d0
move.l d0,(a0)+
move.l svmtab,a0
move.l stscrn1,a1
move.l screen,a2
lea 6144(a2),a2
move.l lintab,a3
move.w #23,d0
iloo20: move.l a1,(a0)+
move.l a2,(a0)+
move.l (a3)+,(a0)+
lea 160*8(a1),a1
lea 32(a2),a2
dbf d0,iloo20
move.l ftab,a0 ; Flash-Tabelle
clr.b d0
move.w #127,d1
iloo29: move.b d0,(a0)+
addq.b #1,d0
dbf d1,iloo29
clr.b d0 ; Attribut 0 bis 127
iloo30: move.b d0,d1
move.b d0,d2
andi.b #7,d1 ; d1 = Ink
lsl.b #3,d1 ; in die Paper-Bits schieben
lsr.b #3,d2 ; Paper in
andi.b #7,d2 ; die Ink-Bits schieben
move.b d0,d3
and.b #64,d3 ; Bright erhalten
or.b d1,d3 ; vertauschtes Paper/Ink
or.b d2,d3 ; zu Attribut formen
move.b d3,(a0)+ ; in die Tabelle damit
addq.b #1,d0 ; bis Attribut = 128
bpl.s iloo30
lea px2st,a0
clr.w d0
move.w #2,d4
iloo31: move.w #7,d3
move.w d0,-(sp)
iloo32: move.w #7,d2
move.w d0,-(sp)
iloo33: move.w d0,-(sp)
moveq #31,d1
iloo34: move.w d0,(a0)+
addq.w #4,d0
dbf d1,iloo34
iloo35: move.w (sp)+,d0
add.w #160*8,d0
dbf d2,iloo33
move.w (sp)+,d0
add.w #160,d0
dbf d3,iloo32
move.w (sp)+,d0
add.w #160*8*8,d0
dbf d4,iloo31
lea px2at,a0
move.w #22528,d0
move.w #2,d4
iloo41: move.w #7,d3
iloo42: move.w #7,d2
iloo43: move.w #31,d1
iloo44: move.w d0,(a0)+
addq.w #1,d0
dbf d1,iloo44
dbf d2,iloo43
sub.w #256,d0
dbf d3,iloo42
add.w #256,d0
dbf d4,iloo41
lea at2px,a0
move.w #16384,d0
move.w #2,d2
iloo51: move.w #255,d1
iloo52: move.w d0,(a0)+
addq.w #1,d0
dbf d1,iloo52
add.w #2048-256,d0
dbf d2,iloo51
moveq #0,d0
rts
v_deinst: rts
;---------------------------------------------------------------------
; Vertical Blank-Task
;
; Zur Darstellung des Bildschirms während einer LOAD-Operation
;---------------------------------------------------------------------
vbltsk: move.l a0,-(sp)
lea vbsem,a0
subq.w #1,(a0)
bmi.s vb_99
bsr vid_line
add.w #12,2(a0)
bsr vid_line
add.w #12,2(a0)
cmpi.w #288,2(a0)
blt.s vb_99
clr.w 2(a0)
vb_99: addq.w #1,(a0)
move.l (sp)+,a0
rte
;---------------------------------------------------------------------
; Screenroutinen Medium Res
;
; Zur Darstellung von Bytes im ZX-Screen am ST-Screen
;
; d0.b Pixel/Attribut-Wert
; d1.l Offset im ZX-Adressraum
; a5 Start ZX-Adressraum im ST
;---------------------------------------------------------------------
;
video_m2: cmpi.w #22528,d1 ; Pixel oder Attribut ?
bcc.s vm2_90 ; -> Attribut ignorieren
movem.l d0-d2/a0-a1,-(sp)
subi.w #16384,d1 ; Pixeloffset 0 - 6143
bmi.s vid_98 ; ADRESSE IM ROM !
move.w d1,d2
add.w d1,d1 ; * 2
lea px2st,a0 ; ST-Screenadresse
move.w 0(a0,d1.l),d1 ; aus Pixel-Offset
move.l stscrn1,a0 ; ermitteln
lea 0(a0,d1.l),a1
move.l ctab,a0
adda.l #120*1024,a0
andi.w #$00ff,d0
add.w d0,d0
add.w d0,d0
btst #8,d2
beq.s vm2_40
move.w 2(a0,d0.w),(a1)
move.w (a1)+,(a1)
movem.l (sp)+,d0-d2/a0-a1
rte
vm2_40: move.w 0(a0,d0.w),(a1)
move.w (a1)+,(a1)
movem.l (sp)+,d0-d2/a0-a1
rte
vm2_90: tst.b -3(a4) ; Spezialfall: attrsw=0, flashsw=1
bcs vidm_flsh ; muß seperat behandelt werden
rte
vid_98: movem.l (sp)+,d0-d2/a0-a1
move.b 0(a5,d1.l),d0
rte
vid_99: movem.l (sp)+,d0-d4/a0-a2
move.b 0(a5,d1.l),d0
rte
video_m1: movem.l d0-d4/a0-a2,-(sp)
cmpi.w #22528,d1 ; Pixel oder Attribut ?
bcc.s vidm_att ; -> Attribut
subi.w #16384,d1 ; Pixeloffset 0 - 6143
bmi.s vid_99 ; ADRESSE IM ROM !
;
move.w d1,d4
add.w d1,d1 ; * 2
lea px2st,a0 ; ST-Screenadresse
move.w 0(a0,d1.l),d2 ; aus Pixel-Offset
move.l stscrn1,a0 ; ermitteln
lea 0(a0,d2.w),a1
;
lea px2at,a0 ; Attribut dieses Pixels
move.w 0(a0,d1.l),d2
moveq #0,d1
move.b 0(a5,d2.w),d1
;
bpl.s vm1_12 ; Normales Attribut
tst.b -2(a4) ; Flash-Zyklus?
beq.s vm1_10 ; nein
move.l ftab,a0
move.b 0(a0,d1.l),d1 ; Flash -> Invers
vm1_10: andi.b #$7f,d1
vm1_12: moveq #10,d3
lsl.l d3,d1
move.l ctab,a0
lea 0(a0,d1.l),a0
move.b d0,d3
add.w d3,d3
add.w d3,d3
btst #8,d4
beq.s vm1_40
move.w 2(a0,d3.w),(a1)
move.w (a1)+,(a1)
movem.l (sp)+,d0-d4/a0-a2
rte
vm1_40: move.w 0(a0,d3.w),(a1)
move.w (a1)+,(a1)
movem.l (sp)+,d0-d4/a0-a2
rte
vidm_att: sub.w #22528,d1
add.w d1,d1 ; *2
lea at2px,a0 ; Attribut -> Pixel
move.w 0(a0,d1.l),d2 ; ZX-Pixel-Adresse
lea 0(a5,d2.w),a2 ; Position im ST-Ram
;
lea px2st,a0
subi.w #16384,d2 ; 0
add.w d2,d2
move.w 0(a0,d2.w),d1
move.l stscrn1,a0
lea 0(a0,d1.w),a1 ; ST-Screenadresse
;
moveq #0,d1
move.b d0,d1
bpl.s vma_12 ; normales Attribut
tst.b -2(a4) ; Flash-Zyklus?
beq.s vma_10 ; nein
move.l ftab,a0
move.b 0(a0,d1.l),d1 ; Attribut (Flash -> Invers)
vma_10: andi.b #$7f,d1
vma_12: moveq #10,d3
lsl.l d3,d1
move.l ctab,a0
lea 0(a0,d1.l),a0
transf1 0,0
transf2 256,80*2
transf1 256*2,80*4
transf2 256*3,80*6
transf1 256*4,80*8
transf2 256*5,80*10
transf1 256*6,80*12
transf2 256*7,80*14
movem.l (sp)+,d0-d4/a0-a2
rte
vidm_flsh:movem.l d0-d3/a0-a2,-(sp)
sub.w #16384,d1
add.w d1,d1 ; *2
lea at2px,a0 ; Attribut -> Pixel Tabelle
move.w 0(a0,d1.l),d2 ; ZX-Pixel-Adresse
lea 0(a5,d2.w),a2 ; Position im ST-Ram
;
lea px2st,a0
subi.w #16384,d2 ; 0
add.w d2,d2
move.w 0(a0,d2.w),d1
move.l stscrn1,a0
lea 0(a0,d1.w),a1 ; ST-Screenadresse
;
move.l ctab,a0
adda.l #%01111000*1024,a0 ; PAPER 0, INK 7, BRIGHT 1
tst.b d0 ; Flash-Attribut?
bpl.s vmf_10 ; normales Attribut
tst.b -2(a4) ; Flash-Zyklus?
beq.s vmf_10 ; nein
suba.l #(%01111000-%01000111)*1024,a0 ; PAPER 7, INK 0, BRIGHT 1
vmf_10: equ *
transf1 0,0
transf2 256,80*2
transf1 256*2,80*4
transf2 256*3,80*6
transf1 256*4,80*8
transf2 256*5,80*10
transf1 256*6,80*12
transf2 256*7,80*14
movem.l (sp)+,d0-d3/a0-a2
rte
dborder: movem.l a0/d0-d2,-(sp)
lea grey_tab,a0 ; Graumuster berechnen
lsl.w #3,d0 ; Eintrag Grauwert für Farbe d0
move.l 0(a0,d0.w),d1 ; Grauwert Scan 1
move.l 4(a0,d0.w),d2 ; Grauwert Scan 2
move.l stscrn,a0
moveq #3,d0 ; Obere 4 Doppelzeilen
mc1: move.l d1,(a0)+ ; mit Border-Farbe füllen
move.l d1,(a0)+ ; 1
move.l d1,(a0)+
move.l d1,(a0)+ ; 2
move.l d1,(a0)+
move.l d1,(a0)+ ; 3
move.l d1,(a0)+
move.l d1,(a0)+ ; 4
move.l d1,(a0)+
move.l d1,(a0)+ ; 5
move.l d1,(a0)+
move.l d1,(a0)+ ; 6
move.l d1,(a0)+
move.l d1,(a0)+ ; 7
move.l d1,(a0)+
move.l d1,(a0)+ ; 8
move.l d1,(a0)+
move.l d1,(a0)+ ; 9
move.l d1,(a0)+
move.l d1,(a0)+ ; 10
move.l d1,(a0)+
move.l d1,(a0)+ ; 11
move.l d1,(a0)+
move.l d1,(a0)+ ; 12
move.l d1,(a0)+
move.l d1,(a0)+ ; 13
move.l d1,(a0)+
move.l d1,(a0)+ ; 14
move.l d1,(a0)+
move.l d1,(a0)+ ; 15
move.l d1,(a0)+
move.l d1,(a0)+ ; 16
move.l d1,(a0)+
move.l d1,(a0)+ ; 17
move.l d1,(a0)+
move.l d1,(a0)+ ; 18
move.l d1,(a0)+
move.l d1,(a0)+ ; 19
move.l d1,(a0)+
move.l d1,(a0)+ ; 20
exg d1,d2
dbf d0,mc1
move.w #191,d0 ; Linken und rechten Rand
mc3: move.l d1,(a0) ; mit Borderfarbe füllen
move.l d1,4(a0)
move.l d1,8(a0)
move.l d1,12(a0)
move.l d1,160-16(a0)
move.l d1,160-12(a0)
move.l d1,160-8(a0)
move.l d1,160-4(a0)
exg d1,d2
lea 160(a0),a0
dbf d0,mc3
moveq #3,d0 ; Untere 4 Doppelzeilen
mc4: move.l d1,(a0)+ ; mit Border-Farbe füllen
move.l d1,(a0)+ ; 1
move.l d1,(a0)+
move.l d1,(a0)+ ; 2
move.l d1,(a0)+
move.l d1,(a0)+ ; 3
move.l d1,(a0)+
move.l d1,(a0)+ ; 4
move.l d1,(a0)+
move.l d1,(a0)+ ; 5
move.l d1,(a0)+
move.l d1,(a0)+ ; 6
move.l d1,(a0)+
move.l d1,(a0)+ ; 7
move.l d1,(a0)+
move.l d1,(a0)+ ; 8
move.l d1,(a0)+
move.l d1,(a0)+ ; 9
move.l d1,(a0)+
move.l d1,(a0)+ ; 10
move.l d1,(a0)+
move.l d1,(a0)+ ; 11
move.l d1,(a0)+
move.l d1,(a0)+ ; 12
move.l d1,(a0)+
move.l d1,(a0)+ ; 13
move.l d1,(a0)+
move.l d1,(a0)+ ; 14
move.l d1,(a0)+
move.l d1,(a0)+ ; 15
move.l d1,(a0)+
move.l d1,(a0)+ ; 16
move.l d1,(a0)+
move.l d1,(a0)+ ; 17
move.l d1,(a0)+
move.l d1,(a0)+ ; 18
move.l d1,(a0)+
move.l d1,(a0)+ ; 19
move.l d1,(a0)+
move.l d1,(a0)+ ; 20
exg d1,d2
dbf d0,mc4
movem.l (sp)+,a0/d0-d2
rts
buildpage:move.l a0,-(sp)
lea pass,a0
clr.w (a0) ; Index = 0
bp_10: bsr vid_line ; Zeile darstellen
add.w #12,(a0)
cmpi.w #288,(a0)
bne.s bp_10
move.l (sp)+,a0
rts
vid_line: movem.l d0-d7/a0-a6,-(sp)
move.l flags,a5
move.l svmtab,a0
move.w pass,d0
move.l 0(a0,d0.w),a4 ; ST-Screen
move.l 4(a0,d0.w),a6 ; Attributfile
move.l 8(a0,d0.w),a3 ; Spectrum Pixelzeile
move.l ctab,a2
move.l ftab,a1
moveq #10,d6 ; für *1024
moveq #31,d4 ; 32 Chars (a 8 Scans)
move.l ctab,a0
adda.l #120*1024,a0
vl_loo: tst.b (a5) ; attr_sw
beq.s vl_noatt
moveq #0,d1
move.b (a6)+,d1 ; Attribut
move.b 0(a1,d1.l),d1 ; Flash -> Invers
lsl.l d6,d1 ; * 1024
lea 0(a2,d1.l),a0 ; Tabelle für dieses Attribut
vl_noatt: transm1 0,0
transm2 256,80*2
transm1 256*2,80*4
transm2 256*3,80*6
transm1 256*4,80*8
transm2 256*5,80*10
transm1 256*6,80*12
transm2 256*7,80*14
dbf d4,vl_loo
movem.l (sp)+,d0-d7/a0-a6
rts
grey_tab: dc.l $ffffffff,$ffffffff ; BLACK - BRIGHT 0
dc.l $aaaaaaaa,$ffffffff ; BLUE - BRIGHT 0
dc.l $ffffffff,$55555555 ; RED - BRIGHT 0
dc.l $aaaaaaaa,$55555555 ; MAGENTA - BRIGHT 0
dc.l $55555555,$aaaaaaaa ; GREEEN - BRIGHT 0
dc.l $55555555,$ffffffff ; CYAN - BRIGHT 0
dc.l $ffffffff,$00000000 ; YELLOW - BRIGHT 0
dc.l $11111111,$88888888 ; WHITE - BRIGHT 0
dc.l $ffffffff,$ffffffff ; BLACK - BRIGHT 1
dc.l $ffffffff,$aaaaaaaa ; BLUE - BRIGHT 1
dc.l $55555555,$55555555 ; RED - BRIGHT 1
dc.l $55555555,$00000000 ; MAGENTA - BRIGHT 1
dc.l $00000000,$55555555 ; GREEN - BRIGHT 1
dc.l $aaaaaaaa,$aaaaaaaa ; CYAN - BRIGHT 1
dc.l $aaaaaaaa,$00000000 ; YELLOW - BRIGHT 1
dc.l $00000000,$00000000 ; WHITE - BRIGHT 1
vbsem: dc.w 0
pass: dc.w 0
ctab ds.l 1
svmtab ds.l 1
lintab ds.l 1
ftab: ds.l 1
stscrn: ds.l 1
stscrn1: ds.l 1
screen: ds.l 1
flags: ds.l 1
at2px: ds.w 32*24
px2st: ds.w 6144
px2at: ds.w 6144