0001 * 0005 * 0006 COPY NPTDEFS 0007 * 0011 * 0012 ORG CXBUF 0013 XEQ NAME 0014 * 0001 * 0006 * 0007 * < ERROR UTILITY CALLING ROUTINE > 0008 * 0009 * VERSION 1.4.0 MAY 28, 1977 S. DOMPIER 0010 * 0011 * RESIDES IN TOP OF CXBUF (OLBUF) 0012 * 0013 * 0014 * CALLING PROGRAM MUST SET: 0015 * 0016 * 0017 * 1.) OCODE EQU 0018 * 0019 * 2.) REG A: ERROR UTILITY MESSAGE CODE 0020 * 0021 * 3.) REG B: < AS BELOW > 0022 * 0023 * 4.) REG HL: < AS BELOW > 0024 * 0025 * 0026 * REG B HAS OPTIONS: 0027 * 0028 * BIT 7: ACTION AFTER ERROR UTILITY ROUTINE 0029 * reset: SHORT RESET (NO FILES CLOSED) 0030 * set: USER RETURN (FOLLOWING UTIL CALL) 0031 * 0032 * 0033 * IF: HL = -1: NO PRINTING 0034 * ELSE: 0035 * 0036 * BIT 0: 0037 * set: VALUE IN HL TO PRINT 0038 * reset: HL HAS STRING POINTER (DELIMIT BINARY ZERO) 0039 * 0040 * NOTE: STRING FROM HL MUST BE LOCATED IN HIGH CXBUF 0041 * TO ALLOW UTIL TO LOAD INTO LOW CXBUF. 0042 * 0043 * BIT 1: 0044 * set: PRINT "CALLED FROM:" from above 0045 * from above 0046 * 0047 * 0049 * 0050 EUTIL STA ECODE SET ERROR MESSAGE CODE 0051 MOV A,B GET OPTIONS TO REG A (HL IS PRESET) 0052 * 0053 CALL UTIL 0054 DB UXOP 0055 JMP ABORT 0056 DB OCODE EQU IN MAIN PROGRAM 0057 ECODE DB 0 0058 * 0059 * FALL THRU TO ABORT IF RETURN HERE 0060 * 0061 ABORT MVI B,OCODE OPERATION CODE (EQU IN MAIN PRG) 0062 CALL SYS 0063 DB ABTOP 0064 * 0065 * END OF EUTIL 0000 * 0000 * 0001 * 0000 * 0000 * 0002 * < < IMAGE > > 0003 * 0004 * VERSION 1.4.0 JUNE 2,1977 S. DOMPIER 0005 * 0006 * 0007 * FORMAT: 0008 * 0009 * IMAGE FIRST ,LAST {,:LOAD},,,,{RUN} 0010 * ,>COUNT 0011 * 0012 * MAXIMUM ADDRESS BLOCKS = (42 TRIPLETS + RUN) 0013 * else memory overflow error 0014 * WHERE: 0015 * FIRST = STARTING ADDRESS FIRST>=LAST 0016 * LAST = STOP CONTIGIOUS BLOCK 0017 * >COUNT= BYTE COUNT >0 0018 * :LOAD = LOAD ADDRESS THIS BLOCK 0019 * ELSE FIRST IS USED 0020 * RUN = FIRST ADDRESS FOLLOWED BY ';' OR cr 0021 * 0022 * IMAGE ,RUN is acceptable format; 0023 * file name will exec run address. 0024 * 0025 * If is non-existant, file is created 0026 * type I (image), block size 100H (256) 0027 * no attributes. 0028 * If ,!ADDR then !ADDR will set block size 0029 * if file is created. ADDR = 1-FFF. 0030 * 0031 * File is END-FILED & CLOSED upon completion of writes. 0032 * 0033 * If write error, an attempt is made to close file 0034 * before abort is taken. If close is successful, 0035 * a message to that effect will be printed, otherwise 0036 * just the abort error message, and file is left as is. 0037 * 0038 * 0039 * 0041 * 0042 OCODE EQU 0 0043 * 0044 * 0048 * 0049 * PROGRAM MAIN SUBROUTINE SEQUENCE: 0050 * NAME, PARAM, OPEN, WRITE, RETURN 0051 * 0052 * READ NAME TO USERN 0053 * 0054 NAME MVI A,PSN 0055 LXI D,USERN 0056 CALL PSCAN 0057 JC ERR0 0058 JZ ENAX 059 INR E 0060 JZ EINA 0061 CPI ',' 0062 JNZ EADX 0063 * 0064 * 0065 * 0066 * GET PARAMETERS 0067 * 0068 * GET FIRST PASS FIRST ADDR {RUN ADDR} 0069 * 0070 PARAM CALL G1 GET FIRST ADDRESS 071 JZ P1 0072 CPI ':' LOAD ADDRESS? 073 JZ P0 0074 CPI '!' SET BLOCK SIZE? 0075 JNZ EIAD 0076 CALL CHKPS CHECK PASS 0077 JNZ ESYN ONLY ALLOWED ON VERY FIRST PARAM 0078 XCHG 0079 MOV A,H CHECK IF >FFF 0080 CPI 10H 0081 JNC EIBS NOPE 082 ORA L 0083 JZ EIBS CAN'T HAVE BLOCK SIZE OF 0 0084 SHLD BLOCK SET BLOCK SIZE 0085 JMP PARAM 0086 * 0087 P0 CALL CHKPS CHECK IF FIRST PASS 0088 JZ ESYN NOT ALLOWED ON VERY FIRST PARAM 0089 CALL LOAD STORE DIFFERENT LOAD ADDRESS 0090 JZ PARAM DELIMETER IS COMMA , 0091 JMP P4 CHECK IF ; CR ELSE SYNTAX ERROR 0092 * 0093 P1 CALL CHKDL CHECK IF ; CR , 0094 JZ RUN IT MUST BE A RUN ADDRESS 0095 * 0096 CALL PUT STORE FIRST ADDRESS 0097 JNZ EIAD NO COMMA 0098 STA PASS SET FIRST PASS DONE 0099 XCHG 0100 SHLD TEMP SAVE FIRST ADDRESS FOR COUNT 0101 * 0102 * 0103 * 0104 * GET LAST ADDR { > BYTE COUNT } 0105 * 0106 CALL G1 GET SECOND VALUE 107 JZ P2 0108 CPI '>' BYTE COUNT? 0109 JNZ EIAD 0110 JMP P3 SAVE COUNT 0111 * 0112 P2 LHLD TEMP COMPUTE BYTE COUNT 0113 CALL DEHL DE:=DE-HL 0114 JC EIBC START < END 0115 INX D FUDGE 0116 * 0117 P3 MOV A,D 118 ORA E 0119 JZ EIBC BYTE COUNT=0 ? 0120 CALL PUT STORE BYTE COUNT 0121 LHLD TEMP GET FIRST ADDR FOR LOAD 0122 XCHG 0123 CALL PUT STORE LOAD ADDRESS (FIRST) 0124 JZ PARAM FOUND COMMA, GET NEXT PARAM 0125 P4 CALL CHKDL CHECK FOR ; CR 0126 JZ OPEN 0127 JMP ESYN 0128 * 0129 * 0130 * 0131 * SET RUN ADDRESS 0132 * 0133 RUN STA RFLAG SET RUN FLAG <>0 0134 XCHG 0135 SHLD RUNAD STORE RUN ADDRESS 0136 * 0137 * ~~ fall thru ~~ 0138 * 0139 * {CREATE} / OPEN FILE IN USERN 0140 * 0141 * 0142 * 0143 OPEN MVI A,PSCO+40H 0144 LXI D,USERN 0145 LXI H,USERN 0146 CALL PSCAN 0147 JC ERR0 0148 MOV A,E 0149 STA FNUM SAVE FILE NUMBER 0150 * 0151 * 0152 * 0153 * WRITE FILE 0154 * 0155 * TABLE NOW HAS LAST ADDR+1 0156 * 0157 LHLD TABLE 0158 XCHG 0159 LXI H,PTAB COMPUTE PTAB LENGTH 0160 CALL DEHL DE:=DE-HL 0161 * 0162 * DE HAS PTAB LENGTH, HL HAS PTAB ADDRESS 0163 * 0164 WRITE MOV A,D 165 ORA E 0166 JZ WRUN BLOCKS ARE DONE, CHECK FOR RUN 0167 * 0168 PUSH D SAVE PTAB COUNT 0169 MOV E,M GET TRANSFER ADDRESS 170 INX H 0171 MOV D,M 172 INX H 0173 PUSH D SAVE TRANSFER ADDRESS FOR WRITE BLOCK 0174 PUSH H SAVE PTAB ADDRESS FOR WRITE 4 0175 MOV E,M GET BYTE COUNT FOR WRITE BLOCK 176 INX H 0177 MOV D,M 178 INX H 179 INX H 180 INX H 0181 XTHL . SAVE PTAB ADDRESS FOR NEXT TRIP, 0182 * AND RECOVER PTAB ADDRESS FOR WRITE 4 0183 PUSH D SAVE BYTE COUNT 0184 * 0185 XCHG . GET PTAB TO DE 0186 LXI B,4 WRITE 4 BYTES (BELOW) 0187 CALL WBLOCK WRITE COUNT, LOAD ADDRESS 0188 * 0189 POP B RECOVER BYTE COUNT 0190 POP H RECOVER PTAB ADDR FOR NEXT TRIP 0191 XTHL . SAVE PTAB ABOVE, RECOVER TRAN ADDRESS 0192 XCHG . TRAN ADDR TO DE 0193 * 0194 CALL WBLOCK WRITE DATA BLOCK 0195 POP D RECOVER PTAB ADDRESS 0196 LXI B,-6 0197 POP H RECOVER PTAB LENGTH COUNT 198 DAD B 0199 XCHG 0200 JMP WRITE DE=PTAB LENGTH, HL= PTAB ADDR 0201 * 0202 * 0203 * WRITE BLOCK 0204 * 0205 WBLOCK LDA FNUM 0206 CALL SYS 0207 DB WBLOP 0208 JC ERR9A 0209 RET 0210 * 0211 * 0212 * 0213 * CHECK IF RUN ADDRESS 0214 * 0215 WRUN LDA RFLAG GET RUN FLAG 216 ORA A 0217 JZ DOSRET NO RUN ADDRESS 0218 * 0219 LXI D, RUNAD POINT TO RUN ADDRESS 0220 LXI B,2 TWO BYTES 0221 CALL WBLOCK 0222 * 0223 * 0224 * 0225 * 0226 * END FILE, CLOSE FILE, RETURN TO SYSTEM 0227 * 0228 DOSRET LDA FNUM END FILE 0229 CALL SYS 0230 DB EOFOP 0231 JMP ERR9A ABORT 0232 * 0233 CALL CLOSE CLOSE FILE 0234 * 0235 CALL SYS 0236 DB RETOP DONE! 0237 * 0238 * 0239 * DE:=DE-HL 0240 * 0241 DEHL MOV A,E 242 SUB L 0243 MOV E,A 0244 MOV A,D 245 SBB H 0246 MOV D,A 0247 RET 0248 * 0249 * 0250 * CLOSE FILE 0251 * 0252 CLOSE LDA FNUM 253 ORA A 0254 RZ . NO FILE OPEN 0255 CALL SYS 0256 DB CLOOP 0257 JMP ERR9A ABORT 0258 MVI B,2 0259 DCR B SET B TO 1 AND NON-ZERO FLAG 0260 RET 0261 * 0262 * 0263 * 0264 OPPS CALL CLOSE 0265 JZ ERR9A NO CLOSE 0266 LXI H,MSG FILE CLOSED 0267 JMP ERMSG 0268 * 0269 * 0270 * 0271 GET MVI A,PSOPT READ TO ,;cr0 0272 GETV LXI D,USERW 0273 CALL PSCAN 0274 JC ERR0 0275 JZ EADX 0276 STA DLMT 0277 RET 0278 * 0279 * 0280 * 0281 * STORE NEW LOAD ADDRESS 0282 * 0283 LOAD LHLD TABLE 284 DCX H 0285 DCX H BACK UP TO LOAD 0286 JMP PUT2 0287 * 0288 * PUT ADDRESS/COUNT INTO PTAB 0289 * 0290 PUT LHLD TABLE GET PTAB ADDRESS 0291 PUT2 PUSH D 0292 PUSH PSW 0293 LXI D,PTEND CHECK IF TO MANY VALUES 0294 CALL DEHL 0295 JC EMOV MEMORY OVERFLOW 0296 POP PSW 297 POP D 0298 MOV M,E 299 INX H 0300 MOV M,D 301 INX H 0302 SHLD TABLE 0303 * 0304 COMMA LDA DLMT 0305 CPI ',' 0306 RET 0307 * 0308 * 0309 * 0310 CHKDL LDA DLMT 0311 CPI ';' 312 RZ 0313 CPI 0DH 0314 RET 0315 * 0316 * 0317 * CHECK PASS 0318 * 0319 CHKPS LDA PASS 320 ORA A 0321 RET 0322 * 0323 * GET VALUE 0324 * 0325 G1 CALL GET 0326 LXI H,USERW 0327 MOV A,M GET FIRST CHR 0328 MOV B,A 329 INX H 0330 CPI '>' BYTE COUNT? 0331 JZ GV2 0332 CPI ':' LOAD ADDSESS? 0333 JZ GV2 0334 CPI '!' RUN ADDRESS? 0335 JZ GV2 0336 * 337 DCX H 0338 MVI B,0 CLEAR FIRST CHR 0339 * 0340 GV2 LDA DLMT SAVE DELIMITER 0341 MOV C,A 0342 PUSH B SAVE FIRST CHR 0343 MVI A,PSV+40H 0344 CALL GETV CONVERT VALUE 345 POP B 0346 MOV A,C 0347 STA DLMT RESTOR DELIMITER 0348 MOV A,B 0349 ORA A SET FLAG FOR FIRST CHR 0350 RET 0351 * 0352 * 0353 * 0354 * 0355 * ERROR PRE-SET AREA 0356 * 0000 * 0000 ERR9A STA TEMP 0000 JMP ERABT 0000 * 0357 ERR0 MOV A,E 358 ORA A 0359 JZ ESYN 0360 DB 1 0361 * 0362 ENAX MVI A,ERNAX 0363 DB 1 0364 * 0365 EINA MVI A,ERINA 0366 DB 1 0367 * 0368 EIAD MVI A,ERIAD 0369 DB 1 0370 * 0371 EADX MVI A,ERADX 0372 DB 1 0373 * 0374 EIBC MVI A,ERIBC 0375 DB 1 0376 * 0377 EMOV MVI A,ERMOV 0378 DB 1 0379 * 0380 EIBS MVI A,ERIBS 0381 DB 1 0000 JMP ESYN1 0382 * 0383 ESYN MVI A,ERSYN 0384 ESYN1 STA TEMP SAVE ERR 0385 CALL OPPS CLOSE FILE IF OPEN 0000 * 0386 ERABT LXI H,-1 0387 MVI B,0 0388 ERMSG LDA TEMP GET ERR 0389 JMP EUTIL 0390 * 0420 MSG ASC "File closed" 0421 DB 0 0422 * 0391 * 0392 TEMP DW -1 TEMPORARY ADDRESS STORAGE 0393 PASS DB 0 FIRST PASS INDICATOR 0394 FNUM DB 0 FILE NUMBER 0395 DLMT DB 0 STRING DELIMETER 0396 RFLAG DB 0 RUN ADDRESS FLAG 0397 RUNAD DW 0BCB0H RUN ADDRESS 0398 * 0399 * CREATE BLOCK 0400 * 0401 DB '.' TYPE I. 0402 BLOCK DW 100H BLOCK SIZE 256 0403 DB 0 NO PROTECTION 0404 * 0405 USERN DS 20 NAME 0406 USERW DS 20 0407 * 0408 * 0409 TABLE DW PTAB 0410 * 0411 PTAB DS 100H MAXIMUM 42 TRIPLETS + RUN ADDRESS 0412 PTEND EQU $ END OF TABLE 0413 * 0414 * PTAB FORMAT: 0415 * FIRST (TRANSFER ADDRESS) 0416 * COUNT (THIS BLOCK BYTE COUNT) 0417 * LOAD (BLOCK LOAD ADDRESS) 0418 * 0424 * 0425 END 0426 *