Testaware

Amiga - VPic

Aug 17th, 2018
233
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ****************************************************************************
  2. * VPic (View Picture) V2.00 © 15-06-2002 by Testaware
  3. * --------------------------------------------------------------------------
  4. *
  5. * Code: Peace/TST
  6. * Home: https://testaware.wordpress.com
  7. *
  8. * CLI/Shell: VPic [file|list|path|#DEC] [0|1] [*|?]
  9. * Workbench: INFO DEFAULT TOOL
  10. *
  11. * DLD: © 1992, 1993 by Georg Hörmann
  12. * XPK: © 1991 Christian Schneider & U.Dominik Mueller
  13. * ABk: François Lionet © Europress Software
  14. * REQ: ReqTools Lib 2.9a © 1991-1997 Nico François & Magnus Holmgren
  15. *
  16. * Assembler: GenAm Macro Assembler V2.11D Copyright © HiSoft 1985,8
  17. * Editor: CygnusEd Professional II © 1987,1988,1989 by CygnusSoft Software
  18. ****************************************************************************
  19.  
  20.                 opt     o+,ow-
  21.  
  22.                 Output  RAM:1
  23.  
  24.                 Incdir  DH1:DevPac/Include/
  25.  
  26.                 Include exec/exec_lib.i
  27.                 Include exec/memory.i
  28.                 Include graphics/graphics_lib.i
  29.                 Include graphics/view.i
  30.                 Include libraries/decrunch_lib.i
  31.                 Include libraries/dos_lib.i
  32.                 Include libraries/dos.i
  33.                 Include libraries/dosextens.i
  34.                 Include libraries/xpk.i
  35.                 Include libraries/reqtools_lib.i
  36.                 Include intuition/intuition.i
  37.                 Include intuition/intuition_lib.i
  38.                 Include intuition/intuitionbase.i
  39.                 Include own/rawkey.i
  40.                 Include workbench/startup.i
  41.                 Include workbench/workbench.i
  42.  
  43. ****************************************************************************
  44. * Strukturanordungen von AmBk Pic.Pac Screen / BitMap
  45. ****************************************************************************
  46.  
  47. ;Packed AMOS Screen-Header
  48.                 RsReset
  49. PsCode          rs.l    1
  50. PsTx            rs.w    1
  51. PsTy            rs.w    1
  52. PsAWx           rs.w    1
  53. PsAWy           rs.w    1
  54. PsAWTx          rs.w    1
  55. PsAWTy          rs.w    1
  56. PsAVx           rs.w    1
  57. PsAVy           rs.w    1
  58. PsCon0          rs.w    1
  59. PsNbCol         rs.w    1
  60. PsNPlan         rs.w    1
  61. PsPal           rs.w    32
  62. PsLong          equ     __RS
  63. SCCode          equ     $12031990
  64.  
  65. ;Packed AMOS BitMap-Header
  66.                 RsReset
  67. Pkcode          rs.l    1
  68. Pkdx            rs.w    1
  69. Pkdy            rs.w    1
  70. Pktx            rs.w    1
  71. Pkty            rs.w    1
  72. Pktcar          rs.w    1
  73. Pknplan         rs.w    1
  74. PkDatas2        rs.l    1
  75. PkPoint2        rs.l    1
  76. PkLong          equ     __RS
  77. PkDatas1        equ     __RS
  78. BMCode          equ     $06071963       ;Happy birthday François
  79.  
  80. ;IFF BitMap-HeaDer
  81.                 RsReset
  82. ibm_Width       rs.w    1
  83. ibm_Height      rs.w    1
  84. ibm_xPosition   rs.w    1
  85. ibm_yPosition   rs.w    1
  86. ibm_Planes      rs.b    1
  87. ibm_Mask        rs.b    1
  88. ibm_Compression rs.b    1
  89. ibm_Pad         rs.b    1
  90. ibm_Transparent rs.w    1
  91. ibm_xAspect     rs.b    1
  92. ibm_yAspect     rs.b    1
  93. ibm_PageWidth   rs.w    1
  94. ibm_PageHeight  rs.w    1
  95. ibm_SIZEOF      equ     __RS
  96.  
  97. ;VPic BitMap-Header
  98.                 RsReset
  99. vbm_Code        rs.l    1
  100. vbm_Width       rs.w    1
  101. vbm_Height      rs.w    1
  102. vbm_ViewMode    rs.w    1
  103. vbm_User        rs.w    1
  104. vbm_Bmap        rs.l    1
  105. vbm_Data        equ     __RS
  106. vbm_SIZEOF      equ     __RS
  107. vbm_DEPTH       equ     1
  108. ID_VPIC         equ     $56504943
  109. ID_VBMP         equ     $56424D50
  110.  
  111. ;VPic spezifische Struktur
  112.                 RsReset
  113. My_VPicBase     rs.b    0
  114. my_DosBase      rs.l    1
  115. my_IntBase      rs.l    1
  116. my_GfxBase      rs.l    1
  117. my_DcrBase      rs.l    1
  118. my_XpkBase      rs.l    1
  119. my_ReqBase      rs.l    1
  120. my_OutPut       rs.l    1
  121. my_OldLock      rs.l    1
  122. my_FileName     rs.l    1
  123. my_FileLock     rs.l    1
  124. my_FileFib      rs.b    fib_SIZEOF
  125. my_CountFib     rs.b    fib_SIZEOF
  126. my_FileHnd      rs.l    1
  127. my_FileBuf      rs.l    1
  128. my_FileLen      rs.l    1
  129. my_ListBuf      rs.l    1
  130. my_ListLen      rs.l    1
  131. my_PackBuf      rs.l    1
  132. my_PackLen      rs.l    1
  133. my_NewWind      rs.l    nw_SIZE
  134. my_WindPtr      rs.l    1
  135. my_NewScrn      rs.b    ns_SIZEOF
  136. my_ScrnPtr      rs.l    1
  137. my_PlanPtr      rs.l    8
  138. my_Palette      rs.l    1
  139. my_DefPalette   rs.w    32
  140. my_ColorCount   rs.l    1
  141. my_PkMode       rs.b    1
  142. my_FromCLI      rs.b    1
  143. my_KeyCode      rs.b    1
  144. my_CliDisplay   rs.b    1
  145. my_CliScrn      rs.l    1
  146. my_CliWind      rs.l    1
  147. my_NextScrn     rs.l    1
  148. my_AuthPtr      rs.l    1
  149. my_CopyPtr      rs.l    1
  150. my_AnnoPtr      rs.l    1
  151. my_VbmHeader    rs.b    vbm_SIZEOF
  152. my_FmtData      rs.b    256
  153. my_FmtChData    rs.b    1024
  154. my_DataBuf      rs.b    1024
  155. my_InputBuf     rs.b    256
  156. my_RtFileReq    rs.l    1
  157. my_RtInfoReq    rs.l    1
  158. my_RtBut        rs.l    1               ;Schalter
  159. my_SIZEOF       rs.w    0
  160.  
  161. PKMODE_NORMAL           equ     0       ;IFF RAW - Unkomprimiert
  162. PKMODE_COMPRESSED       equ     1       ;IFF RLE - Komprimiert
  163. PKMODE_AMIGABASIC       equ     2       ;IFF ABM - DigiPaint BitMap
  164. PKMODE_AMOSBITMAP       equ     3       ;ABK PCK - Amos Packed BitMap
  165. PKMODE_AMOSSCREEN       equ     4       ;ABK SPK - Amos Packed Screen
  166. PKMODE_VPICBITMAP       equ     5       ;VBM PLN - VPic BitMap Plane
  167. PKMODE_WBOINFO          equ     6       ;WBO INF - WorkBench Info
  168. PKMODE_ACTUALSCREEN     equ     7       ;ACT SCR - Actual Screen
  169.  
  170. COLOR_CLI       equ     $FFF
  171. COLOR_OS1       equ     $001
  172. COLOR_OS2       equ     $002
  173. COLOR_RED       equ     $0FF
  174. COLOR_GRN       equ     $F0F
  175. COLOR_BLU       equ     $FF0
  176. COLOR_GRY       equ     $111
  177. COLOR_DEF       equ     $000
  178.  
  179. ****************************************************************************
  180. * Meine Macros
  181. ****************************************************************************
  182.  
  183. LIB             MACRO
  184.                 jsr     _LVO\1(a6)
  185.                 ENDM
  186.  
  187. LAB             MACRO
  188.                 jmp     _LVO\1(a6)
  189.                 ENDM
  190.  
  191. EXE             MACRO
  192.                 movea.l 4.w,a6
  193.                 LIB     \1
  194.                 ENDM
  195.  
  196. DOS             MACRO
  197.                 movea.l my_DosBase(a5),a6
  198.                 LIB     \1
  199.                 ENDM
  200.  
  201. INT             MACRO
  202.                 movea.l my_IntBase(a5),a6
  203.                 LIB     \1
  204.                 ENDM
  205.  
  206. GFX             MACRO
  207.                 movea.l my_GfxBase(a5),a6
  208.                 LIB     \1
  209.                 ENDM
  210.  
  211. DCR             MACRO
  212.                 movea.l my_DcrBase(a5),a6
  213.                 LIB     \1
  214.                 ENDM
  215.  
  216. XPK             MACRO
  217.                 movea.l my_XpkBase(a5),a6
  218.                 LIB     \1
  219.                 ENDM
  220.  
  221. REQ             MACRO
  222.                 movea.l my_ReqBase(a5),a6
  223.                 LIB     \1
  224.                 ENDM
  225.  
  226. WAIT            MACRO
  227.                 moveq.l #\1,d1
  228.                 bsr     Wait
  229.                 ENDM
  230.  
  231. VPic            bra.s   .0
  232.  
  233.                 dc.b    '$VER: VPic 2.00 FD (15-06-02 21:44:50) '
  234.                 dc.b    '©2002 by Peace of Testaware'
  235.                 cnop    0,4
  236.  
  237. ****************************************************************************
  238. * Test von wo aus das Programm gestartet wurde WB oder CLI/Shell
  239. ****************************************************************************
  240.  
  241. .0              movea.l a0,a2   ;Evtl. Parameter sichern
  242.                 move.l  d0,d2
  243.  
  244.                 suba.l  a1,a1
  245.                 EXE     FindTask
  246.                 movea.l d0,a4
  247.                 tst.l   pr_CLI(a4)
  248.                 bne.s   FromCLI
  249.  
  250.                 lea     pr_MsgPort(a4),a0
  251.                 LIB     WaitPort
  252.                 lea     pr_MsgPort(a4),a0
  253.                 LIB     GetMsg
  254.                 lea     VPic(pc),a4
  255.                 move.l  d0,(a4)
  256.  
  257.                 bsr     OpenAll
  258.  
  259.                 movea.l VPic(pc),a4
  260.                 movea.l sm_ArgList(a4),a4
  261.                 beq     CloseAll
  262.  
  263.                 move.l  wa_Lock(a4),d1
  264.                 DOS     CurrentDir
  265.  
  266.                 movea.l wa_Name+wa_SIZEOF(a4),a0
  267.                 bsr     Start
  268.  
  269.                 EXE     Forbid
  270.  
  271.                 movea.l VPic(pc),a1
  272.                 LAB     ReplyMsg
  273.  
  274. ****************************************************************************
  275. * Programm wurde von der CLI/Shell-Ebene aufgerufen
  276. ****************************************************************************
  277.  
  278. FromCLI         movem.l a2/d2,-(sp)
  279.                 bsr     OpenAll
  280.                 DOS     Output
  281.                 move.l  d0,my_OutPut(a5)
  282.                 movem.l (sp)+,a0/d0
  283.  
  284.                 move.b  #1,my_FromCLI(a5)       ;Flag für CLI-Optionen
  285.  
  286.                 subq.l  #1,d0
  287.                 ble.s   Rt_ReqLoop              ;Kein Param übergeben
  288.  
  289. ;Ein Parameter (irgendwas) wurde angegeben.
  290.  
  291. .0              cmpi.b  #'?',(a0)               ;Syntax anzeigen?
  292.                 bne.s   .1
  293.                 bsr     Rt_Usage                ;Aha, so wird`s gemacht?
  294.                 bra     CloseAll
  295.  
  296. .1              cmpi.b  #'*',(a0)               ;Aktuellen Screen darstellen?
  297.                 bne.s   .2                      ;Nö!
  298.                 clr.b   (a0,d0)
  299.                 move.l  a0,my_FileName(a5)
  300.                 move.l  my_CliScrn(a5),my_NextScrn(a5)
  301.                 bsr     ASCPic
  302.                 bra     CloseAll
  303.  
  304. .2              cmpi.b  #' ',-2(a0,d0)          ;Datei übergeben?
  305.                 bne.s   .4                      ;ÄhÄh
  306.  
  307.                 cmpi.b  #'0',-1(a0,d0)          ;In CLI-Window darstellen?
  308.                 bne.s   .3                      ;Nicht nötig!
  309.                 move.b  #1,my_CliDisplay(a5)    ;Flag setzen
  310.                 subq.l  #2,d0                   ;FileNameLen korrigieren
  311.                 bra.s   .4
  312.  
  313. .3              cmpi.b  #'1',-1(a0,d0)          ;In CLI-Wind & Colorset
  314.                 bne.s   .4                      ;Auch nicht!
  315.                 move.b  #2,my_CliDisplay(a5)
  316.                 subq.l  #2,d0
  317.  
  318. .4              clr.b   (a0,d0)                 ;Dateiende mit NULL
  319.                 bra.s   Start
  320.  
  321. ;---------------------------------------------------------------------------
  322. ;Wurde  VPic  kein  Parameter übergeben, so wird mittels der ReqToolsLib ein
  323. ;File-Requester   bereitgestellt   in   welchem  wiederholt  eine  Gfx-Datei
  324. ;ausgewählt werden kann.
  325. ;---------------------------------------------------------------------------
  326. Rt_ReqLoop      lea     TxRtLoadPIC(pc),a3
  327.                 bsr     Rt_Input
  328.                 tst.l   my_RtBut(a5)
  329.                 beq     CloseAll
  330.                 bsr     OpenFile
  331.                 bne.s   .1
  332. .0              bsr     IffPic
  333.                 beq.s   .1
  334.                 bsr     PicDcr
  335.                 beq.s   .0
  336. .1              bsr     PrtCLine
  337.                 bsr     FreeBuff
  338.                 bsr     CKey            ;[ESC] betätigt?
  339.                 beq     CloseAll        ;Ja!
  340.                 bra.s   Rt_ReqLoop
  341.  
  342. ****************************************************************************
  343. * Hauptprogramm
  344. ****************************************************************************
  345.  
  346. Start           move.l  a0,my_FileName(a5)
  347.  
  348.                 tst.b   my_FromCLI(a5)
  349.                 beq.s   .1              ;DEC/Path-Option NUR über CLI/Shell!
  350.  
  351.                 bsr     dec_init        ;DirEntryCount-Verfahren?
  352.  
  353.                 bsr.s   LockFile        ;Pfad übergeben?
  354.                 beq.s   .3              ;Ja!
  355.  
  356. .1              bsr     OpenFile        ;Datei öffnen
  357.                 bne.s   .3              ;Fehler!
  358.  
  359. .2              bsr     VPicList        ;Bilderliste übergeben?
  360.                 beq.s   .3              ;Ja!
  361.                 bsr     IffPic          ;IFF/ABk/VBM/WBO-Bild?
  362.                 beq.s   .3              ;Ja!
  363.                 bsr     PicDcr          ;Unbekanntes Format! Evtl. entpacken
  364.                 beq.s   .2              ;Nochmals testen wenn entpackt
  365.  
  366. .3              bsr     PrtCLine
  367.                 bsr     FreeBuff
  368.                 bra     CloseAll
  369.  
  370. ****************************************************************************
  371. * Alle Bilder eines Pfades werden angezeigt, nur über CLI! (Param:path)
  372. ****************************************************************************
  373.  
  374. LockFile        move.l  my_FileName(a5),d1
  375.                 moveq.l #ACCESS_READ,d2
  376.                 DOS     Lock
  377.                 move.l  d0,my_FileLock(a5)
  378.                 beq     Error
  379.  
  380.                 move.l  my_FileLock(a5),d1
  381.                 lea     my_FileFib(a5),a0
  382.                 move.l  a0,d2
  383.                 LIB     Examine
  384.                 tst.l   d0
  385.                 beq.s   .6
  386.  
  387.                 tst.l   my_FileFib+fib_DirEntryType(a5)
  388.                 ble.s   .6
  389.  
  390.                 move.l  my_FileLock(a5),d1
  391.                 LIB     CurrentDir
  392.                 move.l  d0,my_OldLock(a5)
  393.  
  394. .1              move.l  my_FileLock(a5),d1
  395.                 lea     my_FileFib(a5),a0
  396.                 move.l  a0,d2
  397.                 DOS     ExNext
  398.                 tst.l   d0
  399.                 beq.s   .5
  400.  
  401. .2              lea     my_FileFib+fib_FileName(a5),a0
  402.                 move.l  a0,my_FileName(a5)
  403.                 bsr     OpenFile
  404.                 bne.s   .4
  405. .3              bsr     IffPic
  406.                 beq.s   .4
  407.                 bsr     PicDcr
  408.                 beq.s   .3
  409.  
  410. .4              bsr     FreeBuff
  411.  
  412.                 bsr     CKey            ;[ESC] betätigt?
  413.                 bne.s   .1              ;Nein!
  414.  
  415. .5              move.l  my_FileLock(a5),d1
  416.                 DOS     UnLock
  417.  
  418.                 move.l  my_OldLock(a5),d1
  419.                 LIB     CurrentDir
  420.                 bra     Ok
  421.  
  422. .6              bsr.s   .5
  423.                 bra     Error
  424.  
  425. ****************************************************************************
  426. * Zeige Bilder aus einer Datenliste (Param:list)
  427. ****************************************************************************
  428.  
  429. VPicList        moveq.l #0,d0           ;Test ob Bilderliste übergeben?
  430.                 movea.l my_FileBuf(a5),a1
  431.                 move.l  my_FileLen(a5),d1
  432.  
  433. ;---------------------------------------------------------------------------
  434. ;Der  Test  ob es sich um eine Bilderliste handelt ist ein wenig umständlich
  435. ;über  ByteCmp  geregelt,  dafür  muß  aber kein ID Header als Erkennung der
  436. ;Liste vorangestellt werden.
  437. ;---------------------------------------------------------------------------
  438. .1              cmp.b   #10,(a1)        ;EndOfLine?
  439.                 beq.s   .3              ;Ja!
  440.                 cmp.b   #32,(a1)
  441.                 ble.s   .2              ;Ungültiges Zeichen für Dateiname
  442.                 cmp.b   #123,(a1)+
  443.                 bge.s   .2              ;Ebenfalls ungültig
  444.                 addq.l  #1,d0
  445.                 dbf     d1,.1
  446. .2              bra     Error           ;Keine Liste bzw. gepackte Datei
  447. .3              tst.l   d0
  448.                 beq     Error
  449.  
  450. ViewList        move.l  my_FileBuf(a5),my_ListBuf(a5)
  451.                 move.l  my_FileLen(a5),my_ListLen(a5)
  452.  
  453.                 move.l  my_ListLen(a5),d0
  454.                 movea.l my_ListBuf(a5),a1
  455.  
  456. .1              movea.l a1,a0           ;Bildname aus Liste ermitteln
  457.                 moveq.l #0,d1
  458. .2              cmpi.b  #10,(a1)+
  459.                 beq.s   .3
  460.                 addq.l  #1,d1
  461.                 subq.l  #1,d0
  462.                 ble.s   .6              ;Ende der Liste erreicht?
  463.                 bra.s   .2              ;Nein!
  464.  
  465. .3              tst.l   d1              ;Freizeile?
  466.                 beq.s   .1              ;Ja! Überspringen
  467.  
  468.                 movem.l a1/d0,-(sp)
  469.  
  470.                 clr.b   -1(a1)
  471.                 move.l  a0,my_FileName(a5)
  472.                 bsr.s   OpenFile
  473.                 bne.s   .5
  474.  
  475. .4              bsr     IffPic          ;IFF/ABk/VBM/WBO-Bild?
  476.                 beq.s   .5              ;Ja!
  477.                 bsr     PicDcr          ;Evtl. gepackt?
  478.                 beq.s   .4              ;Ja!
  479.  
  480. .5              bsr     FreeBuff
  481.  
  482.                 movem.l (sp)+,a1/d0
  483.  
  484.                 bsr     CKey            ;[ESC] betätigt?
  485.                 bne.s   .1              ;Nein!
  486.  
  487. .6              movea.l my_ListBuf(a5),a1
  488.                 move.l  my_ListLen(a5),d0
  489.                 EXE     FreeMem
  490.                 bra     Ok
  491.  
  492. ****************************************************************************
  493. * Bild/Liste öffnen und in Buffer einlesen
  494. ****************************************************************************
  495.  
  496. OpenFile        bsr     PrtView
  497.  
  498.                 move.l  my_FileName(a5),d1
  499.                 move.l  #MODE_OLDFILE,d2
  500.                 DOS     Open
  501.                 move.l  d0,my_FileHnd(a5)
  502.                 ble.s   .1
  503.  
  504.                 move.l  my_FileHnd(a5),d1
  505.                 moveq   #0,d2
  506.                 moveq   #OFFSET_END,d3
  507.                 LIB     Seek
  508.                 move.l  my_FileHnd(a5),d1
  509.                 moveq   #0,d2
  510.                 moveq   #OFFSET_BEGINNING,d3
  511.                 LIB     Seek
  512.                 move.l  d0,my_FileLen(a5)
  513.                 ble.s   .1
  514.  
  515.                 move.l  my_FileLen(a5),d0
  516.                 moveq   #MEMF_PUBLIC,d1
  517.                 EXE     AllocMem
  518.                 move.l  d0,my_FileBuf(a5)
  519.                 ble.s   .1
  520.  
  521.                 move.l  my_FileHnd(a5),d1
  522.                 move.l  my_FileBuf(a5),d2
  523.                 move.l  my_FileLen(a5),d3
  524.                 DOS     Read
  525.                 cmp.l   my_FileLen(a5),d0       ;Lesefehler aufgetreten?
  526.                 bne.s   .1                      ;Ja!
  527.  
  528.                 bsr.s   .2
  529.                 bra     Ok                      ;Kein Fehler!
  530.  
  531. .1              bsr.s   .2
  532.                 bsr     PrtVError
  533.                 bra     Error                   ;Fehler!
  534.  
  535. .2              move.l  my_FileHnd(a5),d1       ;Datei immer schließen
  536.                 beq.s   .3                      ;Nicht geöffnet
  537.                 clr.l   my_FileHnd(a5)
  538.                 DOS     Close
  539. .3              rts
  540.  
  541. ****************************************************************************
  542. * Bildspeicher wieder freigeben
  543. ****************************************************************************
  544.  
  545. FreeBuff        movea.l my_FileBuf(a5),a1
  546.                 move.l  my_FileLen(a5),d0
  547.                 beq.s   .0
  548.                 clr.l   my_FileLen(a5)
  549.                 EXE     FreeMem
  550. .0              rts
  551.  
  552. ****************************************************************************
  553. * Alle benötigten Libraries öffnen, Strukturspeicher reservieren
  554. ****************************************************************************
  555.  
  556. OpenAll         move.l  #my_SIZEOF,d0
  557.                 move.l  #MEMF_PUBLIC|MEMF_CLEAR,d1
  558.                 EXE     AllocMem
  559.                 tst.l   d0
  560.                 ble     Error
  561.                 movea.l d0,a5
  562.  
  563.                 lea     my_DosBase(a5),a2
  564.  
  565.                 lea     DosLib(pc),a1
  566.                 bsr.s   .0
  567.                 lea     IntLib(pc),a1
  568.                 bsr.s   .0
  569.                 lea     GfxLib(pc),a1
  570.                 bsr.s   .0
  571.  
  572.                 movea.l my_IntBase(a5),a1
  573.                 move.l  ib_ActiveScreen(a1),my_CliScrn(a5)
  574.                 move.l  ib_ActiveWindow(a1),my_CliWind(a5)
  575.                 rts
  576.  
  577. .0              moveq.l #0,d0
  578.                 LIB     OpenLibrary
  579.                 move.l  d0,(a2)+
  580.                 rts
  581.  
  582. ****************************************************************************
  583. * Alle geöffneten Libraries schließen und Programm beenden
  584. ****************************************************************************
  585.  
  586. CloseAll        movea.l my_DosBase(a5),a1
  587.                 EXE     CloseLibrary
  588.                 movea.l my_IntBase(a5),a1
  589.                 LIB     CloseLibrary
  590.                 movea.l my_GfxBase(a5),a1
  591.                 LIB     CloseLibrary
  592.  
  593.                 tst.l   my_DcrBase(a5)
  594.                 beq.s   .0
  595.                 movea.l my_DcrBase(a5),a1
  596.                 LIB     CloseLibrary
  597.  
  598. .0              tst.l   my_XpkBase(a5)
  599.                 beq.s   .1
  600.                 movea.l my_XpkBase(a5),a1
  601.                 LIB     CloseLibrary
  602.  
  603. .1              tst.l   my_ReqBase(a5)
  604.                 beq.s   .3
  605.                 move.l  my_RtFileReq(a5),d0
  606.                 beq.s   .2
  607.                 movea.l d0,a1
  608.                 REQ     rtFreeRequest
  609. .2              movea.l my_ReqBase(a5),a1
  610.                 EXE     CloseLibrary
  611.  
  612. .3              movea.l a5,a1
  613.                 move.l  #my_SIZEOF,d0
  614.                 LIB     FreeMem
  615.  
  616.                 clr.l   d0
  617.                 RTS
  618.  
  619. ****************************************************************************
  620. * Zeige das IFF - Format (ILBM/ACBM)
  621. ****************************************************************************
  622.  
  623. IffPic          clr.l   my_AnnoPtr(a5)
  624.                 clr.l   my_AuthPtr(a5)
  625.                 clr.l   my_CopyPtr(a5)
  626.  
  627.                 clr.w   my_NewScrn+ns_ViewModes(a5)
  628.  
  629.                 movea.l my_FileBuf(a5),a1       ;Datei-Buffer GLOBAL in A1
  630.  
  631.                 moveq.l #0,d0
  632. .0              cmpi.l  #'BMHD',(a1,d0.l)       ;BitMapHeaDer muß sein!
  633.                 beq.s   chunk0                  ;Ja
  634.                 addi.l  #2,d0                   ;Position erhöhen (Word)
  635.                 cmpi.l  #1024,d0
  636.                 ble.s   .0
  637.                 bra     ABkPic                  ;Nein! Link nächstes Format
  638.  
  639. ;---------------------------------------------------------------------------
  640. ;Zunächst  wird  der  für  die  Screen-Darstellung  nötige  Chunk ermittelt.
  641. ;Standartmäßig wird anhand der übergebenen Screen-Größe bestimmt, in welchem
  642. ;View-Modus dieser geöffnet werden  soll (s. chunk2 'CAMG').  Ebenfalls wird
  643. ;hier  ermittelt,  ob  die  IFF-Grafik  im  komprimierten  Zustand vorliegt.
  644. ;Kompressionsflag: cmpNone=0 (RAW) / cmpByteRun1=1 (RLE)
  645. ;---------------------------------------------------------------------------
  646. chunk0          lea     8(a1,d0.l),a1           ;ID_BMHD überspringen
  647.                 lea     my_NewScrn(a5),a0
  648.                 move.w  ibm_Width(a1),ns_Width(a0)
  649.                 move.w  ibm_Height(a1),ns_Height(a0)
  650.                 move.b  ibm_Planes(a1),ns_Depth+1(a0)
  651.                 move.b  ibm_Compression(a1),my_PkMode(a5)
  652.                 clr.w   ns_ViewModes(a0)        ;Def. ViewMode installieren
  653.                 cmpi.w  #320,ns_Width(a0)
  654.                 bls.s   .1
  655.                 ori.w   #V_HIRES,ns_ViewModes(a0)
  656. .1              cmpi.w  #256,ns_Height(a0)
  657.                 bls.s   .2
  658.                 ori.w   #V_LACE,ns_ViewModes(a0)
  659.  
  660. .2              movea.l my_FileBuf(a5),a1       ;Gfx in A1
  661.  
  662. ;---------------------------------------------------------------------------
  663. ;Hier  wird  ermittelt  an  welcher  Position der IFF-Datei die Farbeinträge
  664. ;vorliegen.   Falls  kein View-Modus der Grafik übermittelt wurde, wird hier
  665. ;anhand der Farbanzahl bestimmt ob die Grafik im HAM-Modus dargestellt wird.
  666. ;Unverständlicher  Weise  wird  dieser  Vorgang weder von DPaint IV noch von
  667. ;AMOSPro unterstützt, die Folge sind Falschfarben.
  668. ;---------------------------------------------------------------------------
  669. chunk1          cmpi.l  #'CMAP',(a1)
  670.                 bne.s   chunk2
  671.                 lea     4(a1),a2                ;Farbtabelle -> A2
  672.                 move.l  a2,my_Palette(a5)
  673.                 cmpi.l  #$C0,(a2)               ;HAM-Modus?
  674.                 bne.s   chunk2                  ;Nein!
  675.                 ori.w   #V_HAM,ns_ViewModes(a0) ;HAM-Flag einblenden
  676.  
  677. ;---------------------------------------------------------------------------
  678. ;Ein  spezieller  Chunk  für  die  Darstellung  einer  Grafik auf dem Amiga!
  679. ;Dieser  ist  von  bedeutung  wenn  die  Grafik  zum  Beispiel  im HAM-Modus
  680. ;angezeigt  werden  soll.   Liegt  dieser  Eintrag vor, wird der in chunk0/1
  681. ;vorsorglich installierte View-Modus ersetzt.
  682. ;---------------------------------------------------------------------------
  683. chunk2          cmpi.l  #'CAMG',(a1)
  684.                 bne.s   chunk3
  685.                 move.w  10(a1),ns_ViewModes(a0)
  686.  
  687. ;---------------------------------------------------------------------------
  688. ;Positionelle  Ermittlung  der  eigentlichen  Grafikdaten.  Erst hier werden
  689. ;alle zuvor ermittelten Einstellungen verarbeitet.
  690. ;---------------------------------------------------------------------------
  691. chunk3          cmpi.l  #'ABIT',(a1)            ;DigiPaint RAW Format?
  692.                 bne.s   chunk4                  ;Nein!
  693.                 move.b  #PKMODE_AMIGABASIC,my_PkMode(a5)
  694.                 bra.s   IffView                 ;Grafik zeigen
  695.  
  696. ;--------------------------------------------------------------------------
  697. ;Eventuelle    Bemerkungen    ( Annotations )  des   Grafikers   bzw.   des
  698. ;Grafikprogramms,  diese  Chunks  können  theoretisch  beliebig  lang sein.
  699. ;Übrigens sind  diese Chunks nicht standartmäßig für Grafikdateien gedacht,
  700. ;eigentlich verwendet nur das FORM-Musikformat diesen aber Brilliance sowie
  701. ;HamLab/ArtPRO usw. unterstützen Annotations ebenso, warum auch nicht VPic!
  702. ;--------------------------------------------------------------------------
  703. chunk4          cmpi.l  #'ANNO',(a1)            ;Annotation?
  704.                 bne.s   chunk5                  ;Nein
  705.                 move.l  a1,my_AnnoPtr(a5)       ;Zeiger für Info merken
  706.  
  707. chunk5          cmpi.l  #'AUTH',(a1)            ;Author?
  708.                 bne.s   chunk6                  ;Nein
  709.                 move.l  a1,my_AuthPtr(a5)       ;Zeiger für Info merken
  710.  
  711. chunk6          cmpi.l  #'(c) ',(a1)            ;Copyright?
  712.                 bne.s   chunk7                  ;Nein
  713.                 move.l  a1,my_CopyPtr(a5)       ;Zeiger für Info merken
  714.  
  715. ;--------------------------------------------------------------------------
  716. ;Die  eigentlichen  Grafikdaten  des  darzustellenden  Bildes.  Diese Daten
  717. ;liegen nun gepackt (RunLengthEncoding) oder in Raw-Format vor.
  718. ;--------------------------------------------------------------------------
  719. chunk7          cmpi.l  #'BODY',(a1)            ;Normales IFF-Format?
  720.                 beq.s   IffView                 ;Ja!
  721.                 adda.l  #2,a1                   ;Zeiger auf nächstes WORD
  722.                 bra     chunk1                  ;Weiter suchen
  723.  
  724. IffView         lea     8(a1),a4                ;Zeiger auf Gfxdaten -> A4
  725.  
  726.                 bsr     PicScrn                 ;IFF-Screen öffnen
  727.                 bne     Error                   ;Wenn Fehler dann Ende!
  728.  
  729.                 movea.l my_ScrnPtr(a5),a3
  730.                 lea     sc_BitMap(a3),a3
  731.  
  732.                 cmpi.b  #PKMODE_NORMAL,my_PkMode(a5)
  733.                 beq.s   IffNorm
  734.                 cmpi.b  #PKMODE_COMPRESSED,my_PkMode(a5)
  735.                 beq.s   IffPack
  736.                 cmpi.b  #PKMODE_AMIGABASIC,my_PkMode(a5)
  737.                 beq.s   IffAbas
  738.  
  739. ;---------------------------------------------------------------------------
  740. ;Das  IFF-Bild  liegt  unkomprimiert  vor.   Die folgende Routine zeigt wohl
  741. ;eines  der  schnellsten  Verfahren,  welches  zum Anzeigen einer IFF-Grafik
  742. ;verwendet werden kann.
  743. ;---------------------------------------------------------------------------
  744. IffNorm         moveq.l #0,d3
  745.                 moveq.l #0,d5
  746.                 move.w  bm_BytesPerRow(a3),d5
  747.                 move.w  bm_Rows(a3),d6
  748. .1              moveq   #0,d4
  749. .2              lea     my_PlanPtr(a5),a0
  750.                 move.l  (a0,d4.w),d0
  751.                 beq.s   .3
  752.                 movea.l a4,a0
  753.                 add.l   d3,d0
  754.                 movea.l d0,a1
  755.                 move.l  d5,d0
  756.                 EXE     CopyMem
  757.                 adda.l  d5,a4
  758.                 addq.l  #4,d4
  759.                 bra.s   .2
  760. .3              subq.w  #1,d6
  761.                 beq.s   IffCols
  762.                 add.l   d5,d3
  763.                 bra.s   .1
  764.  
  765. ;---------------------------------------------------------------------------
  766. ;Das  IFF-Bild liegt komprimiert vor.  Das Kompressionsverfahren muß dem von
  767. ;Electronic Arts entwickelten 'cmpByteRun1 (RLE)' entsprechen.
  768. ;---------------------------------------------------------------------------
  769. IffPack         move.w  bm_Rows(a3),d6
  770. .0              move.b  bm_Depth(a3),d5
  771.                 lea     my_PlanPtr(a5),a1
  772. .1              movea.l (a1),a0
  773.                 move.w  bm_BytesPerRow(a3),d2
  774. .2              move.b  (a4)+,d0
  775.                 bmi.s   .4
  776. .3              move.b  (a4)+,(a0)+
  777.                 subq.w  #1,d2
  778.                 subq.b  #1,d0
  779.                 bpl.s   .3
  780.                 bra.s   .6
  781. .4              neg.b   d0
  782.                 bmi.s   .2
  783.                 move.b  (a4)+,d3
  784. .5              move.b  d3,(a0)+
  785.                 subq.w  #1,d2
  786.                 subq.b  #1,d0
  787.                 bpl.s   .5
  788. .6              tst.w   d2
  789.                 bne.s   .2
  790.                 move.l  a0,(a1)+
  791.                 subq.b  #1,d5                   ;bm_Depth-1
  792.                 bne.s   .1
  793.                 subq.w  #1,d6                   ;bm_Rows-1
  794.                 bne.s   .0
  795.                 bra.s   IffCols
  796.  
  797. ;---------------------------------------------------------------------------
  798. ;Die Daten des Bildes liegen im  speziellen DigiPaint (ACBM) Format vor.  In
  799. ;diesem Modus kann eine Grafik am schnellsten dargestellt werden. AmigaBASIC
  800. ;läßt grüssen!
  801. ;---------------------------------------------------------------------------
  802. IffAbas         move.w  bm_BytesPerRow(a3),d7
  803.                 mulu    bm_Rows(a3),d7          ;Größe der Planes -> D7
  804.                 lea     my_PlanPtr(a5),a2
  805. .0              movea.l a4,a0                   ;Zeiger Grafikdaten
  806.                 move.l  (a2)+,d0                ;Zeiger BitPlane
  807.                 beq.s   IffCols                 ;Keine weitere Plane
  808.                 movea.l d0,a1
  809.                 move.l  d7,d0
  810.                 EXE     CopyMem
  811.                 adda.l  d7,a4
  812.                 bra.s   .0
  813.  
  814. ;Jetzt noch die benötigte Farbpalette setzten.
  815.  
  816. IffCols         movea.l my_Palette(a5),a2
  817.                 move.l  (a2)+,d7
  818.                 divu    #3,d7
  819.                 moveq.l #0,d6
  820. .0              movea.l my_ScrnPtr(a5),a0
  821.                 lea     sc_ViewPort(a0),a0
  822.                 move.l  d6,d0
  823.                 moveq.l #0,d1
  824.                 move.b  (a2)+,d1
  825.                 lsr.b   #4,d1
  826.                 moveq.l #0,d2
  827.                 move.b  (a2)+,d2
  828.                 lsr.b   #4,d2
  829.                 moveq.l #0,d3
  830.                 move.b  (a2)+,d3
  831.                 lsr.b   #4,d3
  832.                 GFX     SetRGB4
  833.                 addq.l  #1,d6
  834.                 dbf     d7,.0
  835.  
  836.                 bra     PicWait
  837.  
  838. ****************************************************************************
  839. * Zeige das spezielle AmBk Pic.Pac - Format (AMOS)
  840. ****************************************************************************
  841.  
  842. ABkPic          cmpi.l  #"AmBk",(a1)            ;AMOS Bank?
  843.                 bne     VBMPic                  ;Nein, VPic BitMap Format?
  844.  
  845.                 move.b  #PKMODE_AMOSBITMAP,my_PkMode(a5)
  846.                 lea     my_NewScrn(a5),a0
  847.  
  848.                 lea     20(a1),a1               ;AmBk Head überspringen
  849.                 cmpi.l  #SCCode,(a1)            ;AmBk Pic.Pac Screen Format
  850.                 bne.s   .1                      ;Nein! Pack BitMap Format?
  851.  
  852. ;Das Bild wurde mittels 'Spack SCREEN To BANK' gepackt.
  853.  
  854.                 move.b  #PKMODE_AMOSSCREEN,my_PkMode(a5)
  855.  
  856.                 move.w  PsTx(a1),ns_Width(a0)
  857.                 move.w  PsTy(a1),ns_Height(a0)
  858.                 move.w  PsNPlan(a1),ns_Depth(a0)
  859.                 move.w  PsCon0(a1),ns_ViewModes(a0)
  860.                 bra.s   .3
  861.  
  862. .1              cmpi.l  #BMCode,(a1)            ;Gepackte BitMap?
  863.                 bne     Error                   ;Nein!
  864.  
  865. ;---------------------------------------------------------------------------
  866. ;Es wurden nur die jeweiligen BitMaps mittels 'Pack SCREEN To Bank' gepackt.
  867. ;Dabei wird weder die Palette noch der ViewMode berücksichtigt.
  868. ;---------------------------------------------------------------------------
  869.                 move.w  Pktx(a1),d0
  870.                 lsl.w   #3,d0
  871.                 move.w  d0,ns_Width(a0)
  872.                 move.w  Pkty(a1),d0
  873.                 mulu    Pktcar(a1),d0
  874.                 move.w  d0,ns_Height(a0)
  875.                 move.w  Pknplan(a1),ns_Depth(a0)
  876.                 clr.w   ns_ViewModes(a0)        ;Def. ViewMode installieren
  877.                 cmpi.w  #320,ns_Width(a0)
  878.                 bls.s   .2
  879.                 ori.w   #V_HIRES,ns_ViewModes(a0)
  880. .2              cmpi.w  #256,ns_Height(a0)
  881.                 bls.s   .3
  882.                 ori.w   #V_LACE,ns_ViewModes(a0)
  883.  
  884. .3              bsr     PicScrn                 ;Screen öffnen
  885.                 bne     Error                   ;Hat nicht geklappt
  886.  
  887. ;---------------------------------------------------------------------------
  888. ;Hier  beginnt  nun die eigentliche Unpack-Routine von François Lionet.  Ich
  889. ;habe  sie  geringfügig  abändern  müssen,  da  sie  eigentlich  nur für die
  890. ;Programmierung eigener AMOSPro Extensionen ausgelegt war.
  891. ;---------------------------------------------------------------------------
  892. UAEc            equ     0
  893. UDEc            equ     4
  894. UITy            equ     8
  895. UTy             equ     10
  896. UTLine          equ     12
  897. UNPlan          equ     14
  898. UPile           equ     16
  899.  
  900. UnPack          move.l  a5,-(sp)
  901.  
  902.                 movea.l my_FileBuf(a5),a0       ;Zeiger auf Bilddaten
  903.                 movea.l my_ScrnPtr(a5),a1       ;Zeiger auf Screen
  904.  
  905.                 lea     20(a0),a0               ;Header überspringen
  906.                 cmpi.b  #PKMODE_AMOSBITMAP,my_PkMode(a5)
  907.                 beq.s   .1                      ;Ist gepackte BitMap!
  908.                 lea     PsLong(a0),a0           ;Zeiger auf Screen BM
  909.  
  910. ;Parameter preparieren!
  911.  
  912. .1              lea     -UPile(sp),sp           ;Arbeitsbereich einrichten
  913.  
  914.                 lea     sc_BitMap(a1),a1        ;Screen BitMap -> A1
  915.                 move.w  bm_BytesPerRow(a1),d7
  916.                 move.w  Pknplan(a0),UNPlan(sp)  ;Anzahl der BitPlanes
  917.  
  918.                 lea     bm_Planes(a1),a1        ;Zeiger auf Planes -> A1
  919.                 move.l  a1,UAEc(sp)
  920.                 move.w  Pktcar(a0),d6           ;Höhe gepackten Block -> D6
  921.  
  922.                 move.w  d6,d0
  923.                 mulu    d7,d0
  924.                 move    d0,UTLine(sp)           ;Anzahl der Zeilen
  925.  
  926.                 move.w  Pktx(a0),a3             ;Breite BitMap in Bytes -> A3
  927.                 subq.w  #1,a3
  928.                 move.w  Pkty(a0),UITy(sp)       ;Höhe BitMap in Blöcke
  929.                 lea     PkDatas1(a0),a4         ;Zeiger Tabelle 1 -> A4
  930.                 movea.l a0,a5
  931.                 movea.l a0,a6
  932.                 adda.l  PkDatas2(a0),a5         ;Zeiger Tabelle 2 -> A5
  933.                 adda.l  PkPoint2(a0),a6         ;Zeigertabelle -> A6
  934.  
  935.                 moveq   #7,d0
  936.                 moveq   #7,d1
  937.                 move.b  (a5)+,d2
  938.                 move.b  (a4)+,d3
  939.                 btst    d1,(a6)
  940.                 beq.s   prep
  941.                 move.b  (a5)+,d2
  942.  
  943. prep            subq.w  #1,d1
  944.  
  945. ;BitMaps entpacken!
  946.  
  947. dplan           movea.l UAEc(sp),a2             ;BitMap PlanePtr -> A2
  948.                 addq.l  #4,UAEc(sp)             ;Auf nächste Plane
  949.                 movea.l (a2),a2                 ;Adresse Plane -> A2
  950.                 move.w  UITy(sp),UTy(sp)
  951.  
  952. dligne          movea.l a2,a1                   ;PlanePtr -> A1
  953.                 move.w  a3,d4
  954.  
  955. dcarre          movea.l a1,a0
  956.                 move.w  d6,d5                   ;Blockhöhe
  957.  
  958. doctet1         subq.w  #1,d5
  959.                 bmi.s   doct3
  960.                 btst    d0,d2
  961.                 beq.s   doct1
  962.                 move.b  (a4)+,d3
  963.  
  964. doct1           move.b  d3,(a0)
  965.                 add.w   d7,a0
  966.                 dbra    d0,doctet1
  967.                 moveq   #7,d0
  968.                 btst    d1,(a6)
  969.                 beq.s   doct2
  970.                 move.b  (a5)+,d2
  971.  
  972. doct2           dbra    d1,doctet1
  973.                 moveq   #7,d1
  974.                 addq.l  #1,a6
  975.                 bra.s   doctet1
  976.  
  977. doct3           addq.l  #1,a1                   ;Auf nächsten Block
  978.                 dbra    d4,dcarre
  979.                 adda.w  UTLine(sp),a2           ;Nächste Blockzeile
  980.                 subq.w  #1,UTy(sp)
  981.                 bne.s   dligne
  982.                 subq.w  #1,UNPlan(sp)
  983.                 bne.s   dplan
  984.                 lea     UPile(sp),sp            ;Arbeitsbereich zurücksetzen
  985.  
  986. ;---------------------------------------------------------------------------
  987. ;Die  Farbpalette im Screen setzen.  Die jeweiligen Farbwerte liegen bei dem
  988. ;AmBk Format in Word-Größe vor, was die Farbgebung erheblich vereinfacht.
  989. ;---------------------------------------------------------------------------
  990.                 move.l  (sp)+,a5
  991.  
  992.                 lea     my_NewScrn(a5),a0
  993.                 movea.l my_FileBuf(a5),a1
  994.  
  995.                 lea     20(a1),a1
  996.                 cmpi.b  #PKMODE_AMOSBITMAP,my_PkMode(a5)
  997.                 beq     PicWait                 ;Keine Palette (Packed BitMap)
  998.  
  999.                 move.w  PsNbCol(a1),d0          ;Anzahl der Farbeinträge
  1000.                 lea     PsPal(a1),a1            ;Zeiger auf Farbtabelle
  1001.                 movea.l my_ScrnPtr(a5),a0
  1002.                 lea     sc_ViewPort(a0),a0
  1003.                 GFX     LoadRGB4                ;Farbwerte aktualisieren
  1004.  
  1005.                 bra     PicWait
  1006.  
  1007. ****************************************************************************
  1008. * Zeige das (interne) VPic BitMap Plane - Format (VPIC/VBMP)
  1009. ****************************************************************************
  1010.  
  1011. VBMPic          cmpi.l  #ID_VBMP,vbm_Bmap(a1)   ;VPic BitMap Format?
  1012.                 bne.s   WBOPic                  ;Nein
  1013.  
  1014.                 move.b  #PKMODE_VPICBITMAP,my_PkMode(a5)
  1015.  
  1016.                 lea     my_NewScrn(a5),a0
  1017.                 move.w  vbm_Width(a1),ns_Width(a0)
  1018.                 move.w  vbm_Height(a1),ns_Height(a0)
  1019.                 move.w  #vbm_DEPTH,ns_Depth(a0)
  1020.                 move.w  vbm_ViewMode(a1),ns_ViewModes(a0)
  1021.  
  1022.                 bsr     PicScrn                 ;Screen öffnen
  1023.                 bne     Error                   ;Hat nicht geklappt
  1024.  
  1025.                 movea.l my_FileBuf(a5),a0       ;Zeiger auf Bilddaten
  1026.                 lea     vbm_Data(a0),a0
  1027.  
  1028.                 moveq.l #0,d0
  1029.                 movea.l my_ScrnPtr(a5),a1       ;Zeiger auf Screen
  1030.                 lea     sc_BitMap(a1),a1
  1031.                 move.w  bm_BytesPerRow(a1),d0
  1032.                 mulu    bm_Rows(a1),d0
  1033.                 movea.l my_PlanPtr(a5),a1
  1034.                 EXE     CopyMem
  1035.  
  1036.                 bra     PicWait
  1037.  
  1038. ****************************************************************************
  1039. * Zeige das Workbench Objekt Info - Format ($E310 0001)
  1040. ****************************************************************************
  1041.  
  1042. WBOPic          cmpi.w  #WB_DISKMAGIC,do_Magic(a1)      ;WBO Info Format?
  1043.                 bne     Error                           ;Nein! Decrunch
  1044.                 cmpi.w  #WB_DISKVERSION,do_Version(a1)
  1045.                 bne     Error
  1046.  
  1047.                 move.b  #PKMODE_WBOINFO,my_PkMode(a5)
  1048.  
  1049.                 lea     my_NewScrn(a5),a0
  1050.                 movea.l my_FileBuf(a5),a1
  1051.                 lea     do_Gadget(a1),a1
  1052.                 move.w  #640,ns_Width(a0)
  1053.                 move.w  gg_Height(a1),ns_Height(a0)
  1054.                 move.w  #2,ns_Depth(a0)
  1055.                 move.w  #V_HIRES,ns_ViewModes(a0)
  1056.                 bsr     PicScrn                         ;Screen öffnen
  1057.                 bne     Error                           ;Hat nicht geklappt
  1058.  
  1059.                 moveq.l #0,d6
  1060.                 moveq.l #0,d7
  1061.                 movea.l my_FileBuf(a5),a4
  1062.                 lea     do_Gadget(a4),a1
  1063.                 move.w  gg_Width(a1),d6
  1064.                 move.w  gg_Height(a1),d7
  1065.                 move.l  d6,d0                           ;kgV 16
  1066.                 divu    #$10,d0
  1067.                 swap    d0
  1068.                 andi.l  #$FFFF,d0
  1069.                 tst.w   d0
  1070.                 beq.s   .0
  1071.                 sub.l   d0,d6
  1072.                 addi.l  #$10,d6
  1073.  
  1074. .0              tst.w   do_DrawerData(a4)
  1075.                 bne.s   .1
  1076.                 adda.l  #98,a4
  1077.                 bra.s   .2
  1078. .1              adda.l  #154,a4
  1079.  
  1080. .2              lsr.l   #3,d6
  1081.                 moveq.l #0,d4
  1082.  
  1083. WBO_View        movea.l my_PlanPtr(a5),a3
  1084.                 bsr.s   .0
  1085.                 movea.l my_PlanPtr+4(a5),a3
  1086.                 bsr.s   .0
  1087.                 tst.l   d4
  1088.                 bne     PicWait
  1089.                 adda.l  #20,a4
  1090.                 move.l  d6,d4
  1091.                 bra.s   WBO_View
  1092.  
  1093. .0              adda.l  d4,a3
  1094.                 move.l  d7,d5
  1095.                 subq    #2,d5
  1096. .1              movea.l a4,a0
  1097.                 movea.l a3,a1
  1098.                 move.l  d6,d0
  1099.                 EXE     CopyMem
  1100.                 adda.l  d6,a4
  1101.                 adda.l  #80,a3
  1102.                 dbra    d5,.1
  1103.                 rts
  1104.  
  1105. ****************************************************************************
  1106. * Zeige den aktuellen Screen - [Param:*] [RETURN]
  1107. ****************************************************************************
  1108.  
  1109. ASCPic          move.b  #PKMODE_ACTUALSCREEN,my_PkMode(a5)
  1110.  
  1111.                 move.l  my_NextScrn(a5),a0              ;Nächster Screen
  1112.                 move.l  (a0),my_NextScrn(a5)            ;übergeben
  1113.  
  1114.                 tst.l   my_NextScrn(a5)
  1115.                 bne.s   .0
  1116.                 move.l  my_CliScrn(a5),my_NextScrn(a5)
  1117.  
  1118. .0              movea.l my_NextScrn(a5),a0
  1119.                 lea     my_NewScrn(a5),a1
  1120.                 move.w  sc_Width(a0),ns_Width(a1)
  1121.                 move.w  sc_Height(a0),ns_Height(a1)
  1122.                 lea     sc_ViewPort(a0),a2
  1123.                 move.w  vp_Modes(a2),ns_ViewModes(a1)
  1124.                 lea     sc_BitMap(a0),a0
  1125.                 move.b  bm_Depth(a0),ns_Depth+1(a1)
  1126.                 bsr     PicScrn
  1127.                 bne     Error
  1128.  
  1129.                 movea.l my_NextScrn(a5),a3
  1130.                 movea.l my_ScrnPtr(a5),a4
  1131.                 lea     sc_BitMap(a3),a3
  1132.                 lea     sc_BitMap(a4),a4
  1133.  
  1134.                 moveq.l #0,d7
  1135.                 move.w  bm_BytesPerRow(a4),d7
  1136.                 mulu    bm_Rows(a4),d7
  1137.  
  1138. ;Die aktuellen ScrnPlanes in die ScrnPlanes kopieren
  1139.  
  1140. .1              move.l  bm_Planes(a3),d0
  1141.                 beq.s   .2
  1142.                 move.l  bm_Planes(a4),d1
  1143.                 beq.s   .2
  1144.                 movea.l d0,a0
  1145.                 movea.l d1,a1
  1146.                 move.l  d7,d0
  1147.                 EXE     CopyMem
  1148.                 adda.l  #4,a3
  1149.                 adda.l  #4,a4
  1150.                 bra.s   .1
  1151.  
  1152. ;Farben setzen
  1153.  
  1154. .2              movea.l my_NextScrn(a5),a1
  1155.                 lea     sc_ViewPort(a1),a1
  1156.                 movea.l vp_ColorMap(a1),a1
  1157.                 movea.l cm_ColorTable(a1),a1
  1158.  
  1159.                 movea.l my_ScrnPtr(a5),a0
  1160.                 lea     sc_ViewPort(a0),a0
  1161.                 move.l  my_ColorCount(a5),d0
  1162.                 GFX     LoadRGB4
  1163.  
  1164. ;Screen aufblinken für Darstellungsinfo
  1165.  
  1166.                 bsr     PicFront
  1167.                 move.l  my_ScrnPtr(a5),a0
  1168.                 INT     DisplayBeep
  1169.                 WAIT    10                      ;Warten auf ColorCorrection
  1170.  
  1171.                 lea     my_InputBuf(a5),a0      ;Für Info (*)
  1172.                 move.w  #$2A00,(a0)
  1173.                 move.l  a0,my_FileName(a5)
  1174.  
  1175.                 bra     PicWait
  1176.  
  1177. ****************************************************************************
  1178. * Unter-Routinen die für jedes Bildformat gleichbedeutend sind
  1179. ****************************************************************************
  1180.  
  1181. PicScrn         lea     my_NewScrn(a5),a0
  1182.                 move.w  #CUSTOMSCREEN|SCREENBEHIND,ns_Type(a0)
  1183.                 INT     OpenScreen
  1184.                 move.l  d0,my_ScrnPtr(a5)
  1185.                 beq     Error
  1186.  
  1187.                 movea.l d0,a0                   ;PlanePtr kopieren
  1188.                 lea     sc_BitMap(a0),a0
  1189.                 lea     bm_Planes(a0),a0
  1190.                 lea     my_PlanPtr(a5),a1
  1191.                 moveq.l #8-1,d0
  1192. .0              move.l  (a0)+,(a1)+
  1193.                 dbra    d0,.0
  1194.  
  1195.                 lea     my_NewWind(a5),a0
  1196.                 lea     my_NewScrn(a5),a1
  1197.  
  1198.                 move.w  ns_Depth(a1),d0         ;Farbanzahl merken
  1199.                 moveq.l #0,d1
  1200.                 bset    d0,d1
  1201.                 move.l  d1,my_ColorCount(a5)
  1202.  
  1203.                 move.w  ns_Width(a1),nw_Width(a0)
  1204.                 move.w  ns_Height(a1),nw_Height(a0)
  1205.                 move.l  #MOUSEBUTTONS|RAWKEY,nw_IDCMPFlags(a0)
  1206.                 move.l  #ACTIVATE|BORDERLESS,nw_Flags(a0)
  1207.                 move.l  my_ScrnPtr(a5),nw_Screen(a0)
  1208.                 move.w  #CUSTOMSCREEN,nw_Type(a0)
  1209.                 LIB     OpenWindow
  1210.                 move.l  d0,my_WindPtr(a5)
  1211.                 bne     Ok
  1212.                 bsr     PicClose
  1213.                 bra     Error
  1214.  
  1215. PicWait         movea.l my_ScrnPtr(a5),a0       ;Farben kopieren für *Shade
  1216.                 lea     sc_ViewPort(a0),a0
  1217.                 movea.l vp_ColorMap(a0),a1
  1218.                 movea.l cm_ColorTable(a1),a1
  1219.                 lea     my_DefPalette(a5),a0
  1220.                 moveq.l #32-1,d0
  1221. .0              move.w  (a1)+,(a0)+
  1222.                 dbf     d0,.0
  1223.  
  1224.                 tst.b   my_CliDisplay(a5)       ;Bild zeigen im CLI-Window?
  1225.                 bne     CliDisplay              ;Ja
  1226.  
  1227.                 bsr     PicFront
  1228.  
  1229.                 movea.l my_WindPtr(a5),a0
  1230.                 movea.l wd_UserPort(a0),a0
  1231.                 move.b  MP_SIGBIT(a0),d1
  1232.                 moveq.l #0,d0
  1233.                 bset    d1,d0
  1234.                 EXE     Wait
  1235.  
  1236. PicKey          WAIT    5
  1237.                 bsr     CKey
  1238.                 beq.s   .0              ;[ESC] = Abbruch
  1239.                 move.b  my_KeyCode(a5),d1
  1240.                 beq.s   PicKey
  1241.                 cmpi.b  #$FF,d1
  1242.                 beq.s   .0
  1243.                 bra.s   .1
  1244. .0              bsr     PicBack
  1245.                 bra     WinClose
  1246.  
  1247. ;Auswertung der Tastatureingaben
  1248.  
  1249. .1              cmpi.b  #RAW_F1,d1      ;[F1] = Info
  1250.                 bne.s   .2
  1251.                 bsr     PicBack
  1252.                 bsr     PicInfo
  1253.                 bsr     PicFront
  1254.                 bra.s   PicKey
  1255.  
  1256. .2              cmpi.b  #RAW_F2,d1      ;[F2] = Save IFF
  1257.                 bne.s   .3
  1258.                 bsr     PicBack
  1259.                 bsr     SaveIFF
  1260.                 bsr     PicFront
  1261.                 bra.s   PicKey
  1262.  
  1263. .3              cmpi.b  #RAW_F3,d1      ;[F3] = Negative
  1264.                 bne.s   .4
  1265.                 bsr     Negative
  1266.                 bra.s   PicKey
  1267.  
  1268. .4              cmpi.b  #RAW_F4,d1      ;[F4] = CLI Display
  1269.                 bne.s   .5
  1270.                 bsr     PicBack
  1271.                 bra     CliDisplay
  1272.  
  1273. .5              cmpi.b  #RAW_F5,d1      ;[F5] = CLI Display + Colorset
  1274.                 bne.s   .6
  1275.                 bsr     PicBack
  1276.                 bsr     CliDisplay
  1277.                 move.w  #COLOR_CLI,d3
  1278.                 bsr     Shade
  1279.                 bra     Ok
  1280.  
  1281. .6              cmpi.b  #RAW_F6,d1      ;[F6] = Red Shade
  1282.                 bne.s   .7
  1283.                 move.l  #COLOR_RED,d3
  1284.                 bsr     Shade
  1285.                 bra     PicKey
  1286.  
  1287. .7              cmpi.b  #RAW_F7,d1      ;[F7] = Green Shade
  1288.                 bne.s   .8
  1289.                 move.l  #COLOR_GRN,d3
  1290.                 bsr     Shade
  1291.                 bra     PicKey
  1292.  
  1293. .8              cmpi.b  #RAW_F8,d1      ;[F8] = Blue Shade
  1294.                 bne.s   .9
  1295.                 move.l  #COLOR_BLU,d3
  1296.                 bsr     Shade
  1297.                 bra     PicKey
  1298.  
  1299. .9              cmpi.b  #RAW_F9,d1      ;[F9] = Grey Shade
  1300.                 bne.s   .10
  1301.                 move.l  #COLOR_GRY,d3
  1302.                 bsr     Shade
  1303.                 bra     PicKey
  1304.  
  1305. .10             cmpi.b  #RAW_F10,d1     ;[F10] = Def Palette
  1306.                 bne.s   .11
  1307.                 moveq.l #COLOR_DEF,d3
  1308.                 bsr     Shade
  1309.                 bra     PicKey
  1310.  
  1311. .11             cmpi.b  #RAW_HELP,d1    ;[HELP] = Usage
  1312.                 bne.s   .12
  1313.                 bsr     PicBack
  1314.                 bsr     Rt_Usage
  1315.                 bsr     PicFront
  1316.                 bra     PicKey
  1317.  
  1318. .12             cmpi.b  #RAW_1,d1       ;[1-8] = Save VBM
  1319.                 bmi.s   .13
  1320.                 cmpi.b  #RAW_9,d1
  1321.                 bpl.s   .13
  1322.                 bsr.s   PicBack
  1323.                 bsr     SaveVBM
  1324.                 bsr     PicFront
  1325.                 bra     PicKey
  1326.  
  1327. .13             cmpi.b  #RAW_RETURN,d1  ;[RETURN] = View Next Screen
  1328.                 bne.s   .14
  1329.                 bsr.s   PicBack
  1330.                 bsr.s   WinClose
  1331.                 bra     ASCPic
  1332.  
  1333. .14             cmpi.b  #RAW_RALT,d1    ;[RALT] = Multitasking
  1334.                 bne.s   .15
  1335.                 bsr.s   PicBack
  1336. .Loop           WAIT    10
  1337.                 bsr     CKey
  1338.                 cmpi.b  #RAW_LALT,d1    ;[LALT] = Stop multitasking
  1339.                 bne.s   .Loop
  1340.                 bsr.s   PicFront
  1341.                 bra     PicKey
  1342.  
  1343. .15             cmpi.b  #RAW_N1,d1      ;[N1] = Set OS1.3 color
  1344.                 bne.s   .16
  1345.                 moveq.l #COLOR_OS1,d3
  1346.                 bsr     Shade
  1347.                 bra     PicKey
  1348.  
  1349. .16             cmpi.b  #RAW_N2,d1      ;[N2] = Set OS2.0 color
  1350.                 bne.s   .99
  1351.                 moveq.l #COLOR_OS2,d3
  1352.                 bsr     Shade
  1353.                 bra     PicKey
  1354.  
  1355. .99             cmpi.b  #RAW_SPACE,d1   ;[SPACE] = End
  1356.                 bne     PicKey
  1357.  
  1358. WinClose        movea.l my_WindPtr(a5),a0
  1359.                 INT     CloseWindow
  1360.  
  1361. PicClose        movea.l my_ScrnPtr(a5),a0
  1362.                 INT     CloseScreen
  1363.  
  1364.                 bra     Ok
  1365.  
  1366. PicBack         movea.l my_ScrnPtr(a5),a0
  1367.                 INT     ScreenToBack
  1368.                 rts
  1369.  
  1370. PicFront        movea.l my_ScrnPtr(a5),a0
  1371.                 INT     ScreenToFront
  1372.                 rts
  1373.  
  1374. ****************************************************************************
  1375. * Informationen der dargestellten Grafik ausgeben - [F1]
  1376. ****************************************************************************
  1377.  
  1378. PicInfo         lea     my_NewScrn(a5),a0
  1379.                 lea     my_FmtData(a5),a1
  1380.                 move.l  my_FileName(a5),a2
  1381.                 movea.l a2,a3
  1382. .0              cmpi.b  #':',(a2)               ;Nur den Dateinamen
  1383.                 beq.s   .1
  1384.                 cmpi.b  #'/',(a2)
  1385.                 beq.s   .1
  1386.                 tst.b   (a2)+
  1387.                 bne.s   .0
  1388.                 bra.s   PicInfoOut
  1389. .1              adda.l  #1,a2
  1390.                 movea.l a2,a3
  1391.                 bra.s   .0
  1392.  
  1393. PicInfoOut      move.l  a3,(a1)+
  1394.                 move.w  ns_Width(a0),(a1)+
  1395.                 move.w  ns_Height(a0),(a1)+
  1396.                 move.w  ns_Depth(a0),(a1)+
  1397.                 move.l  my_ColorCount(a5),(a1)+
  1398.                 move.w  ns_ViewModes(a0),(a1)+
  1399.                 move.b  my_PkMode(a5),d0
  1400.                 ext.w   d0
  1401.                 lsl.w   #4,d0
  1402.                 lea     TxTyp(pc),a0
  1403.                 lea     (a0,d0),a0
  1404.                 move.l  a0,(a1)+
  1405.                 move.l  my_FileLen(a5),(a1)+
  1406.  
  1407.                 clr.l   (a1)
  1408.                 clr.l   4(a1)
  1409.                 clr.l   8(a1)
  1410.  
  1411.                 lea     TxAnno(pc),a2
  1412.                 clr.w   (a2)
  1413.                 lea     TxAuth(pc),a2
  1414.                 clr.w   (a2)
  1415.                 lea     TxCopy(pc),a2
  1416.                 clr.w   (a2)
  1417.  
  1418.                 move.l  my_CopyPtr(a5),d0
  1419.                 beq.s   .0
  1420.                 move.l  #'(c) ',d1
  1421.                 bsr.s   .3
  1422.                 lea     TxAuth(pc),a2
  1423.  
  1424. .0              move.l  my_AuthPtr(a5),d0
  1425.                 beq.s   .1
  1426.                 move.l  #'Auth',d1
  1427.                 bsr.s   .3
  1428.                 lea     TxAnno(pc),a2
  1429.  
  1430. .1              move.l  my_AnnoPtr(a5),d0
  1431.                 beq.s   .2
  1432.                 move.l  #'Anno',d1
  1433.                 bsr.s   .3
  1434.  
  1435. .2              lea     TxInfo(pc),a0
  1436.                 bsr     Rt_Fmt
  1437.                 lea     my_DataBuf(a5),a4
  1438.                 move.l  a0,8(a4)
  1439.                 lea     TxRtPicInfo(pc),a0
  1440.                 move.l  a0,(a4)
  1441.                 lea     TxRtOKCOLS(pc),a0
  1442.                 move.l  a0,4(a4)
  1443.                 bsr     Rt_Request
  1444.                 tst.l   my_RtBut(a5)
  1445.                 beq     Ok
  1446.                 bra.s   ColorTable
  1447.  
  1448. .3              move.b  #10,(a2)+
  1449.                 move.l  d1,(a2)
  1450.                 movea.l d0,a0
  1451.                 lea     4(a0),a0
  1452.                 move.l  (a0)+,d0
  1453.                 clr.b   (a0,d0)
  1454.                 move.l  a0,(a1)+
  1455.                 rts
  1456.  
  1457. ColorTable      movea.l my_ScrnPtr(a5),a4
  1458.                 lea     sc_ViewPort(a4),a3
  1459.                 movea.l vp_ColorMap(a3),a3
  1460.                 movea.l cm_ColorTable(a3),a3
  1461.                 lea     my_FmtData(a5),a4
  1462.                 move.l  my_ColorCount(a5),d0
  1463.                 cmpi.l  #64,d0                  ;AGA ist >64 (256 RGB)
  1464.                 ble.s   .NoAGA                  ;Kein AGA Format
  1465.                 move.l  #64,d0                  ;8 BMP ist viel zu viel
  1466. .NoAGA          subq.w  #1,d0
  1467.                 moveq   #0,d1
  1468.                 moveq   #0,d2
  1469.                 lea     my_DataBuf(a5),a2
  1470. .0              move.w  d1,(a4)
  1471.                 move.w  (a3)+,2(a4)
  1472.                 addq.w  #1,d1
  1473.                 lea     TxColMap(pc),a0
  1474.                 bsr     Rt_Fmt
  1475. .1              move.b  (a0)+,(a2)+
  1476.                 bne.s   .1
  1477.                 suba.l  #1,a2
  1478.                 addq.b  #1,d2
  1479.                 cmpi.b  #4,d2
  1480.                 bne.s   .2
  1481.                 moveq   #0,d2
  1482.                 move.b  #10,(a2)+               ;Neue Zeile
  1483. .2              dbeq    d0,.0
  1484.                 clr.b   -1(a2)                  ;Ende der Farbtabelle
  1485.                 lea     my_FmtData(a5),a4       ;Buffer wird nicht benötigt!
  1486.                 lea     TxRtColorTab(pc),a0
  1487.                 move.l  a0,(a4)
  1488.                 lea     TxRtOKINFO(pc),a0
  1489.                 move.l  a0,4(a4)
  1490.                 lea     my_DataBuf(a5),a0
  1491.                 move.l  a0,8(a4)
  1492.                 bsr     Rt_Request
  1493.                 clr.l   my_DataBuf(a5)          ;Für Dateinamen (löschen)
  1494.                 tst.l   my_RtBut(a5)
  1495.                 bne     PicInfo
  1496.                 bra     Ok
  1497.  
  1498. ****************************************************************************
  1499. * Zur Zeit dargestelltes Bild als IFF-Datei speichern - [F2]
  1500. ****************************************************************************
  1501.  
  1502. SaveIFF         lea     TxRtSaveIFF(pc),a3
  1503.                 bsr     Rt_Input
  1504.                 tst.l   my_RtBut(a5)
  1505.                 beq     Ok
  1506.  
  1507.                 move.l  my_FileName(a5),d1
  1508.                 move.l  #MODE_NEWFILE,d2
  1509.                 DOS     Open
  1510.                 move.l  d0,my_FileHnd(a5)
  1511.                 ble     PrtSError
  1512.  
  1513.                 lea     my_DataBuf(a5),a3       ;1024 Bytes löschen
  1514.                 move.l  #255,d0
  1515. .0              clr.l   (a3)+
  1516.                 dbf     d0,.0
  1517.  
  1518. ;---------------------------------------------------------------------------
  1519. ;Der  Haupt-Chunk.   Hier  werden  alle  nötigen Daten zur Screen-Verwaltung
  1520. ;installiert.
  1521. ;---------------------------------------------------------------------------
  1522. CreateBMHD      lea     TxBMHD+8(pc),a3
  1523.                 lea     my_NewScrn(a5),a1
  1524.                 move.w  ns_Width(a1),ibm_Width(a3)
  1525.                 move.w  ns_Height(a1),ibm_Height(a3)
  1526.                 move.b  ns_Depth+1(a1),ibm_Planes(a3)
  1527.                 clr.b   ibm_Compression(a3)
  1528.                 move.b  #$A,ibm_xAspect(a3)
  1529.                 move.b  #$B,ibm_yAspect(a3)
  1530.                 move.w  ns_Width(a1),ibm_PageWidth(a3)
  1531.                 move.w  ns_Height(a1),ibm_PageHeight(a3)
  1532.  
  1533.                 lea     TxBODY(pc),a3
  1534.                 move.w  ns_Width(a1),d0
  1535.                 and.l   #$FFFF,d0
  1536.                 lsr.w   #3,d0                   ;Durch 8 teilen
  1537.                 mulu    ns_Height(a1),d0
  1538.                 mulu    ns_Depth(a1),d0
  1539.                 move.l  d0,4(a3)                ;BODY-Größe merken
  1540.  
  1541. ;---------------------------------------------------------------------------
  1542. ;Erstellung   des   IFF-ViewModes.    Von  vielen  Grafikprogrammen  einfach
  1543. ;vernachlässigt.   Man  kann  den ViewMode zwar über den BMHD ermitteln, bei
  1544. ;HAM-Grafiken aber würde es unweigerlich zu Schwierigkeiten führen.
  1545. ;---------------------------------------------------------------------------
  1546. CreateCAMG      lea     TxCAMG(pc),a3
  1547.                 movea.l my_ScrnPtr(a5),a4
  1548.                 lea     sc_ViewPort(a4),a0
  1549.                 move.w  vp_Modes(a0),10(a3)
  1550.  
  1551. ;Farbwerte ermitteln und als RGB Chunk-Daten eintragen.
  1552.  
  1553. CreateCMAP      lea     TxBMHD+8(pc),a3         ;ID_BMHD+Len überspringen
  1554.                 move.b  ibm_Planes(a3),d0       ;Anzahl der Planes
  1555.                 moveq.l #0,d1
  1556.                 bset    d0,d1
  1557.                 move.l  d1,d5                   ;Farbanzahl merken
  1558.                 mulu    #3,d1
  1559.                 moveq.l #0,d6
  1560.                 lea     my_DataBuf(a5),a3
  1561. .1              movea.l sc_ViewPort+vp_ColorMap(a4),a0
  1562.                 move.l  d6,d0
  1563.                 GFX     GetRGB4
  1564.                 move.l  d0,d1
  1565.                 bmi.s   .2
  1566.                 andi.w  #$F00,d0
  1567.                 lsr.w   #4,d0
  1568.                 move.b  d0,(a3)+                ;Rot
  1569.                 move.l  d1,d0
  1570.                 andi.b  #$F0,d1
  1571.                 move.b  d1,(a3)+                ;Grün
  1572.                 andi.b  #$F,d0
  1573.                 lsl.b   #4,d0
  1574.                 move.b  d0,(a3)+                ;Blau
  1575.                 addq.l  #1,d6
  1576.                 dbf     d5,.1
  1577. .2              lea     TxCMAP(pc),a3
  1578.                 btst    #0,d6                   ;Farbanzahl ungerade?
  1579.                 beq.s   .3                      ;Nein!
  1580.                 addq.l  #1,d6
  1581. .3              mulu    #3,d6
  1582.                 move.l  d6,4(a3)
  1583.  
  1584. ;---------------------------------------------------------------------------
  1585. ;Die  IFF-Head  Größe  wird ermittelt.  Dazu  werden nur  noch die variablen
  1586. ;Chunk-Größen von CMAP und BODY addiert.
  1587. ;---------------------------------------------------------------------------
  1588. CreateBODY      lea     TxFORM(pc),a3
  1589.                 move.l  #TxFormL,d7     ;Inklusive BODY+LEN (FORM+LEN)
  1590.                 add.l   TxCMAP+4(pc),d7
  1591.                 add.l   TxBODY+4(pc),d7
  1592.                 move.l  d7,d6
  1593.                 move.l  d6,4(a3)
  1594.  
  1595. ;Nun den IFF-Header speichern.
  1596.  
  1597. SaveHEAD        move.l  my_FileHnd(a5),d1
  1598.                 move.l  a3,d2
  1599.                 move.l  #TxFormL,d3
  1600.                 DOS     Write
  1601.  
  1602. SaveCMAP        move.l  my_FileHnd(a5),d1
  1603.                 lea     my_DataBuf(a5),a0
  1604.                 move.l  a0,d2
  1605.                 move.l  TxCMAP+4(pc),d3
  1606.                 LIB     Write
  1607.  
  1608. SaveBODY        move.l  my_FileHnd(a5),d1
  1609.                 lea     TxBODY(pc),a0
  1610.                 move.l  a0,d2
  1611.                 moveq.l #8,d3
  1612.                 LIB     Write
  1613.  
  1614. ;Hier werden die eigentlichen Grafikdaten im cmpNone Verfahren gespeichert.
  1615.  
  1616. MakeBODY        movea.l my_ScrnPtr(a5),a3
  1617.                 lea     sc_BitMap(a3),a3
  1618.                 move.w  bm_BytesPerRow(a3),d5
  1619.                 and.l   #$FFFF,d5
  1620.                 move.w  bm_Rows(a3),d6
  1621.                 moveq.l #0,d7
  1622. .1              moveq.l #bm_Planes,d4
  1623. .2              move.l  (a3,d4.l),d0
  1624.                 beq.s   .3
  1625.                 move.l  my_FileHnd(a5),d1
  1626.                 move.l  d0,d2
  1627.                 add.l   d7,d2
  1628.                 move.l  d5,d3
  1629.                 LIB     Write
  1630.                 addq.l  #4,d4
  1631.                 bra.s   .2
  1632. .3              add.l   d5,d7
  1633.                 subq.w  #1,d6
  1634.                 bne.s   .1
  1635.  
  1636. CloseIFF        move.l  my_FileHnd(a5),d1
  1637.                 clr.l   my_FileHnd(a5)
  1638.                 LIB     Close
  1639.  
  1640. EndSaveIFF      bra     PrtULine
  1641.  
  1642. ****************************************************************************
  1643. * Bild als Negativ darstellen - [F3]
  1644. ****************************************************************************
  1645.  
  1646. Negative        moveq.l #0,d5
  1647.                 moveq.l #0,d6
  1648.                 movea.l my_ScrnPtr(a5),a3
  1649.                 lea     sc_BitMap(a3),a3
  1650.                 move.w  bm_BytesPerRow(a3),d1
  1651.                 move.w  bm_Rows(a3),d2
  1652.  
  1653. .0              move.l  bm_Planes(a3),d0
  1654.                 beq.s   .2
  1655.                 movea.l d0,a0
  1656.                 move.l  d1,d0
  1657.                 mulu    d2,d0
  1658. .1              not.l   (a0)+
  1659.                 subq.l  #4,d0
  1660.                 bne.s   .1
  1661.                 adda.l  #4,a3
  1662.                 bra.s   .0
  1663.  
  1664. .2              WAIT    50
  1665.                 rts
  1666.  
  1667. ****************************************************************************
  1668. * Bild in aktuelles CLI-Window darstellen [Param:0|1] [F4|F5]
  1669. ****************************************************************************
  1670.  
  1671. CliDisplay      tst.b   my_FromCLI(a5)
  1672.                 beq     Ok
  1673.  
  1674. ;Die jeweiligen ScrnPtr bzw. BitMaps angeben
  1675.  
  1676.                 movea.l my_ScrnPtr(a5),a3
  1677.                 lea     sc_BitMap(a3),a3
  1678.                 movea.l my_CliScrn(a5),a4
  1679.                 lea     sc_BitMap(a4),a4
  1680.  
  1681.                 moveq.l #0,d6
  1682.                 moveq.l #0,d7
  1683.                 move.w  bm_BytesPerRow(a3),d6
  1684.                 mulu    bm_Rows(a3),d6
  1685.                 move.w  bm_BytesPerRow(a4),d7
  1686.                 mulu    bm_Rows(a4),d7
  1687.                 cmp.l   d6,d7
  1688.                 ble.s   .0
  1689.                 move.l  d6,d7
  1690.  
  1691. .0              bsr     CliMaxWind
  1692.                 move.w  bm_Rows(a3),d6
  1693.                 lsr.w   #3,d6
  1694.                 addq.w  #2,d6
  1695.                 cmpi.w  #31,d6
  1696.                 ble.s   .1
  1697.                 move.w  #31,d6
  1698. .1              move.w  d6,my_FmtData(a5)
  1699.                 bsr     PrtLLine
  1700.  
  1701. ;Die ScrnPlanes in die aktuellen CLI-ScrnPlanes kopieren
  1702.  
  1703. CopyCliPln      move.l  bm_Planes(a3),d0
  1704.                 beq.s   .1
  1705.                 move.l  bm_Planes(a4),d1
  1706.                 beq.s   .1
  1707.                 movea.l d0,a0
  1708.                 movea.l d1,a1
  1709.                 move.l  d7,d0
  1710.                 EXE     CopyMem
  1711.                 adda.l  #4,a3
  1712.                 adda.l  #4,a4
  1713.                 bra.s   CopyCliPln
  1714.  
  1715. .1              cmpi.b  #1,my_CliDisplay(a5)
  1716.                 beq.s   .2
  1717.  
  1718.                 cmpi.b  #2,my_CliDisplay(a5)
  1719.                 bne.s   .2
  1720.  
  1721.                 move.l  #COLOR_CLI,d3
  1722.                 bsr.s   Shade
  1723. .2              bra     WinClose
  1724.  
  1725. ****************************************************************************
  1726. * Farben in Rot/Grün/Blau/Grau/Def/OS1/OS2-Töne wandeln [F6-F10|N1|N2]
  1727. ****************************************************************************
  1728.  
  1729. Shade           cmpi.w  #COLOR_CLI,d3           ;CLI-Scrn Color
  1730.                 bne.s   .0
  1731.                 movea.l my_CliScrn(a5),a0
  1732.                 moveq.l #COLOR_DEF,d3
  1733.                 bra.s   .1
  1734.  
  1735. .0              movea.l my_ScrnPtr(a5),a0
  1736.  
  1737. .1              lea     sc_ViewPort(a0),a0
  1738.  
  1739. GetColTab       movea.l vp_ColorMap(a0),a1
  1740.                 movea.l cm_ColorTable(a1),a1
  1741.                 movea.l a1,a2
  1742.  
  1743.                 move.l  my_ColorCount(a5),d0
  1744.  
  1745.                 cmpi.w  #COLOR_DEF,d3           ;Default
  1746.                 beq.s   .1
  1747.                 cmpi.w  #COLOR_OS1,d3           ;OS.13
  1748.                 bne.s   .0
  1749.                 moveq   #4,d0
  1750.                 lea     Col13(pc),a1
  1751.                 bra.s   ColSet
  1752. .0              cmpi.w  #COLOR_OS2,d3           ;OS2.0
  1753.                 bne.s   ColClc
  1754.                 moveq   #4,d0
  1755.                 lea     Col20(pc),a1
  1756.                 bra.s   ColSet
  1757.  
  1758. .1              lea     my_DefPalette(a5),a1
  1759.                 bra.s   ColSet
  1760.  
  1761. ColClc          move.w  d0,d1
  1762.                 andi.l  #$FFF,d3
  1763. .1              moveq.l #0,d2
  1764.                 move.w  (a2),d2
  1765.                 cmpi.w  #COLOR_GRY,d3           ;Grey
  1766.                 bne.s   .2
  1767.                 divu    d3,d2
  1768.                 swap    d2
  1769.                 bra.s   .3
  1770. .2              and.w   d3,d2
  1771. .3              sub.w   d2,(a2)+
  1772.                 dbf     d1,.1
  1773.  
  1774. ColSet          GFX     LoadRGB4                ;Farbwerte aktualisieren
  1775.                 rts
  1776.  
  1777. Col13           dc.w    $05A,$FFF,$000,$F80
  1778. Col20           dc.w    $999,$000,$FFF,$68B
  1779.  
  1780. ****************************************************************************
  1781. * Bild in VPic BitMap - Format speichern [1-8]
  1782. ****************************************************************************
  1783.  
  1784. SaveVBM         moveq.l #0,d0
  1785.                 move.b  my_KeyCode(a5),d0
  1786.                 subq.b  #1,d0
  1787.                 lsl.w   #2,d0
  1788.                 movea.l my_ScrnPtr(a5),a0
  1789.                 lea     sc_BitMap(a0),a0
  1790.                 lea     bm_Planes(a0),a0
  1791.                 move.l  (a0,d0.l),d0            ;Plane[1-8] belegt
  1792.                 beq     Ok                      ;Nein! aber kein Fehler
  1793.  
  1794. ;Zu speichernde Bitmap-Addresse übergeben
  1795.  
  1796.                 move.l  d0,my_PlanPtr(a5)
  1797.  
  1798. ;Dateiname über ReqToolsFileRequest bestimmen
  1799.  
  1800.                 lea     TxRtSaveVBM(pc),a3
  1801.                 bsr     Rt_Input
  1802.                 tst.l   my_RtBut(a5)
  1803.                 beq     Ok
  1804.  
  1805. OpenVBM         move.l  my_FileName(a5),d1
  1806.                 move.l  #MODE_NEWFILE,d2
  1807.                 DOS     Open
  1808.                 move.l  d0,my_FileHnd(a5)
  1809.                 ble     PrtSError
  1810.  
  1811. ;Header einrichten & speichern
  1812.  
  1813.                 moveq.l #0,d0
  1814.                 lea     my_VbmHeader(a5),a3
  1815.                 move.l  #ID_VPIC,vbm_Code(a3)
  1816.                 move.l  #ID_VBMP,vbm_Bmap(a3)
  1817.                 movea.l my_ScrnPtr(a5),a4
  1818.                 lea     sc_ViewPort(a4),a0
  1819.                 move.w  vp_Modes(a0),vbm_ViewMode(a3)
  1820.                 lea     sc_BitMap(a4),a1
  1821.                 move.w  bm_BytesPerRow(a1),d0
  1822.                 lsl.w   #3,d0
  1823.                 move.w  d0,vbm_Width(a3)
  1824.                 move.w  bm_Rows(a1),vbm_Height(a3)
  1825.                 move.l  my_FileHnd(a5),d1
  1826.                 move.l  a3,d2
  1827.                 moveq   #vbm_SIZEOF,d3
  1828.                 LIB     Write
  1829.  
  1830. ;Plane [1-8] speichern
  1831.  
  1832.                 moveq.l #0,d0
  1833.                 moveq.l #0,d3
  1834.                 move.l  my_FileHnd(a5),d1
  1835.                 move.l  my_PlanPtr(a5),d2
  1836.                 move.w  vbm_Width(a3),d0
  1837.                 move.w  vbm_Height(a3),d3
  1838.                 lsr.w   #3,d0
  1839.                 mulu    d0,d3
  1840.                 LIB     Write
  1841.  
  1842. CloseVBM        move.l  my_FileHnd(a5),d1
  1843.                 clr.l   my_FileHnd(a5)
  1844.                 LIB     Close
  1845.  
  1846. EndVBM          bra     PrtULine
  1847.  
  1848. ****************************************************************************
  1849. * CLI-Window auf max. Größe & Rahmen löschen
  1850. ****************************************************************************
  1851.  
  1852. CliMaxWind      tst.b   my_FromCLI(a5)
  1853.                 beq     Ok
  1854.  
  1855.                 movem.l a0-a6/d0-d2,-(sp)
  1856.                 movea.l my_CliWind(a5),a0
  1857.                 move.b  #0,wd_BorderLeft(a0)
  1858.                 move.b  #0,wd_BorderTop(a0)
  1859.                 move.b  #0,wd_BorderRight(a0)
  1860.                 move.b  #0,wd_BorderBottom(a0)
  1861.                 moveq   #0,d0
  1862.                 moveq   #0,d1
  1863.                 moveq   #0,d2
  1864.                 move.w  wd_LeftEdge(a0),d2
  1865.                 sub.l   d2,d0
  1866.                 move.w  wd_TopEdge(a0),d2
  1867.                 sub.l   d2,d1
  1868.                 INT     MoveWindow
  1869.                 move.l  #$280,d0
  1870.                 move.l  #$100,d1
  1871.                 move.w  wd_Width(a0),d2
  1872.                 sub.l   d2,d0
  1873.                 move.w  wd_Height(a0),d2
  1874.                 sub.l   d2,d1
  1875.                 LIB     SizeWindow
  1876.                 WAIT    5
  1877.                 movea.l my_CliWind(a5),a0
  1878.                 movea.l wd_RPort(a0),a1
  1879.                 moveq   #0,d0
  1880.                 GFX     SetRast
  1881.                 WAIT    5
  1882.                 movem.l (sp)+,a0-a6/d0-d2
  1883.                 rts
  1884.  
  1885. ****************************************************************************
  1886. * Falls  Bildformat mit  einem  Datenpacker  ge'crunch't  ist,  mittels  der
  1887. * decrunch.library  entpacken.  Die  Bezeichnungen  der  DecrunchLib Offsets
  1888. * entsprechen mit hoher Wahrscheinlichkeit nicht den Originalen. Leider sind
  1889. * mir  die Include-Dateien dieser Library nicht bekannt, weshalb ich mir auf
  1890. * recht abenteuerlicher Weise (Reassemblierung einiger Objektdateien) Zugang
  1891. * zu  der Library verschaffen musste. Das Ergebnis hat sich aber gelohnt, da
  1892. * nun weit über 100! Packverfahren erkannt und entkomprimiert werden!
  1893. ****************************************************************************
  1894.  
  1895. PicDcr          movea.l my_FileBuf(a5),a0       ;Test ob evtl. das
  1896.                 cmpi.l  #'PP20',(a0)            ;PP-Data Format?
  1897.                 beq     PpDcr                   ;Ja! Eigene Decrunchroutine
  1898.                 cmpi.l  #'XPKF',(a0)            ;XPKF Format?
  1899.                 beq     XpkDcr                  ;Ja
  1900.                 move.l  my_DcrBase(a5),d0       ;DcrunchLib geöffnet?
  1901.                 bne.s   .1                      ;Ja!
  1902.                 lea     DcrLib(pc),a1           ;DecrunchLib öffnen
  1903.                 EXE     OpenLibrary
  1904.                 move.l  d0,my_DcrBase(a5)
  1905.                 beq.s   .5                      ;Hat nicht geklappt!
  1906. .1              DCR     dcrAllocTagItem         ;Info-Struktur einrichten
  1907.                 movea.l d0,a3
  1908.                 move.l  my_FileBuf(a5),dcr_PackedBuf(a3)
  1909.                 move.l  my_FileLen(a5),dcr_PackedLen(a3)
  1910.                 movea.l a3,a0
  1911.                 LIB     dcrInitTagItem
  1912.                 tst.l   d0
  1913.                 beq.s   .4                      ;Packverfahren unbekannt
  1914.                 bsr     PrtDcr
  1915.                 movea.l a3,a0
  1916.                 LIB     dcrDecrunch
  1917.                 tst.l   d0
  1918.                 beq.s   .4                      ;Entpackung unmöglich!
  1919. .2              movea.l my_FileBuf(a5),a1
  1920.                 move.l  my_FileLen(a5),d0
  1921.                 move.l  dcr_UnPackedBuf(a3),my_FileBuf(a5)
  1922.                 move.l  dcr_UnPackedLen(a3),my_FileLen(a5)
  1923.                 EXE     FreeMem                 ;Alten Buffer freigeben
  1924. .3              movea.l a3,a0
  1925.                 DCR     dcrFreeTagItem          ;Struct Info freigeben
  1926.                 bra     Ok                      ;Flag immer = Kein Fehler!
  1927. .4              bsr.s   .3
  1928. .5              bsr     PrtVError
  1929.                 bra     Error                   ;Fehler!
  1930.  
  1931. ;---------------------------------------------------------------------------
  1932. ;Falls  das  Bild im PP-Data Format vorliegt, wird diese Routine aufgerufen.
  1933. ;Da ich  fast ausschließlich mit dem PowerPacker 3.0b meine Daten packe, muß
  1934. ;nur im Sonderfall die decrunch.library geöffnet werden, somit braucht diese
  1935. ;nicht immer verfügbar sein (Platzersparnis).
  1936. ;
  1937. ;A0 <= Zeiger auf PP20 Daten
  1938. ;---------------------------------------------------------------------------
  1939. PpDcr           move.l  my_FileLen(a5),d0
  1940.                 move.l  -4(a0,d0.l),d0
  1941.                 lsr.l   #8,d0
  1942.                 moveq   #MEMF_PUBLIC,d1
  1943.                 move.l  d0,my_PackLen(a5)
  1944.                 EXE     AllocMem
  1945.                 move.l  d0,my_PackBuf(a5)
  1946.                 ble     Error
  1947. .1              bsr     PrtDcr
  1948.                 movea.l my_FileBuf(a5),a0
  1949.                 movea.l my_PackBuf(a5),a1
  1950.                 move.l  my_FileLen(a5),d0
  1951.                 bsr.s   PpStart
  1952.                 movea.l my_FileBuf(a5),a1
  1953.                 move.l  my_FileLen(a5),d0
  1954.                 move.l  my_PackBuf(a5),my_FileBuf(a5)
  1955.                 move.l  my_PackLen(a5),my_FileLen(a5)
  1956.                 LIB     FreeMem
  1957.                 bra     Ok
  1958. PpStart         lea     4(a0),a3
  1959.                 adda.l  d0,a0
  1960.                 movea.l a1,a2
  1961.                 moveq   #1,d5
  1962.                 moveq   #3,d6
  1963.                 moveq   #7,d7
  1964.                 move.l  -(a0),d1
  1965.                 tst.b   d1
  1966.                 beq.s   .1
  1967.                 bsr.s   Pp2
  1968.                 subq.b  #1,d1
  1969.                 lsr.l   d1,d5
  1970. .1              lsr.l   #8,d1
  1971.                 adda.l  d1,a2
  1972. Pp1             bsr.s   Pp2
  1973.                 bcs.s   Pp5
  1974.                 moveq   #0,d2
  1975. .1              moveq   #1,d0
  1976.                 bsr.s   Pp4
  1977.                 add.w   d1,d2
  1978.                 cmp.w   d6,d1
  1979.                 beq.s   .1
  1980. .2              moveq   #7,d0
  1981.                 bsr.s   Pp4
  1982.                 move.b  d1,-(a2)
  1983.                 dbra    d2,.2
  1984.                 cmpa.l  a2,a1
  1985.                 bcs.s   Pp5
  1986.                 rts
  1987. Pp2             lsr.l   #1,d5
  1988.                 beq.s   .1
  1989.                 rts
  1990. .1              move.l  -(a0),d5
  1991.                 roxr.l  #1,d5
  1992.                 rts
  1993. Pp3             subq.w  #1,d0
  1994. Pp4             moveq   #0,d1
  1995. .1              lsr.l   #1,d5
  1996.                 beq.s   .3
  1997. .2              roxl.l  #1,d1
  1998.                 dbra    d0,.1
  1999.                 rts
  2000. .3              move.l  -(a0),d5
  2001.                 roxr.l  #1,d5
  2002.                 bra.s   .2
  2003. Pp5             moveq   #1,d0
  2004.                 bsr.s   Pp4
  2005.                 moveq   #0,d0
  2006.                 move.b  (a3,d1.w),d0
  2007.                 move.w  d1,d2
  2008.                 cmp.w   d6,d2
  2009.                 bne.s   .3
  2010.                 bsr.s   Pp2
  2011.                 bcs.s   .1
  2012.                 moveq   #7,d0
  2013. .1              bsr.s   Pp3
  2014.                 move.w  d1,d3
  2015. .2              moveq   #2,d0
  2016.                 bsr.s   Pp4
  2017.                 add.w   d1,d2
  2018.                 cmp.w   d7,d1
  2019.                 beq.s   .2
  2020.                 bra.s   .4
  2021. .3              bsr.s   Pp3
  2022.                 move.w  d1,d3
  2023. .4              addq.w  #1,d2
  2024. .5              move.b  (a2,d3.w),-(a2)
  2025.                 dbra    d2,.5
  2026.                 cmpa.l  a2,a1
  2027.                 bcs.s   Pp1
  2028.                 rts
  2029.  
  2030. ;---------------------------------------------------------------------------
  2031. ;Da das Packprojekt der XPK-(Sub)Libraries weitreichend verwendet wird,  und
  2032. ;die  'decrunch.library'  leider dieses nicht unterstützt, habe ich folgende
  2033. ;XpkUnpack-Routine integriert.  Somit ist VPic kompatibler zu einer Vielzahl
  2034. ;an Packalgorithmen.
  2035. ;---------------------------------------------------------------------------
  2036. XpkDcr          move.l  my_XpkBase(a5),d0
  2037.                 bne.s   .0
  2038.                 lea     XpkLib(pc),a1
  2039.                 EXE     OpenLibrary
  2040.                 move.l  d0,my_XpkBase(a5)
  2041.                 beq     .2
  2042. .0              movea.l my_FileBuf(a5),a0
  2043.                 move.l  12(a0),d0
  2044.                 moveq   #MEMF_PUBLIC,d1
  2045.                 move.l  d0,my_PackLen(a5)
  2046.                 EXE     AllocMem
  2047.                 move.l  d0,my_PackBuf(a5)
  2048.                 ble.s   .2
  2049.                 bsr     PrtDcr
  2050.                 lea     XpkTagItem(pc),a0
  2051.                 move.l  my_FileBuf(a5),4(a0)
  2052.                 move.l  my_PackBuf(a5),12(a0)
  2053.                 move.l  my_FileLen(a5),20(a0)
  2054.                 move.l  my_PackLen(a5),28(a0)
  2055.                 addi.l  #XPK_MARGIN,28(a0)
  2056.                 XPK     XpkUnpack
  2057.                 tst.l   d0
  2058.                 bne.s   .1
  2059.                 movea.l my_FileBuf(a5),a1
  2060.                 move.l  my_FileLen(a5),d0
  2061.                 move.l  my_PackBuf(a5),my_FileBuf(a5)
  2062.                 move.l  my_PackLen(a5),my_FileLen(a5)
  2063.                 EXE     FreeMem
  2064.                 bra     Ok
  2065. .1              movea.l my_PackBuf(a5),a1
  2066.                 move.l  my_PackLen(a5),d0
  2067.                 EXE     FreeMem
  2068. .2              bsr.s   PrtVError
  2069.                 bra     Error                   ;Fehler!
  2070.  
  2071. XpkTagItem      dc.l    XPK_InBuf,0             ;SAdr
  2072.                 dc.l    XPK_OutBuf,0            ;DAdr
  2073.                 dc.l    XPK_InLen,0             ;SLen
  2074.                 dc.l    XPK_OutBufLen,0         ;DLen
  2075.                 dc.l    XPK_Password,0          ;Password
  2076.                 dc.l    XPK_GetError,0          ;Errorstring
  2077.                 dc.l    XPK_PassThru,-1         ;Packed data
  2078.                 dc.l    XPK_ShortError          ;Only error
  2079.                 dc.l    TAG_DONE                ;TagItemEnd
  2080.  
  2081. ****************************************************************************
  2082. * Allgemeine Request-/Textausgabe
  2083. ****************************************************************************
  2084.  
  2085. PrtVError       lea     TxRtVError(pc),a0
  2086.                 bra.s   Rt_Error
  2087.  
  2088. PrtSError       lea     TxRtSError(pc),a0
  2089.  
  2090. Rt_Error        lea     my_FmtData(a5),a1
  2091.                 move.l  my_FileName(a5),(a1)
  2092.                 bsr     Rt_Fmt
  2093.                 lea     my_DataBuf(a5),a4
  2094.                 move.l  a0,8(a4)
  2095.                 lea     TxRtError(pc),a0
  2096.                 move.l  a0,(a4)
  2097.                 lea     TxRtOK(pc),a0
  2098.                 move.l  a0,4(a4)
  2099.                 bsr     Rt_Request
  2100.                 bra.s   PrtCLine
  2101.  
  2102. PrtDcr          bsr.s   PrtCLine
  2103.                 lea     my_FmtData(a5),a0
  2104.                 move.l  my_FileName(a5),(a0)
  2105.                 lea     TxDecr(pc),a0
  2106.                 bra.s   Fmt
  2107.  
  2108. PrtView         bsr.s   PrtCLine
  2109.                 lea     my_FmtData(a5),a0
  2110.                 move.l  my_FileName(a5),(a0)
  2111.                 lea     TxView(pc),a0
  2112.                 bra.s   Fmt
  2113.  
  2114. PrtLLine        lea     TxLLine(pc),a0
  2115.                 bra.s   Fmt
  2116.  
  2117. PrtULine        lea     TxUFeed(pc),a2
  2118.                 bsr.s   Prt
  2119.  
  2120. PrtCLine        lea     TxCFeed(pc),a2
  2121.  
  2122. Prt             tst.b   my_FromCLI(a5)          ;Nur von CLI/Shell aus
  2123.                 beq     Ok
  2124.                 movem.l a0-a6/d0-d7,-(sp)
  2125.                 move.l  my_OutPut(a5),d1
  2126.                 move.l  a2,d2
  2127. .0              tst.b   (a2)+
  2128.                 bne.s   .0
  2129.                 move.l  a2,d3
  2130.                 sub.l   d2,d3
  2131.                 DOS     Write
  2132.                 movem.l (sp)+,a0-a6/d0-d7
  2133.                 rts
  2134.  
  2135. Fmt             tst.b   my_FromCLI(a5)
  2136.                 beq     Ok
  2137.                 movem.l a0-a6/d0-d7,-(sp)
  2138.                 lea     my_FmtData(a5),a1
  2139.                 lea     .0(pc),a2
  2140.                 lea     my_FmtChData(a5),a3
  2141.                 EXE     RawDoFmt
  2142.                 lea     my_FmtChData(a5),a2
  2143.                 bsr.s   Prt
  2144.                 movem.l (sp)+,a0-a6/d0-d7
  2145.                 rts
  2146. .0              move.b  d0,(a3)+
  2147.                 rts
  2148.  
  2149. Rt_Fmt          movem.l a1-a6/d0-d7,-(sp)
  2150.                 lea     my_FmtData(a5),a1
  2151.                 lea     .0(pc),a2
  2152.                 lea     my_FmtChData(a5),a3
  2153.                 EXE     RawDoFmt
  2154.                 lea     my_FmtChData(a5),a0
  2155.                 movem.l (sp)+,a1-a6/d0-d7
  2156.                 rts
  2157. .0              move.b  d0,(a3)+
  2158.                 rts
  2159.  
  2160. ****************************************************************************
  2161. * Das  DirEntryCount-Verfahren soll eine Erleichterung für eine vereinfachte
  2162. * Parameterübergabe darstellen. Die Idee basiert darauf das die Eintragungen
  2163. * eines Pfades immer gleich über die DOS Funktion Examine ausgelesen werden.
  2164. * Dieses macht sich das DirEntryCount-Verfahren  zu nutze indem  einfach die
  2165. * Kennung  #  gefolgt  von  der  Nummer des  Eintrages als Ersatz für  einen
  2166. * Dateinamen übergeben werden kann, über diese Angabe wird der zu der Nummer
  2167. * gehörende Dateiname ermittelt und eingesetzt.
  2168. ****************************************************************************
  2169.  
  2170. ;Beispiel: VPic DF3:Pics/#7
  2171. ;Ergebnis: VPic DF3:Pics/Name der zu zeigenden Grafik
  2172.  
  2173. dec_init        movem.l a0-a6/d0-d7,-(sp)
  2174.  
  2175.                 movea.l my_FileName(a5),a0      ;A0 = #DirEntryCount
  2176.                 lea     my_CountFib(a5),a1      ;A1 = Buffer[260]
  2177.  
  2178.                 movea.l a0,a3
  2179.                 movea.l a1,a4
  2180.  
  2181. dec_searchid    cmpi.b  #'#',(a0)               ;ID_DirEntryCount (#)
  2182.                 beq.s   dec_foundid
  2183.                 tst.b   (a0)+
  2184.                 bne.s   dec_searchid
  2185.                 bra.s   dec_end
  2186.  
  2187. dec_foundid     movea.l a0,a2                   ;A2 = # Position für Fehler
  2188.  
  2189.                 clr.b   (a0)+                   ;Für DosLock
  2190.  
  2191.                 moveq   #0,d0                   ;Ziffer
  2192.                 moveq   #0,d7                   ;DirEntryCount
  2193.  
  2194. dec_convcount   move.b  (a0)+,d0                ;String in Count.w Zahl
  2195.                 subi.b  #'0',d0
  2196.                 bmi.s   dec_lock
  2197.                 mulu    #10,d7
  2198.                 ext.w   d0
  2199.                 add.w   d0,d7
  2200.                 bra.s   dec_convcount
  2201.  
  2202. dec_lock        move.l  a3,d1                   ;Pfad ohne DirEntryCount
  2203.                 moveq.l #ACCESS_READ,d2
  2204.                 DOS     Lock
  2205.                 move.l  d0,d6
  2206.                 ble.s   dec_error
  2207.  
  2208.                 move.l  d6,d1                   ;Lock
  2209.                 move.l  a4,d2                   ;FileInfoBlock
  2210.                 LIB     Examine
  2211.                 tst.l   d0
  2212.                 beq.s   dec_error
  2213.  
  2214. dec_excount     move.l  d6,d1                   ;Lock
  2215.                 move.l  a4,d2                   ;FileInfoBlock
  2216.                 LIB     ExNext
  2217.                 tst.l   d0
  2218.                 beq.s   dec_error
  2219.                 subq.w  #1,d7
  2220.                 bgt.s   dec_excount             ;Bis DirEntryCount
  2221.  
  2222.                 lea     fib_FileName(a4),a0
  2223.                 lea     fib_EntryType(a4),a1
  2224. dec_movename    move.b  (a0)+,(a1)+
  2225.                 bne.s   dec_movename
  2226.  
  2227.                 movea.l a4,a1                   ;FileInfoBlock
  2228. dec_path        move.b  (a3)+,(a1)+             ;Pfad installieren
  2229.                 bne.s   dec_path
  2230.                 subq.l  #1,a1
  2231.  
  2232.                 lea     fib_EntryType(a4),a0    ;Zwischenpuffer für Datei
  2233. dec_name        move.b  (a0)+,(a1)+             ;Datei installieren
  2234.                 bne.s   dec_name
  2235.  
  2236.                 move.l  a4,my_FileName(a5)      ;Init. Pfad+Datei
  2237.  
  2238. dec_unlock      move.l  d6,d1
  2239.                 ble.s   dec_end
  2240.                 DOS     UnLock
  2241.  
  2242. dec_end         movem.l (sp)+,a0-a6/d0-d7
  2243.                 rts
  2244.  
  2245. dec_error       move.b  #'#',(a2)               ;ID_DirEntryCount
  2246.                 move.l  a2,my_FileName(a5)      ;Angabe zurücksetzen
  2247.                 bra.s   dec_unlock
  2248.  
  2249. ****************************************************************************
  2250. * Fehler/Ok-Flags, Tastatur-Code, Warten
  2251. ****************************************************************************
  2252.  
  2253. Error           moveq   #-1,d0                  ;Fehler!
  2254.                 rts
  2255.  
  2256. Ok              moveq   #0,d0                   ;Alles geklappt!
  2257.                 rts
  2258.  
  2259. CKey            moveq.l #0,d1
  2260.                 btst    #6,$BFE001
  2261.                 bne.s   .0
  2262.                 move.b  #$FF,my_KeyCode(a5)
  2263.                 rts
  2264. .0              move.b  $BFEC01,d1
  2265.                 eori.w  #$FF,d1
  2266.                 ror.b   #1,d1
  2267.                 move.b  d1,my_KeyCode(a5)
  2268.                 cmpi.b  #RAW_ESC,d1             ;Globaler ESC-Test
  2269.                 rts
  2270.  
  2271. Wait            movem.l a6/d0,-(sp)             ;D1 = Wartezyklen 1/50
  2272.                 DOS     Delay
  2273.                 movem.l (sp)+,a6/d0
  2274.                 rts
  2275.  
  2276. ****************************************************************************
  2277. * Usage & Keylist
  2278. ****************************************************************************
  2279.  
  2280. Rt_Usage        lea     my_DataBuf(a5),a4
  2281.                 lea     TxRtUsage(pc),a0
  2282.                 move.l  a0,(a4)
  2283.                 lea     TxRtOKKEYS(pc),a0
  2284.                 move.l  a0,4(a4)
  2285.                 lea     TxUsage(pc),a0
  2286.                 move.l  a0,8(a4)
  2287.                 bsr.s   Rt_Request
  2288.                 tst.l   my_RtBut(a5)
  2289.                 beq.s   Ok
  2290. .0              lea     my_DataBuf(a5),a4
  2291.                 lea     TxRtKeys(pc),a0
  2292.                 move.l  a0,(a4)
  2293.                 lea     TxRtOKUSAGE(pc),a0
  2294.                 move.l  a0,4(a4)
  2295.                 lea     TxKeyList(pc),a0
  2296.                 move.l  a0,8(a4)
  2297.                 bsr.s   Rt_Request
  2298.                 tst.l   my_RtBut(a5)
  2299.                 bne.s   Rt_Usage
  2300.                 bra     Ok
  2301.  
  2302. ****************************************************************************
  2303. * ReqTools Request / Filerequest
  2304. ****************************************************************************
  2305.  
  2306. ;In =   0(a4)           - Fenstertitel
  2307. ;       4(a4)           - Schalterbezeichnung(en)
  2308. ;       8(a4)           - Textzeilen
  2309. ;Out =  my_RtBut(a5)    - Schalternummer
  2310.  
  2311. Rt_Request      clr.l   my_RtBut(a5)
  2312.                 bsr     Rt_OpenLib
  2313.                 bne     Error
  2314.                 suba.l  a0,a0
  2315.                 REQ     rtAllocRequestA
  2316.                 tst.l   d0
  2317.                 ble     Error
  2318.                 move.l  d0,my_RtInfoReq(a5)
  2319.                 movea.l d0,a3
  2320.                 move.l  #1,(a3)
  2321.                 move.w  #0,4(a3)
  2322.                 move.w  #0,6(a3)
  2323.                 move.l  (a4),12(a3)             ;Fenstertitel
  2324.                 move.l  #0,16(a3)
  2325.                 suba.l  a0,a0
  2326.                 movea.l 8(a4),a1                ;Textzeilen
  2327.                 movea.l 4(a4),a2                ;Schalterbezeichnung(en)
  2328.                 suba.l  a4,a4
  2329.                 LIB     rtEZRequestA
  2330.                 move.l  d0,my_RtBut(a5)         ;Schalternummer
  2331.                 movea.l my_RtInfoReq(a5),a1
  2332.                 LAB     rtFreeRequest
  2333.  
  2334. Rt_Input        clr.l   my_RtBut(a5)
  2335.                 bsr     Rt_OpenLib
  2336.                 bne     Ok
  2337.  
  2338. Rt_FileReq      tst.l   my_RtFileReq(a5)
  2339.                 bne.s   .0
  2340.                 suba.l  a0,a0
  2341.                 moveq.l #0,d0
  2342.                 REQ     rtAllocRequestA
  2343.                 tst.l   d0
  2344.                 ble     Error
  2345.                 move.l  d0,my_RtFileReq(a5)
  2346. .0              suba.l  a0,a0
  2347.                 movea.l my_RtFileReq(a5),a1
  2348.                 move.l  #1,(a1)
  2349.                 move.w  #0,4(a1)
  2350.                 move.w  #0,6(a1)
  2351.                 move.l  #0,8(a1)
  2352.                 lea     my_DataBuf(a5),a2
  2353.                 REQ     rtFileRequestA
  2354.                 move.l  d0,my_RtBut(a5)
  2355.                 beq     Ok
  2356.                 lea     my_InputBuf(a5),a0
  2357.                 move.l  a0,my_FileName(a5)
  2358.                 move.l  my_RtFileReq(a5),a1
  2359.                 lea     my_DataBuf(a5),a2
  2360.                 movea.l 16(a1),a1
  2361. .1              move.b  (a1)+,(a0)+
  2362.                 bne.s   .1
  2363.                 suba.l  #1,a0
  2364.                 cmpi.b  #':',-1(a0)
  2365.                 beq.s   .2
  2366.                 move.b  #'/',(a0)+
  2367. .2              move.b  (a2)+,(a0)+
  2368.                 bne.s   .2
  2369.                 bra     Ok
  2370.  
  2371. Rt_OpenLib      move.l  my_ReqBase(a5),d0
  2372.                 bne.s   .0
  2373.                 lea     ReqLib(pc),a1
  2374.                 EXE     OpenLibrary
  2375.                 move.l  d0,my_ReqBase(a5)
  2376.                 ble.s   .1
  2377. .0              bra     Ok
  2378. .1              lea     .2(pc),a2
  2379.                 bsr     Prt
  2380.                 bra     Error
  2381. .2              dc.b    $A,$B,$9B,"33mError",$9B,"0m: Need reqtools.library!",10,0
  2382.  
  2383. ****************************************************************************
  2384. * Datenbereich
  2385. ****************************************************************************
  2386.  
  2387. TxUsage         dc.b    'Usage: VPic [file|list|path|#DEC] [0|1] [*|?]',10,10
  2388.                 dc.b    ' file - View a single picture',10
  2389.                 dc.b    ' list - View pics defined in a list',10
  2390.                 dc.b    ' path - View all pics avail in path',10
  2391.                 dc.b    ' #DEC - View pic named by DirEntryCount',10,10
  2392.                 dc.b    ' [0]  - View picture in actual CLI-Wind',10
  2393.                 dc.b    ' [1]  - View pic and set color in CLI-Wind',10,10
  2394.                 dc.b    ' [*]  - View next actual screen',10,10
  2395.                 dc.b    'VPic V2.00 FD © 2002 by Peace of Testaware',0
  2396.                 even
  2397. TxKeyList       dc.b    '[F1] ............ Info of pic  [N1] ........Set OS1.3 color',10
  2398.                 dc.b    '[F2] ............ Save as IFF  [N2] ........Set OS2.0 color',10
  2399.                 dc.b    '[F3] ........... Negative pic  [1-8] .......... Save as VBM',10
  2400.                 dc.b    '[F4] ........ Pic to CLI-Wind  [HELP] ... Usage and keylist',10
  2401.                 dc.b    '[F5] .. Pic/color to CLI-Wind  [RETURN] .. View next screen',10
  2402.                 dc.b    '[F6] .............. Red shade  [RALT] ........ Multitasking',10
  2403.                 dc.b    '[F7] ............ Green shade  [LALT] ... Stop multitasking',10
  2404.                 dc.b    '[F8] ............. Blue shade  [SPACE] .......... Close pic',10
  2405.                 dc.b    '[F9] ............. Grey shade  [LMB] ............ Close pic',10
  2406.                 dc.b    '[F10] ......... Default color  [ESC] ............ Abort all',0
  2407.                 even
  2408.  
  2409. TxRtLoadPIC     dc.b    'Load a picture',0
  2410. TxRtSaveIFF     dc.b    'Save as IFF',0
  2411. TxRtSaveVBM     dc.b    'Save as VBM',0
  2412. TxRtPicInfo     dc.b    'Info of picture',0
  2413. TxRtColorTab    dc.b    'Colortable [$RGB]',0
  2414. TxRtUsage       dc.b    'Usage of VPic',0
  2415. TxRtKeys        dc.b    'Keylist of VPic',0
  2416. TxRtError       dc.b    'Error',0
  2417. TxRtVError      dc.b    'Can`t view %s',0
  2418. TxRtSError      dc.b    'Can`t save %s',0
  2419. TxRtOK          dc.b    ' Ok ',0
  2420. TxRtOKKEYS      dc.b    'Keys| Ok ',0
  2421. TxRtOKCOLS      dc.b    'Colors| Ok ',0
  2422. TxRtOKINFO      dc.b    'Info| Ok ',0
  2423. TxRtOKUSAGE     dc.b    'Usage| Ok ',0
  2424.                 even
  2425.  
  2426. TxFORM          dc.b    'FORM'
  2427.                 dc.l    0
  2428. TxILBM          dc.b    'ILBM'
  2429. TxBMHD          dc.b    'BMHD'
  2430.                 dc.l    ibm_SIZEOF
  2431.                 ds.b    ibm_SIZEOF
  2432. TxANNO          dc.b    'ANNO'
  2433.                 dc.l    34
  2434.                 dc.b    'VPic Release 2.00 © by Testaware',0,0
  2435. TxCAMG          dc.b    'CAMG'
  2436.                 dc.l    4
  2437.                 dc.l    0
  2438. TxCMAP          dc.b    'CMAP'
  2439.                 dc.l    0
  2440. TxFormL         equ     *-TxFORM
  2441. TxBODY          dc.b    'BODY'
  2442.                 dc.l    0
  2443.  
  2444. TxInfo          dc.b    'Name  :%s',10
  2445.                 dc.b    'Width :%d',10
  2446.                 dc.b    'Height:%d',10
  2447.                 dc.b    'Depth :%d',10
  2448.                 dc.b    'Colors:%ld',10
  2449.                 dc.b    'Mode  :$%x',10
  2450.                 dc.b    'Typ   :%s',10
  2451.                 dc.b    'Size  :%ld'
  2452. TxCopy          dc.b    10
  2453.                 dc.b    '(c)   :%s'
  2454. TxAuth          dc.b    10
  2455.                 dc.b    'Auth  :%s'
  2456. TxAnno          dc.b    10
  2457.                 dc.b    'Anno  :%s',0
  2458.                 even
  2459.  
  2460. TxColMap        dc.b    'C%02d:$%03x ',0
  2461.                 even
  2462.  
  2463. TxTyp           dc.b    'IFF Raw BitMap ',0
  2464.                 dc.b    'IFF Compressed ',0
  2465.                 dc.b    'IFF ACBM BitMap',0
  2466.                 dc.b    'AMOS DataPack  ',0
  2467.                 dc.b    'AMOS ScreenPack',0
  2468.                 dc.b    'VPic BitMap    ',0
  2469.                 dc.b    'WorkBench Info ',0
  2470.                 dc.b    'Actual Screen  ',0
  2471.  
  2472. TxView          dc.b    $9B,'33mView',$9B,'0m: %s',0
  2473. TxDecr          dc.b    $9B,'33mDecrunch',$9B,'0m: %s',0
  2474. TxUFeed         dc.b    $B,0
  2475. TxCFeed         dc.b    $9B,$4D,$A,$B,0
  2476. TxLLine         dc.b    $C,$9B,'32',$74,$9B,'%d',$48,0
  2477.                 even
  2478.  
  2479. DosLib          DOSNAME
  2480. IntLib          INTNAME
  2481. GfxLib          GRAFNAME
  2482. XpkLib          XPKNAME
  2483. DcrLib          DCRNAME
  2484. ReqLib          dc.b    'reqtools.library',0
  2485.                 even
  2486.  
  2487.                 END
RAW Paste Data