; programm    : bild.asm         version 1.05        datum :23.09.1988
; syntax      : public-domain assembler  =>a86  (evtl. masm ?)
; aufgabe     : sichern eines bildschirm in eine datei.
;             : einen gesicherten bildschirm aus einer datei wieder auf
;             : auf den bildschirm bringen.
;
;             : nur fr  cga  geeignet !!!!!!
;
; aufruf      : bild name.ext
; bemerkungen : der quellcode ist auf die besonderheiten des a86 abgestimmt
;             ; z.b. keine segmentzuweisung, direktes laden von ds mit werten




           org 0100
param_a    equ   082
param_c    equ   [080]

           jmp start
hilfe      db 'BILD.com  version 1.05   august 1988       public-domain',13,10,10
           db 'Dieses Programm sichert den Inhalt des Bildschirmspeichers',13,10
           db 'in eine Datei.',13,10,10,10
           db ' ***     In dieser Version nur fr   C G A    geeignet   ***',13,10,10
           db 'Ein Umschalten zwischen dem Bildschirmen ist m”glich',13,10,10,10
           db 13,10,'aufruf : bild +name.ext  = bild sichern'
           db 13,10,'         bild -name.ext  = bild zurueckholen$'
fehl       db 13,10,07,'Datei-Fehler : Datei NICHT vorhanden ?$'
handle     dw 0000
start:     pushf
           push ax
           push bx
           push cx
           push dx
           push ds
           mov al,[param_a]
           cmp al,'+'
           je bsich
           cmp al,'-'
           je bhole
           mov dx,offset hilfe
           mov ah,09
           int 021
           jmp short back

bsich:     call par
           call neuhandle       ; handle eroeffnen
           call write           ; bildschirm holen
           call clhandle       ; handle schliessen
           jmp short back

bhole:     call par
           call ophandle
           call read
           call clhandle

back:      pop ds
           pop dx
           pop cx
           pop bx
           pop ax
           popf
           mov ah,04c
           int 021

neuhandle: xor ax,ax             ; neue datei eroeffnen
           mov ah,03c
           mov cx,0              ; dateiattribut : ohne beschraenkung
           mov dx,offset param_a
           inc dx
           int 021               ; param_a muss den namen der datei + 0
           jc fhandle            ; als letztes zeichen enthalten
           mov [handle],ax       ; erzeugten handle sichern
           ret                   ; neuhandle ueberschreibt auch alte dateien

ophandle:  xor ax,ax
           mov ah,03d
           mov al,00              ; nur lesen
           mov dx,offset param_a  ; param_a muss den namen der datei + 00h
           inc dx
           int 21h                ; als letztes zeichen enthalten
           jc fhandle
           mov [handle],ax        ; in handle wird die dateinummer uebergeben
           ret

fhandle:   mov dx,offset fehl    ; bei ungueltigen dateien
           mov ah,09             ; wird als handle der wert 02 erzeugt
           int 021               ; dies ist der handle fuer standard-
           jmp short back        ; fehlerausgabe (bildschirm)
                                 ; dann wuerde der bildschirmspeicher auf
                                 ; den bildschirm ausgegeben.
                                 ; kann uebrigens mit >con< als datei
                                 ; erreicht werden


clhandle:  xor ax,ax
           mov ah,03e
           mov bx,[handle]
           int 021
           jc fhandle
           ret

read:      mov bx,[handle]
           push ds
           mov ds,0b800
           mov dx,0
           mov cx,16256
           mov ah,03f
           int 21h

           pop ds
           ret

write:     mov bx,[handle]       ; ds:dx zeigt auf den begin des bildschirm-
           push ds               ; speichers
           mov ds,0b800          ; direktes laden von ds ist a86-special
           mov dx,0
           mov cx,16256          ; laenge des bildschirm-speichers
           mov ah,040
           int 021
           pop ds
           ret

par:       xor ch,ch
           mov cl,param_c
           dec cl
           mov di,offset param_a
           inc di
           mov al,0d
           repnz
           scasb
           dec di
           mov byte ptr [di],0
           ret

