PARPRINTASMSERPRINTASM1 SERREMOTASM8 SREMOTBSASMSERCONSLASM8CLOCKSL1ASM/ !CLOCKSL2ASM/"#$%&'CLOCKSL3ASM/()*+,- ;BUSY, WAIT UNTIL READY ANI PBSTAT ; **JR Z,PROUT** DB 28H, (PROUT-$-1) AND 0FFH MOV A,C ;SEND DATA OUT STA PBUF RET FLAG DB 0 PREND END -------------------- ORG 100H ORIGIN EQU 0F200H OFFS SET ORIGIN-PRINT CR EQU 0DH LF EQU 0AH MAP EQU 0E1F8H ;CPS ROM/RAM MAP REG AUTLF EQU 0E1F0H ;CPS RAM LOC FOR AUTO LF (BIT 2) STAT EQU 0E1F9H ;WAS ALREADY CLEAR, GO OUTPUT DB 30H, (PROUT-$-1) AND 0FFH MOV A,C CPI LF ;ELSE, NO OUTPUT FOR LF ONLY ; **JR NZ,PROUT** DB 20H, (PROUT-$-1) AND 0FFH RET CRET MVI A,RAMPG2 ;IF CR, SET UPARCLOCKASM/./0123EXCONSL BAS4APPLESCRBAS5DISPLAY BAS 67LIST BAS89:CONFIGIOBAS:;<=>?@ABPARPRINTCOMCSERPRINTCOMD ;MAKE ONE PATCH DW ORIGIN ;DESTINATION OF DRIVER DW PREND-PRINT ;LENGTH OF DRIVER DB 1 ;PATCH TYPE 1 DB 10 ;LIST OUTPUT VECTOR #1 DW PRINT+OFFS ;VECTOR TO DRIVER PRINT LXI;CPS PARALLEL PORT STAT (BIT 6) PBUF EQU 0E1FDH ;CPS PARALLEL PORT BUFFER RAMPG2 EQU 20H ;RAM PAGE 2 AUTLFB EQU 4 ;AUTO LF BIT MASK (BIT 2) PBSTAT EQU 40H ;BUFFER STAT BIT MASK (BIT 6) ; DB 1 P FLAG (BIT 0) STA MAP LDA AUTLF MVI M,1 ANI AUTLFB ;FLAG SET IF AUTLF BIT OFF ; **JR Z,CRETX** DB 28H, (CRETX-$-1) AND 0FFH MVI M,0 CRETX XRA A STA MAP PROUT LDA STAT ;-------------------------------------------------- ; CPS PARALLEL PRINTER DRIVER ; FILE NAME: PARPRINT.ASM ; PROGRAMMER: DAVE SANDERS ; DATE: AUGUST 10, 1981 ; (C) 1981 MOUNTAIN COMPUTER, INC. ;------------------------------SERREMOTCOMESREMOTBSCOMFSERCONSLCOMGCLOCKSL1COMHCLOCKSL2COMICLOCKSL3COMJPARCLOCKCOMKDOWNLOADCOML H,FLAG+OFFS MOV A,C CPI CR ;OUT DATA = CR ? ; **JR Z,CRET** DB 28H, (CRET-$-1) AND 0FFH MOV A,M ;NO, TEST + CLEAR FLAG ANI 1 RAR MOV M,A ; **JR NC,PROUT** ;----------------------------------------------- ; CPS SERIAL PRINTER DRIVER ; FILE NAME: SERPRINT.ASM ; PROGRAMMER: DAVE SANDERS ; DATE: AUGUST 17, 1981 ; (C) 1981 MOUNTAIN COMPUTER, INC. ;-----------------------------------O ABSOLUTE OR IMPLICIT MODE ;--------------------------------------------------------- ; DB 1 ;MAKE ONE PATCH DW ORIGIN ;DESTINATION OF DRIVER DW SEND-START ;LENGTH OF DRIVER DB 1 ;PAT502 CODE TO BE ; PSEUDO-ASSEMBLED BY THE 8080 ASSEMBLER ;--------------------------------------------------------- ADC6 EQU 6DH !CLD6 EQU 0D8H !JSR6 EQU 20H !RTS6 EQU 60H AND6 EQU 2DH !CLI6 EQU 58H !LDA6 EQU 0ADH !SBC6 EQU 0EDH ASL6 EQU 0EH H+SLOT ;CPS ROM/RAM MAP REG AUTLF EQU 0E0F0H+SLOT ;CPS RAM LOC FOR AUTO LF (BIT 2) A65Z EQU 0F045H ;PASS AREA FOR 6502 A-REG X65Z EQU 0F046H ;PASS AREA FOR 6502 X-REG Y65Z EQU 0F047H ;PASS AREA FOR 6502 Y-REG PC65Z EQU -4 ;IMMEDIATE MODE ZP EQU -8 ;ZERO-PAGE MODE ABSX EQU +10H ;ABSOLUTE,X MODE ABSY EQU +0CH ;ABSOLUTE,Y MODE ZPX EQU +8 ;ZERO-PAGE,X MODE XINDIR EQU -0CH ;(INDIRECT,X) MODE INDIRY EQU +4 ;(INDIRECT),Y MODE ABSIND EQU +20H ;ABS INDIRT 2) SCRLO EQU 0 ;CONTROL SET SCR BIT LOW SCRHI EQU 80H ;CONTROL SET SCR BIT HIGH XMTST EQU 0C1H ;XMIT READY STATUS XMTC EQU 23H ;XMIT CONTROL BYTE XMTC2 EQU 27H ;XMIT W/ RECV ENABLE RCVST EQU------------ ORG 100H SLOT EQU 100H ;PRINTER IN SLOT 1 ; ;------------------------------------------- ; PROGRAM ORIGINS AND OFFSETS ;------------------------------------------- ORIGIN EQU 0F180H+(SLOT/2) ;PROGRAM ORIGIN, Z6 EQU 0DH !STX6 EQU 8EH BMI6 EQU 30H !DEX6 EQU 0CAH !PHA6 EQU 48H !STY6 EQU 8CH BNE6 EQU 0D0H !DEY6 EQU 88H !PHP6 EQU 8H !TAX6 EQU 0AAH BPL6 EQU 10H !EOR6 EQU 4DH !PLA6 EQU 68H !TAY6 EQU 0A8H BRK6 EQU 0H !INC6 EQU 0EEH !PLP6 EQU 28H !TSX6 E!CLV6 EQU 0B8H !LDX6 EQU 0AEH !SEC6 EQU 38H BCC6 EQU 90H !CMP6 EQU 0CDH !LDY6 EQU 0ACH !SED6 EQU 0F8H BCS6 EQU 0B0H !CPX6 EQU 0ECH !LSR6 EQU 4EH !SEI6 EQU 78H BEQ6 EQU 0F0H !CPY6 EQU 0CCH !NOP6 EQU 0EAH !STA6 EQU 8DH BIT6 EQU 2CH !DEC6 EQU 0CEH !ORA 0F3D0H ;PASS AREA FOR 6502 PC-REG SSZ80 EQU 0F3DEH ;HOLDS ADDRESS FOR Z80/6502 SWAP ;------------------------------------------- ; 6502 ADDRESS EQUATES ;------------------------------------------- STAT65 EQU 0C0FBH+SLOT ;SERIAL STECT MODE ACCUM EQU -4 ;ACCUMULATOR MODE IMM0 EQU -0CH ;IMMEDIATE MODE ABSY0 EQU +10H ;ABSOLUTE,Y MODE ZPY EQU +8 ;ZERO-PAGE,Y MODE ;NONE OF ABOVE, DEFAULT T 0C2H ;RECV READY STATUS RCVC EQU 16H ;RECV CONTROL BYTE ;------------------------------------------- ; ;6502 EQUATES FROM MAC6502.ASM ;--------------------------------------------------------- ; SYMBOLIC EQUATES TO PERMIT 680 MAP ORIG65 EQU 180H+(SLOT/2) ;PROGRAM ORIGIN, 6502 MAP OFFS SET ORIGIN-START OF65 SET ORIG65-START ;------------------------------------------- ; Z80 ADDRESS EQUATES ;------------------------------------------- MAP EQU 0E0F8QU 0BAH BVC6 EQU 50H !INX6 EQU 0E8H !ROL6 EQU 02EH !TXA6 EQU 8AH BVS6 EQU 70H !INY6 EQU 0C8H !ROR6 EQU 6EH !TXS6 EQU 9AH CLC6 EQU 18H !JMP6 EQU 4CH !RTI6 EQU 40H !TYA6 EQU 98H ;-------------------------------------------------------- IMM EQU YPE INDICATOR ;------------------------------------------- ; CONSTANT EQUATES ;------------------------------------------- CR EQU 0DH LF EQU 0AH RAMPG1 EQU 10H ;CPS RAM PAGE 1 AUTLFB EQU 4 ;AUTO LF BIT MASK (BIATUS REG (READ) CMD65 EQU 0C0FBH+SLOT ;SERIAL COMMAND REG (WRITE) DATA65 EQU 0C0FAH+SLOT ;SERIAL DATA REG CTRL65 EQU 0C0FEH+SLOT ;SERIAL CONTROL REG (WRITE) INIT65 EQU 0C000H+SLOT ;ENTRY TO CPS INIT ROUTINE CTYP65 EQU 3B8H+SLOT/100H ;CARD TCH TYPE 1 DB 10 ;LIST OUTPUT VECTOR #1 DW START+OFFS ;VECTOR TO DRIVER START LXI H,FLAG+OFFS MOV A,C CPI CR ;OUT DATA = CR ? ; **JR Z,CRET** DB 28H, (CRET-$-1) AND 0FFH SLOT ;CPS ROM/RAM MAP REG AUTLF EQU 0E0F0H+SLOT ;CPS RAM LOC FOR AUTO LF (BIT 2) A65Z EQU 0F045H ;PASS AREA FOR 6502 A-REG X65Z EQU 0F046H ;PASS AREA FOR 6502 X-REG Y65Z EQU 0F047H ;PASS AREA FOR 6502 Y-REG PC65Z EQU 0** DB 28H, (CRETX-$-1) AND 0FFH MVI M,0 CRETX XRA A STA MAP SROUT LXI H,A65Z ;SEND DATA TO 6502 A-REG MOV M,C LXI H,SERLST+OF65 SHLD PC65Z LHLD SSZ80 MOV M,A ------------------- ORG 100H SLOT EQU 200H ;REMOTE IN SLOT 2 ; ;------------------------------------------- ; PROGRAM ORIGINS AND OFFSETS ;------------------------------------------- ORIGIN EQU 0F280H ;PROGRAM ORIGIN, SERWT DB LDA6 ;WAIT FOR OUT BUFFER EMPTY DW STAT65 DB AND6+IMM DB XMTST DB CMP6+IMM DB XMTST DB BNE6 DB (SERWT-$-1) AND 0FFH DB PLA6 ;OUTPUT MOV A,M ;NO, TEST + CLEAR FLAG ANI 1 RAR MOV M,A ; **JR NC,SROUT** ;WAS ALREADY CLEAR, GO OUTPUT DB 30H, (SROUT-$-1) AND 0FFH MOV A,C CPI LF ;ELSE, NO OUTPUT FOR LF ONLY ;SWITCH TO 6502 ROUTINE RET FLAG DB 0 ;------------------------------------ ; 6502 CODE ROUTINE ;------------------------------------ SERLST DB PHA6 DB LDA6 ;CHECK IF INIT NEEDED DW CTYP65 Z80 MAP ORIG65 EQU 280H ;PROGRAM ORIGIN, 6502 MAP OFFS SET ORIGIN-INPUT OF65 SET ORIG65-INPUT ;------------------------------------------- ; Z80 ADDRESS EQUATES ;------------------------------------------- MAP EQU 0E0F8H+DATA CHARACTER DB STA6 DW DATA65 DB RTS6 ; SEND END  DB CMP6+IMM DB XMTST DB BNE6 DB (SERWT-$-1) AND 0FFH DB PLA6 ;OUTPUT ; **JR NZ,SROUT** DB 20H, (SROUT-$-1) AND 0FFH RET CRET MVI A,RAMPG1 ;IF CR, SET UP FLAG (BIT 0) STA MAP LDA AUTLF MVI M,1 ANI AUTLFB ;FLAG SET IF AUTLF BIT OFF ; **JR Z,CRETX;-------------------------------------------------- ; CPS SERIAL REMOTE DRIVER ; FILE NAME: SERREMOT.ASM ; PROGRAMMER: DAVE SANDERS ; DATE: SEPTEMBER 4, 1981 ; (C) 1981 MOUNTAIN COMPUTER, INC. ;------------------------------- DB SCRHI DB STA6 DW CTRL65 DB LDA6+IMM DB XMTC DB STA6 ;SEND XMIT COMMAND DW CMD65 DB LDA6+IMM DB SCRLO DB STA6 DW CTRL65 DB LSR6+ACCUM DB BNE6 DB (SERWT-$-1) AND 0FFH DB JSR6 ;INITIALIZE THE USART DW INIT65 DB LDA6+IMM DB 3 DB STA6 DW CTYP65 DB LDA6+IMM F3D0H ;PASS AREA FOR 6502 PC-REG SSZ80 EQU 0F3DEH ;HOLDS ADDRESS FOR Z80/6502 SWAP ;------------------------------------------- ; 6502 ADDRESS EQUATES ;------------------------------------------- STAT65 EQU 0C0FBH+SLOT ;SERIAL STATOR STATUS DATA RET ;------------------------------ ; 6502 CODE ROUTINES ;------------------------------ SERINP DB JSR6 ;INITIALIZE USART IF NEEDED DW SERINI+OF65 DB JSR6 ;WAIT FOR INPUT READY ;IMMEDIATE MODE ZP EQU -8 ;ZERO-PAGE MODE ABSX EQU +10H ;ABSOLUTE,X MODE ABSY EQU +0CH ;ABSOLUTE,Y MODE ZPX EQU +8 ;ZERO-PAGE,X MODE XINDIR EQU -0CH ;(INDIRECT,X) MODE INDIRY EQU +4 ;(INDIRECT),Y MODE ABSIND EQU +20H ;ABS INDIREC2) SCRLO EQU 0 ;CONTROL SET SCR BIT LOW SCRHI EQU 80H ;CONTROL SET SCR BIT HIGH XMTST EQU 0C1H ;XMIT READY STATUS XMTC EQU 23H ;XMIT CONTROL BYTE XMTC2 EQU 27H ;XMIT W/ RECV ENABLE RCVST EQU INPUT LXI H,SERINP+OF65 ; **JR XCAL** ;GO TO 6502 SERIAL INPUT DB 18H, (XCAL-$-1) AND 0FFH OUTPUT LXI H,SEROUT+OF65 ; **JR XCAL** ;GO TO 6502 SERIAL OUTPUT DB 18H, (XCAL-$-1) AND 0FFH STATUS LXI H,SERSEQU 0DH !STX6 EQU 8EH BMI6 EQU 30H !DEX6 EQU 0CAH !PHA6 EQU 48H !STY6 EQU 8CH BNE6 EQU 0D0H !DEY6 EQU 88H !PHP6 EQU 8H !TAX6 EQU 0AAH BPL6 EQU 10H !EOR6 EQU 4DH !PLA6 EQU 68H !TAY6 EQU 0A8H BRK6 EQU 0H !INC6 EQU 0EEH !PLP6 EQU 28H !TSX6 EQUUS REG (READ) CMD65 EQU 0C0FBH+SLOT ;SERIAL COMMAND REG (WRITE) DATA65 EQU 0C0FAH+SLOT ;SERIAL DATA REG CTRL65 EQU 0C0FEH+SLOT ;SERIAL CONTROL REG (WRITE) INIT65 EQU 0C000H+SLOT ;ENTRY TO CPS INIT ROUTINE CTYP65 EQU 3B8H+SLOT/100H ;CARD TYPABSOLUTE OR IMPLICIT MODE ;--------------------------------------------------------- ; DB 2 ;MAKE TWO PATCHES DW ORIGIN ;DESTINATION OF DRIVER DW SEND-INPUT ;LENGTH OF DRIVER DB 1 ;PATT MODE ACCUM EQU -4 ;ACCUMULATOR MODE IMM0 EQU -0CH ;IMMEDIATE MODE ABSY0 EQU +10H ;ABSOLUTE,Y MODE ZPY EQU +8 ;ZERO-PAGE,Y MODE ;NONE OF ABOVE, DEFAULT TO 0C2H ;RECV READY STATUS RCVC EQU 16H ;RECV CONTROL BYTE ;------------------------------------------- ; ;6502 EQUATES FROM MAC6502.ASM ;--------------------------------------------------------- ; SYMBOLIC EQUATES TO PERMIT 650TT+OF65 XCAL LXI D,A65Z ;GO TO 6502 SERIAL STATUS MOV A,C ;PASS DATA FOR OUTPUT STAX D SHLD PC65Z LHLD SSZ80 MOV M,A ;SWITCH TO 6502 ROUTINE LDAX D ;RETRIEVE INPUT 0BAH BVC6 EQU 50H !INX6 EQU 0E8H !ROL6 EQU 02EH !TXA6 EQU 8AH BVS6 EQU 70H !INY6 EQU 0C8H !ROR6 EQU 6EH !TXS6 EQU 9AH CLC6 EQU 18H !JMP6 EQU 4CH !RTI6 EQU 40H !TYA6 EQU 98H ;-------------------------------------------------------- IMM EQU -4E INDICATOR ;------------------------------------------- ; CONSTANT EQUATES ;------------------------------------------- CR EQU 0DH LF EQU 0AH RAMPG1 EQU 10H ;CPS RAM PAGE 1 AUTLFB EQU 4 ;AUTO LF BIT MASK (BIT CH TYPE 1 DB 6 ;"READER" INPUT VECTOR #1 DW INPUT+OFFS ;VECTOR TO INPUT ROUTINE DB 1 ;PATCH TYPE 1 DB 8 ;"PUNCH" OUTPUT VECTOR #1 DW OUTPUT+OFFS ;VECTOR TO OUTPUT ROUTINELV6 EQU 0B8H !LDX6 EQU 0AEH !SEC6 EQU 38H BCC6 EQU 90H !CMP6 EQU 0CDH !LDY6 EQU 0ACH !SED6 EQU 0F8H BCS6 EQU 0B0H !CPX6 EQU 0ECH !LSR6 EQU 4EH !SEI6 EQU 78H BEQ6 EQU 0F0H !CPY6 EQU 0CCH !NOP6 EQU 0EAH !STA6 EQU 8DH BIT6 EQU 2CH !DEC6 EQU 0CEH !ORA6 2 CODE TO BE ; PSEUDO-ASSEMBLED BY THE 8080 ASSEMBLER ;--------------------------------------------------------- ADC6 EQU 6DH !CLD6 EQU 0D8H !JSR6 EQU 20H !RTS6 EQU 60H AND6 EQU 2DH !CLI6 EQU 58H !LDA6 EQU 0ADH !SBC6 EQU 0EDH ASL6 EQU 0EH !C DW SERIST+OF65 DB BNE6 DB -5 AND 0FFH DB LDA6 ;GET INPUT DATA DW DATA65 DB RTS6 SERSTT DB JSR6 ;INITIALIZE USART IF NEEDED DW SERINI+OF65 DB JSR6 INX H MOV B,M CALL XINP ;GET CHARACTER STAX B ;MOVE TO STRING (LENGTH 1 SET) RET OUTPUT INX H ;BASIC CALL FOR OUTPUT MOV C,M INX H MOV B,M LDAXCHARACTER STRING EQUAL TO INPUT DATA ; CALL REMOT(C$) TAKES THE FIRST CHARACTER IN C$, AND ; OUTPUTS IT WITHOUT ALTERING C$ ; (IT IS ASSUMED THAT USR0, REMIN, AND REMOT HAVE BEEN ; SET BY THE USER TO STATUS (&HF260), INPIXX-$-1) AND 0FFH DB JSR6 ;YES, CALL ROM INIT ROUTINE DW INIT65 DB LDA6+IMM DB 3 DB STA6 DW CTYP65 DB BNE6 DB (SERSIN-$-1) AND 0FFH SEROUT DB PHA6 DB 6 ;"READER" INPUT VECTOR DW XINP ;SET TO "SERREMOT" INPUT DB 1 ;PATCH TYPE 1 DB 8 ;"PUNCH" OUTPUT VECTOR DW XOUT ;SET TO "SERREMOT" OUTPUT STATUS CALL XSTAT T XMIT STATUS DW STAT65 DB AND6+IMM DB XMTST DB CMP6+IMM DB XMTST DB BNE6 ;LOOP UNTIL STATUS READY DB (SERWT-$-1) AND 0FFH DB RTS6 ; SEND END  ;GET STATUS FLAG DW SERIST+OF65 DB BEQ6 DB 2 DB LDA6+IMM DB 0FFH DB EOR6+IMM DB 0FFH DB RTS6 SERIST DB LDA6 ;CHECK INPUT STATUS DW -------------------------------- ORG 100H ORIGIN EQU 0F260H OFFS SET ORIGIN-STATUS XINP EQU 0F280H ;SERIAL REMOTE INPUT VECTOR XOUT EQU 0F285H ;SERIAL REMOTE OUTPUT VECTOR XSTAT EQU 0F28AH ;SERIAL REMOTE STATUUT (&HF26B), ; AND OUTPUT (&HF276) RESPECTIVELY) ; NOTE: "SERREMOT" MUST BE INSTALLED!!! ; FILE NAME: SREMOTBS.ASM ; PROGRAMMER: DAVE SANDERS ; DATE: SEPTEMBER 8, 1981 ; (C) 1981 MOUNTAIN COMPUTER, INC. ;----------- DB JSR6 ;INITIALIZE USART IF NEEDED DW SERINI+OF65 DB LDA6+IMM DB XMTC2 DB JSR6 ;SET UP XMIT COMMAND DW SERCMD+OF65 DB JSR6 ;WAIT FOR BUFFER READY ;BASIC USR FUNCTION FOR STATUS MOV L,A MOV H,A PUSH H LHLD MAKINT XTHL ;RETURN 0/-1 AS APPROPRIATE RET INPUT MVI M,1 ;BASIC CALL FOR INPUT INX H MOV C,M ;------------------------------------------- ; CPS PATCHES FOR SERIAL REMOTE CALLS FROM BASIC ; BASIC CALLS- ; X=USR0(0) RETURNS STATUS (0/-1) TO X ; CALL REMIN(C$) TAKES A PRE-EXISTING STRING C$, AND ; SETS IT TO A 1-STAT65 DB AND6+IMM DB RCVST DB EOR6+IMM DB RCVST DB RTS6 SERINI DB LDA6 ;IS INITIALIZATION NEEDED? DW CTYP65 DB LSR6+ACCUM DB BNE6 DB (SERS VECTOR MAKINT EQU 105H ;POINTER TO BASIC MAKINT ROUTINE ; DB 2 ;MAKE TWO PATCHES DW ORIGIN ;DESTINATION OF DRIVER DW REND-STATUS ;LENGTH OF DRIVER DB 1 ;PATCH TYPE 1 B LDX6+IMM0 DB SCRHI DB STX6 DW CTRL65 DB STA6 DW CMD65 DB LDX6+IMM0 DB SCRLO DB STX6 DW CTRL65 SERIXX DB RTS6 SERWT DB LDA6 ;GE DW SERWT+OF65 DB PLA6 DB STA6 ;OUTPUT DATA DW DATA65 DB JSR6 ;WAIT FOR XMIT COMPLETED DW SERWT+OF65 SERSIN DB LDA6+IMM ;SET UP RECV COMMAND DB RCVC SERCMD D B ;GET 1 CHARACTER FROM STRING MOV C,A JMP XOUT ;OUTPUT CHARACTER REND END T) RET OUTPUT INX H ;BASIC CALL FOR OUTPUT MOV C,M INX H MOV B,M LDAXEQU 0DH !STX6 EQU 8EH BMI6 EQU 30H !DEX6 EQU 0CAH !PHA6 EQU 48H !STY6 EQU 8CH BNE6 EQU 0D0H !DEY6 EQU 88H !PHP6 EQU 8H !TAX6 EQU 0AAH BPL6 EQU 10H !EOR6 EQU 4DH !PLA6 EQU 68H !TAY6 EQU 0A8H BRK6 EQU 0H !INC6 EQU 0EEH !PLP6 EQU 28H !TSX6 EQUUS REG (READ) CMD65 EQU 0C0FBH+SLOT ;SERIAL COMMAND REG (WRITE) DATA65 EQU 0C0FAH+SLOT ;SERIAL DATA REG CTRL65 EQU 0C0FEH+SLOT ;SERIAL CONTROL REG (WRITE) INIT65 EQU 0C000H+SLOT ;ENTRY TO CPS INIT ROUTINE CTYP65 EQU 3B8H+SLOT/100H ;CARD TYP2 CODE TO BE ; PSEUDO-ASSEMBLED BY THE 8080 ASSEMBLER ;--------------------------------------------------------- ADC6 EQU 6DH !CLD6 EQU 0D8H !JSR6 EQU 20H !RTS6 EQU 60H AND6 EQU 2DH !CLI6 EQU 58H !LDA6 EQU 0ADH !SBC6 EQU 0EDH ASL6 EQU 0EH !CSLOT ;CPS ROM/RAM MAP REG AUTLF EQU 0E0F0H+SLOT ;CPS RAM LOC FOR AUTO LF (BIT 2) A65Z EQU 0F045H ;PASS AREA FOR 6502 A-REG X65Z EQU 0F046H ;PASS AREA FOR 6502 X-REG Y65Z EQU 0F047H ;PASS AREA FOR 6502 Y-REG PC65Z EQU 02) SCRLO EQU 0 ;CONTROL SET SCR BIT LOW SCRHI EQU 80H ;CONTROL SET SCR BIT HIGH XMTST EQU 0C1H ;XMIT READY STATUS XMTC EQU 23H ;XMIT CONTROL BYTE XMTC2 EQU 27H ;XMIT W/ RECV ENABLE RCVST EQU E INDICATOR ;------------------------------------------- ; CONSTANT EQUATES ;------------------------------------------- CR EQU 0DH LF EQU 0AH RAMPG1 EQU 10H ;CPS RAM PAGE 1 AUTLFB EQU 4 ;AUTO LF BIT MASK (BIT ;-------------------------------------------------- ; CPS SERIAL CONSOLE DRIVER ; FILE NAME: SERCONSL.ASM ; PROGRAMMER: DAVE SANDERS ; DATE: AUGUST 31, 1981 ; (C) 1981 MOUNTAIN COMPUTER, INC. ;--------------------------------LV6 EQU 0B8H !LDX6 EQU 0AEH !SEC6 EQU 38H BCC6 EQU 90H !CMP6 EQU 0CDH !LDY6 EQU 0ACH !SED6 EQU 0F8H BCS6 EQU 0B0H !CPX6 EQU 0ECH !LSR6 EQU 4EH !SEI6 EQU 78H BEQ6 EQU 0F0H !CPY6 EQU 0CCH !NOP6 EQU 0EAH !STA6 EQU 8DH BIT6 EQU 2CH !DEC6 EQU 0CEH !ORA6 F3D0H ;PASS AREA FOR 6502 PC-REG SSZ80 EQU 0F3DEH ;HOLDS ADDRESS FOR Z80/6502 SWAP ;------------------------------------------- ; 6502 ADDRESS EQUATES ;------------------------------------------- STAT65 EQU 0C0FBH+SLOT ;SERIAL STAT 0C2H ;RECV READY STATUS RCVC EQU 16H ;RECV CONTROL BYTE ;------------------------------------------- ; ;6502 EQUATES FROM MAC6502.ASM ;--------------------------------------------------------- ; SYMBOLIC EQUATES TO PERMIT 650 Z80 MAP ORIG65 EQU 280H ;PROGRAM ORIGIN, 6502 MAP OFFS SET ORIGIN-INPUT OF65 SET ORIG65-INPUT ;------------------------------------------- ; Z80 ADDRESS EQUATES ;------------------------------------------- MAP EQU 0E0F8H+------------------ ORG 100H SLOT EQU 300H ;CONSOLE IN SLOT 3 ; ;------------------------------------------- ; PROGRAM ORIGINS AND OFFSETS ;------------------------------------------- ORIGIN EQU 0F280H ;PROGRAM ORIGIN, 0BAH BVC6 EQU 50H !INX6 EQU 0E8H !ROL6 EQU 02EH !TXA6 EQU 8AH BVS6 EQU 70H !INY6 EQU 0C8H !ROR6 EQU 6EH !TXS6 EQU 9AH CLC6 EQU 18H !JMP6 EQU 4CH !RTI6 EQU 40H !TYA6 EQU 98H ;-------------------------------------------------------- IMM EQU -4 XMIT STATUS DW STAT65 DB AND6+IMM DB XMTST DB CMP6+IMM DB XMTST DB BNE6 ;LOOP UNTIL STATUS READY DB (SERWT-$-1) AND 0FFH DB RTS6 ; SEND END  ;GET STATUS FLAG DW SERIST+OF65 DB BEQ6 DB 2 DB LDA6+IMM DB 0FFH DB EOR6+IMM DB 0FFH DB RTS6 SERIST DB LDA6 ;CHECK INPUT STATUS DW SABSOLUTE OR IMPLICIT MODE ;--------------------------------------------------------- ; DB 2 ;MAKE TWO PATCHES DW ORIGIN ;DESTINATION OF DRIVER DW SEND-INPUT ;LENGTH OF DRIVER DB 1 ;PAT DW SERWT+OF65 DB PLA6 DB STA6 ;OUTPUT DATA DW DATA65 DB JSR6 ;WAIT FOR XMIT COMPLETED DW SERWT+OF65 SERSIN DB LDA6+IMM ;SET UP RECV COMMAND DB RCVC SERCMD DBR STATUS DATA RET ;------------------------------ ; 6502 CODE ROUTINES ;------------------------------ SERINP DB JSR6 ;INITIALIZE USART IF NEEDED DW SERINI+OF65 DB JSR6 ;WAIT FOR INPUT READY ;IMMEDIATE MODE ZP EQU -8 ;ZERO-PAGE MODE ABSX EQU +10H ;ABSOLUTE,X MODE ABSY EQU +0CH ;ABSOLUTE,Y MODE ZPX EQU +8 ;ZERO-PAGE,X MODE XINDIR EQU -0CH ;(INDIRECT,X) MODE INDIRY EQU +4 ;(INDIRECT),Y MODE ABSIND EQU +20H ;ABS INDIRECXX-$-1) AND 0FFH DB JSR6 ;YES, CALL ROM INIT ROUTINE DW INIT65 DB LDA6+IMM DB 3 DB STA6 DW CTYP65 DB BNE6 DB (SERSIN-$-1) AND 0FFH SEROUT DB PHA6 TAT65 DB AND6+IMM DB RCVST DB EOR6+IMM DB RCVST DB RTS6 SERINI DB LDA6 ;IS INITIALIZATION NEEDED? DW CTYP65 DB LSR6+ACCUM DB BNE6 DB (SERICH TYPE 1 DB 3 ;CONSOLE INPUT VECTOR #2 DW INPUT+OFFS ;VECTOR TO INPUT ROUTINE DB 1 ;PATCH TYPE 1 DB 5 ;CONSOLE OUTPUT VECTOR #2 DW OUTPUT+OFFS ;VECTOR TO OUTPUT ROUTINE LDX6+IMM0 DB SCRHI DB STX6 DW CTRL65 DB STA6 DW CMD65 DB LDX6+IMM0 DB SCRLO DB STX6 DW CTRL65 SERIXX DB RTS6 SERWT DB LDA6 ;GET DW SERIST+OF65 DB BNE6 DB -5 AND 0FFH DB LDA6 ;GET INPUT DATA DW DATA65 DB RTS6 SERSTT DB JSR6 ;INITIALIZE USART IF NEEDED DW SERINI+OF65 DB JSR6 T MODE ACCUM EQU -4 ;ACCUMULATOR MODE IMM0 EQU -0CH ;IMMEDIATE MODE ABSY0 EQU +10H ;ABSOLUTE,Y MODE ZPY EQU +8 ;ZERO-PAGE,Y MODE ;NONE OF ABOVE, DEFAULT TO DB JSR6 ;INITIALIZE USART IF NEEDED DW SERINI+OF65 DB LDA6+IMM DB XMTC2 DB JSR6 ;SET UP XMIT COMMAND DW SERCMD+OF65 DB JSR6 ;WAIT FOR BUFFER READY T+OF65 XCAL LXI D,A65Z ;GO TO 6502 SERIAL STATUS MOV A,C ;PASS DATA FOR OUTPUT STAX D SHLD PC65Z LHLD SSZ80 MOV M,A ;SWITCH TO 6502 ROUTINE LDAX D ;RETRIEVE INPUT O INPUT LXI H,SERINP+OF65 ; **JR XCAL** ;GO TO 6502 SERIAL INPUT DB 18H, (XCAL-$-1) AND 0FFH OUTPUT LXI H,SEROUT+OF65 ; **JR XCAL** ;GO TO 6502 SERIAL OUTPUT DB 18H, (XCAL-$-1) AND 0FFH STATUS LXI H,SERST;---------------------------------------------------------- ; CPS CLOCK DRIVER ; RETURNS A STRING TO A BASIC PROGRAM ; NOTE: DOES NOT USE BIOS INTERFACE CONVENTIONS! ; FILE NAME: (*****.ASM) ; CLOCKSL1 (BIOS PATCH 3A, H/WODE ZPY EQU +8 ;ZERO-PAGE,Y MODE ;NONE OF ABOVE, DEFAULT TO ABSOLUTE OR IMPLICIT MODE ;--------------------------------------------------------- ; DB 1 ;MAKE ONE PATCH DW ORIGIN ;DE--------------------------------------------------------- ; SYMBOLIC EQUATES TO PERMIT 6502 CODE TO BE ; PSEUDO-ASSEMBLED BY THE 8080 ASSEMBLER ;--------------------------------------------------------- ADC6 EQU 6DH !CLD6 EQU 0D8H !JSR6 EQU TO 170H FOR PARCLOCK CSLOT EQU 100H ;100H * H/W SLOT # ;SET TO 100H FOR CLOCKSL1/PARCLOCK ;SET TO 200H FOR CLOCKSL2 ;SET TO 300H FOR CLOCKSL3 ; ;--------------------EQU 40H !TYA6 EQU 98H ;-------------------------------------------------------- IMM EQU -4 ;IMMEDIATE MODE ZP EQU -8 ;ZERO-PAGE MODE ABSX EQU +10H ;ABSOLUTE,X MODE ABSY EQU +0CH ;ABSOLUTE,Y MODE ZPX EQU +8 ;ZERO-PAGE,X MODE XIND ADDRESS EQUATES ;------------------------------------------- CDEV65 EQU 0C0F4H+CSLOT ;CPS RAM LOC FOR CURR DEV (BIT 0) PNTR65 EQU 0C0F1H+CSLOT ;CLOCK STRING INDEX READ65 EQU 0C003H+CSLOT ;ENTRY TO CPS READ ROUTINE VECTOR EQU 40H ;STR SLOT 1) ; CLOCKSL2 (BIOS PATCH 3A, H/W SLOT 2) ; CLOCKSL3 (BIOS PATCH 3A, H/W SLOT 3) ; PARCLOCK (BIOS PATCH 1B, H/W SLOT 1) ; PROGRAMMER: DAVE SANDERS ; DATE: AUGUST 21, 1981 ; (C) 1981 MOUNTAIN COMPUTER, INC. ; BEQ6 EQU 0F0H !CPY6 EQU 0CCH !NOP6 EQU 0EAH !STA6 EQU 8DH BIT6 EQU 2CH !DEC6 EQU 0CEH !ORA6 EQU 0DH !STX6 EQU 8EH BMI6 EQU 30H !DEX6 EQU 0CAH !PHA6 EQU 48H !STY6 EQU 8CH BNE6 EQU 0D0H !DEY6 EQU 88H !PHP6 EQU 8H !TAX6 EQU 0AAH BPL6 EQU 10H !EO20H !RTS6 EQU 60H AND6 EQU 2DH !CLI6 EQU 58H !LDA6 EQU 0ADH !SBC6 EQU 0EDH ASL6 EQU 0EH !CLV6 EQU 0B8H !LDX6 EQU 0AEH !SEC6 EQU 38H BCC6 EQU 90H !CMP6 EQU 0CDH !LDY6 EQU 0ACH !SED6 EQU 0F8H BCS6 EQU 0B0H !CPX6 EQU 0ECH !LSR6 EQU 4EH !SEI6 EQU 78H----------------------- ; PROGRAM ORIGINS AND OFFSETS ;------------------------------------------- ORIGIN EQU 0F180H+(SLOT/2) ;PROGRAM ORIGIN, Z80 MAP ORIG65 EQU 180H+(SLOT/2) ;PROGRAM ORIGIN, 6502 MAP OFFS SET ORIGIN-CLOCK OF65 SET IR EQU -0CH ;(INDIRECT,X) MODE INDIRY EQU +4 ;(INDIRECT),Y MODE ABSIND EQU +20H ;ABS INDIRECT MODE ACCUM EQU -4 ;ACCUMULATOR MODE IMM0 EQU -0CH ;IMMEDIATE MODE ABSY0 EQU +10H ;ABSOLUTE,Y MING VECTOR FROM Z80 BASIC ;------------------------------------------- ; CONSTANT EQUATES ;------------------------------------------- CR EQU 0DH CLKBIT EQU 1 ;CLOCK AS CURR DEV MASK (BIT 0) ; ;6502 EQUATES FROM MAC6502.ASM ;---------------------------------------------------------- ORG 100H SLOT EQU 300H ;100H * BIOS PATCH # ;SET TO 300H FOR CLOCKSL1/CLOCKSL2/ ; CLOCKSL3 ;SET R6 EQU 4DH !PLA6 EQU 68H !TAY6 EQU 0A8H BRK6 EQU 0H !INC6 EQU 0EEH !PLP6 EQU 28H !TSX6 EQU 0BAH BVC6 EQU 50H !INX6 EQU 0E8H !ROL6 EQU 02EH !TXA6 EQU 8AH BVS6 EQU 70H !INY6 EQU 0C8H !ROR6 EQU 6EH !TXS6 EQU 9AH CLC6 EQU 18H !JMP6 EQU 4CH !RTI6 47H ;PASS AREA FOR 6502 Y-REG PC65Z EQU 0F3D0H ;PASS AREA FOR 6502 PC-REG VECTRX EQU 0F040H ;STRING VECTOR PASS AREA SSZ80 EQU 0F3DEH ;HOLDS ADDRESS FOR Z80/6502 SWAP ;------------------------------------------- ; 6502 ORIG65-CLOCK ;------------------------------------------- ; Z80 ADDRESS EQUATES ;------------------------------------------- A65Z EQU 0F045H ;PASS AREA FOR 6502 A-REG X65Z EQU 0F046H ;PASS AREA FOR 6502 X-REG Y65Z EQU 0F0STINATION OF DRIVER DW CEND-CLOCK ;LENGTH OF DRIVER DB 1 ;PATCH TYPE 1 DB 7 ;READER INPUT VECTOR #2 DW CLOCK+OFFS ;VECTOR TO CLOCK ROUTINE ;NOTE: CLOCK DOES NOT USE BIOS CONVEN ADDRESS EQUATES ;------------------------------------------- CDEV65 EQU 0C0F4H+CSLOT ;CPS RAM LOC FOR CURR DEV (BIT 0) PNTR65 EQU 0C0F1H+CSLOT ;CLOCK STRING INDEX READ65 EQU 0C003H+CSLOT ;ENTRY TO CPS READ ROUTINE VECTOR EQU 40H ;STR SLOT 1) ; CLOCKSL2 (BIOS PATCH 3A, H/W SLOT 2) ; CLOCKSL3 (BIOS PATCH 3A, H/W SLOT 3) ; PARCLOCK (BIOS PATCH 1B, H/W SLOT 1) ; PROGRAMMER: DAVE SANDERS ; DATE: AUGUST 21, 1981 ; (C) 1981 MOUNTAIN COMPUTER, INC. ;DE ROUTINE ;------------------------------------------ CLOCKI DB LDA6 ;INITIALIZE FOR CLOCK INPUT DW CDEV65 DB ORA6+IMM DB CLKBIT DB STA6 DW CDEV65 DB LDA6+IMM DB ORIG65-CLOCK ;------------------------------------------- ; Z80 ADDRESS EQUATES ;------------------------------------------- A65Z EQU 0F045H ;PASS AREA FOR 6502 A-REG X65Z EQU 0F046H ;PASS AREA FOR 6502 X-REG Y65Z EQU 0F0P6 DW CLKINP+OF65 CRETI DB RTS6 ; CEND END ND 0FFH DB STA6+INDIRY ;ELSE, PUT INTO STRING AND CONTINUE DB VECTOR DB INY6 DB JMTIONS!!! CLOCK PUSH H ;SAVE STRING BLOCK VECTOR INX H ;GET VECTOR TO STRING DATA MOV E,M INX H MOV D,M XCHG SHLD VECTRX LXI H,CLOCKI+OF65 SHLD PC65Z TO 170H FOR PARCLOCK CSLOT EQU 200H ;100H * H/W SLOT # ;SET TO 100H FOR CLOCKSL1/PARCLOCK ;SET TO 200H FOR CLOCKSL2 ;SET TO 300H FOR CLOCKSL3 ; ;------------------------------------------------------------------------------ ORG 100H SLOT EQU 300H ;100H * BIOS PATCH # ;SET TO 300H FOR CLOCKSL1/CLOCKSL2/ ; CLOCKSL3 ;SET 0 DB STA6 DW PNTR65 DB TAY6 DB LDA6+ZP ;CHANGE VECTOR TO 6502 MAP DB VECTOR+1 DB CLC6 DB ADC6+IMM DB 10H DB CMP6+IMM DB 0C0H 47H ;PASS AREA FOR 6502 Y-REG PC65Z EQU 0F3D0H ;PASS AREA FOR 6502 PC-REG VECTRX EQU 0F040H ;STRING VECTOR PASS AREA SSZ80 EQU 0F3DEH ;HOLDS ADDRESS FOR Z80/6502 SWAP ;------------------------------------------- ; 6502;---------------------------------------------------------- ; CPS CLOCK DRIVER ; RETURNS A STRING TO A BASIC PROGRAM ; NOTE: DOES NOT USE BIOS INTERFACE CONVENTIONS! ; FILE NAME: (*****.ASM) ; CLOCKSL1 (BIOS PATCH 3A, H/WLHLD SSZ80 MOV M,A ;SWITCH TO 6502 ROUTINE POP H ;RECOVER STRING BLOCK VECTOR LDA Y65Z ;SET NEW STRING LENGTH MOV M,A RET ;------------------------------------------ ; 6502 CO----------------------- ; PROGRAM ORIGINS AND OFFSETS ;------------------------------------------- ORIGIN EQU 0F180H+(SLOT/2) ;PROGRAM ORIGIN, Z80 MAP ORIG65 EQU 180H+(SLOT/2) ;PROGRAM ORIGIN, 6502 MAP OFFS SET ORIGIN-CLOCK OF65 SET 7FH DB CMP6+IMM ;STOP READING WHEN CR FOUND DB CR DB BEQ6 DB (CRETI-$-1) AND 0FFH DB STA6+INDIRY ;ELSE, PUT INTO STRING AND CONTINUE DB VECTOR DB INY6 DB JM DB BCC6 DB 2 DB ADC6+IMM DB 0FH DB STA6+ZP DB VECTOR+1 CLKINP DB JSR6 ;READ (NEXT) CLOCK CHAR DW READ65 DB AND6+IMM ;CLEAR HIGH-ORDER BIT DB ING VECTOR FROM Z80 BASIC ;------------------------------------------- ; CONSTANT EQUATES ;------------------------------------------- CR EQU 0DH CLKBIT EQU 1 ;CLOCK AS CURR DEV MASK (BIT 0) ; ;6502 EQUATES FROM MAC6502.ASM ;P6 DW CLKINP+OF65 CRETI DB RTS6 ; CEND END ND 0FFH DB STA6+INDIRY ;ELSE, PUT INTO STRING AND CONTINUE DB VECTOR DB INY6 DB JMTIONS!!! CLOCK PUSH H ;SAVE STRING BLOCK VECTOR INX H ;GET VECTOR TO STRING DATA MOV E,M INX H MOV D,M XCHG SHLD VECTRX LXI H,CLOCKI+OF65 SHLD PC65Z BEQ6 EQU 0F0H !CPY6 EQU 0CCH !NOP6 EQU 0EAH !STA6 EQU 8DH BIT6 EQU 2CH !DEC6 EQU 0CEH !ORA6 EQU 0DH !STX6 EQU 8EH BMI6 EQU 30H !DEX6 EQU 0CAH !PHA6 EQU 48H !STY6 EQU 8CH BNE6 EQU 0D0H !DEY6 EQU 88H !PHP6 EQU 8H !TAX6 EQU 0AAH BPL6 EQU 10H !EO DB BCC6 DB 2 DB ADC6+IMM DB 0FH DB STA6+ZP DB VECTOR+1 CLKINP DB JSR6 ;READ (NEXT) CLOCK CHAR DW READ65 DB AND6+IMM ;CLEAR HIGH-ORDER BIT DB ODE ZPY EQU +8 ;ZERO-PAGE,Y MODE ;NONE OF ABOVE, DEFAULT TO ABSOLUTE OR IMPLICIT MODE ;--------------------------------------------------------- ; DB 1 ;MAKE ONE PATCH DW ORIGIN ;DE--------------------------------------------------------- ; SYMBOLIC EQUATES TO PERMIT 6502 CODE TO BE ; PSEUDO-ASSEMBLED BY THE 8080 ASSEMBLER ;--------------------------------------------------------- ADC6 EQU 6DH !CLD6 EQU 0D8H !JSR6 EQU DE ROUTINE ;------------------------------------------ CLOCKI DB LDA6 ;INITIALIZE FOR CLOCK INPUT DW CDEV65 DB ORA6+IMM DB CLKBIT DB STA6 DW CDEV65 DB LDA6+IMM DBLHLD SSZ80 MOV M,A ;SWITCH TO 6502 ROUTINE POP H ;RECOVER STRING BLOCK VECTOR LDA Y65Z ;SET NEW STRING LENGTH MOV M,A RET ;------------------------------------------ ; 6502 COR6 EQU 4DH !PLA6 EQU 68H !TAY6 EQU 0A8H BRK6 EQU 0H !INC6 EQU 0EEH !PLP6 EQU 28H !TSX6 EQU 0BAH BVC6 EQU 50H !INX6 EQU 0E8H !ROL6 EQU 02EH !TXA6 EQU 8AH BVS6 EQU 70H !INY6 EQU 0C8H !ROR6 EQU 6EH !TXS6 EQU 9AH CLC6 EQU 18H !JMP6 EQU 4CH !RTI6 7FH DB CMP6+IMM ;STOP READING WHEN CR FOUND DB CR DB BEQ6 DB (CRETI-$-1) AND 0FFH DB STA6+INDIRY ;ELSE, PUT INTO STRING AND CONTINUE DB VECTOR DB INY6 DB JMSTINATION OF DRIVER DW CEND-CLOCK ;LENGTH OF DRIVER DB 1 ;PATCH TYPE 1 DB 7 ;READER INPUT VECTOR #2 DW CLOCK+OFFS ;VECTOR TO CLOCK ROUTINE ;NOTE: CLOCK DOES NOT USE BIOS CONVEN20H !RTS6 EQU 60H AND6 EQU 2DH !CLI6 EQU 58H !LDA6 EQU 0ADH !SBC6 EQU 0EDH ASL6 EQU 0EH !CLV6 EQU 0B8H !LDX6 EQU 0AEH !SEC6 EQU 38H BCC6 EQU 90H !CMP6 EQU 0CDH !LDY6 EQU 0ACH !SED6 EQU 0F8H BCS6 EQU 0B0H !CPX6 EQU 0ECH !LSR6 EQU 4EH !SEI6 EQU 78H 0 DB STA6 DW PNTR65 DB TAY6 DB LDA6+ZP ;CHANGE VECTOR TO 6502 MAP DB VECTOR+1 DB CLC6 DB ADC6+IMM DB 10H DB CMP6+IMM DB 0C0H IR EQU -0CH ;(INDIRECT,X) MODE INDIRY EQU +4 ;(INDIRECT),Y MODE ABSIND EQU +20H ;ABS INDIRECT MODE ACCUM EQU -4 ;ACCUMULATOR MODE IMM0 EQU -0CH ;IMMEDIATE MODE ABSY0 EQU +10H ;ABSOLUTE,Y MEQU 40H !TYA6 EQU 98H ;-------------------------------------------------------- IMM EQU -4 ;IMMEDIATE MODE ZP EQU -8 ;ZERO-PAGE MODE ABSX EQU +10H ;ABSOLUTE,X MODE ABSY EQU +0CH ;ABSOLUTE,Y MODE ZPX EQU +8 ;ZERO-PAGE,X MODE XIND;---------------------------------------------------------- ; CPS CLOCK DRIVER ; RETURNS A STRING TO A BASIC PROGRAM ; NOTE: DOES NOT USE BIOS INTERFACE CONVENTIONS! ; FILE NAME: (*****.ASM) ; CLOCKSL1 (BIOS PATCH 3A, H/WODE ZPY EQU +8 ;ZERO-PAGE,Y MODE ;NONE OF ABOVE, DEFAULT TO ABSOLUTE OR IMPLICIT MODE ;--------------------------------------------------------- ; DB 1 ;MAKE ONE PATCH DW ORIGIN ;DE--------------------------------------------------------- ; SYMBOLIC EQUATES TO PERMIT 6502 CODE TO BE ; PSEUDO-ASSEMBLED BY THE 8080 ASSEMBLER ;--------------------------------------------------------- ADC6 EQU 6DH !CLD6 EQU 0D8H !JSR6 EQU TO 170H FOR PARCLOCK CSLOT EQU 300H ;100H * H/W SLOT # ;SET TO 100H FOR CLOCKSL1/PARCLOCK ;SET TO 200H FOR CLOCKSL2 ;SET TO 300H FOR CLOCKSL3 ; ;--------------------EQU 40H !TYA6 EQU 98H ;-------------------------------------------------------- IMM EQU -4 ;IMMEDIATE MODE ZP EQU -8 ;ZERO-PAGE MODE ABSX EQU +10H ;ABSOLUTE,X MODE ABSY EQU +0CH ;ABSOLUTE,Y MODE ZPX EQU +8 ;ZERO-PAGE,X MODE XIND ADDRESS EQUATES ;------------------------------------------- CDEV65 EQU 0C0F4H+CSLOT ;CPS RAM LOC FOR CURR DEV (BIT 0) PNTR65 EQU 0C0F1H+CSLOT ;CLOCK STRING INDEX READ65 EQU 0C003H+CSLOT ;ENTRY TO CPS READ ROUTINE VECTOR EQU 40H ;STR SLOT 1) ; CLOCKSL2 (BIOS PATCH 3A, H/W SLOT 2) ; CLOCKSL3 (BIOS PATCH 3A, H/W SLOT 3) ; PARCLOCK (BIOS PATCH 1B, H/W SLOT 1) ; PROGRAMMER: DAVE SANDERS ; DATE: AUGUST 21, 1981 ; (C) 1981 MOUNTAIN COMPUTER, INC. ; BEQ6 EQU 0F0H !CPY6 EQU 0CCH !NOP6 EQU 0EAH !STA6 EQU 8DH BIT6 EQU 2CH !DEC6 EQU 0CEH !ORA6 EQU 0DH !STX6 EQU 8EH BMI6 EQU 30H !DEX6 EQU 0CAH !PHA6 EQU 48H !STY6 EQU 8CH BNE6 EQU 0D0H !DEY6 EQU 88H !PHP6 EQU 8H !TAX6 EQU 0AAH BPL6 EQU 10H !EO20H !RTS6 EQU 60H AND6 EQU 2DH !CLI6 EQU 58H !LDA6 EQU 0ADH !SBC6 EQU 0EDH ASL6 EQU 0EH !CLV6 EQU 0B8H !LDX6 EQU 0AEH !SEC6 EQU 38H BCC6 EQU 90H !CMP6 EQU 0CDH !LDY6 EQU 0ACH !SED6 EQU 0F8H BCS6 EQU 0B0H !CPX6 EQU 0ECH !LSR6 EQU 4EH !SEI6 EQU 78H----------------------- ; PROGRAM ORIGINS AND OFFSETS ;------------------------------------------- ORIGIN EQU 0F180H+(SLOT/2) ;PROGRAM ORIGIN, Z80 MAP ORIG65 EQU 180H+(SLOT/2) ;PROGRAM ORIGIN, 6502 MAP OFFS SET ORIGIN-CLOCK OF65 SET IR EQU -0CH ;(INDIRECT,X) MODE INDIRY EQU +4 ;(INDIRECT),Y MODE ABSIND EQU +20H ;ABS INDIRECT MODE ACCUM EQU -4 ;ACCUMULATOR MODE IMM0 EQU -0CH ;IMMEDIATE MODE ABSY0 EQU +10H ;ABSOLUTE,Y MING VECTOR FROM Z80 BASIC ;------------------------------------------- ; CONSTANT EQUATES ;------------------------------------------- CR EQU 0DH CLKBIT EQU 1 ;CLOCK AS CURR DEV MASK (BIT 0) ; ;6502 EQUATES FROM MAC6502.ASM ;---------------------------------------------------------- ORG 100H SLOT EQU 300H ;100H * BIOS PATCH # ;SET TO 300H FOR CLOCKSL1/CLOCKSL2/ ; CLOCKSL3 ;SET R6 EQU 4DH !PLA6 EQU 68H !TAY6 EQU 0A8H BRK6 EQU 0H !INC6 EQU 0EEH !PLP6 EQU 28H !TSX6 EQU 0BAH BVC6 EQU 50H !INX6 EQU 0E8H !ROL6 EQU 02EH !TXA6 EQU 8AH BVS6 EQU 70H !INY6 EQU 0C8H !ROR6 EQU 6EH !TXS6 EQU 9AH CLC6 EQU 18H !JMP6 EQU 4CH !RTI6 47H ;PASS AREA FOR 6502 Y-REG PC65Z EQU 0F3D0H ;PASS AREA FOR 6502 PC-REG VECTRX EQU 0F040H ;STRING VECTOR PASS AREA SSZ80 EQU 0F3DEH ;HOLDS ADDRESS FOR Z80/6502 SWAP ;------------------------------------------- ; 6502 ORIG65-CLOCK ;------------------------------------------- ; Z80 ADDRESS EQUATES ;------------------------------------------- A65Z EQU 0F045H ;PASS AREA FOR 6502 A-REG X65Z EQU 0F046H ;PASS AREA FOR 6502 X-REG Y65Z EQU 0F0STINATION OF DRIVER DW CEND-CLOCK ;LENGTH OF DRIVER DB 1 ;PATCH TYPE 1 DB 7 ;READER INPUT VECTOR #2 DW CLOCK+OFFS ;VECTOR TO CLOCK ROUTINE ;NOTE: CLOCK DOES NOT USE BIOS CONVEN ADDRESS EQUATES ;------------------------------------------- CDEV65 EQU 0C0F4H+CSLOT ;CPS RAM LOC FOR CURR DEV (BIT 0) PNTR65 EQU 0C0F1H+CSLOT ;CLOCK STRING INDEX READ65 EQU 0C003H+CSLOT ;ENTRY TO CPS READ ROUTINE VECTOR EQU 40H ;STR SLOT 1) ; CLOCKSL2 (BIOS PATCH 3A, H/W SLOT 2) ; CLOCKSL3 (BIOS PATCH 3A, H/W SLOT 3) ; PARCLOCK (BIOS PATCH 1B, H/W SLOT 1) ; PROGRAMMER: DAVE SANDERS ; DATE: AUGUST 21, 1981 ; (C) 1981 MOUNTAIN COMPUTER, INC. ;DE ROUTINE ;------------------------------------------ CLOCKI DB LDA6 ;INITIALIZE FOR CLOCK INPUT DW CDEV65 DB ORA6+IMM DB CLKBIT DB STA6 DW CDEV65 DB LDA6+IMM DB ORIG65-CLOCK ;------------------------------------------- ; Z80 ADDRESS EQUATES ;------------------------------------------- A65Z EQU 0F045H ;PASS AREA FOR 6502 A-REG X65Z EQU 0F046H ;PASS AREA FOR 6502 X-REG Y65Z EQU 0F0P6 DW CLKINP+OF65 CRETI DB RTS6 ; CEND END ND 0FFH DB STA6+INDIRY ;ELSE, PUT INTO STRING AND CONTINUE DB VECTOR DB INY6 DB JMTIONS!!! CLOCK PUSH H ;SAVE STRING BLOCK VECTOR INX H ;GET VECTOR TO STRING DATA MOV E,M INX H MOV D,M XCHG SHLD VECTRX LXI H,CLOCKI+OF65 SHLD PC65Z TO 170H FOR PARCLOCK CSLOT EQU 100H ;100H * H/W SLOT # ;SET TO 100H FOR CLOCKSL1/PARCLOCK ;SET TO 200H FOR CLOCKSL2 ;SET TO 300H FOR CLOCKSL3 ; ;------------------------------------------------------------------------------ ORG 100H SLOT EQU 170H ;100H * BIOS PATCH # ;SET TO 300H FOR CLOCKSL1/CLOCKSL2/ ; CLOCKSL3 ;SET 0 DB STA6 DW PNTR65 DB TAY6 DB LDA6+ZP ;CHANGE VECTOR TO 6502 MAP DB VECTOR+1 DB CLC6 DB ADC6+IMM DB 10H DB CMP6+IMM DB 0C0H 47H ;PASS AREA FOR 6502 Y-REG PC65Z EQU 0F3D0H ;PASS AREA FOR 6502 PC-REG VECTRX EQU 0F040H ;STRING VECTOR PASS AREA SSZ80 EQU 0F3DEH ;HOLDS ADDRESS FOR Z80/6502 SWAP ;------------------------------------------- ; 6502;---------------------------------------------------------- ; CPS CLOCK DRIVER ; RETURNS A STRING TO A BASIC PROGRAM ; NOTE: DOES NOT USE BIOS INTERFACE CONVENTIONS! ; FILE NAME: (*****.ASM) ; CLOCKSL1 (BIOS PATCH 3A, H/WLHLD SSZ80 MOV M,A ;SWITCH TO 6502 ROUTINE POP H ;RECOVER STRING BLOCK VECTOR LDA Y65Z ;SET NEW STRING LENGTH MOV M,A RET ;------------------------------------------ ; 6502 CO----------------------- ; PROGRAM ORIGINS AND OFFSETS ;------------------------------------------- ORIGIN EQU 0F180H+(SLOT/2) ;PROGRAM ORIGIN, Z80 MAP ORIG65 EQU 180H+(SLOT/2) ;PROGRAM ORIGIN, 6502 MAP OFFS SET ORIGIN-CLOCK OF65 SET 7FH DB CMP6+IMM ;STOP READING WHEN CR FOUND DB CR DB BEQ6 DB (CRETI-$-1) AND 0FFH DB STA6+INDIRY ;ELSE, PUT INTO STRING AND CONTINUE DB VECTOR DB INY6 DB JM DB BCC6 DB 2 DB ADC6+IMM DB 0FH DB STA6+ZP DB VECTOR+1 CLKINP DB JSR6 ;READ (NEXT) CLOCK CHAR DW READ65 DB AND6+IMM ;CLEAR HIGH-ORDER BIT DB ING VECTOR FROM Z80 BASIC ;------------------------------------------- ; CONSTANT EQUATES ;------------------------------------------- CR EQU 0DH CLKBIT EQU 1 ;CLOCK AS CURR DEV MASK (BIT 0) ; ;6502 EQUATES FROM MAC6502.ASM ;P6 DW CLKINP+OF65 CRETI DB RTS6 ; CEND END ND 0FFH DB STA6+INDIRY ;ELSE, PUT INTO STRING AND CONTINUE DB VECTOR DB INY6 DB JMTIONS!!! CLOCK PUSH H ;SAVE STRING BLOCK VECTOR INX H ;GET VECTOR TO STRING DATA MOV E,M INX H MOV D,M XCHG SHLD VECTRX LXI H,CLOCKI+OF65 SHLD PC65Z BEQ6 EQU 0F0H !CPY6 EQU 0CCH !NOP6 EQU 0EAH !STA6 EQU 8DH BIT6 EQU 2CH !DEC6 EQU 0CEH !ORA6 EQU 0DH !STX6 EQU 8EH BMI6 EQU 30H !DEX6 EQU 0CAH !PHA6 EQU 48H !STY6 EQU 8CH BNE6 EQU 0D0H !DEY6 EQU 88H !PHP6 EQU 8H !TAX6 EQU 0AAH BPL6 EQU 10H !EO DB BCC6 DB 2 DB ADC6+IMM DB 0FH DB STA6+ZP DB VECTOR+1 CLKINP DB JSR6 ;READ (NEXT) CLOCK CHAR DW READ65 DB AND6+IMM ;CLEAR HIGH-ORDER BIT DB ODE ZPY EQU +8 ;ZERO-PAGE,Y MODE ;NONE OF ABOVE, DEFAULT TO ABSOLUTE OR IMPLICIT MODE ;--------------------------------------------------------- ; DB 1 ;MAKE ONE PATCH DW ORIGIN ;DE--------------------------------------------------------- ; SYMBOLIC EQUATES TO PERMIT 6502 CODE TO BE ; PSEUDO-ASSEMBLED BY THE 8080 ASSEMBLER ;--------------------------------------------------------- ADC6 EQU 6DH !CLD6 EQU 0D8H !JSR6 EQU DE ROUTINE ;------------------------------------------ CLOCKI DB LDA6 ;INITIALIZE FOR CLOCK INPUT DW CDEV65 DB ORA6+IMM DB CLKBIT DB STA6 DW CDEV65 DB LDA6+IMM DBLHLD SSZ80 MOV M,A ;SWITCH TO 6502 ROUTINE POP H ;RECOVER STRING BLOCK VECTOR LDA Y65Z ;SET NEW STRING LENGTH MOV M,A RET ;------------------------------------------ ; 6502 COR6 EQU 4DH !PLA6 EQU 68H !TAY6 EQU 0A8H BRK6 EQU 0H !INC6 EQU 0EEH !PLP6 EQU 28H !TSX6 EQU 0BAH BVC6 EQU 50H !INX6 EQU 0E8H !ROL6 EQU 02EH !TXA6 EQU 8AH BVS6 EQU 70H !INY6 EQU 0C8H !ROR6 EQU 6EH !TXS6 EQU 9AH CLC6 EQU 18H !JMP6 EQU 4CH !RTI6 7FH DB CMP6+IMM ;STOP READING WHEN CR FOUND DB CR DB BEQ6 DB (CRETI-$-1) AND 0FFH DB STA6+INDIRY ;ELSE, PUT INTO STRING AND CONTINUE DB VECTOR DB INY6 DB JMSTINATION OF DRIVER DW CEND-CLOCK ;LENGTH OF DRIVER DB 1 ;PATCH TYPE 1 DB 7 ;READER INPUT VECTOR #2 DW CLOCK+OFFS ;VECTOR TO CLOCK ROUTINE ;NOTE: CLOCK DOES NOT USE BIOS CONVEN20H !RTS6 EQU 60H AND6 EQU 2DH !CLI6 EQU 58H !LDA6 EQU 0ADH !SBC6 EQU 0EDH ASL6 EQU 0EH !CLV6 EQU 0B8H !LDX6 EQU 0AEH !SEC6 EQU 38H BCC6 EQU 90H !CMP6 EQU 0CDH !LDY6 EQU 0ACH !SED6 EQU 0F8H BCS6 EQU 0B0H !CPX6 EQU 0ECH !LSR6 EQU 4EH !SEI6 EQU 78H 0 DB STA6 DW PNTR65 DB TAY6 DB LDA6+ZP ;CHANGE VECTOR TO 6502 MAP DB VECTOR+1 DB CLC6 DB ADC6+IMM DB 10H DB CMP6+IMM DB 0C0H IR EQU -0CH ;(INDIRECT,X) MODE INDIRY EQU +4 ;(INDIRECT),Y MODE ABSIND EQU +20H ;ABS INDIRECT MODE ACCUM EQU -4 ;ACCUMULATOR MODE IMM0 EQU -0CH ;IMMEDIATE MODE ABSY0 EQU +10H ;ABSOLUTE,Y MEQU 40H !TYA6 EQU 98H ;-------------------------------------------------------- IMM EQU -4 ;IMMEDIATE MODE ZP EQU -8 ;ZERO-PAGE MODE ABSX EQU +10H ;ABSOLUTE,X MODE ABSY EQU +0CH ;ABSOLUTE,Y MODE ZPX EQU +8 ;ZERO-PAGE,X MODE XIND100 FOR I=&HF000 TO &HF01A:READ X:POKE I,X:NEXT I 200 X=&HF000:CALL X:PRINT "CONSOLE DRIVER RE-PATCHED":STOP 300 DATA &H21,&H80,&HF3,&H06,&HF2,&H36,&H8A,&H23,&H70,&H23,&H36,&H80 400 DATA &H23,&H70,&H23,&H23,&H23,&H36,&H85,&H23,&H70,&H3E,&H01 500 DATA &REEN. THE TIME STRING 70 REM BEING DISPLAYED IS UPDATED ONCE A SECOND. 80 REM 100 CLOCK=PEEK(&HF38C)+256*PEEK(&HF38D)-65536!:T$=SPACE$(19):U$=T$:HOME 110 DIM D$(6),M$(11):FOR I=0 TO 6:READ D$(I):NEXT I 120 FOR I=0 TO 11:READ M$(I):NEXT I:VTAB 6:PRIH32,&HBB,&HF3,&HC9 ,&H8A,&H23,&H70,&H23,&H36,&H80 400 DATA &H23,&H70,&H23,&H23,&H23,&H36,&H85,&H23,&H70,&H3E,&H01 500 DATA &0,&HF3,&H06,&HF2,&H36,&H8A,&H23,&H70,&H23,&H36,&H80 400 DATA &H23,&H70,&H23,&H23,&H23,&H36,&H85,&H23,&H70,&H3E,&H01 500 DATA &D$(T$,6,2)); 180 PRINT ", 19";MID$(T$,9,2);" "; 190 I=VAL(MID$(T$,12,2)):IF I>11 THEN I=I-12:K$=" PM" ELSE K$=" AM" 200 IF I=0 THEN I=12 210 PRINT USING "###";I; 220 PRINT ":";MID$(T$,15,2);":";MID$(T$,18,2);K$:GOTO 130 230 DATA SUN,MON,TUE,WED,THU,NT "MOUNTAIN COMPUTER CPS CLOCK" 130 CALL CLOCK(T$):IF T$=U$ THEN 130 140 U$=T$:VTAB 10:IF LEN(T$)<>19 THEN PRINT "CLOCK NOT IN FORMAT 2!!!":STOP 150 PRINT " ";D$(VAL(LEFT$(T$,1))); 160 PRINT ", ";M$(VAL(MID$(T$,3,2))-1); 170 PRINT USING "###";VAL(MI100 FOR I=&HF000 TO &HF01A:READ X:POKE I,X:NEXT I 200 X=&HF000:CALL X:PRINT "CONSOLE DRIVER RE-PATCHED":STOP 300 DATA &H21,&H80,&HF3,&H06,&HF3,&H36,&H4A,&H23,&H70,&H23,&H36,&H58 400 DATA &H23,&H70,&H23,&H23,&H23,&H36,&H5E,&H23,&H70,&H3E,&H01 500 DATA &10 REM CPS CLOCK DISPLAY FOR CP/M 20 REM CREATED AUGUST 24,1981 30 REM PROGRAMMER: DAVE SANDERS 40 REM (C) 1981 MOUNTAIN COMPUTER INC. 50 REM THIS PROGRAM READS A STRING FROM THE CPS CLOCK, THEN RE-FORMATS 60 REM THE STRING AND DISPLAYS IT ON THE SCFRI,SAT 240 DATA JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC ":";MID$(T$,18,2);K$:GOTO 130 230 DATA SUN,MON,TUE,WED,THU,=0 THEN I=12 210 PRINT USING "###";I; 220 PRINT ":";MID$(T$,15,2);":";MID$(T$,18,2);K$:GOTO 130 230 DATA SUN,MON,TUE,WED,THU,H32,&HBB,&HF3,&HC9 ,&H4A,&H23,&H70,&H23,&H36,&H58 400 DATA &H23,&H70,&H23,&H23,&H23,&H36,&H5E,&H23,&H70,&H3E,&H01 500 DATA &0,&HF3,&H06,&HF3,&H36,&H4A,&H23,&H70,&H23,&H36,&H58 400 DATA &H23,&H70,&H23,&H23,&H23,&H36,&H5E,&H23,&H70,&H3E,&H01 500 DATA &10 REM CPS LISTER PROGRAM FOR ASCII FILES 20 REM CREATED AUGUST 27,1981 30 REM PROGRAMMER: DAVE SANDERS 40 REM (C) 1981 MOUNTAIN COMPUTER INC. 50 REM THIS PROGRAM LISTS AN ASCII FILE ON A SERIAL OR PARALLEL PRINTER; 60 REM THE PRINTER MUST BE CONFIGNC: I NC : ( I)CH1 PTRIe: PTR :: "No Room": $f  : : (," ");: :"-> ",A$: : CH Df PTR,CH1: PTR,CHNf zf NC : "None to Delete": f 6:PTR: IPW:LPRINT MID$(JN$,I,PW) 520 PNX=PNX-1:IF PNX=0 AND (I<=LEN(JN$)+PW OR EOF(1)=0) THEN GOSUB 550 530 NEXT I:IF EOF(1) THEN 580 ELSE 470 540 REM *** PRINT PAGE HEADERS AS NEEDED, AND SPACE TO A NEW PAGE WHEN DONE *** 550 IF PS=0 THEN 560 ELSE FOR J=1 TO &HE5,&H23,&H5E,&H23 250 PRINT "BIOS CONFIGURATION NOT RECOGNIZED!":STOP 260 T$=SPACE$(19):CALL CLOCK(T$) 270 IF LEN(T$)<>19 THEN PRINT "CLOCK NOT IN FORMAT 2!":STOP 280 REM *** GET CLOCK STRING AND RE-FORMAT INTO DATE/TIME STAMP *** 290 DIM D$(6),M$(1ure External Terminal":c " 2. Redefine Keyboard Characters":c " 3. Load User I/O Driver Software":,d " 4. Read/Write I/O Configuration Block":Fd" Q. Quit Program":\d::"Select - ";vd : A$"Q" :dQ(A$)0: Q F PN=0 THEN PNX=1E+12:LPRINT SPACE$((PW-LEN(F$))/2); ELSE PNX=PN-3 440 LPRINT F$;:IF PN=0 THEN LPRINT ELSE LPRINT SPACE$(PW-LEN(F$)-10);"PAGE ";P 450 LPRINT SPACE$((PW-LEN(S$))/2);S$:LPRINT STRING$(PW,"=") 460 REM *** COPY ASCII FILE TO PRINTER *** 47URED FOR SLOT #1 AND MUST BE ATTACHED 70 REM TO THE CPS CARD. CPS PARAMETERS ARE PULLED FROM SETUP INFO IN 80 REM THE CPS RAM TO DETERMINE LINE AND PAGE PARAMETERS, AND EACH PAGE 90 REM IS PROVIDED WITH A HEADER WHICH INCLUDES FILE NAME AND DATE/PS:LPRINT:NEXT J 560 P=P+1:LPRINT F$;SPACE$(PW-LEN(F$)-10);"PAGE ";P 570 LPRINT SPACE$((PW-LEN(S$))/2);S$:LPRINT STRING$(PW,"="):PNX=PN-3:RETURN 580 CLOSE #1:IF PN>0 AND PNX+PS>0 THEN FOR I=1 TO PNX+PS:LPRINT:NEXT I 590 END 2);S$:LPRINT STRING$(PW,"1):RESTORE 310:FOR I=0 TO 6:READ D$(I):NEXT I 300 FOR I=0 TO 11:READ M$(I):NEXT I 310 DATA SUN,MON,TUE,WED,THU,FRI,SAT 320 DATA JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC 330 DX$=D$(VAL(LEFT$(T$,1))):MX$=M$(VAL(MID$(T$,3,2))-1) 340 NX$=STR$(VAL(MQ d Q >,,^,vdCTRL:: :" ++ Keyboard Character Redefinition ++": : :7e : "Add/Delete/Quit (A/D/Q) - ";: (): : A$Je A$"Q"  ve A$"A"  : A$"D"  : e 6:CH1CHePTR0 LINE INPUT #1,IN$:JN$="":I=1:IF LEN(IN$)=0 THEN IN$=" " 480 K=INSTR(I,IN$,CHR$(9)):IF K=0 THEN N=1:K=LEN(IN$) ELSE N=K+1:K=K-1 490 JN$=JN$+MID$(IN$,I,K-I+1):I=N 500 IF N>1 THEN JN$=JN$+SPACE$(8-(LEN(JN$) MOD 8)):GOTO 480 510 FOR I=1 TO LEN(JN$) STEP TIME. 100 REM 200 REM *** SET UP CLOCK DRIVER CALL, AND DETERMINE IF CONFIGURATION IS CPS *** 210 CLOCK=PEEK(&HF38C)+256*PEEK(&HF38D)-65536! 220 FOR I=CLOCK TO CLOCK+3:READ J:IF PEEK(I)<>J THEN 250:NEXT I 230 IF PEEK(CLOCK+27)=&HC1 THEN 260 240 DATA b:b: I/O CONFIGURATION UTILITYb:b: COPYRIGHT (C) 1980 MICROSOFT (NK)b:c: REVISED 11/12/80c:Gc:  : " Initializing.";::".";: zc :: : )"++ I/O CONFIGURATION PROGRAM ++"c ::" 1. Config** INPUT FILE NAME, THEN OPEN FILE & SET UP PRINTER PARAMETERS *** 400 LINE INPUT "FILE TO PRINT? ",F$:OPEN "I",#1,F$ 410 P=1:IF PEEK(&HF201)=&H38 THEN Q=16 ELSE Q=32 420 POKE &HE1F8,Q:PN=PEEK(&HE1F3):PS=PEEK(&HE1F5):PW=PEEK(&HE1F2):POKE &HE1F8,0 430 IID$(T$,6,2))):YX$="19"+MID$(T$,9,2) 350 I=VAL(MID$(T$,12,2)): IF I>11 THEN I=I-12:KX$=" PM" ELSE KX$=" AM" 360 IF I=0 THEN I=12 370 HX$=STR$(I):IX$=MID$(T$,15,2):JX$=MID$(T$,18,2) 380 S$=DX$+", "+MX$+NX$+", "+YX$+" "+HX$+":"+IX$+":"+JX$+KX$ 390 REM * NC : CH( I) PTRIf: PTR :"Not There": g PTR IPTR : I,( I):!g! NC,+g" [g#" Function Software Hardware":fg$CTRLg%HLD( ):SLD( )g& I ()(DRV) :"Can't read/write - RW13 in effect" v:"Insert disk and hit any key ";:A$$():::"Working...";1v B$"R" ER() : ER()AvI(())rv:: ER "Disk write protected": v ER  v"Disk e Name? ",F$: (F$)  : G$".COM": I (F$): (F$,I,)"." G$""o`:F$F$G$pa:: "Loading.";: "R",,F$: , AS B$.pbPTR: ,XpcRCRD:BASE(#):PTRBASE:NP(PTR)pd NP :: "Bad file format": I :: RUB" CH:i9 I  : CH$(CTRL$,I,) CHI:i:NCi;CH( NC): CH NC 8j<" ";: : )" -> ";:CH( NC): :Jj=NCNC: ;j>CTRL:: "+ Terminal Screen Function Definition +":j? #): HBYT,(PTR): PADR,J :I():PTRPTRsu:::"Operation complete": I  :::  *tv: :"+ Read/Write I/O Configuration Block +"Ltw :"Read or Write (R/W)? ";ptx : A$"R" A$"W"  yty A$tzB$A$t{ : B : "Require Lead-in (Y/N)? ";: : A$"Y" A$"N" TmU A$: A$"Y" CHCHWnV : "Software or Hardware (S/H)? ";: : A$"S" A$"H" V : SHNDX: A$"H" SHNDX nnW QSHNDX,CHnX Q SHNDX,OFFSTOR: FUN$(I);: : " : ";g'CH1( I): CH1 CH1CH1:CHSLD: g(CHCH1: : h) :"--> ";;h*CH1( I): CH1 CH1CH1:CHHLD: Qh+CHCH1: #: Wh,ih- I 1oh.uh/{h0h1 "XY Coord Off: (J) FFqjPTRPTR:-rk FF :: "WARNING: A patch has already been made":"Continue anyway (Y/N)? ";: : A$"Y" l : :  Frl IDEST DESTLNrm I,(PTR):PTRPTR: PTRBASE PTRBASE:RCRDRCRD: ,RCRD peDESTPEK(PTR):LNPEK(PTR):PTRPTRqfFF: I NP:J(PTR): J J ::"Bad file format": I X:::  _qg J (PTR) LBYT,RETL: HBYT,RETH: PADR, :K()oqh J jqiPTRPTR:J (PTR)j@ )"1. Soroc IQ 120": )"2. Hazeltine 1500": )"3. Datamedia": )"4. Other": )"Q. Quit":kA :"Select - ";)kB : A$"Q"  KkCQ(A$)0: Q Q A[kD Q LkE:QQ: : "Software or Hardware (S/H)? ";$"R" "Source"; : "Destination";t|" Drive (A:-F:)? ";: ()t} : A$;:D$A$: : A$"u~ A$":" D$"A" D$"F" {[uDRV(D$)A: ,(DRV) : , `(DRV)uDS(DRV): DS :"Invalid drive": {uDnY LnZn[ : "XY Coord Offst : ",OFFST: OFFST OFFST [@o\ : "XY Xmit Order : ",A$: : A$"XY" A$"YX" \ : ORD: A$"XY" ORDFo]wo^: )"++ Load User I/O Driver Software ++"o_ : "Source Filst : "( ) ;: :"--> "( ) h2 "XY Xmit Order : ";i3 ( ) "YX"; : "XY"; ";: ( ) "YX" : "XY"Bi5}i6  : (," "):  :"Char: ",A$: : CH 6i7i8 CH$"rn PTR   ".";ro: RCRD ,rpPTRBASE: P NP;sq (PTR) PADR,(PTR)~: LBYT,(PTR): HBYT,(PTR):J():PTRPTR: u_srJ ~(PTR):KPEK(PTR){ss K,(J): K,(J)st LBYT,(PTRlO )"Q - Quit"lP: : "Select - ",A$: A$"Q" A$"q" > : Q(A$): Q Q P4mQ : Q "Lead-in char :"; : FUN$(Q))": ";gmR "",A$: : CH : (," "): QymS Q [mT Q V : :kF : A$"S" A$"H" FkGOFF: A$"H" OFF kH I  : OFFI,SF(Q,I):kI >lJ:lK >AlL: )"++ Screen Function Definition ++": ^lM )"1 - Lead-in char"lNJ: I : )I;: )"- "FUN$(I):I/O error"v I ::  v CH! CTRL "Ctrl-"(CH@);: : (CTRL$,CH,);:w CH~ "7EH";:+w CH "RUB";:Vw CH` LC "LC- " (CH );:iw " "(CH);:w I (A$):J((A$,I,)): I : FUN$(I):y".";: I : J:SZ$SZ$(J):z(SZ$,)(( )):(SZ$,)(( )):(SZ$,)(( ))Cz".";: I U: J:RD$RD$(J)::WR$RD$izOLDDRV( )(( ))tz ".";z I  : J: I,,33,184,243,126,245,35,16,251,62,1 ,50,235,243,33,16,16,34,208,243,33B~ 0,9,34,224,243,38,2,34,232,243,68,42,222,243,119,58,234,243,183,32,10 ,33,225,243,52,33,233,243,52,16~ 236,6,8,33,191,243,209,114,43,16,251,225,34,222,243,111,38 ,0,62,8,50 J` (A$,I,)(J )w:wA$$():J(A$): J` A$(J )wwCH: (A$) x (A$) CH(A$):Bx (A$)("&") CH(A$) :Lx |x (A$,)"CTRL-" CH((A$,,))@:x F$A$: F$"J:z".";:(WR$,)()z I : J:DP$DP$(J):zRET$( )( ) {I(""): PEK((SZ$));{ PEK((RD$)): ,( ): ,( )S{ PEK((WR$)){IPEK((DP$)): I:LBYTI:HBYTI:PADRI:F$",233,243,229,42,5~ 1,227,201,32,3,14,169,0,141,199,3,169,0,141,200,3,96~ 33,0,0,34,0,&HF3,201# 32,27,170,217,212,169,168,30,189,11,12T 128,126,156,152,143,153,159,146,145,140,16{ 160,0,12,11,29,14,15,25,30,31,2827,170,217,212,RUB" CH:x I  : F$(CTRL$,I,) CHIxxLy AZ:CTRL$"NULSOHSTXETXET ENQACKBELBS HT LF VT FF CR SO SI DLEDC1DC2DC3DC4NAKSYNETBCANEM SUBESCFS GS RS US SP "y PEK(X)(X)((X)((X)))y FUN$():6 !5y ( ~w0y > 2:6(62:@(y2F3257 :0F013000F8E13AF9E1E64028F97932FDE1C9003A :0000000000  , |} Clear screen,Clr to EOS,Clr to EOL,Lo-Lite text,Hi-Lite text,Home Cursor,Address Cursor,Cursor Up,Cursor Forwardv} 205,0,0,77,205,27,218,124,183,40,12,17,10,0,25,94,35,86,26,31 ,38,0,111,229,42,5,1,227,201} 42,222,243,229,6,8 "{RETL((RET$)):RETH((RET$)){ SF(, ): I : J  : SF(I,J)::|LC: ( ) ( ) LC| ( ) : :"CAN YOUR APPLE DISPLAY LOWER CASE?": " Y/N- ";: : A$: A$"Y" LC: , : LC:e !8y ( ~w0y >2:6(62!Eq!9"*wHJ #)h`F3257 :10013000F8E12145F07121390222D0F32ADEF3776C :10014000C90048ADB9034AD0172000C1A9038DB931 :1001500003A9808DFEC1A9238DFBC1y!!!Ey"*w  `  I`)I`J, ©H '  h ¢`)``͊og*6#N#F̀#N#F OÅ0000000000 y!!!Ey"*w  `  I`)I`J, éH '  h Íâ`)`D#^#V"@!"*w:Gwɭ AiiA ) @L4`1A851 :10013000A541186910C9C09002690F85412003C10B :0D014000297FC90DF0069140C84C340360C2 :0000000000 D#^#V"@!"*w:Gwɭ ©¨AiiA ) @L4`2A84E :10013000A541186910C9C09002690F85412003C20A :0D014000297FC90DF0069140C84C340360C2 :0000000000 D#^#V"@!"*w:Gwɭ éèAiiA ) @L4`3A84B :10013000A541186910C9C09002690F85412003C309 :0D014000297FC90DF0069140C84C340360C2 :0000000000 8D8#^#V"@!Q"*w:Gwɭ AiiA ) @Ll`1A851 :10013000A541186910C9C09002690F85412003C10B :0D014000297FC90DF0069140C84C6C02608B :0000000000 :ʍ\<ʍ͠R S͓͠G-!~G_ͻ#8!͠wO#NjBͻB͓G.ͻ\G͓G2\Ͷʓ{2ڲ:à% Command Error$No directory space$ DOWNLOAD Complete$Downloading Ë,y$K͊̀ͅ! wK# <5KByE<80ɾ# d * {~#z +++ r : <>H2 ~@̸¬#™ ŽA #2HXY: [! m<y!~<4: ]<: <~: