home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 2: PC / frozenfish_august_1995.bin / bbs / d01xx / d0165.lha / CPM / Source / zeked.a < prev   
Text File  |  1988-11-22  |  11KB  |  629 lines

  1. ;    z80 emulator subkernel
  2. ;    $ed two byte opcode instructions
  3.  
  4. zekedver:    dc.b    'Zeked Ver: 00026   Date: 25-Sep-88 21:17:49 ',0
  5.  
  6. ;    This source code is released into the public domain for
  7. ;    non-profit use only.
  8. ;    Copyright (C) 1988, Ulf Nordquist. All Rights Reserved !
  9. ;    Ulf Nordquist
  10. ;    Brunnehagen 36
  11. ;    417 47 Gothenburg
  12. ;    Sweden
  13.  
  14. ;    self modifying code is used
  15.  
  16. ;    history
  17. ;    871105 : moved from zek
  18. ;         $73 emulated
  19. ;    871113 : $01 emulated (cpm transfer)
  20. ;    880221 : detection of unimplemented $ed nn opcodes
  21. ;         ldir, ldi, lddr, ldd
  22. ;         ld de,(nn), ld bc,(nn), ld sp,(nn)
  23. ;         sbc hl,de, sbc hl,bc
  24. ;    880223 : ld (nn),de, ld (nn),bc
  25. ;         ld a,i
  26. ;    880430 : ver 00001
  27. ;    880710 : modify code in main emu loop when debug count
  28. ;         edinit, edstart, edstop
  29. ;    880821 : include zekmc.i
  30. ;    880910 : sbc hl,sp, adc hl,bc, adc hl,de, adc hl,sp
  31. ;    880911 : bug1 chk if really count, can be set by trace
  32. ;    880920 : bug2(possibly) ld sp,(nn) - no ext.l
  33. ;         cpir, cpdr, cpi, cpd
  34. ;    880923 : bug3 in ld (nn),sp   ld sp,(nn)
  35. ;    880924 : ld a,i a,r i,a r,a
  36. ;    880925 : reti, retn, neg
  37.  
  38. ;    globals from this module
  39.  
  40.         xdef    edinit
  41.         xdef    edstart
  42.         xdef    edstop
  43.         xdef    z80opced
  44.         xdef    zekedver
  45.  
  46. ;    externals from zek
  47.  
  48.         xref    edoffs
  49.         xref    cntbuf
  50.         xref    z80emu1
  51.         xref    setflg
  52.  
  53. ;    externals from ce
  54.  
  55.         xref    osentry
  56.  
  57. ;    externals from ze
  58.  
  59.         xref    ireg
  60.         xref    glflgs
  61.         xref    z80opc2ni
  62.  
  63.         section zeked,code
  64.  
  65. ;    macros
  66.  
  67.         include zekmc.i
  68.  
  69.         ds.w    0            ;alignment
  70.  
  71. ;    edinit
  72. ;    initialize emulation parameters
  73. ;    start count of opcode, bdos & bios
  74. ;    stop count of opcode, bdos & bios
  75.  
  76. edstart:
  77. edstop:
  78. edinit:     move.l    #z80emusw,a6
  79.         move.w    (a6),d1                 ;get bra.s
  80.         move.w    cntinst,(a6)            ;put addq
  81.         move.w    d1,cntinst        ;save bra.s
  82.         rts
  83.  
  84. ;    entry : d0.l=fa'fa, d1.l=hl'hl, d2.l=de'de, d3.l=bc'bc
  85. ;        d4.l=iyix
  86. ;        d7.l=number of instructions to run, 0=until halt
  87. ;        a0.w=pc, a1.w=sp,
  88. ;        a2.l=ptr to scratch, a3.l=z80opctab,
  89. ;        a4.l=ptr middle of z80 pgm area
  90. ;        the program area must be configured as this:
  91. ;        relative start    0      $8000    $ffff
  92. ;                |________|________|
  93. ;        pc          $8000     0    $7fff
  94. ;        d0 flags 15 14 13 12 11 10  9  8
  95. ;              s  z    -  h  -  v  n  c
  96. ;    scratch use : d5.l, d6.l, a5.l, a6.l
  97. ;    limitations:
  98. ;    1. ld r,a is a nop
  99. ;    2. ld a,r puts the loop counter in r
  100.  
  101. ;    $ed 1:st byte in special 2 byte opcodes
  102. ;    decode instruction
  103.  
  104. z80opced:    moveq.l #0,d6
  105.         move.b    0(a4,a0.w),d6           ;2:nd opcode
  106. z80emusw:    bra.s    count
  107. z80emu3:    asl.w    #2,d6            ;4 bytes per entry
  108.         move.l    #z80opctabed,a5
  109.         move.l    0(a5,d6.l),a5
  110.         jmp    (a5)                    ;do instruction
  111.  
  112. ;    code if debug count mode
  113.  
  114. count:        btst.b    #5,glflgs
  115.         beq.s    count1            ;if no count
  116.         move.l    cntbuf,a5
  117.         add.w    d6,a5
  118.         addq.b    #1,edoffs(a5)           ;inc cnt
  119.         bne.s    count1            ;if not max cnt
  120.         subq.b    #1,edoffs(a5)           ;restore max cnt
  121. count1:     addq.l    #1,a0
  122.         bra.s    z80emu3         ;cont emu
  123.  
  124. ;    not implemented opcode
  125.  
  126. z80emuni:    addq.l    #4,a7            ;ret addr
  127.         jmp    z80opc2ni
  128.  
  129. ;    $01, invoke operating system
  130.  
  131. z80opc01:    jmp    osentry
  132.  
  133. ;    $42 sbc hl,bc
  134.  
  135. z80opc42:    sbchlrr d3
  136.         jmp    z80emu1
  137.  
  138. ;    $43 ld (nn),bc
  139.  
  140. z80opc43:    ldindrr d3
  141.         jmp    z80emu1
  142.  
  143. ;    $44 neg
  144.  
  145. z80opc44:    neg.b    d0
  146.         jsr    setflg
  147.         jmp    z80emu1
  148.  
  149. ;    $45 retn
  150.  
  151. z80opc45:    ret
  152.         jmp    z80emu1
  153.  
  154. ;    $47 ld i,a
  155.  
  156. z80opc47:    move.b    d0,ireg
  157.         jsr    setflg
  158.         jmp    z80emu1
  159.  
  160. ;    $4a adc hl,bc
  161.  
  162. z80opc4a:    adchlrr d3
  163.         jmp    z80emu1
  164.  
  165. ;    $4b ld bc,(nn)
  166.  
  167. z80opc4b:    ldrrind d3
  168.         jmp    z80emu1
  169.  
  170. ;    $4d reti
  171.  
  172. z80opc4d:    ret
  173.         jmp    z80emu1
  174.  
  175. ;    $4f ld r,a
  176.  
  177. z80opc4f:    jmp    z80emu1
  178.  
  179. ;    $52 sbc hl,de
  180.  
  181. z80opc52:    sbchlrr d2
  182.         jmp    z80emu1
  183.  
  184. ;    $53 ld (nn),de
  185.  
  186. z80opc53:    ldindrr d2
  187.         jmp    z80emu1
  188.  
  189. ;    $57 ld a,i
  190.  
  191. z80opc57:    move.b    ireg,d0
  192.         jsr    setflg
  193.         jmp    z80emu1
  194.  
  195. ;    5a adc hl,de
  196.  
  197. z80opc5a:    adchlrr d2
  198.         jmp    z80emu1
  199.  
  200. ;    $5b ld de,(nn)
  201.  
  202. z80opc5b:    ldrrind d2
  203.         jmp    z80emu1
  204.  
  205. ;    $5f ld a,r
  206.  
  207. z80opc5f:    move.b    d7,d0            ;loop cnt
  208.         jsr    setflg
  209.         jmp    z80emu1
  210.  
  211. ;    $72 sbc hl,sp
  212.  
  213. z80opc72:    move.w    a1,d5            ;sp
  214.         sbchlrr d5
  215.         jmp    z80emu1
  216.  
  217. ;    $73 ld (nn),sp
  218.  
  219. z80opc73:    move.w    a1,d5            ;sp
  220.         ldindrr d5
  221.         jmp    z80emu1
  222.  
  223. ;    7a adc hl,sp
  224.  
  225. z80opc7a:    move.w    a1,d5            ;sp
  226.         adchlrr d5
  227.         jmp    z80emu1
  228.  
  229. ;    $7b ld sp,(nn)
  230.  
  231. z80opc7b:    ldrrind d5
  232.         move.w    d5,a1            ;sp
  233.         jmp    z80emu1
  234.  
  235. ;    $a0 ldi
  236.  
  237. z80opca0:    move.b    0(a4,d1.w),0(a4,d2.w)   ;(hl)->(de)
  238.         addq.w    #1,d1
  239.         addq.w    #1,d2
  240.         subq.w    #1,d3
  241.         bclr.l    #10,d0            ;reset p/v
  242.         or.w    d3,d3
  243.         bne.s    z80opca01        ;if bc<>0
  244.         jmp    z80emu1
  245. z80opca01:    bset.l    #10,d0            ;set p/v
  246.         jmp    z80emu1
  247.  
  248. ;    $a1 cpi
  249.  
  250. z80opca1:    cmp.b    0(a4,d1.w),d0           ;cp (hl),a
  251.         jsr    setflg
  252.         addq.w    #1,d1
  253.         subq.w    #1,d3
  254.         or.w    d3,d3
  255.         bclr.l    #10,d0            ;reset p/v
  256.         bne.s    z80opcba11        ;if bc<>0
  257.         jmp    z80emu1
  258. z80opcba11:    bset.l    #10,d0            ;set p/v
  259.         jmp    z80emu1
  260.  
  261. ;    $a8 ldd
  262.  
  263. z80opca8:    move.b    0(a4,d1.w),0(a4,d2.w)   ;(hl)->(de)
  264.         subq.w    #1,d1
  265.         subq.w    #1,d2
  266.         subq.w    #1,d3
  267.         bclr.l    #10,d0            ;reset p/v
  268.         or.w    d3,d3
  269.         bne.s    z80opca81        ;if bc<>0
  270.         jmp    z80emu1
  271. z80opca81:    bset.l    #10,d0            ;set p/v
  272.         jmp    z80emu1
  273.  
  274. ;    $a9 cpd
  275.  
  276. z80opca9:    cmp.b    0(a4,d1.w),d0           ;cp (hl),a
  277.         jsr    setflg
  278.         subq.w    #1,d1
  279.         subq.w    #1,d3
  280.         or.w    d3,d3
  281.         bclr.l    #10,d0            ;reset p/v
  282.         bne.s    z80opca91        ;if bc<>0
  283.         jmp    z80emu1
  284. z80opca91:    bset.l    #10,d0            ;set p/v
  285.         jmp    z80emu1
  286.  
  287. ;    $b0 ldir
  288.  
  289. z80opcb0:    move.b    0(a4,d1.w),0(a4,d2.w)   ;(hl)->(de)
  290.         addq.w    #1,d1
  291.         addq.w    #1,d2
  292.         subq.w    #1,d3
  293.         bne.s    z80opcb0        ;if bc>0
  294.         bclr.l    #10,d0            ;reset p/v
  295.         jmp    z80emu1
  296.  
  297. ;    $b1 cpir
  298.  
  299. z80opcb1:    cmp.b    0(a4,d1.w),d0           ;cp (hl),a
  300.         beq.s    z80opcb11        ;if same
  301.         addq.w    #1,d1
  302.         subq.w    #1,d3
  303.         bne.s    z80opcb1        ;if bc>0
  304.  
  305. ;    exit when bc=0
  306.  
  307.         cmp.b    -1(a4,d1.w),d0          ;cp (hl-1),a
  308.         jsr    setflg
  309.         bclr.l    #10,d0            ;reset p/v
  310.         jmp    z80emu1
  311.  
  312. ;    exit when (hl)=a
  313.  
  314. z80opcb11:    jsr    setflg
  315.         addq.w    #1,d1
  316.         subq.w    #1,d3
  317.         or.w    d3,d3
  318.         bclr.l    #10,d0            ;reset p/v
  319.         bne.s    z80opcb12        ;if bc<>0
  320.         jmp    z80emu1
  321. z80opcb12:    bset.l    #10,d0            ;set p/v
  322.         jmp    z80emu1
  323.  
  324. ;    $b8 lddr
  325.  
  326. z80opcb8:    move.b    0(a4,d1.w),0(a4,d2.w)   ;(hl)->(de)
  327.         subq.w    #1,d1
  328.         subq.w    #1,d2
  329.         subq.w    #1,d3
  330.         bne.s    z80opcb8        ;if bc>0
  331.         bclr.l    #10,d0            ;reset p/v
  332.         jmp    z80emu1
  333.  
  334. ;    $b9 cpdr
  335.  
  336. z80opcb9:    cmp.b    0(a4,d1.w),d0           ;cp (hl),a
  337.         beq.s    z80opcb91        ;if same
  338.         subq.w    #1,d1
  339.         subq.w    #1,d3
  340.         bne.s    z80opcb9        ;if bc>0
  341.  
  342. ;    exit when bc=0
  343.  
  344.         cmp.b    -1(a4,d1.w),d0          ;cp (hl-1),a
  345.         jsr    setflg
  346.         bclr.l    #10,d0            ;reset p/v
  347.         jmp    z80emu1
  348.  
  349. ;    exit when (hl)=a
  350.  
  351. z80opcb91:    jsr    setflg
  352.         subq.w    #1,d1
  353.         subq.w    #1,d3
  354.         or.w    d3,d3
  355.         bclr.l    #10,d0            ;reset p/v
  356.         bne.s    z80opcb92        ;if bc<>0
  357.         jmp    z80emu1
  358. z80opcb92:    bset.l    #10,d0            ;set p/v
  359.         jmp    z80emu1
  360.  
  361. ;    data area
  362. ;    initialized data area
  363.  
  364. ;    address table for z80 second opcode $ed
  365.  
  366. z80opctabed:    dc.l  z80emuni
  367.         dc.l  z80opc01
  368.         dc.l  z80emuni
  369.         dc.l  z80emuni
  370.         dc.l  z80emuni
  371.         dc.l  z80emuni
  372.         dc.l  z80emuni
  373.         dc.l  z80emuni
  374.         dc.l  z80emuni
  375.         dc.l  z80emuni
  376.         dc.l  z80emuni
  377.         dc.l  z80emuni
  378.         dc.l  z80emuni
  379.         dc.l  z80emuni
  380.         dc.l  z80emuni
  381.         dc.l  z80emuni
  382.         dc.l  z80emuni            ;$10
  383.         dc.l  z80emuni
  384.         dc.l  z80emuni
  385.         dc.l  z80emuni
  386.         dc.l  z80emuni
  387.         dc.l  z80emuni
  388.         dc.l  z80emuni
  389.         dc.l  z80emuni
  390.         dc.l  z80emuni
  391.         dc.l  z80emuni
  392.         dc.l  z80emuni
  393.         dc.l  z80emuni
  394.         dc.l  z80emuni
  395.         dc.l  z80emuni
  396.         dc.l  z80emuni
  397.         dc.l  z80emuni
  398.         dc.l  z80emuni            ;$20
  399.         dc.l  z80emuni
  400.         dc.l  z80emuni
  401.         dc.l  z80emuni
  402.         dc.l  z80emuni
  403.         dc.l  z80emuni
  404.         dc.l  z80emuni
  405.         dc.l  z80emuni
  406.         dc.l  z80emuni
  407.         dc.l  z80emuni
  408.         dc.l  z80emuni
  409.         dc.l  z80emuni
  410.         dc.l  z80emuni
  411.         dc.l  z80emuni
  412.         dc.l  z80emuni
  413.         dc.l  z80emuni
  414.         dc.l  z80emuni            ;$30
  415.         dc.l  z80emuni
  416.         dc.l  z80emuni
  417.         dc.l  z80emuni
  418.         dc.l  z80emuni
  419.         dc.l  z80emuni
  420.         dc.l  z80emuni
  421.         dc.l  z80emuni
  422.         dc.l  z80emuni
  423.         dc.l  z80emuni
  424.         dc.l  z80emuni
  425.         dc.l  z80emuni
  426.         dc.l  z80emuni
  427.         dc.l  z80emuni
  428.         dc.l  z80emuni
  429.         dc.l  z80emuni
  430.         dc.l  z80emuni            ;$40
  431.         dc.l  z80emuni
  432.         dc.l  z80opc42
  433.         dc.l  z80opc43
  434.         dc.l  z80opc44
  435.         dc.l  z80opc45
  436.         dc.l  z80emuni
  437.         dc.l  z80opc47
  438.         dc.l  z80emuni
  439.         dc.l  z80emuni
  440.         dc.l  z80opc4a
  441.         dc.l  z80opc4b
  442.         dc.l  z80emuni
  443.         dc.l  z80opc4d
  444.         dc.l  z80emuni
  445.         dc.l  z80opc4f
  446.         dc.l  z80emuni            ;$50
  447.         dc.l  z80emuni
  448.         dc.l  z80opc52
  449.         dc.l  z80opc53
  450.         dc.l  z80emuni
  451.         dc.l  z80emuni
  452.         dc.l  z80emuni
  453.         dc.l  z80opc57
  454.         dc.l  z80emuni
  455.         dc.l  z80emuni
  456.         dc.l  z80opc5a
  457.         dc.l  z80opc5b
  458.         dc.l  z80emuni
  459.         dc.l  z80emuni
  460.         dc.l  z80emuni
  461.         dc.l  z80opc5f
  462.         dc.l  z80emuni            ;$60
  463.         dc.l  z80emuni
  464.         dc.l  z80emuni
  465.         dc.l  z80emuni
  466.         dc.l  z80emuni
  467.         dc.l  z80emuni
  468.         dc.l  z80emuni
  469.         dc.l  z80emuni
  470.         dc.l  z80emuni
  471.         dc.l  z80emuni
  472.         dc.l  z80emuni
  473.         dc.l  z80emuni
  474.         dc.l  z80emuni
  475.         dc.l  z80emuni
  476.         dc.l  z80emuni
  477.         dc.l  z80emuni
  478.         dc.l  z80emuni            ;$70
  479.         dc.l  z80emuni
  480.         dc.l  z80opc72
  481.         dc.l  z80opc73
  482.         dc.l  z80emuni
  483.         dc.l  z80emuni
  484.         dc.l  z80emuni
  485.         dc.l  z80emuni
  486.         dc.l  z80emuni
  487.         dc.l  z80emuni
  488.         dc.l  z80opc7a
  489.         dc.l  z80opc7b
  490.         dc.l  z80emuni
  491.         dc.l  z80emuni
  492.         dc.l  z80emuni
  493.         dc.l  z80emuni
  494.         dc.l  z80emuni            ;$80
  495.         dc.l  z80emuni
  496.         dc.l  z80emuni
  497.         dc.l  z80emuni
  498.         dc.l  z80emuni
  499.         dc.l  z80emuni
  500.         dc.l  z80emuni
  501.         dc.l  z80emuni
  502.         dc.l  z80emuni
  503.         dc.l  z80emuni
  504.         dc.l  z80emuni
  505.         dc.l  z80emuni
  506.         dc.l  z80emuni
  507.         dc.l  z80emuni
  508.         dc.l  z80emuni
  509.         dc.l  z80emuni
  510.         dc.l  z80emuni            ;$90
  511.         dc.l  z80emuni
  512.         dc.l  z80emuni
  513.         dc.l  z80emuni
  514.         dc.l  z80emuni
  515.         dc.l  z80emuni
  516.         dc.l  z80emuni
  517.         dc.l  z80emuni
  518.         dc.l  z80emuni
  519.         dc.l  z80emuni
  520.         dc.l  z80emuni
  521.         dc.l  z80emuni
  522.         dc.l  z80emuni
  523.         dc.l  z80emuni
  524.         dc.l  z80emuni
  525.         dc.l  z80emuni
  526.         dc.l  z80opca0            ;$a0
  527.         dc.l  z80opca1
  528.         dc.l  z80emuni
  529.         dc.l  z80emuni
  530.         dc.l  z80emuni
  531.         dc.l  z80emuni
  532.         dc.l  z80emuni
  533.         dc.l  z80emuni
  534.         dc.l  z80opca8
  535.         dc.l  z80opca9
  536.         dc.l  z80emuni
  537.         dc.l  z80emuni
  538.         dc.l  z80emuni
  539.         dc.l  z80emuni
  540.         dc.l  z80emuni
  541.         dc.l  z80emuni
  542.         dc.l  z80opcb0            ;$b0
  543.         dc.l  z80opcb1
  544.         dc.l  z80emuni
  545.         dc.l  z80emuni
  546.         dc.l  z80emuni
  547.         dc.l  z80emuni
  548.         dc.l  z80emuni
  549.         dc.l  z80emuni
  550.         dc.l  z80opcb8
  551.         dc.l  z80opcb9
  552.         dc.l  z80emuni
  553.         dc.l  z80emuni
  554.         dc.l  z80emuni
  555.         dc.l  z80emuni
  556.         dc.l  z80emuni
  557.         dc.l  z80emuni
  558.         dc.l  z80emuni            ;$c0
  559.         dc.l  z80emuni
  560.         dc.l  z80emuni
  561.         dc.l  z80emuni
  562.         dc.l  z80emuni
  563.         dc.l  z80emuni
  564.         dc.l  z80emuni
  565.         dc.l  z80emuni
  566.         dc.l  z80emuni
  567.         dc.l  z80emuni
  568.         dc.l  z80emuni
  569.         dc.l  z80emuni
  570.         dc.l  z80emuni
  571.         dc.l  z80emuni
  572.         dc.l  z80emuni
  573.         dc.l  z80emuni
  574.         dc.l  z80emuni            ;$d0
  575.         dc.l  z80emuni
  576.         dc.l  z80emuni
  577.         dc.l  z80emuni
  578.         dc.l  z80emuni
  579.         dc.l  z80emuni
  580.         dc.l  z80emuni
  581.         dc.l  z80emuni
  582.         dc.l  z80emuni
  583.         dc.l  z80emuni
  584.         dc.l  z80emuni
  585.         dc.l  z80emuni
  586.         dc.l  z80emuni
  587.         dc.l  z80emuni
  588.         dc.l  z80emuni
  589.         dc.l  z80emuni
  590.         dc.l  z80emuni            ;$e0
  591.         dc.l  z80emuni
  592.         dc.l  z80emuni
  593.         dc.l  z80emuni
  594.         dc.l  z80emuni
  595.         dc.l  z80emuni
  596.         dc.l  z80emuni
  597.         dc.l  z80emuni
  598.         dc.l  z80emuni
  599.         dc.l  z80emuni
  600.         dc.l  z80emuni
  601.         dc.l  z80emuni
  602.         dc.l  z80emuni
  603.         dc.l  z80emuni            ;opced already used
  604.         dc.l  z80emuni
  605.         dc.l  z80emuni
  606.         dc.l  z80emuni            ;$f0
  607.         dc.l  z80emuni
  608.         dc.l  z80emuni
  609.         dc.l  z80emuni
  610.         dc.l  z80emuni
  611.         dc.l  z80emuni
  612.         dc.l  z80emuni
  613.         dc.l  z80emuni
  614.         dc.l  z80emuni
  615.         dc.l  z80emuni
  616.         dc.l  z80emuni
  617.         dc.l  z80emuni
  618.         dc.l  z80emuni
  619.         dc.l  z80emuni
  620.         dc.l  z80emuni
  621.         dc.l  z80emuni
  622.  
  623. ;    debug count instruction
  624.  
  625. cntinst:    addq.l    #1,a0
  626.  
  627.         end
  628.  
  629.