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 / MDGCBIOS.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  7KB  |  378 lines

  1.     .TITLE    /CPM-CBIOS FOR Z80 CPU  MDG 12-26-77/
  2. ;BASIC IO OPERATING SYSTEM (CBIOS) FOR CPM
  3. ;WRITTEN BY M. D. GRAY  12/26/77
  4. ;SUPPORTS:
  5. ;    Z80 CPU
  6. ;    DUAL PERSCI 270 (277 MODIFIED)
  7. ;    AT LEAST 17K OF RAM
  8. ;    2-SIO MITS DUAL SERIAL ADDRESSED AT 0,1,2,3
  9. ;        VDM-3A VIDEO CONSOLE @2,3
  10. ;        SILENT 700 @0,1
  11. ;
  12.     .PABS
  13.     .PHEX
  14.     .XLINK
  15.     .SALL
  16. MSIZE    =\    "INPUT MEMORY SIZE IN K="
  17. DADR    ==    0F8H    ;DISK ADDRESS
  18. DCOM    ==    DADR    ;DISK COMMAND PORT
  19. DSTAT    ==    DADR    ;DISK STATUS PORT
  20. TRACK    ==    DADR+1    ;DISK TRACK REGISTER
  21. SECTP    ==    DADR+2    ;DISK SECTOR REGISTER
  22. DDATA    ==    DADR+3    ;DISK DATA REGISTER
  23. WAIT    ==    DADR+4    ;WAIT FOR DATA-INTERRUPT
  24. ERCNT    ==    10    ;ERROR RETRY COUNT
  25. .LOC    MSIZE*400H-600H    ;CBIOS SPOT
  26. CBASE    ==    (MSIZE-17)*1024    ;BIAS FOR CPM
  27. CPMB    ==    CBASE+2900H    ;START OF CP/M
  28. BDOS    ==    CBASE+3206H    ;START OF BDOS
  29. CPML    ==    .-CPMB        ;LENGTH OF CP/M
  30. NSECTS    ==    CPML/128    ;NUMBER OF SECTORS
  31. ;
  32. ;MACRO DEFINITIONS
  33. ;
  34. .DEFINE    PRINT$[MESLOC]=[
  35.     CALL    MESS
  36.     .WORD    MESLOC]
  37. .DEFINE    WAIT$    =    [
  38.     XTHL
  39.     XTHL]
  40. ;
  41. ;JUMP TABLE
  42. ;
  43.     JMP    BOOT    ;FROM COLD START
  44. WBOOTE:    JMP    WBOOT    ;WARM START
  45.     JMP    CONST    ;CONSOLE STATUS
  46.     JMP    CONIN    ;READ A CHARACTER FROM CONSOLE
  47.     JMP    CONOUT    ;WRITE A CHARACTER TO CONSOLE
  48.     JMP    LIST    ;WRITE A CHAR TO LIST DEVICE
  49.     JMP    PUNCH    ;WRITE A CHAR TO PUNCH DEVICE
  50.     JMP    READER    ;READ A CHAR FROM READER
  51.     JMP    HOME    ;SEEK TRACK 0
  52.     JMP    SELDSK    ;SELECT DISK
  53.     JMP    SETTRK    ;SELECT TRACK
  54.     JMP    SETSEC    ;SET SECTOR (1-26)
  55.     JMP    SETDMA    ;SET START OF 128 BYTE TRANSFER
  56.     JMP    READ    ;READ A SECTOR
  57.     JMP    WRITE    ;WRITE A SECTOR
  58.     JMP    .    ;RESERVED
  59.     JMP    .    ;RESERVED
  60. ;
  61. ;MISC CBIOS VARIABLES
  62. ;
  63. DISKSL:    .BYTE    0    ;DISK SELECTED
  64. DMAADD:    .WORD    CPMB    ;DMA ADDRESS
  65. TESTM:    .BYTE    0    ;TEST MODE
  66. ERRORS:    .BYTE    0,0,0,0    ;ERROR COUNTERS-
  67.             ;CRC,SEEK,-,-
  68. ;
  69. ;STACK SWAP ROUTINE WITH REGISTER SAVE
  70. ;
  71. SSWAP:    XTHL        ;GET RETURN ADDRESS
  72.     SHLD    ..RET    ;AND SAVE IT FOR EXIT
  73.     POP    H    ;RECOVER (HL)
  74.     SSPD    USTACK    ;SAVE USER STACK
  75.     LXI    SP,CBSTAK ;LOAD LOCAL STACK
  76.     PUSH    B    ;SAVE WORKING REGISTERS
  77.     PUSH    D
  78.     PUSH    H
  79.     LXI    H,EXITRT ;SAVE RETURN EXIT IS STACK
  80.     PUSH    H
  81.     JMP    .    ;DUMMY EXIT TO BE STUFFED
  82. ..RET    ==    .-2
  83.  
  84. EXIT:    LXI    SP,CBSTAK-6 ;DIRTY STACK EXIT
  85. EXITRT:    POP    H    ;CLEAN STACK EXIT
  86.     POP    D    ;RESTORE REGISTERS
  87.     POP    B
  88.     ANA    A
  89.     LSPD    USTACK    ;GET ORIG STACK
  90.     RET        ;EXIT CBIOS
  91. ;
  92. ;BOOT - COLD START CP/M LOAD ROUTINE
  93. ;
  94. BOOT:    MVI    A,3    ;RESET AND INITALIZE TI-700
  95.     OUT    0    ;AND VDM
  96.     OUT    2
  97.     MVI    A,9
  98.     OUT    0
  99.     OUT    2
  100.     MVI    A,0FFH
  101.     OUT    0FFH    ;CLEAR TYE DISPLAY LIGHTS
  102.     LXI    SP,80H
  103.     PRINT$    SIGNON    ;SIGN ON MESSAGE
  104.     MVI    A,1    ;DEFINE CONSOLE = CRT
  105.     STA    3    ;CLEAR IOBYTE
  106. ;
  107. ;WARM BOOT
  108. ;
  109. WBOOT:    LXI    SP,80H    ;SET BOOT STACK
  110.     MVI    B,ERRORS-DISKSL
  111.     LXI    H,DISKSL ;ZERO DISK PARAM TABLE
  112. ..L:    MVI    M,0
  113.     INX    H
  114.     DJNZ    ..L
  115.     MVI    A,0F2H
  116.     OUT    WAIT
  117.     CALL    HOME
  118.     MVI    C,2
  119.     CALL    SETSEC    ;LOAD FROM SECTOR 2
  120.     MVI    B,NSECTS ;LOOP UNTIL ALL CP/M SCTRS RD
  121.     LXI    H,CPMB    ;LOAD AT CP/M BASE
  122.     LXI    D,80H    ;SECTOR SIZE
  123. ..LOOP:    SHLD    DMAADD    ;CURRENT LOAD ADDRESS
  124.     DAD    D    ;PREPARE FOR NEXT SECTOR ADR
  125.     CALL    READ    ;READ A SECTOR
  126.     CPI    1    ;SECTOR IN ERROR ?
  127.     CZ    BOOTER    ;GO DO ERROR THING
  128.     INR    C    ;INCREMENT SECTOR COUNT
  129.     MOV    A,C
  130.     CPI    27    ;SEE IF WE NEED A NEW TRACK
  131.     JRC    ..U    ;NO, STILL OK
  132.     MVI    C,1    ;IF NEW TRACK THEN TRK AND SEC=1
  133.     CALL    SETTRK
  134. ..U:    CALL    SETSEC
  135.     DJNZ    ..LOOP    ;LOOP UNTIL ALL READ
  136.     MVI    A,0C3H    ;INIT JMP LOC IN PAGE 0
  137.     STA    0
  138.     LXI    H,WBOOTE
  139.     SHLD    1
  140.     STA    5
  141.     LXI    H,BDOS
  142.     SHLD    6
  143.     LXI    H,80H
  144.     SHLD    DMAADD    ;INIT DMA ADDRESS TO 80H
  145.     MVI    C,0    ;SELECT DRIVE 0 FOR SYSTEM
  146.     JMP    CPMB    ;EXIT AFTER SUCCESSFUL BOOT
  147. ;
  148. ;CHECK CONSOLE STATUS
  149. ;
  150. CONST:    IN    2    ;CONSOLE STATUS
  151.     ANI    1    ;CHECK DATA READY
  152.     MVI    A,255
  153.     RNZ
  154.     CMA
  155.     RET
  156. ;
  157. ;READ A CHARACTER FROM THE CONSOLE
  158. ;
  159. CONIN:    IN    2
  160.     ANI    1
  161.     JRZ    CONIN    ;WAIT FOR CHARACTER
  162.     IN    3
  163.     ANI    7FH
  164.     RET
  165. ;
  166. ;CHARACTER OUT TO CONSOLE
  167. ;
  168. CONOUT:    IN    2
  169.     ANI    2
  170.     JRZ    CONOUT
  171.     MOV    A,C
  172.     OUT    3
  173.     RET
  174. LIST:    MOV    A,C    ;STRIP MSB
  175.     ANI    7FH    ;AND CHECK FOR (CR)
  176.     CPI    13
  177.     JRZ    ..CR    ;GO INSERT NULLS
  178. ..L:    IN    0    ;TEST STATUS
  179.     ANI    2
  180.     JRZ    ..L
  181.     MOV    A,C
  182.     OUT    1
  183.     RET
  184. ..CR:    CALL    ..L    ;OUTPUT THE (CR)
  185.     PUSH    B
  186.     MVI    B,6
  187.     MVI    C,0    ;OUTPUT NULLS
  188. ..L1:    CALL    ..L    ;SIX TIMES
  189.     DJNZ    ..L1
  190.     POP    B
  191.     MOV    A,C
  192.     RET
  193. ;
  194. READER:    CALL    0F006H    ;JUMP TO TDL READER
  195.     JRC    ..EOF    ;CONVERT CARRY TO 1AH
  196.     ANI    7FH
  197.     RET
  198. ..EOF:    MVI    A,1AH
  199.     RET
  200. ;
  201. ;PUNCH DEVICE
  202. ;
  203. PUNCH:    JMP    0F00CH    ;JMP TO TDL MONITOR PUNCH DEVICE
  204. ;
  205. ;HOME - RESTORE TO TRACK 0 WITH HEAD LOADED
  206. ;
  207. HOME:    MVI    A,0EH    ;RESTORE,HDLD,VERIFY
  208.     CALL    EXECC    ;EXECUTE COMMAND
  209.     RET
  210. ;
  211. ;SELDSK - SELECT DISK 0 OR 1 (A OR B) 
  212. ;ALWAYS DONE PRIOR TO SETTRK,SETSEC
  213. ;
  214. SELDSK:    LDA    DISKSL    ;TEST TO SEE IF NOT SELCTED
  215.     CMP    C
  216.     RZ        ;RETURN IF ALREADY SELECTED
  217.     CPI    2    ;CHECK PARAMETERS
  218.     CNC    SELERR
  219.     MOV    A,C
  220.     STA    DISKSL    ;SAVE NEW SELECTED DISK
  221.     IN    TRACK    ;SEEK TO SAME PLACE
  222.     OUT    DDATA    ;BUT UNLOAD HEAD
  223.     MVI    A,12H
  224.     CALL    EXECC
  225.     BIT    0,C    ;TEST DISK SELECTED
  226.     MVI    A,0F2H    ;DISK 0
  227.     JRZ    ..L
  228.     MVI    A,0C2H    ;DISK 1
  229. ..L:    OUT    WAIT
  230.     XRA    A
  231.     RET
  232. ;
  233. ;SETTRK - SELECT TRACK 0 - 76
  234. ;
  235. SETTRK:    MOV    A,C    ;CHECK PARAMETERS
  236.     CPI    77
  237.     CNC    TRKERR    ;RANGE ERROR
  238.     IN    TRACK
  239.     CMP    C    ;IF NO CHANGE TO TRACK - EXIT
  240.     RZ
  241.     MOV    A,C
  242.     OUT    DDATA    ;DO A SEEK WITH VERIFY
  243.     MVI    A,1EH
  244.     CALL    EXECC
  245.     RET
  246. ;
  247. ;SETSEC - SET SECTOR FROM 1-26
  248. ;
  249. SETSEC:    MOV    A,C    ;CHECK PARAMETERS
  250.     CPI    27
  251.     CNC    SECERR
  252.     ANA    A    ;0 NOT ALLOWED
  253.     CZ    SECERR
  254.     OUT    SECTP
  255.     RET
  256. ;
  257. ;SETDMA - SET DMA ADDRESS FROM BC
  258. ;
  259. SETDMA:    SBCD    DMAADD    ;BC TO DMAADD
  260.     RET
  261. ;
  262. ;READ - READ A SECTOR
  263. ;
  264. READ:    CALL    SSWAP    ;SAVE STACK AND REGISTERS
  265.     MVI    B,ERCNT    ;INITIALIZE ERROR COUNT
  266. ..RTRY:    MVI    A,0D0H    ;INTERRUPT TO TEST HDLD
  267.     OUT    DCOM
  268.     WAIT$
  269.     LHLD    DMAADD ;READ BUFFER START
  270.     IN    DSTAT
  271.     ANI    20H    ;CHECK HEAD LOAD
  272.     MVI    A,88H
  273.     JRNZ    ..L
  274.     ORI    4    ;HEAD NEEDS LOADING
  275. ..L:    OUT    DCOM
  276.     WAIT$
  277. ..LOOP:    IN    WAIT
  278.     RLC
  279.     JRNC    ..DONE    ;EXIT IF FINISHED
  280.     IN    DDATA
  281.     MOV    M,A
  282.     INX    H
  283.     JMP    ..LOOP
  284. ..DONE:    IN    DSTAT
  285.     ANI    9DH
  286.     RZ        ;RETURN ON GOOD READ
  287.     CMA
  288.     OUT    0FFH    ;DISPLAY ERROR
  289.     DJNZ    ..RTRY
  290.     PRINT$    RDERR    ;READ ERROR MESSAGE
  291.     MVI    A,1
  292.     RET
  293. ;
  294. ;WRITE - WRITE A SECTOR FROM DMAADD
  295. ;
  296. WRITE:    CALL    SSWAP    ;SAVE STACK,REGS
  297.     MVI    B,ERCNT    ;ERROR RETRY COUNT
  298. ..WTRY:    LHLD    DMAADD
  299.     MVI    A,0D0H    ;INTERRUPT
  300.     OUT    DCOM
  301.     WAIT$
  302.     IN    DSTAT    ;TEST FOR HEAD LOAD
  303.     ANI    20H
  304.     MVI    A,0A8H
  305.     JRNZ    ..L
  306.     ORI    4    ;HEAD NEEDS LOADING
  307. ..L:    OUT    DCOM
  308.     WAIT$
  309. ..LOOP:    IN    WAIT    ;WRITE 128 BYTES
  310.     RLC
  311.     JRNC    ..DONE
  312.     MOV    A,M
  313.     OUT    DDATA
  314.     INX    H
  315.     JMP    ..LOOP
  316. ..DONE:    IN    DSTAT    ;CHECK FOR ERRORS
  317.     ANI    0FDH
  318.     RZ        ;RETURN ON GOOD WRITE
  319.     CMA
  320.     OUT    0FFH
  321.     DJNZ    ..WTRY    ;RETRY ON ERROR
  322.     PRINT$    WERR
  323.     MVI    A,1
  324.     RET
  325.  
  326.  
  327. EXECC:    OUT    DCOM    ;OUTPUT DISK COMMAND
  328.     WAIT$
  329. ..L:    IN    DSTAT
  330.     ANI    1    ;WAIT TILL COMMAND DONE
  331.     JRNZ    ..L
  332.     IN    DSTAT    ;CHECK FOR ERRORS
  333.     ANI    10011000B
  334.     RZ
  335.     CMA
  336.     OUT    0FFH
  337.     PRINT$    COMERR
  338.     HLT
  339. ;
  340. ;MESS - PRINT MESSAGE AT LOC FOLLOWING CALL
  341. ;    UNTIL BIT 7 IS TRUE
  342. ;
  343. MESS:    XTHL        ;GET PARAMETER IN (DE)
  344.     MOV    E,M
  345.     INX    H
  346.     MOV    D,M
  347.     INX    H
  348.     XTHL
  349.     XCHG        ;ADDRESS OF MESSAGE IS IN HL
  350. ..L:    MOV    C,M
  351.     CALL    CONOUT
  352.     BIT    7,C
  353.     RNZ
  354.     INX    H
  355.     JMPR    ..L
  356.  
  357.  
  358. ;DATA TABLES
  359. ;
  360. BOOTER:
  361. SELERR:
  362. TRKERR:
  363. SECERR:
  364.     PRINT$    G1ERR
  365.     HLT
  366. G1ERR:    .ASCIS    [13][10]/PARAMETER ERROR/
  367. RDERR:    .ASCIS    [13][10]/READ ERROR/
  368. WERR:    .ASCIS    [13][10]/WRITE ERROR/
  369. COMERR:    .ASCIS    [13][10]/COMMAND ERROR/
  370. SIGNON:    .ASCII    [1AH][13][10]/Z-80 CBIOS/
  371.     .ASCII    [13][10]/WRITTEN BY M. D. GRAY 12-28-77/
  372.     .ASCIS    [13][10]/REVISION 1.00/[13][10]
  373.  
  374.     .BLKB    32
  375. CBSTAK:    .BLKB    4
  376. USTACK:    .BLKB    2
  377.     .END
  378.