Subversion Repositories pentevo

Rev

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

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