?login_element?

Subversion Repositories NedoOS

Rev

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

  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 VGA screen
  92. ;0xb8000 (pg 46): 1 page for textmode/CGA
  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. INT_setgfx_a
  846.        cp 0x01 ;sorryass
  847.        jr z,INT_setgfxTEXT40
  848.        cp 0x07 ;shamus "please turn on the color display"
  849.        jr z,INT_setgfxTEXT40
  850.        cp 0x04 ;CGA 320x200x4
  851.        ld hl,cgapal1
  852.        jr z,INT_setgfxCGA
  853.        cp 0x05 ;CGA 320x200x4
  854.        ld hl,cgapal2
  855.        jr z,INT_setgfxCGA
  856.        cp 0x13
  857.        jr nz,INT_setgfxTEXT80
  858.         ld hl,ansipal
  859.         call setegamode_palhl
  860.         ld hl,wasPUTscreen_vga
  861.         call setPUTscreen_hl
  862. ;INT_setgfxq
  863.        ret;_Loop_
  864. INT_setgfxCGA
  865.         call setegamode_palhl
  866.         ld hl,wasPUTscreen_cga
  867.         call setPUTscreen_hl
  868.         ld hl,trecolour
  869. mkrecga0
  870.         ld c,l ;%????LlRr
  871.         xor a
  872.         rr c
  873.         rla
  874.         rr c
  875.         rla
  876.         add a,a
  877.         rr c
  878.         rla
  879.         rr c
  880.         rla
  881.         ;rlca ;a=%lRr????L
  882.         ;rlca ;a=%Rr????Ll
  883.         ;add a,a;%r????Ll0 CY=R
  884.         ;rla  ;a=%????Ll0R
  885.         ;rla  ;a=%???Ll0Rr
  886.         ;and 0x1f;000rR0lL
  887.         ld (hl),a
  888.         inc l
  889.         jr nz,mkrecga0
  890.        ret;_Loop_
  891. INT_setgfxTEXT40
  892.         call settextmode
  893.         ld hl,wasPUTscreen_textmode40
  894.         call setPUTscreen_hl
  895. ;       macro dbrrc3 data
  896. ;        db (data>>3)+((data<<5)&0xe0)
  897. ;       endm
  898. ;ttextaddr
  899. ;        dup 128
  900. ;_=$&0xff
  901. ;; |младший
  902. ;;0GgggGGG -> 0GGGGggg:
  903. ;_=((_&0x07)<<4)+((_&0x78)>>3)
  904. ;       if _<125
  905. ;_=_/5*8+(_-(_/5*5))+56
  906. ;        dbrrc3 _
  907. ;       else
  908. ;        dbrrc3 255
  909. ;       endif
  910. ;        edup
  911.         ld hl,ttextaddr
  912. mktext40addr0
  913.         ld (hl),0;255
  914.         ld a,l
  915.         and 0x07
  916.        rrca
  917.        ;rrca
  918.        ;rrca
  919.        ;rrca
  920.        ;ld c,a
  921.         ;ld a,l
  922.         ;and 0x78
  923.         xor l
  924.         and 0x87
  925.         xor l
  926.        rrca
  927.        rrca
  928.        rrca
  929.        ;or c
  930. ;a=_
  931.         cp 125
  932.         jr nc,mktext40addr_skip
  933.         ld b,-1
  934.        inc b
  935.        sub 5
  936.        jr nc,$-3
  937.         add a,5 ;a=(_ mod 5) ;b=_/5
  938.         sla b
  939.         sla b
  940.         add a,b
  941.         add a,b
  942.         add a,56 ;a=_/5*8+(_-(_/5*5))+56
  943.         rrca
  944.         rrca
  945.         rrca
  946.         ld (hl),a
  947. mktext40addr_skip
  948.         inc l
  949.         jp p,mktext40addr0
  950.         ret
  951. INT_setgfxTEXT80
  952.         call settextmode
  953.         ld hl,wasPUTscreen_textmode
  954.         call setPUTscreen_hl
  955. ;       macro dbrrc3 data
  956. ;        db (data>>3)+((data<<5)&0xe0)
  957. ;       endm
  958. ;ttextaddr
  959. ;        dup 128
  960. ;_=$&0xff
  961. ;;0gggGGGG -> 0GGGGggg:
  962. ;_=((_&0x0f)<<3)+((_&0x70)>>4)
  963. ;       if _<125
  964. ;_=_/5*8+(_-(_/5*5))+56
  965. ;        dbrrc3 _
  966. ;       else
  967. ;        dbrrc3 255
  968. ;       endif
  969. ;        edup
  970.         ld hl,ttextaddr
  971. mktextaddr0
  972.         ld (hl),255
  973.         ld a,l
  974.         and 0x70
  975.         rlca
  976.         xor l
  977.         and 0xf0
  978.         xor l
  979.        rlca
  980.        rlca
  981.        rlca
  982. ;a=_
  983.         cp 125
  984.         jr nc,mktextaddr_skip
  985.         ld b,-1
  986.        inc b
  987.        sub 5
  988.        jr nc,$-3
  989.         add a,5 ;a=(_ mod 5) ;b=_/5
  990.         sla b
  991.         sla b
  992.         add a,b
  993.         add a,b
  994.         add a,56 ;a=_/5*8+(_-(_/5*5))+56
  995.         rrca
  996.         rrca
  997.         rrca
  998.         ld (hl),a
  999. mktextaddr_skip
  1000.         inc l
  1001.         jp p,mktextaddr0
  1002.         ret
  1003.  
  1004. setegamode_palhl
  1005.         push de
  1006.         call setpalhl_with_caution ;OS_SETPAL ;TODO с копированием во временную палитру
  1007.         ld e,0+0x80 ;EGA+keep
  1008.         call setgfx
  1009.         ld hl,wastrecolour
  1010.         ld de,trecolour
  1011.         ld bc,256
  1012.         ldir
  1013.         pop de
  1014.         ret
  1015.  
  1016. settextmode
  1017.         push de
  1018.         ld hl,ansipal
  1019.         call setpalhl_with_caution ;OS_SETPAL ;TODO с копированием во временную палитру
  1020.         ld e,6+0x80 ;text+keep
  1021.         call setgfx
  1022.         ld hl,wast866toatm
  1023.         ld de,trecolour
  1024.         ld bc,256
  1025.         ldir
  1026.         pop de
  1027.         ret
  1028.  
  1029. setPUTscreen_hl
  1030.         push de
  1031.         ld de,PUTscreen_logpgc_zxaddrhl_datamhl_do
  1032.         ld bc,maxszPUTscreen
  1033.         ldir
  1034.         pop de
  1035.         ret
  1036.  
  1037. setgfx
  1038.      DISABLE_IFF0_KEEP_IY
  1039.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  1040.         ld e,0
  1041.         OS_CLS
  1042.      ENABLE_IFF0_REMEMBER_IY ;иначе pop iy запорет iy от обработчика прерывания
  1043.         ret
  1044.  
  1045. setpalhl_with_caution
  1046.        push de
  1047.      DISABLE_IFF0_KEEP_IY
  1048.        ex de,hl
  1049.        OS_SETPAL
  1050.      ENABLE_IFF0_REMEMBER_IY ;иначе pop iy запорет iy от обработчика прерывания
  1051.        pop de
  1052.        ret
  1053.  
  1054. INT_printal
  1055.         push de
  1056.         ex af,af' ;'
  1057.         push af
  1058.      DISABLE_IFF0_KEEP_IY
  1059.         ld a,(_AL)
  1060.         PRCHAR
  1061.      ENABLE_IFF0_REMEMBER_IY ;иначе pop iy запорет iy от обработчика прерывания
  1062.         pop af
  1063.         ex af,af' ;'
  1064.         pop de
  1065.        ret;_Loop_
  1066.  
  1067. INT16
  1068.         ;jr $
  1069.         ;mov ah,0x01     ; Any key pressed?
  1070.         ;int 0x16
  1071.         ;jz fb26         ; No, go to main loop
  1072.        ld a,(_AH)
  1073.        or a
  1074.        jr z,INT_inputal
  1075.        dec a
  1076.        jp nz,INT_getkeyflags
  1077.         ;jr $
  1078. ;1 Получить состояние клавиатуры (84-клавишная клавиатура)
  1079. ;Выход:
  1080. ;При ZF=1 нет клавиши
  1081. ;При ZF=0: (враньё??? pillman игнорит это значение ax и сразу читает через ah=0!!!)
  1082. ;     AH - скан-код
  1083. ;     AL - ASCII код
  1084. int16getkey
  1085.         ld a,(prefetchedkey)
  1086.         or a
  1087.        if 0
  1088.         jr nz,INT_inputal_a
  1089.        else
  1090.         jr nz,INT16havekey
  1091.        endif
  1092.         push de
  1093.      DISABLE_IFF0_KEEP_IY
  1094.         OS_GETKEY
  1095.      ENABLE_IFF0_REMEMBER_IY ;иначе pop iy запорет iy от обработчика прерывания
  1096.         pop de
  1097.         ret nz;jr nz,INT16q ;no focus
  1098.        ld b,a
  1099.         ex af,af' ;'
  1100.         inc b
  1101.         dec b ;Z (no key)
  1102.         ex af,af' ;'
  1103.        or a
  1104.        ret z
  1105.        if 0
  1106.        jr INT_inputal_a
  1107.        else
  1108. INT16havekey
  1109.        ;ld a,0x48
  1110.         ld (prefetchedkey),a
  1111.         call nedooskey_to_pckey ;a->bc
  1112.          ld (_AX),bc
  1113.         ex af,af' ;'
  1114.         inc b
  1115.         dec b ;Z/NZ
  1116.         ex af,af' ;'
  1117.        ret;_Loop_
  1118.        endif
  1119. INT_inputal
  1120. prefetchedkey=$+1
  1121.         ld a,0
  1122.         or a
  1123.         jr nz,INT_inputal_a
  1124.         push de
  1125.      DISABLE_IFF0_KEEP_IY
  1126.         YIELDGETKEYLOOP;OS_GETKEY
  1127. ;        A - код символа(кнопки). Допустимые коды смотри в 'sysdefs.asm' секция 'Usable key codes'
  1128. ;        C - код символа(кнопки) без учета текущего языкового модификатора. Как правило, используется для обработки "горячих кнопок"
  1129. ;        DE - позиция мыши (y,x) (возвращает 0 при отсутствии фокуса)
  1130. ;        L - кнопки мыши (bits 0(LMB),1(RMB),2(MMB): 0=pressed; bits 7..4=положение колёсика)
  1131. ;        LX - Kempston joystick (0bP2JFUDLR): 1=pressed, - при отсутствии джойстика 0 (а не 0xff)
  1132. ;        Флаг Z - если 0(NZ), то отсутствует фокус.
  1133.      ENABLE_IFF0_REMEMBER_IY ;иначе pop iy запорет iy от обработчика прерывания
  1134.         pop de
  1135. INT_inputal_a
  1136.         ;ld (_AL),a
  1137.         call nedooskey_to_pckey ;a->bc
  1138.          ;ld a,c
  1139.          ;ld (_AH),a ;scancode for pillman
  1140.          ld (_AX),bc
  1141.         ex af,af' ;'
  1142.         inc b
  1143.         dec b ;NZ if key
  1144.         ex af,af' ;'
  1145.         xor a
  1146.         ld (prefetchedkey),a
  1147. ;INT16q
  1148.        ret;_Loop_
  1149. INT_getkeyflags
  1150. ;16h#2 (keyboard flags: al=0x10(scrolllock)+0x08(alt)+0x04(ctrl)+0x03(shifts))
  1151.         ld a,0xfe
  1152.         in a,(0xfe)
  1153.         cpl
  1154.         and 0x1f
  1155.         ld (_AL),a
  1156.        ret;_Loop_
  1157.  
  1158. dosgetchar=INT_inputal
  1159. ;dosgetchar=int16getkey ;livin проскакивает меню
  1160. ;Return:
  1161. ;ZF set if no character available and AL = 00h
  1162. ;ZF clear if character available AL = character read
  1163.  
  1164. nedooskey_to_pckey ;a->bc
  1165.          ld bc,0x011b ;1b for pitman, 01 for pillman?
  1166.          cp key_esc
  1167.          jr z,INT_inputal_a_scancodeq
  1168.          ld bc,0x1c0d ;HSB for pipes, LSB for cgagame (ratillery)
  1169.          cp key_enter
  1170.          jr z,INT_inputal_a_scancodeq
  1171.          ld bc,0x3b00
  1172.          cp key_F1
  1173.          jr z,INT_inputal_a_scancodeq
  1174.          inc b;ld b,0x3c
  1175.          cp key_F2
  1176.          jr z,INT_inputal_a_scancodeq
  1177.          inc b;ld b,0x3d
  1178.          cp key_F3
  1179.          jr z,INT_inputal_a_scancodeq
  1180.          inc b;ld b,0x3e
  1181.          cp key_F4
  1182.          jr z,INT_inputal_a_scancodeq
  1183.          inc b;ld b,0x3f
  1184.          cp key_F5
  1185.          jr z,INT_inputal_a_scancodeq
  1186.          inc b;ld b,0x40
  1187.          cp key_F6
  1188.          jr z,INT_inputal_a_scancodeq
  1189.          inc b;ld b,0x41
  1190.          cp key_F7
  1191.          jr z,INT_inputal_a_scancodeq
  1192.          inc b;ld b,0x42
  1193.          cp key_F8
  1194.          jr z,INT_inputal_a_scancodeq
  1195.          inc b;ld b,0x43
  1196.          cp key_F9
  1197.          jr z,INT_inputal_a_scancodeq
  1198.          inc b;ld b,0x44
  1199.          cp key_F10
  1200.          jr z,INT_inputal_a_scancodeq
  1201.          ld b,0x4b
  1202.          cp key_left
  1203.          jr z,INT_inputal_a_scancodeq
  1204.          ld b,0x4d
  1205.          cp key_right
  1206.          jr z,INT_inputal_a_scancodeq
  1207.          ld b,0x48
  1208.          cp key_up
  1209.          jr z,INT_inputal_a_scancodeq
  1210.          ld b,0x50
  1211.          cp key_down
  1212.          jr z,INT_inputal_a_scancodeq
  1213.         ld b,a;c;0
  1214.          ld c,a
  1215. INT_inputal_a_scancodeq
  1216.         ret
  1217.  
  1218.  
  1219. redraw_screen_memory
  1220.         ld a,(curgfxmode)
  1221.         cp 0x13
  1222.         jr nz,redraw_screen_memory_cga
  1223.         ld hl,0
  1224. redraw_screen_memory_vga0
  1225.         ld a,h
  1226.         and 0xc0
  1227.         add a,40/4
  1228.         ld c,a
  1229.         push hl
  1230.         set 7,h
  1231.         set 6,h
  1232.        ld lx,c
  1233.         ld b,tpgs/256
  1234.         ld a,(bc)
  1235.         SETPGC000
  1236.         ld a,(hl)
  1237.        ld c,lx
  1238.        _PUTscreen_logpgc_zxaddrhl_datamhl
  1239.         pop hl
  1240.         inc hl
  1241.         ld a,h
  1242.         or l
  1243.         jr nz,redraw_screen_memory_vga0
  1244.         ret
  1245. redraw_screen_memory_cga
  1246.         ld hl,0xc000
  1247. redraw_screen_memory_cga0
  1248.         ld c,0x8b
  1249.         push hl
  1250.        ld lx,c
  1251.         ld b,tpgs/256
  1252.         ld a,(bc)
  1253.         SETPGC000
  1254.         ld a,(hl)
  1255.        ld c,lx
  1256.        _PUTscreen_logpgc_zxaddrhl_datamhl
  1257.         pop hl
  1258.         inc hl
  1259.         ld a,h
  1260.         or l
  1261.         jr nz,redraw_screen_memory_cga0
  1262.         ret
  1263.  
  1264. wasPUTscreen_cga
  1265.      disp PUTscreen_logpgc_zxaddrhl_datamhl_do
  1266.         ld c,(hl) ;4 pixels
  1267.         inc b ;(b=trecolour/256)
  1268. ;a=1..4*0x40
  1269.        ld a,(bc)
  1270.        ld (cgarightpair),a
  1271.        ld a,c
  1272.        rlca
  1273.        rlca
  1274.        rlca
  1275.        rlca
  1276.        ld c,a ;или ещё одну таблицу
  1277.        ld a,(bc)
  1278.        ld (cgaleftpair),a
  1279.         ld a,(pgprog)
  1280.         SETPGC000
  1281. ;экран CGA = 80 байт на строку (8000 байт один слой)
  1282. ;экран ZXEGA = 40 байт на строку *4 слоя
  1283. ;чередование строк CGA (нечётные идут вторым слоем с +8192) - по таблице 64-пиксельных блоков? если берём одну половину CGA экрана, то это из 500 блоков вычисляем 1000 (или если ещё разделить на 4 части, то из 125 блоков вычисляем 250)
  1284. ;или придётся быстро делить на 80 и умножать на 40
  1285. ;или по большой таблице в страничке
  1286.        ld c,l ;запомнить младшие 4 бита
  1287.        ld b,h ;запомнить bit 5
  1288.         ld a,h
  1289.         rra
  1290.         rr l
  1291.         rra
  1292.         rr l
  1293.         rra
  1294.         rr l
  1295.         and 0x03
  1296.         add a,+(tcga|0xc000)/256
  1297.         ld h,a
  1298.         res 0,l
  1299.         ld a,(hl)
  1300.         inc l
  1301.         ld h,(hl)
  1302.        rr c
  1303.         jr nc,$+4
  1304.         set 5,h
  1305.         xor c
  1306.         and 0xf8
  1307.         xor c
  1308.         ld l,a
  1309.        bit 5,b ;бывший bit 5,h
  1310.         jr z,$+2+3+1
  1311.          ld bc,40
  1312.          add hl,bc
  1313.         ld a,(user_scr0_low) ;ok
  1314.         SETPGC000
  1315. cgaleftpair=$+1
  1316.      ld (hl),0
  1317.         ld a,(user_scr0_high) ;ok
  1318.         SETPGC000
  1319. cgarightpair=$+1
  1320.      ld (hl),0
  1321.         ret
  1322.       ent
  1323. szPUTscreen_cga=$-wasPUTscreen_cga
  1324.  
  1325. wasPUTscreen_vga
  1326.      disp PUTscreen_logpgc_zxaddrhl_datamhl_do
  1327.         ld c,(hl)
  1328.         inc b ;(b=trecolour/256)
  1329. ;a=1..4*0x40
  1330.         add a,h
  1331.         ld h,a
  1332. ;экран VGA = 320 байт на строку
  1333. ;экран ZXEGA = 40 байт на строку *4 слоя
  1334.         scf
  1335.         rr h
  1336.         rr l ;CY=left/right
  1337.         jr c,PUTscreen_rightpixel
  1338.         sra h
  1339.         rr l
  1340.         ld a,(user_scr0_low) ;ok
  1341.         jr nc,$+5
  1342.         ld a,(user_scr0_high) ;ok
  1343.        push bc
  1344.         SETPGC000
  1345.        pop bc
  1346.         sra h
  1347.         rr l
  1348.         jr c,$+4
  1349.         res 5,h
  1350.      ld a,(bc)
  1351.      xor (hl)
  1352.      and 0b01000111
  1353.      xor (hl)
  1354.      ld (hl),a
  1355.         ret
  1356. PUTscreen_rightpixel
  1357.         sra h
  1358.         rr l
  1359.         ld a,(user_scr0_low) ;ok
  1360.         jr nc,$+5
  1361.         ld a,(user_scr0_high) ;ok
  1362.        push bc
  1363.         SETPGC000
  1364.        pop bc
  1365.         sra h
  1366.         rr l
  1367.         jr c,$+4
  1368.         res 5,h
  1369.      ld a,(bc)
  1370.      xor (hl)
  1371.      and 0b10111000
  1372.      xor (hl)
  1373.      ld (hl),a
  1374.         ret
  1375.      ent
  1376. szPUTscreen_vga=$-wasPUTscreen_vga
  1377.  
  1378.  
  1379. wasPUTscreen_textmode40
  1380.      disp PUTscreen_logpgc_zxaddrhl_datamhl_do
  1381.        bit 3,h
  1382.        ret nz ;only for 40 pitch (sorryass)
  1383.         ld c,(hl) ;colour
  1384. ;The VGA text buffer is located at physical memory address 0xB8000.
  1385. ;25 строк по 40 слов: символ, атрибут (%FpppIiii - пересчитать в PIpppiii)
  1386.        push bc
  1387. ;для 40 символов в строке группы по 8 символов:
  1388. ;hl=00000GGG GgggXXxA
  1389.         ld a,l  ;gggXXXxA
  1390.         srl a
  1391.         xor h
  1392.         and 0xf8 ;0xf8 для 40 символов в строке
  1393.         xor h   ;0gggGGGG
  1394. ;пересчитываем в номер группы на АТМ textmode:
  1395.         ld b,ttextaddr/256
  1396.         ld c,a
  1397.         ld a,(bc) ;gggGGGgg
  1398.        rra;srl a ;srl a для 40 символов в строке (для 80 вообще не нужно)
  1399.         xor l
  1400.         and 0xf0 ;0xf0 для 40 символов в строке
  1401.         xor l
  1402.         ld l,a
  1403.         ld a,(bc) ;gggGGGgg
  1404.         and 0x1f
  1405. ;пересчитываем в адрес группы на ATM textmode (группы по 8 символов):
  1406. ;hl=000GGGgg 0gggXXxA ;+0x01c0 уже прибавлено к номеру группы как +56
  1407.          scf
  1408.          rra
  1409.         rr l
  1410.         jr c,PUTscreen_textmode40_attr
  1411.          scf
  1412.          rra
  1413.         rr l
  1414.         jr nc,$+4
  1415.          or 0x20;set 5,h
  1416.         ld h,a
  1417. ;RAM page #05 (#07):
  1418. ;#21C0...#27FF - character codes of odd (1,3,...) characters (25 lines, every line is 64 bytes, of which only first 40 are significant).
  1419. ;#01C0...#07FF - character codes of even (0,2,...) characters (ditto).
  1420.         ld a,(user_scr0_high) ;ok
  1421.         SETPGC000
  1422.        pop bc
  1423.        inc b ;ld b,t866toatm/256
  1424.        ld a,(bc)
  1425.         ld (hl),a
  1426.         ret
  1427. PUTscreen_textmode40_attr
  1428.          rra
  1429.         rr l
  1430.         inc l
  1431.         jr c,$+5
  1432.          or 0x20
  1433.          dec l
  1434.         ld h,a
  1435. ;RAM page #01 (#03):
  1436. ;#21C0...#27FF - attributes of even(!) characters (ditto).
  1437. ;#01C1...#07FF - attributes of odd(!) characters (ditto).
  1438.         ld a,(user_scr0_low) ;ok
  1439.         SETPGC000
  1440.        pop bc ;c=%ppppiiii
  1441.         ld a,c
  1442.         rra
  1443.         xor c
  1444.         and 0b00111000
  1445.         xor c
  1446.         and 0b10111111
  1447.         bit 3,c
  1448.         jr z,$+4
  1449.         or 0b01000000
  1450.         ld (hl),a ;%pipppiii
  1451.         ret
  1452.      ent
  1453. szPUTscreen_textmode40=$-wasPUTscreen_textmode40
  1454.  
  1455.  
  1456. wasPUTscreen_textmode
  1457.      disp PUTscreen_logpgc_zxaddrhl_datamhl_do
  1458.         ld c,(hl) ;colour
  1459. ;The VGA text buffer is located at physical memory address 0xB8000.
  1460. ;25 строк по 80 слов: символ, атрибут (%FpppIiii - пересчитать в PIpppiii)
  1461. ;как пересчитать строки по 160 байт (80 символов) в строки по 64 байта (128 виртуальных символов)? всего 2000 знакомест = 125 групп по 16 символов, можно по таблице получить адрес (2 байта) или номер виртуальной группы (их всего 200, т.е. 1 байт)
  1462.        push bc
  1463. ;получаем номер группы по 16 символов:
  1464. ;hl=0000GGGG gggXXXxA
  1465.         ld a,l  ;gggXXXxA
  1466.         srl a
  1467.         xor h
  1468.         and 0xf0 ;0xf8 для 40 символов в строке
  1469.         xor h   ;0gggGGGG
  1470. ;пересчитываем в номер группы на АТМ textmode:
  1471.         ld b,ttextaddr/256
  1472.         ld c,a
  1473.         ld a,(bc) ;gggGGGgg
  1474.         xor l
  1475.         and 0xe0 ;srl a...0xf0 для 40 символов в строке
  1476.         xor l
  1477.         ld l,a
  1478.         ld a,(bc) ;gggGGGgg
  1479.         and 0x1f
  1480. ;пересчитываем в адрес группы на ATM textmode:
  1481. ;hl=000GGGgg gggXXXxA ;+0x01c0 уже прибавлено к номеру группы как +56
  1482.          scf
  1483.          rra
  1484.         rr l
  1485.         jr c,PUTscreen_textmode_attr
  1486.          scf
  1487.          rra
  1488.         rr l
  1489.         jr nc,$+4
  1490.          or 0x20;set 5,h
  1491.         ld h,a
  1492. ;RAM page #05 (#07):
  1493. ;#21C0...#27FF - character codes of odd (1,3,...) characters (25 lines, every line is 64 bytes, of which only first 40 are significant).
  1494. ;#01C0...#07FF - character codes of even (0,2,...) characters (ditto).
  1495.         ld a,(user_scr0_high) ;ok
  1496.         SETPGC000
  1497.        pop bc
  1498.        inc b ;ld b,t866toatm/256
  1499.        ld a,(bc)
  1500.         ld (hl),a
  1501.         ret
  1502. PUTscreen_textmode_attr
  1503.          rra
  1504.         rr l
  1505.         inc l
  1506.         jr c,$+5
  1507.          or 0x20
  1508.          dec l
  1509.         ld h,a
  1510. ;RAM page #01 (#03):
  1511. ;#21C0...#27FF - attributes of even(!) characters (ditto).
  1512. ;#01C1...#07FF - attributes of odd(!) characters (ditto).
  1513.         ld a,(user_scr0_low) ;ok
  1514.         SETPGC000
  1515.        pop bc ;c=%ppppiiii
  1516.         ld a,c
  1517.         rra
  1518.         xor c
  1519.         and 0b00111000
  1520.         xor c
  1521.         and 0b10111111
  1522.         bit 3,c
  1523.         jr z,$+4
  1524.         or 0b01000000
  1525.         ld (hl),a ;%pipppiii
  1526.         ret
  1527.      ent
  1528. szPUTscreen_textmode=$-wasPUTscreen_textmode
  1529.  
  1530.         display "szPUTscreen_cga=",szPUTscreen_cga
  1531.         display "szPUTscreen_vga=",szPUTscreen_vga
  1532.         display "szPUTscreen_textmode40=",szPUTscreen_textmode40
  1533.         display "szPUTscreen_textmode=",szPUTscreen_textmode
  1534.         display "memory for PUTscreen=",maxszPUTscreen
  1535.  
  1536.  
  1537.  
  1538. ;DDp palette: %grbG11RB(low),%grbG11RB(high), inverted
  1539. ;standard:
  1540.         ;dw 0xffff,0xfefe,0xfdfd,0xfcfc,0xefef,0xeeee,0xeded,0xecec
  1541.         ;dw 0xffff,0xdede,0xbdbd,0x9c9c,0x6f6f,0x4e4e,0x2d2d,0x0c0c
  1542. ;ansi:
  1543.         ;dw 0xffff,0xfdfd,0xefef,0xeded,0xfefe,0xfcfc,0xeeee,0xecec
  1544.         ;dw 0x1f1f,0x1d1d,0x0f0f,0x0d0d,0x1e1e,0x1c1c,0x0e0e,0x0c0c
  1545. cgapal1
  1546. ;0,R,G,Y (bits swapped):
  1547.        dup 4
  1548.         dw 0xffff,0x1d1d,0x0f0f,0x0d0d
  1549.        edup
  1550. cgapal2
  1551. ;0,M,C,W (bits swapped):
  1552.        dup 4
  1553.         dw 0xffff,0x9c9c,0x4e4e,0x0c0c
  1554.        edup
  1555.  
  1556. wast866toatm
  1557.         incbin "../kernel/866toatm"
  1558.  
  1559.        macro dbcol _0
  1560.         db ((_0)&7)*9 + (((_0)&8)*0x18)
  1561.        endm
  1562.  
  1563.        macro dbcol8 _0,_1,_2,_3,_4,_5,_6,_7
  1564.         dbcol _0
  1565.         dbcol _1
  1566.         dbcol _2
  1567.         dbcol _3
  1568.         dbcol _4
  1569.         dbcol _5
  1570.         dbcol _6
  1571.         dbcol _7
  1572.        endm
  1573.  
  1574.        macro dbcol8i _0,_1,_2,_3,_4,_5,_6,_7
  1575.         dbcol8 _0|0x08,_1|0x08,_2|0x08,_3|0x08,_4|0x08,_5|0x08,_6|0x08,_7|0x08
  1576.        endm
  1577.  
  1578. wastrecolour ;TODO generate for given palette
  1579.         dup 16
  1580.         dbcol ($-wastrecolour)
  1581.         edup
  1582. ;0x10
  1583.         dbcol8 0,0,0,0,8,8,8,8
  1584.         dbcol8 7,7,7,7,15,15,15,15
  1585. ;0x20
  1586.         dbcol8 1,1,1,5,5,5,4,4
  1587.         dbcol8 4,4,4,6,6,6,2,2
  1588.         dbcol8 2,2,2,3,3,3,1,1
  1589. ;0x38
  1590.         dbcol8i 1,1,1,5,5,5,4,4
  1591.         dbcol8i 4,4,4,6,6,6,2,2
  1592.         dbcol8i 2,2,2,3,3,3,1,1
  1593. ;0x50
  1594.         dbcol8i 7,7,7,7,7,7,7,7
  1595.         dbcol8i 7,7,7,7,7,7,7,7
  1596.         dbcol8i 7,7,7,7,7,7,7,7
  1597. ;0x68
  1598.         dbcol8 1,1,1,5,5,5,4,4
  1599.         dbcol8 4,4,4,6,6,6,2,2
  1600.         dbcol8 2,2,2,3,3,3,1,1
  1601. ;0x80
  1602.        dup 6
  1603.         dbcol8 8,8,8,8,8,8,8,8
  1604.        edup
  1605. ;0xb0
  1606.         ds 72,0x00
  1607. ;0xf8
  1608.         ds 8,0
  1609.  
  1610.         align 256
  1611. tcga
  1612. _y=0
  1613.        dup 100
  1614. _x=0
  1615.        dup 5
  1616.        dw 0xc000+(80*_y)+(8*_x)
  1617. _x=_x+1
  1618.        edup
  1619. _y=_y+1
  1620.        edup
  1621.        dup 24
  1622.         ;dw 0xfff8;запарывает rst
  1623.         dw 0xc000+(80*200)
  1624.        edup
  1625.  
  1626. font
  1627.         incbin "866_code.fnt"
  1628.