LBSR CALC LEAX -1,X set up to LBSR UPD18 shift characters left LBSR READLP STB $0156 TORSET LBRA RESET SNDCNT LDD #$FF09 LDX #$0152 CLRBUF STA ,X+ DECB BNE CLRBUF LDB #$BF STB $0153 JSR [POLCAT] CMPA #$41 BLO LOOPBK CMPA #$5B BHS LOOPBK SUBA #$40 JSR [CHROUT] LOOPBK LBRA SCAN WPTABL FDB 00 FDB $0780 FDB 00 FDB 00 FDB $5000 FCB $0 FCB $0 FCB $50 FCB $FF FCB 0 FCB 0 FCB 0 FDB 00 FDB 00 FCB 0 FDB $3000 FCB 0 FCB 0 FDB $1001 FCB 0 FCB $00 TEXT FCC " " FCC "PBJ Inc. Basic Driver Rev. 2.4 Copyright (c) 1984" FCB 0 FORPAR FCB $6F HORIZ TOTAL FCB $50 HORIZ DISPLAYED FCB $57 HORIZONTAL SYNC FCB $3C HOR/VERT SYNC FCB $1C VERT TOTAL FCB $00 VERT TOTAL ADJUST FCB $18 VERT DISPLAYED FCB $1A VERTICAL SYNC FCB $78 MODE FCB $09 SCAN LINES FCB $00 CURS BLINK/START FCB $09 CURSOR END FCB $00 DISPLAY START ADD FCB $00 DISPLAY START ADD FCB $00 CURS POS ADDRESS FCB $00 CURS POS ADDRESS FCB $00 LP POSITION FCB $00 LP POSITION FCB $00 UPDATE ADDRESS FCB $00 UPDATE ADDRESS COMTBL FDB 00 FCB $00 DISPLAY START ADD FCB $00 DISPLAY START ADD FCB $00 CURS POS ADDRESS FCB $00 CURS POS ADDRESS f it is then get second key CMPA #$9 is it right arrow BNE BKAROW if not check for other keys LDX BUFPNT,U get buffer pointer CMPX #$03D6 end of buffer? BEQ RESET LBSR READSC go get character from screen BSR PUTBUF put character in buffer RESET LDD #$FFFF STD $0157 BSR DELAY BRA SCAN PUTBUF STA ,X+ put character into buffer STX BUFPNT,U INC BRGSTR,U bump count LDX DISPOS,U LEAX 1,X STX DISPOS,U LBSR MOVE LDX LINSTR,U LDB LINLEN,U ABX CMPX DISPOS,U new line? BNE RET not yet STX LINSTR,U LBSR SCROLL RET RTS DELAY LDX CRATE,U get delay value SPEED LEAX -1,X BNE SPEED RTS BKAROW STA DRGSTR,U store character for Basic CMPA #$8 is it backarrow? LBNE DNAROW BSR GOWEST BRA RESET back to scan GOWEST LDX DISPOS,U CMPX DISSTR,U don't go off screen BEQ FINI LDB BRGSTR,U check character count DECB BEQ WCHLIN no update if at start STB BRGSTR,U LDX BUFPNT,U LEAX -1,X adjust buffer pointer STX BUFPNT,U WCHLIN LDX DISPOS,U LEAX -1,X LBSR MOVE1 STX DISPOS,U CMPX LINSTR,U update line start? BHS FINI not yet LDB LINLEN,U NEGB INCB LEAX B,X STX LINSTR,U FINI RTS AUTOIN CMPA #$0D turn off auto BNE TSTAUT insert if carriage return CLR AUTFLG,U BKTOBS LDD DRGSTR,U LDX BUFPNT,U PULS U RTS BASINP FCB $7E INPTHK FDB $FFFF TSTAUT TST AUTFLG,U auto-insert on? BEQ BKTOBS no; exit to Basic CMPA #$20 is it printable? BLO BKTOBS LDX BUFPNT,U CMPX #$03D6 end of buffer? BEQ NOMORE BSR PSHOVR shift character right LDA DRGSTR,U LBSR PUT insert character LDX BUFPNT,U update line buffer LBSR PUTBUF NOMORE LBRA SCAN PSHOVR LDB #1 STB DIR,U BSR CALC LDX DISPOS,U READLP BSR READSC get character from screen PSHS A LBSR UPD18 LDA TEMP,U LBSR PUT PULS A STA TEMP,U LDB DIR,U LEAX B,X LBSR UPD18 DEC COUNT,U BNE READLP LDX DISPOS,U LBSR UPD18 LDD #$20FF STA TEMP,U RTS READSC LDB #$1F set CRTC for STB CRTC transparent access SYNC TST CRTC did CRTC put character BPL SYNC at latch? LDA CRTC+3 get characterat latch ANDA #$7F convert to ASCII RTS return CALC LDX LINSTR,U LDB LINLEN,U ABX calculate offset from TFR X,D cursor position to SUBD DISPOS,U end of line STB COUNT,U save offset RTS DNAROW CMPA #$A is it down arrow? LBNE AUTOIN LDD #$0A60 blink cursor STD CRTC LDX LINSTR,U STX DISPOS,U move cursor to LBSR MOVE1 start of line FINDLN JSR [POLCAT] go get keypress CMPA #$A is it down arrow? BNE UPWEGO if not go check for other key LDX DISPOS,U LDB LINLEN,U ABX calculate new position CMPX DISEND,U check for end of screen BPL FINDLN if at bottom do nothing BRA JUMP UPWEGO CMPA #$5E is it up arrow? BNE SPACBR if not go check for space bar LDX DISPOS,U LDB LINLEN,U calculate new NEGB position LEAX B,X CMPX DISSTR,U check for end of screen BMI FINDLN if at end of screen do nothing JUMP STX DISPOS,U adjust pointers STX LINSTR,U LBSR MOVE tell CRTC LDD #$FFFF set for auto repeat STD $0155 LBSR DELAY wait a little BRA FINDLN go get new key SPACBR CMPA #$20 is it space bar? BNE FINDLN if not go get new key LDD #$0A00 stop cursor blinking STD CRTC LBRA BKTOBS SPDFOR LDB $0158 BITB #$8 BNE SPDBAK LDX BUFPNT,U CMPX #$03D6 BEQ FASTER LBSR READSC LBSR PUTBUF BRA FASTER SPDBAK LDB $0157 BITB #8 BNE INSERT LBSR GOWEST FASTER LDD #$FFFF STD $0157 LDX #$0A00 LBSR SPEED LBRA SCAN INSERT LDB $0158 BITB #$20 BNE DELETE LDB #$FF set for auto-insert STB AUTFLG,U BRA TORSET DELETE LDB $0156 BITB #$20 BNE SNDCNT TST AUTFLG,U auto-insert on? BEQ CLOSE no; shift chars.left CLR AUTFLG,U LDB #$FF STB $0156 LBSR DELAY BRA DELETE short loop CLOSE LDB #$FF negative offset for READ STB DIR,U BNE CHK7 CLR IFLG,U clear flag TORETN LBRA DONE CHK7 CMPA #$7 bell tone? BNE CHK8 LDA $FF23 ORA #$8 STA $FF23 LDA #$FF STA $FF20 LDA #$40 TONE2 LDB #$60 sound bell TONE1 DECB BNE TONE1 COM $FF20 DECA BNE TONE2 BRA TORETN CHK8 CMPA #$11 set destructive cursor? BNE CHK9 LDB #$FF STB DFLG,U set flag BRA TORETN CHK9 CMPA #$12 clear destructive cursor? BNE CHK10 CLR DFLG,U clear flag BRA TORETN CHK10 CMPA #$15 erase to EOL? BNE CHK11 LDX LINSTR,U LDB LINLEN,U ABX calculate cursor position LEAX -1,X NOTYET BSR UPD18 LDA #$20 BSR PUT put blanks from end of line to cursor position LEAX -1,X CMPX DISPOS,U BHS NOTYET GOMOV LBRA FIN CHK11 CMPA #$16 erase to EOS? BNE CHK12 LDX DISEND,U BRA NOTYET CHK12 CMPA #$10 home cursor? BNE CHK13 LDX DISSTR,U STX DISPOS,U adjust pointers STX LINSTR,U BRA GOMOV adjust CRTC registers CHK13 CMPA #$9 BNE CHK14 TST DFLG,U BEQ SKIP1 LDA #$20 BSR PUT SKIP1 LEAX 1,X BRA ADIOS CHK14 CMPA #$A BNE CHK15 LDX DISPOS,U LDB LINLEN,U ABX ADIOS LBRA ADJUST CHK15 CMPA #$1D BNE CHK16 COM SCFLG,U RETBAK LBRA DONE CHK16 CMPA #$1F BNE RETBAK COM SRFLG,U BRA RETBAK MOVE LDX DISPOS,U MOVE1 LDA #CRS tell CRTC the display position, BSR UPDREG UPD18 LDA #UPD and cursor position. UPDREG PSHS A save reg number STA CRTC CMPA #DIS is display start register BNE NOTDIS being updated? VERT LDA CRTC wait for vertical retrace BITA #$20 before updating register. BEQ VERT NOTDIS TFR X,D move data to 'D' STA CRTC+1 PULS A INCA next register STD CRTC RTS PUT ORA IFLG,U PSHS B LDB #$1F set CRTC for transparent access STB CRTC WAIT LDB CRTC check to see if BPL WAIT CRTC is ready STA CRTC+3 store character at latch PULS B RTS SCROLL CMPX DISEND,U are we at line 25? BLO NOSCRL not yet; don't scroll BSR UPD18 disp pos. to start of line 25 LDB LINLEN,U ABX LDA #$20 LINELP BSR PUT clear line 25 LEAX -1,X CMPX LINSTR,U BNE LINELP LDX DISSTR,U calculate new LDB LINLEN,U display start ABX CMPX ROLL,U time to reset disp start? BMI SAME LDD DISPOS,U cursor offset from line start SUBD LINSTR,U STB DISPOS,U temp. store in cursor-MSB LDB #$17 LDA LINLEN,U MUL start of line 24 STD DISEND,U STD LINSTR,U ADDB DISPOS,U add cursor offset STD DISPOS,U LDX #$0 SAME STX DISSTR,U TST SCFLG,U BNE HARD LDB #193 SMOO LDA CRTC BITA #$20 BEQ SMOO STB $FF9C LDX SRATE,U SDLAY LEAX -1,X BNE SDLAY INCB CMPB #202 BNE SMOO LDA #64 RSTL LDB CRTC BITB #$20 BEQ RSTL STA $FF9C HARD LDX DISSTR,U LDA #DIS tell CRTC to scroll LBSR UPDREG LBSR MOVE LDX DISEND,U LDB LINLEN,U LEAX B,X adjust screen size pointer STX DISEND,U NOSCRL RTS CLSCR PSHS U LEAU WPTABL,PCR LDX #$0 LBSR UPD18 LDA #$20 CLERLP LBSR PUT LEAX 1,X CMPX DISEND,U BNE CLERLP LDX #$0 STX LINSTR,U STX DISPOS,U STX DISSTR,U LDA #DIS LBSR UPDREG LBSR MOVE1 LDB #$18 LDA LINLEN,U MUL STD DISEND,U PULS U RTS *Relocated print routine PRINT BEQ LFEED CMPA #$40 check for PRINT @ command BNE NOMOVE JSR $B3E4 PSHS U LEAU WPTABL,PCR ADDD DISSTR,U calculate new cursor position STD DISPOS,U LBSR MOVE LDX DISSTR,U LDB LINLEN,U LINE LEAX B,X CMPX DISPOS,U BMI LINE STX LINSTR,U PULS U JSR $B911 CLR $6F RTS NOMOVE JSR $B907 CLR $6F RTS LFEED LDA #$0D JMP [CHROUT] *This is inserted into the Basic input loop* INPUT TST $6F LBNE BASINP CLR $70 PSHS U LEAU WPTABL,PCR STD DRGSTR,U STX BUFPNT,U LEAS 2,S SCAN JSR [POLCAT] go get a key BEQ SCAN LDB $0153 is it the BITB #$40 'CLEAR' key? LBEQ SPDFOR iTY ADDR1,PCR LDA #$7E STA $0167 STX $0168 LEAX INPUT,PCR for input, LDY $016B STY INPTHK,PCR STX $016B STA $016A LEAX CLSHK,PCR and CLS LDY $1A1 LDB $01A0 STB ADDR3,PCR STY ADDR3+1,PCR STA $01A0 STX $01A1 LDY $0165 STY $76 LEAX TAB,PCR STX $0165 LDA #$7E STA $0164 *Move command table LEAX COMTBL,PCR STX $0123 LDY #$AB67 LDB #$48 NOTDON LDA ,Y+ STA ,X+ DECB BNE NOTDON *Re-direct 'PRINT' command vector. LEAX PRINT,PCR re-direct print command STX COMTBL+14,PCR *Print message LBSR CLSCR clear screen LEAY TEXT,PCR print copyright notice TITLE LDA 0,Y+ BEQ INIFIN JSR BPRINT BRA TITLE INIFIN LDA #$0D JSR BPRINT JMP COLD **Driver Routines begin here** CLSHK PSHS X,Y,A,B,CC CLS hook LDX 7,S CMPX #$A913 BNE NCLS LBSR CLSCR NCLS PULS X,Y,A,B,CC ADDR3 JMP $FFFF TAB LEAS 2,S setup return address LDY $C000 CMPY #$444B BNE SKIP2 JSR [$76] SKIP2 PSHS A,B,X CLR $6E initialize 'print' device LDA $6F output mode BEQ VIDEO INCA BEQ CASS LDX $99 LPRINT parameters LDD $9B BRA SETUP VIDEO PSHS U LEAU WPTABL,PCR LDD DISPOS,U get cursor position SUBD LINSTR,U LDA LINLEN,U get chars. per line PULS U LDX #$1010 SETUP STX $6A STB $6C set line position STA $6D set chars. per line PULS A,B,X,PC CASS COM $6E set cassette output parameters LDX #$0100 CLRA CLRB BRA SETUP DUMMY RTS *Character output OUTCHR TST $6F is it for screen? BNE NTSCRN if not return. PSHS X,Y,A,B,U LEAU WPTABL,PCR LDX DISPOS,U TST XYFLG,U check for x-y cursor positioning BNE XYSET TST LENFLG,U check for line length change BNE LENCHK TST SRFLG,U check for scroll rate change BNE SRCHG CMPA #$20 is it printable? LBLO CTRL if not check control codes. TST IFLG,U is inverse set? BEQ NORM ORA #$80 BRA INV NORM ANDA #$7F INV LBSR PUT put character on screen. LEAX 1,X adjust pointer for ADJUST STX DISPOS,U next character LDX LINSTR,U check for new LDB LINLEN,U line. ABX CMPX DISPOS,U BHI FIN STMVRT STX LINSTR,U LBSR SCROLL FIN LBSR MOVE DONE PULS X,Y,A,B,U LEAS 2,S RTS NTSCRN FCB $7E ADDR1 FDB $FFFF *Change scroll rate SRCHG STA SRATE,U CLR SRFLG,U BRA DONE *X-Y Cursor positioning routine XYSET LDB XYFLG,U BMI YSET STA XLOC,U LDB #$FF STB XYFLG,U BRA DONE YSET LDB LINLEN,U get screen size MUL ADDD DISSTR,U calculate new row value STD LINSTR,U set pointer to new value TFR D,X LDB XLOC,U get column offset LEAX B,X STX DISPOS,U adjust pointer for new position LBSR MOVE adjust CRTC registers CLR XYFLG,U BRA DONE *Change characters per line LENCHK CMPA #$30 set for 80 columns? BNE LCHK1 LDB #$50 BRA LENSET LCHK1 CMPA #$32 set for 64 columns? BNE LCHK2 LDB #$40 BRA LENSET LCHK2 CMPA #$37 set for 32 columns? BNE DONE LDB #$20 LENSET STB LINLEN,U set line length pointer to new value LBSR CLSCR clear screen LDA #1 adjust CRTC reg STA CRTC LDB LINLEN,U STB CRTC+1 CLR LENFLG,U BRA DONE CTRL CMPA #$0D is it car/rtrn? BNE CHK1 LDX LINSTR,U LDB LINLEN,U ABX calculate new position STX DISPOS,U adjust dispos pointer BRA ADJUST CHK1 CMPA #$8 is it backspace? BNE CHK2 LEAX -1,X adjust pointer STX DISPOS,U LBSR MOVE1 adjust CRTC registers TST DFLG,U is destructive cursor on? BEQ SKIP LDA #$20 erase character LBSR PUT SKIP LBRA ADJUST CHK2 CMPA #$0C is it 'CLS'? BNE CHK3 LBSR CLSCR clear screen BRA TORETN CHK3 CMPA #$1B change line length? BNE CHK4 LDB #$FF STB LENFLG,U set flag BRA TORETN CHK4 CMPA #$0B x-y cursor positioning? BNE CHK5 LDB #$7F STB XYFLG,U set flag BRA TORETN CHK5 CMPA #$17 set inverse? BNE CHK6 LDB #$80 STB IFLG,U set flag BRA TORETN CHK6 CMPA #$18 clear inverse?P섷큷ތ%40%5~0_\%&@0h~gh0[kkj0^a]ev0Ne~d߿~rr0ʿu1' 947g&v57~2bDK&v4no' L'ܛ 4@3FDL5@jlm5nO_ 9 o&C4v3FmN&BmO&bm&1 %m' {0FDL:F"D~B5v2b9~o N+ N L=D0FoN ́0&P 2&@ 7& LLoO & DL:F &0FmM' l &c &&O  &N &ƀ &oM&## @`Z&s J& ݁&M Ӂ&oM ˁ&DL:0V p0F$&B &įFD & mM' G0 &FL:&cǁ&c F4 & '5L94*59B%kL: 0D&L:H+FDFL=BDFFm&$ '0&\&@ 'Ć k`BL0B94@3kQ j0B&DFĆ :1L=B5@9'.@&$4@30FL0F+D5@o9o9 n o&p4@32b'S@'R &?'Ӎ W" ֧lF0FDL:F&D90&9& F'&Z' 0F0^FD$LP\0D9 &o5@9~m' %'El?9F%4K'5K0jJ&F K9}*9DL:FJ9 &y `DF & FL:B* ^&FLP0+ޯFDU ́ & 2X&'~ W&W oX & ,V &(m' oV A0VR RZ&ƿSA% [$@ PP0 S PBJ Inc. Basic Driver Rev. 2.4 Copyright (c) 1984oPW<x ~ W&W oX & ,V &(m' oV A0VR RZ&ƿSA% [$@  NAM WP *Word-Pak Basic Driver for 16/32K systems *Revision 2.4 ORG $0000 POLCAT EQU $A000 CHROUT EQU $A002 BPRINT EQU $A282 INTCNV EQU $B3E4 COLD EQU $A027 CRTC EQU $FF98 UPD EQU $12 update reg no. CRS EQU $0E cursor reg no. DIS EQU $0C disp start reg no. *Variables accessed on the 'U' stack DISSTR RMB 2 Display Start value DISEND RMB 2 Display End value LINSTR RMB 2 Start of line DISPOS RMB 2 Display Position ROLL RMB 2 Reset Constant for Scroll COUNT RMB 1 Count from cursor to end of line TEMP RMB 1 Temp. character buffer for Insert/Delete LINLEN RMB 1 Current line length DFLG RMB 1 Destruct/Non-destruct cursor flag XYFLG RMB 1 X/Y Cursor positioning flag LENFLG RMB 1 Line length change flag IFLG RMB 1 Inverse video flag DRGSTR RMB 1 'A=Character. BRGSTR RMB 1 'B=Input line length+1 BUFPNT RMB 2 Basic line buffer pointer XLOC RMB 1 X val. in X/Y cursor routine CRATE RMB 2 Auto-repeat delay constant DIR RMB 1 Direction for Insert/Delete SCFLG RMB 1 Smooth scroll flag SRATE RMB 2 Smooth scroll rate constant SRFLG RMB 1 Scroll rate change flag AUTFLG RMB 1 Auto-insert flag ORG $0E00 ORCC #$50 *Make room for driver TFR PC,S ORCC #$50 LEAY WPSTRT,PCR STY $76 LEAX COMTBL,PCR LEAX $4A,X TFR X,D SUBD $76 STD $76 LDD $74 PSHS D SUBD $76 STD $74 LDD $27 SUBD $76 STD $27 LDD $23 SUBD $76 STD $23 LDD $21 SUBD $76 STD $21 STX $76 *Copy Basic Driver to high mem LDY $74 LEAY 1,Y LEAX WPSTRT,PCR RELO LDD ,X++ STD ,Y++ CMPY ,S BCS RELO LDX $74 LEAX 1,X PSHS X JMP $AD19 **Relocated Basic Driver starts here** WPSTRT LEAX FORPAR,PCR CLRB LOOP1 LDA ,X+ initialize CRTC STB CRTC registers STA CRTC+1 INCB CMPB #$14 BCS LOOP1 *Test for WPII, if WPII then enable smooth scrolling. LDA #14 STA $FF9C STA $FF9D LDA $FF9D CMPA #14 BNE WP2 LDA #$FF STA WPTABL+25,PCR WP2 LDA #64 STA $FF9C *Set Basic hooks LEAX OUTCHR,PCR redirect Basic hooks LDY $168 for output, S NAM WP64 *Word-Pak Basic Driver for 64K systems *Revision 2.4 ORG $0000 POLCAT EQU $A000 CHROUT EQU $A002 BPRINT EQU $A282 INTCNV EQU $B3E4 WPDRIV EQU $F000 CRTC EQU $FF98 UPD EQU $12 update reg no. CRS EQU $0E cursor reg no. DIS EQU $0C disp start reg no. *Variables accessed on the 'U' stack DISSTR RMB 2 Display Start value DISEND RMB 2 Display End value LINSTR RMB 2 Start of line DISPOS RMB 2 Display Position ROLL RMB 2 Reset Constant for Scroll COUNT RMB 1 Count from cursor to end of line TEMP RMB 1 Temp. character buffer for Insert/Delete LINLEN RMB 1 Current line length DFLG RMB 1 Destruct/Non-destruct cursor flag XYFLG RMB 1 X/Y Cursor positioning flag LENFLG RMB 1 Line length change flag IFLG RMB 1 Inverse video flag DRGSTR RMB 1 'A=Character. BRGSTR RMB 1 'B=Input line length+1 BUFPNT RMB 2 Basic line buffer pointer XLOC RMB 1 X val. in X/Y cursor routine CRATE RMB 2 Auto-repeat delay constant DIR RMB 1 Direction for Insert/Delete SCFLG RMB 1 Smooth scroll flag SRATE RMB 2 Smooth scroll rate constant SRFLG RMB 1 Scroll rate change flag AUTFLG RMB 1 Auto-insert flag ORG $0E00 START ORCC #$50 *Copy loop, Basic ROM's to RAM LDX #$8000 DOWN LDD ,X STA $FFDF STD ,X++ STA $FFDE CMPX #$E000 BLO DOWN STA $FFDF LDD #$FEFE PSHS D *Copy Basic Driver to high mem LDY #WPDRIV LEAX WPSTRT,PCR RELO LDD ,X++ STD ,Y++ CMPY ,S BCS RELO PULS D JMP WPDRIV **Relocated Basic Driver starts here** WPSTRT LEAX FORPAR,PCR CLRB LOOP1 LDA ,X+ initialize CRTC STB CRTC registers STA CRTC+1 INCB CMPB #$14 BCS LOOP1 *Test for WPII, if WPII then enable smooth scrolling. LDA #14 STA $FF9C STA $FF9D LDA $FF9D CMPA #14 BNE WP2 LDA #$FF STA WPTABL+25,PCR WP2 LDA #64 STA $FF9C *Set Basic hooks LEAX OUTCHR,PCR redirect Basic hooks LDY $168 for output, STY ADDR1,PCR LDA #$7E STA $0167 STX $0168 LEAX INPUT,PCR for input, LDY $016B STY INPTHK,PCR STX $016B STA $016A LEAX CLSHK,PCR and CLS LDY $1A1 LDB $01A0 STB ADDR3,PCR STY ADDR3+1,PCR STA $01A0 STX $01A1 LDY $0165 STY $76 LEAX TAB,PCR STX $0165 LDA #$7E STA $0164 *Reset hook to maintain 64K LDD #$12B7 STD $1F8 LDX #$FFDF STX $1FA LDA #$7E STA $1FC LDX $72 STX $1FD LDX #$1F8 STX $72 *Re-direct 'PRINT' command vector. LEAX PRINT,PCR re-direct print command STX $AB75 LBSR CLSCR clear screen LEAY TEXT,PCR print copyright notice TITLE LDA 0,Y+ BEQ INIFIN JSR BPRINT BRA TITLE INIFIN ANDCC #$AF RTS **Driver Routines begin here** CLSHK PSHS X,Y,A,B,CC CLS hook LDX 7,S CMPX #$A913 BNE NCLS LBSR CLSCR NCLS PULS X,Y,A,B,CC ADDR3 JMP $FFFF TAB LEAS 2,S setup return address LDY $C000 CMPY #$444B BNE SKIP2 JSR [$76] SKIP2 PSHS A,B,X CLR $6E initialize 'print' device LDA $6F output mode BEQ VIDEO INCA BEQ CASS LDX $99 LPRINT parameters LDD $9B BRA SETUP VIDEO PSHS U LEAU WPTABL,PCR LDD DISPOS,U get cursor position SUBD LINSTR,U LDA LINLEN,U get chars. per line PULS U LDX #$1010 SETUP STX $6A STB $6C set line position STA $6D set chars. per line PULS A,B,X,PC CASS COM $6E set cassette output parameters LDX #$0100 CLRA CLRB BRA SETUP DUMMY RTS *Character output OUTCHR TST $6F is it for screen? BNE NTSCRN if not return. PSHS X,Y,A,B,U LEAU WPTABL,PCR LDX DISPOS,U TST XYFLG,U check for x-y cursor positioning BNE XYSET TST LENFLG,U check for line length change BNE LENCHK TST SRFLG,U check for scroll rate change BNE SRCHG CMPA #$20 is it printable? LBLO CTRL if not check control codes. TST IFLG,U is inverse set? BEQ NORM ORA #$80 BRA INV NORM ANDA #$7F INV LBSR PUT put character on screen. LEAX 1,X adjust pointer for ADJUST STX DISPOS,U next character LDX LINSTR,U check for new LDB LINLEN,U line. ABX CMPX DISPOS,U BHI FIN STMVRT STX LINSTR,U LBSR SCROLL FIN !"#$%&'WP64 TXT WP64 BINuWP TXTzWP BIN(V1 BAS)V BAS*EMO BAS+k LBSR MOVE DONE PULS X,Y,A,B,U LEAS 2,S RTS NTSCRN FCB $7E ADDR1 FDB $FFFF *Change scroll rate SRCHG STA SRATE,U CLR SRFLG,U BRA DONE *X-Y Cursor positioning routine XYSET LDB XYFLG,U BMI YSET STA XLOC,U LDB #$FF STB XYFLG,U BRA DONE YSET LDB LINLEN,U get screen size MUL ADDD DISSTR,U calculate new row value STD LINSTR,U set pointer to new value TFR D,X LDB XLOC,U get column offset LEAX B,X STX DISPOS,U adjust pointer for new position LBSR MOVE adjust CRTC registers CLR XYFLG,U BRA DONE *Change characters per line LENCHK CMPA #$30 set for 80 columns? BNE LCHK1 LDB #$50 BRA LENSET LCHK1 CMPA #$32 set for 64 columns? BNE LCHK2 LDB #$40 BRA LENSET LCHK2 CMPA #$37 set for 32 columns? BNE DONE LDB #$20 LENSET STB LINLEN,U set line length pointer to new value LBSR CLSCR clear screen LDA #1 adjust CRTC reg STA CRTC LDB LINLEN,U STB CRTC+1 CLR LENFLG,U BRA DONE CTRL CMPA #$0D is it car/rtrn? BNE CHK1 LDX LINSTR,U LDB LINLEN,U ABX calculate new position STX DISPOS,U adjust dispos pointer BRA ADJUST CHK1 CMPA #$8 is it backspace? BNE CHK2 LEAX -1,X adjust pointer STX DISPOS,U LBSR MOVE1 adjust CRTC registers TST DFLG,U is destructive cursor on? BEQ SKIP LDA #$20 erase character LBSR PUT SKIP LBRA ADJUST CHK2 CMPA #$0C is it 'CLS'? BNE CHK3 LBSR CLSCR clear screen BRA TORETN CHK3 CMPA #$1B change line length? BNE CHK4 LDB #$FF STB LENFLG,U set flag BRA TORETN CHK4 CMPA #$0B x-y cursor positioning? BNE CHK5 LDB #$7F STB XYFLG,U set flag BRA TORETN CHK5 CMPA #$17 set inverse? BNE CHK6 LDB #$80 STB IFLG,U set flag BRA TORETN CHK6 CMPA #$18 clear inverse? BNE CHK7 CLR IFLG,U clear flag TORETN LBRA DONE CHK7 CMPA #$7 bell tone? BNE CHK8 LDA $FF23 ORA #$8 STA $FF23 LDA #$FF STA $FF20 LDA #$40 TONE2 LDB #$60 sound bell TONE1 DECB BNE TONE1 COM $FF20 DECA BNE TONE2 BRA TORETN CHK8 CMPA #$11 set destructive cursor? BNE CHK9 LDB #$FF STB DFLG,U set flag BRA TORETN CHK9 CMPA #$12 clear destructive cursor? BNE CHK10 CLR DFLG,U clear flag BRA TORETN CHK10 CMPA #$15 erase to EOL? BNE CHK11 LDX LINSTR,U LDB LINLEN,U ABX calculate cursor position LEAX -1,X NOTYET BSR UPD18 LDA #$20 BSR PUT put blanks from end of line to cursor position LEAX -1,X CMPX DISPOS,U BHS NOTYET GOMOV LBRA FIN CHK11 CMPA #$16 erase to EOS? BNE CHK12 LDX DISEND,U BRA NOTYET CHK12 CMPA #$10 home cursor? BNE CHK13 LDX DISSTR,U STX DISPOS,U adjust pointers STX LINSTR,U BRA GOMOV adjust CRTC registers CHK13 CMPA #$9 BNE CHK14 TST DFLG,U BEQ SKIP1 LDA #$20 BSR PUT SKIP1 LEAX 1,X BRA ADIOS CHK14 CMPA #$A BNE CHK15 LDX DISPOS,U LDB LINLEN,U ABX ADIOS LBRA ADJUST CHK15 CMPA #$1D BNE CHK16 COM SCFLG,U RETBAK LBRA DONE CHK16 CMPA #$1F BNE RETBAK COM SRFLG,U BRA RETBAK MOVE LDX DISPOS,U MOVE1 LDA #CRS tell CRTC the display position, BSR UPDREG UPD18 LDA #UPD and cursor position. UPDREG PSHS A save reg number STA CRTC CMPA #DIS is display start register BNE NOTDIS being updated? VERT LDA CRTC wait for vertical retrace BITA #$20 before updating register. BEQ VERT NOTDIS TFR X,D move data to 'D' STA CRTC+1 PULS A INCA next register STD CRTC RTS PUT ORA IFLG,U PSHS B LDB #$1F set CRTC for transparent access STB CRTC WAIT LDB CRTC check to see if BPL WAIT CRTC is ready STA CRTC+3 store character at latch PULS B RTS SCROLL CMPX DISEND,U are we at line 25? BLO NOSCRL not yet; don't scroll BSR UPD18 disp pos. to start of line 25 LDB LINLEN,U ABX LDA #$20 LINELP BSR PUT clear line 25 LEAX -1,X CMPX LINSTR,U BNE LINELP LDX DISSTR,U calculate new LDB LINLEN,U display start ABX CMPX ROLL,U time to reset disp start? BMI SAME LDD DISPOS,U cursor offset from line start SUBD LINSTR,U STB DISPOS,U temp. store in cursor-MSB LDB #$17 LDA LINLEN,U MUL start of line 24 STD DISEND,U STD LINSTR,U ADDB DISPOS,U add cursor offset STD DISPOS,U LDX #$0 SAME STX DISSTR,U TST SCFLG,U BNE HARD LDB #193 SMOO LDA CRTC BITA #$20 BEQ SMOO STB $FF9C LDX SRATE,U SDLAY LEAX -1,X BNE SDLAY INCB CMPB #202 BNE SMOO LDA #64 RSTL LDB CRTC BITB #$20 BEQ RSTL STA $FF9C HARD LDX DISSTR,U LDA #DIS tell CRTC to scroll LBSR UPDREG LBSR MOVE LDX DISEND,U LDB LINLEN,U LEAX B,X adjust screen size pointer STX DISEND,U NOSCRL RTS CLSCR PSHS U LEAU WPTABL,PCR LDX #$0 LBSR UPD18 LDA #$20 CLERLP LBSR PUT LEAX 1,X CMPX DISEND,U BNE CLERLP LDX #$0 STX LINSTR,U STX DISPOS,U STX DISSTR,U LDA #DIS LBSR UPDREG LBSR MOVE1 LDB #$18 LDA LINLEN,U MUL STD DISEND,U PULS U RTS *Relocated print routine PRINT BEQ LFEED CMPA #$40 check for PRINT @ command BNE NOMOVE JSR $B3E4 PSHS U LEAU WPTABL,PCR ADDD DISSTR,U calculate new cursor position STD DISPOS,U LBSR MOVE LDX DISSTR,U LDB LINLEN,U LINE LEAX B,X CMPX DISPOS,U BMI LINE STX LINSTR,U PULS U JSR $B911 CLR $6F RTS NOMOVE JSR $B907 CLR $6F RTS LFEED LDA #$0D JMP [CHROUT] *This is inserted into the Basic input loop* INPUT TST $6F LBNE BASINP CLR $70 PSHS U LEAU WPTABL,PCR STD DRGSTR,U STX BUFPNT,U LEAS 2,S SCAN JSR [POLCAT] go get a key BEQ SCAN LDB $0153 is it the BITB #$40 'CLEAR' key? LBEQ SPDFOR if it is then get second key CMPA #$9 is it right arrow BNE BKAROW if not check for other keys LDX BUFPNT,U get buffer pointer CMPX #$03D6 end of buffer? BEQ RESET LBSR READSC go get character from screen BSR PUTBUF put character in buffer RESET LDD #$FFFF STD $0157 BSR DELAY BRA SCAN PUTBUF STA ,X+ put character into buffer STX BUFPNT,U INC BRGSTR,U bump count LDX DISPOS,U LEAX 1,X STX DISPOS,U LBSR MOVE LDX LINSTR,U LDB LINLEN,U ABX CMPX DISPOS,U new line? BNE RET not yet STX LINSTR,U LBSR SCROLL RET RTS DELAY LDX CRATE,U get delay value SPEED LEAX -1,X BNE SPEED RTS BKAROW STA DRGSTR,U store character for Basic CMPA #$8 is it backarrow? LBNE DNAROW BSR GOWEST BRA RESET back to scan GOWEST LDX DISPOS,U CMPX DISSTR,U don't go off screen BEQ FINI LDB BRGSTR,U check character count DECB BEQ WCHLIN no update if at start STB BRGSTR,U LDX BUFPNT,U LEAX -1,X adjust buffer pointer STX BUFPNT,U WCHLIN LDX DISPOS,U LEAX -1,X LBSR MOVE1 STX DISPOS,U CMPX LINSTR,U update line start? BHS FINI not yet LDB LINLEN,U NEGB INCB LEAX B,X STX LINSTR,U FINI RTS AUTOIN CMPA #$0D turn off auto BNE TSTAUT insert if carriage return CLR AUTFLG,U BKTOBS LDD DRGSTR,U LDX BUFPNT,U PULS U RTS BASINP FCB $7E INPTHK FDB $FFFF TSTAUT TST AUTFLG,U auto-insert on? BEQ BKTOBS no; exit to Basic CMPA #$20 is it printable? BLO BKTOBS LDX BUFPNT,U CMPX #$03D6 end of buffer? BEQ NOMORE BSR PSHOVR shift character right LDA DRGSTR,U LBSR PUT insert character LDX BUFPNT,U update line buffer LBSR PUTBUF NOMORE LBRA SCAN PSHOVR LDB #1 STB DIR,U BSR CALC LDX DISPOS,U READLP BSR READSC get character from screen PSHS A LBSR UPD18 LDA TEMP,U LBSR PUT PULS A STA TEMP,U LDB DIR,U LEAX B,X LBSR UPD18 DEC COUNT,U BNE READLP LDX DISPOS,U LBSR UPD18 LDD #$20FF STA TEMP,U RTS READSC LDB #$1F set CRTC for STB CRTC transparent access SYNC TST CRTC did CRTC put character BPL SYNC at latch? LDA CRTC+3 get characterat latch ANDA #$7F convert to ASCII RTS return CALC LDX LINSTR,U LDB LINLEN,U ABX calculate offset from TFR X,D cursor position to SUBD DISPOS,U end of line STB COUNT,U save offset RTS DNAROW CMPA #$A is it down arrow? LBNE AUTOIN LDD #$0A60 blink cursor STD CRTC LDX LINSTR,U STX DISPOS,U move cursor to LBSR MOVE1 start of line FINDLN JSR [POLCAT] go get keypress CMPA #$A is it down arrow? BNE UPWEGO if not go check for other key LDX DISPOS,U LDB LINLEN,U ABX calculate new position CMPX DISEND,U check for end of screen BPL FINDLN if at bottom do nothing BRA JUMP UPWEGO CMPA #$5E is it up arrow? BNE SPACBR if not go check for space bar LDX DISPOS,U LDB LINLEN,U calculate new NEGB position LEAX B,X CMPX DISSTR,U check for end of screen BMI FINDLN if at end of screen do nothing JUMP STX DISPOS,U adjust pointers STX LINSTR,U LBSR MOVE tell CRTC LDD #$FFFF set for auto repeat STD $0155 LBSR DELAY wait a little BRA FINDLN go get new key SPACBR CMPA #$20 is it space bar? BNE FINDLN if not go get new key LDD #$0A00 stop cursor blinking STD CRTC LBRA BKTOBS SPDFOR LDB $0158 BITB #$8 BNE SPDBAK LDX BUFPNT,U CMPX #$03D6 BEQ FASTER LBSR READSC LBSR PUTBUF BRA FASTER SPDBAK LDB $0157 BITB #8 BNE INSERT LBSR GOWEST FASTER LDD #$FFFF STD $0157 LDX #$0A00 LBSR SPEED LBRA SCAN INSERT LDB $0158 BITB #$20 BNE DELETE LDB #$FF set for auto-insert STB AUTFLG,U BRA TORSET DELETE LDB $0156 BITB #$20 BNE SNDCNT TST AUTFLG,U auto-insert on? BEQ CLOSE no; shift chars.left CLR AUTFLG,U LDB #$FF STB $0156 LBSR DELAY BRA DELETE short loop CLOSE LDB #$FF negative offset for READ STB DIR,U LBSR CALC LEAX -1,X set up to LBSR UPD18 shift characters left LBSR READLP STB $0156 TORSET LBRA RESET SNDCNT LDD #$FF09 LDX #$0152 CLRBUF STA ,X+ DECB BNE CLRBUF LDB #$BF STB $0153 JSR [POLCAT] CMPA #$41 BLO LOOPBK CMPA #$5B BHS LOOPBK SUBA #$40 JSR [CHROUT] LOOPBK LBRA SCAN WPTABL FDB 00 FDB $0780 FDB 00 FDB 00 FDB $5000 FCB $0 FCB $0 FCB $50 FCB $FF FCB 0 FCB 0 FCB 0 FDB 00 FDB 00 FCB 0 FDB $3000 FCB 0 FCB 0 FDB $1001 FCB 0 FCB $00 TEXT FCC " " FCC "PBJ Inc. Basic Driver Rev. 2.4 Copyright (c) 1984" FCB 0 FORPAR FCB $6F HORIZ TOTAL FCB $50 HORIZ DISPLAYED FCB $57 HORIZONTAL SYNC FCB $3C HOR/VERT SYNC FCB $1C VERT TOTAL FCB $00 VERT TOTAL ADJUST FCB $18 VERT DISPLAYED FCB $1A VERTICAL SYNC FCB $78 MODE FCB $09 SCAN LINES FCB $00 CURS BLINK/START FCB $09 CURSOR END FCB $00 DISPLAY START ADD FCB $00 DISPLAY START ADD FCB $00 CURS POS ADDRESS FCB $00 CURS POS ADDRESS FCB $00 LP POSITION FCB $00 LP POSITION FCB $00 UPDATE ADDRESS FCB $00 UPDATE ADDRESS COMTBL FDB 00 FCB $00 DISPLAY START ADD FCB $00 DISPLAY START ADD FCB $00 CURS POS ADDRESS FCB $00 CURS POS ADDRESSPTP1Gv0X0Jvvt4vt'v'#v#!v!vt1!0%t04~0_\%&@0h~gh0Zkkj0]`\ev0Me~d0#gHZ&0Я1"'  ~'47g&v57~2bDK&v4no' L'ܛ 4@3FDL5@jlm5nO_ 9 o&C4v3FmN&BmO&bm&1 %m' {0FDL:F"D~B5v2b9~o N+ N L=D0FoN ́0&P 2&@ 7& LLoO & DL:F &0FmM' l &c &&O  &N &ƀ &oM&## @`Z&s J& ݁&M Ӂ&oM ˁ&DL:0V p0F$&B &įFD & mM' G0 &FL:&cǁ&c F4 & '5L94*59B%kL: 0D&L:H+FDFL=BDFFm&$ '0&\&@ 'Ć k`BL0B94@3kQ j0B&DFĆ :1L=B5@9'.@&$4@30FL0F+D5@o9o9 n o&p4@32b'S@'R &?'Ӎ W" ֧lF0FDL:F&D90&9& F'&Z' 0F0^FD$LP\0D9 &o5@9~m' %'El?9F%4K'5K0jJ&F K9}*9DL:FJ9 &y `DF & FL:B* ^&FLP0+ޯFDU ́ & 2X&'~ W&W oX & ,V &(m' oV A0VR RZ&ƿSA% [$@ qPP0 PBJ Inc. Basic Driver Rev. 2.4 Copyright (c) 1984oPW<x ~ W&W oX & ,V &(m' oV A0VR RZ&ƿ& M"WP64":& M"WP": h&" ::Word-PakII demo program &?&HFF98,10:&HFF99,&H20 &K A(45)&`(N044:A(N): &k2:LOOP&q<&FV7:H25 &PY0&ZN044:XA(N)&dX13YY1 &nX13 140 &x(11);(H2X);(VY);(142) ' (11);(H2X1);(VY);(142) ''L 5,12,13,5,13,5,12,13,1,2,5,6,7,12,13,0,3,5,8,12,13 'z0,3,5,8,12,13,0,1,2,5,6,7,12,13,0,9,12 '13,0,10,11,13,0,13 'V5:H23 'L29:W13'ȀN04'ҁ280'VV1:HH1'LL2:WW2''T01000:( N045::(:460("YV:XH(5" X H HL (@, 440(F6(Q@XHL (dJ Y V VW (nT440(t^(hYVW (rXHL H 1 (|440((YVW V 1 (440((((11);(X);(Y);(142) ()X32:Y11:A$"INTRODUCES...")#ց1320).N05)=T0300:)\X33:Y13:A$"WORD-PAKII" )g1320)s(23))T0300: )1320)&(24) :)0):X32:Y13:A$"SMOOTH SCROLLING")D1320*NX18:Y16:A$"The new WORD-PAKII features smooth scrolling." *!X1320*0bT0300:*slX18:Y17:A$"In addition, the scroll rate is completely pro-"*~v1320*X18:Y18:A$"grammable and smooth scrolling can be enabled/"* 1320+X18:Y19:A$"disabled under software control. In addition to" +1320+dX18:Y20:A$"smooth scrolling, the new WORD-PAKII also features..."+o1320+T01000: +ƀN023::+X25:Y13:A$"SOFTWARE CONTROLLED VIDEO SWITCH"+ځ1320,X18:Y15:A$"Now you can select either 80 column text or", 1320,QX18:Y16:A$"graphics on your monitor display.",\1320,m T02000: ,{&HFF9C,0, Q01,*3,1,4,>1,1,HF(4):B(8):BF (B4F) 840,R F,B:B:L05,\((255),(191)),-f((255),(191)),(100) -$p:P010-Cz((255),(191)),(4),F-P:H17-_T0600:-gQ -wT01000:-&HFF9C,64--X18:Y10:A$"In addition, the WORD-PAKII also features a"-ʁ1320.X18:Y11:A$"new character set that is formed in an 8X10" .!ށ1320.fX18:Y12:A$"matrix. This provides for a well formed character".q1320.X18:Y13:A$"with full descenders. The character set includes" .1320/X18:Y14:A$"upper, lower case, and graphic characters." / 1320/$/!.&HFF98,31/88X0255:&HFF9B,X/GBT025: /OL X/_VT01000:/n`S02::/zj(23)/tS02::0~09);"The WORD-PAKII includes all features of the standard WORD-PAK including full screen editing and the following screen commands:" 00?(13);20);"Backspace cursor"0a(13);20);"Advance cursor"0(13);20);"Move cursor down one line"0(13);20);"X-Y cursor positioning"0(13);20);"Clear screen"1ć(13);20);"Move cursor to start of next line" 1.·(13);20);"Home cursor"1[؇(13);20);"Destructive cursor on/off"1(13);20);"Erase from cursor to end of screen"1(13);20);"Erase from cursor to end of line"1(13);20);"Turn inverse on/off"2 (13);20);"Change number of characters/line"21 S026:: 2=(24)2F502a((11);(X);(Y);A$2g20);"Erase from cursor to end of screen"1(13);20);"Erase from cursor to end of line"1(13);20);"Turn inverse on/off"2 (13);20);"