From f4949b5d07095f69f81644713089bb670046d9e4 Mon Sep 17 00:00:00 2001 From: Oliver Lehmann Date: Wed, 21 Mar 2007 14:48:41 +0000 Subject: [PATCH] new stuff --- firmware/TERMINAL/p8t.4.esc.s | 665 +++++++++++++++++++++++++ firmware/TERMINAL/p8t.4.init.s | 502 +++++++++++++++++++ firmware/TERMINAL/p8t.4.main.s | 886 +++++++++++++++++++++++++++++++++ 3 files changed, 2053 insertions(+) create mode 100644 firmware/TERMINAL/p8t.4.esc.s create mode 100644 firmware/TERMINAL/p8t.4.init.s create mode 100644 firmware/TERMINAL/p8t.4.main.s diff --git a/firmware/TERMINAL/p8t.4.esc.s b/firmware/TERMINAL/p8t.4.esc.s new file mode 100644 index 0000000..b281e43 --- /dev/null +++ b/firmware/TERMINAL/p8t.4.esc.s @@ -0,0 +1,665 @@ + !******************************************************* + * * + * T E R M I N A L * + * * + * mit Einchip-Mikrorechner U 882 und CRTC 8275 * + * ============================================ * + * * + * ESCAPE_SEQUENZ Module; Version 3.1: * + * - 24 Zeilen / 80 Zeichen * + * Inhalt: * + * - Auswertung der Escape-Sequenzen * + * * + ******************************************************** + + Bearbeiter: Heller/Kuehle / WAT/WAE + Stand: 26.01.88 + + Name: P8T.ESCAPE ! + + + +ESCAPE_SEQUENZ MODULE + + +CONSTANT + +! 'Z8T.VEREINBARUNGEN' ! +PARA :=254 +$LISTOFF + +! Werte ! +P01EXT := %96 ! P0:=A8...A14, P1:=AD0...AD7, Stack intern ! +P01TRI := %9E ! tri state: P0,P1,AS,DS,R/W ! + +! Bit Definitionen ! +B0 := %1 ! bit 0 ! +B1 := %2 ! bit 1 ! +B2 := %4 ! bit 2 ! +B3 := %8 ! bit 3 ! +B4 := %10 ! bit 4 ! +B5 := %20 ! bit 5 ! +B6 := %40 ! bit 6 ! +B7 := %80 ! bit 7 ! +NB0 := %FE ! negiertes bit 0 ! +NB1 := %FD ! negiertes bit 1 ! +NB2 := %FB ! negiertes bit 2 ! +NB3 := %F7 ! negiertes bit 3 ! +NB4 := %EF ! negiertes bit 4 ! +NB5 := %DF ! negiertes bit 5 ! +NB6 := %BF ! negiertes bit 6 ! +NB7 := %7F ! negiertes bit 7 ! + +! Bildparameter ! +ZEILENZAHL := 24 +ZEICHENZAHL := 80 + +! Adressen ! +BRAM := %1000 ! Bildwiederholspeicher ! +ZADR_TAB := %1780 ! Tabelle der Zeilenanfangsadr. ! +CRT_PAR := %1C00 ! Parameter lesen / schreiben ! +CRT_COM := %1C01 ! Commands schreiben ! +CRTL_STAT := %1C01 ! Status lesen ! +ZG0 := %4000 ! ADM31-ASCII-Zeichensatz ! +ZG1 := %2000 ! Alternativ-Zeichensatz ! +BELL_ADR := %8000 ! Signalton ! + +! Display Commands ! +RES_DISPL := %00 +START_DISPL := %20 +STOP_DISPL := %40 +READ_LPEN := %60 +LD_CURSOR := %80 +ENABLE_INT := %A0 +DISABLE_INT := %C0 +PRES_COUNT := %E0 + +! Parameter fuer Display-Reset-Command ! +RES1 := %4F ! 80 characters/row ! +RES2 := %97 ! ! +RES3 := %0B ! ! +RES4 := %6C ! ! + +! Field Attribute Code ! +FAC := %80 ! Field Attribute: Normal Mode ! +FACH := %01 ! Highlight ! +FACB := %02 ! Blink ! +FACR := %10 ! Reverse video ! +FACU := %20 ! Underline ! + +! ASCII Control Characters entsprechend ADM 31 ! +NUL := %00 ! Null ^@ ! +SOH := %01 ! Start of Heading ^A ! +STX := %02 ! Start of Text ^B ! +ETX := %03 ! End of Text ^C ! +EOT := %04 ! End of Transmission ^D ! +ENQ := %05 ! Inquiry (who are you) ^E ! +ACK := %06 ! Acknewledge ^F ! +BEL := %07 ! Bell ^G ! +BS := %08 ! Backspace ^H ! +HT := %09 ! Horizontal Tabulator ^I ! +LF := %0A ! Line Feed ^J ! +VT := %0B ! Vertical Tabulator ^K ! +FF := %0C ! Forspace ^L ! +CR := %0D ! Carriage Return ^M ! +SO := %0E ! Shift out ^N ! +SI := %0F ! Shift in ^O ! + +DLE := %10 ! Data Link Escape ^P ! +DC1 := %11 ! Device Control ^Q ! +DC2 := %12 ! ^R ! +DC3 := %13 ! ^S ! +DC4 := %14 ! ^T ! +NAK := %15 ! Not Acknewl. ^U ! +SYN := %16 ! Synchronous Idle ^V ! +ETB := %17 ! End of Trans.-Block ^W ! +CAN := %18 ! Cancel ^X ! +EM := %19 ! End of Medium ^Y ! +SBS := %1A ! Substitute ^Z ! +ESC := %1B ! Escape Sequenz ^[ ! +FS := %1C ! File Separator ! +GS := %1D ! Group Separator ^] ! +RS := %1E ! Cursor HOME ^^ ! +US := %1F ! New Line ^~ ! +$LISTON +$PAGE +EXTERNAL + PUTA PROCEDURE + SIO_OUT PROCEDURE + WRITE_CHAR PROCEDURE + READ_CHAR PROCEDURE + CHAR_ADRESSE PROCEDURE + BRAM_ADR PROCEDURE + LOAD_CURSOR PROCEDURE + CLEAR_SCREEN PROCEDURE + CLEAR_LINE PROCEDURE + ROLL_DOWN PROCEDURE + CLEAR_L LABEL + ROLL_U2 LABEL + ROLL_U3 LABEL + TAB LABEL + BACK_TAB LABEL + CH_del LABEL + CH_ins LABEL + + P0, P1, P2, P3, STAT0, STAT1, STAT2 BYTE + CHAR_ADR WORD + SPALTZ, ZEILZ, CHAR, ESCH0 BYTE + + +GLOBAL + CLEAR_SC PAGE_ERASE LINE_ERASE LABEL + ESC_AUS2 LABEL + +$SECTION SEC3 PROGRAM + + + +ESC_SEQUENZ PROCEDURE + !******************************************************* + * + * Auswertung der ESC_Sequenzen + * + *******************************************************! +ENTRY + + TCM STAT1,#B5 ! Cursor-Steuerung ! + JP Z,CURSOR_CONTROL + TCM STAT1,#B7 ! Video-Atribute ! + JP Z,VIDEO_CONTROL + CP CHAR,#'=' + JR Z,CURSOR_FLAG + CP CHAR,#'G' + JR Z,VIDEO_FLAG + + and STAT1,#NB4 ! ESC-Flag ruecksetzen ! + CP CHAR,#':' + JR Z,CLEAR_SC + CP CHAR,#'*' + JR Z,CLEAR_SC + CP CHAR,#'U' ! set PGM ! + JR Z,SET_PGM + cp CHAR,#'i' ! ESC i = TAB ! + jp z,TAB ! in PUTA ! + cp CHAR,#'I' ! ESC I = Back TAB ! + jp z,BACK_TAB ! in PUTA ! + CP CHAR,#'T' ! line erase? ! + JR Z,LINE_ERASE + CP CHAR,#'Y' ! page erase? ! + JR Z,PAGE_ERASE + CP CHAR,#'R' ! line delete? ! + JR Z,LINE_DELETE + cp CHAR,#'Q' ! char_insert ! + jr z,CHAR_INSERT + cp CHAR,#'W' ! char_delete? ! + jp z,CHAR_DEL + cp CHAR,#'E' ! line_insert? ! + jp z,LINE_INSERT + + AND STAT1,#NB4 ! Escape_Flag ruecksetzen ! + RET + + +CURSOR_FLAG: +! *** Flag setzen *** ! + OR STAT1,#B5 + RET + + +VIDEO_FLAG: +! *** Flag setzen *** ! + OR STAT1,#B7 + RET + + +CLEAR_SC: +! *** Bildschirm loeschen, Cursor unveraendert *** ! + + CALL CLEAR_SCREEN + RET + + +SET_PGM: +! *** set program mode *** ! + OR STAT1,#B3 ! PGM-Flag setzen ! + RET + + +LINE_ERASE: +! *** 'space' in Cursor-Zeile ab Cursor-Pos bis Ende *** ! + ld r8,#HI ZADR_TAB + ld r9,#LO ZADR_TAB + add r9,ZEILZ ! Cursor-Zeile ! + ld r15,SPALTZ + call CLEAR_L ! loeschen ! + RET + + +PAGE_ERASE: +! *** 'space' in Cursor-Zeile ab Curs.-Pos. bis Schirm-Ende ! + call LINE_ERASE ! 'space' ab Cursor bis Zeilen-Ende ! + ! rr8 enthaelt Adr. der Cursor-Zeile ! + ld r7,ZEILZ ! Berechnung der Zahl der Zeilen ! + inc r7 + ld r6,#ZEILENZAHL + sub r6,r7 ! Anzahl ! + jr ULE,PAGE_E0 ! Cursor steht in der letzen Zeile ! + +PAGE_E1: + incw rr8 ! naechste Zeile ! + call CLEAR_LINE ! Zeile loeschen ! + djnz r6,PAGE_E1 + +PAGE_E0: + ret ! Escape-Flag in LINE_ERASE rueckgesetzt ! + + +LINE_DELETE: +! *** Cursor-Zeile loeschen, Cursor an Zeilenanfang *** ! + clr SPALTZ ! Cursor auf Zeilenanfang ! + call LOAD_CURSOR + call LINE_ERASE ! Zeile loeschen, rr8 laden ! + ld r14,#ZEILENZAHL-1 + sub r14,ZEILZ ! zu rollende Zeilen berechnen ! + jr z,LINE_D0 + call ROLL_U3 ! Eintrittspunkt ohne Zeil.-loeschen ! + +LINE_D0: + ret + + + +CHAR_INSERT: +! *** Zeichen unter Cursor nach rechts verschieben *** ! + ld PARA,#1 + call CH_ins + ret + + + +CHAR_DEL: +! *** Cursor-Zeichen loeschen, die anderen nachschieben *** ! + + ld PARA,#1 + call CH_del + ret + + +LINE_INSERT: +! *** Zeile einschieben auf Cursor-Position *** ! + clr SPALTZ ! Cursor auf Zeilenanfang ! + call LOAD_CURSOR + ld r15,ZEILZ + call ROLL_DOWN + ret + + + +END ESC_SEQUENZ +$PAGE +CURSOR_CONTROL PROCEDURE + !******************************************************* + * + * Positionierung des Cursors mittels + * Escape-Seq: 'ESC=YX', Y = row, X = column + * + *******************************************************! +ENTRY + + LD R8,CHAR ! Positionswert lesen (ASCII) ! + SUB R8,#%20 ! Position in Hex ! + JR PL,CUCO0 ! Fehler, wenn negativ ! + LD R8,#0 ! bei Fehler Wert:=0 ! + +CUCO0: + TCM STAT1,#B6 ! Zeile oder Spalte? ! + JR Z,CUCO1 ! Flag=1: Spalte ! + CP R8,#ZEILENZAHL-1 + JR ULT,CUCO2 + LD R8,#ZEILENZAHL-1 + +CUCO2: + LD ZEILZ,R8 ! Zeilenkoordinate eintragen ! + OR STAT1,#B6 ! naechster Wert ist Spaltenkoordinate ! + RET + + +CUCO1: ! Spalte ! + CP R8,#ZEICHENZAHL-1 + JR ULT,CUCO3 + LD R8,#ZEICHENZAHL-1 + +CUCO3: + LD SPALTZ,R8 ! Spaltenkoordinate eintragen ! + AND STAT1,#NB4 LAND NB5 LAND NB6 + CALL LOAD_CURSOR ! Cursor positionieren ! + RET + + +END CURSOR_CONTROL +$PAGE +VIDEO_CONTROL PROCEDURE + !******************************************************* + * + * Setzen und Ruecksetzen der + * Video Attribute Codes + * + *******************************************************! +ENTRY + + tm STAT2,#B4 !Video attribute on/off ?! + jr nz,VIDEO1 !off! + ! Abfrage der Parameter ! + CP CHAR,#'0' + JR Z,ESCG0 + CP CHAR,#'1' + JP Z,ESCG1 + CP CHAR,#'2' + JR Z,ESCG2 + CP CHAR,#'3' + JR Z,ESCG1 + CP CHAR,#'4' + JR Z,ESCG4 + CP CHAR,#'5' + JR Z,ESCG5 + CP CHAR,#'6' + JR Z,ESCG6 + CP CHAR,#'7' + JR Z,ESCG5 + CP CHAR,#'8' + JR Z,ESCG8 + CP CHAR,#'9' + JR Z,ESCG9 + CP CHAR,#'A' + JR Z,ESCGA + CP CHAR,#'B' + JR Z,ESCGB + CP CHAR,#'C' + JR Z,ESCGC + CP CHAR,#'D' + JR Z,ESCGD + CP CHAR,#'E' + JR Z,ESCGE + CP CHAR,#'F' + JR Z,ESCGF + CP CHAR,#'(' + JR Z,ESCG0 + CP CHAR,#')' + JR ESCG8 +VIDEO1: + RET + + + +ESCG0: ! Reset to Standard Video ! + LD CHAR,#FAC + JR VOUT + +ESCG2: ! Blinken ein ! + LD CHAR,#FAC+FACB + JR VOUT + +ESCG4: ! Reverse ein ! + LD CHAR,#FAC+FACR + JR VOUT + +ESCG6: ! Reverse + Blinken ein ! + LD CHAR,#FAC+FACB+FACR + JR VOUT + +ESCG8: ! Highlight aus ! + LD CHAR,#FAC+FACH + JR VOUT + +ESCGA: ! Highlight aus + Reverse ein ! + LD CHAR,#FAC+FACR+FACH + JR VOUT + +ESCGC: ! Unterstrich ein ! + LD CHAR,#FAC+FACU + JR VOUT + +ESCGE: ! Unterstrich ein + Highlight aus ! + LD CHAR,#FAC+FACU+FACH + JR VOUT + +VOUT: + AND STAT1,#NB4 LAND NB7 ! ESC- und Video-Flag ruecksetzen ! + CALL PUTA ! Ausgabe Video Attribut ! + RET + + +! *** Blank Routinen *** ! + +ESCG1: ! G1, G3 (blank area) ! + LD CHAR,#%20 ! Space ! + JR VOUTB + +ESCG5: ! G5, G7 (blank + reverse) ! + LD CHAR,#FAC+FACR + JR VOUTB + +ESCG9: ! blank + highlight aus ! + LD CHAR,#FAC+FACH + JR VOUTB + +ESCGB: ! blank + reverse + highlight (aus) ! + LD CHAR,#FAC+FACR+FACH + JR VOUTB + +ESCGD: ! blank + underline ! + LD CHAR,#FAC+FACU + JR VOUTB + +ESCGF: ! blank + underline + highlight (aus) ! + LD CHAR,#FAC+FACU+FACH + JR VOUTB + +VOUTB: + AND STAT1,#NB4 LAND NB7 + CALL PUTA + CALL BLANK_AREA ! Feld loeschen ! + RET + + + + +END VIDEO_CONTROL + + +BLANK_AREA PROCEDURE + !******************************************************* + * + * Loeschen eines bezeichneten Feldes + * in einer Zeile (kein Rollen) + * Input: CHAR_ADR, SPALTZ + * + *******************************************************! +ENTRY + + LD R8,CHAR_ADR + LD R9,CHAR_ADR+1 + LD R10,#%20 ! Space ! + LD R12,SPALTZ + OR STAT0,#B1 ! MCU-Zugriff ! + +BLANK0: + TCM STAT0,#B0 ! DMA aktiv?, wenn ja warten ! + JR Z,BLANK0 + + INCW RR8 + LDE R11,@RR8 ! lesen ! + TCM R11,#B7 ! Video Control Char ? ! + JR Z,BLANK1 + + LDE @RR8,R10 ! Blank ausgeben ! + INC R12 ! Naechste Spalte ! + CP R12,#ZEICHENZAHL + JR NZ,BLANK0 + LD R10,#FAC ! Reset to standard Video ! + LDE @RR8,R10 + +BLANK1: + AND STAT0,#NB1 ! MCU-Zugriff beendet ! + RET +END BLANK_AREA + + + +ESC_OUT_SEQ PROCEDURE + !******************************************************* + * + * Ausgabe der Escape_Sequenzen entspr. Funktionstaste + * Es werden 1...3 Zeichen gesendet: + * + *******************************************************! +ENTRY + + ! Ueberpruefung auf richtige Werte ! + TCM CHAR,#%80 ! ESC-Folge: CHAR>%80 ! + JP NZ,ESC_OUT0 + CP CHAR,#%80 ! keine Wirkung ! + JR Z,ESC_OUT0 + !------------------------------------------------------! + +FKT_TAS: + tm STAT2,#B3 !VT100/ADM31 ?! + jp z,FKT_VT100 + ! Auswertung der Tasten-Codes ADM31 ! +! Cursor Movement Tasten ! + ld ESCH0,#FF !Forspace! + cp CHAR,#%86 + jp z,FKT_AUS + ld ESCH0,#BS !Backspace! + cp CHAR,#%88 + jp z,FKT_AUS + ld ESCH0,#LF !Linefeed! + cp CHAR,#%8A + jr z,FKT_AUS + ld ESCH0,#VT !Verticaltab! + cp CHAR,#%8B + jr z,FKT_AUS + ld ESCH0,#RS !Cursor home! + cp CHAR,#%8C + jr z,FKT_AUS + ld ESCH0,#BS + cp CHAR,#%9D + jr z,FKT_AUS + ld ESCH0,#%09 + cp CHAR,#%89 + jr z,FKT_AUS +! Funktionstasten ! + LD ESCH0,#'W' ! char delete ! + CP CHAR,#%8F + JR Z,ESC_SEQ_AUS + LD ESCH0,#'Q' ! char insert ! + CP CHAR,#%85 + JR Z,ESC_SEQ_AUS + LD ESCH0,#'R' ! line delete ! + CP CHAR,#%84 + JR Z,ESC_SEQ_AUS + LD ESCH0,#'E' ! line insert ! + CP CHAR,#%81 + JR Z,ESC_SEQ_AUS + LD ESCH0,#'Y' ! page erase ! + CP CHAR,#%83 + JR Z,ESC_SEQ_AUS + ld ESCH0,#'T' + cp CHAR,#%82 + jr z,ESC_SEQ_AUS + ld ESCH0,#'I' ! BACK_TAB ! + cp CHAR,#%87 + jr z,ESC_SEQ_AUS + + !------------------------------------------------------! + +ESC_OUT0: + CLR CHAR + RET + !------------------------------------------------------! + + +ESC_SEQ_AUS: + ! Senden der Escape_Sequenzen ! + LD CHAR,#ESC ! Zeichen senden: ESC ! + call ESC_AUS2 + tm STAT2,#B3 !VT100/ADM31 ?! + jr nz,ESC_AUS3 + ld CHAR,#'[' + call ESC_AUS2 +ESC_AUS3: + LD CHAR,ESCH0 ! Zeichen senden: x ! + call ESC_AUS2 + jr ESC_OUT0 + +! Ausgabe Cursor Movement Tasten ADM31 ! +FKT_AUS: + ld CHAR,ESCH0 + call ESC_AUS2 + jr ESC_OUT0 + +ESC_AUS2: + TCM STAT0,#B3 ! on_line? ! + JR Z,ESC_AUS1 + CALL PUTA ! off_line ! + ret + +ESC_AUS1: + CALL SIO_OUT ! on_line ! + ret + + + +! Auswertung Funktionstasten VT100-Terminal ! +FKT_VT100: +! Cursor Movement Tasten ! + ld ESCH0,#'C' !Cursor right! + cp CHAR,#%86 + jr z,ESC_SEQ_AUS + ld ESCH0,#'D' !Cursor left! + cp CHAR,#%88 + jr z,ESC_SEQ_AUS + ld ESCH0,#'B' !Cursor down! + cp CHAR,#%8A + jr z,ESC_SEQ_AUS + ld ESCH0,#'A' !Cursor up! + cp CHAR,#%8B + jr z,ESC_SEQ_AUS + ld ESCH0,#'H' !Cursor home! + cp CHAR,#%8C + jr z,ESC_SEQ_AUS + ld ESCH0,#BS + cp CHAR,#%9D + jr z,FKT_AUS +! Funktionstasten ! + ld ESCH0,#'P' !Delete character! + cp CHAR,#%8F + jr z,ESC_SEQ_AUS + ld ESCH0,#'@' !Insert character! + cp CHAR,#%85 + jr z,ESC_SEQ_AUS + ld ESCH0,#'M' !Delete line! + cp CHAR,#%84 + jr z,ESC_SEQ_AUS + ld ESCH0,#'L' !Insert line! + cp CHAR,#%81 + jr z,ESC_SEQ_AUS + ld ESCH0,#'J' !Erasing from cursor to end of screen! + cp CHAR,#%83 + jp z,ESC_SEQ_AUS + ld ESCH0,#'K' + cp CHAR,#%82 + jp z,ESC_SEQ_AUS + ld ESCH0,#'Z' !Cursor backward tab! + cp CHAR,#%87 + jp z,ESC_SEQ_AUS + ld ESCH0,#'I' + cp CHAR,#%89 + jp z,ESC_SEQ_AUS + jp ESC_OUT0 + +END ESC_OUT_SEQ + + + +END ESCAPE_SEQUENZ diff --git a/firmware/TERMINAL/p8t.4.init.s b/firmware/TERMINAL/p8t.4.init.s new file mode 100644 index 0000000..338bf27 --- /dev/null +++ b/firmware/TERMINAL/p8t.4.init.s @@ -0,0 +1,502 @@ + !******************************************************* + * * + * T E R M I N A L * + * * + * mit Einchip-Mikrorechner U 882 und CRTC 8275 * + * ============================================ * + * * + * INIT Module; Version 4.2: * + * - 24 Zeilen / 80 Zeichen * + * Inhalt: * + * - Initialisierung Rechner, Bildspeicher, CRTC * + * - Interrupt-Service-Routinen * + * * + ******************************************************** + + Bearbeiter: Heller/Kuehle / WAT/WAE + Stand: 29.09.88 + + Name: P8T.INIT ! + + +INIT MODULE + + +CONSTANT + +! 'P8T.VEREINBARUNGEN' ! + +! Werte ! +P01EXT := %96 ! P0:=A8...A14, P1:=AD0...AD7, Stack intern ! +P01TRI := %9E ! tri state: P0,P1,AS,DS,R/W ! +SBUFL := 45 ! SIO-Puffer-Laenge ! +ZDMA := 26 ! DMA ausschalten: 26*1.08=28 mys ! +ZVSY := 160 ! VSYN: 192*1.08=172.8 mys ! + +! Bit Definitionen ! +B0 := %1 ! bit 0 ! +B1 := %2 ! bit 1 ! +B2 := %4 ! bit 2 ! +B3 := %8 ! bit 3 ! +B4 := %10 ! bit 4 ! +B5 := %20 ! bit 5 ! +B6 := %40 ! bit 6 ! +B7 := %80 ! bit 7 ! +NB0 := %FE ! negiertes bit 0 ! +NB1 := %FD ! negiertes bit 1 ! +NB2 := %FB ! negiertes bit 2 ! +NB3 := %F7 ! negiertes bit 3 ! +NB4 := %EF ! negiertes bit 4 ! +NB5 := %DF ! negiertes bit 5 ! +NB6 := %BF ! negiertes bit 6 ! +NB7 := %7F ! negiertes bit 7 ! + +! Bildparameter ! +ZEILENZAHL := 24 +ZEICHENZAHL := 80 + +! Adressen ! +BRAM := %1000 ! Bildwiederholspeicher ! +ZADR_TAB := %1780 ! Tabelle der Zeilenanfangsadr. ! +CRT_PAR := %1C00 ! Parameter lesen / schreiben ! +CRT_COM := %1C01 ! Commands schreiben ! +CRTL_STAT := %1C01 ! Status lesen ! + +! spezielle Ausgabeadressen (nur High-Teil) ! +ZG0 := %40 ! ADM31-ASCII-Zeichensatz ! +ZG1 := %20 ! Alternativ-Zeichensatz ! +BELL_ADR := %80 ! Signalton ! +TRES := %C0 ! Schieberegister ruecksetzen ! + +! Display Commands ! +RES_DISPL := %00 +START_DISPL := %20 +STOP_DISPL := %40 +READ_LPEN := %60 +LD_CURSOR := %80 +ENABLE_INT := %A0 +DISABLE_INT := %C0 +PRES_COUNT := %E0 +$PAGE +! Parameter fuer Display-Reset-Command ! +RES1 := %4F ! 80 characters/row ! +RES2 := %97 ! ! +RES3 := %CC ! 13. Linie Unterstrich, 13 Linien ! +RES4 := %6A ! visible video control ! + !ruhender Cursor-Block! +RES5 := %4A !volles Feld blinkend! +RES6 := %7A !Unterstrich! +RES7 := %6C !changed for 4! + +! Field Attribute Code ! +FAC := %80 ! Field Attribute: Normal Mode ! +FACH := %01 ! Highlight ! +FACB := %02 ! Blink ! +FACR := %10 ! Reverse video ! +FACU := %20 ! Underline ! + +! ASCII Control Characters entsprechend ADM 31 ! +NUL := %00 ! Null ^@ ! +SOH := %01 ! Start of Heading ^A ! +STX := %02 ! Start of Text ^B ! +ETX := %03 ! End of Text ^C ! +EOT := %04 ! End of Transmission ^D ! +ENQ := %05 ! Inquiry (who are you) ^E ! +ACK := %06 ! Acknewledge ^F ! +BEL := %07 ! Bell ^G ! +BS := %08 ! Backspace ^H ! +HT := %09 ! Horizontal Tabulator ^I ! +LF := %0A ! Line Feed ^J ! +VT := %0B ! Vertical Tabulator ^K ! +FF := %0C ! Forspace ^L ! +CR := %0D ! Carriage Return ^M ! +SO := %0E ! Shift out ^N ! +SI := %0F ! Shift in ^O ! + +DLE := %10 ! Data Link Escape ^P ! +DC1 := %11 ! Device Control ^Q ! +DC2 := %12 ! ^R ! +DC3 := %13 ! ^S ! +DC4 := %14 ! ^T ! +NAK := %15 ! Not Acknewl. ^U ! +SYN := %16 ! Synchronous Idle ^V ! +ETB := %17 ! End of Trans.-Block ^W ! +CAN := %18 ! Cancel ^X ! +EM := %19 ! End of Medium ^Y ! +SBS := %1A ! Substitute ^Z ! +ESC := %1B ! Escape Sequenz ^[ ! +FS := %1C ! File Separator ! +GS := %1D ! Group Separator ^] ! +RS := %1E ! Cursor HOME ^^ ! +US := %1F ! New Line ^~ ! +DEL := %7F ! Delete ! +$PAGE +EXTERNAL + MAIN PROCEDURE + SIO_OUT PROCEDURE + + +GLOBAL +$SECTION SECR REGISTER + +$REL 0 + ! Ports, Status- und Hilfsregister: Reg.-Grp. 0 ! + P0, P1, P2, P3, STAT0, STAT1, STAT2, BDR BYTE + CHAR_ADR WORD + SPALTZ, ZEILZ, CHAR, STAT3 BYTE + +$REL %20 + ! Tastatureingabe ! +VBYTE, ZBYTE BYTE + +$REL %2C + ! Hilfregister fuer Escape_Sequenzen ! + LPOS_ADR WORD + ESCH0 BYTE + +$REL %30 + ! SIO-Input-Puffer: Reg.-Grp. 3, 4, 5 ! + SINPTR, SOUTPTR, SCOUNT BYTE + SWERT ARRAY [SBUFL BYTE] + + + +$SECTION SEC0 PROGRAM +$REL 0 + +INTERRUPT ARRAY [6 WORD] := [IRP32 IRP33 IRP31 IRP30 IRT0 IRT1] +$PAGE +JP_MESSAGE PROCEDURE +ENTRY + + jr INITIAL + +END JP_MESSAGE + +! Message: Copyright Name Version Datum ! +MESSAGE array [* byte] := '(C) ZFT/KEAW 4.2 Jan88' + + +INITIAL PROCEDURE + !******************************************************* + * + * Initialisierung : + * Ports, Register, SIO, Tastatur, CRTC + * + *******************************************************! +ENTRY + + + ! Ports ! + LD P01M,#P01EXT + LD P2M,#%FF ! P20...P27 Input ! + LD P3,#%2F ! Anfangszustand, P35=1 ! + LD P3M,#%51 ! DM aktiv ! + + ! Timer T0 ! + LD PRE0,#%0D ! PRE0:=3, modulo n, int. Clock ! + + ! Timer T1 ! + LD PRE1,#%06 ! PRE1:=1, single pass, int. Clock ! + ld T1,#ZDMA ! Zeitkonstante fuer DMA-Dauer ! + + ! Register ! + LD SPL,#%80 ! init Stackpointer ! + LD SPH,#%00 + CLR IRQ ! no Int.request ! + + ! Register loeschen ! + SRP #%00 + CLR R4 + LD R5,#6 + +REG0: + LD @5,4 + INC 5 + CP 5,#%80 + JR NZ,REG0 + CLR R5 + +! Zeilenadressen-Tabelle laden ! + srp #%10 + ld r0,#HI ZADR_TAB + ld r1,#LO ZADR_TAB + ld r2,#HI BRAM + ld r3,#LO BRAM + ld r5,#ZEILENZAHL + +ZADR1: + ld r6,r2 + and r6,#%0F ! BRAM_ADR codieren ! + or r6,r3 ! r6 enthaelt codierte ADR ! + lde @rr0,r6 ! codierte ADR in Tabelle ! + incw rr0 + add r3,#ZEICHENZAHL ! naechste Adr. in rr2 ! + jr nc,ZADR0 ! Uebertrag? ! + inc r2 + +ZADR0: + djnz r5,ZADR1 ! Schleifenzaehler ! + + ! SIO Vorbereiten ! + LD SINPTR,#SWERT ! Input-Pointer laden ! + LD SOUTPTR,#SWERT ! Output-Pointer laden ! + LD BDR,#%02 ! Baudratenregister laden, 9600 Baud ! + LD T0,BDR ! Baudrate in T0 ! + OR TMR,#%03 ! T0 laden und starten ! + ! Scheinausgabe SIO in MAIN1 ! + or STAT0,#B3 ! on_line ein ! + or STAT2,#B3 !ADM31-Mode! + + ! IBM (XT) Tastatur und Zeichengenerator vorbereiten ! + SRP #%20 + ld r2,#%04 + ld r3,#%84 + LD R4,#ZG0 ! nur High-Adr interessant ! + LDC @RR4,R5 ! Scheinausgabe zum Einschalten ZG0 ! + ld r4,#TRES + ldc @rr4,r5 ! Schieberegister ruecksetzen ! + + ! Vorbereitung Zeilenrefresh ! + LD CHAR_ADR,#HI BRAM + SRP #%10 + ld r0,#HI ZADR_TAB + ld r1,#LO ZADR_TAB + LD R5,#ZEILENZAHL + + ! CRTC initialisieren ! + CALL RESET_DISPLAY + JP MAIN + + +END INITIAL +$PAGE +IRP31 PROCEDURE + !******************************************************* + * + * Zeilenrefresh im Tristate-Zustand + * Input: rr0, aktuelle Tabellen-Adresse + * Output: rr2, aktuelle BRAM-ADR + * + *******************************************************! +ENTRY + + PUSH RP + SRP #%10 + lde r2,@rr0 ! codierte BRAM_Adr.in r2 ! + ld r3,#%F0 ! Adr. decodieren zu BRAM_ADR ! + and r3,r2 + and r2,#%0F + or r2,#%10 ! BRAM_ADR in rr2 ! + inc r1 ! rr0 zeigt auf die naechste ZADR ! + lde r4,@rr2 ! Zeilen-Start-Adr. in DMA-Zaehler laden ! + djnz r5,UL2 + ld r5,#ZEILENZAHL + ld r1,#LO ZADR_TAB + +UL2: + OR STAT0,#B0 ! STAT0_0:=1 ! + LD P01M,#P01TRI ! Tristate ein ! + LD IMR,#%20 ! Int. T1 freigeben ! + OR TMR,#%0C ! laden und starten ! + AND P3,#NB5 ! P35 := 0, DMA ein ! + TCM STAT0,#B1 ! MCU-Zugriff aktiv? ! + JR NZ,UL4 + EI ! T1-Int freigeben ! +UL5: + TCM STAT0,#B0 ! DMA noch aktiv ! + JR Z,UL5 + +UL4: + POP RP + IRET + +END IRP31 + + + +IRT1 PROCEDURE + !******************************************************* + * + * DMA-Zugriff ausschalten + * + *******************************************************! +ENTRY + + OR P3,#B5 ! P35:=1, DMA aus ! + LD P01M,#P01EXT ! Ports normal ! + AND STAT0,#NB0 ! STAT0_0:=0 ! + AND IRQ,#NB2 ! 2. Int-Req. von P31 loeschen ! + LD IMR,#%0F ! IRP31, IRP32, IRP33, IRP30 freigeben ! + LD T1,#ZDMA ! Zeitdauer des DMA ! + AND P3,#NB6 ! P36:=0, VSYN:=0 ! + IRET + + +END IRT1 +$PAGE +IRP32 PROCEDURE + !******************************************************* + * + * Bildruecklauf einleiten + * Laenge des VSYN-Signals durch T1 festlegen + * + *******************************************************! +ENTRY + + OR P3,#B6 ! P36:=1, VSYN:=1 ! + ld T1,#ZVSY ! Zeitdauer VSYN ! + LD IMR,#%2A ! IRT1, IRP33, IRP30 freigeben ! + OR TMR,#%0C ! laden und starten ! + IRET + + +END IRP32 + + + +IR_REST PROCEDURE + !******************************************************* + * + * Timer 0 Routine (wird nicht benutzt) + * + *******************************************************! +ENTRY + +IRT0: + IRET + + +END IR_REST + + + +IRP33 PROCEDURE + !******************************************************* + * + * Tastatur-Eingabe-Routine (P33-Int.) + * IBM (XT) Tastatur + * - Tastatur-Flags: + * - STAT0_4 = 1 nach Uebernahme des Zeichenbytes + * - STAT0_5 = 1 nach Uebernahme des Vorbytes E0 + * + *******************************************************! +ENTRY + + tcm STAT0,#B4 + jr z,TINT0 + push rp + srp #%20 + tcm STAT0,#B5 + jr z,TINT1 + tcm P2,#%E0 + jr nz,TINT0 + ld r0,P2 + or STAT0,#B5 + jr TINT0 +TINT1: + ld r1,P2 !Lesen von Port 2! + or STAT0,#B4 +TINT0: + ld r4,#TRES + +TINTW: + tcm STAT0,#B0 ! DMA aktiv?, wenn ja, warten ! + jr z,TINTW + ldc @rr4,r5 ! Schieberegister ruecksetzen ! + pop rp + IRET + + +END IRP33 +$PAGE +IRP30 PROCEDURE + !******************************************************* + * + * Serielle Eingabe-Routine + * Zeichen werden im SPUFFER abgelegt + * + *******************************************************! +ENTRY + + TCM STAT0,#B7 ! Fehlerbit gesetzt? ! + JR Z,SINT1 + CP SIO,#NUL ! gelesenes Zeichen=00? ! + JR Z,SINT1 ! Zeichen 00 ignorieren ! + cp SIO,#DEL ! gelesenes Zeichen=7F? ! + jr z,SINT1 ! DEL ignorieren ! + + LD @SINPTR,SIO ! SIO lesen ! + and @SINPTR,#NB7 ! bit 7 ausblenden ! + OR STAT0,#B6 ! Zeichenbit setzen ! + INC SINPTR ! Pointer erhoehen ! + inc SCOUNT ! Counter erhoehen ! + cp SCOUNT,#SBUFL-9 + jr lt,SINT2 ! Sprung, wenn r2 kleiner ! + tcm STAT1,#B2 ! CRTL_S bereits gesendet? ! + jr z,SINT3 ! wenn ja, Sprung ! + or STAT1,#B2 ! CTRL_S-Flag setzen ! + push CHAR + ld CHAR,#DC3 ! CTRL_S ! + call SIO_OUT + pop CHAR + +SINT3: + cp SCOUNT,#SBUFL ! Puffer Ende erreicht? ! + jr nz,SINT2 + or STAT0,#B7 ! Fehler-Flag setzen ! + +SINT2: + CP SINPTR,#SWERT+SBUFL ! Endwert ueberschritten? ! + JR NZ,SINT1 + LD SINPTR,#SWERT ! Inpointer ruecksetzen ! + +SINT1: + IRET + + +END IRP30 + + +RESET_DISPLAY PROCEDURE + !******************************************************* + * + * Ruecksetzen und Initialisierung des 8275 + * Ruecksetzen der internen Zaehler des CRTC + * + *******************************************************! +ENTRY + + LD R8,#HI CRT_COM + LD R9,#LO CRT_COM + LD R10,#RES_DISPL + LDE @RR8,R10 ! Ausgabe Command ! + + ! Parameter ausgeben ! + DEC R9 ! CRT_PAR ADR einstellen ! + LD R11,#%4 ! Zaehler ! + LD R12,#HI RES_DISPL_PAR + LD R13,#LO RES_DISPL_PAR + +PARLOOP: + LDC R10,@RR12 ! Parameter holen ! + LDE @RR8,R10 ! Ausgabe Parameter ! + INCW RR12 + DJNZ R11,PARLOOP + + ! Zaehler ruecksetzen ! + LD R10,#PRES_COUNT + inc r9 ! rr8=Command-Addr ! + LDE @RR8,R10 ! Ausgabe Command ! + lde @rr8,r10 ! Wiederholung ! + + RET + + +END RESET_DISPLAY + + +RES_DISPL_PAR ARRAY [4 BYTE] := [RES1 RES2 RES3 RES7] + + +END INIT diff --git a/firmware/TERMINAL/p8t.4.main.s b/firmware/TERMINAL/p8t.4.main.s new file mode 100644 index 0000000..b2b7f73 --- /dev/null +++ b/firmware/TERMINAL/p8t.4.main.s @@ -0,0 +1,886 @@ + !******************************************************* + * * + * T E R M I N A L * + * * + * mit Einchip-Mikrorechner U 882 und CRTC 8275 * + * ============================================ * + * * + * HAUPT Module; Version 5.0: * + * - Anpassung an IBM (XT) Tastatur * + * - 24 Zeilen / 80 Zeichen * + * Inhalt: * + * - MAIN Procedure mit Steuerschleife * + * - UP's: PUTA, TGETCHAR, SGETCHAR, START_DISPLAY * + * SIO_OUT, BREAK * + * * + ******************************************************** + + Bearbeiter: Heller/Kuehle / WAT/WAE + Stand: 20.01.88 + + Name: P8T.MAIN ! + + + +HAUPT MODULE + + +CONSTANT +! 'Z8T.VEREINBARUNGEN' ! +$LISTOFF + +! Werte ! +P01EXT := %96 ! P0:=A8...A14, P1:=AD0...AD7, Stack intern ! +P01TRI := %9E ! tri state: P0,P1,AS,DS,R/W ! +SBUFL := 45 ! SIO-Puffer-Laenge ! + +! Bit Definitionen ! +B0 := %1 ! bit 0 ! +B1 := %2 ! bit 1 ! +B2 := %4 ! bit 2 ! +B3 := %8 ! bit 3 ! +B4 := %10 ! bit 4 ! +B5 := %20 ! bit 5 ! +B6 := %40 ! bit 6 ! +B7 := %80 ! bit 7 ! +NB0 := %FE ! negiertes bit 0 ! +NB1 := %FD ! negiertes bit 1 ! +NB2 := %FB ! negiertes bit 2 ! +NB3 := %F7 ! negiertes bit 3 ! +NB4 := %EF ! negiertes bit 4 ! +NB5 := %DF ! negiertes bit 5 ! +NB6 := %BF ! negiertes bit 6 ! +NB7 := %7F ! negiertes bit 7 ! + +! Bildparameter ! +ZEILENZAHL := 24 +ZEICHENZAHL := 80 + +! Adressen ! +BRAM := %1000 ! Bildwiederholspeicher ! +ZADR_TAB := %1780 ! Tabelle der Zeilenanfangsadr. ! +CRT_PAR := %1C00 !Parameter lesen / schreiben ! +CRT_COM := %1C01 ! Commands schreiben ! +CRTL_STAT := %1C01 ! Status lesen ! +ZG0 := %4000 ! ASCII-Zeichensatz ! +ZG1 := %2000 ! Alternativ-Zeichensatz ! +BELL_ADR := %8000 ! Akustischer Signalgeber ! + +! Display Commands ! +RES_DISPL := %00 +START_DISPL := %20 +STOP_DISPL := %40 +READ_LPEN := %60 +LD_CURSOR := %80 +ENABLE_INT := %A0 +DISABLE_INT := %C0 +PRES_COUNT := %E0 + +! Parameter fuer Display-Reset-Command ! +RES1 := %4F ! 80 characters/row ! +RES2 := %97 ! ! +RES3 := %0B ! ! +RES4 := %6C ! ! + +! Field Attribute Code ! +FAC := %80 ! Field Attribute: Normal Mode ! +FACH := %01 ! Highlight ! +FACB := %02 ! Blink ! +FACR := %10 ! Reverse video ! +FACU := %20 ! Underline ! + +! ASCII Control Characters entsprechend ADM 31 ! +NUL := %00 ! Null ^@ ! +SOH := %01 ! Start of Heading ^A ! +STX := %02 ! Start of Text ^B ! +ETX := %03 ! End of Text ^C ! +EOT := %04 ! End of Transmission ^D ! +ENQ := %05 ! Inquiry (who are you) ^E ! +ACK := %06 ! Acknewledge ^F ! +BEL := %07 ! Bell ^G ! +BS := %08 ! Backspace ^H ! +HT := %09 ! Horizontal Tabulator ^I ! +LF := %0A ! Line Feed ^J ! +VT := %0B ! Vertical Tabulator ^K ! +FF := %0C ! Forspace ^L ! +CR := %0D ! Carriage Return ^M ! +SO := %0E ! Shift out ^N ! +SI := %0F ! Shift in ^O ! + +DLE := %10 ! Data Link Escape ^P ! +DC1 := %11 ! Device Control ^Q ! +DC2 := %12 ! ^R ! +DC3 := %13 ! ^S ! +DC4 := %14 ! ^T ! +NAK := %15 ! Not Acknewl. ^U ! +SYN := %16 ! Synchronous Idle ^V ! +ETB := %17 ! End of Trans.-Block ^W ! +CAN := %18 ! Cancel ^X ! +EM := %19 ! End of Medium ^Y ! +SBS := %1A ! Substitute ^Z ! +ESC := %1B ! Escape Sequenz ^[ ! +FS := %1C ! File Separator ! +GS := %1D ! Group Separator ^] ! +RS := %1E ! Cursor HOME ^^ ! +US := %1F ! New Line ^~ ! +$LISTON + ZESCF :=26 !Zaehler ESC-Folge! + PARA :=254 !Parameter fuer n;row;column! +$PAGE +EXTERNAL + CHAR_ADRESSE PROCEDURE + ADR_DEC PROCEDURE + READ_ADR PROCEDURE + WR_ADR PROCEDURE + WRITE_CHAR PROCEDURE + CURSOR_POS PROCEDURE + LOAD_CURSOR PROCEDURE + ROLL PROCEDURE + CLEAR_LINE PROCEDURE + CLEAR_SCREEN PROCEDURE + ESC_SEQUENZ PROCEDURE + ESC_OUT_SEQ PROCEDURE + BREAK PROCEDURE + ESC_VT100 PROCEDURE + C_left LABEL + C_rigth LABEL + C_ft LABEL + P0, P1, P2, P3, STAT0, STAT1, STAT2 BYTE + CHAR_ADR, LPOS_ADR WORD + SPALTZ, ZEILZ, CHAR, BDR, STAT3 BYTE + VBYTE, ZBYTE BYTE + SINPTR, SOUTPTR, SCOUNT BYTE + SWERT ARRAY [SBUFL BYTE] + + +GLOBAL + LINE_FEED CARRIAGE_RETURN LABEL + TAB LABEL + BACK_TAB LABEL + + + +$SECTION SEC1 PROGRAM + +MAIN PROCEDURE + !******************************************************* + * + * Terminal - Steuerschleife + * Input: Tastatur (TGETCHAR), bzw. SIO + * Output: Bildschirm (PUTA), bzw. SIO + * + *******************************************************! +ENTRY + + CALL CLEAR_SCREEN ! loeschen + FAC am Zeilenende setzen ! + CALL LOAD_CURSOR ! Cursor auf Anfangsposition setzen ! + LD IMR,#%01 ! IRP32 -> VTRC freigeben ! + CALL START_DISPLAY ! CRTC starten ! + EI + LD SIO,#%00 ! Scheinausgabe SIO ! + +! Ausgabe Terminalgenerierung ADM31 oder VT100 umschaltbar ueber F1 + Ausgabe Generierung Video Attribute umschaltbar ueber F2! +TOUT1: + tm STAT0,#B3 !online/offline ?! + jr nz,TOUT2 !online! + and STAT2,#NB5 !set war offline! + jr TOUT3 +TOUT2: + or STAT2,#B5 !set war online! +TOUT3: + and STAT0,#NB3 !set offline! + call CURSOR_HOME + call CLEAR_SCREEN + tm STAT2,#B3 !ADM31/VT100 ?! + jr nz,TOUT4 !ADM31! + ld r6,#HI VT1 + ld r7,#LO VT1 + jr TOUT5 +TOUT4: + ld r6,#HI ADM + ld r7,#LO ADM +TOUT5: + ldc r8,@rr6 + ld CHAR,r8 + cp CHAR,#'=' + jr z,TOUT6 + cp CHAR,#'#' + jr z,TOUT7 + call PUTA + incw rr6 + jr TOUT5 +TOUT6: + tm STAT2,#B4 !Video Attribute on/off ?! + jr nz,TOUT8 !off! + ld r6,#HI VAN + ld r7,#LO VAN + jr TOUT5 +TOUT8: + ld r6,#HI VAF !on! + ld r7,#LO VAF + jr TOUT5 +TOUT7: + tm STAT2,#B5 !war on/off ?! + jr nz,TOUT9 + and STAT0,#NB3 !set offline! + jr MAIN0 +TOUT9: + or STAT0,#B3 !set online! +MAIN0: + TM STAT0,#B4 ! Zeichen im TPUFFER? ! + JR NZ,MAIN1 ! wenn ja, Sprung ! + TM STAT0,#B3 ! on_line? ! + JR Z,MAIN0 ! wenn nein, Warteschleife ! + TM STAT0,#B6 ! Zeichen im SPUFFER? ! + JR Z,MAIN0 ! wenn nein, Warteschleife ! + + ! Input ueber SIO im on_line Mode ! + CALL SGETCHAR ! Zeichen aus SPUFFER in CHAR ! + CALL PUTA ! Auswertung des Zeichens ! + JR MAIN0 ! Warteschleife ! + +MAIN1: + ! Input ueber Tastatur ! + CALL TGETCHAR ! Zeichen aus TPUFFER in CHAR + dabei Tastaturanpassung ! + CP CHAR,#%F0 ! on/off Taste? ! + JR NZ,MAIN10 + + ! Umschaltung on / off ! + CLR CHAR ! neutralen Wert in CHAR ! + TM STAT0,#B3 + JR NZ,OFFLINE + OR STAT0,#B3 ! on_line ein ! + JR MAIN0 +OFFLINE: + AND STAT0,#NB3 ! off_line ein ! + JR MAIN0 + +MAIN10: + CP CHAR,#%F1 ! Break-Taste? ! + JR NZ,MAIN11 + CALL BREAK ! Breakfunktion ausfuehren ! + JR MAIN0 + +! Umschaltung VT100 <---> ADM31 ueber Taste MOD + ********************************************* ! +MAIN11: + cp CHAR,#%90 + jr nz,MAIN14 + tm STAT2,#B3 !VT100/ADM31 ?! + jr nz,ADM31 +! Umschaltung VT100 ---> ADM31 ! + or STAT2,#B3 + jp TOUT1 +! Umschaltung ADM31 ---> VT100 ! +ADM31: + and STAT2,#NB3 + jp TOUT1 + +! Umschaltung Video Attribute on <---> off ueber Taste VIDEO + ********************************************************** ! +MAIN14: + cp CHAR,#%A0 + jr nz,MAIN13 + tm STAT2,#B4 !Video Attribute on/off ?! + jr nz,V_off + or STAT2,#B4 !Video attributes off! + jp TOUT1 +V_off: + and STAT2,#NB4 !Video attributes on! + jp TOUT1 +MAIN13: + TCM CHAR,#B7 ! CHAR_7=1? ! + JR NZ,MAIN12 ! wenn ja, Escape-Sequenz ausgeben ! + CALL ESC_OUT_SEQ + JR MAIN0 + +MAIN12: + ! on_line oder off_line Mode? ! + TM STAT0,#B3 ! on_line? ! + JR NZ,MAIN2 ! wenn ja, SIO_out ! + + ! Output auf Bildschirm im off_line Mode ! + CALL PUTA + JR MAIN0 ! Warteschleife ! + +MAIN2: + ! Output ueber SIO im on_line Mode ! + CALL SIO_OUT + JR MAIN0 ! Warteschleife ! + +END MAIN + + +ADM array [* byte] := 'ADM31/9600 baud/=' +VT1 array [* byte] := 'VT100/9600 baud/=' +VAN array [* byte] := 'Video Attr. on%R%L#' +VAF array [* byte] := 'Video Attr. off%R%L#' +$PAGE + +PUTA PROCEDURE + !******************************************************* + * + * Zeichen in CHAR auswerten + * Cursor setzen, Bildram beschreiben + * + *******************************************************! +ENTRY + + ! Abfrage auf Program Mode (PGM) ! + !------------------------------------------------------! + ! Im PGM werden alle Zeichen direkt ohne interne Verarbeitung + angezeigt. Einschalten mit ESC U, aus mit ESC u bzw. ESC X ! + TCM STAT1,#B3 ! PGM-Flag setzen ! + JR NZ,PUTA1 + CP CHAR,#ESC ! Escape-Zeichen ! + JR NZ,PUTA2 + OR STAT1,#B4 ! Escape_Flag setzen ! + JR PUTA0 + +PUTA2: + TCM STAT1,#B4 ! Escape_Flag gesetzt? ! + jr NZ,PUTA0 + and STAT1,#NB4 ! ESC-Flag ruecksetzen ! + cp CHAR,#'X' ! clear PGM mit ESC X ! + jr z,CLEAR_PGM + cp CHAR,#'u' ! clear PGM mit ESC u ! + jr nz,PUTA0 + +CLEAR_PGM: + and STAT1,#NB3 ! PGM-Flag ruecksetzen ! + jr PUTA0 + !------------------------------------------------------! + +PUTA1: + ! Normal Mode ! + TCM STAT1,#B4 ! Escape-Flag gesetzt ? ! + JP Z,ESC_FLG + + CP CHAR,#%20 ! Control oder sichtbares Zeichen? ! + JR ULT,PUTA_CONTROL + !------------------------------------------------------! + +PUTA0: + ! Behandlung sichtbarer Zeichen ! + CALL CHAR_ADRESSE ! aktuelle Bildramadr. berechnen ! + LD CHAR_ADR,R12 ! Berechnete Adresse ablegen ! + LD CHAR_ADR+1,R13 + CALL CURSOR_POS ! Cursor berechnen und setzen ! + CALL ROLL ! Rollen, falls Rollflag gesetzt ! + LD R8,CHAR_ADR + LD R9,CHAR_ADR+1 + LD R13,CHAR + CALL WRITE_CHAR ! Zeichen in Bildram eintragen ! + RET + !------------------------------------------------------! + +PUTA_CONTROL: + ! Abfrage der CTRL-Zeichen ! + CP CHAR,#CR ! CTRL M ! + JR Z,CARRIAGE_RETURN + CP CHAR,#LF ! CTRL J ! + JR Z,LINE_FEED + CP CHAR,#BS ! CTRL H ! + JR Z,BACK_SPACE + CP CHAR,#VT ! CTRL K ! + JR Z,VERT_TAB + CP CHAR,#FF ! CTRL L ! + JR Z,FOR_SPACE + CP CHAR,#ESC ! CTRL [ ! + JP Z,ESC_SEQ + CP CHAR,#RS ! CTRL ^ ! + JP Z,CURSOR_HOME + cp CHAR,#HT ! CTRL I ! + jr z,TAB + CP CHAR,#BEL ! CTRL G ! + JP Z,BELL + RET + !------------------------------------------------------! + + + ! Bearbeitung der Steuerzeichen ! + +CARRIAGE_RETURN: +! *** Cursor auf linken Rand *** ! + + CLR SPALTZ + CALL LOAD_CURSOR + RET + + +LINE_FEED: +! *** Cursor eine Zeile nach unten *** ! + + INC ZEILZ + CP ZEILZ,#ZEILENZAHL + JR NZ,NEUE_ZEILE + LD ZEILZ,#ZEILENZAHL-1 ! Cursor bleibt nach Rollen + in der letzen Zeile ! + OR STAT0,#B2 ! Rollflag setzen ! + CALL ROLL ! Rollen, falls Rollflag gesetzt ! + +NEUE_ZEILE: + CALL LOAD_CURSOR + RET + + +BACK_SPACE: +! *** Cursor ein Zeichen nach links *** ! + tm STAT2,#B3 !ADM31-/VT100-Terminal ?! + jr nz,BACK_SPACE_ADM31 +! VT100-Terminal ! + ld PARA,#1 + call C_left + ret +! ADM31-Terminal ! +BACK_SPACE_ADM31: + + DEC SPALTZ + +BACK_SPACE1: ! Entry fuer BACK-TAB ! + cp SPALTZ,#ZEICHENZAHL + jr ult,BSP0 + LD SPALTZ,#ZEICHENZAHL-1 + DEC ZEILZ + JR PL,BSP0 + CLR ZEILZ ! Cursor bleibt unveraendert ! + CLR SPALTZ ! in der linken oberen Ecke ! + +BSP0: + CALL LOAD_CURSOR + RET + + + +BACK_TAB: +! *** ESC I: Cursor eine Tab-Pos. zurueck *** ! + dec SPALTZ + and SPALTZ,#%F8 ! Tab-Position ! + jr BACK_SPACE1 + + +TAB: +! *** Cursor auf Tab-Position *** ! + tm STAT2,#B3 !ADM31-/VT100-Terminal ?! + jr nz,TAB_ADM31 +! VT100-Terminal ! + ld PARA,#1 + call C_ft + ret +! ADM31-Terminal ! +TAB_ADM31: + add SPALTZ,#%08 + and SPALTZ,#%F8 ! Tab-Position ! + jr FOR_SPACE1 +$PAGE +VERT_TAB: +! *** Cursor eine Zeile nach oben *** ! + + DEC ZEILZ + JR PL,VT0 + CLR ZEILZ ! Cursor bleibt in der 1.Zeile, + wenn er sie erreicht hat ! +VT0: + CALL LOAD_CURSOR + RET + + +FOR_SPACE: +! *** Cursor ein Zeichen nach rechts *** ! + tm STAT2,#B3 !ADM31-/VT100-Terminal ?! + jr nz,FOR_SPACE_ADM31 +! VT100-Terminal ! + ld PARA,#1 + call C_rigth + ret +! ADM31-Terminal! +FOR_SPACE_ADM31: + + INC SPALTZ + +FOR_SPACE1: ! Entry fuer TAB-Funktion ! + CP SPALTZ,#ZEICHENZAHL + JR ULT,FF0 + CLR SPALTZ + JR LINE_FEED ! ZEILZ erhoehen, rollen ! + +FF0: + CALL LOAD_CURSOR + RET + + +CURSOR_HOME: +! *** Cursor wird auf Pos. 1,1 gesetzt *** ! + + LD ZEILZ,#0 + LD SPALTZ,#0 + CALL LOAD_CURSOR + RET + + +ESC_SEQ: +! *** ESC-Flag setzen *** ! + + OR STAT1,#B4 + clr ZESCF !ZESCF=0! + RET + + +BELL: + ! *** akustisches Signal *** ! + PUSH RP + SRP #%20 + LD R8,#HI BELL_ADR + LD R9,#LO BELL_ADR + LDC @RR8,R9 ! Scheinausgabe zur Impulserzeug. ! + POP RP + RET + +! Behandlung ESC-Folgen + Bit 3 in STAT2: 0 ---> VT100-Terminal + 1 ---> ADM31-Terminal ! +ESC_FLG: + tm STAT2,#B3 + jp nz,ESC_SEQUENZ !ADM31-Terminal! + jp ESC_VT100 !VT100-Terminal! + +END PUTA +$PAGE +TGETCHAR PROCEDURE + !******************************************************* + * + * Spezielle Anpassung an IBM (XT) Tastatur + * Input: ZBYTE Abtastcode + * Output: CHAR ASCII-Zeichen + * + *******************************************************! + +ENTRY + + push rp + srp #%20 + tcm r1,#B7 !Taste mit Vorbyte E1 ?! + jr z,TGET0 + tcm r0,#B0 + jr z,TGET2 + jr TGET3 +TGET0: + ld r6,r1 + clr r1 + tcm r0,#B0 + jr z,TGET3 + ld r1,r6 + sub r1,#B7 + add r3,r1 + jr nc,TGET1 + inc r2 +TGET1: + ldc r1,@rr2 !Wert aus SHIFT_Tab! +! NORMAL-STATUS ! + ld r2,#HI NORMAL_Tab + ld r3,#LO NORMAL_Tab + jr TGET3 +TGET2 + ld r6,r1 + clr r1 + tcm r6,#%40 + jr nz,TGET3 + cp r6,#%7B + jr gt,TGET3 + and r6,#%1F + ld r1,r6 + jr TGET3 +TGET3: + tcm r0,#%08 + jr nz,TGET7 + tcm r0,#%02 + jr nz,TGET3 + cp r1,#%41 + jr lt,TGET3 + cp r1,#%5A + jr gt,TGET3 + add r1,#%20 +TGET3: + ld CHAR,r1 + tcm r0,#%04 + jr nz,TGET5 + tcm STAT1,#%01 + jr z,TGET6 + or STAT1,#%01 + ld r4,#%020 + ld r5,#%00 + ldc @rr4,r5 + jr TGET6 +TGET5: + tcm STAT1,#%01 + jr nz,TGET6 +! Zeichensatz 1 (amerikanisch) ! + and STAT1,#NB0 + ld r4,#HI ZG0 + ld r5,#LO ZG0 + ldc @rr4,r5 +TGET6: + and STAT0,#NB4 land NB5 + pop rp + ret +TGET7: + tm STAT1,#%01 + jr z,TGET3 + tm r0,#%02 + jr z,TGET8 + cp r1,#%7A + jr ule,TGET3 + cp r1,#%7E + jr nc,TGET3 + sub r1,#%20 + jr TGET3 +TGET8: + cp r1,#%5A + jr ule,TGET3 + cp r1,#%5E + jr nc,TGET3 + add r1,#%20 + jr TGET3 +END TGETCHAR + +$PAGE +! +Abtastcode Normal ASCII SHIFT ASCII +Dez/Hex +--------------------------------------------- + + +0 00 + 2B + 2B +1 01 ESC 1B ESC 1B +2 02 1 31 Ausr.Z. 21 +3 03 2 32 " 22 +4 04 3 33 @ Par* 40 +5 05 4 34 $ 24 +6 06 5 35 % 25 +7 07 6 36 & 26 +8 08 7 37 / 2F +9 09 8 38 ( 28 +10 0A 9 39 ) 29 +11 0B 0 30 = 3D +12 0C ~ sz* 7E ? 3F +13 0D ' 27 ` 60 +14 0E DEL 7F DEL 7F +15 0F BTAB 09 BTAB 09 + +16 10 q 71 Q 51 +17 11 w 77 W 57 +18 12 e 65 E 45 +19 13 r 72 R 52 +20 14 t 74 T 54 +21 15 z 7A Z 5A +22 16 u 75 U 55 +23 17 i 69 I 49 +24 18 o 6F O 4F +25 19 p 70 P 50 +26 1A ] ue* 5D } Ue* 7D +27 1B + 2B * 2A +28 1C CR 0D CR 0D +29 1D TAB 82 TAB 82 +30 1E a 61 A 41 +31 1F s 73 S 53 + +32 20 d 64 D 44 +33 21 f 66 F 46 +34 22 g 67 G 47 +35 23 h 68 H 48 +36 24 j 6A J 4A +37 25 k 6B K 4B +38 26 l 6C L 4C +39 27 oe* 5C | Oe* 7C +40 28 [ ae* 5B { Ae* 7B +41 29 BS 08 BS 08 +42 2A SHIFT 80 SHIFT 80 +43 2B # 23 ^ 5E +44 2C y 79 Y 59 +45 2D x 78 X 58 +46 2E c 63 C 43 +47 2F v 76 V 56 + +48 30 b 62 B 42 +49 31 n 6E N 4E +50 32 m 6D M 4D +51 33 , 2C ; 3B +52 34 . 2E : 3A +53 35 - 2D _ 5F +54 36 SHIFT 80 +55 37 * 2A +56 38 CTRL 80 +57 39 SP 20 +58 3A CAPS L. 80 +59 3B SI/S0 F2 +60 3C MOD F3 +61 3D VIDEO F4 +62 3E BREAK F1 +63 3F F1 80 + +64 40 F2 80 +65 41 F3 80 +66 32 F4 80 +67 43 F5 80 +68 44 F6 80 +69 45 CE 08 +70 46 F10 80 +71 47 7 37 +72 48 8 38 +73 49 9 39 +74 4A - 5F +75 4B 4 34 +76 4C 5 35 +77 4D 6 36 +78 4E = 3D +79 4F 1 31 + +80 50 2 32 +81 51 3 33 +82 52 0 30 +83 53 , 2C +84 54 OFF F0 +85 55 80 +86 56 < 3C > 3E +87 57 F7 80 +88 58 F8 80 + +* Zeichengenerator ZG1 (Umlaute) +! +NORMAL_Tab array [85 byte] := + [%00 %00 %81 %F1 %00 %00 %86 %87 %88 %89 %8A %8B %8C %09 %F0 %00 + %00 %00 %00 %00 %00 %00 %00 %00 %00 %00 %00 %1B %00 %9D %0D %00 + %80 %82 %81 %85 %00 %00 %00 %00 %00 %00 %00 %00 %2C %00 %00 %00 + %30 %31 %32 %33 %34 %35 %36 %37 %38 %39 %00 %2E %00 %2D %00 %00 + %83 %80 %84 %00 %00 %00 %00 %00 %00 %00 %00 %00 %00 %8F %08 %80 + %2B %90 %A0 %80 %80] + + +$PAGE +START_DISPLAY PROCEDURE + !******************************************************* + * + * CRTC starten + * + *******************************************************! +ENTRY + + LD R8,#HI CRT_COM + LD R9,#LO CRT_COM + LD R10,#START_DISPL + LDE @RR8,R10 + RET + + +END START_DISPLAY + + + +SGETCHAR PROCEDURE + !******************************************************* + * + * Zeichen wird aus Sio-Puffer gelesen + * und in Zelle CHAR abgelegt + * + *******************************************************! +ENTRY + + dec SCOUNT ! Counter erniedrigen ! + cp SCOUNT,#0 + jr nz,SGET1 ! Sprung wenn Counter > 0 ! + tcm STAT1,#B2 ! Wurde CTRL_S gesendet? ! + jr nz,SGET2 + ld CHAR,#DC1 ! CTRL_Q ! + call SIO_OUT ! CTRL_Q senden ! + and STAT1,#NB2 ! CTRL_S-Flag ruecksetzen ! + +SGET2: + AND STAT0,#NB6 + AND STAT0,#NB7 + +SGET1: + LD CHAR,@SOUTPTR ! Zeichen lesen ! + INC SOUTPTR ! Outpointer erhoehen ! + CP SOUTPTR,#SWERT+SBUFL ! Endwert ueberschritten? ! + JR NZ,SGET0 + LD SOUTPTR,#SWERT ! Init-Wert ! + +SGET0: + RET + + +END SGETCHAR + + + +SIO_OUT PROCEDURE + !******************************************************* + * + * Ausgabe ueber SIO in on_line Mode + * Es werden nur ASCII-Zeichen %01...%7F ausgegeben + * Das NUL-Zeichen %00 wird unterdrueckt. + * + *******************************************************! +ENTRY + + CP CHAR,#%00 ! NUL-Zeichen? ! + JR Z,SIO0 ! wenn ja, Aussprung ! + +SIO1: + TM IRQ,#B4 ! Sender bereit ! + JR Z,SIO1 ! warten auf Sendebereitschaft ! + LD SIO,CHAR ! Zeichen senden ! + AND IRQ,#NB4 ! TX-Flag ruecksetzen ! + +SIO0: + RET + + +END SIO_OUT + + + +BREAK PROCEDURE + !******************************************************* + * + * + * Break-Funktion ausfuehren: + * Senden %00 fuer die Dauer der halbierten Baudrate + * + *******************************************************! +ENTRY + + TCM STAT0,#B3 ! nur bei on_line wirksam ! + JR NZ,BREAK0 + CP CHAR,#%F1 ! nochmalige Pruefung ! + JR NZ,BREAK0 + CLR CHAR ! NUL in CHAR ! + PUSH RP + SRP #%20 ! Reg-Gr. 2 ! + LD R7,BDR ! aktuelle Baudrate holen ! + ADD R7,R7 ! Baudrate halbieren ! + LD T0,R7 ! neue Zeitkonst. in T0 ! + OR TMR,#%03 ! T0 laden und starten ! + +BREAK2: + TM IRQ,#B4 ! Sender bereit ! + JR Z,BREAK2 ! warten auf Sendebereitschaft ! + LD SIO,CHAR ! Zeichen senden ! + AND IRQ,#NB4 ! TX-Flag ruecksetzen ! + +BREAK1: + TM IRQ,#B4 ! Senden beendet? ! + JR Z,BREAK1 + LD T0,BDR ! aktuelle Baudrate wieder laden ! + OR TMR,#%03 ! T0 laden und starten ! + POP RP + +BREAK0: + RET + + +END BREAK + +END HAUPT