home *** CD-ROM | disk | FTP | other *** search
- ; TurboTopaz V1.0
- ; by Preben Nielsen
- OPT O+
- ; OPT O1+ ;Tells when a branch could be optimised to short
- ; OPT i+ ;Tells when '#' is probably missing
-
- incdir "INCLUDE:"
- include "exec/memory.i"
- include "exec/exec_lib.i"
- include "graphics/rastport.i"
- include "graphics/text.i"
- include "graphics/graphics_lib.i"
- include "intuition/intuition.i"
- include "libraries/dos.i"
- include "libraries/dos_lib.i"
- include "libraries/diskfont.i"
- include "libraries/diskfont_lib.i"
- include "libraries/dosextens.i"
- include "Workbench/startup.i"
- include "Workbench/workbench.i"
- include "Workbench/icon_lib.i"
-
- LF =10
-
- LoadBase MACRO
- IFNC '\1','ExecBase'
- movea.l \1(PC),A6
- ENDC
- IFC '\1','ExecBase'
- movea.l 4.W,A6
- ENDC
- ENDM
- CallLib MACRO
- jsr _LVO\1(A6)
- ENDM
- Call MACRO
- bsr \1
- ENDM
- Push MACRO
- movem.l \1,-(SP)
- ENDM
- Pop MACRO
- movem.l (SP)+,\1
- ENDM
-
- Arg EQUR A4
- ArgLen EQUR D4
- Installed EQUR D7
-
- Start Push D0-D7/A0-A6
- move.l D0,ArgLen
- move.l A0,Arg
- LoadBase ExecBase
- lea DosName(PC),A1
- CallLib OldOpenLibrary
- move.l D0,DosBase
- beq Exit
- lea GfxName(PC),A1
- CallLib OldOpenLibrary
- move.l D0,GfxBase
- beq Exit
- LoadBase GfxBase
- lea FontAttr(PC),A0
- CallLib OpenFont
- move.l D0,TFont
- move.l D0,FontCheck+2 ;This makes 'cmp.l #Font,52(A1)'
- beq Exit
- FindFunc LoadBase ExecBase
- lea PortName(PC),A1
- CallLib FindPort ;Are we installed ?
- move.l D0,Installed
- suba.l A1,A1
- CallLib FindTask ;Find us
- movea.l D0,A2
- tst.l pr_CLI(A2)
- bne.S CLIStartup
- WBenchStartup lea pr_MsgPort(A2),A0
- CallLib WaitPort ;Wait for a message
- lea pr_MsgPort(A2),A0
- CallLib GetMsg ;Get the message
- move.l D0,WBenchMsg ;Save it for later reply
- tst.l Installed ;Install or Remove ?
- bne.S CLIAndWBStartup
- moveq #0,ArgLen ;Signal that we haven't found args yet
- move.l D0,A2
- move.l sm_NumArgs(A2),D0 ;Any args ?
- move.l sm_ArgList(A2),A2
- subq.l #1,D0
- blt.S CLIAndWBStartup
- beq.S FoundArg
- addq.w #wa_SIZEOF,A2
- FoundArg move.l wa_Lock(A2),D1
- move.l wa_Name(A2),A2 ;Name of icon
- beq.S NoLock
- LoadBase DosBase
- CallLib CurrentDir
- NoLock LoadBase ExecBase
- lea IconName(PC),A1
- CallLib OldOpenLibrary
- move.l D0,IconBase
- beq.S CLIAndWBStartup
- LoadBase IconBase
- move.l A2,A0
- CallLib GetDiskObject ;Get the icon
- move.l D0,DiskObj
- beq.S CLIAndWBStartup
- move.l D0,A2
- move.l do_ToolTypes(A2),A0
- lea FontTxt(PC),A1
- CallLib FindToolType ;Find 'FONT=??????'
- move.l D0,Arg
- move.l D0,ArgLen ;Signal that we have or haven't found args
- bra.S CLIAndWBStartup
- CLIStartup subq.l #1,ArgLen
- clr.b 0(Arg,ArgLen)
- CLIAndWBStartup tst.l Installed ;Install or Remove ?
- beq.S Install
-
- Remove move.l Installed,A1
- lea MyText-MyPort(A1),A1 ;This is the start of the text function
- move.l GfxBase(PC),A0
- cmpa.l _LVOText+2(A0),A1
- lea AlteredTxt(PC),A1
- bne Write2Lines
- move.l Installed,A1
- CallLib RemPort
- move.l Installed,A0
- CallLib Forbid
- move.w #NFuncEnd-NFunc,D0
- lea NFunc(PC),A1
- lea NFunc-MyPort(A0),A0 ;This is the memory we allocated
- Call MemCopy
- movea.w #_LVOText,A0
- movea.l GfxBase(PC),A1
- move.l OldFunc+2(PC),D0 ;Function to restore
- CallLib SetFunction ;Install the old function
- tst.l OFont ;Were we useing unmodified topaz-80
- beq.S DoneResFont
- move.l TFont(PC),A1 ;Restore topaz-80
- lea tf_YSize(A1),A1
- lea TopazMisc(PC),A0
- moveq #tf_SIZEOF-tf_YSize,D0
- move.w tf_Accessors(A1),D1
- Call MemCopy
- move.w D1,tf_Accessors(A1)
- DoneResFont CallLib Permit
- lea RemovedTxt(PC),A1
- bra Write2Lines
-
-
- Install tst.l ArgLen
- ble DoneLoadFont
- move.l Arg,FontAttr
- LoadBase GfxBase
- lea FontAttr(PC),A0
- move.b #FPB_DISKFONT,ta_Flags(A0)
- CallLib OpenFont
- tst.l D0
- bne.S FoundFont
- LoadBase ExecBase
- lea DFName(PC),A1
- CallLib OldOpenLibrary
- lea NoLibTxt(PC),A1
- move.b #LF,35(A1) ;Set a LF
- move.l D0,DFBase
- beq Write2Lines
- LoadBase DFBase
- lea FontAttr(PC),A0
- CallLib OpenDiskFont
- move.l D0,D7
- LoadBase ExecBase
- movea.l DFBase(PC),A1
- CallLib CloseLibrary
- move.l D7,D0
- FoundFont move.l D0,OFont
- lea NoFontTxt(PC),A1
- beq Write2Lines
- move.l D0,A0
- move.l TFont(PC),A2
- moveq #8,D0
- lea Not8x8Txt(PC),A1
- cmp.w tf_YSize(A0),D0
- bne Write2Lines
- cmp.w tf_XSize(A0),D0
- bne Write2Lines
- lea Mismatch(PC),A1
- move.w tf_Baseline(A0),D0
- cmp.w tf_Baseline(A2),D0
- bne Write2Lines
- lea CantUseProp(PC),A1
- btst #FPB_PROPORTIONAL,tf_Flags(A0)
- bne Write2Lines
- DoneLoadFont LoadBase ExecBase
- move.l #BufMem,D0
- move.l #MEMF_CHIP!MEMF_CLEAR,D1
- CallLib AllocMem ;Allocate memory for temporary text
- lea NoMemTxt(PC),A1
- move.l D0,BMem
- beq Write2Lines
- move.l #FuncMem+CharMem,D0
- move.l #MEMF_PUBLIC!MEMF_CLEAR,D1
- CallLib AllocMem ;Allocate memory for function
- lea NoMemTxt(PC),A1
- move.l D0,FMem
- beq Write2Lines
- CallLib Forbid
- tst.l OFont
- beq.S DoneRepFont ;Shall we use unmodified topaz-80
- move.l TFont(PC),A0 ;Save something from topaz-80
- lea tf_YSize(A0),A0
- lea TopazMisc(PC),A1
- moveq #tf_SIZEOF-tf_YSize,D0
- Call MemCopy
- move.l OFont(PC),A0 ;Overwrite topaz-80
- lea tf_YSize(A0),A0
- move.l TFont(PC),A1
- lea tf_YSize(A1),A1
- moveq #tf_SIZEOF-tf_YSize,D0
- move.w tf_Accessors(A1),D1
- Call MemCopy
- move.w D1,tf_Accessors(A1)
- DoneRepFont move.l TFont(PC),A0
- move.w tf_Baseline(A0),D0
- andi.w #%0000000000000111,D0
- lsl.w #8,D0
- lsl.w #1,D0
- ori.w #%0101000101000011,D0
- move.w D0,SubBaseLine ;We just made a subq.w tf_baseline,D3
- move.w tf_Modulo(A0),D1
- moveq #0,D5
- moveq #0,D6
- move.b tf_LoChar(A0),D5
- move.b tf_HiChar(A0),D6
- movea.l tf_CharData(A0),A1
- movea.l tf_CharLoc(A0),A2
- movea.l FMem(PC),A0
- lea FontData-NFunc(A0),A0
- moveq #0,D7 ;0 to tf_LoChar-1 dummy characters
- LowLoop cmp.w D5,D7
- bge.S MidLoop
- move.l D6,D0
- sub.l D5,D0
- addq.l #1,D0
- Call CopyChar
- addq.l #1,D7
- bra.S LowLoop
- MidLoop cmp.w D6,D7 ;tf_LoChar to tf_HiChar real characters
- bgt.S HighLoop
- move.l D7,D0
- sub.l D5,D0
- Call CopyChar
- addq.l #1,D7
- bra.S MidLoop
- HighLoop cmpi.w #255,D7 ;tf_HiChar to 255 dummy characters
- bgt.S InstallFunction
- move.l D6,D0
- sub.l D5,D0
- addq.l #1,D0
- Call CopyChar
- addq.l #1,D7
- bra.S HighLoop
- InstallFunction
- move.w #NFuncEnd-NFunc,D0
- lea NFunc(PC),A0
- movea.l FMem(PC),A1
- movea.l A1,A2
- Call MemCopy
- LoadBase ExecBase
- lea MyPort-NFunc(A2),A1
- lea PortName-NFunc(A2),A0
- move.l A0,10(A1) ;Set portname
- CallLib AddPort
- moveq #MyText-NFunc,D0
- add.l A2,D0
- lea FontCheck+2-NFunc(A2),A1
- move.l A1,LockFunc+2-NFunc(A2) ;\
- move.l A1,UnLockFunc+2-NFunc(A2) ; \Modify some absolute code
- move.l GfxBase(PC),A1 ; /
- move.l _LVOText+2(A1),OldFunc+2-NFunc(A2) ;/Save the address of the old 'Text' function
- move.w #_LVOText,A0
- CallLib SetFunction
- move.l D0,OldFunc+2-NFunc(A2) ;Save the address of the old 'Text' function
- clr.l BMem ;\
- clr.l FMem ; >Don't free memory until we are re-run
- clr.l OFont ;/
- CallLib Permit
- lea FontName(PC),A1
- move.l FontAttr(PC),A0
- CopyFName move.b (A0)+,(A1)+
- bne.S CopyFName
- move.b #LF,-1(A1)
- clr.b (A1)
- lea InstalledTxt(PC),A1
- Write2Lines Call OpenCON ;A0/A1=First/Second line
- lea NameOfFunc(PC),A0
- Call WriteCON
- move.l A1,A0
- Call WriteCON
- Call CloseCON
- bra.S Exit
-
- ;D0=character to copy (0-256)
- ;D1=tf_Modulo
- ;A0=where to put character
- ;A1=tf_CharData
- ;A2=tf_CharLoc
- CopyChar lsl.w #2,D0
- move.w (A2,D0),D0 ;D0=bitoffset into tf_CharData
- lsr.w #3,D0 ;D0=byteOffset info tf_CharData
- lea 0(A1,D0.W),A3 ;Here is the character bitmap
- moveq #7,D0
- CharLoop move.b (A3),(A0)+
- adda.w D1,A3
- dbf D0,CharLoop
- rts
-
- Exit
- FreeTopaz LoadBase GfxBase
- move.l TFont(PC),D0
- beq.S FreeFont
- movea.l D0,A1
- CallLib CloseFont
- FreeFont move.l OFont(PC),D0
- beq.S FreeBMem
- movea.l D0,A1
- CallLib CloseFont
- FreeBMem LoadBase ExecBase
- move.l BMem(PC),D0
- beq.S FreeFMem
- movea.l D0,A1
- move.l #BufMem,D0
- CallLib FreeMem ;Free temporary buffer
- FreeFMem move.l FMem(PC),D0
- beq.S FreeGfx
- movea.l D0,A1
- move.l #FuncMem+CharMem,D0
- CallLib FreeMem ;Free function and character memory
- FreeGfx move.l GfxBase(PC),D0
- beq.S FreeDos
- movea.l D0,A1
- CallLib CloseLibrary
- FreeDos move.l DosBase(PC),D0
- beq.S Flush
- movea.l D0,A1
- CallLib CloseLibrary
- Flush moveq #0,D1 ;Flush unused libs, fonts etc.
- move.l #$FFFFFF,d0
- CallLib AllocMem
- ReplyWB move.l WBenchMsg(PC),D0
- beq.S AllDone
- move.l DiskObj(PC),D0
- beq.S FreeIcon
- move.l D0,A0
- LoadBase IconBase
- CallLib FreeDiskObject
- FreeIcon LoadBase ExecBase
- move.l IconBase(PC),D0
- beq.S WBEnd
- move.l D0,A1
- CallLib CloseLibrary
- WBEnd CallLib Forbid
- movea.l WBenchMsg(PC),A1
- CallLib ReplyMsg ;Reply WBenchMessage if we are started from WB
- AllDone Pop D0-D7/A0-A6
- moveq #0,D0
- rts
-
- OpenCON Push D0-D7/A0-A6
- LoadBase DosBase
- tst.l WBenchMsg
- beq.S FromCLI
- FromWB move.l #CONName,D1
- move.l #MODE_OLDFILE,D2
- CallLib Open
- bra.S DoneOpen
- FromCLI CallLib Output
- DoneOpen move.l D0,Handle
- bra.S DoneCON
- ;A0=NULL terminated text to write
- WriteCON Push D0-D7/A0-A6
- LoadBase DosBase
- move.l Handle(PC),D1
- beq.S DoneCON
- move.l A0,D2
- moveq #-1,D3
- strlenLoop addq.l #1,D3
- tst.b (A0)+
- bne.S strlenLoop
- CallLib Write
- bra.S DoneCON
- CloseCON Push D0-D7/A0-A6
- LoadBase DosBase
- move.l Handle(PC),D2
- beq.S DoneCON
- tst.l WBenchMsg
- beq.S DoneCON
- move.l #150,D1
- CallLib Delay
- move.l D2,D1
- CallLib Close
- DoneCON Pop D0-D7/A0-A6
- rts
-
- ;A0=Source, A1=Dest, D0:16=count
- MemCopy Push D0/A0-A1
- subq.w #1,D0
- MemLoop move.b (A0)+,(A1)+
- dbf D0,MemLoop
- Pop D0/A0-A1
- rts
-
- ;================ Here comes the new Text-Function =================
- Rp EQUR A1
- BData EQUR A2
- Buf EQUR A3
- CharData EQUR A4
-
- ;D0=count D1=ascii D2=x D3=y
- ;D4=count D5=temp. A4 D6=not used D7=not used
- ;A0=string A1=RastPort A2=bitmap data A3=temp buffer
- ;A4=CharData A5=layer A6=GfxBase A7=SP
- * Put the code between NFunc and NFuncEnd
- NFunc
- OldFunc jmp 12345678 ;This instruction will be changed by the installation
- MyText tst.b rp_AlgoStyle(Rp) ;We can only write strings with style 0
- bne.S OldFunc
- cmpi.w #MaxL,D0 ;Is string too long for this MyText
- bgt.S OldFunc
- FontCheck cmp.l #12345678,rp_Font(Rp) ;This instruction will be changed by the installation
- bne.S OldFunc
- LockFunc not.w 12345678 ;This instruction will be changed by the installation
- Push D2-D5/A2-A5
- move.l D0,D4
- beq.S UnLockFunc
- move.l (Rp),D1
- move.l D1,A5
- beq.S LetsWrite
- CallLib LockLayerRom ;Commodore says this doesn't destroy registers
- LetsWrite move.l BMem(PC),Buf ;Get BMem pointer
- move.l Buf,D5
- lea FontData(PC),CharData
- subq.w #1,D0
- MoveChar moveq #0,D1
- move.b (A0)+,D1
- asl.w #3,D1
- movea.l CharData,BData
- adda.w D1,BData ;Find bitmap-data
- move.b (BData)+,(Buf)+
- move.b (BData)+,1*MaxL-1(Buf)
- move.b (BData)+,2*MaxL-1(Buf)
- move.b (BData)+,3*MaxL-1(Buf)
- move.b (BData)+,4*MaxL-1(Buf)
- move.b (BData)+,5*MaxL-1(Buf)
- move.b (BData)+,6*MaxL-1(Buf)
- move.b (BData)+,7*MaxL-1(Buf)
- dbra D0,MoveChar
- move.l D5,A0
- moveq #0,D0
- moveq #MaxL,D1
- movem.w rp_cp_x(Rp),D2-D3
- SubBaseLine subq.w #1,D3 ;This instruction will be changed by the installation
- lsl.w #3,D4
- add.w D4,rp_cp_x(Rp)
- moveq #8,D5 ;Height
- CallLib BltTemplate
- move.l A5,D0
- beq.S UnLockFunc
- CallLib UnlockLayerRom
- UnLockFunc not.w 12345678 ;This instruction will be changed by the installation
- Pop D2-D5/A2-A5
- jmp _LVOWaitBlit(A6)
- FMem dc.l 0
- BMem dc.l 0 ;Buffer to blit from
- TFont dc.l 0
- OFont dc.l 0
- TopazMisc dcb.b tf_SIZEOF-tf_YSize,0
- MyPort
- ;struct MsgPort {
- ; struct Node { ;struct Node mp_Node;
- dc.l 0 ;struct Node *ln_Succ;
- dc.l 0 ;struct Node *ln_Pred;
- dc.b 0 ;UBYTE ln_Type;
- dc.b 0 ;BYTE ln_Pri;
- dc.l PortName;char *ln_Name;
- ; }
- dc.b 0 ;UBYTE mp_Flags;
- dc.b 0 ;UBYTE mp_SigBit;
- dc.l 0 ;struct Task *mp_SigTask;
- ; struct List { ;struct List mp_MsgList;
- dc.l 0 ;struct Node *lh_Head;
- dc.l 0 ;struct Node *lh_Tail;
- dc.l 0 ;struct Node *lh_TailPred;
- dc.b 0 ;UBYTE lh_Type;
- dc.b 0 ;UBYTE l_pad;
- ; }
- ;}
- PortName dc.b 'TurboTopaz.Port',0
- NFuncEnd
- FontData
- MaxL =90 ;Longest string MyText can write
- FuncMem =NFuncEnd-NFunc
- CharMem =8*256
- BufMem =8*MaxL
-
- FontTxt dc.b 'FONT',0
- NameOfFunc dc.b $9B,'1;33mTurboTopaz ',$9B,'0;31mV1.0 by ',$9B,'3;33mPreben Nielsen',$9B,'0;31m in 1990',LF,0
- InstalledTxt dc.b ' TurboTopaz has now been installed with '
- FontName
- RemovedTxt dc.b ' TurboTopaz has now been removed',LF,0
- AlteredTxt dc.b " ERROR: The 'Text' Vector has been changed. Can't remove",LF,0
- Mismatch dc.b " ERROR: Baseline mismatch",LF,0
- CantUseProp dc.b " ERROR: Can't use Proportional font",LF,0
- Not8x8Txt dc.b " ERROR: Not a 8x8 font",LF,0
- NoFontTxt dc.b " ERROR: Can't open font",LF,0
- NoMemTxt dc.b " ERROR: Can't get memory",LF,0
- NoLibTxt dc.b " ERROR: Can't open "
- DFName dc.b 'diskfont.library',0,0
- DosName dc.b 'dos.library',0
- GfxName dc.b 'graphics.library',0
- IconName dc.b 'icon.library',0
- CONName dc.b 'CON:40/40/500/45/This window goes away after 3 seconds',0
- EVEN
- DiskObj dc.l 0
- DosBase dc.l 0
- GfxBase dc.l 0
- DFBase dc.l 0
- IconBase dc.l 0
- WBenchMsg dc.l 0
- Handle dc.l 0
-
- FontAttr dc.l TopazName
- dc.w TOPAZ_EIGHTY
- dc.b FS_NORMAL,FPB_ROMFONT
- TopazName dc.b 'topaz.font',0
- END
-
-