home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 13 / AACD13.ISO / AACD / Games / WHDLoad / Extra / Patcher1.05dev.lha / Patcher1.05 / PARAMQTX / wotd.imager.asm < prev   
Assembly Source File  |  1998-01-17  |  11KB  |  600 lines

  1. ;this is an example of converting a multidisked game, use of 
  2. ;  cyclenumber in D6, use it as basic structure if all disks 
  3. ;  have the same structure
  4. ;additionally it is one of the more seldom examples of decoding a 
  5. ;  sectorized disk
  6.  
  7.     INCDIR    ASM-ONE:INCLUDE2.0/
  8.  
  9.     INCLUDE    OWN/Patcher.I
  10.     INCLUDE    DEVICES/TRACKDISK.I
  11.     INCLUDE    EXEC/EXEC_LIB.I
  12.     INCLUDE    EXEC/IO.I
  13.     INCLUDE    LIBRARIES/DOS_LIB.I
  14.     INCLUDE    LIBRARIES/FILEHANDLER.I
  15.  
  16.     INCDIR    ASM-ONE:OWN/PATCHER/PARAMQTX/
  17.  
  18.  
  19. HP    MOVEQ.L    #20,D0
  20.     RTS
  21.     DC.L    TAB
  22.     DC.B    'PTCH'
  23.     DC.B    '$VER:Wrath_of_the_Demon_Diskimager_V1.00',0
  24.     EVEN
  25.  
  26. TAB    DC.L    PCH_INIT,INITROUT
  27.     DC.L    PCH_FILECOUNT,4
  28.     DC.L    PCH_ADAPTOR,ADNAME
  29.     DC.L    PCH_DISKNAME,DISKNAMEARRAY
  30.     DC.L    PCH_FILENAME,FILENAMEARRAY
  31.     DC.L    PCH_NAME,PARAMNAME
  32.     DC.L    PCH_DATALENGTH,LENGTHTABLE
  33.     DC.L    PCH_SPECIAL,SPECIALARRAY
  34.     DC.L    PCH_STATE,STATEARRAY
  35.     DC.L    PCH_STATE2,STATEARRAY2
  36.     DC.L    PCH_MINVERSION,VERSNAME        ;minimum version of THE PATCHER
  37.     DC.L    0
  38.  
  39. ;minimum version of the patcher required
  40. VERSNAME    DC.B    'V1.05'        ;MAY NOT CONTAIN HEADING ZEROES
  41.     EVEN                ;MUST CONTAIN 2 NUMBERS AFTER POINT
  42.  
  43.  
  44. ADNAME    DC.B    'Done by Harry.',0
  45.     EVEN
  46.  
  47.  
  48. PARAMNAME
  49.     DC.B    'Wrath of the Demon, Imager for HD-install',0
  50.     EVEN
  51.  
  52.  
  53. DISKNAMEARRAY    DC.L    DISK1NAME
  54.     DC.L    DISK1NAME
  55.     DC.L    DISK1NAME
  56.     DC.L    DISK1NAME
  57.  
  58. DISK1NAME    DC.B    'WrathOfTheDemon',0
  59.     EVEN
  60.  
  61.  
  62. FILENAMEARRAY
  63.     DC.L    FILE1NAME
  64.     DC.L    FILE2NAME
  65.     DC.L    FILE3NAME
  66.     DC.L    FILE4NAME
  67.  
  68. FILE1NAME    DC.B    'disk.1',0
  69.     EVEN
  70. FILE2NAME    DC.B    'disk.2',0
  71.     EVEN
  72. FILE3NAME    DC.B    'disk.3',0
  73.     EVEN
  74. FILE4NAME    DC.B    'disk.4',0
  75.     EVEN
  76.  
  77. LENGTHTABLE
  78.     DC.L    ($a0-1)*$1900
  79.     DC.L    ($a0)*$1900
  80.     DC.L    ($a0)*$1900
  81.     DC.L    ($a0)*$1900
  82.  
  83.  
  84. ;the parameter-initializing opens sourcedevice 
  85. INITROUT
  86.     MOVE.B    #'1',DISKNR        ;set number for display to 1 on init
  87.     MOVE.B    #'1',DISKNR2
  88.     MOVEQ.L    #0,D0
  89.     MOVE.L    PTB_OPENDEVICE(A5),A0
  90.     JSR    (A0)
  91.     TST.L    D0
  92.     RTS
  93.  
  94. ;loading-statetexts for the cycles
  95. STATEARRAY    DC.L    LOADSTATE
  96.     DC.L    LOADSTATE
  97.     DC.L    LOADSTATE
  98.     DC.L    LOADSTATE
  99.  
  100. LOADSTATE
  101.     DC.B    'Please insert your original writepro-',$A
  102.     DC.B    'tected disk '
  103. disknr    dc.b    '1 in the source drive.',0
  104.     EVEN
  105.  
  106. STATEARRAY2    DC.L    SAVESTATE
  107.     DC.L    SAVESTATE
  108.     DC.L    SAVESTATE
  109.     DC.L    SAVESTATE
  110.  
  111. SAVESTATE    
  112.     DC.B    'Please insert your destination disk.',0
  113.     EVEN
  114.  
  115. ;routines to 'load' something
  116. SPECIALARRAY    DC.L    LOADROUT    ;load stuff from original
  117.     DC.L    LOADROUT
  118.     DC.L    LOADROUT
  119.     DC.L    LOADROUT
  120.  
  121. STARTTRACK    DC.B    3,0,0,0
  122.  
  123. LOADROUT
  124.     MOVEQ.L    #0,D7
  125.     CMP.B    #0,D6            ;inhibit drive only on first cycle
  126.     BNE.S    .NOINHIBIT
  127.     MOVEQ.L    #0,D0
  128.     MOVE.L    PTB_INHIBITDRIVE(A5),A0
  129.     JSR    (A0)
  130. .NOINHIBIT
  131. ;    BRA.W    .NOTORG            ;at first imaging you have of course
  132.                     ;no idea to recognize disks, so ask
  133.                     ;every cycle for the right disk
  134.  
  135. .NEU
  136.  
  137.  
  138. .4    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1
  139.     MOVE.W    #TD_CHANGESTATE,IO_COMMAND(A1)
  140.     MOVE.L    (_SYSBASE).W,A6
  141.     JSR    _LVODOIO(A6)
  142.     TST.L    IO_ACTUAL(A1)
  143.     BNE.W    .NOTORG
  144.  
  145.     MOVE.L    PTB_ADDRESSOFFILE(A5),A4    ;load first part of disk
  146.     LEA.L    (A4),A2                ;offset to load in the dataspace
  147.     MOVE.L    PTB_FILESIZE(A5),D3        ;bytes to read
  148.  
  149.     MOVEQ.L    #0,D2                ;get starttrack from table
  150.     MOVE.B    STARTTRACK(PC,D6.W),D2
  151.  
  152.     CMP.B    #0,D6                ;first cycle (=first disk)?
  153.     BNE.W    .STTRACK0
  154.  
  155.     MOVEQ.L    #0,D0                ;display readingmessage
  156.     BSR.W    TRACKREADING
  157.     
  158.     MOVE.L    PTB_DEVICESOURCEPTR(A5),A1    ;on first disk, load some
  159.     MOVE.L    A4,IO_DATA(A1)          ;normal tracks in the
  160.     MOVE.L    #$1200,IO_LENGTH(A1)        ;datafile, waste of $200 byte
  161.     MOVE.L    #$400,IO_OFFSET(A1)
  162.     MOVE.W    #CMD_READ,IO_COMMAND(A1)
  163.     CLR.L    IOTD_SECLABEL(A1)
  164.     MOVE.L    (_SYSBASE).W,A6
  165.     JSR    _LVODOIO(A6)
  166.     TST.L    D0
  167.     BNE.W    .NOTORG
  168.  
  169.     CMP.L    #$F7DA2C79,8(A4)        ;final check for first disk
  170.     BNE.W    .NOTORG
  171.  
  172.     ST    D7                ;disk recognized
  173.  
  174.     MOVEQ.L    #1,D0
  175.     BSR.W    TRACKREADING
  176.  
  177.     MOVE.L    PTB_DEVICESOURCEPTR(A5),A1
  178.     LEA.L    $1200(A4),A0
  179.     MOVE.L    A0,IO_DATA(A1)
  180.     MOVE.L    #$1600,IO_LENGTH(A1)
  181.     MOVE.L    #$1600,IO_OFFSET(A1)
  182.     MOVE.W    #CMD_READ,IO_COMMAND(A1)
  183.     CLR.L    IOTD_SECLABEL(A1)
  184.     MOVE.L    (_SYSBASE).W,A6
  185.     JSR    _LVODOIO(A6)
  186.     TST.L    D0
  187.     BNE.W    .NOTORG
  188.  
  189.     MOVEQ.L    #2,D0
  190.     BSR.W    TRACKREADING
  191.  
  192.     MOVE.L    PTB_DEVICESOURCEPTR(A5),A1
  193.     LEA.L    $2800(A4),A0
  194.     MOVE.L    A0,IO_DATA(A1)
  195.     MOVE.L    #$800,IO_LENGTH(A1)
  196.     MOVE.L    #$2C00,IO_OFFSET(A1)
  197.     MOVE.W    #CMD_READ,IO_COMMAND(A1)
  198.     CLR.L    IOTD_SECLABEL(A1)
  199.     MOVE.L    (_SYSBASE).W,A6
  200.     JSR    _LVODOIO(A6)
  201.     TST.L    D0
  202.     BNE.W    .NOTORG
  203.  
  204.     LEA.L    $1900*2(A4),A2            ;skip 2 tracks (they are 
  205.     SUB.L    #$1900*2,D3            ;already loaded)
  206.  
  207. .STTRACK0
  208.     MOVEQ.L    #0,D4                ;data from the start of the track
  209. ;    bra.s    .5                ;because reading starts with
  210.                         ;trackstart, this is obsolete
  211.  
  212. .3    TST.L    D4
  213.     BNE.W    .1
  214. .5
  215.  
  216.     MOVE.L    D2,D0
  217.     BSR.W    TRACKREADING
  218.  
  219.     MOVEQ.L    #$4,D5                ;4 tries, then error
  220.  
  221. .55
  222.     MOVE.L    PTB_DEVICESOURCEPTR(A5),A1
  223.     MOVE.L    PTB_SPACE(A5),IO_DATA(A1)    ;track is to load in PTB_SPACE
  224.     MOVE.L    #$7C00,IO_LENGTH(A1)        ;double length of track
  225.                         ;to decode the index-sync-read data
  226.                         ;my own trackcounter
  227.     MOVE.L    D2,D0
  228.     MOVE.L    D0,IO_OFFSET(A1)
  229.     MOVE.W    #TD_RAWREAD,IO_COMMAND(A1)
  230.     MOVE.B    #IOTDB_INDEXSYNC,IO_FLAGS(A1)
  231.     MOVE.L    (_SYSBASE).W,A6
  232.     JSR    _LVODOIO(A6)
  233.     TST.L    D0
  234.     BNE.W    .NXCYCLE
  235.     MOVE.L    PTB_SPACE(A5),A0
  236.     LEA.L    $7C00(A0),A1            ;end of buffer
  237.     LEA.L    $7C00(A0),A3
  238.     BSR.W    TRACKDECODE
  239.     TST.L    D0
  240.     BEQ.S    .R1OK
  241. .NXCYCLE
  242.     DBF    D5,.55
  243.  
  244.  
  245.     IFEQ    1                ;COMMENTED!
  246.     MOVE.L    PTB_SPACE(A5),A0        ;for me, that i see wrong
  247.     LEA.L    $7C00(A0),A3            ;track instead of abandoning
  248.     MOVE.L    A3,A0                ;at first imaging
  249.     MOVE.W    #$2000/4-1,D0
  250. .TE1    MOVE.L    #'NNNN',(A0)+
  251.     DBF    D0,.TE1
  252.     BRA.S    .R1OK
  253.     ENDC
  254.  
  255.     TST.L    D7
  256.     BNE.W    .DISPERR
  257.     BRA.W    .NOTORG
  258.  
  259. .R1OK
  260.                         ;of course you may comment this
  261.                         ;with IFEQ 1 on first imaging
  262.  
  263.     CMP.B    #0,D2                ;DISKCHECK
  264.     BNE.S    .R3OK                ;on track 00
  265.     CMP.B    #1,D6                ;2nd disk?
  266.     BNE.S    .D3
  267.     CMP.L    #$5F8408E2,4(A3)
  268.     BNE.S    .NOTORG
  269.     BRA.S    .R2OK
  270.  
  271. .D3    CMP.B    #2,D6                ;3rd disk?
  272.     BNE.S    .D4
  273.     CMP.L    #$F8185D08,(A3)
  274.     BNE.S    .NOTORG
  275.     BRA.S    .R2OK
  276.  
  277. .D4    CMP.B    #3,D6                ;4th disk?
  278.     BNE.S    .R3OK
  279.     CMP.L    #$D6BEEBFF,4(A3)
  280.     BNE.S    .NOTORG
  281.  
  282. .R2OK
  283.     ST    D7                ;correct disk - nothing anymore
  284.                         ;to change
  285. .R3OK    ADDQ.L    #1,D2
  286.  
  287. .1    MOVE.B    (A3)+,(A2)+
  288.     ADDQ.L    #1,D4
  289.     CMP.L    #$1900,D4            ;tracklength
  290.     BNE.S    .2
  291.     MOVEQ.L    #0,D4                ;new track
  292. .2    SUBQ.L    #1,D3
  293.     BNE.W    .3
  294.  
  295.     MOVEQ.L    #0,D4
  296. .END
  297.  
  298.     MOVE.L    PTB_DEVICESOURCEPTR(A5),A1    ;switch motor off
  299.     MOVE.L    #0,IO_LENGTH(A1)
  300.     MOVE.W    #TD_MOTOR,IO_COMMAND(A1)
  301.     MOVE.L    (_SYSBASE).W,A6
  302.     JSR    _LVODOIO(A6)
  303.     TST.L    D4            ;enable drive on error
  304.     BNE.S    .EAGAIN
  305.     CMP.B    #3,D6            ;or on last cycle
  306.     BNE.S    .SKENABLE
  307. .EAGAIN
  308.     MOVEQ.L    #0,D0
  309.     MOVE.L    PTB_ENABLEDRIVE(A5),A0
  310.     JSR    (A0)
  311. .SKENABLE
  312.     ADDQ.B    #1,DISKNR        ;set disknumber-displays to next disk
  313.     ADDQ.B    #1,DISKNR2
  314.  
  315.     MOVE.L    D4,D0
  316.     RTS
  317.  
  318. .ERR    MOVEQ.L    #-1,D4
  319.     BRA.S    .END
  320.  
  321. .NOTORG    TST.L    D7            ;if the first time the original
  322.     BNE.S    .ERR            ;was not in the source drive,
  323.     ST    D7            ;youll be asked to put it there
  324.  
  325.     LEA.L    LOADSTATE(PC),A0    ;display 'please insert...'
  326.     MOVE.L    PTB_DISPLAY(A5),A6
  327.     JSR    (A6)
  328.  
  329.     MOVE.L    PTB_DEVICESOURCEPTR(A5),A1    ;motor off
  330.     MOVE.L    #0,IO_LENGTH(A1)
  331.     MOVE.W    #TD_MOTOR,IO_COMMAND(A1)
  332.     MOVE.L    (_SYSBASE).W,A6
  333.     JSR    _LVODOIO(A6)
  334.     LEA.L    LINE1(PC),A0
  335.     LEA.L    LINE2(PC),A1
  336.     MOVE.L    PTB_REQUEST(A5),A6    ;requester 'please insert...'
  337.     JSR    (A6)
  338.     TST.L    D0
  339.     BNE.S    .ERR
  340.     BRA.W    .NEU
  341.  
  342. .DISPERR
  343.     MOVE.L    PTB_DEVICESOURCEPTR(A5),A1    ;motor off
  344.     MOVE.L    #0,IO_LENGTH(A1)
  345.     MOVE.W    #TD_MOTOR,IO_COMMAND(A1)
  346.     MOVE.L    (_SYSBASE).W,A6
  347.     JSR    _LVODOIO(A6)
  348.     BSR.W    TRACKERROR
  349.     BRA.S    .ERR
  350.  
  351. TRACKERROR
  352.     MOVE.B    D2,D0
  353.     AND.L    #$FF,D0
  354.     DIVU.W    #$A,D0
  355.     SWAP    D0
  356.     ADD.B    #$30,D0
  357.     MOVE.B    D0,ETRACK+2
  358.     CLR.W    D0
  359.     SWAP    D0
  360.     DIVU.W    #$A,D0
  361.     SWAP    D0
  362.     ADD.B    #$30,D0
  363.     MOVE.B    D0,ETRACK+1
  364.     CLR.W    D0
  365.     SWAP    D0
  366.     DIVU.W    #$A,D0
  367.     SWAP    D0
  368.     ADD.B    #$30,D0
  369.     MOVE.B    D0,ETRACK
  370.  
  371.     LEA.L    LINEE1(PC),A0
  372.     LEA.L    LINEE2(PC),A1
  373.     MOVE.L    PTB_REQUEST(A5),A6
  374.     JSR    (A6)
  375.     RTS
  376.  
  377. TRACKREADING                ;message 'reading track 000'
  378.     AND.L    #$FF,D0
  379.     DIVU.W    #$A,D0
  380.     SWAP    D0
  381.     ADD.B    #$30,D0
  382.     MOVE.B    D0,RTRACK+2
  383.     CLR.W    D0
  384.     SWAP    D0
  385.     DIVU.W    #$A,D0
  386.     SWAP    D0
  387.     ADD.B    #$30,D0
  388.     MOVE.B    D0,RTRACK+1
  389.     CLR.W    D0
  390.     SWAP    D0
  391.     DIVU.W    #$A,D0
  392.     SWAP    D0
  393.     ADD.B    #$30,D0
  394.     MOVE.B    D0,RTRACK
  395.  
  396.     LEA.L    READINGNR(PC),A0
  397.     MOVE.L    PTB_DISPLAY(A5),A6
  398.     JSR    (A6)
  399.     RTS
  400.  
  401. LINEE1    DC.B    'Read Error',0
  402.     EVEN
  403. LINEE2    dc.b    'on Track '
  404. ETRACK    DC.B    '000',0
  405.     EVEN
  406.  
  407. READINGNR
  408.     DC.B    'Reading track '
  409. RTRACK    DC.B    '000.',0
  410.     EVEN
  411.  
  412. ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11
  413. LINE1    DC.B    'Please insert your original',0
  414.     EVEN
  415. LINE2    DC.B    'disk '
  416. DISKNR2    DC.B    '1 in the source drive.',0
  417.     EVEN
  418.  
  419.  
  420.  
  421. ;< A0 RAWTRACK
  422. ;< A1 TRACKBUFFER
  423. ;> D0 ERROR
  424.  
  425. SYNC    DC.W    $4489
  426.  
  427. GETSYNC
  428. ;SYNCANFANG SUCHEN
  429.     MOVE.W    SYNC(PC),D1
  430. .SHF2    MOVEQ.L    #$10-1,D5
  431. .SHF1    MOVE.L    (A2),D0
  432.     LSR.L    D5,D0
  433.     CMP.W    D1,D0
  434.     BEQ.S    .SY
  435.     DBF    D5,.SHF1
  436.     ADDQ.L    #2,A2
  437.     CMP.L    A2,A4
  438.     BHI.S    .SHF2
  439.     BRA.S    .ERR
  440. .SY    
  441.  
  442. .1    MOVE.L    (A2),D0
  443.     ADDQ.L    #2,A2
  444.     LSR.L    D5,D0
  445.     CMP.W    D1,D0
  446.     BEQ.S    .1
  447.     SUBQ.L    #2,A2
  448.     CMP.L    A2,A4
  449.     BLS.S    .ERR
  450.     MOVEQ.L    #0,D0
  451.     RTS
  452.  
  453. .ERR    MOVEQ.L    #-1,D0
  454.     RTS
  455.  
  456.  
  457.  
  458. ;< A0 RAWTRACK
  459. ;< A1 TRACKBUFFER
  460. ;> D0 ERROR
  461. ;INTERNAL
  462. ;  D5 SHIFT
  463. ;  D7 SEKTORCOUNT
  464. ;format is 4 sectors with $640 bytes each (long track)
  465.  
  466. TRACKDECODE    MOVEM.L    A2/A3/A4/A5/D2/D3/D4/D5/D6/D7,-(A7)
  467.     MOVE.L    A0,A2
  468.     LEA.L    ($7C00-$680*2)(A0),A4
  469.     MOVE.L    #%1111,D7    ;for each unloaded sector 1 bit in D7 
  470.                 ;(total 4 sectors)
  471.  
  472.  
  473. .NEXTSEC
  474. .ANF    MOVE.L    #$55555555,D3
  475.     BSR.W    GETSYNC        ;get sync
  476.     TST.L    D0
  477.     BNE.W    .ERR
  478.  
  479.     BSR.S    DEC1L        ;get sectornumber (like original)
  480.     MOVE.L    D0,D2
  481.  
  482.     BSR.S    DEC1L        ;as 'headerchecksum' like original
  483.     EOR.L    D2,D0
  484.     ADDQ.L    #1,D0
  485.     BNE.S    .NEXTSEC
  486.     ;contents of D2:$XXXX<SECTOR><TRACK>
  487.  
  488.                 ;now get sectordata
  489.  
  490.     LSR.W    #8,D2        ;get sectornumber
  491.     AND.L    #$FF,D2
  492.     
  493.     BTST    D2,D7        ;sector already present (happens only if
  494.     BEQ.S    .NEXTSEC    ;track is a bit erroneus)
  495.  
  496.  
  497.     MOVEQ.L    #0,D0
  498.     MOVE.W    D2,D0
  499.     MULU    #$640,D0    ;offset of that sector in the tracktable
  500.     LEA.L    0(A1,D0.L),A3
  501.  
  502.     LEA.L    $640(A2),A0    ;displacement for decoding
  503.  
  504. .DECSEC
  505.     MOVE.L    #$640/4-1,D4    ;decode sectordata
  506. .DECSEC1    BSR.W    DEC1L640
  507.     MOVE.L    D0,(A3)+
  508.     DBF    D4,.DECSEC1
  509.     LEA.L    $640(A2),A2    ;skip half sector (already used in A0)
  510.     
  511.     BSR.S    DEC1L        ;get sectorchecksum
  512.     MOVE.L    D0,D4
  513.  
  514.     BSR.S    CHKSUMSECTOR    ;evaluate sectorchecksum
  515.     CMP.L    D0,D4
  516.     BNE.S    .NEXTSEC    ;sector couldnt be loaded, but try as long as
  517.                 ;trackdata are present
  518. ;    BSR.S    DEC1L        ;the original had still a check, now removed
  519. ;    CMP.L    #$53444446,D0
  520. ;    BNE.S    .ERR
  521.  
  522.     BCLR    D2,D7        ;mark that sector as loaded
  523.  
  524.     TST.L    D7        ;all sectors loaded?
  525.     BNE.W    .NEXTSEC
  526.     MOVEQ.L    #0,D0
  527. .END
  528.     MOVEM.L    (A7)+,A2/A3/A4/A5/D2/D3/D4/D5/D6/D7
  529.     RTS
  530. .ERR
  531.     MOVEQ.L    #-1,D0
  532.     BRA.S    .END
  533.  
  534. CHKSUMSECTOR
  535.     MOVEQ.L    #0,D0
  536.     MOVE.W    D2,D0
  537.     MULU    #$640,D0
  538.     LEA.L    0(A1,D0.L),A3
  539.     MOVEQ.L    #0,D0
  540.     MOVE.W    #$640/4-1,D1
  541. .1    ADD.L    (A3)+,D0
  542.     DBF    D1,.1
  543.     RTS
  544.  
  545. DEC1L                ;decode 1 longword of the stream
  546.  
  547. ;    MOVE.L    (A2)+,D0
  548.                 ;my *NEW* code to get a longword
  549.     MOVE.L    (A2)+,D0    ;get higher word
  550.     LSR.L    D5,D0
  551.     SWAP    D0
  552.     MOVE.L    -2(A2),D6    ;get lower word
  553.     LSR.L    D5,D6
  554.     MOVE.W    D6,D0        ;my code ends
  555.  
  556. ;    MOVE.L    (A2)+,D1
  557.                 ;my *NEW* code to get a longword
  558.     MOVE.L    (A2)+,D1    ;get higher word
  559.     LSR.L    D5,D1
  560.     SWAP    D1
  561.     MOVE.L    -2(A2),D6    ;get lower word
  562.     LSR.L    D5,D6
  563.     MOVE.W    D6,D1        ;my code ends
  564.  
  565.     AND.L    D3,D0
  566.     AND.L    D3,D1
  567.     LSL.L    #1,D0
  568.     OR.L    D1,D0
  569.     RTS
  570.  
  571. DEC1L640            ;sector has $640 bits displacement from word
  572.                 ;with even to word with odd bits, so the
  573.                 ;program was able to decode the track with
  574.                 ;the blitter, obviously i HAVE to change
  575.                 ;that to the decode with CPU
  576. ;    MOVE.L    (A2)+,D0
  577.                 ;my *NEW* code to get a longword
  578.     MOVE.L    (A2)+,D0    ;get higher word
  579.     LSR.L    D5,D0
  580.     SWAP    D0
  581.     MOVE.L    -2(A2),D6    ;get lower word
  582.     LSR.L    D5,D6
  583.     MOVE.W    D6,D0        ;my code ends
  584.  
  585. ;    MOVE.L    (A0)+,D1
  586.                 ;my *NEW* code to get a longword
  587.     MOVE.L    (A0)+,D1    ;get higher word
  588.     LSR.L    D5,D1
  589.     SWAP    D1
  590.     MOVE.L    -2(A0),D6    ;get lower word
  591.     LSR.L    D5,D6
  592.     MOVE.W    D6,D1        ;my code ends
  593.  
  594.     AND.L    D3,D0
  595.     AND.L    D3,D1
  596.     LSL.L    #1,D0
  597.     OR.L    D1,D0
  598.     RTS
  599.  
  600.