!to "test_screen.prg", cbm

 *=$c000

 jmp test_save_orig           ; SYS 49152
 jmp test_restore_orig        ; SYS 49155
 ; Kernalroutinen
 jmp test_set_start_of_line   ; SYS 49158
 jmp test_clear_screen_line   ; SYS 49161
 jmp test_clear_screen_1      ; SYS 49164
 jmp test_clear_screen_2      ; SYS 49167
 jmp test_home_cursor         ; SYS 49170
 jmp test_move_a_screen_line  ; SYS 49173
 jmp test_scroll_1            ; SYS 49176
 jmp test_scroll_2            ; SYS 49179
 jmp test_backscroll_1        ; SYS 49182
 jmp test_backscroll_2        ; SYS 49185
 jmp test_goto_next_line_1    ; SYS 49188
 jmp test_goto_next_line_2    ; SYS 49191
 jmp test_perform_return      ; SYS 49194
 jmp test_goto_prev_line_1    ; SYS 49197
 jmp test_goto_prev_line_2    ; SYS 49200
 jmp test_perform_backreturn  ; SYS 49203
 jmp test_advance_cursor_1    ; SYS 49206
 jmp test_advance_cursor_2    ; SYS 49209
 jmp test_back_cursor_1       ; SYS 49212
 jmp test_back_cursor_2       ; SYS 49215
 jmp test_delete_char_1       ; SYS 49218
 jmp test_delete_char_2       ; SYS 49221
 jmp test_insert_char_1       ; SYS 49224
 jmp test_insert_char_2       ; SYS 49227
 jmp test_setup_screen_print  ; SYS 49230
 ; Test der Routine output_to_screen bzw.
 ; unshifted_chars und shifted_chars
 jmp test_output_registers    ; SYS 49233
 jmp test_unshifted_chars     ; SYS 49236
 jmp test_shifted_chars       ; SYS 49239
 jmp test_return              ; SYS 49242
 jmp test_shift_return        ; SYS 49245
 jmp test_move_crsr           ; SYS 49248
 jmp test_clear               ; SYS 49251
 jmp test_revers              ; SYS 49254
 jmp test_colors              ; SYS 49257
 jmp test_delete              ; SYS 49260
 jmp test_insert              ; SYS 49263
 jmp test_unknown             ; SYS 49266
 ; weitere Kernalroutine
 jmp test_put_row_col         ; SYS 49269
 ; Hilfsfunktion
 jmp test_set_wptrs           ; SYS 49272
 jmp test_set_default         ; SYS 49275
 ; Funktionen
 jmp test_winit_wquit         ; SYS 49278
 jmp test_wsplit_1            ; SYS 49281
 jmp test_wsplit_2            ; SYS 49284
 jmp test_wswitch             ; SYS 49287
 jmp test_wsplit_3            ; SYS 49290
 jmp test_wsplit_4            ; SYS 49293
 jmp test_wunsplit            ; SYS 49296
 jmp test_hcopy_1             ; SYS 49299
 jmp test_hcopy_2             ; SYS 49302

 !source "screen.a"


;####################################################################
;#
;# Makros
;#
;####################################################################

 ; Richtet ein Fenster ein
 ; Parameter: Start bei Zeilennummer, Anzahl Zeilen,
 ;            aktuelle Spalte und Zeile

 !macro set_win_params .start, .rows, .col, .row {
   lda #<wptrs_scr + .start*2
   sta wptrs
   lda #>wptrs_scr + .start*2
   sta wptrs+1
   lda #.rows
   sta wrows
   lda #.col
   sta wx
   lda #.row
   sta wy
 }


;####################################################################
;#
;# Hilfsroutinen
;#
;####################################################################

; Die ersten 6 Zeilen mit roten "B" fuellen

fill_lines
 ldy #0
 lda #2
-
 sta $0400,y
 sta $d800,y
 iny
 cpy #6 * 40
 bcc -
 rts


; Erste und letzte Spalte des Fensters mit
; fortlaufenden Ziffern beginnend bei 0 fuellen
; (das Farb-RAM wird nicht veraendert)

fill_scroll_win
 lda wy          ; wy sichern
 pha
 lda #0          ; in der ersten Zeile beginnen
 sta wy
