?login_element?

Subversion Repositories NedoOS

Rev

Rev 1352 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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