;####################################################################
;# 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