-
 jsr set_start_of_line  ; $d1/$d2 (wlnp) setzen
 lda wy          ; Ziffern beginnend ab '0'; chr(wy+48)
 clc
 adc #$30
 ldy #0          ; in die erste Spalte
 sta (wlnp),y
 ldy #COLS       ; in die letzte Spalte
 sta (wlnp),y
 inc wy          ; wy erhoehen
 lda wy          ; Abbruchbedingung wy > wrows
 cmp wrows
 bcc -
 beq -
 pla             ; wy wieder herstellen
 sta wy
 rts


; Bildschirmzeile mit 40 verschiedenen Zeichen in
; wechselnden Farben fuellen

fill_move_line
 jsr set_start_of_line  ; $d1/$d2 (wlnp) setzen
 jsr sync_color_ptr     ; $f3/$f4 (wclnp) setzen

 ; Hintergrundfarbe ermitteln und zwischenspeichern
 lda $d021
 and #$0f
 sta $0334       ; unbenutzte Speicherstelle

 ; Bildschirmzeile fuellen
 ldy #39         ; Bildschirmcode 39 bis 0 verwenden
-
 tya
 sta (wlnp),y
 and #$0f        ; die unteren 4 Bits als Farbe verwenden
 cmp $0334       ; es sei denn, es ist die Hintergrundfarbe
 bne +
 lda $0286       ; in diesem Fall die Textfarbe verwenden
+
 sta (wclnp),y
 dey
 bpl -
 rts


; Speichert die Fensterparameter in den Vergleichswerten ab

save_wlnp_wx_wy
 lda wlnp
 sta vals
 lda wlnp+1
 sta vals+1
 lda wx
 sta vals+2
 lda wy
 sta vals+3
 rts


; Teilt den Bildschirm und speichert die Vergleichswerte ab
; (wy muss von der aufrufenden Routine gesetzt werden)

split_screen
 jsr set_screen_pointers
 jsr wsplit
 jsr save_wlnp_wx_wy
 lda wrows
 sta vals+4
 lda sptrs
 sta vals+5
 lda sptrs+1
 sta vals+6
 lda srows
 sta vals+7
 lda sx
 sta vals+8
 lda sy
 sta vals+9
 rts


;####################################################################
;#
;# Testroutinen
;#
;####################################################################

; Ruft die Routine zur Sicherung der Originaldaten auf

test_save_orig
 jsr save_orig
 lda #<sav_scrzp
 sta vals
 lda #>sav_scrzp
 sta vals+1
 lda #<sav_outptr
 sta vals+2
 lda #>sav_outptr
 sta vals+3
 lda #<sav_color
 sta vals+4
 lda #>sav_color
 sta vals+5
 lda #<sav_invers
 sta vals+6
 lda #>sav_invers
 sta vals+7
 rts


test_restore_orig
 jsr save_orig
 +set_win_params 0, 24, 20, 7
 jsr restore_orig
 rts


; Richtet ein Fenster ueber den gesamten Bildschirm ein
; und setzt den Cursor in die 8. Zeile (Zeilennummer 7)

test_set_start_of_line
 jsr save_orig
 +set_win_params 0, 24, 0, 7
 jsr set_start_of_line
 lda wlnp
 sta vals
 lda wlnp+1
 sta vals+1
 jsr restore_orig
 rts


; Richtet ein Fenster mit 6 Zeilen ein und loescht die
; 4. Zeile (Zeilennummer 3);

test_clear_screen_line
 jsr save_orig
 jsr fill_lines
 +set_win_params 0, 5, 0, 3
 jsr clear_screen_line
 lda $0286
 sta vals
 jsr restore_orig
 rts


; Richtet ein Fenster mit 5 Zeilen ein und loescht es

test_clear_screen_1
 jsr save_orig
 jsr fill_lines
 +set_win_params 0, 4, 0, 0
 jsr clear_screen
 jsr restore_orig
 rts


; Richtet ein Fenster mit 1 Zeile ein und loescht es.
; Das Fenster beginnt in der 3. Bildschirmzeile.

test_clear_screen_2
 jsr save_orig
 jsr fill_lines
 +set_win_params 2, 0, 0, 0
 jsr clear_screen
 jsr restore_orig
 rts


; Platziert den Cursor oben/links (ausgehend von einer
; Position mitten im Fenster)

