?login_element?

Subversion Repositories NedoOS

Rev

Rev 1266 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;PC=0x4000...
  2. ;SP=0x8000... (TODO убрать)
  3. ;data=0xC000...
  4.  
  5.        macro UNTESTED
  6.        if DEBUG
  7.         jr $
  8.        endif
  9.        endm
  10.  
  11.        macro GOOD
  12.        endm
  13.  
  14.      macro DISABLE_IFF0_KEEP_IY ;иначе pop iy запорет iy от обработчика прерывания
  15.         call disable_iff0_keep_iy
  16.      endm
  17.      macro ENABLE_IFF0_REMEMBER_IY ;иначе pop iy запорет iy от обработчика прерывания
  18.         call enable_iff0_remember_iy
  19.      endm
  20.  
  21.  
  22.        macro ALIGNrm
  23.         align 2
  24.        endm
  25.  
  26.        macro _PUTscreen_logpgc_zxaddrhl_datamhl_keephlpg
  27.         ld b,tscreenpgs/256
  28.         ld a,(bc)
  29.         cp b
  30.         call nz,PUTscreen_logpgc_zxaddrhl_datamhl_keephlpg_do
  31.        endm
  32.  
  33.        macro _PUTscreen_logpgc_zxaddrhl_datamhl
  34.         ld b,tscreenpgs/256
  35.         ld a,(bc)
  36.         cp b
  37.         call nz,PUTscreen_logpgc_zxaddrhl_datamhl_do
  38.        endm
  39.  
  40.         MACRO _Loop_
  41.         JP (IY) ;EMULOOP (нужный marg или нужный обработчик b/p)
  42.         ENDM
  43.  
  44. ;если вместо стр.команд включили др.стр.
  45.         MACRO _LoopC
  46.         ;OUTcom
  47.         JP (IY)
  48.         ENDM
  49.  
  50. ;если резко сменился PC (полный DE)
  51.         MACRO _LoopJP
  52.         encodePC;CALCiypgcom
  53.         JP (IY)
  54.         ENDM
  55.  
  56. ;если выключили др.стр. и резко сменился PC (полный DE)
  57.         MACRO _LoopC_JP
  58.         encodePC;CALCiypgcom
  59.         JP (IY)
  60.         ENDM
  61.  
  62. ;если резко сменился PC (полный DE в той же странице)
  63.         MACRO _LoopC_JPoldpg
  64.        ;set 6,d
  65.        ;res 7,d ;4000+
  66.         encodePC;CALCiypgcom
  67.         JP (IY)
  68.         ENDM
  69.  
  70. ;если IN/OUT (могла измениться конфигурация памяти)
  71.         MACRO _LoopSWI
  72.         ;CALCpgcom
  73.         JP (IY)
  74.         ENDM
  75.  
  76.         macro decodePC ;de,pc_high -> de
  77.         ld a,(pc_high)
  78.         xor d
  79.         and 0xc0
  80.         xor d
  81.         ld d,a
  82. ;теперь вычитаем пересчитанный сегмент, т.к. при encodePC он прибавляется
  83.         ld bc,(cs_LSW)
  84.         ex de,hl
  85.         ;or a
  86.         sbc hl,bc
  87.         ex de,hl
  88.         endm
  89.  
  90.         macro encodePC
  91.         ex de,hl
  92.         _memCS
  93.         ex de,hl
  94.         endm
  95.  
  96.         macro get
  97.         ld a,(de)
  98.         endm
  99.  
  100.         macro next
  101.         inc e
  102.         call z,recountpc_inc ;keep CY!
  103.         endm
  104.  
  105.         macro getHL
  106.         get
  107.         next
  108.         ld l,a
  109.         get
  110.         next
  111.         ld h,a
  112.         endm
  113.  
  114.         macro getBC
  115.         get
  116.         next
  117.         ld c,a
  118.         get
  119.         next
  120.         ld b,a
  121.         endm
  122.  
  123.         macro countSS ;bc=(_SS)
  124.         call countXS_bc_to_ahl
  125.         ld (ss_LSW),hl
  126.         ld (ss_HSB),a
  127.         endm
  128.  
  129.         macro countCS ;bc=(_CS)
  130.         call countXS_bc_to_ahl
  131.         ld (cs_LSW),hl
  132.         ld (cs_HSB),a
  133.         endm
  134.  
  135.         macro countDS ;bc=(_DS)
  136.         call countXS_bc_to_ahl
  137.         ld (ds_LSW),hl
  138.         ld (ds_HSB),a
  139.         endm
  140.  
  141.         macro countES ;bc=(_ES)
  142.         call countXS_bc_to_ahl
  143.         ld (es_LSW),hl
  144.         ld (es_HSB),a
  145.         endm
  146.  
  147.         macro ADDSEGMENT_hl_abc_to_ahl
  148.         add hl,bc
  149.         adc a,0
  150.         xor h
  151.         and 0x3f
  152.         xor h ;a = номер страницы (%01..5432)
  153.         endm
  154.  
  155.         macro _memCS
  156.         ;ld a,h
  157.         ;ld (pc_high),a
  158.         ld bc,(cs_LSW)
  159.         ld a,(cs_HSB)
  160.         ADDSEGMENT_hl_abc_to_ahl
  161.         ld c,a
  162.         ld b,tpgs/256
  163.        ld a,h
  164.        ld (pc_high),a
  165.         res 7,h
  166.         set 6,h
  167.         ld a,(bc)
  168.         SETPG4000
  169.         endm
  170.  
  171.         macro memSS
  172.         ld bc,(ss_LSW)
  173.         ld a,(ss_HSB)
  174.         ADDSEGMENT_hl_abc_to_ahl
  175.         ld c,a
  176.         ld b,tpgs/256
  177.         set 7,h
  178.         res 6,h
  179.         ld a,(bc)
  180.         SETPG8000
  181.         endm
  182.  
  183.        if 1 ;TODO подмена сегмента!!!
  184.         macro memDS
  185.         ld bc,(ds_LSW)
  186.         ld a,(ds_HSB)
  187.         ADDSEGMENT_hl_abc_to_ahl
  188.         ld c,a
  189.         ld b,tpgs/256
  190.         ld a,h
  191.         or 0xc0
  192.         ld h,a
  193.         ld a,(bc)
  194.         SETPGC000
  195.         endm
  196.  
  197.         macro getmemDS
  198.         memDS
  199.         ld a,(hl)
  200.         endm
  201.        endif
  202.  
  203.         macro memES_nosetpg
  204.         ld bc,(es_LSW)
  205.         ld a,(es_HSB)
  206.         ADDSEGMENT_hl_abc_to_ahl
  207.         ld c,a
  208.         ld b,tpgs/256
  209.         ld a,h
  210.         or 0xc0
  211.         ld h,a
  212.         ld a,(bc)
  213.         endm
  214.  
  215.         macro putmemES
  216.         push af
  217.         memES_nosetpg
  218.         push bc
  219.         SETPGC000
  220.         pop bc
  221.         pop af
  222.         ld (hl),a
  223.         _PUTscreen_logpgc_zxaddrhl_datamhl
  224.         endm
  225.  
  226.         macro getmemES
  227.         memES_nosetpg
  228.         SETPGC000
  229.         ld a,(hl)
  230.         endm
  231.  
  232. ;TODO перехват записи в экран (call...jr/ld...ret? (+27t быстрая ветка) или ld a,hx:rla:call cc (+22t быстрая ветка), а там на выходе пропуск всего этого блока? или вообще and hx:call z? (+18t, на входе a!=0))
  233.         macro putmemspBC
  234.        if 1
  235.        push bc
  236.         ld hl,(_SP)
  237.         dec hl
  238.         dec hl
  239.         ld (_SP),hl
  240.         memSS
  241.        pop bc
  242.         ld (hl),c
  243.         inc l
  244.         call z,recountsp_inc
  245.         ld (hl),b
  246.        else
  247. ;не работает при некруглых сегментах
  248.         ld hl,(_SP)
  249.         ld a,l
  250.         sub 2
  251.         call c,putmemspBC_pp ;должна на выходе сама пропускать быструю ветку (skipsize байт ниже)
  252. _putmemspBC_base=$
  253.         ld l,a
  254.         ld (_SP),a
  255.         res 6,h
  256.         set 7,h ;0x8000+
  257.         ld (hl),c
  258.         inc l
  259.         ld (hl),b
  260. _putmemspBC_skipsize=$-_putmemspBC_base
  261.        endif
  262.         endm
  263.  
  264.         macro getmemspBC
  265.        if 1
  266.         call getmemspBCpp
  267.        else
  268. ;не работает при некруглых сегментах
  269.         LD HL,(_SP)
  270.         ld a,l
  271.         add a,2
  272.         call c,getmemspBC_pp ;должна на выходе сама пропускать быструю ветку (skipsize байт ниже)
  273. _getmemspBC_base=$
  274.         ld (_SP),a
  275.         res 6,h
  276.         set 7,h ;0x8000+
  277.         ld c,(hl)
  278.         inc l
  279.         ld b,(hl)
  280. _getmemspBC_skipsize=$-_getmemspBC_base
  281.        endif
  282.         endm
  283.  
  284.         macro encodeSP
  285.         ;ld hl,(_SP)
  286.         memSS
  287.         endm
  288.  
  289.         macro KEEPHFCFPARITYOVERFLOW_FROMA ;для математики OF надо брать из P/O!
  290.         exx
  291.         ld d,a ;parity data
  292.         ld e,0 ;overflow data
  293.         jp po,$+5
  294.         ld e,0x40
  295.         exx
  296.         ex af,af' ;'
  297.         endm
  298.  
  299.         macro KEEPCFPARITYOVERFLOW_FROMA ;для сдвигов
  300.         exx
  301.         ld d,a ;parity data
  302.          rra
  303.          ld e,a ;overflow data
  304.          rla ;restore CF
  305.         exx
  306.         ex af,af' ;'
  307.         endm
  308.  
  309.         macro KEEPLOGICCFPARITYOVERFLOW_FROMA ;для логики
  310.         exx
  311.         ld d,a ;parity data
  312.         ld e,0 ;OF=0
  313.         exx
  314.         ex af,af' ;'
  315.         endm
  316.  
  317.        if FASTADC16WITHFLAGS;AFFLAG_16BIT ;NS
  318.         macro SBCHLBC_KEEPCFPARITYOVERFLOW_FROMHL ;для математики OF надо брать из P/O!
  319.         jr c,4f;sbc_with_carry  ;7/12 ;[10]
  320. ;sbc_without_carry
  321. ;half carry part
  322.         ld a,l                  ;4
  323.         sbc a,c                 ;4      ;теряет carry !!
  324.         push af                 ;11    
  325. ;востанавливаем carry = 0
  326.         and a                           ;4
  327.         sbc hl,bc                       ;15
  328. ;half carry part
  329.         pop bc                  ;10
  330. ;save x86 flags
  331.         push af                         ;11 59
  332. ;parity
  333.         ld a,l                  ;4      A = new L
  334.         exx                     ;4
  335.         ld d,a                  ;4 12   parity data = new L
  336. ;overflow
  337.         ld e,0x00       ;7      overflow data
  338.         jp po,2f        ;10
  339.         ld e,0x40       ;7
  340. 2       exx                     ;4
  341. ;half carry part
  342.         bit 4,c                 ;8 36
  343.         jr nz,1f                        ;7 / 12
  344.         pop af                          ;10
  345.         rla                             ;4
  346.         rra                             ;4      ;Z80 HF(AF) = 0         xxx0 xxxx
  347.         ;ex af,af' ;'                   ;4 22
  348.         jp 3f
  349. ;1      pop af                          ;10
  350. ;       cpl     ;если не нужен A     ;4      ;Z80 HF(AF) = 1         xxx1 xxxx
  351. ;       ;ex af,af' ;'                   ;4 18
  352. ;       jp 3f  
  353. 4;sbc_with_carry
  354. ;half carry part
  355.         ld a,l                  ;4
  356.         sbc a,c                 ;4              ;теряет carry !!
  357.         push af                 ;11
  358. ;востанавливаем carry = 1
  359.         scf
  360.         sbc hl,bc                       ;15
  361. ;half carry part
  362.         pop bc                  ;10
  363. ;save x86 flags
  364.         push af                         ;11
  365. ;parity
  366.         ld a,l                  ;4      A = new L
  367.         exx                     ;4
  368.         ld d,a                  ;4      parity data = new L
  369. ;overflow
  370.         ld e,0x00       ;7      overflow data
  371.         jp po,2f        ;10
  372.         ld e,0x40       ;7
  373. 2       exx                     ;4
  374. ;half carry part
  375.         bit 4,c                 ;8
  376.         jr nz,1f                        ;7 / 12
  377.         pop af                          ;10
  378.         rla                             ;4
  379.         rra                             ;4      ;Z80 HF(AF) = 0         xxx0 xxxx
  380.         ;ex af,af' ;'                   ;4
  381.         jp 3f
  382. 1
  383.         pop af                          ;10
  384.         cpl     ;если не нужен A     ;4      ;Z80 HF(AF) = 1         xxx1 xxxx
  385. 3
  386.         ex af,af' ;'                    ;4 18
  387.         endm
  388.        
  389.        else
  390.         macro SBCHLBC_KEEPCFPARITYOVERFLOW_FROMHL ;для математики OF надо брать из P/O!
  391.        if AFFLAG_16BIT
  392.        sbc a,a
  393.        ld hx,a ;todo ()
  394.        ld a,l
  395.        endif
  396.         sbc hl,bc
  397.        if AFFLAG_16BIT
  398.        rla
  399.        rra ;reset HF(AF)
  400.        push af
  401.        ld b,a
  402.        endif
  403.         ld a,l
  404.         exx
  405.         ld d,a ;parity data
  406.         ld e,0 ;overflow data
  407.         jp po,$+5
  408.         ld e,0x40
  409.         exx
  410.        if AFFLAG_16BIT
  411.         ld a,c
  412.         and 0x0f
  413.         sub hx ;hx=oldCF=0/-1
  414.         ld c,a
  415.         ld a,b ;oldl
  416.         and 0x0f
  417.         sub c
  418.         jr nc,1f
  419.        pop af
  420.        cpl ;set HF(AF)
  421.        jp 2f
  422. 1
  423.        pop af
  424. 2
  425.        endif
  426.         ex af,af' ;'
  427.         endm
  428.        endif
  429.  
  430.        if FASTADC16WITHFLAGS;AFFLAG_16BIT ;NS
  431.         macro ADCHLBC_KEEPCFPARITYOVERFLOW_FROMHL ;для математики OF надо брать из P/O!
  432.         jr c,4f;adc_with_carry  ;7/12 ;[10]
  433. ;adc_without_carry
  434. ;half carry part
  435.         ld a,l                  ;4
  436.         adc a,c                 ;4      ;теряет carry !!
  437.         push af                 ;11    
  438. ;востанавливаем carry = 0
  439.         and a                           ;4
  440.         adc hl,bc                       ;15
  441. ;half carry part
  442.         pop bc                  ;10
  443. ;save x86 flags
  444.         push af                         ;11 59
  445. ;parity
  446.         ld a,l                  ;4      A = new L
  447.         exx                     ;4
  448.         ld d,a                  ;4 12   parity data = new L
  449. ;overflow
  450.         ld e,0x00       ;7      overflow data
  451.         jp po,2f        ;10
  452.         ld e,0x40       ;7
  453. 2       exx                     ;4
  454. ;half carry part
  455.         bit 4,c                 ;8 36
  456.         jr nz,1f                        ;7 / 12
  457.         pop af                          ;10
  458.         rla                             ;4
  459.         rra                             ;4      ;Z80 HF(AF) = 0         xxx0 xxxx
  460.         ;ex af,af' ;'                   ;4 22
  461.         jp 3f
  462. ;1      pop af                          ;10
  463. ;       cpl     ;если не нужен A     ;4      ;Z80 HF(AF) = 1         xxx1 xxxx
  464. ;       ;ex af,af' ;'                   ;4 18
  465. ;       jp 3f  
  466. 4;adc_with_carry
  467. ;half carry part
  468.         ld a,l                  ;4
  469.         adc a,c                 ;4              ;теряет carry !!
  470.         push af                 ;11
  471. ;востанавливаем carry = 1
  472.         scf
  473.         adc hl,bc                       ;15
  474. ;half carry part
  475.         pop bc                  ;10
  476. ;save x86 flags
  477.         push af                         ;11
  478. ;parity
  479.         ld a,l                  ;4      A = new L
  480.         exx                     ;4
  481.         ld d,a                  ;4      parity data = new L
  482. ;overflow
  483.         ld e,0x00       ;7      overflow data
  484.         jp po,2f        ;10
  485.         ld e,0x40       ;7
  486. 2       exx                     ;4
  487. ;half carry part
  488.         bit 4,c                 ;8
  489.         jr nz,1f                        ;7 / 12
  490.         pop af                          ;10
  491.         rla                             ;4
  492.         rra                             ;4      ;Z80 HF(AF) = 0         xxx0 xxxx
  493.         ;ex af,af' ;'                   ;4
  494.         jp 3f
  495. 1
  496.         pop af                          ;10
  497.         cpl     ;если не нужен A     ;4      ;Z80 HF(AF) = 1         xxx1 xxxx
  498. 3
  499.         ex af,af' ;'                    ;4 18
  500.         endm
  501.        
  502.        else
  503.         macro ADCHLBC_KEEPCFPARITYOVERFLOW_FROMHL ;для математики OF надо брать из P/O!
  504.        if AFFLAG_16BIT
  505.        sbc a,a
  506.        ld hx,a ;todo ()
  507.        ld a,l
  508.        endif
  509.         adc hl,bc
  510.        if AFFLAG_16BIT
  511.        rla
  512.        rra ;reset HF(AF)
  513.        push af
  514.        ld b,a
  515.        endif
  516.         ld a,l
  517.         exx
  518.         ld d,a ;parity data
  519.         ld e,0 ;overflow data
  520.         jp po,$+5
  521.         ld e,0x40
  522.         exx
  523.        if AFFLAG_16BIT
  524.         ld a,c
  525.         and 0x0f
  526.         sub hx ;hx=oldCF=0/-1
  527.         ld c,a
  528.         ld a,b ;oldl
  529.         or 0xf0
  530.         add a,c
  531.         jr nc,1f
  532.        pop af
  533.        cpl ;set HF(AF)
  534.        jp 2f
  535. 1
  536.        pop af
  537. 2
  538.        endif
  539.         ex af,af' ;'
  540.         endm
  541.        endif
  542.  
  543.         macro KEEPLOGICCFPARITYOVERFLOW_FROMHL_AisH
  544.         ;or l ;CF=0 ;ZF=(hl==0) ;TODO sign
  545. ;чтобы правильно сформировать ZF,SF по h,l:
  546. ;если c!=0, то set 0,b
  547.        ld a,l
  548.        add a,0xff
  549.        sbc a,a ;CF=(c!=0)
  550.        and d;1 ;any number 1..0x7f
  551.        or h ;CF=0 ;ZF=(bc==0)
  552.         ex af,af' ;'
  553.         ld a,l
  554.         exx
  555.         ld d,a ;parity data
  556.         ld e,0 ;OF=0
  557.         exx
  558.         endm
  559.  
  560.         macro KEEPLOGICCFPARITYOVERFLOW_FROMBC_AisB
  561.         ;or c ;CF=0 ;ZF=(bc==0) ;TODO sign
  562. ;чтобы правильно сформировать ZF,SF по b,c:
  563. ;если c!=0, то set 0,b
  564.        ld a,c
  565.        add a,0xff
  566.        sbc a,a ;CF=(c!=0)
  567.        and d;1 ;any number 1..0x7f
  568.        or b ;CF=0 ;ZF=(bc==0)
  569.         ex af,af' ;'
  570.         ld a,c
  571.         exx
  572.         ld d,a ;parity data
  573.         ld e,0 ;OF=0
  574.         exx
  575.         endm
  576.  
  577.        if 1;AFFLAG_16BIT
  578. ;inc - Adds 1 to the destination operand, while preserving the state of the CF flag.
  579. ;The OF, SF, ZF, AF, and PF flags are set according to the result.
  580.         macro inchlwithflags ;keep CY
  581.         ex af,af' ;'
  582.         inc l
  583.         ld a,l
  584.         exx
  585.         ld d,a ;parity data
  586.         ld e,0 ;overflow data
  587.         exx
  588.         call pe,inchlwithflags_l80 ;fix SF
  589.         call z,inchlwithflags_l00 ;inc h needed
  590.         ex af,af' ;'
  591.         endm ;57t in most cases
  592.        
  593.         macro incbcwithflags ;keep CY
  594.         ex af,af' ;'
  595.         inc c
  596.         ld a,c
  597.         exx
  598.         ld d,a ;parity data
  599.         ld e,0 ;overflow data
  600.         exx
  601.         call pe,incbcwithflags_c80 ;fix SF
  602.         call z,incbcwithflags_c00 ;inc b needed
  603.         ex af,af' ;'
  604.         endm ;57t in most cases
  605.        
  606.         macro dechlwithflags ;keep CY
  607.         call dechlwithflags_fixflags ;z/nz - separate branches
  608.         ex af,af' ;'
  609.         endm ;21+63 = 84t in most cases
  610.        
  611.         macro decbcwithflags ;keep CY
  612.         call decbcwithflags_fixflags ;z/nz - separate branches
  613.         ex af,af' ;'
  614.         endm ;21+63 = 84t in most cases
  615.  
  616.        else ;no AF
  617.  
  618. ;inc - Adds 1 to the destination operand, while preserving the state of the CF flag.
  619. ;The OF, SF, ZF, AF, and PF flags are set according to the result.
  620.         macro incwithflags ;keep CY
  621.         ex af,af' ;'
  622.        sbc a,a ;keep CF
  623.         or a
  624.         adc hl,bc ;ZF,SF
  625.        rra ;old CF
  626.         ld a,l
  627.         exx
  628.         ld e,0 ;overflow data
  629.         jp po,$+5
  630.         ld e,0x40
  631.         ld d,a ;PF
  632.         exx
  633.         ex af,af' ;'
  634.         endm
  635.  
  636.         macro inchlwithflags ;keep CY
  637.         ld bc,1
  638.         incwithflags
  639.         endm ;81.5t
  640.  
  641.         macro incbcwithflags ;keep CY
  642.         ld hl,1
  643.         incwithflags
  644.         ld b,h
  645.         ld c,l
  646.         endm ;89.5t
  647.  
  648.         macro dechlwithflags ;keep CY
  649.         ld bc,1
  650.         ex af,af' ;'
  651.        sbc a,a ;keep CF
  652.         or a
  653.         sbc hl,bc ;ZF,SF
  654.        rra ;old CF
  655.         ld a,l
  656.         exx
  657.         ld e,0 ;overflow data
  658.         jp po,$+5
  659.         ld e,0x40
  660.         ld d,a ;PF
  661.         exx
  662.         ex af,af' ;'
  663.         endm ;81.5t < 84t with call
  664.  
  665.         macro decbcwithflags ;keep CY
  666.         ld h,b
  667.         ld l,c
  668.         dechlwithflags
  669.         ld b,h
  670.         ld c,l
  671.         endm ;97.5t
  672.  
  673.        endif
  674.