home *** CD-ROM | disk | FTP | other *** search
/ The AGA Experience 2 / agavol2.iso / software / utilities / emulation / amoric / src / cpu6502_xxx.asm < prev    next >
Encoding:
Assembly Source File  |  1995-10-29  |  15.8 KB  |  1,098 lines

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