test_home_cursor
 jsr save_orig
 +set_win_params 0, 5, 10, 4
 jsr home_cursor
 jsr save_wlnp_wx_wy
 jsr restore_orig
 rts


; Fuellt die 3. Zeile (Zeilennummer 2) mit Zeichen
; unterschiedlicher Farbe und kopiert diese Zeile
; dann zwei Zeilen nach unten

test_move_a_screen_line
 jsr save_orig
 +set_win_params 0, 7, 0, 2
 jsr fill_move_line

 ; $d1/$d2 (wlnp) und $f3/$f4 (wclnp) bereits
 ; durch fill_move_line gesetzt

 ; $ac/$ad (tptr1) zwei Zeilen tiefer setzen
 lda wlnp
 clc
 adc #80
 sta tptr1
 lda wlnp+1
 adc #0
 sta tptr1+1
 jsr move_a_screen_line
 jsr restore_orig
 rts


; Richtet ein Fenster mit 5 Zeilen ein, in dem in der ersten
; und letzten Spalte fortlaufend Ziffern beginnend mit null
; stehen und scrollt das Fenster. Das Farb-RAM wird dabei
; nicht veraendert.

test_scroll_1
 jsr save_orig
 jsr fill_lines
 +set_win_params 0, 4, 0, 4
 jsr clear_screen
 jsr fill_scroll_win
 jsr scroll_screen
 lda wy
 sta vals
 jsr restore_orig
 rts


; Richtet ein Fenster mit einer Zeile ein, in der in der ersten
; und letzten Spalte fortlaufend eine Null steht und scrollt das
; Fenster. Das Farb-RAM wird dabei nicht veraendert.

test_scroll_2
 jsr save_orig
 jsr fill_lines
 +set_win_params 0, 0, 0, 0
 jsr clear_screen
 jsr fill_scroll_win
 jsr scroll_screen
 jsr restore_orig
 rts


; Richtet ein Fenster mit 5 Zeilen ein, in dem in der ersten
; und letzten Spalte fortlaufend Ziffern beginnend mit null
; stehen und scrollt das Fenster rueckwaerts. Das Farb-RAM
; wird dabei nicht veraendert. Das Fenster beginnt in der
; 2. Bildschirmzeile.

test_backscroll_1
 jsr save_orig
 jsr fill_lines
 +set_win_params 1, 4, 0, 0
 jsr clear_screen
 jsr fill_scroll_win
 jsr backscroll_screen
 lda wy
 sta vals
 jsr restore_orig
 rts


; Richtet ein Fenster mit einer Zeile ein, in der in der ersten
; und letzten Spalte fortlaufend eine Null steht und scrollt das
; Fenster. Das Farb-RAM wird dabei nicht veraendert. Das Fenster
; beginnt in der 6. Bildschirmzeile.

test_backscroll_2
 jsr save_orig
 jsr fill_lines
 +set_win_params 5, 0, 0, 0
 jsr clear_screen
 jsr fill_scroll_win
 jsr backscroll_screen
 jsr restore_orig
 rts


; Bewegt den Cursor von der 3. zur 4. Zeile
; (Zeilennummer 2 nach 3)

test_goto_next_line_1
 jsr save_orig
 +set_win_params 0, 5, 0, 2
 jsr fill_scroll_win
 jsr set_start_of_line  ; $d1/$d2 (wlnp) setzen
 jsr go_to_next_line
 lda wlnp
 sta vals
 lda wlnp+1
 sta vals+1
 lda wy
 sta vals+2
 jsr restore_orig
 rts


; Bewegt den Cursur von der letzten Zeile (Zeilennummer 5)
; aus eine Zeile nach unten (mit Scrolling).

test_goto_next_line_2
 jsr save_orig
 +set_win_params 0, 5, 0, 5
 jsr fill_scroll_win
 jsr set_start_of_line  ; $d1/$d2 (wlnp) setzen
 jsr go_to_next_line
 lda wlnp
 sta vals
 lda wlnp+1
 sta vals+1
 lda wy
 sta vals+2
 jsr restore_orig
 rts


; Fuehrt in der 3. Zeile (Zeilennummer 2) einen Zeilenumbruch
; durch (der Cursor steht mitten in der Zeile)

test_perform_return
 jsr save_orig
 +set_win_params 0, 5, 10, 2
 jsr set_start_of_line  ; $d1/$d2 (wlnp) setzen
 jsr perform_return
 jsr save_wlnp_wx_wy
 jsr restore_orig
 rts


