home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpmug / cpmug014.ark / LIST32.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  4KB  |  266 lines

  1. ;
  2. ;    LIST FUNCTION FOR MITS BASIC DSAVE FILE
  3. ;        BASIC 3.2 VERSION
  4. ;        RLR REV 0.1 4/21/77
  5. ;
  6.     ORG    100H
  7.     JMP    START
  8.     EXT    FNAME,XOPN,XNEW,GCHAR,PUTC,PRNT,XCLOS
  9.     EXT    BINDF,NEGHL
  10.     ROG
  11. SFCB    EQU    5CH
  12. CR    EQU    13
  13. SPC    EQU    20H
  14. XFCBL    EQU    164
  15.     DS    32
  16. STAK:    DS    0
  17. EOLV:    DS    2
  18. NUMBUF    DS    10
  19. LIN1:    DB    0    ;STATE OF ADR PTRS
  20. LINADR:    DW    0    ;START OF NEXT LINE
  21. LINCNT:    DB    0    ;COUNT OF LINE
  22. BXFCB    DS    XFCBL    ;BASIC SOURCE OUTPUT
  23. IXFCB    DS    XFCBL    ;BASIC INT. INPUT
  24. CFCB    DB    255,2    ;CONSOLE OUTPUT
  25. ;
  26. ;
  27. START:    LXI    SP,STAK
  28.     LXI    D,IXFCB
  29.     LXI    H,SFCB
  30.     MVI    A,'I'
  31.     LXI    B,'NT'
  32.     CALL    FNAME
  33.     LXI    D,IXFCB
  34.     CALL    XOPN    ; OPEN(<NAME>.INT)
  35. ;
  36.     LXI    D,BXFCB
  37.     LXI    H,SFCB
  38.     MVI    A,'B'
  39.     LXI    B,'AS'
  40.     CALL    FNAME
  41.     LXI    D,BXFCB
  42.     CALL    XNEW    ;NEW(<NAME>.BAS)
  43. ;
  44.     XRA    A
  45.     STA    LIN1    ;STATE:=LINE 1
  46. ;
  47. NXTLIN:    CALL    GETCI
  48.     MOV    L,A
  49.     CALL    GETCI
  50.     MOV    H,A
  51.     SHLD    EOLV    ; END OF LINE ADDR VALUE
  52. ;
  53.     LHLD    LINADR
  54.     LXI    B,4
  55.     DAD    B
  56.     SHLD    LINADR    ; SKIP PTR(2), LINE NUM(2)
  57. ;
  58. ;    OUTPUT LINE NUMBER
  59. ;
  60. LINUM:    LHLD    EOLV
  61.     MOV    A,H
  62.     ORA    L
  63.     JZ    GDEND    ; 0=GOOD END
  64. ;
  65.     CALL    GETCI
  66.     MOV    C,A
  67.     CALL    GETCI
  68.     MOV    B,A
  69.     LXI    H,NUMBUF
  70.     CALL    BINDF
  71.     MVI    M,SPC    ; SEPARATE # FROM TEXT
  72.     INX    H
  73.     MVI    M,0    ; TERMINATE STRING
  74.     LXI    H,NUMBUF
  75.     CALL    PUTLB    ; DO IT
  76. ;
  77. ;    DO A CHAR OF INT. CODE
  78. NXTCHR:    CALL    GETCI
  79.     ORA    A
  80.     JM    WORD
  81.     JZ    EOLIN
  82. ;
  83. ;    NORMAL CHAR / OUTPUT
  84.     CALL    PUTCB
  85.     JMP    FINCHR
  86. ;            FIND WORD / OUTPUT
  87. WORD:    ANI    7FH
  88.     MOV    C,A
  89.     MVI    B,0
  90.     LXI    H,TADR
  91.     DAD    B
  92.     DAD    B    ; HL^=A(WORD)
  93.     MOV    E,M
  94.     INX    H
  95.     MOV    D,M
  96.     XCHG        ; HL=WORD
  97.     CALL    PUTLB    ; PRINT IT (TERMINATED BY NUL)
  98. ;
  99. FINCHR:    LHLD    LINADR
  100.     INX    H
  101.     SHLD    LINADR
  102.     JMP    NXTCHR
  103. ;
  104. ;    END OF LINE
  105. ;
  106. EOLIN:    CALL    PUTCR    ; CR/LF AT END
  107.     LDA    LIN1
  108.     ORA    A
  109.     LXI    D,0
  110.     LHLD    EOLV
  111.     JZ    EOLN1    ;    IF LINE>1 THEN TEST END
  112.     XCHG
  113.     LHLD    LINADR
  114.     INX    H
  115.     CALL    NEGHL
  116.     DAD    D
  117.     XCHG        ; DE=EOLV-(LINADR+1) (SHOULD =0)
  118. ;
  119. EOLN1:    SHLD    LINADR    ; POINT TO NEXT LINE (EOLV)
  120.     MVI    A,1
  121.     STA    LIN1    ; STATE:=LINE N
  122. ;
  123.     MOV    A,D
  124.     ORA    E
  125.     JZ    NXTLIN    ; IF EOLV=LINADR+1 THEN OK
  126. ;
  127. ;    BAD ENDING
  128. ;
  129. BADEND:    CALL    PUTCR    ; TERMATE WHAT'S THERE
  130.     LXI    H,BADM
  131.     JMP    THEND
  132. ;
  133. GDEND:    LXI    H,GODM
  134. ;
  135. THEND:    LXI    D,CFCB
  136.     CALL    PRNT
  137. ;
  138.     LXI    D,BXFCB
  139.     CALL    XCLOS        ; CLOSE(LIST FILE)
  140.     JMP    0    ; DONE - GO BYEBYE
  141. ;
  142. ;    UTILITIES
  143. ;
  144. ;        RETURNS CHAR =A
  145. GETCI:    PUSH    D
  146.     LXI    D,IXFCB
  147.     CALL    GCHAR
  148.     POP    D
  149.     RNZ
  150.     POP    H
  151.     JMP    BADEND        ; END OF FILE (FOR REAL)
  152. ;
  153. ;        OUTPUT CHAR FROM A
  154. PUTCB:    PUSH    D
  155.     PUSH    B
  156.     MOV    C,A
  157.     LXI    D,BXFCB
  158.     CALL    PUTC
  159.     POP    B
  160.     POP    D
  161.     RET
  162. ;
  163. ;    PUT A LINE OUT 
  164. ;
  165. PUTCR:    LXI    H,CRLIN    ; CR/LF ONLY
  166. ;
  167. PUTLB:    LXI    D,BXFCB
  168.     JMP    PRNT
  169. ;
  170. CRLIN:    DB    CR
  171. BADM:    DB    ' BAD ENDING',CR
  172. GODM:    DB    ' LIST DONE',CR
  173. ;
  174. ;    WORD ADDRESS TABLE
  175. ;
  176. TADR:    DW    W00,W01,W02,W03,W04,W05,W06,W07
  177.     DW    W08,W09,W0A,W0B,W0C,W0D,W0E,W0F
  178.     DW    W10,W11,W12,W13,W14,W15,W16,W17
  179.     DW    W18,W19,W1A,W1B,W1C,W1D,W1E,W1F
  180.     DW    W20,W21,W22,W23,W24,W25,W26,W27
  181.     DW    W28,W29,W2A,W2B,W2C,W2D,W2E,W2F
  182.     DW    W30,W31,W32,W33,W34,W35,W36,W37
  183.     DW    W38,W39,W3A,W3B,W3C,W3D,W3E,W3F
  184.     DW    W40,W41,W42,W43,W44,W45
  185. ;
  186. ;    WORD    TABLE
  187. ;
  188. W00:    DB    'END',0
  189. W01:    DB    'FOR',0
  190. W02:    DB    'NEXT',0
  191. W03:    DB    'DATA',0
  192. W04:    DB    'INPUT',0
  193. W05:    DB    'DIM',0
  194. W06:    DB    'READ',0
  195. W07:    DB    'LET',0
  196. ;
  197. W08:    DB    'GOTO',0
  198. W09:    DB    'RUN',0
  199. W0A:    DB    'IF',0
  200. W0B:    DB    'RESTORE',0
  201. W0C:    DB    'GOSUB',0
  202. W0D:    DB    'RETURN',0
  203. W0E:    DB    'REM',0
  204. W0F:    DB    'STOP',0
  205. ;
  206. W10:    DB    'OUT',0
  207. W11:    DB    'ON',0
  208. W12:    DB    'NULL',0
  209. W13:    DB    'WAIT',0
  210. W14:    DB    'DEF',0
  211. W15:    DB    'POKE',0
  212. W16:    DB    'PRINT',0
  213. W17:    DB    'CONT',0
  214. ;
  215. W18:    DB    'LIST',0
  216. W19:    DB    'CLEAR',0
  217. W1A:    DB    'DLOAD',0
  218. W1B:    DB    'DSAVE',0
  219. W1C:    DB    'NEW',0
  220. W1D:    DB    'TAB',0
  221. W1E:    DB    'TO',0
  222. W1F:    DB    'FN',0
  223. ;
  224. W20:    DB    'SPC',0
  225. W21:    DB    'THEN',0
  226. W22:    DB    'NOT',0
  227. W23:    DB    'STEP',0
  228. W24:    DB    '+',0
  229. W25:    DB    '-',0
  230. W26:    DB    '*',0
  231. W27:    DB    '/',0
  232. ;
  233. W28:    DB    '^',0
  234. W29:    DB    'AND',0
  235. W2A:    DB    'OR',0
  236. W2B:    DB    '>',0
  237. W2C:    DB    '=',0
  238. W2D:    DB    '<',0
  239. W2E:    DB    'SGN',0
  240. W2F:    DB    'INT',0
  241. ;
  242. W30:    DB    'ABS',0
  243. W31:    DB    'USR',0
  244. W32:    DB    'FRE',0
  245. W33:    DB    'INP',0
  246. W34:    DB    'POS',0
  247. W35:    DB    'SQR',0
  248. W36:    DB    'RND',0
  249. W37:    DB    'LOG',0
  250. ;
  251. W38:    DB    'EXP',0
  252. W39:    DB    'COS',0
  253. W3A:    DB    'SIN',0
  254. W3B:    DB    'TAN',0
  255. W3C:    DB    'ATN',0
  256. W3D:    DB    'PEEK',0
  257. W3E:    DB    'LEN',0
  258. W3F:    DB    'STR$',0
  259. ;
  260. W40:    DB    'VAL',0
  261. W41:    DB    'ASC',0
  262. W42:    DB    'CHR$',0
  263. W43:    DB    'LEFT$',0
  264. W44:    DB    'RIGHT$',0
  265. W45:    DB    'MID$',0
  266.