Subversion Repositories NedoOS

Rev

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

  1.         DEVICE ZXSPECTRUM1024
  2.         include "../_sdk/sys_h.asm"
  3.  
  4. DEBUG=0;1
  5. DEBUG03=0
  6. FULL1M=0
  7.  
  8.         include "x86.ini"
  9.  
  10. STACK=0x4000
  11.  
  12. SHIFTCOUNTMASK=1 ;and 31
  13. AFFLAG_16BIT=1 ;only for add_test
  14. FASTADC16WITHFLAGS=0 ;NS
  15.  
  16. maxszPUTscreen=0x50
  17.  
  18. ;PC=0x4000...
  19. ;SP=0x8000...
  20. ;data=0xC000...
  21.         include "macros.asm"
  22.  
  23.         org PROGSTART
  24. begin
  25.         jp init
  26. initq
  27. Reset
  28.        ld a,(pgprog)
  29.        SETPG4000
  30.        jp resetpp
  31.  
  32. quiter
  33.        ld a,(pgprog)
  34.        SETPG4000
  35.        jp farquiter
  36.        
  37.        if 0
  38. jpiyer
  39.         ld hl,jpiyer
  40.         push hl
  41.         jp (iy)
  42.        endif
  43.  
  44. EMUCHECKQ
  45.         ;call getflags_bc
  46.         ;call makeflags_frombc
  47.         ;call getflags_bc
  48.        if DEBUG
  49.       push de
  50.        decodePC
  51.       if 1;0
  52.        ;ld a,(_SP)
  53.        ;rra
  54.        ;jr c,$
  55.        ;ld (oldpc),de
  56. oldpcaddr=$+1
  57.         ld hl,oldpc
  58.         ld (hl),e
  59.         inc l
  60.         ld (hl),d
  61.         inc l
  62.         ld (oldpcaddr),hl
  63.        endif
  64.        ld a,(_CS+1)
  65.        or a
  66.        jr z,$
  67.        ld a,d
  68.        ;sub 0x40+((STARTPC/256)&0x3f);0x7c
  69.        ;or e;cp 0x30
  70.        ;cp 0x97
  71.       ld hl,0x2d09;0x2976
  72.       or a
  73.       sbc hl,de
  74.       pop de
  75.       ;jr nc,$
  76.       jr z,$
  77.        endif
  78.         get
  79.         next
  80.         LD L,A
  81.         ld H,MAINCOMS/256
  82.         LD b,(HL)
  83.         INC H
  84.         LD H,(HL)
  85.         ld L,b ;чётный для всех rm-команд
  86.         JP (HL)
  87.  
  88. ;иначе pop iy запорет iy от обработчика прерывания
  89. disable_iff0_keep_iy
  90.       ;di
  91.         ld (iykeeper_iy),iy
  92.         ld a,55 ;scf
  93.         ld (iykeeper_on),a ;keep hl,de!
  94.         ret
  95. ;иначе pop iy запорет iy от обработчика прерывания
  96. enable_iff0_remember_iy
  97. iykeeper_iy=$+2
  98.         ld iy,0
  99.         ld hl,iykeeper_on
  100.         ld (hl),55+128 ;or a ;keep a!
  101.       ;ei
  102.         ret
  103.  
  104. on_int
  105.         PUSH AF,HL
  106.         push bc,de
  107.         exx
  108.         push bc
  109.         push de
  110.         push hl
  111.         push ix
  112.         push iy
  113.         ex af,af' ;'
  114.         push af
  115.         call oldimer
  116.        
  117.                                 ;(65536 / 50) * 18,206 Hz
  118.                                 ;23862,96832 = $5D37
  119. timer_frq = $+1
  120.         ld de,0x5D37
  121. timer_cnt = $+1
  122.         ld hl,0x0000
  123.         add hl,de
  124.         ld (timer_cnt),hl
  125.         jr nc,timer_inc_skip
  126. timer = $+1
  127.         ld hl,0x0000
  128.         inc hl
  129.         ld (timer),hl
  130. timer_inc_skip
  131.         ;ld hl,(timer)
  132.         ;inc hl
  133.         ;ld (timer),hl
  134.  
  135.        ld a,(curpg4000) ;ok
  136.        push af
  137.        ld a,(pgprog)
  138.        SETPG4000
  139.         call KEYB ;TODO ниже
  140.        pop af
  141.        SETPG4000
  142.         ;OS_GETKEY
  143. ;        A - код символа(кнопки). Допустимые коды смотри в 'sysdefs.asm' секция 'Usable key codes'
  144. ;        C - код символа(кнопки) без учета текущего языкового модификатора. Как правило, используется для обработки "горячих кнопок"
  145. ;        DE - позиция мыши (y,x) (возвращает 0 при отсутствии фокуса)
  146. ;        L - кнопки мыши (bits 0(LMB),1(RMB),2(MMB): 0=pressed; bits 7..4=положение колёсика)
  147. ;        LX - Kempston joystick (0bP2JFUDLR): 1=pressed, - при отсутствии джойстика 0 (а не 0xff)
  148. ;        Флаг Z - если 0(NZ), то отсутствует фокус.  
  149.         pop af
  150.         ex af,af' ;'
  151.         pop iy
  152.         pop ix
  153.         pop hl
  154.         pop de
  155.         pop bc
  156.         exx
  157.         pop de,bc
  158.  
  159. debugon=$
  160.         scf;or a ;для нормального старта пока пропускаем все активности до JumpIn
  161.         jr c,imerskipdebug
  162.  
  163.        ld a,0xf7
  164.        in a,(0xfe)
  165.        and 0b10101
  166.        push af
  167.        jp z,quiter ;1+3+5 = quit
  168.        pop af
  169.        and 0b11000 ;4+5
  170.        jp z,GotoDebugger
  171.  
  172.        LD A,(iff1)
  173.        OR A
  174.        jr NZ,IMEREI
  175. imerskipdebug
  176.         POP HL,AF
  177.         EI
  178.        RET
  179.  
  180. IMEREI
  181.         XOR A
  182.         LD (iff1),A
  183. ;перед эмуляцией INT завершаем тек.команду (перехват на EMULOOP)
  184.         LD (keepemuchecker),IY
  185.         LD IY,IMINT
  186.         POP HL,AF
  187.         RET  ;di!
  188.  
  189. GotoDebugger
  190. ;перед входом в отладчик завершаем тек.команду (перехват на EMULOOP)
  191.         LD (keepemuchecker),IY
  192.         LD IY,IMDEBUG
  193.         POP HL,AF
  194.         EI
  195.         RET
  196. IMDEBUG
  197.        ld a,55 ;scf
  198.        ld (debugon),a
  199.  
  200. ;запоминаем регистры в переменные
  201.        decodePC ;de=old PC
  202.        ld (curpc),de
  203.        ;exx
  204.        ;ex af,af' ;'
  205.        ;push af
  206.        ;pop hl
  207.        call getflags_bc
  208.        ld (curflags),bc
  209.  
  210.        ld a,(pgprog)
  211.        SETPG4000
  212.        
  213.         ld de,ansipal
  214.         OS_SETPAL
  215.         call Debugger
  216.         ld a,(curgfxmode)
  217.         call INT_setgfx
  218.  
  219.        ld bc,(curflags)
  220.        call makeflags_frombc
  221.        
  222.        ld a,55+128 ;or a
  223.        ld (debugon),a
  224.         ld iy,(keepemuchecker)
  225.        ld de,(curpc)
  226.        _LoopC_JP
  227.  
  228. IMINT
  229. keepemuchecker=$+2
  230.         LD IY,0
  231. iykeeper_on=$
  232.         or a ;scf=on
  233.         jr nc,IMINT_noiykeeperdata
  234.         ld iy,(iykeeper_iy)
  235. IMINT_noiykeeperdata
  236.        ;LD (retfromim),DE ;для индикации времени обработки прерыв
  237.        
  238. ;NS:
  239. ;Planeta запускаетсо кода [0000:041A] != [0000:041c]
  240. ;это на вид именно сиистемные переменные
  241. ;они дрыгаются так же в досе
  242. ;там еще всякие щифты рядом
  243. ;это начало и конец буфера клавиатуры
  244.        
  245.       ld a,(tpgs)
  246.       SETPGC000
  247.  
  248.         ;call KEYB ;TODO в странице
  249. GKEYADR=$+1
  250.         LD HL,KEYBUFF ;адрес конца списка
  251.         ld (0x041c+0xc000),hl
  252.         ld hl,KEYBUFF
  253.         ld (0x041a+0xc000),hl
  254.  
  255. ;int 0 - Переполнение при делении (Goody, Ms Pacman) - убитый (в cs там лежит свободная память, но даже при cs=0 лажа)
  256. ;int 1 - cpu generated??? Пошаговое прерывание (есть обработчик в mision, но если его поставить, всё время стреляет)
  257. ;int 8 - timer (ratillery for music)
  258. ;int 9 - keyboard
  259. ;int 1c - timer Пользовательское прерывание по таймеру (pitman)
  260.  
  261. ;INT 00h: Переполнение при делении.
  262. ;INT 01h: Пошаговое прерывание.
  263. ;INT 02h: Немаскируемое прерывание.
  264. ;INT 03h: Прерывание по точке.
  265. ;INT 04h: Прерывание по переполнению.
  266. ;INT 05h: Печать экрана.
  267. ;INT 06h: Неверная команда.
  268. ;INT 07h: Сопроцессор отсутсвует..
  269. ;INT 08h: IRQ 0 Прерывание от таймера.
  270. ;INT 09h: IRQ 1 Прерывание от клавиатуры.
  271. ;INT 0Ah: IRQ 2 Оборудование.
  272. ;INT 0Bh: IRQ 3 Оборудование (COM 2).
  273. ;INT 0Ch: IRQ 4 Оборудование (COM 1).
  274. ;INT 0Dh: IRQ 5 Оборудование (LPT, на оригинальном IBM PC - жёсткий диск).
  275. ;INT 0Eh: IRQ 6 Прерывание от дискеты.
  276. ;INT 0Fh: IRQ 7 Оборудование.
  277. ;INT 10h: Видео сервис.
  278. ;INT 11h: Список оборудования.
  279. ;INT 12h: Размер используемой памяти.
  280. ;INT 13h: Дисковый ввод/вывод.
  281. ;INT 14h: Ввод/вывод через COM порт.
  282. ;INT 15h: Дополнительные функции.
  283. ;INT 16h: Ввод/вывод клавиатуры, управление процессором и кэшем.
  284. ;INT 17h: Ввод/вывод LPT.
  285. ;INT 18h: Возврат в BIOS.
  286. ;INT 19h: Загрузка.
  287. ;INT 1Ah: Ввод/вывод таймера и сервисы PCI BIOS.
  288. ;INT 1Bh: Прерывание клавиатуры.
  289. ;INT 1Ch: Пользовательское прерывание по таймеру
  290. ;INT 1Dh: Видео параметры
  291. ;INT 1Eh: Параметры дискет
  292. ;INT 1Fh: Символы графики
  293.  
  294. ;INT 70h: IRQ 8 Оборудование (RTC).
  295. ;INT 71h: IRQ 9 Оборудование.
  296. ;INT 72h: IRQ 10 Оборудование.
  297. ;INT 73h: IRQ 11 Оборудование.
  298. ;INT 74h: IRQ 12 Оборудование (Мышь).
  299. ;INT 75h: IRQ 13 Оборудование (Сопроцессор 80287+).
  300. ;INT 76h: IRQ 14 Оборудование (Жёсткий диск).
  301. ;INT 77h: IRQ 15 Оборудование.
  302.  
  303.       ld hl,(9*4+0xc000) ;ip
  304.       ld bc,(9*4+0xc002) ;cs
  305.      ld a,0x55
  306.      rlca
  307.      ld ($-2),a
  308.      jr c,int_no8
  309.       ld hl,(8*4+0xc000) ;ip
  310.       ld bc,(8*4+0xc002) ;cs
  311.     if 1;0
  312.      ld a,0x55
  313.      rlca
  314.      ld ($-2),a
  315.      jr c,int_no8
  316.       ld hl,(0x1c*4+0xc000) ;ip
  317.       ld bc,(0x1c*4+0xc002) ;cs
  318. int_no8
  319.     endif
  320.       ld a,h
  321.       or l
  322.      ;xor a
  323.       jp z,STIer ;костыль для неинициализированного прерывания
  324.       ;jr $
  325.        
  326. gotoint
  327. ;push cs; push ip (адрес после команды); push flags (iret читает flags,ip,cs)
  328.       push bc
  329.       push hl
  330.        ld bc,(_CS)
  331.         putmemspBC ;old CS
  332. ;абсолютный адрес ip, cs
  333.         ;ld a,(tpgs)
  334.         ;SETPGC000
  335.       pop hl
  336.       pop bc
  337.         ;ld hl,(9*4+0xc000) ;ip
  338.         ;ld bc,(9*4+0xc002) ;cs
  339.        push hl
  340.         ld (_CS),bc ;new CS
  341.         countCS
  342.        decodePC
  343.         LD b,d
  344.         ld c,e ;=old PC
  345.        pop de ;new PC
  346.         putmemspBC
  347.  
  348.        call getflags_bc
  349.         set 1,b ;interrupt enable
  350.        putmemspBC
  351.  
  352.      jp JRer_qslow ;_LoopC_JP
  353.  
  354. INT1
  355.        UNTESTED
  356.       ld a,(tpgs)
  357.       SETPGC000
  358.       ld hl,(1*4+0xc000) ;ip
  359.       ld bc,(1*4+0xc002) ;cs
  360.         jp gotoint
  361. INT3
  362.        UNTESTED
  363.       ld a,(tpgs)
  364.       SETPGC000
  365.       ld hl,(3*4+0xc000) ;ip
  366.       ld bc,(3*4+0xc002) ;cs
  367.         jp gotoint
  368. INTOer
  369.        UNTESTED
  370.         exx
  371.         ld a,e ;overflow data
  372.         and 0x40
  373.         rla
  374.         xor e
  375.         exx
  376.         JP p,NOPer
  377.       ld a,(tpgs)
  378.       SETPGC000
  379.       ld hl,(4*4+0xc000) ;ip
  380.       ld bc,(4*4+0xc002) ;cs
  381.         jp gotoint
  382.  
  383.        if 1;AFFLAG_16BIT
  384. ;как сформировать ZF,SF, не трогая AF?
  385. ;для этого надо сформировать число с нужными свойствами и сделать inc
  386.          ;ZF SF AF OF
  387. ;ff даёт  1  0  1  0 ;имитирует флаги после inc ffff
  388. ;7f даёт  0  1  1  1 ;имитирует флаги после inc 7fff
  389. ;80 даёт  0  1  0  0 ;имитирует флаги после inc 8000
  390. ;8f даёт  0  1  1  0 ;имитирует флаги после inc 800f
  391. ;т.е. ff, 7f надо формировать только для 7fff, ffff
  392. ;а в остальных случаях надо брать (h&0x80) + (l&0x08)
  393. ;если l!=ff, l!=7f, то можно просто сделать inc l
  394. ;если l=ff, то нельзя просто сделать inc h - запортится AF!
  395. inchlwithflags_l00 ;inc h needed
  396.         inc h
  397.         ret z ;set ZF=1(ok), AF=1(ok), OF=0(ok)
  398.         jp pe,inchlwithflags_overflow
  399. inchlwithflags_a0_setAF ;set ZF=0(ok), SF=h7(ok), AF=1, keep CY
  400. ;a=0
  401.         jp m,$+5
  402.         ld a,0x80 ;after dec: a7=h7
  403.         dec a ;set ZF=0, SF=h7, AF=1, keep CY
  404.         ret
  405. incbcwithflags_c00 ;inc b needed
  406.         inc b
  407.         ret z ;set ZF=1(ok), AF=1(ok), OF=0(ok)
  408.         jp po,inchlwithflags_a0_setAF
  409. inchlwithflags_overflow
  410.         exx
  411.         ld e,0x80 ;overflow (e7!=e6)
  412.         exx
  413.         ret
  414.  
  415. inchlwithflags_l80 ;fix SF, keep AF=1, ZF=0
  416. ;a=0x80
  417.         bit 7,h
  418.         jr z,inchlwithflags_l80_p
  419. inchlwithflags_l80_m
  420.         ld a,0 ;keep CY!
  421.         dec a ;00->ff ;set ZF=0, SF=h7, AF=1, keep CY
  422.         ret
  423. incbcwithflags_c80 ;fix SF, keep AF=1, ZF=0
  424. ;a=0x80
  425.         bit 7,b
  426.         jr nz,inchlwithflags_l80_m
  427. inchlwithflags_l80_p
  428.         dec a ;80->7f ;set ZF=0, SF=h7, AF=1, keep CY
  429.         ret
  430.  
  431. dechlwithflags_fixflags
  432.         ex af,af' ;'
  433.         dec l
  434.         ld a,l
  435.         exx
  436.         ld d,a ;parity data
  437.         ld e,0 ;overflow data
  438.         exx
  439.         jr z,dechlwithflags_l00 ;maybe zero
  440.         inc a
  441.         jp pe,inchlwithflags_l80;dechlwithflags_l7f ;fix SF, keep AF=1, ZF=0
  442.         ret nz
  443.         dec h
  444.         jp pe,inchlwithflags_overflow
  445.         jr nz,inchlwithflags_a0_setAF ;set ZF=0, SF=h7, AF=1, keep CY
  446. ;a=0, hl=0x00ff
  447.         inc a ;set ZF=0, SF=0, AF=0, keep CY
  448.         ret
  449. dechlwithflags_l00 ;maybe zero
  450. ;a=0
  451.         inc h
  452.         dec h
  453.         ret z ;set ZF=1, SF=0, AF=0
  454.         ld a,h
  455.         res 0,a ;for ZF=0, AF=0
  456.         inc a ;set ZF=0, SF=h7, AF=0, keep CY
  457.         ret
  458.  
  459. decbcwithflags_fixflags
  460.         ex af,af' ;'
  461.         dec c
  462.         ld a,c
  463.         exx
  464.         ld d,a ;parity data
  465.         ld e,0 ;overflow data
  466.         exx
  467.         jr z,decbcwithflags_c00 ;maybe zero
  468.         inc a
  469.         jp pe,inchlwithflags_l80;dechlwithflags_l7f ;fix SF, keep AF=1, ZF=0
  470.         ret nz
  471.         dec b
  472.         jp pe,inchlwithflags_overflow
  473.         jr nz,inchlwithflags_a0_setAF ;set ZF=0, SF=h7, AF=1, keep CY
  474. ;a=0, bc=0x00ff
  475.         inc a ;set ZF=0, SF=0, AF=0, keep CY
  476.         ret
  477. decbcwithflags_c00 ;maybe zero
  478. ;a=0
  479.         inc b
  480.         dec b
  481.         ret z ;set ZF=1, SF=0, AF=0
  482.         ld a,b
  483.         res 0,a ;for ZF=0, AF=0
  484.         inc a ;set ZF=0, SF=h7, AF=0, keep CY
  485.         ret
  486.  
  487.        endif
  488.  
  489. countXS_bc_to_ahl
  490.         ld h,b
  491.         ld l,c
  492.         xor a
  493.         add hl,hl
  494.         rla
  495.         add hl,hl
  496.         rla
  497.         add hl,hl
  498.         rla
  499.         add hl,hl
  500.         rla
  501.         ret
  502.  
  503.        if 1
  504. getmemspBCpp
  505.         ld bc,(_SP)
  506.         ld hl,(ss_LSW)
  507.         ld a,(ss_HSB)
  508.         ADDSEGMENT_hl_abc_to_ahl
  509.         inc bc
  510.         inc bc
  511.         ld (_SP),bc
  512.         ld c,a
  513.         ld b,tpgs/256
  514.         set 7,h
  515.         res 6,h
  516.         ld a,(bc)
  517.         SETPG8000
  518.         ld c,(hl)
  519.         inc l
  520.         ld b,(hl)
  521.         ret nz
  522.         push bc
  523.         ld hl,(_SP)
  524.         dec hl;inc hl
  525.         memSS
  526.         pop bc
  527.         ld b,(hl)
  528.         ret
  529. recountsp_inc
  530.         push bc
  531.         ld hl,(_SP)
  532.         inc hl
  533.         memSS
  534.         pop bc
  535.         ret
  536.        else
  537. ;не работает при некруглых сегментах
  538. putmemspBC_pp
  539.         ;LD HL,(_SP)
  540.         inc l
  541.         dec l
  542.         call z,recountsp_dec
  543.         dec l
  544.        push hl
  545.        res 6,h
  546.        set 7,h
  547.         ld (hl),b
  548.        pop hl
  549.         call z,recountsp_dec
  550.         dec l
  551.         LD (_SP),HL    
  552.        res 6,h
  553.        set 7,h
  554.         ld (hl),c
  555.        pop hl
  556.         ld bc,_putmemspBC_skipsize
  557.         add hl,bc
  558.         jp (hl)
  559.  
  560. getmemspBC_pp
  561.         ;LD HL,(_SP)
  562.        push hl
  563.        res 6,h
  564.        set 7,h
  565.         ld c,(hl)
  566.        pop hl
  567.         inc l
  568.         call z,recountsp_inc
  569.        push hl
  570.        res 6,h
  571.        set 7,h
  572.         ld b,(hl)
  573.        pop hl
  574.         inc l
  575.         call z,recountsp_inc
  576.         LD (_SP),HL
  577.        pop hl
  578.        push bc
  579.         ld bc,_getmemspBC_skipsize
  580.         add hl,bc
  581.        pop bc
  582.         jp (hl)
  583.  
  584. recountsp_inc
  585.         inc h
  586.         jr recountsp_incdec
  587. recountsp_dec
  588. ;вызывается до dec l!
  589.         dec h
  590. recountsp_incdec
  591.         push bc
  592.         push hl
  593.         memSS
  594.         pop hl
  595.         pop bc
  596.         ret
  597.        endif
  598.  
  599. recountpc_inc ;keep CY!
  600.         inc d
  601.         ret p ;<0x8000
  602.         push af
  603.         push bc
  604.         dec de
  605.         decodePC ;de->de
  606.         inc de
  607.         encodePC ;de->de
  608.         pop bc
  609.         pop af
  610.         ;ld de,0x4000
  611.         ret
  612.  
  613. PUTscreen_logpgc_zxaddrhl_datamhl_keephlpg_do
  614.        push hl
  615.        push bc
  616.        call PUTscreen_logpgc_zxaddrhl_datamhl_do ;не получится inline, т.к. многие вызывают прямо PUTscreen_logpgc_zxaddrhl_datamhl_do
  617.        pop bc
  618.         ld b,tpgs/256
  619.         ld a,(bc)
  620.         SETPGC000 ;как было
  621.        pop hl
  622.         ret
  623.  
  624. PUTscreen_logpgc_zxaddrhl_datamhl_do
  625.         ds maxszPUTscreen;0x52;100
  626.  
  627.         ;include "keyscan.asm"
  628.        display "--",$
  629.         include "rmbyte.asm"
  630.        display "--",$
  631.         include "rmbytcmd.asm"
  632.        display "--",$
  633.         include "extcmd.asm"
  634.         include "x86cmd.asm"
  635.        display "--",$
  636.         include "x86math.asm"
  637.        display "--",$
  638.         include "x86logic.asm"
  639.        display "--",$
  640.         include "ports.asm"
  641.        display "--",$
  642.  
  643.         align 256
  644. tpgs
  645.         ds 256 ;%10765432
  646. tscreenpgs
  647.         ds 256,tscreenpgs/256 ;%10765432 ;номер страницы в экране или tscreenpgs/256, если не экранная
  648. trecolour
  649. ;trecolour = tscreenpgs+256
  650. ;сюда копируется либо wastrecolour, либо wast866toatm
  651.         incbin "../kernel/866toatm"
  652.  
  653.         align 256
  654. ;8 r16s
  655. _AX
  656. _AL     DB 0
  657. _AH     DB 0
  658. _CX
  659. _CL     DB 0
  660. _CH     DB 0
  661. _DX
  662. _DL     DB 0
  663. _DH     DB 0
  664. _BX
  665. _BL     DB 0
  666. _BH     DB 0
  667. _SP     DW 0 ;use encodeSP (with hl=(_SP)) after write!
  668. _BP     DW 0
  669. _SI     DW 0
  670. _DI     DW 0
  671. ;0x10
  672. ;4 sregs + 2
  673. _ES     DW 0
  674. _CS     DW 0
  675. _SS     DW 0
  676. _DS     DW 0
  677. _FS     DW 0
  678. _GS     DW 0
  679. curpc    dw 0 ;for debugger
  680. curflags dw 0 ;for debugger
  681.  
  682.         ds _ES+0x10-$
  683. ;0x20
  684. es_HSB  db 0
  685.         nop
  686. cs_HSB  db 0
  687.         nop
  688. ss_HSB  db 0
  689.         nop
  690. ds_HSB  db 0
  691.         nop
  692. fs_HSB  db 0
  693.         nop
  694. gs_HSB  db 0
  695.  
  696.         ds _ES+0x20-$
  697. ;0x30
  698. es_LSW  dw 0
  699. cs_LSW  dw 0
  700. ss_LSW  dw 0
  701. ds_LSW  dw 0
  702. fs_LSW  dw 0
  703. gs_LSW  dw 0
  704.      display $
  705.  
  706. ansipal ;можно убрать в ints
  707. ;DDp palette: %grbG11RB(low),%grbG11RB(high), inverted
  708.         ;dw 0xffff,0xfefe,0xfdfd,0xfcfc,0xefef,0xeeee,0xeded,0xecec
  709.         ;dw 0xffff,0xdede,0xbdbd,0x9c9c,0x6f6f,0x4e4e,0x2d2d,0x0c0c
  710. ;по сравнению с цветами терминала переставлено:
  711. ;1-4
  712. ;3-6
  713.         dw 0xffff,0xfefe,0xefef,0xeeee,0xfdfd,0xfcfc,0xeded,0xecec
  714.         dw 0x1f1f,0x1e1e,0x0f0f,0x0e0e,0x1d1d,0x1c1c,0x0d0d,0x0c0c
  715.  
  716. pc_high
  717.         db 0
  718. ;_DIRECTION
  719.         ;db 0
  720. iff1
  721.         db 0
  722. pgprog
  723.         db 0 ;там можно хранить дополнительный код (напр., отладчик)
  724. oldimer
  725.         jp on_int
  726.         jp 0x0038+3
  727.        
  728. ;000... -> 000 ;al
  729. ;001... -> 010 ;cl
  730. ;010... -> 100 ;dl
  731. ;011... -> 110 ;bl
  732. ;100... -> 001 ;ah
  733. ;101... -> 011 ;ch
  734. ;110... -> 101 ;dh
  735. ;111... -> 111 ;bh
  736.        ds _AX+128-$
  737.      display "=",$
  738. ;decode rm
  739.         dup 8
  740.         db _AL&0xff
  741.         db _CL&0xff
  742.         db _DL&0xff
  743.         db _BL&0xff
  744.         db _AH&0xff
  745.         db _CH&0xff
  746.         db _DH&0xff
  747.         db _BH&0xff
  748.         edup
  749.        ds _AX+192-$
  750. ;decode r8 (TODO поменять местами с decode rm, т.к. rm нужно чаще)
  751.         ds 8,_AL&0xff
  752.         ds 8,_CL&0xff
  753.         ds 8,_DL&0xff
  754.         ds 8,_BL&0xff
  755.         ds 8,_AH&0xff
  756.         ds 8,_CH&0xff
  757.         ds 8,_DH&0xff
  758.         ds 8,_BH&0xff
  759.         align 256
  760.         include "x86table.asm"
  761.  
  762.        if DEBUG
  763.        align 256
  764. oldpc
  765.         ;dw 0
  766.         ds 256
  767.        endif
  768.  
  769. ;генерируется для textmode
  770.         align 256
  771. ttextaddr
  772.         ds 128
  773.  
  774.         display "killable=",$
  775. ;killable
  776.  
  777.         display "lowend=",$
  778.         ds 0x3fc0-$
  779.         ds 0x4000-$
  780.         include "ints.asm"
  781.         include "keyscan.asm"
  782.         include "decoder.asm"
  783.         include "opcodes.asm"
  784.         include "nametables.asm"
  785.         include "functions.asm" ;prchar for disasm
  786.         include "routines.asm"
  787.         include "debugger.asm"
  788.         include "editline.asm"
  789. ; Чтение их памяти по адресу HL++
  790. ; _param_ip -- это РЕАЛЬНЫЙ ip, который должен быть сконвертирован
  791. ;              на память спектрума
  792. ; ----------------------------------------------------------------------
  793.  
  794. read:       push    hl
  795.             ld      hl, (_param_ip)
  796.             ;ld      a, (hl)
  797.            call Debugger_GetMem_hl_to_a
  798.             inc     hl
  799.             ld      (_param_ip), hl
  800.             pop     hl
  801.             ret
  802.  
  803. ; Реальный IP (в данном случае совпадает с адресом в памяти спектрума)
  804. _param_ip:  defw    0
  805.  
  806. Debugger_PutMem_hl_a
  807.        push bc
  808.        push hl
  809.        push af
  810.         ld bc,(cs_LSW)
  811.         ld a,(cs_HSB)
  812.         ADDSEGMENT_hl_abc_to_ahl
  813.         ld c,a
  814.         ld b,tpgs/256
  815.         set 7,h
  816.         set 6,h
  817.         ld a,(bc)
  818.         SETPGC000
  819.        pop af
  820.         ld (hl),a
  821.        pop hl
  822.        pop bc
  823.         ret
  824. Debugger_GetMem_hl_to_a
  825.        push bc
  826.        push hl
  827.         ld bc,(cs_LSW)
  828.         ld a,(cs_HSB)
  829.         ADDSEGMENT_hl_abc_to_ahl
  830.         ld c,a
  831.         ld b,tpgs/256
  832.         set 7,h
  833.         set 6,h
  834.         ld a,(bc)
  835.         SETPGC000
  836.         ld a,(hl)
  837.        pop hl
  838.        pop bc
  839.         ret
  840.  
  841.         align 256
  842. t866toatm
  843.         incbin "../kernel/866toatm"
  844.  
  845.         display "end=",$
  846. end
  847.  
  848.         savebin "x86.com",begin,end-begin
  849.  
  850.         LABELSLIST "../../us/user.l"
  851.