home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD1.iso / Emulatoren / amigacpe.lzh / cpe3.asm < prev    next >
Encoding:
Assembly Source File  |  1995-02-14  |  6.1 KB  |  401 lines

  1. ; *******************************************************************
  2. ; * Amstrad CPC emulator                        *
  3. ; * © 1991/92 Bernd Schmidt                        *
  4. ; *                                    *
  5. ; * CPC ROM code substitutes in 68000 code                *
  6. ; *                                    *
  7. ; *******************************************************************
  8.  
  9.     INCLUDE "cpe.inc"
  10.  
  11.     XDEF initcode
  12.  
  13.     XREF amscode,bascode,ro7code
  14.     XREF simz80,sz80l,calcpca,stack
  15.     XREF wword,wbyte,gword,gbyte
  16.     XREF dosbase,fhandle,DiskBuf
  17.     XREF DCSeekCurr,idfield,IDTPtr,CurrTrack,trackoffs
  18.     XREF KeyMatrix
  19.     SECTION substitutes68,CODE
  20.  
  21.  ; Whoops! This stuff is DISABLED, because it only works with the 664 ROM!
  22.  ; It does nothing but to speed up some code slightly.
  23. initcode:
  24.     lea    amscode,a0
  25.     move.l    #$C01,d5
  26.     add.l    d5,d5
  27.     add.l    d5,d5
  28.     move.l    #SCRNEXTBYTE,0(a0,d5.l)
  29.     move.l    #$C0D,d5
  30.     add.l    d5,d5
  31.     add.l    d5,d5
  32.     move.l    #SCRPREVBYTE,0(a0,d5.l)
  33.     move.l    #$C1B,d5
  34.     add.l    d5,d5
  35.     add.l    d5,d5
  36.     move.l    #SCRNEXTLINE,0(a0,d5.l)
  37.     move.l    #$C35,d5
  38.     add.l    d5,d5
  39.     add.l    d5,d5
  40.     move.l    #SCRPREVLINE,0(a0,d5.l)
  41.     move.l    #$B66,d5
  42.     add.l    d5,d5
  43.     add.l    d5,d5
  44.     move.l    #SCRCHARPOSITION,0(a0,d5.l)
  45.     move.l    #$1e2,d5
  46.     add.l    d5,d5
  47.     add.l    d5,d5
  48.     move.l    #KLEVENT,0(a0,d5.l)
  49.     move.l    #$873,d5
  50.     add.l    d5,d5
  51.     add.l    d5,d5
  52.     move.l    #MCSCANKEYBOARD,0(a0,d5.l)
  53.  
  54.     move.l    #$067C,d5
  55.     add.l    d5,d5
  56.     add.l    d5,d5
  57.     lea    ro7code,a0
  58.     move.l    #HandleSector,0(a0,d5.l)
  59.     move.l    #$09CD,d5   ; Motor On New Ticker
  60.     add.l    d5,d5
  61.     add.l    d5,d5
  62.     move.l    #FloppySetTicker,0(a0,d5.l)
  63.     moveq    #0,d5
  64.     rts
  65.  
  66. MCSCANKEYBOARD:
  67.     movem.l d7/a6,-(sp)
  68.     lea    KeyMatrix,a6
  69.     moveq    #9,d7
  70. MCSC_Loop:
  71.     move.w    sHL,d5
  72.     jsr    gbyte
  73.     and.b    (a6),d6
  74.     not.b    d6
  75.     move.w    sDE,d5
  76.     jsr    wbyte
  77.     move.w    sHL,d5
  78.     move.b    (a6)+,d6
  79.     jsr    wbyte
  80.     addq.w    #1,sHL
  81.     addq.w    #1,sDE
  82.     dbf    d7,MCSC_Loop
  83.     move.w    #$F600,sBC
  84.     move.b    #$82,sA
  85.     movem.l (sp)+,d7/a6
  86.     bra    code68_ret80
  87.  
  88. KLEVENT:
  89.     addq.w    #2,sHL
  90.     move.w    sHL,d5
  91.     jsr    gbyte
  92.     move.b    d6,sA
  93.     addq.b    #1,d6
  94.     move.w    d6,-(sp)
  95.     jsr    wbyte
  96.     move.w    (sp)+,d6
  97.     btst    #7,d6
  98.     beq    KLEV_notneg
  99.     subq.b    #1,d6
  100.     move.w    sHL,d5
  101.     jsr    wbyte
  102.     bra    code68_ret80    ; KLEV200
  103. KLEV_notneg:
  104.     tst.b    sA
  105.     bne    code68_ret80    ; KLEV200
  106.     move.w    sHL,d5
  107.     addq.w    #1,d5
  108.     jsr    gbyte
  109.     move.b    d6,sA
  110.     tst.b    sA
  111.     bpl    KLEV_22F
  112.     swap    d1
  113.     btst    #0,d1
  114.     beq    KLEV_209
  115.     swap    d1
  116.     add.b    sA,sA
  117.     bpl    KLEV_E8
  118.     addq.w    #2,sHL
  119.     bra    KLEV_223
  120. KLEV_209:
  121.     move.w    #$20A,d7
  122.     jmp    calcpca
  123. KLEV_223:
  124.     move.w    sHL,d5
  125.     jsr    gword
  126.     addq.w    #1,sHL
  127.     move.w    sHL,sDE
  128.     move.w    d6,sDE
  129.     move.w    d6,sPC
  130.     jmp    calcpca
  131. KLEV_22F:
  132.     move.w    #$22e,d7
  133.     jmp    calcpca
  134. KLEV_E8:
  135.     move.w    #$e8,d7
  136.     jmp    calcpca
  137.  
  138. SCRCHARPOSITION:
  139.     move.l    sDE,-(sp)
  140.     move.w    #$B7c3,d5
  141.     move.b    0(a4,d5.w),d5
  142.     moveq    #4,d6
  143.     cmp.b    #0,d5
  144.     beq    SCCPOS_gotmode
  145.     moveq    #2,d6
  146.     cmp.b    #1,d5
  147.     beq    SCCPOS_gotmode
  148.     moveq    #1,d6
  149. SCCPOS_gotmode:
  150.     rol.w    #8,sBC
  151.     move.b    d6,sBC
  152.     rol.w    #8,sBC
  153.     move.l    sBC,-(sp)
  154.     move.w    sHL,sDE
  155.     rol.w    #8,sDE
  156.     and.w    #$FF,sDE
  157.     and.w    #$FF,sHL
  158.     move.w    sHL,d6
  159.     add.w    sHL,sHL
  160.     add.w    sHL,sHL
  161.     add.w    d6,sHL
  162.     add.w    sHL,sHL
  163.     add.w    sHL,sHL
  164.     add.w    sHL,sHL
  165.     add.w    sHL,sHL
  166.     move.w    sBC,d6
  167.     and.w    #$FF00,d6
  168. SCCPOS_addcol
  169.     add.w    sDE,sHL
  170.     sub.w    #$100,d6
  171.     bne    SCCPOS_addcol
  172.     and.w    #$FF,sBC
  173.     move.w    #$B7c4,d5
  174.     jsr    gword
  175.     add.w    d6,sHL
  176.     and.w    #$7ff,sHL
  177.     move.w    #$b7c6,d5
  178.     moveq    #0,d6
  179.     move.b    0(a4,d5.w),d6
  180.     rol.w    #8,d6
  181.     add.w    d6,sHL
  182.     move.l    (sp)+,sBC
  183.     move.l    (sp)+,sDE
  184.     bra    code68_ret80
  185.  
  186. SCRNEXTBYTE:
  187.     move.w    sHL,d5
  188.     addq.w    #1,d5
  189.     and.w    #$7FF,d5
  190.     and.w    #$F800,sHL
  191.     or.w    d5,sHL
  192.     bra    code68_ret80
  193.  
  194. SCRPREVBYTE:
  195.     move.w    sHL,d5
  196.     subq.w    #1,d5
  197.     and.w    #$7FF,d5
  198.     and.w    #$F800,sHL
  199.     or.w    d5,sHL
  200.     bra    code68_ret80
  201.  
  202. SCRNEXTLINE:
  203.     move.w    sHL,d5
  204.     add.w    #$800,d5
  205.     and.w    #$C7FF,sHL
  206.     and.w    #$3800,d5
  207.     beq    SNXL_RAover
  208.     or.w    d5,sHL
  209.     bra    code68_ret80
  210. SNXL_RAover
  211.     add.w    #$50,sHL
  212.     and.w    #$C7FF,sHL
  213.     bra    code68_ret80
  214.  
  215. SCRPREVLINE:
  216.     move.w    sHL,d5
  217.     sub.w    #$800,d5
  218.     and.w    #$C7FF,sHL
  219.     and.w    #$3800,d5
  220.     cmp.w    #$3800,d5
  221.     beq    SNPL_RAover
  222.     or.w    d5,sHL
  223.     bra    code68_ret80
  224. SNPL_RAover
  225.     sub.w    #$50,sHL
  226.     and.w    #$C7FF,sHL
  227.     or.w    d5,sHL
  228.     bra    code68_ret80
  229.  
  230. FloppyHardRet:
  231. code68_ret80:
  232.     move.w    stack,d5
  233.     jsr    gword
  234.     add.w    #2,stack
  235.     move.w    d6,sPC
  236.     jsr    calcpca
  237.     rts
  238.  
  239. FloppySetTicker:
  240.     clr.w    sBC
  241.     move.w    #2,sDE
  242.     move.w    #$BE67,sHL
  243.     move.w    #$BCE9,sPC
  244.     jsr    calcpca
  245.     rts
  246.  
  247. SeekTrack:
  248.     movem.l d0-d7/a0-a6,-(sp)
  249.     move.w    sDE,d5
  250.     lsr.w    #8,d5
  251.     and.l    #$3F,d5
  252.     move.b    d5,CurrTrack
  253.     jsr    DCSeekCurr
  254.     movem.l (sp)+,d0-d7/a0-a6
  255.     or.w    #1,sF
  256.     move.w    stack,d5
  257.     jsr    gword
  258.     add.w    #2,stack
  259.     move.w    d6,sPC
  260.     jsr    calcpca
  261.     rts
  262.  
  263. GetNextID:
  264.     move.l    IDTPtr,a0
  265.     move.b    (a0)+,d6
  266.     cmp.b    #$FF,d6
  267.     bne    GNI_Wback
  268.     lea    idfield,a0
  269.     move.b    (a0)+,d6
  270. GNI_Wback
  271.     move.l    a0,IDTPtr
  272.     move.w    #$BE51,d5
  273.     jsr    wbyte
  274.     move.w    stack,d5
  275.     jsr    gword
  276.     add.w    #2,stack
  277.     move.w    d6,sPC
  278.     jsr    calcpca
  279.     or.w    #1,sF
  280.     rts
  281.  
  282. HandleSector:
  283.     move.w    #$BE74,d5
  284.     jsr    gword
  285.     move.w    d6,sHL
  286.     rol.w    #8,d6
  287.     cmp.b    #$45,d6
  288.     beq    WriteSector
  289.     move.w    #$C67f,sPC
  290.     jmp    calcpca
  291.  
  292. WriteSector:
  293.     move.w    #$BE62,d5
  294.     jsr    gword
  295.     move.w    d6,d5
  296.     lea    DiskBuf,a0
  297.     move.w    #511,d7
  298. WSC_Loop
  299.     move.l    a0,-(sp)
  300.     jsr    gbyte
  301.     move.l    (sp)+,a0
  302.     move.b    d6,(a0)+
  303.     add.w    #1,d5
  304.     dbf.b    d7,WSC_Loop
  305.  
  306.     movem.l d0-d7/a0-a6,-(sp)
  307.     lea    idfield,a0
  308.     move.l    trackoffs,d0
  309.     add.l    #66,d0
  310. WSC_Loop1
  311.     cmp.b    #$FF,(a0)
  312.     beq    WSC_Erreur
  313.     cmp.b    (a0)+,sHL
  314.     beq    WSC_found
  315.     add.l    #512,d0
  316.     bra    WSC_Loop1
  317. WSC_found
  318.     move.l    fhandle,d1
  319.     move.l    d0,d2
  320.     moveq.l #-1,d3
  321.     move.l    dosbase,a6
  322.     jsr    _Seek(a6)
  323.     move.l    fhandle,d1
  324.     move.l    #DiskBuf,d2
  325.     move.l    #512,d3
  326.     jsr    _Write(a6)
  327.     movem.l (sp)+,d0-d7/a0-a6
  328.     move.w    stack,d5
  329.     jsr    gword
  330.     add.w    #2,stack
  331.     move.w    d6,sPC
  332.     jsr    calcpca
  333.     or.w    #1,sF
  334.     rts
  335.  
  336. WSC_Erreur
  337.     and.w    #$FE,sF
  338.     movem.l (sp)+,d0-d7/a0-a6
  339.     move.w    stack,d5
  340.     jsr    gword
  341.     add.w    #2,stack
  342.     move.w    d6,sPC
  343.     jsr    calcpca
  344.     rts
  345.  
  346. ReadSector:
  347. RSec_ctd
  348.     movem.l d0-d7/a0-a6,-(sp)
  349.     lea    idfield,a0
  350.     move.l    trackoffs,d0
  351.     add.l    #66,d0
  352. RSC_Loop1
  353.     cmp.b    #$FF,(a0)
  354.     beq    RSC_Erreur
  355.     cmp.b    (a0)+,sHL
  356.     beq    RSC_found
  357.     add.l    #512,d0
  358.     bra    RSC_Loop1
  359. RSC_found
  360.     move.l    fhandle,d1
  361.     move.l    d0,d2
  362.     moveq.l #-1,d3
  363.     move.l    dosbase,a6
  364.     jsr    _Seek(a6)
  365.     move.l    fhandle,d1
  366.     move.l    #DiskBuf,d2
  367.     move.l    #512,d3
  368.     jsr    _Read(a6)
  369.     movem.l (sp)+,d0-d7/a0-a6
  370.  
  371.     move.w    #$BE62,d5
  372.     jsr    gword
  373.     move.w    d6,d5
  374.     lea    DiskBuf,a0
  375.     move.w    #511,d7
  376. RSC_Loop
  377.     move.b    (a0)+,d6
  378.     move.l    a0,-(sp)
  379.     jsr    wbyte
  380.     move.l    (sp)+,a0
  381.     addq.w    #1,d5
  382.     dbf.b    d7,RSC_Loop
  383.     move.w    d5,sHL
  384.     or.w    #1,sF
  385.     move.w    #$C6C8,sPC
  386.     move.w    #$FB7E,sBC
  387.     jsr    calcpca
  388.     rts
  389.  
  390. RSC_Erreur
  391.     and.w    #$FE,sF
  392.     movem.l (sp)+,d0-d7/a0-a6
  393.     move.w    stack,d5
  394.     jsr    gword
  395.     add.w    #2,stack
  396.     move.w    d6,sPC
  397.     jsr    calcpca
  398.     rts
  399.  
  400.     END
  401.