Subversion Repositories pentevo

Rev

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

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