home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / turbom2 / tm2not10.lbr / CLOCKIO.MZC / CLOCKIO.MAC
Encoding:
Text File  |  1987-02-14  |  4.0 KB  |  280 lines

  1. ;IMPLEMENTATION MODULE ClockIO;
  2. ;
  3. ;PROCEDURE InitClk;
  4. ;
  5. ;PROCEDURE ReadClk( VAR Time : ARRAY OF CHAR;
  6. ;                   VAR Date : ARRAY OF CHAR );
  7. ;
  8. ;PROCEDURE RdClk0( VAR Time : ARRAY OF CHAR;
  9. ;                  VAR Date : ARRAY OF CHAR );
  10. ;
  11. ;PROCEDURE ClkEI;
  12. ;
  13. ;PROCEDURE ClkDI;
  14. ;
  15. ;PROCEDURE ClkClr;
  16. ;
  17. ;PROCEDURE Z80M0;
  18. ;
  19. ;PROCEDURE Z80M1;
  20. ;
  21. ;PROCEDURE Z80EI;
  22. ;
  23. ;PROCEDURE Z80DI;
  24. ;
  25. ;
  26. ; PIO equates:
  27. ;
  28. ;
  29. ORA    EQU    0
  30. DDRA    EQU    ORA
  31. ORB    EQU    2
  32. DDRB    EQU    ORB
  33. CRA    EQU    1
  34. CRB    EQU    3
  35. ;
  36. ;
  37. BDOS    EQU    5
  38. ;
  39. ;
  40. ; 'initclk' is the module body, if you will...
  41. ;
  42. ;
  43. INITCLK::
  44.     LD    HL,0E800h    ; start at slot '8'
  45. SEARCH:    DEC    H        ; slot := slot - 1
  46.     LD    A,H
  47.     AND    0Fh        ; done all slots?
  48.     JR    Z,NOFIND    ; error, no clock
  49. ;
  50.     LD    L,0        ; offset zero
  51.     LD    A,(HL)        ; get a byte
  52.     CP    08
  53.     JR    NZ,SEARCH    ; not it..
  54. ;
  55.     INC    L        ; next byte
  56.     LD    A,(HL)
  57.     CP    78h
  58.     JR    NZ,SEARCH
  59. ;
  60.     LD    L,0FEh
  61.     LD    A,(HL)
  62.     CP    0B2h
  63.     JR    NZ,SEARCH
  64. ;
  65.     INC    L
  66.     LD    A,(HL)
  67.     CP    03        ; in TimeMaster mode?
  68.     JR    Z,GOTIT
  69. ;
  70. NOFIND:    LD    A,(0EFFFh)    ; turn off all expansion ROM
  71.     LD    DE,ERRMSG
  72.     LD    C,09
  73.     CALL    BDOS        ; print error message
  74.     JP    0        ; and warm-boot out!
  75. ;
  76. GOTIT:    LD    A,(0EFFFh)    ; expansion ROM off
  77.     LD    A,H        ; slot page to 'A'
  78.     SLA    A
  79.     SLA     A
  80.     SLA    A
  81.     SLA    A         ; 'En' --> 'n0'
  82.     ADD    80h        ; normal to 80h
  83.     LD    (IOBASE),A    ; set up hardware base address
  84. ;
  85.     LD    IY,(IOBASE)
  86.     XOR    A        ; 'A' := 0
  87.     LD    (IY+CRA),A
  88.     LD    (IY+CRB),A     ; let's talk to PIO DDRA's
  89. ;
  90.     LD    (IY+DDRA),A     ; port 'A' to all input
  91.     LD    A,0FFH
  92.     LD    (IY+DDRB),A     ; port 'B' to all output
  93. ;
  94.     JP    CLKDI1        ; setup PIO's and return..
  95. ;
  96. ;
  97. IOBASE:    DW    0E080h        ; base of hardware I/O area
  98. ;
  99. ;
  100. ERRMSG:    DB    0Dh,0Ah
  101.     DB    'Unable to locate clock, exiting program!'
  102.     DB    0Dh,0Ah,'$'
  103. ;
  104. ;
  105. ;
  106. ;
  107. RDCLK0::
  108.     CALL    COMMON
  109.     CALL    RC0
  110.     JR    OUT        ; leave w/o restarting interrupts
  111. ;
  112. ;
  113. READCLK::
  114.     CALL    COMMON
  115.     CALL    RC0        ; do the read..
  116. ;
  117.     LD    A,2FH
  118.     LD    (IY+ORB),A    ; re-start clock interrupts
  119. ;
  120. OUT:    INC    HL        ; index to clear stack!!
  121.     POP    DE        ; return address to 'DE'
  122.     LD    SP,HL           ; setup new stack
  123.     EX    DE,HL
  124.     JP    (HL)        ; ret
  125. ;
  126. ;
  127. ;
  128. RC0:    LD    DE,6
  129.     ADD    HL,DE        ; point at address of date string
  130.     LD    E,(HL)
  131.     INC    HL
  132.     LD    D,(HL)        ; 'DE' points to date string
  133.     PUSH    HL        ; save stack index
  134. ;
  135.     LD    HL,DATECODES
  136.     LD    B,8
  137.     CALL    READ
  138. ;
  139.     POP    HL        ; get stack index
  140.     LD    DE,3
  141.     ADD    HL,DE        ; index to time string
  142.     LD    E,(HL)
  143.     INC    HL
  144.     LD    D,(HL)
  145.     PUSH    HL
  146. ;
  147.     LD    HL,TIMECODES
  148.     LD    B,5
  149.     CALL    READ
  150. ;
  151.     POP    HL        ; recover stack index
  152.     RET
  153. ;
  154. ;
  155. ;
  156. ;
  157. ;
  158. ;
  159. READ:
  160.     LD    A,(HL)        ; get code
  161.     BIT    7,A        ; is it a puctuation char?
  162.     RES    7,A        ; clear it in case it was
  163.     JR    NZ,PUTCHAR    ; it was..
  164. ;
  165.     LD    (IY+ORB),A    ; set the latch for desired data
  166.     CP    56
  167.     JR    Z,SHORTMSK    ; if it's day of week 'tens' digit
  168.     CP    53
  169.     JR    Z,SHORTMSK    ; or hour 'tens', use alt mask.
  170. ;
  171.     LD    A,0Fh        ; clear hi nibble
  172.     JR    GETTIME
  173. ;
  174. SHORTMSK:
  175.     LD    A,03        ; clear bits 2-7
  176. GETTIME:
  177.     AND    (IY+ORA)    ; read the clock (with mask)
  178.     ADD    30h        ; make it ascii
  179. PUTCHAR:
  180.     LD    (DE),A        ; put char in caller's string
  181. ;
  182.     INC    DE
  183.     INC    HL        ; next byte
  184.     DJNZ    READ
  185. ;
  186.     RET
  187. ;
  188. ;
  189. DATECODES:
  190.     DB    58,57, '/'+80h, 56,55, '/'+80h, 60,59
  191. ;
  192. TIMECODES:
  193.     DB    53,52, ':'+80h, 51,50
  194. ;
  195. ;
  196. ;
  197. ;
  198. CLKEI::
  199.     CALL    COMMON
  200. ;
  201.     LD    A,12
  202.     LD    (IY+CRA),A
  203.     LD    A,4
  204.     LD    (IY+CRB),A     ; interrupt every sec. & set to OR's
  205. ;
  206.     JR    CLKCLR1
  207. ;
  208. ;
  209. ;
  210. ;
  211. ;
  212. CLKDI::
  213.     CALL    COMMON
  214. ;
  215. CLKDI1:
  216.     LD    A,4
  217.     LD    (IY+CRA),A
  218.     LD    (IY+CRB),A     ; disable PIO interrupts, and talk to
  219.                 ; output registers..
  220. ;
  221.     JR    CLKCLR2
  222. ;
  223. ;
  224. ;
  225. CLKCLR::
  226.     CALL    COMMON
  227. ;
  228. CLKCLR1:
  229.     LD    A,2FH
  230.     LD    (IY+ORB),A    ; enable clock interrupt latch
  231. ;
  232. CLKCLR2:
  233.     LD    A,(IY+ORA)
  234.     LD    A,(IY+ORB)    ; clear any existing interrupt
  235. ;
  236.     RET
  237. ;
  238. ;
  239. ;
  240. Z80M0::
  241.     IM    0
  242.     RET
  243. ;
  244. ;
  245. ;
  246. ;
  247. Z80M1::
  248.     IM    1
  249.     RET
  250. ;
  251. ;
  252. ;
  253. ;
  254. Z80EI::
  255.     EI
  256.     RET
  257. ;
  258. ;
  259. ;
  260. ;
  261. Z80DI::
  262.     DI
  263.     RET
  264. ;
  265. ;
  266. ;
  267. COMMON:    LD    HL,0
  268.     ADD    HL,SP        ; get stack pointer in 'HL'
  269. ;
  270.     LD    IY,(IOBASE)    ; 'IY' points at clock-base
  271.     RET
  272. ;
  273. ;
  274. ;
  275. ;
  276. ;
  277. ;
  278.     END
  279.  
  280.