Testaware

Amiga - BootTwister

Aug 15th, 2018
190
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ***********************************************************************
  2. * BootTwister (BT) V1.00 ® 21-10-1998 / 14:31:58
  3. * BootTwister (BT) V2.00 ® 26-02-2002 / 01:10:11
  4. * ---------------------------------------------------------------------
  5. * Programmiert von Peace / Testaware
  6. * ---------------------------------------------------------------------
  7. * Assembler: GenAm Macro Assembler V2.11D Copyright © HiSoft 1985,8
  8. * Editor: CygnusEd Professional Release 2 © 1989 by CygnusSoft Software
  9. ***********************************************************************
  10.  
  11.  
  12.                 opt     o+,ow-
  13.  
  14.                 Output  RAM:BT
  15.  
  16.  
  17. ***********************************************************************
  18. ;Library Offsets
  19.  
  20. _LVOOpen                equ     -30
  21. _LVOClose               equ     -36
  22. _LVORead                equ     -42
  23. _LVOWrite               equ     -48
  24. _LVOOutput              equ     -60
  25. _LVOClearPointer        equ     -60
  26. _LVOCloseScreen         equ     -66
  27. _LVOCloseWindow         equ     -72
  28. _LVOLock                equ     -84
  29. _LVOUnLock              equ     -90
  30. _LVOFindResident        equ     -96
  31. _LVOExamine             equ     -102
  32. _LVODeviceProc          equ     -174
  33. _LVOAllocMem            equ     -198
  34. _LVOOpenScreen          equ     -198
  35. _LVOOpenWindow          equ     -204
  36. _LVOFreeMem             equ     -210
  37. _LVOScreenToBack        equ     -246
  38. _LVOSetPointer          equ     -270
  39. _LVOWaitTOF             equ     -270
  40. _LVOSetRGB4             equ     -288
  41. _LVOFindTask            equ     -294
  42. _LVOPutMsg              equ     -366
  43. _LVOGetMsg              equ     -372
  44. _LVOWaitPort            equ     -384
  45. _LVOOpenLibrary         equ     -552
  46. _LVOCloseLibrary        equ     -414
  47. _LVOOpenDevice          equ     -444
  48. _LVOCloseDevice         equ     -450
  49. _LVODoIO                equ     -456
  50. _LVORawDoFmt            equ     -522
  51. _LVOCopyMem             equ     -624
  52.  
  53.  
  54. ***********************************************************************
  55. ;Struktur Offsets
  56.  
  57. ns_Width                equ     $4
  58. ns_Height               equ     $6
  59. ns_Depth                equ     $8
  60. ns_ViewModes            equ     $C
  61. ns_Type                 equ     $E
  62. ns_SIZEOF               equ     $20
  63. sc_BitMap               equ     $B8
  64. sc_ViewPort             equ     $2C
  65. bm_BytesPerRow          equ     $0
  66. bm_Rows                 equ     $2
  67. bm_Depth                equ     $5
  68. bm_Planes               equ     $8
  69. nw_Width                equ     $4
  70. nw_Height               equ     $6
  71. nw_Flags                equ     $E
  72. nw_Screen               equ     $1E
  73. nw_Type                 equ     $2E
  74. nw_SIZE                 equ     $30
  75. fib_Size                equ     124
  76. io_Command              equ     28
  77. io_Error                equ     31
  78. io_Actual               equ     32
  79. io_Length               equ     36
  80. io_Data                 equ     40
  81. io_Offset               equ     44
  82.  
  83.  
  84. ***********************************************************************
  85. ;Allgemeine Konstanten
  86.  
  87. CMD_READ                equ     2
  88. CMD_WRITE               equ     3
  89. CMD_UPDATE              equ     4
  90. TD_MOTOR                equ     9
  91. TD_SEEK                 equ     10
  92. TD_CHANGESTATE          equ     14
  93. TD_PROSTATUS            equ     15
  94. V_HIRES                 equ     $8000
  95. V_LACE                  equ     $4
  96. V_HAM                   equ     $800
  97. CUSTOMSCREEN            equ     $F
  98. SCREENQUIET             equ     $100
  99. ACTIVATE                equ     $1000
  100. MODE_OLDFILE            equ     1005
  101. ACCESS_READ             equ     -2
  102.  
  103.  
  104. ***********************************************************************
  105. ;Datenstruktur
  106.  
  107.                 RsReset
  108. MY_Base         rs.b    0
  109. my_DosBase      rs.l    1
  110. my_ParamStr     rs.l    1
  111. my_ParamLen     rs.l    1
  112. my_PicName      rs.l    1
  113. my_ModName      rs.l    1
  114. my_PicLen       rs.l    1
  115. my_ModLen       rs.l    1
  116. my_BitNum       rs.l    1
  117. my_Lock         rs.l    1
  118. my_Fib          rs.b    260
  119. my_Handle       rs.l    1
  120. my_TrkBuf       rs.l    1
  121. my_TrkLen       rs.l    1
  122. my_TrkOfs       rs.l    1
  123. my_OldBoot      rs.l    1
  124. my_DiskReply    rs.l    8
  125. my_StdIOReq     rs.b    52
  126. my_WorkBuffer   rs.b    1024
  127. my_FmtBuffer    rs.b    1024
  128. my_BusyBuffer   rs.b    1024
  129. my_TrkBuffer    rs.b    5632
  130. my_Error        rs.l    1
  131. my_SIZEOF       rs.w    0
  132.  
  133. ;BT BootBlock-Offsets
  134.  
  135.                 RsReset
  136. bt_BBMark       rs.l    1       ;DOS0
  137. bt_BBCKSum      rs.l    1       ;Cheksum
  138. bt_BBRoot       rs.l    1       ;RootBlk
  139. bt_BBnop1       rs.l    1       ;Not used
  140. bt_BBOffset     rs.l    1       ;CMD_READ Offset
  141. bt_BBPicLen     rs.l    1
  142. bt_BBModLen     rs.l    1
  143. bt_BBBlkLen     rs.l    1       ;Gesamte Anz. Bytes
  144. bt_BBExecBB     rs.l    1       ;Boot ausführen?
  145. bt_BBID         rs.l    1       ;BT98 Marker
  146.  
  147.  
  148. ***********************************************************************
  149. ;Macros definieren
  150.  
  151. EXE             MACRO
  152.                 movea.l 4.w,a6
  153.                 jsr     _LVO\1(a6)
  154.                 ENDM
  155.  
  156. DOS             MACRO
  157.                 movea.l my_DosBase(a5),a6
  158.                 jsr     _LVO\1(a6)
  159.                 ENDM
  160.  
  161. LIB             MACRO
  162.                 jsr     _LVO\1(a6)
  163.                 ENDM
  164.  
  165. LAB             MACRO
  166.                 jmp     _LVO\1(a6)
  167.                 ENDM
  168.  
  169. VER             MACRO
  170.                 dc.b    ' V2.00 '
  171.                 ENDM
  172.  
  173.                 bra.s   BT_Start
  174.                 cnop    0,4
  175.                 dc.b    'BootTwister'
  176.                 VER
  177.                 dc.b    '© Volker Stepprath, Testaware (27.02.2002)'
  178.                 cnop    0,4
  179.  
  180.  
  181. *****************************************************************
  182. ************* Installations-Program für BootTwister *************
  183. *****************************************************************
  184.  
  185. BT_Start        clr.b   -1(a0,d0.l)
  186.                 move.l  a0,d6
  187.                 move.l  d0,d7
  188.                 move.l  #my_SIZEOF,d0
  189.                 move.l  #$10003,d1
  190.                 EXE     AllocMem
  191.                 tst.l   d0
  192.                 beq     BT_Exit
  193.                 movea.l d0,a5
  194.                 move.l  d6,my_ParamStr(a5)
  195.                 move.l  d7,my_ParamLen(a5)
  196.  
  197.                 lea     bb_DosLib(pc),a1        ;dos.library öffnen
  198.                 moveq   #0,d0
  199.                 LIB     OpenLibrary
  200.                 move.l  d0,my_DosBase(a5)
  201.                 beq     BT_Finish
  202.  
  203.  
  204. * -------------------------------------------------------------
  205. * Parametertest nach DFn: & Param -? sowie TrkDev bereitstellen
  206. * -------------------------------------------------------------
  207. *
  208. BT_PCheck       movea.l my_ParamStr(a5),a0
  209.                 move.l  my_ParamLen(a5),d0
  210.                 cmpi.b  #':',3(a0)              ;Test nach DFn:
  211.                 bne.s   .2                      ;Fehler
  212.                 cmpi.b  #'-',5(a0)              ;Test nach -?
  213.                 bne.s   .2                      ;Fehler
  214.                 move.b  2(a0),d4                ;LW Nummer
  215.                 lea     TxDrive(pc),a0
  216.                 move.b  d4,2(a0)                ;DFn: übergeben
  217.                 subi.b  #'0',d4
  218.  
  219.                 bsr     PrtBThead               ;Kopfzeile ausgeben
  220.  
  221.                 suba.l  a1,a1                   ;TrkDisk.Dev bereitstellen
  222.                 LIB     FindTask
  223.                 lea     my_DiskReply(a5),a2
  224.                 move.l  d0,16(a2)
  225.                 lea     my_StdIOReq(a5),a1
  226.                 move.l  a2,14(a1)
  227.                 moveq   #0,d1
  228.                 move.l  d4,d0
  229.                 lea     bb_TrkDev(pc),a0
  230.                 LIB     OpenDevice
  231.                 tst.l   d0                      ;Alles geklappt
  232.                 bne.s   .1                      ;Nein! Fehler
  233.                 bsr.s   BT_Options              ;Parameter ausführen
  234.                 bra.s   .3                      ;Programm beenden
  235. .1              bsr     PrtDeverr               ;Fehler aufgetreten
  236.                 bra.s   .3
  237. .2              bsr     PrtUsage                ;Benutzerhinweis
  238. .3              bra     BT_Finish               ;Programm beenden
  239.  
  240.  
  241. * ------------------------------------
  242. * Auswertung der übergebenen Parameter
  243. * ------------------------------------
  244. *
  245. BT_Options      move.b  #'R',d0                 ;Opt -[R]emove
  246.                 bsr     BT_GetOpt               ;Suchen
  247.                 tst.b   my_Error(a5)            ;Übergeben?
  248.                 bne.s   .1                      ;Nein!
  249.                 bsr     BT_Remove               ;Ja, dann BT entfernen
  250.                 bra     BT_ExitKey
  251.  
  252. .1              move.b  #'E',d0                 ;Opt -[E]xecute
  253.                 bsr     BT_GetOpt               ;Suchen
  254.                 tst.b   my_Error(a5)            ;übergeben?
  255.                 bne.s   .2                      ;Nein
  256.                 move.l  #1024,my_OldBoot(a5)    ;Flag & Größe setzen
  257.                 lea     bb_ExecBB(pc),a0
  258.                 not.l   (a0)                    ;Flag für BB
  259.                 bra.s   BT_Parameter
  260.  
  261. .2              move.b  #'C',d0                 ;Opt -[C]heck
  262.                 bsr     BT_GetOpt               ;Suchen
  263.                 tst.b   my_Error(a5)            ;Übergeben?
  264.                 bne.s   .3                      ;Nein
  265.                 bsr     BT_Check                ;Ja, dann Disk testen
  266.                 bra     BT_ExitKey
  267.  
  268. .3              move.b  #'I',d0                 ;Opt -[I]nfo
  269.                 bsr     BT_GetOpt
  270.                 tst.b   my_Error(a5)
  271.                 bne.s   .4
  272.                 bsr     BT_Info                 ;Ja, dann BT BB Info
  273.                 bra     BT_ExitKey
  274.  
  275. .4              move.b  #'S',d0                 ;Opt -[S]wap
  276.                 bsr     BT_GetOpt
  277.                 tst.b   my_Error(a5)
  278.                 bne.s   .5
  279.                 bsr     BT_Swap                 ;Ja, dann Swap Exec BB Flag
  280.                 bra     BT_ExitKey
  281.  
  282. .5              move.b  #'X',d0                 ;Opt -[X]ecute
  283.                 bsr     BT_GetOpt
  284.                 tst.b   my_Error(a5)
  285.                 bne.s   BT_Parameter
  286.                 bsr     BT_Xecute               ;Ja, Exec BT Boot
  287.                 bra     BT_ExitKey
  288.  
  289. BT_Parameter    move.b  #'P',d0                 ;Opt -P PicName
  290.                 bsr     BT_GetParam             ;Pos. PicName ermitteln
  291.                 tst.b   my_Error(a5)            ;Fehler?
  292.                 bne     PrtUsage                ;Wenn nicht dann Fehler
  293.                 move.l  a0,my_PicName(a5)       ;Name des Bildes
  294.  
  295.                 move.b  #'M',d0                 ;Opt -M ModName
  296.                 bsr     BT_GetParam             ;Pos. ModName ermitteln
  297.                 tst.b   my_Error(a5)            ;Module übergeben
  298.                 bne.s   .1                      ;Nein! Nicht unbedingt nötig
  299.                 move.l  a0,my_ModName(a5)       ;Name des Modules
  300.  
  301. .1              move.b  #'B',d0                 ;Opt -B #Blk
  302.                 bsr.s   BT_GetParam             ;Pos. Offset ermitteln
  303.                 tst.b   my_Error(a5)            ;Übergabe?
  304.                 bne.s   .2                      ;Nein!
  305.                 bsr     BT_CalcNumb
  306.                 cmpi.l  #2,d0
  307.                 blt     PrtBadoffset
  308.                 cmpi.l  #1756,d0
  309.                 bgt     PrtBadoffset
  310.                 mulu    #512,d0
  311.                 lea     bb_Offset(pc),a0
  312.                 move.l  d0,(a0)
  313.  
  314. .2              move.b  #'T',d0                 ;Opt -T #Trk
  315.                 bsr.s   BT_GetParam
  316.                 tst.b   my_Error(a5)
  317.                 bne.s   .3
  318.                 bsr     BT_CalcNumb
  319.                 cmpi.l  #1,d0
  320.                 blt     PrtBadoffset
  321.                 cmpi.l  #159,d0
  322.                 bgt     PrtBadoffset
  323.                 mulu    #5632,d0
  324.                 lea     bb_Offset(pc),a0
  325.                 move.l  d0,(a0)
  326.  
  327. .3              bsr     BT_GetPMSize            ;Größe Pic/Mod ermitteln
  328.                 tst.b   my_Error(a5)
  329.                 bne.s   .Skip
  330.  
  331.                 bsr     BT_Load                 ;Dateien einladen
  332.                 tst.b   my_Error(a5)
  333.                 bne.s   .Skip
  334.  
  335.                 bsr     BT_Install              ;BT installieren
  336.                 bra     BT_ExitKey              ;Auf [RETURN] warten
  337.  
  338. .Skip           rts
  339.  
  340.  
  341. * ------------------------------------
  342. * Paramterangaben ermitteln -(PMTB)
  343. *
  344. * In:  D0 = Parameter
  345. * Out: A0 = Zeiger auf Parameterangabe
  346. *
  347. * my_Error <> 0 wenn Fehler
  348. * ------------------------------------
  349. *
  350. BT_GetParam     movea.l my_ParamStr(a5),a1
  351.                 move.l  my_ParamLen(a5),d1
  352. .1              move.b  (a1)+,d2
  353.                 cmpi.b  #'-',d2
  354.                 bne.s   .4
  355.                 move.b  (a1),d2
  356.                 bclr    #5,d2
  357.                 cmp.b   d0,d2
  358.                 bne.s   .4
  359.                 adda.l  #2,a1
  360.                 movea.l a1,a0
  361. .2              move.b  (a1)+,d2
  362.                 cmpi.b  #' ',d2
  363.                 beq.s   .3
  364.                 tst.b   d2
  365.                 bne.s   .2
  366. .3              clr.b   -1(a1)
  367.                 bra     BT_Ok
  368. .4              dbf     d1,.1
  369.                 bra     BT_Error
  370.  
  371.  
  372. * --------------------------
  373. * Option ermitteln -(CEIRSX)
  374. *
  375. * In: D0 = Param
  376. *
  377. * my_Error <> 0 wenn Fehler
  378. * --------------------------
  379. *
  380. BT_GetOpt       movea.l my_ParamStr(a5),a0
  381.                 move.l  my_ParamLen(a5),d1
  382. .1              move.b  (a0)+,d2
  383.                 cmpi.b  #'-',d2
  384.                 bne.s   .2
  385.                 move.b  (a0),d2
  386.                 bclr    #5,d2
  387.                 cmp.b   d0,d2
  388.                 bne.s   .2
  389.                 bra     BT_Ok
  390. .2              dbf     d1,.1
  391.                 bra     BT_Error
  392.  
  393.  
  394. * --------------------------------------------
  395. * ASCII-String in Zahl wandeln für #Blk & #Trk
  396. *
  397. * In:  A0 = Zeichenkette mit Zahlen
  398. * Out: D0 = Long-Zahl
  399. * --------------------------------------------
  400. *
  401. BT_CalcNumb     moveq.l #0,d0
  402. .1              moveq.l #0,d1
  403.                 move.b  (a0)+,d1
  404.                 subi.b  #'0',d1
  405.                 bmi.s   .2
  406.                 mulu    #10,d0
  407.                 ext.w   d1
  408.                 ext.l   d1
  409.                 add.l   d1,d0
  410.                 bra.s   .1
  411. .2              rts
  412.  
  413.  
  414. * -----------------------------------
  415. * Größe von Pic & Mod-Datei ermitteln
  416. * -----------------------------------
  417. *
  418. BT_GetPMSize    move.l  my_PicName(a5),d1               ;IFF-Bild
  419.                 moveq   #ACCESS_READ,d2
  420.                 DOS     Lock
  421.                 move.l  d0,my_Lock(a5)
  422.                 ble     PrtNopic
  423.                 move.l  my_Lock(a5),d1
  424.                 lea     my_Fib(a5),a3
  425.                 move.l  a3,d2
  426.                 LIB     Examine
  427.                 tst.l   d0
  428.                 beq.s   .1
  429.                 move.l  fib_Size(a3),my_PicLen(a5)
  430.                 move.l  my_Lock(a5),d1
  431.                 LIB     UnLock
  432.  
  433.                 move.l  my_ModName(a5),d1               ;ST-Module
  434.                 ble     BT_Ok
  435.                 moveq   #ACCESS_READ,d2
  436.                 LIB     Lock
  437.                 move.l  d0,my_Lock(a5)
  438.                 ble     PrtNomod
  439.                 move.l  my_Lock(a5),d1
  440.                 lea     my_Fib(a5),a3
  441.                 move.l  a3,d2
  442.                 LIB     Examine
  443.                 tst.l   d0
  444.                 beq.s   .1
  445.                 move.l  fib_Size(a3),my_ModLen(a5)
  446.                 move.l  my_Lock(a5),d1
  447.                 LIB     UnLock
  448.                 bra     BT_Ok
  449.  
  450. .1              move.l  my_Lock(a5),d1                  ;Fehler!
  451.                 LIB     UnLock
  452.                 bra     BT_Error
  453.  
  454.  
  455. * --------------------------------------------------------------
  456. * BootBlock, BT, Pic & Module in Speicher einlesen bzw. kopieren
  457. * --------------------------------------------------------------
  458. *
  459. BT_Load         move.l  #1024*2,d0              ;Platz für BB`s
  460.                 add.l   #PM_LEN,d0              ;Platz für BT PM
  461.                 add.l   my_PicLen(a5),d0        ;Platz für Pic
  462.                 add.l   my_ModLen(a5),d0        ;Platz für Mod
  463.  
  464.                 andi.l  #$FFFFFE00,d0           ;KgV von 512 ermitteln
  465.                 addi.l  #512,d0                 ;Für TrkCmd's
  466.  
  467.                 move.l  d0,my_TrkLen(a5)        ;Gesamte Speichergröße
  468.                 move.l  d0,my_BitNum(a5)        ;Für SetBitMap
  469.                 move.l  #$10003,d1
  470.                 EXE     AllocMem
  471.                 move.l  d0,my_TrkBuf(a5)
  472.                 ble     PrtMemout
  473.  
  474.                 movea.l my_TrkBuf(a5),a3        ;Zeiger auf Puffer
  475.                 adda.l  #PM_LEN+2048,a3         ;Freiraum für PM & BB`s
  476.  
  477.                 move.l  my_PicName(a5),d1       ;Bild einlesen
  478.                 lea     TxLoadPic(pc),a0
  479.                 lea     my_WorkBuffer(a5),a1
  480.                 move.l  d1,(a1)
  481.                 bsr     BT_FmtStr
  482.                 move.l  #MODE_OLDFILE,d2
  483.                 DOS     Open
  484.                 move.l  d0,my_Handle(a5)
  485.                 beq.s   .3
  486.                 move.l  my_Handle(a5),d1
  487.                 move.l  a3,d2
  488.                 move.l  my_PicLen(a5),d3
  489.                 LIB     Read
  490.                 cmp.l   my_PicLen(a5),d0
  491.                 bne.s   .2
  492.                 move.l  my_Handle(a5),d1
  493.                 LIB     Close
  494.                 adda.l  my_PicLen(a5),a3
  495.  
  496.                 move.l  my_ModName(a5),d1       ;Module kopieren
  497.                 ble     BT_Ok                   ;Nein!
  498.                 lea     TxLoadMod(pc),a0
  499.                 lea     my_WorkBuffer(a5),a1
  500.                 move.l  d1,(a1)
  501.                 bsr     BT_FmtStr
  502.                 move.l  #MODE_OLDFILE,d2
  503.                 LIB     Open
  504.                 move.l  d0,my_Handle(a5)
  505.                 beq.s   .3
  506.                 move.l  my_Handle(a5),d1
  507.                 move.l  a3,d2
  508.                 move.l  my_ModLen(a5),d3
  509.                 LIB     Read
  510.                 cmp.l   my_ModLen(a5),d0
  511.                 bne.s   .2
  512.                 move.l  my_Handle(a5),d1
  513.                 LIB     Close
  514.                 adda.l  my_ModLen(a5),a3
  515.                 bra     BT_Ok
  516.  
  517. .2              move.l  my_Handle(a5),d1
  518.                 LIB     Close
  519.  
  520. .3              lea     TxFileErr(pc),a0
  521.                 lea     my_WorkBuffer(a5),a1    ;Dateiname war installiert!
  522.                 bsr     BT_FmtStr
  523.                 bra     BT_Error
  524.  
  525.  
  526. * -------------------------------------
  527. * BootTwister auf Diskette installieren
  528. * -------------------------------------
  529. *
  530. BT_Install      bsr     BT_WaitKey              ;Warten auf [RETURN]
  531.  
  532.                 bsr     BT_DiskIN               ;Eingelegt
  533.                 tst.b   my_Error(a5)            ;Testflag
  534.                 bne.s   .0                      ;Alles OK, ansonsten Abbruch
  535.                 bsr     BT_DiskWP
  536.                 tst.b   my_Error(a5)
  537.                 beq.s   .1
  538. .0              rts
  539.  
  540. .1              lea     bb_PicLen(pc),a0
  541.                 move.l  my_PicLen(a5),(a0)
  542.                 lea     bb_ModLen(pc),a0
  543.                 move.l  my_ModLen(a5),(a0)
  544.                 lea     bb_BlkLen(pc),a0
  545.                 move.l  my_TrkLen(a5),(a0)
  546.  
  547.                 movea.l my_TrkBuf(a5),a3
  548.  
  549.                 lea     BT_BB(pc),a0            ;BootBlock kopieren
  550.                 movea.l a3,a1
  551.                 move.l  #BB_LEN,d0
  552.                 LIB     CopyMem
  553.  
  554.                 lea     BT_PM(pc),a0            ;PicMod kopieren
  555.                 lea     2048(a3),a1             ;BB`s überspringen
  556.                 move.l  #PM_LEN,d0
  557.                 LIB     CopyMem
  558.  
  559.                 movea.l a3,a0                   ;BootBlock Daten
  560.                 bsr     BT_CalcBBSum            ;CkSum berechnen & Eintragen
  561.  
  562.  
  563. * --------------------------------------
  564. * Alten BootBlock zuvor retten für -(ER)
  565. * --------------------------------------
  566. *
  567. BT_SaveOldBB    lea     my_StdIOReq(a5),a1
  568.  
  569.                 bsr     PrtReadbb
  570.  
  571.                 lea     1024(a3),a0             ;Alten BB sichern
  572.                 move.w  #CMD_READ,io_Command(a1)
  573.                 move.l  #1024,io_Length(a1)
  574.                 move.l  a0,io_Data(a1)
  575.                 clr.l   io_Offset(a1)
  576.                 bsr     BT_DoIO
  577.                 bne     BT_Error
  578.  
  579.  
  580. * -------------------------------------------
  581. * BootTwister-Daten auf Diskette installieren
  582. * -------------------------------------------
  583. *
  584. BT_WriteDisk    move.w  #CMD_WRITE,io_Command(a1)
  585.                 move.l  #1024,io_Length(a1)     ;BB_LEN
  586.                 move.l  a3,io_Data(a1)          ;Adresse BB
  587.                 clr.l   io_Offset(a1)           ;Offset Block 0
  588.                 bsr     BT_DoIO                 ;Installieren
  589.                 bne.s   .Skip
  590.  
  591.                 move.l  my_TrkLen(a5),d0        ;Totale Byte-Größe
  592.                 subi.l  #1024,d0                ;Ohne BootBlock
  593.                 move.l  d0,io_Length(a1)
  594.                 lea     1024(a3),a0             ;Daten für BT
  595.                 move.l  a0,io_Data(a1)
  596.                 lea     bb_Offset(pc),a0        ;Byte-Offset
  597.                 move.l  (a0),io_Offset(a1)      ;Falls Opt -B/T
  598.                 bsr     BT_DoIO
  599.                 bne.s   .Skip
  600.                 move.w  #CMD_UPDATE,io_Command(a1)
  601.                 bsr     BT_DoIO
  602.                 bne.s   .Skip
  603.  
  604.                 move.l  io_Offset(a1),d0
  605.                 cmpi.l  #1024,d0                ;Opt -T/B übergeben
  606.                 bne.s   .1                      ;Nein
  607.                 bsr     PrtSetbm
  608.                 moveq.l #$FFFFFFFF,d7           ;BitMuster = Freie Blöcke
  609.                 bsr     BT_SetBitMap
  610. .1              bra     PrtBTinfo
  611.  
  612. .Skip           rts
  613.  
  614.  
  615. * -----------------------------------------------------------------
  616. * -R = BootTwister Daten von Disk entfernen & BootBlock restauieren
  617. * -----------------------------------------------------------------
  618. *
  619. BT_Remove       bsr     BT_WaitKey
  620.  
  621.                 bsr     BT_DiskIN
  622.                 tst.b   my_Error(a5)
  623.                 bne     .Skip
  624.                 bsr     BT_DiskWP
  625.                 tst.b   my_Error(a5)
  626.                 bne     .Skip
  627.  
  628.                 lea     my_WorkBuffer(a5),a3
  629.  
  630.                 lea     my_StdIOReq(a5),a1
  631.                 move.w  #CMD_READ,io_Command(a1)
  632.                 move.l  #1024,io_Length(a1)
  633.                 move.l  a3,io_Data(a1)
  634.                 clr.l   io_Offset(a1)
  635.                 bsr     BT_DoIO
  636.                 bne     .Skip
  637.  
  638.                 move.l  28(a3),my_BitNum(a5)    ;Anz. belegter Blöcke
  639.                 cmpi.l  #'BT98',36(a3)
  640.                 bne     PrtNobt
  641.  
  642.                 lea     TxRestore(pc),a0        ;Restore-Info
  643.                 bsr     BT_Print
  644.  
  645.                 move.l  16(a3),d7               ;Offset für Überprüfung
  646.  
  647.                 move.w  #CMD_READ,io_Command(a1)
  648.                 move.l  #1024,io_Length(a1)
  649.                 move.l  d7,io_Offset(a1)        ;Offset
  650.                 bsr     BT_DoIO
  651.                 bne.s   .Skip
  652.  
  653.                 move.w  #CMD_WRITE,io_Command(a1)
  654.                 clr.l   io_Offset(a1)
  655.                 bsr     BT_DoIO
  656.                 bne.s   .Skip
  657.                 move.w  #CMD_UPDATE,io_Command(a1)
  658.                 bsr     BT_DoIO
  659.                 bne.s   .Skip
  660.  
  661.                 lea     TxCleanup(pc),a0        ;Textausgabe
  662.                 bra     BT_Print
  663.  
  664.                 move.l  my_BitNum(a5),d6        ;Freie Blöcke formatieren
  665. .0              lea     my_TrkBuffer(a5),a4
  666.                 lea     my_StdIOReq(a5),a1
  667.                 move.w  #CMD_WRITE,io_Command(a1)
  668.                 move.l  #512,io_Length(a1)
  669.                 move.l  a4,io_Data(a1)
  670.                 move.l  d7,io_Offset(a1)        ;Offset
  671.                 bsr     BT_DoIO
  672.                 bne.s   .Skip
  673.                 subi.l  #512,d6
  674.                 ble.s   .1
  675.                 addi.l  #512,d7
  676.                 bra.s   .0
  677. .1              move.w  #CMD_UPDATE,io_Command(a1)
  678.                 bsr     BT_DoIO
  679.  
  680.                 move.l  16(a3),d7
  681.                 cmpi.l  #1024,d7                ;Wurde -T/-B übergeben
  682.                 bne.s   .Skip                   ;Ja, kein BM-Update
  683.  
  684.                 moveq.l #0,d7                   ;Belgete Blöcke freigeben
  685.                 bra     BT_SetBitMap
  686.  
  687. .Skip           rts
  688.  
  689.  
  690. * -------------------------------------
  691. * -C = Disk nach freien Tracks absuchen
  692. * -------------------------------------
  693. *
  694. BT_Check        bsr     BT_WaitKey
  695.                 bsr     BT_DiskIN
  696.                 tst.b   my_Error(a5)
  697.                 bne     .Skip
  698.  
  699.                 move.l  #5632,d7                ;Offset Start Track 1
  700.  
  701. .0              lea     TxCheckTrk(pc),a0
  702.                 bsr.s   .4                      ;Test Track anzeigen
  703.  
  704.                 lea     my_StdIOReq(a5),a1
  705.                 move.w  #CMD_READ,io_Command(a1)
  706.                 move.l  #5632,io_Length(a1)
  707.                 lea     my_TrkBuffer(a5),a3
  708.                 move.l  a3,io_Data(a1)
  709.                 move.l  d7,io_Offset(a1)
  710.                 bsr     BT_DoIO
  711.                 bne.s   .Skip
  712.  
  713.                 move.l  #1408,d6
  714.                 lea     my_TrkBuffer(a5),a3
  715. .1              tst.l   (a3)+
  716.                 bne.s   .2
  717.                 dbf     d6,.1
  718.  
  719.                 lea     TxFreeTrk(pc),a0
  720.                 bsr.s   .4                      ;Freien Track anzeigen
  721.  
  722. .2              btst    #6,$BFE001
  723.                 beq.s   .3
  724.                 addi.l  #5632,d7
  725.                 cmpi.l  #901120,d7
  726.                 bne.s   .0
  727.  
  728. .3              lea     TxFreeLine(pc),a0
  729.                 bsr     BT_Print
  730.  
  731. .4              lea     my_WorkBuffer(a5),a1
  732.                 move.l  d7,d0
  733.                 divu    #5632,d0
  734.                 move.w  d0,(a1)                 ;Track
  735.                 move.l  d7,d0
  736.                 divu    #512,d0
  737.                 move.w  d0,2(a1)                ;Block
  738.                 addi.w  #10,d0
  739.                 move.w  d0,4(a1)                ;To Block
  740.                 bra     BT_FmtStr
  741.  
  742. .Skip           rts
  743.  
  744.  
  745. * -------------------------------
  746. * -I = BT BootBlock Info ausgeben
  747. * -------------------------------
  748. *
  749. BT_Info         bsr     BT_WaitKey
  750.                 bsr     BT_DiskIN
  751.                 tst.b   my_Error(a5)
  752.                 bne.s   .Skip
  753.  
  754.                 lea     my_StdIOReq(a5),a1      ;BootBlock einlesen
  755.                 lea     my_WorkBuffer(a5),a3
  756.                 move.w  #CMD_READ,io_Command(a1)
  757.                 move.l  #1024,io_Length(a1)
  758.                 move.l  a3,io_Data(a1)
  759.                 clr.l   io_Offset(a1)
  760.                 bsr     BT_DoIO
  761.                 bne.s   .Skip
  762.  
  763.                 cmpi.l  #'BT98',bt_BBID(a3)
  764.                 bne     PrtNobt
  765.  
  766.                 move.l  bt_BBOffset(a3),d0      ;BytePos.
  767.                 divu    #512,d0                 ;BlockPos.
  768.                 clr.l   bt_BBOffset(a3)
  769.                 move.w  d0,bt_BBOffset+2(a3)    ;Eintragen
  770.  
  771.                 tst.l   bt_BBExecBB(a3)
  772.                 bne.s   .0
  773.                 lea     TxInfoNOT(pc),a0
  774.                 move.l  a0,bt_BBExecBB(a3)
  775.  
  776. .0              lea     TxInfo(pc),a0
  777.                 lea     bt_BBOffset(a3),a1
  778.                 bsr     BT_FmtStr
  779.  
  780. .Skip           rts
  781.  
  782.  
  783. * ------------------------------------
  784. * -S = Swap execute old BootBlock flag
  785. * ------------------------------------
  786. *
  787. BT_Swap         bsr     BT_WaitKey
  788.                 bsr     BT_DiskIN
  789.                 tst.b   my_Error(a5)
  790.                 bne.s   .Skip
  791.  
  792.                 bsr     BT_DiskWP
  793.                 tst.b   my_Error(a5)
  794.                 bne.s   .Skip
  795.  
  796.                 lea     TxSwapFlag(pc),a0
  797.                 bsr     BT_Print
  798.  
  799.                 lea     my_StdIOReq(a5),a1      ;BootBlock einlesen
  800.                 lea     my_WorkBuffer(a5),a3
  801.                 move.w  #CMD_READ,io_Command(a1)
  802.                 move.l  #1024,io_Length(a1)
  803.                 move.l  a3,io_Data(a1)
  804.                 clr.l   io_Offset(a1)
  805.                 bsr     BT_DoIO
  806.                 bne.s   .Skip
  807.  
  808.                 cmpi.l  #'BT98',bt_BBID(a3)
  809.                 bne     PrtNobt
  810.  
  811.                 not.l   bt_BBExecBB(a3)         ;Exec Old Boot On/Off
  812.  
  813.                 lea     my_StdIOReq(a5),a1      ;BootBlock einlesen
  814.                 move.w  #CMD_WRITE,io_Command(a1)
  815.                 move.l  #1024,io_Length(a1)
  816.                 move.l  a3,io_Data(a1)
  817.                 clr.l   io_Offset(a1)
  818.                 bsr     BT_DoIO
  819.                 bne.s   .Skip
  820.                 move.w  #CMD_UPDATE,io_Command(a1)
  821.                 bra     BT_DoIO
  822.  
  823. .Skip           rts
  824.  
  825.  
  826. * ------------------------------
  827. * -X = Xecute BT Intro from disk
  828. * ------------------------------
  829. *
  830. BT_Xecute       bsr     BT_WaitKey
  831.                 bsr     BT_DiskIN
  832.                 tst.b   my_Error(a5)
  833.                 bne     .Skip
  834.  
  835.                 lea     my_StdIOReq(a5),a1      ;BootBlock einlesen
  836.                 lea     my_WorkBuffer(a5),a3
  837.                 move.w  #CMD_READ,io_Command(a1)
  838.                 move.l  #1024,io_Length(a1)
  839.                 move.l  a3,io_Data(a1)
  840.                 clr.l   io_Offset(a1)
  841.                 bsr     BT_DoIO
  842.                 bne     .Skip
  843.  
  844.                 cmpi.l  #'BT98',bt_BBID(a3)
  845.                 bne     PrtNobt
  846.  
  847.                 move.l  bt_BBOffset(a3),my_TrkOfs(a5)
  848.                 move.l  bt_BBPicLen(a3),my_PicLen(a5)
  849.                 move.l  bt_BBModLen(a3),my_ModLen(a5)
  850.  
  851.                 move.l  bt_BBBlkLen(a3),d0
  852.                 move.l  d0,my_TrkLen(a5)
  853.                 move.l  #$10003,d1
  854.                 EXE     AllocMem
  855.                 tst.l   d0
  856.                 beq     BT_Error
  857.                 move.l  d0,my_TrkBuf(a5)
  858.  
  859.                 lea     TxXecute(pc),a0
  860.                 bsr     BT_Print
  861.  
  862.                 lea     my_StdIOReq(a5),a1      ;BootBlock einlesen
  863.                 move.w  #CMD_READ,io_Command(a1)
  864.                 move.l  my_TrkLen(a5),io_Length(a1)
  865.                 move.l  my_TrkBuf(a5),io_Data(a1)
  866.                 move.l  my_TrkOfs(a5),io_Offset(a1)
  867.                 bsr.s   BT_DoIO
  868.                 bne.s   .Skip
  869.  
  870.                 movem.l a0-a6/d0-d7,-(sp)
  871.                 move.l  my_TrkBuf(a5),d7
  872.                 add.l   #PM_LEN+1024,d7         ;Iff/Mod/BB-Routine übspr.
  873.                 movea.l d7,a0                   ;Adr. Pic
  874.                 movea.l a0,a1
  875.                 move.l  my_PicLen(a5),d0        ;Byte Pic
  876.                 move.l  my_ModLen(a5),d1
  877.                 beq.s   .0
  878.                 movea.l d7,a1
  879.                 adda.l  d0,a1                   ;Adr. Mod
  880. .0              bsr     BT_PM                   ;Xecute
  881.                 movem.l (sp)+,a0-a6/d0-d7
  882.  
  883. .Skip           rts
  884.  
  885.  
  886. * -----------------------------------------
  887. * Standart-Ausführung & Test für TD_Command
  888. * -----------------------------------------
  889. *
  890. BT_DoIO         lea     my_StdIOReq(a5),a1
  891.                 EXE     DoIO
  892.                 tst.l   d0
  893.                 bne.s   .1
  894.                 move.b  io_Error(a1),d0
  895.                 beq     BT_Ok
  896.                 ext.w   d0
  897.                 ext.l   d0
  898. .1              bsr     PrtDiskerr
  899.                 bsr     BT_MotorOFF
  900.                 bra     BT_Error
  901.  
  902.  
  903. * -----------------------------
  904. * Disk-Interrupt aus/anschalten
  905. * -----------------------------
  906. *
  907. BT_BusyON       moveq   #0,d7
  908.                 bra.s   BT_BusyDisk
  909.  
  910. BT_BusyOFF      moveq   #-1,d7
  911.  
  912. BT_BusyDisk     lea     TxDrive(pc),a0
  913.                 move.l  a0,d1
  914.                 DOS     DeviceProc
  915.                 move.l  d0,d6
  916.                 beq.s   .Skip
  917.                 suba.l  a1,a1
  918.                 EXE     FindTask
  919.                 move.l  d0,d5
  920.                 addi.l  #$5C,d5
  921.                 lea     my_BusyBuffer+$14(a5),a0
  922.                 lea     my_BusyBuffer(a5),a1
  923.                 move.l  a0,10(a1)
  924.                 move.l  a1,(a0)
  925.                 move.l  d5,4(a0)
  926.                 move.l  #$1F,8(a0)
  927.                 move.l  d7,$14(a0)
  928.                 movea.l d6,a0
  929.                 LIB     PutMsg
  930.                 movea.l d5,a0
  931.                 LIB     WaitPort
  932.                 movea.l d5,a0
  933.                 LIB     GetMsg
  934. .Skip           rts
  935.  
  936.  
  937. * --------------------------------------------
  938. * Berechnung und eintragen der BootBlock-CkSum
  939. *
  940. * In: A0 = BootBlock-Daten
  941. * --------------------------------------------
  942. *
  943. BT_CalcBBSum    movem.l a1/d0/d1,-(sp)
  944.                 movea.l a0,a1
  945.                 clr.l   4(a0)
  946.                 moveq   #0,d0
  947.                 move.w  #$FF,d1
  948. .1              add.l   (a1)+,d0
  949.                 bcc.s   .2
  950.                 addq.l  #1,d0
  951. .2              dbf     d1,.1
  952.                 not.l   d0
  953.                 move.l  d0,4(a0)
  954.                 movem.l (sp)+,a1/d0/d1
  955.                 rts
  956.  
  957.  
  958. * -------------------------------------------
  959. * Berechnung der BitMap-CkSum zur Überprüfung
  960. *
  961. * In:  A0 = BitMap-Daten
  962. * Out: D0 = CkSum
  963. *
  964. * my_Error <> 0 bei nicht Übereinstimmung
  965. * -------------------------------------------
  966. *
  967. BT_CalcBMSum    movem.l a1/d1,-(sp)
  968.                 bsr     BT_Ok
  969.                 lea     4(a0),a1
  970.                 move.w  #$7E,d1
  971.                 moveq.l #0,d0
  972. .1              sub.l   (a1)+,d0
  973.                 dbf     d1,.1
  974.                 cmp.l   (a0),d0
  975.                 beq.s   .2
  976.                 bsr     BT_Error
  977. .2              movem.l (sp)+,a1/d1
  978.                 rts
  979.  
  980.  
  981. * -----------------------------------------------------
  982. * BitMap-Block einlesen & BitMap installieren
  983. *
  984. * In: D7 = Bit-Modus ($FFFFFFFF=Belegen / $0=Freigeben)
  985. * -----------------------------------------------------
  986. *
  987. BT_SetBitMap    lea     my_WorkBuffer(a5),a3
  988.  
  989.                 lea     my_StdIOReq(a5),a1      ;RootBlock einlesen
  990.                 move.w  #CMD_READ,io_Command(a1)
  991.                 move.l  #512,io_Length(a1)
  992.                 move.l  a3,io_Data(a1)
  993.                 move.l  #880*512,io_Offset(a1)  ;RootBlock-Pos. auf Disk
  994.                 bsr     BT_DoIO
  995.                 bne.s   .Skip
  996.  
  997.                 tst.l   312(a3)                 ;BitMap gültig?
  998.                 beq     BT_MotorOFF             ;Nein!
  999.                 move.l  316(a3),d0              ;Zeiger auf BitMapBlock
  1000.                 mulu    #512,d0
  1001.                 move.l  d0,io_Offset(a1)        ;BitMapBlock-Pos. auf Disk
  1002.                 bsr     BT_DoIO
  1003.                 bne.s   .Skip
  1004.  
  1005.                 movea.l a3,a0                   ;Zeiger auf BM-Daten
  1006.                 bsr.s   BT_CalcBMSum            ;BM-CkSum überprüfen
  1007.                 tst.b   my_Error(a5)            ;Fehler?
  1008.                 bne.s   .Skip                   ;Ja, keine DOS-Disk
  1009.  
  1010.                 lea     4(a3),a0                ;BitMuster-Pos.
  1011.                 move.l  my_BitNum(a5),d0        ;Anzahl Bytes
  1012.                 divu    #512,d0                 ;In Blockanzahl umrechnen
  1013.                 subi.l  #2,d0                   ;BB nicht nochmals
  1014.  
  1015. .1              move.l  d7,d1                   ;Def. BitMuster $FFFFFFFF/$0
  1016.                 moveq   #32,d2                  ;Letzte BitMuster-Pos.
  1017. .2              subq    #1,d2                   ;BitPos - 1
  1018.                 bchg    d2,d1                   ;Block belegt/frei markieren
  1019.                 tst.l   d2                      ;Schon BitPos = 0?
  1020.                 bne.s   .3                      ;Nein
  1021.                 move.l  d1,(a0)+                ;Belegungs-Bits installieren
  1022.                 bra.s   .1                      ;Von vorn
  1023. .3              dbf     d0,.2                   ;Wiederhole bis Blks markiert
  1024.                 tst.l   d7
  1025.                 bne.s   .4
  1026.  
  1027.                 tst.l   d7                      ;Opt -R
  1028.                 bne.s   .4                      ;Nein
  1029.                 or.l    (a0),d1                 ;Letztes BM-Muster verknüpfen
  1030.  
  1031. .4              move.l  d1,(a0)                 ;Letzte Belegungsmarkierung
  1032.                 movea.l a3,a0                   ;Zeiger auf BM-Daten
  1033.                 bsr     BT_CalcBMSum            ;BM-CkSum berechnen
  1034.                 move.l  d0,(a3)                 ;Eintragen
  1035.  
  1036.                 move.w  #CMD_WRITE,io_Command(a1)
  1037.                 bsr     BT_DoIO
  1038.                 bne.s   .Skip
  1039.                 move.w  #CMD_UPDATE,io_Command(a1)
  1040.                 bsr     BT_DoIO
  1041.                 bne.s   .Skip
  1042.  
  1043.                 bra     BT_Ok
  1044.  
  1045. .Skip           rts
  1046.  
  1047.  
  1048. * ------------------------
  1049. * Test ob Disk eingelegt
  1050. *
  1051. * my_Error <> 0 für Fehler
  1052. * ------------------------
  1053. *
  1054. BT_DiskIN       lea     my_StdIOReq(a5),a1
  1055.                 move.w  #TD_CHANGESTATE,io_Command(a1)
  1056.                 EXE     DoIO
  1057.                 tst.l   io_Actual(a1)
  1058.                 beq     BT_Ok
  1059.                 lea     TxNoDisk(pc),a0         ;Keine Disk eingelegt
  1060.                 bsr     BT_Print
  1061.                 bra     BT_Error
  1062.  
  1063.  
  1064. * -----------------------------
  1065. * Test ob Disk schreibgeschützt
  1066. *
  1067. * my_Error <> 0 für Fehler
  1068. * -----------------------------
  1069. *
  1070. BT_DiskWP       lea     my_StdIOReq(a5),a1
  1071.                 move.w  #TD_PROSTATUS,io_Command(a1)
  1072.                 EXE     DoIO
  1073.                 tst.l   io_Actual(a1)
  1074.                 beq     BT_Ok
  1075.                 lea     TxDiskPro(pc),a0        ;Disk ist schreibgeschützt
  1076.                 bsr     BT_Print
  1077.                 bra     BT_Error
  1078.  
  1079.  
  1080. * ------------------------------------------
  1081. * TD_Head auf Position 0 & Motor ausschalten
  1082. * ------------------------------------------
  1083. *
  1084. BT_MotorOFF     lea     my_StdIOReq(a5),a1
  1085.                 move.w  #TD_SEEK,io_Command(a1)
  1086.                 clr.l   io_Offset(a1)
  1087.                 EXE     DoIO
  1088.                 move.w  #TD_MOTOR,io_Command(a1)
  1089.                 clr.l   io_Length(a1)
  1090.                 LAB     DoIO
  1091.  
  1092.  
  1093. * -----------------------------------------
  1094. * Start: Auf Betätigung von [RETURN] warten
  1095. * -----------------------------------------
  1096. *
  1097. BT_WaitKey      movem.l a0-a6/d0-d3,-(sp)
  1098.                 bsr     BT_BusyOFF              ;Disk-Interrupt aus
  1099.                 lea     TxWaitKey(pc),a0        ;Text ausgeben
  1100.                 bsr     BT_Print
  1101.                 lea     TxDrive(pc),a0
  1102.                 bsr     BT_Print
  1103.                 DOS     Output
  1104.                 move.l  d0,d1
  1105.                 lea     my_WorkBuffer(a5),a0    ;Platz für Read
  1106.                 move.l  a0,d2
  1107.                 moveq.l #1,d3
  1108.                 LIB     Read                    ;Auf [RETURN] warten
  1109.                 movem.l (sp)+,a0-a6/d0-d3
  1110.                 rts
  1111.  
  1112.  
  1113. * ----------------------------------------
  1114. * Ende: Auf Betätigung von [RETURN] warten
  1115. * ----------------------------------------
  1116. *
  1117. BT_ExitKey      movem.l a0-a6/d0-d3,-(sp)
  1118.                 tst.b   my_Error(a5)            ;Fehler?
  1119.                 bne.s   .0                      ;Joo! nicht warten
  1120.                 lea     TxExitKey(pc),a0
  1121.                 bsr     BT_Print
  1122.                 lea     TxDrive(pc),a0
  1123.                 bsr     BT_Print
  1124.                 DOS     Output
  1125.                 move.l  d0,d1
  1126.                 lea     my_WorkBuffer(a5),a0
  1127.                 move.l  a0,d2
  1128.                 moveq.l #1,d3
  1129.                 LIB     Read
  1130.                 bsr     PrtThatsAll
  1131. .0              bsr     BT_BusyON               ;Disk-Interrupt wieder an
  1132.                 movem.l (sp)+,a0-a6/d0-d3
  1133.                 rts
  1134.  
  1135.  
  1136. * -------------------------------------------------------
  1137. * String-Kette mit Formatelementen formatieren & ausgeben
  1138. *
  1139. * In: A0 = Ausgabe-String der Formatdaten
  1140. *     A1 = Formatdaten für Ausgabe-String
  1141. * -------------------------------------------------------
  1142. *
  1143. BT_FmtStr       movem.l a0-a6/d0-d7,-(sp)
  1144.                 lea     .1(pc),a2
  1145.                 lea     my_FmtBuffer(a5),a3
  1146.                 EXE     RawDoFmt
  1147.                 lea     my_FmtBuffer(a5),a0
  1148.                 bsr     BT_Print
  1149.                 movem.l (sp)+,a0-a6/d0-d7
  1150.                 rts
  1151. .1              move.b  d0,(a3)+
  1152.                 rts
  1153.  
  1154.  
  1155. * ----------------------
  1156. * Allgemeine Textausgabe
  1157. * ----------------------
  1158. *
  1159. PrtDiskerr      lea     TxDiskErr(pc),a0        ;Disk defekt
  1160.                 lea     my_WorkBuffer(a5),a1
  1161.                 move.l  d0,(a1)
  1162.                 bsr.s   BT_FmtStr
  1163.                 lea     my_StdIOReq(a5),a1
  1164.                 bra     BT_Error
  1165.  
  1166. PrtBTinfo       lea     TxMessage(pc),a0        ;Installations-Info
  1167.                 lea     my_WorkBuffer(a5),a1
  1168.                 move.l  my_TrkLen(a5),d0
  1169.                 subi.l  #1024,d0                ;BB nicht mitgerechnet
  1170.                 move.l  d0,4(a1)                ;Bytes reserviert
  1171.                 divu    #512,d0
  1172.                 move.l  d0,(a1)                 ;Blocks reserviert
  1173.                 bra.s   BT_FmtStr
  1174.  
  1175. PrtNopic        lea     TxFileErr(pc),a0        ;Bild nicht vorhanden
  1176.                 lea     my_WorkBuffer(a5),a1
  1177.                 move.l  my_PicName(a5),(a1)
  1178.                 bsr.s   BT_FmtStr
  1179.                 bra     BT_Error
  1180.  
  1181. PrtNomod        lea     TxFileErr(pc),a0        ;Module nicht vorhanden
  1182.                 lea     my_WorkBuffer(a5),a1
  1183.                 move.l  my_ModName(a5),(a1)
  1184.                 bsr.s   BT_FmtStr
  1185.                 bra.s   BT_Error
  1186.  
  1187. PrtThatsAll     lea     TxThatsAll(pc),a0
  1188.                 bra.s   BT_Print
  1189.  
  1190. PrtBadoffset    lea     TxBadOffset(pc),a0      ;Falsches Block-Offset
  1191.                 bra.s   BT_Print
  1192.  
  1193. PrtUsage        lea     TxUsage(pc),a0          ;Keine gültigen Parameter
  1194.                 bra.s   BT_Print
  1195.  
  1196. PrtDeverr       lea     TxDevErr(pc),a0         ;Laufwerk nicht vorhanden
  1197.                 bra.s   BT_Print
  1198.  
  1199. PrtMemout       lea     TxMemOut(pc),a0         ;Nicht genügend Speicher
  1200.                 bsr.s   BT_Print
  1201.                 bra.s   BT_Error
  1202.  
  1203. PrtReadbb       lea     TxReadBB(pc),a0         ;Alten BootBlock sichern
  1204.                 bra.s   BT_Print
  1205.  
  1206. PrtSetbm        lea     TxSetBMap(pc),a0        ;BitMap belegen
  1207.                 bra.s   BT_Print
  1208.  
  1209. PrtNobt         lea     TxNoBT(pc),a0           ;Keine BT Disk
  1210.                 bsr.s   BT_Print
  1211.                 bra.s   BT_Error
  1212.  
  1213. PrtBThead       lea     TxHeadLine(pc),a0       ;BootTwister Kopfzeile
  1214.  
  1215.  
  1216. * ------------------------------
  1217. * Textausgabe » NULL Byte Test «
  1218. *
  1219. * In: A0 = TextPtr
  1220. * ------------------------------
  1221. *
  1222. BT_Print        movem.l a1-a6/d0-d3,-(sp)
  1223.                 move.l  a0,d2
  1224.                 moveq   #0,d3
  1225. .1              tst.b   (a0)+
  1226.                 beq.s   .2
  1227.                 addq.l  #1,d3
  1228.                 bra.s   .1
  1229. .2              DOS     Output
  1230.                 move.l  d0,d1
  1231.                 LIB     Write
  1232.                 movem.l (sp)+,a1-a6/d0-d3
  1233.                 rts
  1234.  
  1235.  
  1236. * ------------------
  1237. * Fehler-Flag setzen
  1238. * ------------------
  1239. *
  1240. BT_Error        move.b  #$FF,my_Error(a5)
  1241.                 rts
  1242.  
  1243. BT_Ok           move.b  #0,my_Error(a5)
  1244.                 rts
  1245.  
  1246.  
  1247. * ------------
  1248. * Programmende
  1249. * ------------
  1250. *
  1251. BT_Finish       movea.l $4.w,a6                 ;ExecBase
  1252.  
  1253.                 move.l  my_DosBase(a5),d0       ;DosLib
  1254.                 beq.s   .1                      ;Konnte nicht geöffnet werden
  1255.                 movea.l d0,a1
  1256.                 LIB     CloseLibrary
  1257.  
  1258. .1              lea     my_StdIOReq(a5),a1      ;DeviceStruc
  1259.                 tst.w   io_Command(a1)          ;Wurde Kommando übergeben
  1260.                 beq.s   .2                      ;Nein! Fehler aufgetreten
  1261.                 bsr     BT_MotorOFF
  1262.                 LIB     CloseDevice
  1263.  
  1264. .2              tst.l   my_TrkBuf(a5)           ;TrackBuffer freigeben
  1265.                 ble.s   .3
  1266.                 movea.l my_TrkBuf(a5),a1
  1267.                 move.l  my_TrkLen(a5),d0
  1268.                 LIB     FreeMem
  1269.  
  1270. .3              move.l  #my_SIZEOF,d0           ;DatenStruc freigeben
  1271.                 movea.l a5,a1
  1272.                 LIB     FreeMem
  1273.  
  1274. BT_Exit         RTS
  1275.  
  1276.  
  1277. * ---------------
  1278. * BT Datenbereich
  1279. * ---------------
  1280. *
  1281. TxUsage         dc.b    10
  1282.                 dc.b    'Usage: ',$9B,'33mBT',$9B,'0m <drive> -<file> [-<pos>] [-<opt>]',10,10
  1283.                 dc.b    ' drive = DF0: up to DF3:',10,10
  1284.                 dc.b    ' file  = -P file - install IFF picture',10
  1285.                 dc.b    '        -M file - use ST module additional',10,10
  1286.                 dc.b    ' pos   = -T #trk - start at track 1 up to 158',10
  1287.                 dc.b    '        -B #blk - start at block 2 up to 1756',10,10
  1288.                 dc.b    ' opt   = -C - checks for free tracks/blocks on disk',10
  1289.                 dc.b    '        -E - executes old bootblock after work',10
  1290.                 dc.b    '        -I - infos about installed data on disk',10
  1291.                 dc.b    '        -R - remove BootTwister and restore disk',10
  1292.                 dc.b    '        -S - swap flag for execute old bootblock',10
  1293.                 dc.b    '        -X - execute BootTwister of installed disk',10,10
  1294.                 dc.b    ' Files could be in PowerPacker data format',10,10
  1295.                 dc.b    $9B,'33mBT',$9B,'0m'
  1296.                 VER
  1297.                 dc.b    $9B,'33mFD',$9B,'0m © 2002 by Peace/TST, Testaware',10,10,0
  1298.  
  1299. TxHeadLine      dc.b    10
  1300.                 dc.b    '- - - - - - - - - - - - - - - - - - -',10
  1301.                 dc.b    '  BootTwister ® by Peace / Testaware',10
  1302.                 dc.b    'BootTwister'
  1303.                 VER
  1304.                 dc.b    '© 2002 by Testaware',10
  1305.                 dc.b    '- - - - - - - - - - - - - - - - - - -',10,10,0
  1306.  
  1307. TxRestore       dc.b    $9B,'33mRestore',$9B,'0m: Remove BootTwister from disk',10,0
  1308. TxCleanup       dc.b    $9B,'33mCleanup',$9B,'0m: Format restored blocks on disk',10,0
  1309. TxLoadPic       dc.b    $9B,'33mLoading',$9B,'0m: IFF picture ',$22,'%s',$22,10,0
  1310. TxLoadMod       dc.b    $9B,'33mLoading',$9B,'0m: ST module ',$22,'%s',$22,10,0
  1311. TxReadBB        dc.b    $9B,'33mReading',$9B,'0m: Preserve boot to execute/restore',10,0
  1312. TxSetBMap       dc.b    $9B,'33mReserve',$9B,'0m: Allocate used blocks in BitMap',10,0
  1313. TxWaitKey       dc.b    $9B,'33mRequest',$9B,'0m: Insert disk to twist in ',0
  1314. TxExitKey       dc.b    $9B,'33mRequest',$9B,'0m: Remove disk to finish from ',0
  1315. TxCheckTrk      dc.b    $9B,'33mTesting',$9B,'0m: Track %d, Block %d to %d',10,$B,0
  1316. TxFreeTrk       dc.b    $9B,'33mUnused!',$9B,'0m: Track %d, Block %d to %d',10,0
  1317. TxSwapFlag      dc.b    $9B,'33mSwaping',$9B,'0m: Swap execute old bootblock flag',10,0
  1318. TxXecute        dc.b    $9B,'33mExecute',$9B,'0m: Start twisted bootblock',10,0
  1319.                 even
  1320. TxDrive         dc.b    'DF0:',0
  1321.  
  1322. TxFreeLine      dc.b    $9B,$4B,0
  1323.  
  1324. TxInfo          dc.b    10
  1325.                 dc.b    $9B,'33mInfo   ',$9B,'0m: Installed position%9ld block',10
  1326.                 dc.b    '        Length of picture%10ld bytes',10
  1327.                 dc.b    '        Length of module%11ld bytes',10
  1328.                 dc.b    '        Total installed data%7ld bytes',10,10
  1329.                 dc.b    $9B,'33mMessage',$9B,'0m: Old boot will %sbe execute!',10,10,0
  1330. TxInfoNOT       dc.b    'not ',0
  1331.  
  1332. TxMessage       dc.b    $9B,'33mMessage',$9B,'0m: %ld blocks (%ld bytes) installed',10,0
  1333. TxThatsAll      dc.b    10,'That`s all for now, bye.',10,10,0
  1334.  
  1335. TxDevErr        dc.b    7,$9B,'33mError',$9B,'0m: Drive not available',10,10,7,0
  1336. TxFileErr       dc.b    7,$9B,'33mError',$9B,'0m: Can`t open ',$22,'%s',$22,10,10,7,0
  1337. TxBadOffset     dc.b    7,$9B,'33mError',$9B,'0m: Bad track/blocknumber',10,10,7,0
  1338. TxMemOut        dc.b    10,7,$9B,'33mError',$9B,'0m: Out of memory',10,10,7,0
  1339. TxNoDisk        dc.b    10,7,$9B,'33mError',$9B,'0m: No disk in drive',10,10,7,0
  1340. TxDiskPro       dc.b    10,7,$9B,'33mError',$9B,'0m: Disk is write protected',10,10,7,0
  1341. TxNoBT          dc.b    10,7,$9B,'33mError',$9B,'0m: Not a BootTwister installed disk',10,10,7,0
  1342. TxDiskErr       dc.b    10,7,$9B,'33mError',$9B,'0m: Fatal TD_IOERR %ld occurred',10,10,7,0
  1343.  
  1344.                 cnop    0,4
  1345.  
  1346.  
  1347. *****************************************************************
  1348. ******** Boot-Routine für BootTwister mit Standart-Boot *********
  1349. *****************************************************************
  1350.  
  1351.                 RsReset
  1352. bb_IOReply      rs.l    8
  1353. bb_StdIOReq     rs.b    48
  1354. bb_BufLen       rs.l    1
  1355. bb_Buffer       rs.l    1
  1356. bb_SIZEOF       rs.w    0
  1357.  
  1358. BT_BB           dc.l    $444F5300       ;00 DOS0
  1359.                 dc.l    $00000000       ;04 CheckSum
  1360.                 dc.l    $00000370       ;08 RootBlock
  1361.  
  1362.                 bra.s   BB_Start        ;12
  1363.  
  1364.                 cnop    0,4
  1365.  
  1366. bb_Offset       dc.l    1024            ;16 CMD_READ Offset (Def.1024)
  1367. bb_PicLen       dc.l    0               ;20 Länge des Bildes
  1368. bb_ModLen       dc.l    0               ;24 Länge des Modules (auch Flag)
  1369. bb_BlkLen       dc.l    0               ;28 Länge der zu lesenden Bytes
  1370. bb_ExecBB       dc.l    0               ;32 Flag ob BB ausgeführt wird
  1371. bb_ID           dc.b    'BT98'          ;36 BT-Markierung
  1372.  
  1373. BB_Start        lea     bb_ExpLib(pc),a1
  1374.                 moveq   #37,d0
  1375.                 LIB     OpenLibrary
  1376.                 tst.l   d0
  1377.                 beq.s   .no_explib
  1378.                 movea.l d0,a1
  1379.                 bset    #6,34(a1)
  1380.                 LIB     CloseLibrary
  1381. .no_explib      lea     bb_DosLib(pc),a1
  1382.                 LIB     FindResident
  1383.                 tst.l   d0
  1384.                 beq.s   .not_found
  1385.                 movea.l d0,a0
  1386.                 movea.l 22(a0),a0
  1387.                 moveq   #0,d0
  1388.                 bra.s   BB              ;Boot-Program ausführen
  1389. .not_found      moveq   #-1,d0
  1390.                 rts
  1391.  
  1392. BB              movem.l d0-d7/a0-a6,-(sp)
  1393.  
  1394.                 move.w  #0,$DFF180      ;Display schwarz
  1395.  
  1396.                 moveq   #bb_SIZEOF,d0
  1397.                 lea     bb_BlkLen(pc),a3
  1398.                 add.l   (a3),d0
  1399.                 move.l  #$10003,d1
  1400.                 LIB     AllocMem
  1401.                 tst.l   d0
  1402.                 beq     BB_End
  1403.                 movea.l d0,a5
  1404.                 move.l  (a3),bb_BufLen(a5)
  1405.  
  1406. BB_OpenDev      suba.l  a1,a1
  1407.                 LIB     FindTask
  1408.                 lea     bb_IOReply(a5),a2
  1409.                 move.l  d0,16(a2)
  1410.                 lea     bb_StdIOReq(a5),a1
  1411.                 move.l  a2,14(a1)
  1412.                 lea     bb_TrkDev(pc),a0
  1413.                 moveq   #0,d0                   ;Laufwerk immer DF0:
  1414.                 moveq   #0,d1
  1415.                 LIB     OpenDevice
  1416.                 lea     bb_Buffer(a5),a3
  1417.                 move.w  #CMD_READ,io_Command(a1)
  1418.                 lea     bb_BlkLen(pc),a0
  1419.                 move.l  (a0),io_Length(a1)
  1420.                 move.l  a3,io_Data(a1)
  1421.                 lea     bb_Offset(pc),a0
  1422.                 move.l  (a0),io_Offset(a1)
  1423.                 LIB     DoIO
  1424.                 tst.b   io_Error(a1)
  1425.                 beq.s   .1
  1426.                 bra.s   BB_Finish
  1427. .1              bsr.s   BB_MotorOFF
  1428.  
  1429.                 movem.l a0-a6/d0-d7,-(sp)
  1430.                 adda.l  #PM_LEN+1024,a3         ;Iff/Mod/BB-Routine übspr.
  1431.                 movea.l a3,a0                   ;Adr. Pic
  1432.                 lea     bb_PicLen(pc),a2
  1433.                 move.l  (a2),d0                 ;Byt. Pic
  1434.                 lea     bb_ModLen(pc),a2
  1435.                 move.l  (a2),d1                 ;Byt. Mod
  1436.                 movea.l a3,a1
  1437.                 adda.l  d0,a1                   ;Adr. Mod
  1438.                 jsr     bb_Buffer+1024(a5)      ;Alten BB überspringen
  1439.                 movem.l (sp)+,a0-a6/d0-d7
  1440.  
  1441. BB_ExeBoot      lea     bb_ExecBB(pc),a0        ;Test ob alt. BB ausführen
  1442.                 tst.l   (a0)
  1443.                 beq.s   BB_Finish               ;Nein
  1444.                 movem.l a0-a6,-(sp)
  1445.                 jsr     bb_Buffer+12(a5)        ;Alt. BB ausführen
  1446.                 movem.l (sp)+,a0-a6
  1447.  
  1448. BB_Finish       bsr.s   BB_MotorOFF
  1449.                 LIB     CloseDevice
  1450.  
  1451.                 movea.l a5,a1
  1452.                 moveq   #bb_SIZEOF,d0
  1453.                 add.l   bb_BufLen(a5),d0
  1454.                 LIB     FreeMem
  1455.  
  1456. BB_End          movem.l (sp)+,d0-d7/a0-a6
  1457.                 rts
  1458.  
  1459. BB_MotorOFF     lea     bb_StdIOReq(a5),a1
  1460.                 move.w  #TD_SEEK,io_Command(a1)
  1461.                 clr.l   io_Length(a1)
  1462.                 LIB     DoIO
  1463.                 move.w  #TD_MOTOR,io_Command(a1)
  1464.                 clr.l   io_Length(a1)
  1465.                 LAB     DoIO
  1466.  
  1467. bb_DosLib       dc.b    'dos.library',0
  1468. bb_ExpLib       dc.b    'expansion.library',0
  1469. bb_TrkDev       dc.b    'trackdisk.device',0
  1470.                 dcb.b   15,0
  1471. bb_Mess         dc.b    'BootTwister'
  1472.                 VER
  1473.                 dc.b    '(c) by Testaware '
  1474.                 dc.b    '- This boot is NOT a Virus!!!'
  1475.  
  1476.                 cnop    0,4
  1477.  
  1478. BB_LEN          equ     *-BT_BB
  1479.  
  1480.  
  1481. *****************************************************************
  1482. ********** Show IFF- / Play Mod-Routine für BootTwister *********
  1483. *****************************************************************
  1484.  
  1485. ;Macros für BT-ShowIff / PlayMod
  1486.  
  1487. PM_INT          MACRO
  1488.                 movea.l pm_IntBase(a5),a6
  1489.                 jsr     _LVO\1(a6)
  1490.                 ENDM
  1491.  
  1492. PM_GFX          MACRO
  1493.                 movea.l pm_GfxBase(a5),a6
  1494.                 jsr     _LVO\1(a6)
  1495.                 ENDM
  1496.  
  1497.  
  1498. ;ShowIFF/PlayMOD spezifische Struktur
  1499.  
  1500.                 RsReset
  1501. pm_IntBase      rs.l    1
  1502. pm_GfxBase      rs.l    1
  1503. pm_PicBuf       rs.l    1
  1504. pm_PicLen       rs.l    1
  1505. pm_PicUpkLen    rs.l    1
  1506. pm_ModBuf       rs.l    1
  1507. pm_ModLen       rs.l    1
  1508. pm_ModUpkLen    rs.l    1
  1509. pm_ModPlay      rs.l    1
  1510. pm_PackBuf      rs.l    1
  1511. pm_PackLen      rs.l    1
  1512. pm_UnpackBuf    rs.l    1
  1513. pm_UnpackLen    rs.l    1
  1514. pm_NewWind      rs.l    nw_SIZE
  1515. pm_WindPtr      rs.l    1
  1516. pm_NewScrn      rs.b    ns_SIZEOF
  1517. pm_ScrnPtr      rs.l    1
  1518. pm_PlanPtr      rs.l    8
  1519. pm_Palette      rs.l    1
  1520. pm_OwnMouse     rs.b    16*16
  1521. pm_PkMode       rs.l    1
  1522.  
  1523.  
  1524. ;Struktur für mt_PlayRoutine
  1525.  
  1526. mt_module       rs.l    1
  1527. mt_partnote     rs.l    1
  1528. mt_partnrplay   rs.l    1
  1529. mt_counter      rs.l    1
  1530. mt_partpoint    rs.l    1
  1531. mt_samples      rs.l    1
  1532. mt_sample1      rs.l    $1F
  1533. mt_sixpack      rs.l    1
  1534. mt_maxpart      rs.w    1
  1535. mt_dmacon       rs.w    1
  1536. mt_status       rs.w    1
  1537. mt_type         rs.w    1
  1538. pm_SIZEOF       rs.w    0
  1539.  
  1540. PKMODE_NORMAL           equ     0       ;Unkomprimiert
  1541. PKMODE_COMPRESSED       equ     1       ;Komprimiert
  1542. PKMODE_AMIGABASIC       equ     2       ;AmigaBASIC BitMap
  1543.  
  1544.  
  1545. * -----------------------------------
  1546. * BootTwister ShowIFF/PlayMOD-Routine
  1547. *
  1548. * In: A0 = Adresse von Pic
  1549. *     A1 = Adresse von Mod
  1550. *     D0 = Größe in Bytes von Pic
  1551. *     D1 = Größe in Bytes von Mod
  1552. * -----------------------------------
  1553. *
  1554. BT_PM           movem.l a0/a1/d0/d1,-(sp)
  1555.                 move.l  #pm_SIZEOF,d0
  1556.                 move.l  #$10003,d1
  1557.                 EXE     AllocMem
  1558.                 move.l  d0,d2
  1559.                 movem.l (sp)+,a0/a1/d0/d1
  1560.                 tst.l   d2
  1561.                 ble     PM_Error
  1562.                 movea.l d2,a5
  1563.  
  1564.                 move.l  a0,pm_PicBuf(a5)
  1565.                 move.l  d0,pm_PicLen(a5)
  1566.                 move.l  a1,pm_ModBuf(a5)
  1567.                 move.l  d1,pm_ModLen(a5)
  1568.  
  1569.                 lea     pm_IntLib(pc),a1
  1570.                 moveq   #0,d0
  1571.                 LIB     OpenLibrary
  1572.                 move.l  d0,pm_IntBase(a5)
  1573.                 lea     pm_GfxLib(pc),a1
  1574.                 moveq   #0,d0
  1575.                 LIB     OpenLibrary
  1576.                 move.l  d0,pm_GfxBase(a5)
  1577.  
  1578.                 movea.l pm_PicBuf(a5),a0                ;Gepackter Buffer
  1579.                 move.l  pm_PicLen(a5),d0                ;Gepackte Byte-Größe
  1580.                 bsr     PM_Decrunch                     ;Entpacken
  1581.                 bne.s   PM_Finish                       ;Wenn Fehler Ende!
  1582.                 move.l  pm_UnpackLen(a5),pm_PicLen(a5)  ;Entpackte Byte-Größe
  1583.                 move.l  pm_UnpackBuf(a5),d0
  1584.                 cmp.l   pm_PicBuf(a5),d0                ;Gleiche Adresse?
  1585.                 beq.s   .1                              ;Nein! Entpackt!
  1586.                 move.l  pm_UnpackLen(a5),pm_PicUpkLen(a5)
  1587. .1              move.l  pm_UnpackBuf(a5),pm_PicBuf(a5)  ;Bilddaten
  1588.  
  1589.                 movea.l pm_ModBuf(a5),a0
  1590.                 move.l  pm_ModLen(a5),d0
  1591.                 beq.s   .3                              ;Kein Module abspielen
  1592.                 bsr     PM_Decrunch
  1593.                 bne.s   PM_Finish
  1594.                 move.l  pm_UnpackLen(a5),pm_ModLen(a5)
  1595.                 move.l  pm_UnpackBuf(a5),d0
  1596.                 cmp.l   pm_ModBuf(a5),d0
  1597.                 beq.s   .2
  1598.                 move.l  pm_UnpackLen(a5),pm_ModUpkLen(a5)
  1599. .2              move.l  pm_UnpackBuf(a5),pm_ModBuf(a5)
  1600.  
  1601. .3              bsr.s   PM_ShowIff
  1602.  
  1603.  
  1604. * --------------------------------------------------------
  1605. * Alle geöffneten Libraries schließen und Programm beenden
  1606. * --------------------------------------------------------
  1607. *
  1608. PM_Finish       movea.l pm_IntBase(a5),a1
  1609.                 EXE     CloseLibrary
  1610.                 movea.l pm_GfxBase(a5),a1
  1611.                 LIB     CloseLibrary
  1612.  
  1613.                 move.l  pm_PicUpkLen(a5),d0
  1614.                 beq.s   .1
  1615.                 movea.l pm_PicBuf(a5),a1
  1616.                 LIB     FreeMem
  1617.  
  1618. .1              move.l  pm_ModUpkLen(a5),d0
  1619.                 beq.s   .2
  1620.                 movea.l pm_ModBuf(a5),a1
  1621.                 LIB     FreeMem
  1622.  
  1623. .2              movea.l a5,a1
  1624.                 move.l  #pm_SIZEOF,d0
  1625.                 LAB     FreeMem
  1626.  
  1627.  
  1628. * ----------------------------------
  1629. * Zeige das IFF - Format (ILBM/ACBM)
  1630. * ----------------------------------
  1631. *
  1632. PM_ShowIff      movea.l pm_PicBuf(a5),a1        ;Datei-Buffer global in A1
  1633.                 cmpi.l  #'BMHD',12(a1)          ;IFF - Grafikformat?
  1634.                 bne     PM_Error                ;Nein!
  1635.  
  1636. chunk0          lea     16(a1),a1               ;ID_BMHD überspringen
  1637.                 lea     pm_NewScrn(a5),a0
  1638.                 move.w  4(a1),ns_Width(a0)
  1639.                 move.w  6(a1),ns_Height(a0)
  1640.                 move.b  12(a1),ns_Depth+1(a0)
  1641.                 move.b  14(a1),pm_PkMode(a5)    ;Kompressionsflag
  1642.                 clr.w   ns_ViewModes(a0)        ;Def. ViewMode installieren
  1643.                 cmpi.w  #320,ns_Width(a0)
  1644.                 bls.s   .1
  1645.                 ori.w   #V_HIRES,ns_ViewModes(a0)
  1646. .1              cmpi.w  #256,ns_Height(a0)
  1647.                 bls.s   .2
  1648.                 ori.w   #V_LACE,ns_ViewModes(a0)
  1649. .2              adda.l  (a1)+,a1
  1650.  
  1651. chunk1          cmpi.l  #'CMAP',(a1)
  1652.                 bne.s   chunk2
  1653.                 lea     4(a1),a2                ;Farbtabelle -> A2
  1654.                 move.l  a2,pm_Palette(a5)
  1655.                 cmp.l   #$C0,(a2)               ;HAM-Modus?
  1656.                 bne.s   chunk2                  ;Nein!
  1657.                 ori.w   #V_HAM,ns_ViewModes(a0) ;HAM-Flag einblenden
  1658.  
  1659. chunk2          cmpi.l  #'CAMG',(a1)
  1660.                 bne.s   chunk3
  1661.                 move.w  10(a1),ns_ViewModes(a0)
  1662.  
  1663. chunk3          cmpi.l  #'ABIT',(a1)            ;Etwa das AmigaBASIC Format?
  1664.                 bne.s   chunk4                  ;Nein!
  1665.                 move.b  #PKMODE_AMIGABASIC,pm_PkMode(a5)
  1666.                 lea     4(a1),a1                ;Zeiger auf Chunk-Größe
  1667.                 bra.s   PM_ViewIff              ;Grafik zeigen
  1668.  
  1669. chunk4          cmpi.l  #'BODY',(a1)+           ;Normales IFF-Format?
  1670.                 beq.s   PM_ViewIff              ;Ja!
  1671.                 adda.l  (a1)+,a1                ;Zeiger auf nächsten Chunk
  1672.                 bra.s   chunk1                  ;Weiter suchen
  1673.  
  1674. PM_ViewIff      lea     4(a1),a4                ;Zeiger auf Gfxdaten -> A4
  1675.  
  1676.                 bsr     PM_OpenScrn             ;IFF-Screen öffnen
  1677.                 bne     PM_Error                ;Wenn Fehler dann Ende!
  1678.  
  1679.                 movea.l pm_ScrnPtr(a5),a3
  1680.                 lea     sc_BitMap(a3),a3
  1681.  
  1682.                 cmpi.b  #PKMODE_NORMAL,pm_PkMode(a5)
  1683.                 beq.s   PM_NormIff
  1684.                 cmpi.b  #PKMODE_COMPRESSED,pm_PkMode(a5)
  1685.                 beq.s   PM_PackIff
  1686.                 cmpi.b  #PKMODE_AMIGABASIC,pm_PkMode(a5)
  1687.                 beq.s   PM_AbasIff
  1688.  
  1689. PM_NormIff      moveq.l #0,d3
  1690.                 move.w  bm_BytesPerRow(a3),d5
  1691.                 move.w  bm_Rows(a3),d6
  1692.                 ext.l   d5
  1693. .1              moveq.l #bm_Planes,d4
  1694. .2              move.l  (a3,d4.l),d0
  1695.                 beq.s   .3
  1696.                 movea.l a4,a0
  1697.                 add.l   d3,d0
  1698.                 movea.l d0,a1
  1699.                 move.l  d5,d0
  1700.                 EXE     CopyMem
  1701.                 adda.l  d5,a4
  1702.                 addq.l  #4,d4
  1703.                 bra.s   .2
  1704. .3              subq.w  #1,d6
  1705.                 beq.s   PM_SetCols
  1706.                 add.l   d5,d3
  1707.                 bra.s   .1
  1708.  
  1709. PM_PackIff      lea     bm_Planes(a3),a0
  1710.                 lea     pm_PlanPtr(a5),a1
  1711. .1              move.l  (a0)+,(a1)+             ;BitMap Zeiger kopieren
  1712.                 bne.s   .1
  1713.                 move.w  bm_Rows(a3),d6
  1714. .2              move.b  bm_Depth(a3),d5
  1715.                 lea     pm_PlanPtr(a5),a1
  1716. .3              movea.l (a1),a0
  1717.                 move.w  bm_BytesPerRow(a3),d2
  1718. .4              move.b  (a4)+,d0
  1719.                 bmi.s   .6
  1720. .5              move.b  (a4)+,(a0)+
  1721.                 subq.w  #1,d2
  1722.                 subq.b  #1,d0
  1723.                 bpl.s   .5
  1724.                 bra.s   .8
  1725. .6              neg.b   d0
  1726.                 bmi.s   .4
  1727.                 move.b  (a4)+,d3
  1728. .7              move.b  d3,(a0)+
  1729.                 subq.w  #1,d2
  1730.                 subq.b  #1,d0
  1731.                 bpl.s   .7
  1732. .8              tst.w   d2
  1733.                 bne.s   .4
  1734.                 move.l  a0,(a1)+
  1735.                 subq.b  #1,d5                   ;bm_Depth-1
  1736.                 bne.s   .3
  1737.                 subq.w  #1,d6                   ;bm_Rows-1
  1738.                 bne.s   .2
  1739.                 bra.s   PM_SetCols
  1740.  
  1741. PM_AbasIff      move.w  bm_BytesPerRow(a3),d7
  1742.                 mulu    bm_Rows(a3),d7          ;Größe der Planes -> D7
  1743.                 lea     bm_Planes(a3),a2
  1744. .1              movea.l a4,a0                   ;Zeiger Grafikdaten
  1745.                 move.l  (a2)+,d0                ;Zeiger BitPlane
  1746.                 beq.s   PM_SetCols              ;Keine weitere Plane
  1747.                 movea.l d0,a1
  1748.                 move.l  d7,d0
  1749.                 EXE     CopyMem
  1750.                 adda.l  d7,a4
  1751.                 bra.s   .1
  1752.  
  1753. PM_SetCols      movea.l pm_Palette(a5),a2
  1754.                 move.l  (a2)+,d7
  1755.                 divu    #3,d7
  1756.                 moveq.l #0,d6
  1757. .1              movea.l pm_ScrnPtr(a5),a0
  1758.                 lea     sc_ViewPort(a0),a0
  1759.                 move.l  d6,d0
  1760.                 moveq.l #0,d1
  1761.                 move.b  (a2)+,d1
  1762.                 lsr.b   #4,d1
  1763.                 moveq.l #0,d2
  1764.                 move.b  (a2)+,d2
  1765.                 lsr.b   #4,d2
  1766.                 moveq.l #0,d3
  1767.                 move.b  (a2)+,d3
  1768.                 lsr.b   #4,d3
  1769.                 PM_GFX  SetRGB4
  1770.                 addq.l  #1,d6
  1771.                 dbf     d7,.1
  1772.                 bra.s   PM_WaitScrn
  1773.  
  1774.  
  1775. * ---------------------------------------
  1776. * Screen/Window öffnen bzw. Warteschleife
  1777. * ---------------------------------------
  1778. *
  1779. PM_OpenScrn     lea     pm_NewScrn(a5),a0
  1780.                 move.w  #CUSTOMSCREEN|SCREENQUIET,ns_Type(a0)
  1781.                 PM_INT  OpenScreen
  1782.                 move.l  d0,pm_ScrnPtr(a5)
  1783.                 beq     PM_Error
  1784.  
  1785.                 bsr     PM_ColsOff
  1786.  
  1787.                 lea     pm_NewWind(a5),a0
  1788.                 lea     pm_NewScrn(a5),a1
  1789.                 move.w  ns_Width(a1),nw_Width(a0)
  1790.                 move.w  ns_Height(a1),nw_Height(a0)
  1791.                 move.l  #ACTIVATE,nw_Flags(a0)
  1792.                 move.l  pm_ScrnPtr(a5),nw_Screen(a0)
  1793.                 move.w  #CUSTOMSCREEN,nw_Type(a0)
  1794.                 PM_INT  OpenWindow
  1795.                 move.l  d0,pm_WindPtr(a5)
  1796.                 beq.s   .1
  1797.                 bsr     PM_MouseOFF
  1798.                 bra     PM_OK
  1799. .1              bsr.s   PM_CloseScrn
  1800.                 bra     PM_Error
  1801.  
  1802. PM_WaitScrn     tst.l   pm_ModLen(a5)           ;Module vorhanden?
  1803.                 beq.s   .1                      ;Nein!
  1804.                 movea.l pm_ModBuf(a5),a0        ;Ja!
  1805.                 bsr     mt_init                 ;Module initialisieren
  1806. .1              tst.l   pm_ModLen(a5)           ;Module vorhanden?
  1807.                 beq.s   .2                      ;Nein!
  1808.                 bsr     mt_music                ;Module spielen
  1809. .2              PM_GFX  WaitTOF                 ;Synchronisation
  1810.                 btst    #6,$BFE001              ;Linke Maustaste?
  1811.                 bne.s   .1                      ;Nein!
  1812.                 tst.l   pm_ModLen(a5)           ;Module vorhanden?
  1813.                 beq.s   .3                      ;Nein!
  1814.                 bsr     mt_end                  ;Module freigeben
  1815. .3              bsr.s   PM_ColsOff              ;Alle Farben aus
  1816.  
  1817. PM_CloseWin     bsr.s   PM_MouseON
  1818.                 movea.l pm_WindPtr(a5),a0
  1819.                 LIB     CloseWindow
  1820.  
  1821. PM_CloseScrn    movea.l pm_ScrnPtr(a5),a0
  1822.                 LIB     ScreenToBack
  1823.                 movea.l pm_ScrnPtr(a5),a0
  1824.                 LIB     CloseScreen
  1825.                 moveq   #10,d7
  1826.                 bsr.s   PM_WaitVBL
  1827.  
  1828.                 bra     PM_OK
  1829.  
  1830.  
  1831. * --------------------------------------------
  1832. * Farben des Screens auf NULL setzen (schwarz)
  1833. * --------------------------------------------
  1834. *
  1835. PM_ColsOff      movea.l pm_Palette(a5),a2
  1836.                 move.l  (a2)+,d7
  1837.                 divu    #3,d7
  1838.                 cmpi.l  #31,d7
  1839.                 bgt.s   .1
  1840.                 moveq   #31,d7
  1841. .1              moveq.l #0,d6
  1842. .2              movea.l pm_ScrnPtr(a5),a0
  1843.                 lea     sc_ViewPort(a0),a0
  1844.                 move.l  d6,d0           ;Farbregister
  1845.                 moveq   #0,d1           ;R
  1846.                 moveq   #0,d2           ;G
  1847.                 moveq   #0,d3           ;B
  1848.                 PM_GFX  SetRGB4         ;Schwarz
  1849.                 addq.l  #1,d6
  1850.                 dbf     d7,.2
  1851.                 moveq   #25,d7
  1852.  
  1853.  
  1854. * -------------------------------------
  1855. * Warten auf Rasterstrahl-Position oben
  1856. *
  1857. * D7 <= Anzahl VBL's
  1858. * -------------------------------------
  1859. *
  1860. PM_WaitVBL      PM_GFX  WaitTOF
  1861.                dbf     d7,PM_WaitVBL
  1862.                rts
  1863.  
  1864.  
  1865. * -------------------------------
  1866. * Mauszeiger aus- bzw. anschalten
  1867. * -------------------------------
  1868. *
  1869. PM_MouseOFF     movea.l pm_WindPtr(a5),a0
  1870.                lea     pm_OwnMouse(a5),a1
  1871.                moveq   #0,d0
  1872.                moveq   #0,d1
  1873.                moveq   #0,d2
  1874.                moveq   #0,d3
  1875.                PM_INT  SetPointer
  1876.                rts
  1877.  
  1878. PM_MouseON      movea.l pm_WindPtr(a5),a0
  1879.                PM_INT  ClearPointer
  1880.                rts
  1881.  
  1882.  
  1883. * -----------------------------
  1884. * SoundTracker-Format abspielen
  1885. *
  1886. * In: A0 = Zeiger auf Module
  1887. * -----------------------------
  1888. *
  1889. mt_init         bset    #1,$BFE001
  1890.                move.l  a0,mt_module(a5)
  1891.                move.l  #6,mt_sixpack(a5)
  1892.                clr.w   mt_type(a5)
  1893.                cmp.b   #'x',$1D7(a0)
  1894.                beq.s   mt_old
  1895.                move.w  #-1,mt_type(a5)
  1896. mt_old          lea     $01D8(a0),a0
  1897.                tst.w   mt_type(a5)
  1898.                beq.s   mt_old2
  1899.                lea     $01E0(a0),a0
  1900. mt_old2         move.l  #$0080,d0
  1901.                moveq   #0,d1
  1902. mt_init1        move.l  d1,d2
  1903.                subq.w  #1,d0
  1904. mt_init2        move.b  (a0)+,d1
  1905.                cmp.b   d2,d1
  1906.                bgt.s   mt_init1
  1907.                dbf     d0,mt_init2
  1908.                addq.b  #1,d2
  1909. mt_init3        movea.l mt_module(a5),a0
  1910.                lea     mt_sample1(a5),a1
  1911.                asl.l   #$0008,d2
  1912.                asl.l   #$0002,d2
  1913.                add.l   #$0258,d2
  1914.                moveq   #$000E,d0
  1915.                tst.w   mt_type(a5)
  1916.                beq.s   mt_old3
  1917.                add.l   #$01E4,d2
  1918.                moveq   #$001E,d0
  1919. mt_old3         add.l   a0,d2
  1920. mt_init4        move.l  d2,(a1)+
  1921.                moveq   #0,d1
  1922.                move.w  42(a0),d1
  1923.                asl.l   #1,d1
  1924.                add.l   d1,d2
  1925.                lea     $001E(a0),a0
  1926.                dbf     d0,mt_init4
  1927.                lea     mt_sample1(a5),a0
  1928.                moveq   #0,d0
  1929. mt_clear        movea.l (a0,d0),a1
  1930.                clr.l   (a1)
  1931.                addq.l  #4,d0
  1932.                cmp.l   #$003C,d0
  1933.                blo.s   mt_clear
  1934.                tst.w   mt_type(a5)
  1935.                beq.s   mt_old4
  1936.                cmp.l   #$007C,d0
  1937.                blo.s   mt_clear
  1938. mt_old4         clr.w   $DFF0A8
  1939.                clr.w   $DFF0B8
  1940.                clr.w   $DFF0C8
  1941.                clr.w   $DFF0D8
  1942.                clr.l   mt_partnrplay(a5)
  1943.                clr.l   mt_partnote(a5)
  1944.                clr.l   mt_partpoint(a5)
  1945.                movea.l mt_module(a5),a0
  1946.                move.b  $01D6(a0),d0
  1947.                tst.w   mt_type(a5)
  1948.                beq.s   mt_old5
  1949.                move.b  $03B6(a0),d0
  1950. mt_old5         move.b  d0,mt_maxpart+1(a5)
  1951.                rts
  1952. mt_end          clr.w   $DFF0A8
  1953.                clr.w   $DFF0B8
  1954.                clr.w   $DFF0C8
  1955.                clr.w   $DFF0D8
  1956.                move.w  #$000F,$DFF096
  1957.                rts
  1958. mt_music        addq.l  #1,mt_counter(a5)
  1959.                move.l  mt_sixpack(a5),d0
  1960.                cmp.l   mt_counter(a5),d0
  1961.                bne.s   mt_notsix
  1962.                clr.l   mt_counter(a5)
  1963.                bra     mt_rout2
  1964. mt_notsix       lea     mt_aud1temp(pc),a6
  1965.                tst.b   3(a6)
  1966.                beq.s   mt_arp1
  1967.                lea     $DFF0A0,a4
  1968.                bsr.s   mt_arprout
  1969. mt_arp1         lea     mt_aud2temp(pc),a6
  1970.                tst.b   3(a6)
  1971.                beq.s   mt_arp2
  1972.                lea     $DFF0B0,a4
  1973.                bsr.s   mt_arprout
  1974. mt_arp2         lea     mt_aud3temp(pc),a6
  1975.                tst.b   3(a6)
  1976.                beq.s   mt_arp3
  1977.                lea     $DFF0C0,a4
  1978.                bsr.s   mt_arprout
  1979. mt_arp3         lea     mt_aud4temp(pc),a6
  1980.                tst.b   3(a6)
  1981.                beq.s   mt_arp4
  1982.                lea     $DFF0D0,a4
  1983.                bra.s   mt_arprout
  1984. mt_arp4         rts
  1985. mt_arprout      move.b  2(a6),d0
  1986.                and.b   #$000F,d0
  1987.                tst.b   d0
  1988.                beq.s   mt_arpegrt
  1989.                cmp.b   #1,d0
  1990.                beq.s   mt_portup
  1991.                cmp.b   #2,d0
  1992.                beq.s   mt_portdwn
  1993.                rts
  1994. mt_portup       moveq   #0,d0
  1995.                move.b  3(a6),d0
  1996.                sub.w   d0,22(a6)
  1997.                cmp.w   #$0071,22(a6)
  1998.                bpl.s   mt_ok1
  1999.                move.w  #$0071,22(a6)
  2000. mt_ok1          move.w  22(a6),6(a4)
  2001.                rts
  2002. mt_portdwn      moveq   #0,d0
  2003.                move.b  3(a6),d0
  2004.                add.w   d0,22(a6)
  2005.                cmp.w   #$0358,22(a6)
  2006.                bmi.s   mt_ok2
  2007.                move.w  #$0358,22(a6)
  2008. mt_ok2          move.w  22(a6),6(a4)
  2009.                rts
  2010. mt_arpegrt      cmp.l   #1,mt_counter(a5)
  2011.                beq.s   mt_loop2
  2012.                cmp.l   #2,mt_counter(a5)
  2013.                beq.s   mt_loop3
  2014.                cmp.l   #3,mt_counter(a5)
  2015.                beq.s   mt_loop4
  2016.                cmp.l   #4,mt_counter(a5)
  2017.                beq.s   mt_loop2
  2018.                cmp.l   #5,mt_counter(a5)
  2019.                beq.s   mt_loop3
  2020.                rts
  2021. mt_loop2        moveq   #0,d0
  2022.                move.b  3(a6),d0
  2023.                lsr.b   #4,d0
  2024.                bra.s   mt_cont
  2025. mt_loop3        moveq   #0,d0
  2026.                move.b  3(a6),d0
  2027.                and.b   #$000F,d0
  2028.                bra.s   mt_cont
  2029. mt_loop4        move.w  16(a6),d2
  2030.                bra.s   mt_endpart
  2031. mt_cont         asl.w   #1,d0
  2032.                moveq   #0,d1
  2033.                move.w  16(a6),d1
  2034.                lea     mt_arpeggio(pc),a0
  2035. mt_loop5        move.w  (a0,d0),d2
  2036.                cmp.w   (a0),d1
  2037.                beq.s   mt_endpart
  2038.                addq.l  #2,a0
  2039.                bra.s   mt_loop5
  2040. mt_endpart      move.w  d2,6(a4)
  2041.                rts
  2042. mt_rout2        movea.l mt_module(a5),a0
  2043.                lea     $000C(a0),a3
  2044.                lea     $01D8(a0),a2
  2045.                lea     $0258(a0),a0
  2046.                tst.w   mt_type(a5)
  2047.                beq.s   mt_old6
  2048.                lea     $01E0(a2),a2
  2049.                lea     $01E4(a0),a0
  2050. mt_old6         move.l  mt_partnrplay(a5),d0
  2051.                moveq   #0,d1
  2052.                move.b  (a2,d0),d1
  2053.                asl.l   #$0008,d1
  2054.                asl.l   #$0002,d1
  2055.                add.l   mt_partnote(a5),d1
  2056.                move.l  d1,mt_partpoint(a5)
  2057.                clr.w   mt_dmacon(a5)
  2058.                lea     $DFF0A0,a4
  2059.                lea     mt_aud1temp(pc),a6
  2060.                bsr     mt_playit
  2061.                lea     $DFF0B0,a4
  2062.                lea     mt_aud2temp(pc),a6
  2063.                bsr     mt_playit
  2064.                lea     $DFF0C0,a4
  2065.                lea     mt_aud3temp(pc),a6
  2066.                bsr     mt_playit
  2067.                lea     $DFF0D0,a4
  2068.                lea     mt_aud4temp(pc),a6
  2069.                bsr     mt_playit
  2070.                move.w  #$01F4,d0
  2071. mt_rls          dbf     d0,mt_rls
  2072.                move.w  #$8000,d0
  2073.                or.w    mt_dmacon(a5),d0
  2074.                move.w  d0,$DFF096
  2075.                lea     mt_aud4temp(pc),a6
  2076.                cmp.w   #1,14(a6)
  2077.                bne.s   mt_voice3
  2078.                move.l  10(a6),$DFF0D0
  2079.                move.w  #1,$DFF0D4
  2080. mt_voice3       lea     mt_aud3temp(pc),a6
  2081.                cmp.w   #1,14(a6)
  2082.                bne.s   mt_voice2
  2083.                move.l  10(a6),$DFF0C0
  2084.                move.w  #1,$DFF0C4
  2085. mt_voice2       lea     mt_aud2temp(pc),a6
  2086.                cmp.w   #1,14(a6)
  2087.                bne.s   mt_voice1
  2088.                move.l  10(a6),$DFF0B0
  2089.                move.w  #1,$DFF0B4
  2090. mt_voice1       lea     mt_aud1temp(pc),a6
  2091.                cmp.w   #1,14(a6)
  2092.                bne.s   mt_voice0
  2093.                move.l  10(a6),$DFF0A0
  2094.                move.w  #1,$DFF0A4
  2095. mt_voice0       move.l  mt_partnote(a5),d0
  2096.                add.l   #$0010,d0
  2097.                move.l  d0,mt_partnote(a5)
  2098.                cmp.l   #$0400,d0
  2099.                bne.s   mt_stop
  2100. mt_higher       clr.l   mt_partnote(a5)
  2101.                addq.l  #1,mt_partnrplay(a5)
  2102.                moveq   #0,d0
  2103.                move.w  mt_maxpart(a5),d0
  2104.                move.l  mt_partnrplay(a5),d1
  2105.                cmp.l   d0,d1
  2106.                bne.s   mt_stop
  2107.                clr.l   mt_partnrplay(a5)
  2108. mt_stop         tst.w   mt_status(a5)
  2109.                beq.s   mt_stop2
  2110.                clr.w   mt_status(a5)
  2111.                bra.s   mt_higher
  2112. mt_stop2        rts
  2113. mt_playit       move.l  (a0,d1),(a6)
  2114.                addq.l  #4,d1
  2115.                moveq   #0,d2
  2116.                tst.w   mt_type(a5)
  2117.                beq.s   mt_old7
  2118.                move.b  (a6),d2
  2119.                and.b   #$000F,(a6)
  2120.                lsl.w   #4,d2
  2121. mt_old7         move.b  2(a6),d2
  2122.                lsr.w   #4,d2
  2123.                tst.b   d2
  2124.                beq.s   mt_nosamplchan
  2125.                moveq   #0,d3
  2126.                lea     mt_samples(a5),a1
  2127.                move.l  d2,d4
  2128.                asl.l   #2,d2
  2129.                mulu    #$001E,d4
  2130.                move.l  (a1,d2),4(a6)
  2131.                move.w  (a3,d4),8(a6)
  2132.                move.w  2(a3,d4),18(a6)
  2133.                move.w  4(a3,d4),d3
  2134.                tst.w   d3
  2135.                beq.s   mt_displace
  2136.                move.l  4(a6),d2
  2137.                add.l   d3,d2
  2138.                move.l  d2,4(a6)
  2139.                move.l  d2,10(a6)
  2140.                move.w  6(a3,d4),8(a6)
  2141.                move.w  6(a3,d4),14(a6)
  2142.                move.w  18(a6),8(a4)
  2143.                bra.s   mt_nosamplchan
  2144. mt_displace     move.l  4(a6),d2
  2145.                add.l   d3,d2
  2146.                move.l  d2,10(a6)
  2147.                move.w  6(a3,d4),14(a6)
  2148.                move.w  18(a6),8(a4)
  2149. mt_nosamplchan  tst.w   (a6)
  2150.                beq.s   mt_retrout
  2151.                move.w  (a6),16(a6)
  2152.                move.w  20(a6),$DFF096
  2153.                move.l  4(a6),(a4)
  2154.                move.w  8(a6),4(a4)
  2155.                move.w  (a6),6(a4)
  2156.                move.w  20(a6),d0
  2157.                or.w    d0,mt_dmacon(a5)
  2158. mt_retrout      tst.w   (a6)
  2159.                beq.s   mt_nonewper
  2160.                move.w  (a6),22(a6)
  2161. mt_nonewper     move.b  2(a6),d0
  2162.                and.b   #$000F,d0
  2163.                cmp.b   #11,d0
  2164.                beq.s   mt_posjmp
  2165.                cmp.b   #12,d0
  2166.                beq.s   mt_setvol
  2167.                cmp.b   #13,d0
  2168.                beq.s   mt_break
  2169.                cmp.b   #14,d0
  2170.                beq.s   mt_setfil
  2171.                cmp.b   #15,d0
  2172.                beq.s   mt_setspeed
  2173.                rts
  2174. mt_posjmp       not.w   mt_status(a5)
  2175.                moveq   #0,d0
  2176.                move.b  3(a6),d0
  2177.                subq.b  #1,d0
  2178.                move.l  d0,mt_partnrplay(a5)
  2179.                rts
  2180. mt_setvol       move.b  3(a6),8(a4)
  2181.                rts
  2182. mt_break        not.w   mt_status(a5)
  2183.                rts
  2184. mt_setfil       moveq   #0,d0
  2185.                move.b  3(a6),d0
  2186.                and.b   #$0001,d0
  2187.                rol.b   #$0001,d0
  2188.                and.b   #$00FD,$BFE001
  2189.                or.b    d0,$BFE001
  2190.                rts
  2191. mt_setspeed     move.b  3(a6),d0
  2192.                and.b   #$000F,d0
  2193.                beq.s   mt_back
  2194.                ext.w   d0
  2195.                ext.l   d0
  2196.                move.l  d0,mt_sixpack(a5)
  2197.                clr.l   mt_counter(a5)
  2198. mt_back         rts
  2199.  
  2200.  
  2201. * ------------------------------------------------
  2202. * Entpacken wenn Daten im PP-Data Format vorliegen
  2203. *
  2204. * In: A0 = Datenbereich
  2205. *     D0 = Byte-Größe
  2206. * ------------------------------------------------
  2207. *
  2208. PM_Decrunch     move.l  a0,pm_PackBuf(a5)
  2209.                move.l  d0,pm_PackLen(a5)
  2210.                move.l  a0,pm_UnpackBuf(a5)     ;Für Default
  2211.                move.l  d0,pm_UnpackLen(a5)
  2212.                cmpi.l  #'PP20',(a0)            ;PP-Data Format?
  2213.                beq.s   .1                      ;Ja!
  2214.                bra     PM_OK                   ;Nein!
  2215. .1              move.l  pm_PackLen(a5),d0
  2216.                move.l  -4(a0,d0.l),d0
  2217.                lsr.l   #8,d0
  2218.                move.l  #$10003,d1
  2219.                move.l  d0,pm_UnpackLen(a5)
  2220.                EXE     AllocMem
  2221.                move.l  d0,pm_UnpackBuf(a5)
  2222.                ble     PM_Error
  2223.                movea.l pm_PackBuf(a5),a0
  2224.                movea.l pm_UnpackBuf(a5),a1
  2225.                move.l  pm_PackLen(a5),d0
  2226.                bsr.s   PpStart
  2227.                clr.w   $DFF180                 ;Farbe 0 = schwarz
  2228.                bra     PM_OK
  2229. PpStart         lea     4(a0),a3
  2230.                adda.l  d0,a0
  2231.                movea.l a1,a2
  2232.                moveq   #1,d5
  2233.                moveq   #3,d6
  2234.                moveq   #7,d7
  2235.                move.l  -(a0),d1
  2236.                tst.b   d1
  2237.                beq.s   .1
  2238.                bsr.s   Pp2
  2239.                subq.b  #1,d1
  2240.                lsr.l   d1,d5
  2241. .1              lsr.l   #8,d1
  2242.                adda.l  d1,a2
  2243. Pp1             bsr.s   Pp2
  2244.                bcs.s   Pp5
  2245.                moveq   #0,d2
  2246. .1              moveq   #1,d0
  2247.                bsr.s   Pp4
  2248.                add.w   d1,d2
  2249.                cmp.w   d6,d1
  2250.                beq.s   .1
  2251. .2              moveq   #7,d0
  2252.                bsr.s   Pp4
  2253.                move.b  d1,-(a2)
  2254.                dbra    d2,.2
  2255.                cmpa.l  a2,a1
  2256.                bcs.s   Pp5
  2257.                rts
  2258. Pp2             lsr.l   #1,d5
  2259.                beq.s   .1
  2260.                rts
  2261. .1              move.l  -(a0),d5
  2262.                roxr.l  #1,d5
  2263.                rts
  2264. Pp3             subq.w  #1,d0
  2265. Pp4             moveq   #0,d1
  2266. .1              lsr.l   #1,d5
  2267.                beq.s   .3
  2268. .2              roxl.l  #1,d1
  2269.                dbra    d0,.1
  2270.                rts
  2271. .3              move.l  -(a0),d5
  2272.                roxr.l  #1,d5
  2273.                bra.s   .2
  2274. Pp5             moveq   #1,d0
  2275.                bsr.s   Pp4
  2276.                moveq   #0,d0
  2277.                move.b  (a3,d1.w),d0
  2278.                move.w  d1,$DFF180              ;Crunch-FX Farbe 0
  2279.                move.w  d1,d2
  2280.                cmp.w   d6,d2
  2281.                bne.s   .3
  2282.                bsr.s   Pp2
  2283.                bcs.s   .1
  2284.                moveq   #7,d0
  2285. .1              bsr.s   Pp3
  2286.                move.w  d1,d3
  2287. .2              moveq   #2,d0
  2288.                bsr.s   Pp4
  2289.                add.w   d1,d2
  2290.                cmp.w   d7,d1
  2291.                beq.s   .2
  2292.                bra.s   .4
  2293. .3              bsr.s   Pp3
  2294.                move.w  d1,d3
  2295. .4              addq.w  #1,d2
  2296. .5              move.b  (a2,d3.w),-(a2)
  2297.                dbra    d2,.5
  2298.                cmpa.l  a2,a1
  2299.                bcs.s   Pp1
  2300.                rts
  2301.  
  2302.  
  2303. * -----------------------
  2304. * Fehler / Ok-Flag setzen
  2305. * -----------------------
  2306. *
  2307. PM_Error        moveq   #-1,d0  ;Fehler!
  2308.                rts
  2309.  
  2310. PM_OK           moveq   #0,d0   ;Alles geklappt!
  2311.                rts
  2312.  
  2313.  
  2314. * -----------------------------------
  2315. * Datenbereich ST-Abspielroutine usw.
  2316. * -----------------------------------
  2317. *
  2318. mt_aud1temp     ds.w    10
  2319.                dc.w    $0001
  2320.                ds.w    2
  2321. mt_aud2temp     ds.w    10
  2322.                dc.w    $0002
  2323.                ds.w    2
  2324. mt_aud3temp     ds.w    10
  2325.                dc.w    $0004
  2326.                ds.w    2
  2327. mt_aud4temp     ds.w    10
  2328.                dc.w    $0008
  2329.                ds.w    2
  2330. mt_arpeggio     dc.w    $0358,$0328,$02fa,$02d0,$02a6,$0280,$025c
  2331.                dc.w    $023a,$021a,$01fc,$01e0,$01c5,$01ac,$0194,$017d
  2332.                dc.w    $0168,$0153,$0140,$012e,$011d,$010d,$00fe,$00f0
  2333.                dc.w    $00e2,$00d6,$00ca,$00be,$00b4,$00aa,$00a0,$0097
  2334.                dc.w    $008f,$0087,$007f,$0078,$0071,$0000,$0000,$0000
  2335.  
  2336. pm_IntLib       dc.b    'intuition.library',0
  2337. pm_GfxLib       dc.b    'graphics.library',0
  2338.  
  2339.                cnop    0,4
  2340.  
  2341. PM_LEN          equ     *-BT_PM
  2342.  
  2343.                END
RAW Paste Data