Classic Computer Magazine Archive PROGRAM LISTING: 84-06/SCROLL3.ASM


; ASSEMBLY LANGUAGE LISTING
; BY CHRIS CHABRIS
; ANTIC MAGAZINE


       ORG  $6000 
;These subroutines are all relocatable
;Routines to scroll display, callable
;from BASIC as follows:
;   Q=USR(ADR(SCRP$),OFS) or
;   Q=USR(ADR(SCRN$),-OFS)
;Where: OFS is the offset value

OFS    EQU  $00CB   ;Storage of offset
                    ;to scroll display
DL4    EQU  $0604   ;Fourth byte of
                    ;display list
                    ;(address lobyte)


SCRP   PLA          ;This scrolls with
                    ;a positive offset
                    ;value
       PLA
       PLA
       STA  OFS     ;Keep offset for
                    ;later use
       LDX  #00     ;In BASIC,
                    ;"FOR L=0..."
                    ;initialize index
LOOP1  LDA  DL4,X   ;Get lobyte of
                    ;LMS address
       CLC
       ADC  OFS     ;Add the offset
       STA  DL4,X   ;And replace with
                    ;the new value
       BCC  CONT1   ;If no carry,
                    ;continue on
       INC  DL4+1,X ;Carry set, so
                    ;increment hibyte
CONT1  INX
       INX
       INX          ;Add three to the
                    ;index register
       CPX  #36     ;If X=36, we have
                    ;completed all
                    ;12 lines
       BNE  LOOP1   ;If not, go back
                    ;& do the next one
       RTS          ;If so, return to
                    ;BASIC
SCRN   PLA          ;This (almost
                    ;identical) is for
                    ;negative OFS
       PLA
       PLA
       STA  OFS
       LDX  #00
LOOP2  LDA  DL4,X
       SEC          ;These two lines
                    ;are different to
                    ;allow sub-
       SBC  OFS     ;traction of OFS
       STA  DL4,X
       BCS  CONT2   ;Same for this and
                    ;following line
       DEC  DL4+1,X
CONT2  INX
        INX
       INX
       CPX  #36
       BNE  LOOP2
       RTS


; Routine to load or save data
; callable from BASIC as follows:
; Q=USR(ADR(DF$),IOCB,CMD,ADDRESS,NUM)
; Where: IOCB is the Input/Output 
; channel being used
;  CMD is 7 for READ or 11 for WRITE
;  ADDR is the address to take data 
;       from or move data to
;  NUM is number of bytes to transfer

CIOV   EQU  $E456   ;Central Input/
                    ;Output vector
ICCOM  EQU  $0342   ;IOCB #0:
                    ; command byte
ICSTA  EQU  $0343   ; status byte
ICBAL  EQU  $0344   ; buffer address
                    ;    (lo-hi)
ICBLL  EQU  $0348   ; buffer length
                    ;    (lo-hi)
USRARG EQU  $00D4   ;Address of USR
                    ;function return
                    ;argument


DF     PLA          ;Number of
                    ;parameters passed
                    ;by BASIC
       CMP  #04     ;Is it four as it
                    ;should be?
       BNE  ERROR   ;If No return with
                    ;variable Q=22
       PLA          ;Hibyte of IOCB
                    ;number - discard
       PLA          ;Lobyte of same
       ASL  A       ;Multiply it by 16
                    ;for ease of use
       ASL  A
       ASL  A
       ASL  A
       TAX          ;Save it for later
                    ;use in X-register
       PLA          ;Hibyte of
                    ;command - discard
       PLA          ;Lobyte of command
       STA  ICCOM,X ;Put it in com-
                    ;mand byte of
                    ;IOCB #X/16
       PLA          ;This is hibyte
                    ;of the buffer
                    ;address
       STA  ICBAL+1,X  ;Into the IOCB
                       ;you go!
       PLA          ;Lobyte of buffer
                    ;address
       STA  ICBAL,X ;goes in also
       PLA          ;Hibyte of buffer
                    ;length
       STA  ICBLL+1,X
       PLA             ;and lobyte of
                       ;same go
        STA  ICBLL,X   ;into proper
                       ;IOCB,
EXEC   JSR  CIOV    ;Now CIO will
                    ;perform the I/O
CHECK  TYA          ;Get completion
                    ;status from
                    ;Y-register
       STA  USRARG  ;And pass it back
                    ;to BASIC
       LDA  #00
       STA  USRARG+1  ;Zero-out hibyte
                      ;just in case
       RTS          ;Return to BASIC,
                    ;Q=Error number
ERROR  TAX          ;Save incorrect
                    ;# of arguments
                    ;passed
LOOP3  PLA          ;and pull them off
                    ;the stack one by
                    ;one
       PLA
       DEX
       BNE  LOOP3   ;Go do next one
                    ;if any left
       LDA  #22     ;ERROR- 22
                    ;indicates
                    ;incorrect # of
                    ;args.
       STA  USRARG  ;Let BASIC know
                    ;about it
       LDA  #00
       STA  USRARG+1  ;Make sure the
                      ;error number
                      ;is <256!
       RTS          ;BASIC regains
                    ;control,
                    ;unsatisfied


          END
 

Back to previous page