Title 'Morrow Terminal Board ROM (Rev 3.3 -- 12_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 8_Nov_84 John Zalabak ; 1) Added Stack initialization at the start of WARM ; 2) Interleaved the calls to PROCESS in the MAIN loop ; ;---------------------------------------------------------------------- ; 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 ;---------------------------------------------------------------------- ; Begin Restart Initialization ;----------------------------- ; ORG ROM ;Trap Vector for unused Irq's NULL: RTI ; null restart vector ;Normal Reset Entry START: SEI ; disable interrupts LDA #0 ; disable NMI handling STA NMIOK STA BAUD ; put kbrd in quiescent state STA BDREG CLD LDX #$7F ; init stack TXS CLRRAM: STA RAM,X ; clear z page DEX BPL CLRRAM LDA #$FF ; Disable keyboard buffer until init done STA LOCKMD ; Initialize the Crt Controller LDX #16 ; clear bit 6 of status reg on 6545 STX CRTC LDA CRTC+1 ; by reading LPEN register LDA CRTC ; read CRTC status register AND #%01000000 CMP #%00000000 ; see if 6545 BNE INIT68 ; if not 6545, then init as 6845 INIT: LDX #15 ; init CRTC (6545) INILP1: STX CRTC LDA SETUP65,X STA CRTC+1 DEX BPL INILP1 JMP WARMTST INIT68: LDX #15 ; init CRTC (6845) INILP2: STX CRTC LDA SETUP68,X STA CRTC+1 DEX BPL INILP2 WARMTST:LDA #' ' ; set to clear screen to spaces STA CLRCHAR JSR CLRSCR ; clear screen JSR SLFTST ; test for KBRD, and test RAM ; re-init after DIP Switch change starts here WARM: LDX #$7F ; init stack TXS JSR GETSW ; get dip switch setting JSR INIUART ; init BAUD port and USART JSR INITBUF ; fill in and out buffers with 0ffh LDA #2 ; init pointers for input buffer STA INEP+1 STA INSP+1 JSR SETXLT ; set up pointers for xlation LDA #0 ; set function key sequence type LDY DIP1 ; depends on switch 8 of dip switch BMI MORROW ; if 1, then morrow function sequence LDA #$FF ; else, set for Televideo lead in MORROW: STA FNCNTYP ; set function type LDA #0 ; clear ESCRCVD flag (used in monitor mode) STA ESCRCVD ; initialize attributes to [all off] JSR INVOFF ; set inverse video mode LDA #' ' ; set to clear to spaces STA CLRCHAR JSR CLRSCR ; clear the screen JSR SETCUR ; put cursor on screen LDA #2 ; set default attribute for BRIGHT/DIM STA DEFINV LDA #0 ; set default cursor STA DCURTYP JSR CURST2 ; set cursor type to what's in A reg CLI LDA #CLCKON ; turn on key click JSR KBRDOUT LDA #CAPSOFF ; turn on caps lock light JSR KBRDOUT LDA #AUTON ; turn on auto repeat JSR KBRDOUT LDA #LOCKOFF ; turn off kbrd lock LED JSR KBRDOUT LDA #OFLNOFF ; turn off OFF LINE LED JSR KBRDOUT LDA #BEEP ; BEEP!! JSR KBRDOUT LDY #0 I1: LDA #$20 ; put spaces in RAM where bottom 2 lines STA CHRLINE,Y ; are stored LDA #$02 ; put normal attribute in RAM STA ATTLINE,Y INY CPY #160 BNE I1 LDA #0 ; turn keyboard buffer on now STA LOCKMD LDA #$A5 STA NMIOK CLI ; enable USART interrupts PAGE ;---------------------------------------------------------------------- ; The Main Loop ;-------------- ; 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 NOTRDY ; jump if UART is not ready to XMIT JSR SNDREM ; else, try to get a char from send buffer CMP #$FF BEQ NOTRDY ; if no character, then not ready LDX PARSTAT ; check status of parity (on/off) BNE PAROK ; 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 PAROK ; if mark, then branch AND #$7F ; else, clear MSB PAROK: STA S1DATA ; else, XMIT the character NOTRDY: RTS PAGE ;---------------------------------------------------------------------- ; Process Pending Input Characters ;--------------------------------- ; PROCESS:LDA BUFFULL BEQ NOTFUL LDA #BEEP JSR KBRDOUT LDA #0 STA BUFFULL NOTFUL: JSR INREM ; see if any characters pending CMP #$FF BEQ NOINPUT ; if no chars, then no input LDX #$FF STX DISUPDT ; set screen update flag JMP OUTC ; else, handle the char NOINPUT:RTS PAGE ;---------------------------------------------------------------------- ; Handle Pending Keyboard Input ;------------------------------ ; 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 ;------------------------------ ; CHKDIP: LDA DIPSW11 ; get dip switch settings ASL A STA TEMPDIP LDA DIPSW12 AND #01 ORA TEMPDIP STA TEMPDIP ; save it temporarily CMP DIP1 ; see if switch changed BNE CHANGE ; if (dip switch unchanged) then RTS ; return CHANGE: LDA SWDIF ; else, BEQ SETDIF ; if (Different flag = true) then LDA NEWDIP ; get new dip setting CMP TEMPDIP BNE NODB ; if (DIP SW same as last time through) then DEC DBOUNCE ; update debounce timer BNE NOTIM ; if not zero, then no timeout yet LDA #0 ; else, clear, and prepare to re-init STA TEMPDIP STA SWDIF JMP WARM NOTIM: RTS NODB: LDA #$FF ; else, reset debounce STA DBOUNCE RTS ; and return SETDIF: LDA #$FF ; else STA SWDIF ; set switch different flag to true STA DBOUNCE ; reset timeout counter LDA TEMPDIP ; set new switch value STA NEWDIP RTS PAGE ;---------------------------------------------------------------------- ; Update the Screen Saver Timeout ;-------------------------------- ; SAVSCRN:LDA TIMEN ; check if screen timeout enabled BEQ TIMSCRN ; if ( screen timeout disabled) then RTS ; return TIMSCRN:LDA DISUPDT ; else, get display update flag BNE SCRNON ; if (DISUPDT flag = $FF) then turn screen on LDA DISOFF ; else, see if display is off BNE SCRNOFF ; if (display not off) then JMP TIMEOUT ; update timeout counter, and turn off screen if reqd SCRNOFF:RTS ; else, return SCRNON: LDX #1 ; turn on screen STX CRTC ; select horiz displayed char register of crtc LDX #80 STX CRTC+1 ; set for 80 characters LDX #0 STX TIMECNT ; reset timeout counter STX TIMECNT+1 STX TIMECNT+2 STX DISUPDT ; clear update flag STX DISOFF RTS ; and return TIMEOUT:CLC ; update timeout counter LDA #1 ADC TIMECNT STA TIMECNT ; increment 1st byte of timeout counter LDA #0 ADC TIMECNT+1 STA TIMECNT+1 ; increment 2nd byte of timeout counter LDA #0 ADC TIMECNT+2 STA TIMECNT+2 ; increment 3rd byte of timeout counter CMP #73 ; see if time up BEQ TIMEUP ; if (time not up) then RTS ; return TIMEUP: LDA #$FF ; else, set display off flag STA DISOFF LDX #1 ; and turn off the display STX CRTC ; select horiz char displayed register DEX STX CRTC+1 ; set to 0 RTS PAGE ;---------------------------------------------------------------------- ; Translate Output Characters ;---------------------------- ; XLTOUT: LDY NUMXLTO ; get number of characters to be xlated BEQ NOXLT1 ; if 0, then no xlations needed SEARCH1:CMP (XLT1),Y ; see if character is in KBRD search list BEQ CHNG1 ; if so, then change a char DEY ; else, point to next character in xlation list BNE SEARCH1 ; if any characters are left to check, check another NOXLT1: RTS ; return if character not in list CHNG1: LDA (XLT2),Y ; else, get replacement character RTS ;---------------------------------------------------------------------- ; Translate Input Characters ;--------------------------- ; XLTIN: LDY NUMXLTI ; get number of characters to be xlated BEQ NOXLT2 ; if 0, then no xlations needed SEARCH2:CMP (XLT3),Y ; see if character is in KBRD search list BEQ CHNG2 ; if so, then change a char DEY ; else, point to next character in xlation list BNE SEARCH2 ; if any characters are left to check, check another NOXLT2: RTS ; return if character not in list CHNG2: LDA (XLT4),Y ; else, get replacement character RTS PAGE ;---------------------------------------------------------------------- ; Function code output routine for all function keys except F1-F10 ;----------------------------------------------------------------- ; FNCNOUT:AND #$7F ; knock off 8th bit TAX ; save character CMP #%00001111 ; see if keyboard power up BEQ NOCR ; 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 SNDLDIN ; if (lead in not Morrow) then LDY #TELLD ; set for televideo lead in SNDLDIN: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 NOCR ; if ( CR required ) then LDA #$0D ; put CR in send buffer JMP SNDINS ; and return NOCR: RTS ; else, return PAGE ;---------------------------------------------------------------------- ; Function code output 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 NOCR1 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 SNDLD ; if (lead in not Morrow) then LDY #TELLD ; set for televideo lead in SNDLD: 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 NOCR1 ; if ( CR required ) then LDA #$0D ; put CR in send buffer JMP SNDINS ; and return NOCR1: RTS ; else, return ;---------------------------------------------------------------------- ; convert shift and ctrl function to no shift or ctrl ;---------------------------------------------------- ; MASKSC: TXA ; get character AND #%01100000 ; check if shift and control bits both down CMP #%01100000 BNE NOMASK ; 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 NOMASK: 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 KD1 RTS KD1: 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 (12_Nov_84) ;-------------------------- ; INCLUD INIT6.ASM ;Initialization Code INCLUD ESC6.ASM ;Escape Sequence Handelers INCLUD CONT6.ASM ;Control Character Routines INCLUD MOVE6.ASM ;Video Buffer Move Routines INCLUD IO6.ASM ;Interrupt and I/O Buffer Routines INCLUD DATA6.ASM ;Data Storage ;---------------------------------------------------------------------- ; Restart and interrupt vectors ;------------------------------ ; ORG $FFF0 DW NULL DW NULL DW NULL DW NULL DW NULL DW NMIVEC DW START DW IRQVEC END