Subversion Repositories pentevo

Rev

Rev 709 | Rev 961 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1.  
  2. LSNAST  STRUCT  ;заголовок снапшотов
  3. RI              DB      ?
  4. AHL             DW
  5. ADE             DW
  6. ABC             DW
  7. AAF             DW
  8. RHL             DW
  9. RDE             DW
  10. RBC             DW
  11. RIY             DW
  12. RIX             DW
  13. IFF2    DB
  14. RR              DB
  15. RAF             DW
  16. RSP             DW
  17. SIM             DB
  18. BORD    DB
  19. RPC             DW
  20. P7FFD   DB
  21. PDOS    DB
  22. LSNAST  ENDSTRUCT
  23.  
  24. RUNSNA_LP_M MACRO PF,PS
  25.         ld de,((PF!0x7f)<<8)+(PS!0x7f)
  26.         call RUNSNA_LP
  27.         ENDM
  28. RUNSNA_LP128_M MACRO PL
  29.         ld a,PL
  30.         call RUNSNA_LP128
  31.         ENDM
  32.        
  33. RUNSNA_LP5_M MACRO
  34.         ld hl,0x8000-27
  35.         ld iyl,0x4000/512+1
  36.         ld de,((5!0x7f)<<8)+(2!0x7f)
  37.         call RUNSNA_LP5
  38.         ENDM
  39.        
  40.  
  41. RUNSNA  ;4ab4
  42.         di
  43.         ld iyh,0
  44.         ld a,0x30       ;по умолчанию б48
  45.         ld (lsna_P7FFD),a
  46.         ld a,HIGH(RD_EFF7)      ;разлочим 7FFD
  47.         in a,(LOW(RD_EFF7))
  48.         ld bc,PENT_CONF
  49.         and %11111011
  50.         out (c),a
  51.         or %00000100
  52.         ld (PEFF7+1),a
  53.         ld a,1
  54.         out (PEVO_CONF),a
  55.         ;освободим 1 окно
  56.         ld bc,WIN_A2
  57.         ld a,8!0x7f
  58.         out (c),a
  59.         ld de,0x8000
  60.         ld hl,0x4000
  61.         ld b,h
  62.         ld c,l
  63.         ldir
  64.         ld bc,WIN_A1
  65.         ld a,8!0x7f
  66.         out (c),a
  67.        
  68.         RUNSNA_LP5_M    ;загрузим заголовок и 5 страницу и ещё чуть    
  69.         ld hl,0x8000-27
  70.         ld de,lsna_RI
  71.         ld bc,27
  72.         ldir            ;копируем заголовок
  73.         RUNSNA_LP_M 2,0 ;загрузим 2 страницу и ещё чуть
  74.         RUNSNA_LP_M 0,9 ;загрузим 0 страницу и ещё чуть
  75.         ld a,(FILE_SRC+30)
  76.         or a
  77.         jr z,RUNSNA_ENDLOAD     ;если файл больше 64к, то снап 128к !!!!нада проверить
  78.         ld hl,0xc000    ;сохраняем заголовок
  79.         ld de,lsna_RPC
  80.         ld bc,4
  81.         ldir   
  82.         ld de,0xc000    ;сдвинем конец сектора
  83.         ld bc,512-4-27
  84.         ldir
  85.         ld a,(lsna_P7FFD)  ;смотрим 7ффд
  86.         and %111            ;отсекаем лишнее
  87.         ld (RUNSNA_LP128+1),a
  88.         jr z,RUNSNA_NOL0        ;если нулевая то всё правильно
  89.         ld bc,WIN_A3            ;нет, значит перекинуть куда надо
  90.         xor 0x7f
  91.         out (c),a
  92.         ld hl,0x8000
  93.         ld de,0xc000
  94.         ld bc,0x4000
  95.         ldir
  96.         ld bc,WIN_A3           
  97.         ld a,9!0x7f
  98.         out (c),a
  99.         RUNSNA_LP128_M 0        ;загрузим нулевую снова
  100. RUNSNA_NOL0    
  101.         RUNSNA_LP128_M 1        ;и остальные
  102.         RUNSNA_LP128_M 3
  103.         RUNSNA_LP128_M 4
  104.         RUNSNA_LP128_M 6
  105.         RUNSNA_LP128_M 7
  106. RUNSNA_ENDLOAD
  107.         ld bc,WIN_P2    ;вернём паги на место
  108.         ld a,00
  109.         out (c),a
  110.         ld b,HIGH (WIN_A3)      ;включим FF пагу
  111.         ld a,0!0xff
  112.         out (c),a
  113.         ld a,(lsna_BORD)
  114.         out (0xfe),a    ;восстановим бордер
  115.         ld a,(lsna_RI)  ;рег I
  116.         ld i,a
  117.         ld hl,toFFpage          ;переместим стартер в FF пагу
  118.         ld de,0xA000
  119.         ld bc,endFFpage-toFFpage
  120.         ldir
  121.         ld hl,(0x8066)          ;сохраним код из 0x0066
  122.         ld de,(0x8068)
  123.         ld bc,0xc300
  124.         ld (0x8066),bc          ;закинем свой JP на стартер
  125.         ld bc,0x2000
  126.         ld (0x8068),bc
  127.         ld bc,WIN_A2    ;вернём пагу на место
  128.         ld a,2!0x7f
  129.         out (c),a
  130.         ld a,8                  ;сгенерим NMI
  131.         out (PEVO_CONF),a
  132.         ld a,1
  133.         out (PEVO_CONF),a
  134.         halt                    ;ждём прерывание
  135.        
  136. RUNSNA_LP128
  137.         cp 0                    ;проверим может страница уже загружена
  138.         ret z
  139.         xor 0x7f
  140.         ld bc,WIN_A2
  141.         out (c),a
  142.         ld hl,0xc000    ;перекинем  остаток
  143.         ld de,0x8000
  144.         ld bc,512-27-4
  145.         ldir
  146.         ex de,hl
  147.         ld iyl,0x4000/512
  148.         jr RUNSNA_L1P
  149.        
  150. RUNSNA_LP
  151.         ld hl,0x8000+512-27
  152.         ld iyl,0x4000/512
  153. RUNSNA_LP5
  154.         ld bc,WIN_A2
  155.         out (c),d
  156.         ld b,HIGH (WIN_A3)
  157.         out (c),e
  158. RUNSNA_L1P
  159.         xor a
  160.         out (PEVO_CONF),a
  161.         call LD_FILE
  162.         ld a,1
  163.         out (PEVO_CONF),a
  164.         ret
  165.  
  166.  
  167. toFFpage
  168.         ld (0x0066),hl          ;восстановим код
  169.         ld (0x0068),de
  170.         ld a,(fsna+LSNAST_SIM)  ;режим прерываний
  171.         im 0
  172.         or a
  173.         jr z,RUNSNA_ENDIM
  174.         im 1
  175.         dec a
  176.         jr z,RUNSNA_ENDIM
  177.         im 2
  178. RUNSNA_ENDIM
  179.         ld bc,WIN_A1            ;восстановим страницу
  180.         ld a,5!0x7f
  181.         out (c),a
  182.         xor a
  183.         out (PEVO_CONF),a      
  184.         ld bc,CONF_128  ;восстановим порт конфигурации
  185.         ld a,(fsna+LSNAST_P7FFD)
  186.         out (c),a              
  187.         cp 0x30                         ;если 48к то возврат уже на стеке
  188.         jr z,FFYESRET
  189.         ld sp,(fsna+LSNAST_RSP)
  190.         ld hl,(fsna+LSNAST_RPC)
  191.         push hl
  192.         ld (fsna+LSNAST_RSP),sp
  193. FFYESRET
  194.         ld bc,PENT_CONF         ;отключим 1024к
  195. PEFF7
  196.         ld a,0
  197.         out (c),a
  198.         ei
  199.         ld a,(fsna+LSNAST_IFF2)
  200.         and 4
  201.         jr nz,FFENDEI
  202.         di
  203. FFENDEI
  204.         ld a,(fsna+LSNAST_RR)
  205.         rlca
  206.         sub 0x15*2
  207.         rrca
  208.         ld r,a
  209.         ld sp,fsna+LSNAST_AHL ;забираем регистры
  210.         pop hl
  211.         pop de
  212.         pop bc
  213.         pop af
  214.         exx
  215.         ex af,af'
  216.         pop hl
  217.         pop de
  218.         pop bc
  219.         pop iy
  220.         pop ix
  221.         ld sp,fsna+LSNAST_RAF
  222.         pop af
  223.         ld sp,(fsna+LSNAST_RSP)
  224.         out (0xbe),a    ;выходим из NMI
  225.         retn
  226. ENDFFCODE
  227. fsna    EQU     $-toFFpage+0x2000
  228. lsna    LSNAST
  229. endFFpage