title PCW Zeichenerkennung name ('DECHAR') ; Die Zeichen des PCW (Joyce) stehen als 8x8 Matrix im Video- ; Speicher. Auf die Zeichen kann ueber das Roller RAM ; zugegriffen werden. Dieses Programm beinhaltet Routinen, ; die aus der Matrix den ASCII-Wert eines Zeichens ergeben. ; Die Routinen beruecksichten auch die Attribute invers und ; unterstrichen sowie eine Kombination aus beiden. ; Werner Cirsovius, Dezember 2002 - PCW still living:-) OS equ 0000h BDOS equ 0005h .string equ 9 lf equ 0ah cr equ 0dh esc equ 1bh eot equ '$' ROLLER equ 0b600h CHARMAT equ 0b800h COMRAM equ 0c000h USERF equ 30 SCR_RUN equ 00e9h LINLEN equ 90 CHRLEN equ 8 ld sp,LocStk ; Eigenen Stack laden ; ; ++++++++++++++++ COMMON MEMORY VORBEREITEN ++++++++++++++++ ; ld hl,Comstrt ld de,COMRAM ld bc,Comlen ldir ; Routine verschieben ; ld hl,(OS+1) ; BIOS Vektor holen ld de,3*(USERF-1) add hl,de ld (XBIOS+1),hl ; XBIOS Vektor eintragen ; ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ld de,TestMessage call String ld e,0 ; Zeile und Spalte setzen ld d,0 ld hl,Line ; Zeile laden ld b,LINLEN ; Laenge setzen ; DeChar: push bc ld bc,COMRAM call XBIOS ; Zeichen ermitteln dw SCR_RUN pop bc jr nz,Skip ; Zeichen sollte bekannt sein ld (hl),a ; Zeichen speichern inc hl Skip: inc d ; Naechstes Zeichen djnz DeChar ; ld (hl),eot ; Zeile abschliessen ld de,Line ; Zeile laden call String ; Und ausgeben ; jp OS ; ; Ausgabe einer Meldung ^DE ; String: push bc push de push hl ld c,.string call BDOS ; Ausgabe pop hl pop de pop bc ret ; ; ################# ROUTINE IN COMMON MEMORY ################# ; Comstrt equ $ .phase COMRAM ; ; Kombination der beiden Routinen ; push de push hl call MatrixAdr ; Zeichenmatrix holen call ASCIIWert ; ASCII-Wert ermitteln pop hl pop de ret ; ; Routine 1: Ermitteln der Adresse eines Zeichens ; EIN Register E haelt die Zeile (0..31) ; Register D haelt die Spalte (0..89) ; AUS Matrixpuffer ist gefuellt mit dem Zeichen ; MatrixAdr: ld h,0 ld l,d ; HL=Spalte add hl,hl add hl,hl add hl,hl ; HL=Spalte*8 ld c,l ld b,h ; BC=Spalte*8 ld h,0 ld l,e ; HL=Zeile add hl,hl add hl,hl add hl,hl add hl,hl ; Zeile = Zeile * 16 ex de,hl ld iy,ROLLER ; Rolleradresse=$B600+Zeile add iy,de ; In IY ld l,(iy+0) ld h,(iy+1) ; Inhalt der Rolleradr. in HL add hl,hl ; ... * 2 add hl,bc ; Position des Zeichens ld de,MatBuff ld bc,CHRLEN ldir ; Matrix umkopieren ret ; ; Routine 2: Ermitteln des ASCII-Wertes einer Zeichenmatrix ; AUS Akku haelt den ASCII-Wert ; Z Flag gesetzt, wenn Zeichen gefunden ist ; Register H haelt im Erfolgsfall den Status: ; 0: Normal ; 1: Invers ; 2: Untersrichen ; 3: Untersrichen und invers ; ASCIIWert: ld ix,MatBuff ; Zeiger auf Matrix ld h,-1 ; Status setzen ; ; I) Normales Zeichen ermitteln ; ld e,000h ld l,000h call FindChar ; Zeichen finden ret z ; Ok ; ; II) Inverses Zeichen ermitteln ; dec e ; E jetzt 0xFFh call FindChar ret z ; ; III) Unterstrichenes Zeichen ermitteln ; inc e ; E jetzt 0x00h dec l ; L jetzt 0xFFh call FindChar ret z ; ; IV) Unterstrichenes inverses Zeichen ermitteln ; dec e ; E jetzt 0xFFh call FindChar ret z ; ; Kein Zeichen gefunden ; ld a,0 ret ; ; Zeichen finden ; EIN Register IX zeigt auf Zeichenmatrix ; Register E ind L halten Bitmasken ; AUS Akku haelt den ASCII-Wert ; Z Flag gesetzt, wenn Zeichen gefunden ist ; FindChar: inc h ; Status erhoehen ld iy,CHARMAT+8*' ' ld d,' ' ; Start mit Leerzeichen FindLoop: ld a,(iy+0) ; Matrix holen xor e ; Wenn 0xFFh dann invers cp (ix+0) ; Vergleich mit Zeichen jr nz,NotFound ld a,(iy+1) ; Fuer acht Zeilen xor e cp (ix+1) jr nz,NotFound ld a,(iy+2) xor e cp (ix+2) jr nz,NotFound ld a,(iy+3) xor e cp (ix+3) jr nz,NotFound ld a,(iy+4) xor e cp (ix+4) jr nz,NotFound ld a,(iy+5) xor e cp (ix+5) jr nz,NotFound ld a,(iy+6) xor e cp (ix+6) jr nz,NotFound ld a,(iy+7) ; Letzte Zeile gesondert or l ; Wegen Unterstrich xor e cp (ix+7) ld a,d ret z ; Das war's NotFound: inc d ; Naechstes Zeichen ld a,'~'+1 cp d ; Test ob letztes jr z,NichtGefunden ld bc,CHRLEN add iy,bc ; Matrix neu jr FindLoop NichtGefunden: xor a dec a ; NZ Flag setzen ret ; MatBuff: ds CHRLEN ; XBIOS: jp $-$ ; .dephase Comlen equ $-Comstrt ; ; ############################################################ ; TestMessage: db esc,'H' ; Bildschirm loeschen db esc,'E' ; db 'Dies ' ; 1: Normal ; db esc,'p' db 'ist' ; 2: Invers db esc,'q' ; db ' ' db esc,'r' db 'ein' ; 3: Unterstrichen db esc,'u' ; db ' ',0a4h,' ' ; Copyright db esc,'p',esc,'r' db 'Test' ; 4: Unterstrichen und invers db esc,'u',esc,'q' ; db cr,lf,lf,lf db 'Ergebnis:' db cr,lf,lf,lf,eot Line: ds LINLEN+1 ds 2*32 LocStk equ $ end