Thread View: net.micro.atari
1 messages
1 total messages
Started by ModemUserGroupChairman
Sun, 22 Sep 1985 00:48
Alterm.s (source) for the ST.
Author: ModemUserGroupChairman
Date: Sun, 22 Sep 1985 00:48
Date: Sun, 22 Sep 1985 00:48
511 lines
12542 bytes
12542 bytes
Don't flame me for posting here; the issue is debatable.
Compile and enjoy.
This program has some simple ascii capture facilites that
the DA does not have.
--------------- Snip Snip here here ----------------------------------
.TEXT
* =============================================================================
* TERMINAL PROGRAM FOR ST WITH DISK CAPTURE AND FILE SEND
* By Alan Page - August 1985
* Public Domain
* NOTE: THE AUTHOR IS NOT RESPONSIBLE FOR ANY BUGS OR MALFUNCTIONS THAT MAY
* EXIST IN THIS PROGRAM OR ANY LOSS OF DATA THAT MAY RESULT FROM
* SUCH MALFUNCTIONS.
* =============================================================================
* ADMITTEDLY A SLOPPY LOOKING LISTING
* BUT WHAT THE HECK, IT WORKS, AND AS SOON AS
* A DECENT COMMERCIAL PROGRAM IS AVAILABLE, INTO THE TRASH IT GOES!
* -----------------------------------------------------------------------------
* CHANGE NAME TO TERM.S BEFORE ASSEMBLING
* ASSEMBLE WITH AS68 -L -P TERM.S
* LINK WITH LO68 -R -O TERM.68K TERM.O
* THEN RELMOD TERM.68K TERM.TOS
MOVE.L A7,A5 * CODE FROM APSTART.S
MOVE.L #USTK,A7
MOVE.L 4(A5),A5
MOVE.L $C(A5),D0
ADD.L $14(A5),D0
ADD.L $1C(A5),D0
ADD.L #$100,D0
MOVE.L D0,-(SP)
MOVE.L A5,-(SP)
MOVE D0,-(SP)
MOVE #$4A,-(SP)
TRAP #1
ADD.L #12,SP
MOVE.B #$1B,D3 * ESC,$76 SETS UP LINEWRAP ON CONSOLE
BSR SHOWBYTE * SHOWS BYTE ON SCREEN
MOVE.B #$76,D3
BSR SHOWBYTE
LEA HELLO,A0
BSR PSTRING
MOVE.B #0,FLAG * SET ALL FLAGS TO ZERO
MOVE.W #7,D0 * 1200 BAUD DEFAULT
MOVE.W #7,BAUD
BSR SETBAUD
LEA BAUD12,A0
BSR PSTRING
TOP: BSR CKSER * SERIAL STATUS
CMP.W #$FFFF,D0
BNE NOFILE
BSR GETSER * GET A SERIAL BYTE
MOVE.W D0,D3
ANDI.W #$7F,D3 * STRIP 8 TH BIT
BSR SHOWBYTE * THEN SHOW BYTE ON CONSOLE (IN D3)
* BTST #0,FLAG * IS PFLAG SET?
* BEQ NOPRINT
* BSR PRNT * PRINTER OUTPUT
* NOPRINT: * SEE IF FILE OUTPUT
BTST #1,FLAG
BEQ NOFILE
* D3 CONTAINS BYTE TO OUTPUT
* DOESN'T SEND MOST CONTROL CHARACTERS TO FILE
* FOR NEATER DOWNLOADS. OMIT IF YOU WISH
CMP.B #$20,D3
BGE NOCTL2
MULU #2,D3
LEA PTABLE,A0
MOVE.W #0(A0,D3.W),D0
MOVE.W D0,D3
NOCTL2: CMP.B #0,D3 * NO NULLS TO FILE
BEQ NOFILE
LEA BUFFER,A0
MOVE.W BUFFCOUNT,D0 * D0 CONTAINS # OF BYTES IN BUFFER
MOVE.B D3,#0(A0,D0.W)
ADD.W #1,D0
MOVE.W D0,BUFFCOUNT
CMP.W #32000,D0 * IF BUFFER FULL, SEND IT TO FILE
BNE NOFILE
EXT.L D0
BSR SENDBF
NOFILE: BSR CKKB * SEE IF KEYPRESS
CMP.W #$FFFF,D0
BNE TOP
BSR GETKB * GET KEYPRESS
* F1 TOGGLE BAUD RATE
CMP.B #$3B,D0
BNE NOFN1
CMPI.W #9,BAUD
BEQ SPEEDUP
LEA BAUD3,A0
BSR PSTRING
MOVE.W #9,D0
MOVE.W D0,BAUD
BSR SETBAUD
BRA TOP
SPEEDUP:
LEA BAUD12,A0
BSR PSTRING
MOVE.W #7,D0
MOVE.W D0,BAUD
BSR SETBAUD
BRA TOP
* F2 FILE CAPTURE TOGGLE FUNCTION
NOFN1: CMP.B #$3C,D0
BNE NOFN2
BTST #2,FLAG * FILE OPEN?
BNE OKFL
LEA FERROR,A0
BSR PSTRING
BRA TOP * IF FILE NOT OPEN, NO ACTION
OKFL: BCHG #1,FLAG * TOGGLE FLAG
BNE DOFF
LEA STARTF,A0
BSR PSTRING
BRA TOP
DOFF: LEA STOPF,A0
BSR PSTRING
BRA TOP
* UNDO TO EXIT
NOFN2: CMP.B #$61,D0
BNE NOUNDO
BTST #2,FLAG * SEE IF FILE EXISTS TO BE CLOSED
BEQ EXIT
BSR FILEND * OUTPUT LAST OF BUFFER AND CLOSE FILE
EXIT: MOVE.W #0,-(SP)
TRAP #1
* F3 = CREATE AND OPEN FILE FOR INPUT
NOUNDO: CMP.B #$3D,D0
BNE NOFN3
BTST #2,FLAG
BEQ NOTMADE
* A FILE ALREADY EXISTS, CLOSE IT AND CREATE ANOTHER
BSR FILEND
NOTMADE: * ZERO COUNT OF BYTES IN BUFFER
MOVE.W #0,BUFFCOUNT
MOVE.L #0,FPTR
LEA PROMPT,A0
BSR PSTRING
BSR GETFN * GET FILENAME
BSR OPENFR * OPEN IT TO SEE IF ALREADY EXISTS
TST.L D0
BMI NXT1 * DOESN'T EXIST
MOVE.W D0,FHNDL3
LEA WARN,A0
BSR PSTRING
BSR YESNO * ASK IF FILE TO BE DESTROYED BY (RE)CREATION
BRA TOP
NXT1: BSR FILECR * CREATE FILE
TST.L D0
BPL CONTF * IF ERROR IN CREATION, DON'T OPEN FILE, EXIT
BRA TOP
CONTF: BSR OPENFW
TST.L D0
BPL SAVEFH
LEA FERROR2,A0
BSR PSTRING
BRA TOP
SAVEFH: MOVE.W D0,FHNDLE
BSET #2,FLAG
LEA OKMSG,A0
BSR PSTRING
BRA TOP
* F4 GET FILENAME FOR FILE TO BE OUTPUT
NOFN3: CMP.B #$3E,D0
BNE NOFN4
BTST #4,FLAG * IF FILE EXISTS AND HASN'T BEEN SENT POST ERROR3
BEQ OKFL4
LEA FERR3,A0
BSR PSTRING
BRA TOP
OKFL4: LEA PROMPT2,A0
BSR PSTRING
BSR GETFN
BSR OPENFR
TST.L D0
BPL SAVFH2
LEA FERROR2,A0
BSR PSTRING
BRA TOP
SAVFH2: MOVE.W D0,FHNDL2
BSET #4,FLAG
LEA OKMSG2,A0
BSR PSTRING
BRA TOP
* F5 SEND A FILE OUT SERIAL PORT
NOFN4: CMP.B #$3F,D0
BNE NOFN5
BTST #4,FLAG * SEE IF FILE EXISTS TO BE SENT
BNE OKF4
LEA FERROR,A0
BSR PSTRING
BRA TOP
* START SENDING BYTES
OKF4: LEA STARTU,A0
BSR PSTRING
LOOP4: PEA TEMP
MOVE.L #1,-(SP)
MOVE.W FHNDL2,-(SP)
MOVE.W #$3F,-(SP)
TRAP #1
ADDA.L #12,SP
* DID NOT RECEIVE A BYTE IF D0 = 0
* IF NO BYTE RECEIVED, THEN IS EOF.
* SEND RECEIVING COMPUTER AN EOF
CMP.B #0,D0
BEQ ABORT
MOVE.B TEMP,D3
CMP.B #$0A,D3
BNE NOLF
CMP.B #$0D,TEMP2 * CURRENT CHAR IS LF FOLLOWING CR
BNE NOLF * THIS WILL NOT BE SENT
BTST #5,FLAG
BNE CRNOLF *IF SET, WILL NOT SEND LF AFTER CR
NOLF: BSR SENDSR
CRNOLF: BSR CKSER
CMP.W #$FFFF,D0
BNE NOSERL
BSR GETSER
MOVE.W D0,D3
ANDI.W #$7F,D3
BSR SHOWBYTE
NOSERL: BSR CKKB
CMP.W #$FFFF,D0
BNE NOKB
BSR GETKB
* CONTROL-Z ABORTS FILE TRANSFER (AND SENDS CONTROL-Z TO RECEIVING END)
CMP.B #$1A,D3
BEQ SSR
NOKB: MOVE.B TEMP,D3
MOVE.B D3,TEMP2
CMP.B #$1A,D3
BEQ SSR
CMP.B #0,D3
BNE LOOP4
ABORT: CMP.B #$1A,TEMP2
BEQ SSR
MOVE.B #$1A,D3
SSR: BSR SENDSR
MOVE.W FHNDL2,-(SP)
MOVE.W #$3E,-(SP)
TRAP #1
ADDA.L #4,SP
BCLR #4,FLAG
LEA STOPU,A0
BSR PSTRING
BRA TOP
* F6 TOGGLE DUPLEX
NOFN5: CMP.B #$40,D0
BNE NOFN6
BCHG #3,FLAG
BRA TOP
* F7 TOGGLES LF AFTER CR FOR FILE UPLOADS
NOFN6: CMP.B #$41,D0
BNE NOFN7
BCHG #5,FLAG
BEQ LFOFF
LEA MLFON,A0
BSR PSTRING
BRA TOP
LFOFF LEA MLFOFF,A0
BSR PSTRING
BRA TOP
* HELP
NOFN7: CMP.B #$62,D0
BNE NOHELP
LEA HELP,A0
BSR PSTRING
BRA TOP
NOHELP: CMP.W #0,D3
BEQ TOP
BSR SENDSR * SEND KEYPRESS TO SERIAL
BTST #3,FLAG * IF HALP DUPLEX, SHOW KEYPRESS
BEQ TOP
BSR SHOWBYTE
BRA TOP
* NOT SURE WHY, BUT HAVE TO SET FILE POINTER
SENDBF: MOVE.W D0,D5
BSR XOFF
CLR.W -(SP)
MOVE.W FHNDLE,-(SP)
MOVE.L FPTR,-(SP)
MOVE.W #$42,-(SP)
TRAP #1
ADDA.L #10,SP
PEA BUFFER
* MUST HAVE # OF BYTES TO TRANSFER IN D0
MOVE.W D5,D0
MOVE.L D0,-(SP)
MOVE.W FHNDLE,-(SP)
MOVE.W #$40,-(SP)
TRAP #1
ADDA.L #12,SP
MOVE.W #0,BUFFCOUNT
ADD.L D0,FPTR
BSR XON
RTS
* SEND A SERIAL BYTE (IN D3)
SENDSR: MOVE.W D3,-(SP)
MOVE.W #1,-(SP)
MOVE.W #3,-(SP)
TRAP #$D
ADDQ.L #6,SP
RTS
PSTRING: * SEND A STRING TO CONSOLE
MOVE.L A0,-(SP)
MOVE.W #9,-(SP)
TRAP #1
ADDQ.L #6,SP
RTS
SHOWBYTE: * EXPECTS BYTE TO DISPLAY IN D3
MOVE.W D3,-(A7)
MOVE.W #2,-(A7)
MOVE.W #3,-(A7)
TRAP #$D
ADDQ.L #6,A7
RTS
* GET KEYBOARD STATUS
CKKB: MOVE.W #2,-(A7)
MOVE.W #1,-(A7)
TRAP #$D
ADDQ.L #4,A7
RTS
* GET KEYCODE
GETKB: MOVE.W #2,-(A7)
MOVE.W #2,-(A7)
TRAP #$D
ADDQ.L #$4,A7
MOVE.W D0,D3
SWAP D0
RTS
* TRAP TO GET SERIAL STATUS
CKSER: MOVE.W #1,-(A7)
MOVE.W #1,-(A7)
TRAP #$D
ADDQ.L #4,A7
RTS
* TRAP TO GET SERIAL BYTE
GETSER: MOVE.W #1,-(A7)
MOVE.W #2,-(A7)
TRAP #$D
ADDQ.L #4,A7
RTS
* GET FILE NAME IN FNBUFF
GETFN: PEA FNBUFF
MOVE.W #$A,-(SP)
TRAP #1
ADDA.L #6,SP
LEA FNBUFF,A0
CLR.B #2(A0,D0.W) * PUT ZERO AT END OF FILENAME
RTS
YESNO: BSR CKKB
CMP.W #$FFFF,D0
BNE YESNO
BSR GETKB
BSR SHOWBYTE
CMP.B #$59,D3
BEQ NXT1
MOVE.W FHNDL3,-(SP)
MOVE.W #$3E,-(SP)
TRAP #1
ADDA.L #4,SP
RTS
* SUBR TO CREATE A FILE - NAME IN FNBUFF
FILECR: MOVE.W #0,-(SP)
PEA FNBUFF+2
MOVE.W #$3C,-(SP)
TRAP #1
ADDA.L #8,SP
TST.L D0
BPL NOERR
LEA FERROR2,A0
BSR PSTRING
NOERR: RTS
* SUBROUTINE TO SEND BYTE TO PRINTER
* NOTE: THIS TRAPS CONTROL BYTES
* CHECK FOR A CONTROL BYTE < $20
* AT PRESENT NOT USED (NO GOOD AT 1200 BAUD)
PRNT: CMP.B #$20,D3
BGE NOCTL
MULU #2,D3 * MULTIPLY * 2 SINCE TABLE IS IN WORDS
LEA PTABLE,A0
MOVE.W #0(A0,D3.W),D0 * SUBSTITUE A NEW VALUE FOR PRINTER
MOVE.W D0,D3
NOCTL: CMP.B #0,D3
BEQ NONULL * DON'T BOTHER SENDING NULLS TO PRINTER
PRSTATUS: * GET PRINTER STATUS AND LOOP UNTIL READY
MOVE.W #0,-(A7)
MOVE.W #1,-(A7)
TRAP #$D
ADDQ.L #4,A7
CMP.W #$FFFF,D0
BEQ PRSTATUS
* PRINT THE BYTE
MOVE.W D3,-(A7)
MOVE.W #0,-(A7)
MOVE.W #3,-(A7)
TRAP #$D
ADDQ.L #6,A7
NONULL: RTS
XOFF MOVEM.L D0-D3/A0-A3,-(SP)
MOVE.B #$13,D3
BSR SENDSR
MOVEM.L (SP)+,D0-D3/A0-A3
RTS
XON MOVEM.L D0-D3/A0-A3,-(SP)
MOVE.B #$11,D3
BSR SENDSR
MOVEM.L (SP)+,D0-D3/A0-A3
RTS
OPENFR: MOVE.W #0,-(SP) * OPEN FILE - READ ONLY
PEA FNBUFF+2
MOVE.W #$3D,-(SP)
TRAP #1
ADDA.L #8,SP
RTS
* OPEN A FILE FOR WRITING
OPENFW: MOVE.W #1,-(SP) * WRITE ONLY
PEA FNBUFF+2
MOVE.W #$3D,-(SP)
TRAP #1
ADDA.L #8,SP * ROUTINE TO PROPERLY CLOSE FILE
RTS
* DUMP PARTIAL BUFFER
FILEND: LEA BUFFCOUNT,A1
LEA BUFFER,A0
MOVE.W (A1),D0
MOVE.B #$1A,D3 * PUT EOF MARKER
MOVE.B D3,#0(A0,D0.W)
ADD.W #1,D0
MOVE.W D0,BUFFCOUNT
EXT.L D0
BSR SENDBF
* CLOSE FILE BEFORE EXITING
CLOSED: MOVE.W #$0D,-(SP) * FUNCTION NUMBER FOR RESET DISK
TRAP #1
ADDA.L #2,SP
RTS
SETBAUD:
MOVE.W #-1,-(A7)
MOVE.W #-1,-(A7)
MOVE.W #-1,-(A7)
MOVE.W #-1,-(A7)
MOVE.W #-1,-(A7)
MOVE.W D0,-(A7)
MOVE.W #15,-(A7)
TRAP #14
ADDA.L #14,A7
RTS
* ESC CODE SUBSTITUTION TABLE
.DATA
EVEN
PTABLE: DC.W 0,0,0,0,0,0,0,0,127,9,10,10,10,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
* MESSAGE SECTION
HELLO: DC.B ' * * * TERMINAL PROGRAM WITH ASCII DOWNLOAD/UPLOAD * * *',$0D,$0A
DC.B ' * * * PUBLIC DOMAIN. By Alan Page - August 1985 * * * ',$0D,$0A
DC.B ' * * * PRESS "HELP" FOR FUNCTION KEY DEFINITIONS * * * ',$0D,$0A
DC.B ' * * * PRESS "UNDO" TO EXIT TO DESKTOP * * * ',$0D,$0A,0
HELP: DC.B $0D,$0A,'<F1> = TOGGLE 300/1200 BAUD <F2> = TOGGLE CAPTURE <F3> = CREATE CAPTURE FILE',$0D,$0A
DC.B '<F4> = OPEN UPLOAD FILE <F5> = UPLOAD TEXT FILE <F6> = TOGGLE DUPLEX',$0D,$0A
DC.B '<F7> = TOGGLES LF AFTER CR RETURN (UPLOADS ONLY) ',$0D,$0A,0
WARN: DC.B $0D,$0A,' * * * THIS FILE ALREADY EXISTS, OPENING IT FOR DOu.LOAD WILL DESTROY IT * * * ',$0D,$0A
DC.B ' PRESS <Y> TO PROCEED, ANY OTHER KEY ABORTS > ',0
STARTF: DC.B $0D,$0A,' * * * START DISK CAPTURE * * * ',$0D,$0A,0
STOPF: DC.B $0D,$0A,' * * * STOP DISK CAPTURE * * * ',$0D,$0A,0
STARTU: DC.B $0D,$0A,' * * * STARTING FILE UPLOAD * * * ',$0D,$0A,0
STOPU: DC.B $0D,$0A,' * * * UPLOAD COMPLETE * * * ',$0D,$0A,0
MLFON: DC.B $0D,$0A,' * * * LF SENT AFTER CR (DURING UPLOADS) * * * ',$0D,$0A,0
MLFOFF: DC.B $0D,$0A,' * * * LF NOT SENT AFTER CR (DURING UPLOADS) * * * ',$0D,$0A,0
FERROR: DC.B $0D,$0A,' * * * FILE NOT OPEN * * * ',$0D,$0A,0
FERROR2: DC.B $0D,$0A,' * * * TOS FILE ERROR * * * ',$0D,$0A,0
FERR3: DC.B $0D,$0A,' * * * AN OUTPUT FILE ALREADY EXISTS! * * * ',$0D,$0A,0
PROMPT: DC.B $0D,$0A,'ENTER FILE NAME (FOR DISK CAPTURE) > ',0
PROMPT2: DC.B $0D,$0A,'ENTER FILE NAME (TO BE TRANSMITTED) > ',0
OKMSG: DC.B $0D,$0A,' * * * FILE CREATED * * * ',$0D,$0A,0
OKMSG2: DC.B $0D,$0A,' * * * FILE OPENED FOR OUTPUT * * * ',$0D,$0A,0
BAUD12: DC.B $0D,$0A,' * * * 1200 BAUD * * * ',$0D,$0A,0
BAUD3: DC.B $0D,$0A,' * * * 300 BAUD * * * ',$0D,$0A,0
FLAG: DC.B 0
EVEN
BAUD: DC.B 7
FPTR: DC.L 0
FHNDLE: DS.W 1
FHNDL2: DS.W 1
FHNDL3: DS.W 1
BUFFCOUNT: DC.W 0
FNBUFF: DC.B 80,0
DS.B 80
EVEN
TEMP: DS.W 1
TEMP2 DS.W 1
.BSS
EVEN
DS.L 256
USTK DS.L 1
BUFFER: DS.B 32000
.END
--------------------------------------------------------------------
--
Anees Munshi
{allegra,ihnp4,linus,decvax}!utzoo!utcsri!utecfa!mugc
{ihnp4|decvax|utzoo|utcsri}!utecfa!mugc
Subject: Subject: Terminal prg for ST (assembler source, long)
Newsgroups: Newsgroups: net.micro.atari
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads