summaryrefslogtreecommitdiff
path: root/system/shard-z80-ruc-64180/1.5/src/CONOUT4.INC
diff options
context:
space:
mode:
authorLars-Dominik Braun <lars@6xq.net>2019-02-11 11:49:19 +0100
committerLars-Dominik Braun <lars@6xq.net>2019-02-11 11:49:39 +0100
commit98cab31fc3659e33aef260efca55bf9f1753164c (patch)
treef1affa84049ef9b268e6c4f521f000478b0f3a8e /system/shard-z80-ruc-64180/1.5/src/CONOUT4.INC
parent71e2b36ccd05ea678e62e32ee6245df2b8d6ac17 (diff)
downloadeumel-src-98cab31fc3659e33aef260efca55bf9f1753164c.tar.gz
eumel-src-98cab31fc3659e33aef260efca55bf9f1753164c.tar.bz2
eumel-src-98cab31fc3659e33aef260efca55bf9f1753164c.zip
Add source files from Michael
Diffstat (limited to 'system/shard-z80-ruc-64180/1.5/src/CONOUT4.INC')
-rw-r--r--system/shard-z80-ruc-64180/1.5/src/CONOUT4.INC467
1 files changed, 467 insertions, 0 deletions
diff --git a/system/shard-z80-ruc-64180/1.5/src/CONOUT4.INC b/system/shard-z80-ruc-64180/1.5/src/CONOUT4.INC
new file mode 100644
index 0000000..89120f8
--- /dev/null
+++ b/system/shard-z80-ruc-64180/1.5/src/CONOUT4.INC
@@ -0,0 +1,467 @@
+
+;
+; CONOUT4.INC
+;
+; Character auf BASIS 108 80-Zeichen ausgeben
+;
+; Copyright (c) 1985 by Joerg Stattaus
+;
+; Modified for psi by R. Ellerbrake
+;
+; C=char
+;
+; Version 17.09.85
+; Stand: 22.12.86, mit Zeichensatzeinstellung (M.St)
+; 31.12.86, Mod. fuer 6502-Teil > 0C00
+;
+
+crtout:
+ ld hl,gotocnt ; GotoXY in Aktion ?
+ ld a,(hl)
+ or a
+ jr z,crt2
+
+ dec (hl)
+ ld a,c
+ jr z,crt1 ; Get X-Value
+
+ ld (gotoy),a ; Y storen
+ ret
+
+crt1: ld (gotox),a
+
+ ld b,7 ; Gotoxy is Function 7
+ jr conq
+
+crt2:
+ ld b,a
+ ld a,c
+
+crt3: cp ' '
+ jr nc,conq ; normales Zeichen
+
+crt4: ld hl,scrfen ; In Tabelle nach Zeichen suchen
+ ld b,22
+crt5: cp (hl)
+ jr z,crtfnd ; Sequenz erkannt
+
+ dec hl
+ djnz crt5
+
+ ret ; nicht in der Tabelle enthalten
+
+crtfnd: ld a,b ; Found
+ cp 7
+ jr nz,conq
+;
+ ld a,2
+ ld (gotocnt),a ; next 2 Bytes sind Koordinaten
+ RET
+
+SWICUR:
+ LD B,23 ; Cursor invertieren
+conq:
+ LD A,I ; IEF2 retten
+ PUSH AF
+ DI ; keine Interrupts zulassen
+;
+ in0 a,(cbar) ; Set CommonBaseAreaRegister for Video
+ ld (oldcbar),a
+ ld a,biosbank
+ out0 (cbar),a
+;
+ IN0 A,(BBR) ; Set Bank Base Register
+ LD (OLDBBR),A
+ LD A,AR6502
+ OUT0 (BBR),A
+;
+ LD (STKSAV),SP ; alten SP retten (im umgeschalteten Bereich)
+ LD SP,STACK
+;
+ CALL CONQ1 ; Print Char. on screen
+;
+ LD SP,(STKSAV) ; alten Stack zurueckholen
+;
+ LD A,(OLDBBR) ; restore old BBR
+ OUT0 (BBR),A
+ ld a,(oldcbar) ; and CBAR
+ out0 (cbar),a
+ POP AF ; IEF2 zurueckholen
+ RET PO ; vorher kein EI ->
+;
+ EI ;reenable Interrupts
+ RET
+
+; B=Sequenz / C=Char
+
+conq1: ld hl,(scradr)
+ ld de,(scrxy)
+ ld a,e
+ rra
+
+ CALL ZGERL ; Zugriff erlaubt ?
+ ld (stram1),a ; Dyn./Static RAM
+ jr nc,conq2
+ ld (stram2),a
+conq2:
+ ld a,b
+ or a
+ jr nz,scrfkt ; Screen-Function
+
+ ld a,(invmod) ; schreibe Zeichen auf Bildschirm
+ or c
+ ld (hl),a
+adv0: ex de,hl
+ inc hl
+ ld a,l
+ cp 80
+ jp c,onlinc
+
+ ld l,0
+ inc h
+ ld a,h
+ cp 24
+ jp c,calc
+
+ ; scroll noetig
+
+ ld l,0
+scroll: dec h
+ push hl
+ ld d,0
+ call del0 ; delete Zeile 0
+
+ pop hl
+calc: ld (scrxy),hl
+ ld e,l
+ ld a,h
+ call basclc
+ ld a,e ; hl=lineadr / a=scrxyr
+ srl a
+
+ ld (stram1),a
+ jr nc,calc3
+ ld (stram2),a
+calc3:
+ add a,l
+ ld l,a
+calc4: ld (scradr),hl
+calc5: ld a,(hl) ; get char on cursor adr
+ ld (curchr),a
+ ld a,(curinv)
+ xor (hl)
+ ld (hl),a ; invers zurueck
+ ld (stram1),a
+
+crtret: ret
+
+onlinc: ld (scrxy),a ; normales increment des scr.poi.
+ ex de,hl ; HL wieder = scradr
+ rra
+
+ ld (stram2),a
+ jr c,calc5 ; selbe Adresse, 2. Seite
+ ld (stram1),a
+ inc hl
+ jr calc4
+
+scrfkt: ld a,(curchr) ; Restore Char on Screen
+ ld (hl),a
+ ld a,b
+ ld hl,scrtab-2
+ add a,a
+ add a,l
+ ld l,a
+ LD A,H ; cross page boundary ?
+ ADC A,0
+ LD H,A
+ ld a,(hl)
+ inc hl
+ ld h,(hl)
+ ld l,a
+ jp (hl)
+
+; Screen-Functions
+
+advanc: ld hl,(scradr)
+ jr adv0
+
+schome: ld hl,0
+ jr tocalc
+
+gotoxy: ld hl,(gotox) ; H=Y / L=X
+got0: ld a,h
+ cp 24
+ jr c,got1
+
+ ld h,0
+got1: ld a,l
+ cp 80
+ jr c,tocalc
+
+got2: ld l,0
+ jr tocalc
+
+up: ex de,hl
+ dec h
+ jr got0
+
+carret: ex de,hl
+ jr got2
+
+backsp: ex de,hl
+ dec hl
+ ld a,l
+ cp 80
+ jr c,tocalc
+
+ ld l,79
+ jr got0
+
+linefd: ex de,hl
+ inc h
+ ld a,h
+ cp 24
+ jr c,tocalc
+
+ jp scroll
+
+erapag: push de
+ call erap0
+ pop hl
+tocalc: jp calc
+
+eralin: push de
+ call eral2
+ pop hl
+ jr tocalc
+
+insert: push de
+ ld a,d ; korrigiert
+ ld de,SCREEN+003d0h ; Zeile 23
+ cp 23
+ jr z,ins1 ; kein Verschieben
+
+ ld b,23
+ins0: dec b
+ call linmov
+ ld a,(scrxy+1) ; Vertikal Adresse
+ cp b
+ jr nz,ins0
+
+ins1: call blank
+ pop hl
+ jr got2
+
+delete: push de
+ call del0
+ pop hl
+ jr got2
+
+normal: ld a,80h
+ jr inv1
+
+invers: xor a
+inv1: ld (invmod),a
+;
+inv2: ex de,hl
+ jr tocalc
+
+chacur: ld hl,curinv
+ ld a,(hl)
+ xor 80h
+ ld (hl),a
+ jr inv2
+
+clear: call schome
+ ld de,0
+ push de
+ call erap0
+ pop hl
+ jr tocalc
+
+bell: push hl
+ ld a,(BEEPFRQ)
+ ld h,a
+ ld l,2 ; task beep
+ call to6502
+ pop hl ; transport scrxy to HL
+ ret
+
+eral2: ld hl,(scradr)
+ push hl
+ ld (stram1),a
+ ld a,e
+ srl a
+ jr nc,eral3
+
+ inc a
+ inc hl
+eral3: call erablk
+
+ ld (stram2),a
+ pop hl
+ ld a,e
+ srl a
+erablk: sub 41
+ cpl
+ ld b,0a0h
+erabl1: or a
+ ret z
+ ld (hl),b
+ inc hl
+ dec a
+ jr erabl1
+
+erap0: call eral2
+ ld a,(scrxy+1)
+erap1: inc a
+ cp 24
+ ret nc
+
+ push af
+ call basclc
+
+ ex de,hl
+ call blank
+ pop af
+ jr erap1
+
+del0: ld a,d
+ cp 23
+ ld de,SCREEN+003d0h ; Zeile 23
+ jr z,blank
+
+ push af
+ call basclc
+ pop bc ; Vert. Adr. von D -> A -> B
+
+ ex de,hl
+del1: inc b
+ call linmov
+ ld a,b
+ cp 23
+ jr c,del1
+
+blank: ld (stram1),a
+ ld a,' '+80h
+ push de
+ call blank1
+ pop de
+ ld (stram2),a
+
+blank1: ld b,40
+blank2: ld (de),a
+ inc de
+ djnz blank2
+
+ ret
+
+linmov: push bc
+ ld a,b
+ call basclc
+ ld (stram1),a
+ push hl
+ push de
+ ld bc,40
+ ldir ; eine Zeile
+ pop de
+ pop hl
+ push hl
+ ld (stram2),a
+ ld bc,40
+ ldir
+ pop de ; HL nun in DE = neues Ziel
+ pop bc
+ ret
+
+basclc: ld c,a
+ ld l,0
+ rra
+ rr l
+ and 3
+ add a,HIGH SCREEN ; screen - start
+ ld h,a
+ ld a,c
+ and 18h
+ ld c,a
+ add a,a
+ add a,a
+ add a,c ; * 5 = 40
+ add a,l
+ ld l,a
+ ret ; HL = Line adress
+
+ger: ; German ASCII
+ ld (sw0off),a
+ ld (sw1on),a
+ ld (sw2off),a
+ ret
+
+usa: ; ASCII
+ ld (sw0off),a
+ ld (sw1off),a
+ ld (sw2on),a
+ ret
+
+apl: ; APL
+ ld (sw0off),a
+ ld (sw1on),a
+ ld (sw2on),a
+ ret
+
+uni: ; ASCII und Inv. APL
+ ld (sw0on),a
+ ld (sw1on),a
+ ld (sw2on),a
+ ret
+
+invsw:
+ ld (swinv),a
+ ret
+
+flshsw:
+ ld (swflsh),a
+ ret
+
+; Screen-Command-Definition-Table
+
+;leadsf:db 1bh
+; db 0aah,0d9h,0d4h,0a9h,0a8h,1eh,0bdh,0bh,0ch
+; db 0ah,08h,0dh,0cch,0cdh,0dah,07h
+;
+; EUMEL psi-Terminal Definition
+;
+ DEFB 9 ;Clear Screen (bei psi undefiniert)
+ DEFB 4 ;Clear to End of Page
+ DEFB 5 ;Erase to End-of-Line
+ DEFB 14 ;Endmark (Normal Video)
+ DEFB 15 ;Beginmark (Invers Video)
+ DEFB 1 ;Home
+ DEFB 6 ;Cursor Positionierung
+ DEFB 3 ;Cursor 1 Zeile nach oben
+ DEFB 2 ;Cursor nach rechts
+ DEFB 10 ;Line feed
+ DEFB 8 ;Backspace
+ DEFB 13 ;Carriage Return
+ DEFB 11 ;Insert Line (bei psi undefiniert)
+ DEFB 12 ;Delete Line (bei psi undefiniert)
+ DEFB 0 ;NULL (nichts tun)
+ DEFB 7 ;BELL
+ DEFB 16 ;GER, Zeichensatz
+ DEFB 17 ;USA, "
+ DEFB 18 ;APL, "
+ DEFB 19 ;UNI, "
+ DEFB 20 ;Invers > 127
+ DEFB 21 ;Flash > 127
+
+scrfen equ $-1
+
+scrtab: dw clear,erapag,eralin,normal,invers,schome,gotoxy,up,advanc
+ dw linefd,backsp,carret,insert,delete,CRTRET,bell
+ dw ger,usa,apl,uni,invsw,flshsw,chacur
+;
+; CRTRET anstelle von chacur
+
+; Ende von CONOUT3.INC
+ \ No newline at end of file