home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 09_10 / tricks / ljdrv.asm < prev    next >
Encoding:
Assembly Source File  |  1990-10-08  |  12.8 KB  |  275 lines

  1. page      66, 100
  2. title     ljdrv.asm  -  (C) 18.11.1989, Peter F. L. Burger & TOOLBOX
  3. ;==============================================================================
  4. ;         DRUCKZEICHENWANDLER FÜR LJ-DRUCKER
  5. ;==============================================================================
  6. ; LJDRV ist ein Zeichensatzanpassungsprogramm für HPLJ-Drucker und kompatible.
  7. ;
  8. ; Es werden die erweiterten Zeichen des IBM-Zeichensatzes in die des HPLJ-
  9. ; Zeichensatzes umgewandelt.
  10. ;
  11. ; Das Programm kann natürlich auch für ähnlich gelagerte Fälle genutzt werden.
  12. ;==============================================================================
  13. ;         MAKROS ( machen das Leben leichter )
  14. ;==============================================================================
  15. dos_call  macro
  16.           int       21h                 ; MS-DOS Funktion aufrufen
  17.           endm
  18. disp_strg macro string                  ; String darstellen
  19.           mov       dx, offset string
  20.           mov       ah, 09h
  21.           dos_call
  22.           endm
  23. get_ivec  macro     int_vec
  24.           mov       al, &int_vec        ; Originalvektor lesen
  25.           mov       ah, 35h
  26.           dos_call
  27.           endm
  28. set_ivec  macro     int_vec, new_vec
  29.           mov       dx, offset new_vec  ; neuen Vektor setzen
  30.           mov       al, &int_vec
  31.           mov       ah, 25h
  32.           dos_call
  33.           endm
  34. ;==============================================================================
  35. ;         PROGRAMMSTART
  36. ;==============================================================================
  37. cseg      segment   'code'
  38.           assume    cs:cseg, ds:cseg, es:cseg
  39.           org        2Ch
  40. env_seg   label     word
  41.           org        80h
  42. dta_len   db        ?
  43. dta_txt   db        ?
  44.           org       100h
  45. main:     jmp       set_up              ; Sprung zur Installationsroutine
  46. ;==============================================================================
  47. ;         TABELLE FÜR ZEICHENWANDLUNG ( HPLJ-8-Bit-Code )
  48. ;         ( Beim Abtippen gut aufpassen ! )
  49. ;==============================================================================
  50. xlat_table:
  51.           db        000h,001h,002h,003h,004h,005h,006h,007h ; 00h..07h
  52.           db        008h,009h,00Ah,00Bh,00Ch,00Dh,00Eh,00Fh ; 08h..0Fh
  53.           db        010h,011h,012h,013h,014h,0BDh,016h,017h ; 10h..17h
  54.           db        018h,019h,01Ah,01Bh,01Ch,01Dh,01Eh,01Fh ; 18h..1Fh
  55.           db        020h,021h,022h,023h,024h,025h,026h,027h ; 20h..27h
  56.           db        028h,029h,02Ah,02Bh,02Ch,02Dh,02Eh,02Fh ; 28h..2Fh
  57.           db        030h,031h,032h,033h,034h,035h,036h,037h ; 30h..37h
  58.           db        038h,039h,03Ah,03Bh,03Ch,03Dh,03Eh,03Fh ; 38h..3Fh
  59.           db        040h,041h,042h,043h,044h,045h,046h,047h ; 40h..47h
  60.           db        048h,049h,04Ah,04Bh,04Ch,04Dh,04Eh,04Fh ; 48h..4Fh
  61.           db        050h,051h,052h,053h,054h,055h,056h,057h ; 50h..57h
  62.           db        058h,059h,05Ah,05Bh,05Ch,05Dh,05Eh,05Fh ; 58h..5Fh
  63.           db        060h,061h,062h,063h,064h,065h,066h,067h ; 60h..67h
  64.           db        068h,069h,06Ah,06Bh,06Ch,06Dh,06Eh,06Fh ; 68h..6Fh
  65.           db        070h,071h,072h,073h,074h,075h,076h,077h ; 70h..77h
  66.           db        078h,079h,07Ah,07Bh,07Ch,07Dh,07Eh,020h ; 78h..7Fh
  67.           db        0B4h,0CFh,0C5h,0C0h,0CCh,0C8h,0D4h,0B5h ; 80h..87h
  68.           db        0C1h,0CDh,0C9h,0DDh,0D1h,0D9h,0D8h,0D0h ; 88h..8Fh
  69.           db        0DCh,0D7h,0D3h,0C2h,0CEh,0CAh,0C3h,0CBh ; 90h..97h
  70.           db        0EFh,0DAh,0DBh,0BFh,0BBh,0BCh,020h,0BEh ; 98h..9Fh
  71.           db        0C4h,0D5h,0C6h,0C7h,0B7h,0B6h,0F9h,0FAh ; A0h..A7h
  72.           db        0B9h,020h,020h,0F8h,0F7h,0B8h,0FBh,0FDh ; A8h..AFh
  73.           db        020h,07Fh,020h,07Ch,02Bh,02Bh,02Bh,02Bh ; B0h..B7h
  74.           db        02Bh,02Bh,07Ch,02Bh,02Bh,02Bh,02Bh,02Bh ; B8h..BFh
  75.           db        02Bh,02Bh,02Bh,02Bh,02Dh,02Bh,02Bh,02Bh ; C0h..C7h
  76.           db        02Bh,02Bh,02Bh,02Bh,02Bh,02Dh,02Bh,02Bh ; C8h..CFh
  77.           db        02Bh,02Bh,02Bh,02Bh,02Bh,02Bh,02Bh,02Bh ; D0h..D7h
  78.           db        02Bh,02Bh,02Bh,020h,020h,020h,020h,020h ; D8h..DFh
  79.           db        020h,0DEh,020h,020h,020h,020h,075h,020h ; E0h..E7h
  80.           db        020h,020h,020h,020h,020h,0D6h,045h,020h ; E8h..EFh
  81.           db        020h,0FEh,020h,020h,020h,020h,020h,020h ; F0h..F7h
  82.           db        0B3h,020h,020h,020h,020h,020h,0FCh,020h ; F8h..FFh
  83. ;==============================================================================
  84. ;         VARIABLEN ( das Herz des Treibers )
  85. ;
  86. ; Die Variablen kennung und enable_flag sind so plaziert, daß sie über den
  87. ; Pointer vom Int 17h ( -1 bzw. -6 ) von jedem externen Programm abgefragt
  88. ; werden können. 
  89. ;
  90. ; z. B. in Turbo Pascal 4:
  91. ;
  92. ;   VAR kennung              : STRING;
  93. ;       kenn_ptr             : ^BYTE;
  94. ;       treiber_ist_da,
  95. ;       treiber_ist_aktiv    : BOOLEAN;
  96. ;
  97. ;   LONGINT( kenn_ptr ) := MEML[ $0000 : $005C ];   { = @INT_17h }
  98. ;                                           { Pointer^ zeigt auf trb_int }
  99. ;   DEC( LONGINT( kenn_ptr ), 6 );          { SEG Grenzen müssen hier nicht }
  100. ;                                           { beachtet werden }
  101. ;   MOVE( kenn_ptr^, kennung[ 1 ], 5 );     { GetString }
  102. ;   BYTE( kennung[ 0 ] ) := 5;              { Length( kennung ) := 5 }
  103. ;   treiber_ist_da := kennung = 'LjDrV';
  104. ;
  105. ;   INC( LONGINT( kenn_ptr ), 5 );          { SEG Grenzen: siehe oben }
  106. ;   treiber_ist_aktiv := kenn_ptr^ = 1;
  107. ;
  108. ; Ebenso kann der Treiber auf diese Art und Weise von einem externen Programm
  109. ; aktiviert bzw. deaktiviert werden ( kenn_ptr^ := 0 oder 1 ).
  110. ;==============================================================================
  111. save_int_17h  dd    (?)                 ; ursprünglicher INT 17H-Vektor
  112. kennung       label byte
  113.               db    'LjDrV'             ; Kennung und
  114. enable_flag   db    0                   ; Flag
  115.                                         ; für Abfragemöglichkeiten aus
  116.                                         ; anderen Programmen
  117. ;==============================================================================
  118. ;         INTERRUPT-ROUTINE INT 17H ( Beginn des residenten Codes )
  119. ;==============================================================================
  120. trb_int   proc      far
  121.           or        ah, ah              ; ah=0: Funktion "drucke Zeichen"?
  122.           jnz       jmp_int             ; nein
  123.           cli
  124.           cmp       cs:enable_flag, 0   ; Treiber aktiv?
  125.           jz        jmp_int
  126.           push      ds
  127.           push      bx
  128.           push      cs                  ; DS = CS für XLAT
  129.           pop       ds
  130.           mov       bx, offset xlat_table
  131.           xlat
  132.           pop       bx
  133.           pop       ds
  134. jmp_int:  sti                           ; weiter bei ursprüngl. Interrupt
  135.           jmp       dword ptr cs:save_int_17h
  136. trb_int   endp
  137. ;==============================================================================
  138. ;         INSTALLATIONS-ROUTINE ( Beginn des transienten Codes )
  139. ;==============================================================================
  140. set_up    proc      near
  141.           xor       ax, ax              ; Register löschen
  142.           xor       cx, cx
  143.           mov       bx, offset dta_len
  144.           mov       cl, [ bx ]          ; Stringlänge im DTA-Bereich
  145. skip:     jcxz      help_trb            ; DTA-Bereich zu Ende oder nichts drin
  146.           inc       bx
  147.           dec       cx                  ; Stringlänge - 1
  148.           mov       al, [ bx ]          ; BXtes Zeichen im DTA-Bereich
  149.           cmp       al, ' '
  150.           jz        skip                ; noch Leerzeichen
  151.           and       al, 5Fh             ; UpCase( al )
  152.           cmp       al, 'D'             ; disable - inaktiv
  153.           jz        disable_trb
  154.           cmp       al, 'E'             ; enable  - aktiv
  155.           jz        enable_trb
  156.           cmp       al, 'I'             ; info    - Statusinformation
  157.           jz        info_trb
  158.           cmp       al, 'S'             ; setup   - installieren
  159.           jz        setup_trb
  160.           cmp       al, 'R'             ; remove  - deinstallieren
  161.           jnz       help_trb
  162.           jmp       remove_trb
  163. help_trb:                               ; alles andere kommt hier an
  164.           disp_strg help_txt
  165.           jmp       ende
  166. disable_trb:
  167.           call      trb_vorh            ; ist Treiber da?
  168.           jne       err_0
  169.           mov       byte ptr es:[ enable_flag ], 0
  170.           disp_strg msg_4
  171.           jmp       ende
  172. enable_trb:
  173.           call      trb_vorh            ; ist Treiber da?
  174.           jne       err_0
  175.           mov       byte ptr es:[ enable_flag ], 1
  176.           disp_strg msg_3
  177.           jmp       ende
  178. err_0:    disp_strg err_msg_0
  179.           jmp       help_trb
  180. info_trb: call      trb_vorh
  181.           jne       err_0
  182.           cmp       byte ptr es:[ enable_flag ], 1
  183.           jz        trb_aktiv
  184.           disp_strg msg_4
  185.           jmp       ende
  186. trb_aktiv:
  187.           disp_strg msg_3
  188.           jmp       ende
  189. setup_trb:
  190.           call      trb_vorh            ; ist Treiber da?
  191.           jne       setup_weiter
  192. err_1:    disp_strg err_msg_1           ; zweimal geht nicht
  193.           jmp       help_trb
  194. setup_weiter:
  195.           mov       word ptr cs:[ save_int_17h ], bx ; Originalvektor sichern
  196.           mov       word ptr cs:[ save_int_17h+2 ], es
  197.           set_ivec  17h, trb_int                    ; neuen Vektor setzen
  198.           mov       byte ptr [ enable_flag ], 1
  199.           disp_strg msg_1                           ; Erfolgsmeldung
  200.           mov       dx, offset set_up
  201.           int       27h                             ; bleib da
  202. ;==============================================================================
  203. remove_trb:                             ; Installation aufheben
  204.           call      trb_vorh            ; ist Treiber da?
  205.           jne       err_0
  206.           mov       dx, word ptr es:[ save_int_17h ] ; Vektoren rücksetzen
  207.           mov       ax, word ptr es:[ save_int_17h+2 ]
  208.           mov       ds, ax
  209.           mov       al, 17h
  210.           mov       ah, 25h
  211.           dos_call
  212.           push      es                  ; ES sichern
  213.           mov       ax, es:env_seg      ; Environmentsegment freimachen
  214.           mov       es, ax
  215.           mov       ah, 49h
  216.           dos_call
  217.           pop       es                  ; altes ES wieder aktivieren
  218.           mov       ah, 49h             ; Programmsegment freimachen
  219.           dos_call
  220.           push      cs                  ; DS = CS
  221.           pop       ds
  222.           jnc       remove_ok
  223.           push      ax                  ; Fehlermeldung
  224.           disp_strg err_msg_2
  225.           pop       ax
  226.           cmp       al, 9
  227.           je        err_4
  228. err_3:    disp_strg err_msg_3
  229.           jmp       term
  230. err_4:    disp_strg err_msg_4
  231. term:     mov       al, 0ffh
  232.           jmp       ende
  233. remove_ok:
  234.           disp_strg msg_2
  235.           xor       al, al
  236. ende:     mov       ah, 4ch             ; Normales Programmende
  237.           dos_call
  238. set_up    endp
  239. ;==============================================================================
  240. ;         CALLs ( sparen Programmcode )
  241. ;==============================================================================
  242. trb_vorh  proc      near
  243.           get_ivec  17h                 ; Originalvektor lesen
  244.           mov       ax, es              ; Testen, ob bereits installiert
  245.           mov       di, offset kennung
  246.           mov       si, di
  247.           mov       cx, 5
  248.           cld
  249.           repe      cmpsb
  250.           ret
  251. trb_vorh  endp
  252. ;==============================================================================
  253. ;         MELDUNGEN ( des Treibers Sprachrohr )
  254. ;==============================================================================
  255. msg_1         db    'LJDRV ist installiert',13,10,'$'
  256. msg_2         db    'LJDRV ist deinstalliert',13,10,'$'
  257. msg_3         db    'LJDRV ist aktiv',13,10,'$'
  258. msg_4         db    'LJDRV ist inaktiv',13,10,'$'
  259. err_msg_0     db    'LJDRV ist nicht installiert',13,10,'$'
  260. err_msg_1     db    'LJDRV ist bereits installiert',13,10,'$'
  261. err_msg_2     db    'FEHLER: Speicher kann nicht freigemacht werden.',13,10,'$'
  262. err_msg_3     db    'ACHTUNG: Speicherbereich zerstört - '
  263.               db    'bitte System neu booten!',13,10,'$'
  264. err_msg_4     db    'Segment gehört nicht zu LJDRV.',13,10,'$'
  265. help_txt      db    'Aufruf: LJDRV [DEIRS]',13,10
  266.               db    '               D = Treiber deaktivieren',13,10
  267.               db    '               E = Treiber aktivieren',13,10
  268.               db    '               I = Treiber Information',13,10
  269.               db    '               ? = Treiber Hilfetext',13,10
  270.               db    '               R = Treiber deinstallieren',13,10
  271.               db    '               S = Treiber installieren',13,10,'$'
  272. cseg      ends
  273. ;==============================================================================
  274. end       main
  275.