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

  1. ;**************************************************
  2. ;
  3. ;          PROGRAMMA BCWRIT
  4. ;          ================
  5. ;
  6. ;    Schrijft een CP/M tekstfile naar cassette volgens
  7. ;    het BASICODE protocol.
  8. ;    De naam wordt opgegeven in de aanroep.
  9. ;
  10. ;**************************************************
  11. ;
  12. ;  DIT OPENBAAR PROGRAMMA MAG GECOPIEERD EN GEDISTRIBUEERD
  13. ;  WORDEN,  MITS INHOUDENDE DE VOLGENDE COPYRIGHT NOTICE
  14. ;
  15. ;   "         DIT PROGRAMMA
  16. ;     BETREFFENDE EEN IMPLEMENTATIE VAN DE
  17. ;        NOS BASICODE
  18. ;
  19. ;   IS TER BESCHIKKING GESTELD DOOR DE
  20. ;    HOBBY COMPUTER CLUB (HOLLAND)      "
  21. ;
  22. ;
  23. ;  NOS     P.O. 1200     1200BE HILVERSUM    (HOBBYSCOOP)
  24. ;  HCC  P.O. 149    2250AC VOORSCHOTEN    (CP/M gg)
  25. ;
  26. ;   Implementatie:
  27. ;        Albert van der Horst
  28. ;    t.b.v.  FORTH gebruikersgroep (HCC)
  29. ;
  30. ;**************************************************
  31.  
  32.     ORG    100H
  33.     CALL    PRINT
  34.  DB CTRLZ,LF,LF,' ** CP/M BASICODE WRITE '
  35.  DB '**  RELEASE 1.0',CR,LF,LF,0        ;    ;B
  36. ;
  37. ;*************************************************
  38. ;
  39. ;    Algemene opmerking:
  40. ;    Daar ook CP/M de registers van de Z80 niet
  41. ;    intact laat bij aanroepen naar het systeem,
  42. ;    is hier de regel aanhouden dat registers altijd
  43. ;    verpest worden door subroutines.
  44. ;    Uitzonderingen: de snelheidsgevoelige schrijf-
  45. ;    routines behouden het HL register.
  46. ;    Dit zijn : PAUSE,BEEPV,SE1200,SE2400 en HLFPER.
  47. ;    Hiervan behouden de laatste 3 ook het DE register.
  48. ;
  49. ;------------- VERANDERLIJKE EQUATES ---------------
  50. ;
  51. ;     In het algemeen zal men voor ieder type computer
  52. ;       een verantwoorde keus moeten maken uit de volgende
  53. ;    opties, alsmede hardware adressen in moeten vullen.
  54. ;
  55. ; ASSEMBLER SWITCH      ALS HIJ 1 IS, BETEKENT HET DAT 
  56. MEMMAP    EQU 1    ; De Centronics poort is 'memory mapped'
  57. DEBUG    EQU 0    ; Debug instrukties meegeassembleerd
  58. FIG    EQU 0    ; Een FIGFORTH blokken file wordt geschreven,
  59.         ;  d.w.z. na elke 64 characters wordt 
  60.         ;  automatisch een CR gegenereerd,
  61.         ;  die niet in de invoer stond.
  62. OSBRN    EQU 1    ; Speciaal voor OSBORNE: bank switching    
  63.  
  64. ; HARDWARE EQUATES
  65. PAPORT    EQU    2900H    ; Parallel port (memory mapped)
  66. SCREEN    EQU    0F000H    ; Memory mapped video screen
  67. DEL12    EQU    98    ; Delay loop voor '0' bit (4 MHz)
  68. DEL24    EQU    48    ; Delay loop voor '1' bit (4 MHz)
  69.  
  70. ;
  71. ;------------- VASTE EQUATES --------------------------------
  72.  
  73. BDOS    EQU    5H
  74. DMA    EQU    80H
  75. STX    EQU    02H
  76. ETX    EQU    03H
  77. LF    EQU    0AH
  78. CR    EQU    0DH
  79. CTRLZ    EQU    1AH    ; Control-Z
  80. FCB    EQU    5CH    ; Standaard file control block
  81.  
  82. ;-------------------------------------------------
  83.  
  84.     JMP    STACK    
  85.  
  86. ;
  87. ; ================================================
  88. ;
  89.  
  90.     IF    NOT OSBRN    ; Normale situatie
  91.     DS    20H        ; Reserveer stackruimte
  92.     ENDIF
  93.  
  94.     IF    OSBRN    ; Programma moet boven 4000H draaien
  95.     ORG    4020H    ; wegens Osborne bankswitching
  96.     ENDIF
  97.  
  98. STACK:    
  99.     LXI    H,STACK
  100.     SPHL
  101.  
  102.  
  103. ;---------- VERPLAATS VAN SCHIJF NAAR BUFFER --------------
  104.  
  105. ; - - - - - INITIALISEREN - - - - - - - - - - - - - - - - - 
  106.  
  107.  
  108.     CALL     OPEN
  109.  
  110.     IF    DEBUG
  111.     ADI    30H
  112.     CALL    CRT
  113.     CALL    PRINT
  114.     DB    ' : WAS DE STATUS NA OPENEN',CR,LF,0
  115.     ENDIF
  116.  
  117.     LXI    H,BUFFER    ; Eerste letter:'STX'
  118.     MVI    M,STX
  119.     INX    H
  120.  
  121. ; - - - - - LUS OVER RECORDS - - - - - - - - - - - - 
  122.  
  123. REP2:    SHLD    CURDMA    ; Bewaar het huidige DMA adres
  124.  
  125.     MOV    D,H    ; Zet het DMA adres
  126.     MOV    E,L
  127.     CALL    SETDMA
  128.  
  129.     CALL     READ    ; Lees een buffer in
  130.  
  131.     STA    STATUS    ; Bewaar foutmelding
  132.     IF    DEBUG
  133.     ADI    30H
  134.     CALL    CRT
  135.     CALL    PRINT
  136.     DB    ' : WAS DE STATUS NA LEZEN',CR,LF,0
  137.     ENDIF
  138.  
  139.     LHLD    CURDMA    ; Bereidt volgende buffer
  140.     LXI    D,80H    ;   adres voor
  141.     DAD    D    
  142.     
  143.     IF    FIG    ; Alleen bij FIG files
  144.     CALL    INSCR    ;  zet er cr's tussen
  145.     ENDIF
  146.  
  147.     LDA    STATUS
  148.     CPI    0    ; TEST STATUS
  149.     JZ    REP2
  150.     MVI    M,CTRLZ ; Voor het geval...
  151.  
  152. ; - - - - - AFSLUITING INLEES GEDEELTE  - - - - - -
  153.  
  154.  
  155.     IF    DEBUG
  156.     ADI    30H
  157.     CALL    CRT
  158.     CALL    PRINT
  159.     DB    ' : WAS DE STATUS NA LEZEN',CR,LF,0
  160.     ENDIF
  161.  
  162.     CALL    CLOSE
  163.  
  164. ;------------ OMWERKEN TEKST IN BUFFER -------------------
  165. ;
  166. ; WAARSCHUWING: Dit is systeem afhankelijk
  167. ;
  168. ; - - - - - VERWIJDEREN LINEFEED - - - - - - - - - -
  169.  
  170.     MVI    C,LF    
  171.     CALL    REMOVE    
  172.  
  173. ; - - - - - EINDE OPZOEKEN - - - - - - - - - - - - -
  174. ;
  175. ;    Einde is CTRL-Z. Alle tekst files onder CP/M 
  176. ;      WORDEN AFGESLOTEN MET CTRL-Z (ANDERE NIET)
  177.  
  178.     LXI    H,BUFFER
  179. REP4:    INX    H
  180.     MOV    A,M
  181.     CPI    CTRLZ
  182.     JZ    OUT1
  183.     JMP    REP4
  184.  
  185. OUT1:    NOP
  186.     MVI    M,ETX
  187.  
  188. ; - - - - - BEREKEN CHECKSUM - - - - - - - - - - -
  189. ;
  190. ; Zet meteen ook de achtste biiten op
  191.  
  192.     LXI    H,BUFFER
  193.     MVI    A,0        ; Initialiseer checksum 
  194.     STA    CHKSUM
  195.         
  196. REP8:    MOV    A,M
  197.     ORI    80H        ; Zet achtste bit
  198.     MOV    M,A        
  199.  
  200.     LDA    CHKSUM        ; Werk checksum bij
  201.     XRA    M
  202.     STA    CHKSUM
  203.  
  204.     MOV    A,M        ; Zijn we all bij laatste
  205.     INX    H        ;  byte (=ETX)?
  206.     CPI    80H+ETX
  207.     JNZ    REP8    
  208.  
  209.     LDA    CHKSUM
  210.     MOV    M,A
  211.  
  212. ; - - - - - VERDELING IN BLOKKEN - - - - - - - - - - - - 
  213. ;
  214. ;   Ten behoeve van wegschrijven van buffers volgt
  215. ;    een seconde blank na elke 16 regels. Om dit te markeren
  216. ;    wordt elke 16e 'CR' in een 0 veranderd. 
  217. ;    De buffer wordt afgesloten met 2 nullen.
  218. ;  
  219.     LXI    H,BUFFER-1
  220.     MVI    B,16        ; Teller voor CR's
  221.         
  222. REP1:    INX    H
  223.     MOV    A,M    
  224.     CPI    80H+ETX        ; Einde buffer?
  225.     JZ    OUT2    
  226.     CPI    CR        ; CR?
  227.     JNZ    REP1
  228.     
  229.     DCR    B        ; Tel de CR's
  230.     JNZ    REP1
  231.  
  232.     MVI    M,0        ; Verander 16e CR in 0
  233.     MVI    B,16
  234.     JMP    REP1
  235.  
  236. ; - - - - -  SCHRIJF 2 AFSLUITENDE NULLEN - - - - - - - - -
  237.  
  238. OUT2:    INX    H        ; Sla checksum over
  239.     INX    H
  240.     MVI    M,0
  241.     INX    H
  242.     MVI    M,0
  243.  
  244. ;--------------- SCHRIJVEN NAAR CASSETTE ----------------
  245.  
  246. ; - - - - - WACHT OP KEYBOARD - - - - - - - - - - - 
  247.  
  248.     CALL    PRINT
  249.     DB    'START CASSETTE EN GEEF RETURN',CR,LF,0 
  250.     MVI    C,1
  251.     CALL    BDOS
  252.  
  253.  
  254. ; - - - - - DISABLE INTERRUPTS - - - - - - - - - - - 
  255. ;
  256. ;     DIT IS MISSCHIEN NIET VOOR ELK SYSTEEM VAN BELANG
  257.  
  258.  
  259.     DI
  260.     
  261.     IF    OSBRN    
  262.     CALL    BANK2
  263.     ENDIF
  264.  
  265. ; - - - - - HEADER - - - - - - - - - - - - -
  266.  
  267.     CALL    BEEP         ;   piepen.
  268.  
  269. ; - - - - - WEGSCHRIJVEN VAN DE TEKST - - - - - - -
  270. ;
  271. ; Voor het wegschrijven ziet de file er als volgt uit:
  272. ; - telkens 15 regels gevolgd door CR
  273. ; _ elke 16e regel gevolgd door ASCII 0
  274. ; - na het laatste blok van 16 regels (of minder) :
  275. ;     ETX en checksum
  276. ;
  277.  
  278.     LXI    H,BUFFER
  279.  
  280. REP5:    MOV    D,M
  281.     MOV    A,D
  282.     STA    SCREEN        ; Zet teken ook op video
  283.     ANA    A        ; clear carry (carry=startbit)
  284. ;
  285.     MVI    E,11        ; # bits (inclusief start/stop)
  286. REP6:    CNC    SE1200        ; Zend 0-bit
  287.     CC    SE2400        ;   of 1-bit
  288.     
  289.     STC            ; Wordt stopbit
  290.  
  291.     MOV    A,D        ; Rotate D
  292.     RAR
  293.     MOV    D,A
  294.  
  295.     DCR    E
  296.     JNZ    REP6        ; Zo 11 keer
  297.  
  298.     INX    H    ; Inspecteer volgende byte
  299.     MOV    A,M    
  300.     ANA    A    ; Als het ASCII 0 is,
  301.     CZ    PAUSE    ;  pauzeer dan 1 sec
  302.     JNZ    REP5    ; PAUSE zet Z vlag bij einde.
  303.  
  304. ; - - - - - TRAILER - - - - - - - - - - - - - -
  305.  
  306.  
  307.     CALL    BEEP         ;   piepen.
  308.  
  309. ;- - - - - - - - KLAAR BOODSCHAP - - - - - - - - 
  310.  
  311.     IF    OSBRN
  312.     CALL    BANK1        ; Anders komen we in de monitor!
  313.     ENDIF
  314.     EI
  315.     CALL    PRINT
  316.     DB    'KLAAR',0
  317.     JMP    0
  318.  
  319. ;**************************************************
  320. ;
  321. ;     subroutine gebied
  322. ;
  323. ;**************************************************
  324.  
  325. ;--------------  SWITCH NAAR BANK 2 -------------
  326. ;    
  327. ;  Zie OSBORNE User Guide 262 ( REV.12/15/82)
  328. ;  interrupts zijn al disabled!
  329. ;  En moeten dat blijven !
  330.                  
  331.     IF    OSBRN
  332. BANK2:    OUT    0
  333.     MVI    A,0
  334.     STA    0EF08H    
  335.     RET
  336.  
  337. ; -------------  SWITCH NAAR BANK 1 -------------  
  338. ;
  339. ;  Zie BANK2
  340.  
  341. BANK1:    OUT    1
  342.     MVI    A,1
  343.     STA    0EF08H    
  344.     RET
  345.     ENDIF
  346.  
  347. ;-------------- PAUSE --------------------------
  348. ;
  349. ; Er staat een ASSCII nul in de buffer
  350. ; D.w.z. er moet nu 1 sec pauze komen.
  351. ; Geeft terug Z, Z betekent: einde van buffer
  352. ; Dit ziet PAUSE aan de 2e nul.
  353.  
  354. PAUSE:    INX    H    ; 2e nul erachter?
  355.     MOV    A,M
  356.     ANA    A
  357.     DCX    H    ; Zet HL terug
  358.  
  359.     RZ        ; Geef terug Z=einde
  360.  
  361.     LXI    D,1200    ; 1 sec 
  362.     CALL    BEEPV    ;   piepen
  363.     MVI    A,CR    ; Overschrijf de 0 die
  364.     MOV    M,A    ;   nu niet meer nodig is.
  365.     ANA    A    ; Strijk de Z vlag
  366.     RET    
  367.  
  368.  
  369. ; ------------- PIEPEN -------------------------
  370. ;
  371. ;    BEEP geeft de normale 5 sec. piep.
  372. ;    Voor BEEPV wordt het aantal perioden van de
  373. ;    2400 Hz piep opgegeven in het DE register.
  374.  
  375.     IF    NOT DEBUG
  376. BEEP:    LXI    D,6000
  377.     ENDIF
  378.  
  379.     IF    DEBUG        ; Bij debuggen :
  380. BEEP:    LXI    D,24000        ;   piep 20 sec  
  381.     ENDIF
  382.  
  383. BEEPV:    CALL    SE2400        ; 2400 HZ Puls
  384.     DCX    D
  385.     MOV    A,D
  386.     ORA    E
  387.     JNZ    BEEPV
  388.     RET    
  389.  
  390. ; ------------- 1200 HZ GOLF --------------------- 
  391. ;
  392. ;    1200 Hz gedurende 1/1200 sec. ( Behoudt DE en HL)
  393. ;    Zendt een 0-bit     
  394.  
  395. SE1200:    MVI    A,0
  396.     MVI    B,DEL12        ; Delay tijd behorende
  397.     CALL    HLFPER        ;  bij 1200 Hz
  398.     MVI    B,DEL12
  399.     JP    HLFPER        
  400.  
  401. ; ------------- 2400 HZ GOLF --------------------- 
  402. ;
  403. ;    2400 Hz gedurende 1/1200 sec. ( Behoudt DE en HL)
  404. ;    Zendt een 1-bit     
  405.  
  406. SE2400: MVI    A,0
  407.     MVI    B,DEL24        ; Dela∙ tijΣ behorendσ 
  408.     CALL    HLFPER        ;  bij 2400 Hz
  409.     MVI    B,DEL24
  410.     CALL    HLFPER
  411.     MVI    B,DEL24
  412.     CALL    HLFPER
  413.     MVI    B,DEL24
  414.     CALL    HLFPER
  415.     RET
  416.  
  417. ; -----------  SCHRIJF EEN HALVE PERIODE ---------------
  418. ;
  419. ;    De duur van de halve periode in reg B
  420. ;    De delay tijd is 32+14*(B-1))*T
  421. ;    waarbij T de cyclus tijd is (OSBORNE: .25 us)
  422.  
  423.     IF     MEMMAP
  424. HLFPER:    STA    PAPORT        ;  naar memory mapped poort
  425.     ENDIF
  426.  
  427.     IF     NOT MEMMAP
  428. HLFPER:    OUT    PAPORT        ;  naar output poort
  429.     ENDIF
  430.  
  431. DELAY:    DCR    B        ;  delay
  432.     JNZ    DELAY
  433.     XRI    0FH        ; KLAP OM
  434.     RET
  435.  
  436. ; --------- INVOEGEN VAN CARRIAGE RETURNS -------------- 
  437. ;
  438. ;    Per ingelezen sector worden 2 CR ingevoegd 
  439. ;    Alleen FIG FORTH!!
  440.  
  441.     IF    FIG
  442. INSCR:    LHLD    CURDMA        
  443.     MOV    D,H
  444.     MOV    E,L
  445.     DCX    D        ; Wijst nu naar laatste char
  446.     INX    H    
  447.     INX    H
  448.     CALL    ONELIN
  449.     CALL    ONELIN
  450.     RETURN
  451.  
  452. ONELIN:    MVI    M,CR        ; CR invoeren    
  453.     DCX    H
  454.  
  455.     MOV    B,40H        ; Copieer 64 char
  456. REP9:    LDAX    D        ;  van D
  457.     MOV    M,A        ;  naar H
  458.     DCX    H
  459.     DCX    D
  460.     DCR    B
  461.     JNZ    REP9
  462.     RET
  463.     ENDIF
  464.  
  465. ; --------- VERWIJDER CHARACTER ------------------- 
  466.  
  467. REMOVE:    LXI    D,BUFFER
  468.     LXI    H,BUFFER
  469.  
  470. REP7:    LDAX    D        ; Copieer van D
  471.     MOV    M,A        ;   naar H
  472.     CMP    C        ; Overschrijf straks
  473.     JZ    END1        ;  indien het een fout character was
  474.     INX    H
  475. END1:    INX    D
  476.     CPI    ETX
  477.     JNZ    REP7
  478.  
  479.     LDAX    D        ; Copieer checksum
  480.     MOV    M,A
  481.  
  482.     RET
  483.  
  484. ; --------- PRINT AN INLINE STRING -------------------
  485.  
  486. PRINT    POP    H    ; Haal return address op
  487.     MOV    A,M    ; Haal karakter op
  488.     INX    H
  489.     PUSH    H    
  490.  
  491.     ORA    A    ; Tot ASCII 0
  492.     RZ        ; Return adres wijst nu na
  493. ;            ;  de char's! 
  494.  
  495.     CALL    CRT    ; Naar het scherm
  496.     JMP    PRINT
  497.  
  498.  
  499. ;=================================================
  500. ;
  501. ;            INTERFACING WITH CP/M
  502. ;            ---------------------
  503. ;
  504. ;=================================================
  505.  
  506. ; ---------------  FUNKTIE SCAN FOR CHAR ---------------
  507. ; Z betekent toets ingedrukt
  508. ;
  509. KEYBRD:
  510.     IF    OSBRN
  511.     CALL    BANK1
  512.     ENDIF
  513.     PUSH    H
  514.     PUSH    B
  515.     MVI    C,0BH    
  516.     CALL    BDOS
  517.     POP    B
  518.     POP    H
  519.     IF    OSBRN
  520.     CALL    BANK2
  521.     ENDIF
  522.     XRA    A    ; zet 'Z' flag naargelang 'A'
  523.     RET    
  524.  
  525. ; -------------  FUNKTIE PRINT A CHAR ------------------
  526.    
  527. CRT    MOV    E,A    ; Outputs 'A' in ASCII
  528.     MVI    C,2    
  529.     CALL    BDOS    
  530.     RET
  531.  
  532.  
  533.  
  534. ; -----------  FUNKTIE OPEN FILE ------------------------ 
  535. ;
  536. ;    Opent de file met naam op FCB voor lezen
  537. ;
  538. OPEN:    MVI    C,15
  539.     LXI    D,FCB
  540.     CALL    BDOS
  541.     CPI    0FFH
  542.     JZ    ERROR1
  543.     RET
  544.  
  545. ERROR1:    CALL    PRINT
  546.     DB    ' NIET AANWEZIG',0
  547.     JP    0
  548.  
  549. ; -----------  FUNKTIE SLUIT FILE  --------------------
  550. ;
  551. ;    Sluit het lezen af
  552. ;
  553. CLOSE:    MVI    C,16
  554.     LXI    D,FCB
  555.     CALL    BDOS
  556.     RET
  557.  
  558. ; -----------  FUNKTIE LEES RECORD  -------------------
  559. ;
  560. ;    Lees het volgende record 
  561. ;
  562. READ:    MVI    C,20
  563.     LXI    D,FCB
  564.     CALL    BDOS
  565.     RET
  566.  
  567. ; -----------  FUNKTIE ZET HET DMA ADRES ---------------
  568. ;
  569. ;    Vul het DMA adres in 
  570. ;
  571. SETDMA:    MVI    C,26
  572.     CALL    BDOS
  573.     RET
  574.  
  575.  
  576. ;**************************************************
  577. ;
  578. ;     BUFFER GEBIED
  579. ;     =============
  580. ;
  581. ;**************************************************
  582.  
  583. CHKSUM    DB    0    ; Checksum (berekend)
  584. STATUS    DB    0    ; Status na lezen
  585. CURDMA    DW    0    ; Huidige DMA adres
  586.  
  587. BUFFER:    DS    5000H
  588.