;:sys36864
; eisberg
;
; nikolaus heusler  5.92
; XXXXXXXXXXXX XX
; XXXX XXXXXXXX XX
;
	;.opt oo
	*= 51200
; rom ins ram kopieren
	sei	;interrupt aus
	lda #47
	sta 0
	lda #55
	sta 1	;rom einschalten
	lda #160
	jsr copy	;basic-interpreter
	lda #224
	jsr copy	;kernal
	jsr modify	;modifizieren
	lda #53
	sta 1	;ram einschalten
	lda #<hi
	ldy #>hi
	cli
	jmp $ab1e	;einschaltmeldung ausgeben
; kopier-routine
copy	ldx #32	;anz. pages
	sta 3	;highbyte
	ldy #0
	sty 2	;lowbyte
loop	lda (2),y	;byte aus rom lesen
	sta (2),y	;und ins ram schreiben
	iny
	bne loop	;eine page bearbeiten
	inc 3
	dex
	bne loop	;naechste page
	rts
; einschaltmeldung
hi	.byt 13
	.byte "eisberg - nie wieder basic-fehler"
	.byt 13,13
	.byte "nikolaus heusler, muenchen 5.92"
	.byt 13,0
; ram-kernal modifizieren
modify	lda #<tab
	ldy #>tab	;zeiger auf adress-tabelle
	sta 2
	sty 3
; befehle loeschen
load	ldy #0
	lda (2),y
	sta 4	;lowbyte adresse merken
	iny
	lda (2),y
	sta 5	;highbyte
	lda 4
	ora 5	;tabellenende pruefen
	beq ende	;ja, dann fertig
	iny
	lda (2),y	;anz. bytes-1
	tay
	lda #234	;nop
fill	sta (4),y	;in ram schreiben
	dey
	bpl fill
	lda 2
	clc
	adc #3
	sta 2
	bcc load
	inc 3
	bne load
; ram-kernal modifizieren
ende	lda #<jum
	ldy #>jum	;zeiger auf adress-tabelle
	sta 2
	sty 3
; sprungbefehle einbauen
lade	ldy #0
	lda (2),y
	sta 4	;lowbyte adresse merken
	iny
	lda (2),y
	sta 5	;highbyte
	lda 4
	ora 5	;tabellenende pruefen
	beq fini	;ja, dann fertig
	lda #76	;jmp
	ldy #0
	sta (4),y	;ins ram
	ldy #2
	lda (2),y	;sprungadresse low
	dey
	sta (4),y	;ins ram
	ldy #3
	lda (2),y	;sprungadresse high
	dey
	sta (4),y	;ins ram
	lda 2
	clc
	adc #4
	sta 2
	bcc lade
	inc 3
	bne lade
; sonstige veraenderungen
fini	lda #56	;sec
	sta $a8c4	;undef'd statement
	lda #96	;rts
	sta $acf4	;extra ignored
	sta $ad9b	;type mismatch
	sta $b3a9	;illegal direct
	sta $e1d1	;fehler bei open und close
	sta $baf6	;overflow bei mal 10
	sta $b3ae	;undef'd function error
	lda #$1f	;zeiger auf rts
	sta $311	;usr-zeiger
	sta $e3c7	;im system
	lda #$a2
	sta $baeb	;ldx #0
	lda #$00
	sta $baec	;mal 10
	lda #$86
	sta $baed	;stx $6f
	lda #$6f
	sta $baee
	lda #$a2
	sta $baef	;ldx #$69
	lda #$69
	sta $baf0
	ldx #5	;ausweichroutine erzeugen
	stx $b78f	;leerstring bei asc
lauf	lda rucksack,x
	sta $a19e,x	;bereich fehlermeldungstexte
	dex
	bpl lauf
	lda #53
	sta $fdd6	;ram fixieren
	rts
