Tutorial (II): Programando el SubSistema gráfico del FM-7

jltursan
Mensajes: 5619
Registrado: 20 Sep 2011 13:59
Ubicación: Madrid
Agradecido : 990 veces
Agradecimiento recibido: 2040 veces
Contactar:

Tutorial (II): Programando el SubSistema gráfico del FM-7

Mensajepor jltursan » 20 May 2017 15:19

7. Programa de ejemplo en Ensamblador

Este es otro ejemplo de programación, en ensamblador en este caso, que contiene unas rutinas para la impresión de caracteres extra-grandes en pantalla:

Código: Seleccionar todo

rmb 1
; ----------------------------------------------------------

INITIALIZE:
      leax   CMD_COPY-*-3,pc
      leau   BASE_ADDR+1-*-3,pc
      leay   SUBCPU_CODE-*-3,pc
      ldd   #$C000      ; SubSystem RAM   address   to copy   to
      std   2,u
      ldd   #$37B      ; Number of bytes to copy

copy_subcode_loop:         
      pshs   a,b
      lda   ,y+      ; Get byte to copy
      sta   ,u      ; Prepare to store it
      bsr   SET_COMMAND   ; Invoke a SubSystem one-byte copy routine
      bsr   ENDS_SUBSYSTEM
      ldd   2,u
      addd   #1
      std   2,u      ; Increments destination address
      puls   b,a
      subd   #1
      bne   copy_subcode_loop
      rts
; ----------------------------------------------------------

PUT_BIGCHR:
      leax   CMD_PUTBIGCHR-*-3,pc
      bsr   SET_COMMAND
      bra   ENDS_SUBSYSTEM

SET_COMMAND:            
      pshs   a,b,x,y,u
      bsr   SET_SUBSYSTEM
      ldu   #$FC8B      ; Command area + $0B
      ldb   #$3F ; ?         ; Maintenance command ($3F)
      stb   -9,u      ; Sets command in $FC82
      ldb   ,x+

cmdbyte_loop:            
      lda   ,x+
      sta   ,u+
      decb
      bne   cmdbyte_loop
      puls   pc,u,y,x,b,a

SET_SUBSYSTEM:            
      pshs   a

busy_wait:            
      lda   SUBSIN      ; Loads Subsystem Interface Register
      bmi   busy_wait      ; Wait while Busy (bit 7 = 1)
      orcc   #$50 ; P         ; Disable Interrupts
      lda   #$80 ; ?
      sta   SUBSIN      ; Halts subsystem (bit 7 = 1)

ready_wait:            
      lda   SUBSIN
      bpl   ready_wait   ; Waits until Ready (bit 7 = 0)
      puls   pc,a

ENDS_SUBSYSTEM:            
      clr   SUBSIN      ; Set subsystem Ready
      andcc   #$AF ; ?         ; Enable interrupts
      rts
; ----------------------------------------------------------
CMD_PUTBIGCHR:   fcb   9         
      fcb $93   ; ?      ; Command $93 - JSR $C000
      fcb $C0   ; ?
      fcb   0
      fcb $90   ; ?      ; Command $90 - END
      fcb $13         ; +0 $FC8F - $D38F
      fcb  $A         ; +1 $FC90 - $D390
      fcb   4         ; +2 $FC91 - $D391
      fcb   0         ; +3
      fcb   0         ; +4
CMD_COPY:   fcb  $A         
      fcb $93   ; ?      ; Command $93 - JSR $D38F ($6071:BASE_ADDR)
      fcb $D3   ; ?
      fcb $8F   ; ?
      fcb $90   ; ?      ; Command $90 - END
; ----------------------------------------------------------

BASE_ADDR:            
      lda   #2      ; Template of byte to copy
      sta   word_C37B      ; Template of destination address (initially $C000)
      rts
; ----------------------------------------------------------

SUBCPU_CODE:            
      ldu   #$D38F
      ldb   2,u      ; Loads char pattern
      aslb         ; pattern * 2
      leay   PATTERN_TABLE-*-4,pc
      ldd   b,y
      leay   d,y
      ldx   #0
      lda   #8
      ldb   1,u
      mul
      lda   #80
      mul
      leax   d,x
      ldb   ,u      ; Loads X coord
      aslb
      abx
      ldd   ,y++      ; Loads Width &Height of pattern

next_row:            
      pshs   a,b,x

next_column:            
      clr   4,u
      ldb   ,y+
      cmpb   #8
      bcs   less_than_8
      subb   #8
      inc   4,u

less_than_8:            
      stb   3,u
      bsr   PRINT_BIGCHR
      leax   2,x
      deca
      bne   next_column
      puls   x,b,a
      leax   640,x
      decb
      bne   next_row
      rts

; ----------------------------------------------------------


PRINT_BIGCHR:            
      pshs   a,b,x
      bsr   PRINT_BPLANE
      leax   $4000,x
      bsr   PRINT_BPLANE
      leax   $4000,x
      bsr   PRINT_BPLANE
      puls   pc,x,b,a
; End of function PRINT_BIGCHR


; ----------------------------------------------------------


PRINT_BPLANE:            
               
      lsr   3,u
      bcs   chk_solid_fill
      clra
      clrb

dmp_dat:            
               
      tst   byte_D409      ; VRAM access flag
      nop
      std   ,x      ; +0
      std   80,x      ; +80
      std   160,x      ; +160
      std   240,x
      std   320,x
      std   400,x
      std   480,x
      std   560,x
      clr   byte_D409
      rts
; ----------------------------------------------------------

chk_solid_fill:            
      tst   4,u
      bne   shaded_fill
      ldd   #$FFFF
      bra   dmp_dat
; ----------------------------------------------------------

shaded_fill:            
      ldd   #$AAAA      ; shaded_fill
      bra   dmp_dat
; End of function PRINT_BPLANE

; ----------------------------------------------------------
PATTERN_TABLE:   fdb $C         
      fdb $9E
      fdb $19C
      fdb $29A
      fdb $2B5
      fdb $2E8


Avatar de Usuario
minter
Mensajes: 4826
Registrado: 22 Jul 2014 18:51
Agradecido : 6762 veces
Agradecimiento recibido: 2602 veces

Re: Tutorial (II): Programando el SubSistema gráfico del FM-7

Mensajepor minter » 20 May 2017 15:25

-thumbup Lo vuelvo a repetir. Flipante el trabajo!!!

Avatar de Usuario
pser1
Mensajes: 4094
Registrado: 08 Dic 2012 18:34
Agradecido : 1352 veces
Agradecimiento recibido: 1118 veces

Re: Tutorial (II): Programando el SubSistema gráfico del FM-7

Mensajepor pser1 » 20 May 2017 23:00

Hola José Luis,
excelente trabajo! -thumbup
Ya puedo ir poniéndome las pilas para hacer pruebas con estos dos tutoriales ...
En caso de problemas con el emulador expondré mis dudas/preguntas en este hilo

saludos
pere


Volver a “Fujitsu FM7”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados