home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 13 / AACD13.ISO / AACD / Games / WHDLoad / Extra / Patcher1.05dev.lha / Patcher1.05 / PARAMQTX / nitro.imager.asm < prev    next >
Assembly Source File  |  1998-01-17  |  20KB  |  1,013 lines

  1. ;another example of a formatconversion, this time for a hd-install
  2. ;the nitro-disk has a really strange decoding-routine
  3. ;have a look on that table-changes while execution (PCH_DATALENGTH 
  4. ;  and PCH_CHANGES)
  5. ;new longwordreader on the bitstream, lesser registers used, no
  6. ;  special adjust to An needed anymore like the earlier one
  7.  
  8.  
  9.     INCDIR    ASM-ONE:INCLUDE2.0/
  10.  
  11.     INCLUDE    OWN/Patcher.I
  12.     INCLUDE    DEVICES/TRACKDISK.I
  13.     INCLUDE    EXEC/EXEC_LIB.I
  14.     INCLUDE    EXEC/IO.I
  15.     INCLUDE    LIBRARIES/DOS_LIB.I
  16.  
  17. MYNITRO=0
  18.  
  19.  
  20. HP    MOVEQ.L    #20,D0
  21.     RTS
  22.     DC.L    TAB
  23.     DC.B    'PTCH'
  24.     DC.B    '$VER:Nitro_Diskimager_V1.2',0
  25.     EVEN
  26.  
  27. TAB    DC.L    PCH_INIT,INITROUT
  28.     DC.L    PCH_FILECOUNT,3
  29.     DC.L    PCH_ADAPTOR,ADNAME
  30.     DC.L    PCH_DISKNAME,DISKNAMEARRAY
  31.     DC.L    PCH_FILENAME,FILENAMEARRAY
  32.     DC.L    PCH_CHANGES,CHANGESARRAY    
  33.     DC.L    PCH_NAME,PARAMNAME
  34.     DC.L    PCH_DATALENGTH,LENGTHTABLE
  35.     DC.L    PCH_SPECIAL,SPECIALARRAY
  36.     DC.L    PCH_STATE,STATEARRAY
  37.     DC.L    PCH_STATE2,STATEARRAY2
  38.     DC.L    PCH_MINVERSION,VERSNAME        ;minimum version of THE PATCHER
  39.     DC.L    0
  40.  
  41. ;minimum version of the patcher required, its a commandline-parameter
  42. VERSNAME    DC.B    'V1.05'        ;MAY NOT CONTAIN HEADING ZEROES
  43.     EVEN                ;MUST CONTAIN 2 NUMBERS AFTER POINT
  44.  
  45.  
  46. ADNAME    DC.B    'Done by Harry.',0
  47.     EVEN
  48.  
  49.  
  50. PARAMNAME    DC.B    'Nitro, Diskimager for HD-install',0
  51.     EVEN
  52.  
  53.  
  54. DISKNAMEARRAY    DC.L    DISK1NAME
  55.     DC.L    DISK1NAME
  56.     DC.L    DISK1NAME
  57.  
  58. DISK1NAME    DC.B    'Nitro',0
  59.     EVEN
  60.  
  61.  
  62. FILENAMEARRAY    DC.L    FILE1NAME
  63.     DC.L    FILE2NAME
  64.     DC.L    FILE3NAME
  65.  
  66. FILE2NAME    DC.B    'disk.1',0
  67.     EVEN
  68. FILE1NAME    DC.B    'init',0
  69.     EVEN
  70. FILE3NAME    DC.B    'high',0
  71.     EVEN
  72.  
  73. LENGTHTABLE    DC.L    $1200
  74.     DC.L    $0            ;WILL BE EVALUATED IN CYCLE1
  75.     DC.L    $140            ;HIGHSCORE!
  76.  
  77. CHANGESARRAY    DC.L    0        ;no changes to make in cycle 1
  78.     DC.L    0            ;no changes to make in cycle 2
  79.     DC.L    0            ;if no highscores were on disk,
  80.                     ;they will be generated
  81.  
  82. ;the parameter-initializing opens sourcedevice 
  83. INITROUT
  84.     MOVEQ.L    #0,D0
  85.     MOVE.L    PTB_OPENDEVICE(A5),A0
  86.     JSR    (A0)
  87.     TST.L    D0
  88.     RTS
  89.  
  90. ;loading-statetexts for the cycles
  91. STATEARRAY    DC.L    LOADSTATE2
  92.     DC.L    LOADSTATE2
  93.     DC.L    LOADSTATE2
  94.  
  95.  
  96. LOADSTATE2
  97.     DC.B    'Please insert your original writepro-',$A
  98.     DC.B    'tected disk in the source drive.',0
  99.     EVEN
  100.  
  101. STATEARRAY2    DC.L    SAVESTATE        ;no text in cycle 1
  102.     DC.L    SAVESTATE
  103.     DC.L    SAVESTATE
  104.  
  105.  
  106. SAVESTATE    
  107.     DC.B    'Please insert your destination disk.',0
  108.     EVEN
  109.  
  110. ;routines to 'load' something
  111. SPECIALARRAY    DC.L    LOADROUT2    ;load dual-formatted track 0
  112.     DC.L    LOADROUT        ;load stuff from original
  113.     DC.L    LOADROUT3        ;load highscore
  114.  
  115. LOADROUT2
  116.     MOVEQ.L    #0,D7
  117.     MOVEQ.L    #0,D0            ;inhibit drive (only on first cycle)
  118.     MOVE.L    PTB_INHIBITDRIVE(A5),A0
  119.     JSR    (A0)
  120.  
  121. .NEU
  122. .4    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1
  123.     MOVE.W    #TD_CHANGESTATE,IO_COMMAND(A1)
  124.     MOVE.L    (_SYSBASE).W,A6
  125.     JSR    _LVODOIO(A6)
  126.     TST.L    IO_ACTUAL(A1)
  127.     BNE.W    .NOTORG
  128.  
  129.     MOVEQ.L    #0,D0                ;display track to read from
  130.     BSR.W    TRACKREADING
  131.  
  132.     MOVE.L    PTB_DEVICESOURCEPTR(A5),A1
  133.     MOVE.L    PTB_ADDRESSOFFILE(A5),IO_DATA(A1)
  134.     MOVE.L    #$1200,IO_LENGTH(A1)
  135.     MOVE.L    #$400,IO_OFFSET(A1)
  136.     MOVE.W    #CMD_READ,IO_COMMAND(A1)
  137.     CLR.L    IOTD_SECLABEL(A1)
  138.     MOVE.L    (_SYSBASE).W,A6
  139.     JSR    _LVODOIO(A6)
  140.     TST.L    D0
  141.     BNE.W    .NOTORG
  142.  
  143.                     ;LOAD CHECKDISKTRACK
  144.     MOVEQ.L    #0,D2
  145.     LEA.L    TRACKDATALENGTH(PC),A2
  146.     MOVEQ.L    #0,D4
  147.  
  148. .3    TST.L    D4
  149.     BNE.S    .1
  150.  
  151.  
  152. .5    MOVEQ.L    #$4,D5                ;4 tries, then error
  153.  
  154. .55    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1
  155.     MOVE.L    PTB_SPACE(A5),IO_DATA(A1)    ;track is to load in PTB_SPACE
  156.     MOVE.L    #$7C00,IO_LENGTH(A1)        ;double length of track
  157.                         ;to decode the index-sync-read data
  158.     MOVE.L    D2,D0                ;my own trackcounter
  159.     MOVE.L    D0,IO_OFFSET(A1)
  160.     MOVE.W    #TD_RAWREAD,IO_COMMAND(A1)
  161.     MOVE.B    #IOTDB_INDEXSYNC,IO_FLAGS(A1)
  162.     MOVE.L    (_SYSBASE).W,A6
  163.     JSR    _LVODOIO(A6)
  164.     TST.L    D0
  165.     BNE.B    .NXCYCLE
  166.     MOVE.L    PTB_SPACE(A5),A0
  167.     LEA.L    $7C00(A0),A1            ;end of buffer
  168.     LEA.L    $7C02(A0),A3
  169.     BSR.W    TRACKDECODE3
  170.     TST.L    D0
  171.     BEQ.S    .OK
  172. .NXCYCLE
  173.     DBF    D5,.55
  174.     TST.L    D7
  175.     BNE.W    .DISPERR
  176.     BRA.B    .NOTORG
  177.  
  178. .OK
  179.     CMP.L    #'tb_1',(A3)            ;nitro-diskname
  180.     BNE.S    .NOTORG
  181.  
  182.     ST    D7
  183.     LEA.L    $8(A3),A3
  184.     MOVE.L    #$A0,D3
  185.  
  186. .1    MOVE.L    D4,D0
  187.     LSL.L    #1,D0
  188.     MOVE.W    (A3,D0.W),D0
  189.     AND.W    #$FFF,D0
  190.     MOVE.W    D0,(A2)+
  191.     ADDQ.L    #1,D4
  192.     CMP.W    D3,D4                ;tracklength
  193.     BNE.S    .2
  194.     MOVEQ.L    #0,D4                ;new track
  195. .2
  196.     TST.L    D4
  197.     BNE.W    .3
  198.  
  199.     LEA.L    TRACKDATALENGTH,A0        ;evaluate disksize needed in
  200.     MOVEQ.L    #0,D0                ;next cycle (cycle 2)
  201. .T1    MOVEQ.L    #0,D1
  202.     MOVE.W    (A0)+,D1
  203.     ADD.L    D1,D0
  204.     CMP.L    #TRACKDATALENGTHEND,A0
  205.     BNE.S    .T1
  206.     LSL.L    #2,D0
  207.     MOVE.L    D0,LENGTHTABLE+4        ;store length in right table
  208. ;            ^-^-^-^-^-^
  209.  
  210.     MOVEQ.L    #0,D4
  211. .END    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1
  212.     MOVE.L    #0,IO_LENGTH(A1)
  213.     MOVE.W    #TD_MOTOR,IO_COMMAND(A1)
  214.     MOVE.L    (_SYSBASE).W,A6
  215.     JSR    _LVODOIO(A6)
  216.     TST.L    D4
  217.     BEQ.S    .SK
  218.  
  219.     MOVEQ.L    #0,D0                ;enable drive if error
  220.     MOVE.L    PTB_ENABLEDRIVE(A5),A0
  221.     JSR    (A0)
  222.  
  223. .SK
  224.     MOVE.L    D4,D0
  225.     RTS
  226.  
  227. .ERR    MOVEQ.L    #-1,D4
  228.     BRA.S    .END
  229.  
  230. .NOTORG    TST.L    D7
  231.     BNE.S    .ERR
  232.     ST    D7
  233.  
  234.     LEA.L    LOADSTATE2(PC),A0    ;display 'please insert...'
  235.     MOVE.L    PTB_DISPLAY(A5),A6
  236.     JSR    (A6)
  237.  
  238.     MOVE.L    PTB_DEVICESOURCEPTR(A5),A1    ;motor off
  239.     MOVE.L    #0,IO_LENGTH(A1)
  240.     MOVE.W    #TD_MOTOR,IO_COMMAND(A1)
  241.     MOVE.L    (_SYSBASE).W,A6
  242.     JSR    _LVODOIO(A6)
  243.  
  244.     LEA.L    LINE1(PC),A0
  245.     LEA.L    LINE2(PC),A1
  246.     MOVE.L    PTB_REQUEST(A5),A6
  247.     JSR    (A6)
  248.     TST.L    D0
  249.     BNE.S    .ERR
  250.     BRA.W    .NEU
  251.  
  252. .DISPERR
  253.     MOVE.L    PTB_DEVICESOURCEPTR(A5),A1    ;motor off
  254.     MOVE.L    #0,IO_LENGTH(A1)
  255.     MOVE.W    #TD_MOTOR,IO_COMMAND(A1)
  256.     MOVE.L    (_SYSBASE).W,A6
  257.     JSR    _LVODOIO(A6)
  258.     BSR.S    TRACKERROR        ;requester 'error on track 000'
  259.     BRA.S    .ERR
  260.  
  261. TRACKERROR                ;requester 'error on track 000'
  262.     MOVE.B    D2,D0
  263.     AND.L    #$FF,D0
  264.     DIVU.W    #$A,D0
  265.     SWAP    D0
  266.     ADD.B    #$30,D0
  267.     MOVE.B    D0,ETRACK+2
  268.     CLR.W    D0
  269.     SWAP    D0
  270.     DIVU.W    #$A,D0
  271.     SWAP    D0
  272.     ADD.B    #$30,D0
  273.     MOVE.B    D0,ETRACK+1
  274.     CLR.W    D0
  275.     SWAP    D0
  276.     DIVU.W    #$A,D0
  277.     SWAP    D0
  278.     ADD.B    #$30,D0
  279.     MOVE.B    D0,ETRACK
  280.  
  281.     LEA.L    LINEE1(PC),A0
  282.     LEA.L    LINEE2(PC),A1
  283.     MOVE.L    PTB_REQUEST(A5),A6
  284.     JSR    (A6)
  285.     RTS
  286.  
  287.  
  288. TRACKREADING                ;message 'reading track 000'
  289.     AND.L    #$FF,D0
  290.     DIVU.W    #$A,D0
  291.     SWAP    D0
  292.     ADD.B    #$30,D0
  293.     MOVE.B    D0,RTRACK+2
  294.     CLR.W    D0
  295.     SWAP    D0
  296.     DIVU.W    #$A,D0
  297.     SWAP    D0
  298.     ADD.B    #$30,D0
  299.     MOVE.B    D0,RTRACK+1
  300.     CLR.W    D0
  301.     SWAP    D0
  302.     DIVU.W    #$A,D0
  303.     SWAP    D0
  304.     ADD.B    #$30,D0
  305.     MOVE.B    D0,RTRACK
  306.  
  307.     LEA.L    READINGNR(PC),A0
  308.     MOVE.L    PTB_DISPLAY(A5),A6
  309.     JSR    (A6)
  310.     RTS
  311.  
  312.  
  313.  
  314.  
  315. LINEE1    DC.B    'Read Error',0
  316.     EVEN
  317. LINEE2    dc.b    'on Track '
  318. ETRACK    DC.B    '000',0
  319.     EVEN
  320.  
  321. READINGNR
  322.     DC.B    'Reading track '
  323. RTRACK    DC.B    '000.',0
  324.     EVEN
  325.  
  326.  
  327.  
  328. LOADROUT
  329. ;.xxx    bra.s    .xxx
  330.     MOVEQ.L    #0,D7                ;one diskchange allowed
  331. .NEU
  332. .4    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1    ;disk in sourcedrive?
  333.     MOVE.W    #TD_CHANGESTATE,IO_COMMAND(A1)
  334.     MOVE.L    (_SYSBASE).W,A6
  335.     JSR    _LVODOIO(A6)
  336.     TST.L    IO_ACTUAL(A1)
  337.     BNE.W    .NOTORG
  338.  
  339.     MOVE.L    PTB_ADDRESSOFFILE(A5),A4    ;load first part of disk
  340.     LEA.L    (A4),A2            ;offset to load in the dataspace
  341.     MOVEQ.L    #0,D2                ;starttrack on the disk
  342.     MOVEQ.L    #0,D4                ;data from the start of the track
  343. ;    bra.s    .5                ;because reading starts with
  344.                         ;trackstart, this is obsolete
  345.  
  346. .3    TST.L    D4
  347.     BNE.W    .1
  348.     MOVE.L    D2,D0
  349.     LSL.L    #1,D0
  350.     LEA.L    TRACKDATALENGTH(PC),A0
  351.     TST.W    (A0,D0.W)
  352.     BEQ.W    .SKIPEMPTY
  353.  
  354. .5    MOVEQ.L    #$4,D5                ;4 tries, then error
  355.  
  356.     MOVE.L    D2,D0                ;display track to read from
  357.     BSR.W    TRACKREADING
  358.  
  359. .55    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1
  360.     MOVE.L    PTB_SPACE(A5),IO_DATA(A1)    ;track is to load in PTB_SPACE
  361.     MOVE.L    #$7C00,IO_LENGTH(A1)        ;double length of track
  362.                         ;to decode the index-sync-read data
  363.     MOVE.L    D2,D0                ;my own trackcounter
  364.     MOVE.L    D0,IO_OFFSET(A1)
  365.     MOVE.W    #TD_RAWREAD,IO_COMMAND(A1)
  366.     MOVE.B    #IOTDB_INDEXSYNC,IO_FLAGS(A1)
  367.     MOVE.L    (_SYSBASE).W,A6
  368.     JSR    _LVODOIO(A6)
  369.     TST.L    D0
  370.     BNE.B    .NXCYCLE
  371.     MOVE.L    #$AAAAAAAA,ANDVALUE
  372.     MOVE.L    PTB_SPACE(A5),A0
  373.     LEA.L    $7C00(A0),A1            ;end of buffer
  374.     LEA.L    $7C00(A0),A3
  375.     BSR.W    TRACKDECODE2
  376.     TST.L    D0
  377.     BEQ.S    .R1OK
  378.     MOVE.L    #$55555555,ANDVALUE
  379.     MOVE.L    PTB_SPACE(A5),A0
  380.     LEA.L    $7C00(A0),A1            ;end of buffer
  381.     LEA.L    $7C00(A0),A3
  382.     BSR.W    TRACKDECODE2
  383.     TST.L    D0
  384.     BEQ.S    .R1OK
  385. .NXCYCLE
  386.     DBF    D5,.55
  387.     TST.L    D7
  388.     BNE.W    .DISPERR
  389.     BRA.B    .NOTORG
  390.  
  391. .R1OK    MOVE.W    D1,D3
  392.     LSL.W    #2,D3
  393.     ST    D7                ;correct disk - nothing anymore
  394.                         ;to change
  395. .1    MOVE.B    (A3,D4.W),(A2)+
  396.     ADDQ.L    #1,D4
  397.     CMP.W    D3,D4                ;tracklength
  398.     BNE.S    .2
  399. .SKIPEMPTY
  400.     MOVEQ.L    #0,D4                ;new track
  401.     ADDQ.L    #1,D2
  402. .2
  403.     TST.L    D4
  404.     BNE.W    .3
  405.     CMP.L    #$A0,D2                ;UNTIL END OF DISK IS REACHED
  406.     BNE.W    .3
  407.  
  408.     MOVEQ.L    #0,D4
  409. .END    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1    ;switch motor off
  410.     MOVE.L    #0,IO_LENGTH(A1)
  411.     MOVE.W    #TD_MOTOR,IO_COMMAND(A1)
  412.     MOVE.L    (_SYSBASE).W,A6
  413.     JSR    _LVODOIO(A6)
  414.     TST.L    D4
  415.     BEQ.S    .SK
  416.  
  417.     MOVEQ.L    #0,D0                ;enable drive if error
  418.     MOVE.L    PTB_ENABLEDRIVE(A5),A0
  419.     JSR    (A0)
  420.  
  421. .SK
  422.  
  423.     MOVE.L    D4,D0
  424.     RTS
  425.  
  426. .ERR    MOVEQ.L    #-1,D4
  427.     BRA.S    .END
  428.  
  429. .NOTORG    TST.L    D7            ;if the first time the original
  430.     BNE.S    .ERR            ;was not in the source drive,
  431.     ST    D7            ;youll be asked to put it there
  432.  
  433.     LEA.L    LOADSTATE2(PC),A0    ;display 'please insert...'
  434.     MOVE.L    PTB_DISPLAY(A5),A6
  435.     JSR    (A6)
  436.  
  437.     MOVE.L    PTB_DEVICESOURCEPTR(A5),A1    ;motor off
  438.     MOVE.L    #0,IO_LENGTH(A1)
  439.     MOVE.W    #TD_MOTOR,IO_COMMAND(A1)
  440.     MOVE.L    (_SYSBASE).W,A6
  441.     JSR    _LVODOIO(A6)
  442.  
  443.     LEA.L    LINE1(PC),A0        ;requester 'please insert...'
  444.     LEA.L    LINE2(PC),A1
  445.     MOVE.L    PTB_REQUEST(A5),A6
  446.     JSR    (A6)
  447.     TST.L    D0
  448.     BNE.S    .ERR
  449.     BRA.W    .NEU
  450.  
  451. .DISPERR
  452.     MOVE.L    PTB_DEVICESOURCEPTR(A5),A1    ;motor off
  453.     MOVE.L    #0,IO_LENGTH(A1)
  454.     MOVE.W    #TD_MOTOR,IO_COMMAND(A1)
  455.     MOVE.L    (_SYSBASE).W,A6
  456.     JSR    _LVODOIO(A6)
  457.     BSR.W    TRACKERROR        ;requester 'error on track 000'
  458.     BRA.S    .ERR
  459.  
  460. LOADROUT3
  461.     MOVEQ.L    #0,D7                ;one diskchange allowed
  462. .NEU
  463. .4    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1    ;disk in sourcedrive?
  464.     MOVE.W    #TD_CHANGESTATE,IO_COMMAND(A1)
  465.     MOVE.L    (_SYSBASE).W,A6
  466.     JSR    _LVODOIO(A6)
  467.     TST.L    IO_ACTUAL(A1)
  468.     BNE.W    .NOTORG
  469.  
  470.     MOVE.L    PTB_ADDRESSOFFILE(A5),A4    ;load first part of disk
  471.     LEA.L    (A4),A2            ;offset to load in the dataspace
  472.     MOVEQ.L    #2,D2                ;starttrack on the disk
  473.     MOVEQ.L    #0,D4                ;data from the start of the track
  474. ;    bra.s    .5                ;because reading starts with
  475.                         ;trackstart, this is obsolete
  476.  
  477. .3    TST.L    D4
  478.     BNE.B    .1
  479. .5    MOVEQ.L    #$4,D6                ;4 tries, then error
  480.     MOVEQ.L    #2,D0                ;display track to read from
  481.     BSR.W    TRACKREADING
  482.  
  483. .55    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1
  484.     MOVE.L    PTB_SPACE(A5),IO_DATA(A1)    ;track is to load in PTB_SPACE
  485.     MOVE.L    #$7C00,IO_LENGTH(A1)        ;double length of track
  486.                         ;to decode the index-sync-read data
  487.     MOVE.L    D2,D0                ;my own trackcounter
  488.     MOVE.L    D0,IO_OFFSET(A1)
  489.     MOVE.W    #TD_RAWREAD,IO_COMMAND(A1)
  490.     MOVE.B    #IOTDB_INDEXSYNC,IO_FLAGS(A1)
  491.     MOVE.L    (_SYSBASE).W,A6
  492.     JSR    _LVODOIO(A6)
  493.     TST.L    D0
  494.     BNE.B    .NXCYCLE
  495.     MOVE.L    PTB_SPACE(A5),A0
  496.     LEA.L    $7C00(A0),A1            ;end of buffer
  497.     LEA.L    $7C02(A0),A3            ;due checksum
  498.     BSR.W    TRACKDECODE
  499.     TST.L    D0
  500.     BEQ.S    .R1OK
  501. .NXCYCLE
  502.     DBF    D6,.55
  503.     TST.L    D7
  504.     BNE.W    .DISPERR
  505.     BRA.B    .NOTORG
  506.  
  507. .R1OK    MOVE.W    #$140,D3
  508.     ADDQ.L    #1,D2
  509.     ST    D7                ;correct disk - nothing anymore
  510.                         ;to change
  511. .1    MOVE.B    (A3,D4.W),(A2)+
  512.     ADDQ.L    #1,D4
  513.     CMP.W    D3,D4                ;tracklength
  514.     BNE.S    .2
  515.     MOVEQ.L    #0,D4                ;new track
  516. .2
  517.     TST.L    D4
  518.     BNE.B    .3
  519.     CMP.L    #$3,D2                ;UNTIL TRACK $3 IS REACHED
  520.     BNE.B    .3
  521.  
  522.     MOVE.L    PTB_ADDRESSOFFILE(A5),A4    ;check if highscores were saved
  523.     MOVE.W    #$140-1,d0
  524. .H2    TST.B    (A4)+
  525.     BNE.S    .H
  526.     DBF    D0,.H2
  527.     MOVE.L    #HITAB,CHANGESARRAY+2*4        ;if not, generate them
  528. .H
  529.     MOVEQ.L    #0,D4
  530. .END    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1    ;switch motor off
  531.     MOVE.L    #0,IO_LENGTH(A1)
  532.     MOVE.W    #TD_MOTOR,IO_COMMAND(A1)
  533.     MOVE.L    (_SYSBASE).W,A6
  534.     JSR    _LVODOIO(A6)
  535.  
  536.     MOVEQ.L    #0,D0                ;enable drive unconditionally
  537.     MOVE.L    PTB_ENABLEDRIVE(A5),A0
  538.     JSR    (A0)
  539.  
  540.     MOVE.L    D4,D0
  541.     RTS
  542.  
  543. .ERR    MOVEQ.L    #0,D4                ;ignore error
  544.     MOVE.L    #HITAB,CHANGESARRAY+2*4        ;generate highscores
  545. ;            ^-^-^-^-^-^-^-^
  546.     BRA.S    .END
  547.  
  548. .NOTORG    TST.L    D7            ;if the first time the original
  549.     BNE.S    .ERR            ;was not in the source drive,
  550.     ST    D7            ;youll be asked to put it there
  551.  
  552.     LEA.L    LOADSTATE2(PC),A0    ;display 'please insert...'
  553.     MOVE.L    PTB_DISPLAY(A5),A6
  554.     JSR    (A6)
  555.  
  556.     MOVE.L    PTB_DEVICESOURCEPTR(A5),A1    ;motor off
  557.     MOVE.L    #0,IO_LENGTH(A1)
  558.     MOVE.W    #TD_MOTOR,IO_COMMAND(A1)
  559.     MOVE.L    (_SYSBASE).W,A6
  560.     JSR    _LVODOIO(A6)
  561.  
  562.     LEA.L    LINE1(PC),A0        ;requester 'please insert...'
  563.     LEA.L    LINE2(PC),A1
  564.     MOVE.L    PTB_REQUEST(A5),A6
  565.     JSR    (A6)
  566.     TST.L    D0
  567.     BNE.S    .ERR
  568.     BRA.W    .NEU
  569.  
  570. .DISPERR
  571.     MOVE.L    PTB_DEVICESOURCEPTR(A5),A1    ;motor off
  572.     MOVE.L    #0,IO_LENGTH(A1)
  573.     MOVE.W    #TD_MOTOR,IO_COMMAND(A1)
  574.     MOVE.L    (_SYSBASE).W,A6
  575.     JSR    _LVODOIO(A6)
  576.     BSR.W    TRACKERROR        ;requester 'error on track 000'
  577.     BRA.S    .ERR
  578.  
  579.  
  580. LINE1    DC.B    'Please insert your original',0
  581.     EVEN
  582. LINE2    DC.B    'in the source drive.',0
  583.     EVEN
  584.  
  585. ;< A0 RAWTRACK
  586. ;< A1 TRACKBUFFER
  587. ;> D0 ERROR
  588.  
  589.  
  590. GETSYNC
  591. ;SYNCANFANG SUCHEN
  592. .SHF2    MOVEQ.L    #$10-1,D5
  593. .SHF1    MOVE.L    (A0),D0
  594.     LSR.L    D5,D0
  595.     CMP.W    #$4429,D0    ;NITRO HAS $4429 AS SYNC
  596.     BEQ.S    .SY
  597.     DBF    D5,.SHF1
  598.     ADDQ.L    #2,A0
  599.     CMP.L    A0,A4
  600.     BHI.S    .SHF2
  601.     BRA.S    .ERR
  602. .SY    
  603.     MOVE.L    (A0),D0
  604.     ADDQ.L    #2,A0
  605.     LSR.L    D5,D0
  606.     CMP.W    #$4429,D0
  607.     BNE.S    .SY
  608.  
  609. .1    MOVE.L    (A0),D0
  610.     ADDQ.L    #2,A0
  611.     LSR.L    D5,D0
  612.     CMP.W    #$4429,D0
  613.     BEQ.S    .1
  614.     SUBQ.L    #2,A0
  615.     CMP.L    A0,A4
  616.     BLS.S    .ERR
  617.     MOVEQ.L    #0,D0
  618.     RTS
  619.  
  620. .ERR    MOVEQ.L    #-1,D0
  621.     RTS
  622.  
  623. GETSYNC2
  624. ;SYNCANFANG SUCHEN
  625. .SHF2    MOVEQ.L    #$10-1,D5
  626. .SHF1    MOVE.L    (A0),D0
  627.     LSR.L    D5,D0
  628.     CMP.W    #$428A,D0    ;NITRO-DISKCHECKTRACK HAS $428A AS SYNC
  629.     BEQ.S    .SY
  630.     DBF    D5,.SHF1
  631.     ADDQ.L    #2,A0
  632.     CMP.L    A0,A4
  633.     BHI.S    .SHF2
  634.     BRA.S    .ERR
  635. .SY    
  636.     MOVE.L    (A0),D0
  637.     ADDQ.L    #2,A0
  638.     LSR.L    D5,D0
  639.     CMP.W    #$428A,D0
  640.     BNE.S    .SY
  641.  
  642. .1    MOVE.L    (A0),D0
  643.     ADDQ.L    #2,A0
  644.     LSR.L    D5,D0
  645.     CMP.W    #$428A,D0
  646.     BEQ.S    .1
  647.     SUBQ.L    #2,A0
  648.     CMP.L    A0,A4
  649.     BLS.S    .ERR
  650.     MOVEQ.L    #0,D0
  651.     RTS
  652.  
  653. .ERR    MOVEQ.L    #-1,D0
  654.     RTS
  655.  
  656. ;    IFEQ    1
  657.  
  658. ;< A0 RAWTRACK
  659. ;< A1 TRACKBUFFER
  660. ;> D0 ERROR
  661. ;INTERN
  662. ;  D5 SHIFT-COUNT
  663. ;  D4 #$55555555
  664. ;track contains 1 WORD CHECKSUM, THEN $A6 WORDS
  665.  
  666. TRACKDECODE3    MOVEM.L    A2/A3/A4/A5/D2/D3/D4/D5/D6/D7,-(A7)
  667.     MOVE.L    A0,A3
  668.     MOVE.L    A1,A2
  669.     LEA.L    ($7C00-2*$18A0)(A0),A4    ;LAST CHANCE FOR CORRECT SYNC
  670.  
  671.     MOVE.L    #$55555555,D4        ;get syncposition (word+bitshift)
  672.     BSR.B    GETSYNC2
  673.     TST.L    D0
  674.     BNE.B    .ERR
  675.  
  676.     MOVE.W    #$A6,D7        ;decodes $A7 WORDS
  677. .1
  678. ;    MOVE.L    (A0)+,D2    ;ORIGINAL CODE
  679.  
  680.                 ;my *NEW* code to get a longword
  681.                 ;DOESNT REQUIRE THAT SUBQ #2,An ANYMORE
  682.     MOVE.L    (A0)+,D2    ;get higher word
  683.     LSR.L    D5,D2
  684.     SWAP    D2
  685.     MOVE.L    -2(A0),D6    ;get lower word
  686.     LSR.L    D5,D6
  687.     MOVE.W    D6,D2        ;my code ends
  688.  
  689.     ANDI.L    D4,D2
  690.     MOVE.L    D2,D3
  691.     SWAP    D3
  692.     ADD.W    D3,D3
  693.     OR.W    D3,D2
  694.     MOVE.W    D2,(A2)+
  695.     DBF    D7,.1
  696.  
  697.     MOVE.L    A1,A2
  698.     MOVE.W    (A2)+,D3
  699.     MOVE.W    #$14C,D6
  700.     BSR.B    CHECKSUM
  701.     CMP.W    D2,D3
  702.     BNE.S    .ERR
  703.  
  704.     MOVEQ.L    #0,D0
  705. .END
  706.     MOVEM.L    (A7)+,A2/A3/A4/A5/D2/D3/D4/D5/D6/D7
  707.     RTS
  708. .ERR
  709.     MOVEQ.L    #-1,D0
  710.     BRA.S    .END
  711.  
  712. TRACKDECODE    MOVEM.L    A2/A3/A4/A5/D2/D3/D4/D5/D6/D7,-(A7)
  713.     MOVE.L    A0,A3
  714.     MOVE.L    A1,A2
  715.     LEA.L    ($7C00-2*$18A0)(A0),A4    ;LAST CHANCE FOR CORRECT SYNC
  716.  
  717.     MOVE.L    #$55555555,D4
  718.     BSR.W    GETSYNC
  719.     TST.L    D0
  720.     BNE.B    .ERR
  721.  
  722.     MOVE.W    #$0626,D7    ;decodes $627*4=$189c bytes
  723. .1
  724. ;    MOVE.L    (A0)+,D0    ;original line
  725.  
  726.                 ;my *NEW* code to get a longword
  727.     MOVE.L    (A0)+,D0    ;get higher word
  728.     LSR.L    D5,D0
  729.     SWAP    D0
  730.     MOVE.L    -2(A0),D6    ;get lower word
  731.     LSR.L    D5,D6
  732.     MOVE.W    D6,D0        ;my code ends
  733.  
  734.  
  735. ;    MOVE.L    (A0)+,D1    ;original line
  736.  
  737.                 ;my *NEW* code to get a longword
  738.     MOVE.L    (A0)+,D1    ;get higher word
  739.     LSR.L    D5,D1
  740.     SWAP    D1
  741.     MOVE.L    -2(A0),D6    ;get lower word
  742.     LSR.L    D5,D6
  743.     MOVE.W    D6,D1        ;my code ends
  744.  
  745.     AND.L    D4,D0
  746.     AND.L    D4,D1
  747.     ADD.L    D0,D0
  748.     OR.L    D1,D0
  749.     MOVE.L    D0,(A2)+
  750.     DBF    D7,.1
  751.     MOVEQ    #$01,D3
  752.  
  753.     MOVE.L    A1,A2
  754.     MOVE.W    (A2)+,D3
  755.     MOVE.W    #$189A,D6
  756.     BSR.B    CHECKSUM
  757.     CMP.W    D2,D3
  758.     BNE.S    .ERR
  759. ;    LSR.W    #1,D6
  760. ;    SUBQ.W    #1,D6
  761. ;.2    MOVE.W    (A1)+,(Ax)+
  762. ;    SUBQ.L    #1,D0
  763. ;    DBLE    D6,.2
  764. ;    CMP.W    D0,D0
  765.  
  766.     MOVEQ.L    #0,D0
  767. .END
  768.     MOVEM.L    (A7)+,A2/A3/A4/A5/D2/D3/D4/D5/D6/D7
  769.     RTS
  770. .ERR
  771.     MOVEQ.L    #-1,D0
  772.     BRA.S    .END
  773.  
  774.  
  775. CHECKSUM
  776.     MOVEM.L    D1/D6/A1,-(A7)
  777.     LSR.W    #1,D6
  778.     MOVEQ    #-$01,D2
  779.     ADD.W    D2,D2
  780.     BRA.B    .1
  781.  
  782. .2    MOVE.W    (A2)+,D1
  783.     ADDX.W    D1,D2
  784. .1    DBF    D6,.2
  785.     MOVEM.L    (A7)+,D1/D6/A1
  786.     RTS    
  787.  
  788. ;    ENDC
  789.  
  790.  
  791. ;LB_FFF4    DC.L    $AAAAAAAA
  792. ;    DC.L    $55555555
  793. ;    DC.W    $4429
  794.  
  795. ;< A0 RAWTRACK
  796. ;< A1 TRACKBUFFER
  797. ;> D0 ERROR
  798. ;> D1 TRACKLENGTH
  799. ;INTERN
  800. ;  D5 SHIFT-COUNT
  801. ;  D4 #$55555555
  802.  
  803. ANDVALUE    DC.L    $AAAAAAAA
  804.  
  805. TRACKDECODE2    MOVEM.L    A2/A3/A4/A5/D2/D3/D4/D5/D6/D7,-(A7)
  806.     LEA.L    ($7C00-2*$1A00)(A0),A4    ;LAST CHANCE FOR CORRECT SYNC
  807.     MOVE.L    D2,D7        ;SAVE ACTUAL TRACK-#
  808.  
  809.     MOVE.L    #$55555555,D4
  810.     BSR.W    GETSYNC
  811.     TST.L    D0
  812.     BNE.B    .ERR
  813.  
  814.     MOVE.L    D5,A4
  815.  
  816.  
  817. ;    MOVE.L    (A0)+,D5    ;CHECKSUM2
  818.     BSR.W    MYLONGWORD
  819.     MOVE.L    D0,D5
  820.     ANDI.L    #$55555555,D5
  821.     MOVE.W    D5,D1
  822.     SWAP    D5
  823.     ADD.W    D5,D5
  824.     OR.W    D1,D5
  825. ;    MOVE.B    $B(A3),D0    ;??? 0
  826. ;    ANDI.W    #$0001,D0
  827. ;    ADD.W    D0,D0
  828. ;    ADD.W    D0,D0
  829. ;    LEA    LB_FFF4(PC),A2
  830. ;    MOVE.L    (A2,D0.W),D1    ;DATA-AND
  831.     MOVE.L    ANDVALUE(PC),D1    ;REPLACEMENT FOR 6 LINES BEFORE
  832.  
  833. ;    MOVEQ    #$00,D0
  834. ;    MOVE.B    $0009(A3),D0    ;TRACK-#
  835.     MOVE.L    D7,D0
  836.     ADD.W    D0,D0
  837. ;    LEA    $001E(A3),A2
  838.     LEA.L    TRACKDATALENGTH(PC),A2
  839.     MOVE.W    (A2,D0.W),D7
  840. ;    MOVE.L    A1,A2
  841.     MOVEM.L    D5/D7,-(A7)
  842.     BSR.B    LB_0062
  843.     MOVEM.L    (A7)+,D5/D7
  844.     MOVE.W    D6,D2
  845.     SWAP    D6
  846.     EOR.W    D6,D2
  847.     ANDI.W    #$FFF0,D2
  848.     MOVE.W    D7,D1
  849.     CMP.W    D2,D5
  850.     BNE.S    .ERR
  851. ;    MOVEM.L    (A7)+,D1-A6
  852.     MOVEQ.L    #0,D0
  853. .END
  854.     MOVEM.L    (A7)+,A2/A3/A4/A5/D2/D3/D4/D5/D6/D7
  855.     RTS
  856. .ERR
  857.     MOVEQ.L    #-1,D0
  858.     BRA.S    .END
  859.     RTS    
  860.  
  861. LB_0062    MOVEQ    #$1F,D2
  862.     MOVEQ    #$1F,D4
  863.     MOVEQ    #$00,D3
  864.     MOVEQ    #$00,D6
  865.     SUBQ.W    #1,D7
  866.     MOVEQ    #$1F,D5
  867. LB_006E    TST.W    $0002(A0)
  868.     BEQ.B    LB_006E
  869. ;    MOVE.L    (A0)+,D0
  870.     BSR.S    MYLONGWORD
  871.     BTST    D4,D0
  872.     BEQ.B    LB_00A2
  873.  
  874. LB_007A    ADD.L    D3,D3
  875.     ADDQ.W    #1,D3
  876.     DBF    D5,LB_0090
  877.     EOR.L    D1,D3
  878.     ADD.L    D3,D6
  879.     MOVE.L    D3,(A1)+
  880.     DBF    D7,LB_008E
  881.  
  882.     BRA.B    LB_00F0
  883.  
  884. LB_008E    MOVEQ    #$1F,D5
  885. LB_0090    SUBQ.W    #2,D4
  886.     BPL.B    LB_009E
  887.  
  888.     AND.W    D2,D4
  889. LB_0096    TST.W    $0002(A0)
  890.     BEQ.B    LB_0096
  891. ;    MOVE.L    (A0)+,D0
  892.     BSR.S    MYLONGWORD
  893. LB_009E    BTST    D4,D0
  894.     BNE.B    LB_007A
  895. LB_00A2    ADD.L    D3,D3
  896.     DBF    D5,LB_00B6
  897.  
  898.     EOR.L    D1,D3
  899.     ADD.L    D3,D6
  900.     MOVE.L    D3,(A1)+
  901.     DBF    D7,LB_00B4
  902.     BRA.B    LB_00F0
  903. LB_00B4    MOVEQ    #$1F,D5
  904. LB_00B6    DBF    D4,LB_00C4
  905.     MOVEQ    #$1F,D4
  906. LB_00BC    TST.W    $0002(A0)
  907.     BEQ.B    LB_00BC
  908. ;    MOVE.L    (A0)+,D0
  909.     BSR.S    MYLONGWORD
  910. LB_00C4    BTST    D4,D0
  911.     BNE.B    LB_007A
  912.     ADD.L    D3,D3
  913.     DBF    D5,LB_00DC
  914.     EOR.L    D1,D3
  915.     ADD.L    D3,D6
  916.     MOVE.L    D3,(A1)+
  917.     DBF    D7,LB_00DA
  918.     BRA.B    LB_00F0
  919.  
  920. LB_00DA    MOVEQ    #$1F,D5
  921. LB_00DC    SUBQ.W    #3,D4
  922.     BPL.B    LB_00EA
  923.     AND.W    D2,D4
  924. LB_00E2    TST.W    $0002(A0)
  925.     BEQ.B    LB_00E2
  926. ;    MOVE.L    (A0)+,D0
  927.     BSR.S    MYLONGWORD
  928. LB_00EA    BTST    D4,D0
  929.     BNE.B    LB_007A
  930.     BEQ.B    LB_00A2
  931.  
  932. LB_00F0    RTS    
  933.  
  934. ;    ORI.B    #$90,D0
  935. ;    ADDA.L    #$00000008,A0
  936. ;    DBF    D7,LB_00F4
  937. ;    RTS    
  938.  
  939.  
  940. MYLONGWORD
  941.     MOVEM.L    D5/D6,-(A7)
  942.     MOVE.L    A4,D5        ;due lack of data registers shift stored in A4
  943.                 ;my *NEW* code to get a longword
  944.     MOVE.L    (A0)+,D0    ;get higher word
  945.     LSR.L    D5,D0
  946.     SWAP    D0
  947.     MOVE.L    -2(A0),D6    ;get lower word
  948.     LSR.L    D5,D6
  949.     MOVE.W    D6,D0        ;my code ends
  950.  
  951.     MOVEM.L    (A7)+,D5/D6
  952.     RTS
  953.  
  954. TRACKDATALENGTH
  955.     DS.W    $A0
  956. TRACKDATALENGTHEND
  957.     DC.W    0
  958.  
  959. HITAB
  960.     DC.B    $00,$80,$00,$02,$05,$1F,$40,$4D
  961.     DC.B    $41,$4A,$00,$80,$00,$0A,$05,$1B
  962.     DC.B    $58,$52,$41,$59,$00,$80,$00,$12
  963.     DC.B    $05,$17,$70,$53,$41,$52,$00,$80
  964.     DC.B    $00,$1A,$05,$13,$88,$4A,$46,$57
  965.     DC.B    $00,$80,$00,$22,$05,$0F,$A0,$43
  966.     DC.B    $53,$57,$00,$80,$00,$2A,$05,$0B
  967.     DC.B    $B8,$4E,$45,$54,$00,$80,$00,$32
  968.     DC.B    $05,$07,$D0,$49,$41,$4E,$00,$80
  969.     DC.B    $00,$3A,$05,$03,$E8,$53,$56,$52
  970.     DC.B    $00,$80,$00,$42,$05,$17,$70,$20
  971.     DC.B    $20,$20,$00,$80,$00,$4A,$05,$17
  972.     DC.B    $70,$20,$20,$20,$00,$80,$00,$52
  973.     DC.B    $05,$17,$70,$20,$20,$20,$00,$80
  974.     DC.B    $00,$5A,$05,$17,$70,$20,$20,$20
  975.     DC.B    $00,$80,$00,$62,$05,$17,$70,$20
  976.     DC.B    $20,$20,$00,$80,$00,$6A,$05,$17
  977.     DC.B    $70,$20,$20,$20,$00,$80,$00,$72
  978.     DC.B    $05,$17,$70,$20,$20,$20,$00,$80
  979.     DC.B    $00,$7A,$05,$17,$70,$20,$20,$20
  980.     DC.B    $00,$80,$00,$82,$05,$17,$70,$20
  981.     DC.B    $20,$20,$00,$80,$00,$8A,$05,$17
  982.     DC.B    $70,$20,$20,$20,$00,$80,$00,$92
  983.     DC.B    $05,$17,$70,$20,$20,$20,$00,$80
  984.     DC.B    $00,$9A,$05,$17,$70,$20,$20,$20
  985.     DC.B    $00,$80,$00,$A2,$05,$17,$70,$20
  986.     DC.B    $20,$20,$00,$80,$00,$AA,$05,$17
  987.     DC.B    $70,$20,$20,$20,$00,$80,$00,$B2
  988.     DC.B    $05,$17,$70,$20,$20,$20,$00,$80
  989.     DC.B    $00,$BA,$05,$17,$70,$20,$20,$20
  990.     DC.B    $00,$80,$00,$C2,$05,$17,$70,$20
  991.     DC.B    $20,$20,$00,$80,$00,$CA,$05,$17
  992.     DC.B    $70,$20,$20,$20,$00,$80,$00,$D2
  993.     DC.B    $05,$17,$70,$20,$20,$20,$00,$80
  994.     DC.B    $00,$DA,$05,$17,$70,$20,$20,$20
  995.     DC.B    $00,$80,$00,$E2,$05,$17,$70,$20
  996.     DC.B    $20,$20,$00,$80,$00,$EA,$05,$17
  997.     DC.B    $70,$20,$20,$20,$00,$80,$00,$F2
  998.     DC.B    $05,$17,$70,$20,$20,$20,$00,$80
  999.     DC.B    $00,$FA,$05,$17,$70,$20,$20,$20
  1000.     DC.B    $00,$80,$01,$02,$05,$17,$70,$20
  1001.     DC.B    $20,$20,$00,$80,$01,$0A,$05,$17
  1002.     DC.B    $70,$20,$20,$20,$00,$80,$01,$12
  1003.     DC.B    $05,$17,$70,$20,$20,$20,$00,$80
  1004.     DC.B    $01,$1A,$05,$17,$70,$20,$20,$20
  1005.     DC.B    $00,$80,$01,$22,$05,$17,$70,$20
  1006.     DC.B    $20,$20,$00,$80,$01,$2A,$05,$17
  1007.     DC.B    $70,$20,$20,$20,$00,$80,$01,$32
  1008.     DC.B    $05,$17,$70,$20,$20,$20,$00,$80
  1009.     DC.B    $01,$3A,$05,$17,$70,$20,$20,$20
  1010.     DC.B    $00,$40,$00,$00
  1011.  
  1012.  
  1013.