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 >
Assembly Source File  |  1984-04-29  |  4KB  |  171 lines

  1. ;CONTIBUTED BY LARRY FUKOMOTO
  2. ;5633 LINCOLN AVENUE
  3. ;CYPRESS
  4. ;CA    90630
  5. ;PROGRAM TO READ AND WRITE TO
  6. ;TARBELL CASSETTE
  7. ;
  8. ***
  9. ;*** READ ONLY MEMORY PROGRAM  ****
  10.  
  11.     ORG 100H
  12.  
  13. START    LXI  SP,0B3FFH    ;SET STACK
  14.     MVI  A,0DH    ;PRINT CR
  15.     CALL PTCN    ;AND
  16.     MVI  A,0AH    ;LF
  17.     CALL PTCN    ;ON CONSOLE
  18.     MVI  A,':'    ;PRINT
  19.     CALL PTCN    ;PROMPTT ON CONSOLE
  20.     CALL RDCN    ;READ KB
  21.     CPI  'E'    ;IF E
  22.     CZ  EXEC    ;EXECUTE A PROGRAM
  23.     CPI  'C'    ;IF C
  24.     CZ  CINR    ;GO TO INPUT RTTN
  25.     CPI  'S'    ;GO TO SYNC
  26.     CZ CSYNC    ;IF S
  27.     CPI  'O'    ;IF O
  28.     JZ  COUTR        
  29.     CPI  'I'    ;IF I
  30.     CZ  CINR    ;GO TO CASS IN
  31.     CPI  'L'    ;IF L
  32.     CZ  CINR    ;LOAD AND GO
  33.     CPI 'B'        ;IF B (FOR BOOT)
  34.     JZ  0000    ;REBOOT
  35.     JMP  START      ;START AGAIN
  36.  
  37. ;*** EXECUTE THE PROGRAM AT THE ADDR  ***
  38.  
  39. EXEC    CALL AHEX    ;READ ADDR FROM KB
  40.     PCHL        ;HOP TO IT
  41.  
  42. ;*** CONVERT UP TO 4 HEX DIGITS TO BINARY ***
  43.  
  44. AHEX    LXI  H,0    ;GET A 16-BIT 0
  45.     MVI  C,4    ;COUNTT DIGITS
  46. AHEI    CALL RDCN    ;READ A BYTE
  47.     DAD  H
  48.     DAD  H
  49.     DAD  H
  50.     DAD  H
  51.     CALL AHSI    ;CONVERT TO BINARY
  52.     ADD  L
  53.     MOV  L,A
  54.     DCR  C        ;4 DIGITS?
  55.     JNZ  AHEI    ;KEEP READING
  56.     RET        ;GO BACK
  57.  
  58. ;*** CONVERT AN ASCII DIGIT TO HEX  ***
  59.  
  60. AHSI    SUI  48        ;ASCII BIAS
  61.     CPI  10        ;DIGIT 0-10
  62.     RC
  63.     SUI  7        ;ALPHA BIAS
  64.     RET
  65.  
  66. ;*** PRINT REGISTER A ON CONSOLE  ***
  67.  
  68. PTCN    PUSH PSW    ;SAVE REG A
  69. PTLOP    IN CONC        ;READ PRINTER STATUS
  70.     ANI  80H    ;STRIP OFF BIT 7
  71.     JNZ  PTLOP    ;
  72.     POP  PSW    ;THEN RECOVER A
  73.     OUT  COND    ;AND PRINT IT
  74.     RET        ;RETURN FROM PRINT
  75. ;*** READ FROM CONSOLE TO REG A ****
  76.  
  77.  
  78. RDCN    IN  CONC    ;READ KB STATUS
  79.     ANI 1        ;IF BIT 1 NOT 0
  80.     JNZ RDCN    ;REPEAT UNTIL IT IS
  81.     IN  COND    ;READ FROM KB
  82.     ANI  7FH    ;STRIP OFF MSB
  83.     CALL PTCN    ;ECHO TO CONSOLE
  84.         RET
  85. CONC    EQU  0        ;CONSOLE STATUS PORT
  86. COND    EQU CONC+1    ;CONSOLE DATA PORT
  87.  
  88. ;*** SYNC CODE GENERATOR  ***
  89.  
  90. CSYNC    MVI A,0E6H    ;WRITE SYNC BYTE
  91.     CALL  COUT    ;ONTO CASS
  92.     JMP  CSYNC    ;KEEP DOING IT
  93. ;*** CASS OUTPUT RTN ****
  94. COUTR    CALL AHEX    ;READ BLOCK LENGTH
  95.     XCHG        ;PUT INTO D,E
  96.     CALL AHEX    ;READ STARTING ADDR
  97.     MVI  B,0        
  98.     CALL  COUT    ;START BYTE OUT
  99.     MVI  A,0E6H    ;SENDIT OUT
  100.     CALL  COUT    ;ON CASS
  101. COLOP    MOV  A,M    ;GET DATA FROM MEM
  102.     CALL COUT    ;SEND TO CASS
  103.     ADD  B        ;ADD TO CHECKSUM
  104.     MOV  B,A
  105.     INX  H        ;INCR POINTER
  106.     DCX  D        ;DECR COUNTER
  107.     SUB  A        ;CLEAR A
  108.     CMP  D        ;IF D NOT 0
  109.     JNZ  COLOP    ;REPEAT LOOP
  110.     CMP  E        ;IF NOT E 0
  111.     JNZ  COLOP    ;REPEAT LOOP
  112.     MOV  A,B    ;REPEAT CHECKSUM
  113.     CALL  COUT    ;OUTPUT IT
  114.     JMP START    ;GE ANOOTHER COMMAND
  115. COUT    PUSH  PSW    ;SAVE A AND FLAAGS
  116. CLOP    IN  CASC    ;READ CASS STATUS
  117.     ANI  20H    ;LOOK AT BIT 5
  118.     JNZ  CLOP    ;TRY AGAIN?
  119.     POP  PSW    ;RESTORE A
  120.     OUT  CASD    ;SEND DATA TOA CASS
  121.     RET
  122.  
  123. ;*** CASS  INPUT RTN  ***
  124.  
  125. CINR    PUSH  PSW    ;SAVE CONTROL CHAR
  126.     MVI  A,10H    ;USE BIT 4 IN REG A
  127.     OUT CASC    ;TO RESET CASS INT
  128.     CALL AHEX    ;READ BLOCK LENGTH
  129.     XCHG        ;PUT INTO D,E
  130.     CALL AHEX    ;READ STARTING ADDR
  131.     POP  PSW    ;GET CONTROL CHAR
  132.     PUSH  H        ;SAVE START ADDR
  133.     PUSH  PSW    ;UNDER CONTROL CHAR
  134.     MVI  B,0    ;CHECKSUM = 0
  135. CILOP    CALL CIN    ;READ A BYTE FROM CASS
  136.     MOV  C,A    ;SAVE IN REG A
  137.     POP  PSW    ;GET CONTROLL CHAR
  138.     PUSH  PSW    ;SAVE AGAIN
  139.     CPI  'C'    ;IS IT A C?
  140.     MOV  A,C    ;GET BACK DATA BYTE
  141.     JZ  CINO    ;IF C DON'T STORE
  142.     MOV  M,A    ;IF NOT STORE
  143. CINO    ADD  B        ;ADD TO CHECKSUM
  144.     MOV  B,A
  145.     INX  H        ;INCR POINTER
  146.     DCX  D        ;DECR COUNTER
  147.     SUB A         ;CLEAR A
  148.     CMP  D         ;IF D NOT 0
  149.     JNZ  CILOP    ;READ MORE
  150.     CMP  E        ;IF NOT E
  151.     JNZ  CILOP    ;READ MORE
  152.     CALL CIN    ;READ LAST BYTE
  153.     CMP  B        ;COMPARE TO CHECKSUM
  154.     MVI  A,'E'    ;PRINT E FOR ERROR
  155.     JNZ  CERR    ;PRINT NOW FOR ERROR
  156.     POP  PSW    ;RECOVER CONTROL CHAR
  157.     CPI  'L'    ;IF IT'S NOT L
  158.     JNZ  CERR    ;DON'T EXEC
  159.     POP  H        ;OTHERWISE EXEC
  160.     PCHL        ;AT STARTING ADDR
  161. CERR    CALL PTCN    ;PRINT C,E, OR I
  162.     JMP START
  163. CIN    IN CASC        ;READ STATUS
  164.     ANI  10H    ;LOOK AT BIT 4
  165.     JNZ CIN        ;WAIT UNTIL LOW
  166.     IN CASD        ;READ DATA FROM CASS
  167.     RET
  168. CASD    EQU  6FH
  169. CASC    EQU  6EH
  170.     
  171.