; Bewegt den Cursor von der 4. zur 3. Zeile
; (Zeilennummer 3 nach 2)

test_goto_prev_line_1
 jsr save_orig
 +set_win_params 0, 5, 0, 3
 jsr fill_scroll_win
 jsr set_start_of_line  ; $d1/$d2 (wlnp) setzen
 jsr go_to_prev_line
 lda wlnp
 sta vals
 lda wlnp+1
 sta vals+1
 lda wy
 sta vals+2
 jsr restore_orig
 rts


; Bewegt den Cursur von der ersten Zeile (Zeilennummer 0)
; aus eine Zeile nach oben (mit Scrolling)

test_goto_prev_line_2
 jsr save_orig
 +set_win_params 0, 5, 0, 0
 jsr fill_scroll_win
 jsr set_start_of_line  ; $d1/$d2 (wlnp) setzen
 jsr go_to_prev_line
 lda wlnp
 sta vals
 lda wlnp+1
 sta vals+1
 lda wy
 sta vals+2
 jsr restore_orig
 rts


; Fuehrt in der 3. Zeile (Zeilennummer 2) einen
; rueckwaertigen Zeilenumbruch durch (der Cursor
; steht mitten in der Zeile)

test_perform_backreturn
 jsr save_orig
 +set_win_params 0, 5, 10, 2
 jsr set_start_of_line  ; $d1/$d2 (wlnp) setzen
 jsr perform_backreturn
 jsr save_wlnp_wx_wy
 jsr restore_orig
 rts


; Bewegt den Cursor in der 3. Zeile (Zeilennummer 2)
; von einer Position inmitten der Zeile um eins nach
; rechts

test_advance_cursor_1
 jsr save_orig
 +set_win_params 0, 5, 20, 2
 jsr set_start_of_line  ; $d1/$d2 (wlnp) setzen
 jsr advance_cursor
 jsr save_wlnp_wx_wy
 jsr restore_orig
 rts


; Bewegt den Cursor in der 3. Zeile (Zeilennummer 2)
; von der letzten Position der Zeile um eins nach
; rechts

test_advance_cursor_2
 jsr save_orig
 +set_win_params 0, 5, 39, 2
 jsr set_start_of_line  ; $d1/$d2 (wlnp) setzen
 jsr advance_cursor
 jsr save_wlnp_wx_wy
 jsr restore_orig
 rts


; Bewegt den Cursor in der 3. Zeile (Zeilennummer 2)
; von einer Position inmitten der Zeile um eins nach
; links

test_back_cursor_1
 jsr save_orig
 +set_win_params 0, 5, 20, 2
 jsr set_start_of_line  ; $d1/$d2 (wlnp) setzen
 jsr back_cursor
 jsr save_wlnp_wx_wy
 jsr restore_orig
 rts


; Bewegt den Cursor in der 3. Zeile (Zeilennummer 2)
; von der ersten Position der Zeile um eins nach
; links

test_back_cursor_2
 jsr save_orig
 +set_win_params 0, 5, 0, 2
 jsr set_start_of_line  ; $d1/$d2 (wlnp) setzen
 jsr back_cursor
 jsr save_wlnp_wx_wy
 jsr restore_orig
 rts


; Loescht in der 3. Zeile (Zeilennummer 2) ein Zeichen
; (der Cursor befindet sich innerhalb der Zeile)

test_delete_char_1
 jsr save_orig
 +set_win_params 0, 5, 10, 2
 jsr fill_move_line

 ; $d1/$d2 (wlnp) bereits durch fill_move_line gesetzt
 jsr delete_char
 lda wx
 sta vals
 lda $0286
 sta vals+1
 jsr restore_orig
 rts


; Loescht in der 3. Zeile (Zeilennummer 2) ein Zeichen
; (der Cursor befindet sich am Anfang der Zeile)

test_delete_char_2
 jsr save_orig
 +set_win_params 0, 5, 0, 2
 jsr fill_move_line

 ; $d1/$d2 (wlnp) bereits durch fill_move_line gesetzt
 jsr delete_char
 lda wx
 sta vals
 jsr restore_orig
 rts


; Fuegt in der 3. Zeile (Zeilennummer 2) ein Zeichen
; ein (der Cursor befindet sich am Anfang der Zeile)

