home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
SIMTEL
/
CPMUG
/
CPMUG015.ARK
/
ROMP.ASM
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
4KB
|
171 lines
;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