home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Fish 2
/
goldfish_vol2_cd1.bin
/
files
/
gfx
/
conv
/
charmap
/
charmap.asm
< prev
next >
Wrap
Assembly Source File
|
1994-04-09
|
22KB
|
1,069 lines
DEBUGBOOL = 0 ; (TRUE = debugging)
;; *********************************************************
* Programm: CharMap V1.0 *
* (converts single-plane ILBM-pic *
* into ASCII-File, optionally *
* using ESC[7m ANSI-Command *
* Copyright: Freeware (C)opyright by Hanns *
* Holger Rutz *
* Date: 14.-16.01.1994 *
* 09.05.94 - fixed a usage "bug" *
* Assembler: AsmOne V1.02 *
*********************************************************
;;-- Includes ---------------------------------------------
incdir 'work:pax/asm/inc/'
include 'dos/dosasl.i'
include 'dos/dosextens.i'
include 'exec/memory.i'
include 'graphics/displayinfo.i'
include 'graphics/text.i'
include 'intuition/intuition.i'
include 'libraries/iffparse.i'
include 'private/diskfont_lib.i'
include 'private/dos_lib.i'
include 'private/gfx_lib.i'
include 'private/iffparse_lib.i'
include 'private/intuition_lib.i'
include 'private/macros.i'
;;-- Konstanten -------------------------------------------
cmpNone = 0
cmpByteRun1 = 1
STRUCTURE BitMapHeader,0
UWORD bmh_Width; ; Width in pixels
UWORD bmh_Height ; Height in pixels
WORD bmh_Left ; Left position
WORD bmh_Top ; Top position
UBYTE bmh_Depth ; Number of planes
UBYTE bmh_Masking ; Masking type
UBYTE bmh_Compression ; Compression type
UBYTE bmh_Pad
UWORD bmh_Transparent ; Transparent color
UBYTE bmh_XAspect
UBYTE bmh_YAspect
WORD bmh_PageWidth
WORD bmh_PageHeight
LABEL BitMapHeader_SIZEOF
ID_ILBM = 'ILBM'
ID_BMHD = 'BMHD'
ID_BODY = 'BODY'
ID_CAMG = 'CAMG'
rsreset
gl_LibBases rs.b 0
gl_DOSBase rs.l 1
gl_DiskFontBase rs.l 1
gl_GfxBase rs.l 1
gl_IFFParseBase rs.l 1
gl_IntuiBase rs.l 1
gl_PAD rs.b 0
NumLibs = (gl_PAD-gl_LibBases)/4
gl_RDArgs rs.l 1
gl_ArgArray rs.b 0
gl_aFrom rs.l 1
gl_aTo rs.l 1
gl_aFont rs.l 1
gl_aSize rs.l 1
gl_aANSI rs.l 1
gl_ViewMode rs.l 1
gl_Image rs.b ig_SIZEOF
gl_TextFont rs.l 1
gl_Screen rs.l 1
gl_Window rs.l 1
gl_OldWin rs.l 1
gl_RPort rs.l 1
gl_Process rs.l 1
gl_Result2 rs.l 1
gl_Return rs.b 1
rsword
gl_SIZEOF rs.b 0
;;-- Code-Start -------------------------------------------
section Text,code
_Start
_NextSeg = _Start-4
moveq.l #gl_SIZEOF/2-1,d0
.ClearLoop clr.w -(sp)
dbra d0,.ClearLoop
movea.l sp,gl
move.b #RETURN_FAIL,gl_Return(gl)
exec a0
move.l ThisTask(a0),gl_Process(gl)
bsr.w _OpenLibs
beq.b _CleanUp
IF DEBUGBOOL
move.l #.DEBUGFROM,gl_aFrom(gl)
move.l #.DEBUGTO,gl_aTo(gl)
move.l #.DEBUGFONT,gl_aFont(gl)
move.l #.DEBUGSIZE,gl_aSize(gl)
move.l #.DEBUGANSI,gl_aANSI(gl)
bra.b .DEBUGCONT
.DEBUGFROM dc.b 'Work:Gfx/Pix/Test',0
.DEBUGTO dc.b 'RAM:Test',0
.DEBUGFONT dc.b 'topaz.font',0
even
.DEBUGSIZE dc.l 8
.DEBUGANSI = -1
.DEBUGCONT
ELSE
bsr.w _GetArgs
beq.b _CleanUp
ENDC
bsr.w _LoadILBM
beq.b _CleanUp
bsr.w _LoadFont
beq.b _CleanUp
;;-- Main stuff goin' on ----------------------------------
_Main bsr.w _OpenDisplay
beq.b _CleanUp
slib Intui
movea.l gl_Window(gl),a0
movea.l _NextSeg(pc),a1
adda.l a1,a1
adda.l a1,a1
addq.l #4,a1
moveq.l #16,d0
moveq.l #16,d1
moveq.l #-6,d2
moveq.l #0,d3
fjsr SetPointer
bsr.w _CreateText
beq.b _CleanUp
bgt.b .Break
clr.b gl_Return(gl)
slib Intui
movea.l gl_Window(gl),a0
fjsr ClearPointer
movea.l gl_Window(gl),a0
movea.l wd_UserPort(a0),a0
move.l #SIGBREAKF_CTRL_C,d0
move.b MP_SIGBIT(a0),d1
bset.l d1,d0
exec
fjsr Wait
bra.b _CleanUp
.Break move.b #RETURN_WARN,gl_Return(gl)
;||
;;-- Aufräumen --------------------------------------------
_CleanUp bsr.w _FreeAll
moveq.l #0,d0
move.b gl_Return(gl),d0
beq.b .Quit
movea.l gl_Process(gl),a0
move.l gl_Result2(gl),pr_Result2(a0)
.Quit lea.l gl_SIZEOF(sp),sp
rts
dc.b '$VER: CharMap 1.0 (16-Jan-94)',0
even
;;-- Libraries öffnen -------------------------------------
; Out: cc=eq, wenn Fehler
_OpenLibs push d0-d2/a0-a3/lb
lea.l gl_LibBases(gl),a2
moveq.l #NumLibs,d2
lea.l .LibNames(pc),a3
exec
.Loop subq.w #1,d2
blt.b .DoneIt
movea.l a3,a1
moveq.l #36,d0
fjsr OpenLibrary
move.l d0,(a2)+
beq.b .Error
.NextLoop tst.b (a3)+
bne.b .NextLoop
bra.b .Loop
.DoneIt moveq.l #-1,d0
.Exit pull d0-d2/a0-a3/lb
rts
.Error slib DOS,d0
beq.b .ErrCont
movea.l d0,lb
lea.l .ErrTxt(pc),a0
move.l a0,d1
move.l a3,-(sp)
move.l sp,d2
fjsr VPrintf
addq.l #4,sp
.ErrCont moveq.l #ERROR_INVALID_RESIDENT_LIBRARY,d0
move.l d0,gl_Result2(gl)
clr.b d0
bra.b .Exit
.ErrTxt dc.b 'Unable to open "%s" V36+!',$0A,0
.LibNames dc.b 'dos.library',0
dc.b 'diskfont.library',0
dc.b 'graphics.library',0
dc.b 'iffparse.library',0
dc.b 'intuition.library',0
even
;;-- Alles freigeben --------------------------------------
_FreeAll push d0-d2/a0-a2/lb
move.l gl_Window(gl),d2
beq.b .WindowCont
movea.l gl_Process(gl),a0
move.l gl_OldWin(gl),pr_WindowPtr(a0)
movea.l d2,a0
slib Intui
fjsr ClearPointer
movea.l d2,a0
fjsr CloseWindow
.WindowCont
move.l gl_Screen(gl),d0
beq.b .ScreenCont
movea.l d0,a0
slib Intui
fjsr CloseScreen
.ScreenCont
move.l gl_TextFont(gl),d0
beq.b .FontCont
movea.l d0,a1
slib Gfx
fjsr CloseFont
.FontCont
move.l gl_Image+ig_ImageData(gl),d0
beq.b .PlaneCont
movea.l d0,a1
exec
fjsr FreeVec
.PlaneCont
move.l gl_RDArgs(gl),d1
beq.b .ArgsCont
slib DOS
fjsr FreeArgs
.ArgsCont
moveq.l #NumLibs,d2
lea.l gl_LibBases(gl),a2
exec
.LibLoop subq.w #1,d2
blt.b .LibCont
move.l (a2)+,d0
beq.b .LibLoop
movea.l d0,a1
fjsr CloseLibrary
bra.b .LibLoop
.LibCont
pull d0-d2/a0-a2/lb
rts
;;-- Shell-Args readen ------------------------------------
; Out: cc=eq, wenn Fehler
_GetArgs push d0-d3/a0-a2/lb
lea.l .FontName(pc),a0
move.l a0,gl_aFont(gl)
lea.l .FontSize(pc),a0
move.l a0,gl_aSize(gl)
slib DOS
lea.l .Template(pc),a0
move.l a0,d1
lea.l gl_ArgArray(gl),a0
move.l a0,d2
moveq.l #0,d3
fjsr ReadArgs
move.l d0,gl_RDArgs(gl)
beq.b .Error
.Exit pull d0-d3/a0-a2/lb
rts
.Error fjsr IoErr
move.l d0,gl_Result2(gl)
fjsr Cli
movea.l d0,a0
move.w .FontSize+2(pc),-(sp)
pea.l .FontName(pc)
move.l cli_CommandName(a0),-(sp)
move.l sp,d2
lea.l .UsageTxt(pc),a0
move.l a0,d1
fjsr VPrintf
lea.l 10(sp),sp
clr.b d0
bra.b .Exit
.FontSize dc.l 8
.FontName dc.b 'topaz.font',0
.Template dc.b 'FROM/A,TO/A,FONT,SIZE/K/N,ANSI/S',0
.UsageTxt dc.b 'Usage: %b <ILBM> <Target> [<Font> SIZE <Height>] [AN'
dc.b 'SI]',$0A,$0A
dc.b ' <ILBM> Picturefile, must be IF'
dc.b 'F/ILBM with 2 colors.',$0A
dc.b ' <Target> Textfile that shall be '
dc.b 'created.',$0A
dc.b ' <Font> SIZE <Height> Fixed-width font to use'
dc.b ', defaults to',$0A
dc.b ' "%s" (height %d).'
dc.b $0A
dc.b ' ANSI Allow CharMap to use AN'
dc.b "SI's reverse command.",$0A,$0A,0
even
;;-- ILBM-Bild laden ------------------------------------------------
; Out: cc=eq, wenn Fehler
_LoadILBM push d0-d7/a0-a3/lb
clr.l -(sp)
movea.l sp,a3
;moveq.l #0,d4
moveq.l #0,d5
moveq.l #0,d7
slib DOS
move.l gl_aFrom(gl),d1
move.l #MODE_OLDFILE,d2
fjsr Open
move.l d0,d4
beq.w .DOSErr
slib IFFParse
fjsr AllocIFF
move.l d0,d5
beq.w .IFFErr
movea.l d5,a0
fjsr InitIFFasDOS
movea.l d5,a0
move.l d4,iff_Stream(a0)
moveq.l #IFFF_READ,d0
fjsr OpenIFF
tst.l d0
bne.w .IFFErr
moveq.l #1,d7
movea.l d5,a0
lea.l .Chunx(pc),a1
moveq.l #(.ChunkEnd-.Chunx)/8,d0
fjsr PropChunks
tst.l d0
bne.w .IFFErr
movea.l d5,a0
move.l #ID_ILBM,d0
move.l #ID_BODY,d1
fjsr StopChunk
tst.l d0
bne.w .IFFErr
movea.l d5,a0
moveq.l #IFFPARSE_SCAN,d0
fjsr ParseIFF
tst.l d0
beq.b .ParseOk
cmpi.l #IFFERR_EOF,d0
bne.w .IFFErr
.ParseOk
movea.l d5,a0
move.l #ID_ILBM,d0
move.l #ID_CAMG,d1
fjsr FindProp
tst.l d0
beq.b .NoCAMG
movea.l d0,a0
movea.l spr_Data(a0),a0
move.l (a0),gl_ViewMode(gl)
.NoCAMG
movea.l d5,a0
move.l #ID_ILBM,d0
move.l #ID_BMHD,d1
fjsr FindProp
tst.l d0
beq.w .NoBMHD
movea.l d0,a0
movea.l spr_Data(a0),a0
cmpi.b #1,bmh_Depth(a0)
bne.w .WrongDepth
move.b bmh_Compression(a0),d6
cmpi.b #cmpByteRun1,d6
bhi.w .UnknownComp
move.w bmh_Width(a0),gl_Image+ig_Width(gl)
move.w bmh_Height(a0),gl_Image+ig_Height(gl)
exec
move.w gl_Image+ig_Width(gl),d2
addi.w #15,d2
lsr.w #4,d2
add.w d2,d2
mulu.w gl_Image+ig_Height(gl),d2
move.l d2,d0
moveq.l #MEMF_CHIP,d1
fjsr AllocVec
move.l d0,gl_Image+ig_ImageData(gl)
beq.w .NoPlane
movea.l d0,a2
slib IFFParse
movea.l d5,a0
fjsr CurrentChunk
tst.l d0
beq.w .NoBODY
movea.l d0,a0
cmpi.l #ID_BODY,cn_ID(a0)
bne.w .NoBODY
move.l cn_Size(a0),d3
tst.b d6
beq.w .cmpNone
; IF BIT7 SET, CRUNCH=ON -> NUMBER =-BYTE+1
; ELSE, CRUNCH=OFF -> NUMBER = BYTE+1
.cmpByteRun1 tst.l d3
beq.w .BODYDone
movea.l d5,a0
movea.l a3,a1
moveq.l #1,d0
fjsr ReadChunkBytes
tst.l d0
blt.w .IFFErr
subq.l #1,d0
bne.w .InvalidBODY
moveq.l #0,d0
move.b (a3),d0
blt.b .cmpBR1Pack
addq.l #1,d0
subq.l #1,d3
sub.l d0,d3
blt.w .InvalidBODY
sub.l d0,d2
blt.w .InvalidBODY
movea.l d5,a0
movea.l a2,a1
move.l d0,-(sp)
fjsr ReadChunkBytes
move.l (sp)+,d1
tst.l d0
blt.w .IFFErr
cmp.l d1,d0
bne.w .InvalidBODY
adda.l d0,a2
bra.b .cmpByteRun1
.cmpBR1Pack neg.b d0
subq.l #2,d3
blt.w .InvalidBODY
subq.l #1,d2
sub.l d0,d2
blt.w .InvalidBODY
movea.l d5,a0
movea.l a3,a1
move.l d0,-(sp)
moveq.l #1,d0
fjsr ReadChunkBytes
move.l (sp)+,d1
tst.l d0
blt.w .IFFErr
subq.l #1,d0
bne.w .InvalidBODY
move.b (a3),d0
.cmpBR1PackL move.b d0,(a2)+
dbra d1,.cmpBR1PackL
bra.w .cmpByteRun1
.cmpNone cmp.l d2,d3
bne.w .InvalidBODY
movea.l d5,a0
movea.l a2,a1
move.l d2,d0
fjsr ReadChunkBytes
tst.l d0
blt.b .IFFErr
sub.l d0,d2
sub.l d0,d3
adda.l d0,a2
;||
.BODYDone tst.l d2
bne.w .InvalidBODY
moveq.l #1,d0
move.w d0,gl_Image+ig_Depth(gl)
move.b d0,gl_Image+ig_PlanePick(gl)
moveq.l #-1,d7
;||
; In: d7 = Code (0 = Err, >0, Err but IFF opened, <0 = Ok)
.CleanUp tst.l d7
beq.b .CUCont
blt.b .CUCont4
moveq.l #0,d7
.CUCont4 movea.l d5,a0
slib IFFParse
fjsr CloseIFF
.CUCont
tst.l d4
beq.b .CUCont2
move.l d4,d1
slib DOS
fjsr Close
.CUCont2
tst.l d5
beq.b .CUCont3
movea.l d5,a0
slib IFFParse
fjsr FreeIFF
.CUCont3
tst.l d7
addq.l #4,sp
pull d0-d7/a0-a3/lb
rts
.DOSErr slib DOS
fjsr IoErr
move.l d0,gl_Result2(gl)
lea.l .ErrorTxt(pc),a0
move.l a0,d1
lea.l gl_aFrom(gl),a0
move.l a0,d2
fjsr VPrintf
move.l gl_Result2(gl),d1
lea.l .ErrorTxt3(pc),a0
move.l a0,d2
fjsr PrintFault
bra.b .CleanUp
.IFFErr cmpi.l #IFFERR_NOSCOPE,d0
beq.b .IFFErr_NoScope
cmpi.l #IFFERR_NOMEM,d0
beq.w .NoMem
cmpi.l #IFFERR_READ,d0
beq.b .IFFErr_Read
cmpi.l #IFFERR_SEEK,d0
beq.b .IFFErr_Seek
cmpi.l #IFFERR_MANGLED,d0
beq.b .IFFErr_Mangled
cmpi.l #IFFERR_SYNTAX,d0
beq.b .IFFErr_Syntax
cmpi.l #IFFERR_NOTIFF,d0
beq.b .IFFErr_NotIFF
lea.l .GenericTxt(pc),a0
; In: a0 = &ReasonTxt, d0 = IoErr
.GetPrintErr move.l a0,-(sp)
slib DOS
fjsr IoErr
movea.l (sp)+,a0
; In: a0 = &ReasonTxt, d0 = IoErr
.PrintErr move.l d0,gl_Result2(gl)
move.l a0,-(sp)
slib DOS
lea.l .ErrorTxt(pc),a0
move.l a0,d1
lea.l gl_aFrom(gl),a0
move.l a0,d2
fjsr VPrintf
lea.l .ErrorTxt2(pc),a0
move.l a0,d1
move.l sp,d2
fjsr VPrintf
addq.l #4,sp
bra.w .CleanUp
.IFFErr_NoScope lea.l .NoScopeTxt(pc),a0
bra.b .GetPrintErr
.IFFErr_Read lea.l .ReadTxt(pc),a0
bra.b .GetPrintErr
.IFFErr_Seek lea.l .SeekTxt(pc),a0
bra.b .GetPrintErr
.IFFErr_Mangled lea.l .MangledTxt(pc),a0
bra.b .GetPrintErr
.IFFErr_Syntax lea.l .SyntaxTxt(pc),a0
bra.b .GetPrintErr
.IFFErr_NotIFF lea.l .NotIFFTxt(pc),a0
bra.b .GetPrintErr
.NoMem lea.l .NoMemTxt(pc),a0
bra.b .GetPrintErr
.NoPlane moveq.l #ERROR_NO_FREE_STORE,d0
lea.l .NoMemTxt(pc),a0
bra.b .PrintErr
.NoBMHD moveq.l #ERROR_REQUIRED_ARG_MISSING,d0
lea.l .NoBMHDTxt(pc),a0
bra.b .PrintErr
.NoBODY moveq.l #ERROR_REQUIRED_ARG_MISSING,d0
lea.l .NoBODYTxt(pc),a0
bra.b .PrintErr
.WrongDepth moveq.l #ERROR_BAD_NUMBER,d0
lea.l .DepthTxt(pc),a0
bra.b .PrintErr
.UnknownComp move.l #ERROR_NOT_IMPLEMENTED,d0
lea.l .CompTxt(pc),a0
bra.w .PrintErr
.InvalidBODY move.l #ERROR_BAD_HUNK,d0
lea.l .InvalidBODYTxt(pc),a0
bra.w .PrintErr
.Chunx dc.l ID_ILBM, ID_BMHD
dc.l ID_ILBM, ID_CAMG
dc.l ID_ILBM, ID_BODY
.ChunkEnd
.ErrorTxt dc.b 'Error with "%s"',0
.ErrorTxt2 dc.b ': %s',$0A ; \
.ErrorTxt3 dc.b 0 ; /
.NoScopeTxt dc.b 'No scope',0
.NoMemTxt dc.b 'Not enough free memory',0
.ReadTxt dc.b 'Reading failed',0
.SeekTxt dc.b 'Seeking failed',0
.MangledTxt dc.b 'Data in file is corrupt',0
.SyntaxTxt dc.b 'Invalid IFF syntax',0
.NotIFFTxt dc.b 'No IFF file',0
.NoBMHDTxt dc.b 'Missing BMHD chunk',0
.NoBODYTxt dc.b 'Missing BODY chunk',0
.DepthTxt dc.b 'Picture must have 2 colors',0
.CompTxt dc.b 'Unknown compression-type',0
.InvalidBODYTxt dc.b 'BODY chunk is corrupt',0
.GenericTxt dc.b 'Unknown reason, sorry',0
even
;;-- Font laden -------------------------------------------
; Out: cc=eq, wenn Fehler
_LoadFont push d0-d2/a0/a1/lb
clr.w -(sp)
move.l gl_aSize(gl),a0
move.w 2(a0),-(sp)
move.l gl_aFont(gl),-(sp)
slib DiskFont
movea.l sp,a0
fjsr OpenDiskFont
move.l d0,gl_TextFont(gl)
beq.b .OpenErr
movea.l d0,a0
btst.b #FPB_PROPORTIONAL,tf_Flags(a0)
bne.b .TypeErr
moveq.l #-1,d0
.Exit addq.l #ta_SIZEOF,sp
pull d0-d2/a0/a1/lb
rts
.OpenErr slib DOS
fjsr IoErr
move.l d0,gl_Result2(gl)
lea.l .OpenErrTxt(pc),a0
move.l a0,d1
move.l sp,d2
fjsr VPrintf
clr.b d0
bra.b .Exit
.TypeErr move.l #ERROR_OBJECT_WRONG_TYPE,gl_Result2(gl)
slib DOS
lea.l .TypeErrTxt(pc),a0
move.l a0,d1
fjsr PutStr
clr.b d0
bra.b .Exit
.OpenErrTxt dc.b 'Unable to open "%s" (height %d)!',$0A,0
.TypeErrTxt dc.b 'Font has to be fixed-width!',$0A,0
even
;;-- Screen + Window öffnen etc. ---------------------------------
; Out: cc=eq, wenn Fehler
_OpenDisplay push d0/d1/a0-a3/lb
movea.l sp,a3
slib Intui
pea.l .ScrTags(pc)
move.l #TAG_MORE,-(sp)
move.l gl_ViewMode(gl),d1
moveq.l #LORES_KEY,d0
btst.l #15,d1
beq.b .VModeCont
move.l #HIRES_KEY,d0
.VModeCont btst.l #5,d1
beq.b .VModeCont2
move.l #SUPER_KEY,d0
.VModeCont2 btst.l #2,d1
beq.b .VModeCont3
addq.l #LORESLACE_KEY,d0
.VModeCont3 move.l d0,-(sp)
move.l #SA_DisplayID,-(sp)
move.w gl_Image+ig_Height(gl),-(sp)
clr.w -(sp)
move.l #SA_Height,-(sp)
move.w gl_Image+ig_Width(gl),-(sp)
clr.w -(sp)
move.l #SA_Width,-(sp)
suba.l a0,a0
movea.l sp,a1
fjsr OpenScreenTagList
move.l d0,gl_Screen(gl)
beq.w .ScrErr
movea.l d0,a2
lea.l sc_RastPort(a2),a2
move.l a2,gl_RPort(gl)
movea.l a3,sp
pea.l .WinTags(pc)
move.l #TAG_MORE,-(sp)
move.l d0,-(sp)
move.l #WA_CustomScreen,-(sp)
move.w gl_Image+ig_Height(gl),-(sp)
clr.w -(sp)
move.l #WA_Height,-(sp)
move.w gl_Image+ig_Width(gl),-(sp)
clr.w -(sp)
move.l #WA_Width,-(sp)
suba.l a0,a0
movea.l sp,a1
fjsr OpenWindowTagList
move.l d0,gl_Window(gl)
beq.b .WinErr
movea.l gl_Process(gl),a0
move.l pr_WindowPtr(a0),gl_OldWin(gl)
move.l d0,pr_WindowPtr(a0)
movea.l a2,a0
lea.l gl_Image(gl),a1
moveq.l #0,d0
moveq.l #0,d1
fjsr DrawImage
exec
movea.l gl_Image+ig_ImageData(gl),a1
fjsr FreeVec
clr.l gl_Image+ig_ImageData(gl)
slib Gfx
movea.l a2,a1
movea.l gl_TextFont(gl),a0
fjsr SetFont
moveq.l #-1,d0
.Exit movea.l a3,sp
pull d0/d1/a0-a3/lb
rts
.ScrErr lea.l .ScrErrTxt(pc),a0
.PrintErr slib DOS
move.l a0,d1
fjsr PutStr
clr.b d0
bra.b .Exit
.WinErr lea.l .WinErrTxt(pc),a0
bra.b .PrintErr
.ScrTags dc.l SA_Depth, 1
dc.l SA_Type, CUSTOMSCREEN
dc.l SA_ShowTitle, 0
dc.l SA_Quiet, -1
dc.l SA_Overscan, OSCAN_TEXT
dc.l SA_AutoScroll, -1
dc.l TAG_DONE, 0
.WinTags dc.l WA_Left, 0
dc.l WA_Top, 0
dc.l WA_Activate, -1
dc.l WA_Backdrop, -1
dc.l WA_Borderless, -1
dc.l WA_RMBTrap, -1
dc.l WA_SmartRefresh, -1
dc.l WA_IDCMP, IDCMP_MOUSEBUTTONS
dc.l TAG_DONE, 0
.ScrErrTxt dc.b 'Failed to open screen!',$0A,0
.WinErrTxt dc.b 'Failed to open window!',$0A,0
even
;;-- Text-File erzeugen -----------------------------------
; Out: cc=eq, wenn Fehler, cc=gt, wenn Break
rsreset
lo_FH rs.l 1
lo_Left rs.w 1
lo_Top rs.w 1
lo_NumChars rs.w 1
lo_OldRev rs.b 1
lo_Reverse rs.b 1
lo_Char rs.b 1
lo_BestChar rs.b 1
rsword
lo_BestNum rs.l 1
lo_MaxNum rs.l 1
lo_SIZEOF rs.b 0
_CreateText push d0-d5/a0-a3/lb
moveq.l #lo_SIZEOF/2-1,d0
.ClearLoop clr.w -(sp)
dbra d0,.ClearLoop
movea.l sp,lo
move.b #-1,lo_Reverse(lo)
movea.l gl_RPort(gl),a2
move.l gl_TextFont(gl),a3
moveq.l #0,d0
move.b tf_HiChar(a3),d0
sub.b tf_LoChar(a3),d0
move.w d0,lo_NumChars(lo)
move.w tf_XSize(a3),d0
mulu.w tf_YSize(a3),d0
move.l d0,lo_MaxNum(lo)
slib DOS
movea.l gl_aTo(gl),d1
move.l #MODE_NEWFILE,d2
fjsr Open
move.l d0,lo_FH(lo)
beq.w .DOSErr
.WholeLoop exec
.BreakLoop movea.l gl_Window(gl),a0
movea.l wd_UserPort(a0),a0
fjsr GetMsg
tst.l d0
beq.b .BreakCont
movea.l d0,a1
move.l im_Class(a1),d2
move.w im_Code(a1),d3
fjsr ReplyMsg
cmpi.l #IDCMP_MOUSEBUTTONS,d2
bne.b .BreakLoop
btst.l #0,d3 ; MENU-Button
beq.b .BreakLoop
bra.w .Break
.BreakCont slib DOS
move.l #SIGBREAKF_CTRL_C,d1
fjsr CheckSignal
tst.l d0
bne.w .Break
move.b lo_Reverse(lo),lo_OldRev(lo)
move.w tf_XSize(a3),d0
add.w lo_Left(lo),d0
cmp.w gl_Image+ig_Width(gl),d0
ble.b .WidthCont
tst.l gl_aANSI(gl)
beq.b .LFNoANSI
tst.b lo_OldRev(lo)
ble.b .LFNoANSI
move.l lo_FH(lo),d1
lea.l .RevOffTxt(pc),a0
move.l a0,d2
fjsr FPuts
tst.l d0
blt.w .DOSErr
.LFNoANSI move.l lo_FH(lo),d1
moveq.l #$0A,d2
fjsr FPutC
tst.l d0
blt.w .DOSErr
move.b #-1,lo_OldRev(lo)
clr.w lo_Left(lo)
move.w tf_YSize(a3),d0
add.w d0,lo_Top(lo)
.WidthCont
move.w tf_YSize(a3),d0
add.w lo_Top(lo),d0
cmp.w gl_Image+ig_Height(gl),d0
bgt.w .Finished
slib Gfx
movea.l a2,a1
moveq.l #RP_COMPLEMENT,d0
fjsr SetDrMd
clr.l lo_BestNum(lo)
clr.b d2
.CharLoop cmp.b lo_NumChars+1(lo),d2
bhs.w .CharDone
move.w lo_Left(lo),d0
move.w lo_Top(lo),d1
add.w tf_Baseline(a3),d1
movea.l a2,a1
fjsr Move
lea.l lo_Char(lo),a0
move.b d2,(a0)
move.b tf_LoChar(a3),d0
add.b d0,(a0)
moveq.l #1,d0
movea.l a2,a1
fjsr Text
moveq.l #0,d3
move.w tf_YSize(a3),d5
bra.b .CountStrt
.CountLoop move.w lo_Left(lo),d0
add.w d4,d0
move.w lo_Top(lo),d1
add.w d5,d1
movea.l a2,a1
fjsr ReadPixel
tst.b d0
bne.b .CountStrt2
addq.l #1,d3
.CountStrt2 dbra d4,.CountLoop
.CountStrt move.w tf_XSize(a3),d4
dbra d5,.CountStrt2
move.w lo_Left(lo),d0
move.w lo_Top(lo),d1
add.w tf_Baseline(a3),d1
movea.l a2,a1
fjsr Move
lea.l lo_Char(lo),a0
moveq.l #1,d0
movea.l a2,a1
fjsr Text
cmp.l lo_BestNum(lo),d3
ble.b .CharCont
move.l d3,lo_BestNum(lo)
move.b lo_Char(lo),lo_BestChar(lo)
clr.b lo_Reverse(lo)
cmp.l lo_MaxNum(lo),d3
beq.b .CharDone
.CharCont tst.l gl_aANSI(gl)
beq.b .CharCont2
neg.l d3
add.l lo_MaxNum(lo),d3
cmp.l lo_BestNum(lo),d3
ble.b .CharCont2
move.l d3,lo_BestNum(lo)
move.b lo_Char(lo),lo_BestChar(lo)
move.b #1,lo_Reverse(lo)
cmp.l lo_MaxNum(lo),d3
beq.b .CharDone
.CharCont2 addq.b #1,d2
bra.w .CharLoop
.CharDone
moveq.l #RP_JAM2,d0
tst.b lo_Reverse(lo)
ble.b .PrintCont
moveq.l #RP_JAM2!RP_INVERSVID,d0
.PrintCont movea.l a2,a1
fjsr SetDrMd
move.w lo_Left(lo),d0
move.w lo_Top(lo),d1
add.w tf_Baseline(a3),d1
movea.l a2,a1
fjsr Move
lea.l lo_BestChar(lo),a0
moveq.l #1,d0
movea.l a2,a1
fjsr Text
slib DOS
tst.l gl_aANSI(gl)
beq.b .WriteCont
move.b lo_Reverse(lo),d0
cmp.b lo_OldRev(lo),d0
beq.b .WriteCont
lea.l .RevOnTxt(pc),a0
move.l a0,d2
tst.b d0
bgt.b .WriteCont2
addq.l #4,d2
.WriteCont2 move.l lo_FH(lo),d1
fjsr FPuts
tst.l d0
blt.b .DOSErr
.WriteCont move.l lo_FH(lo),d1
move.b lo_BestChar(lo),d2
fjsr FPutC
tst.l d0
blt.b .DOSErr
move.w tf_XSize(a3),d0
add.w d0,lo_Left(lo)
bra.w .WholeLoop
.Finished moveq.l #-1,d3
;||
; In: d3.b = ReturnCode
.CleanUp move.l lo_FH(lo),d1
beq.b .CUCont
slib DOS
fjsr Close
tst.b d3
blt.b .CUCont2
move.l gl_aTo(gl),d1
fjsr DeleteFile
tst.w d0
beq.b .CUCont
lea.l .DeleteTxt(pc),a0
move.l a0,d1
fjsr PutStr
bra.b .CUCont
.CUCont2
tst.w d0
beq.b .DOSErr ; Close() failed
.CUCont
tst.b d3
lea.l lo_SIZEOF(sp),sp
pull d0-d5/a0-a3/lb
rts
.DOSErr slib DOS
fjsr IoErr
move.l d0,gl_Result2(gl)
lea.l .ErrorTxt(pc),a0
move.l a0,d1
lea.l gl_aTo(gl),a0
move.l a0,d2
fjsr VPrintf
move.l gl_Result2(gl),d1
lea.l .ErrorTxt2(pc),a0
move.l a0,d2
fjsr PrintFault
clr.b d3
bra.b .CleanUp
.Break move.l #ERROR_BREAK,d1
move.l d1,gl_Result2(gl)
moveq.l #0,d2
slib DOS
fjsr PrintFault
moveq.l #1,d3
bra.b .CleanUp
.RevOnTxt dc.b $9B,'7m',0 ; \
.RevOffTxt dc.b $9B,'27m',0 ; /
.ErrorTxt dc.b 'Error with "%s"' ; \
.ErrorTxt2 dc.b 0 ; /
.DeleteTxt dc.b 'Destination file removed.',$0A,0
even
;;-- ChipMem Daten (WaitPtr) ------------------------------
section Daten,data_c
_ChipPtr dc.w 0,0
dc.w %0000010000000000,%0000011111000000
dc.w %0000000000000000,%0000011111000000
dc.w %0000000100000000,%0000001110000000
dc.w %0000000000000000,%0000011111100000
dc.w %0000011111000000,%0001111111111000
dc.w %0001111111110000,%0011111111101100
dc.w %0011111111111000,%0111111111011110
dc.w %0011111111111000,%0111111110111110
dc.w %0111111111111100,%1111111101111111
dc.w %0111111011111100,%1111111111111111
dc.w %0111111111111100,%1111111111111111
dc.w %0011111111111000,%0111111111111110
dc.w %0011111111111000,%0111111111111110
dc.w %0001111111110000,%0011111111111100
dc.w %0000011111000000,%0001111111111000
dc.w %0000000000000000,%0000011111100000
dc.w 0,0