$PRINT(:LP:) PAGELENGTH(66) XREF DEBUG ; ; LLL BASIC INTERPRETER - LIST MODULE ; NAME BASIC6 ; REVISED CHARLES CHERNACK 12/22/77 EXTRN CLOSE ; FILE CLOSE ROUTINE FOR EXTRN ICE80 ; CHECK TO SEE IF IN ICE80/DEBUG MODE EXTRN OPEN ; FILE OPEN ROUTINE FOR EXTRN READY ; ENTRY POINT FOR EXTRN STLINE ; => FIRST LINE OF USER PROGRAM PUBLIC CRLF ; PRINT ON OUTPUT DEVICE PUBLIC EXIT ; RETURN TO PUBLIC HELP ; PRINT MESSAGE ON :CO: PUBLIC LIST ; LIST PROGRAM ON :CO: PUBLIC PRINT ; PRINT ON :CO: PUBLIC QUITT ; UNDER ICE80 - QUIT IF SPACE BAR HIT CI EQU 0F803H ; MONITOR SUBROUTINE CO EQU 0F809H ; MONITOR SUBROUTINE CSTS EQU 0F812H ; MONITOR SUBROUTINE ISIS EQU 40H ; ISIS SYSTEM CALLS CSEG $EJECT TITLE('BASIC LIST MODULE 12/22/77') ; PROCESS AND COMMANDS EXIT: MVI C,9 ; 9 = EXIT LXI D,OBLK CALL ISIS OBLK: DW OAFT OAFT: DS 2 HELP: LXI H,MSG1 ; CALL PRINT JMP READY ; PROCESS LIST [:FN:XXXXXX.XXX] ; LIST: CALL ICE80 ; IF JMP LIST0 ; THEN -- USE :CO: MVI A,2 ; FILE TO BE WRITE-ONLY CALL OPEN ; IF JMP LIST0 ; THEN -- USE :CO: OR ISIS CALL SHLD WAFT ; WAFT <= AFT OF FILE OPENED $EJECT LIST0: LHLD STLINE ; HL => FIRST LINE TO LST SHLD PLINE ; PLINE => FIRST LINE TO LIST INX H ; IF = <0FFFFH> MOV A,H ORA L JZ READY ; THEN <'READY'> LHLD PLINE LIST1: INX H INX H ; SKIP 16-BIT BINARY LINE NUMBER MOV C,M INX H MOV B,M PUSH B ; PUSH BC => NEXT LINE BASE ADDRESS INX H ; HL => CALL PRINT CALL CRLF CALL QUITT ; IF <' '> THEN <'STOP'/'READY'> POP H ; HL => NEXT LINE BASE ADDRESS MOV A,H ; IF .NE. <0FFH> CPI 0FFH JNZ LIST1 ; THEN - CONTINUE CALL CRLF ; ELSE LIST2: CALL CLOSE ; CLOSE ANY OPEN FILE XRA A STA WAFT ; RESET WAFT <= 0 <:CO:> JMP READY ; AND RETURN TO <'READY'> $EJECT PRINT: CALL ICE80 ; IF JMP PRINT0 ; THEN JMP IPRINT ; ELSE -- USE ISIS CALL PRINT0: MOV D,M PRINT1: INX H MOV C,M CALL CO DCR D JNZ PRINT1 RET CRLF: LXI H,MSG3 ; CALL PRINT RET QUITT: CALL CSTS ; IF ORA A RZ ; THEN CALL CI ; IF THE CHARACTER .NE. <' '> ANI 7FH CPI ' ' RNZ ; THEN LXI H,MSG2 ; <'STOP',CR,LF> CALL PRINT JMP LIST2 ; AND GOTO <'READY'> AFTER RESET OF $EJECT ; - PRINT TO :CO: ; LXI H,MSG ; CALL PRINT ; ; ;MSG: DB N,'...N-CHARS...' ; ; ; IPRINT: MOV A,M ; CHARACTER COUNT IN A STA WCNT ; WCNT = CHARACTER COUNT INX H ; HL => MESSAGE SHLD WPTR ; WPTR => MESSAGE ; MVI C,4 ; <4> = WRITE LXI D,WAFT ; ADDRESS OF PARAMETER BLOCK CALL ISIS RET WAFT: DW 0 ; FILE AFTN WPTR: DW 0 ; ADDRESS OF OUTPUT BUFFER WCNT: DW 0 ; LENGTH OF OUTPUT BUFFER DW STAT ; POINTER TO WRITE STATUS STAT: DS 2 $EJECT ; AND CR EQU 0DH LF EQU 0AH PLINE: DW 0 MSG1: DB MSG2-MSG1-1,CR,LF DB 'EXIT',CR,LF DB 'HELP',CR,LF DB 'LIST [:FN:XXXXXX.XXX]',CR,LF DB 'LOAD :FN:XXXXXX.XXX',CR,LF DB 'RUN',CR,LF DB 'SCR',CR,LF MSG2: DB 8,CR,LF,'STOP',CR,LF MSG3: DB 2,CR,LF END