?login_element?

Subversion Repositories NedoOS

Rev

Rev 1379 | 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 ;GETDEST8_cmdc ;ёэрўрыр ўшЄрхь, яюЄюь юсэєы хь? эх ьюцхЄ эш эр ўЄю яютыш Є№?
  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 ;GETDEST_cmdc ;ёэрўрыр ўшЄрхь, яюЄюь юсэєы хь? эх ьюцхЄ эш эр ўЄю яютыш Є№?
  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.        cp 0xff&(0x87*2) ;inc pc = 005207
  81.        jr z,incpc
  82.         GETDEST_cmdc
  83.         ex af,af' ;'
  84.      rra ;keep CF in a7
  85.         ld hl,1
  86.         or a
  87.         adc hl,bc
  88.         ld b,h
  89.         ld c,l
  90.      rla ;CF from a7
  91.         ex af,af' ;'
  92.         PUTDEST_Loop      
  93. incpc
  94. oddpc=$+1
  95.         ld a,0xaa
  96.         rrca
  97.         ld (oddpc),a
  98.         jr nc,incpc_nowasodd
  99.         next
  100.         next
  101. incpc_nowasodd
  102.        _LoopC
  103. DECer
  104.         GETDEST_cmdc
  105.         ex af,af' ;'
  106.      rra ;keep CF in a7
  107.         ld h,b
  108.         ld l,c
  109.         ld bc,1
  110.         or a
  111.         sbc hl,bc
  112.         ld b,h
  113.         ld c,l
  114.      rla ;CF from a7
  115.         ex af,af' ;'
  116.         PUTDEST_Loop      
  117.  
  118. NEG_ADC_SBC_TST
  119.         ld a,c
  120.         add a,a
  121.         jp m,ADC_TST
  122.         jr c,SBCer
  123. ;NEGer
  124.         GETDEST_cmdc
  125.         ex af,af' ;'
  126.      rra ;keep CF in a7
  127.         ld hl,0
  128.         or a
  129.         sbc hl,bc
  130.         ld b,h
  131.         ld c,l
  132.      rla ;CF from a7
  133.         ex af,af' ;'
  134.         PUTDEST_Loop
  135. SBCer        
  136.         GETDEST_cmdc
  137.         ex af,af' ;'
  138.        ;ccf ;for morf!
  139.         ld h,b
  140.         ld l,c
  141.         ld bc,0
  142.         sbc hl,bc
  143.         ld b,h
  144.         ld c,l
  145.        ;ccf ;for morf!
  146.         ex af,af' ;'
  147.         PUTDEST_Loop
  148.  
  149. ADC_TST
  150.         jr c,TSTer
  151. ;ADCer
  152.         GETDEST_cmdc
  153.         ex af,af' ;'
  154.         ld hl,0
  155.         adc hl,bc
  156.         ld b,h
  157.         ld c,l
  158.         ex af,af' ;'
  159.         PUTDEST_Loop
  160. TSTer
  161.         GETDEST_cmdc_autoinc
  162.         ex af,af' ;'
  163.      rra
  164.      ld h,a ;keep CF
  165.         ld a,c
  166. ;ўЄюс√ яЁртшы№эю ёЇюЁьшЁютрЄ№ ZF,SF яю h,l:
  167. ;хёыш l!=0, Єю set h!=0
  168.        add a,0xff
  169.        sbc a,a ;CF=(c!=0)
  170.        and d;1 ;any number 1..0x7f
  171.        or b ;CF=0 ;ZF=(bc==0)
  172.      ld a,h
  173.      rla ;CF
  174.         ex af,af' ;'
  175.        _LoopC
  176.  
  177. XORer
  178.         ;ld b,a
  179.         rra
  180.         ld a,c
  181.         rra ;rrr?????
  182.          rra
  183.          rra
  184.          rra
  185.          rra
  186.          and 0x0e
  187.         ld l,a ;0000rrr0
  188.         ld h,_R0/256
  189.          ;ld l,(hl) ;TODO
  190.        ld a,c
  191.         ld c,(hl)
  192.         inc l
  193.         ld b,(hl) ;bc=src
  194.         ;jr $
  195.        push bc
  196.         GETDEST_cmda
  197.        pop hl
  198.         ex af,af' ;'
  199.      rra
  200.      ld hx,a ;keep CF
  201.         ld a,h ;src
  202.         xor b
  203.         ld b,a
  204.         ld a,l ;src
  205.         xor c
  206.         ld c,a
  207.         ;ld a,c
  208. ;ўЄюс√ яЁртшы№эю ёЇюЁьшЁютрЄ№ ZF,SF яю h,l:
  209. ;хёыш l!=0, Єю set h!=0
  210.        add a,0xff
  211.        sbc a,a ;CF=(c!=0)
  212.        and d;1 ;any number 1..0x7f
  213.        or b ;CF=0 ;ZF=(bc==0)
  214.      ld a,hx
  215.      rla ;CF
  216.         ex af,af' ;'
  217.         PUTDEST_Loop
  218.        
  219. NEGB_ADCB_SBCB_TSTB
  220.         ld a,c
  221.         add a,a
  222.         jp m,ADCB_TSTB
  223.         jr c,SBCBer
  224. ;NEGBer
  225.         GETDEST8_cmdc
  226.         ex af,af' ;'
  227.      rra ;keep CF in a7
  228.      ld h,a
  229.         xor a
  230.         sub c
  231.         ld c,a
  232.      ld a,h
  233.      rla ;CF from a7
  234.         ex af,af' ;'
  235.         PUTDEST8_Loop
  236. SBCBer
  237.         GETDEST8_cmdc
  238.         ex af,af' ;'
  239.         ld a,c
  240.         sbc a,0
  241.         ld c,a
  242.         ex af,af' ;'
  243.         PUTDEST8_Loop
  244.  
  245. ADCB_TSTB
  246.         jr c,TSTBer
  247. ;ADCBer
  248.         GETDEST8_cmdc
  249.         ex af,af' ;'
  250.         ld a,c
  251.         adc a,0
  252.         ld c,a
  253.         ex af,af' ;'
  254.         PUTDEST8_Loop
  255. TSTBer
  256.         GETDEST8_cmdc_autoinc
  257.         ex af,af' ;'
  258.      rra
  259.      ld h,a ;keep CF
  260.         ld a,c
  261.         or a ;TODO ёсЁюёшЄ№ V?
  262.      ld a,h
  263.      rla ;CF
  264.         ex af,af' ;'
  265.        _LoopC
  266.  
  267. MOVer
  268. ;15df, 02d8, ffb4 ;mov #1330, @#177664
  269. ;0001 0101 1101 1111
  270. ;0 001 010 111 011 111
  271.      ;(Rn)+;r7 ;@(Rn)+;r7
  272.  
  273. ;15c1, 4000 ;mov #40000,r1
  274. ;0001 0101 1100 0001
  275. ;0 001 010 111 000 001
  276.      ;(Rn)+;r7 ;rn;r1
  277.         ;ld b,a
  278. ;ac=cmd
  279.         call rdsrcop ;out: bc=sourceop, a=cmdLSB
  280.         ex af,af' ;'
  281.      rra
  282.      ld h,a ;keep CF
  283.      ;jr $
  284.         ld a,c
  285. ;ўЄюс√ яЁртшы№эю ёЇюЁьшЁютрЄ№ ZF,SF яю h,l:
  286. ;хёыш l!=0, Єю set h!=0
  287.        add a,0xff
  288.        sbc a,a ;CF=(c!=0)
  289.        and d;1 ;any number 1..0x7f
  290.        or b ;CF=0 ;ZF=(bc==0)
  291.      ld a,h
  292.      rla ;CF
  293.         ;TODO ёсЁюёшЄ№ V
  294.         ex af,af' ;'
  295.         PUTDEST_Loop
  296.  
  297. CMPer
  298. ;ac=cmd
  299.         call rdsrcop ;out: bc=sourceop, a=cmdLSB
  300.        push bc ;src
  301.         GETDEST_cmda_autoinc
  302.        ; ld h,b
  303.        ; ld l,c
  304.        ;pop bc ;hl=dest, bc=src
  305.        pop hl ;hl=src, bc=dest
  306.         ex af,af' ;'
  307.         or a
  308.         sbc hl,bc
  309.         ;ccf
  310.         ex af,af' ;'
  311.        _LoopC
  312.  
  313. BITer
  314. ;ac=cmd
  315.         call rdsrcop ;out: bc=sourceop, a=cmdLSB
  316.        push bc
  317.         GETDEST_cmda_autoinc
  318.        pop hl
  319.         ;ex af,af' ;' ;keep a=cmdLSB
  320.         ld a,l ;src
  321.         and c
  322.         ld c,a
  323.         ld a,h ;src
  324.         and b
  325.         ld b,a
  326.      rra
  327.      ld h,a ;keep CF
  328.         ld a,c
  329. ;ўЄюс√ яЁртшы№эю ёЇюЁьшЁютрЄ№ ZF,SF яю h,l:
  330. ;хёыш l!=0, Єю set h!=0
  331.        add a,0xff
  332.        sbc a,a ;CF=(c!=0)
  333.        and d;1 ;any number 1..0x7f
  334.        or b ;CF=0 ;ZF=(bc==0)
  335.      ld a,h
  336.      rla ;CF
  337.         ex af,af' ;'
  338.        _LoopC
  339.  
  340. BICer
  341. ;ac=cmd
  342.         call rdsrcop ;out: bc=sourceop, a=cmdLSB
  343.        push bc
  344.         GETDEST_cmda
  345.        pop hl
  346.         ex af,af' ;' ;keep a=cmdLSB
  347.      rra
  348.      ld hx,a ;keep CF
  349.         ld a,h ;src
  350.         cpl
  351.         and b
  352.         ld b,a
  353.         ld a,l ;src
  354.         cpl
  355.         and c
  356.         ld c,a
  357.         ;ld a,c
  358. ;ўЄюс√ яЁртшы№эю ёЇюЁьшЁютрЄ№ ZF,SF яю h,l:
  359. ;хёыш l!=0, Єю set h!=0
  360.        add a,0xff
  361.        sbc a,a ;CF=(c!=0)
  362.        and d;1 ;any number 1..0x7f
  363.        or b ;CF=0 ;ZF=(bc==0)
  364.      ld a,hx
  365.      rla ;CF
  366.         ex af,af' ;'
  367.         PUTDEST_Loop
  368.  
  369. BISer
  370. ;ac=cmd
  371.         call rdsrcop ;out: bc=sourceop, a=cmdLSB
  372.        push bc
  373.         GETDEST_cmda
  374.        pop hl
  375.         ex af,af' ;' ;keep a=cmdLSB
  376.      rra
  377.      ld hx,a ;keep CF
  378.         ld a,h ;src
  379.         or b
  380.         ld b,a
  381.         ld a,l ;src
  382.         or c
  383.         ld c,a
  384.         ;ld a,c
  385. ;ўЄюс√ яЁртшы№эю ёЇюЁьшЁютрЄ№ ZF,SF яю h,l:
  386. ;хёыш l!=0, Єю set h!=0
  387.        add a,0xff
  388.        sbc a,a ;CF=(c!=0)
  389.        and d;1 ;any number 1..0x7f
  390.        or b ;CF=0 ;ZF=(bc==0)
  391.      ld a,hx
  392.      rla ;CF
  393.         ex af,af' ;'
  394.         PUTDEST_Loop
  395.  
  396. ADDer
  397. ;ac=cmd
  398.         call rdsrcop ;out: bc=sourceop, a=cmdLSB
  399.        push bc
  400.         GETDEST_cmda
  401.        pop hl
  402.         ex af,af' ;'
  403.         or a
  404.         adc hl,bc
  405.         ex af,af' ;'
  406.         ld b,h
  407.         ld c,l
  408.         PUTDEST_Loop
  409.  
  410. SUBer
  411. ;ac=cmd
  412.         call rdsrcop ;out: bc=sourceop, a=cmdLSB
  413.        push bc
  414.         GETDEST_cmda
  415.         ld h,b
  416.         ld l,c
  417.        pop bc
  418.         ex af,af' ;'
  419.         or a
  420.         sbc hl,bc
  421.         ;ccf
  422.         ex af,af' ;'
  423.         ld b,h
  424.         ld c,l
  425.         PUTDEST_Loop
  426.  
  427. MOVBer
  428.         call rdsrc8op ;out: bc=sourceop, a=cmdLSB
  429.         ex af,af' ;'
  430.      rra
  431.      ld h,a ;keep CF
  432.        ld a,c
  433.        rla
  434.        sbc a,a
  435.        ld b,a ;for textshow
  436.         ld a,c
  437.         or a
  438.         ;TODO ёсЁюёшЄ№ V
  439.      ld a,h
  440.      rla ;CF
  441.         ex af,af' ;'
  442.       if CRUTCH
  443.       and 0x3f
  444.       ;cp 0xe0
  445.       cp 0x08
  446.       jr nc,MOVB_minusr0 ;ы■ср  рфЁхёрЎш , ъЁюьх яЁюёЄюую Rn
  447.       endif
  448.         PUTDEST_Loop ;for textshow
  449. MOVB_minusr0
  450.         PUTDEST8_Loop
  451.  
  452. CMPBer
  453. ;ac=cmd
  454.         call rdsrc8op ;out: bc=sourceop, a=cmdLSB
  455.        push bc
  456.         GETDEST8_cmda_autoinc
  457.        pop hl
  458.         ex af,af' ;'
  459.         ld a,l;c
  460.         sub c;l
  461.         ld c,a
  462.         ;ccf
  463.         ex af,af' ;'
  464.        _LoopC
  465.  
  466. BITBer
  467. ;ac=cmd
  468.         call rdsrc8op ;out: bc=sourceop, a=cmdLSB
  469.        push bc
  470.         GETDEST8_cmda_autoinc
  471.        pop hl
  472.         ex af,af' ;'
  473.      rra
  474.      ld h,a ;keep CF
  475.         ld a,c
  476.         and l ;TODO keep CY?
  477.      ld a,h
  478.      rla ;CF
  479.         ex af,af' ;'
  480.        _LoopC
  481.  
  482. BICBer
  483. ;ac=cmd
  484.         call rdsrc8op ;out: bc=sourceop, a=cmdLSB
  485.        push bc
  486.         GETDEST8_cmda
  487.        pop hl
  488.         ex af,af' ;'
  489.      rra
  490.      ld h,a ;keep CF
  491.         ld a,l ;src
  492.         cpl
  493.         and c
  494.         ld c,a
  495.      ld a,h
  496.      rla ;CF
  497.         ex af,af' ;'
  498.         PUTDEST8_Loop
  499.  
  500. BISBer
  501. ;ac=cmd
  502.         call rdsrc8op ;out: bc=sourceop, a=cmdLSB
  503.        push bc
  504.         GETDEST8_cmda
  505.        pop hl
  506.         ex af,af' ;'
  507.      rra
  508.      ld h,a ;keep CF
  509.         ld a,c
  510.         or l
  511.         ld c,a
  512.      ld a,h
  513.      rla ;CF
  514.         ex af,af' ;'
  515.        if 0 ;эх яюьюуыю фы  nocopper, тююс∙х шёўхчыр эрфяшё№
  516.        ld h,a
  517.        ld a,c
  518.        rla
  519.        sbc a,a
  520.        ld b,a
  521.        ld a,h
  522.        PUTDEST_Loop
  523.        else
  524.         PUTDEST8_Loop
  525.        endif
  526.  
  527. CALLer_relative
  528.        push hl
  529.         ld c,(hl)
  530.         inc l
  531.         ld b,(hl) ;bc=link
  532.        ;inc bc
  533.        ;inc bc
  534.         putmemspBC
  535.        
  536.         get
  537.         next
  538.         ld c,a
  539.         get
  540.         next
  541.         ld b,a ;bc=X
  542.  
  543.         decodePC
  544.         ld a,e
  545.         add a,c
  546.         ld c,a
  547.         ld a,d
  548.         adc a,b
  549.         ld b,a ;bc=pc+X
  550.         jr CALLer_q
  551.  
  552. CALLer
  553. ;jsr link, addr ЁрсюЄрхЄ Єръ: mov link=>-(sp);mov pc=>link; mov addr=>pc
  554.         rra
  555.         ld a,c
  556.         rra
  557.         and 0xe0
  558.        cp 0xe0
  559.        jr z,CALLerPC ;link=src=pc
  560.        rrca
  561.        rrca
  562.        rrca
  563.        rrca
  564. ;TODO test
  565.        ;jr $
  566. ;leopol(0da4): 091f = 004437 = jsr R4, @#sub_110346
  567. ;рсёюы■Єэ√щ call
  568. ;0 000 100 lnk 011 111
  569.           ;src ;@(Rn)+ ;dst
  570.  
  571. ;pacman(10c6): 0937 = 004467 = jsr r4,...
  572. ;юЄэюёшЄхы№э√щ call
  573. ;0 000 100 lnk 110 rrr
  574.           ;src ;@X(rn) ;dst
  575.         ld l,a
  576.         ld h,_R0/256
  577.  
  578.         ld a,c
  579.         and 0x38
  580.       jp z,JMPer_error
  581.        cp 0x30
  582.        jr z,CALLer_relative
  583.         cp 0x18
  584.         jr nz,$
  585.        
  586.        push hl
  587.         ld c,(hl)
  588.         inc l
  589.         ld b,(hl) ;bc=link
  590.        ;inc bc
  591.        ;inc bc
  592.         putmemspBC
  593.        
  594.         get
  595.         next
  596.         ld c,a
  597.         get
  598.         next
  599.         ld b,a ;bc=X
  600.  
  601.         decodePC
  602.         ;ld a,e
  603.         ;add a,c
  604.         ;ld c,a
  605.         ;ld a,d
  606.         ;adc a,b
  607.         ;ld b,a ;bc=pc+X
  608. CALLer_q
  609.        pop hl
  610.         ld (hl),e
  611.         inc l
  612.         ld (hl),d
  613. bctoPCLoop
  614.         ld d,b
  615.         ld e,c
  616. loopcjp
  617.        _LoopC_JP
  618.  
  619. ;09f7 - юЄэюёшЄхы№э√щ call
  620. ;0000 1001 1111 0111
  621. ;0 000 100 111 110 111<-addr
  622.           ;src ;X(rn) ;dst
  623. ;09df - рсёюы■Єэ√щ call
  624. ;0000 1001 1101 1111
  625. ;0 000 100 111 011 111<-addr
  626.           ;src ;@(Rn)+ ;dst
  627. CALLerPC
  628. ;jsr PC, addr ЁрсюЄрхЄ Єръ: mov PC=>-(sp);mov addr=>pc
  629.        ld a,c
  630.        push af
  631.        sub 0xc8
  632.        cp 8
  633.        jr c,CALLerPC_rn ;call (r1) = 04711 = 09c9
  634.         decodePC_to_ae
  635.         ld b,a
  636.         ld c,e ;bc=link
  637.        inc bc
  638.        inc bc
  639.         putmemspBC
  640.        
  641.         get
  642.         next
  643.         ld c,a
  644.         get
  645.         next
  646.         ld b,a ;bc=X
  647.        pop af
  648. ;jsr link, addr ЁрсюЄрхЄ Єръ: mov link=>-(sp);mov pc=>link; mov addr=>pc
  649.        cp 0xdf ;0 000 100 111 011 111 (addr=@(PC)+)
  650.                     ;-(Rn);src ;@rn+ ;dst ;рсёюы■Єэ√щ call
  651.        jp z,bctoPCLoop
  652.        ;cp 0xfa ;0 000 100 111 111 010 (addr=@X(R2): R2+X is the address of the address of the operand) ;call @146716(R2)
  653.                     ;-(Rn);src ;@X(rn);dst
  654.        cp 0xf8 ;call @nnn(Rn)
  655.        jr nc,calladdr_from_rnplusn
  656.       if DEBUG
  657.        cp 0xf7 ;0 000 100 111 110 111 (addr=X(PC): PC+X is the address of the operand)
  658.                     ;-(Rn);src ;X(rn) ;dst ;юЄэюёшЄхы№э√щ call
  659.        jr nz,$
  660.       endif
  661.         decodePC
  662.         ld a,e
  663.         add a,c
  664.         ld e,a
  665.         ld a,d
  666.         adc a,b
  667.         ld d,a ;bc=pc+X
  668.        _LoopC_JP
  669.  
  670. calladdr_from_rnplusn
  671.         GOOD ;basic яюёых ╬╪╚┴╩└
  672.         and 7
  673.         add a,a
  674.         ld l,a
  675.         ld h,_R0/256
  676.         ld a,(hl)
  677.         add a,c
  678.         ld c,a
  679.         inc l
  680.         ld a,(hl)
  681.         adc a,b
  682.         ;ld b,a
  683.         call rdmem_ac_to_bc
  684.        jp bctoPCLoop
  685.  
  686. CALLerPC_rn ;call (r1) = 04711 = 09c9
  687.         decodePC_to_ae
  688.         ld b,a
  689.         ld c,e ;bc=link
  690.         putmemspBC
  691.        pop af
  692.         and 7
  693.         add a,a
  694.         ld l,a
  695.         ld h,_R0/256
  696.         ld e,(hl)
  697.         inc l
  698.         ld d,(hl)
  699.        _LoopC_JP
  700.  
  701.  
  702. SOBer
  703. ;Subtract One and Branch: Reg < Reg - 1; if Reg ? 0 then PC < PC - 2 ? Offset
  704. ;TODO pc,sp?
  705.         rra
  706.         ld a,c
  707.         rra
  708.          rra
  709.          rra
  710.          rra
  711.          rra
  712.          and 0x0e
  713.         ld l,a
  714.         ld h,_R0/256
  715.        ld a,c
  716.         ld c,(hl)
  717.         inc l
  718.         ld b,(hl)
  719.         cpd
  720.         ld (hl),c
  721.         inc hl
  722.         ld (hl),b
  723.         jp po,loopc ;jump if 0
  724.         and 0x3f
  725.         add a,a
  726.         ld c,a
  727.         decodePC        
  728.         ld a,e
  729.         sub c
  730.         ld e,a
  731.         jr nc,$+3
  732.         dec d
  733.        _LoopC_JP
  734.  
  735. exaBR
  736.         ex af,af' ;'
  737. BRer
  738.         decodePC
  739.        sla c
  740.        sbc a,a
  741.        ld b,a
  742.         ld a,e
  743.         add a,c
  744.         ld e,a
  745.         ld a,d
  746.         adc a,b
  747.         ld d,a
  748.        _LoopC_JP
  749.  
  750. BNEer
  751.         ex af,af' ;'
  752.         jr nz,exaBR
  753.         ex af,af' ;'
  754.        _LoopC
  755. BEQer
  756.         ex af,af' ;'
  757.         jr z,exaBR
  758.         ex af,af' ;'
  759.        _LoopC
  760. BGTer ;Branch if greater than (Z v (N (+) V)) = 0
  761. ;for pipedoc
  762.         ex af,af' ;'
  763.        jr z,exanoBR
  764.         ex af,af' ;'
  765. BGEer ;Branch if greater than or equal (N (+) V) = 0
  766. ;for ninza, leopol
  767.         ex af,af' ;'
  768.        jp pe,BGEoverflow
  769.        jp p,exaBR
  770. exanoBR
  771.         ex af,af' ;'
  772.        _LoopC
  773. BGEoverflow
  774. BLTnooverflow
  775.        jp m,exaBR
  776.         ex af,af' ;'
  777.        _LoopC
  778. BLEer ;Branch if less than or equal (Z v (N (+) V)) = 1
  779.         ex af,af' ;'
  780.        jr z,exaBR
  781.         ex af,af' ;'
  782. BLTer ;Branch if less than (N (+) V) = 1
  783. ;for digger, leopol
  784.         ex af,af' ;'
  785.        jp po,BLTnooverflow
  786.        jp p,exaBR
  787.         ex af,af' ;'
  788.        _LoopC
  789. BPLer
  790.         ex af,af' ;'
  791.         jp p,exaBR
  792.         ex af,af' ;'
  793.        _LoopC
  794. BMIer
  795.         ex af,af' ;'
  796.         jp m,exaBR
  797.         ex af,af' ;'
  798.        _LoopC
  799. BHIer ;(C ? Z) = 0
  800.         ex af,af' ;'
  801.         jr c,$+4
  802.         jr nz,exaBR
  803.         ex af,af' ;'
  804.        _LoopC
  805. BLOSer ;(C ? Z) = 1
  806.         ex af,af' ;'
  807.         jr c,exaBR
  808.         jr z,exaBR
  809.         ex af,af' ;'
  810.        _LoopC
  811. BVCer ;Branch if overflow clear V = 0
  812.         ex af,af' ;'
  813.         jp po,exaBR ;po=no overflow
  814.         ex af,af' ;'
  815.        _LoopC
  816. BVSer ;Branch if overflow set V = 1
  817.         ex af,af' ;'
  818.         jp pe,exaBR ;pe=overflow
  819.         ex af,af' ;'
  820.        _LoopC
  821. BCCer ;BCC or BHIS      Branch if carry clear, or Branch if higher or same C = 0
  822.         ex af,af' ;'
  823.         jp nc,exaBR
  824.         ex af,af' ;'
  825.        _LoopC
  826. BCSer ;BCS or BLO       Branch if carry set, or Branch if lower C = 1
  827.         ex af,af' ;'
  828.         jp c,exaBR
  829.         ex af,af' ;'
  830.        _LoopC
  831.  
  832. RTI_JMP_RTS_SWAB
  833. ;0000.. ёь. эшцх
  834. ;0001?? JMP     Jump: PC < Src
  835. ;00020r RTS     Return from subroutine: PC < Reg; Reg < (SP)+
  836. ;0002?? d5=1,d4=0       Ccc ;flags &= ~(d3..d0 (NZVC))
  837. ;0002?? d5=1,d4=1       Scc ;flags |= (d3..d0 (NZVC))
  838. ;0003dr SWAB    Swap bytes of word: Dest < Swap-bytes(Dest)
  839.         ;ld b,a
  840.         ld a,c
  841.         add a,a
  842.         jp c,c0002_0003
  843.         jp m,JMPer;c0001
  844. ;000000 HALT
  845. ;000001 WAIT
  846. ;000002 RTI     Return from interrupt: PC < (SP)+; PS < (SP)+
  847. ;000003 BPT     Breakpoint trap: -(SP) < PS; -(SP) < PC; PC < (14); PS < (16)
  848. ;000004 IOT     I/O trap: -(SP) < PS; -(SP) < PC; PC < (20); PS < (22)
  849. ;000005 RESET
  850. ;000006 RTT     Return from trap: PC < (SP)+; PS < (SP)+
  851. ;TODO
  852.         jr z,halter ;HALT ;mona0010 т√їюфшЄ шьхээю яю ¤Єющ ъюьрэфх
  853.         cp 1*2
  854.         jp z,WAITer ;WAIT ;for cputest, hny2020?
  855.         cp 2*2
  856.         jr z,RTIer ;for movblobs
  857.         cp 4*2
  858.         jp z,looper ;IOT
  859.         cp 5*2
  860.         jp z,looper ;RESET ;for pacman
  861.         cp 6*2
  862.         jr z,RTTer
  863.        cp 8*2
  864.        jp z,looper ;эшўхую эх фхырхЄ? (Manwe)
  865.         cp 15*2
  866.         jp z,looper ;STEP ;for cputest
  867. ;TODO 10*2 (cindy2 яюёых яхЁтюую ¤ЇЇхъЄр - ўЄю фхырхЄ?) jp (iy) эх яюьюурхЄ
  868.         jr $
  869. RTIer
  870. RTTer
  871.         getmemspBC
  872.        push bc
  873.         getmemspBC
  874.        pop de
  875.        _LoopC_JP
  876. WAITer
  877. ;юцшфрхЄ ы■сюую яЁхЁ√трэш  (эряЁ. юЄ ъыртшрЄєЁ√). яю єьюыўрэш■ эр ┴╩-0011 т√ъы■ўхэ√ ърфЁют√х яЁхЁ√трэш  ;mona0011
  878.         ld a,(bk_curkey) ;TODO яЁртшы№эю ёфхырЄ№ юцшфрэшх?
  879.         or a
  880.         jr z,WAITer
  881.        _LoopC
  882.  
  883. halter
  884. wrmemrom_LoopC
  885. ;╩юьрэфр 000000 Ц ¤Єю HALT. ┬√ч√трхЄ яЁхЁ√трэшх яю 4-ьє тхъЄюЁє. ╩юуфр тёЄЁхўрхЄё  Halt, эєцэю яюыюцшЄ№ т ёЄхъ ёыютю ёюёЄю эш  яЁюЎхёёюЁр ш рфЁхё, ёыхфє■∙шщ чр ъюьрэфющ HALT. ╟рЄхь яхЁхщЄш яю рфЁхёє, ъюЄюЁ√щ чряшёрэ т  ўхщъх 4. ╧Ёш ¤Єюь ёыютю ёюёЄю эш  яЁюЎхёёюЁр тч Є№ шч  ўхщъш 6.
  886. ;яюўхьє mona0010 эх юёЄрэртыштрхЄё ? mona0011 Єюцх
  887.         call getflags_bc
  888.         putmemspBC
  889.        decodePC_to_ae
  890.         LD b,a
  891.         ld c,e ;=old PC
  892.         putmemspBC
  893.         ld bc,6
  894.         call rdmem_bc_to_bc
  895.         call makeflags_frombc
  896.         ld bc,4
  897.         call rdmem_bc_to_bc
  898.         jp bctoPCLoop
  899.      
  900. c0002_0003
  901. ;a=cmdLSB*2
  902.         jp m,SWABer;c0003
  903.         cp 8*2 ;ё=0x80..0x87
  904.         jr c,RTSer ;00020r      RTS     Return from subroutine: PC < Reg; Reg < (SP)+
  905.         cp 16*2
  906.        jp c,wrongcmd
  907. ;0002?? d5=1,d4=0       Ccc ;flags &= ~(d3..d0 (NZVC))
  908. ;0002?? d5=1,d4=1       Scc ;flags |= (d3..d0 (NZVC))
  909.         bit 4,c
  910.         jr nz,SCCer
  911.        ld a,c
  912.        push af
  913.         call getflags_bc
  914.        pop af
  915.        and 0x0f
  916.        cpl
  917.        and c
  918.        ld c,a
  919.         call makeflags_frombc
  920. looper
  921.        _LoopC
  922. SCCer
  923.        ld a,c
  924.        push af
  925.         call getflags_bc
  926.        pop af
  927.        and 0x0f
  928.        or c
  929.        ld c,a
  930.         call makeflags_frombc
  931.        _LoopC
  932.  
  933. RTSer
  934.         ;and 0x0e
  935.        cp 0x0e
  936.        jr z,RTSerPC
  937.        ;jr $
  938. ;TODO test ;leopol(90f0=110360): 0084 = 000204 = rts r4
  939.         ld l,a
  940.         ld h,_R0/256
  941.         ld e,(hl)
  942.         inc l
  943.         ld d,(hl)
  944.        push hl
  945.         getmemspBC
  946.        pop hl
  947.         ld (hl),b
  948.         dec l
  949.         ld (hl),c
  950.        _LoopC_JP
  951. RTSerPC
  952.         getmemspBC
  953.         ld d,b
  954.         ld e,c
  955.        _LoopC_JP
  956.  
  957. JMPer
  958. ;?c=cmd
  959. ;яюўхьє jmp (r3) ё рфЁхёрЎшхщ (Rn) ЁрсюЄрхЄ ъръ jmp r3? (cputest 0x0258 -> 0x3dc8)
  960. ;jmp X(pc) ЁрсюЄрхЄ ъръ jmp pc+x (cputest 0x3dfc)
  961.        ld a,c
  962.        and 0x38
  963.        ;cp 0x00
  964.        ;jr z,JMPer_000
  965.       jp z,JMPer_error
  966.        cp 0x08
  967.        jr z,JMPer_001
  968.        cp 0x10
  969.        jp z,JMPer_010
  970.        cp 0x18
  971.        jr z,JMPer_011
  972.        cp 0x30
  973.        jp z,JMPer_110
  974.        jr $
  975. ;фры№°х эхяЁртшы№эю юс∙шщ ёыєўрщ (эрфю яхЁхїюфшЄ№ схч ыш°эхую ўЄхэш  ярь Єш!)
  976.         GETDEST_cmdc_autoinc ;call rdsrcop ;out: bc=sourceop, a=cmdLSB
  977.         ld d,b
  978.         ld e,c
  979.        _LoopC_JP
  980. JMPer_000 ;pc=rn ;for cputest
  981. JMPer_001 ;pc=rn
  982.         ld a,c
  983.         rla
  984.         and 0x0e
  985.         ld l,a ;0000rrr0
  986.         ld h,_R0/256
  987.         ld e,(hl)
  988.         inc l
  989.         ld d,(hl)
  990.        _LoopC_JP
  991. JMPer_010 ;pc=rn++
  992.         ld a,c
  993.         rla
  994.         and 0x0e
  995.         ld l,a ;0000rrr0
  996.         ld h,_R0/256
  997.         ld e,(hl)
  998.         inc l
  999.         ld d,(hl)
  1000.        inc de
  1001.        inc de
  1002.         ld (hl),d
  1003.         dec l
  1004.         ld (hl),e
  1005.        dec de
  1006.        dec de
  1007.        _LoopC_JP
  1008. JMPer_011 ;pc=(Rn++)
  1009.         ld a,c
  1010.         rla
  1011.         and 0x0e
  1012.        cp 0x0e
  1013.        jr z,JMPer_011_pc ;pc=(pc++)
  1014.         ld l,a ;0000rrr0
  1015.         ld h,_R0/256
  1016.         ld e,(hl)
  1017.         inc l
  1018.         ld d,(hl)
  1019.         ex de,hl
  1020.         ld a,h
  1021.         and 0xc0
  1022.         ld c,a
  1023.        ld lx,a
  1024.         ld b,tpgs/256
  1025.         set 7,h
  1026.         set 6,h
  1027.         ld a,(bc)
  1028.         SETPGC000
  1029.         ld e,(hl)
  1030.         inc l
  1031.         call z,inchnextpg
  1032.         ld d,(hl)
  1033.        _LoopC_JP
  1034. JMPer_011_pc ;pc=(pc++)
  1035.         get
  1036.         next
  1037.         ld c,a
  1038.         get
  1039.         next
  1040.         ld d,a
  1041.         ld e,c
  1042.        _LoopC_JP
  1043. JMPer_110 ;pc=rn+x
  1044.         ld a,c
  1045.         rla
  1046.         and 0x0e
  1047.        cp 0x0e
  1048.        jr z,JMPer_110_pc
  1049.         ld l,a ;0000rrr0
  1050.         ld h,_R0/256
  1051.         get
  1052.         next
  1053.         add a,(hl)
  1054.         ld c,a
  1055.         get
  1056.         ;next
  1057.         inc l
  1058.         adc a,(hl)
  1059.         ld d,a
  1060.         ld e,c
  1061.        _LoopC_JP
  1062. JMPer_110_pc ;pc=pc+x
  1063.         get
  1064.         next
  1065.         ld c,a
  1066.         get
  1067.         next
  1068.         ld b,a
  1069.        decodePC_to_ae
  1070.         ld h,a
  1071.        ld a,c
  1072.        add a,e
  1073.        ld e,a
  1074.        ld a,b
  1075.        adc a,h ;ac=pc+X
  1076.        ld d,a
  1077.        _LoopC_JP
  1078.  
  1079. RORB_ROLB_ASRB_ASLB
  1080.         ld a,c
  1081.         add a,a
  1082.         jr c,ASRB_ASLB
  1083.         jp m,ROLBer
  1084. ;RORBer
  1085.         GETDEST8_cmdc
  1086.         ex af,af' ;'
  1087.         rr c
  1088.         ex af,af' ;'
  1089.         PUTDEST8_Loop
  1090. ROLBer
  1091.         GETDEST8_cmdc
  1092.         ex af,af' ;'
  1093.         rl c
  1094.         ex af,af' ;'
  1095.         PUTDEST8_Loop
  1096. ASRB_ASLB
  1097.         jp m,ASLBer
  1098. ;ASRer
  1099.         GETDEST8_cmdc
  1100.         ex af,af' ;' ;keep a=cmdLSB
  1101.         sra c ;TODO яЁютхЁшЄ№
  1102.         ex af,af' ;'
  1103.         PUTDEST8_Loop
  1104. ASLBer
  1105.         GETDEST8_cmdc
  1106.         ex af,af' ;' ;keep a=cmdLSB
  1107.         sla c
  1108.         ex af,af' ;'
  1109.         PUTDEST8_Loop
  1110.  
  1111.  
  1112. ROR_ROL_ASR_ASL
  1113.         ld a,c
  1114.         add a,a
  1115.         jr c,ASR_ASL
  1116.         jp m,ROLer
  1117. ;RORer
  1118.         GETDEST_cmdc
  1119.         ex af,af' ;'
  1120.         rr b
  1121.         rr c
  1122.      rra
  1123.      ld h,a ;keep CF
  1124.         ld a,c
  1125. ;ўЄюс√ яЁртшы№эю ёЇюЁьшЁютрЄ№ ZF,SF яю h,l:
  1126. ;хёыш l!=0, Єю set h!=0
  1127.        add a,0xff
  1128.        sbc a,a ;CF=(c!=0)
  1129.        and d;1 ;any number 1..0x7f
  1130.        or b ;CF=0 ;ZF=(bc==0)
  1131.      ld a,h
  1132.      rla ;CF
  1133.         ex af,af' ;'
  1134.         PUTDEST_Loop
  1135. ROLer
  1136.         GETDEST_cmdc
  1137.         ex af,af' ;'
  1138.         rl c
  1139.         rl b
  1140.      rra
  1141.      ld h,a ;keep CF
  1142.         ld a,c
  1143. ;ўЄюс√ яЁртшы№эю ёЇюЁьшЁютрЄ№ ZF,SF яю h,l:
  1144. ;хёыш l!=0, Єю set h!=0
  1145.        add a,0xff
  1146.        sbc a,a ;CF=(c!=0)
  1147.        and d;1 ;any number 1..0x7f
  1148.        or b ;CF=0 ;ZF=(bc==0)
  1149.      ld a,h
  1150.      rla ;CF
  1151.         ex af,af' ;'
  1152.         PUTDEST_Loop
  1153. ASR_ASL
  1154.         jp m,ASLer
  1155. ;ASRer
  1156.         GETDEST_cmdc
  1157.         ex af,af' ;' ;keep a=cmdLSB
  1158.         sra b
  1159.         rr c
  1160.      rra
  1161.      ld h,a ;keep CF
  1162.         ld a,c
  1163. ;ўЄюс√ яЁртшы№эю ёЇюЁьшЁютрЄ№ ZF,SF яю h,l:
  1164. ;хёыш l!=0, Єю set h!=0
  1165.        add a,0xff
  1166.        sbc a,a ;CF=(c!=0)
  1167.        and d;1 ;any number 1..0x7f
  1168.        or b ;CF=0 ;ZF=(bc==0)
  1169.      ld a,h
  1170.      rla ;CF
  1171.         ex af,af' ;'
  1172.         PUTDEST_Loop
  1173. ASLer
  1174.         GETDEST_cmdc
  1175.         ex af,af' ;' ;keep a=cmdLSB
  1176.         ld h,b
  1177.         ld l,c
  1178.         or a
  1179.         adc hl,hl
  1180.         ld b,h
  1181.         ld c,l
  1182.         ex af,af' ;'
  1183.         PUTDEST_Loop
  1184.  
  1185. c0064_MFPI_MTPI_SXT
  1186. ;TODO
  1187.         ld a,c
  1188.         add a,a
  1189.         jp m,MFPI_SXT
  1190. ;c0064_MTPI
  1191.         jr nc,$
  1192. ;MTPIer ;Move to previous I space: Dest < (SP)+
  1193.         ld hl,(_R6)
  1194.         inc hl
  1195.         inc hl
  1196.         ld (_R6),hl
  1197.         dec hl
  1198.         dec hl
  1199.         PUTDEST_Loop
  1200. MFPI_SXT
  1201.         jr c,SXTer
  1202. ;MFPIer ;Move from previous I space: ?(SP) < Src
  1203.         GETDEST_cmdc_autoinc
  1204.         ld hl,(_R6)
  1205.         dec hl
  1206.         dec hl
  1207.         ld (_R6),hl
  1208.         WRMEM_hl_LoopC
  1209. SXTer ;Sign extend: if N flag ? 0 then Dest < -1 else Dest < 0
  1210.         ex af,af' ;'
  1211.         ld bc,0
  1212.         jp p,$+3+1
  1213.         dec bc
  1214.         ex af,af' ;'
  1215.         PUTDEST_Loop
  1216.  
  1217. MTPS_MFPD_MTPD_MFPS
  1218.         ld a,c
  1219.         add a,a
  1220.         jp m,MFPD_MFPS
  1221. ;MTPS_MTPD
  1222.         jr c,MTPDer
  1223. ;MTPSer ;Move to PSW: PSW < Src
  1224.         GETDEST_cmdc_autoinc
  1225.         call makeflags_frombc
  1226.        _LoopC
  1227. MTPDer ;Move to previous D space: Dest < (SP)+ (эхЄ т ┬╠1?)
  1228.         ld hl,(_R6)
  1229.         inc hl
  1230.         inc hl
  1231.         ld (_R6),hl
  1232.         dec hl
  1233.         dec hl
  1234.         PUTDEST_Loop
  1235.  
  1236. MFPD_MFPS
  1237.         jr nc,MFPDer
  1238. ;MFPSer ;Move from PSW: Dest < PSW
  1239.        ld a,c
  1240.        push af
  1241.         call getflags_bc
  1242.        pop af
  1243.         PUTDEST_Loop
  1244. MFPDer ;Move from previous D space: ?(SP) < Src
  1245.         GETDEST_cmdc_autoinc
  1246.         ld hl,(_R6)
  1247.         dec hl
  1248.         dec hl
  1249.         ld (_R6),hl
  1250.         WRMEM_hl_LoopC
  1251.        
  1252. MULer
  1253.         jr $
  1254. DIVer
  1255.         jr $
  1256. ASHer
  1257.         jr $
  1258. ASHCer
  1259.         jr $
  1260.  
  1261. SWABer
  1262. ;Z,N яю ьы. срщЄє Ёхчєы№ЄрЄр, C,V ёсЁюёшЄ№
  1263.         GETDEST_cmdc
  1264.         ld h,b
  1265.         ld b,c
  1266.         ld c,h
  1267.        ex af,af' ;'
  1268.         ld a,c
  1269.         inc a
  1270.         dec a
  1271.         scf
  1272.         ccf
  1273.        ex af,af' ;'
  1274.         PUTDEST_Loop
  1275.  
  1276. EMTer_q
  1277.        _LoopC
  1278. EMTer
  1279. ;TODO єсЁрЄ№ ыютє°ъш
  1280.      if 1
  1281.        ld a,c
  1282.        cp 0x18 ;draw pixel (┴╩-0010)
  1283.        jp z,EMT_drawpixelR1R2
  1284.        cp 0x3b ;draw pixel (┴╩-0011)
  1285.        jp z,EMT_drawpixelR0R1
  1286.        cp 0x39 ;get color (┴╩-0011)
  1287.        jp z,EMT_getcolor
  1288.        ;cp 0x0e ;set color (┴╩-0010) ;pentis, mona
  1289.        ;jp z,EMT_setcolor
  1290.        cp 0x38 ;set color (┴╩-0011)
  1291.        jp z,EMT_setcolor
  1292.        cp 0x06
  1293.        jp z,EMT_readkbd
  1294.         cp 0x0c ;bubbler,mona,cputest ;EMT 14 - шэшЎшрышчрЎш  ¤ъЁрэр ш єёЄрэютър тёхї тхъЄюЁют яЁхЁ√трэш ;
  1295.         jp z,EMT_cls
  1296.         cp 0x0e ;klad ;EMT 16 - яхўрЄ№ ёшьтюыр
  1297.         jp z,EMT_prchar
  1298.         cp 0x16 ;bubbler ;EMT 26 - яюыєўхэшх ъююЁфшэрЄ ъєЁёюЁр: R1 = X, R2 = Y;
  1299.         jp z,GETXYer
  1300.         cp 0x14 ;labyrinh ;EMT 24 - єёЄрэютър ъєЁёюЁр яю ъююЁфшэрЄрь X = R1, Y = R2;
  1301.         jp z,SETXYer
  1302.         cp 0x10 ;labyrinh,cputest ;EMT 20 - т√тюф ёЄЁюъш; тїюф: R1 - рфЁхё ёЄЁюъш; R2 - фышэр ёЄЁюъш т ьырф°хь срщЄх; ёшьтюы-юуЁрэшўшЄхы№ т ёЄрЁ°хь срщЄх;
  1303.         jp z,PRSTRINGer
  1304.         cp 0x1a ;labyrinh яюёых т√тюфр яшъёхы 
  1305.         jr z,EMTer_q
  1306.         cp 0x12 ;packmanria ;EMT 22 - т√тюф ёшьтюыр т ёыєцхсэє■ ёЄЁюъє; тїюф: R0 - ъюф ёшьтюыр (0 - юўшёЄър ёЄЁюъш); R1 - эюьхЁ яючшЎшш т ёыєцхсэющ ёЄЁюъх;
  1307.         jr z,EMTer_q
  1308.         cp 0x1c ;pentis ;EMT 34 - яюыєўхэшх т R0 ёыютр ёюёЄю эш  фшёяых , т ъюЄюЁюь ърцф√щ ЁрчЁ ф  ты хЄё  шэфшърЄюЁюь тъы■ўхэш  ёююЄтхЄёЄтє■∙хую Ёхцшьр (Єрсы. 15): 0 - т√ъы■ўхэю, 1 - тъы■ўхэю;
  1309.         jr z,EMTer_q
  1310.          or a
  1311.          jr z,EMTer_q ;metaballs11, cafelogo256
  1312.          cp 0x29
  1313.          jr z,EMTer_q ;metaballs11
  1314.          cp 0x32
  1315.          jr z,EMTer_q ;road2cafe
  1316.          cp 0x2f
  1317.          jr z,EMTer_q ;road2cafe
  1318.          cp 0x33
  1319.          jr z,EMTer_q ;road2cafe
  1320.     endif
  1321. ;Emulator trap: -(SP) < PS; -(SP) < PC; PC < (30); PS < (32)
  1322.         call getflags_bc
  1323.         putmemspBC
  1324.         decodePC_to_ae
  1325.         ld b,a
  1326.         ld c,e
  1327.         putmemspBC
  1328.         ld bc,0x1a ;032
  1329.         call rdmem_bc_to_bc
  1330.         call makeflags_frombc
  1331.         ld bc,0x18 ;030
  1332.         call rdmem_bc_to_bc
  1333.         ld d,b
  1334.         ld e,c
  1335.        _LoopC_JP
  1336. EMT_readkbd
  1337. ;EMT 6 - ўЄхэшх ъюфр ёшьтюыр ё ъыртшрЄєЁ√ (т√їюфэющ ярЁрьхЄЁ - ъюф эрцрЄющ ъыртш°ш т R0)
  1338.         ;ld a,55+128 ;"or a"
  1339.         ;ld (iskeymessage),a ;no message
  1340.         ld a,(bk_curkey) ;TODO яЁртшы№эю ёфхырЄ№ юцшфрэшх?
  1341.         or a
  1342.         jr z,EMT_readkbd
  1343.         ld c,a
  1344.         ld b,0
  1345.         ld (_R0),bc
  1346.         ;ld a,55 ;"scf"
  1347.         ;ld (iskeymessage),a ;message
  1348.         xor a
  1349.         ld (bk_curkey),a ;no message (INT яЁюўшЄрхЄ эютє■ ъэюяъє)
  1350.        _LoopC
  1351.  
  1352. EMT_drawpixelR0R1
  1353.         ld hl,(_R1) ;y
  1354.         ld bc,(_R0) ;x
  1355.         jr EMT_drawpixel_go
  1356. EMT_drawpixelR1R2
  1357.         ld hl,(_R2) ;y
  1358.         ld bc,(_R1) ;x
  1359. EMT_drawpixel_go
  1360.        ld a,h
  1361.        or a
  1362.        jr nz,emt_drawpixel_q
  1363.         ld h,l
  1364.         ld l,0
  1365.         srl h
  1366.         rr l
  1367.         srl h
  1368.         rr l ;y*64
  1369.        push bc
  1370.         ld b,0
  1371.         srl c
  1372.         srl c ;x/4
  1373.         add hl,bc
  1374.         ld a,(tpgs+0x40)
  1375.         set 7,h
  1376.         set 6,h
  1377.         SETPGC000
  1378.        pop bc
  1379.         ld a,c
  1380.         cpl
  1381.         ld c,3
  1382.         and c;3
  1383.         inc a
  1384.         ld b,a
  1385. bk_curcolor_recoded=$+1
  1386.         ld a,0 ;0..3
  1387. rollcolor0
  1388.         rrc c
  1389.         rrc c ;mask
  1390.         rrca
  1391.         rrca ;pixel
  1392.         djnz rollcolor0
  1393.         xor (hl)
  1394.         and c
  1395.         xor (hl)
  1396.         ld (hl),a
  1397.         ld c,a
  1398.         call putscreen_c
  1399. emt_drawpixel_q
  1400.        _LoopC
  1401. EMT_getcolor
  1402. bk_curcolor=$+1
  1403.         ld hl,0
  1404.         ld (_R0),hl
  1405.        _LoopC
  1406. EMT_setcolor
  1407.         ld hl,(_R0) ;ascii code
  1408. ;EMT_setcolor_hl
  1409.         ld (bk_curcolor),hl
  1410.         ld a,l
  1411.        dec a
  1412.        ;cpl
  1413.         and 3
  1414.         ld (bk_curcolor_recoded),a
  1415.        _LoopC
  1416.  
  1417. EMT_cls
  1418.         ;jr $
  1419.         push de
  1420.         call cls_bk
  1421.         call cls_for_curgfxmode
  1422.        ld hl,0;0x0200
  1423.        ld (intcursorposition),hl
  1424.         pop de
  1425.        _LoopC
  1426.  
  1427. cls_for_curgfxmode
  1428.         ld a,(user_scr0_high) ;ok
  1429.        call clpga
  1430. curgfxmode=$+1
  1431.         ld a,0
  1432.         or a
  1433.         ret z ;эх ўшёЄшь рЄЁшсєЄ, хёыш mono (юэ єёЄрэютыхэ т setgfxmode)
  1434.         ld a,(user_scr0_low) ;ok
  1435.        jp clpga
  1436.  
  1437. redraw_for_curgfxmode
  1438.         ld bc,0x4000
  1439. redraw_for_curgfxmode0
  1440.         push bc
  1441.         call rdmem_bc_to_bc
  1442.         pop hl
  1443.         push hl
  1444.         call putscreen_c
  1445.         pop hl
  1446.         inc hl
  1447.         push hl
  1448.         ld c,b
  1449.         call putscreen_c
  1450.         pop bc
  1451.         inc bc
  1452.         bit 7,b
  1453.         jr z,redraw_for_curgfxmode0
  1454.         ret
  1455.  
  1456. ;EMT 26 - яюыєўхэшх ъююЁфшэрЄ ъєЁёюЁр: R1 = X, R2 = Y;
  1457. GETXYer
  1458.        ;ld bc,(bkscroll)
  1459.        ld hl,(intcursorposition)
  1460.        ld a,h
  1461.        ;add a,c;sub c;5
  1462.        ld h,0
  1463.         ld (_R1),hl
  1464.        ld l,a
  1465.         ld (_R2),hl
  1466.        _LoopC
  1467. ;EMT 24 - єёЄрэютър ъєЁёюЁр яю ъююЁфшэрЄрь X = R1, Y = R2;
  1468. SETXYer
  1469. ;177664 яЁхфэрчэрўхэ фы  єърчрэш  эрўрыр ¤ъЁрээюую ╬╟╙ ш юЁурэшчрЎшш Ёєыюээюую ёфтшур ¤ъЁрэр. ╧Ёш эрўры№эющ єёЄрэютъх ¤ъЁрэр т ЁхушёЄЁх чряшё√трхЄё  чэрўхэшх 1330 (0x02d8). ╚чьхэхэшх ¤Єюую чэрўхэш  эр 1 яЁштюфшЄ ъ ёфтшує шчюсЁрцхэш  эр ¤ъЁрэх яю тхЁЄшърыш эр 1 Єюўхўэє■ ёЄЁюъє. ╤Ёрчє цх яюёых тъы■ўхэш  яшЄрэш  ЁрчЁ ф 9 єёЄрэртыштрхЄё  т "1". ╧Ёш тъы■ўхэшш Ёхцшьр Ёрё°шЁхээющ ярь Єш ЁрчЁ ф ёсЁрё√трхЄё  т "0". ╨рчЁ ф√ 8, 10-15 эх шёяюы№чє■Єё .
  1470.        ;ld bc,(bkscroll)
  1471.         ld hl,(_R1)
  1472.         ld a,(_R2)
  1473.        ;sub c;add a,c;5 ;фы  Labyrinh ш яхЁтюую ¤ъЁрэр klad, эю яюЄюь т klad эхяЁртшы№эю яхўрЄрхЄё  ёў╕Є!
  1474.         ld h,a
  1475.        ld (intcursorposition),hl
  1476.        _LoopC
  1477.  
  1478. EMT_prchar
  1479. ;R0=ёшьтюы
  1480.         ld bc,(_R0)
  1481.         ld a,c
  1482.         call prchar_bk
  1483.        _LoopC
  1484.  
  1485. PRSTRINGer
  1486. ;EMT 20 - т√тюф ёЄЁюъш; тїюф: R1 - рфЁхё ёЄЁюъш; R2 - фышэр ёЄЁюъш т ьырф°хь срщЄх; ёшьтюы-юуЁрэшўшЄхы№ т ёЄрЁ°хь срщЄх
  1487. ;TODO т cputest срщЄ√ т эрўрых:
  1488. ;232 233 224 236 221 234
  1489. ;9a 9b 94 9e 91 9c
  1490. ;232 яхЁхъы■ўхэшх шэфшърЎшш ъєЁёюЁр
  1491. ;233 єёЄрэютър ўшёыр ёшьтюыют т ёЄЁюъх 32/64 - яюыєўрхЄё  32 (ярЁрьхЄЁр эхЄ - яюўхьє?)
  1492. ;221..224 єяЁртыхэшх  ЁъюёЄ№■: ъЁрёэ√щ, чхы╕э√щ, ёшэшщ, ў╕Ёэ√щ
  1493. ;236 єёЄрэютър Ёхцшьют ЇюЁьшЁютрэш  шэфшърЄюЁют т ёыєцхсэющ ёЄЁюъх
  1494. ;234 єёЄрэютър Ёхцшьр эхурЄштэющ шэфшърЎшш ёшьтюыют
  1495.  
  1496. ;яюЄюь т ЄхъёЄх: 234 012 - тЁюфх ъръ ёЄртшЄ схч шэтхЁёшш
  1497.         ld hl,(_R2)
  1498. PRSTRINGer0
  1499.         ld bc,(_R1)
  1500.         push hl
  1501.         call rdmem8_bc_to_c
  1502.         ld hl,(_R1)
  1503.         inc hl
  1504.         ld (_R1),hl
  1505.         pop hl
  1506.         ld a,c
  1507.         cp h ;ёшьтюы-юуЁрэшўшЄхы№
  1508.         jr z,PRSTRINGerq
  1509.         push hl
  1510.         call prchar_bk
  1511.         pop hl
  1512.        inc l
  1513.        dec l
  1514.        jr z,PRSTRINGer0 ;фы  CPUTEST L=0
  1515.         dec l
  1516.         jr nz,PRSTRINGer0 ;фы  тёхую юёЄры№эюую
  1517. PRSTRINGerq
  1518.        _LoopC
  1519.  
  1520. prchar_bk
  1521.        cp 10
  1522.         jr z,PRSTRINGerLF
  1523.        cp 12 ;14 oct
  1524.         jr z,PRSTRINGerCLS
  1525.        cp 7
  1526.        jr z,PRSTRINGer_skip ;TODO bell
  1527.        cp 0x91
  1528.        jr c,PRSTRINGer_noskip
  1529.        cp 0x95
  1530.        jr c,PRSTRING_setcolor
  1531.        cp 0xa0
  1532.        jr nc,PRSTRINGer_noskip ;rus
  1533.        cp 0x80
  1534.        jr nc,PRSTRINGer_skip ;TODO
  1535. PRSTRINGer_noskip
  1536.         ;push hl
  1537.         ld h,tkoi/256
  1538.         ld l,a
  1539.         ld a,(hl)
  1540.         call prchar
  1541.         ;pop hl
  1542. PRSTRINGer_skip
  1543.         ret
  1544. PRSTRING_setcolor
  1545.         ;sub 0x91
  1546.         ld l,a
  1547.         ld (bk_curcolor),hl
  1548.        dec a
  1549.        cpl
  1550.         and 3
  1551.         ld (bk_curcolor_recoded),a
  1552.         ret
  1553.  
  1554. PRSTRINGerLF
  1555.        ld bc,(intcursorposition)
  1556.        ;ld a,b
  1557.        ;add a,8;TODO scroll?
  1558.        ;ld b,a
  1559.        inc b
  1560.        ld c,0
  1561.        ld (intcursorposition),bc
  1562.        ret;jr PRSTRINGer_skip
  1563. PRSTRINGerCLS
  1564.         push hl
  1565.         push de
  1566.         call cls_bk
  1567.         call cls_for_curgfxmode
  1568.        ld hl,0;0x0200
  1569.        ld (intcursorposition),hl
  1570.         pop de
  1571.         pop hl
  1572.        ret;jr PRSTRINGer_skip
  1573.        
  1574.        
  1575. prchar
  1576. ;╧шёрЄ№ ёшьтюы ш рЄЁшсєЄ т Єхъє∙хщ яючшЎшш ъєЁёюЁр (zaxon, km, nstalker, pipes)
  1577. ;┬їюф:
  1578. ;BH = эюьхЁ тшфхю ёЄЁрэшЎ√
  1579. ;AL = чряшё√трхь√щ ёшьтюы (ASCII ъюф)
  1580. ;CX = ёўхЄўшъ (ёъюы№ъю ¤ъчхьяы Ёют ёшьтюыр чряшёрЄ№)
  1581. ;BL = тшфхю рЄЁшсєЄ (ЄхъёЄют√щ Ёхцшь) шыш ЎтхЄ (уЁрЇшўхёъшщ Ёхцшь)
  1582. ;╧Ёшьхўрэшх:
  1583. ;╧Ёш чряшёш ё яюью∙№■ ¤Єющ ЇєэъЎшш ъєЁёюЁ эх ёфтшурхЄё !
  1584. ;┬ уЁрЇшўхёъшї Ёхцшьрї эх ЁхъюьхэфєхЄё  шёяюы№чютрЄ№ чэрўхэшх CX, юЄышўэюх юЄ хфшэшЎ√, Є.ъ. эх тхчфх яЁртшы№эю Ёхрышчютрэ яютЄюЁ ёшьтюыр
  1585. ;┼ёыш яЁюуЁрььр ЁрсюЄрхЄ яюф єяЁртыхэшхь PTS-DOS, Єю чэрўхэш  т BH, BL ш CX ьюуєЄ с√Є№ яЁюшуэюЁшЁютрээ√)
  1586.        push de
  1587.         ld l,a
  1588.         ld h,0
  1589.         add hl,hl
  1590.         add hl,hl
  1591.         add hl,hl
  1592.         ld bc,font;0x1a6e+0xa000
  1593.         add hl,bc
  1594.         ld a,(tpgs+0x40) ;scr
  1595.         SETPGC000
  1596.        push hl
  1597. intcursorposition=$+1
  1598.         ld de,0;0x0200 ;bkscr=0x4000+(2*64*8)
  1599.         sla d
  1600.         sla d
  1601.         sla d
  1602.        ld a,(bkscroll)
  1603.        ;add a,80
  1604.        neg
  1605.        add a,d
  1606.         ld l,a;d ;y
  1607.         ld h,0
  1608.          ld d,h ;de=x
  1609.         add hl,hl
  1610.         add hl,hl
  1611.         add hl,hl
  1612.         add hl,hl
  1613.         add hl,hl
  1614.         add hl,hl ;y*64
  1615.         ;add hl,hl
  1616.         ;add hl,hl
  1617.         ;add hl,hl ;y*64*8
  1618.          set 7,h
  1619.          set 6,h
  1620.         add hl,de
  1621.         add hl,de
  1622.        pop de ;gfx
  1623.        ;jr $
  1624.         call cgaput2bytes
  1625.         ld bc,64
  1626.         add hl,bc
  1627.         call cgaput2bytes
  1628.         ld bc,64
  1629.         add hl,bc
  1630.         call cgaput2bytes
  1631.         ld bc,64
  1632.         add hl,bc
  1633.         call cgaput2bytes
  1634.         ld bc,64
  1635.         add hl,bc
  1636.         call cgaput2bytes
  1637.         ld bc,64
  1638.         add hl,bc
  1639.         call cgaput2bytes
  1640.         ld bc,64
  1641.         add hl,bc
  1642.         call cgaput2bytes
  1643.         ld bc,64
  1644.         add hl,bc
  1645.         call cgaput2bytes
  1646.         ;ld bc,80-0x2000
  1647.         ;add hl,bc
  1648.         ld hl,(intcursorposition)
  1649.         inc l
  1650.         ld a,l
  1651.         cp 32
  1652.         jr c,prchar_nonewline
  1653.         ld l,0
  1654.         ;ld a,h
  1655.         ;add a,8 ;todo scroll?
  1656.         ;ld h,a
  1657.         inc h
  1658. prchar_nonewline
  1659.         ld (intcursorposition),hl
  1660.        pop de
  1661.         ret
  1662.  
  1663. cgaput2bytes
  1664.         ld a,(de)
  1665.         ld c,a
  1666.         xor a
  1667.         rl c
  1668.         rra
  1669.         rrca
  1670.         rl c
  1671.         rra
  1672.         rrca
  1673.         rl c
  1674.         rra
  1675.         rrca
  1676.         rl c
  1677.         rra
  1678.         ld b,a
  1679.         rrca
  1680.         or b
  1681.         ld (hl),a
  1682.        push bc
  1683.         ld c,a
  1684.         call putscreen_c
  1685.        pop bc
  1686.        
  1687.         inc l
  1688.         xor a
  1689.         rl c
  1690.         rra
  1691.         rrca
  1692.         rl c
  1693.         rra
  1694.         rrca
  1695.         rl c
  1696.         rra
  1697.         rrca
  1698.         rl c
  1699.         rra
  1700.         ld b,a
  1701.         rrca
  1702.         or b
  1703.         ld (hl),a
  1704.         ld c,a
  1705.         call putscreen_c
  1706.  
  1707.         dec l
  1708.         inc de
  1709.         ret
  1710.  
  1711.  
  1712. TRAPer
  1713. ;General trap: -(SP) < PS; -(SP) < PC; PC < (34); PS < (36)
  1714.         call getflags_bc
  1715.         putmemspBC
  1716.         decodePC_to_ae
  1717.         ld b,a
  1718.         ld c,e
  1719.         putmemspBC
  1720.         ld bc,0x1e ;036
  1721.         call rdmem_bc_to_bc
  1722.         call makeflags_frombc
  1723.         ld bc,0x1c ;034
  1724.         call rdmem_bc_to_bc
  1725.         ld d,b
  1726.         ld e,c
  1727.        _LoopC_JP
  1728.  
  1729. FFFFer
  1730. ;for Piramania
  1731.        _LoopC
  1732.