test_insert_char_1
 jsr save_orig
 +set_win_params 0, 5, 0, 2
 jsr fill_move_line

 ; $d1/$d2 (wlnp) bereits durch fill_move_line gesetzt
 jsr insert_char
 lda wx
 sta vals
 lda $0286
 sta vals+1
 jsr restore_orig
 rts


; Fuegt in der 3. Zeile (Zeilennummer 2) ein Zeichen
; ein (der Cursor befindet sich am Ende der Zeile)

test_insert_char_2
 jsr save_orig
 +set_win_params 0, 5, 39, 2
 jsr fill_move_line

 ; $d1/$d2 (wlnp) bereits durch fill_move_line gesetzt
 jsr insert_char
 lda wx
 sta vals
 lda $0286
 sta vals+1
 jsr restore_orig
 rts


; Gibt in der 3. Zeile (Zeilennummer 2) ein normales
; und ein inverses Zeichen in roter Farbe aus

test_setup_screen_print
 jsr save_orig
 +set_win_params 0, 5, 20, 2
 jsr set_start_of_line  ; $d1/$d2 (wlnp) setzen
 lda #2
 sta $0286
 jsr setup_screen_print
 lda #3
 sta $c7
 jsr setup_screen_print
 lda $0286
 sta vals
 jsr restore_orig
 rts


; Gibt ein Zeichen aus und setzt vorher das X- und
; Y-Register

test_output_registers
 jsr save_orig
 +set_win_params 0, 5, 0, 0
 jsr clear_screen
 ldx #100
 ldy #200
 lda #65
 jsr output_to_screen
 sta vals
 stx vals+1
 sty vals+2
 jsr restore_orig
 rts


; Gibt die Buchstaben/Grafikzeichen ohne Umschalttaste
; aus (ASCII 32-127)

test_unshifted_chars
 jsr save_orig
 +set_win_params 0, 5, 0, 0
 jsr clear_screen
 ; $d1/$d2 durch clear_screen gesetzt
 ldx #32
-
 txa
 jsr output_to_screen
 inx
 bpl -   ; Abbruchbedingung: X >= 128
 jsr restore_orig
 rts


; Gibt die Buchstaben/Grafikzeichen ohne Umschalttaste
; aus (ASCII 160-255)

test_shifted_chars
 jsr save_orig
 +set_win_params 0, 5, 0, 0
 jsr clear_screen
 ; $d1/$d2 durch clear_screen gesetzt
 ldx #160
-
 txa
 jsr output_to_screen
 inx
 bne -   ; Abbruchbedingung: X = 0 (Ueberlauf)
 jsr restore_orig
 rts


; Gibt in der 3. Zeile (Zeilenindex 2) den ASCII-Wert
; 13 fuer einen Zeilenumbruch aus (der Cursor befindet
; sich in der Mitte der Zeile)

test_return
 jsr save_orig
 +set_win_params 0, 5, 20, 2
 lda #13
 jsr output_to_screen
 lda wx
 sta vals
 lda wy
 sta vals+1
 jsr restore_orig
 rts


; Gibt in der 3. Zeile (Zeilenindex 2) den ASCII-Wert
; 141 fuer einen rueckwaertigen Zeilenumbruch aus (der
; Cursor befindet sich in der Mitte der Zeile)

test_shift_return
 jsr save_orig
 +set_win_params 0, 5, 20, 2
 lda #141
 jsr output_to_screen
 lda wx
 sta vals
 lda wy
 sta vals+1
 jsr restore_orig
 rts


; Gibt nacheinander die ASCII-Werte 29 (Cursor right),
; 17 (Cursor down), 157 (Cursor left), 145 (Cursor up)
; und 19 (Home) aus

test_move_crsr
 jsr save_orig
 +set_win_params 0, 5, 20, 2
 lda #29
 jsr output_to_screen
 lda wx
 sta vals
 lda wy
 sta vals+1
 lda #17
 jsr output_to_screen
 lda wx
 sta vals+2
 lda wy
 sta vals+3
 lda #157
 jsr output_to_screen
 lda wx
 sta vals+4
 lda wy
 sta vals+5
 lda #145
 jsr output_to_screen
 lda wx
 sta vals+6
 lda wy
 sta vals+7
 lda #19
 jsr output_to_screen
 lda wx
 sta vals+8
 lda wy
 sta vals+9
 jsr restore_orig
 rts


