TXTSTART START TXTSEG USING ATALKDAT STZ GOTOFLG STZ CH STZ CV STZ XMIN STZ YMIN LDA #80 STA XMAX LDA #24 STA YMAX LDA #$80 ; Normal characters STA CHMASK STZ MOUSEFLG ; (0-off, 1-on) STZ INVERTFLG RTL ; COUT - Character out ; IN: A = ASCII Code of character to print COUT ENTRY TAX LDA CV ASL A TAY LDA BASETBL,Y STA AX STZ AX+2 SEP #$30 LONGA OFF LONGI OFF STA >COL80 LDA CH LSR A BCS PR2 STA >PAGE2 PR2 TAY LDA INVERTFLG BNE PR4 TXA ORA CHMASK LDX MOUSEFLG ; do we want mouse characters BNE PR3 ; yes, don't do check PR2a CMP #$40 BLT PR3 CMP #$60 BGE PR3 SEC SBC #$40 PR3 STA [AX],Y STA >PAGE1 REP #$30 RTS PR4 ANOP LDA [AX],Y EOR #$80 BRA PR2a LONGA ON LONGI ON ; CURSOR - handle cursor CURSOR ENTRY PHA PEI AX PEI AX+2 LDA CV ASL A TAY LDA BASETBL,Y STA AX STZ AX+2 SEP #$30 LONGA OFF LONGI OFF STA >COL80 LDA CH LSR A BCS CR2 STA >PAGE2 CR2 TAY LDA [AX],Y EOR #$80 CMP #$40 BLT CR3 CMP #$60 BGE CR3 SEC SBC #$40 CR3 STA [AX],Y STA >PAGE1 REP #$30 LONGA ON LONGI ON PLA STA AX+2 PLA STA AX PLA RTS ;------------------------------------------------------------------------ ; PUTCHAR - Put character on screen. Control codes are also handled. ; IN: Character or control code is in the accumulator ; OUT: Carry set - character was a zero (end of string). PUTCHAR ENTRY PHA PHX PHY PEI AX PEI AX+2 LDX GOTOFLG BNE GTOA CMP #0 BEQ EXIT2 CMP #$20 BLT CTRL JSR COUT LDA CH CMP XMAX BLT DD JSR CR BRA EXIT DD INC CH EXIT PLA STA AX+2 PLA STA AX PLY PLX PLA CLC RTL EXIT2 PLA STA AX+2 PLA STA AX PLY PLX PLA SEC RTL ; Check for a control code CTRL PEA EXIT-1 ASL A TAY LDA CNTRLTBL,Y PHA RTS ; Carriage return handler CR ENTRY LDA XMIN STA CH INC CV LDA CV CMP YMAX BNE DDD LDA YMAX DEA STA CV JSL SCROLL DDD RTS ; GotoXY handler GTOXY ENTRY LDA #1 STA GOTOFLG RTS GTOA CPX #1 BEQ GTOB STZ GOTOFLG STA CV LDX CH LDY CV JSL GOTOXY JMP EXIT GTOB STA CH INX STX GOTOFLG JMP EXIT ; Clear to end-of-line handler CLEOL ENTRY LDA CH PHA CL1 LDA #' ' ORA CHMASK JSR COUT INC CH LDX CH CPX XMAX BCC CL1 BEQ CL1 PLA STA CH RTS ; Standard characters SO ENTRY LDA #$0080 STA CHMASK RTS ; Alternate characters SI ENTRY STZ CHMASK RTS MOUSEON ENTRY LDA #1 STA MOUSEFLG STZ CHMASK RTS MOUSEOFF ENTRY STZ MOUSEFLG JSR SO RTS INVERTON ENTRY LDA #1 STA INVERTFLG RTS INVERTOFF ENTRY STZ INVERTFLG RTS ;------------------------------------------------------------------------ ; GOTOXY - Move to a certain spot on the screen ; IN: X = Horizontal position ; Y = Vertical postion GOTOXY ENTRY PHA TXA CLC ADC XMIN STA CH TYA CLC ADC YMIN STA CV PLA RTL ;---------------------------------------------------------------------- ; HOME - Clear the text screen HOME ENTRY LDA XMIN PHA LDA YMIN PHA STZ XMIN STZ YMIN LDY #23 LDA #' ' LOOP2 LDX #79 LOOP JSL GOTOXY JSL PUTCHAR DEX BPL LOOP DEY BPL LOOP2 PLA STA YMIN PLA STA XMIN LDX #0 LDY #0 JSL GOTOXY RTL ;--------------------------------------------------------------------- ; SETWNDW - Set up a new window ; IN: X - hi-byte = X1 , lo-byte = Y1 ; Y - hi-byte = X2 , lo-byte = Y2 SETWNDW ENTRY PHA TXA AND #$00FF STA YMIN TXA XBA AND #$00FF STA XMIN TYA AND #$00FF STA YMAX TYA XBA AND #$00FF STA XMAX PLA RTL ; write a pascal type string WritePStr ENTRY PEI BX+2 PEI BX PEI AX+2 PEI AX LDA Temp PHA STX BX+2 STY BX LDA [BX] AND #$00FF BEQ WDONE STA Temp LDY #1 WLOOP LDA [BX],Y AND #$00FF JSL PUTCHAR CPY Temp BEQ WDONE INY BRA WLOOP WDONE ANOP PLA STA Temp PLA STA AX PLA STA AX+2 PLA STA BX PLA STA BX+2 RTL ; write a C type string WriteCStr ENTRY PEI BX+2 PEI BX PEI AX+2 PEI AX STX BX+2 STY BX LDY #0 WLOOP2 LDA [BX],Y AND #$00FF JSL PUTCHAR INY BCC WLOOP2 PLA STA AX PLA STA AX+2 PLA STA BX PLA STA BX+2 RTL SCROLL ENTRY LDA TEMP PHA PEI AX+2 PEI AX PEI BX+2 PEI BX LDA CH PHA LDA CV PHA SEP #$20 STA >COL80 REP #$20 LDA YMIN ASL A TAX LDA BASETBL,X STA AX STZ AX+2 STZ BX+2 LDA YMIN STA CV SC1 LDA AX STA BX INC CV LDA CV ASL A TAX LDA BASETBL,X STA AX LONGA OFF LONGI OFF SEP #$30 LDA XMIN DEA DEA STA Temp LDA XMAX LSR A TAY SC2 LDA [AX],Y STA [BX],Y DEY CPY Temp BNE SC2 STA >PAGE2 LDA XMAX LSR A TAY SC3 LDA [AX],Y STA [BX],Y DEY CPY Temp BNE SC3 STA >PAGE1 REP #$30 LONGA ON LONGI ON LDA YMAX DEA CMP CV BNE SC1 LDA XMIN STA CH LDA #KEOL JSL PUTCHAR PLA STA CV PLA STA CH PLA STA BX PLA STA BX+2 PLA STA AX PLA STA AX+2 PLA STA TEMP RTL ; GetStr - get a string and put it in the address pointed to by X ; IN : X - string location GetStr ENTRY PEI AX STX AX JSR CURSOR LDY #78 LDA #0 GtLoop STA (AX),Y DEY DEY BPL GtLoop GetCmd ANOP JSL GETKEY LDX #KEYTBL2 JSL CITRP BCS Get2 DEX PEA GetCmd-1 PHX RTS Get2 ANOP CMP #$20 BLT GetCmd SEP #$20 STA (AX) REP #$20 INC AX JSR CURSOR JSL PUTCHAR JSR CURSOR LDA CH CMP XMAX BNE GetCmd JSR CURSOR LDA #13 JSL PUTCHAR JSR CURSOR PLA STA AX CLC RTL BKSPC ENTRY JSR CURSOR DEC CH LDA CH CMP XMIN BGE BK2 LDA XMIN STA CH JSR CURSOR RTS BK2 ANOP DEC AX JSR CURSOR RTS FRWRD ENTRY JSR CURSOR INC CH LDA CH CMP XMAX BLT F2 LDA XMAX STA CH JSR CURSOR RTS F2 ANOP JSR CURSOR INC AX RTS GetDone ENTRY JSR CURSOR PLA LDA #13 JSL PUTCHAR PLA STA AX CLC RTL GetEsc ENTRY JSR CURSOR PLA LDA #13 JSL PUTCHAR PLA STA AX SEC RTL GETKEY ENTRY SEP #$20 ELOOP LDA >KeyBoard BPL ELOOP STA >ClrKey REP #$20 AND #$007F RTL END