home *** CD-ROM | disk | FTP | other *** search
/ Stars of Shareware: Programmierung / SOURCE.mdf / programm / msdos / pascal / fastmove / fastmove.asm next >
Encoding:
Assembly Source File  |  1990-02-02  |  3.6 KB  |  209 lines

  1.             TITLE FASTMOVE
  2.             NAME FASTMOVE
  3. ;
  4. ;       Die Segmentgröße des REAL Mode von 64KByte auf 4GByte
  5. ;       aufblähen und eine neue BLOCKMOVE Funktion des BIOS
  6. ;       implementieren.
  7. ;
  8. ;       Harald Albrecht '9/89
  9. ;       Mit MASM 5.0 oder TASM übersetzen
  10. ;       und COM-File erzeugen (mit exe2bin oder TLINK tasm/t)
  11. ;
  12. ;       Assembler Switches für verschiedene Systeme
  13. ;
  14. TRUE            equ 1
  15. FALSE           equ 0
  16. ;
  17. PS2             equ FALSE               ;bei PS/2 hier natürlich TRUE
  18. NORMAL          equ TRUE                ;und hier FALSE
  19. ;
  20.         .386P
  21.         LOCALS  ;nur bei TASM!
  22. ;
  23. DATEN_PORT      equ 60H                 ;Datenport des 8042
  24. STATUS_PORT     equ 64H                 ;Statusport des 8042
  25. ;
  26.         CODE SEGMENT PARA USE16
  27.         ASSUME CS:CODE
  28.         ORG 100H
  29. ;
  30. MAIN:           JMP INSTALL
  31.         DB 'FASTMOVE'
  32. ;
  33. GDT_PTR         DW 18H
  34.         DD ?
  35.  
  36. GDT             DQ 0
  37.  
  38.         DW 0FFFFH
  39.         DW 0
  40.         DB 0
  41.         DB 92H
  42.         DB 0CFH
  43.         DB 0
  44.  
  45. OLD_15          DD ?
  46. FARJMP          DD ?
  47.  
  48. NEWINT_15       PROC FAR
  49.         CMP AH,87H
  50.         JZ @@MOVE
  51.         JMP DWORD PTR CS:[OLD_15]
  52.  
  53. @@MOVE:         PUSH EAX
  54.         PUSH ECX
  55.         PUSH ESI
  56.         PUSH EDI
  57.         PUSH ES
  58. ;hier ggf. noch CALL GATE_A20_EIN einfügen, wenn andere
  59. ;Software es zwischendurch abschaltet
  60.         MOVZX ECX,CX
  61.         MOV EAX,ES:[SI+10H+2]
  62.         AND EAX,00FFFFFFH
  63.         MOV EDI,ES:[SI+18H+2]
  64.         AND EDI,00FFFFFFH
  65.         MOV ESI,EAX
  66.         XOR AX,AX
  67.         MOV DS,AX
  68.         MOV ES,AX
  69.         CLD
  70.         SHR ECX,1
  71.         JNC @@SHUFFLE
  72.         MOVS WORD PTR [ESI],WORD PTR [EDI]
  73.  
  74. @@SHUFFLE:    REP MOVS DWORD PTR [ESI],DWORD PTR [EDI]
  75.         POP ES
  76.         POP DS
  77.         POP EDI
  78.         POP ESI
  79.         POP ECX
  80.         POP EAX
  81.         XOR AH,AH
  82.         IRET
  83.  
  84. NEWINT_15    ENDP
  85.  
  86. SIZE_UP    PROC NEAR
  87.         PUSHF
  88.         PUSH DS
  89.         PUSH ES
  90.         PUSH FS
  91.         PUSH GS
  92.         CLI
  93.         LGDT FWORD PTR CS:[GDT_PTR]
  94.         MOV EAX,CR0
  95.         OR EAX,1
  96.         MOV CR0,EAX
  97.         JMP SHORT $+2
  98.         MOV AX,8
  99.         MOV DS,AX
  100.         MOV DS,AX
  101.         MOV ES,AX
  102.         MOV FS,AX
  103.         MOV GS,AX
  104.         MOV EAX,CR0
  105.         AND EAX,NOT 1
  106.         MOV CR0,EAX
  107.         JMP DWORD PTR CS:[FARJMP]
  108. GO_REAL:    POP GS
  109.         POP FS
  110.         POP ES
  111.         POP DS
  112.         POPF
  113.         RET
  114. SIZE_UP    ENDP
  115.         
  116.         ASSUME DS:CODE
  117.         
  118. INSTALL    PROC NEAR
  119.         PUSH CS
  120.         POP DS
  121.         MOV DX,OFFSET MSG0
  122.         MOV AH,9
  123.         INT 21H
  124.         MOV AX,CS
  125.         MOVZX EAX,AX
  126.         SHL EAX,4
  127.         MOV BX,OFFSET GDT
  128.         MOVZX EBX,BX
  129.         ADD EAX,EBX
  130.         MOV DWORD PTR [GDT_PTR+2],EAX
  131.         MOV WORD PTR [FARJMP+2],CS
  132.         MOV WORD PTR [FARJMP],OFFSET GO_REAL
  133.         CALL GATE_A20_EIN
  134.         MOV AX,3515H
  135.         INT 21H
  136.         MOV WORD PTR [OLD_15],BX
  137.         MOV WORD PTR [OLD_15+2],ES
  138.         MOV DX,OFFSET NEWINT_15
  139.         MOV AX,2515H
  140.         INT 21H
  141.         MOV DX,OFFSET MSG1
  142.         MOV AH,9
  143.         INT 21H
  144.         CALL SIZE_UP
  145.         MOV DX,OFFSET INSTALL+0FH
  146.         SHR DX,4
  147.         MOV AX,3100H
  148.         INT 21H
  149. INSTALL    ENDP
  150.         
  151. IF NORMAL
  152.     GATE_A20_EIN    PROC NEAR
  153.         PUSH CX
  154.         MOV AH,0DFH
  155.         CALL GATE_A20
  156.         AND AL,AL
  157.         JZ @@OK
  158.         MOV DX,OFFSET MSG2
  159.         MOV AH,9
  160.         INT 21H
  161.         MOV AX,4C01H
  162.         INT 21H
  163.     @@OK:    POP CX
  164.         RET
  165.     GATE_A20_EIN    ENDP
  166.         
  167.     GATE_A20    PROC NEAR
  168.         CLI
  169.         CALL IS_8042_EMPTY?
  170.         JNZ @@GATE_A20_BYE
  171.         MOV AL,0D1H
  172.         OUT STATUS_PORT,AL
  173.         CALL IS_8042_EMPTY?
  174.         JNZ @@GATE_A20_BYE
  175.         MOV AL,AH
  176.         OUT DATEN_PORT,AL
  177.         CALL IS_8042_EMPTY?
  178.     @@GATE_A20_BYE:
  179.         RET
  180.     GATE_A20    ENDP
  181.         
  182.     IS_8042_EMPTY?    PROC NEAR
  183.         XOR CX,CX
  184.     EMPTY_LOOP:
  185.         IN AL,STATUS_PORT
  186.         AND AL,02H
  187.         LOOPNZ EMPTY_LOOP
  188.         RET
  189.     IS_8042_EMPTY?    ENDP
  190. ENDIF
  191.         
  192. IF PS2
  193.     GATE_A20_EIN    PROC NEAR
  194.         CLI 
  195.         IN AL,[92H]
  196.         OR AL,2
  197.         OUT [92H],AL
  198.         STI
  199.         RET
  200.     GATE_A20_EIN    ENDP
  201. ENDIF
  202.         
  203. MSG0    DB    'FastMove v1.0 - Harald Albrecht 1989',0DH,0Ah,'$'
  204. MSG1    DB    'BIOS MoveBlock-Routine ersetzt. 4 GIGABYTE im REAL MODE',0Dh,0AH,'$'
  205. MSG2    DB      'KANN A20 NICHT FREIGEBEN, KEYBOARD SCHWEIGT!',0DH,0AH,'$'
  206.         
  207. CODE    ENDS
  208.         END MAIN
  209.