home *** CD-ROM | disk | FTP | other *** search
- TITLE FASTMOVE
- NAME FASTMOVE
- ;
- ; Die Segmentgröße des REAL Mode von 64KByte auf 4GByte
- ; aufblähen und eine neue BLOCKMOVE Funktion des BIOS
- ; implementieren.
- ;
- ; Harald Albrecht '9/89
- ; Mit MASM 5.0 oder TASM übersetzen
- ; und COM-File erzeugen (mit exe2bin oder TLINK tasm/t)
- ;
- ; Assembler Switches für verschiedene Systeme
- ;
- TRUE equ 1
- FALSE equ 0
- ;
- PS2 equ FALSE ;bei PS/2 hier natürlich TRUE
- NORMAL equ TRUE ;und hier FALSE
- ;
- .386P
- LOCALS ;nur bei TASM!
- ;
- DATEN_PORT equ 60H ;Datenport des 8042
- STATUS_PORT equ 64H ;Statusport des 8042
- ;
- CODE SEGMENT PARA USE16
- ASSUME CS:CODE
- ORG 100H
- ;
- MAIN: JMP INSTALL
- DB 'FASTMOVE'
- ;
- GDT_PTR DW 18H
- DD ?
-
- GDT DQ 0
-
- DW 0FFFFH
- DW 0
- DB 0
- DB 92H
- DB 0CFH
- DB 0
-
- OLD_15 DD ?
- FARJMP DD ?
-
- NEWINT_15 PROC FAR
- CMP AH,87H
- JZ @@MOVE
- JMP DWORD PTR CS:[OLD_15]
-
- @@MOVE: PUSH EAX
- PUSH ECX
- PUSH ESI
- PUSH EDI
- PUSH ES
- ;hier ggf. noch CALL GATE_A20_EIN einfügen, wenn andere
- ;Software es zwischendurch abschaltet
- MOVZX ECX,CX
- MOV EAX,ES:[SI+10H+2]
- AND EAX,00FFFFFFH
- MOV EDI,ES:[SI+18H+2]
- AND EDI,00FFFFFFH
- MOV ESI,EAX
- XOR AX,AX
- MOV DS,AX
- MOV ES,AX
- CLD
- SHR ECX,1
- JNC @@SHUFFLE
- MOVS WORD PTR [ESI],WORD PTR [EDI]
-
- @@SHUFFLE: REP MOVS DWORD PTR [ESI],DWORD PTR [EDI]
- POP ES
- POP DS
- POP EDI
- POP ESI
- POP ECX
- POP EAX
- XOR AH,AH
- IRET
-
- NEWINT_15 ENDP
-
- SIZE_UP PROC NEAR
- PUSHF
- PUSH DS
- PUSH ES
- PUSH FS
- PUSH GS
- CLI
- LGDT FWORD PTR CS:[GDT_PTR]
- MOV EAX,CR0
- OR EAX,1
- MOV CR0,EAX
- JMP SHORT $+2
- MOV AX,8
- MOV DS,AX
- MOV DS,AX
- MOV ES,AX
- MOV FS,AX
- MOV GS,AX
- MOV EAX,CR0
- AND EAX,NOT 1
- MOV CR0,EAX
- JMP DWORD PTR CS:[FARJMP]
- GO_REAL: POP GS
- POP FS
- POP ES
- POP DS
- POPF
- RET
- SIZE_UP ENDP
-
- ASSUME DS:CODE
-
- INSTALL PROC NEAR
- PUSH CS
- POP DS
- MOV DX,OFFSET MSG0
- MOV AH,9
- INT 21H
- MOV AX,CS
- MOVZX EAX,AX
- SHL EAX,4
- MOV BX,OFFSET GDT
- MOVZX EBX,BX
- ADD EAX,EBX
- MOV DWORD PTR [GDT_PTR+2],EAX
- MOV WORD PTR [FARJMP+2],CS
- MOV WORD PTR [FARJMP],OFFSET GO_REAL
- CALL GATE_A20_EIN
- MOV AX,3515H
- INT 21H
- MOV WORD PTR [OLD_15],BX
- MOV WORD PTR [OLD_15+2],ES
- MOV DX,OFFSET NEWINT_15
- MOV AX,2515H
- INT 21H
- MOV DX,OFFSET MSG1
- MOV AH,9
- INT 21H
- CALL SIZE_UP
- MOV DX,OFFSET INSTALL+0FH
- SHR DX,4
- MOV AX,3100H
- INT 21H
- INSTALL ENDP
-
- IF NORMAL
- GATE_A20_EIN PROC NEAR
- PUSH CX
- MOV AH,0DFH
- CALL GATE_A20
- AND AL,AL
- JZ @@OK
- MOV DX,OFFSET MSG2
- MOV AH,9
- INT 21H
- MOV AX,4C01H
- INT 21H
- @@OK: POP CX
- RET
- GATE_A20_EIN ENDP
-
- GATE_A20 PROC NEAR
- CLI
- CALL IS_8042_EMPTY?
- JNZ @@GATE_A20_BYE
- MOV AL,0D1H
- OUT STATUS_PORT,AL
- CALL IS_8042_EMPTY?
- JNZ @@GATE_A20_BYE
- MOV AL,AH
- OUT DATEN_PORT,AL
- CALL IS_8042_EMPTY?
- @@GATE_A20_BYE:
- RET
- GATE_A20 ENDP
-
- IS_8042_EMPTY? PROC NEAR
- XOR CX,CX
- EMPTY_LOOP:
- IN AL,STATUS_PORT
- AND AL,02H
- LOOPNZ EMPTY_LOOP
- RET
- IS_8042_EMPTY? ENDP
- ENDIF
-
- IF PS2
- GATE_A20_EIN PROC NEAR
- CLI
- IN AL,[92H]
- OR AL,2
- OUT [92H],AL
- STI
- RET
- GATE_A20_EIN ENDP
- ENDIF
-
- MSG0 DB 'FastMove v1.0 - Harald Albrecht 1989',0DH,0Ah,'$'
- MSG1 DB 'BIOS MoveBlock-Routine ersetzt. 4 GIGABYTE im REAL MODE',0Dh,0AH,'$'
- MSG2 DB 'KANN A20 NICHT FREIGEBEN, KEYBOARD SCHWEIGT!',0DH,0AH,'$'
-
- CODE ENDS
- END MAIN
-