Copy Link
Add to Bookmark
Report

BlitMono V1.00 for Atari STE

atari's profile picture
Published in 
atari
 · 5 Dec 2020

BlitMono V1.00
by
Tony Hoyle

9-10 January 1990

This program is Public Domain. It may be freely copied or distributed as long as the archive is left intact. It should contain the three files:
MONO.PRG
MONO.S
MONO.DOC

Instructions

This program sits in your AUTO folder, and does not become active unless you hold down Control and Left Shift during bootup. Once the program is active you have what is effectively a Mono ST, running at about 71% of normal speed. When used with QUICK-ST you won't notice the speed drop at all.

The present version is for the STE only, but could be converted if anyone wants to try. The only changes needed are references to $FF820D, which is the screen low-byte on the STE.

Future updates will be loaded onto CIX as soon as I write them.

Tony Hoyle
thoyle@cix
Prestel 219997548

MONO.S

  
* BlitMono V1.0 - This version is for the STE only, although it could
* be made to work on and ST by removing references to $FF820D and aligning
* the screens properly. QINDEX gives about 71% on CPU operations with this
* installed (98% on Divide and Shift operations).

* This version does not handle the screen colours correctly - I have found
* that it isn't as easy as just checking bit 0 of $FF8240.W, since the
* system does wierd things whilst setting the pallette up.

* Written on Devpac 2 with tabs 16 characters wide (it looks a mess with 8
* character tabs).

DaStart: move.w #-1,-(sp)
move.w #11,-(sp)
trap #13 * Fetch Shift values
addq #4,sp
and.b #6,d0 * Mask off CTRL+Shift
cmp.b #6,d0 * Were they pressed?
bne NoMono * Jump if not
pea.l Install
move.w #38,-(sp)
trap #14 * Install vectors
addq #6,sp

clr.w -(sp)
move.w #64,-(sp) * Blitter off
trap #14
addq #4,sp

move.w #2,-(sp) * Switch to mono mode
pea.l $ffffffff
pea.l $ffffffff
move.w #5,-(sp) * Set screen params
trap #14
lea.l 12(sp),sp

pea.l InitMsg * 'BlitMono Installed'
move.w #9,-(sp)
trap #1
addq #6,sp

clr.w -(sp) * Success
pea.l DaEnd-DaStart+$100 * Bytes to keep
move.w #49,-(sp) * Terminate+Stay resident
trap #1

* If relevant keys not pressed output a message and finish.

NoMono: pea.l NoInitMsg * 'BlitMono not installed'
move.w #9,-(sp)
trap #1
addq #6,sp
clr.w -(sp) * Back to GEMDOS
trap #1

* Revector Level 3 interrupt (Vblank) and TRAP #14 (XBIOS)

Install: move.l $70,OldVblank * Store old vector
move.l #VBlank,$70 * ..And new one
move.l $b8,OldXBIOS * Do the same for
move.l #XBIOS,$b8 * the XBIOS
clr.b MonoCounter * Reset counter
rts

* Revectored XBIOS routines

OldXBIOS: ds.l 1
dc.b 'XBRAMONO'

XBIOS: lea.l 6(sp),a0 * a0 points SSP data
btst.b #5,(sp) * User mode?
bne XBIOSSuper * Jump if not
move usp,a0 * a0 points to USP data
XBIOSSuper: cmp.w #2,(a0)
beq PhysBase * Physical base addr
cmp.w #4,(a0)
beq GetRez * Logical base addr
cmp.w #5,(a0)
beq SetScreen * Set parameters
cmp.w #64,(a0)
beq BlitMode * Disable Blitter
bra DoOldXBIOS

PhysBase: move.l MonoBase,d0 * Physical screen base
rte
GetRez: move.l #2,d0 * Mono Mode
rte
SetScreen: move.w #2,10(a0) * Switch it
bra DoOldXBIOS

* It is important that GEM does not attempt to use the blitter whilst
* BlitMono is running, because an interrupt in the middle of a GEM Blit
* could be disastrous.

BlitMode: clr.w 2(a0) * Remove blitter

DoOldXBIOS: move.l OldXBIOS,-(sp)
rts

* Vblank routine - keep things in order and do the actual work.

OldVblank: ds.l 1
dc.b 'XBRAMONO'

VBlank: movem.l a0-a1/d0-d1,-(sp) * Store regs
move.w #$BBB,$ff8242 * Colour 7 =3+8
move.w #$BBB,$ff8244 * (b0 b3 b2 b1)
clr.w $ff8240 * Black Background
move.w #$fff,$ff8246 * White Foreground

