From 2b03858c61d60a178048a5cef0779296d3ba613e Mon Sep 17 00:00:00 2001 From: Yufeng Gao <85091235+TheBrokenPipe@users.noreply.github.com> Date: Thu, 22 Jan 2026 23:17:51 +1000 Subject: [PATCH] More updates to the assembler --- ASM.A86 | 131 +--- CPM Tools/ASM86.COM | Bin 5632 -> 5376 bytes CPM Tools/ASM86.Z80 | 706 +++++++----------- CPM Tools/README.md | 3 - CPM Tools/TRANS86.Z80 | 20 +- Disk Images/86-DOS 0.11 Source Code.img | Bin 256256 -> 256256 bytes .../Cromemco CDOS with Build Tools.img | Bin 256256 -> 256256 bytes 7 files changed, 311 insertions(+), 549 deletions(-) diff --git a/ASM.A86 b/ASM.A86 index 0f41cca..007bcd9 100644 --- a/ASM.A86 +++ b/ASM.A86 @@ -4,9 +4,7 @@ SYMWID: EQU 10 FCB: EQU 5CH -BUFSIZ: EQU 128 ;Source code buffer -LSTBUFSIZ:EQU BUFSIZ ;List file buffer -HEXBUFSIZ:EQU BUFSIZ ;Hex file buffer +BUFSIZ: EQU 128 EOL: EQU 13 ;ASCII carriage return OBJECT: EQU 100H ;DEFAULT "PUT" ADDRESS @@ -127,7 +125,6 @@ ENDJ: JMP END ENDLN: XOR AL,AL ;Flag no errors on line ENDLIN: -;AL = error code for line. Stack depth unknown MOV SP,STACK CALL NEXLIN JP LOOP @@ -236,10 +233,6 @@ NOMOD: MROPS: - -; Get two operands and check for certain types, according to flag byte -; in CL. OP code in CH. Returns only if immediate operation. - PUSH CX ;Save type flags CALL GETOP PUSH DX ;Save first operand @@ -372,29 +365,6 @@ GETOP2: GETOP: - -; Get one operand. Operand may be a memory reference in brackets, a register, -; or a constant. If a flag (such as "B" for byte operation) is encountered, -; it is noted and processing continues to find the operand. -; -; On exit, AL (=DH) has the type of operand. Other information depends -; on the actual operand: -; -; AL=DH=0 Memory Reference. DL has the address mode properly prepared in -; the 8086 R/M format (middle bits zero). The constant part of the address -; is in ADDR. If an undefined label needs to be added to this, a pointer to -; its information fields is in ALABEL, otherwise ALABEL is zero. -; -; AL=DH=1 Value. The constant part is in DATA. If an undefined label needs -; to be added to this, a pointer to its information fields is in DLABEL, -; otherwise DLABEL is zero. "$" and "RET" are in this class. -; -; AL=DH=2 8-bit Register. DL has the register number. -; -; AL=DH=3 16-bit Register. DL has the register number. -; -; AL=DH=4 Segment Register. DL has the register number. - CALL GETSYM GETOP1: ;Enter here if we don't need a GETSYM first @@ -451,16 +421,8 @@ FLG: GETVAL: - -; Expression analyzer. On entry, if AL=0 then do not allow base or index -; registers. If AL=1, we are analyzing a memory reference, so allow base -; and index registers, and compute addressing mode when done. The constant -; part of the expression will be found in CON. If an undefined label is to -; be added to this, a pointer to its information fields will be found in -; UNDEF. - LAHF - XCHG AX,BP ;Flag is kept in BP + XCHG AX,BP SAHF PUSH BX MOV BX,0 @@ -706,23 +668,6 @@ ERR30: JNZ ERR3 GETSYM: - -; The lexical scanner. Used only in the operand field. Returns with the token -; in SYM and AL, sometimes with additional info in BX or DX. -; -; AL=SYM=0 Undefined label. BX has pointer to information fields. -; -; AL=SYM=1 Constant (or defined label). DX has value. -; -; AL=SYM=2,3,4 8-bit register, 16-bit register, or segment register, -; respectively. DL has register number. -; -; AL=SYM=5 A mode flag (such as "B" for byte operation). Also stored in -; appropriate memory location--FLAG or LONG. -; -; All other values are the ASCII code of the character. Note that this may -; never be a letter or number. - CALL GETSY MOV AL,[SYM] RET @@ -1169,24 +1114,6 @@ EMPTY: CREATE: - -; Add a new node to the identifier tree. The identifier is at ID with -; bit 7 of the last character set to one. The length of the identifier is -; in LENID, which is ID-1. -; -; Node format: -; 1. Length of identifier (1 byte) -; 2. Identifier (1-80 bytes) -; 3. Left link (2-byte pointer to alphabetically smaller identifiers) -; 4. Right link (0 if none larger) -; 5. Data field: -; a. Defined flag (0=undefined, 1=defined) -; b. Value (2 bytes) -; -; This routine returns with AL=zero and zero flag set (which indicates -; on return from LOOKUP that it has not yet been defined), DX points -; to start of new node, and BX points to data field of new node. - MOV AL,[LENID] ADD AL,8 ;Storage needed for the node MOV BX,[HEAP] @@ -1432,8 +1359,6 @@ IMM: RET PUT: -;Save byte in AL as pure code, with intermediate code bits 00. AL and -;DI destroyed, no other registers affected. PUSH BX PUSH CX MOV CH,0 ;Flag as pure code @@ -1443,7 +1368,6 @@ PUT: RET GEN: -;Save byte of code in AL, given intermediate code bits in bits 7&8 of CH. CALL PUTINC ;Save it and bump code pointer GEN1: MOV AL,[RELOC] @@ -1490,9 +1414,6 @@ PUTCD1: MOV BX,[CODE] RET PUTWOR: -;Save the word value described by [DLABEL] and [DATA] as code. If defined, -;two bytes of pure code will be produced. Otherwise, appropriate intermediate -;code will be generated. PUSH CX MOV CH,80H PUSH DX @@ -1500,7 +1421,6 @@ PUTWOR: JP PUTBW PUTBYT: -;Same as PUTWOR, above, but for byte value. PUSH CX MOV CH,40H PUSH DX @@ -1562,10 +1482,6 @@ NOUNDEF: PRETJ: JP PRET PUTADD: -;Save complete addressing mode. Addressing mode is in AL; if this is a register -;operation (>=C0), then the one byte will be saved as pure code. Otherwise, -;the details of the addressing mode will be investigated and the optional one- -;or two-byte displacement will be added, as described by [ADDR] and [ALABEL]. PUSH CX PUSH DX PUSH BX @@ -2289,10 +2205,6 @@ NOFIL: JP NEXCD OUTLIN: -;Copy the source line to the ouput device. Line will be preceded by -;assembler-generated line number. This routine may be called several times -;on one line (once for each line of object code bytes), so it sets a flag -;so the line will only be output on the first call. CALL LIST MOV AL,[LSTFCB] CMP AL,'Z' @@ -2700,7 +2612,7 @@ CONVLP: PRNT10: XCHG DX,BX - MOV CH,"0"-" " ;Enable leading zero suppression + MOV CH,'0'-' ' ;Enable leading zero suppression MOV AL,CL CALL LODIG MOV AL,BH @@ -2714,7 +2626,7 @@ PRNT10: LODIG: CALL LHALF DIGIT: - CMP AL,"0" + CMP AL,'0' JZ SUPZ MOV CH,0 ;Turn off zero suppression if not zero SUPZ: @@ -2935,15 +2847,15 @@ LHALF: CMP AL,'9'+1 JC RET ADD AL,7 -RET: RET + RET INCBUF: INC BX - CMP BX,HEXBUF+HEXBUFSIZ + CMP BX,HEXBUF+BUFSIZ JZ RET - CMP BX,LSTBUF+LSTBUFSIZ + CMP BX,LSTBUF+BUFSIZ JZ RET - CMP BX,HEXBUF2+HEXBUFSIZ + CMP BX,HEXBUF+BUFSIZ+BUFSIZ JNZ RET MOV BX,HEXBUF ;Wrap back to first buffer RET @@ -2952,10 +2864,6 @@ NONE: DB 0 ; 8086 MNEMONIC TABLE -; This table is actually a sequence of subtables, each starting with a label. -; The label signifies which mnemonics the subtable applies to--A3, for example, -; means all 3-letter mnemonics beginning with A. - A3: DB 7 DB 'dd' @@ -3455,19 +3363,6 @@ X4: OPTAB: -; Table of pointers to mnemonics. For each letter of the alphabet (the -; starting letter of the mnemonic), there are 5 entries. Each entry -; corresponds to a mnemonic whose length is 2, 3, 4, 5, and 6 characters -; long, respectively. If there are no mnemonics for a given combination -; of first letter and length (such as A-2), then the corresponding entry -; points to NONE. Otherwise, it points to a place in the mnemonic table -; for that type. - -; This table only needs to be modified if a mnemonic is added to a group -; previously marked NONE. Change the NONE to a label made up of the first -; letter of the mnemonic and its length, then add a new subsection to -; the mnemonic table in alphabetical order. - DW NONE DW A3 DW NONE @@ -3599,7 +3494,8 @@ OPTAB: DW NONE DW NONE -HEADER: DB 13,10,'Seattle Computer Products 8086 Assembler Version 2.00',13,10,'$' +HEADER: DB 13,10,'Seattle Computer Products 8086 Assembler Version 2.00' + DB 13,10,'$' ERRMES: DM '***** ERROR no. ' NOSPAC: DB 13,10,'No directory space',13,10,24H ENDMES: DM 'H',13,10 @@ -3657,9 +3553,8 @@ LSTPNT: DS 2 ERRCNT: DS 2 LSTRET: DS 2 RETPT: DS 2 -HEXBUF: DS HEXBUFSIZ -HEXBUF2:DS HEXBUFSIZ -LSTBUF: DS LSTBUFSIZ +HEXBUF: DS BUFSIZ+BUFSIZ +LSTBUF: DS BUFSIZ BC: DS 2 DE: DS 2 HL: DS 2 @@ -3668,4 +3563,4 @@ IY: DS 2 DS 50 STACK: EQU $ START: EQU $ - \ No newline at end of file + \ No newline at end of file diff --git a/CPM Tools/ASM86.COM b/CPM Tools/ASM86.COM index 0cb44648641e8c55e0386c12def304cb0ddca22e..2709ec6150103ceb277d341a2c2a1af72224ea9e 100644 GIT binary patch delta 4752 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, then the one byte will be saved as pure code. Otherwise, -;the details of the addressing mode will be investigated and the optional one- -;or two-byte displacement will be added, as described by [ADDR] and [ALABEL]. PUSH BC PUSH DE PUSH HL @@ -1437,7 +1337,6 @@ EXMEM1: JP Z,ERROR LD C,1 ;Flag word as OK CALL NOTAC ;NOTAC never returns - JP ERROR GRP4: PUSH AF @@ -1534,7 +1433,7 @@ GRP7: JP NZ,ACCIMM EX DE,HL LD HL,(DATA) - CALL L055B + CALL SIGNEXT EX DE,HL JP NZ,ACCIMM SET 1,C @@ -1650,11 +1549,7 @@ AIMM: POP AF JP Z,PUTBYT JP PUTWOR - - JP ERROR - GRP14: -;JMP and CALL mnemonics PUSH AF CALL GETOP CP CONST @@ -1669,18 +1564,17 @@ GRP14: SET 6,E SET 7,E NOTRG: -;Indirect jump. DL has addressing mode. LD A,0FFH CALL PUT POP AF AND 38H OR E LD B,A - LD A,(L1A98) + LD A,(LONG) OR A LD A,B - JP Z,PUTADD ;If so, do inter-segment - AND 0F7H ;Convert to intra-segment + JP Z,PUTADD + RES 3,A JP PUTADD DIRECT: LD A,(SYM) @@ -1710,9 +1604,7 @@ LONGJ: CP CONST JP NZ,ERROR JP PUTWOR - GRP16: -;RET mnemonic PUSH AF CALL GETSYM CP 5 @@ -1732,8 +1624,8 @@ GETSP: CALL PUT JP PUTWOR LONGR: - LD A,(L1A98) - OR A ;Is flag "L"? + LD A,(LONG) + OR A JR NZ,NOTLON POP AF OR 8 @@ -1748,8 +1640,6 @@ NOTLON: CALL Z,GETSYM JR GETSP NODEC: -;Return is intra-segment (short) without add to SP. -;Record position for RET symbol. LD HL,(PC) LD (LSTRET),HL EX DE,HL @@ -1767,7 +1657,6 @@ NODEC: DORET: POP AF JP PUT - GRP17: CALL PUT CALL GETOP @@ -1785,7 +1674,7 @@ GRP17: OR L RET NZ LD HL,(DATA) - CALL L055B + CALL SIGNEXT RET Z LD C,31 JP ERROR @@ -1921,17 +1810,17 @@ WREND: JR NZ,WREND LD A,(LSTFCB) CP 'Z' - JR Z,L1033 + JR Z,NOREOPN CALL ADDEXT LD DE,FCB LD C,OPEN CALL SYSTEM LD HL,0FFH EXX -L1033: +NOREOPN: LD A,-5 LD (HEXCNT),A ;FLAG HEX BUFFER AS EMPTY - LD (L1B0E),A + LD (SKPFLG),A LD HL,HEXBUF LD (HEXPNT),HL LD HL,LSTBUF @@ -1946,34 +1835,28 @@ L1033: LD (COUNT),A CALL STRTLIN LD HL,START -L1069: +NEXBT: LD B,4 - LD C,(HL) - INC HL -L1070: + LD C,(HL) ;Get flag byte + INC HL ;Point to code +CDLP: + RL C ;Get high bit + JR C,TESTTYP ;Word fixup or special RL C - JR C,L1087 - RL C - JR NC,L107B - JR L1108 -L107B: + JR C,DEFBYT ;Byte fixup LD A,(HL) -L107D: - CALL L13BB -L1080: +OBJBT: + CALL SAVCD +NEXCD: INC HL - DJNZ L1070 - JR L1069 -L1087: + DJNZ CDLP ;Still have codes left? + JR NEXBT +TESTTYP: RL C - JR C,L108E - JP L1144 -L108E: + JP NC,DEFWRD LD A,(HL) CP -10 - JR C,L1097 - JP L1214 -L1097: + JP NC,SPCFUN PUSH BC PUSH HL LD HL,COUNT @@ -1983,7 +1866,7 @@ L1097: LD B,A LD A,' ' JR Z,NOFIL -BLNK: +BLNK: ;Put in 3 blanks for each byte not present CALL LIST CALL LIST CALL LIST @@ -1999,22 +1882,22 @@ NOFIL: CALL STRTLIN POP HL POP BC - JR L1080 + JR NEXCD OUTLIN: CALL LIST LD A,(LSTFCB) CP 'Z' RET Z - LD HL,L1B0F + LD HL,LINFLG LD A,(HL) - LD (HL),0FFH + LD (HL),-1 OR A - JR NZ,CRLF + JR NZ,CRLF ;Output line only if first time OUTLN: CALL NEXTCHR CALL LIST - CP 10 + CP 10 ;Output until linefeed found JR NZ,OUTLN RET @@ -2022,76 +1905,77 @@ PRTCNT: LD HL,ERCNTM CALL PRINT LD HL,(ERRCNT) - CALL L1362 - CALL L1384 + CALL CONV10 + CALL PRNT10 CRLF: LD A,13 CALL LIST LD A,10 JR LIST -L1108: - CALL L1151 +DEFBYT: + CALL FIXUP EX DE,HL - CALL L055B + CALL SIGNEXT ;See if in range +127 to -128 EX DE,HL - JR Z,L1123 + JR Z,OBJBTE ;If so, it's always OK LD A,D - OR A - JR Z,L1128 + OR A ;Check for range +255 to -256 + JR Z,CHKJMP INC A - JR Z,L1128 -L111E: - LD A,101 + JR Z,CHKJMP +RNGERR: + LD A,101 ;Value out of range LD (ERR),A -L1123: +OBJBTE: LD A,E - JP L107D -L1128: + JP OBJBT +CHKJMP: +;Check for short jump. If so, we're out of range; otherwise we're OK LD A,(COUNT) - DEC A - JR NZ,L1123 - LD A,(L1B10) - CP 0EBH - JR Z,L111E + DEC A ;Only one other byte on line? + JR NZ,OBJBTE ;Can't be short jump if not + LD A,(PREV) ;Get the first byte of this line + CP 0EBH ;Direct short jump? + JR Z,RNGERR AND 0FCH - CP 0E0H - JR Z,L111E + CP 0E0H ;LOOP or JCXZ instruction? + JR Z,RNGERR AND 0F0H - CP 70H - JR Z,L111E - JR L1123 + CP 70H ;Conditional jump? + JR Z,RNGERR + JR OBJBTE -L1144: - CALL L1151 +DEFWRD: + CALL FIXUP LD A,E - CALL L13BB + CALL SAVCD LD A,D - JP L107D + JP OBJBT -L1151: +FIXUP: PUSH BC - LD E,(HL) + LD E,(HL) ;Get pointer to symbol INC HL LD D,(HL) INC HL EX DE,HL - LD A,(HL) + LD A,(HL) ;Whether symbol was defined INC HL - LD C,(HL) + LD C,(HL) ;Get symbol value INC HL LD B,(HL) EX DE,HL - LD E,(HL) + LD E,(HL) ;Get constant part INC HL LD D,(HL) EX DE,HL - ADD HL,BC + ADD HL,BC ;Add symbol value to constant part POP BC EX DE,HL - OR A + OR A ;See if symbol got defined RET NZ - LD A,64H + LD A,100 ;Undefined - flag error LD (ERR),A LD DE,0 RET @@ -2099,7 +1983,7 @@ L1151: STRTLIN: XOR A LD (ERR),A - LD (L1B0F),A + LD (LINFLG),A LD HL,(PC) LD A,H CALL PHEX @@ -2111,18 +1995,18 @@ LIST: PUSH AF LD A,(LSTFCB) CP 'Z' - JR Z,L11ED + JR Z,OUTRET CP 'X' - JR Z,L11F2 + JR Z,LSTCON POP AF PUSH AF AND 7FH PUSH HL LD HL,(LSTPNT) LD (HL),A - CALL L1546 + CALL INCBUF LD (LSTPNT),HL - JR NZ,L11EC + JR NZ,HAVSPC LD HL,LSTBUF LD (LSTPNT),HL PUSH DE @@ -2135,15 +2019,15 @@ LIST: CALL 5 POP BC POP DE -L11EC: +HAVSPC: POP HL -L11ED: +OUTRET: POP AF RET -L11F2: +LSTCON: POP AF PUSH AF - CALL OUT + CALL OUTA POP AF RET @@ -2155,34 +2039,41 @@ PHEX: CALL LHALF JR LIST -L1214: - INC A - JR Z,L125B +SPCFUN: + INC A ;End of file? + JR Z,FINI INC HL - LD E,(HL) + LD E,(HL) ;Get address INC HL LD D,(HL) PUSH HL - INC A - JR Z,L1253 - INC A - JR Z,L124D + INC A ;ORG? + JR Z,DORG + INC A ;PUT? + JR Z,DPUT +DDS: +;Handle DS pseudo-op LD HL,(PC) ADD HL,DE LD (PC),HL LD HL,(HEXADD) ADD HL,DE LD (HEXADD),HL - JR L1257 -L124D: + JR SPEND + +DPUT: +;Handle PUT pseudo-op LD (HEXADD),DE - JR L1257 -L1253: + JR SPEND + +DORG: +;Handle ORG pseudo-op LD (PC),DE -L1257: +SPEND: POP HL - JP L1080 -L125B: + JP NEXCD + +FINI: CALL PRTCNT LD A,(HEXFCB) CP 'Z' @@ -2193,22 +2084,22 @@ L125B: LD A,':' CALL PUTCHR LD B,10 -L1276: +HEXEND: PUSH BC LD A,'0' CALL PUTCHR POP BC - DJNZ L1276 - CALL L14F4 - CALL NZ,L13B3 - CALL L13B3 + DJNZ HEXEND + CALL HEXCRLF + CALL NZ,HEXEOF + CALL HEXEOF LD C,CLOSE LD DE,HEXFCB CALL SYSTEM SYMDMP: LD A,(SYMFLG) CP 'S' - JR NZ,L12B4 + JR NZ,ENDSYM LD HL,SYMMES CALL PRINT LD DE,(BASE) @@ -2217,25 +2108,24 @@ SYMDMP: JR Z,EXIT LD HL,(HEAP) LD SP,HL - CALL L12E5 -L12B4: + CALL NODE +ENDSYM: LD A,(LSTFCB) CP 'X' JR Z,EXIT CP 'Z' - JR Z,L12CA - CALL L12D6 + JR Z,ERRCON ;Print error count to console + CALL LSTEOF LD DE,LSTFCB LD C,CLOSE CALL 5 -L12CA: +ERRCON: LD A,'X' LD (LSTFCB),A CALL PRTCNT EXIT: JP 0 RET - -L12D6: +LSTEOF: LD HL,(LSTPNT) LD DE,LSTBUF OR A @@ -2243,9 +2133,9 @@ L12D6: RET Z LD A,1AH CALL LIST - JR L12D6 + JR LSTEOF -L12E5: +NODE: EX DE,HL PUSH HL LD E,(HL) @@ -2257,27 +2147,27 @@ L12E5: LD D,(HL) LD A,E OR D - CALL NZ,L12E5 + CALL NZ,NODE POP HL LD B,(HL) INC HL - LD A,0AH + LD A,SYMWID SUB B - JR NC,L1315 + JR NC,LENOK LD A,1 -L1315: +LENOK: LD D,A -L1317: +WRTSYM: LD A,(HL) INC HL CALL LIST - DJNZ L1317 + DJNZ WRTSYM LD B,D INC B - LD A,20H -L1329: + LD A,' ' +OUTB: CALL LIST - DJNZ L1329 + DJNZ OUTB INC HL INC HL PUSH HL @@ -2297,13 +2187,13 @@ L1329: LD D,(HL) LD A,D OR E - JR NZ,L12E5 + JR NZ,NODE RET -L1362: - LD B,10H +CONV10: + LD B,16 LD DE,0 -L1367: +CONVLP: ADD HL,HL LD A,E ADC A,A @@ -2314,64 +2204,64 @@ L1367: DAA LD D,A RL C - DJNZ L1367 + DJNZ CONVLP RET -L1384: +PRNT10: EX DE,HL - LD B,10H + LD B,'0'-' ' ;Enable leading zero suppression LD A,C - CALL L13A0 + CALL LODIG LD A,H - CALL L13AE + CALL HIDIG LD A,H - CALL L13A0 + CALL LODIG LD A,L - CALL L13AE + CALL HIDIG LD A,L - LD B,0 -L13A0: + LD B,0 ;Don't suppress last digit +LODIG: CALL LHALF -L13A3: - CP 30H - JR Z,L13A9 - LD B,0 -L13A9: - SUB B +DIGIT: + CP '0' + JR Z,SUPZ + LD B,0 ;Turn off zero suppression if not zero +SUPZ: + SUB B ;Convert leading zeros to blanks JP LIST -L13AE: +HIDIG: CALL UHALF - JR L13A3 + JR DIGIT -L13B3: +HEXEOF: LD A,1AH CALL PUTCHR - JR NZ,L13B3 + JR NZ,HEXEOF RET -L13BB: - LD (L1B10),A +SAVCD: + LD (PREV),A PUSH HL PUSH BC PUSH AF PUSH DE - CALL L144E + CALL CODBYT POP DE LD HL,COUNT INC (HL) LD A,(HL) CP 7 - JR NZ,L13E9 + JR NZ,NOEXT LD (HL),1 - LD A,20H + LD A,' ' CALL OUTLIN - LD A,20H + LD A,' ' LD B,5 -L13E2: +TAB: CALL LIST - DJNZ L13E2 -L13E9: + DJNZ TAB +NOEXT: POP AF CALL PHEXB POP BC @@ -2385,14 +2275,14 @@ L13E9: RET REPERR: - OR A ;Did an error occur? + OR A RET Z PUSH AF - LD HL,ERRMES ;Print "ERROR" + LD HL,ERRMES CALL PRINT POP AF CALL PHEX - LD HL,HEXSUF + LD HL,ENDMES CALL PRINT LD HL,(ERRCNT) INC HL @@ -2407,7 +2297,7 @@ PRINT: INC HL JR PRINT -OUT: +OUTA: LD E,A LD C,2 SYSTEM: @@ -2420,13 +2310,11 @@ SYSTEM: POP BC RET -L144E: +CODBYT: PUSH AF LD A,(HEXFCB) CP 'Z' - JR NZ,L145E - JP L11ED -L145E: + JP Z,OUTRET LD DE,(LASTAD) LD HL,(HEXADD) LD (LASTAD),HL @@ -2477,7 +2365,7 @@ ENHEXL: LD B,A CALL UHALF LD (HL),A - CALL L1546 + CALL INCBUF LD A,B CALL LHALF LD (HL),A @@ -2488,7 +2376,7 @@ ENHEXL: NEG CALL HEXBYT -L14F4: +HEXCRLF: LD A,13 CALL PUTCHR LD A,10 @@ -2496,15 +2384,15 @@ L14F4: PUTCHR: LD HL,(HEXPNT) LD (HL),A - CALL L1546 + CALL INCBUF LD (HEXPNT),HL RET NZ PUSH HL - LD HL,L1B0E + LD HL,SKPFLG LD A,(HL) - LD (HL),0 + LD (HL),0 ;Buffer filled, don't skip next time POP HL - OR A + OR A ;Both buffers filled? RET NZ LD C,SETDMA EX DE,HL @@ -2531,11 +2419,11 @@ LHALF: ADD A,7 RET -L1546: +INCBUF: INC HL PUSH DE PUSH HL - LD DE,HEXBUF+128 + LD DE,HEXBUF+BUFSIZ OR A SBC HL,DE POP HL @@ -2543,7 +2431,7 @@ L1546: RET Z PUSH DE PUSH HL - LD DE,LSTBUF+128 + LD DE,LSTBUF+BUFSIZ OR A SBC HL,DE POP HL @@ -2551,23 +2439,19 @@ L1546: RET Z PUSH DE PUSH HL - LD DE,L1B9B+128 + LD DE,HEXBUF+BUFSIZ+BUFSIZ OR A SBC HL,DE POP HL POP DE RET NZ - LD HL,HEXBUF + LD HL,HEXBUF ;Wrap back to first buffer RET NONE: DB 0 ; 8086 MNEMONIC TABLE -; This table is actually a sequence of subtables, each starting with a label. -; The label signifies which mnemonics the subtable applies to--A3, for example, -; means all 3-letter mnemonics beginning with A. - A3: DB 7 DB 'dd' @@ -3067,19 +2951,6 @@ X4: OPTAB: -; Table of pointers to mnemonics. For each letter of the alphabet (the -; starting letter of the mnemonic), there are 5 entries. Each entry -; corresponds to a mnemonic whose length is 2, 3, 4, 5, and 6 characters -; long, respectively. If there are no mnemonics for a given combination -; of first letter and length (such as A-2), then the corresponding entry -; points to NONE. Otherwise, it points to a place in the mnemonic table -; for that type. - -; This table only needs to be modified if a mnemonic is added to a group -; previously marked NONE. Change the NONE to a label made up of the first -; letter of the mnemonic and its length, then add a new subsection to -; the mnemonic table in alphabetical order. - DW NONE DW A3 DW NONE @@ -3214,8 +3085,8 @@ OPTAB: HEADER: DB 13,10,'Seattle Computer Products 8086 Assembler Version 2.00' DB 13,10,'$' ERRMES: DM '***** ERROR no. ' -NOSPAC: DB 13,10,'No directory space',13,10,'$' -HEXSUF: DM 'H',13,10 +NOSPAC: DB 13,10,'No directory space',13,10,24H +ENDMES: DM 'H',13,10 NOMEM: DB 13,10,'Insufficient memory',13,10,'$' NOFILE: DB 13,10,'File not found',13,10,'$' WRTERR: DB 13,10,'Disk write error',13,10,'$' @@ -3235,7 +3106,7 @@ PC: DS 2 OLDPC: DS 2 LABPT: DS 2 FLAG: DS 1 -L1A98: DS 1 +LONG: DS 1 ADDR: DS 2 ALABEL: DS 2 DATA: DS 2 @@ -3261,19 +3132,18 @@ HEXADD: DS 2 LASTAD: DS 2 HEXCNT: DS 1 CHKSUM: DS 1 -L1B0E: DS 1 -L1B0F: DS 1 -L1B10: DS 1 +SKPFLG: DS 1 +LINFLG: DS 1 +PREV: DS 1 IFFLG: DS 1 CHKLAB: DS 1 LSTPNT: DS 2 ERRCNT: DS 2 LSTRET: DS 2 RETPT: DS 2 -HEXBUF: DS 128 -L1B9B: DS 128 -LSTBUF: DS 128 +HEXBUF: DS BUFSIZ+BUFSIZ +LSTBUF: DS BUFSIZ DS 50 STACK: EQU $ START: EQU $ - \ No newline at end of file + \ No newline at end of file diff --git a/CPM Tools/README.md b/CPM Tools/README.md index 2fd604b..4a2c582 100644 --- a/CPM Tools/README.md +++ b/CPM Tools/README.md @@ -45,9 +45,6 @@ where This assembler can only produce Intel HEX files for object code, therefore you must convert them to binary before they can be executed on the 8086. Under CP/M, this can be done using the LOAD command. If you are using CDOS, which does not have LOAD, you will have to use DEBUG to load the .HEX file to memory and SAVE to save the loaded pages as a disk file. -> [!TIP] -> Don't forget to rename the source files from .ASM to .A86. - ## TRANS86 This is a reconstruction of the SCP Z80 to 8086 Translator shipped together with ASM86. Like ASM86, original copies are long gone and this is the 8086 version from 86-DOS 0.11 translated back to Z80. diff --git a/CPM Tools/TRANS86.Z80 b/CPM Tools/TRANS86.Z80 index d8c4d49..c7092ba 100644 --- a/CPM Tools/TRANS86.Z80 +++ b/CPM Tools/TRANS86.Z80 @@ -182,20 +182,20 @@ GETCH: LD DE,GETBUF ; Set `DMA address'. LD C,SETDMA CALL SYSTEM - LD DE,FCB ; Read the next record from source file. + LD DE,FCB ; Read the next record from source file. LD C,READ CALL SYSTEM - OR A ; Entire record read OK? - LD A,EOF ; Force end-of-file character in case + OR A ; Entire record read OK? + LD A,EOF ; Force end-of-file character in case JR NZ,TESEND ; there is nothing in the record. LD HL,GETBUF ; Reset buffer pointer. GETIT: - LD A,(HL) ; Get next character from buffer. - INC HL ; Point to next character. + LD A,(HL) ; Get next character from buffer. + INC HL ; Point to next character. LD (GETPT),HL ; Save new pointer. TESEND: LD (CHAR),A - JR NOTAF ; Pop registers and return. + JR NOTAF ; Pop registers and return. LOAD: CALL DELIM JR Z,LOADOP @@ -450,7 +450,7 @@ LD: JP Z,STAX ;If immediate move, check for byte memory reference LD A,(OP1) - CP '[' ;Memory reference? + CP '[' ;Memory reference? JR NZ,TWOOPS LD A,(OP1+1) ;Referencing IX as a word? CP RIX @@ -458,7 +458,7 @@ LD: CP RIY JR Z,TWOOPS LD A,(OP2) - CP 20H ;Could be immediate? + CP 20H ;Could be immediate? LD A,9 CALL NC,BFLAG ;Add "B," CALL TRAN1 @@ -661,7 +661,7 @@ DAD: INCDEC: LD A,(OP1) - CP RCX+1 ;16-bit? + CP RCX+1 ;16-bit? JP NC,ONEOP LD HL,LAHF CALL OUTSTR @@ -1123,4 +1123,4 @@ RCH: DS 1 RAL: DS 1 RIX: DS 1 RIY: DS 1 - \ No newline at end of file + \ No newline at end of file diff --git a/Disk Images/86-DOS 0.11 Source Code.img b/Disk Images/86-DOS 0.11 Source Code.img index 79f10ecaea7be58dd2d7c43f49f74e59ef2839d8..82e75e4f069bfd72fd46faef8d0b36d7e785e638 100644 GIT binary patch delta 15861 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 Pl$mj(zz0c8d_fWby`4mW delta 19695 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 diff --git a/Disk Images/Cromemco CDOS with Build Tools.img b/Disk Images/Cromemco CDOS with Build Tools.img index 50a81795b5a42bde3620bbaf0d6c95ad720fce9f..2f6cd5032a63b5a27c90a3ecba590fec94249eb4 100644 GIT binary patch delta 4882 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 delta 5137 zcmZp;#NTj?29v-e{5tI;Pl@h*Y@Q=%a{hv9=QguenNtzAy@0h+VaIbmB zxZ&X8(;PL=7#D6htISc`-rl|$Bp@d1bvTO2DpTyA4xi|uD5kSZSpG$8==@{V@cYN4 zA^VS6L-HSshUogU6PUGx#gzEPv_!>}1jQo67^_ZRJ-dYEV%5pBOIYj}&rVZ;+QE8IaE;oA#!OJ3ioM*4|3oZPQ)NIWcc=`I|;V7oFt6Bc> znxFV*ZGM7}>zl&A#9L8J|Ee!VF)2!ju`!ghD4&gG`e$Il_f6qnwE@RJD~mV(5)EGX zR~U(lZLd6eb}4Ixt%8)5gxJ3vJ_bQ9F%6l2NrIeW8lwNo`4~0$*V{fl!@>5j>PQQl zQKs0**L609db7{Fftr=zhzVj;&WflNacS_$^`i z$Ed)3xSHi3g97v6UY37K3e1NkSpTVO{QSqvCjyG+)9!qXr$F(|$NZ03L-iV~hPEvq zi-wS`1}h)a;V34K)9Htzn7$cE$Z$;3ZKzlD7qvMh#I)Y1hC%S4=viqd!ABrc@jt^& zMF$C`e6hcZ_7Wg>FpDW=i79o9X)AS#X|XXV<%rp_7!`}HH)<9$Y7qm4iPWiOJa+$$ zGR4jovV-F7|CuE$|Ex8*|M6~}_q3v36@CUTrL;9#@@g}*lQ z;V33MR*AQY5@LSJb&8Q}V$5<3|0*<0#F+l&Xz0nY{L9eL5Mz;JP>h|tNY9c*LhP*U z=;jIb&J((wPQG-l_RFDt*w+Jw!U1cTkNFv>3>>TVl`Veq|YX@ zS?~z5Fi6&IKcO6_9Cq^Q+4pRZi?oX$o;>@W?QL+D*hwpKv11%sIb!i*3~z&!a>N*4 zgI%Gk!2UK!Nmxu`mZZcF4nDTi@e16h?{g@Lihca2&BuBuib@gOrOtF(z8DjrH ze&qxeDH31aMzf09F&brx9gYR(G8K)tMww!ud~_+6>0jcdQ>_22KrDk>u}q4YVrGnI zm$GWt@v$p1F#OBVDCW7VC?R&2v2K!a0}J!jvnrF@jCFXFISzu#oo@#=A6A~c&)BK{ z8IxAN*xR5>{7hFB#l`%1*cje!U}Je*s4Vbjefhj%`9fds9dbX zE~Z>`xQF#{6q6RSm=delSylF1?-=V9#l<9w&K}}@eKwutwFXbsb`2gI4NkjMqf)Wz z!)&}(C1SP;->jO%{=L?C_3Y2T2O3YFefU?PaZlpm*+ab5XUqAk4zuwdjZ+R&eqE>R zr|kARPC4u~=fT(857?y`m5K>6Fq~X(R4QiFD5k|MR&&;vulB4lpPj;2t4E^$qBQjC z|3zr%fE?5*_8OcBGd5QD5%aT&(ahDaO z&f~7iE11V!U64PIyE-p_9(Q40@jUKI*5rz+dEAflKnB(1feb0i1L-Kw1DR0IoSOKW zvp1#qHRsXP;@6x=5ar&&reBG=2)Z5Q2}w(SFl$PMKOUr#wQ12@r!-ju3>De zA!4f`XL~4%$L_C$mKC$uGsY8&j0~@}n8hTOn8jY({gDuPt;H@@vz1TjR1{OOa?wd8 zW-+^eXA?PU&n9xzoK56lJ8;;5!<~=iY%LR?_~9rfcRt2?5WC@RbdZMDSuX)QtF!q6 zc7KfO#MT?ti)odKDOHG_)f2F)29s4Fa{XC7fsgKr^pj9E}es;D%`Pr3VnR2^dMs;FV^sIYw(LP zM99cUa@Z=o;o~_R#RN)(b+2DCa(11qWnw(WQ1g%B3=hXMMh#B89a}-co5NwZ0n8}o zsQJgBAyK>iM19R!agJ{X&MI?!{Q9i^sa7k*U9DmY5{kXzO08m7UmxX@I?Ku+_(+sb z^eijG!HW++p8WXr>=pixCqe!^`-K-201{hlG&Dg4(^DG_NgE9TXsl>eiAgF|iAiw1 z4XzTCV0jzNEcWm)C-2!TUaNzk^siZORVViE_YqLg*D~>aJNurUZN=fkT%c6I!Y6Ym ziiu6Fy1l)911KNpF*7ps|6@4C&B+$=kNK1^CmZ`e7L5mdB8Q`xj0(j-Z4jojZs0bE zj#Z(U0_)ji9*LL#m=rj)_{C2DRpJ-heyEt^a1KY!Ry#%w7NcgdlScI|V(ZU-X9U-W z`6=bf9BUIZ(v&&o=OyGC7|WrFU{N zFqM`hWpX|%Eh)FjBC|0%k&>pVWknH^W&>pVSClBx8@@M-e!R*iW z?dVxOWg|W3 zn5zCUYq0)fIuykO%4i>-F+ALUfKTc*s7-bd6u;N`UvEF5m?U~wh)G^vUj7;XH-mpx zH;%ENRKEIDkXL;B+n|RRPk@*bFlN1AFGTo&Vz1aq2KJPcZ=6hdDOo3SVsiPf1g z{4HnD$`^b3_o1>ukON8`n`ggR}Vp2L-;L%@8<}&wnYBl_&NuSV2^AzUbN0{BNVP#Hu!H zsA}bi{XF}Q4^)Il)N6?Ui_+jedzTNCLj=yUGT22JJrX^e#e0~6;iOip7$kg7*h!uJ z!YlFq_0u>p24%@O<*@2aN8a&0bW_$)IjhQU@j+2sOmK&&8_QW)c7@05jatM`DmH_> z#iz3UR20)mJ{GqB6=!uhcon{btc}v(hqj69`9W=${|qgb;99GeiLc>o{d@M)7fyH7JY)O{O7|a6fphp_NCN-IsG-d#@{j3M6w^Nz5W%d# za{BY>-**2&1>Q4@&F)rQV%sY?t#Xo;Iez4%D0BSD$yDa}m7A>0@inPjnPWzIiZaJc z=ER(wt6Z~k3zC#MmgN?dD|0MoO|s=-EVt!hsL!?KVJhzAWCZDBNlg~#^2{tt;xYgw ze05O5*JsQx&r|033sUf#xv;d8lc_lQ8~2U8lw~{&jCm=UX)}5F#kOd0sA#Z)EAY3` zf?`_ypoFGSeKwJ!3S5DObJU!!&|p2Q%OSxAX^KC*c<^Mc&(V5F=BPYf!NzbzmqX&^ z(W_6{82r!ba#XT4JUjl6O@s5<0gcQ54rrWr*Wwm?8_g>wvGlASGo!)(e+(KzYytn6 zHAL9#xF#4d*)fLKDWCnqEAZ2a#ZCdl_^qt`R9RVBx$dknpEig%Tgm${PC2YC^ zYyyG|44RV{*$UOi^4FZr;;%Uy%U^poi@%nQ;p}{Ye+C*%Yzz|)f8jklTR`HYoz&TU z0fnC@jhe)s9{qat>_b5VCW+d*v*rBC0`DbWo))xVKD?c`?%y{H=EDwrN1rN|h}p4C zGh=YKQ_$c(`-K;R1iqg2<$YN9^y~(Ht5UJE8~D#Y;C*dIBj%VKwpXLCk zbPd^$w*OvgFxkC0s|>2Iz^y#t?cjFa;T(>SpjKcGs3FKF@{jRQ6w~1xj<29D603&H zzj|H`lYiD424@YK4?^3C70>=bYJ5-vS77=04WgP?L-n7vhT=b+GfP+`E-*0Wlqhq2 zVN3*5OnI4{PtrO$Sy=Lt#km~wk}^4;bYN6&EqafoyT30GmpC_X&!e`;ymv1^m*L%`SZ97isx}xB+uh663i{Q z%Jm9VahB$#&f_l4%VGP+a!P^+T!Dkyf0dghc2sPJRP|TSsxUuf6lt?#*>ft2Y1gSJ zCObwri(!w3!Y&QDnq7QihoYGN)iWPi!&JLngZ*{w_L?JWnCvEi40#Pw&c}F`7t~t? zRd)yfF=_~0W0sZO3~owSeB(IGe^Idn)NEr{5HMr3Q#k9(Yp1}*3QqbT&%Wn92(3l5 zs>GC)s>B|i+hD=W2&ovb_ig?IZ8Wr^?cd`w5LK0V9I z0Lr3Y!3`Y+=EGWiZ=-9(w5r6EYQ%)WtsV`I?Qc=i3MidGaHC*5IIZ*vP8VDQW*rrL zC+H#skwuWnLd8Opgsc||ofp_7v==IU3QFG+x-aw!%Kk3IB+M_2&aoVN-%2!m;~`r@m8q#9^pe!7OMPtf%B6sT=X_KxHK?H6%}XZ=P4NJ z85r<#sc3