Subversion Repositories NedoOS

Rev

Rev 1283 | Rev 1295 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

  1. PANIC
  2.  if debug_stop = 0
  3.  _Loop_
  4.  else
  5.  jr $
  6.  endif
  7.  
  8. loopc
  9.        _LoopC
  10.  
  11. CLRB_COMB_INCB_DECB
  12.         ld a,c
  13.         add a,a
  14.         jr c,INCB_DECB
  15.         jp m,COMBer
  16. ;CLRBer        
  17.         ld a,c
  18.        ex af,af' ;'
  19.         ;ld a,1
  20.         ;dec a
  21.         xor a ;юсэєы хЄ яхЁхэюё ш V, Єръ эрфю
  22.         ld c,a
  23.        ex af,af' ;'
  24.         PUTDEST8_Loop
  25. COMBer
  26.         GETDEST8_cmdc
  27.         ex af,af' ;' ;keep a=cmdLSB
  28.        ld l,a
  29.         ld a,c
  30.         cpl
  31.         ld c,a ;TODO Їыруш?
  32.        ld a,l
  33.        ex af,af' ;'
  34.         PUTDEST8_Loop
  35. INCB_DECB
  36.         jp m,DECBer
  37. ;INCBer
  38.         GETDEST8_cmdc
  39.         ex af,af' ;'
  40.         inc c
  41.         ex af,af' ;'
  42.         PUTDEST8_Loop
  43. DECBer
  44.         GETDEST8_cmdc
  45.         ex af,af' ;'
  46.         dec c
  47.         ex af,af' ;'
  48.         PUTDEST8_Loop
  49.  
  50. CLR_COM_INC_DEC
  51.         ld a,c
  52.         add a,a
  53.         jr c,INC_DEC
  54.         jp m,COMer
  55. ;CLRer
  56.         ld a,c
  57.        ex af,af' ;'
  58.         ;ld a,1
  59.         ;dec a
  60.         xor a ;юсэєы хЄ яхЁхэюё ш V, Єръ эрфю
  61.         ld b,a
  62.         ld c,a
  63.        ex af,af' ;'
  64.         PUTDEST_Loop      
  65. COMer
  66.         GETDEST_cmdc
  67.         ex af,af' ;' ;keep a=cmdLSB
  68.        ld l,a
  69.         ld a,c
  70.         cpl
  71.         ld c,a
  72.         ld a,b
  73.         cpl
  74.         ld b,a ;TODO Їыруш?
  75.        ld a,l
  76.        ex af,af' ;'
  77.         PUTDEST_Loop      
  78. INC_DEC
  79.         jp m,DECer
  80.         GETDEST_cmdc
  81.         ex af,af' ;'
  82.      rra ;keep CF in a7
  83.         ld hl,1
  84.         or a
  85.         adc hl,bc
  86.         ld b,h
  87.         ld c,l
  88.      rla ;CF from a7
  89.         ex af,af' ;'
  90.         PUTDEST_Loop      
  91. DECer
  92.         GETDEST_cmdc
  93.         ex af,af' ;'
  94.      rra ;keep CF in a7
  95.         ld h,b
  96.         ld l,c
  97.         ld bc,1
  98.         or a
  99.         sbc hl,bc
  100.         ld b,h
  101.         ld c,l
  102.      rla ;CF from a7
  103.         ex af,af' ;'
  104.         PUTDEST_Loop      
  105.  
  106. NEG_ADC_SBC_TST
  107.         ld a,c
  108.         add a,a
  109.         jp m,ADC_TST
  110.         jr c,SBCer
  111. ;NEGer
  112.         GETDEST_cmdc
  113.         ex af,af' ;'
  114.      rra ;keep CF in a7
  115.         ld hl,0
  116.         or a
  117.         sbc hl,bc
  118.         ld b,h
  119.         ld c,l
  120.      rla ;CF from a7
  121.         ex af,af' ;'
  122.         PUTDEST_Loop
  123. SBCer        
  124.         GETDEST_cmdc
  125.         ex af,af' ;'
  126.         ld h,b
  127.         ld l,c
  128.         ld bc,0
  129.         sbc hl,bc
  130.         ld b,h
  131.         ld c,l
  132.         ex af,af' ;'
  133.         PUTDEST_Loop
  134.  
  135. ADC_TST
  136.         jr c,TSTer
  137. ;ADCer
  138.         GETDEST_cmdc
  139.         ex af,af' ;'
  140.         ld hl,0
  141.         adc hl,bc
  142.         ld b,h
  143.         ld c,l
  144.         ex af,af' ;'
  145.         PUTDEST_Loop
  146. TSTer
  147.         GETDEST_cmdc_autoinc
  148.         ex af,af' ;'
  149.      rra
  150.      ld h,a ;keep CF
  151.         ld a,c
  152. ;ўЄюс√ яЁртшы№эю ёЇюЁьшЁютрЄ№ ZF,SF яю h,l:
  153. ;хёыш l!=0, Єю set h!=0
  154.        add a,0xff
  155.        sbc a,a ;CF=(c!=0)
  156.        and d;1 ;any number 1..0x7f
  157.        or b ;CF=0 ;ZF=(bc==0)
  158.      ld a,h
  159.      rla ;CF
  160.         ex af,af' ;'
  161.        _LoopC
  162.  
  163. XORer
  164.        ;jr $
  165.         ;ld b,a
  166.         rra
  167.         ld a,c
  168.         rra ;rrr?????
  169.          rra
  170.          rra
  171.          rra
  172.          rra
  173.          and 0x0e
  174.         ld l,a ;0000rrr0
  175.         ld h,_R0/256
  176.          ;ld l,(hl) ;TODO
  177.        ld a,c
  178.         ld c,(hl)
  179.         inc l
  180.         ld b,(hl) ;bc=src
  181.         ;jr $
  182.        push bc
  183.         GETDEST_cmda
  184.        pop hl
  185.         ex af,af' ;'
  186.      rra
  187.      ld hx,a ;keep CF
  188.         ld a,h ;src
  189.         xor b
  190.         ld b,a
  191.         ld a,l ;src
  192.         xor c
  193.         ld c,a
  194.         ;ld a,c
  195. ;ўЄюс√ яЁртшы№эю ёЇюЁьшЁютрЄ№ ZF,SF яю h,l:
  196. ;хёыш l!=0, Єю set h!=0
  197.        add a,0xff
  198.        sbc a,a ;CF=(c!=0)
  199.        and d;1 ;any number 1..0x7f
  200.        or b ;CF=0 ;ZF=(bc==0)
  201.      ld a,hx
  202.      rla ;CF
  203.         ex af,af' ;'
  204.         PUTDEST_Loop
  205.        
  206. NEGB_ADCB_SBCB_TSTB
  207.         ld a,c
  208.         add a,a
  209.         jp m,ADCB_TSTB
  210.         jr c,SBCBer
  211. ;NEGBer
  212.         GETDEST8_cmdc
  213.         ex af,af' ;'
  214.      rra ;keep CF in a7
  215.      ld h,a
  216.         xor a
  217.         sub c
  218.         ld c,a
  219.      ld a,h
  220.      rla ;CF from a7
  221.         ex af,af' ;'
  222.         PUTDEST8_Loop
  223. SBCBer
  224.         GETDEST8_cmdc
  225.         ex af,af' ;'
  226.         ld a,c
  227.         sbc a,0
  228.         ld c,a
  229.         ex af,af' ;'
  230.         PUTDEST8_Loop
  231.  
  232. ADCB_TSTB
  233.         jr c,TSTBer
  234. ;ADCBer
  235.         GETDEST8_cmdc
  236.         ex af,af' ;'
  237.         ld a,c
  238.         adc a,0
  239.         ld c,a
  240.         ex af,af' ;'
  241.         PUTDEST8_Loop
  242. TSTBer
  243.         GETDEST8_cmdc_autoinc
  244.         ex af,af' ;'
  245.      rra
  246.      ld h,a ;keep CF
  247.         ld a,c
  248.         or a ;TODO ёсЁюёшЄ№ V?
  249.      ld a,h
  250.      rla ;CF
  251.         ex af,af' ;'
  252.        _LoopC
  253.  
  254. MOVer
  255. ;15df, 02d8, ffb4 ;mov #1330, @#177664
  256. ;0001 0101 1101 1111
  257. ;0 001 010 111 011 111
  258.      ;(Rn)+;r7 ;@(Rn)+;r7
  259.  
  260. ;15c1, 4000 ;mov #40000,r1
  261. ;0001 0101 1100 0001
  262. ;0 001 010 111 000 001
  263.      ;(Rn)+;r7 ;rn;r1
  264.         ;ld b,a
  265. ;ac=cmd
  266.         call readsourceop ;out: bc=sourceop, a=cmdLSB
  267.         ex af,af' ;'
  268.      rra
  269.      ld h,a ;keep CF
  270.         ld a,c
  271. ;ўЄюс√ яЁртшы№эю ёЇюЁьшЁютрЄ№ ZF,SF яю h,l:
  272. ;хёыш l!=0, Єю set h!=0
  273.        add a,0xff
  274.        sbc a,a ;CF=(c!=0)
  275.        and d;1 ;any number 1..0x7f
  276.        or b ;CF=0 ;ZF=(bc==0)
  277.      ld a,h
  278.      rla ;CF
  279.         ;TODO ёсЁюёшЄ№ V
  280.         ex af,af' ;'
  281.         PUTDEST_Loop
  282.  
  283. CMPer
  284. ;ac=cmd
  285.         call readsourceop ;out: bc=sourceop, a=cmdLSB
  286.        push bc ;src
  287.         GETDEST_cmda_autoinc
  288.        ; ld h,b
  289.        ; ld l,c
  290.        ;pop bc ;hl=dest, bc=src
  291.        pop hl ;hl=src, bc=dest
  292.         ex af,af' ;'
  293.         or a
  294.         sbc hl,bc
  295.         ;ccf
  296.         ex af,af' ;'
  297.        _LoopC
  298.  
  299. BITer
  300. ;ac=cmd
  301.         call readsourceop ;out: bc=sourceop, a=cmdLSB
  302.        push bc
  303.         GETDEST_cmda_autoinc
  304.        pop hl
  305.         ;ex af,af' ;' ;keep a=cmdLSB
  306.         ld a,l ;src
  307.         and c
  308.         ld c,a
  309.         ld a,h ;src
  310.         and b
  311.         ld b,a
  312.      rra
  313.      ld h,a ;keep CF
  314.         ld a,c
  315. ;ўЄюс√ яЁртшы№эю ёЇюЁьшЁютрЄ№ ZF,SF яю h,l:
  316. ;хёыш l!=0, Єю set h!=0
  317.        add a,0xff
  318.        sbc a,a ;CF=(c!=0)
  319.        and d;1 ;any number 1..0x7f
  320.        or b ;CF=0 ;ZF=(bc==0)
  321.      ld a,h
  322.      rla ;CF
  323.         ex af,af' ;'
  324.        _LoopC
  325.  
  326. BICer
  327. ;ac=cmd
  328.         call readsourceop ;out: bc=sourceop, a=cmdLSB
  329.        push bc
  330.         GETDEST_cmda
  331.        pop hl
  332.         ex af,af' ;' ;keep a=cmdLSB
  333.      rra
  334.      ld hx,a ;keep CF
  335.         ld a,h ;src
  336.         cpl
  337.         and b
  338.         ld b,a
  339.         ld a,l ;src
  340.         cpl
  341.         and c
  342.         ld c,a
  343.         ;ld a,c
  344. ;ўЄюс√ яЁртшы№эю ёЇюЁьшЁютрЄ№ ZF,SF яю h,l:
  345. ;хёыш l!=0, Єю set h!=0
  346.        add a,0xff
  347.        sbc a,a ;CF=(c!=0)
  348.        and d;1 ;any number 1..0x7f
  349.        or b ;CF=0 ;ZF=(bc==0)
  350.      ld a,hx
  351.      rla ;CF
  352.         ex af,af' ;'
  353.         PUTDEST_Loop
  354.  
  355. BISer
  356. ;ac=cmd
  357.         call readsourceop ;out: bc=sourceop, a=cmdLSB
  358.        push bc
  359.         GETDEST_cmda
  360.        pop hl
  361.         ex af,af' ;' ;keep a=cmdLSB
  362.      rra
  363.      ld hx,a ;keep CF
  364.         ld a,h ;src
  365.         or b
  366.         ld b,a
  367.         ld a,l ;src
  368.         or c
  369.         ld c,a
  370.         ;ld a,c
  371. ;ўЄюс√ яЁртшы№эю ёЇюЁьшЁютрЄ№ ZF,SF яю h,l:
  372. ;хёыш l!=0, Єю set h!=0
  373.        add a,0xff
  374.        sbc a,a ;CF=(c!=0)
  375.        and d;1 ;any number 1..0x7f
  376.        or b ;CF=0 ;ZF=(bc==0)
  377.      ld a,hx
  378.      rla ;CF
  379.         ex af,af' ;'
  380.         PUTDEST_Loop
  381.  
  382. ADDer
  383. ;ac=cmd
  384.         call readsourceop ;out: bc=sourceop, a=cmdLSB
  385.        push bc
  386.         GETDEST_cmda
  387.        pop hl
  388.         ex af,af' ;'
  389.         or a
  390.         adc hl,bc
  391.         ex af,af' ;'
  392.         ld b,h
  393.         ld c,l
  394.         PUTDEST_Loop
  395.  
  396. SUBer
  397. ;ac=cmd
  398.         call readsourceop ;out: bc=sourceop, a=cmdLSB
  399.        push bc
  400.         GETDEST_cmda
  401.         ld h,b
  402.         ld l,c
  403.        pop bc
  404.         ex af,af' ;'
  405.         or a
  406.         sbc hl,bc
  407.         ccf
  408.         ex af,af' ;'
  409.         ld b,h
  410.         ld c,l
  411.         PUTDEST_Loop
  412.  
  413. MOVBer
  414.         call readsource8op ;out: bc=sourceop, a=cmdLSB
  415.         ex af,af' ;'
  416.      rra
  417.      ld h,a ;keep CF
  418.        ld a,c
  419.        rla
  420.        sbc a,a
  421.        ld b,a ;for textshow
  422.         ld a,c
  423.         or a
  424.         ;TODO ёсЁюёшЄ№ V
  425.      ld a,h
  426.      rla ;CF
  427.         ex af,af' ;'
  428.       if CRUTCH
  429.       and 0x3f
  430.       ;cp 0xe0
  431.       cp 0x08
  432.       jr nc,MOVB_minusr0 ;ы■ср  рфЁхёрЎш , ъЁюьх яЁюёЄюую Rn
  433.       endif
  434.         PUTDEST_Loop ;for textshow
  435. MOVB_minusr0
  436.         PUTDEST8_Loop
  437.  
  438. CMPBer
  439. ;ac=cmd
  440.         call readsource8op ;out: bc=sourceop, a=cmdLSB
  441.        push bc
  442.         GETDEST8_cmda_autoinc
  443.        pop hl
  444.         ex af,af' ;'
  445.         ld a,c
  446.         sub l
  447.         ld c,a
  448.         ccf
  449.         ex af,af' ;'
  450.        _LoopC
  451.  
  452. BITBer
  453. ;ac=cmd
  454.         call readsource8op ;out: bc=sourceop, a=cmdLSB
  455.        push bc
  456.         GETDEST8_cmda_autoinc
  457.        pop hl
  458.         ex af,af' ;'
  459.      rra
  460.      ld h,a ;keep CF
  461.         ld a,c
  462.         and l ;TODO keep CY?
  463.      ld a,h
  464.      rla ;CF
  465.         ex af,af' ;'
  466.        _LoopC
  467.  
  468. BICBer
  469. ;ac=cmd
  470.         call readsource8op ;out: bc=sourceop, a=cmdLSB
  471.        push bc
  472.         GETDEST8_cmda
  473.        pop hl
  474.         ex af,af' ;'
  475.      rra
  476.      ld h,a ;keep CF
  477.         ld a,l ;src
  478.         cpl
  479.         and c
  480.         ld c,a
  481.      ld a,h
  482.      rla ;CF
  483.         ex af,af' ;'
  484.         PUTDEST8_Loop
  485.  
  486. BISBer
  487. ;ac=cmd
  488.         call readsource8op ;out: bc=sourceop, a=cmdLSB
  489.        push bc
  490.         GETDEST8_cmda
  491.        pop hl
  492.         ex af,af' ;'
  493.      rra
  494.      ld h,a ;keep CF
  495.         ld a,c
  496.         or l
  497.         ld c,a
  498.      ld a,h
  499.      rla ;CF
  500.         ex af,af' ;'
  501.        if 0 ;эх яюьюуыю фы  nocopper, тююс∙х шёўхчыр эрфяшё№
  502.        ld h,a
  503.        ld a,c
  504.        rla
  505.        sbc a,a
  506.        ld b,a
  507.        ld a,h
  508.        PUTDEST_Loop
  509.        else
  510.         PUTDEST8_Loop
  511.        endif
  512.  
  513. CALLer
  514. ;jsr link, addr ЁрсюЄрхЄ Єръ: mov link=>-(sp);mov pc=>link; mov addr=>pc
  515.         rra
  516.         ld a,c
  517.         rra
  518.         and 0xe0
  519.        cp 0xe0
  520.        jr z,CALLerPC
  521.        rrca
  522.        rrca
  523.        rrca
  524.        rrca
  525. ;TODO test
  526.         ld l,a
  527.         ld h,_R0/256
  528.        
  529. ;юЄэюёшЄхы№э√щ call?
  530. ;0 000 100 lnk 110 rrr
  531.           ;src ;@X(rn) ;dst
  532.  
  533. ;рсёюы■Єэ√щ call
  534. ;0 000 100 lnk 011 111
  535.           ;src ;@(Rn)+ ;dst
  536.         ld a,c
  537.         and 0x38
  538.         cp 0x18
  539.         jr nz,$
  540.        
  541.        push hl
  542.         ld c,(hl)
  543.         inc l
  544.         ld b,(hl) ;bc=link
  545.        inc bc
  546.        inc bc
  547.         putmemspBC
  548.        
  549.         get
  550.         next
  551.         ld c,a
  552.         get
  553.         next
  554.         ld b,a ;bc=X
  555.  
  556.         decodePC
  557.         ;ld a,e
  558.         ;add a,c
  559.         ;ld c,a
  560.         ;ld a,d
  561.         ;adc a,b
  562.         ;ld b,a ;bc=pc+X
  563.        
  564.        pop hl
  565.         ld (hl),e
  566.         inc l
  567.         ld (hl),d
  568. bctoPCLoop
  569.         ld d,b
  570.         ld e,c
  571. loopcjp
  572.        _LoopC_JP
  573.  
  574. ;09f7 - юЄэюёшЄхы№э√щ call
  575. ;0000 1001 1111 0111
  576. ;0 000 100 111 110 111<-link
  577.           ;src ;X(rn) ;dst
  578. ;09df - рсёюы■Єэ√щ call
  579. ;0000 1001 1101 1111
  580. ;0 000 100 111 011 111<-link
  581.           ;src ;@(Rn)+ ;dst
  582. CALLerPC
  583. ;jsr PC, addr ЁрсюЄрхЄ Єръ: mov PC=>-(sp);mov addr=>pc
  584.        ld a,c
  585.        push af
  586.         ld a,(pc_high)
  587.         xor d
  588.         and 0xc0
  589.         xor d
  590.         ld b,a
  591.         ld c,e ;bc=link
  592.        inc bc
  593.        inc bc
  594.         putmemspBC
  595.        
  596.         get
  597.         next
  598.         ld c,a
  599.         get
  600.         next
  601.         ld b,a ;bc=X
  602.        pop af
  603.        cp 0xdf
  604.        jp z,bctoPCLoop
  605.       if DEBUG
  606.        cp 0xf7
  607.        jr nz,$
  608.       endif
  609.         decodePC
  610.         ld a,e
  611.         add a,c
  612.         ld e,a
  613.         ld a,d
  614.         adc a,b
  615.         ld d,a ;bc=pc+X
  616.        _LoopC_JP
  617.  
  618. SOBer
  619. ;Subtract One and Branch: Reg < Reg - 1; if Reg ? 0 then PC < PC - 2 ? Offset
  620. ;TODO pc,sp?
  621.         rra
  622.         ld a,c
  623.         rra
  624.          rra
  625.          rra
  626.          rra
  627.          rra
  628.          and 0x0e
  629.         ld l,a
  630.         ld h,_R0/256
  631.        ld a,c
  632.         ld c,(hl)
  633.         inc l
  634.         ld b,(hl)
  635.         cpd
  636.         ld (hl),c
  637.         inc hl
  638.         ld (hl),b
  639.         jp po,loopc ;jump if 0
  640.         and 0x3f
  641.         add a,a
  642.         ld c,a
  643.         decodePC        
  644.         ld a,e
  645.         sub c
  646.         ld e,a
  647.         jr nc,$+3
  648.         dec d
  649.        _LoopC_JP
  650.  
  651. exaBR
  652.         ex af,af' ;'
  653. BRer
  654.         decodePC
  655.        sla c
  656.        sbc a,a
  657.        ld b,a
  658.         ld a,e
  659.         add a,c
  660.         ld e,a
  661.         ld a,d
  662.         adc a,b
  663.         ld d,a
  664.        _LoopC_JP
  665.  
  666. BNEer
  667.         ex af,af' ;'
  668.         jr nz,exaBR
  669.         ex af,af' ;'
  670.        _LoopC
  671. BEQer
  672.         ex af,af' ;'
  673.         jr z,exaBR
  674.         ex af,af' ;'
  675.        _LoopC
  676. BGTer ;Branch if greater than (Z v (N (+) V)) = 0
  677. ;for pipedoc
  678.         ex af,af' ;'
  679.        jr z,exanoBR
  680.         ex af,af' ;'
  681. BGEer ;Branch if greater than or equal (N (+) V) = 0
  682. ;for ninza, leopol
  683.         ex af,af' ;'
  684.        jp pe,BGEoverflow
  685.        jp p,exaBR
  686. exanoBR
  687.         ex af,af' ;'
  688.        _LoopC
  689. BGEoverflow
  690. BLTnooverflow
  691.        jp m,exaBR
  692.         ex af,af' ;'
  693.        _LoopC
  694. BLEer ;Branch if less than or equal (Z v (N (+) V)) = 1
  695.         ex af,af' ;'
  696.        jr z,exaBR
  697.         ex af,af' ;'
  698. BLTer ;Branch if less than (N (+) V) = 1
  699. ;for digger, leopol
  700.         ex af,af' ;'
  701.        jp po,BLTnooverflow
  702.        jp p,exaBR
  703.         ex af,af' ;'
  704.        _LoopC
  705. BPLer
  706.         ex af,af' ;'
  707.         jp p,exaBR
  708.         ex af,af' ;'
  709.        _LoopC
  710. BMIer
  711.         ex af,af' ;'
  712.         jp m,exaBR
  713.         ex af,af' ;'
  714.        _LoopC
  715. BHIer ;(C ? Z) = 0
  716.         ex af,af' ;'
  717.         jr c,$+4
  718.         jr nz,exaBR
  719.         ex af,af' ;'
  720.        _LoopC
  721. BLOSer ;(C ? Z) = 1
  722.         ex af,af' ;'
  723.         jr c,exaBR
  724.         jr z,exaBR
  725.         ex af,af' ;'
  726.        _LoopC
  727. BVCer ;Branch if overflow clear V = 0
  728.         ex af,af' ;'
  729.         jp po,exaBR ;po=no overflow
  730.         ex af,af' ;'
  731.        _LoopC
  732. BVSer ;Branch if overflow set V = 1
  733.         ex af,af' ;'
  734.         jp pe,exaBR ;pe=overflow
  735.         ex af,af' ;'
  736.        _LoopC
  737. BCCer ;BCC or BHIS      Branch if carry clear, or Branch if higher or same C = 0
  738.         ex af,af' ;'
  739.         jp nc,exaBR
  740.         ex af,af' ;'
  741.        _LoopC
  742. BCSer ;BCS or BLO       Branch if carry set, or Branch if lower C = 1
  743.         ex af,af' ;'
  744.         jp c,exaBR
  745.         ex af,af' ;'
  746.        _LoopC
  747.  
  748. RTI_JMP_RTS_SWAB
  749. ;0000.. ёь. эшцх
  750. ;0001?? JMP     Jump: PC < Src
  751. ;00020r RTS     Return from subroutine: PC < Reg; Reg < (SP)+
  752. ;0002?? d5=1,d4=0       Ccc ;flags &= ~(d3..d0 (NZVC))
  753. ;0002?? d5=1,d4=1       Scc ;flags |= (d3..d0 (NZVC))
  754. ;0003dr SWAB    Swap bytes of word: Dest < Swap-bytes(Dest)
  755.         ;ld b,a
  756.         ld a,c
  757.         add a,a
  758.         jr c,c0002_0003
  759.         jp m,JMPer;c0001
  760. ;000000 HALT
  761. ;000001 WAIT
  762. ;000002 RTI     Return from interrupt: PC < (SP)+; PS < (SP)+
  763. ;000003 BPT     Breakpoint trap: -(SP) < PS; -(SP) < PC; PC < (14); PS < (16)
  764. ;000004 IOT     I/O trap: -(SP) < PS; -(SP) < PC; PC < (20); PS < (22)
  765. ;000005 RESET
  766. ;000006 RTT     Return from trap: PC < (SP)+; PS < (SP)+
  767. ;TODO
  768.         cp 4*2
  769.         jr z,looper ;IOT
  770.         cp 5*2
  771.         jr z,looper ;RESET ;for pacman
  772.         jr $
  773.        
  774. c0002_0003
  775. ;a=cmdLSB*2
  776.         jp m,SWABer;c0003
  777. ;00020r RTS     Return from subroutine: PC < Reg; Reg < (SP)+
  778.         cp 8*2 ;ё=0x80..0x87
  779.         jr c,RTSer
  780. ;0002?? d5=1,d4=0       Ccc ;flags &= ~(d3..d0 (NZVC))
  781. ;0002?? d5=1,d4=1       Scc ;flags |= (d3..d0 (NZVC))
  782.         bit 4,c
  783.         jr nz,SCCer
  784.        ld a,c
  785.        push af
  786.         call getflags_bc
  787.        pop af
  788.        and 0x0f
  789.        cpl
  790.        and c
  791.        ld c,a
  792.         call makeflags_frombc
  793. looper
  794.        _LoopC
  795. SCCer
  796.        ld a,c
  797.        push af
  798.         call getflags_bc
  799.        pop af
  800.        and 0x0f
  801.        or c
  802.        ld c,a
  803.         call makeflags_frombc
  804.        _LoopC
  805.  
  806. RTSer
  807.         ;and 0x0e
  808.        cp 0x0e
  809.        jr z,RTSerPC
  810. ;TODO test
  811.         ld l,a
  812.         ld h,_R0/256
  813.         ld e,(hl)
  814.         inc l
  815.         ld d,(hl)
  816.        push hl
  817.         getmemspBC
  818.        pop hl
  819.         ld (hl),b
  820.         dec l
  821.         ld (hl),c
  822.        _LoopC_JP
  823. RTSerPC
  824.         getmemspBC
  825.         ld d,b
  826.         ld e,c
  827.        _LoopC_JP
  828.  
  829. JMPer
  830. ;?c=cmd
  831. ;яюўхьє jmp (r3) ё рфЁхёрЎшхщ (Rn) ЁрсюЄрхЄ ъръ jmp r3? (cputest 0x0258 -> 0x3dc8)
  832. ;jmp X(pc) ЁрсюЄрхЄ ъръ jmp pc+x (cputest 0x3dfc)
  833.        ld a,c
  834.        and 0x38
  835.        cp 0x08
  836.        jr z,JMPer_001
  837.        cp 0x18
  838.        jr z,JMPer_011
  839.        cp 0x30
  840.        jp z,JMPer_110
  841.        jr $
  842.         GETDEST_cmdc_autoinc ;call readsourceop ;out: bc=sourceop, a=cmdLSB
  843.         ld d,b
  844.         ld e,c
  845.        _LoopC_JP
  846. JMPer_001 ;pc=rn
  847.         ld a,c
  848.         rla
  849.         and 0x0e
  850.         ld l,a ;0000rrr0
  851.         ld h,_R0/256
  852.         ld e,(hl)
  853.         inc l
  854.         ld d,(hl)
  855.        _LoopC_JP
  856. JMPer_011 ;pc=(Rn++)
  857.         ld a,c
  858.         rla
  859.         and 0x0e
  860.        cp 0x0e
  861.        jr z,JMPer_011_pc ;pc=(pc++)
  862.         ld l,a ;0000rrr0
  863.         ld h,_R0/256
  864.         ld e,(hl)
  865.         inc l
  866.         ld d,(hl)
  867.         ex de,hl
  868.         ld a,h
  869.         and 0xc0
  870.         ld c,a
  871.        ld lx,a
  872.         ld b,tpgs/256
  873.         set 7,h
  874.         set 6,h
  875.         ld a,(bc)
  876.         SETPGC000
  877.         ld e,(hl)
  878.         inc l
  879.         call z,inchnextpg
  880.         ld d,(hl)
  881.        _LoopC_JP
  882. JMPer_011_pc ;pc=(pc++)
  883.         get
  884.         next
  885.         ld c,a
  886.         get
  887.         next
  888.         ld d,a
  889.         ld e,c
  890.        _LoopC_JP
  891. JMPer_110 ;pc=rn+x
  892.         ld a,c
  893.         rla
  894.         and 0x0e
  895.        cp 0x0e
  896.        jr z,JMPer_110_pc
  897.         ld l,a ;0000rrr0
  898.         ld h,_R0/256
  899.         get
  900.         next
  901.         add a,(hl)
  902.         ld c,a
  903.         get
  904.         ;next
  905.         inc l
  906.         adc a,(hl)
  907.         ld d,a
  908.         ld e,c
  909.        _LoopC_JP
  910. JMPer_110_pc ;pc=pc+x
  911.         get
  912.         next
  913.         ld c,a
  914.         get
  915.         next
  916.         ld b,a
  917.        decodePC_to_ae
  918.         ld h,a
  919.        ld a,c
  920.        add a,e
  921.        ld e,a
  922.        ld a,b
  923.        adc a,h ;ac=pc+X
  924.        ld d,a
  925.        _LoopC_JP
  926.  
  927. RORB_ROLB_ASRB_ASLB
  928.         ld a,c
  929.         add a,a
  930.         jr c,ASRB_ASLB
  931.         jp m,ROLBer
  932. ;RORBer
  933.         GETDEST8_cmdc
  934.         ex af,af' ;'
  935.         rr c
  936.         ex af,af' ;'
  937.         PUTDEST8_Loop
  938. ROLBer
  939.         GETDEST8_cmdc
  940.         ex af,af' ;'
  941.         rl c
  942.         ex af,af' ;'
  943.         PUTDEST8_Loop
  944. ASRB_ASLB
  945.         jp m,ASLBer
  946. ;ASRer
  947.         GETDEST8_cmdc
  948.         ex af,af' ;' ;keep a=cmdLSB
  949.         sra c ;TODO яЁютхЁшЄ№
  950.         ex af,af' ;'
  951.         PUTDEST8_Loop
  952. ASLBer
  953.         GETDEST8_cmdc
  954.         ex af,af' ;' ;keep a=cmdLSB
  955.         sla c
  956.         ex af,af' ;'
  957.         PUTDEST8_Loop
  958.  
  959.  
  960. ROR_ROL_ASR_ASL
  961.         ld a,c
  962.         add a,a
  963.         jr c,ASR_ASL
  964.         jp m,ROLer
  965. ;RORer
  966.         GETDEST_cmdc
  967.         ex af,af' ;'
  968.         rr b
  969.         rr c
  970.      rra
  971.      ld h,a ;keep CF
  972.         ld a,c
  973. ;ўЄюс√ яЁртшы№эю ёЇюЁьшЁютрЄ№ ZF,SF яю h,l:
  974. ;хёыш l!=0, Єю set h!=0
  975.        add a,0xff
  976.        sbc a,a ;CF=(c!=0)
  977.        and d;1 ;any number 1..0x7f
  978.        or b ;CF=0 ;ZF=(bc==0)
  979.      ld a,h
  980.      rla ;CF
  981.         ex af,af' ;'
  982.         PUTDEST_Loop
  983. ROLer
  984.         GETDEST_cmdc
  985.         ex af,af' ;'
  986.         rl c
  987.         rl b
  988.      rra
  989.      ld h,a ;keep CF
  990.         ld a,c
  991. ;ўЄюс√ яЁртшы№эю ёЇюЁьшЁютрЄ№ ZF,SF яю h,l:
  992. ;хёыш l!=0, Єю set h!=0
  993.        add a,0xff
  994.        sbc a,a ;CF=(c!=0)
  995.        and d;1 ;any number 1..0x7f
  996.        or b ;CF=0 ;ZF=(bc==0)
  997.      ld a,h
  998.      rla ;CF
  999.         ex af,af' ;'
  1000.         PUTDEST_Loop
  1001. ASR_ASL
  1002.         jp m,ASLer
  1003. ;ASRer
  1004.         GETDEST_cmdc
  1005.         ex af,af' ;' ;keep a=cmdLSB
  1006.         sra b
  1007.         rr c
  1008.      rra
  1009.      ld h,a ;keep CF
  1010.         ld a,c
  1011. ;ўЄюс√ яЁртшы№эю ёЇюЁьшЁютрЄ№ ZF,SF яю h,l:
  1012. ;хёыш l!=0, Єю set h!=0
  1013.        add a,0xff
  1014.        sbc a,a ;CF=(c!=0)
  1015.        and d;1 ;any number 1..0x7f
  1016.        or b ;CF=0 ;ZF=(bc==0)
  1017.      ld a,h
  1018.      rla ;CF
  1019.         ex af,af' ;'
  1020.         PUTDEST_Loop
  1021. ASLer
  1022.         GETDEST_cmdc
  1023.         ex af,af' ;' ;keep a=cmdLSB
  1024.         ld h,b
  1025.         ld l,c
  1026.         or a
  1027.         adc hl,hl
  1028.         ld b,h
  1029.         ld c,l
  1030.         ex af,af' ;'
  1031.         PUTDEST_Loop
  1032.  
  1033. c0064_MFPI_MTPI_SXT
  1034. ;TODO
  1035.         ld a,c
  1036.         add a,a
  1037.         jp m,MFPI_SXT
  1038. ;c0064_MTPI
  1039.         jr nc,$
  1040. ;MTPIer ;Move to previous I space: Dest < (SP)+
  1041.         ld hl,(_R6)
  1042.         inc hl
  1043.         inc hl
  1044.         ld (_R6),hl
  1045.         dec hl
  1046.         dec hl
  1047.         PUTDEST_Loop
  1048. MFPI_SXT
  1049.         jr c,SXTer
  1050. ;MFPIer ;Move from previous I space: ?(SP) < Src
  1051.         GETDEST_cmdc_autoinc
  1052.         ld hl,(_R6)
  1053.         dec hl
  1054.         dec hl
  1055.         ld (_R6),hl
  1056.         WRMEM_hl_LoopC
  1057. SXTer ;Sign extend: if N flag ? 0 then Dest < -1 else Dest < 0
  1058.         ex af,af' ;'
  1059.         ld bc,0
  1060.         jp p,$+3+1
  1061.         dec bc
  1062.         ex af,af' ;'
  1063.         PUTDEST_Loop
  1064.  
  1065. MTPS_MFPD_MTPD_MFPS
  1066.         ld a,c
  1067.         add a,a
  1068.         jp m,MFPD_MFPS
  1069. ;MTPS_MTPD
  1070.         jr c,MTPDer
  1071. ;MTPSer ;Move to PSW: PSW < Src
  1072.         GETDEST_cmdc_autoinc
  1073.         call makeflags_frombc
  1074.        _LoopC
  1075. MTPDer ;Move to previous D space: Dest < (SP)+
  1076.         ld hl,(_R6)
  1077.         inc hl
  1078.         inc hl
  1079.         ld (_R6),hl
  1080.         dec hl
  1081.         dec hl
  1082.         PUTDEST_Loop
  1083.  
  1084. MFPD_MFPS
  1085.         jr c,MFPDer
  1086. ;MFPSer ;Move from PSW: Dest < PSW
  1087.        ld a,c
  1088.        push af
  1089.         call getflags_bc
  1090.        pop af
  1091.         PUTDEST_Loop
  1092. MFPDer ;Move from previous D space: ?(SP) < Src
  1093.         GETDEST_cmdc_autoinc
  1094.         ld hl,(_R6)
  1095.         dec hl
  1096.         dec hl
  1097.         ld (_R6),hl
  1098.         WRMEM_hl_LoopC
  1099.        
  1100. MULer
  1101.         jr $
  1102. DIVer
  1103.         jr $
  1104. ASHer
  1105.         jr $
  1106. ASHCer
  1107.         jr $
  1108.  
  1109. SWABer
  1110.         GETDEST_cmdc
  1111.         ld h,b
  1112.         ld b,c
  1113.         ld c,h
  1114.         PUTDEST_Loop
  1115.  
  1116. EMTer
  1117. ;TODO
  1118. ;Emulator trap: -(SP) < PS; -(SP) < PC; PC < (30); PS < (32)
  1119.        ld a,c
  1120.        cp 0x3b ;draw pixel
  1121.        jr z,EMT_drawpixel
  1122.        cp 0x39 ;get color
  1123.        jr z,EMT_getcolor
  1124.        cp 0x38 ;set color
  1125.        jr z,EMT_setcolor
  1126.        _LoopC
  1127. EMT_drawpixel
  1128.         ld hl,(_R1) ;y
  1129.         ld h,l
  1130.         ld l,0
  1131.         srl h
  1132.         rr l
  1133.         srl h
  1134.         rr l ;y*64
  1135.         ld bc,(_R0) ;x
  1136.        push bc
  1137.         ld b,0
  1138.         srl c
  1139.         srl c ;x/4
  1140.         add hl,bc
  1141.         ld a,(tpgs+0x40)
  1142.         set 7,h
  1143.         set 6,h
  1144.         SETPGC000
  1145.        pop bc
  1146.         ld a,c
  1147.         ld c,3
  1148.         and c;3
  1149.         inc a
  1150.         ld b,a
  1151.         ld a,(bk_curcolor)
  1152.         and c;3
  1153. rollcolor0
  1154.         rrc c
  1155.         rrc c ;mask
  1156.         rrca
  1157.         rrca ;pixel
  1158.         djnz rollcolor0
  1159.         xor (hl)
  1160.         and c
  1161.         xor (hl)
  1162.         ld (hl),a
  1163.         call putscreen_c
  1164.        _LoopC
  1165. EMT_getcolor
  1166. bk_curcolor=$+1
  1167.         ld hl,0
  1168.         ld (_R0),hl
  1169.        _LoopC
  1170. EMT_setcolor
  1171.         ld hl,(_R0)
  1172.         ld (bk_curcolor),hl
  1173.        _LoopC
  1174.  
  1175. TRAPer
  1176. ;TODO
  1177. ;General trap: -(SP) < PS; -(SP) < PC; PC < (34); PS < (36)
  1178.         jr $
  1179.  
  1180. FFFFer
  1181. ;for Piramania
  1182.        _LoopC
  1183.