home *** CD-ROM | disk | FTP | other *** search
- ;* ------------------------------------------------------- *
- ;* SCREEN.ASM *
- ;* Binäre Utilities für dBase III+ / IV *
- ;* (c) 1991 Wolfhard Rinke & DMV-Verlag *
- ;* ------------------------------------------------------- *
- ;* *
- ;* Erzeugen von SCREEN.BIN: *
- ;* tasm screen bzw. masm screen ; *
- ;* tlink screen bzw. link screen ; *
- ;* (warnung "No stack" ignorieren) *
- ;* exe2bin screen.exe screen.bin *
- ;* del screen.obj *
- ;* del screen.exe *
- ;* Demonstration: TEST.PRG *
- ;* ------------------------------------------------------- *
-
- CODE SEGMENT WORD PUBLIC 'CODE'
- ASSUME CS:CODE, DS:CODE, ES:NOTHING
-
- ;* ------------------------------------------------------- *
- ;* Konstanten
-
- BufLen EQU 4000 ; Größe einer Bildschirmseite
- MonSeg EQU 0B000h ; Monochrom-Bildschirmsegment
- ColSeg EQU 0B800h ; Color-Bildschirmsegment
-
- ;* ------------------------------------------------------- *
-
- ORG 00h ; wichtig !
-
- ;* ------------------------------------------------------- *
- ;* "Hauptprogramm"
-
- Screen PROC FAR
-
- PUSH BP ; wegen lokaler
- MOV BP, SP ; Prozeduren
-
- MOV CS:[SaveBX], BX ; Zeiger auf Parameter,
- MOV AX, CS ; Codesegment und
- MOV CS:[SaveCS], AX ;
- MOV CS:[SaveDS], DS ; Datensegment sichern
-
- PUSH DS
- CALL GetScrSeg ; BS-Segment ermitteln
- POP DS ; Datensegment zurück
-
- MOV DH, Byte Ptr DS:[BX]
- ; dBase-Parameter ist in DS:BX
-
- ; Parameter-Prüfung
- OR DH, 20h ; in Kleinbuchstaben
-
-
- CMP DH, "r" ; ... WITH "R"
- JE Restore
-
- CMP DH, "s" ; ... WITH "S"
- JE Save
-
- CMP DH, "d" ; ... WITH "D"
- JE DosVer
-
- CMP DH, "c" ; ... WITH "C"
- JE Cursor
-
- JMP Short Exit ; ungültiger Parameter
-
- ;* ------------------------------------------------------- *
-
- Save: CALL ScrSave ; dBase-BS sichern
- JMP Short Exit
-
- ;* ------------------------------------------------------- *
-
- Restore: CALL ScrRestore ; dBase-BS zurück
- JMP Short Exit
-
- ; zum Tauschen der Bildschirme
- ; siehe auch c't 9/1988 S.82
-
- ;* ------------------------------------------------------- *
-
- DosVer: CALL GetDosVersion ; DOS-Version ermitteln
- JMP Short Exit
-
- ;* ------------------------------------------------------- *
-
- Cursor: CALL SetCursor ; Cursor ein- und
- ; ausschalten
-
- ; zur Cursorform siehe auch
- ; c't 1/1989 S.164
-
- JMP Short Exit
-
- ;* ------------------------------------------------------- *
-
- Exit: MOV DS, CS:[SaveDS] ; dBase-Register
- MOV BX, CS:[SaveBX]
-
- MOV SP, BP ; Stackrahmen
- POP BP ; restaurieren und
- RETF ; zurück zu dBase
-
- Screen ENDP
-
- ;* ------------------------------------------------------- *
- ;* Variable
-
- ScrSeg DW 0B000h ; Bildschirm-Segment
- SaveDS DW ? ; dBase-Originale
- SaveCS DW ? ;
- SaveBX DW ? ;
-
- WordValue DW ? ; DOS-Funktiosergebnis
- CursorSize DW ? ; Cursorform speichern
-
- ;* ------------------------------------------------------- *
- ;* Prozeduren
-
- GetDosVersion PROC NEAR
-
- PUSH AX
- MOV AH,30h ; Get Dos Version
- INT 21h
- ADD AX, 3030h ; "0" zur Hauptversion
- ; in AL und zur Neben-
- ; version in AX addieren
- MOV CS:[WordValue], AX
-
- CALL ReturnWord ; AX an dBase zurück
-
- POP AX
- RET
-
- GetDosVersion ENDP
-
- ;* ------------------------------------------------------- *
-
- ReturnWord PROC NEAR
-
- PUSH ES ; verwendete Register
- PUSH DS ; retten
- PUSH DI
- PUSH SI
-
- PUSH CS
- POP DS ; DS := CS
- LEA SI, WordValue ; SI := Variable
- MOV ES, CS:[SaveDS] ; ES := dBase-Datensegment
- MOV DI, CS:[SaveBX] ; DI := dBase-Offset
- MOVSW ; DS:SI -> ES:DI
-
- POP SI ; Register zurück
- POP DI
- POP DS
- POP ES
-
- RET
-
- ReturnWord ENDP
-
- ;* ------------------------------------------------------- *
-
- GetScrSeg PROC NEAR
-
- MOV CX, MonSeg ; Mono-BS vorbelegt
- XOR AX, AX
- MOV DS, AX ; BIOS-Datensegment
- MOV DL, DS:[0449h] ; Bildschirm-Modus
- CMP DL, 07h
- JZ Mono ; = monochrom ?
-
- MOV CX, ColSeg ; Color-BS
-
- Mono: MOV CS:[ScrSeg], CX ; sichern
-
- RET
-
- GetScrSeg ENDP
-
- ;* ------------------------------------------------------- *
-
- ScrSave PROC NEAR
-
- PUSH AX ; verwendete Register
- PUSH CX ; sichern
- PUSH DI
- PUSH SI
- PUSH ES
-
- MOV DI, Offset ScrBuf ; Adresse des Puffers
- MOV AX, CS:[SaveCS]
- MOV ES, AX ; Codesgement -> ES
- MOV AX, CS:[ScrSeg]
- MOV DS, AX ; Bildschirm -> DS
- MOV CX, BufLen ; Anzahl
- XOR SI, SI ; SI := 0 (Anfang)
- CLD
- REPZ MOVSW ; DS:SI -> ES:DI
-
- POP ES ; Register zurück
- POP SI
- POP DI
- POP CX
- POP AX
-
- RET
-
- ScrSave ENDP
-
- ;* ------------------------------------------------------- *
-
- ScrRestore PROC NEAR
-
- PUSH AX ; verwendete Register
- PUSH CX ; sichern
- PUSH DI
- PUSH SI
- PUSH DS
- PUSH ES
-
- MOV SI, Offset ScrBuf ; Adresse Puffer
- MOV AX, CS:[SaveCS]
- MOV DS, AX ; Codesegment -> DS
- MOV AX, CS:[ScrSeg]
- MOV ES, AX ; Bildschirm -> ES
- MOV CX, BufLen ; Anzahl
- XOR DI, DI ; DI := 0 (Anfang)
- CLD
- REPZ MOVSB ; DS:SI -> ES:DI
-
- POP ES ; Register zurück
- POP DS
- POP SI
- POP DI
- POP CX
- POP AX
-
- RET
-
- ScrRestore ENDP
-
- ;* ------------------------------------------------------- *
-
- SetCursor PROC NEAR
-
- PUSH AX
- PUSH BX
- PUSH CX
- PUSH DX
- PUSH DS
-
- MOV DS, CS:[SaveDS]
- MOV DH, Byte Ptr DS:[BX+01h]
- CMP DH, 30h ; 2. Parameter ist "0"
- JNE On
-
- MOV AH, 03h
- XOR BH, BH ; Bildschirmseite = 0
- INT 10h
- MOV CS:[CursorSize], CX
- ; alte Cursorform
- MOV AH, 01h
- MOV CX, 0FF00h
- INT 10h ; Cursor setzen
- JMP Short Cursor_Exit
-
- On: CMP DH, 31h ; 2.Parameter ist "1"
- JNE Cursor_Exit
-
- MOV AH, 01h
- XOR BH, BH ; Bildschirmseite = 0
- MOV CX, CS:[CursorSize]
- INT 10h ; Cursor setzen
-
- Cursor_Exit:
- POP DS ; Register zurück
- POP DX
- POP CX
- POP BX
- POP AX
-
- RET
-
- SetCursor ENDP
-
- ;* ------------------------------------------------------- *
- ;* Puffer
-
- ScrBuf DW BufLen DUP(00h) ; Bildschirm-Puffer
-
-
- ;* ------------------------------------------------------- *
-
- CODE ENDS
- END
-
- ;* ------------------------------------------------------- *
- ;* Ende von SCREEN.ASM *
-