;####################################################################
;# Programm:      Demo-Programm fuer Bildschirmausgabe
;#                mit Basic-Starter
;#
;# Assembler:     [[ACME]]
;# Assemblierung: acme -f cbm -o output.bas output_bas.a
;#
;# Laden mit:     [[NEW]]
;#                [[LOAD]]"output.bas",8
;#
;# Start mit:     [[RUN]]
;#
;# Beschreibung:  Das Programm gibt nacheinander folgendes aus:
;#                - alle ASCII-Werte von 32 bis 127 in Zeilen
;#                  zu je 32 Zeichen
;#                - alle ASCII-Werte von 32 bis 127 in einer
;#                  Zeile mit horizontalem Scrolling
;#                - die Wert 0-255 in hexadezimalem Format
;#                - die Wert 0-255 in binaerem Format
;#                - die Wert 0-255 in dezmialem Format
;#                - die negativen Werte bis -128 in dezmialem Format
;#
;####################################################################


;####################################################################
;#
;# Basic-Starter
;#
;####################################################################

 *=$0801

; -- Basic-Startzeile erzeugen: 10 SYS 2061 --

 !by $0b, $0a           ; Zeiger zur zweiten Zeile
 !by $0a, $00           ; Zeilennummer (10)
 !by $9e                ; Token fuer SYS
 !by $32, $30, $36, $31 ; 2061 in ASCII
 !by $00                ; Ende der Basic-Zeile
 !by $00, $00           ; Zweite Basic-Zeile und zugleich Ende des
                        ; Basic-Programms


;####################################################################
;#
;# Hauptprogramm (Start bei $080d/#2061)
;#
;####################################################################


; -- Speicherstellen --

 !addr ptr  = $65       ; $65/$66; Zeiger fuer Textausgabe

 !addr cnt1 = $0335     ; Zaehler (ungenutzte Speicherstelle in der
 !addr cnt2 = $0336     ; erweiterten Zeropage)

; -- Kernal-Routinen --

 !addr getin = $ffe4    ; read keyboard buffer


; -- Start --

 jsr $c000 ; winit

; Alle ASCII-Werte von 32 bis 127 in Zeilen zu je 32 Zeichen

 ldx #<txt_ascii1
 stx ptr
 ldx #>txt_ascii1
 stx ptr+1
 jsr print_txt
 jsr $c021 ; newline
 ldx #32   ; ASCII-Codes ab 32
-
 stx cnt1
 txa
 jsr $c02d ; asciiout
; nach 32 Zeichen einen Zeilenumbruch einfuegen (die
; unteren 5 Bits sind bei einem Vielfachen von 32 null)
 ldy cnt1
 iny
 tya
 and #%00011111
 bne +
 jsr $c021 ; newline
+
 ldx cnt1
 inx
 cpx #127
 bne -
 jsr $c021 ; newline
 jsr $c021 ; newline

 jsr press_return
 jsr $c021 ; newline

; Alle ASCII-Werte von 32 bis 127 in einer Zeile mit
; horizontalem Scrolling

 ldx #<txt_ascii2
 stx ptr
 ldx #>txt_ascii2
 stx ptr+1
 jsr print_txt
 jsr $c021 ; newline
 ldx #32   ; ab Wert 32
-
 stx cnt1
 txa
 jsr $c02d ; asciiout
 ldx cnt1
 inx
 cpx #127  ; bis Wert 127
 bne -
 jsr $c021 ; newline
 jsr $c021 ; newline

 jsr press_return
 jsr $c021 ; newline

; linkes und rechtes Fenster einrichten

 jsr $c006 ; wselleft
 jsr $c015 ; delwin
 jsr $c030 ; wsave
 jsr $c009 ; wselright
 jsr $c015 ; delwin
 jsr $c033 ; wswitch

; Alle Hex-Werte von 0-255

 ldx #<txt_hex
 stx ptr
 ldx #>txt_hex
 stx ptr+1
 jsr print_txt

 jsr $c033 ; wswitch

 ldx #0    ; ab Wert 0
-
 stx cnt1
 lda #$24  ; '$'
 jsr $c01b ; chrout
 txa
 jsr $c024 ; hexout
 jsr $c021 ; newline
 ldx cnt1
 inx
 bne -     ; bis Wert 255 (X springt dann wieder auf null)

 jsr $c033 ; wswitch
 jsr press_return

; Alle Binaer-Werte von 0-255

 ldx #<txt_bin
 stx ptr
 ldx #>txt_bin
 stx ptr+1
 jsr print_txt

 jsr $c033 ; wswitch

 ldx #0    ; ab Wert 0
-
 stx cnt1
 lda #$25  ; '%'
 jsr $c01b ; chrout
 txa
 jsr $c027 ; binout
 jsr $c021 ; newline
 ldx cnt1
 inx
 bne -     ; bis Wert 255 (X springt dann wieder auf null)

 jsr $c033 ; wswitch
 jsr press_return

; Alle Dezimalwerte von 0-255

 ldx #<txt_dec1
 stx ptr
 ldx #>txt_dec1
 stx ptr+1
 jsr print_txt

 jsr $c033 ; wswitch

 ldx #0    ; ab Wert 0
-
 stx cnt1
 txa
 clc
 jsr $c02a ; decout
 jsr $c021 ; newline
 ldx cnt1
 inx
 bne -     ; bis Wert 255 (X springt dann wieder auf null)

 jsr $c033 ; wswitch
 jsr press_return

; Alle negativen Dezimalwerte

 ldx #<txt_dec2
 stx ptr
 ldx #>txt_dec2
 stx ptr+1
 jsr print_txt

 jsr $c033 ; wswitch

 ldx #255  ; ab Wert -1
-
 stx cnt1
 txa
 sec
 jsr $c02a ; decout
 jsr $c021 ; newline
 ldx cnt1
 dex
 cpx #127  ; bis Wert -128
 bne -

 jsr $c033 ; wswitch
 jsr press_return

; Ende

 jsr $c003 ; wselall
 jsr $c015 ; delwin

 ldx #<txt_end
 stx ptr
 ldx #>txt_end
 stx ptr+1
 jsr print_txt


 rts

press_return
 ldx #<txt_return
 stx ptr
 ldx #>txt_return
 stx ptr+1
 jsr print_txt

;  rts

 ; Tastaturpuffer auf ein Zeichen setzen und
 ; Tastenwiederholung ausschalten

 lda $0289
 pha
 lda #1
 sta $0289 ; max size of keyb buffer
 lda $028a
 pha
 lda #127
 sta $028a ; disable key repeat

-
 jsr getin
 cmp #$0d
 bne -

 ; Alte Werte fuer Tastaturpuffer und Tastenwiederholung
 ; wieder herstellen

 pla
 sta $028a
 pla
 sta $0289

 rts

print_txt
 ldy #0
-
 sty cnt2
 lda (ptr),y
 beq +
 jsr $c01b ; chrout
 ldy cnt2
 iny
 jmp -
+
 jsr $c021 ; newline
 rts

txt_return
 !scr "weiter mit return", 0

txt_ascii1
 !scr "alle ascii-werte von 32 bis 127", 0

txt_ascii2
 !scr "alle ascii-werte mit horiz. scrolling", 0

txt_hex
 !scr "hex-werte 0-255", 0

txt_bin
 !scr "bin-werte 0-255", 0

txt_dec1
 !scr "dez-werte 0-255", 0

txt_dec2
 !scr "neg. dez-werte", 0

txt_end
 !scr "das war's.", 0