?login_element?

Subversion Repositories NedoOS

Rev

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

  1. EMUOUT
  2. ;BC=port, A=value
  3.        BIT 0,C
  4.        jp Z,eoutFE
  5.        BIT 1,C
  6.        jr Z,eoutFD
  7.         PUSH AF
  8.         LD A,(doson0)
  9.         OR A
  10.         jp Z,EMUOUTDOS
  11.         POP AF
  12.         RET
  13. eoutFD
  14.        BIT 7,B
  15.        jp Z,eout7FFD
  16.        BIT 6,B
  17.        jr NZ,eoutFFFD
  18.         LD BC,#BFFD
  19.         OUT (C),A
  20.         RET
  21. eoutFFFD
  22.        BIT 5,B
  23.        jr z,eoutDFFD
  24.         LD BC,#FFFD
  25.         OUT (C),A
  26.         RET
  27. eoutDFFD
  28.         ld (_dffd),a
  29.         AND 128 ;video mode
  30. oldcurvideomode=$+1
  31.         cp 0
  32.         ;jr z,eoDFFDnovideomode
  33.         ;ld (oldcurvideomode),a
  34.         call nz,setvideomode
  35. ;eoDFFDnovideomode
  36.         ld a,(_fd)
  37. eout7FFD
  38. ;TODO block if bit 5 was "1" in (_fd)
  39.         LD (_fd),A
  40.         LD C,A
  41.         AND #C7
  42.         and 7
  43.         ld l,a
  44.        ld a,(_dffd)
  45.         if PROFI==512
  46.        and 3 ;Profi 512K
  47.         else
  48.        and 7 ;Profi 1024K
  49.         endif
  50.        add a,a
  51.        add a,a
  52.        add a,a
  53.        add a,l
  54.        ld (_logicpg),a
  55.        ld l,a
  56.         ld h,temulpgs/256
  57.         ld a,(hl)
  58. deadpg=$+1
  59.         cp 0
  60.         jr nz,eout7FFDOK
  61.        push bc
  62.        push de
  63.        push hl
  64.        exx
  65.        push bc
  66.        push de
  67.        push hl
  68.        push ix
  69.        push iy
  70.        exa
  71.        push af
  72.        OS_NEWPAGE ;мегабайт захватывать динамически постранично
  73.        pop af
  74.        exa
  75.         ld a,e
  76.        pop iy
  77.        pop ix
  78.        pop hl
  79.        pop de
  80.        pop bc
  81.        exx
  82.        pop hl
  83.        pop de
  84.        pop bc      
  85.         ld (hl),a
  86. eout7FFDOK
  87.  
  88.         ld a,(_dffd)
  89.         and 16 ;D4 = rom off
  90.         jr z,eout7FFD_romon
  91.         ld a,(temulpgs+0)
  92.         LD (emulcurpg0000),A
  93.          ld a,ROMSTATE_OFF
  94.          ld (romstate_flag),a
  95.          ld a,DOSSTATE_FROM128
  96.          ld (DOSER_state),a ;skip DOSER
  97.         jr eout7FFD_romonq
  98. eout7FFD_romon
  99.        LD A,(doson0) ;DOS ports on
  100.        OR A
  101.        jr Z,eo7FFDdos
  102.         BIT 4,C ;номер ПЗУ
  103.         ld b,DOSSTATE_FROM48
  104.         LD A,(pgrom48)
  105.         jr NZ,eo7FFDo
  106.         ld b,DOSSTATE_FROM128
  107.         LD A,(pgrom128)
  108.         JR eo7FFDo
  109. eo7FFDdos
  110.         BIT 4,C ;номер ПЗУ
  111.         ld b,DOSSTATE_FROMDOS
  112.         LD A,(pgromDOS)
  113.         jr NZ,eo7FFDo
  114.         LD A,(pgromSYS)
  115. eo7FFDo
  116.         LD (emulcurpg0000),A
  117.         ld a,b
  118.         ld (DOSER_state),a
  119.          ld a,ROMSTATE_ON
  120.          ld (romstate_flag),a
  121. eout7FFD_romonq
  122.  
  123.         LD A,C
  124.         AND 8 ;номер экрана
  125.         LD (curscr),A
  126. oldcurscr7ffd=$+1
  127.         cp 0
  128.         ;jr z,eo7FFDnoscr
  129.         ;ld (oldcurscr7ffd),a
  130.         call nz,setscreen
  131. ;eo7FFDnoscr
  132.         ld hl,_dffd
  133.         bit 3,(hl)
  134.         ld a,5
  135.         jr z,eo7FFD_nomem4000
  136. _logicpg=$+1
  137.         ld a,0;(_logicpg)
  138. eo7FFD_nomem4000
  139.         ld (_logicpg4000),a
  140.         ld a,(_logicpg)
  141.         jr z,eo7FFD_nomemc000
  142.         ld a,7
  143. eo7FFD_nomemc000
  144.         ld (_logicpgc000),a
  145.         bit 6,(hl)
  146.         ld a,2
  147.         jr z,eo7FFD_nomem8000
  148.         ld a,6
  149. eo7FFD_nomem8000
  150.         ld (_logicpg8000),a
  151. ;(_logicpgx000) are formed!
  152.  
  153.         ld hl,(_logicpg4000)
  154.         ld h,temulpgs/256
  155.         ld a,(hl)        
  156.         LD (emulcurpg4000),A
  157.  
  158.         ld hl,(_logicpgc000)
  159.         ld h,temulpgs/256
  160.         ld a,(hl)        
  161.         LD (emulcurpgc000),A
  162.        if margins;MEM48C0
  163.         SETPGC000
  164.        endif
  165.         ld hl,(_logicpg8000)
  166.         ld h,temulpgs/256
  167.         ld a,(hl)        
  168.         LD (emulcurpg8000),A
  169.        if margins;MEM48C0
  170.         SETPG8000
  171.        endif
  172.  
  173.        if extpg5
  174.         ld a,(_dffd)
  175.         rla
  176.         ld a,(_logicpgc000)
  177.         jr nc,screeninc000_noprofi
  178.         and 0xff-2
  179.         cp 0x04
  180.         jr z,screeninc000_noprofiq
  181.         cp PGATTR0
  182.         jr screeninc000_noprofiq
  183. screeninc000_noprofi
  184.         and 0xff-2
  185.         cp 5
  186. screeninc000_noprofiq
  187.         ld a,0xc9 ;screen off
  188.         jr nz,$+3
  189.          xor a ;screen on
  190.         ld (screeninc000_flag),a
  191.        
  192.         ld a,(_dffd)
  193.         rla
  194.         ld a,(_logicpg4000)
  195.         jr nc,screenin4000_noprofi
  196.         and 0xff-2
  197.         cp 0x04
  198.         jr z,screenin4000_noprofiq
  199.         cp PGATTR0
  200.         jr screenin4000_noprofiq
  201. screenin4000_noprofi
  202.         and 0xff-2
  203.         cp 5
  204. screenin4000_noprofiq
  205.         ld a,0xc9 ;screen off
  206.         jr nz,$+3
  207.          xor a ;screen on
  208.         ld (screenin4000_flag),a
  209.        
  210.         ld a,(_dffd)
  211.         rla
  212.         ld a,(_logicpg8000)
  213.         jr nc,screenin8000_noprofi
  214.         and 0xff-2
  215.         cp 0x04
  216.         jr z,screenin8000_noprofiq
  217.         cp PGATTR0
  218.         jr screenin8000_noprofiq
  219. screenin8000_noprofi
  220.         and 0xff-2
  221.         cp 5
  222. screenin8000_noprofiq
  223.         ld a,0xc9 ;screen off
  224.         jr nz,$+3
  225.          xor a ;screen on
  226.         ld (screenin8000_flag),a
  227.        
  228.        endif
  229.  
  230.        if margins
  231.         ld a,0x3e
  232.         ld (set4000com),a
  233.         CALCpgcom
  234.        endif
  235.         RET
  236. eoutFE
  237.         LD (_fe),A
  238. outFE
  239.         OUT (#FE),A
  240.         RET
  241. EMUOUTDOS
  242.         LD A,C
  243.         CP #3F
  244.         jr Z,eod3F
  245.         CP #5F
  246.         jr Z,eod5F
  247.         CP #FF
  248.         jr Z,eodFF
  249.         POP AF
  250.         RET
  251. eod3F
  252.         POP AF
  253.         LD (dos3F),A
  254.         RET
  255. eod5F
  256.         POP AF
  257.         LD (dos5F),A
  258.         RET
  259. eodFF
  260.         POP AF
  261.         LD (dosFF),A
  262.         RET
  263.  
  264. copyscreen_profi
  265. ;a=logicpg
  266.         ld (copyscreen_profi_logicpg),a
  267.         ld c,a
  268.         ld b,temulpgs/256
  269.         ld a,(bc)
  270.         ld (copyscreen_profi_physpg),a
  271.         ld hl,0x4000
  272. copyscreen_profi0
  273.         push hl
  274. copyscreen_profi_physpg=$+1
  275.         ld a,0
  276.         OUTPG4000
  277.         ld c,(hl)
  278.         or a
  279. copyscreen_profi_logicpg=$+1
  280.         ld a,0
  281.         call screen4000_branchvideomode
  282.         pop hl
  283.         inc l
  284.         jr nz,copyscreen_profi0
  285.         inc h
  286.         jp p,copyscreen_profi0
  287.         ret
  288.  
  289. EMUIN
  290. ;BC=port
  291. ;return A=value
  292.        BIT 0,C
  293.        jr Z,einFE
  294.         LD A,(doson0)
  295.         OR A
  296.         jr Z,EMUINDOS
  297.        LD A,C
  298.        cp 0xfd
  299.        jr z,einAY
  300.        CP #DF
  301.        jr Z,einMOUSE
  302.        CP #1F
  303.        jr Z,einKEMPSTON
  304.         LD A,#FF
  305.         RET
  306. einAY
  307.         ld bc,0xfffd
  308.         in a,(c)
  309.         ret
  310. einMOUSE
  311.        LD A,B
  312.        CP #FA
  313.        jr Z,einFADF
  314.        CP #FB
  315.        jr Z,einFBDF
  316.        CP #FF
  317.        jr Z,einFFDF
  318.         LD A,#FF
  319.         RET
  320. einFADF
  321.         ;LD BC,#FADF
  322.         ;IN A,(C)
  323. mousebuttons=$+1
  324.         ld a,0xff
  325.         RET
  326. einFBDF
  327.         ;LD BC,#FBDF
  328.         ;IN A,(C)
  329. mousex=$+1
  330.         ld a,0
  331.         RET
  332. einFFDF
  333.         ;LD BC,#FFDF
  334.         ;IN A,(C)
  335. mousey=$+1
  336.         ld a,0
  337.         RET
  338. einKEMPSTON
  339.         ;IN A,(#1f)
  340. kempston=$+1
  341.         ld a,0
  342.         RET
  343. einFE
  344.         ;LD C,#FE
  345.         ;IN A,(C)
  346.         ;ld a,b
  347.         ;or a
  348.         ;jr z,$
  349.        push hl
  350.        ld hl,keymatrix
  351.        ld a,0xff
  352.        dup 8
  353.        rlc b
  354.        jr c,$+3
  355.        and (hl)
  356.        inc hl
  357.        edup
  358.        pop hl
  359.        and a
  360.         ;LD C,#FE
  361.         ;IN A,(C)
  362.         RET
  363. EMUINDOS
  364.         LD A,C
  365.         CP #1F
  366.         jr Z,eid1F
  367.         CP #3F
  368.         jr Z,eid3F
  369.         CP #5F
  370.         jr Z,eid5F
  371.         CP #5F
  372.         jr Z,eidFF
  373.         LD A,#FF
  374.         RET
  375. eidFF
  376.         ;LD A,#80 ;INTRQ=команда выполнена ok
  377.         ld a,r
  378.         rla
  379.         and 0xc0 ;D6=DRQ, D7=INTRQ
  380.         RET
  381. eid1F
  382.         ;LD A,#80 ;команда выполнена ok, диск вставлен
  383.         ld a,r
  384. fddstatemask=$+1
  385.         and 3
  386.         or 0x80
  387.         RET
  388. eid3F
  389.         LD A,(dos3F) ;trk
  390.         RET
  391. eid5F
  392.         LD A,(dos5F) ;sec
  393.         RET
  394.  
  395. setvideomode
  396.         ld (oldcurvideomode),a
  397. ;video mode changed! set system video mode and recode screen data
  398.        ;push bc
  399.        push de
  400.        ;push hl
  401.         rla
  402.         jr c,eoDFFD_copyprofi
  403.         ld a,SCREEN4000_VIDEOMODE_6912
  404.         ld (screen4000_videomode),a
  405.         ld a,SCREEN8000_VIDEOMODE_6912
  406.         ld (screen8000_videomode),a
  407.         ld a,SCREENC000_VIDEOMODE_6912
  408.         ld (screenc000_videomode),a
  409.         ld a,0x05
  410.         call copyscreen_profi
  411.         ld a,0x07
  412.         call copyscreen_profi
  413.         ld e,3+0x80 ;6912+keep
  414.         jr eoDFFD_copyprofiq
  415. eoDFFD_copyprofi
  416.         ld a,(user_scr1_high) ;ok
  417.         call clearpg
  418.         ld a,(user_scr0_high) ;ok
  419.         call clearpg
  420.         ld a,SCREEN4000_VIDEOMODE_PROFI
  421.         ld (screen4000_videomode),a
  422.         ld a,SCREEN8000_VIDEOMODE_PROFI
  423.         ld (screen8000_videomode),a
  424.         ld a,SCREENC000_VIDEOMODE_PROFI
  425.         ld (screenc000_videomode),a
  426.         ld a,0x04
  427.         call copyscreen_profi
  428.         ld a,0x06
  429.         call copyscreen_profi
  430.         ld a,PGATTR0;0x38
  431.         call copyscreen_profi
  432.         ld a,PGATTR1;0x3a
  433.         call copyscreen_profi
  434.         ld e,2+0x80 ;MC+keep
  435. eoDFFD_copyprofiq
  436.        exx
  437.        push bc
  438.        push de
  439.        push hl
  440.        push ix
  441.        push iy
  442.        exx
  443.        exa
  444.        push af
  445.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  446.        pop af
  447.        exa
  448.         ld a,e
  449.        pop iy
  450.        pop ix
  451.        pop hl
  452.        pop de
  453.        pop bc
  454.        exx
  455.        ;pop hl
  456.        pop de
  457.        ;pop bc
  458.        ret
  459.  
  460. setscreen
  461.         ld (oldcurscr7ffd),a
  462.        ;push bc
  463.        push de
  464.        ;push hl
  465.        exx
  466.        push bc
  467.        push de
  468.        push hl
  469.        push ix
  470.        push iy
  471.         rrca
  472.         rrca
  473.         rrca
  474.         ld e,a
  475.        exa
  476.        push af
  477.        OS_SETSCREEN
  478.        pop af
  479.        exa
  480.        pop iy
  481.        pop ix
  482.        pop hl
  483.        pop de
  484.        pop bc
  485.        exx
  486.        ;pop hl
  487.        pop de
  488.        ;pop bc
  489.        ret
  490.