home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9101 / dbase / screen.asm < prev    next >
Encoding:
Assembly Source File  |  1991-10-14  |  9.1 KB  |  302 lines

  1. ;* ------------------------------------------------------- *
  2. ;*                        SCREEN.ASM                       *
  3. ;*          Binäre Utilities für dBase III+ / IV           *
  4. ;*          (c) 1991 Wolfhard Rinke & DMV-Verlag           *
  5. ;* ------------------------------------------------------- *
  6. ;*                                                         *
  7. ;* Erzeugen von SCREEN.BIN:                                *
  8. ;*      tasm screen         bzw. masm screen ;             *
  9. ;*      tlink screen        bzw. link screen ;             *
  10. ;*      (warnung "No stack" ignorieren)                    *
  11. ;*      exe2bin screen.exe screen.bin                      *
  12. ;*      del screen.obj                                     *
  13. ;*      del screen.exe                                     *
  14. ;* Demonstration: TEST.PRG                                 *
  15. ;* ------------------------------------------------------- *
  16.  
  17. CODE       SEGMENT WORD PUBLIC 'CODE'
  18.            ASSUME  CS:CODE, DS:CODE, ES:NOTHING
  19.  
  20. ;* ------------------------------------------------------- *
  21. ;*  Konstanten
  22.  
  23. BufLen     EQU     4000         ; Größe einer Bildschirmseite
  24. MonSeg     EQU     0B000h       ; Monochrom-Bildschirmsegment
  25. ColSeg     EQU     0B800h       ; Color-Bildschirmsegment
  26.  
  27. ;* ------------------------------------------------------- *
  28.  
  29.            ORG     00h          ; wichtig !
  30.  
  31. ;* ------------------------------------------------------- *
  32. ;*  "Hauptprogramm"
  33.  
  34. Screen PROC FAR
  35.  
  36.            PUSH    BP                ; wegen lokaler
  37.            MOV     BP, SP            ; Prozeduren
  38.  
  39.            MOV     CS:[SaveBX], BX   ; Zeiger auf Parameter,
  40.            MOV     AX, CS            ; Codesegment und
  41.            MOV     CS:[SaveCS], AX   ;
  42.            MOV     CS:[SaveDS], DS   ; Datensegment sichern
  43.  
  44.            PUSH    DS
  45.            CALL    GetScrSeg         ; BS-Segment ermitteln
  46.            POP     DS                ; Datensegment zurück
  47.  
  48.            MOV     DH, Byte Ptr DS:[BX]
  49.                               ; dBase-Parameter ist in DS:BX
  50.  
  51.                                      ; Parameter-Prüfung
  52.            OR      DH, 20h           ; in Kleinbuchstaben
  53.  
  54.  
  55.            CMP     DH, "r"           ; ... WITH "R"
  56.            JE      Restore
  57.  
  58.            CMP     DH, "s"           ; ... WITH "S"
  59.            JE      Save
  60.  
  61.            CMP     DH, "d"           ; ... WITH "D"
  62.            JE      DosVer
  63.  
  64.            CMP     DH, "c"           ; ... WITH "C"
  65.            JE      Cursor
  66.  
  67.            JMP     Short Exit        ; ungültiger Parameter
  68.  
  69. ;* ------------------------------------------------------- *
  70.  
  71. Save:      CALL    ScrSave           ; dBase-BS sichern
  72.            JMP     Short Exit
  73.  
  74. ;* ------------------------------------------------------- *
  75.  
  76. Restore:   CALL    ScrRestore        ; dBase-BS zurück
  77.            JMP     Short Exit
  78.  
  79.                    ; zum Tauschen der Bildschirme
  80.                    ; siehe auch c't 9/1988 S.82
  81.  
  82. ;* ------------------------------------------------------- *
  83.  
  84. DosVer:    CALL    GetDosVersion     ; DOS-Version ermitteln
  85.            JMP     Short Exit
  86.  
  87. ;* ------------------------------------------------------- *
  88.  
  89. Cursor:    CALL    SetCursor         ; Cursor ein- und
  90.                                      ; ausschalten
  91.  
  92.                    ; zur Cursorform siehe auch
  93.                    ; c't 1/1989 S.164
  94.  
  95.            JMP     Short Exit
  96.  
  97. ;* ------------------------------------------------------- *
  98.  
  99. Exit:      MOV     DS, CS:[SaveDS]   ; dBase-Register
  100.            MOV     BX, CS:[SaveBX]
  101.  
  102.            MOV     SP, BP            ; Stackrahmen
  103.            POP     BP                ; restaurieren und
  104.            RETF                      ; zurück zu dBase
  105.  
  106. Screen  ENDP
  107.  
  108. ;* ------------------------------------------------------- *
  109. ;*  Variable
  110.  
  111. ScrSeg     DW      0B000h            ; Bildschirm-Segment
  112. SaveDS     DW      ?                 ; dBase-Originale
  113. SaveCS     DW      ?                 ;
  114. SaveBX     DW      ?                 ;
  115.  
  116. WordValue  DW      ?                 ; DOS-Funktiosergebnis
  117. CursorSize DW      ?                 ; Cursorform speichern
  118.  
  119. ;* ------------------------------------------------------- *
  120. ;* Prozeduren
  121.  
  122. GetDosVersion PROC NEAR
  123.  
  124.            PUSH    AX
  125.            MOV     AH,30h            ; Get Dos Version
  126.            INT     21h
  127.            ADD     AX, 3030h         ; "0" zur Hauptversion
  128.                                      ; in AL und zur Neben-
  129.                                      ; version in AX addieren
  130.            MOV     CS:[WordValue], AX
  131.  
  132.            CALL    ReturnWord        ; AX an dBase zurück
  133.  
  134.            POP     AX
  135.            RET
  136.  
  137. GetDosVersion ENDP
  138.  
  139. ;* ------------------------------------------------------- *
  140.  
  141. ReturnWord PROC NEAR
  142.  
  143.            PUSH    ES                ; verwendete Register
  144.            PUSH    DS                ; retten
  145.            PUSH    DI
  146.            PUSH    SI
  147.  
  148.            PUSH    CS
  149.            POP     DS                ; DS := CS
  150.            LEA     SI, WordValue     ; SI := Variable
  151.            MOV     ES, CS:[SaveDS]   ; ES := dBase-Datensegment
  152.            MOV     DI, CS:[SaveBX]   ; DI := dBase-Offset
  153.            MOVSW                     ; DS:SI -> ES:DI
  154.  
  155.            POP     SI                ; Register zurück
  156.            POP     DI
  157.            POP     DS
  158.            POP     ES
  159.  
  160.            RET
  161.  
  162. ReturnWord ENDP
  163.  
  164. ;* ------------------------------------------------------- *
  165.  
  166. GetScrSeg PROC NEAR
  167.  
  168.            MOV     CX, MonSeg        ; Mono-BS vorbelegt
  169.            XOR     AX, AX
  170.            MOV     DS, AX            ; BIOS-Datensegment
  171.            MOV     DL, DS:[0449h]    ; Bildschirm-Modus
  172.            CMP     DL, 07h
  173.            JZ      Mono              ; = monochrom ?
  174.  
  175.            MOV     CX, ColSeg        ; Color-BS
  176.  
  177. Mono:      MOV     CS:[ScrSeg], CX   ; sichern
  178.  
  179.            RET
  180.  
  181. GetScrSeg ENDP
  182.  
  183. ;* ------------------------------------------------------- *
  184.  
  185. ScrSave PROC NEAR
  186.  
  187.            PUSH    AX                ; verwendete Register
  188.            PUSH    CX                ; sichern
  189.            PUSH    DI
  190.            PUSH    SI
  191.            PUSH    ES
  192.  
  193.            MOV     DI, Offset ScrBuf ; Adresse des Puffers
  194.            MOV     AX, CS:[SaveCS]
  195.            MOV     ES, AX            ; Codesgement -> ES
  196.            MOV     AX, CS:[ScrSeg]
  197.            MOV     DS, AX            ; Bildschirm  -> DS
  198.            MOV     CX, BufLen        ; Anzahl
  199.            XOR     SI, SI            ; SI := 0 (Anfang)
  200.            CLD
  201.            REPZ    MOVSW             ; DS:SI -> ES:DI
  202.  
  203.            POP     ES                ; Register zurück
  204.            POP     SI
  205.            POP     DI
  206.            POP     CX
  207.            POP     AX
  208.  
  209.            RET
  210.  
  211. ScrSave ENDP
  212.  
  213. ;* ------------------------------------------------------- *
  214.  
  215. ScrRestore PROC NEAR
  216.  
  217.            PUSH    AX                ; verwendete Register
  218.            PUSH    CX                ; sichern
  219.            PUSH    DI
  220.            PUSH    SI
  221.            PUSH    DS
  222.            PUSH    ES
  223.  
  224.            MOV     SI, Offset ScrBuf ; Adresse Puffer
  225.            MOV     AX, CS:[SaveCS]
  226.            MOV     DS, AX            ; Codesegment -> DS
  227.            MOV     AX, CS:[ScrSeg]
  228.            MOV     ES, AX            ; Bildschirm  -> ES
  229.            MOV     CX, BufLen        ; Anzahl
  230.            XOR     DI, DI            ; DI := 0 (Anfang)
  231.            CLD
  232.            REPZ    MOVSB             ; DS:SI -> ES:DI
  233.  
  234.            POP     ES                ; Register zurück
  235.            POP     DS
  236.            POP     SI
  237.            POP     DI
  238.            POP     CX
  239.            POP     AX
  240.  
  241.            RET
  242.  
  243. ScrRestore ENDP
  244.  
  245. ;* ------------------------------------------------------- *
  246.  
  247. SetCursor PROC NEAR
  248.  
  249.            PUSH    AX
  250.            PUSH    BX
  251.            PUSH    CX
  252.            PUSH    DX
  253.            PUSH    DS
  254.  
  255.            MOV     DS, CS:[SaveDS]
  256.            MOV     DH, Byte Ptr DS:[BX+01h]
  257.            CMP     DH, 30h           ; 2. Parameter ist "0"
  258.            JNE     On
  259.  
  260.            MOV     AH, 03h
  261.            XOR     BH, BH            ; Bildschirmseite = 0
  262.            INT     10h
  263.            MOV     CS:[CursorSize], CX
  264.                                      ; alte Cursorform
  265.            MOV     AH, 01h
  266.            MOV     CX, 0FF00h
  267.            INT     10h               ; Cursor setzen
  268.            JMP     Short Cursor_Exit
  269.  
  270. On:        CMP     DH, 31h           ; 2.Parameter ist "1"
  271.            JNE     Cursor_Exit
  272.  
  273.            MOV     AH, 01h
  274.            XOR     BH, BH            ; Bildschirmseite = 0
  275.            MOV     CX, CS:[CursorSize]
  276.            INT     10h               ; Cursor setzen
  277.  
  278. Cursor_Exit:
  279.            POP     DS                ; Register zurück
  280.            POP     DX
  281.            POP     CX
  282.            POP     BX
  283.            POP     AX
  284.  
  285.            RET
  286.  
  287. SetCursor ENDP
  288.  
  289. ;* ------------------------------------------------------- *
  290. ;*  Puffer
  291.  
  292. ScrBuf    DW      BufLen DUP(00h)    ; Bildschirm-Puffer
  293.  
  294.  
  295. ;* ------------------------------------------------------- *
  296.  
  297. CODE    ENDS
  298.         END
  299.  
  300. ;* ------------------------------------------------------- *
  301. ;*                  Ende von SCREEN.ASM                    *
  302.