?login_element?

Subversion Repositories NedoOS

Rev

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

  1.         DEVICE ZXSPECTRUM1024
  2.         include "../_sdk/sys_h.asm"
  3.  
  4. STACK=0x4000
  5.  
  6.        if 0
  7. BASIC=0
  8.        if BASIC
  9. STARTPC=0x7c00
  10.        else
  11. STARTPC=0x0100
  12.        endif
  13.        endif
  14.  
  15. SHIFTCOUNTMASK=1 ;and 31
  16. AFFLAG_16BIT=1 ;only for add_test
  17. FASTADC16WITHFLAGS=0 ;NS
  18.  
  19. ;PC=0x4000...
  20. ;SP=0x8000...
  21. ;data=0xC000...
  22.  
  23.        macro ALIGNrm
  24.         align 2
  25.        endm
  26.  
  27.        macro _PUTscreen_logpgc_zxaddrhl_datamhl_keephlpg
  28.         ld b,tscreenpgs/256
  29.         ld a,(bc)
  30.         cp b
  31.         call nz,PUTscreen_logpgc_zxaddrhl_datamhl_keephlpg_do
  32.        endm
  33.  
  34.        macro _PUTscreen_logpgc_zxaddrhl_datamhl
  35.         ld b,tscreenpgs/256
  36.         ld a,(bc)
  37.         cp b
  38.         call nz,PUTscreen_logpgc_zxaddrhl_datamhl_do
  39.        endm
  40.  
  41.         MACRO _Loop_
  42.         JP (IY) ;EMULOOP (нужный marg или нужный обработчик b/p)
  43.         ENDM
  44.  
  45. ;если вместо стр.команд включили др.стр.
  46.         MACRO _LoopC
  47.         ;OUTcom
  48.         JP (IY)
  49.         ENDM
  50.  
  51. ;если резко сменился PC (полный DE)
  52.         MACRO _LoopJP
  53.         encodePC;CALCiypgcom
  54.         JP (IY)
  55.         ENDM
  56.  
  57. ;если выключили др.стр. и резко сменился PC (полный DE)
  58.         MACRO _LoopC_JP
  59.         encodePC;CALCiypgcom
  60.         JP (IY)
  61.         ENDM
  62.  
  63. ;если резко сменился PC (полный DE в той же странице)
  64.         MACRO _LoopC_JPoldpg
  65.        set 6,d
  66.        res 7,d ;4000+
  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.         endm
  83.  
  84.         macro encodePC
  85.         ld h,d
  86.         ld l,e
  87.         memCS
  88.         res 7,d
  89.         set 6,d ;0x4000+
  90.         endm
  91.  
  92.         macro get
  93.         ld a,(de)
  94.         endm
  95.  
  96.         macro next
  97.         inc e
  98.         call z,recountpc_inc ;keep CY!
  99.         endm
  100.  
  101.         macro getHL
  102.         get
  103.         next
  104.         ld l,a
  105.         get
  106.         next
  107.         ld h,a
  108.         endm
  109.  
  110.         macro getBC
  111.         get
  112.         next
  113.         ld c,a
  114.         get
  115.         next
  116.         ld b,a
  117.         endm
  118.  
  119.         macro countSS ;bc=(_SS)
  120.         call countXS_bc_to_ahl
  121.         ld (ss_LSW),hl
  122.         ld (ss_HSB),a
  123.         endm
  124.  
  125.         macro countCS ;bc=(_CS)
  126.         call countXS_bc_to_ahl
  127.         ld (cs_LSW),hl
  128.         ld (cs_HSB),a
  129.         endm
  130.  
  131.         macro countDS ;bc=(_DS)
  132.         call countXS_bc_to_ahl
  133.         ld (ds_LSW),hl
  134.         ld (ds_HSB),a
  135.         endm
  136.  
  137.         macro countES ;bc=(_ES)
  138.         call countXS_bc_to_ahl
  139.         ld (es_LSW),hl
  140.         ld (es_HSB),a
  141.         endm
  142.  
  143.         macro ADDSEGMENT_hl_abc_to_ahl
  144.         add hl,bc
  145.         adc a,0
  146.         xor h
  147.         and 0x3f
  148.         xor h ;a = номер страницы (%01..5432)
  149.         endm
  150.  
  151.         macro memCS
  152.         ld a,h
  153.         ld (pc_high),a
  154.         ld bc,(cs_LSW)
  155.         ld a,(cs_HSB)
  156.         ADDSEGMENT_hl_abc_to_ahl
  157.         ld c,a
  158.         ld b,tpgs/256
  159.         res 7,h
  160.         set 6,h
  161.         ld a,(bc)
  162.         SETPG4000
  163.         endm
  164.  
  165.         macro memSS
  166.         ld bc,(ss_LSW)
  167.         ld a,(ss_HSB)
  168.         ADDSEGMENT_hl_abc_to_ahl
  169.         ld c,a
  170.         ld b,tpgs/256
  171.         set 7,h
  172.         res 6,h
  173.         ld a,(bc)
  174.         SETPG8000
  175.         endm
  176.  
  177.        if 1 ;TODO подмена сегмента!!!
  178.         macro memDS
  179.         ld bc,(ds_LSW)
  180.         ld a,(ds_HSB)
  181.         ADDSEGMENT_hl_abc_to_ahl
  182.         ld c,a
  183.         ld b,tpgs/256
  184.         ld a,h
  185.         or 0xc0
  186.         ld h,a
  187.         ld a,(bc)
  188.         SETPGC000
  189.         endm
  190.  
  191.         macro getmemDS
  192.         memDS
  193.         ld a,(hl)
  194.         endm
  195.        endif
  196.  
  197.         macro memES_nosetpg
  198.         ld bc,(es_LSW)
  199.         ld a,(es_HSB)
  200.         ADDSEGMENT_hl_abc_to_ahl
  201.         ld c,a
  202.         ld b,tpgs/256
  203.         ld a,h
  204.         or 0xc0
  205.         ld h,a
  206.         ld a,(bc)
  207.         endm
  208.  
  209.         macro putmemES
  210.         push af
  211.         memES_nosetpg
  212.         push bc
  213.         SETPGC000
  214.         pop bc
  215.         pop af
  216.         ld (hl),a
  217.         _PUTscreen_logpgc_zxaddrhl_datamhl
  218.         endm
  219.  
  220.         macro getmemES
  221.         memES_nosetpg
  222.         SETPGC000
  223.         ld a,(hl)
  224.         endm
  225.  
  226. ;TODO перехват записи в экран (call...jr/ld...ret? (+27t быстрая ветка) или ld a,hx:rla:call cc (+22t быстрая ветка), а там на выходе пропуск всего этого блока? или вообще and hx:call z? (+18t, на входе a!=0))
  227.         macro putmemspBC
  228.         ld hl,(_SP)
  229.         ld a,l
  230.         sub 2
  231.         call c,putmemspBC_pp ;должна на выходе сама пропускать быструю ветку (skipsize байт ниже)
  232. _putmemspBC_base=$
  233.         ld l,a
  234.         ld (_SP),a
  235.         res 6,h
  236.         set 7,h ;0x8000+
  237.         ld (hl),c
  238.         inc l
  239.         ld (hl),b
  240. _putmemspBC_skipsize=$-_putmemspBC_base
  241.         endm
  242.  
  243.         macro getmemspBC
  244.         LD HL,(_SP)
  245.         ld a,l
  246.         add a,2
  247.         call c,getmemspBC_pp ;должна на выходе сама пропускать быструю ветку (skipsize байт ниже)
  248. _getmemspBC_base=$
  249.         ld (_SP),a
  250.         res 6,h
  251.         set 7,h ;0x8000+
  252.         ld c,(hl)
  253.         inc l
  254.         ld b,(hl)
  255. _getmemspBC_skipsize=$-_getmemspBC_base
  256.         endm
  257.  
  258.         macro encodeSP
  259.         ;ld hl,(_SP)
  260.         memSS
  261.         endm
  262.  
  263.         macro KEEPHFCFPARITYOVERFLOW_FROMA ;для математики OF надо брать из P/O!
  264.         exx
  265.         ld d,a ;parity data
  266.         ld e,0 ;overflow data
  267.         jp po,$+5
  268.         ld e,0x40
  269.         exx
  270.         ex af,af' ;'
  271.         endm
  272.  
  273.         macro KEEPCFPARITYOVERFLOW_FROMA ;для сдвигов
  274.         exx
  275.         ld d,a ;parity data
  276.          rra
  277.          ld e,a ;overflow data
  278.          rla ;restore CF
  279.         exx
  280.         ex af,af' ;'
  281.         endm
  282.  
  283.         macro KEEPLOGICCFPARITYOVERFLOW_FROMA ;для логики
  284.         exx
  285.         ld d,a ;parity data
  286.         ld e,0 ;OF=0
  287.         exx
  288.         ex af,af' ;'
  289.         endm
  290.  
  291.        if FASTADC16WITHFLAGS;AFFLAG_16BIT ;NS
  292.         macro SBCHLBC_KEEPCFPARITYOVERFLOW_FROMHL ;для математики OF надо брать из P/O!
  293.         jr c,4f;sbc_with_carry  ;7/12 ;[10]
  294. ;sbc_without_carry
  295. ;half carry part
  296.         ld a,l                  ;4
  297.         sbc a,c                 ;4      ;теряет carry !!
  298.         push af                 ;11    
  299. ;востанавливаем carry = 0
  300.         and a                           ;4
  301.         sbc hl,bc                       ;15
  302. ;half carry part
  303.         pop bc                  ;10
  304. ;save x86 flags
  305.         push af                         ;11 59
  306. ;parity
  307.         ld a,l                  ;4      A = new L
  308.         exx                     ;4
  309.         ld d,a                  ;4 12   parity data = new L
  310. ;overflow
  311.         ld e,0x00       ;7      overflow data
  312.         jp po,2f        ;10
  313.         ld e,0x40       ;7
  314. 2       exx                     ;4
  315. ;half carry part
  316.         bit 4,c                 ;8 36
  317.         jr nz,1f                        ;7 / 12
  318.         pop af                          ;10
  319.         rla                             ;4
  320.         rra                             ;4      ;Z80 HF(AF) = 0         xxx0 xxxx
  321.         ;ex af,af' ;'                   ;4 22
  322.         jp 3f
  323. ;1      pop af                          ;10
  324. ;       cpl     ;если не нужен A     ;4      ;Z80 HF(AF) = 1         xxx1 xxxx
  325. ;       ;ex af,af' ;'                   ;4 18
  326. ;       jp 3f  
  327. 4;sbc_with_carry
  328. ;half carry part
  329.         ld a,l                  ;4
  330.         sbc a,c                 ;4              ;теряет carry !!
  331.         push af                 ;11
  332. ;востанавливаем carry = 1
  333.         scf
  334.         sbc hl,bc                       ;15
  335. ;half carry part
  336.         pop bc                  ;10
  337. ;save x86 flags
  338.         push af                         ;11
  339. ;parity
  340.         ld a,l                  ;4      A = new L
  341.         exx                     ;4
  342.         ld d,a                  ;4      parity data = new L
  343. ;overflow
  344.         ld e,0x00       ;7      overflow data
  345.         jp po,2f        ;10
  346.         ld e,0x40       ;7
  347. 2       exx                     ;4
  348. ;half carry part
  349.         bit 4,c                 ;8
  350.         jr nz,1f                        ;7 / 12
  351.         pop af                          ;10
  352.         rla                             ;4
  353.         rra                             ;4      ;Z80 HF(AF) = 0         xxx0 xxxx
  354.         ;ex af,af' ;'                   ;4
  355.         jp 3f
  356. 1
  357.         pop af                          ;10
  358.         cpl     ;если не нужен A     ;4      ;Z80 HF(AF) = 1         xxx1 xxxx
  359. 3
  360.         ex af,af' ;'                    ;4 18
  361.         endm
  362.        
  363.        else
  364.         macro SBCHLBC_KEEPCFPARITYOVERFLOW_FROMHL ;для математики OF надо брать из P/O!
  365.        if AFFLAG_16BIT
  366.        sbc a,a
  367.        ld hx,a ;todo ()
  368.        ld a,l
  369.        endif
  370.         sbc hl,bc
  371.        if AFFLAG_16BIT
  372.        rla
  373.        rra ;reset HF(AF)
  374.        push af
  375.        ld b,a
  376.        endif
  377.         ld a,l
  378.         exx
  379.         ld d,a ;parity data
  380.         ld e,0 ;overflow data
  381.         jp po,$+5
  382.         ld e,0x40
  383.         exx
  384.        if AFFLAG_16BIT
  385.         ld a,c
  386.         and 0x0f
  387.         sub hx ;hx=oldCF=0/-1
  388.         ld c,a
  389.         ld a,b ;oldl
  390.         and 0x0f
  391.         sub c
  392.         jr nc,1f
  393.        pop af
  394.        cpl ;set HF(AF)
  395.        jp 2f
  396. 1
  397.        pop af
  398. 2
  399.        endif
  400.         ex af,af' ;'
  401.         endm
  402.        endif
  403.  
  404.        if FASTADC16WITHFLAGS;AFFLAG_16BIT ;NS
  405.         macro ADCHLBC_KEEPCFPARITYOVERFLOW_FROMHL ;для математики OF надо брать из P/O!
  406.         jr c,4f;adc_with_carry  ;7/12 ;[10]
  407. ;adc_without_carry
  408. ;half carry part
  409.         ld a,l                  ;4
  410.         adc a,c                 ;4      ;теряет carry !!
  411.         push af                 ;11    
  412. ;востанавливаем carry = 0
  413.         and a                           ;4
  414.         adc hl,bc                       ;15
  415. ;half carry part
  416.         pop bc                  ;10
  417. ;save x86 flags
  418.         push af                         ;11 59
  419. ;parity
  420.         ld a,l                  ;4      A = new L
  421.         exx                     ;4
  422.         ld d,a                  ;4 12   parity data = new L
  423. ;overflow
  424.         ld e,0x00       ;7      overflow data
  425.         jp po,2f        ;10
  426.         ld e,0x40       ;7
  427. 2       exx                     ;4
  428. ;half carry part
  429.         bit 4,c                 ;8 36
  430.         jr nz,1f                        ;7 / 12
  431.         pop af                          ;10
  432.         rla                             ;4
  433.         rra                             ;4      ;Z80 HF(AF) = 0         xxx0 xxxx
  434.         ;ex af,af' ;'                   ;4 22
  435.         jp 3f
  436. ;1      pop af                          ;10
  437. ;       cpl     ;если не нужен A     ;4      ;Z80 HF(AF) = 1         xxx1 xxxx
  438. ;       ;ex af,af' ;'                   ;4 18
  439. ;       jp 3f  
  440. 4;adc_with_carry
  441. ;half carry part
  442.         ld a,l                  ;4
  443.         adc a,c                 ;4              ;теряет carry !!
  444.         push af                 ;11
  445. ;востанавливаем carry = 1
  446.         scf
  447.         adc hl,bc                       ;15
  448. ;half carry part
  449.         pop bc                  ;10
  450. ;save x86 flags
  451.         push af                         ;11
  452. ;parity
  453.         ld a,l                  ;4      A = new L
  454.         exx                     ;4
  455.         ld d,a                  ;4      parity data = new L
  456. ;overflow
  457.         ld e,0x00       ;7      overflow data
  458.         jp po,2f        ;10
  459.         ld e,0x40       ;7
  460. 2       exx                     ;4
  461. ;half carry part
  462.         bit 4,c                 ;8
  463.         jr nz,1f                        ;7 / 12
  464.         pop af                          ;10
  465.         rla                             ;4
  466.         rra                             ;4      ;Z80 HF(AF) = 0         xxx0 xxxx
  467.         ;ex af,af' ;'                   ;4
  468.         jp 3f
  469. 1
  470.         pop af                          ;10
  471.         cpl     ;если не нужен A     ;4      ;Z80 HF(AF) = 1         xxx1 xxxx
  472. 3
  473.         ex af,af' ;'                    ;4 18
  474.         endm
  475.        
  476.        else
  477.         macro ADCHLBC_KEEPCFPARITYOVERFLOW_FROMHL ;для математики OF надо брать из P/O!
  478.        if AFFLAG_16BIT
  479.        sbc a,a
  480.        ld hx,a ;todo ()
  481.        ld a,l
  482.        endif
  483.         adc hl,bc
  484.        if AFFLAG_16BIT
  485.        rla
  486.        rra ;reset HF(AF)
  487.        push af
  488.        ld b,a
  489.        endif
  490.         ld a,l
  491.         exx
  492.         ld d,a ;parity data
  493.         ld e,0 ;overflow data
  494.         jp po,$+5
  495.         ld e,0x40
  496.         exx
  497.        if AFFLAG_16BIT
  498.         ld a,c
  499.         and 0x0f
  500.         sub hx ;hx=oldCF=0/-1
  501.         ld c,a
  502.         ld a,b ;oldl
  503.         or 0xf0
  504.         add a,c
  505.         jr nc,1f
  506.        pop af
  507.        cpl ;set HF(AF)
  508.        jp 2f
  509. 1
  510.        pop af
  511. 2
  512.        endif
  513.         ex af,af' ;'
  514.         endm
  515.        endif
  516.  
  517.         macro KEEPLOGICCFPARITYOVERFLOW_FROMHL_AisH
  518.         or l ;CF=0 ;ZF=(hl==0) ;TODO sign
  519.         ex af,af' ;'
  520.         ld a,l
  521.         exx
  522.         ld d,a ;parity data
  523.         ld e,0 ;OF=0
  524.         exx
  525.         endm
  526.  
  527.         macro KEEPLOGICCFPARITYOVERFLOW_FROMBC_AisB
  528.         or c ;CF=0 ;ZF=(bc==0) ;TODO sign
  529.         ex af,af' ;'
  530.         ld a,c
  531.         exx
  532.         ld d,a ;parity data
  533.         ld e,0 ;OF=0
  534.         exx
  535.         endm
  536.  
  537.        if 1;AFFLAG_16BIT
  538. ;inc - Adds 1 to the destination operand, while preserving the state of the CF flag.
  539. ;The OF, SF, ZF, AF, and PF flags are set according to the result.
  540.         macro inchlwithflags ;keep CY
  541.         ex af,af' ;'
  542.         inc l
  543.         ld a,l
  544.         exx
  545.         ld d,a ;parity data
  546.         ld e,0 ;overflow data
  547.         exx
  548.         call pe,inchlwithflags_l80 ;fix SF
  549.         call z,inchlwithflags_l00 ;inc h needed
  550.         ex af,af' ;'
  551.         endm ;57t in most cases
  552.        
  553.         macro incbcwithflags ;keep CY
  554.         ex af,af' ;'
  555.         inc c
  556.         ld a,c
  557.         exx
  558.         ld d,a ;parity data
  559.         ld e,0 ;overflow data
  560.         exx
  561.         call pe,incbcwithflags_c80 ;fix SF
  562.         call z,incbcwithflags_c00 ;inc b needed
  563.         ex af,af' ;'
  564.         endm ;57t in most cases
  565.        
  566.         macro dechlwithflags ;keep CY
  567.         call dechlwithflags_fixflags ;z/nz - separate branches
  568.         ex af,af' ;'
  569.         endm ;21+63 = 84t in most cases
  570.        
  571.         macro decbcwithflags ;keep CY
  572.         call decbcwithflags_fixflags ;z/nz - separate branches
  573.         ex af,af' ;'
  574.         endm ;21+63 = 84t in most cases
  575.  
  576.        else ;no AF
  577.  
  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 incwithflags ;keep CY
  581.         ex af,af' ;'
  582.        sbc a,a ;keep CF
  583.         or a
  584.         adc hl,bc ;ZF,SF
  585.        rra ;old CF
  586.         ld a,l
  587.         exx
  588.         ld e,0 ;overflow data
  589.         jp po,$+5
  590.         ld e,0x40
  591.         ld d,a ;PF
  592.         exx
  593.         ex af,af' ;'
  594.         endm
  595.  
  596.         macro inchlwithflags ;keep CY
  597.         ld bc,1
  598.         incwithflags
  599.         endm ;81.5t
  600.  
  601.         macro incbcwithflags ;keep CY
  602.         ld hl,1
  603.         incwithflags
  604.         ld b,h
  605.         ld c,l
  606.         endm ;89.5t
  607.  
  608.         macro dechlwithflags ;keep CY
  609.         ld bc,1
  610.         ex af,af' ;'
  611.        sbc a,a ;keep CF
  612.         or a
  613.         sbc hl,bc ;ZF,SF
  614.        rra ;old CF
  615.         ld a,l
  616.         exx
  617.         ld e,0 ;overflow data
  618.         jp po,$+5
  619.         ld e,0x40
  620.         ld d,a ;PF
  621.         exx
  622.         ex af,af' ;'
  623.         endm ;81.5t < 84t with call
  624.  
  625.         macro decbcwithflags ;keep CY
  626.         ld h,b
  627.         ld l,c
  628.         dechlwithflags
  629.         ld b,h
  630.         ld c,l
  631.         endm ;97.5t
  632.  
  633.        endif
  634.  
  635.         org PROGSTART
  636. begin
  637.         ld hl,COMMANDLINE ;command line
  638.         call skipword
  639.         call skipspaces
  640.         ld a,(hl)
  641.         or a
  642.         jr z,noautoload
  643. ;command line = "x86 <file to load>"
  644.        ld (filenameaddr),hl
  645.        ld hl,0x100
  646.        ld (loadaddr),hl
  647.        jr autoloadq
  648. noautoload
  649.         ld de,path
  650.         OS_CHDIR
  651. autoloadq
  652.         jp init
  653. initq
  654. Reset      
  655.         ld de,ansipal
  656.         OS_SETPAL ;TODO с копированием во временную палитру
  657.  
  658.         ld bc,0
  659.         ld (_SS),bc
  660.         countSS
  661.         ld hl,0x7f00
  662.         ld (_SP),hl
  663.         encodeSP
  664.        
  665.         ld bc,0xf000
  666.         ld (_CS),bc
  667.         countCS      
  668.         ld de,0xe000
  669.         encodePC;memCS ;out: a=physpg, de=zxaddr
  670.         ex de,hl
  671.         ld de,trom0
  672. ;de=имя файла
  673. ;hl=куда грузим
  674.         call loadfile_in_hl
  675.  
  676.         ld de,0xfff0
  677.  
  678.        if 1
  679.         ld bc,0
  680.         ld (_CS),bc
  681.         countCS
  682. loadaddr=$+1
  683.         ld de,0x7c00;STARTPC
  684.        push de
  685.         encodePC;memCS ;out: a=physpg, de=zxaddr
  686.         ex de,hl
  687. filenameaddr=$+1
  688.         ld de,tprog
  689. ;de=имя файла
  690. ;hl=куда грузим
  691.         call loadfile_in_hl
  692.        pop de ;LD DE,STARTPC ;=IP(PC)
  693.        endif
  694.        
  695.        
  696.         LD IY,EMUCHECKQ
  697.         ;EI
  698.        _LoopC_JP
  699.  
  700. quiter
  701.         call swapimer ;сначала прерывания ничего не делают (iff0==0)
  702.         QUIT
  703.        
  704.        if 0
  705. jpiyer
  706.         ld hl,jpiyer
  707.         push hl
  708.         jp (iy)
  709.        endif
  710.  
  711.        if 1 ;debug
  712. oldpc
  713.         dw 0
  714.        endif
  715.  
  716. EMUCHECKQ
  717.        if 1 ;debug
  718.        ;ld a,d
  719.        ;sub 0x40+((STARTPC/256)&0x3f);0x7c
  720.        ;cp 0x3f
  721.        ;jr nc,$
  722.        ;ld a,(_SP)
  723.        ;rra
  724.        ;jr c,$
  725.        ld (oldpc),de
  726.        endif
  727.         get
  728.         next
  729.         LD L,A
  730.         ld H,MAINCOMS/256
  731.         LD b,(HL)
  732.         INC H
  733.         LD H,(HL)
  734.         ld L,b ;чётный для всех rm-команд
  735.         JP (HL)
  736.  
  737. clpga
  738.         SETPGC000
  739.         ld hl,0xc000
  740.         ld d,h
  741.         ld e,l
  742.         inc e
  743.         ld bc,0x3fff
  744.         ld (hl),l;0
  745.         ldir
  746.         ret    
  747.  
  748. ;de=имя файла
  749. ;hl=куда грузим
  750. loadfile_in_hl
  751.         push hl ;куда грузим
  752.         OS_OPENHANDLE
  753.         pop de ;куда грузим
  754.         push bc ;b=handle
  755.         ld h,0x7f ;столько грузим (если столько есть в файле)
  756.         OS_READHANDLE
  757.         pop bc ;b=handle
  758.         OS_CLOSEHANDLE
  759.         ret
  760.  
  761. trom0
  762.         db "compaq.bin",0 ;грузить в F000:E000, запускать с FFF0?
  763. tprog
  764.         db "atomchess.img",0 ;Его надо запускать в 0:7C00h, требует функции bios int 10h, 16h, 20h(system)
  765.         ;db "basic.img",0 ;Его надо запускать в 0:7C00h, требует функции bios int 10h, 16h, 20h(system)
  766.         ;db "lander.img",0 ;Его надо запускать в 0:0100h, требует функции bios int 10h, 21h(allocate, vectors)
  767.         ;db "ladybug.img",0 ;Его надо запускать в 0:0100h, требует функции bios int 10h, 20h(system)
  768.         ;db "megapole.img",0 ;Его надо запускать в 0:0100h, требует bios int 10h, 21h#9 (print)
  769.         ;DB "pc102782.bin",0
  770.  
  771. pgprog
  772.         db 0 ;TODO там можно хранить дополнительный код (напр., отладчик)
  773.  
  774. ;keep here for quit
  775. swapimer
  776.         di
  777.         ld de,0x0038
  778.         ld hl,oldimer
  779.         ld bc,3
  780. swapimer0
  781.         ld a,(de)
  782.         ldi ;[oldimer] -> [0x0038]
  783.         dec hl
  784.         ld (hl),a ;[0x0038] -> [oldimer]
  785.         inc hl
  786.         jp pe,swapimer0
  787.         ei
  788.         ret
  789. oldimer
  790.         jp on_int
  791.         jp 0x0038+3
  792.  
  793. on_int
  794.         PUSH AF,HL
  795.         push bc,de
  796.         exx
  797.         push bc
  798.         push de
  799.         push hl
  800.         push ix
  801.         push iy
  802.         ex af,af' ;'
  803.         push af
  804.         call oldimer
  805.         ld hl,(timer)
  806.         inc hl
  807.         ld (timer),hl
  808.        ld a,0xf7
  809.        in a,(0xfe)
  810.        and 0b10101
  811.        jp z,quiter ;1+2+3 = quit
  812.         ;OS_GETKEY
  813. ;        A - код символа(кнопки). Допустимые коды смотри в 'sysdefs.asm' секция 'Usable key codes'
  814. ;        C - код символа(кнопки) без учета текущего языкового модификатора. Как правило, используется для обработки "горячих кнопок"
  815. ;        DE - позиция мыши (y,x) (возвращает 0 при отсутствии фокуса)
  816. ;        L - кнопки мыши (bits 0(LMB),1(RMB),2(MMB): 0=pressed; bits 7..4=положение колёсика)
  817. ;        LX - Kempston joystick (0bP2JFUDLR): 1=pressed, - при отсутствии джойстика 0 (а не 0xff)
  818. ;        Флаг Z - если 0(NZ), то отсутствует фокус.  
  819.         pop af
  820.         ex af,af' ;'
  821.         pop iy
  822.         pop ix
  823.         pop hl
  824.         pop de
  825.         pop bc
  826.         exx
  827.         pop de,bc
  828.        LD A,(iff1)
  829.        OR A
  830.        jr NZ,IMEREI
  831.         POP HL,AF
  832.         EI
  833.        RET
  834.  
  835. IMEREI
  836.         XOR A
  837.         LD (iff1),A
  838.         LD (iff2),A ;для NMI надо только iff1!
  839. ;перед эмуляцией INT завершаем тек.команду (перехват на EMULOOP)
  840.         LD (keepemuchecker),IY
  841.         LD IY,IMINT
  842.         POP HL,AF
  843.         RET  ;di!
  844.  
  845. IMINT
  846. keepemuchecker=$+2
  847.         LD IY,0
  848.        ;LD (retfromim),DE ;для индикации времени обработки прерыв
  849.         LD HL,#38 ;new IP(PC) ;TODO из вектора
  850.         ;LD HL,(_I-1)
  851.         ;LD L,#FF ;состояние пассивной ШД
  852.         ;getmemBC
  853.         ;ld h,b
  854.         ;ld l,c
  855.         ;JR IMERIM
  856. IMERIM
  857. ;hl=new IP(PC)
  858.         EI
  859.        decodePC ;de=old IP(PC)
  860.         ex de,hl ;DE=new IP(PC)
  861.         LD B,H
  862.         ld C,L ;BC=old IP(PC)
  863.         putmemspBC ;TODO а CS куда? push cs; push ip?
  864.        _LoopC_JP
  865.  
  866.        if 1;AFFLAG_16BIT
  867. ;как сформировать ZF,SF, не трогая AF?
  868. ;для этого надо сформировать число с нужными свойствами и сделать inc
  869.          ;ZF SF AF OF
  870. ;ff даёт  1  0  1  0 ;имитирует флаги после inc ffff
  871. ;7f даёт  0  1  1  1 ;имитирует флаги после inc 7fff
  872. ;80 даёт  0  1  0  0 ;имитирует флаги после inc 8000
  873. ;8f даёт  0  1  1  0 ;имитирует флаги после inc 800f
  874. ;т.е. ff, 7f надо формировать только для 7fff, ffff
  875. ;а в остальных случаях надо брать (h&0x80) + (l&0x08)
  876. ;если l!=ff, l!=7f, то можно просто сделать inc l
  877. ;если l=ff, то нельзя просто сделать inc h - запортится AF!
  878. inchlwithflags_l00 ;inc h needed
  879.         inc h
  880.         ret z ;set ZF=1(ok), AF=1(ok), OF=0(ok)
  881.         jp pe,inchlwithflags_overflow
  882. inchlwithflags_a0_setAF ;set ZF=0(ok), SF=h7(ok), AF=1, keep CY
  883. ;a=0
  884.         jp m,$+5
  885.         ld a,0x80 ;after dec: a7=h7
  886.         dec a ;set ZF=0, SF=h7, AF=1, keep CY
  887.         ret
  888. incbcwithflags_c00 ;inc b needed
  889.         inc b
  890.         ret z ;set ZF=1(ok), AF=1(ok), OF=0(ok)
  891.         jp po,inchlwithflags_a0_setAF
  892. inchlwithflags_overflow
  893.         exx
  894.         ld e,0x80 ;overflow (e7!=e6)
  895.         exx
  896.         ret
  897.  
  898. inchlwithflags_l80 ;fix SF, keep AF=1, ZF=0
  899. ;a=0x80
  900.         bit 7,h
  901.         jr z,inchlwithflags_l80_p
  902. inchlwithflags_l80_m
  903.         ld a,0 ;keep CY!
  904.         dec a ;00->ff ;set ZF=0, SF=h7, AF=1, keep CY
  905.         ret
  906. incbcwithflags_c80 ;fix SF, keep AF=1, ZF=0
  907. ;a=0x80
  908.         bit 7,b
  909.         jr nz,inchlwithflags_l80_m
  910. inchlwithflags_l80_p
  911.         dec a ;80->7f ;set ZF=0, SF=h7, AF=1, keep CY
  912.         ret
  913.  
  914. dechlwithflags_fixflags
  915.         ex af,af' ;'
  916.         dec l
  917.         ld a,l
  918.         exx
  919.         ld d,a ;parity data
  920.         ld e,0 ;overflow data
  921.         exx
  922.         jr z,dechlwithflags_l00 ;maybe zero
  923.         inc a
  924.         jp pe,inchlwithflags_l80;dechlwithflags_l7f ;fix SF, keep AF=1, ZF=0
  925.         ret nz
  926.         dec h
  927.         jp pe,inchlwithflags_overflow
  928.         jr nz,inchlwithflags_a0_setAF ;set ZF=0, SF=h7, AF=1, keep CY
  929. ;a=0, hl=0x00ff
  930.         inc a ;set ZF=0, SF=0, AF=0, keep CY
  931.         ret
  932. dechlwithflags_l00 ;maybe zero
  933. ;a=0
  934.         inc h
  935.         dec h
  936.         ret z ;set ZF=1, SF=0, AF=0
  937.         ld a,h
  938.         res 0,a ;for ZF=0, AF=0
  939.         inc a ;set ZF=0, SF=h7, AF=0, keep CY
  940.         ret
  941.  
  942. decbcwithflags_fixflags
  943.         ex af,af' ;'
  944.         dec c
  945.         ld a,c
  946.         exx
  947.         ld d,a ;parity data
  948.         ld e,0 ;overflow data
  949.         exx
  950.         jr z,decbcwithflags_c00 ;maybe zero
  951.         inc a
  952.         jp pe,inchlwithflags_l80;dechlwithflags_l7f ;fix SF, keep AF=1, ZF=0
  953.         ret nz
  954.         dec b
  955.         jp pe,inchlwithflags_overflow
  956.         jr nz,inchlwithflags_a0_setAF ;set ZF=0, SF=h7, AF=1, keep CY
  957. ;a=0, bc=0x00ff
  958.         inc a ;set ZF=0, SF=0, AF=0, keep CY
  959.         ret
  960. decbcwithflags_c00 ;maybe zero
  961. ;a=0
  962.         inc b
  963.         dec b
  964.         ret z ;set ZF=1, SF=0, AF=0
  965.         ld a,b
  966.         res 0,a ;for ZF=0, AF=0
  967.         inc a ;set ZF=0, SF=h7, AF=0, keep CY
  968.         ret
  969.  
  970.        endif
  971.  
  972. countXS_bc_to_ahl
  973.         ld h,b
  974.         ld l,c
  975.         xor a
  976.         add hl,hl
  977.         rla
  978.         add hl,hl
  979.         rla
  980.         add hl,hl
  981.         rla
  982.         add hl,hl
  983.         rla
  984.         ret
  985.  
  986. putmemspBC_pp
  987.         ;LD HL,(_SP)
  988.         inc l
  989.         dec l
  990.         call z,recountsp_dec
  991.         dec l
  992.        push hl
  993.        res 6,h
  994.        set 7,h
  995.         ld (hl),b
  996.        pop hl
  997.         call z,recountsp_dec
  998.         dec l
  999.         LD (_SP),HL    
  1000.        res 6,h
  1001.        set 7,h
  1002.         ld (hl),c
  1003.        pop hl
  1004.         ld bc,_putmemspBC_skipsize
  1005.         add hl,bc
  1006.         jp (hl)
  1007.  
  1008. getmemspBC_pp
  1009.         ;LD HL,(_SP)
  1010.        push hl
  1011.        res 6,h
  1012.        set 7,h
  1013.         ld c,(hl)
  1014.        pop hl
  1015.         inc l
  1016.         call z,recountsp_inc
  1017.        push hl
  1018.        res 6,h
  1019.        set 7,h
  1020.         ld b,(hl)
  1021.        pop hl
  1022.         inc l
  1023.         call z,recountsp_inc
  1024.         LD (_SP),HL
  1025.        pop hl
  1026.        push bc
  1027.         ld bc,_getmemspBC_skipsize
  1028.         add hl,bc
  1029.        pop bc
  1030.         jp (hl)
  1031.  
  1032. recountsp_inc
  1033.         inc h
  1034.         push bc
  1035.         push hl
  1036.         memSS
  1037.         pop hl
  1038.         pop bc
  1039.         ret
  1040.  
  1041. recountsp_dec
  1042. ;вызывается до dec l!
  1043.         dec h
  1044.         push bc
  1045.         push hl
  1046.         memSS
  1047.         pop hl
  1048.         pop bc
  1049.         ret
  1050.  
  1051. recountpc_inc ;keep CY!
  1052.         inc d
  1053.         ret p ;<0x8000
  1054.         push af
  1055.         push bc
  1056.         ex de,hl
  1057.         dec hl
  1058.         ld b,h
  1059.         ld c,l
  1060.         decodePC ;bc->bc
  1061.         ld h,b
  1062.         ld l,c
  1063.         inc hl
  1064.         memCS
  1065.         ex de,hl
  1066.         pop bc
  1067.         pop af
  1068.         ld de,0x4000
  1069.         ret
  1070.  
  1071. PUTscreen_logpgc_zxaddrhl_datamhl_keephlpg_do
  1072.        push hl
  1073.        push bc
  1074.        call PUTscreen_logpgc_zxaddrhl_datamhl_do
  1075.        pop bc
  1076.         ld b,tpgs/256
  1077.         ld a,(bc)
  1078.         SETPGC000 ;как было
  1079.        pop hl
  1080.         ret
  1081.  
  1082. PUTscreen_logpgc_zxaddrhl_datamhl_do
  1083. _PUTscreen_do_patch=$
  1084. _PUTscreen_do_patch_vgadata=0x044e ;ld c,(hl):inc b
  1085.         jr PUTscreen_textmode ;/ld c,(hl):inc b (b=trecolour/256)
  1086. ;a=1..4*0x40
  1087.         add a,h
  1088.         ld h,a
  1089. ;экран VGA = 320 байт на строку
  1090. ;экран ZXEGA = 40 байт на строку *4 слоя
  1091.         scf
  1092.         rr h
  1093.         rr l ;CY=left/right
  1094.         jr c,PUTscreen_rightpixel
  1095.         sra h
  1096.         rr l
  1097.         ld a,(user_scr0_low) ;ok
  1098.         jr nc,$+5
  1099.         ld a,(user_scr0_high) ;ok
  1100.        push bc
  1101.         SETPGC000
  1102.        pop bc
  1103.         sra h
  1104.         rr l
  1105.         jr c,$+4
  1106.         res 5,h
  1107.      ld a,(bc)
  1108.      xor (hl)
  1109.      and 0b01000111
  1110.      xor (hl)
  1111.      ld (hl),a    
  1112.         ret
  1113. PUTscreen_rightpixel
  1114.         sra h
  1115.         rr l
  1116.         ld a,(user_scr0_low) ;ok
  1117.         jr nc,$+5
  1118.         ld a,(user_scr0_high) ;ok
  1119.        push bc
  1120.         SETPGC000
  1121.        pop bc
  1122.         sra h
  1123.         rr l
  1124.         jr c,$+4
  1125.         res 5,h
  1126.      ld a,(bc)
  1127.      xor (hl)
  1128.      and 0b10111000
  1129.      xor (hl)
  1130.      ld (hl),a    
  1131.         ret
  1132.  
  1133. PUTscreen_textmode
  1134.         ld c,(hl) ;colour
  1135.      ;inc b ;ld b,trecolour/256
  1136. ;a=1..4*0x40
  1137.         ;add a,h
  1138.        ;cp 4096/256
  1139.        ;ret nc
  1140.         ;ld h,a
  1141. ;hl=addr in screen=0..65535
  1142. ;The VGA text buffer is located at physical memory address 0xB8000.
  1143. ;25 строк по 80 слов: символ, атрибут (%FpppIiii - пересчитать в PIpppiii)
  1144. ;как пересчитать строки по 160 байт (80 символов) в строки по 64 байта (128 виртуальных символов)? всего 2000 знакомест = 125 групп по 16 символов, можно по таблице получить адрес (2 байта) или номер виртуальной группы (их всего 200, т.е. 1 байт)
  1145.        push bc
  1146. ;получаем номер группы по 16 символов:
  1147. ;hl=0000GGGG gggXXXxA
  1148.         ;xor l
  1149.         ;and 0xe0
  1150.         ;xor h
  1151.            ;rlca
  1152.            ;rlca
  1153.            ;rlca
  1154.         ld a,l  ;gggXXXxA
  1155.         srl a
  1156.         xor h
  1157.         and 0xf0
  1158.         xor h    ;0gggGGGG
  1159. ;пересчитываем в номер группы на АТМ textmode:
  1160.         ld b,ttextaddr/256
  1161.         ld c,a
  1162.         ld a,(bc) ;gggGGGgg
  1163.         ld h,a
  1164.         xor l
  1165.         and 0xe0
  1166.         xor l
  1167.         ld l,a
  1168.         ld a,h
  1169.         and 0x1f
  1170. ;пересчитываем в адрес группы на ATM textmode:
  1171. ;hl=000GGGgg gggXXXxA ;+0x01c0 уже прибавлено к номеру группы как +56
  1172.          scf
  1173.          rra
  1174.         rr l
  1175.         jr c,PUTscreen_attr
  1176.          scf
  1177.          rra
  1178.         rr l
  1179.         jr nc,$+4
  1180.          or 0x20;set 5,h
  1181.         ld h,a
  1182. ;RAM page #05 (#07):
  1183. ;#21C0...#27FF - character codes of odd (1,3,...) characters (25 lines, every line is 64 bytes, of which only first 40 are significant).
  1184. ;#01C0...#07FF - character codes of even (0,2,...) characters (ditto).
  1185.         ld a,(user_scr0_high) ;ok
  1186.         SETPGC000
  1187.        pop bc
  1188.        ld b,t866toatm/256
  1189.        ld a,(bc)
  1190.         ld (hl),a
  1191.         ret
  1192. PUTscreen_attr
  1193.          rra
  1194.         rr l
  1195.         inc l
  1196.         jr c,$+5
  1197.          or 0x20
  1198.          dec l
  1199.         ld h,a
  1200. ;RAM page #01 (#03):
  1201. ;#21C0...#27FF - attributes of even(!) characters (ditto).
  1202. ;#01C1...#07FF - attributes of odd(!) characters (ditto).
  1203.         ld a,(user_scr0_low) ;ok
  1204.         SETPGC000
  1205.        pop bc ;c=%ppppiiii
  1206.         ld a,c
  1207.         rra
  1208.         xor c
  1209.         and 0b00111000
  1210.         xor c
  1211.         and 0b10111111
  1212.         bit 3,c
  1213.         jr z,$+4
  1214.         or 0b01000000
  1215.         ld (hl),a ;%pipppiii
  1216.         ret
  1217.  
  1218.        display "--",$
  1219.         include "rmbyte.asm"
  1220.        display "--",$
  1221.         include "rmbytcmd.asm"
  1222.        display "--",$
  1223.         include "x86cmd.asm"
  1224.        display "--",$
  1225.         include "x86math.asm"
  1226.        display "--",$
  1227.         include "x86logic.asm"
  1228.        display "--",$
  1229.         include "ports.asm"
  1230.        display "--",$
  1231.  
  1232.         align 256
  1233. tpgs
  1234.         ds 256 ;%10765432
  1235. tscreenpgs
  1236.         ds 256,tscreenpgs/256 ;%10765432 ;номер страницы в экране или tscreenpgs/256, если не экранная
  1237.  
  1238. ;trecolour = tscreenpgs+256
  1239.        macro dbcol _0
  1240.         db ((_0)&7)*9 + (((_0)&8)*0x18)
  1241.        endm
  1242.        
  1243.        macro dbcol8 _0,_1,_2,_3,_4,_5,_6,_7
  1244.         dbcol _0
  1245.         dbcol _1
  1246.         dbcol _2
  1247.         dbcol _3
  1248.         dbcol _4
  1249.         dbcol _5
  1250.         dbcol _6
  1251.         dbcol _7
  1252.        endm
  1253.        
  1254.        macro dbcol8i _0,_1,_2,_3,_4,_5,_6,_7
  1255.         dbcol8 _0|0x08,_1|0x08,_2|0x08,_3|0x08,_4|0x08,_5|0x08,_6|0x08,_7|0x08
  1256.        endm
  1257.        
  1258.         align 256
  1259. trecolour ;TODO generate for given palette
  1260.         dup 16
  1261.         dbcol $&0xff
  1262.         edup
  1263. ;0x10
  1264.         dbcol8 0,0,0,0,8,8,8,8
  1265.         dbcol8 7,7,7,7,15,15,15,15
  1266. ;0x20
  1267.         dbcol8 1,1,1,5,5,5,4,4
  1268.         dbcol8 4,4,4,6,6,6,2,2
  1269.         dbcol8 2,2,2,3,3,3,1,1
  1270. ;0x38
  1271.         dbcol8i 1,1,1,5,5,5,4,4
  1272.         dbcol8i 4,4,4,6,6,6,2,2
  1273.         dbcol8i 2,2,2,3,3,3,1,1
  1274. ;0x50
  1275.         dbcol8i 7,7,7,7,7,7,7,7
  1276.         dbcol8i 7,7,7,7,7,7,7,7
  1277.         dbcol8i 7,7,7,7,7,7,7,7
  1278. ;0x68
  1279.         dbcol8 1,1,1,5,5,5,4,4
  1280.         dbcol8 4,4,4,6,6,6,2,2
  1281.         dbcol8 2,2,2,3,3,3,1,1
  1282. ;0x80
  1283.        dup 6
  1284.         dbcol8 8,8,8,8,8,8,8,8
  1285.        edup
  1286. ;0xb0
  1287.         ds 72,0x00
  1288. ;0xf8
  1289.         ds 8,0
  1290.  
  1291.         align 256
  1292. ;8 r16s
  1293. _AX
  1294. _AL     DB 0
  1295. _AH     DB 0
  1296. _CX
  1297. _CL     DB 0
  1298. _CH     DB 0
  1299. _DX
  1300. _DL     DB 0
  1301. _DH     DB 0
  1302. _BX
  1303. _BL     DB 0
  1304. _BH     DB 0
  1305. _SP     DW 0 ;use encodeSP (with hl=(_SP)) after write!
  1306. _BP     DW 0
  1307. _SI     DW 0
  1308. _DI     DW 0
  1309. ;0x10
  1310. ;4 sregs + 2
  1311. _ES     DW 0
  1312. _CS     DW 0
  1313. _SS     DW 0
  1314. _DS     DW 0
  1315. _FS     DW 0
  1316. _GS     DW 0
  1317.  
  1318.         ds _ES+0x10-$
  1319. ;0x20
  1320. es_HSB  db 0
  1321.         nop
  1322. cs_HSB  db 0
  1323.         nop
  1324. ss_HSB  db 0
  1325.         nop
  1326. ds_HSB  db 0
  1327.         nop
  1328. fs_HSB  db 0
  1329.         nop
  1330. gs_HSB  db 0
  1331.  
  1332.         ds _ES+0x20-$
  1333. ;0x30
  1334. es_LSW  dw 0
  1335. cs_LSW  dw 0
  1336. ss_LSW  dw 0
  1337. ds_LSW  dw 0
  1338. fs_LSW  dw 0
  1339. gs_LSW  dw 0
  1340.  
  1341. ansipal
  1342. ;DDp palette: %grbG11RB(low),%grbG11RB(high), inverted
  1343.         ;dw 0xffff,0xfefe,0xfdfd,0xfcfc,0xefef,0xeeee,0xeded,0xecec
  1344.         ;dw 0xffff,0xdede,0xbdbd,0x9c9c,0x6f6f,0x4e4e,0x2d2d,0x0c0c
  1345. ;по сравнению с цветами терминала переставлено:
  1346. ;1-4
  1347. ;3-6
  1348.         dw 0xffff,0xfefe,0xefef,0xeeee,0xfdfd,0xfcfc,0xeded,0xecec
  1349.         dw 0x1f1f,0x1e1e,0x0f0f,0x0e0e,0x1d1d,0x1c1c,0x0d0d,0x0c0c
  1350.  
  1351. pc_high     db 0
  1352.  
  1353. _DIRECTION
  1354.         db 0
  1355. iff1    db 0
  1356. iff2    db 0 ;TODO unneeded?
  1357.  
  1358. timer
  1359.         dw 0
  1360.        
  1361. ;000... -> 000 ;al
  1362. ;001... -> 010 ;cl
  1363. ;010... -> 100 ;dl
  1364. ;011... -> 110 ;bl
  1365. ;100... -> 001 ;ah
  1366. ;101... -> 011 ;ch
  1367. ;110... -> 101 ;dh
  1368. ;111... -> 111 ;bh
  1369.        ds _AX+128-$
  1370. ;decode rm
  1371.         dup 8
  1372.         db _AL&0xff
  1373.         db _CL&0xff
  1374.         db _DL&0xff
  1375.         db _BL&0xff
  1376.         db _AH&0xff
  1377.         db _CH&0xff
  1378.         db _DH&0xff
  1379.         db _BH&0xff
  1380.         edup
  1381.        ds _AX+192-$
  1382. ;decode r8 (TODO поменять местами с decode rm, т.к. rm нужно чаще)
  1383.         ds 8,_AL&0xff
  1384.         ds 8,_CL&0xff
  1385.         ds 8,_DL&0xff
  1386.         ds 8,_BL&0xff
  1387.         ds 8,_AH&0xff
  1388.         ds 8,_CH&0xff
  1389.         ds 8,_DH&0xff
  1390.         ds 8,_BH&0xff
  1391.         align 256
  1392.         include "x86table.asm"
  1393.  
  1394.         align 256
  1395. t866toatm
  1396.         incbin "../kernel/866toatm"
  1397.  
  1398.         align 256
  1399.        macro dbrrc3 data
  1400.         db (data>>3)+((data<<5)&0xe0)
  1401.        endm
  1402. ttextaddr
  1403.         dup 128
  1404. _=$&0xff
  1405. ;0gggGGGG -> 0GGGGggg:
  1406. _=((_&0x0f)<<3)+((_&0x70)>>4)
  1407.        if _<125
  1408. _=_/5*8+(_-(_/5*5))+56
  1409.         dbrrc3 _
  1410.        else
  1411.         dbrrc3 255
  1412.        endif
  1413.         edup
  1414.  
  1415.         display "killable=",$
  1416.  
  1417. ;killable
  1418. init
  1419.         OS_HIDEFROMPARENT
  1420.         ld e,6+0x80 ;keep
  1421.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  1422.         ;ld e,0
  1423.         ;OS_SETSCREEN
  1424.         ;ld e,0
  1425.         ;OS_CLS
  1426.         ;ld e,1
  1427.         ;OS_SETSCREEN
  1428.         ;ld e,0
  1429.         ;OS_CLS
  1430.  
  1431.         ld sp,STACK
  1432.         ;ld de,diskname
  1433.         ;OS_OPENHANDLE
  1434.         ;ld a,b
  1435.         ;ld (diskhandle),a
  1436.  
  1437.         OS_GETMAINPAGES ;out: d,e,h,l=pages in 0000,4000,8000,c000, c=flags, b=id
  1438.         ld a,e
  1439.         ld (pgprog),a
  1440.  
  1441.         ld a,(user_scr0_high) ;ok
  1442.         call clpga
  1443.         ld a,(user_scr0_low) ;ok
  1444.         call clpga
  1445.  
  1446.         ld hl,tpgs
  1447.         ld b,64
  1448. filltpgs0
  1449.         push bc
  1450.         push hl
  1451.         OS_NEWPAGE
  1452.         pop hl
  1453.      ld a,l
  1454.      add a,-40
  1455.      cp 4-40 ;чистим первые 4 страницы и экран с остатком памяти ;para512 ожидает чистую память после себя, pillman ожидает чистый экран
  1456.      ;jr nc,filltpgs0_noclear
  1457.        push de
  1458.        push hl
  1459.        ld a,e
  1460.        call c,clpga
  1461.        pop hl
  1462.        pop de
  1463. filltpgs0_noclear
  1464.         pop bc
  1465.        ld a,l
  1466.        rrc l
  1467.        rrc l
  1468.         ld (hl),e
  1469.        ld l,a
  1470.         inc l
  1471.         djnz filltpgs0
  1472.        
  1473. ;0xa0000 (pg 40): 4 pages for screen
  1474. ;0xb8000 (pg 46): 1 page for textmode
  1475.         ld h,tscreenpgs/256
  1476.         ld bc,4*256+40
  1477.         xor a
  1478. filltscreenpgs0
  1479.         add a,0x40
  1480.        ld l,c
  1481.        rrc l
  1482.        rrc l
  1483.         ld (hl),a
  1484.             ;dec l     ;
  1485.             ;ld (hl),a ;test backbuffer
  1486.         inc c
  1487.         djnz filltscreenpgs0
  1488.        ld (tscreenpgs+0x8b),a ;for textmode
  1489.  
  1490.         call swapimer ;сначала прерывания ничего не делают (iff0==0)
  1491.  
  1492.         jp initq
  1493. path
  1494.         db "x86",0
  1495. skipword
  1496. ;hl=string
  1497. ;out: hl=terminator/space addr
  1498. getword0
  1499.         ld a,(hl)
  1500.         or a
  1501.         ret z
  1502.         cp ' '
  1503.         ret z
  1504.         inc hl
  1505.         jr getword0
  1506.  
  1507. skipspaces
  1508. ;hl=string
  1509. ;out: hl=after last space
  1510.         ld a,(hl)
  1511.         cp ' '
  1512.         ret nz
  1513.         inc hl
  1514.         jr skipspaces
  1515.  
  1516. end
  1517.         display "end=",$
  1518.  
  1519.         savebin "x86.com",begin,end-begin
  1520.  
  1521.         LABELSLIST "../../us/user.l"
  1522.