?login_element?

Subversion Repositories NedoOS

Rev

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