; adressen-tabelle (befehle loeschen)
tab	=*
	.word $bb12
	.byt 1	;division by zero
	.word $a3fe
	.byt 1	;out of memory bei stack-ueberlauf
	.word $a405
	.byt 1	;out of memory bf
	.word $a405
	.byt 1	;out of memory bei stack-ueberlauf
	.word $a42e
	.byt 1	;out of memory
	.word $a6a2
	.byt 1	;syntax error list
	.word $a6b1
	.byt 1	;syntax error list
	.word $a6b9
	.byt 1	;syntax error list
	.word $a85f
	.byt 2	;can't continue
	.word $a8c3
	.byt 0	;undef'd statement
	.word $a955
	.byt 1	;kein goto hinter on
	.word $a97d
	.byt 1	;basiczeilen uegeter 63999
	.word $a9e5
	.byt 1	;ti$ laenge ungleich 6
	.word $aa24
	.byt 2	;nur ziffern in ti$
	.word $ab04
	.byt 1	;klammer zu hinter tab/pos
	.word $ac9a
	.byt 2	;typ mismatch input/get/read
	.word $acc4
	.byt 1	;out of data
	.word $adcd
	.byt 1	;vgl. operatoren auswertung
	.word $b09c
	.byt 2	;ziffern als var.namen
	.word $b0ca
	.byt 1	;integer-var. gesperrt
	.word $b138
	.byt 2	;zuweisung an ti
	.word $b141
	.byt 1	;zuweisung an st
	.word $b1bd
	.byt 1	;index negativ z.b. a(-1)
	.word $b1cc
	.byt 1	;integer groesser 32768
	.word $b251
	.byt 1	;redim'd array
	.word $b25c
	.byt 1	;anz. indizes falsch
	.word $b300
	.byt 1	;bad subscript
	.word $b308
	.byt 2	;bad subscript
	.word $b2ac
	.byt 1	;ueber 256 dimensionen
	.word $b2b7
	.byt 1	;array zu gross
	.word $b30b
	.byt 2	;bad subscr./out of memory
	.word $b365
	.byt 1	;array zu gross
	.word $b376
	.byt 1	;array zu gross
	.word $b446
	.byt 2	;syntax error bei fn
	.word $b4d0
	.byt 4	;formula too complex
	.word $b51a
	.byt 1	;stringspeicher voll
	.word $b658
	.byt 4	;string too long
	.word $b74b
	.byt 1	;erster para. bei mid$ null
	.word $b7a6
	.byt 1	;byte groesser 255
	.word $b7f9
	.byt 1	;adresse negativ
	.word $b7ff
	.byt 1	;adresse groesser 65535
	.word $b93a
	.byt 1	;overflow bei addition
	.word $b9f1
	.byt 2	;log-argument null/negativ
	.word $bac0
	.byt 1	;overflow bei multiplikation
	.word $bad8
	.byt 1	;overflow bei multiplikation
	.word $bb23
	.byt 1	;overflow bei division
	.word $bd93
	.byt 12	;exponenten-ueberlauf
	.word $e10f
	.byt 1	;bsout-fehler
	.word $e115
	.byt 1	;basin-fehler
	.word $e11b
	.byt 1	;ckout-fehler
	.word $e121
	.byt 1	;chkin-fehler
	.word $e127
	.byt 1	;getin-fehler
	.word $e19c
	.byt 4	;load error
	.word $e185
	.byt 1	;verify error
	.word $e162
	.byt 1	;fehler bei save
	.word $e178
	.byt 1	;fehler bei load
	.word 0
; adressen-tabelle (jump-befehle)
jum	=*
	.word $a8e5,$a19e	;return without gosub
	.word $a56d,$a562	;eingabezeile zu lang
	.word $a80b,$a19e	;syntax error doppelpkt. fehlt
	.word $af0a,$a19e	;syntax error allg.
	.word $ad30,$a19e	;next without for
	.word 0
; ausweichroutine
rucksack	jsr $a8f8	;data-befehl
	jmp $a7ae