; Gibt den ASCII-Wert 147 (CLR) aus

test_clear
 jsr save_orig
 jsr fill_lines
 +set_win_params 0, 4, 0, 0
 lda #147
 jsr output_to_screen
 jsr restore_orig
 rts


; Gibt nacheinander die ASCII-Werte 65 ("A"), 18 (RVS ON),
; 66 ("B"), 146 ("RVS OFF") und 67 ("C") aus

test_revers
 jsr save_orig
 +set_win_params 0, 5, 0, 0
 jsr clear_screen
 ; $d1/$d2 durch clear_screen gesetzt
 lda #65
 jsr output_to_screen
 lda #18
 jsr output_to_screen
 lda #66
 jsr output_to_screen
 lda #146
 jsr output_to_screen
 lda #67
 jsr output_to_screen
 jsr restore_orig
 rts


; Gibt die 15 Buchstaben "P" bis "A" (ASCII-Werte 80 bis 65)
; in den Farbcodes 15 bis 0 (ASCII-Werte 155 bis 149, 129,
; 158, 31, 30, 156, 159, 28, 5 und 144) aus

test_colors
 jsr save_orig
 +set_win_params 0, 5, 0, 0
 jsr clear_screen
 ; $d1/$d2 durch clear_screen gesetzt
 ldx #15
-
 lda colors,x
 jsr output_to_screen
 txa
 clc
 adc #65
 jsr output_to_screen
 dex
 bpl -
 jsr restore_orig
 rts

 ; ASCII-Werte fuer Farben
colors
 !by 144, 5, 28, 159, 156, 30, 31, 158
 !by 129, 149, 150, 151, 152, 153, 154, 155


; Gibt in der 3. Zeile (Zeilennummer 2) den ASCII-WERT 20
; (DEL) aus

test_delete
 jsr save_orig
 +set_win_params 0, 5, 20, 2
 jsr fill_move_line

 ; $d1/$d2 (wlnp) bereits durch fill_move_line gesetzt
 lda #20
 jsr output_to_screen
 lda wx
 sta vals
 jsr restore_orig
 rts


; Gibt in der 3. Zeile (Zeilennummer 2) den ASCII-WERT 148
; (INS) aus

test_insert
 jsr save_orig
 +set_win_params 0, 5, 20, 2
 jsr fill_move_line

 ; $d1/$d2 (wlnp) bereits durch fill_move_line gesetzt
 lda #148
 jsr output_to_screen
 lda wx
 sta vals
 jsr restore_orig
 rts


; Platziert den Cursor mit ASCII 29 und ASCII 17 in der
; 2. Zeile und gibt dann einen unbekannten Wert (ASCII 1)
; aus

test_unknown
 jsr save_orig
 +set_win_params 0, 5, 0, 0
 jsr clear_screen
 ; $d1/$d2 durch clear_screen gesetzt
 lda #29
 jsr output_to_screen
 lda #17
 jsr output_to_screen
 lda #1
 jsr output_to_screen
 jsr save_wlnp_wx_wy
 lda invers
 sta vals+4
 jsr restore_orig
 rts


; Platziert den Cursor in der Mitte der 3. Zeile (Zeilennummer 2)

test_put_row_col
 jsr save_orig
 +set_win_params 0, 5, 0, 0
 ldx #2
 ldy #20
 jsr put_row_col
 jsr save_wlnp_wx_wy
 jsr restore_orig
 rts

; Ermittelt die Adresse in der Tabelle fuer die Bildschirmzeiger,
; in der die Zeiger fuer die erste und letzte Zeile stehen

test_set_wptrs
 jsr save_orig
 lda #0
 jsr set_wptrs
 lda wptrs
 sta vals
 lda wptrs+1
 sta vals+1
 lda #24
 jsr set_wptrs
 lda wptrs
 sta vals+2
 lda wptrs+1
 sta vals+3
 jsr restore_orig
 rts

; Ruft die Standardkonfiguration fuer ein grosses Fenster auf

