TITLE 'Morrow Terminal Board ROM (Rev 3.3)' SBTTL 'Main Module (14_Nov_84)' ;====================================================================== ; Copyright 1984 ; Morrow Designs, Inc. ; San Leandro, Ca. ; Written by David Block and Jim Kearney (September 1983) ; ;---------------------------------------------------------------------- ; Revision Information ;--------------------- ; ; REV 1.4 Dec 13,1983: David Block ; 1) added ESC,+, and ESC,* as clear screen commands ; 2) removed keyboard lock command ; 3) fixed translation tables for foreign keyboards ; 4) changed method of determining if 6845 or 6545 ; ; REV 1.5 Feb 6,1984: David Block ; 1) modified for new keyboard ; 2) fixed xlation code ; ; REV 1.6 Mar 8,1984 Giora Bar-Hai ; 1) Changed F10 codes to 50H,51H,52H ; 2) Fixed tab sub. ; ; REV 2.1 Feb 24,1984 Giora Bar-Hai ; 1) change attribute address from 0400H to 0C00H (for MDT 70) ; 2) change F10 code to 50H,51H,52H ; ; REV 2.2 Mar 8,1984 Giora Bar-Hai ; 1) fixed tab sub. ; ; REV 2.3 Mar 22,1984 Giora Bar-Hai ; 1) change F10,FA,FB,FC,FD codes ; ; REV 3.0 Apr 25,1984 Giora Bar-Hai ; 1) Changed attribute ram address to 0800H ; 2) modified for the new attributes (one attribute info. on each byte) ; ; REV 3.1 June 4,1984 Giora Bar-Hai ; 1) add TXA instruction in MASKSC sub. (VB.ASM) to solve FD problem ; ; REV 3.2 June 26,1984 Marc Bernstein ; 1) added ESC-S to save bottom 2 lines of screen into RAM ; 2) ESC-P to retrieve the bottom 2 lines and put them back on screen ; 3) added ^-No Scroll to place uart interrupt ; 4) keyboard input is checked for during sequence of bells from host ; ; REV 3.3 13_Nov_84 John Zalabak ; 1) Added Stack initialization at the start of WARM ; 2) Interleaved the calls to PROCESS in the MAIN loop ; 3) Put initialization code into the init*.asm file ; 4) Generally recommented and reorganized the program componets ; 5) Moved OUTC into PROCESS ; ;---------------------------------------------------------------------- ; Index (13_Nov_84) ;------------------ ; ; -------- Revision Information ; -------- Equates ; -------- Page Zero Definitions ; MAIN Main Loop ; SENDC Send a Character ; PROCESS Process Pending Input Characters ; RTN Common Return for UnImplemented Escape Codes ; KYHNDLR Handle Pending Keyboard Input ; CHKDIP Check the Dip Switch Settings ; SAVSCRN Update the Screen Saver Timeout ; XLTOUT Translate Output Characters ; XLTIN Translate Input Characters ; FNCNOUT Function Code Routine (all function keys except F1-F10) ; FNUM Function Code Routine (for F1-F10 keys) ; MASKSC Convert Shift & Control Function to No_Shift or Control ; KDLY Keyboard Delay ; PRNTMSG Print a Message ; -------- Include Files ; -------- Restart and interrupt vectors PAGE 60 ;---------------------------------------------------------------------- ; Equates ;-------- ; RAM EQU $0000 ;Base of System Ram ARAM EQU $0800 ; " " Attribute Ram CRAM EQU $2800 ; " " Character Ram ROM EQU $F000 ; " " Rom SNDBUF EQU $0180 INBUF EQU $0200 INBUF2 EQU $0300 CHRLINE EQU $06C0 ATTLINE EQU $0760 CRTC EQU $5F00 ;6545/6845 Crt Controller UART1 EQU $6000 S1DATA EQU UART1 S1STAT EQU UART1+1 UART2 EQU $8000 S2DATA EQU UART2 S2STAT EQU UART2+1 BAUD EQU $A000 DIPSW12 EQU $A001 DIPSW11 EQU $A002 DIPSW2 EQU $C000 ;KBRD COMMANDS SENDID EQU $80 XOR $FF ; send kbrd ID BEEP EQU $81 XOR $FF ; ring bell CLCKON EQU $82 XOR $FF ; key click on CLCKOFF EQU $83 XOR $FF ; key click off CAPSON EQU $84 XOR $FF ; turn caps light on CAPSOFF EQU $85 XOR $FF ; turn caps light off AUTON EQU $86 XOR $FF ; auto repeat on AUTOFF EQU $87 XOR $FF ; auto repeat off LOCKON EQU $88 XOR $FF ; keyboard lock light on LOCKOFF EQU $89 XOR $FF ; keyboard lock light off OFLNON EQU $8A XOR $FF ; off line light on OFLNOFF EQU $8B XOR $FF ; off line light off ;key codes from kbrd ACCESS EQU %10011111 ; f1-f10 function lead in code ZERO EQU %10010000 ; numeric kpad zero key CAPSKEY EQU $8A ; caps lock key code SPCBAR EQU %10001100 ; space bar CTLNSCR EQU %10100111 ; ctrl no scroll key NOSCROL EQU %10000111 ; no-scroll key BREAK EQU %10001001 ; Break key TABKEY EQU %10001011 ; tab COMMA EQU %10011101 ; numeric kpad comma key ;Special Ascii key codes CTRLS EQU $13 ; control S - sent for X-OFF by NO-SCROLL CTRLQ EQU $11 ; control Q - sent for X-ON by NO-SCROLL CTRLC EQU $03 ; control C - sent when BREAK pressed CTRLI EQU $09 ; control I - sent when TAB pressed KEYMASK EQU %10011111 ; used to mask off Shift and CTRL bits MORLD EQU $1C ; morrow function key lead in TELLD EQU $01 ; televideo type function key lead in LASTLIN EQU 23*80 PAGE ;---------------------------------------------------------------------- ; Variable Data ;-------------- ; ORG RAM BUFFULL:DS 1 COLMN: DS 1 ; cursor horizontal 0..79 ROW: DS 1 ; cursor vertical 0..23 NSEQ: DS 1 ; code sequence receiving if >0 SEND: DS 1 ; code sequence sending if >0 SQNC: DS 8 ; input code sequence storage ESCRCVD:DS 1 ; used when in monitor mode to indicate that escape rcv'd BRKHIT: DS 1 ; used to indicate that the BREAK key was hit XONOFF: DS 1 ; used to determine whether to send X-ON, or X-OFF LB: DS 2 ; line base pointer AB: DS 2 ; line base in attribute pointer SCBASE: DS 2 ; screen base offset (0..2047) LB2: DS 2 AB2: DS 2 CHARS: DS 2 ; source for character moves CHARD: DS 2 ; destination for character moves TMPROW: DS 1 TMPCLMN:DS 1 NEWAB: DS 2 NEWAB2: DS 2 TEMPATT:DS 1 TRANSFR:DS 2 ATTRIB: DS 1 ; current attribute setting MONITOR:DS 1 ; if non-zero, display control chars GRAPHMD:DS 1 ; if graphics mode, set to non-zero LOCKMD: DS 1 ; set non zero for kbrd lock NMIOK: DS 1 ; MUST BE $A5 FOR NMI TO WORK TEMP: DS 1 ; zero page temp. TEMP2: DS 1 INSP: DS 2 ; start of buffer for input INEP: DS 2 ; end of buffer for input OUTSP: DS 1 ; start of output buffer OUTEP: DS 1 ; end of output buffer KEYSP: DS 1 ; start of keyboard buffer KEYEP: DS 1 ; end of keyboard buffer DCURTYP:DS 1 ; default cursor type DEFINV: DS 1 ; 0 => normal video screen, 1 => inverse video KEYCLCK:DS 1 ; 0 => key click enabled NUMBER: DS 2 ; numeric buffer CLRCHAR:DS 1 ; character to clear screen to. normally, ASCII space BDREG: DS 1 ; baud register contents DBOUNCE:DS 1 ; DIP sw debounce counter NEWDIP: DS 1 ; set to new dip value when change detected SWDIF: DS 1 ; if change in DIP detected, then this = $FF DIP1: DS 1 ; DIP switch 1 storage TEMPDIP:DS 1 UARTCMD:DS 1 ; last command instruction to uart CAPS: DS 1 ; CAPS lock flag =1 => shift alpha to CAPS KPAD: DS 1 ; KPAD MODE 0 => Normal, $FF => Application CODE: DS 2 ; Jump location after code sequence rcvd KEYBUF: DS 16 ; keyboard buffer for incoming keys PARSTAT:DS 1 ; status of parity - 1 => disabled BIT8: DS 1 ; if parity off, this sets what 8th bit should be FOREIGN:DS 1 ; Corresponds to foreign character mode 0 => US NUMXLTO:DS 1 ; number of codes that need xlation from KBRD NUMXLTI:DS 1 ; number of codes that need xlation from HOST ; pointers to translate tables. initialized by setxlt routine XLT1: DS 2 ; search list for key codes XLT2: DS 2 ; replace list for key codes XLT3: DS 2 ; search list for input characters XLT4: DS 2 ; replace list for input characters PARTIAL:DS 1 ; used to store partials of keyboard input FNCLD: DS 1 ; flag indicating if F1-F10 lead-in rcv'd FNCNTYP:DS 1 ; type of function key sequence 0 => MORROW MODE MESG: DS 2 ; pointer to message to put on screen TIMECNT:DS 3 ; used for keeping track of the number of times through ; the timeout loop, for screen saver DISUPDT:DS 1 ; flag to indicate that a character has been rcvd, and that ; the screen should be turned back on DISOFF: DS 1 ; flag indicating the status of the screen 0 => screen ON TIMEN: DS 1 ; flag indicating that screen saver is enabled 0 => enabled PAGE ;---------------------------------------------------------------------- ; The Main Loop (13_Nov_84) ;-------------------------- ; ORG ROM COLD: JSR INITC ;Cold Start Initialization WARM: JSR INITW ;Warm Start Initialization MAIN: JSR SENDC ;Loop Send a Character to the Host JSR PROCESS ; Print a Character from the Host JSR KYHNDLR ; If (keyboard input pending) handle a key JSR PROCESS ; Print a Character from the Host JSR CHKDIP ; If (dip switch changed) re-init JSR PROCESS ; Print a Character from the Host JSR SAVSCRN ; Update screen saver timeout JSR PROCESS ; Print a Character from the Host JMP MAIN ;---------------------------------------------------------------------- ; Send a Character ;----------------- ; SENDC: LDA S1STAT ; get status of UART AND #%00000001 ; check if TxRDY is true BEQ SCSK2 ; jump if UART is not ready to XMIT JSR SNDREM ; else, try to get a char from send buffer CMP #$FF BEQ SCSK2 ; if no character, then not ready LDX PARSTAT ; check status of parity (on/off) BNE SCSK1 ; if non-zero, then parity is generated ORA #%10000000 ; assume mark for eight bit LDX BIT8 ; check whether bit 8 is mark or space BEQ SCSK1 ; if mark, then branch AND #$7F ; else, clear MSB SCSK1: STA S1DATA ; else, XMIT the character SCSK2: RTS PAGE ;---------------------------------------------------------------------- ; Process Pending Input Characters ;--------------------------------- ; PROCESS:LDA BUFFULL BEQ PRSK1 LDA #BEEP JSR KBRDOUT LDA #0 STA BUFFULL PRSK1: JSR INREM ; see if any characters pending CMP #$FF BEQ RTN ; if no chars, then no input LDX #$FF STX DISUPDT ; set screen update flag LDX NSEQ ; are we getting a sequence? BEQ PRSK2 ; if not, then normal character handling STA SQNC-1,X ; else, store character for sequence DEX ; update number of characters left in sequence STX NSEQ BNE RTN ; if ( entire sequence not received) then return JMP (CODE) ; else, sequence ready to process, so do it ; Common Return for UnImplemented Escape Codes ;--------------------------------------------- ; RTN: RTS ;Common Return for UnImplemented Escape Codes PRSK2: LDX ATTRIB ; get the current atribute setting CMP #' ' ; if ( rcv'd character) < 20h BCC PRSK4 ; then use control handler LDY GRAPHMD ; check if graphics enabled BEQ PRSK3 ; if (graphics enabled) CMP #'?' ; see if char in range of 'A' to 'P' BCC PRSK3 ORA #$80 ; convert to graphics char if 'A' to 'P' PRSK3: JMP PRSK6 ; else, put character on screen, and update cursor ;Handle Control Characters PRSK4: BIT MONITOR ; see if monitor mode enabled BPL PRSK8 ; if (monitor mode) enabled LDY #0 ; last char wasn't escape, is this???? CMP #$1B BNE PRSK5 ; if ( not escape ), then set escrcvd to 0 LDY #$FF ; else, set for escrcvd true PRSK5: STY ESCRCVD PRSK6: LDY ESCRCVD ; see if last char was escape BEQ PRSK7 ; if escrcvd = 0, then last char not escape CMP #'X' ; else, see if this is a CLRMON command BNE PRSK7 ; if (not CLRMON) then branch, else LDA #0 ; clear escrcvd STA ESCRCVD JMP CLRMON ; clear monitor mode, and return PRSK7: JSR OUTCHR ; put character on screen JMP SETPOS ; update cursor location, and return PRSK8: AND #%11111 ; else, perform control code operation ASL A ; compute an index into control code vector table TAX LDA CTRLTAB,X ; set up vector for indirect jump STA CODE LDA CTRLTAB+1,X STA CODE+1 JMP (CODE) ; and execute control code PAGE ;---------------------------------------------------------------------- ; Handle Pending Keyboard Input ;------------------------------ ; 1) All Symbols Except KYHNDLR are local to this block of code. ; KYHNDLR:LDX KEYEP ; see if key buffer empty CPX KEYSP BEQ KHEXIT ; if start of buffer = end, then no keys to process LDA #$FF ; else, set to turn reset timeout counter STA DISUPDT JSR KEYREM ; remove a key from the buffer LDX DISOFF ; see if display off BNE KHEXIT ; if screen is on then keep the character TAX ; save the key BMI NOTALFA ; branch if not ascii alpha char JSR XLTOUT ; translate for foreign JMP SNDINS ; and send the character NOTALFA:LDA FNCLD ; if in lead in, then not caps BNE NOTCAPS ; so jump TXA AND #KEYMASK ; mask out shift and control bits CMP #CAPSKEY ; see if caps lock key BNE NOTCAPS ; if not caps lock, then branch LDX #CAPSON ; assume CAPS LOCK to be turned on LDA CAPS ; see what current state of caps lock is EOR #$FF ; toggle it STA CAPS BNE SNDCAPS ; if caps lock being turned on, send caps lock LDX #CAPSOFF ; else, prepare to turn off CAPS LOCK SNDCAPS:TXA JMP KBRDOUT ; send the proper code for CAPS LOCK on/off NOTCAPS:TXA ; get back the character LDX FNCLD ; see if function key lead in rcv'd BEQ CHKACCS ; if not, then see if this is it JMP FNUM ; else, this is an Fn key, so send code CHKACCS:CMP #ACCESS ; see if this is the lead in code for Fn keys BNE NOTLDIN ; if not, then branch LDA #$FF ; else, set flag to indicate that next key..... STA FNCLD ; .....is a Fn key KHEXIT: RTS NOTCSCR:TAX ; save the character again AND #KEYMASK ; mask out shift and control CMP #SPCBAR ; see if space bar BNE NOTSPC ; if not space bar, branch LDA #' ' ; if spacebar, then send ASCII space JMP SNDINS NOTSPC: CMP #NOSCROL ; see if no scroll key BNE NOTSCRL ; if not no scroll, then branch LDX XONOFF ; check whether to send X-ON or X-OFF BEQ SNDXOFF ; if 0, then send x-off INC XONOFF ; set flag to send x-off next time through LDA #CTRLQ ; send x-on JMP SNDINS SNDXOFF:DEC XONOFF ; set flag to send x-on next time through LDA #CTRLS ; else, send a control S to stop scrolling JMP SNDINS NOTLDIN:CMP #CTLNSCR ; check for control no scroll BNE NOTCSCR LDA UARTCMD ; issue break command ORA #$08 STA S1STAT LDY #100 XX: LDX #255 JSR KDLY ; delay 2.6 milliseconds DEY ; do it 100 times for 260 ms delay BNE XX LDA UARTCMD ; reset uart with original command STA S1STAT RTS NOTSCRL:CMP #BREAK ; see if break key BNE NOTBRK ; branch if not LDA #CTRLC ; else, send a control C to host JSR SNDINS LDA #$FF ; set BRKHIT flag to prevent more than 1 ^C STA BRKHIT RTS NOTBRK: CMP #TABKEY ; see if TAB key BNE NOTTAB ; if not, branch TXA ; else, see what we need to send CMP #TABKEY ; see if shift or ctrl TAB BNE FNCTN ; jump if shift or control TAB LDA #CTRLI ; else, send a TAB JMP SNDINS FNCTN: TXA ; get back character JMP FNCNOUT ; and send the function code sequence NOTTAB: CMP #ZERO ; see if KPAD ZERO key BCC FNCTN ; branch if not krom KPAD CMP #COMMA+1 ; check other range of KPAD BCS FNCTN ; branch if not from KPAD LDA KPAD ; see if KPAD applications mode BNE FNCTN ; branch if KPAD applications mode TXA ; else, get back character and convert to ASCII AND #%00011111 ; ignore all other bits ORA #%00100000 ; convert it to NUMERIC CMP #':' ; see if numeric BCC NMBER ; branch if it is CMP #$3A ; else, see if it's the PERIOD BNE NOTPER ; if not, branch LDA #"." ; else, send a period NMBER: JMP SNDINS NOTPER: CMP #$3B ; see if ENTER key BNE NOTENTR ; branch if not LDA #$0D ; else, send a CR JMP SNDINS NOTENTR:CMP #$3C ; see if MINUS BNE ISCOMMA ; if not, then branch LDA #$2D ; send a MINUS JMP SNDINS ISCOMMA:LDA #$2C ; its a COMMA, so send one JMP SNDINS PAGE ;---------------------------------------------------------------------- ; Check the Dip Switch Settings (12_Nov_84) ;------------------------------------------ ; CHKDIP: LDA DIPSW11 ; get dip switch settings ASL A STA TEMPDIP LDA DIPSW12 AND #01 ORA TEMPDIP STA TEMPDIP ;TempDip:= Dip_Switch_1 or'd with Dip_Switch_2 CMP DIP1 BEQ CKDSK3 ;If (Dip Switch Changed) LDA SWDIF BEQ CKDSK2 ; If (Different Flag eq True) LDA NEWDIP ; Get new dip setting CMP TEMPDIP BNE CKDSK1 ; If (DIP SW same as last time) DEC DBOUNCE ; Update debounce timer BNE CKDSK3 ; If (Debounce time eq 0) LDA #0 STA TEMPDIP ; Clear Temp_Dip STA SWDIF ; Clear Switch Dif JMP WARM ; Goto Warm Start CKDSK1: LDA #$FF ; Else STA DBOUNCE ; Reset Debounce RTS ; Return CKDSK2: LDA #$FF ; Else STA SWDIF ; Switch_Different_Flag:= True STA DBOUNCE ; Debounce_Timer:= Reset LDA TEMPDIP STA NEWDIP ; Install New Switch Value CKDSK3: RTS ;Return PAGE ;---------------------------------------------------------------------- ; Update the Screen Saver Timeout (12_Nov_84) ;-------------------------------------------- ; 1) If the screen is currently enabled and no character has been ; recieved then the screen timeout is incremented. If the timeout hits ; maximum then the screen is disabled. ; 2) If the screen is currently enabled and a character has been recieved ; then the screen timeout is reset. ; 3) If the screen is off and a character is recieved then the display ; is turned back on. ; SAVSCRN:LDA TIMEN BNE SVSSK1 ;If (Screen Timeout Enabled) LDA DISUPDT BNE SVSSK2 ; If ( (No Character Recieved) And LDA DISOFF ; (Display is Enabled) BNE SVSSK1 CLC ; Increment TimeOut Counter LDA #1 ADC TIMECNT STA TIMECNT LDA #0 ADC TIMECNT+1 STA TIMECNT+1 LDA #0 ADC TIMECNT+2 STA TIMECNT+2 CMP #73 BNE SVSSK1 ; If (TimeOut eq Maximum) LDA #$FF STA DISOFF ; Display_Off:= True LDX #1 ; Turn Off the Display STX CRTC DEX STX CRTC+1 ; (set horiz char to 0) SVSSK1: RTS ; Return SVSSK2: LDX #0 ; Else STX DISUPDT ; Char_Recieved_Flag:= False STX DISOFF ; Display_Off:= False STX TIMECNT STX TIMECNT+1 STX TIMECNT+2 ; Reset Timeout Counter LDX #1 ; Turn on screen STX CRTC LDX #80 STX CRTC+1 ; (set horiz char to 80) RTS ;Return PAGE ;---------------------------------------------------------------------- ; Translate Output Characters ;---------------------------- ; XLTOUT: LDY NUMXLTO ;Y:= number of characters to be xlated BEQ XLOSK1 ;If (Number of Characters to Translate ne 0) XLOLP1: CMP (XLT1),Y ; While (Character ne KBRD search list) BEQ XLOSK2 DEY ; point to next char in list BNE XLOLP1 ; If (all characters checked) XLOSK1: RTS ; Return XLOSK2: LDA (XLT2),Y ; Get replacement character RTS ;Return ;---------------------------------------------------------------------- ; Translate Input Characters ;--------------------------- ; XLTIN: LDY NUMXLTI ;Y:= number of characters to be xlated BEQ XLISK1 ;If (Number of Characters to Translate ne 0) XLILP1: CMP (XLT3),Y ; While (Character ne KBRD search list) BEQ XLISK2 DEY ; point to next char in list BNE XLILP1 ; If (all characters checked) XLISK1: RTS ; Return XLISK2: LDA (XLT4),Y ; Get replacement character RTS ;Return PAGE ;---------------------------------------------------------------------- ; Function Code Routine (all function keys except F1-F10) ;-------------------------------------------------------- ; FNCNOUT:AND #$7F ; knock off 8th bit TAX ; save character CMP #%00001111 ; see if keyboard power up BEQ FNASK2 ; if received, just return JSR MASKSC ; convert shift and control to no shift or control LDY #MORLD ; assume Morrow lead in LDA FNCNTYP ; see what lead in should be BEQ FNASK1 ; if (lead in not Morrow) then LDY #TELLD ; set for televideo lead in FNASK1: TYA ; get lead in to A reg JSR SNDINS ; put in insert buffer LDA FTABLE,X ; get function code JSR SNDINS ; put function code in insert buffer LDA FNCNTYP ; see if terminating CR required BEQ FNASK2 ; if ( CR required ) then LDA #$0D ; put CR in send buffer JMP SNDINS ; and return FNASK2: RTS ; else, return PAGE ;---------------------------------------------------------------------- ; Function Code Routine (for F1-F10 keys) ;---------------------------------------- ; FNUM: LDX #0 ; clear lead in flag for F1-F10 keys STX FNCLD TAX ; save character AND #%00010000 ; be sure code isn't kbrd ID code CMP #%00010000 BEQ FNBSK2 JSR MASKSC ; convert shift and ctrl function to no shift or ctrl LDY #MORLD ; assume Morrow lead in LDA FNCNTYP ; see what lead in should be BEQ FNBSK1 ; if (lead in not Morrow) then LDY #TELLD ; set for televideo lead in FNBSK1: TYA ; get lead in to A reg JSR SNDINS ; put in insert buffer TXA ; get character back AND #$0F ; mask of key number STA TEMP2 ; save key number TXA ; get char again AND #$60 ; convert to proper table index LSR A ORA TEMP2 TAX LDA F110TBL,X ; get function code JSR SNDINS ; put function code in insert buffer LDA FNCNTYP ; see if terminating CR required BEQ FNBSK2 ; if ( CR required ) then LDA #$0D ; put CR in send buffer JMP SNDINS ; and return FNBSK2: RTS ; else, return ;---------------------------------------------------------------------- ; Convert Shift & Control Function to No_Shift or Control ;-------------------------------------------------------- ; MASKSC: TXA ; get character AND #%01100000 ; check if shift and control bits both down CMP #%01100000 BNE MSKSK1 ; if no, then don't change function code TXA ; else, get original character AND #%00011111 ; set shift and ctrl bits to zero TAX ; restore as new function code MSKSK1: RTS PAGE ;---------------------------------------------------------------------- ; Keyboard Delay ;--------------- ; waits for a number of micro seconds, as specified in X REG ; the delay is in 10.3 micro second increments ; KDLY: DEX NOP NOP NOP NOP BNE KDLSK1 RTS KDLSK1: NOP JMP KDLY ;---------------------------------------------------------------------- ; Print a Message (9_Nov_84) ;--------------------------- ; PRNTMSG:LDA #' ' STA CLRCHAR ;Clear_Character:= Spaces JSR CLRSCR ;Clear the Screen LDY #0 ;Index:= 0 (Start of String) PMLP1: LDA (MESG),Y ;While (Current Character ne 0) BEQ PMSK1 STA (LB),Y ; Put Character On Screen INY ; Increment the Pointer JMP PMLP1 PMSK1: RTS ;Return ;---------------------------------------------------------------------- ; Include Files (14_Nov_84) ;-------------------------- ; INCLUD INT7.ASM ;Initialization Code INCLUD CNT7.ASM ;Control Character Routines INCLUD ESC7.ASM ;Escape Sequence Handelers INCLUD MOV7.ASM ;Video Buffer Move Routines INCLUD IOB7.ASM ;Interrupt and I/O Buffer Routines INCLUD DAT7.ASM ;Data Storage PAGE ;---------------------------------------------------------------------- ; Restart and interrupt vectors ;------------------------------ ; ;Trap Vector for unused Irq's NULL: RTI ;Null Vector ORG $FFF0 ;Vectors occupy the last 16 bytes of memory DW NULL DW NULL DW NULL DW NULL DW NULL DW NMIVEC ;Non_Maskable Interrupt Entry DW COLD ;Cold Start (Reset) Entry DW IRQVEC ;Maskable Interrupt Entry END