The article describing this program appears on a separate page.
; --------------------------
; THE SATURDAY NIGHT SPECIAL
; --------------------------
;
; The One Day Terminal Program!
;
; by Charles Bachand
;
; START--> opens capture buffer.
; SELECT-> saves buffer after
; requesting filename.
; TERM mode reentered
; if [RETURN] only!
;
; System Equates
; --------------
;
LMARGN = $52 ;left margin
COLOR4 = $02C8 ;border color
MEMTOP = $02E5 ;memory top pntr
BCOUNT = $02EB ;RS-232 buff cnt
CH = $02FC ;keyboard buffer
ICCOM = $0342 ;CIO command
ICBADR = $0344 ;CIO buff addr
ICBLEN = $0348 ;CIO buff len
ICAUX1 = $034A ;CIO aux byte 1
ICAUX2 = $034B ;CIO aux byte 2
CONSOL = $D01F ;console keys
CIOV = $E456 ;CIO vector
;
; Zero Page Variables
; -------------------
;
*= $80 ;page zero data
;
SAV *= *+1 ;download flag
ADDR *= *+2 ;memory pointer
;
; Program starts here
; -------------------
;
*= $2400 ;program here
SNS JSR KOPEN ;open keyboard
LDA #0 ;get zero
STA LMARGN ;40 column screen
REOPEN LDA #$74 ;blue
STA COLOR4 ;for background
JSR INITR ;init RS-232
LDX # <TMTX ;text addr lo
LDY # >TMTX ;text addr hi
JSR PRINT ;? "TERM MODE"
RSTAT LDX #$20 ;IOCB #2
LDA #13 ;status command
STA ICCOM,X ;CIO command byte
JSR CIOV ;STATUS #2
LDA BCOUNT ;buffer count
BEQ KCHECK ;empty? Yes.
JSR GET232 ;No. get byte
JMP RSTAT ;continue
KCHECK JSR READK ;check keys
JMP RSTAT
;
; Text Goes Here
; --------------
;
TMTX .BYTE "TERMINAL MODE",$9B
BFTX .BYTE "BUFFER FULL",$7D,$9B
SOTX .BYTE "SAVE BUFFER ON",$9B
SDTX .BYTE "SAVE DEVICE:"
KNAME .BYTE "K:",$9B
RNAME .BYTE "R:",$9B
;
; Text Printing Routine
; ---------------------
;
PRINT STX ICBADR ;text addr lo
STY ICBADR+1 ;text addr hi
LDX #0 ;IOCB #0
LDA #9 ;write record
STA ICCOM,X ;CIO command
STA ICBLEN+1,X ;large length
JMP CIOV ;print string
;
; Open keyboard for input
; -----------------------
;
KOPEN LDX #$10 ;use IOCB #1
LDA #12 ;close command
STA ICCOM,X ;CIO command byte
JSR CIOV ;CLOSE #1
LDA # <KNAME ;fname addr lo
STA ICBADR,X ;CIO buf addr lo
LDA # >KNAME ;fname addr hi
STA ICBADR+1,X ;cio buf addr hi
LDA #3 ;open command
STA ICCOM,X ;CIO command byte
LDA #4 ;for input
STA ICAUX1,X ;CIO aux byte #1
LDA #0
STA ICAUX2,X ;CIO aux byte #2
JMP CIOV ;OPEN #1,4,0,"K:"
;
; Close File #2
; -------------
;
CLOSE2 LDA #0 ;get zero
STA SAV ;clear SAVE flag
LDX #$20 ;use IOCB #2
LDA #12 ;close command
STA ICCOM,X ;CIO command byte
JMP CIOV ;CLOSE #2
;
; Initialize R: Device
; --------------------
;
; turn DTR line on
;
INITR JSR CLOSE2 ;CLOSE #2
LDA # <RNAME ;fname addr lo
STA ICBADR,X ;CIO addr lo
LDA # >RNAME ;fname addr hi
STA ICBADR+1,X ;CIO addr hi
LDA #34 ;special command
STA ICCOM,X ;CIO command
LDA #192 ;DTR on
STA ICAUX1,X ;CIO aux byte 1
JSR CIOV ;XIO 34,#2,192,0,"R:"
;
; Set for light translation
;
LDA #38 ;special command
STA ICCOM,X ;CIO command
LDA #0 ;light trans
STA ICAUX1,X ;CIO aux byte 1
JSR CIOV ;XIO 38,#2,0,0,"R:"
;
; Open "R:" for read/write mode
;
LDA #3 ;open command
STA ICCOM,X ;CIO command
LDA #13 ;read/write opt
STA ICAUX1,X ;CIO aux byte 1
JSR CIOV ;OPEN #2,13,0,"R:"
;
; Enable concurrent mode I/O
;
LDA #40 ;concurrent cmd
STA ICCOM,X ;CIO command
LDA #0 ;
STA ICAUX1,X ;CIO aux byte 1
JMP CIOV ;XIO 40,#2,0,0,"R:"
;
; Read RS-232 device
; ------------------
;
GET232 LDX #$20 ;IOCB #2
LDA #7 ;get char cmd
STA ICCOM,X ;CIO command
LDA #0 ;get zero
STA ICBLEN,X ;CIO length lo
STA ICBLEN+1,X ;CIO length hi
JSR CIOV ;GET #2,CHAR
CMP #8 ;ASCII BS?
BNE NOBS ;No. skip
LDA #126 ;make ATASCII BS
NOBS CMP #32 ;Yes. char<32?
BCS CFLAG ;Yes. ignore it
RTS
CFLAG LDX SAV ;get sav flag
PHA ;save Acc
BEQ NOPOKE ;download? No.
BMI NOPOKE ;buffer full?
LDY #0 ;No. zero offset
STA (ADDR),Y ;save byte
INC ADDR ;pointer lo
BNE NCARRY ;overflow? No.
INC ADDR+1 ;pointer hi
NCARRY LDA ADDR+1 ;compare pntr hi
CMP MEMTOP+1 ;with MEMTOP hi
BNE NOPOKE ;same? No.
LDA ADDR ;compare pntr lo
CMP MEMTOP ;with MEMTOP lo
BNE NOPOKE ;same? No.
LDA #$FF ;buff full flag
STA SAV ;set flag
LDX # <BFTX ;text lo
LDY # >BFTX ;text hi
JSR PRINT ;? "BUFFER FULL"
NOPOKE LDX #0 ;IOCB #0
LDA #11 ;put char cmd
STA ICCOM,X ;CIO command
TXA ;get zero
STA ICBLEN,X ;CIO length lo
STA ICBLEN+1,X ;CIO length hi
PLA ;restore Acc
JMP CIOV ;print char
;
; Read keyboard and console
; -------------------------
;
READK LDA CH ;keyboard buffer
CMP #$FF ;key pressed?
BEQ CHKCON ;No. skip next
LDX #$10 ;IOCB #1
LDA #0 ;get zero
STA ICBLEN,X ;CIO buff len lo
STA ICBLEN+1,X ;CIO buf len hi
LDA #7 ;get char
STA ICCOM,X ;CIO command
JSR CIOV ;read keyboard
CMP #126 ;ATASCII BS?
BNE NOABS ;No. skip
LDA #8 ;make ASCII BS
NOABS LDX #$20 ;IOCB #2
PHA ;save Acc
LDA #0 ;get zero
STA ICBLEN,X ;CIO buf len lo
STA ICBLEN+1,X ;CIO buf len hi
LDA #11 ;put char
STA ICCOM,X ;CIO command
PLA ;restore Acc
JSR CIOV ;write RS-232
CXIT RTS ;return
CHKCON LDA CONSOL ;console keys
CMP #7 ;any pressed?
BEQ CXIT ;No. return
CMP #6 ;START key?
BNE TRY5 ;No. skip next
LDX SAV ;save buffer on?
BNE TRY5 ;Yes. skip next
INC SAV ;No. turn it on
LDA # <BUFF ;buffer addr lo
STA ADDR ;buffer pntr lo
LDA # >BUFF ;buffer addr hi
STA ADDR+1 ;buffer pntr hi
LDA #$24 ;dark orange
STA COLOR4 ;border color
LDX # <SOTX ;text addr lo
LDY # >SOTX ;text addr hi
JMP PRINT ;? "SAVE BUFFER ON"
TRY5 CMP #5 ;OPTION pressed?
BNE CXIT ;No. return
LDA SAV ;buffer on?
BEQ CXIT ;No. return
FNTRAP JSR CLOSE2 ;CLOSE #2
LDX #0 ;IOCB #0
LDA # <SDTX ;text addr lo
STA ICBADR,X ;CIO addr lo
LDA # >SDTX ;text addr hi
STA ICBADR+1,X ;CIO addr hi
LDA #12 ;message length
STA ICBLEN,X ;CIO length lo
LDA #0 ;get zero
STA ICBLEN+1,X ;CIO length hi
LDA #11 ;put characters
STA ICCOM,X ;CIO command
JSR CIOV ;? "SAVE DEVICE?";
LDA #5 ;get record
STA ICCOM,X ;CIO command
LDA #20 ;20 char max
STA ICBLEN,X ;CIO length lo
TXA ;get zero
STA ICBLEN+1,X ;CIO length hi
LDA # <FNAME ;filename area lo
STA ICBADR,X ;CIO addr lo
LDA # >FNAME ;filename area hi
STA ICBADR+1,X ;CIO addr hi
JSR CIOV ;get filename
LDA FNAME
CMP #$9B ;carriage return?
BNE FILSAV ;No. try to save
PLA ;pop return lo
PLA ;pop return hi
JMP REOPEN ;continue
FILSAV LDX #$20 ;IOCB #2
LDA #3 ;OPEN file cmd
STA ICCOM,X ;CIO command
LDA # <FNAME ;name addr lo
STA ICBADR,X ;CIO addr lo
LDA # >FNAME ;name addr hi
STA ICBADR+1,X ;CIO addr hi
LDA #8 ;for output
STA ICAUX1,X ;CIO aux byte 1
LDA #0 ;get zero
STA ICAUX2,X ;CIO aux byte 2
JSR CIOV ;open file
BMI FNTRAP ;error? Yes.
LDY #0 ;zero offset
LDA #$9B ;carriage return
STA (ADDR),Y ;at end of file
INC ADDR ;pointer lo
BNE SKIPHI ;overflow? No.
INC ADDR+1 ;Yes. pointer hi
SKIPHI LDA #11 ;put characters
STA ICCOM,X ;CIO command
LDA # <BUFF ;file buffer lo
STA ICBADR,X ;CIO buf addr lo
LDA # >BUFF ;file buffer hi
STA ICBADR+1,X ;CIO buf addr hi
SEC ;set carry
LDA ADDR ;end of file lo
SBC # <BUFF ;beginning lo
STA ICBLEN,X ;CIO length lo
LDA ADDR+1 ;end of file hi
SBC # >BUFF ;beginning hi
STA ICBLEN+1,X ;CIO length hi
JSR CIOV ;write file
BMI TRAP2 ;bad write? Yes.
JMP REOPEN ;done
TRAP2 JMP FNTRAP ;retry
;
FNAME *= *+20 ;filename buffer
BUFF *= *+1 ;capture buffer
;
; SET UP PROGRAM RUN ADDRESS
;
*= $02E0 ;DOS run address
.WORD SNS ;run addr data
;
.END