Subversion Repositories NedoOS

Rev

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

  1. init
  2.         ld hl,COMMANDLINE ;command line
  3.         call skipword
  4.         call skipspaces
  5.         ld a,(hl)
  6.         or a
  7.         jr z,noautoload
  8. ;command line = "x86 <file to load>"
  9.        ld (filenameaddr),hl
  10.        ld hl,0x100
  11.        ld (loadaddr),hl
  12.        jr autoloadq
  13. noautoload
  14.         ld de,path
  15.         OS_CHDIR
  16. autoloadq
  17.         OS_HIDEFROMPARENT
  18.         ld e,6+0x80 ;keep
  19.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  20.         ;ld e,0
  21.         ;OS_SETSCREEN
  22.         ;ld e,0
  23.         ;OS_CLS
  24.         ;ld e,1
  25.         ;OS_SETSCREEN
  26.         ;ld e,0
  27.         ;OS_CLS
  28.  
  29.         ld sp,STACK
  30.         ;ld de,diskname
  31.         ;OS_OPENHANDLE
  32.         ;ld a,b
  33.         ;ld (diskhandle),a
  34.  
  35.         OS_GETMAINPAGES ;out: d,e,h,l=pages in 0000,4000,8000,c000, c=flags, b=id
  36.         ld a,e
  37.         ld (pgprog),a
  38.         ld a,h
  39.         ld (tpgs+0xcf),a ;pgrom0 (#0x3f)
  40.         ld e,l
  41.         OS_DELPAGE
  42.  
  43.         ld a,(user_scr0_high) ;ok
  44.         call clpga
  45.         ld a,(user_scr0_low) ;ok
  46.         call clpga
  47.  
  48.         ld de,tallmem
  49.         OS_OPENHANDLE
  50.         ld a,b
  51.         ld (curhandle),a
  52.  
  53.         ld hl,tpgs
  54.        if FULL1M
  55.         ld b,64
  56.        else
  57.         ld b,48 ;для АТМ2
  58.        endif
  59. filltpgs0
  60.         push bc
  61.         push hl
  62.         OS_NEWPAGE
  63.         pop hl
  64.      ;ld a,l
  65.      ;add a,-40
  66.      ;cp 4-40 ;чистим первые 4 страницы и экран с остатком памяти ;para512 ожидает чистую память после себя, pillman ожидает чистый экран
  67.      ;;jr nc,filltpgs0_noclear
  68.        push de
  69.        push hl
  70.        ld a,e
  71.        ;call c,clpga
  72.        call clpga
  73.         SETPGC000
  74.         ld de,0xc000
  75.         ld hl,0x4000
  76.         ;call readcurhandle
  77.        pop hl
  78.        pop de
  79. filltpgs0_noclear
  80.         pop bc
  81.        ld a,l
  82.        rrc l
  83.        rrc l
  84.         ld (hl),e
  85.        ld l,a
  86.         inc l
  87.         djnz filltpgs0
  88.  
  89.         call closecurhandle
  90.  
  91. ;0xa0000 (pg 40): 4 pages for screen
  92. ;0xb8000 (pg 46): 1 page for textmode
  93.         ld h,tscreenpgs/256
  94.         ld bc,4*256+40
  95.         xor a
  96. filltscreenpgs0
  97.         add a,0x40
  98.        ld l,c
  99.        rrc l
  100.        rrc l
  101.         ld (hl),a
  102.             ;dec l     ;
  103.             ;ld (hl),a ;test backbuffer
  104.         inc c
  105.         djnz filltscreenpgs0
  106.        ld (tscreenpgs+0x8b),a ;for textmode
  107.  
  108.         ld bc,0xf000
  109.         ld (_CS),bc
  110.         countCS
  111.         ld bc,0xe000
  112.         ;encodePC;memCS ;out: a=physpg, de=zxaddr
  113.         ld hl,(cs_LSW)
  114.         ld a,(cs_HSB)
  115.         ADDRSEGMENT_chl_bHSB
  116.         ld b,tpgs/256
  117.         ld a,(bc)
  118.         SETPGC000
  119.         ld de,trom0
  120. ;de=имя файла
  121. ;hl=куда грузим
  122.         call loadfile_in_hl
  123.         ;ld de,0xfff0
  124.  
  125.         call swapimer ;сначала прерывания ничего не делают (iff1==0)
  126.  
  127.         jp initq
  128.  
  129. resetpp
  130.         xor a
  131.         ld (iff1),a
  132.  
  133.         call INT_setgfxTEXT80
  134.  
  135.         ld bc,0x400;0x0c02;0400
  136.         ld (_CS),bc
  137.         countCS
  138.         ld (_DS),bc
  139.         countDS
  140.         ld (_ES),bc
  141.         countES
  142.         ld (_SS),bc
  143.         countSS
  144.         ld hl,0xfffe;0xfff0
  145.         ld (_SP),hl
  146.         encodeSP
  147.        ;ld a,(tpgs+0x40) ;cs
  148.        ;SETPGC000
  149.        ;ld hl,0x9fff
  150.        ;ld (0xc002),hl ;cs:0002=top segment of mem?
  151.         ld hl,0x0002
  152.         ld bc,(cs_LSW)
  153.         ld a,(cs_HSB)
  154.         ADDRSEGMENT_chl_bHSB
  155.          ld lx,c
  156.         ld b,tpgs/256
  157.         ld a,(bc)
  158.         SETPGC000
  159.        ld bc,0x9fff
  160.         _PUTm16_oldpglx
  161.  
  162. loadaddr=$+1
  163.         ld de,0x7c00;STARTPC
  164.        push de
  165.         ;encodePC;memCS ;out: a=physpg, de=zxaddr
  166. filenameaddr=$+1
  167.         ld hl,tprog
  168.        ld a,d
  169.        dec a;cp 0x41
  170.        jr z,loadcom
  171.        ; set 7,d;STARTPC
  172.        ; ex de,hl
  173.        ;ld a,(tpgs+0x80) ;2-я страница сегмента программы = 3-я страница памяти (#2)
  174.        ;SETPGC000
  175.         ex de,hl
  176.        ;push de
  177.         ld bc,(cs_LSW)
  178.         ld a,(cs_HSB)
  179.         ADDRSEGMENT_chl_bHSB
  180.          ld lx,c
  181.         ld b,tpgs/256
  182.         ld a,(bc)
  183.         SETPGC000
  184.        ;pop de
  185. ;de=имя файла
  186. ;hl=куда грузим
  187.         call loadfile_in_hl ;for bootbasic
  188.         jr loadcomq
  189. loadcom
  190.         ex de,hl ;de=filename
  191.         ld bc,(_CS)
  192.         ld hl,0x0100 ;addr in segment
  193. ;de=filename
  194. ;bc=segment
  195. ;hl=addr in segment
  196.         call loadcompp
  197. loadcomq
  198.        pop de ;LD DE,STARTPC ;=IP(PC)
  199.  
  200.         LD IY,EMUCHECKQ
  201.        ld a,55+128 ;or a
  202.        ld (debugon),a ;no debug
  203.         ld a,-1
  204.         ld (iff1),a
  205.      jp JRer_qslow ;_LoopC_JP
  206.  
  207. ;de=имя файла
  208. ;hl=куда грузим
  209. loadfile_in_hl
  210.         push hl ;куда грузим
  211.         OS_OPENHANDLE
  212.         pop de ;куда грузим
  213.         push bc ;b=handle
  214.         ld h,0x7f ;столько грузим (если столько есть в файле)
  215.         OS_READHANDLE
  216.         pop bc ;b=handle
  217.         OS_CLOSEHANDLE
  218.         ret
  219.  
  220. cmd_loadfullpage
  221.         SETPGC000
  222.         ld a,0xc000/256
  223. cmd_loadpage
  224. ;out: a=error, bc=bytes read
  225. ;keeps hl,de
  226.         push de
  227.         push hl
  228.         ld d,a
  229.         xor a
  230.         ld l,a
  231.         ld e,a
  232.         sub d
  233.         ld h,a ;de=buffer, hl=size
  234.         call readcurhandle
  235.         ld b,h
  236.         ld c,l
  237.         pop hl
  238.         pop de
  239.         or a
  240.         ret
  241.  
  242. readcurhandle
  243. curhandle=$+1
  244.         ld b,0
  245.         OS_READHANDLE
  246.         ret
  247.  
  248. clpga
  249.         SETPGC000
  250.         ld hl,0xc000
  251.         ld d,h
  252.         ld e,l
  253.         inc e
  254.         ld bc,0x3fff
  255.         ld (hl),l;0
  256.         ldir
  257.         ret
  258.  
  259. ;keep here for quit
  260. swapimer
  261.         di
  262.         ld de,0x0038
  263.         ld hl,oldimer
  264.         ld bc,3
  265. swapimer0
  266.         ld a,(de)
  267.         ldi ;[oldimer] -> [0x0038]
  268.         dec hl
  269.         ld (hl),a ;[0x0038] -> [oldimer]
  270.         inc hl
  271.         jp pe,swapimer0
  272.         ei
  273.         ret
  274.  
  275. farquiter
  276.         call swapimer
  277.         ld hl,0
  278.         QUIT
  279.  
  280. trom0
  281.         db "compaq.bin",0 ;грузить в F000:E000, запускать с FFF0?
  282. tallmem
  283.         db "em87_1_3_installed.BIN",0 ;грузить во всю память
  284. tprog
  285.         ;db "atomchess.img",0 ;Его надо запускать в 0:7C00h, требует функции bios int 10h, 16h, 20h(system)
  286.         db "basic.img",0 ;Его надо запускать в 0:7C00h, требует функции bios int 10h, 16h, 20h(system)
  287.         ;db "lander.img",0 ;Его надо запускать в 0:0100h, требует функции bios int 10h, 21h(allocate, vectors)
  288.         ;db "ladybug.img",0 ;Его надо запускать в 0:0100h, требует функции bios int 10h, 20h(system)
  289.         ;db "megapole.img",0 ;Его надо запускать в 0:0100h, требует bios int 10h, 21h#9 (print)
  290.         ;DB "pc102782.bin",0
  291. path
  292.         db "x86",0
  293.  
  294. skipword
  295. ;hl=string
  296. ;out: hl=terminator/space addr
  297. getword0
  298.         ld a,(hl)
  299.         or a
  300.         ret z
  301.         cp ' '
  302.         ret z
  303.         inc hl
  304.         jr getword0
  305.  
  306. skipspaces
  307. ;hl=string
  308. ;out: hl=after last space
  309.         ld a,(hl)
  310.         cp ' '
  311.         ret nz
  312.         inc hl
  313.         jr skipspaces
  314.  
  315. loadcompp
  316. ;de=filename
  317. ;bc=segment
  318. ;hl=addr in segment
  319.        push hl
  320.        push bc ;segment
  321.         OS_OPENHANDLE
  322.         ld a,b
  323.         ld (curhandle),a
  324.        pop bc ;segment
  325.         call countXS_bc_to_ahl
  326.        pop bc ;addr in segment
  327.         ADDRSEGMENT_chl_bHSB
  328.         ld b,tpgs/256
  329.        push bc
  330.        push hl
  331.         ld a,(curhandle)
  332.         ld b,a
  333.         OS_GETFILESIZE ;b=handle, out: dehl=file size
  334.        pop de
  335.        pop bc
  336. loadcompp0
  337. ;de=текущий адрес загрузки (c000+)
  338. ;hl=сколько байтов осталось грузить
  339. ;bc=tpgs+текущий номер страницы
  340.         push bc
  341.         ld a,(bc)
  342.         SETPGC000
  343.        push hl ;сколько байтов осталось грузить
  344.        add hl,de
  345.        sbc hl,de
  346.        jr nc,loadcompp_nocroppg
  347.        ld hl,1
  348.        ;scf
  349.        sbc hl,de
  350. loadcompp_nocroppg
  351.         call readcurhandle
  352.         ld b,h
  353.         ld c,l
  354.        pop hl ;сколько байтов осталось грузить
  355.        or a
  356.        sbc hl,bc
  357.        ld de,0xc000
  358.         pop bc
  359.         ld a,c
  360.         rlca
  361.         rlca
  362.         inc a
  363.         rrca
  364.         rrca
  365.         ld c,a ;next pg
  366.         ld a,h
  367.         or l
  368.         jr nz,loadcompp0
  369. closecurhandle
  370.         ld a,(curhandle)
  371.         ld b,a
  372.         OS_CLOSEHANDLE
  373.         ret
  374.  
  375.  
  376. INT_gettimer
  377. ;int 1Ah ;AL= 24 hours overflow flag, CX:DX = 32bit timer
  378. ;_microtimer=$+1
  379. ;        ld hl,0
  380. ;        inc hl
  381. ;        ld (_microtimer),hl
  382.        ld hl,(timer)
  383.        ;srl h
  384.        ;rr l
  385.        ;srl h
  386.        ;rr l
  387.         ld (_DX),hl
  388.        ret;_Loop_
  389.  
  390. far_int
  391. ;int 0x20 ;system
  392. ;int 0x16 ;ah=0: input key -> al
  393. ;int 0x10 ;ah=0x0e: print al (зачем bx=7?)
  394. ;int 0x10 ;ah=0x00: set gfx mode = al (0x13)
  395.         cp 0x10
  396.         jr z,INT10
  397.         cp 0x16
  398.         jp z,INT16
  399.         cp 0x1a
  400.         jr z,INT_gettimer
  401.         cp 0x21
  402.         jp z,INT21
  403.         cp 0x80
  404.         ret nc;jr nc,intlooper ;костыль для megapole
  405.         cp 0x20
  406.         jp z,quiter
  407.  
  408.         cp 0x11
  409.         ret z ;TODO for shamus
  410.  
  411.         cp 0x13
  412.         ret z ;TODO for digger
  413.         cp 0x60
  414.         ret z ;TODO for digger
  415.  
  416.         cp 0x65
  417.         ret z ;TODO for NSTALKER
  418.  
  419.  if debug_stop = 0
  420.  ret
  421.  else
  422.  jr $
  423.  endif
  424.  
  425. ;intlooper
  426. ;       _Loop_
  427. printstring
  428. ;TODO AL = Write mode
  429. ;TODO BH = Page Number
  430. ;BL = Color
  431. ;CX = Number of characters in string
  432. ;DH = Row, DL = Column
  433. ;ES:BP = Offset of string
  434.        push de
  435.      DISABLE_IFF0_KEEP_IY
  436.        ld a,(_BL)
  437.        ld e,a ;%PpppIiii
  438.       rra
  439.       xor e
  440.       and 0x38
  441.       xor e
  442.       and 0xbf ;%P0pppiii
  443.       bit 3,e
  444.       jr z,$+4
  445.       or 0x40
  446.       ld e,a ;%PIpppiii
  447.        OS_SETCOLOR
  448.        ld hl,(_DX)
  449.        ;ld e,h
  450.        ;ld d,l
  451.        ex de,hl
  452.        OS_SETXY
  453.        ld bc,(_CX)
  454.        ld hl,(_BP)
  455. printstringbp0
  456.        push bc
  457.        push hl
  458.        getmemES
  459.        ;ld a,'@'
  460. ;a=char
  461.        PRCHAR
  462.        pop hl
  463.        pop bc
  464.        cpi
  465.        jp pe,printstringbp0
  466.       ;ld (_BP),hl ;так хуже в pitman
  467.      ENABLE_IFF0_REMEMBER_IY ;иначе pop iy запорет iy от обработчика прерывания
  468.        pop de
  469.        ret;_Loop_
  470.  
  471. INT10
  472.         ld a,(_AH)
  473.         or a
  474.         jp z,INT_setgfx
  475.         cp 0x13
  476.         jp z,printstring
  477.         cp 0x0e
  478.         jp z,INT_printal
  479.         cp 0x01
  480.         ret z;jr z,intlooper ;TODO disable caret
  481.         cp 0x02
  482.         jp z,INT_setcursorposition ;set cursor position
  483.         cp 0x03
  484.         jp z,INT_getcursorposition ;get cursor position
  485.         cp 0x09
  486.         jp z,INT_prcharandattr ;Писать символ и атрибут в текущей позиции курсора (zaxon, km, nstalker, pipes)
  487.         cp 0x0a
  488.         jp z,INT_prcharnoattr ;Write character only at cursor position  AH=0Ah  AL = Character, BH = Page Number, CX = Number of times to print character
  489.         cp 0x0b
  490.         ret z ;TODO for zaxon Set background/border color       AH=0Bh, BH = 00h        BL = Background/Border color (border only in text modes)
  491.         cp 0x10
  492.         ret z ;TODO for plutina AL = 1A  read color page state
  493.         cp 0x11
  494.         jp z,INT_setgfx ;blue (установка шрифта? не вызывает setgfx!!!)
  495.         cp 0x0f
  496.         jp z,INT_getgfx ;blue
  497.  
  498.  if debug_stop = 0
  499.  ret
  500.  else
  501.  jr $
  502.  endif
  503.  
  504. ;03h  Узнать позицию и размер курсора
  505. ;Вход:
  506. ;BH = видео страница
  507. ;Выход:
  508. ;DH = текущая строка курсора (см. функцию 02H)
  509. ;DL = текущий столбец курсора (см. функцию 02H)
  510. ;CH = текущая начальная строка экрана, содержащая курсор (см. функцию 01H) 0..7 внутри знакоместа?
  511. ;CL = текущая конечная строка экрана, содержащая курсор (см. функцию 01H)
  512. INT_getcursorposition
  513.         ld hl,(intcursorposition)
  514.         ld (_DX),hl
  515.         ld hl,0 ;TODO
  516.         ld (_CX),hl
  517.         ret
  518.  
  519.  
  520. INT_setcursorposition
  521. ;Вход:
  522. ;BH = видео страница
  523. ;DH = номер строки (считая от 0)
  524. ;DL = номер столбца (считая от 0)
  525.         ld hl,(_DX)
  526.         ld (intcursorposition),hl
  527.         ret
  528.  
  529. INT_prcharnoattr
  530. INT_prcharandattr
  531. ;Писать символ и атрибут в текущей позиции курсора (zaxon, km, nstalker, pipes)
  532. ;Вход:
  533. ;BH = номер видео страницы
  534. ;AL = записываемый символ (ASCII код)
  535. ;CX = счетчик (сколько экземпляров символа записать)
  536. ;BL = видео атрибут (текстовый режим) или цвет (графический режим)
  537. ;Примечание:
  538. ;При записи с помощью этой функции курсор не сдвигается!
  539. ;В графических режимах не рекомендуется использовать значение CX, отличное от единицы, т.к. не везде правильно реализован повтор символа
  540. ;Если программа работает под управлением PTS-DOS, то значения в BH, BL и CX могут быть проигнорированны)
  541.        push de
  542.         ld hl,(_AL)
  543.         ld h,0
  544.         add hl,hl
  545.         add hl,hl
  546.         add hl,hl
  547.         ld bc,font;0x1a6e+0xa000
  548.         add hl,bc
  549.         ;ld a,(tpgs+0xcf) ;last page of BIOS
  550.         ;SETPG8000 ;TODO fix for fast stack!!!
  551.        push hl
  552. intcursorposition=$+1
  553.         ld de,0
  554.         ld l,d
  555.         ld h,0
  556.          ld b,h
  557.         ld c,l
  558.         add hl,hl
  559.         add hl,hl
  560.         add hl,bc ;y*5
  561.         add hl,hl
  562.         add hl,hl
  563.         add hl,hl ;y*40
  564.         add hl,hl
  565.         add hl,hl
  566.         add hl,hl ;y*40*8
  567.         ld c,e
  568.          set 7,h
  569.          set 6,h
  570.        pop de ;gfx
  571.     if 0
  572.        push bc ;x
  573.        push de ;gfx
  574.        push hl ;y*40*8 + 0xc000
  575.         add hl,bc
  576.         ld b,8
  577. _leftpix=0x07
  578. _rightpix=0x38
  579. INT_prchar0
  580.         push bc
  581.         push de
  582.         ld a,(de)
  583.         ld e,a
  584.         ld a,(user_scr0_low) ;ok
  585.         SETPGC000
  586.         xor a
  587.         bit 7,e
  588.         jr z,$+4
  589.         or _leftpix
  590.         bit 6,e
  591.         jr z,$+4
  592.         or _rightpix
  593.         ld (hl),a
  594.         set 5,h
  595.         xor a
  596.         bit 3,e
  597.         jr z,$+4
  598.         or _leftpix
  599.         bit 2,e
  600.         jr z,$+4
  601.         or _rightpix
  602.         ld (hl),a
  603.         ld a,(user_scr0_high) ;ok
  604.         SETPGC000
  605.         xor a
  606.         bit 1,e
  607.         jr z,$+4
  608.         or _leftpix
  609.         bit 0,e
  610.         jr z,$+4
  611.         or _rightpix
  612.         ld (hl),a
  613.         res 5,h
  614.         xor a
  615.         bit 5,e
  616.         jr z,$+4
  617.         or _leftpix
  618.         bit 4,e
  619.         jr z,$+4
  620.         or _rightpix
  621.         ld (hl),a
  622.         ld bc,40
  623.         add hl,bc
  624.         pop de
  625.         inc de
  626.         pop bc
  627.         djnz INT_prchar0
  628.         ld a,(tpgs+0x8b) ;cga screen
  629.         SETPGC000
  630.        pop hl ;y*40*8 + 0xc000 = y*320 + 0xc000 = y*(320/4)*4 + 0xc000
  631.        pop de ;gfx
  632.        pop bc ;x
  633.     endif
  634.         add hl,bc
  635.         add hl,bc
  636.        ;jr $
  637.         call cgaput2bytes
  638.         set 5,h
  639.         call cgaput2bytes
  640.         ld bc,80-0x2000
  641.         add hl,bc
  642.         call cgaput2bytes
  643.         set 5,h
  644.         call cgaput2bytes
  645.         ld bc,80-0x2000
  646.         add hl,bc
  647.         call cgaput2bytes
  648.         set 5,h
  649.         call cgaput2bytes
  650.         ld bc,80-0x2000
  651.         add hl,bc
  652.         call cgaput2bytes
  653.         set 5,h
  654.         call cgaput2bytes
  655.         ;ld bc,80-0x2000
  656.         ;add hl,bc
  657.        pop de
  658.         ret
  659.  
  660. cgaput2bytes
  661.         ld a,(de)
  662.         ld c,a
  663.         xor a
  664.         rl c
  665.         rla
  666.         add a,a
  667.         rl c
  668.         rla
  669.         add a,a
  670.         rl c
  671.         rla
  672.         add a,a
  673.         rl c
  674.         rla
  675.         ld b,a
  676.         add a,a
  677.         or b
  678.         ld (hl),a
  679.        push bc
  680.         ld c,0x8b
  681.         _PUTscreen_logpgc_zxaddrhl_datamhl_keephlpg
  682.        pop bc
  683.        
  684.         inc l
  685.         xor a
  686.         rl c
  687.         rla
  688.         add a,a
  689.         rl c
  690.         rla
  691.         add a,a
  692.         rl c
  693.         rla
  694.         add a,a
  695.         rl c
  696.         rla
  697.         ld c,a
  698.         add a,a
  699.         or c
  700.         ld (hl),a
  701.         ld c,0x8b
  702.         _PUTscreen_logpgc_zxaddrhl_datamhl_keephlpg
  703.  
  704.         dec l
  705.         inc de
  706.         ret
  707.  
  708. INT21
  709.         ld a,(_AH)
  710. ;TODO 00h       Program terminate (plutina), с ожиданием клавиши
  711.         cp 0x09
  712.         jr z,INT_printstringdx
  713.         cp 0x4a
  714.         ret z;jr z,intlooper ;TODO deallocate (Resize memory block)
  715.         cp 0x48
  716.         ret z;jr z,intlooper ;TODO allocate (return ax = segment)
  717.         ;cp 0x06
  718.         ;ret z ;TODO 06h        Direct console I/O (for blaze0)
  719.         cp 0x07
  720.         jp z,dosgetchar ;(for mision)
  721.         cp 0x25
  722.         jp z,setvector;ret z ;for pitman ;set new int 09h vector
  723.         cp 0x35
  724.         jp z,getvector;ret z ;for pitman ;get and save old int 09h vector
  725.         cp 0x30
  726.         jp z,dosversion ;for rax
  727. ;TODO for lander:
  728. ;        mov     ax,ds                   ;deallocate all but 128k mem
  729. ;        mov     es,ax
  730. ;        mov     ah,4Ah
  731. ;        mov     bx,2000h ;size 128k
  732. ;        int     21h
  733.  
  734. ;        mov     ah,48h                  ;allocate       starbuf
  735. ;        mov     bx,1000h                ;64k
  736. ;        int     21h
  737. ;        mov     es,ax
  738.  
  739. ;        mov     ah,0                    ;init random seed
  740. ;        int     1Ah                     ; to timer
  741. ;        mov     word ptr r3[0],dx       ;
  742. ;        mov     word ptr r3[2],cx       ;
  743.  
  744.  
  745. ;        mov     ah,2                    ;scoreboard
  746. ;        mov     bh,0
  747. ;        mov     dh,24
  748. ;        mov     dl,0
  749. ;        int     10h ;???
  750. ;        mov     dx,offset fuelS
  751. ;        mov     ah,9
  752. ;        int     21h
  753.  
  754.  if debug_stop = 0
  755.  ret
  756.  else
  757.  jr $
  758.  endif
  759.  
  760. setvector
  761. ;set new int 09h vector
  762. ;        push    cs
  763. ;        pop     ds
  764. ;        mov     dx,offset key_int
  765. ;        mov     ah,25h
  766. ;        mov     al,09h
  767. ;        int     21h ;set vector al = ds:dx
  768.       ld a,(tpgs)
  769.       SETPGC000
  770.         ld a,(_AL)
  771.         add a,a
  772.         add a,a
  773.         ld l,a
  774.         ld h,0xc0
  775.         ld bc,(_DX)
  776.         ld (hl),c
  777.         inc l
  778.         ld (hl),b
  779.         inc l
  780.         ld bc,(_DS)
  781.         ld (hl),c
  782.         inc l
  783.         ld (hl),b
  784.         ret
  785.  
  786. getvector
  787. ;        mov     ah,35h                  ;get and save old int 09h vector
  788. ;        mov     al,09h
  789. ;        int     21h
  790. ;        mov     word ptr old_int9[0],bx
  791. ;        mov     word ptr old_int9[2],es
  792.       ld a,(tpgs)
  793.       SETPGC000
  794.         ld a,(_AL)
  795.         add a,a
  796.         add a,a
  797.         ld l,a
  798.         ld h,0xc0
  799.         ld c,(hl)
  800.         inc l
  801.         ld b,(hl)
  802.         ld (_BX),bc
  803.         inc l
  804.         ld c,(hl)
  805.         inc l
  806.         ld b,(hl)
  807.         ld (_ES),bc
  808.         ret
  809.  
  810. dosversion
  811. ;Entry: AL = what to return in BH (00h OEM number, 01h version flag)
  812. ;Return:
  813. ;AL = major version number (00h if DOS 1.x)
  814. ;AH = minor version number
  815. ;BL:CX = 24-bit user serial number (most versions do not use this) if DOS <5 or AL=00h
  816. ;BH = MS-DOS OEM number if DOS 5+ and AL=01h
  817. ;BH = version flag bit 3: DOS is in ROM other: reserved (0)
  818. ;TODO
  819.         ld hl,5
  820.         ld (_AX),hl
  821.         ret
  822.  
  823. INT_printstringdx
  824. ;TODO
  825.         ;jr $
  826.        ret;_Loop_
  827.  
  828. INT_getgfx ;blue
  829. ;Выход:
  830. ;AL = текущий режим (см. функцию 00h)
  831. ;AH = число текстовых столбцов на экране
  832. ;BH = текущий номер активной страницы дисплея
  833. curgfxmode=$+1
  834.         ld hl,80*256 ;TODO patch h
  835.         ld (_AX),hl
  836.         xor a
  837.         ld (_BH),a
  838.         ret
  839.  
  840. INT_setgfx
  841. ;TODO redraw all screen memory after that
  842.          ;jr $
  843.        ld a,(_AL)
  844.        ld (curgfxmode),a
  845.        cp 0x01 ;sorryass
  846.        jr z,INT_setgfxTEXT40
  847.        cp 0x07 ;shamus "please turn on the color display"
  848.        jr z,INT_setgfxTEXT40
  849.        cp 0x04 ;CGA 320x200x4
  850.        ld hl,cgapal1
  851.        jr z,INT_setgfxCGA
  852.        cp 0x05 ;CGA 320x200x4
  853.        ld hl,cgapal2
  854.        jr z,INT_setgfxCGA
  855.        cp 0x13
  856.        jr nz,INT_setgfxTEXT80
  857.         ld hl,ansipal
  858.         call setegamode_palhl
  859.         ld hl,wasPUTscreen_vga
  860.         call setPUTscreen_hl
  861. ;INT_setgfxq
  862.        ret;_Loop_
  863. INT_setgfxCGA
  864.         call setegamode_palhl
  865.         ld hl,wasPUTscreen_cga
  866.         call setPUTscreen_hl
  867.         ld hl,trecolour
  868. mkrecga0
  869.         ld c,l ;%????LlRr
  870.         xor a
  871.         rr c
  872.         rla
  873.         rr c
  874.         rla
  875.         add a,a
  876.         rr c
  877.         rla
  878.         rr c
  879.         rla
  880.         ;rlca ;a=%lRr????L
  881.         ;rlca ;a=%Rr????Ll
  882.         ;add a,a;%r????Ll0 CY=R
  883.         ;rla  ;a=%????Ll0R
  884.         ;rla  ;a=%???Ll0Rr
  885.         ;and 0x1f;000rR0lL
  886.         ld (hl),a
  887.         inc l
  888.         jr nz,mkrecga0
  889.        ret;_Loop_
  890. INT_setgfxTEXT40
  891.         call settextmode
  892.         ld hl,wasPUTscreen_textmode40
  893.         call setPUTscreen_hl
  894. ;       macro dbrrc3 data
  895. ;        db (data>>3)+((data<<5)&0xe0)
  896. ;       endm
  897. ;ttextaddr
  898. ;        dup 128
  899. ;_=$&0xff
  900. ;; |младший
  901. ;;0GgggGGG -> 0GGGGggg:
  902. ;_=((_&0x07)<<4)+((_&0x78)>>3)
  903. ;       if _<125
  904. ;_=_/5*8+(_-(_/5*5))+56
  905. ;        dbrrc3 _
  906. ;       else
  907. ;        dbrrc3 255
  908. ;       endif
  909. ;        edup
  910.         ld hl,ttextaddr
  911. mktext40addr0
  912.         ld (hl),0;255
  913.         ld a,l
  914.         and 0x07
  915.        rrca
  916.        ;rrca
  917.        ;rrca
  918.        ;rrca
  919.        ;ld c,a
  920.         ;ld a,l
  921.         ;and 0x78
  922.         xor l
  923.         and 0x87
  924.         xor l
  925.        rrca
  926.        rrca
  927.        rrca
  928.        ;or c
  929. ;a=_
  930.         cp 125
  931.         jr nc,mktext40addr_skip
  932.         ld b,-1
  933.        inc b
  934.        sub 5
  935.        jr nc,$-3
  936.         add a,5 ;a=(_ mod 5) ;b=_/5
  937.         sla b
  938.         sla b
  939.         add a,b
  940.         add a,b
  941.         add a,56 ;a=_/5*8+(_-(_/5*5))+56
  942.         rrca
  943.         rrca
  944.         rrca
  945.         ld (hl),a
  946. mktext40addr_skip
  947.         inc l
  948.         jp p,mktext40addr0
  949.         ret
  950. INT_setgfxTEXT80
  951.         call settextmode
  952.         ld hl,wasPUTscreen_textmode
  953.         call setPUTscreen_hl
  954. ;       macro dbrrc3 data
  955. ;        db (data>>3)+((data<<5)&0xe0)
  956. ;       endm
  957. ;ttextaddr
  958. ;        dup 128
  959. ;_=$&0xff
  960. ;;0gggGGGG -> 0GGGGggg:
  961. ;_=((_&0x0f)<<3)+((_&0x70)>>4)
  962. ;       if _<125
  963. ;_=_/5*8+(_-(_/5*5))+56
  964. ;        dbrrc3 _
  965. ;       else
  966. ;        dbrrc3 255
  967. ;       endif
  968. ;        edup
  969.         ld hl,ttextaddr
  970. mktextaddr0
  971.         ld (hl),255
  972.         ld a,l
  973.         and 0x70
  974.         rlca
  975.         xor l
  976.         and 0xf0
  977.         xor l
  978.        rlca
  979.        rlca
  980.        rlca
  981. ;a=_
  982.         cp 125
  983.         jr nc,mktextaddr_skip
  984.         ld b,-1
  985.        inc b
  986.        sub 5
  987.        jr nc,$-3
  988.         add a,5 ;a=(_ mod 5) ;b=_/5
  989.         sla b
  990.         sla b
  991.         add a,b
  992.         add a,b
  993.         add a,56 ;a=_/5*8+(_-(_/5*5))+56
  994.         rrca
  995.         rrca
  996.         rrca
  997.         ld (hl),a
  998. mktextaddr_skip
  999.         inc l
  1000.         jp p,mktextaddr0
  1001.         ret
  1002.  
  1003. setegamode_palhl
  1004.         push de
  1005.         call setpalhl_with_caution ;OS_SETPAL ;TODO с копированием во временную палитру
  1006.         ld e,0+0x80 ;EGA+keep
  1007.         call setgfx
  1008.         ld hl,wastrecolour
  1009.         ld de,trecolour
  1010.         ld bc,256
  1011.         ldir
  1012.         pop de
  1013.         ret
  1014.  
  1015. settextmode
  1016.         push de
  1017.         ld hl,ansipal
  1018.         call setpalhl_with_caution ;OS_SETPAL ;TODO с копированием во временную палитру
  1019.         ld e,6+0x80 ;text+keep
  1020.         call setgfx
  1021.         ld hl,wast866toatm
  1022.         ld de,trecolour
  1023.         ld bc,256
  1024.         ldir
  1025.         pop de
  1026.         ret
  1027.  
  1028. setPUTscreen_hl
  1029.         push de
  1030.         ld de,PUTscreen_logpgc_zxaddrhl_datamhl_do
  1031.         ld bc,maxszPUTscreen
  1032.         ldir
  1033.         pop de
  1034.         ret
  1035.  
  1036. setgfx
  1037.      DISABLE_IFF0_KEEP_IY
  1038.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  1039.         ld e,0
  1040.         OS_CLS
  1041.      ENABLE_IFF0_REMEMBER_IY ;иначе pop iy запорет iy от обработчика прерывания
  1042.         ret
  1043.  
  1044. setpalhl_with_caution
  1045.        push de
  1046.      DISABLE_IFF0_KEEP_IY
  1047.        ex de,hl
  1048.        OS_SETPAL
  1049.      ENABLE_IFF0_REMEMBER_IY ;иначе pop iy запорет iy от обработчика прерывания
  1050.        pop de
  1051.        ret
  1052.  
  1053. INT_printal
  1054.         push de
  1055.         ex af,af' ;'
  1056.         push af
  1057.      DISABLE_IFF0_KEEP_IY
  1058.         ld a,(_AL)
  1059.         PRCHAR
  1060.      ENABLE_IFF0_REMEMBER_IY ;иначе pop iy запорет iy от обработчика прерывания
  1061.         pop af
  1062.         ex af,af' ;'
  1063.         pop de
  1064.        ret;_Loop_
  1065.  
  1066. INT16
  1067.         ;jr $
  1068.         ;mov ah,0x01     ; Any key pressed?
  1069.         ;int 0x16
  1070.         ;jz fb26         ; No, go to main loop
  1071.        ld a,(_AH)
  1072.        or a
  1073.        jr z,INT_inputal
  1074.        dec a
  1075.        jp nz,INT_getkeyflags
  1076.         ;jr $
  1077. ;1 Получить состояние клавиатуры (84-клавишная клавиатура)
  1078. ;Выход:
  1079. ;При ZF=1 нет клавиши
  1080. ;При ZF=0: (враньё??? pillman игнорит это значение ax и сразу читает через ah=0!!!)
  1081. ;     AH - скан-код
  1082. ;     AL - ASCII код
  1083. int16getkey
  1084.         ld a,(prefetchedkey)
  1085.         or a
  1086.        if 0
  1087.         jr nz,INT_inputal_a
  1088.        else
  1089.         jr nz,INT16havekey
  1090.        endif
  1091.         push de
  1092.      DISABLE_IFF0_KEEP_IY
  1093.         OS_GETKEY
  1094.      ENABLE_IFF0_REMEMBER_IY ;иначе pop iy запорет iy от обработчика прерывания
  1095.         pop de
  1096.         ret nz;jr nz,INT16q ;no focus
  1097.        ld b,a
  1098.         ex af,af' ;'
  1099.         inc b
  1100.         dec b ;Z (no key)
  1101.         ex af,af' ;'
  1102.        or a
  1103.        ret z
  1104.        if 0
  1105.        jr INT_inputal_a
  1106.        else
  1107. INT16havekey
  1108.        ;ld a,0x48
  1109.         ld (prefetchedkey),a
  1110.         call nedooskey_to_pckey ;a->bc
  1111.          ld (_AX),bc
  1112.         ex af,af' ;'
  1113.         inc b
  1114.         dec b ;Z/NZ
  1115.         ex af,af' ;'
  1116.        ret;_Loop_
  1117.        endif
  1118. INT_inputal
  1119. prefetchedkey=$+1
  1120.         ld a,0
  1121.         or a
  1122.         jr nz,INT_inputal_a
  1123.         push de
  1124.      DISABLE_IFF0_KEEP_IY
  1125.         YIELDGETKEYLOOP;OS_GETKEY
  1126. ;        A - код символа(кнопки). Допустимые коды смотри в 'sysdefs.asm' секция 'Usable key codes'
  1127. ;        C - код символа(кнопки) без учета текущего языкового модификатора. Как правило, используется для обработки "горячих кнопок"
  1128. ;        DE - позиция мыши (y,x) (возвращает 0 при отсутствии фокуса)
  1129. ;        L - кнопки мыши (bits 0(LMB),1(RMB),2(MMB): 0=pressed; bits 7..4=положение колёсика)
  1130. ;        LX - Kempston joystick (0bP2JFUDLR): 1=pressed, - при отсутствии джойстика 0 (а не 0xff)
  1131. ;        Флаг Z - если 0(NZ), то отсутствует фокус.
  1132.      ENABLE_IFF0_REMEMBER_IY ;иначе pop iy запорет iy от обработчика прерывания
  1133.         pop de
  1134. INT_inputal_a
  1135.         ;ld (_AL),a
  1136.         call nedooskey_to_pckey ;a->bc
  1137.          ;ld a,c
  1138.          ;ld (_AH),a ;scancode for pillman
  1139.          ld (_AX),bc
  1140.         ex af,af' ;'
  1141.         inc b
  1142.         dec b ;NZ if key
  1143.         ex af,af' ;'
  1144.         xor a
  1145.         ld (prefetchedkey),a
  1146. ;INT16q
  1147.        ret;_Loop_
  1148. INT_getkeyflags
  1149. ;16h#2 (keyboard flags: al=0x10(scrolllock)+0x08(alt)+0x04(ctrl)+0x03(shifts))
  1150.         ld a,0xfe
  1151.         in a,(0xfe)
  1152.         cpl
  1153.         and 0x1f
  1154.         ld (_AL),a
  1155.        ret;_Loop_
  1156.  
  1157. dosgetchar=INT_inputal
  1158. ;dosgetchar=int16getkey ;livin проскакивает меню
  1159. ;Return:
  1160. ;ZF set if no character available and AL = 00h
  1161. ;ZF clear if character available AL = character read
  1162.  
  1163. nedooskey_to_pckey ;a->bc
  1164.          ld bc,0x011b ;1b for pitman, 01 for pillman?
  1165.          cp key_esc
  1166.          jr z,INT_inputal_a_scancodeq
  1167.          ld bc,0x1c0d ;HSB for pipes, LSB for cgagame (ratillery)
  1168.          cp key_enter
  1169.          jr z,INT_inputal_a_scancodeq
  1170.          ld bc,0x3b00
  1171.          cp key_F1
  1172.          jr z,INT_inputal_a_scancodeq
  1173.          inc b;ld b,0x3c
  1174.          cp key_F2
  1175.          jr z,INT_inputal_a_scancodeq
  1176.          inc b;ld b,0x3d
  1177.          cp key_F3
  1178.          jr z,INT_inputal_a_scancodeq
  1179.          inc b;ld b,0x3e
  1180.          cp key_F4
  1181.          jr z,INT_inputal_a_scancodeq
  1182.          inc b;ld b,0x3f
  1183.          cp key_F5
  1184.          jr z,INT_inputal_a_scancodeq
  1185.          inc b;ld b,0x40
  1186.          cp key_F6
  1187.          jr z,INT_inputal_a_scancodeq
  1188.          inc b;ld b,0x41
  1189.          cp key_F7
  1190.          jr z,INT_inputal_a_scancodeq
  1191.          inc b;ld b,0x42
  1192.          cp key_F8
  1193.          jr z,INT_inputal_a_scancodeq
  1194.          inc b;ld b,0x43
  1195.          cp key_F9
  1196.          jr z,INT_inputal_a_scancodeq
  1197.          inc b;ld b,0x44
  1198.          cp key_F10
  1199.          jr z,INT_inputal_a_scancodeq
  1200.          ld b,0x4b
  1201.          cp key_left
  1202.          jr z,INT_inputal_a_scancodeq
  1203.          ld b,0x4d
  1204.          cp key_right
  1205.          jr z,INT_inputal_a_scancodeq
  1206.          ld b,0x48
  1207.          cp key_up
  1208.          jr z,INT_inputal_a_scancodeq
  1209.          ld b,0x50
  1210.          cp key_down
  1211.          jr z,INT_inputal_a_scancodeq
  1212.         ld b,a;c;0
  1213.          ld c,a
  1214. INT_inputal_a_scancodeq
  1215.         ret
  1216.  
  1217.  
  1218.  
  1219.  
  1220. wasPUTscreen_cga
  1221.      disp PUTscreen_logpgc_zxaddrhl_datamhl_do
  1222.         ld c,(hl) ;4 pixels
  1223.         inc b ;(b=trecolour/256)
  1224. ;a=1..4*0x40
  1225.        ld a,(bc)
  1226.        ld (cgarightpair),a
  1227.        ld a,c
  1228.        rlca
  1229.        rlca
  1230.        rlca
  1231.        rlca
  1232.        ld c,a ;или ещё одну таблицу
  1233.        ld a,(bc)
  1234.        ld (cgaleftpair),a
  1235.         ld a,(pgprog)
  1236.         SETPGC000
  1237. ;экран CGA = 80 байт на строку (8000 байт один слой)
  1238. ;экран ZXEGA = 40 байт на строку *4 слоя
  1239. ;чередование строк CGA (нечётные идут вторым слоем с +8192) - по таблице 64-пиксельных блоков? если берём одну половину CGA экрана, то это из 500 блоков вычисляем 1000 (или если ещё разделить на 4 части, то из 125 блоков вычисляем 250)
  1240. ;или придётся быстро делить на 80 и умножать на 40
  1241. ;или по большой таблице в страничке
  1242.        ld c,l ;запомнить младшие 4 бита
  1243.        ld b,h ;запомнить bit 5
  1244.         ld a,h
  1245.         rra
  1246.         rr l
  1247.         rra
  1248.         rr l
  1249.         rra
  1250.         rr l
  1251.         and 0x03
  1252.         add a,+(tcga|0xc000)/256
  1253.         ld h,a
  1254.         res 0,l
  1255.         ld a,(hl)
  1256.         inc l
  1257.         ld h,(hl)
  1258.        rr c
  1259.         jr nc,$+4
  1260.         set 5,h
  1261.         xor c
  1262.         and 0xf8
  1263.         xor c
  1264.         ld l,a
  1265.        bit 5,b ;бывший bit 5,h
  1266.         jr z,$+2+3+1
  1267.          ld bc,40
  1268.          add hl,bc
  1269.         ld a,(user_scr0_low) ;ok
  1270.         SETPGC000
  1271. cgaleftpair=$+1
  1272.      ld (hl),0
  1273.         ld a,(user_scr0_high) ;ok
  1274.         SETPGC000
  1275. cgarightpair=$+1
  1276.      ld (hl),0
  1277.         ret
  1278.       ent
  1279. szPUTscreen_cga=$-wasPUTscreen_cga
  1280.  
  1281. wasPUTscreen_vga
  1282.      disp PUTscreen_logpgc_zxaddrhl_datamhl_do
  1283.         ld c,(hl)
  1284.         inc b ;(b=trecolour/256)
  1285. ;a=1..4*0x40
  1286.         add a,h
  1287.         ld h,a
  1288. ;экран VGA = 320 байт на строку
  1289. ;экран ZXEGA = 40 байт на строку *4 слоя
  1290.         scf
  1291.         rr h
  1292.         rr l ;CY=left/right
  1293.         jr c,PUTscreen_rightpixel
  1294.         sra h
  1295.         rr l
  1296.         ld a,(user_scr0_low) ;ok
  1297.         jr nc,$+5
  1298.         ld a,(user_scr0_high) ;ok
  1299.        push bc
  1300.         SETPGC000
  1301.        pop bc
  1302.         sra h
  1303.         rr l
  1304.         jr c,$+4
  1305.         res 5,h
  1306.      ld a,(bc)
  1307.      xor (hl)
  1308.      and 0b01000111
  1309.      xor (hl)
  1310.      ld (hl),a
  1311.         ret
  1312. PUTscreen_rightpixel
  1313.         sra h
  1314.         rr l
  1315.         ld a,(user_scr0_low) ;ok
  1316.         jr nc,$+5
  1317.         ld a,(user_scr0_high) ;ok
  1318.        push bc
  1319.         SETPGC000
  1320.        pop bc
  1321.         sra h
  1322.         rr l
  1323.         jr c,$+4
  1324.         res 5,h
  1325.      ld a,(bc)
  1326.      xor (hl)
  1327.      and 0b10111000
  1328.      xor (hl)
  1329.      ld (hl),a
  1330.         ret
  1331.      ent
  1332. szPUTscreen_vga=$-wasPUTscreen_vga
  1333.  
  1334.  
  1335. wasPUTscreen_textmode40
  1336.      disp PUTscreen_logpgc_zxaddrhl_datamhl_do
  1337.        bit 3,h
  1338.        ret nz ;only for 40 pitch (sorryass)
  1339.         ld c,(hl) ;colour
  1340. ;The VGA text buffer is located at physical memory address 0xB8000.
  1341. ;25 строк по 40 слов: символ, атрибут (%FpppIiii - пересчитать в PIpppiii)
  1342.        push bc
  1343. ;для 40 символов в строке группы по 8 символов:
  1344. ;hl=00000GGG GgggXXxA
  1345.         ld a,l  ;gggXXXxA
  1346.         srl a
  1347.         xor h
  1348.         and 0xf8 ;0xf8 для 40 символов в строке
  1349.         xor h   ;0gggGGGG
  1350. ;пересчитываем в номер группы на АТМ textmode:
  1351.         ld b,ttextaddr/256
  1352.         ld c,a
  1353.         ld a,(bc) ;gggGGGgg
  1354.        rra;srl a ;srl a для 40 символов в строке (для 80 вообще не нужно)
  1355.         xor l
  1356.         and 0xf0 ;0xf0 для 40 символов в строке
  1357.         xor l
  1358.         ld l,a
  1359.         ld a,(bc) ;gggGGGgg
  1360.         and 0x1f
  1361. ;пересчитываем в адрес группы на ATM textmode (группы по 8 символов):
  1362. ;hl=000GGGgg 0gggXXxA ;+0x01c0 уже прибавлено к номеру группы как +56
  1363.          scf
  1364.          rra
  1365.         rr l
  1366.         jr c,PUTscreen_textmode40_attr
  1367.          scf
  1368.          rra
  1369.         rr l
  1370.         jr nc,$+4
  1371.          or 0x20;set 5,h
  1372.         ld h,a
  1373. ;RAM page #05 (#07):
  1374. ;#21C0...#27FF - character codes of odd (1,3,...) characters (25 lines, every line is 64 bytes, of which only first 40 are significant).
  1375. ;#01C0...#07FF - character codes of even (0,2,...) characters (ditto).
  1376.         ld a,(user_scr0_high) ;ok
  1377.         SETPGC000
  1378.        pop bc
  1379.        inc b ;ld b,t866toatm/256
  1380.        ld a,(bc)
  1381.         ld (hl),a
  1382.         ret
  1383. PUTscreen_textmode40_attr
  1384.          rra
  1385.         rr l
  1386.         inc l
  1387.         jr c,$+5
  1388.          or 0x20
  1389.          dec l
  1390.         ld h,a
  1391. ;RAM page #01 (#03):
  1392. ;#21C0...#27FF - attributes of even(!) characters (ditto).
  1393. ;#01C1...#07FF - attributes of odd(!) characters (ditto).
  1394.         ld a,(user_scr0_low) ;ok
  1395.         SETPGC000
  1396.        pop bc ;c=%ppppiiii
  1397.         ld a,c
  1398.         rra
  1399.         xor c
  1400.         and 0b00111000
  1401.         xor c
  1402.         and 0b10111111
  1403.         bit 3,c
  1404.         jr z,$+4
  1405.         or 0b01000000
  1406.         ld (hl),a ;%pipppiii
  1407.         ret
  1408.      ent
  1409. szPUTscreen_textmode40=$-wasPUTscreen_textmode40
  1410.  
  1411.  
  1412. wasPUTscreen_textmode
  1413.      disp PUTscreen_logpgc_zxaddrhl_datamhl_do
  1414.         ld c,(hl) ;colour
  1415. ;The VGA text buffer is located at physical memory address 0xB8000.
  1416. ;25 строк по 80 слов: символ, атрибут (%FpppIiii - пересчитать в PIpppiii)
  1417. ;как пересчитать строки по 160 байт (80 символов) в строки по 64 байта (128 виртуальных символов)? всего 2000 знакомест = 125 групп по 16 символов, можно по таблице получить адрес (2 байта) или номер виртуальной группы (их всего 200, т.е. 1 байт)
  1418.        push bc
  1419. ;получаем номер группы по 16 символов:
  1420. ;hl=0000GGGG gggXXXxA
  1421.         ld a,l  ;gggXXXxA
  1422.         srl a
  1423.         xor h
  1424.         and 0xf0 ;0xf8 для 40 символов в строке
  1425.         xor h   ;0gggGGGG
  1426. ;пересчитываем в номер группы на АТМ textmode:
  1427.         ld b,ttextaddr/256
  1428.         ld c,a
  1429.         ld a,(bc) ;gggGGGgg
  1430.         xor l
  1431.         and 0xe0 ;srl a...0xf0 для 40 символов в строке
  1432.         xor l
  1433.         ld l,a
  1434.         ld a,(bc) ;gggGGGgg
  1435.         and 0x1f
  1436. ;пересчитываем в адрес группы на ATM textmode:
  1437. ;hl=000GGGgg gggXXXxA ;+0x01c0 уже прибавлено к номеру группы как +56
  1438.          scf
  1439.          rra
  1440.         rr l
  1441.         jr c,PUTscreen_textmode_attr
  1442.          scf
  1443.          rra
  1444.         rr l
  1445.         jr nc,$+4
  1446.          or 0x20;set 5,h
  1447.         ld h,a
  1448. ;RAM page #05 (#07):
  1449. ;#21C0...#27FF - character codes of odd (1,3,...) characters (25 lines, every line is 64 bytes, of which only first 40 are significant).
  1450. ;#01C0...#07FF - character codes of even (0,2,...) characters (ditto).
  1451.         ld a,(user_scr0_high) ;ok
  1452.         SETPGC000
  1453.        pop bc
  1454.        inc b ;ld b,t866toatm/256
  1455.        ld a,(bc)
  1456.         ld (hl),a
  1457.         ret
  1458. PUTscreen_textmode_attr
  1459.          rra
  1460.         rr l
  1461.         inc l
  1462.         jr c,$+5
  1463.          or 0x20
  1464.          dec l
  1465.         ld h,a
  1466. ;RAM page #01 (#03):
  1467. ;#21C0...#27FF - attributes of even(!) characters (ditto).
  1468. ;#01C1...#07FF - attributes of odd(!) characters (ditto).
  1469.         ld a,(user_scr0_low) ;ok
  1470.         SETPGC000
  1471.        pop bc ;c=%ppppiiii
  1472.         ld a,c
  1473.         rra
  1474.         xor c
  1475.         and 0b00111000
  1476.         xor c
  1477.         and 0b10111111
  1478.         bit 3,c
  1479.         jr z,$+4
  1480.         or 0b01000000
  1481.         ld (hl),a ;%pipppiii
  1482.         ret
  1483.      ent
  1484. szPUTscreen_textmode=$-wasPUTscreen_textmode
  1485.  
  1486.         display "szPUTscreen_cga=",szPUTscreen_cga
  1487.         display "szPUTscreen_vga=",szPUTscreen_vga
  1488.         display "szPUTscreen_textmode40=",szPUTscreen_textmode40
  1489.         display "szPUTscreen_textmode=",szPUTscreen_textmode
  1490.         display "memory for PUTscreen=",maxszPUTscreen
  1491.  
  1492.  
  1493.  
  1494. ;DDp palette: %grbG11RB(low),%grbG11RB(high), inverted
  1495. ;standard:
  1496.         ;dw 0xffff,0xfefe,0xfdfd,0xfcfc,0xefef,0xeeee,0xeded,0xecec
  1497.         ;dw 0xffff,0xdede,0xbdbd,0x9c9c,0x6f6f,0x4e4e,0x2d2d,0x0c0c
  1498. ;ansi:
  1499.         ;dw 0xffff,0xfdfd,0xefef,0xeded,0xfefe,0xfcfc,0xeeee,0xecec
  1500.         ;dw 0x1f1f,0x1d1d,0x0f0f,0x0d0d,0x1e1e,0x1c1c,0x0e0e,0x0c0c
  1501. cgapal1
  1502. ;0,R,G,Y (bits swapped):
  1503.        dup 4
  1504.         dw 0xffff,0x1d1d,0x0f0f,0x0d0d
  1505.        edup
  1506. cgapal2
  1507. ;0,M,C,W (bits swapped):
  1508.        dup 4
  1509.         dw 0xffff,0x9c9c,0x4e4e,0x0c0c
  1510.        edup
  1511.  
  1512. wast866toatm
  1513.         incbin "../kernel/866toatm"
  1514.  
  1515.        macro dbcol _0
  1516.         db ((_0)&7)*9 + (((_0)&8)*0x18)
  1517.        endm
  1518.  
  1519.        macro dbcol8 _0,_1,_2,_3,_4,_5,_6,_7
  1520.         dbcol _0
  1521.         dbcol _1
  1522.         dbcol _2
  1523.         dbcol _3
  1524.         dbcol _4
  1525.         dbcol _5
  1526.         dbcol _6
  1527.         dbcol _7
  1528.        endm
  1529.  
  1530.        macro dbcol8i _0,_1,_2,_3,_4,_5,_6,_7
  1531.         dbcol8 _0|0x08,_1|0x08,_2|0x08,_3|0x08,_4|0x08,_5|0x08,_6|0x08,_7|0x08
  1532.        endm
  1533.  
  1534. wastrecolour ;TODO generate for given palette
  1535.         dup 16
  1536.         dbcol ($-wastrecolour)
  1537.         edup
  1538. ;0x10
  1539.         dbcol8 0,0,0,0,8,8,8,8
  1540.         dbcol8 7,7,7,7,15,15,15,15
  1541. ;0x20
  1542.         dbcol8 1,1,1,5,5,5,4,4
  1543.         dbcol8 4,4,4,6,6,6,2,2
  1544.         dbcol8 2,2,2,3,3,3,1,1
  1545. ;0x38
  1546.         dbcol8i 1,1,1,5,5,5,4,4
  1547.         dbcol8i 4,4,4,6,6,6,2,2
  1548.         dbcol8i 2,2,2,3,3,3,1,1
  1549. ;0x50
  1550.         dbcol8i 7,7,7,7,7,7,7,7
  1551.         dbcol8i 7,7,7,7,7,7,7,7
  1552.         dbcol8i 7,7,7,7,7,7,7,7
  1553. ;0x68
  1554.         dbcol8 1,1,1,5,5,5,4,4
  1555.         dbcol8 4,4,4,6,6,6,2,2
  1556.         dbcol8 2,2,2,3,3,3,1,1
  1557. ;0x80
  1558.        dup 6
  1559.         dbcol8 8,8,8,8,8,8,8,8
  1560.        edup
  1561. ;0xb0
  1562.         ds 72,0x00
  1563. ;0xf8
  1564.         ds 8,0
  1565.  
  1566.         align 256
  1567. tcga
  1568. _y=0
  1569.        dup 100
  1570. _x=0
  1571.        dup 5
  1572.        dw 0xc000+(80*_y)+(8*_x)
  1573. _x=_x+1
  1574.        edup
  1575. _y=_y+1
  1576.        edup
  1577.        dup 24
  1578.         ;dw 0xfff8;запарывает rst
  1579.         dw 0xc000+(80*200)
  1580.        edup
  1581.  
  1582. font
  1583.         incbin "866_code.fnt"
  1584.