test_set_default
 jsr save_orig
 jsr set_default
 lda wptrs
 sta vals
 lda wptrs+1
 sta vals+1
 lda sptrs
 sta vals+2
 lda sptrs+1
 sta vals+3
 lda wrows
 sta vals+4
 lda srows
 sta vals+5
 lda sx
 sta vals+6
 lda sy
 sta vals+7
 jsr restore_orig
 rts

; Richtet ein Fenster mit winit ein und gibt das Zeichen
; "A" aus

test_winit_wquit
 jsr winit
 lda #65
 jsr $ffd2
 jsr save_wlnp_wx_wy
 jsr wquit
 rts

; Teilt den Bildschirm in der 9. Zeile (Zeilennummer 8)
; in zwei Fenster auf

test_wsplit_1
 jsr winit
 lda #8
 sta wy
 jsr split_screen
 jsr wquit
 rts

; Gibt oben/links ein "A" aus und versucht, den Bildschirm
; in der ersten bzw. letzten Zeile zu teilen

test_wsplit_2
 jsr winit
 lda #65
 jsr $ffd2
 ; wy hat noch den Wert 0
 jsr wsplit
 lda wrows
 sta vals
 lda srows
 sta vals+1
 ; mit wy=24
 lda #24
 sta wy
 jsr set_screen_pointers
 jsr wsplit
 lda wrows
 sta vals+2
 lda srows
 sta vals+3
 jsr wquit
 rts

; test_wsplit_3 und 4 kommen nach test_switch

; Teilt den Bildschirm in der 7. Zeile (Zeilennummer 6) und
; gibt im oberen Fenster in den ersten drei Zeilen "A", "B"
; und "C" aus, sowie im unteren Fenster ein "D"

test_wswitch
 jsr winit
 lda #6
 sta wy
 jsr set_screen_pointers
 jsr wsplit
 lda #65
 jsr $ffd2
 lda #13
 jsr $ffd2
 lda #66
 jsr $ffd2
 lda #13
 jsr $ffd2
 lda #67
 jsr $ffd2
 jsr wswitch
 lda #68
 jsr $ffd2
 lda sptrs
 sta vals
 lda sptrs+1
 sta vals+1
 lda srows
 sta vals+2
 lda sx
 sta vals+3
 lda sy
 sta vals+4
 jsr wquit
 rts

; Teilt den Bildschirm in der 2. Zeile (Zeilennummer 1)
; in zwei Fenster auf

test_wsplit_3
 jsr winit
 lda #1
 sta wy
 jsr split_screen
 jsr wquit
 rts

; Teilt den Bildschirm in der 24. Zeile (Zeilennummer 23)
; in zwei Fenster auf

test_wsplit_4
 jsr winit
 lda #23
 sta wy
 jsr split_screen
 jsr wquit
 rts

; Teilt den Bildschirm in der 7. Zeile (Zeilennummer 6) und
; stellt danach die Standardkonfiguration wieder her

test_wunsplit
 jsr winit
 lda #6
 sta wy
 jsr set_screen_pointers
 jsr wsplit
 jsr wunsplit
 jsr save_wlnp_wx_wy
 lda wrows
 sta vals+4
 lda srows
 sta vals+5
 jsr wquit
 rts

; Hilfsroutine fuer test_hcopy

print_txt
 ldx #0
-
 lda txt_hcopy,x
 jsr $ffd2
 inx
 cpx #14
 bne -
 rts

txt_hcopy
 !tx "DRUCKERAUSGABE" ; 14 Zeichen

; Teilt den Bildschirm in der 6. Zeile (Zeilennummer 5),
; fuellt den oberen Bildschirm mit Text und druckt in aus

test_hcopy_1
 jsr winit
 lda #5
 sta wy
 jsr set_screen_pointers
 jsr wsplit
 ldy #3
-
 jsr print_txt
 lda #17
 jsr $ffd2
 dey
 bne -
 jsr print_txt
 jsr whcopy
 jsr wquit
 rts

; Teilt den Bildschirm in der 2. Zeile (Zeilennummer 1),
; fuellt den oberen Bildschirm mit Text und druckt in aus

test_hcopy_2
 jsr winit
 lda #1
 sta wy
 jsr set_screen_pointers
 jsr wsplit
 jsr print_txt
 jsr whcopy
 jsr wquit
 rts


;####################################################################
;#
;# Ablageort zur Ueberpruefung der Werte
;#
;####################################################################

*=$cdf0

vals
!wo 0, 0, 0, 0, 0