home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol042 / pcc2000b.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  7.3 KB  |  349 lines

  1. ;*****************************************************************************
  2. ;    MICRO RESOURCES PCC2000 CP/M FORMAT CONVERTER FOR 3812
  3. ;*****************************************************************************
  4. ;
  5. ;
  6. ;    
  7. ;    THIS PROGRAM IS DESIGNED TO RUN WITH A 24K CP/M SYSTEM
  8. ;    ON AN ICOM 3812 UTILIZING LIFEBOAT DOUBLE DENSITY
  9. ;    CP/M 1.4. THE PROGRAM REQUIRES READ/WRITE RAM AT ADDRESS
  10. ;    06200H TO 063FFH. DO NOT ATTEMPT TO RUN THIS PROGRAM
  11. ;    WHILE SINGLEB IS IN EFFECT BECAUSE THIS IMPLIES A CONFLICT
  12. ;    OF IMPLIED FUNCTIONAL GOALS. NOTE THAT THIS PROGRAM UTILIZES
  13. ;    THE SAME OPERATIONAL PHILOSOPHY AT THE LIFEBOAT SINGLEB
  14. ;    PACKAGE.
  15. ;
  16. ;    COPYRIGHT 1980
  17. ;        MICRO RESOURCES
  18. ;        2468 HANSEN CT.
  19. ;        SIMI VALLEY, CA 93065
  20. ;        (805) 527-7922
  21. ;
  22. ;*****************************************************************************
  23. ;
  24. ;
  25. CR    EQU    0DH        ;CARRAGE RETURN
  26. LF    EQU    0AH        ;LINE FEED
  27. ;
  28. ;
  29. ;
  30.     ORG     0100H        ;WE MUST START HERE TO SATISFY CP/M
  31. ;
  32. ;
  33. ;INIT PRIVATE STACK
  34. ;
  35.     LXI    H,0        ;HL=0
  36.     DAD    SP        ;HL=STACK FROM CP/M
  37.     SHLD    STACK        ;..SAVE IT
  38.     LXI    SP,STACK     ;SP=MY STACK
  39. ;
  40.     LXI    D,MESS1        ;PRINT VERSION MESSAGE
  41.     CALL    PRTMSG
  42. ;
  43.     LXI    D,MESS2        ;PRINT USAGE MESSAGE
  44.     CALL    PRTMSG
  45. ;
  46.     LHLD    WBOOT+1        ;GET ADDRESS OF VECTOR TABLE
  47.     DCX    H        ;ADJUST TO CBOOT BASE
  48.     DCX    H
  49.     DCX    H
  50. ;
  51.     MVI    A,05FH        ;CHECK IF SYSTEM BIGGER THAN 24K
  52.     CMP    H        ;05E00H = BASE OF VECTOR TABLE FOR 24K
  53.     JZ    SYSBIG        ;EXIT IF SYSTEM TOO BIG
  54.     JC    SYSBIG
  55. ;
  56.     PUSH    H        ;SAVE BASE ADDRESS OF VECTOR TABLE
  57.     LXI    D,SETDSK+1
  58.     DAD    D        ;MAKE ADDRESS OF THE SET DISK ROUTINE
  59.     LXI    B,NWSETDSK
  60.     MOV    E,M        ;GET VECTOR TABLE ADDRESS
  61.     MOV    M,C        ;PUT IN ADDR OF OUR ROUTINE
  62.     INX    H
  63.     MOV    D,M
  64.     MOV    M,B
  65.     LXI    H,NWSETDSK
  66.     MOV     A,D        ;CHECK IF ALREADY IN EFFECT
  67.     CMP    H
  68.     JNZ    MOVCODE        ;NOT SO ON WITH PROCESS
  69.     MOV    A,E
  70.     CMP    L
  71.     JNZ    MOVCODE
  72. ;
  73.     POP    H        ;FIX STACK RIGHT
  74.     LXI    D,MESS4        ;GO PRINT ALREADY IN EFFECT MESSAGE
  75.     CALL    PRTMSG
  76.     JMP    EXIT        ;BALE OUT
  77. ;
  78. MOVCODE:            ;ON WITH THE PROCESS
  79.     PUSH    D        ;SAVE SET DISK VECTOR FOR AFTER MOVE
  80.     LXI    H,TRANPR    ;BASE OF TRANSLATE PROGRAM
  81.     LXI    D,START        ;POINT TO START AREA OF THIS LISTING
  82.     LXI    B,01FFH        ;AMOUNT OF CODE TO MOVE
  83. LOOP:
  84.     LDAX    D        ;GET A BYTE
  85.     MOV    M,A        ;PUT ABOVE 24K SYSTEM
  86.     CMP    M        ;CHECK IF IT WENT IN OK
  87.     JNZ    ERROR        ;EXIT IF ERROR
  88.     INX    H
  89.     INX    D
  90.     DCX    B        ;DECREMENT THE BYTE COUNT
  91.     MOV    A,B
  92.     ORA    C
  93.     JNZ    LOOP        ;DONE MOVING CODE YET?
  94. ;
  95.     POP    D        ;GET BACK SET DISK VECTOR
  96. ;
  97.     XCHG            ;GET DISK ROUTINE ENTRY FOR LIFEBOAT PROM
  98.     SHLD    LBSETDSK+1
  99. ;
  100.     POP    H        ;GET BASE ADDRESS OF VECTOR TABLE
  101. ;
  102.     PUSH    H        ;SAVE BASE ADDRESS OF VECTOR
  103.     LXI    D,SETTRK+1
  104.     DAD    D        ;MAKE ADDRESS OF THE SET SECTOR ROUTINE
  105.     LXI    B,NWSETTRK
  106.     MOV    E,M        ;GET VECTOR TABLE ADDRESS
  107.     MOV    M,C        ;PUT IN ADDRESS OF OUR ROUTINE
  108.     INX    H
  109.     MOV    D,M
  110.     MOV    M,B
  111.     XCHG            ;GET TRACK ROUTINE ENTRY FOR LIFEBOAT PROM
  112.     SHLD    LBSETTRK+1
  113. ;
  114.     POP    H        ;GET BASE ADDRESS OF VECTOR TABLE
  115. ;
  116.     LXI    D,SETSEC+1
  117.     DAD    D        ;MAKE ADDRESS OF THE SET SECTOR ROUTINE
  118.     LXI    B,NWSETSEC
  119.     MOV    E,M        ;GET VECTOR TABLE ADDRESS
  120.     MOV    M,C        ;PUT IN ADDRESS OF OUR ROUTINE
  121.     INX    H
  122.     MOV    D,M
  123.     MOV    M,B
  124.     XCHG            ;GET SECTOR ROUTINE ENTRY FOR LIFEBOAT PROM
  125.     SHLD    LBSETSEC+1
  126.     JMP    EXIT
  127. ;
  128. ERROR:
  129.     POP    D
  130.     POP    H        ;FIX UP STACK FOR EXIT
  131.     LXI    D,MESS5        ;PRINT MOVE ERROR MESSAGE
  132.     CALL    PRTMSG
  133.     JMP    EXIT
  134. ;
  135. SYSBIG:
  136.     LXI    D,MESS3        ;PRINT THE BAD SYSTEM SIZE MESSAGE
  137.     CALL     PRTMSG
  138. ;
  139. EXIT:
  140.     LHLD    STACK        ;GET BACK CCP STACK POINTER
  141.     SPHL            ;RESET THE STACK
  142.     RET            ;BACK TO CCP WITHOUT WARM BOOT
  143. ;
  144. MESS1:
  145.     DB    CR,LF,'PCC2000B VER 1.3 FOR USE WITH ICOM 3812 '
  146.     DB    CR,LF,'DOUBLE DENSITY CP/M VERSION 1.4 '
  147.     DB    CR,LF,'COPYRIGHT (C) 1980 MICRO RESOURCES','$'
  148. MESS2:
  149.     DB    CR,LF,LF
  150.     DB    CR,LF,'THIS PROGRAM MAY BE USED WITH A 24K OR SMALLER'
  151.     DB    CR,LF,'CP/M SYSTEM AND REQUIRES READ/WRITE MEMORY FROM'
  152.     DB    CR,LF,'6200H TO 63FFH. DRIVE B: (ONLY) WILL BE SET'
  153.     DB    CR,LF,'FOR PCC-2000 CP/M FORMAT UNTIL COLD BOOT.','$'
  154. MESS3:
  155.     DB    CR,LF,LF
  156.     DB    'SYSTEM IS TOO LARGE - MAX ALLOWED IS 24K - BYE','$'
  157. MESS4:
  158.     DB    CR,LF,LF
  159.     DB    'PCC2000B ALREADY IN EFFECT..COLD BOOT TO EXIT..','$'
  160. MESS5:
  161.     DB    CR,LF,LF
  162.     DB    CR,LF,'MEMORY AT 6200H TO 63FFH SEEMS FAULTY...BYE','$'
  163. ;
  164. ;PRTMSG: PRINTS MSG POINTED TO BY (DE)
  165. ;
  166. ;A '$' IS THE ENDING DELIMITER FOR THE PRINT.
  167. ;NO REGISTERS SAVED.
  168. ;
  169. PRTMSG:
  170.     MVI    C,PRINT        ;GET BDOS FNC
  171.     JMP    BDOS        ;PRINT MESSAGE, RETURN
  172. ;
  173. ;
  174. ;
  175. ;SETUP A STACK AREA
  176. ;
  177.     DS    40        ;STACK AREA
  178. STACK    DS    2        ;STACK POINTER
  179. ;
  180. START    EQU    $+2        ;BASE TO MOVE HEX OF TRAN PROG TO FOR COM FILE
  181. ;
  182. ;
  183. ; BDOS EQUATES (VERSION 2)
  184. ;
  185. WBOOT    EQU    0        ;WARM BOOT ENTRY ADDRESS
  186. PRINT    EQU    9        ;CONSOLE PRINT STRING FUNCTION
  187. SETDSK    EQU    01BH        ;VECTOR OFFSET FOR SET DISK
  188. SETTRK    EQU    01EH        ;VECTOR OFFSET FOR SET TRACK
  189. SETSEC    EQU    021H        ;VECTOR OFFSET FOR SET SECTOR
  190. BDOS    EQU    5
  191. ;
  192. ;
  193. ;
  194. ;TRANSLATE PROGRAM FOR PCC2000 DISK IN B: DRIVE
  195. ;
  196. ;    AT LOAD TIME THE SETDISK,SET TRACK, AND SET SECTOR
  197. ;    BIOS VECTOR TABLE ENTRIES ARE REPLACED WITH ENTRY
  198. ;    POINTS TO THREE NEW ROUTINES THAT OCCUPY MEMORY
  199. ;    SPACE ABOVE A 24K CP/M SYSTEM. ADDRESS SPACE USED
  200. ;    STARTS AT 6200H. WHEN MAKING A .COM FILE OUT OF
  201. ;    THIS MODULE IT IS NECESSARY TO USE DDT TO LOAD THE
  202. ;    HEX FILE VERSION OF PCC2000B. THEN A MOVE COMMAND
  203. ;    OF THE FOLLOWING FORM IS USED TO PUT THE 6200 BASED
  204. ;    CODE BLOCK IN THE POSITION OF THE LABEL "START" ABOVE.
  205. ;    THE COMMAND UNDER DDT WOULD BE:
  206. ;
  207. ;        -M6200,63FF,START
  208. ;            ..WHERE START IS VALUE OF LABEL ABOVE.
  209. ;
  210. ;    SUBSEQUENT EXIT FROM DDT ALLOWS SAVING OF THE .COM VERSION
  211. ;    OF PCC2000B AS FOLLOWS:
  212. ;
  213. ;        A>SAVE 8 PCC2000B.COM
  214. ;
  215. ;
  216.     ORG    06200H        ;BASE OF PATCH PROGRAM
  217. TRANPR:                ;LABEL REFERENCE FOR START OF MOVE TO
  218. ;
  219. ;
  220. ;NEW SET DISK ROUTINE THAT SETS FLAG FOR DRIVE B:SELECT
  221. ;
  222. NWSETDSK:
  223.     PUSH    PSW
  224.     MOV    A,C        ;GET DRIVE CODE
  225.     CPI    01H        ;CHECK FOR DRIVE B:
  226.     JZ    SETFLG        ;GO TO SET FLAG
  227. ;
  228.     XRA    A        ;CLEAR FLAG FOR NON B: DRIVE
  229.     STA    BDRV
  230.     POP    PSW
  231.     JMP    LBSETDSK
  232. SETFLG:
  233.     MVI    A,0FFH        ;SET FLAG FOR B: DRIVE
  234.     STA    BDRV
  235.     POP    PSW
  236. ;
  237. LBSETDSK:
  238.     JMP    $        ;JUMP TO NORMAL VECTOR TABLE ADDRESS
  239.                 ;SET AT PROGRAM LOAD
  240. ;
  241. ;
  242. ;B: DRIVE SET FLAG FOR THE SET DISK ROUTINE
  243. ;
  244. BDRV    DB    0
  245. ;
  246. ;
  247. ;
  248. ;NEW SET TRACK ROUTINE SETS TRACK ON B: +1 FOR PCC2000 FORMAT
  249. ;
  250. ;
  251. NWSETTRK:
  252.     PUSH    PSW        ;SAVE OFF
  253.     LDA    BDRV        ;CHECK FLAG STATUS
  254.     CPI    00H        ;SEE IF EXIT WITHOUT TRK+1
  255.     JZ    TRKXIT
  256. ;
  257.     MOV    A,C        ;GET TRACK NUMBER
  258.     CPI    076H        ;SEE IF IT IS ALREADY MAX AND LEAVE THERE
  259.     JZ    TRKXIT
  260.     INR    A        ;SET TRK UP ONE
  261.     MOV    C,A        ;SET BACK TO PROPER REG FOR CP/M
  262. ;
  263. TRKXIT:
  264.     POP    PSW
  265. LBSETTRK:
  266.     JMP    $        ;ADDRESS SET TO VECTOR TABLE ENTRY AT INIT
  267. ;
  268. ;
  269. ;NEW SET SECTOR ROUTINE FOR THE PCC2000 DIFFERENT SKEW FACTOR
  270. ;
  271. NWSETSEC:
  272.     PUSH    PSW        ;SAVE OFF
  273.     PUSH    H
  274.     LDA    BDRV        ;CHECK FLAG STATUS
  275.     CPI    00H        ;SEE IF EXIT WITH NO SKEW TRANSLATE
  276.     JZ    SECXIT
  277. ;
  278.     MOV    A,C        ;GET SECTOR NUMBER
  279.     DCR    A        ;FIX SECTOR NUM..THEY START WITH ONE
  280.     LXI    H,TRANTBL    ;GET SKEW TABLE BASE
  281.     ADD    L        ;MAKE TABLE INDEX
  282.     MOV    L,A
  283.     MOV    A,H
  284.     ACI    00H        ;TAKE CARE OF CARRY TO H
  285.     MOV    H,A
  286.     MOV    C,M        ;GET NEW SECTOR NUMBER
  287. ;
  288. SECXIT:
  289.     POP    H        ;RESTORE
  290.     POP    PSW
  291. LBSETSEC:
  292.     JMP    $        ;ADDR TO VECTOR TBL SET AT INIT
  293. ;
  294. TRANTBL:            ;LIFEBOAT TO PCC-2000 SECTOR TRANSLATE
  295.     DB    1
  296.     DB    2
  297.     DB    31
  298.     DB    32
  299.     DB    9
  300.     DB    10
  301.     DB    39
  302.     DB    40
  303.     DB    17
  304.     DB    18
  305.     DB    47
  306.     DB    48
  307.     DB    25
  308.     DB    26
  309.     DB    3
  310.     DB    4
  311.     DB    33
  312.     DB    34
  313.     DB    11
  314.     DB    12
  315.     DB    41
  316.     DB    42
  317.     DB    19
  318.     DB    20
  319.     DB    49
  320.     DB    50
  321.     DB    27
  322.     DB    28
  323.     DB    5
  324.     DB    6
  325.     DB    35
  326.     DB    36
  327.     DB    13
  328.     DB    14
  329.     DB    43
  330.     DB    44
  331.     DB    21
  332.     DB    22
  333.     DB    51
  334.     DB    52
  335.     DB    29
  336.     DB    30
  337.     DB    7
  338.     DB    8
  339.     DB    37
  340.     DB    38
  341.     DB    15
  342.     DB    16
  343.     DB    45
  344.     DB    46
  345.     DB    23
  346.     DB    24
  347. ;
  348.     END
  349.