Saturday Night Special Assembly Source


The article describing this program appears on a separate page.

Assembly Listing
; --------------------------
; 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

Previous | Contents | Next

Original text copyright 1984 by ANALOG Computing. Reprinted with permission by the Digital ANALOG Archive.