?login_element?

Subversion Repositories NedoOS

Rev

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