home *** CD-ROM | disk | FTP | other *** search
- ;CONTIBUTED BY LARRY FUKOMOTO
- ;5633 LINCOLN AVENUE
- ;CYPRESS
- ;CA 90630
- ;PROGRAM TO READ AND WRITE TO
- ;TARBELL CASSETTE
- ;
- ***
- ;*** READ ONLY MEMORY PROGRAM ****
-
- ORG 100H
-
- START LXI SP,0B3FFH ;SET STACK
- MVI A,0DH ;PRINT CR
- CALL PTCN ;AND
- MVI A,0AH ;LF
- CALL PTCN ;ON CONSOLE
- MVI A,':' ;PRINT
- CALL PTCN ;PROMPTT ON CONSOLE
- CALL RDCN ;READ KB
- CPI 'E' ;IF E
- CZ EXEC ;EXECUTE A PROGRAM
- CPI 'C' ;IF C
- CZ CINR ;GO TO INPUT RTTN
- CPI 'S' ;GO TO SYNC
- CZ CSYNC ;IF S
- CPI 'O' ;IF O
- JZ COUTR
- CPI 'I' ;IF I
- CZ CINR ;GO TO CASS IN
- CPI 'L' ;IF L
- CZ CINR ;LOAD AND GO
- CPI 'B' ;IF B (FOR BOOT)
- JZ 0000 ;REBOOT
- JMP START ;START AGAIN
-
- ;*** EXECUTE THE PROGRAM AT THE ADDR ***
-
- EXEC CALL AHEX ;READ ADDR FROM KB
- PCHL ;HOP TO IT
-
- ;*** CONVERT UP TO 4 HEX DIGITS TO BINARY ***
-
- AHEX LXI H,0 ;GET A 16-BIT 0
- MVI C,4 ;COUNTT DIGITS
- AHEI CALL RDCN ;READ A BYTE
- DAD H
- DAD H
- DAD H
- DAD H
- CALL AHSI ;CONVERT TO BINARY
- ADD L
- MOV L,A
- DCR C ;4 DIGITS?
- JNZ AHEI ;KEEP READING
- RET ;GO BACK
-
- ;*** CONVERT AN ASCII DIGIT TO HEX ***
-
- AHSI SUI 48 ;ASCII BIAS
- CPI 10 ;DIGIT 0-10
- RC
- SUI 7 ;ALPHA BIAS
- RET
-
- ;*** PRINT REGISTER A ON CONSOLE ***
-
- PTCN PUSH PSW ;SAVE REG A
- PTLOP IN CONC ;READ PRINTER STATUS
- ANI 80H ;STRIP OFF BIT 7
- JNZ PTLOP ;
- POP PSW ;THEN RECOVER A
- OUT COND ;AND PRINT IT
- RET ;RETURN FROM PRINT
- ;*** READ FROM CONSOLE TO REG A ****
-
-
- RDCN IN CONC ;READ KB STATUS
- ANI 1 ;IF BIT 1 NOT 0
- JNZ RDCN ;REPEAT UNTIL IT IS
- IN COND ;READ FROM KB
- ANI 7FH ;STRIP OFF MSB
- CALL PTCN ;ECHO TO CONSOLE
- RET
- CONC EQU 0 ;CONSOLE STATUS PORT
- COND EQU CONC+1 ;CONSOLE DATA PORT
-
- ;*** SYNC CODE GENERATOR ***
-
- CSYNC MVI A,0E6H ;WRITE SYNC BYTE
- CALL COUT ;ONTO CASS
- JMP CSYNC ;KEEP DOING IT
- ;*** CASS OUTPUT RTN ****
- COUTR CALL AHEX ;READ BLOCK LENGTH
- XCHG ;PUT INTO D,E
- CALL AHEX ;READ STARTING ADDR
- MVI B,0
- CALL COUT ;START BYTE OUT
- MVI A,0E6H ;SENDIT OUT
- CALL COUT ;ON CASS
- COLOP MOV A,M ;GET DATA FROM MEM
- CALL COUT ;SEND TO CASS
- ADD B ;ADD TO CHECKSUM
- MOV B,A
- INX H ;INCR POINTER
- DCX D ;DECR COUNTER
- SUB A ;CLEAR A
- CMP D ;IF D NOT 0
- JNZ COLOP ;REPEAT LOOP
- CMP E ;IF NOT E 0
- JNZ COLOP ;REPEAT LOOP
- MOV A,B ;REPEAT CHECKSUM
- CALL COUT ;OUTPUT IT
- JMP START ;GE ANOOTHER COMMAND
- COUT PUSH PSW ;SAVE A AND FLAAGS
- CLOP IN CASC ;READ CASS STATUS
- ANI 20H ;LOOK AT BIT 5
- JNZ CLOP ;TRY AGAIN?
- POP PSW ;RESTORE A
- OUT CASD ;SEND DATA TOA CASS
- RET
-
- ;*** CASS INPUT RTN ***
-
- CINR PUSH PSW ;SAVE CONTROL CHAR
- MVI A,10H ;USE BIT 4 IN REG A
- OUT CASC ;TO RESET CASS INT
- CALL AHEX ;READ BLOCK LENGTH
- XCHG ;PUT INTO D,E
- CALL AHEX ;READ STARTING ADDR
- POP PSW ;GET CONTROL CHAR
- PUSH H ;SAVE START ADDR
- PUSH PSW ;UNDER CONTROL CHAR
- MVI B,0 ;CHECKSUM = 0
- CILOP CALL CIN ;READ A BYTE FROM CASS
- MOV C,A ;SAVE IN REG A
- POP PSW ;GET CONTROLL CHAR
- PUSH PSW ;SAVE AGAIN
- CPI 'C' ;IS IT A C?
- MOV A,C ;GET BACK DATA BYTE
- JZ CINO ;IF C DON'T STORE
- MOV M,A ;IF NOT STORE
- CINO ADD B ;ADD TO CHECKSUM
- MOV B,A
- INX H ;INCR POINTER
- DCX D ;DECR COUNTER
- SUB A ;CLEAR A
- CMP D ;IF D NOT 0
- JNZ CILOP ;READ MORE
- CMP E ;IF NOT E
- JNZ CILOP ;READ MORE
- CALL CIN ;READ LAST BYTE
- CMP B ;COMPARE TO CHECKSUM
- MVI A,'E' ;PRINT E FOR ERROR
- JNZ CERR ;PRINT NOW FOR ERROR
- POP PSW ;RECOVER CONTROL CHAR
- CPI 'L' ;IF IT'S NOT L
- JNZ CERR ;DON'T EXEC
- POP H ;OTHERWISE EXEC
- PCHL ;AT STARTING ADDR
- CERR CALL PTCN ;PRINT C,E, OR I
- JMP START
- CIN IN CASC ;READ STATUS
- ANI 10H ;LOOK AT BIT 4
- JNZ CIN ;WAIT UNTIL LOW
- IN CASD ;READ DATA FROM CASS
- RET
- CASD EQU 6FH
- CASC EQU 6EH
-
-