home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols200 / vol235 / bcread.asm < prev    next >
Encoding:
Assembly Source File  |  1994-07-13  |  11.1 KB  |  566 lines

  1. ;**************************************************
  2. ;
  3. ;                 BASICODE READ
  4. ;
  5. ;  DIT OPENBAAR PROGRAMMA MAG GECOPIEERD EN GEDISTRIBEERD
  6. ;  WORDEN,  MITS INHOUDENDE DE VOLGENDE COPYRIGHT NOTICE
  7. ;
  8. ;   "         DIT PROGRAMMA
  9. ;     BETREFFENDE EEN IMPLEMENTATIE VAN DE
  10. ;        NOS BASICODE
  11. ;
  12. ;   IS TER BESCHIKKING GESTELD DOOR DE
  13. ;    HOBBY COMPUTER CLUB (HOLLAND)      "
  14. ;
  15. ;
  16. ;  NOS     P.O. 1200     1200BE HILVERSUM    (HOBBYSCOOP)
  17. ;  HCC  P.O. 149    2250AC VOORSCHOTEN    (CP/M gg)
  18. ;
  19. ;   Implementatie:
  20. ;        Albert van der Horst
  21. ;    t.b.v.  FORTH gebruikersgroep (HCC)
  22. ;
  23. ;*************************************************
  24.  
  25.     ORG    100H
  26.     CALL    PRINT
  27.  DB CTRLZ,LF,LF,' ** CP/M BASICODE LEES '
  28.  DB '**  RELEASE 1.0',CR,LF,LF,0
  29. ;
  30. ;
  31. ;*************************************************
  32. ;
  33. ;    Algemene opmerking:
  34. ;    Daar ook CP/M de registers van de Z80 niet
  35. ;    intact laat bij aanroepen naar het systeem,
  36. ;    is hier de regel aanhouden dat registers altijd
  37. ;    verpest worden door subroutines, tenzij anders
  38. ;    vermeld.
  39. ;
  40. ;------------- VERANDERLIJKE EQUATES ---------------
  41. ;
  42. ;     In het algemeen zal men voor ieder type computer
  43. ;       een verantwoorde keus moeten maken uit de volgende
  44. ;    opties, alsmede hardware adressen in moeten vullen.
  45. ;
  46. ; ASSEMBLER SWITCH      ALS HIJ 1 IS, BETEKENT HET DAT 
  47. MEMMAP    EQU 1    ; De Centronics poort is 'memory mapped'
  48. DEBUG    EQU 0    ; Debug instrukties meegeassembleerd
  49.         ;  Een langzame processor kan hier niet tegen!
  50. FIG    EQU 0    ; Een FIGFORTH blokken file wordt ingelezen,
  51.         ;  d.w.z. alle CR en LF's weg, alle regels
  52.         ;  worden aangevuld tot 64 characters.
  53. OSBRN    EQU 1    ; Speciaal voor OSBORNE: bank switching    
  54.  
  55. ; HARDWARE EQUATES
  56. CRIT    EQU    55    ; Grens tussen lengte O of 1 bit
  57. PAPORT    EQU    2902H    ; Parallel port (memory mapped)
  58.             ; Hier moet het Centronics 'PRINTER READY'
  59.             ;  signaal op binnen komen.
  60. SCREEN    EQU    0F000H    ; Memory mapped video screen
  61. ;
  62. ;------------- VASTE EQUATES --------------------------------
  63.  
  64. BDOS    EQU    5H
  65. DMA    EQU    80H
  66. STX    EQU    02H
  67. ETX    EQU    03H
  68. LF    EQU    0AH
  69. CR    EQU    0DH
  70. CTRLZ    EQU    1AH    ; CONTROL-Z
  71. FCB    EQU    5CH    ; Standaard file control block
  72.  
  73. ;-------------------------------------------------
  74.  
  75.     JMP    STACK    
  76.  
  77. ;
  78. ; ================================================
  79. ;
  80.  
  81.     IF    NOT OSBRN    ; Normale situatie
  82.     DS    20H        ; Reserveer stack ruimte
  83.     ENDIF
  84.  
  85.     IF    OSBRN    ; Programma moet boven 4000H draaien
  86.     ORG    4020H    ; wegens of Osborne bankswitching
  87.     ENDIF
  88.  
  89. STACK:    
  90.     LXI    H,STACK
  91.     SPHL
  92.  
  93. ; - - - - - WACHT OP KEYBOARD - - - - - - - - - - - 
  94.  
  95.     CALL    PRINT
  96.     DB    'START CASSETTE EN GEEF RETURN',CR,LF,0 
  97.     MVI    C,1
  98.     CALL    BDOS
  99.  
  100. ;----------- LEZEN VAN CASSETTE --------------------
  101.  
  102. ; - - - - - DISABLE INTERRUPTS - - - - - - - - - - 
  103. ;
  104. ;     DIT IS MISSCHIEN NIET VOOR ELK SYSTEEM VAN BELANG
  105.  
  106.     DI
  107.  
  108. ; - - - - - INITIALISEREN  - - - - - - - - - - - - -  
  109.  
  110.     IF    OSBRN
  111.     CALL    BANK2
  112.     ENDIF
  113.  
  114.     LXI    H,BUFFER-1
  115.     SHLD    LASTCH
  116. ;
  117. ;------- HAAL DE BYTES EEN VOOR EEN BINNEN ----------------
  118. ;
  119. ;     Op elk punt waar gelezen wordt kan de gebruiker
  120. ;      laten afbreken. Men komt dan in de error afhandeling
  121. ;      aan het eind van dit gedeelte (LABEL ERROR2)
  122.  
  123.  
  124.  
  125. REP1:    CALL    SYNCH        ; Zoek volgende startbit
  126.     CALL    BYTOBF           ; Haal byte van cassette
  127.                 ;  en plaats in buffer
  128.     CALL    CALCHK         ; Checksum bijwerken
  129.     MOV    A,C        ; Naar video ter controle
  130.     STA    SCREEN
  131.  
  132.     CPI    ETX+80H        ; ETX ->voorlaatste char
  133.     JNZ    REP1        ; Anders volgende byte
  134.  
  135. ; - - - - CHECKSUM - - - - - - - - - - - - - - - 
  136.  
  137.     CALL    SYNCH
  138.     CALL    BYTOBF    ; Haal checksum van cassette
  139.     LDA    CHKSUM    ; Haal berekende checksum    
  140.     CMP    C    ; Moet gelijk zijn 
  141.     JNZ    ELSE1    
  142.     MVI    A,0FFH
  143.     JMP    END2
  144.  
  145. ELSE1:    MVI    A,0
  146. END2:    STA    OKAY
  147.     JMP    END1
  148.  
  149. ; - - - - -  ON ERROR GEDEELTE - - - - - - - - - - - 
  150.  
  151. ERROR2:    MVI    A,0    ; Natuurlijk niet okay
  152.     STA    OKAY    ; want het inlezen werd onderbroken
  153.             ; door de gebruiker
  154.     LHLD    LASTCH  ; Verzekerd van ETX
  155.     INX    H    
  156.     MVI    M,ETX     
  157.     SHLD    LASTCH
  158.  
  159. ; - - - - - AFSLUITEN - - - - - - - - - - - - - - 
  160.  
  161. END1:    NOP
  162.  
  163.     IF    OSBRN    
  164.     CALL    BANK1    ; Bank terugschakelen
  165.     ENDIF
  166.  
  167.     EI
  168.  
  169.     CALL    MESSGE  ; Hoe afgelopen?
  170.  
  171. ;
  172. ;------- VERPLAATS VAN BUFFER NAAR SCHIJF --------------
  173. ;
  174. ;    In dit hele gedeelte wijst HL naar het te
  175. ;    verwerken byte in de buffer.
  176. ;
  177. ;- - - - - - INITIALISEREN - - - - - - - - 
  178. ;
  179.     CALL     OPEN
  180.     LHLD    FRSTCH        ; Skip rommel voor STX
  181.     INX    H        ; Skip ook nog over STX
  182.  
  183. ; - - - - - LOOP OVER DMA BUFFERS - - - - - - - -
  184.  
  185. REP6:
  186.     LXI    D,DMA
  187.     MVI    B,80H    ; Bytes per record
  188.  
  189. REP7:    CALL    COPCHR    ; Byte naar DMA buffer
  190.     JZ    OUT3    ; Z: d.w.z. ETX gevonden
  191.     DCR    B
  192.     JNZ    REP7
  193.     
  194.     PUSH    H
  195.     CALL    WRITE    ; BUFFER VOL : SCHRIJVEN
  196.     POP    H
  197.     JMP    REP6
  198.  
  199. ; - - - - - LAATSTE RECORD - - - - - - - - - - - 
  200. ;
  201. ;  Vul de laatste buffer met CTRLZ's op
  202.  
  203. OUT3:    DCX    D    ; Overschrijf ETX
  204. REP2:    MVI    A,CTRLZ
  205.     STAX    D
  206.     INX    D
  207.     DCR    B
  208.     JNZ    REP2
  209.  
  210.     CALL WRITE
  211.  
  212.  
  213. ;- - - - - - EINDE - - - - - - - - - - - - - - 
  214.  
  215.     CALL    CLOSE
  216.     JMP    0    ; Terug naar CP/M
  217.     
  218. ;**************************************************
  219. ;
  220. ;     SUBROUTINE GEBIED
  221. ;
  222. ;**************************************************
  223.  
  224. ; --------- BYTE NAAR DMA BUFFER -------------
  225. ;    Verplaats een byte van input buffer naar DMA buffer.
  226. ;    Als Z, dan zijn we ETX tegengekomen.
  227. ;    Stelt HL ( 'van'-pointer) en DE ('naar'-pointer bij)
  228. ;    Behoudt het BC register (teller), tenzij bij FIG
  229. ;     opvulakties.
  230.  
  231. COPCHR    MOV    A,M    ; Copieer buffer naar DMA 
  232.     INX    H
  233.     ANI    7FH    ; 7e BIT ERAF
  234.     STAX    D
  235.     INX    D
  236. ;    CPI    ' '    ; Controle char?
  237. ;    JNC    NORMAL
  238.     CPI    LF
  239.     JZ    NORMAL
  240.     CPI    CR    ; Enige toegestane controle character
  241.  
  242.     IF    FIG    ; Bij FIGFORTH speciale opvul actie
  243.     CZ    OPVUL
  244.     ENDIF
  245.  
  246.     IF    NOT FIG
  247.     JZ    CRLF
  248.     JMP    NORMAL
  249. CRLF:    DCX    H    ; Frommel er een LF bij
  250.     MVI    M,LF    ; Wordt straks pas opgepikt!
  251.     ENDIF
  252.  
  253. NORMAL:    CPI    ETX    ; Z vlag betekent einde
  254.     RET
  255.  
  256. ;---------- OPVULLEN MET SPATIES -----------------
  257. ;
  258. ;    Alleen voor FIG FORTH files
  259. ;    Stelt HL,DE en BC bij (zie COPCHR)
  260.  
  261.     IF    FIG
  262. OPVUL    MVI    A,020H    ; Spatie
  263.     DCX    D
  264.     STAX    D    ; Overschrijf CR,
  265.     INX    D    ;   die er al was.
  266.  
  267. REP9    MVI    A,20H    ; Schrijf spaties
  268.     STAX    D
  269.     INX    D
  270.     DCR    B
  271.     MOV    B,A
  272.     CPI    41H    ; Tot 1e regel vol
  273.     RZ
  274.     CPI    01H    ; Of 2e regel vol
  275.     RZ
  276.     JMP    REP9
  277.     ENDIF
  278.  
  279. ;---------- SYNCHRONISEREN ---------------------
  280. ;    Wacht op 0-bit
  281.  
  282. SYNCH:    LXI    H,PAPORT
  283.     CALL    BITPS
  284.     MVI    A,CRIT/2    ; HET GAAT HIER OM HALVE PERIODE
  285.         CMP    E
  286.     JNC    SYNCH
  287.     CALL    BITPS        ; OOK TWEEDE KEER LANG?
  288.     MVI    A,CRIT/2
  289.         CMP    E
  290.  
  291.     IF    DEBUG 
  292.     MOV    A,E
  293.     STA    SCREEN+3
  294.     ENDIF
  295.  
  296.     JNC    SYNCH
  297.     RET
  298.  
  299. ; --------- VERWIJDER CHARACTERS -------------------- 
  300. ;
  301. ;    Verwijder alle char's, gelijk aan register C
  302.  
  303. REMOVE    LXI    D,FRSTCH
  304.     LXI    H,FRSTCH
  305.  
  306. REP8:    LDAX    D        ; COPIEER VAN D
  307.     MOV    M,A        ;   NAAR H
  308.  
  309.     CMP    C        
  310.     JZ    END4        ; INDIEN HET EEN FOUT CHAR IS
  311.     INX    H        ;  INCREMENTEER DAN H NIET
  312.  
  313. END4:    INX    D
  314.     CPI    ETX
  315.     JNZ    REP8
  316.  
  317.     DCX    H
  318.     SHLD    LASTCH        ; NIEUW EINDPUNT
  319.     RET
  320.  
  321.  
  322. ; ------- HAAL BYTE OP -----------------------------
  323. ;
  324. ;    Haalt een byte op en plaats het in de buffer.
  325. ;    Uitvoer: C bevat het gelezen byte.
  326. ;    
  327. BYTOBF:    MVI    C,80H        ; Als dit bit weer tevoorschijn
  328.                 ; komt zijn we klaar
  329. DO1:    CALL    BITIN        ; lees bit
  330.     MOV    A,C        ; Schuif bit in C erbij
  331.     RAR
  332.     MOV    C,A
  333.     JNC    DO1    
  334.  
  335.     LHLD    LASTCH        ; Plaats c in buffer
  336.     INX    H
  337.     MOV    M,C
  338.     SHLD    LASTCH
  339.     RET
  340.  
  341. ; --------- HOUDT CHECKSUM BIJ ------------------- 
  342. ;
  343. ;    Invoer: C
  344. ;
  345. CALCHK:    MOV    A,C    ; In C zit het zojuist gelezen byte    
  346.     CPI    STX+80H
  347.     LDA    CHKSUM
  348.      JNZ    END3    ; Als STX gelezen was 
  349.     XRA    A    ; initialisieer dan checksum opnieuw
  350.     SHLD    FRSTCH    ; en onthoud dit adres
  351. END3:    XRA    C
  352.     STA    CHKSUM
  353.     RET
  354.  
  355. ; ------------- SWITCH NAAR BANK 1 -------------  
  356. ;
  357. ;  Zie OSBORNE USER GUIDE 262 ( REV.12/15/82)
  358.  
  359.  
  360.     IF    OSBRN
  361. BANK1:    OUT    1
  362.     MVI    A,1
  363.     STA    0EF08H    
  364.     RET
  365.  
  366. ; ------------- SWITCH NAAR BANK 2 ------------------
  367. ;
  368. ;  Zie OSBORNE USER GUIDE 262 ( REV.12/15/82)
  369.  
  370. BANK2:    OUT    0
  371.     MVI    A,0
  372.     STA    0EF08H    
  373.     RET
  374.     ENDIF
  375.  
  376.  
  377. ; ------------- HAAL EEN BIT BINNEN -------------
  378. ;
  379. ; Bepaal de lengte van de positieve en negatieve 
  380. ;  fase.
  381. ; 1/1200 sec = 833.25 usec 
  382. ; Op de Osborne (4 Mhz) is dat 3333 cycles
  383. ; Bij overschrijding hiervan een sprong naar
  384. ; de foutafhandeling.
  385. ; BC blijft behouden door deze routine heen, C bevat
  386. ; immers het te lezen byte in opbouw
  387.  
  388. BITIN:    PUSH    B
  389.     MVI    B,2    ; 2 fasen voor '1-bit'
  390.     
  391. REP4:    CALL    BITPS    ; Wacht 1e periode
  392.     MOV    D,E    ; Bewaar lengte eerste helft
  393.     CALL    BITPS    ; Wacht 2e periode
  394.     MOV    A,E
  395.     ADD    D    ; Totale lengte
  396.  
  397.     IF    DEBUG
  398.     STA    SCREEN+3
  399.     ENDIF
  400.  
  401.     CPI    CRIT    ;  0 of 1 bit?
  402.     JNC    OUT2    ; Uit de loop bij 1200 periode
  403.     DCR    B
  404.     JNZ    REP4
  405.             ; Anders: skip 2e golf
  406. OUT2:    POP    B
  407.     RET
  408.  
  409. ; ----------- MEET LENGTE PERIODE -----------------
  410. ;
  411. ; HL wijst al naar de poort (bij memory mapped)
  412. ; Bij time-out wordt gekeken of er een toets ingedrukt is.
  413. ; Zo ja, dan breekt het inlezen af. 
  414.  
  415.  
  416.     IF    MEMMAP
  417. BITPS:    MOV    A,M    ; Lees poort
  418.     MVI    E,0    ; Init teller
  419.  
  420. REP5:    INR    E    ; Meet lengte
  421.     JZ    OUT1    ; Timeout
  422.     CMP    M    ; Veranderd?
  423.     JZ    REP5    ; Zo niet herhaal
  424.     RET
  425.     ENDIF
  426.  
  427. ; - - - - HET VOLGENDE NIET GETEST - - - - - - - 
  428.  
  429.     IF    NOT MEMMAP 
  430. BITPS:    IN    PAPORT    ; Lees poort
  431.     MOV    L,A    ; Bewaar in L
  432.     MVI    E,0    ; Init teller
  433.  
  434. REP5:    INR    E    ; Meet lengte
  435.     JZ    OUT1    ; Timeout
  436.     IN    PAPORT
  437.     CMP    L    ; Veranderd?
  438.     JZ    REP5    ; Zo niet herhaal
  439.     RET
  440.     ENDIF
  441.  
  442. ; - - - - - TIME OUT - - - - - - - - - -
  443.  
  444. OUT1:    
  445.     IF    OSBRN
  446.     CALL    BANK1
  447.     ENDIF
  448.  
  449.     CALL    KBD    ; Wil men afbreken?
  450.     PUSH    PSW
  451.  
  452.     IF    OSBRN
  453.     CALL    BANK2
  454.     ENDIF
  455.  
  456.     POP    PSW
  457.     JNZ    REP5     ; Zoniet toch doorgaan
  458.     JMP    ERROR2
  459.  
  460.  
  461. ; ---------- PRINT DE TEKST VOLGENDE OP DE CALL ---------------
  462.  
  463. PRINT    POP    H    ; Haal return address op
  464.     MOV    A,M    ; Haal een letter op
  465.     INX    H
  466.     ORA    A
  467.     JZ    END5
  468.     PUSH    H
  469.     CALL    CRT
  470.     JMP    PRINT
  471. END5    PCHL        ; RETURN
  472.  
  473. ; ----------- HOE AFGELOPEN -----------------------
  474.  
  475. MESSGE:    CALL    PRINT
  476.     DB    CR,LF,' DE CHECKSUM KLOPT ',0
  477.     LDA    OKAY
  478.     ANA    A
  479.     RNZ
  480.     CALL    PRINT
  481.     DB    'NIET',0
  482.     RET
  483.  
  484. ;=================================================
  485. ;
  486. ;            INTERFACE MET CP/M
  487. ;            ------------------
  488. ;
  489. ;=================================================
  490.  
  491. ; ---------------  FUNKTIE SCAN FOR CHAR -----------
  492. ;
  493. ;  Uitvoer : Z-vlag betekent toets ingedrukt
  494.  
  495. KBD    PUSH    H
  496.     PUSH    D
  497.     PUSH    B
  498.     EI
  499.     MVI    C,0BH    
  500.     CALL    BDOS
  501.     ANI    1    ; TEST L.S. BIT
  502.     CPI    1
  503.     DI
  504.     POP    B
  505.     POP    D
  506.     POP    H
  507.     RET    
  508.  
  509. ; ----------  FUNKTIE PRINT A CHAR ------------
  510.    
  511. CRT    MOV    E,A    ; OUTPUTS 'A' IN ASCII
  512.     MVI    C,2    
  513.     CALL    BDOS    
  514.     RET
  515.  
  516.                
  517.  
  518. ; --------  FUNKTIE MAAK FILE ------------------- 
  519. ;
  520. ;    OPENT DE FILE MET NAAM OP FCB VOOR SCHRIJVEN
  521. ;
  522. OPEN:    MVI    C,22
  523.     LXI    D,FCB
  524.     CALL    BDOS
  525.     RET
  526.  
  527. ; ------  FUNKTIE SCHRIJF RECORD  ---------------
  528.  
  529. ;
  530. ;    SCHRIJF HET volgende RECORD 
  531. ;
  532. WRITE:    MVI    C,21
  533.     LXI    D,FCB
  534.     CALL    BDOS
  535.     RET
  536.  
  537. ; --------  FUNKTIE SLUIT FILE  --------------
  538. ;
  539. ;    SLUIT HET SCHRIJVEN AF
  540. ;
  541. CLOSE:    MVI    C,16
  542.     LXI    D,FCB
  543.     CALL    BDOS
  544.     RET
  545.  
  546. ;=================================================
  547. ;
  548. ;            START VAN BUFFER GEBIED
  549. ;            -----------------------
  550. ;
  551. ;=================================================
  552.  
  553. ;
  554. OKAY    DB    0    ; BOOLEAN: BETEKENT
  555. ;               - ER WAS STX
  556. ;               - ER WAS ETX
  557. ;               - DE CHECKSUM KLOPTE
  558. FRSTCH    DW    0    ; ADRES VAN EERSTE CHAR : STX
  559. ;              ALS OKAY DUS STX
  560. LASTCH    DW    0    ; ADRES VAN LAATSTE CHAR : ETX
  561. ;              ALS OKAY DUS ETX
  562. CHKSUM    DB    0    ; LOPENDE CHECKSUM
  563. BUFFER:    DS    5000H
  564.