clr.l d0
move.b $ff8201,d0 * Hi-Byte
lsl.w #8,d0
move.b $ff8203,d0 * Med-Byte
lsl.l #8,d0
move.b $ff820d,d0 * Lo-Byte (STE ONLY!)
cmp.l #MediumScreen,d0 * At correct pos?
beq VBlank1 * If so skip
move.l d0,MonoBase * My Base Addr

VBlank1: tst.l $45e * New screen?
beq VBlank2 * If not skip
move.l $45e,d0 * Medium-Rez screen
move.l d0,MonoBase * My Base Addr
clr.l $45e * No change
VBlank2: move.l MonoBase,MonoLocation * Loc of Mono Screen

move.b #1,$ff8260 * Medium Rez
move.b #2,$44c * Shiftmode register
move.l #MediumScreen,d0 * Medium rez screen
move.l d0,MediumLocation * Location of screen
move.b d0,d1 * Low byte (save)
lsr.l #8,d0
move.b d0,$ff8203 * Screen Mid
lsr.w #8,d0
move.b d0,$ff8201 * Screen Hi
move.b d1,$ff820d * Screen Low (STE ONLY!)

move.b MonoCounter,d0 * Fetch counter
addq #1,d0 * Increase counter
btst.b d0,#$7 * Believe it or not this
* is legal 68000 (although
* it is undocumented). If
* your assembler doesn't
* accept it replace with
* other instructions.
sne d1 * D1=$FF if D0 <> 3
and.b d1,d0 * Wrap at 3
move.b d0,MonoCounter * Back to memory
btst.l #1,d0 * Run-Phase?
bne MonoEnd * If not skip to end
btst.l #0,d0 * Odd?
bne Mono2 * If so do odd lines

Mono1: lea.l BlitMono1,a0 * Blitter codes
bsr DoBlit * Blit it
bra MonoEnd * Jump to end

Mono2: lea.l BlitMono1,a0 * Blitter codes
add.l #80,MonoLocation * Mono screen
addq.l #2,MediumLocation * Medium screen
bsr DoBlit * Blit it

MonoEnd: movem.l (sp)+,a0-a1/d0-d1 * Fetch regs
move.l OldVblank,-(sp) * Old vector
rts * Indirect return

DoBlit: btst.b #7,$ff8a3c * Blitter busy?
bne DoNoBlit * If so skip this blit
lea.l $ff8a20,a1 * Blitter base addr
move.w #6,d0 * 31 words to transfer
move.w sr,d1
or.w #$0700,sr
BlitLoop: move.l (a0)+,(a1)+ * Transfer word
dbra d0,BlitLoop * Do all of it
clr.b $ff8a3d
move.b #$80,$ff8a3c * Blitter now busy
move.w d1,sr
DoNoBlit: rts

section data

* Blitter ops for Mono -> medium

BlitMono1: dc.w 2 * Source Increment X
dc.w 80 * Source Increment Y
MonoLocation: dc.l MediumScreen * Source Address
dc.w $ffff * Endmask 1
dc.w $ffff * Endmask 2
dc.w $ffff * Endmask 3
dc.w 4 * Destination Increment X
dc.w 1 * Destination Increment Y
MediumLocation: dc.l MediumScreen * Destination Address
dc.w 41 * Words yet to be written
dc.w 200 * Lines yet to be written
dc.b 2 * Halftone operation
dc.b 3 * Logic operation

InitMsg: dc.b 'BlitMono V1.0 by Tony Hoyle - Installed.',0

NoInitMsg: dc.b 'BlitMono V1.0 by Tony Hoyle january 1990',13,10
dc.b 'STE version.',13,10
dc.b 'Hold Down CTRL+Left Shift to use.',0

section bss

MonoCounter: ds.b 1

even

MonoBase: ds.l 1
MediumScreen: ds.b 32000

DaEnd: equ *

← previous
next →
loading
sending ...
New to Neperos ? Sign Up for free
download Neperos App from Google Play
install Neperos as PWA

Let's discover also

Recent Articles

Recent Comments

Neperos cookies
This website uses cookies to store your preferences and improve the service. Cookies authorization will allow me and / or my partners to process personal data such as browsing behaviour.

By pressing OK you agree to the Terms of Service and acknowledge the Privacy Policy

By pressing REJECT you will be able to continue to use Neperos (like read articles or write comments) but some important cookies will not be set. This may affect certain features and functions of the platform.
OK
REJECT