Subversion Repositories NedoOS

Rev

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

  1. PANIC
  2.  if debug_stop = 0
  3.  _Loop_
  4.  else
  5.  jr $
  6.  endif
  7.  
  8. incdec2si_hl
  9. incdec2di_hl
  10.         inc hl
  11. incdecsi_hl
  12. incdecdi_hl
  13.         inc hl
  14.         ret
  15.  
  16.         ALIGNrm
  17. LEAr16rm
  18. ;чруЁєчшЄ№ ¤ЇЇхъЄштэ√щ рфЁхё (эряЁшьхЁ, lea si,shift[bx] - ёыюцшЄ№ bx+shift, яюыюцшЄ№ т si)
  19.        UNTESTED
  20.         get
  21.         next
  22.         push af
  23.         call ADDRm16_pp
  24. ;hl=addr
  25. ;abc=?s*16 (not used)
  26.        ld b,h
  27.        ld c,l
  28.         ;no ADDRSEGMENT_chl_bHSB
  29.         pop af
  30.         rra
  31.         rra
  32.         and 7*2
  33.         ld l,a ;reg16 addr
  34.         ld h,_AX/256
  35.        _PUTr16LoopC
  36.  
  37.         ALIGNrm
  38. LESr16mem
  39. ;чруЁєчшЄ№ єърчрЄхы№, шёяюы№чє  ES
  40. ;шч ярь Єш ўшЄрхь reg, яюЄюь es
  41.        UNTESTED
  42.         get
  43.         next
  44.        push af
  45.        ADDRm16_GETm16_for_PUTm16 ;TODO nokeepaf ;ADDRm16_GETm16_keeplx_nokeepaf ;bc=rmmem
  46. ;єцх яЁюўшЄрэю 2 срщЄр bc шч (hl), эю hl эх ёфтшэєЄ
  47.        push bc
  48.         skip2b_GETm16 ;bc=new ES
  49.        ld (_ES),bc ;new ES
  50.        countES
  51.        pop bc
  52.        pop af
  53.         rra
  54.         rra
  55.         and 7*2
  56.         ld l,a ;reg16 addr
  57.         ld h,_AX/256
  58.        _PUTr16LoopC
  59.  
  60.         ALIGNrm
  61. LDSr16mem
  62. ;чруЁєчшЄ№ єърчрЄхы№, шёяюы№чє  DS
  63. ;lds r16,m16:16
  64. ;шч ярь Єш ўшЄрхь reg, яюЄюь ds
  65.        UNTESTED
  66.         get
  67.         next
  68.        push af
  69.        ADDRm16_GETm16_for_PUTm16 ;TODO nokeepaf ;ADDRm16_GETm16_keeplx_nokeepaf ;bc=rmmem
  70. ;єцх яЁюўшЄрэю 2 срщЄр bc шч (hl), эю hl эх ёфтшэєЄ
  71.        push bc
  72.         skip2b_GETm16 ;bc=new DS
  73.        ld (_DS),bc ;new DS
  74.        countDS
  75.        pop bc
  76.        pop af
  77.         rra
  78.         rra
  79.         and 7*2
  80.         ld l,a ;reg16 addr
  81.         ld h,_AX/256
  82.        _PUTr16LoopC
  83.  
  84. ;эр тїюфх т ъюьрэфє:
  85. ;схч ёхуьхэЄэюую яЁхЇшъёр: b=l(рфЁхё юсЁрсюЄўшър)
  86. ;ё ёхуьхэЄэ√ь яЁхЇшъёюь: b=?s_LSW+1(эхў╕Єэ√щ)
  87. ;тёх юсЁрсюЄўшъш rm-ъюьрэф (ш тююс∙х ъюьрэф ё яюфьхэющ ёхуьхэЄр) яю ў╕Єэюьє рфЁхёє
  88. DSer
  89.         ld b,1+(ds_LSW&0xff)
  90.         get
  91.         next
  92.         LD L,A
  93.         ld H,MAINCOMS/256
  94.         LD a,(HL)
  95.         INC H
  96.         LD H,(HL)
  97.         ld L,a
  98.         JP (HL)
  99. CSer
  100.         ld b,1+(cs_LSW&0xff)
  101.         get
  102.         next
  103.         LD L,A
  104.         ld H,MAINCOMS/256
  105.         LD a,(HL)
  106.         INC H
  107.         LD H,(HL)
  108.         ld L,a
  109.         JP (HL)
  110. ESer
  111.         ld b,1+(es_LSW&0xff)
  112.         get
  113.         next
  114.         LD L,A
  115.         ld H,MAINCOMS/256
  116.         LD a,(HL)
  117.         INC H
  118.         LD H,(HL)
  119.         ld L,a
  120.         JP (HL)
  121. SSer
  122.         ld b,1+(ss_LSW&0xff)
  123.         get
  124.         next
  125.         LD L,A
  126.         ld H,MAINCOMS/256
  127.         LD a,(HL)
  128.         INC H
  129.         LD H,(HL)
  130.         ld L,a
  131.         JP (HL)
  132. FSer
  133.         ld b,1+(fs_LSW&0xff)
  134.         get
  135.         next
  136.         LD L,A
  137.         ld H,MAINCOMS/256
  138.         LD a,(HL)
  139.         INC H
  140.         LD H,(HL)
  141.         ld L,a
  142.         JP (HL)
  143. GSer
  144.         ld b,1+(gs_LSW&0xff)
  145.         get
  146.         next
  147.         LD L,A
  148.         ld H,MAINCOMS/256
  149.         LD a,(HL)
  150.         INC H
  151.         LD H,(HL)
  152.         ld L,a
  153.         JP (HL)
  154.  
  155.         ALIGNrm
  156. XLATBer
  157.        UNTESTED
  158. ;AL = DS:[(E)BX + AL]
  159.         ld a,(_AL)
  160.         ld hl,(_BX)
  161.         add a,l
  162.         ld l,a
  163.         jr nc,$+3
  164.         inc h
  165.         call ADDRGETm16_pp_ds_nodisp ;ьюцхЄ яюфьхэшЄ№ ёхуьхэЄ
  166.         ld a,(hl)
  167.         ld (_AL),a
  168.        _LoopC
  169.  
  170. getflags_bc
  171.         ex af,af' ;'
  172.         push af
  173.         ex af,af' ;'
  174.         pop bc
  175. ;c=%SZ?H???C
  176.          res 5,c
  177.          res 3,c
  178.          res 2,c
  179.          set 1,c ;TODO a
  180.         exx
  181.         ld a,d ;parity data
  182.         exx
  183.         or a
  184.         jp po,$+5
  185.         set 2,c
  186. ;c=%SZ0A0P1C
  187. ;c=%SF:ZF:0:AF:0:PF:1:CF
  188.         ld a,(iff1)
  189.         ;ld b,0x30 ;+ 2
  190.         ;or a
  191.         ;jr z,$+4
  192.         ;set 1,b ;interrupt enable
  193.        and 2
  194.        or 0x30
  195.        ld b,a
  196.         ;ld a,(_DIRECTION) ;TODO from patch
  197.         ;rra
  198.         ;jr nc,$+4
  199.         ;set 2,b
  200.        ld a,(incdecsi_hl)
  201.        rra
  202.        and 4
  203.        or b
  204.        ld b,a
  205.         exx
  206.         ld a,e ;overflow data
  207.         and 0x40
  208.         rla
  209.         xor e
  210.         exx        
  211.         ret p ;jp p,$+5
  212.         set 3,b
  213.         ret
  214.  
  215. makeflags_frombc
  216. ;c=%SF:ZF:0:AF:0:PF:1:CF
  217.        if 1
  218.         ld a,b
  219.         and 2 ;interrupt enable
  220.         add a,-1
  221.         sbc a,a
  222.         ld (iff1),a
  223.         ld a,b
  224.         ;and 4 ;direction
  225.         ;add a,-1
  226.         ;sbc a,a
  227.         ;ld (_DIRECTION),a
  228.        rla
  229.         and 8
  230.         or 0x23 ;"inc hl" ;0x2b ;"dec hl"
  231.         ld (incdec2si_hl),a
  232.         ld (incdecsi_hl),a
  233.         ld a,b
  234.         and 8 ;overflow
  235.         rlca
  236.         rlca
  237.         rlca ;a=0x00/0x40
  238.         exx
  239.         ld e,a ;overflow data ;шыш шэтхЁёэю?
  240.         exx
  241.         ld a,c
  242.        ;cpl
  243.        or 0xfb;and 4 ;parity
  244.         exx
  245.         ld d,a ;parity data
  246.         exx
  247.        endif
  248.         push bc
  249.         ex af,af' ;'
  250.         pop af
  251.         ex af,af' ;'
  252.         ret
  253.  
  254. SAHFer
  255.        UNTESTED
  256.         call getflags_bc
  257. ;store AH into flags
  258.         ld a,(_AH)
  259.         ld c,a
  260.        ;ld bc,(_AX) ;for megapole
  261.         call makeflags_frombc
  262.        _Loop_
  263.  
  264. LAHFer
  265.        UNTESTED
  266. ;Load Status Flags into AH Register
  267.         call getflags_bc
  268.         ld a,c
  269.         ld (_AH),a
  270.        _Loop_
  271.  
  272. CLIer
  273.         xor a
  274.         ld (iff1),a
  275.        _Loop_
  276.  
  277. STIer
  278.         ld a,-1
  279.         ld (iff1),a
  280.        _Loop_
  281.  
  282. CLDer
  283.         ;xor a
  284.         ;ld (_DIRECTION),a
  285.         ld a,0x23 ;"inc hl"
  286.         ld (incdec2si_hl),a
  287.         ld (incdecsi_hl),a
  288. NOPer
  289. HLTer ;TODO
  290.        _Loop_
  291.  
  292. STDer
  293.         ;ld a,-1
  294.         ;ld (_DIRECTION),a
  295.         ld a,0x2b ;"dec hl"
  296.         ld (incdec2si_hl),a
  297.         ld (incdecsi_hl),a
  298.        _Loop_
  299.  
  300. STCer
  301.         ex af,af' ;'
  302.         scf
  303.         ex af,af' ;'
  304.        _Loop_
  305.  
  306. CLCer
  307.         ex af,af' ;'
  308.         scf
  309.         ex af,af' ;'
  310. CMCer
  311.         ex af,af' ;'
  312.         ccf
  313.         ex af,af' ;'
  314.        _Loop_
  315.  
  316. PUSHAer
  317.        UNTESTED
  318. ;╤юїЁрэшЄ№ т ёЄхъх ЁхушёЄЁ√ AX, CX, DX, BX, шёїюфэ√щ (TODO) SP, BP, SI ш DI
  319.         ld hl,_AX
  320.         ld b,8
  321. _PUSHAer0
  322.         push bc
  323.         ld c,(hl)
  324.         inc l
  325.         ld b,(hl)
  326.         inc l
  327.         push hl
  328.         putmemspBC
  329.         pop hl
  330.         pop bc
  331.         djnz _PUSHAer0
  332.        _Loop_
  333.  
  334. PUSHi8
  335.        UNTESTED
  336.         get
  337.         next
  338.         ld c,a
  339.         rla
  340.         sbc a,a
  341.         ld b,a
  342.        jr _PUSHq
  343. PUSHi16
  344.         getBC
  345.        jr _PUSHq
  346. PUSHFer
  347.        call getflags_bc
  348.        jr _PUSHq
  349. PUSHax
  350.        ld bc,(_AX)
  351.        jr _PUSHq
  352. PUSHcx
  353.        ld bc,(_CX)
  354.        jr _PUSHq
  355. PUSHdx
  356.        ld bc,(_DX)
  357.        jr _PUSHq
  358. PUSHbx
  359.        ld bc,(_BX)
  360.        jr _PUSHq
  361. PUSHsp
  362.        ld bc,(_SP)
  363.        jr _PUSHq
  364. PUSHbp
  365.        ld bc,(_BP)
  366.        jr _PUSHq
  367. PUSHsi
  368.        ld bc,(_SI)
  369.        jr _PUSHq
  370. PUSHdi
  371.        ld bc,(_DI)
  372.        jr _PUSHq
  373. PUSHes
  374.        ld bc,(_ES)
  375.        jr _PUSHq
  376. PUSHcs
  377.        ld bc,(_CS)
  378.        jr _PUSHq
  379. PUSHss
  380.        ld bc,(_SS)
  381.        jr _PUSHq
  382. PUSHds
  383.        ld bc,(_DS)
  384. _PUSHq
  385.         putmemspBC
  386.        _LoopC
  387.  
  388. POPAer
  389.        UNTESTED
  390. ;╟руЁєчшЄ№ шч ёЄхър ЁхушёЄЁ√ DI, SI, BP, BX, DX, CX ш AX
  391. ;╩юьрэфр POPA яЁюфхы√трхЄ фхщёЄтш  юсЁрЄэ√х ъюьрэфх PUSHA, тюёёЄрэртыштр  ЁхушёЄЁ√ юс∙хую эрчэрўхэш  ъ чэрўхэш ь, с√т°шь т эшї фю т√яюыэхэш  ъюьрэф√ PUSHA, ъЁюьх ЁхушёЄЁр SP, ъюЄюЁ√щ яЁюяєёърхЄё  (TODO)
  392.         ld hl,_AX+(8*2)
  393.         ld b,8
  394. _POPAer0
  395.         push bc
  396.         push hl
  397.         getmemspBC
  398.         pop hl
  399.         dec l
  400.         ld (hl),b
  401.         dec l
  402.         ld (hl),c
  403.         pop bc
  404.         djnz _POPAer0
  405.        _Loop_
  406.  
  407. POPFer
  408.         getmemspBC
  409.         call makeflags_frombc
  410.        _LoopC
  411. POPax
  412.         getmemspBC
  413.         ld (_AX),bc
  414.        _LoopC
  415. POPcx
  416.         getmemspBC
  417.         ld (_CX),bc
  418.        _LoopC
  419. POPdx
  420.         getmemspBC
  421.         ld (_DX),bc
  422.        _LoopC
  423. POPbx
  424.         getmemspBC
  425.         ld (_BX),bc
  426.        _LoopC
  427. POPsp
  428.         getmemspBC
  429.         ld h,b
  430.         ld l,c
  431.         ld (_SP),hl
  432.         encodeSP
  433.        _LoopC
  434. LEAVEer
  435. ;Set SP to BP, then pop BP
  436.         ld hl,(_BP)
  437.         ld (_SP),hl
  438.         encodeSP
  439. POPbp
  440.         getmemspBC
  441.         ld (_BP),bc
  442.        _LoopC
  443. POPsi
  444.         getmemspBC
  445.         ld (_SI),bc
  446.        _LoopC
  447. POPdi
  448.         getmemspBC
  449.         ld (_DI),bc
  450.        _LoopC
  451. POPes
  452.         getmemspBC
  453.         ld (_ES),bc
  454.         countES
  455.        _LoopC
  456. POPcs
  457.         getmemspBC
  458.         ld (_CS),bc
  459.         countCS
  460.        _LoopC
  461. POPss
  462.         getmemspBC
  463.         ld (_SS),bc
  464.         countSS
  465.        _LoopC
  466. POPds
  467.         getmemspBC
  468.         ld (_DS),bc
  469.         countDS
  470.        _LoopC
  471.  
  472. MOVaxi16
  473.         getHL
  474.         ld (_AX),hl
  475.        _Loop_
  476. MOVcxi16
  477.         getHL
  478.         ld (_CX),hl
  479.        _Loop_
  480. MOVdxi16
  481.         getHL
  482.         ld (_DX),hl
  483.        _Loop_
  484. MOVbxi16
  485.         getHL
  486.         ld (_BX),hl
  487.        _Loop_
  488. MOVspi16
  489.         getHL
  490.         ld (_SP),hl
  491.         encodeSP
  492.        _LoopC
  493. MOVbpi16
  494.         getHL
  495.         ld (_BP),hl
  496.        _Loop_
  497. MOVsii16
  498.         getHL
  499.         ld (_SI),hl
  500.        _Loop_
  501. MOVdii16
  502.         getHL
  503.         ld (_DI),hl
  504.        _Loop_
  505.  
  506. MOVali8
  507.         get
  508.         next
  509.         ld (_AL),a
  510.        _Loop_
  511. MOVcli8
  512.         get
  513.         next
  514.         ld (_CL),a
  515.        _Loop_
  516. MOVdli8
  517.         get
  518.         next
  519.         ld (_DL),a
  520.        _Loop_
  521. MOVbli8
  522.         get
  523.         next
  524.         ld (_BL),a
  525.        _Loop_
  526. MOVahi8
  527.         get
  528.         next
  529.         ld (_AH),a
  530.        _Loop_
  531. MOVchi8
  532.         get
  533.         next
  534.         ld (_CH),a
  535.        _Loop_
  536. MOVdhi8
  537.         get
  538.         next
  539.         ld (_DH),a
  540.        _Loop_
  541. MOVbhi8
  542.         get
  543.         next
  544.         ld (_BH),a
  545.        _Loop_
  546.  
  547. ;mov [addr],al
  548.         ALIGNrm
  549. MOVmemal
  550.         getHL
  551.         call ADDRGETm16_pp_ds_nodisp
  552.        ; ADDRSEGMENT_chl_bHSB ;out: hl=zxaddr, c=page (%01..5432), b=?s_HSB
  553.        ;ld lx,c;push bc
  554.         ;ld b,tpgs/256
  555.         ;ld a,(bc)
  556.         ;SETPGC000
  557.         ld a,(_AL)
  558.         ld (hl),a
  559.        ld c,lx;pop bc
  560.        _PUTscreen_logpgc_zxaddrhl_datamhl
  561.        _LoopC
  562.  
  563. ;mov [addr],ax
  564.         ALIGNrm
  565. MOVmemax
  566.         getHL
  567.         call ADDRGETm16_pp_ds_nodisp
  568.        ; ADDRSEGMENT_chl_bHSB ;out: hl=zxaddr, c=page (%01..5432), b=?s_HSB
  569.        ;ld lx,c;push bc
  570.        ;  ld b,tpgs/256
  571.        ;  ld a,(bc)
  572.         ;SETPGC000
  573.         ld bc,(_AX)
  574.        _PUTm16_oldpglx
  575.        _LoopC
  576.  
  577. ;mov al,[addr]
  578.         ALIGNrm
  579. MOValmem
  580.         getHL
  581.         call ADDRGETm16_pp_ds_nodisp
  582.         ;ADDRSEGMENT_chl_bHSB ;out: hl=zxaddr, c=page (%01..5432), b=?s_HSB
  583.         ;ld b,tpgs/256
  584.         ;ld a,(bc)
  585.         ;SETPGC000
  586.         ld a,(hl)
  587.         ld (_AL),a
  588.        _LoopC
  589.  
  590. ;mov ax,[addr]
  591.         ALIGNrm
  592. MOVaxmem
  593.         getHL
  594.         call ADDRGETm16_pp_ds_nodisp
  595.         ;ADDRSEGMENT_chl_bHSB ;out: hl=zxaddr, c=page (%01..5432), b=?s_HSB
  596.        ;ld lx,c
  597.         ;ld b,tpgs/256
  598.         ;ld a,(bc)
  599.         ;SETPGC000
  600.         ld a,(hl)
  601.         inc l
  602.         call z,inch_nextsubsegment_pglx
  603.         ld b,(hl)
  604.         ld c,a
  605.         ld (_AX),bc
  606.        _LoopC
  607.  
  608. INCax
  609.         ld hl,(_AX)
  610.         inchlwithflags
  611.         ld (_AX),hl
  612.        _Loop_
  613. INCcx
  614.         ld hl,(_CX)
  615.         inchlwithflags
  616.         ld (_CX),hl
  617.        _Loop_
  618. INCdx
  619.         ld hl,(_DX)
  620.         inchlwithflags
  621.         ld (_DX),hl
  622.        _Loop_
  623. INCbx
  624.         ld hl,(_BX)
  625.         inchlwithflags
  626.         ld (_BX),hl
  627.        _Loop_
  628. INCsp
  629.         ld hl,(_SP)
  630.         inchlwithflags
  631.         ld (_SP),hl
  632.        encodeSP
  633.        _LoopC
  634. INCbp
  635.         ld hl,(_BP)
  636.         inchlwithflags
  637.         ld (_BP),hl
  638.        _Loop_
  639. INCsi
  640.         ld hl,(_SI)
  641.         inchlwithflags
  642.         ld (_SI),hl
  643.        _Loop_
  644. INCdi
  645.         ld hl,(_DI)
  646.         inchlwithflags
  647.         ld (_DI),hl
  648.        _Loop_
  649.  
  650. DECax
  651.         ld hl,(_AX)
  652.         dechlwithflags
  653.         ld (_AX),hl
  654.        _Loop_
  655. DECcx
  656.         ld hl,(_CX)
  657.         dechlwithflags
  658.         ld (_CX),hl
  659.        _Loop_
  660. DECdx
  661.         ld hl,(_DX)
  662.         dechlwithflags
  663.         ld (_DX),hl
  664.        _Loop_
  665. DECbx
  666.         ld hl,(_BX)
  667.         dechlwithflags
  668.         ld (_BX),hl
  669.        _Loop_
  670. DECsp
  671.         ld hl,(_SP)
  672.         dechlwithflags
  673.         ld (_SP),hl
  674.        encodeSP
  675.        _LoopC
  676. DECbp
  677.         ld hl,(_BP)
  678.         dechlwithflags
  679.         ld (_BP),hl
  680.        _Loop_
  681. DECsi
  682.         ld hl,(_SI)
  683.         dechlwithflags
  684.         ld (_SI),hl
  685.        _Loop_
  686. DECdi
  687.         ld hl,(_DI)
  688.         dechlwithflags
  689.         ld (_DI),hl
  690.        _Loop_
  691.  
  692. CALLer
  693.         getHL
  694.        decodePC
  695.         add hl,de
  696.         ex de,hl ;new IP(PC)
  697.         ld b,h
  698.         ld c,l ;=old IP(PC)
  699.         putmemspBC
  700.        _LoopJP
  701.  
  702. CALLptr1616
  703.        UNTESTED
  704. ;push cs; push ip (рфЁхё яюёых ъюьрэф√)
  705.        ld bc,(_CS)
  706.         putmemspBC ;old CS
  707. ;рсёюы■Єэ√щ рфЁхё ip, cs
  708.         getBC ;ip
  709.        push bc
  710.         getBC ;cs
  711.         ld (_CS),bc ;new CS
  712.         countCS
  713.        decodePC
  714.         LD b,d
  715.         ld c,e ;=old PC
  716.        pop de ;new PC
  717.         putmemspBC
  718.        _LoopC_JP
  719.  
  720. JMPptr1616
  721. ;рсёюы■Єэ√щ рфЁхё ip, cs? Єръ эх ЁрсюЄрхЄ rax
  722. ;шыш ¤Єю рфЁхё, яю ъюЄюЁюьє ыхцшЄ ip, cs?
  723.        UNTESTED
  724.         getBC ;ip
  725.         push bc
  726.         getBC ;cs
  727.         pop de
  728. RETFq
  729.         ld (_CS),bc
  730.         countCS
  731.        _LoopJP
  732.  
  733. RETer
  734.         getmemspBC
  735.         LD D,B
  736.         ld E,C ;new PC
  737.        _LoopC_JP
  738.  
  739. IRETer
  740.         getmemspBC
  741.         call makeflags_frombc
  742.         ;ld a,-1
  743.         ;ld (iff1),a ;єцх хёЄ№ т makeflags
  744. RETFer
  745.         getmemspBC ;ip
  746.        push bc
  747.         getmemspBC ;cs
  748.        pop de ;new PC
  749.        ld a,b
  750.        or c
  751.        jr z,IRETer ;эєцэю фы  юсЁрсюЄўшър яЁхЁ√трэшщ, ъюЄюЁ√щ т ъюэЎх яхЁхїюфшЄ эр ёЄрЁ√щ BIOSэ√щ юсЁрсюЄўшъ (gamecga (ratillery))
  752.         jp RETFq
  753. RETFi16 ;RETF ш яюЄюь SP += i16
  754.         getmemspBC ;ip
  755.        push bc
  756.         getmemspBC ;cs
  757.        push bc
  758.         getBC
  759.         ld hl,(_SP)
  760.         add hl,bc
  761.         ld (_SP),hl
  762.         encodeSP
  763.        pop bc
  764.        pop de ;new PC
  765.         jp RETFq
  766.  
  767. RETi16 ;RET ш яюЄюь SP += i16
  768.        UNTESTED
  769.         getmemspBC
  770.        push bc
  771.         getBC
  772.         ld hl,(_SP)
  773.         add hl,bc
  774.         ld (_SP),hl
  775.         encodeSP
  776.        pop de ;new PC
  777.        _LoopC_JP
  778.  
  779. JLEer ;jump if not greater (zero or less)
  780.        UNTESTED
  781.         ex af,af' ;'
  782.         jp z,JRYer
  783.         ex af,af' ;'
  784. JLer ;jump if less (SF xor OF = 1)
  785.        UNTESTED
  786.         ex af,af' ;'
  787.         jp m,exaJNOer
  788. exaJOer
  789.         ex af,af' ;'
  790. JOer ;jump if overflow
  791.        UNTESTED
  792.         exx
  793.         ld a,e ;overflow data
  794.         and 0x40
  795.         rla
  796.         xor e
  797.         exx
  798.         JP M,JRer
  799.         next
  800.        _Loop_
  801. JGer ;jump if greater (not zero and not less)
  802.        UNTESTED
  803.         ex af,af' ;'
  804.         jp z,exaNOJP
  805.         ex af,af' ;'
  806. JNLer ;jump if not less (SF xor OF = 0)
  807.        UNTESTED
  808.         ex af,af' ;'
  809.         jp m,exaJOer
  810. exaJNOer
  811.         ex af,af' ;'
  812. JNOer ;jump if no overflow
  813.        UNTESTED
  814.         exx
  815.         ld a,e ;overflow data
  816.         and 0x40
  817.         rla
  818.         xor e
  819.         exx
  820.         JP P,JRer
  821.         next
  822.        _Loop_
  823. JPer ;jump if parity even
  824.        UNTESTED
  825.         exx
  826.         ld a,d ;parity data
  827.         exx
  828.         or a
  829.         JP PE,JRer
  830.         next
  831.        _Loop_
  832. JNPer ;jump if parity odd
  833.        UNTESTED
  834.         exx
  835.         ld a,d ;parity data
  836.         exx
  837.         or a
  838.         JP PO,JRer
  839.         next
  840.        _Loop_
  841. JNEer
  842.         ex af,af' ;'
  843.         JR NZ,JRYer
  844.         ex af,af' ;'
  845.         next
  846.        _Loop_
  847. JEer
  848.         ex af,af' ;'
  849.         JR Z,JRYer
  850.         ex af,af' ;'
  851.         next
  852.        _Loop_
  853. JNCer
  854.         ex af,af' ;'
  855.         JR NC,JRYer
  856.         ex af,af' ;'
  857.         next
  858.        _Loop_
  859. JCer
  860.         ex af,af' ;'
  861.         JR C,JRYer
  862.         ex af,af' ;'
  863.         next
  864.        _Loop_
  865. JBEer ;jump if CF or ZF = 1
  866.        UNTESTED
  867.         ex af,af' ;'
  868.         JR C,JRYer
  869.         JR Z,JRYer
  870.         ex af,af' ;'
  871.         next
  872.        _Loop_
  873. JAer ;jump if (CF or ZF) = 0, i.e. CF=ZF=0
  874.        UNTESTED
  875.         ex af,af' ;'
  876.         JR C,$+4
  877.         JR nz,JRYer
  878.         ex af,af' ;'
  879.         next
  880.        _Loop_
  881. JRYer
  882.         ex af,af' ;'
  883. JRer
  884.         get
  885.         next
  886.         ld l,a
  887.         RLA
  888.         SBC A,A
  889.         LD H,A
  890.        decodePC ;a=d
  891.         ADD HL,DE
  892.        ;;ld a,d
  893.        ;xor h
  894.        ;and 0xc0
  895.         ex de,hl ;new PC
  896.        ;jr z,JRer_qslow
  897.        ;_LoopC_JPoldpg
  898. JRer_qslow
  899.        _LoopC_JP
  900.  
  901. JSer ;jump if sign
  902.         ex af,af' ;'
  903.         jp m,JRYer
  904.         ex af,af' ;'
  905.         next
  906.        _Loop_
  907. JNSer ;jump if no sign
  908.         ex af,af' ;'
  909.         jp p,JRYer
  910. exaNOJP
  911.         ex af,af' ;'
  912.         next
  913.        _Loop_
  914. LOOPNZer
  915.         ex af,af' ;'
  916.         jr z,exaNOJP
  917.         jr exaLOOPer
  918. LOOPZer
  919.         ex af,af' ;'
  920.         jr nz,exaNOJP
  921. exaLOOPer
  922.         ex af,af' ;'
  923. LOOPer
  924.         ld hl,(_CX)
  925.         dec hl
  926.         ld (_CX),hl
  927. ;jump if CX != 0
  928.         ld hl,(_CX)
  929.         ld a,h
  930.         or l
  931.         JR nz,JRer
  932.         next
  933.        _Loop_
  934. JCXZer ;jump if CX == 0
  935.        UNTESTED
  936.         ld hl,(_CX)
  937.         ld a,h
  938.         or l
  939.         JR z,JRer
  940.         next
  941.        _Loop_
  942.  
  943. JMPer
  944.         getHL
  945.        decodePC
  946.         ADD HL,DE
  947.         ex de,hl ;new PC ;TODO єсЁрЄ№ фтющэющ ex de,hl
  948.        _LoopC_JP
  949.  
  950.         macro XCHGAXRP rp
  951.         ld bc,(rp)
  952.         ld hl,(_AX)
  953.         ld (rp),hl
  954.         ld (_AX),bc
  955.        _Loop_
  956.         endm
  957. XCHGaxcx
  958.         XCHGAXRP _CX
  959. XCHGaxdx
  960.         XCHGAXRP _DX
  961. XCHGaxbx
  962.         XCHGAXRP _BX
  963. XCHGaxsp
  964.        UNTESTED
  965.         ld bc,(_SP)
  966.         ld hl,(_AX)
  967.         ld (_AX),bc
  968.         ld (_SP),hl
  969.        encodeSP
  970.        _Loop_
  971. XCHGaxbp
  972.         XCHGAXRP _BP
  973. XCHGaxsi
  974.         XCHGAXRP _SI
  975. XCHGaxdi
  976.         XCHGAXRP _DI
  977.  
  978.        macro INCDEC2HLbyDIRECTION
  979.         call incdec2si_hl
  980.        endm
  981.        macro INCDECSIbyDIRECTION
  982.         ld hl,(_SI)
  983.         call incdecsi_hl
  984.         ld (_SI),hl
  985.        endm
  986.        macro INCDECDIbyDIRECTION
  987.         ld hl,(_DI)
  988.         call incdecdi_hl
  989.         ld (_DI),hl
  990.        endm
  991.        macro INCDECSI_DIbyDIRECTION
  992.         ld hl,(_SI)
  993.         call incdecsi_hl
  994.         ld (_SI),hl
  995.         ld hl,(_DI)
  996.         call incdecdi_hl
  997.         ld (_DI),hl
  998.        endm
  999.        macro INCDEC2SI_DIbyDIRECTION
  1000.         ld hl,(_SI)
  1001.         call incdec2si_hl
  1002.         ld (_SI),hl
  1003.         ld hl,(_DI)
  1004.         call incdec2di_hl
  1005.         ld (_DI),hl
  1006.        endm
  1007.        macro INCDEC2SIbyDIRECTION
  1008.         ld hl,(_SI)
  1009.         call incdec2si_hl
  1010.         ld (_SI),hl
  1011.        endm
  1012.        macro INCDEC2DIbyDIRECTION
  1013.         ld hl,(_DI)
  1014.         call incdec2di_hl
  1015.         ld (_DI),hl
  1016.        endm
  1017.         ALIGNrm
  1018. REPZer
  1019. REPNZer
  1020. ;ъюёЄ√ы№! FIXME
  1021. ;TODO ёЄртшЄ№ ётющ iy т ърцфюь юсЁрсюЄўшъх, ўЄюс√ эх фхырЄ№ jr
  1022.         get
  1023.         next
  1024.         cp 0xa4
  1025.         jp z,REPMOVSBer
  1026.         cp 0xa5
  1027.         jp z,REPMOVSWer
  1028.         cp 0xa6
  1029.         jp z,REPCMPSBer
  1030.         cp 0xa7
  1031.         jp z,REPCMPSWer ;ms pacman
  1032.         cp 0xaa
  1033.         jp z,REPSTOSBer
  1034.         cp 0xab
  1035.         jp z,REPSTOSWer
  1036.         cp 0xae
  1037.         jp z,REPSCASBer
  1038.         cp 0xaf
  1039.         jp z,REPSCASWer ;for ms pacman
  1040.        cp 0x6e
  1041.        jp z,NOPer ;TODO rep insw for lkccmini (эрёЄЁющър ярышЄЁ√, яюЁЄ dx=0x03c9 https://bochs.sourceforge.io/techspec/PORTS.LST)
  1042.        cp 0x66
  1043.        jr z,REPSTOSDWer ;for blue
  1044.  
  1045.  if debug_stop = 0
  1046.  jp PANIC
  1047.  else
  1048.  jr $
  1049.  endif
  1050.  
  1051. REPSTOSDWer
  1052.        get
  1053.        next
  1054.        cp 0xab
  1055.        jr nz,$
  1056.        ld hl,(_CX)
  1057.        add hl,hl
  1058.        ld (_CX),hl
  1059.        jr c,$
  1060.         jp REPSTOSWer
  1061.  
  1062. REPMOVSWer_scr
  1063.         ld hl,(_DI)
  1064.        push hl
  1065.         ld bc,(_CX)
  1066.         ld hl,(_SI)
  1067. REPMOVSWer_scr0
  1068.         push bc
  1069.         push hl
  1070.         ld bc,(ds_LSW)
  1071.         ld a,(ds_HSB)
  1072.         ADDRSEGMENT_chl_bHSB
  1073.         ld b,tpgs/256
  1074.         ld a,(bc)
  1075.         SETPGC000
  1076.          GETm16
  1077.        push bc
  1078.          ;ld a,c
  1079.         ld hl,(_DI)
  1080.         ld bc,(es_LSW)
  1081.         ld a,(es_HSB)
  1082.         ADDRSEGMENT_chl_bHSB
  1083.          ld lx,c
  1084.         ld b,tpgs/256
  1085.         ld a,(bc)
  1086.         SETPGC000
  1087.        pop bc
  1088.         _PUTm16_oldpglx
  1089.         INCDEC2DIbyDIRECTION
  1090.         pop hl
  1091.         INCDEC2HLbyDIRECTION
  1092.         pop bc
  1093.         dec bc
  1094.         ld a,b
  1095.         or c
  1096.         jp nz,REPMOVSWer_scr0
  1097.         ;ld hl,0
  1098.         ld (_CX),bc
  1099.        ld hl,(_DI)
  1100.        pop bc ;DI old
  1101.        sbc hl,bc ;was NC
  1102.        ld bc,(_SI)
  1103.        add hl,bc
  1104.        ld (_SI),hl
  1105.        _LoopC
  1106.  
  1107.         ALIGNrm
  1108. MOVSWer
  1109.        ;UNTESTED
  1110.         ld hl,(_SI)
  1111.         call ADDRGETm16_pp_ds_nodisp
  1112.          GETm16
  1113.        push bc
  1114.        ld a,c
  1115.         ld hl,(_DI)
  1116.         putmemES
  1117.         ld hl,(_DI)
  1118.         inc hl
  1119.        pop af
  1120.         putmemES
  1121.         INCDEC2SI_DIbyDIRECTION
  1122.        _LoopC
  1123.  
  1124.         ALIGNrm
  1125. MOVSBer
  1126.        UNTESTED
  1127.         ld hl,(_SI)
  1128.         call ADDRGETm16_pp_ds_nodisp
  1129.         ld a,(hl)
  1130.         ld hl,(_DI)
  1131.         putmemES
  1132.         INCDECSI_DIbyDIRECTION
  1133.        _LoopC
  1134.  
  1135. ;rep movsw
  1136. REPMOVSWer
  1137. ;TODO Ёрчфхы№эю юяЄшьшчшЁютрЄ№ ъюяшЁютрэшх эр ¤ъЁрэ ш эх эр ¤ъЁрэ
  1138. ;ъюёЄ√ы№: хёыш cx=0, Єю ёЁрчє т√їюфшь (р эх 65536 яютЄюЁют)
  1139.        ld a,(_ES+1)
  1140.        cp 0xa0
  1141.        jp nc,REPMOVSWer_scr
  1142.        ;ld hl,(_CX)
  1143.        ;ld a,h
  1144.        ;or l
  1145.        ;jr z,REPMOVSWerq
  1146.         ld hl,(_SI)
  1147.         getmemDS ;TODO яюфьхэр ёхуьхэЄр
  1148.         ld hl,(_DI)
  1149.         putmemES
  1150.         ld hl,(_SI)
  1151.         inc hl
  1152.         getmemDS ;TODO яюфьхэр ёхуьхэЄр
  1153.         ld hl,(_DI)
  1154.         inc hl
  1155.         putmemES
  1156.         INCDEC2SI_DIbyDIRECTION
  1157.         ld hl,(_CX)
  1158.         dec hl
  1159.         ld (_CX),hl
  1160.         ld a,h
  1161.         or l
  1162.         jp nz,REP_repeat ;TODO keep old b
  1163. REPMOVSWerq
  1164.        _LoopC
  1165.  
  1166. ;rep movsb
  1167. REPMOVSBer
  1168.        ;UNTESTED
  1169. ;TODO Ёрчфхы№эю юяЄшьшчшЁютрЄ№ ъюяшЁютрэшх эр ¤ъЁрэ ш эх эр ¤ъЁрэ
  1170. ;ъюёЄ√ы№: хёыш cx=0, Єю ёЁрчє т√їюфшь (р эх 65536 яютЄюЁют)
  1171.        ;ld hl,(_CX)
  1172.        ;ld a,h
  1173.        ;or l
  1174.        ;jr z,REPMOVSBerq
  1175.         ld hl,(_SI)
  1176.         getmemDS ;TODO яюфьхэр ёхуьхэЄр
  1177.         ld hl,(_DI)
  1178.         putmemES
  1179.         INCDECSI_DIbyDIRECTION
  1180.         ld hl,(_CX)
  1181.         dec hl
  1182.         ld (_CX),hl
  1183.         ld a,h
  1184.         or l
  1185.         jp nz,REP_repeat ;TODO keep old b
  1186. REPMOVSBerq
  1187.        _LoopC
  1188.  
  1189. REPSTOSBer
  1190.        UNTESTED
  1191. ;TODO Ёрчфхы№эю юяЄшьшчшЁютрЄ№ ъюяшЁютрэшх эр ¤ъЁрэ ш эх эр ¤ъЁрэ
  1192. ;ъюёЄ√ы№: хёыш cx=0, Єю ёЁрчє т√їюфшь (р эх 65536 яютЄюЁют)
  1193.        ld hl,(_CX)
  1194.        ld a,h
  1195.        or l
  1196.        jr z,REPSTOSBerq
  1197.         ld a,(_AL) ;al
  1198.         ld hl,(_DI)
  1199.         putmemES
  1200.         INCDECDIbyDIRECTION
  1201. ;flags not affected
  1202.         ld hl,(_CX)
  1203.         dec hl
  1204.         ld (_CX),hl
  1205.         ld a,h
  1206.         or l
  1207.         jr nz,REP_repeat
  1208. REPSTOSBerq
  1209.        _LoopC
  1210.  
  1211. REPSTOSWer
  1212.        UNTESTED
  1213. ;TODO Ёрчфхы№эю юяЄшьшчшЁютрЄ№ ъюяшЁютрэшх эр ¤ъЁрэ ш эх эр ¤ъЁрэ
  1214. ;ъюёЄ√ы№: хёыш cx=0, Єю ёЁрчє т√їюфшь (р эх 65536 яютЄюЁют)
  1215.        ld hl,(_CX)
  1216.        ld a,h
  1217.        or l
  1218.        jr z,REPSTOSWerq
  1219.         ld a,(_AL) ;al
  1220.         ld hl,(_DI)
  1221.         putmemES
  1222.         ld a,(_AH) ;ah
  1223.         ld hl,(_DI)
  1224.         inc hl
  1225.         putmemES ;TODO speedup
  1226.         INCDEC2DIbyDIRECTION
  1227. ;flags not affected
  1228.         ld hl,(_CX)
  1229.         dec hl
  1230.         ld (_CX),hl
  1231.         ld a,h
  1232.         or l
  1233.         jr nz,REP_repeat
  1234. REPSTOSWerq
  1235.        _LoopC
  1236.  
  1237. REP_repeat ;TODO speedup!!!
  1238.        decodePC
  1239.         dec de
  1240.         dec de ;new PC
  1241.        _LoopC_JP
  1242. ;repz cmpsb
  1243. REPCMPSBer
  1244.        UNTESTED
  1245.         ld hl,(_SI)
  1246.         getmemDS ;TODO яюфьхэр ёхуьхэЄр
  1247.         ex af,af' ;'
  1248.         ld hl,(_DI)
  1249.         getmemES
  1250.         ex af,af' ;'
  1251.         sub (hl)
  1252.         KEEPCFPARITYOVERFLOW_FROMA
  1253.         INCDECSI_DIbyDIRECTION
  1254.         ld hl,(_CX)
  1255.         dec hl
  1256.         ld (_CX),hl
  1257.         ex af,af' ;'
  1258.         jp nz,exaLoopC
  1259.         ex af,af' ;'
  1260.         ld a,h
  1261.         or l
  1262.         jp nz,REP_repeat ;TODO keep old b
  1263.        _LoopC
  1264. ;repz cmpsw
  1265. REPCMPSWer
  1266.        UNTESTED
  1267.         ld hl,(_SI)
  1268.         call ADDRGETm16_pp_ds_nodisp
  1269.          GETm16
  1270.        push bc
  1271.         ld hl,(_DI)
  1272.         getmemES
  1273.        pop hl
  1274.         or a
  1275.         sbc hl,bc
  1276.         KEEPCFPARITYOVERFLOW_FROMA
  1277.         INCDEC2SI_DIbyDIRECTION
  1278.         ld hl,(_CX)
  1279.         dec hl
  1280.         ld (_CX),hl
  1281.         ex af,af' ;'
  1282.         jr nz,exaLoopC
  1283.         ex af,af' ;'
  1284.         ld a,h
  1285.         or l
  1286.         jp nz,REP_repeat ;TODO keep old b
  1287.        _LoopC
  1288. ;repnz scasb
  1289. REPSCASBer
  1290.        UNTESTED
  1291.         ld hl,(_SI)
  1292.         getmemDS ;TODO яюфьхэр ёхуьхэЄр
  1293.         ld a,(_AL) ;al
  1294.         sub (hl)
  1295.         KEEPCFPARITYOVERFLOW_FROMA
  1296.         INCDECSIbyDIRECTION
  1297.         ld hl,(_CX)
  1298.         dec hl
  1299.         ld (_CX),hl
  1300.         ex af,af' ;'
  1301.         jr z,exaLoopC
  1302.         ex af,af' ;'
  1303.         ld a,h
  1304.         or l
  1305.         jp nz,REP_repeat ;TODO keep old b
  1306.        _LoopC
  1307. exaLoopC
  1308.         ex af,af' ;'
  1309.        _LoopC
  1310. ;repnz scasw
  1311. REPSCASWer
  1312.        UNTESTED
  1313.         ld hl,(_SI)
  1314.         call ADDRGETm16_pp_ds_nodisp
  1315.          GETm16
  1316.         ld hl,(_AX)
  1317.         SBCHLBC_KEEPCFPARITYOVERFLOW_FROMHL
  1318.         INCDEC2DIbyDIRECTION
  1319.         ld hl,(_CX)
  1320.         dec hl
  1321.         ld (_CX),hl
  1322.         ex af,af' ;'
  1323.         jr z,exaLoopC
  1324.         ex af,af' ;'
  1325.         ld a,h
  1326.         or l
  1327.         jp nz,REP_repeat ;TODO keep old b
  1328.        _LoopC
  1329.  
  1330.         ALIGNrm
  1331. SCASBer
  1332.        UNTESTED
  1333.         ld hl,(_SI)
  1334.         call ADDRGETm16_pp_ds_nodisp
  1335.         ld a,(_AL)
  1336.         sub (hl)
  1337.         KEEPCFPARITYOVERFLOW_FROMA
  1338.         INCDECSIbyDIRECTION
  1339.        _LoopC
  1340.  
  1341.         ALIGNrm
  1342. SCASWer
  1343.        UNTESTED
  1344.         ld hl,(_SI)
  1345.         call ADDRGETm16_pp_ds_nodisp
  1346.          GETm16
  1347.         ld hl,(_AX)
  1348.         SBCHLBC_KEEPCFPARITYOVERFLOW_FROMHL
  1349.         INCDEC2DIbyDIRECTION
  1350.        _LoopC
  1351.  
  1352.         ALIGNrm
  1353. CMPSBer
  1354.        ;UNTESTED
  1355.         ld hl,(_SI)
  1356.         call ADDRGETm16_pp_ds_nodisp
  1357.         ld a,(hl)
  1358.         ex af,af' ;'
  1359.         ld hl,(_DI)
  1360.         getmemES
  1361.         ex af,af' ;'
  1362.         sub (hl)
  1363.         KEEPCFPARITYOVERFLOW_FROMA
  1364.         INCDECSI_DIbyDIRECTION
  1365.        _LoopC
  1366.  
  1367.         ALIGNrm
  1368. CMPSWer
  1369.        UNTESTED
  1370.         ld hl,(_SI)
  1371.         call ADDRGETm16_pp_ds_nodisp
  1372.          GETm16
  1373.        push bc
  1374.         ld hl,(_DI)
  1375.         getmemES
  1376.        pop hl
  1377.         or a
  1378.         sbc hl,bc
  1379.         KEEPCFPARITYOVERFLOW_FROMA
  1380.         INCDEC2SI_DIbyDIRECTION
  1381.        _LoopC
  1382.  
  1383.         ALIGNrm
  1384. LODSBer
  1385.        UNTESTED
  1386.         ld hl,(_SI)
  1387.         call ADDRGETm16_pp_ds_nodisp
  1388.         ld a,(hl)
  1389.         ld (_AL),a
  1390.         INCDECSIbyDIRECTION
  1391. ;flags not affected
  1392. ;dec cx эх эрфю!
  1393.        _LoopC
  1394.  
  1395.         ALIGNrm
  1396. LODSWer
  1397.        UNTESTED
  1398.         ld hl,(_SI)
  1399.         call ADDRGETm16_pp_ds_nodisp
  1400.          GETm16
  1401.         ld (_AX),bc
  1402.         ;ld hl,(_SI)
  1403.         ;getmemDS ;TODO яюфьхэр ёхуьхэЄр
  1404.         ;ld (_AL),a ;al
  1405.         ;ld hl,(_SI)
  1406.         ;inc hl
  1407.         ;getmemDS ;TODO яюфьхэр ёхуьхэЄр
  1408.         ;ld (_AH),a ;ah
  1409. LODSWerincq
  1410.         INCDEC2SIbyDIRECTION
  1411. ;flags not affected
  1412. ;dec cx эх эрфю!
  1413.        _LoopC
  1414.  
  1415.         ALIGNrm
  1416. OPSIZEr
  1417.        UNTESTED
  1418. ;ъюёЄ√ы№ фы  para512
  1419.         get
  1420.         next
  1421. ;TODO check
  1422. ;for lodsd
  1423.         ld hl,(_SI)
  1424.         call ADDRGETm16_pp_ds_nodisp
  1425.          GETm16
  1426.         ld (_AX),bc
  1427.         INCDEC2SIbyDIRECTION
  1428.        jr LODSWerincq
  1429.  
  1430. STOSBer
  1431.        UNTESTED
  1432.         ld a,(_AL) ;al
  1433.         ld hl,(_DI)
  1434.         putmemES
  1435.         INCDECDIbyDIRECTION
  1436. ;flags not affected
  1437. ;dec cx эх эрфю!
  1438.        _LoopC
  1439.  
  1440. STOSWer
  1441.        UNTESTED
  1442.         ld a,(_AL) ;al
  1443.         ld hl,(_DI)
  1444.         putmemES
  1445.         ld a,(_AH) ;ah
  1446.         ld hl,(_DI)
  1447.         inc hl
  1448.         putmemES ;TODO speedup
  1449.         INCDEC2DIbyDIRECTION
  1450. ;flags not affected
  1451. ;dec cx эх эрфю!
  1452.        _LoopC
  1453.  
  1454. INTi8
  1455.        ld a,(curpg4000) ;ok
  1456.        push af
  1457.         get
  1458.         next
  1459.        push af
  1460.        ld a,(pgprog)
  1461.        SETPG4000
  1462.        pop af
  1463.         call far_int
  1464.        pop af
  1465.        SETPG4000
  1466.        _Loop_
  1467.