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