home *** CD-ROM | disk | FTP | other *** search
- MACRO-80 3.43 27-Jul-81 PAGE 1
-
-
-
- .Z80 ;This source is for M80.COM!
- ORG 00100H
-
- ;
- ; Equates for ASCII control chars
- ;
-
- 0000 NUL EQU 000H
- 0001 SOH EQU 001H
- 0002 STX EQU 002H
- 0003 ETX EQU 003H
- 0004 EOT EQU 004H
- 0005 ENQ EQU 005H
- 0006 ACK EQU 006H
- 0007 BEL EQU 007H
- 0008 BS EQU 008H
- 0009 TAB EQU 009H
- 000A LF EQU 00AH
- 000B VT EQU 00BH
- 000C FF EQU 00CH
- 000D CR EQU 00DH
- 000E SO EQU 00EH
- 000F SI EQU 00FH
- 0010 DLE EQU 010H
- 0011 XON EQU 011H
- 0012 DC2 EQU 012H
- 0013 XOFF EQU 013H
- 0014 DC4 EQU 014H
- 0015 NAK EQU 015H
- 0016 SYN EQU 016H
- 0017 ETB EQU 017H
- 0018 CAN EQU 018H
- 0019 EM EQU 019H
- 001A SUB EQU 01AH
- 001B ESC EQU 01BH
- 001C FS EQU 01CH
- 001D GS EQU 01DH
- 001E RS EQU 01EH
- 001F US EQU 01FH
-
- ;
- ; External ref equates
- ;
-
- 0000 IOPORT00H EQU 00000H
- 0005 BDOS EQU 00005H
- 0006 IOPORT06H EQU 00006H
-
- ;
- ; End of external equates
- ;
-
-
- 0100' STARTUP:
- 0100' 11 0245' LD DE,INIT_MSG ;Give intro screen
- MACRO-80 3.43 27-Jul-81 PAGE 1-1
-
-
- 0103' CD 0240' CALL PRINT_STRING
-
- 0106' GET_BAUD_RATE:
- 0106' 11 02C8' LD DE,BAUD_PROMPT ;Ask for baudrate value
- 0109' CD 0240' CALL PRINT_STRING
- 010C' CD 0235' CALL GET_BDOS_KEYPRESS
- 010F' FE 0D CP CR ;RETURN only?
- 0111' C2 0116' JP NZ,EDIT_BAUD_RATE ;No, look at keypress
- 0114' 3E 36 LD A,'6' ;Yes, use default value
-
- 0116' EDIT_BAUD_RATE:
- 0116' D6 30 SUB '0' ;Make into binary 0-9
- 0118' FE 00 CP NUL ;Legal choice?
- 011A' DA 0106' JP C,GET_BAUD_RATE ;No, try again
- 011D' FE 0A CP LF
- 011F' D2 0106' JP NC,GET_BAUD_RATE ;Likewise no, try again
- 0122' 32 0358' LD (BAUD_RATE),A ;Yes, save it as binary value
-
- 0125' GET_PARITY_CHOICE:
- 0125' 11 02EF' LD DE,PARITY_PROMPT ;Give him parity choices
- 0128' CD 0240' CALL PRINT_STRING
- 012B' CD 0235' CALL GET_BDOS_KEYPRESS ;Get his response
- 012E' FE 0D CP CR ;RETURN only?
- 0130' C2 0135' JP NZ,EDIT_PARITY_VALUE ;No, edit it
- 0133' 3E 4E LD A,'N' ;Yes, use default
-
- 0135' EDIT_PARITY_VALUE:
- 0135' FE 45 CP 'E' ;Even parity?
- 0137' CA 0147' JP Z,PARITY_IS_LEGAL ;Yes, legal
- 013A' FE 4F CP 'O' ;Odd parity?
- 013C' CA 0147' JP Z,PARITY_IS_LEGAL ;Yes, legal
- 013F' FE 4E CP 'N' ;No parity?
- 0141' CA 0147' JP Z,PARITY_IS_LEGAL ;Yes, legal
- 0144' C3 0125' JP GET_PARITY_CHOICE ;Not legal, so ask again
-
- 0147' PARITY_IS_LEGAL:
- 0147' 32 035A' LD (PARITY_CHOICE),A ;Save parity selection as ASCII
-
- 014A' GET_DATABITS_CHOICE:
- 014A' 11 0316' LD DE,DATABITS_PROMPT ;Give Databits prompt
- 014D' CD 0240' CALL PRINT_STRING
- 0150' CD 0235' CALL GET_BDOS_KEYPRESS ;Get response
- 0153' FE 0D CP CR ;RETURN only?
- 0155' C2 015A' JP NZ,EDIT_DATABITS_VALUE ;No, use it
- 0158' 3E 38 LD A,'8' ;Yes, use default
-
- 015A' EDIT_DATABITS_VALUE:
- 015A' D6 30 SUB '0' ;Make into binary 0 thru 8
- 015C' FE 07 CP BEL ;Legal choice?
- 015E' CA 0169' JP Z,DATABITS_ARE_LEGAL ;Yes, use it
- 0161' FE 08 CP BS
- 0163' CA 0169' JP Z,DATABITS_ARE_LEGAL ;Yes, use it
- 0166' C3 014A' JP GET_DATABITS_CHOICE ;No, try again
-
- 0169' DATABITS_ARE_LEGAL:
- 0169' 32 0359' LD (DATABITS),A ;Save binary databits value
- MACRO-80 3.43 27-Jul-81 PAGE 1-2
-
-
-
- ;
- ; Now convert baudrate choice to binary timer value
- ;
- 016C' 3A 0358' LD A,(BAUD_RATE)
- 016F' FE 00 CP NUL ;19.2 Kbaud?
- 0171' C2 0179' JP NZ,TRY_9600_BAUD ;No
- 0174' 3E 0F LD A,SI ;Yes, use timer value for 19.2 Kbaud
- 0176' C3 01B7' JP DONE_EDITING_BAUD
-
- 0179' TRY_9600_BAUD:
- 0179' FE 01 CP SOH ;9600 baud?
- 017B' C2 0183' JP NZ,TRY_4800_BAUD ;No
- 017E' 3E 0E LD A,SO ;Yes, use timer value for 9600 baud
- 0180' C3 01B7' JP DONE_EDITING_BAUD
-
- 0183' TRY_4800_BAUD:
- 0183' FE 02 CP STX ;4800 baud?
- 0185' C2 018D' JP NZ,TRY_2400_BAUD ;No
- 0188' 3E 0C LD A,FF ;Yes, use timer value for 4800 baud
- 018A' C3 01B7' JP DONE_EDITING_BAUD
-
- 018D' TRY_2400_BAUD:
- 018D' FE 03 CP ETX ;2400 baud?
- 018F' C2 0197' JP NZ,TRY_1200_BAUD ;No
- 0192' 3E 0A LD A,LF ;Yes, use timer value for 2400 baud
- 0194' C3 01B7' JP DONE_EDITING_BAUD
-
- 0197' TRY_1200_BAUD:
- 0197' FE 04 CP EOT ;1200 baud?
- 0199' C2 01A1' JP NZ,TRY_600_BAUD ;No
- 019C' 3E 07 LD A,BEL ;Yes, use value for 1200 baud
- 019E' C3 01B7' JP DONE_EDITING_BAUD
-
- 01A1' TRY_600_BAUD:
- 01A1' FE 05 CP ENQ ;600 baud?
- 01A3' C2 01AB' JP NZ,TRY_300_BAUD ;No
- 01A6' 3E 06 LD A,ACK ;Yes, use timer value for 600 baud
- 01A8' C3 01B7' JP DONE_EDITING_BAUD
-
- 01AB' TRY_300_BAUD:
- 01AB' FE 06 CP ACK ;300 baud?
- 01AD' C2 01B5' JP NZ,ASSUME_110_BAUD
- 01B0' 3E 05 LD A,ENQ ;Yes, use timer value for 300 baud
- 01B2' C3 01B7' JP DONE_EDITING_BAUD
-
- 01B5' ASSUME_110_BAUD:
- 01B5' 3E 02 LD A,STX ;Use timer value for 110 baud
-
- 01B7' DONE_EDITING_BAUD:
- 01B7' 32 0358' LD (BAUD_RATE),A ;Save final timer value for baudrate
-
- ;
- ; Now convert parity selection to proper control bits
- ;
- 01BA' 3A 035A' LD A,(PARITY_CHOICE)
- MACRO-80 3.43 27-Jul-81 PAGE 1-3
-
-
- 01BD' FE 45 CP 'E' ;Even parity?
- 01BF' C2 01C7' JP NZ,TRY_ODD_PARITY ;No
- 01C2' 3E 03 LD A,ETX ;Yes, use bit pattern for Even parity
- 01C4' C3 01D3' JP HAVE_GOOD_PARITY_BITMAP
-
- 01C7' TRY_ODD_PARITY:
- 01C7' FE 4F CP 'O' ;Odd parity?
- 01C9' C2 01D1' JP NZ,ASSUME_NO_PARITY ;No
- 01CC' 3E 01 LD A,SOH ;Yes, use bit pattern for Odd parity
- 01CE' C3 01D3' JP HAVE_GOOD_PARITY_BITMAP
-
- 01D1' ASSUME_NO_PARITY:
- 01D1' 3E 00 LD A,NUL ;Use bit pattern for No parity
-
- 01D3' HAVE_GOOD_PARITY_BITMAP:
- 01D3' 32 035A' LD (PARITY_CHOICE),A ;Save final SIO parity bitmap
-
- ;
- ; Edit databits (binary 7 or 8)
- ; to create proper SIO bit pattern
- ;
- 01D6' 3A 0359' LD A,(DATABITS)
- 01D9' FE 07 CP BEL ;7 data bits?
- 01DB' CA 01EB' JP Z,SET_7_DATABIT_PATTERN ;Yes
- 01DE' 3E 60 LD A,'`' ;No, use SIO WR5 pattern for 8 TX databits
- 01E0' 32 035B' LD (SIO_WR5_TX_BITS),A ;Save to be passed to SIO Write Reg 5
- 01E3' 3E C0 LD A,'@'+80H ;Format 8 Rx databits for SIO Write Reg 3
- 01E5' 32 035C' LD (SIO_WR3_RX_BITS),A
- 01E8' C3 01F5' JP SEND_ALL_TO_SIO
-
- 01EB' SET_7_DATABIT_PATTERN:
- 01EB' 3E 20 LD A,' ' ;Set bit pattern for 7 Tx bits
- 01ED' 32 035B' LD (SIO_WR5_TX_BITS),A
- 01F0' 3E 40 LD A,'@' ;Ditto for 7 Rx data bits
- 01F2' 32 035C' LD (SIO_WR3_RX_BITS),A
-
- 01F5' SEND_ALL_TO_SIO:
-
- ;
- ; OK, so send everything to SIO
- ;
- 01F5' F3 DI
- 01F6' 3E 18 LD A,CAN ;Reset SIO
- 01F8' D3 06 OUT (IOPORT06H),A
- 01FA' D3 06 OUT (IOPORT06H),A
- 01FC' 3E 01 LD A,SOH ;Select SIO Write Reg 1
- 01FE' D3 06 OUT (IOPORT06H),A
- 0200' AF XOR A ;No SIO interrupts
- 0201' D3 06 OUT (IOPORT06H),A
- 0203' 3E 04 LD A,EOT ;Select SIO Write Reg 4
- 0205' D3 06 OUT (IOPORT06H),A
- 0207' 3A 035A' LD A,(PARITY_CHOICE) ;Get parity bit pattern
- 020A' C6 44 ADD A,'D' ;Add 'Clock x 16' and '1 stop bit' pattern
- 020C' D3 06 OUT (IOPORT06H),A
- 020E' 3E 03 LD A,ETX ;Select SIO Write Reg 3
- 0210' D3 06 OUT (IOPORT06H),A
- MACRO-80 3.43 27-Jul-81 PAGE 1-4
-
-
- 0212' 3A 035C' LD A,(SIO_WR3_RX_BITS)
- 0215' C6 01 ADD A,SOH ;Enable Receiver
- 0217' D3 06 OUT (IOPORT06H),A
- 0219' 3E 05 LD A,ENQ ;Select SIO Write Reg 5
- 021B' D3 06 OUT (IOPORT06H),A
- 021D' 3A 035B' LD A,(SIO_WR5_TX_BITS)
- 0220' C6 8A ADD A,LF+80H ;Add 'DTR' and 'Tx Enable' and 'RTS'
- 0222' D3 06 OUT (IOPORT06H),A
- 0224' 3E 47 LD A,'G' ;Reset Baud Rate generator
- 0226' D3 00 OUT (IOPORT00H),A
- 0228' 3A 0358' LD A,(BAUD_RATE) ;Set our Baud Rate timer value
- 022B' D3 00 OUT (IOPORT00H),A
- 022D' FB EI
- 022E' 11 033D' LD DE,WRAPUP_MSG ;Tell him that we're done
- 0231' CD 0240' CALL PRINT_STRING
- 0234' C9 RET ;Back to CP/M
-
- 0235' GET_BDOS_KEYPRESS:
-
- ;
- ; Return next keypress as Uppercase char in A-reg
- ;
- 0235' 0E 01 LD C,SOH
- 0237' CD 0005 CALL BDOS ;Use BDOS to get next keypress
- 023A' FE 60 CP '`' ;Is it lowercase char?
- 023C' D8 RET C ;No, return it as-is
- 023D' D6 20 SUB ' ' ;Yes, convert to uppercase
- 023F' C9 RET
-
- 0240' PRINT_STRING:
-
- ;
- ; Print $-terminated string at (DE)
- ;
- 0240' 0E 09 LD C,TAB
- 0242' C3 0005 JP BDOS
-
- 0245' INIT_MSG:
- 0245' 1A 49 4E 49 DB SUB,"INIT 1.0 for Xerox 820",CR,LF,LF,LF,CR,LF
- 0249' 54 20 31 2E
- 024D' 30 20 66 6F
- 0251' 72 20 58 65
- 0255' 72 6F 78 20
- 0259' 38 32 30 0D
- 025D' 0A 0A 0A 0D
- 0261' 0A
-
- 0262' 42 61 75 64 DB "Baud Rates:",CR,LF,"19200 = 0",CR,LF,"9600 ="
- 0266' 20 52 61 74
- 026A' 65 73 3A 0D
- 026E' 0A 31 39 32
- 0272' 30 30 20 3D
- 0276' 20 30 0D 0A
- 027A' 39 36 30 30
- 027E' 20 20 3D
-
- MACRO-80 3.43 27-Jul-81 PAGE 1-5
-
-
- 0281' 20 31 0D 0A DB " 1",CR,LF,"4800 = 2",CR,LF,"2400 = 3",CR,LF
- 0285' 34 38 30 30
- 0289' 20 20 3D 20
- 028D' 32 0D 0A 32
- 0291' 34 30 30 20
- 0295' 20 3D 20 33
- 0299' 0D 0A
-
- 029B' 31 32 30 30 DB "1200 = 4",CR,LF," 600 = 5",CR,LF," 300 = 6"
- 029F' 20 20 3D 20
- 02A3' 34 0D 0A 20
- 02A7' 36 30 30 20
- 02AB' 20 3D 20 35
- 02AF' 0D 0A 20 33
- 02B3' 30 30 20 20
- 02B7' 3D 20 36
-
- 02BA' 0D 0A 20 31 DB CR,LF," 110 = 7",CR,LF,"$"
- 02BE' 31 30 20 20
- 02C2' 3D 20 37 0D
- 02C6' 0A 24
-
-
- 02C8' BAUD_PROMPT:
- 02C8' 0D 0A 53 65 DB CR,LF,"Select baud rate (1-9): 6",BS
- 02CC' 6C 65 63 74
- 02D0' 20 62 61 75
- 02D4' 64 20 72 61
- 02D8' 74 65 20 20
- 02DC' 20 20 20 20
- 02E0' 20 20 20 20
- 02E4' 20 28 31 2D
- 02E8' 39 29 3A 20
- 02EC' 36 08
-
- 02EE' 24 DB "$"
-
-
- 02EF' PARITY_PROMPT:
- 02EF' 0D 0A 53 65 DB CR,LF,"Select parity (Odd, Even, None): N",BS
- 02F3' 6C 65 63 74
- 02F7' 20 70 61 72
- 02FB' 69 74 79 20
- 02FF' 20 28 4F 64
- 0303' 64 2C 20 45
- 0307' 76 65 6E 2C
- 030B' 20 4E 6F 6E
- 030F' 65 29 3A 20
- 0313' 4E 08
-
- 0315' 24 DB "$"
-
-
- 0316' DATABITS_PROMPT:
- 0316' 0D 0A 53 65 DB CR,LF,"Select word length (7 or 8): 8",BS
- 031A' 6C 65 63 74
- MACRO-80 3.43 27-Jul-81 PAGE 1-6
-
-
- 031E' 20 77 6F 72
- 0322' 64 20 6C 65
- 0326' 6E 67 74 68
- 032A' 20 20 20 20
- 032E' 20 20 28 37
- 0332' 20 6F 72 20
- 0336' 38 29 3A 20
- 033A' 38 08
-
- 033C' 24 DB "$"
-
-
- 033D' WRAPUP_MSG:
- 033D' 0D 0A 43 6F DB CR,LF,"Communications port set.$"
- 0341' 6D 6D 75 6E
- 0345' 69 63 61 74
- 0349' 69 6F 6E 73
- 034D' 20 70 6F 72
- 0351' 74 20 73 65
- 0355' 74 2E 24
-
-
- 0358' BAUD_RATE:
- 0358' 00 DB NUL
-
-
- 0359' DATABITS:
- 0359' 00 DB NUL
-
-
- 035A' PARITY_CHOICE:
- 035A' 00 DB NUL
-
-
- 035B' SIO_WR5_TX_BITS:
- 035B' 00 DB NUL
-
-
- 035C' SIO_WR3_RX_BITS:
- 035C' 00 00 00 00 DB NUL,NUL,NUL,NUL,NUL
- 0360' 00
-
- MACRO-80 3.43 27-Jul-81 PAGE S
-
-
- Macros:
-
- Symbols:
- 0006 ACK 01B5' ASSUME_110_BAUD 01D1' ASSUME_NO_PARITY
- 02C8' BAUD_PROMPT 0358' BAUD_RATE 0005 BDOS
- 0007 BEL 0008 BS 0018 CAN
- 000D CR 0359' DATABITS 0169' DATABITS_ARE_LEG
- 0316' DATABITS_PROMPT 0012 DC2 0014 DC4
- 0010 DLE 01B7' DONE_EDITING_BAU 0116' EDIT_BAUD_RATE
- 015A' EDIT_DATABITS_VA 0135' EDIT_PARITY_VALU 0019 EM
- 0005 ENQ 0004 EOT 001B ESC
- 0017 ETB 0003 ETX 000C FF
- 001C FS 0106' GET_BAUD_RATE 0235' GET_BDOS_KEYPRES
- 014A' GET_DATABITS_CHO 0125' GET_PARITY_CHOIC 001D GS
- 01D3' HAVE_GOOD_PARITY 0245' INIT_MSG 0000 IOPORT00H
- 0006 IOPORT06H 000A LF 0015 NAK
- 0000 NUL 035A' PARITY_CHOICE 0147' PARITY_IS_LEGAL
- 02EF' PARITY_PROMPT 0240' PRINT_STRING 001E RS
- 01F5' SEND_ALL_TO_SIO 01EB' SET_7_DATABIT_PA 000F SI
- 035C' SIO_WR3_RX_BITS 035B' SIO_WR5_TX_BITS 000E SO
- 0001 SOH 0100' STARTUP 0002 STX
- 001A SUB 0016 SYN 0009 TAB
- 0197' TRY_1200_BAUD 018D' TRY_2400_BAUD 01AB' TRY_300_BAUD
- 0183' TRY_4800_BAUD 01A1' TRY_600_BAUD 0179' TRY_9600_BAUD
- 01C7' TRY_ODD_PARITY 001F US 000B VT
- 033D' WRAPUP_MSG 0013 XOFF 0011 XON
-
-
-
- No Fatal error(s)
-
-
-
- 035C' SIO_WR3_RX_BITS 035B' SIO_WR5_TX_BITS 000E SO