home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD1.iso / Emulatoren / AMORICV0.LHA / AmoricV0_8b / src / CPU6502_020.asm < prev    next >
Encoding:
Assembly Source File  |  1995-10-11  |  16.0 KB  |  1,112 lines

  1. ; D0   : **scratch**
  2. ; d1.b : A
  3. ; d2.b : X
  4. ; d3.b : Y
  5. ; d4.b : P
  6. ; d5.b : S
  7. ; D6   : **scratch**
  8. ; D7   : **scratch**
  9.  
  10. ; a0.l : Mem Ptr
  11. ; a1.l : Mem Ptr + $304
  12. ; a2.l : Functable pour les instructions
  13. ; a3.l : Pointeur sur diverses tables
  14. ; a4.l : PC+Base Adr
  15. ; a5.l : Retour apres traitement d'instruction
  16. ; a6.l : **Scratch**
  17.  
  18.     MACHINE    68020
  19.  
  20.         XDEF    _FunctTable
  21.     XDEF    _MiscTable
  22.  
  23.         XDEF    _InitFonctions
  24.         XDEF    _BRK
  25.         XDEF    _IRQ
  26.         XDEF    _LDA
  27.         XDEF    _RTS
  28.         
  29.     XDEF    _TapeMemPtr
  30.     XDEF    _TapeMemSize
  31.     XDEF    _TapeMemOffset
  32.  
  33.     XDEF    _NextJump
  34.  
  35.     XREF    _BreakReason
  36.     XREF    _ReturnToMonitor
  37.     XREF    @Place
  38.  
  39.     XREF    _PlaySample
  40.  
  41.     XREF    _son_keybeep
  42.     XREF    _son_contbeep
  43.     XREF    _son_zap
  44.     XREF    _son_ping
  45.  
  46.     include    "my_defs.i"
  47.     include    "my_macros.asm"
  48.     include "CPUmacros.asm"
  49.  
  50. SETFUNCT: MACRO
  51.     move.l    #\2,D0
  52.     lsl.l    #2,D0
  53.     move.l    #\1,(A1,D0.L)
  54.     ENDM
  55.  
  56. ; *** Elaboration de certaines fonctions ***
  57. ; *** (Merci les macros !!!) ***
  58.  
  59.  
  60.     MODESADD    LDA
  61.     MODESADD    LDX
  62.     MODESADD    LDY
  63.     
  64.     MODESADD    STA
  65.     MODESADD    STX
  66.     MODESADD    STY
  67.  
  68.     MODESADD    CMP
  69.     MODESADD    CPX
  70.     MODESADD    CPY
  71.  
  72.     MODESADD    AND
  73.     MODESADD    EOR
  74.     MODESADD    ORA
  75.  
  76.     MODESADD    ADC
  77.     MODESADD    SBC
  78.  
  79.     MODESADD    INC
  80.     MODESADD    DEC
  81.  
  82.     MODESADD    LSR
  83.     MODESADD    ASL
  84.     MODESADD    ROL
  85.     MODESADD    ROR    
  86.     MODESADD    BIT
  87.  
  88. ; *** Decalages ***
  89.  
  90. LogicalShiftRight:MACRO
  91.     lsr.b    #1,\1
  92.     TEST_NZC
  93.     ENDM
  94.  
  95. ArithmeticShiftLeft:MACRO
  96.     asl.b    #1,\1
  97.     TEST_NZC
  98.     ENDM
  99.  
  100. RotateRight:MACRO
  101.     SET_C2X
  102.     roxr.b    #1,\1
  103.     TEST_NZC
  104.     ENDM
  105.  
  106. RotateLeft:MACRO
  107.     SET_C2X
  108.     roxl.b    #1,\1
  109.     TEST_NZC
  110.     ENDM    
  111.             
  112. ; *** Mettre une banque de fonctions a en valeur
  113.  
  114. SetFunctionBank:
  115.     STORE_REGS
  116.     move.w    #$F,D2
  117.     
  118. SFBLoop:
  119.     move.l    D0,D1
  120.     lsl.l    #2,D1
  121.     move.l    A2,(A1,D1.L)
  122.  
  123.     add.l    #$10,D0
  124.     dbf    D2,SFBLoop
  125.  
  126.     RESTORE_REGS
  127.     rts
  128.  
  129. ; *** Initialiser les fonctions ***
  130.  
  131. _InitFonctions:
  132.     lea    _FunctTable,A1
  133.     lea    IllegalInstruction(PC),A2
  134.     move.l    #$FF,D0
  135. IFLoop:
  136.     move.l    A2,(A1)+
  137.     dbf    D0,IFLoop
  138.  
  139.     lea    _FunctTable,A1
  140.  
  141.     moveq.l    #2,D0
  142.     lea    IllegalInstruction(PC),A2
  143.     bsr    SetFunctionBank
  144.  
  145.     moveq.l    #3,D0
  146.     lea    NOP2(PC),A2
  147.     bsr    SetFunctionBank
  148.     moveq.l    #4,D0
  149.     bsr    SetFunctionBank
  150.     moveq.l    #7,D0
  151.     bsr    SetFunctionBank
  152.  
  153.     moveq.l    #$A,D0
  154.     lea    NOP(PC),A2
  155.     bsr    SetFunctionBank
  156.     moveq.l    #$B,D0
  157.     bsr    SetFunctionBank
  158.  
  159.     moveq.l    #$C,D0
  160.     lea    NOP3(PC),A2
  161.     bsr    SetFunctionBank
  162.     move.b    #$F,D0
  163.     bsr    SetFunctionBank
  164.  
  165.  
  166.     SETFUNCT _BRK,$00
  167.     SETFUNCT JSR,$20
  168.     SETFUNCT JMP_IMM,$4C
  169.     SETFUNCT JMP_IND,$6C
  170.     SETFUNCT RTS,$60
  171.     SETFUNCT RTI,$40
  172.     SETFUNCT ADC_ZRP,$65
  173.     SETFUNCT ADC_IMM,$69
  174.     SETFUNCT ADC_ZRPX,$75
  175.     SETFUNCT ADC_INDX,$61
  176.     SETFUNCT ADC_INDY,$71
  177.     SETFUNCT ADC_ABS,$6D
  178.     SETFUNCT ADC_ABSX,$7D
  179.     SETFUNCT ADC_ABSY,$79
  180.     SETFUNCT SBC_ZRP,$E5
  181.     SETFUNCT SBC_IMM,$E9
  182.     SETFUNCT SBC_ZRPX,$F5
  183.     SETFUNCT SBC_INDX,$E1
  184.     SETFUNCT SBC_INDY,$F1
  185.     SETFUNCT SBC_ABS,$ED
  186.     SETFUNCT SBC_ABSX,$FD
  187.     SETFUNCT SBC_ABSY,$F9
  188.     SETFUNCT BIT_ZRP,$24
  189.     SETFUNCT BIT_ABS,$2C
  190.     SETFUNCT STA_INDX,$81
  191.     SETFUNCT STA_ABS,$8D
  192.     SETFUNCT STA_ABSX,$9D
  193.     SETFUNCT STA_ABSY,$99
  194.     SETFUNCT STA_INDY,$91
  195.     SETFUNCT STA_ZRP,$85
  196.     SETFUNCT STA_ZRPX,$95
  197.     SETFUNCT STX_ZRP,$86
  198.     SETFUNCT STX_ZRPY,$96
  199.     SETFUNCT STX_ABS,$8E
  200.     SETFUNCT STY_ZRP,$84
  201.     SETFUNCT STY_ZRPX,$94
  202.     SETFUNCT STY_ABS,$8C
  203.     SETFUNCT LDY_IMM,$A0
  204.     SETFUNCT LDY_ZRP,$A4
  205.     SETFUNCT LDY_ZRPX,$B4
  206.     SETFUNCT LDY_ABS,$AC
  207.     SETFUNCT LDY_ABSX,$BC
  208.     SETFUNCT LDX_IMM,$A2
  209.     SETFUNCT LDX_ZRP,$A6
  210.     SETFUNCT LDX_ZRPY,$B6
  211.     SETFUNCT LDX_ABS,$AE
  212.     SETFUNCT LDX_ABSY,$BE
  213.     SETFUNCT LDA_IMM,$A9
  214.     SETFUNCT LDA_ZRP,$A5
  215.     SETFUNCT LDA_ZRPX,$B5
  216.     SETFUNCT LDA_INDX,$A1
  217.     SETFUNCT LDA_INDY,$B1
  218.     SETFUNCT LDA_ABS,$AD
  219.     SETFUNCT LDA_ABSX,$BD
  220.     SETFUNCT LDA_ABSY,$B9
  221.     SETFUNCT AND_IMM,$29
  222.     SETFUNCT AND_ZRP,$25
  223.     SETFUNCT AND_ZRPX,$35
  224.     SETFUNCT AND_INDX,$21
  225.     SETFUNCT AND_INDY,$31
  226.     SETFUNCT AND_ABS,$2D
  227.     SETFUNCT AND_ABSX,$3D
  228.     SETFUNCT AND_ABSY,$39
  229.     SETFUNCT EOR_IMM,$49
  230.     SETFUNCT EOR_ZRP,$45
  231.     SETFUNCT EOR_ZRPX,$55
  232.     SETFUNCT EOR_INDX,$41
  233.     SETFUNCT EOR_INDY,$51
  234.     SETFUNCT EOR_ABS,$4D
  235.     SETFUNCT EOR_ABSX,$5D
  236.     SETFUNCT EOR_ABSY,$59
  237.     SETFUNCT ORA_IMM,$09
  238.     SETFUNCT ORA_ZRP,$05
  239.     SETFUNCT ORA_ZRPX,$15
  240.     SETFUNCT ORA_INDX,$01
  241.     SETFUNCT ORA_INDY,$11
  242.     SETFUNCT ORA_ABS,$0D
  243.     SETFUNCT ORA_ABSX,$1D
  244.     SETFUNCT ORA_ABSY,$19
  245.     SETFUNCT CMP_ZRP,$C5
  246.     SETFUNCT CMP_IMM,$C9
  247.     SETFUNCT CMP_INDY,$D1
  248.     SETFUNCT CMP_INDX,$C1
  249.     SETFUNCT CMP_ZRPX,$D5
  250.     SETFUNCT CMP_ABS,$CD
  251.     SETFUNCT CMP_ABSX,$DD
  252.     SETFUNCT CMP_ABSY,$D9
  253.     SETFUNCT CPX_IMM,$E0
  254.     SETFUNCT CPX_ZRP,$E4
  255.     SETFUNCT CPX_ABS,$EC
  256.     SETFUNCT CPY_IMM,$C0
  257.     SETFUNCT CPY_ZRP,$C4
  258.     SETFUNCT CPY_ABS,$CC
  259.     SETFUNCT BCC,$90
  260.     SETFUNCT BCS,$B0
  261.     SETFUNCT BEQ,$F0
  262.     SETFUNCT BNE,$D0
  263.     SETFUNCT BMI,$30
  264.     SETFUNCT BPL,$10
  265.     SETFUNCT BVC,$50
  266.     SETFUNCT BVS,$70
  267.     SETFUNCT CLD,$D8
  268.     SETFUNCT SED,$F8
  269.     SETFUNCT CLC,$18
  270.     SETFUNCT SEC,$38
  271.     SETFUNCT CLI,$58
  272.     SETFUNCT SEI,$78
  273.     SETFUNCT CLV,$B8
  274.     SETFUNCT NOP,$EA
  275.     SETFUNCT TXA,$8A
  276.     SETFUNCT TXS,$9A
  277.     SETFUNCT TYA,$98
  278.     SETFUNCT TSX,$BA
  279.     SETFUNCT TAY,$A8
  280.     SETFUNCT TAX,$AA
  281.     SETFUNCT INX,$E8
  282.     SETFUNCT INY,$C8
  283.     SETFUNCT DEX,$CA
  284.     SETFUNCT DEY,$88
  285.     SETFUNCT PHA,$48
  286.     SETFUNCT PHP,$08
  287.     SETFUNCT PLA,$68
  288.     SETFUNCT PLP,$28
  289.     SETFUNCT ROL_IMP,$2A
  290.     SETFUNCT ROL_ZRP,$26
  291.     SETFUNCT ROL_ZRPX,$36
  292.     SETFUNCT ROL_ABS,$2E
  293.     SETFUNCT ROL_ABSX,$3E
  294.     SETFUNCT ROR_IMP,$6A
  295.     SETFUNCT ROR_ZRP,$66
  296.     SETFUNCT ROR_ZRPX,$76
  297.     SETFUNCT ROR_ABS,$6E
  298.     SETFUNCT ROR_ABSX,$7E
  299.     SETFUNCT ASL_IMP,$0A
  300.     SETFUNCT ASL_ZRP,$06
  301.     SETFUNCT ASL_ZRPX,$16
  302.     SETFUNCT ASL_ABS,$0E
  303.     SETFUNCT ASL_ABSX,$1E
  304.     SETFUNCT LSR_IMP,$4A
  305.     SETFUNCT LSR_ZRP,$46
  306.     SETFUNCT LSR_ZRPX,$56
  307.     SETFUNCT LSR_ABS,$4E
  308.     SETFUNCT LSR_ABSX,$5E
  309.     SETFUNCT DEC_ZRP,$C6
  310.     SETFUNCT DEC_ZRPX,$D6
  311.     SETFUNCT DEC_ABS,$CE
  312.     SETFUNCT DEC_ABSX,$DE
  313.     SETFUNCT INC_ZRP,$E6
  314.     SETFUNCT INC_ZRPX,$F6
  315.     SETFUNCT INC_ABS,$EE
  316.     SETFUNCT INC_ABSX,$FE
  317.     SETFUNCT TrapOPCode,$07
  318.     SETFUNCT TrapOPCode,BREAK_CODE
  319.     SETFUNCT TrapOPCode,PRINT_CODE
  320.     SETFUNCT TrapOPCode,TAPE_CODE
  321.     SETFUNCT TrapOPCode,SOUND_CODE
  322.     SETFUNCT TrapOPCode,FRESET_CODE
  323.  
  324. ; *** Quelques instructions non documentees
  325. ; Remplacees par des NOP avec PC+=1 2 ou 3
  326.  
  327.     SETFUNCT NOP,$80
  328.     SETFUNCT NOP,$89
  329.  
  330.     SETFUNCT NOP3,$0C
  331.     SETFUNCT NOP3,$9E
  332.  
  333.     move.l    #STACK_BEGIN,D5 ; initialiser le mot haut de la pile.
  334.             
  335.     rts
  336.  
  337. _FunctTable:
  338.     blk.l 256
  339.  
  340. ; *** Instructions illegales ***
  341.  
  342. IllegalInstruction
  343.     BAD_INST    ILLEGAL_INSTRUCTION
  344.     
  345.  
  346. ; *** Instructions Trappees ***
  347. ; *** Breakpoints ou instructions foireuses
  348.  
  349. TrapOPCode:
  350.     move.b    -1(A4),D6    ; Instruction courante
  351.  
  352.     cmp.b    #TAPE_CODE,D6
  353.     beq    IOOperation
  354.  
  355.     cmp.b    #SOUND_CODE,D6
  356.     beq    IOOperation
  357.  
  358. NotaSound:
  359.     cmp.b    #BREAK_CODE,D6
  360.     bne.b    NotaBreakpoint
  361.     BAD_INST    BREAKPOINT
  362. NotaBreakpoint:
  363.     cmp.b    #FRESET_CODE,D6
  364.     bne.b    NotFastReset
  365.     
  366.     move.l    A4,D0
  367.     sub.l    A0,D0
  368.     cmp.w    #$FA3D,D0
  369.     bne.b    NotFastReset
  370.  
  371.     ; Fast Reset, remplace la routine originale
  372.  
  373.     STORE_REGS
  374.     move.w    #$2EFC,D6    ; (C000-400-1)/4
  375.     add.w    #$400,A0
  376.     move.l    #$55555555,D7
  377. FRLoop:
  378.     move.l    D7,(A0)+
  379.     dbf    D6,FRLoop
  380.  
  381.     RESTORE_REGS
  382.  
  383.     move.w    #$00C0,$C(A0)    ; $C000 a l'envers
  384.  
  385.     add.l    #$20,A4    ; PC = FA5D
  386.     GOOD_INST
  387.  
  388. NotFastReset:
  389.     BAD_INST    ILLEGAL_INSTRUCTION    
  390.  
  391.  
  392.  
  393. ; ******* LDA *********
  394. ; ******* A=D1.B ******
  395. ; ******* Param:D6.L ******
  396.  
  397. LDA:
  398. _LDA:
  399.     LDz    D1
  400.     
  401. LDA_IMM:
  402.     LDz_IMM    D1
  403.  
  404. ; ******* LDX *********
  405. ; ******* X=D2.B ******
  406. ; ******* Param:D6.L ******
  407.  
  408. LDX:
  409.     LDz    D2
  410.  
  411. LDX_IMM:
  412.     LDz_IMM    D2
  413.     
  414. ; ******* LDY *********
  415. ; ******* Y=D3.B ******
  416. ; ******* Param:D6.L ******
  417.  
  418. LDY:
  419.     LDz    D3
  420.  
  421. LDY_IMM:
  422.     LDz_IMM    D3
  423.  
  424. ; ******* STA *********
  425. ; ******* Adresse:D6 ******
  426.  
  427. STA:
  428.     STz    D1
  429.  
  430. ; ******* STX *********
  431. ; ******* Adresse:D6 ******
  432.  
  433. STX:
  434.     STz    D2
  435.  
  436. ; ******* STY *********
  437. ; ******* Adresse:D6 ******
  438.  
  439. STY:
  440.     STz    D3
  441.         
  442. ; ******* CMP *********
  443. ; ******* A=D1.B ******
  444. ; ******* Param:D6.L ******
  445.  
  446. CMP:
  447.     CPz    D1
  448. CMP_IMM:
  449.     CPz_IMM    D1
  450.     
  451. ; ******* CPX *********
  452. ; ******* X=D2.B ******
  453. ; ******* Param:D6.L ******
  454.  
  455. CPX:
  456.     CPz    D2
  457. CPX_IMM:
  458.     CPz_IMM    D2
  459.     
  460. ; ******* CPY *********
  461. ; ******* Y=D3.B ******
  462. ; ******* Param:D6.L ******
  463.  
  464. CPY:
  465.     CPz    D3
  466.  
  467. CPY_IMM:
  468.     CPz_IMM    D3
  469.     
  470. ; ******* ADC *********
  471. ; ******* A=D1.B ******
  472. ; ******* Param:D6.L ******
  473.  
  474. ADC:
  475.     move.b    (A0,D6.L),D7
  476.     ADC_MACRO
  477. ADC_IMM:
  478.     move.b    (A4)+,D7
  479.     ADC_MACRO
  480.     
  481. ; ******* SBC *********
  482. ; ******* A=D1.B ******
  483. ; ******* Param:D6.b ******
  484.  
  485. SBC:
  486.     move.b    (A0,D6.L),D7
  487.     SBC_MACRO
  488.  
  489. SBC_IMM:
  490.     move.b    (A4)+,D7
  491.     SBC_MACRO
  492.  
  493.  
  494. ; ******* EOR Immediat *********
  495. ; ******* A=D1.B ******
  496. ; ******* Param:D6.b ******
  497.  
  498. EOR_IMM:
  499.     MOVE.B    (A4)+,D6
  500.     EOR.B    D6,D1
  501.     TEST_NZ
  502.     GOOD_INST
  503.  
  504. ; ******* EOR *********
  505. ; ******* A=D1.B ******
  506. ; ******* Param:D6.b ******
  507.  
  508. EOR:
  509.     MOVE.B    (A0,D6.L),D6
  510.     EOR.B    D6,D1
  511.     TEST_NZ
  512.     GOOD_INST
  513.     
  514. ; ******* ORA Immediat *********
  515. ; ******* A=D1.B ******
  516. ; ******* Param:D6.b ******
  517.  
  518. ORA_IMM:
  519.     MOVE.B    (A4)+,D6
  520.     OR.B    D6,D1
  521.     TEST_NZ
  522.     GOOD_INST
  523.  
  524. ; ******* ORA *********
  525. ; ******* A=D1.B ******
  526. ; ******* Param:D6.b ******
  527.  
  528. ORA:
  529.     MOVE.B    (A0,D6.L),D6
  530.     OR.B    D6,D1
  531.     TEST_NZ
  532.     GOOD_INST
  533.     
  534. ; ******* AND Immediat*********
  535. ; ******* A=D1.B ******
  536. ; ******* Param:D6.b ******
  537.  
  538. AND_IMM:
  539.     MOVE.B    (A4)+,D6
  540.     AND.B    D6,D1
  541.     TEST_NZ
  542.     GOOD_INST
  543.     
  544. ; ******* AND *********
  545. ; ******* A=D1.B ******
  546. ; ******* Param:D6.b ******
  547.  
  548. AND:
  549.     MOVE.B    (A0,D6.L),D6
  550.     AND.B    D6,D1
  551.     TEST_NZ
  552.     GOOD_INST
  553.     
  554.  
  555. ; ******* INC *********
  556. ; ******* A=D1.B ******
  557. ; ******* Param:D6 ******
  558.  
  559. INC:
  560.     move.b    (A0,D6.L),D7
  561.     addq.b    #1,D7
  562.     TEST_NZ
  563.     jsr    @Place
  564.     GOOD_INST
  565.  
  566. ; ******* DEC *********
  567. ; ******* A=D1.B ******
  568. ; ******* Param:D6 ******
  569.  
  570. DEC:
  571.     move.b    (A0,D6.L),D7
  572.     subq.b    #1,D7
  573.     TEST_NZ
  574.     jsr    @Place
  575.     GOOD_INST
  576.  
  577. ; ******* BIT Immediat *********
  578. ; ******* A=D1.B ******
  579. ; ******* Param:D6 ******
  580.  
  581. BIT_IMM:
  582.     move.b    (A4)+,D6
  583.     BIT_MACRO
  584.     GOOD_INST
  585.  
  586. ; ******* BIT *********
  587. ; ******* A=D1.B ******
  588. ; ******* Param:D6 ******
  589.  
  590. BIT:
  591.     move.b    (A0,D6.L),D6
  592.     BIT_MACRO
  593.     GOOD_INST
  594.  
  595. ; ******* LSR *********
  596. ; ******* Param:D6 ******
  597.  
  598. LSR:
  599.     move.b    (A0,D6.L),D7  ; M[D6] -> D7
  600.     LogicalShiftRight    D7
  601.     jsr    @Place
  602.     GOOD_INST
  603.  
  604. ; ******* ASL *********
  605. ; ******* Param:D6 ******
  606.  
  607. ASL:
  608.     move.b    (A0,D6.L),D7  ; M[D6] -> D7
  609.     ArithmeticShiftLeft    D7
  610.     jsr    @Place
  611.     GOOD_INST
  612.     
  613. ; ******* ROR *********
  614. ; ******* Param:D6 ******
  615.  
  616. ROR:
  617.     move.b    (A0,D6.L),D7  ; M[D6] -> D7
  618.     RotateRight    D7
  619.     jsr    @Place
  620.     GOOD_INST
  621.     
  622. ; ******* ROL *********
  623. ; ******* Param:D6 ******
  624.  
  625. ROL:
  626.     move.b    (A0,D6.L),D7  ; M[D6] -> D7
  627.     RotateLeft    D7
  628.     jsr    @Place
  629.     GOOD_INST
  630.  
  631. ; ******* LSR IMPLICITE *********
  632. ; ******* Param:D6 ******
  633.  
  634. LSR_IMP:
  635.     LogicalShiftRight    D1
  636.     GOOD_INST
  637.         
  638. ; ******* ASL *********
  639. ; ******* Param:D6 ******
  640.  
  641. ASL_IMP:
  642.     ArithmeticShiftLeft    D1
  643.     GOOD_INST
  644.     
  645. ; ******* ROR *********
  646. ; ******* Param:D6 ******
  647.  
  648. ROR_IMP:
  649.     RotateRight    D1
  650.     GOOD_INST
  651.     
  652. ; ******* ROL *********
  653. ; ******* Param:D6 ******
  654.  
  655. ROL_IMP:
  656.     RotateLeft    D1
  657.     GOOD_INST
  658.     
  659.  
  660. ; *** BRK ***
  661.  
  662. _BRK:
  663.     addq.l    #2,A4    ; Saute une instruction en retour
  664.     SAVE_ADR
  665.     GET_WORD    $FFFE
  666.     move.l    D6,A4
  667.     add.l    A0,A4
  668.  
  669.     EMPILER D4
  670.     bset    #B_BIT,D4        ; ** bit B mis **
  671.  
  672.     GOOD_INST
  673.  
  674. _IRQ:
  675.     addq.l    #1,A4
  676.     SAVE_ADR
  677.     GET_WORD    $FFFE
  678.     move.l    D6,A4
  679.     add.l    A0,A4
  680.  
  681.     EMPILER D4
  682.  
  683.     GOOD_INST
  684.  
  685.  
  686. ; *** JSR ***
  687.  
  688. JSR:
  689.     addq.l    #2,A4
  690.     SAVE_ADR
  691.     subq.l    #2,A4
  692.     ABSOLU
  693.     move.l    D6,A4
  694.     add.l    A0,A4
  695.     GOOD_INST
  696.     
  697.  
  698. ; *** JMP Immediat ***
  699.  
  700. JMP_IMM:
  701.     ABSOLU
  702.     move.l    D6,A4
  703.     add.l    A0,A4
  704.     GOOD_INST
  705.  
  706. ; *** JMP Indirect ***
  707.  
  708. JMP_IND:
  709.     INDIRECT
  710.     move.l    D6,A4
  711.     add.l    A0,A4
  712.     GOOD_INST
  713.  
  714. ; *** RTS ***
  715.  
  716. RTS:
  717. _RTS:
  718.     RESTORE_ADR
  719.     addq.l    #1,A4
  720.     GOOD_INST
  721.  
  722. ; *** RTI ***
  723.  
  724. RTI:
  725.     DEPILER    D4                    
  726.     RESTORE_ADR
  727.     GOOD_INST
  728.  
  729. ; *** BCC ***
  730.  
  731. BCC:
  732.     DONT_BRANCH    C_BIT
  733.  
  734. ; *** BCS ***
  735.  
  736. BCS:
  737.     BRANCH        C_BIT
  738.  
  739. ; *** BEQ ***
  740.  
  741. BEQ:
  742.     BRANCH        Z_BIT
  743.     
  744. ; *** BNE ***
  745.  
  746. BNE:
  747.     DONT_BRANCH    Z_BIT
  748.  
  749. ; *** BMI ***
  750.  
  751. BMI:
  752.     BRANCH        N_BIT
  753.  
  754. ; *** BPL ***
  755.  
  756. BPL:
  757.     DONT_BRANCH    N_BIT
  758.     
  759. ; *** BVC ***
  760.  
  761. BVC:
  762.     DONT_BRANCH    V_BIT
  763.     
  764. ; *** BVS ***
  765.  
  766. BVS:
  767.     BRANCH        V_BIT
  768.     
  769. ; *** CLC ***
  770.  
  771. CLC:
  772.     CLEAR_BIT_P    C_BIT
  773.     
  774. ; *** CLD ***
  775.  
  776. CLD:
  777.     CLEAR_BIT_P    D_BIT
  778.  
  779. ; *** CLI ***
  780.  
  781. CLI:
  782.     CLEAR_BIT_P    I_BIT
  783.  
  784. ; *** CLV ***
  785.  
  786. CLV:
  787.     CLEAR_BIT_P    V_BIT
  788.  
  789. ; *** SEC ***
  790.  
  791. SEC:
  792.     SET_BIT_P    C_BIT
  793.     
  794. ; *** SED ***
  795.  
  796. SED:
  797.     SET_BIT_P    D_BIT
  798.  
  799. ; *** SEI ***
  800.  
  801. SEI:
  802.     SET_BIT_P    I_BIT
  803.  
  804. ; *** NOP ***
  805.  
  806. NOP:
  807.     GOOD_INST
  808.  
  809. NOP2:
  810.     addq.l    #1,A4
  811.     GOOD_INST
  812.  
  813. NOP3:
  814.     addq.l    #2,A4
  815.     GOOD_INST
  816.  
  817. ; *** TXA ***
  818.  
  819. TXA:
  820.     Txy    D2,D1
  821.  
  822. ; *** TAX ***
  823.  
  824. TAX:
  825.     Txy    D1,D2
  826.  
  827. ; *** TAY ***
  828.  
  829. TAY:
  830.     Txy    D1,D3
  831.     
  832. ; *** TYA ***
  833.  
  834. TYA:
  835.     Txy    D3,D1
  836.  
  837. ; *** TXS ***
  838. ; ** On n'utilise pas Txy car
  839. ; ** Il n'y a pas de test de condition
  840.  
  841. TXS:
  842.     move.b    D2,D5
  843.     GOOD_INST    
  844.  
  845. ; *** TSX ***
  846.  
  847. TSX:
  848.     Txy    D5,D2
  849.  
  850. ; *** INX ***
  851.  
  852. INX
  853.     addq.b    #1,D2
  854.     TEST_NZ
  855.     GOOD_INST
  856.     
  857. ; *** INY ***
  858.  
  859. INY
  860.     addq.b    #1,D3
  861.     TEST_NZ
  862.     GOOD_INST
  863.     
  864. ; *** DEX ***
  865.  
  866. DEX
  867.     subq.b    #1,D2
  868.     TEST_NZ
  869.     GOOD_INST
  870.     
  871. ; *** DEY ***
  872.  
  873. DEY
  874.     subq.b    #1,D3
  875.     TEST_NZ
  876.     GOOD_INST
  877.     
  878. ; *** PHA ***
  879.  
  880. PHA:
  881.     EMPILER    D1
  882.     GOOD_INST
  883.     
  884. ; *** PLA ***
  885.  
  886. PLA:
  887.     DEPILER D1
  888.     TEST_NZ
  889.     GOOD_INST
  890.  
  891. ; *** PHP ***
  892.  
  893. PHP:
  894.     EMPILER    D4
  895.     GOOD_INST
  896.     
  897. ; *** PLP ***
  898.  
  899. PLP:
  900.     DEPILER D4
  901.     GOOD_INST
  902.  
  903.  
  904. ; *** No other OP Code. Too bad. There would have been so many bugs to remove.
  905.  
  906. ; Tape Operation : D0 : PC de l'appel
  907.  
  908. NoTapeIn:
  909.     GOOD_INST
  910.  
  911. IOOperation:
  912.     subq.l    #1,A4
  913.     tst.l    _TapeMemPtr
  914.     beq.b    NoTapeIn
  915.  
  916.     ; *** Selon PC, on va voir quelle routine
  917.     ; *** Est sollicitee
  918.  
  919.     move.l    A4,D7
  920.     sub.l    A0,D7    ; D7 = PC
  921.     lea    IO_OricRoutineTable(PC),A6
  922.     moveq.l    #0,D0
  923.     subq.l    #1,D0
  924. TOLoop:
  925.     addq.l    #1,D0
  926.     move.w    (A6,D0.L*2),D6
  927.     beq.b    TOFock    
  928.     cmp.l    D6,D7
  929.     bne.b    TOLoop
  930.  
  931.     lea    IO_AmigaRoutineTable(PC),A6
  932.     move.l    (A6,D0.L*4),A6
  933.     jmp    (A6)
  934.  
  935. PatchOutbyt:
  936.     bra    RTS
  937.  
  938. PatchRdbyte:
  939.     bsr.b    LireOctet
  940.     tst.b    D7
  941.     bne.b    NoTapeIn
  942.     move.b    D0,D1    ; LDA D7
  943.     TEST_NZ
  944.     CLR_PB    C_BIT
  945.     bra    RTS
  946.  
  947. PatchSync:
  948.     bsr.b    LireOctet
  949.     tst.b    D7
  950.     bne.b    NoTapeIn
  951.     cmp.b    #$16,D0
  952.     bne.b    PatchSync
  953. EndPatchSync:
  954.     moveq.l    #0,D2    ; X=0
  955.     CLR_PB    C_BIT
  956.     bra    RTS
  957.  
  958. PatchOutchr:
  959.     bra    RTS
  960.  
  961. ; *** Lire un octet
  962. ; In : Rien
  963. ; Out : D7 = 0 si ok -1 sinon
  964. ;       D0 = Valeur octet
  965.  
  966. LireOctet:
  967.     move.l    _TapeMemSize(PC),D7
  968.     addq.l    #1,D7
  969.     cmp.l    _TapeMemOffset(PC),D7
  970.     beq.b    LO_EOT
  971.     move.l    _TapeMemPtr(PC),A6
  972.     add.l    _TapeMemOffset(PC),A6    ; A6->Octet a lire
  973.     move.b    (A6),D0
  974.     add.l    #1,_TapeMemOffset
  975.     moveq.l    #0,D7
  976.     rts
  977. LO_EOT:
  978.     moveq.l    #-1,D7    ; Fin de bande
  979.     rts
  980.  
  981. TOFock:
  982.     BAD_INST    ILLEGAL_INSTRUCTION    
  983.  
  984. PlayZap:
  985.     bra    RTS    ; Pour l'instant, on va se calmer
  986.     lea    _son_zap,A6
  987.     jsr    _PlaySample
  988.     bra    RTS
  989.  
  990. PlayPing:
  991.     bra    RTS    ; Pour l'instant, on va se calmer
  992.     lea    _son_ping,A6
  993.     jsr    _PlaySample
  994.     bra    RTS
  995.  
  996. PlayContBeep:
  997.     bra    RTS    ; Pour l'instant, on va se calmer
  998.     lea    _son_contbeep,A6
  999.     jsr    _PlaySample
  1000.     bra    RTS
  1001.  
  1002. PlayKeyBeep:
  1003.     bra    RTS    ; Pour l'instant, on va se calmer
  1004.     lea    _son_keybeep,A6
  1005.     jsr    _PlaySample
  1006.     bra    RTS    ; Pour l'instant, on va se calmer
  1007.  
  1008. PlayShoot:
  1009.     bra    RTS
  1010.  
  1011. PlayExplode:
  1012.     bra    RTS
  1013.  
  1014. PlayPlay:
  1015. PlaySound:
  1016. PlayMusic:
  1017.     bra    RTS    ; Pour l'instant, on va se calmer
  1018.  
  1019. IO_OricRoutineTable:
  1020.     dc.w    J_OUTBYT,J_RDBYTE,J_SYNC,J_OUTCHR
  1021.     dc.w    J_ZAP,J_PING,J_CONTBP,J_KBBEEP
  1022.     dc.w    J_SHOOT,J_EXPLODE
  1023.     dc.w    J_PLAY,J_SOUND,J_MUSIC,0
  1024.  
  1025. IO_AmigaRoutineTable:
  1026.     dc.l    PatchOutbyt,PatchRdbyte,PatchSync,PatchOutchr
  1027.     dc.l    PlayZap,PlayPing,PlayContBeep,PlayKeyBeep
  1028.     dc.l    PlayShoot,PlayExplode
  1029.     dc.l    PlayPlay,PlaySound,PlayMusic
  1030.  
  1031. _TapeMemOffset:
  1032.     dc.l    0
  1033. _TapeMemPtr:
  1034.     dc.l    0
  1035. _TapeMemSize:
  1036.     dc.l    0
  1037.  
  1038. _NextJump:
  1039.     dc.l    0
  1040.  
  1041. _MiscTable:
  1042. TabP:
  1043. TabNZ:
  1044.     dc.b    $0    ; Position 0 pour 68K    0000
  1045.     dc.b    $0    ; C=1 mais on s'en fout    0001
  1046.     dc.b    $0    ; V=1 ""     ""    0010
  1047.     dc.b    $0    ; C=1 V=1        0011
  1048.     dc.b    $2    ; Z=1            0100
  1049.     dc.b    $2    ; Z=1 C=1        0101
  1050.     dc.b    $2    ; Z=1 V=1        0110
  1051.     dc.b    $2    ; Z=1 V=1 C=1        0111
  1052.     dc.b    $80    ; N=1            1000
  1053.     dc.b    $80    ; N=1 C=1        1001
  1054.     dc.b    $80    ; N=1 V=1        1010
  1055.     dc.b    $80    ; N=1 V=1 C=1        1011
  1056.     dc.b    $82    ; N=1 Z=1        1100
  1057.     dc.b    $82    ; N=1 Z=1 C=1        1101
  1058.     dc.b    $82    ; N=1 Z=1 V=1        1110
  1059.     dc.b    $82    ; N=1 Z=1 V=1 C=1    1111
  1060. TabNZC:
  1061.     dc.b    $0    ; Position 0 pour 68K    0000
  1062.     dc.b    $1    ; C=1            0001
  1063.     dc.b    $0    ; V=1            0010
  1064.     dc.b    $1    ; C=1 V=1        0011
  1065.     dc.b    $2    ; Z=1            0100
  1066.     dc.b    $3    ; Z=1 C=1        0101
  1067.     dc.b    $2    ; Z=1 V=1        0110
  1068.     dc.b    $3    ; Z=1 V=1 C=1        0111
  1069.     dc.b    $80    ; N=1            1000
  1070.     dc.b    $81    ; N=1 C=1        1001
  1071.     dc.b    $80    ; N=1 V=1        1010
  1072.     dc.b    $81    ; N=1 V=1 C=1        1011
  1073.     dc.b    $82    ; N=1 Z=1        1100
  1074.     dc.b    $83    ; N=1 Z=1 C=1        1101
  1075.     dc.b    $82    ; N=1 Z=1 V=1        1110
  1076.     dc.b    $83    ; N=1 Z=1 V=1 C=1    1111
  1077. TabNZCV:
  1078.     dc.b    $0    ; Position 0 pour 68K    0000
  1079.     dc.b    $1    ; C=1            0001
  1080.     dc.b    $40    ; V=1            0010
  1081.     dc.b    $41    ; C=1 V=1        0011
  1082.     dc.b    $2    ; Z=1            0100
  1083.     dc.b    $3    ; Z=1 C=1        0101
  1084.     dc.b    $42    ; Z=1 V=1        0110
  1085.     dc.b    $43    ; Z=1 V=1 C=1        0111
  1086.     dc.b    $80    ; N=1            1000
  1087.     dc.b    $81    ; N=1 C=1        1001
  1088.     dc.b    $C0    ; N=1 V=1        1010
  1089.     dc.b    $C1    ; N=1 V=1 C=1        1011
  1090.     dc.b    $82    ; N=1 Z=1        1100
  1091.     dc.b    $83    ; N=1 Z=1 C=1        1101
  1092.     dc.b    $C2    ; N=1 Z=1 V=1        1110
  1093.     dc.b    $C3    ; N=1 Z=1 V=1 C=1    1111
  1094.  
  1095. TabNZC_CMP:
  1096.     dc.b    $80    ; Position 0 pour 68K    0000
  1097.     dc.b    $81    ; C=1            0001
  1098.     dc.b    $80    ; V=1 On s'en fout    0010
  1099.     dc.b    $81    ; C=1 V=1        0011
  1100.     dc.b    $3    ; Z=1            0100
  1101.     dc.b    $3    ; Z=1 C=1        0101
  1102.     dc.b    $3    ; Z=1 V=1        0110
  1103.     dc.b    $3    ; Z=1 V=1 C=1        0111
  1104.     dc.b    $0    ; N=1            1000
  1105.     dc.b    $1    ; N=1 C=1        1001
  1106.     dc.b    $0    ; N=1 V=1        1010
  1107.     dc.b    $1    ; N=1 V=1 C=1        1011
  1108.     dc.b    $3    ; N=1 Z=1        1100
  1109.     dc.b    $3    ; N=1 Z=1 C=1        1101
  1110.     dc.b    $3    ; N=1 Z=1 V=1        1110
  1111.     dc.b    $3    ; N=1 Z=1 V=1 C=1    1111
  1112.