CROMEMCO Z80 Macro Assembler version 03.07 Nov 30, 1980 09:21:39 Page 0001
*** HOST ***
0001 ; HOST Program for AMD 96-4016 Z8000 Monitor
0002 ;
0003 ; Sourced March '80 by Trevor Marshall
0004 ; Elec Eng Dept
0005 ; Uni W.A.
0006 ;
0007 ; This program was written for a Z80 CPU
0008 ; running a CDOS 2.17 Disk Operating System.
0009 ;
0010 ; It has been modified for 8080 CPU
0011 ; but not fully tested with that CPU
0012 ;
0013 ; Most code is compatible with other CP/M
0014 ; systems, but will have to be tailored
0015 ; to the individual's hardware environment
0016 ;
0017 ; Although the AMD SYS 8/8 uses parallel
0018 ; ports for handshaking the 96-4016 will also
0019 ; support serial I/O and this method is
0020 ; usually preferable.
0021 ; The AMD Monitor uses an 8 bit data word with
0022 ; parity generated in software.
0023 ; If you cannot configure your HOST USART
0024 ; to that format then you must null the
0025 ; parity generation with NOPs and the parity
0026 ; checking may be defeated with a prior RET
0027 ; Note that the AMD SYS 8/8 appears to have a
0028 ; CP/M compatible operating system
0029 ;
(0005) 0030 BDOS: EQU 5 ;CDOS system call addr
(0014) 0031 RNEXT: EQU 14H ;Read next record
(0015) 0032 WNEXT: EQU 15H ;Write next record
(0016) 0033 FCREATE: EQU 16H ;Create a file
(000D) 0034 RESET: EQU 0DH ;Reset CDOS
(000F) 0035 FOPEN: EQU 0FH ;Open a file
(0010) 0036 FCLOSE: EQU 10H ;Close a file
(001A) 0037 DMA: EQU 1AH ;Set disk buffer address
(0086) 0038 FORMAT: EQU 86H ;Format name to FCB
(0015) 0039 NAK: EQU 15H ;CTL-U
(0005) 0040 ENQ: EQU 5 ;CTL-E
(0006) 0041 ACK: EQU 6 ;CTL-F
(0001) 0042 SOH EQU 1 ;CTL-A
(0002) 0043 STX: EQU 2 ;CTL-B
(0004) 0044 EOT: EQU 4 ;CTL-D
(001A) 0045 EOF: EQU 1AH ;End of file marker byte
0046 ;
0047 ;THE FOLLOWING EQUATES ARE HARDWARE DEPENDENT
0048 ;
(00F7) 0049 CSTATP: EQU 0F7H ;Console driver status port
(00F6) 0050 CDATA: EQU 0F6H ;Console data port
(0002) 0051 CRDA: EQU 2 ;RDA bit
(0001) 0052 CTBE: EQU 1 ;TBE bit
0053 ;
(0100) 0054 ORG 100H
0055 ;
0100 318000 0056 START: LD SP,80H
0103 3E00 0057 LD A,0
0105 32DD04 0058 LD (FLAG),A ;Clear the file opened flag
0059 ; Now output system prompt to console
0108 11AD03 0060 LD DE,MSG
010B 0E09 0061 LD C,9 ;Print Buffered Line
CROMEMCO Z80 Macro Assembler version 03.07 Nov 30, 1980 09:21:39 Page 0002
*** HOST ***
010D CD0500 0062 CALL BDOS
0063 ;
0110 318000 0064 MORE: LD SP,80H ;Reset Stack Pointer
0113 3E00 0065 LD A,0
0115 32DC04 0066 LD (CODE),A ;Clear the error code
0118 CD8402 0067 CALL DIALOG ;Wait for an instruction
011B 3ABA04 0068 LD A,(NEWCODE) ;2 locs to ease debugging
011E 32B904 0069 LD (CURCODE),A ;Save it
0070 ; Now decode the Function request type
0121 FE04 0071 CP A,4
0123 CA5901 R 0072 JP Z,OPEN
0126 FE05 0073 CP A,5
0128 CAA601 R 0074 JP Z,CLOSE
012B FE06 0075 CP A,6
012D CA2302 0076 JP Z,CREATE
0130 FE07 0077 CP A,7
0132 CADB01 0078 JP Z,READ
0135 FE08 0079 CP A,8
0137 CA7901 R 0080 JP Z,WRITE
0081 ;
013A C3C601 0082 JP N7 ;If not one of the above instrs
0083 ;
0084 ; S/R to set up FCB name in FCB block from BFFR data
0085 ;
013D 3A2C04 0086 SETUP LD A,(REQBFFR) ;Fetch the drive (A - C)
0140 D640 0087 SUB A,40H ;A = 01 IN FCB
0142 322D04 0088 LD (REQBFFR+1),A ;Put drive # in FCB
0145 212D04 0089 LD HL,REQBFFR+1 ;Point at start of legal co
de
0148 11BB04 0090 LD DE,FCB ;Point at FCB area
014B 010C00 0091 LD BC,12 ;# of bytes in name & drive
0092 ; LDIR ;Shift name to FCB
0093 ; implement the LDIR in 8080 code:
014E 7E 0094 L1: LD A,(HL) ;***** THIS CODE HAS NOT
014F 12 0095 LD (DE),A ; BEEN CHECKED******
0150 23 0096 INC HL
0151 13 0097 INC DE
0152 0B 0098 DEC BC
0153 79 0099 LD A,C ;Is BC = 0
0154 B0 0100 OR A,B
0155 C24E01 R 0101 JP NZ,L1
0102 ;
0158 C9 0103 RET
0104 ;
0105 ;Now try to open file
0159 0E0D 0106 OPEN: LD C,RESET
015B CD0500 0107 CALL BDOS ;First log off all disks
015E CD3D01 0108 CALL SETUP ;Set up FCB
0161 11BB04 0109 LD DE,FCB
0164 0E0F 0110 LD C,FOPEN
0166 CD0500 0111 CALL BDOS ;Open file
0112 ; Any errors?
0169 C601 0113 ADD A,1 ;Is a = -1 ?
016B CAC601 R 0114 JP Z,N7
0115 ; Opened successfully, now can process read or write
016E 3EFF 0116 LD A,0FFH
0170 32DD04 0117 LD (FLAG),A ;Set opened flag
0173 CD7303 0118 CALL TRNS ;Acknowledge
0176 C31001 R 0119 JP MORE ;Get next instruction
0120 ;
0179 3ADD04 0121 WRITE: LD A,(FLAG) ;Check file is created or open
CROMEMCO Z80 Macro Assembler version 03.07 Nov 30, 1980 09:21:39 Page 0003
*** HOST ***
017C FE00 0122 CP A,0
017E CAD001 R 0123 JP Z,N5 ;no, send error code 3
0124 ; Now set the DMA address to BFFR
0181 0E1A 0125 LD C,DMA
0183 113904 0126 LD DE,BFFR
0186 CD0500 0127 CALL BDOS
0128 ;
0189 11BB04 0129 LD DE,FCB
018C 0E15 0130 LD C,WNEXT
018E CD0500 0131 CALL BDOS ;Write the record
0191 FE01 0132 CP A,1 ;entry error
0193 CAD001 R 0133 JP Z,N5 ; send code 3
0196 FE02 0134 CP A,2
0198 CAC601 R 0135 JP Z,N7 ;Send code 1 if out of space
019B FE00 0136 CP 0 ;OK
019D C2CB01 R 0137 JP NZ,N8 ;Send code 2 for other errors
0138 ; Must be OK,wait for next instruction
01A0 CD7303 0139 CALL TRNS
01A3 C31001 0140 JP MORE
0141 ;
01A6 3ADD04 0142 CLOSE: LD A,(FLAG) ;Dont close an unopened file
01A9 FE00 0143 CP 0
01AB CAD001 R 0144 JP Z,N5 ;not open
01AE 0E10 0145 LD C,FCLOSE
01B0 11BB04 0146 LD DE,FCB
01B3 CD0500 0147 CALL BDOS
01B6 FEFF 0148 CP A,0FFH
01B8 CAC601 R 0149 JP Z,N7 ;A=FF means not found
01BB 3E00 0150 LD A,0
01BD 32DD04 0151 LD (FLAG),A ;Clear the open file flag
01C0 32DC04 0152 LD (CODE),A ;Clr error flag
01C3 C3D501 R 0153 JP N10
01C6 3E01 0154 N7: LD A,1 ;Send error code 1
01C8 C3D201 R 0155 JP N6
01CB 3E02 0156 N8: LD A,2 ;Send error code 2
01CD C3D201 R 0157 JP N6
01D0 3E03 0158 N5: LD A,3 ;Send error code 3
01D2 32DC04 0159 N6: LD (CODE),A ;File not open or created
01D5 CD7303 0160 N10: CALL TRNS
0161 ; Omit the following for 8080 CP/M
0162 ; LD C,96H ;Call to CDOS 2.17 to turn
0163 ; CALL BDOS ; drive motors off
01D8 C31001 0164 JP MORE
0165 ;
01DB 3ADD04 0166 READ: LD A,(FLAG) ;Is file open ?
01DE FE00 0167 CP 0
01E0 C2FD01 R 0168 JP NZ,N2 ;Yes
01E3 0E0D 0169 LD C,RESET ;No,open it
01E5 CD0500 0170 CALL BDOS
01E8 CD3D01 0171 CALL SETUP
01EB 11BB04 0172 LD DE,FCB
01EE 0E0F 0173 LD C,FOPEN
01F0 CD0500 0174 CALL BDOS
01F3 C601 0175 ADD A,1
01F5 CAD001 R 0176 JP Z,N5 ;type 3 error, not found
01F8 3EFF 0177 LD A,0FFH
01FA 32DD04 0178 LD (FLAG),A ;Set open flag
0179 ; File opened now read record
01FD 0E1A 0180 N2: LD C,DMA ;set CDOS DMA addr to bffr
01FF 113904 0181 LD DE,BFFR
0202 CD0500 0182 CALL BDOS
CROMEMCO Z80 Macro Assembler version 03.07 Nov 30, 1980 09:21:39 Page 0004
*** HOST ***
0205 0E14 0183 LD C,RNEXT ;read next record
0207 11BB04 0184 LD DE,FCB
020A CD0500 0185 CALL BDOS
0186 ; Now process error codes
020D FE00 0187 CP 0 ;1 = <EOF>
020F CA1D02 R 0188 JP Z,M1
0189 ; Must be 1, End Of File
0190 ; Note that this error is only returned AFTER an
0191 ; abortive attempt to fetch the next sector, and
0192 ; <EOF> within data is transferred normally, so
0193 ; ASM will give errors unless a QUIT instruction
0194 ; is used to end the source file.
0212 3E01 0195 LD A,1
0214 32DC04 0196 LD (CODE),A
0217 CD7303 0197 CALL TRNS ;Dont send any data
021A C31001 0198 JP MORE
021D CD0C03 0199 M1: CALL SEND ;Transmit normal data
0220 C31001 0200 JP MORE
0201 ;
0223 3ADD04 0202 CREATE: LD A,(FLAG) ;Is file open?
0226 FE00 0203 CP 0
0228 C2D001 R 0204 JP NZ,N5 ;Yes send error code 3
022B 0E0D 0205 LD C,RESET ;Log off all disks
022D CD0500 0206 CALL BDOS ;Prior to directory operations
0230 CD3D01 0207 CALL SETUP
0208 ; First check if a file already exists with this name
0209 ; Dont delete it,as it may be a mistaken command
0233 11BB04 0210 LD DE,FCB
0236 0E11 0211 LD C,11H ;Search Directory cmd
0238 CD0500 0212 CALL BDOS
023B FEFF 0213 CP A,0FFH
023D CA4602 R 0214 JP Z,MI3 ;Entry was not found
0240 7E 0215 LD A,(HL) ;Fetch the first directory byte
0241 FEE5 0216 CP A,0E5H ;Is it erased
0243 C2D001 R 0217 JP NZ,N5 ;No, send error
0246 0E16 0218 MI3: LD C,FCREATE
0248 11BB04 0219 LD DE,FCB
024B CD0500 0220 CALL BDOS
024E FEFF 0221 CP A,0FFH
0250 CAC601 0222 JP Z,N7 ;Send error code 1
0253 CD7303 0223 CALL TRNS
0256 3EFF 0224 LD A,0FFH
0258 32DD04 0225 LD (FLAG),A ;Set the open flag
025B C31001 0226 JP MORE
0227 ;
0228 ;
0229 ; S/R to accomplish I/O
0230 ; N.B. THESE WILL BE HARDWARE DEPENDENT
025E DBF7 0231 CSTAT: IN A,CSTATP
0260 E602 0232 AND CRDA
0262 C8 0233 RET Z
0263 3EFF 0234 LD A,-1
0265 C9 0235 RET
0236 ;
0266 CD5E02 0237 CHIN: CALL CSTAT
0269 CA6602 R 0238 JP Z,CHIN
026C DBF6 0239 IN A,CDATA
026E E67F 0240 AND 7FH ;Strip off parity bit
0270 C9 0241 RET
0242 ;
0271 DBF7 0243 CRDY: IN A,CSTATP
CROMEMCO Z80 Macro Assembler version 03.07 Nov 30, 1980 09:21:39 Page 0005
*** HOST ***
0273 E601 0244 AND CTBE
0275 C8 0245 RET Z
0276 3EFF 0246 LD A,-1
0278 C9 0247 RET
0248 ;
0279 F5 0249 COUT: PUSH AF
027A CD7102 0250 C1: CALL CRDY
027D CA7A02 R 0251 JP Z,C1
0280 F1 0252 POP AF
0281 D3F6 0253 OUT CDATA,A
0283 C9 0254 RET
0255 ;
0256 ;
0257 ; S/R DIALOG to talk to Z8000
0284 21FFFF 0258 DIALOG: LD HL,0FFFFH ;Load a delay value to HL
0259 ; We will decrement HL until 0, then switch the
0260 ; disk drive motors off
0287 CD5E02 0261 DI1: CALL CSTAT
028A C29E02 R 0262 JP NZ,DIA2 ;Have input,exit motor loop
028D 2B 0263 DEC HL
028E 7D 0264 LD A,L ;No flag setting after DEC HL
028F B4 0265 OR H
0290 C28702 R 0266 JP NZ,DI1 ;Try the loop again
0267 ; Have now waited long enough, assume Z8000 done
0268 ; LD C,96H ;Call to CDOS 2.17 to turn
0269 ; CALL BDOS ; drive motors off
0293 C39E02 R 0270 JP DIA2
0296 3E15 0271 KNACK: LD A,NAK
0298 CD7902 0272 CALL COUT
029B C38402 R 0273 JP DIALOG ;Service motors
029E CD6602 0274 DIA2: CALL CHIN
02A1 FE05 0275 CP ENQ
02A3 C29602 R 0276 JP NZ,KNACK ;Only <ENQ> is valid
02A6 3E06 0277 ACKNL: LD A,ACK
02A8 CD7902 0278 CALL COUT
02AB 212C04 0279 RECVE: LD HL,REQBFFR
02AE CD6602 0280 CALL CHIN
02B1 FE01 0281 CP SOH ;Answer should be <SOH>
02B3 C20103 R 0282 JP NZ,FLUSH
02B6 CD6602 0283 CALL CHIN ;FUNCTION REQUEST CODE
02B9 D630 0284 SUB A,30H
02BB 32BA04 0285 LD (NEWCODE),A
0286 ; We will just receive chars and store them in req bffr
02BE CD6602 0287 RECVA: CALL CHIN
02C1 FE04 0288 CP A,EOT
02C3 CAF602 R 0289 JP Z,RECVB ;Message ends with <EOT>
02C6 FE02 0290 CP A,STX
02C8 CABE02 R 0291 JP Z,RECVA ;Discard it
0292 ; Now process two hex bytes
02CB D630 0293 SUB 30H ;Pseudo-Hex format is used
0294 ; Cabt SLA C in 8080, so rewrite
02CD 37 0295 SCF
02CE 3F 0296 CCF
02CF 17 0297 RLA
02D0 37 0298 SCF
02D1 3F 0299 CCF
02D2 17 0300 RLA
02D3 37 0301 SCF
02D4 3F 0302 CCF
02D5 17 0303 RLA
02D6 37 0304 SCF
CROMEMCO Z80 Macro Assembler version 03.07 Nov 30, 1980 09:21:39 Page 0006
*** HOST ***
02D7 3F 0305 CCF
02D8 17 0306 RLA
02D9 4F 0307 LD C,A ;Save first hex digit
02DA CD6602 0308 CALL CHIN
0309 ; SLA C
0310 ; SLA C
0311 ; SLA C
0312 ; SLA C
02DD D630 0313 SUB A,30H
02DF E60F 0314 AND A,0FH ;Mask off upper nibble
02E1 81 0315 ADD A,C ;Now have Hex digit
02E2 77 0316 LD (HL),A
02E3 23 0317 INC HL
02E4 7D 0318 LD A,L
02E5 FE39 0319 CP REQBUFFEND AND 0FFH
02E7 C2BE02 R 0320 JP NZ,RECVA
02EA 7C 0321 LD A,H
02EB FE04 0322 CP REQBUFFEND SHR 8
02ED C2BE02 R 0323 JP NZ,RECVA
02F0 213904 0324 LD HL,BFFR ;Now point at data buffer
02F3 C3BE02 R 0325 JP RECVA
0326 ;
02F6 3E06 0327 RECVB: LD A,ACK
02F8 CD7902 0328 CALL COUT
02FB C9 0329 RET
0330 ;
0331 ;FLUSH routine to discard all input characters
0332 ; up to the next <EOT> after an input error
0333 ;
02FC 3E15 0334 FLUSHB: LD A,NAK
02FE CD7902 0335 CALL COUT ;Send a <NAK>
0301 CD6602 0336 FLUSH: CALL CHIN
0304 FE04 0337 CP EOT ;EOT means end of input
0306 C2FC02 R 0338 JP NZ,FLUSHB ;Continue to flush
0309 C38402 0339 JP DIALOG ;Try to fetch the data again
0340 ;
0341 ; S/R to transmit code,response & data in 96-4016 format
0342 ;
030C 3E05 0343 SEND: LD A,ENQ
030E CD7902 0344 CALL COUT ;A
sk permission to send
0311 CD6602 0345 SENDA: CALL CHIN
0314 FE06 0346 CP A,ACK ;Must reply with <ACK>
0316 C20C03 R 0347 JP NZ,SEND
0319 3E01 0348 SENDB: LD A,SOH
031B CD7902 0349 CALL COUT
031E 3AB904 0350 LD A,(CURCODE)
0321 C630 0351 ADD A,30H
0323 CD7902 0352 CALL COUT ;Transmit the Function Code
0326 3E02 0353 LD A,STX
0328 CD7902 0354 CALL COUT
032B 3E30 0355 LD A,'0' ;Error codes, first is zero
032D CD7902 0356 CALL COUT
0330 3ADC04 0357 LD A,(CODE) ;Second code byte
0333 C630 0358 ADD '0'
0335 CD7902 0359 CALL COUT
0360 ; Now transmit text
0338 213904 0361 LD HL,BFFR
033B 7E 0362 LP4: LD A,(HL)
033C 4F 0363 LD C,A ;Save it
033D E6F0 0364 AND A,0F0H
0365 ; Cant SRA A in 8080,
CROMEMCO Z80 Macro Assembler version 03.07 Nov 30, 1980 09:21:39 Page 0007
*** HOST ***