Listing of file='LISTER.MAC;01' on disk='vmedia/taylor_3-sector.ccvf'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; LISTER - LIST A BASIC FILE ON THE PRINTER ; ; VERSION 4.0 ; ; COPYRIGHT 1980 BY TREVOR TAYLOR ; TITLE LISTER ; ; REQD ROUTINES: ; EXTRN CPYRGT EXTRN DPB2D EXTRN JMPVEC,CO,OSTR,SAVE EXTRN FILVEC,EMESS,RESET,OPEN EXTRN RWSEQI,INSEQO,GTBYT,ADHLA EXTRN GENHDR EXTRN PRTCHR,CRLF,FFEED,HEADER EXTRN RDFN EXTRN SETFIL ; ; EXTERNAL VARIABLES ; EXTRN BASTOK EXTRN CHRCNT,LINCNT,PAGCNT,HDRMSG ; EQUATES BRATE EQU 81E2H ;CURRENT BAUD RATE KBDFL EQU 81DFH ;HOLDS NUMBER OF JUMP VECTOR READY EQU 81FFH ;KEYBOARD READY FLAG KBCHA EQU 81FEH ;KEYBOARD CHARACTER ; SPECIAL CONTROL CHARACTERS CR EQU 13 ;CARRIAGE RETURN LF EQU 10 ;LINE FEED FF EQU 12 ;FORM FEED HT EQU 9 ;HORIZONTAL TAB ESC EQU 27 FDRV EQU 29 ;.............................................................. ; ; USER-DEFINED PARAMETERS ; PUBLIC RATE,LINLEN,PAGLEN,FFFLAG,SKPLEN,SNGLE PUBLIC HDRFLG,DELTIM,FCSSP,CPRFLG RATE: DB 88H ;BAUD RATE (88H=1200) LINLEN: DB 80 ;LINE LENGTH PAGLEN: DB 60 ;PAGE LENGTH (NO. OF LINES ; ACTUALLY PRINTED) FFFLAG: DB 0FFH ;FORM FEED FLAG: ; 0 = PRINTER CANNOT DO FF'S ; NOT ZERO = PRINTER CAN FORM FEED SKPLEN: DB 0 ;NUMBER OF LINES TO SKIP ; FOR PAGE PERFORATIONS: ; 0 = PRINTER DOES IT ; N = NUMBER OF LINE-FEEDS ; ; NOTE: PAGLEN + SKPLEN = ACTUAL PHYSICAL PAGE LENGTH ; SNGLE: DB 0 ;SINGLE PAGE FLAG HDRFLG: DB 0FFH ;HEADER FLAG DFAULT: DB 'BAS' ;DEFAULT FILE TYPE DELTIM: DB 1 ;MECHANICAL DELAY FACTOR - ; TIME DELAY FOR MECHANICAL MOTION ; CR = 4*DELTIM ; LF = DELTIM ; FF = 20*DELTIM ; ;*** NOTE: DO NOT MAKE THIS ZERO - ZERO RESULTS IN VERY LONG ; DELAYS. MAXIMUM VALUE SHOULD BE 12. ; FCSSP: DS 2 ;FCS STACK POINTER ; ;.............................................................. ; ; START OF PROGRAM ; NOTE THAT THE FIRST "INSTRUCTION" IS REALLY A FLAG ; LISTER: CPRFLG: XRA A ;COPYRIGHT FLAG: ; 0 = NO CHECK ; NOT ZERO = CHECK IT DI LXI H,0 ;SAVE FCS STACK POINTER DAD SP SHLD FCSSP LXI SP,STACK ;SETUP RUNOFF STACK CALL JMPVEC CALL FILVEC LDA RATE ;GET BAUD RATE CODE OUT 5 ;LOAD 5501 STA BRATE ;STORE SO FCS WILL KNOW MVI A,12 ;SET KEYBOARD TO DUMP STA KBDFL ;TO INPCRT EI XRA A STA CHRCNT STA LINCNT STA PAGCNT LXI H,IDMSG ;PRINT STARTUP MESSAGE CALL OSTR LXI H,IBUF CALL CPYRGT CALL SETUP ;INITIALIZE FILE LDA HDRFLG ;SKIP HEADER GENERATION IF ORA A ; NOT REQD JZ LOOP LDA FPB+FDRV ;GET DRIVE NUMBER LXI B,IBUF LXI D,FPB ; AND POINTER TO FPB LXI H,HDRMSG CALL GENHDR ;GENERATE THE HEADER CALL HEADER ; AND PRINT IT LOOP: LXI H,FPB ;READ THE LINK FIELD CALL GTBYT JC CHKEOF MOV E,A LXI H,FPB CALL GTBYT JC CHKEOF ORA E JZ EXIT ; FINISHED IF ZERO LXI H,FPB ;READ THE LINE NUMBER CALL GTBYT JC CHKEOF MOV E,A LXI H,FPB CALL GTBYT JC CHKEOF MOV D,A MVI A,0FFH LXI H,LINNUM PUSH H CALL DPB2D ;CONVERT LINE NO. TO ASCII POP H MVI C,5 OUTLIN: MOV A,M INX H CALL PRTCHR DCR C JNZ OUTLIN MVI A,' ' ;FOLLOW LINE NO. BY A SPACE CALL PRTCHR ; ; PRINT THE LINE ; LOOP10: LXI H,FPB CALL GTBYT JC CHKEOF ORA A ;END OF LINE MARKED BY A NULL JNZ LOOP15 CALL CRLF JMP LOOP LOOP15: CPI 32 ;CHECK FOR SPACE JNZ LOOP20 LDA SPCFLG ;SEE IF LAST TOKEN ALREADY ORA A ; DID A SPACE, PUSH PSW ; AND SKIP IF TRUE XRA A STA SPCFLG ;CLEAR SPACE FLAG POP PSW JNZ LOOP10 ;SKIP PRINTING SPACE MVI A,' ' JMP NEXT10 LOOP20: PUSH PSW XRA A STA SPCFLG ;CLEAR SPACE FLAG POP PSW JC NEXT10 ;PRINT CONTROL CHRS NEXT: CPI 0C6H ;CHECK FOR A TOKEN JNC NEXT10 CPI 80H JC NEXT10 CALL TOKEN ; AND PRINT IT JMP ABTEST NEXT10: CALL PRTCHR ;OTHERWISE, JUST PRINT CHR ABTEST: LDA READY ;SEE IF BREAK CPI 50H JZ ABTEST ;HANG UNTIL ANOTHER IS STRUCK CPI 80H JNZ LOOP10 XRA A STA READY LDA KBCHA ;READ NEXT CHARACTER CPI LF ;EXIT IF LF JZ EXIT CPI ESC ;EXIT IF ESC JZ EXIT JMP LOOP10 CHKEOF: JZ EXIT ;CHECK IF END-OF-FILE ERROR: LXI H,ERRMSG ;PRINT ERROR MESSAGE CALL OSTR EXIT: XRA A ;OUTPUT A FORM FEED TO FINISH STA SNGLE CALL FFEED MVI A,13 STA KBDFL LHLD FCSSP ;RESTORE FCS STACK SPHL MVI B,0 ;SET NO ERROR RET ; AND EXIT TO FCS ;.............................................................. ; ; PRINT A BASIC KEYWORD ; TOKEN: PUSH PSW ;SAVE TOKEN CALL LOOKUP ;GET KEYWORD PUSH D MVI B,0 TOK10: LDAX D ;CALCULATE ITS LENGTH INX D INR B ORA A JP TOK10 LDA CHRCNT ;FIND NO. SPACES LEFT ON LINE MOV C,A LDA LINLEN SUB C SUB B ;SEE IF KEYWORD FITS ON LINE JP TOK20 CALL CRLF ;OUTPUT CR LF IF WON'T FIT MVI A,' ' MVI B,6 TOK15: CALL PRTCHR ; AND 6 SPACES ON NEW LINE DCR B JNZ TOK15 TOK20: POP D TOK30: LDAX D ;PRINT THE KEYWORD INX D PUSH D PUSH PSW ANI 7FH CALL PRTCHR POP PSW POP D ORA A ;LAST CHR HAS MSB SET JP TOK30 POP PSW ;GET THE TOKEN BACK SUI 80H LXI H,SPCTAB ;CHECK IF FOLLOWED BY A SPACE CALL ADHLA MOV A,M STA SPCFLG ;SET SPACE FLAG ORA A RZ MVI A,' ' ;PRINT SPACE IF REQD CALL PRTCHR RET ; SPACE TABLE - FOR SPACES AFTER KEYWORDS SPCTAB: DB 0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,1,0,1,0,0,1,1,1,0,0,0,0,0,1 DB 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0 SPCFLG: DB 0 ; ; FIND KEYWORD IN BASIC TOKEN TABLE ; LOOKUP: SUI 7FH ;CONVERT TOKEN TO OFFSET MOV C,A LXI D,BASTOK LOOK10: LDAX D ;INDEX THRU TABLE INX D ORA A JP LOOK10 DCR C JNZ LOOK10 RET ; ; SETUP FILE FOR INPUT ; SETUP: LXI B,DFAULT LXI D,FPB LXI H,IBUF CALL RDFN JC SETUP XRA A LXI B,1024 LXI D,IBUF LXI H,FPB CALL SETFIL JC SETUP RET ;.............................................................. ; ; MESSAGES IDMSG: DB 29,15,13,10 DB 17,'BASIC FILE LISTER ',23,'V4.0',13,10,239 ERRMSG: DB 17,'*** HARDWARE ERROR ***',13,10,239 LINNUM: DB '00000' ;ASCII FOR CURRENT LINE NUMBER ; ; DATA AREA ; DB 0FFH IBUF: DS 80H ;INPUT BUFFER DB 0FFH DS 380H DS 100 ;STACK AREA STACK: DS 2 FPB: DS 38 ;INPUT FPB END LISTER